[multiple changes]
[platform/upstream/gcc.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, 2010,
4    2011
5    Free Software Foundation, Inc.
6    Contributed by A. Lichnewsky, lich@inria.inria.fr.
7    Changes by Michael Meissner, meissner@osf.org.
8    64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
9    Brendan Eich, brendan@microunity.com.
10
11 This file is part of GCC.
12
13 GCC is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 3, or (at your option)
16 any later version.
17
18 GCC is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with GCC; see the file COPYING3.  If not see
25 <http://www.gnu.org/licenses/>.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "rtl.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "insn-attr.h"
37 #include "recog.h"
38 #include "output.h"
39 #include "tree.h"
40 #include "function.h"
41 #include "expr.h"
42 #include "optabs.h"
43 #include "libfuncs.h"
44 #include "flags.h"
45 #include "reload.h"
46 #include "tm_p.h"
47 #include "ggc.h"
48 #include "gstab.h"
49 #include "hashtab.h"
50 #include "debug.h"
51 #include "target.h"
52 #include "target-def.h"
53 #include "integrate.h"
54 #include "langhooks.h"
55 #include "cfglayout.h"
56 #include "sched-int.h"
57 #include "gimple.h"
58 #include "bitmap.h"
59 #include "diagnostic.h"
60 #include "target-globals.h"
61 #include "opts.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   /* Similar, but the value passed to _mcount.  */
323   HOST_WIDE_INT ra_fp_offset;
324
325   /* The offset of arg_pointer_rtx from the bottom of the frame.  */
326   HOST_WIDE_INT arg_pointer_offset;
327
328   /* The offset of hard_frame_pointer_rtx from the bottom of the frame.  */
329   HOST_WIDE_INT hard_frame_pointer_offset;
330 };
331
332 struct GTY(())  machine_function {
333   /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
334   rtx mips16_gp_pseudo_rtx;
335
336   /* The number of extra stack bytes taken up by register varargs.
337      This area is allocated by the callee at the very top of the frame.  */
338   int varargs_size;
339
340   /* The current frame information, calculated by mips_compute_frame_info.  */
341   struct mips_frame_info frame;
342
343   /* The register to use as the function's global pointer, or INVALID_REGNUM
344      if the function doesn't need one.  */
345   unsigned int global_pointer;
346
347   /* How many instructions it takes to load a label into $AT, or 0 if
348      this property hasn't yet been calculated.  */
349   unsigned int load_label_num_insns;
350
351   /* True if mips_adjust_insn_length should ignore an instruction's
352      hazard attribute.  */
353   bool ignore_hazard_length_p;
354
355   /* True if the whole function is suitable for .set noreorder and
356      .set nomacro.  */
357   bool all_noreorder_p;
358
359   /* True if the function has "inflexible" and "flexible" references
360      to the global pointer.  See mips_cfun_has_inflexible_gp_ref_p
361      and mips_cfun_has_flexible_gp_ref_p for details.  */
362   bool has_inflexible_gp_insn_p;
363   bool has_flexible_gp_insn_p;
364
365   /* True if the function's prologue must load the global pointer
366      value into pic_offset_table_rtx and store the same value in
367      the function's cprestore slot (if any).  Even if this value
368      is currently false, we may decide to set it to true later;
369      see mips_must_initialize_gp_p () for details.  */
370   bool must_initialize_gp_p;
371
372   /* True if the current function must restore $gp after any potential
373      clobber.  This value is only meaningful during the first post-epilogue
374      split_insns pass; see mips_must_initialize_gp_p () for details.  */
375   bool must_restore_gp_when_clobbered_p;
376
377   /* True if this is an interrupt handler.  */
378   bool interrupt_handler_p;
379
380   /* True if this is an interrupt handler that uses shadow registers.  */
381   bool use_shadow_register_set_p;
382
383   /* True if this is an interrupt handler that should keep interrupts
384      masked.  */
385   bool keep_interrupts_masked_p;
386
387   /* True if this is an interrupt handler that should use DERET
388      instead of ERET.  */
389   bool use_debug_exception_return_p;
390 };
391
392 /* Information about a single argument.  */
393 struct mips_arg_info {
394   /* True if the argument is passed in a floating-point register, or
395      would have been if we hadn't run out of registers.  */
396   bool fpr_p;
397
398   /* The number of words passed in registers, rounded up.  */
399   unsigned int reg_words;
400
401   /* For EABI, the offset of the first register from GP_ARG_FIRST or
402      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
403      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
404      comment for details).
405
406      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
407      on the stack.  */
408   unsigned int reg_offset;
409
410   /* The number of words that must be passed on the stack, rounded up.  */
411   unsigned int stack_words;
412
413   /* The offset from the start of the stack overflow area of the argument's
414      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
415   unsigned int stack_offset;
416 };
417
418 /* Information about an address described by mips_address_type.
419
420    ADDRESS_CONST_INT
421        No fields are used.
422
423    ADDRESS_REG
424        REG is the base register and OFFSET is the constant offset.
425
426    ADDRESS_LO_SUM
427        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
428        is the type of symbol it references.
429
430    ADDRESS_SYMBOLIC
431        SYMBOL_TYPE is the type of symbol that the address references.  */
432 struct mips_address_info {
433   enum mips_address_type type;
434   rtx reg;
435   rtx offset;
436   enum mips_symbol_type symbol_type;
437 };
438
439 /* One stage in a constant building sequence.  These sequences have
440    the form:
441
442         A = VALUE[0]
443         A = A CODE[1] VALUE[1]
444         A = A CODE[2] VALUE[2]
445         ...
446
447    where A is an accumulator, each CODE[i] is a binary rtl operation
448    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
449 struct mips_integer_op {
450   enum rtx_code code;
451   unsigned HOST_WIDE_INT value;
452 };
453
454 /* The largest number of operations needed to load an integer constant.
455    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
456    When the lowest bit is clear, we can try, but reject a sequence with
457    an extra SLL at the end.  */
458 #define MIPS_MAX_INTEGER_OPS 7
459
460 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
461 struct mips16e_save_restore_info {
462   /* The number of argument registers saved by a SAVE instruction.
463      0 for RESTORE instructions.  */
464   unsigned int nargs;
465
466   /* Bit X is set if the instruction saves or restores GPR X.  */
467   unsigned int mask;
468
469   /* The total number of bytes to allocate.  */
470   HOST_WIDE_INT size;
471 };
472
473 /* Costs of various operations on the different architectures.  */
474
475 struct mips_rtx_cost_data
476 {
477   unsigned short fp_add;
478   unsigned short fp_mult_sf;
479   unsigned short fp_mult_df;
480   unsigned short fp_div_sf;
481   unsigned short fp_div_df;
482   unsigned short int_mult_si;
483   unsigned short int_mult_di;
484   unsigned short int_div_si;
485   unsigned short int_div_di;
486   unsigned short branch_cost;
487   unsigned short memory_latency;
488 };
489
490 /* Global variables for machine-dependent things.  */
491
492 /* The -G setting, or the configuration's default small-data limit if
493    no -G option is given.  */
494 static unsigned int mips_small_data_threshold;
495
496 /* The number of file directives written by mips_output_filename.  */
497 int num_source_filenames;
498
499 /* The name that appeared in the last .file directive written by
500    mips_output_filename, or "" if mips_output_filename hasn't
501    written anything yet.  */
502 const char *current_function_file = "";
503
504 /* A label counter used by PUT_SDB_BLOCK_START and PUT_SDB_BLOCK_END.  */
505 int sdb_label_count;
506
507 /* Arrays that map GCC register numbers to debugger register numbers.  */
508 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
509 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
510
511 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
512 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
513 struct mips_asm_switch mips_nomacro = { "macro", 0 };
514 struct mips_asm_switch mips_noat = { "at", 0 };
515
516 /* True if we're writing out a branch-likely instruction rather than a
517    normal branch.  */
518 static bool mips_branch_likely;
519
520 /* The current instruction-set architecture.  */
521 enum processor mips_arch;
522 const struct mips_cpu_info *mips_arch_info;
523
524 /* The processor that we should tune the code for.  */
525 enum processor mips_tune;
526 const struct mips_cpu_info *mips_tune_info;
527
528 /* The ISA level associated with mips_arch.  */
529 int mips_isa;
530
531 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
532 static const struct mips_cpu_info *mips_isa_option_info;
533
534 /* Which ABI to use.  */
535 int mips_abi = MIPS_ABI_DEFAULT;
536
537 /* Which cost information to use.  */
538 static const struct mips_rtx_cost_data *mips_cost;
539
540 /* The ambient target flags, excluding MASK_MIPS16.  */
541 static int mips_base_target_flags;
542
543 /* True if MIPS16 is the default mode.  */
544 bool mips_base_mips16;
545
546 /* The ambient values of other global variables.  */
547 static int mips_base_schedule_insns; /* flag_schedule_insns */
548 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
549 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
550 static int mips_base_align_loops; /* align_loops */
551 static int mips_base_align_jumps; /* align_jumps */
552 static int mips_base_align_functions; /* align_functions */
553
554 /* The -mcode-readable setting.  */
555 enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES;
556
557 /* The -mr10k-cache-barrier setting.  */
558 static enum mips_r10k_cache_barrier_setting mips_r10k_cache_barrier;
559
560 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
561 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
562
563 /* Index C is true if character C is a valid PRINT_OPERAND punctation
564    character.  */
565 static bool mips_print_operand_punct[256];
566
567 static GTY (()) int mips_output_filename_first_time = 1;
568
569 /* mips_split_p[X] is true if symbols of type X can be split by
570    mips_split_symbol.  */
571 bool mips_split_p[NUM_SYMBOL_TYPES];
572
573 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
574    can be split by mips_split_symbol.  */
575 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
576
577 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
578    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
579    if they are matched by a special .md file pattern.  */
580 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
581
582 /* Likewise for HIGHs.  */
583 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
584
585 /* Target state for MIPS16.  */
586 struct target_globals *mips16_globals;
587
588 /* Cached value of can_issue_more. This is cached in mips_variable_issue hook
589    and returned from mips_sched_reorder2.  */
590 static int cached_can_issue_more;
591
592 /* Index R is the smallest register class that contains register R.  */
593 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
594   LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
595   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
596   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
597   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
598   M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
599   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
600   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
601   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
602   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
603   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
604   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
605   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
606   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
607   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
608   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
609   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
610   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
611   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
612   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
613   NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
614   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
615   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
616   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
617   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
618   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
619   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
620   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
621   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
622   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
623   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
624   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
625   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
626   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
627   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
628   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
629   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
630   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
631   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
632   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
633   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
634   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
635   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
636   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
637   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
638   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
639   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
640   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
641 };
642
643 /* The value of TARGET_ATTRIBUTE_TABLE.  */
644 static const struct attribute_spec mips_attribute_table[] = {
645   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
646        om_diagnostic } */
647   { "long_call",   0, 0, false, true,  true,  NULL, false },
648   { "far",         0, 0, false, true,  true,  NULL, false },
649   { "near",        0, 0, false, true,  true,  NULL, false },
650   /* We would really like to treat "mips16" and "nomips16" as type
651      attributes, but GCC doesn't provide the hooks we need to support
652      the right conversion rules.  As declaration attributes, they affect
653      code generation but don't carry other semantics.  */
654   { "mips16",      0, 0, true,  false, false, NULL, false },
655   { "nomips16",    0, 0, true,  false, false, NULL, false },
656   /* Allow functions to be specified as interrupt handlers */
657   { "interrupt",   0, 0, false, true,  true, NULL, false },
658   { "use_shadow_register_set",  0, 0, false, true,  true, NULL, false },
659   { "keep_interrupts_masked",   0, 0, false, true,  true, NULL, false },
660   { "use_debug_exception_return", 0, 0, false, true,  true, NULL, false },
661   { NULL,          0, 0, false, false, false, NULL, false }
662 };
663 \f
664 /* A table describing all the processors GCC knows about.  Names are
665    matched in the order listed.  The first mention of an ISA level is
666    taken as the canonical name for that ISA.
667
668    To ease comparison, please keep this table in the same order
669    as GAS's mips_cpu_info_table.  Please also make sure that
670    MIPS_ISA_LEVEL_SPEC and MIPS_ARCH_FLOAT_SPEC handle all -march
671    options correctly.  */
672 static const struct mips_cpu_info mips_cpu_info_table[] = {
673   /* Entries for generic ISAs.  */
674   { "mips1", PROCESSOR_R3000, 1, 0 },
675   { "mips2", PROCESSOR_R6000, 2, 0 },
676   { "mips3", PROCESSOR_R4000, 3, 0 },
677   { "mips4", PROCESSOR_R8000, 4, 0 },
678   /* Prefer not to use branch-likely instructions for generic MIPS32rX
679      and MIPS64rX code.  The instructions were officially deprecated
680      in revisions 2 and earlier, but revision 3 is likely to downgrade
681      that to a recommendation to avoid the instructions in code that
682      isn't tuned to a specific processor.  */
683   { "mips32", PROCESSOR_4KC, 32, PTF_AVOID_BRANCHLIKELY },
684   { "mips32r2", PROCESSOR_M4K, 33, PTF_AVOID_BRANCHLIKELY },
685   { "mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY },
686   /* ??? For now just tune the generic MIPS64r2 for 5KC as well.   */
687   { "mips64r2", PROCESSOR_5KC, 65, PTF_AVOID_BRANCHLIKELY },
688
689   /* MIPS I processors.  */
690   { "r3000", PROCESSOR_R3000, 1, 0 },
691   { "r2000", PROCESSOR_R3000, 1, 0 },
692   { "r3900", PROCESSOR_R3900, 1, 0 },
693
694   /* MIPS II processors.  */
695   { "r6000", PROCESSOR_R6000, 2, 0 },
696
697   /* MIPS III processors.  */
698   { "r4000", PROCESSOR_R4000, 3, 0 },
699   { "vr4100", PROCESSOR_R4100, 3, 0 },
700   { "vr4111", PROCESSOR_R4111, 3, 0 },
701   { "vr4120", PROCESSOR_R4120, 3, 0 },
702   { "vr4130", PROCESSOR_R4130, 3, 0 },
703   { "vr4300", PROCESSOR_R4300, 3, 0 },
704   { "r4400", PROCESSOR_R4000, 3, 0 },
705   { "r4600", PROCESSOR_R4600, 3, 0 },
706   { "orion", PROCESSOR_R4600, 3, 0 },
707   { "r4650", PROCESSOR_R4650, 3, 0 },
708   /* ST Loongson 2E/2F processors.  */
709   { "loongson2e", PROCESSOR_LOONGSON_2E, 3, PTF_AVOID_BRANCHLIKELY },
710   { "loongson2f", PROCESSOR_LOONGSON_2F, 3, PTF_AVOID_BRANCHLIKELY },
711
712   /* MIPS IV processors. */
713   { "r8000", PROCESSOR_R8000, 4, 0 },
714   { "r10000", PROCESSOR_R10000, 4, 0 },
715   { "r12000", PROCESSOR_R10000, 4, 0 },
716   { "r14000", PROCESSOR_R10000, 4, 0 },
717   { "r16000", PROCESSOR_R10000, 4, 0 },
718   { "vr5000", PROCESSOR_R5000, 4, 0 },
719   { "vr5400", PROCESSOR_R5400, 4, 0 },
720   { "vr5500", PROCESSOR_R5500, 4, PTF_AVOID_BRANCHLIKELY },
721   { "rm7000", PROCESSOR_R7000, 4, 0 },
722   { "rm9000", PROCESSOR_R9000, 4, 0 },
723
724   /* MIPS32 processors.  */
725   { "4kc", PROCESSOR_4KC, 32, 0 },
726   { "4km", PROCESSOR_4KC, 32, 0 },
727   { "4kp", PROCESSOR_4KP, 32, 0 },
728   { "4ksc", PROCESSOR_4KC, 32, 0 },
729
730   /* MIPS32 Release 2 processors.  */
731   { "m4k", PROCESSOR_M4K, 33, 0 },
732   { "4kec", PROCESSOR_4KC, 33, 0 },
733   { "4kem", PROCESSOR_4KC, 33, 0 },
734   { "4kep", PROCESSOR_4KP, 33, 0 },
735   { "4ksd", PROCESSOR_4KC, 33, 0 },
736
737   { "24kc", PROCESSOR_24KC, 33, 0 },
738   { "24kf2_1", PROCESSOR_24KF2_1, 33, 0 },
739   { "24kf", PROCESSOR_24KF2_1, 33, 0 },
740   { "24kf1_1", PROCESSOR_24KF1_1, 33, 0 },
741   { "24kfx", PROCESSOR_24KF1_1, 33, 0 },
742   { "24kx", PROCESSOR_24KF1_1, 33, 0 },
743
744   { "24kec", PROCESSOR_24KC, 33, 0 }, /* 24K with DSP.  */
745   { "24kef2_1", PROCESSOR_24KF2_1, 33, 0 },
746   { "24kef", PROCESSOR_24KF2_1, 33, 0 },
747   { "24kef1_1", PROCESSOR_24KF1_1, 33, 0 },
748   { "24kefx", PROCESSOR_24KF1_1, 33, 0 },
749   { "24kex", PROCESSOR_24KF1_1, 33, 0 },
750
751   { "34kc", PROCESSOR_24KC, 33, 0 }, /* 34K with MT/DSP.  */
752   { "34kf2_1", PROCESSOR_24KF2_1, 33, 0 },
753   { "34kf", PROCESSOR_24KF2_1, 33, 0 },
754   { "34kf1_1", PROCESSOR_24KF1_1, 33, 0 },
755   { "34kfx", PROCESSOR_24KF1_1, 33, 0 },
756   { "34kx", PROCESSOR_24KF1_1, 33, 0 },
757
758   { "74kc", PROCESSOR_74KC, 33, 0 }, /* 74K with DSPr2.  */
759   { "74kf2_1", PROCESSOR_74KF2_1, 33, 0 },
760   { "74kf", PROCESSOR_74KF2_1, 33, 0 },
761   { "74kf1_1", PROCESSOR_74KF1_1, 33, 0 },
762   { "74kfx", PROCESSOR_74KF1_1, 33, 0 },
763   { "74kx", PROCESSOR_74KF1_1, 33, 0 },
764   { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
765
766   { "1004kc", PROCESSOR_24KC, 33, 0 }, /* 1004K with MT/DSP.  */
767   { "1004kf2_1", PROCESSOR_24KF2_1, 33, 0 },
768   { "1004kf", PROCESSOR_24KF2_1, 33, 0 },
769   { "1004kf1_1", PROCESSOR_24KF1_1, 33, 0 },
770
771   /* MIPS64 processors.  */
772   { "5kc", PROCESSOR_5KC, 64, 0 },
773   { "5kf", PROCESSOR_5KF, 64, 0 },
774   { "20kc", PROCESSOR_20KC, 64, PTF_AVOID_BRANCHLIKELY },
775   { "sb1", PROCESSOR_SB1, 64, PTF_AVOID_BRANCHLIKELY },
776   { "sb1a", PROCESSOR_SB1A, 64, PTF_AVOID_BRANCHLIKELY },
777   { "sr71000", PROCESSOR_SR71000, 64, PTF_AVOID_BRANCHLIKELY },
778   { "xlr", PROCESSOR_XLR, 64, 0 },
779   { "loongson3a", PROCESSOR_LOONGSON_3A, 64, PTF_AVOID_BRANCHLIKELY },
780
781   /* MIPS64 Release 2 processors.  */
782   { "octeon", PROCESSOR_OCTEON, 65, PTF_AVOID_BRANCHLIKELY }
783 };
784
785 /* Default costs.  If these are used for a processor we should look
786    up the actual costs.  */
787 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
788                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
789                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
790                       COSTS_N_INSNS (23), /* fp_div_sf */    \
791                       COSTS_N_INSNS (36), /* fp_div_df */    \
792                       COSTS_N_INSNS (10), /* int_mult_si */  \
793                       COSTS_N_INSNS (10), /* int_mult_di */  \
794                       COSTS_N_INSNS (69), /* int_div_si */   \
795                       COSTS_N_INSNS (69), /* int_div_di */   \
796                                        2, /* branch_cost */  \
797                                        4  /* memory_latency */
798
799 /* Floating-point costs for processors without an FPU.  Just assume that
800    all floating-point libcalls are very expensive.  */
801 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
802                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
803                       COSTS_N_INSNS (256), /* fp_mult_df */   \
804                       COSTS_N_INSNS (256), /* fp_div_sf */    \
805                       COSTS_N_INSNS (256)  /* fp_div_df */
806
807 /* Costs to use when optimizing for size.  */
808 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
809   COSTS_N_INSNS (1),            /* fp_add */
810   COSTS_N_INSNS (1),            /* fp_mult_sf */
811   COSTS_N_INSNS (1),            /* fp_mult_df */
812   COSTS_N_INSNS (1),            /* fp_div_sf */
813   COSTS_N_INSNS (1),            /* fp_div_df */
814   COSTS_N_INSNS (1),            /* int_mult_si */
815   COSTS_N_INSNS (1),            /* int_mult_di */
816   COSTS_N_INSNS (1),            /* int_div_si */
817   COSTS_N_INSNS (1),            /* int_div_di */
818                    2,           /* branch_cost */
819                    4            /* memory_latency */
820 };
821
822 /* Costs to use when optimizing for speed, indexed by processor.  */
823 static const struct mips_rtx_cost_data
824   mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
825   { /* R3000 */
826     COSTS_N_INSNS (2),            /* fp_add */
827     COSTS_N_INSNS (4),            /* fp_mult_sf */
828     COSTS_N_INSNS (5),            /* fp_mult_df */
829     COSTS_N_INSNS (12),           /* fp_div_sf */
830     COSTS_N_INSNS (19),           /* fp_div_df */
831     COSTS_N_INSNS (12),           /* int_mult_si */
832     COSTS_N_INSNS (12),           /* int_mult_di */
833     COSTS_N_INSNS (35),           /* int_div_si */
834     COSTS_N_INSNS (35),           /* int_div_di */
835                      1,           /* branch_cost */
836                      4            /* memory_latency */
837   },
838   { /* 4KC */
839     SOFT_FP_COSTS,
840     COSTS_N_INSNS (6),            /* int_mult_si */
841     COSTS_N_INSNS (6),            /* int_mult_di */
842     COSTS_N_INSNS (36),           /* int_div_si */
843     COSTS_N_INSNS (36),           /* int_div_di */
844                      1,           /* branch_cost */
845                      4            /* memory_latency */
846   },
847   { /* 4KP */
848     SOFT_FP_COSTS,
849     COSTS_N_INSNS (36),           /* int_mult_si */
850     COSTS_N_INSNS (36),           /* int_mult_di */
851     COSTS_N_INSNS (37),           /* int_div_si */
852     COSTS_N_INSNS (37),           /* int_div_di */
853                      1,           /* branch_cost */
854                      4            /* memory_latency */
855   },
856   { /* 5KC */
857     SOFT_FP_COSTS,
858     COSTS_N_INSNS (4),            /* int_mult_si */
859     COSTS_N_INSNS (11),           /* int_mult_di */
860     COSTS_N_INSNS (36),           /* int_div_si */
861     COSTS_N_INSNS (68),           /* int_div_di */
862                      1,           /* branch_cost */
863                      4            /* memory_latency */
864   },
865   { /* 5KF */
866     COSTS_N_INSNS (4),            /* fp_add */
867     COSTS_N_INSNS (4),            /* fp_mult_sf */
868     COSTS_N_INSNS (5),            /* fp_mult_df */
869     COSTS_N_INSNS (17),           /* fp_div_sf */
870     COSTS_N_INSNS (32),           /* fp_div_df */
871     COSTS_N_INSNS (4),            /* int_mult_si */
872     COSTS_N_INSNS (11),           /* int_mult_di */
873     COSTS_N_INSNS (36),           /* int_div_si */
874     COSTS_N_INSNS (68),           /* int_div_di */
875                      1,           /* branch_cost */
876                      4            /* memory_latency */
877   },
878   { /* 20KC */
879     COSTS_N_INSNS (4),            /* fp_add */
880     COSTS_N_INSNS (4),            /* fp_mult_sf */
881     COSTS_N_INSNS (5),            /* fp_mult_df */
882     COSTS_N_INSNS (17),           /* fp_div_sf */
883     COSTS_N_INSNS (32),           /* fp_div_df */
884     COSTS_N_INSNS (4),            /* int_mult_si */
885     COSTS_N_INSNS (7),            /* int_mult_di */
886     COSTS_N_INSNS (42),           /* int_div_si */
887     COSTS_N_INSNS (72),           /* int_div_di */
888                      1,           /* branch_cost */
889                      4            /* memory_latency */
890   },
891   { /* 24KC */
892     SOFT_FP_COSTS,
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   { /* 24KF2_1 */
901     COSTS_N_INSNS (8),            /* fp_add */
902     COSTS_N_INSNS (8),            /* fp_mult_sf */
903     COSTS_N_INSNS (10),           /* fp_mult_df */
904     COSTS_N_INSNS (34),           /* fp_div_sf */
905     COSTS_N_INSNS (64),           /* fp_div_df */
906     COSTS_N_INSNS (5),            /* int_mult_si */
907     COSTS_N_INSNS (5),            /* int_mult_di */
908     COSTS_N_INSNS (41),           /* int_div_si */
909     COSTS_N_INSNS (41),           /* int_div_di */
910                      1,           /* branch_cost */
911                      4            /* memory_latency */
912   },
913   { /* 24KF1_1 */
914     COSTS_N_INSNS (4),            /* fp_add */
915     COSTS_N_INSNS (4),            /* fp_mult_sf */
916     COSTS_N_INSNS (5),            /* fp_mult_df */
917     COSTS_N_INSNS (17),           /* fp_div_sf */
918     COSTS_N_INSNS (32),           /* fp_div_df */
919     COSTS_N_INSNS (5),            /* int_mult_si */
920     COSTS_N_INSNS (5),            /* int_mult_di */
921     COSTS_N_INSNS (41),           /* int_div_si */
922     COSTS_N_INSNS (41),           /* int_div_di */
923                      1,           /* branch_cost */
924                      4            /* memory_latency */
925   },
926   { /* 74KC */
927     SOFT_FP_COSTS,
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   { /* 74KF2_1 */
936     COSTS_N_INSNS (8),            /* fp_add */
937     COSTS_N_INSNS (8),            /* fp_mult_sf */
938     COSTS_N_INSNS (10),           /* fp_mult_df */
939     COSTS_N_INSNS (34),           /* fp_div_sf */
940     COSTS_N_INSNS (64),           /* 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   { /* 74KF1_1 */
949     COSTS_N_INSNS (4),            /* fp_add */
950     COSTS_N_INSNS (4),            /* fp_mult_sf */
951     COSTS_N_INSNS (5),            /* fp_mult_df */
952     COSTS_N_INSNS (17),           /* fp_div_sf */
953     COSTS_N_INSNS (32),           /* fp_div_df */
954     COSTS_N_INSNS (5),            /* int_mult_si */
955     COSTS_N_INSNS (5),            /* int_mult_di */
956     COSTS_N_INSNS (41),           /* int_div_si */
957     COSTS_N_INSNS (41),           /* int_div_di */
958                      1,           /* branch_cost */
959                      4            /* memory_latency */
960   },
961   { /* 74KF3_2 */
962     COSTS_N_INSNS (6),            /* fp_add */
963     COSTS_N_INSNS (6),            /* fp_mult_sf */
964     COSTS_N_INSNS (7),            /* fp_mult_df */
965     COSTS_N_INSNS (25),           /* fp_div_sf */
966     COSTS_N_INSNS (48),           /* fp_div_df */
967     COSTS_N_INSNS (5),            /* int_mult_si */
968     COSTS_N_INSNS (5),            /* int_mult_di */
969     COSTS_N_INSNS (41),           /* int_div_si */
970     COSTS_N_INSNS (41),           /* int_div_di */
971                      1,           /* branch_cost */
972                      4            /* memory_latency */
973   },
974   { /* Loongson-2E */
975     DEFAULT_COSTS
976   },
977   { /* Loongson-2F */
978     DEFAULT_COSTS
979   },
980   { /* Loongson-3A */
981     DEFAULT_COSTS
982   },
983   { /* M4k */
984     DEFAULT_COSTS
985   },
986     /* Octeon */
987   {
988     SOFT_FP_COSTS,
989     COSTS_N_INSNS (5),            /* int_mult_si */
990     COSTS_N_INSNS (5),            /* int_mult_di */
991     COSTS_N_INSNS (72),           /* int_div_si */
992     COSTS_N_INSNS (72),           /* int_div_di */
993                      1,           /* branch_cost */
994                      4            /* memory_latency */
995   },
996   { /* R3900 */
997     COSTS_N_INSNS (2),            /* fp_add */
998     COSTS_N_INSNS (4),            /* fp_mult_sf */
999     COSTS_N_INSNS (5),            /* fp_mult_df */
1000     COSTS_N_INSNS (12),           /* fp_div_sf */
1001     COSTS_N_INSNS (19),           /* fp_div_df */
1002     COSTS_N_INSNS (2),            /* int_mult_si */
1003     COSTS_N_INSNS (2),            /* int_mult_di */
1004     COSTS_N_INSNS (35),           /* int_div_si */
1005     COSTS_N_INSNS (35),           /* int_div_di */
1006                      1,           /* branch_cost */
1007                      4            /* memory_latency */
1008   },
1009   { /* R6000 */
1010     COSTS_N_INSNS (3),            /* fp_add */
1011     COSTS_N_INSNS (5),            /* fp_mult_sf */
1012     COSTS_N_INSNS (6),            /* fp_mult_df */
1013     COSTS_N_INSNS (15),           /* fp_div_sf */
1014     COSTS_N_INSNS (16),           /* fp_div_df */
1015     COSTS_N_INSNS (17),           /* int_mult_si */
1016     COSTS_N_INSNS (17),           /* int_mult_di */
1017     COSTS_N_INSNS (38),           /* int_div_si */
1018     COSTS_N_INSNS (38),           /* int_div_di */
1019                      2,           /* branch_cost */
1020                      6            /* memory_latency */
1021   },
1022   { /* R4000 */
1023      COSTS_N_INSNS (6),           /* fp_add */
1024      COSTS_N_INSNS (7),           /* fp_mult_sf */
1025      COSTS_N_INSNS (8),           /* fp_mult_df */
1026      COSTS_N_INSNS (23),          /* fp_div_sf */
1027      COSTS_N_INSNS (36),          /* fp_div_df */
1028      COSTS_N_INSNS (10),          /* int_mult_si */
1029      COSTS_N_INSNS (10),          /* int_mult_di */
1030      COSTS_N_INSNS (69),          /* int_div_si */
1031      COSTS_N_INSNS (69),          /* int_div_di */
1032                       2,          /* branch_cost */
1033                       6           /* memory_latency */
1034   },
1035   { /* R4100 */
1036     DEFAULT_COSTS
1037   },
1038   { /* R4111 */
1039     DEFAULT_COSTS
1040   },
1041   { /* R4120 */
1042     DEFAULT_COSTS
1043   },
1044   { /* R4130 */
1045     /* The only costs that appear to be updated here are
1046        integer multiplication.  */
1047     SOFT_FP_COSTS,
1048     COSTS_N_INSNS (4),            /* int_mult_si */
1049     COSTS_N_INSNS (6),            /* int_mult_di */
1050     COSTS_N_INSNS (69),           /* int_div_si */
1051     COSTS_N_INSNS (69),           /* int_div_di */
1052                      1,           /* branch_cost */
1053                      4            /* memory_latency */
1054   },
1055   { /* R4300 */
1056     DEFAULT_COSTS
1057   },
1058   { /* R4600 */
1059     DEFAULT_COSTS
1060   },
1061   { /* R4650 */
1062     DEFAULT_COSTS
1063   },
1064   { /* R5000 */
1065     COSTS_N_INSNS (6),            /* fp_add */
1066     COSTS_N_INSNS (4),            /* fp_mult_sf */
1067     COSTS_N_INSNS (5),            /* fp_mult_df */
1068     COSTS_N_INSNS (23),           /* fp_div_sf */
1069     COSTS_N_INSNS (36),           /* fp_div_df */
1070     COSTS_N_INSNS (5),            /* int_mult_si */
1071     COSTS_N_INSNS (5),            /* int_mult_di */
1072     COSTS_N_INSNS (36),           /* int_div_si */
1073     COSTS_N_INSNS (36),           /* int_div_di */
1074                      1,           /* branch_cost */
1075                      4            /* memory_latency */
1076   },
1077   { /* R5400 */
1078     COSTS_N_INSNS (6),            /* fp_add */
1079     COSTS_N_INSNS (5),            /* fp_mult_sf */
1080     COSTS_N_INSNS (6),            /* fp_mult_df */
1081     COSTS_N_INSNS (30),           /* fp_div_sf */
1082     COSTS_N_INSNS (59),           /* fp_div_df */
1083     COSTS_N_INSNS (3),            /* int_mult_si */
1084     COSTS_N_INSNS (4),            /* int_mult_di */
1085     COSTS_N_INSNS (42),           /* int_div_si */
1086     COSTS_N_INSNS (74),           /* int_div_di */
1087                      1,           /* branch_cost */
1088                      4            /* memory_latency */
1089   },
1090   { /* R5500 */
1091     COSTS_N_INSNS (6),            /* fp_add */
1092     COSTS_N_INSNS (5),            /* fp_mult_sf */
1093     COSTS_N_INSNS (6),            /* fp_mult_df */
1094     COSTS_N_INSNS (30),           /* fp_div_sf */
1095     COSTS_N_INSNS (59),           /* fp_div_df */
1096     COSTS_N_INSNS (5),            /* int_mult_si */
1097     COSTS_N_INSNS (9),            /* int_mult_di */
1098     COSTS_N_INSNS (42),           /* int_div_si */
1099     COSTS_N_INSNS (74),           /* int_div_di */
1100                      1,           /* branch_cost */
1101                      4            /* memory_latency */
1102   },
1103   { /* R7000 */
1104     /* The only costs that are changed here are
1105        integer multiplication.  */
1106     COSTS_N_INSNS (6),            /* fp_add */
1107     COSTS_N_INSNS (7),            /* fp_mult_sf */
1108     COSTS_N_INSNS (8),            /* fp_mult_df */
1109     COSTS_N_INSNS (23),           /* fp_div_sf */
1110     COSTS_N_INSNS (36),           /* fp_div_df */
1111     COSTS_N_INSNS (5),            /* int_mult_si */
1112     COSTS_N_INSNS (9),            /* int_mult_di */
1113     COSTS_N_INSNS (69),           /* int_div_si */
1114     COSTS_N_INSNS (69),           /* int_div_di */
1115                      1,           /* branch_cost */
1116                      4            /* memory_latency */
1117   },
1118   { /* R8000 */
1119     DEFAULT_COSTS
1120   },
1121   { /* R9000 */
1122     /* The only costs that are changed here are
1123        integer multiplication.  */
1124     COSTS_N_INSNS (6),            /* fp_add */
1125     COSTS_N_INSNS (7),            /* fp_mult_sf */
1126     COSTS_N_INSNS (8),            /* fp_mult_df */
1127     COSTS_N_INSNS (23),           /* fp_div_sf */
1128     COSTS_N_INSNS (36),           /* fp_div_df */
1129     COSTS_N_INSNS (3),            /* int_mult_si */
1130     COSTS_N_INSNS (8),            /* int_mult_di */
1131     COSTS_N_INSNS (69),           /* int_div_si */
1132     COSTS_N_INSNS (69),           /* int_div_di */
1133                      1,           /* branch_cost */
1134                      4            /* memory_latency */
1135   },
1136   { /* R1x000 */
1137     COSTS_N_INSNS (2),            /* fp_add */
1138     COSTS_N_INSNS (2),            /* fp_mult_sf */
1139     COSTS_N_INSNS (2),            /* fp_mult_df */
1140     COSTS_N_INSNS (12),           /* fp_div_sf */
1141     COSTS_N_INSNS (19),           /* fp_div_df */
1142     COSTS_N_INSNS (5),            /* int_mult_si */
1143     COSTS_N_INSNS (9),            /* int_mult_di */
1144     COSTS_N_INSNS (34),           /* int_div_si */
1145     COSTS_N_INSNS (66),           /* int_div_di */
1146                      1,           /* branch_cost */
1147                      4            /* memory_latency */
1148   },
1149   { /* SB1 */
1150     /* These costs are the same as the SB-1A below.  */
1151     COSTS_N_INSNS (4),            /* fp_add */
1152     COSTS_N_INSNS (4),            /* fp_mult_sf */
1153     COSTS_N_INSNS (4),            /* fp_mult_df */
1154     COSTS_N_INSNS (24),           /* fp_div_sf */
1155     COSTS_N_INSNS (32),           /* fp_div_df */
1156     COSTS_N_INSNS (3),            /* int_mult_si */
1157     COSTS_N_INSNS (4),            /* int_mult_di */
1158     COSTS_N_INSNS (36),           /* int_div_si */
1159     COSTS_N_INSNS (68),           /* int_div_di */
1160                      1,           /* branch_cost */
1161                      4            /* memory_latency */
1162   },
1163   { /* SB1-A */
1164     /* These costs are the same as the SB-1 above.  */
1165     COSTS_N_INSNS (4),            /* fp_add */
1166     COSTS_N_INSNS (4),            /* fp_mult_sf */
1167     COSTS_N_INSNS (4),            /* fp_mult_df */
1168     COSTS_N_INSNS (24),           /* fp_div_sf */
1169     COSTS_N_INSNS (32),           /* fp_div_df */
1170     COSTS_N_INSNS (3),            /* int_mult_si */
1171     COSTS_N_INSNS (4),            /* int_mult_di */
1172     COSTS_N_INSNS (36),           /* int_div_si */
1173     COSTS_N_INSNS (68),           /* int_div_di */
1174                      1,           /* branch_cost */
1175                      4            /* memory_latency */
1176   },
1177   { /* SR71000 */
1178     DEFAULT_COSTS
1179   },
1180   { /* XLR */
1181     SOFT_FP_COSTS,
1182     COSTS_N_INSNS (8),            /* int_mult_si */
1183     COSTS_N_INSNS (8),            /* int_mult_di */
1184     COSTS_N_INSNS (72),           /* int_div_si */
1185     COSTS_N_INSNS (72),           /* int_div_di */
1186                      1,           /* branch_cost */
1187                      4            /* memory_latency */
1188   }
1189 };
1190 \f
1191 static rtx mips_find_pic_call_symbol (rtx, rtx);
1192 static int mips_register_move_cost (enum machine_mode, reg_class_t,
1193                                     reg_class_t);
1194 static unsigned int mips_function_arg_boundary (enum machine_mode, const_tree);
1195 \f
1196 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1197    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1198 struct GTY (())  mflip_mips16_entry {
1199   const char *name;
1200   bool mips16_p;
1201 };
1202 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1203
1204 /* Hash table callbacks for mflip_mips16_htab.  */
1205
1206 static hashval_t
1207 mflip_mips16_htab_hash (const void *entry)
1208 {
1209   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1210 }
1211
1212 static int
1213 mflip_mips16_htab_eq (const void *entry, const void *name)
1214 {
1215   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1216                  (const char *) name) == 0;
1217 }
1218
1219 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1220    mode, false if it should next add an attribute for the opposite mode.  */
1221 static GTY(()) bool mips16_flipper;
1222
1223 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1224    for -mflip-mips16.  Return true if it should use "mips16" and false if
1225    it should use "nomips16".  */
1226
1227 static bool
1228 mflip_mips16_use_mips16_p (tree decl)
1229 {
1230   struct mflip_mips16_entry *entry;
1231   const char *name;
1232   hashval_t hash;
1233   void **slot;
1234
1235   /* Use the opposite of the command-line setting for anonymous decls.  */
1236   if (!DECL_NAME (decl))
1237     return !mips_base_mips16;
1238
1239   if (!mflip_mips16_htab)
1240     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1241                                          mflip_mips16_htab_eq, NULL);
1242
1243   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1244   hash = htab_hash_string (name);
1245   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1246   entry = (struct mflip_mips16_entry *) *slot;
1247   if (!entry)
1248     {
1249       mips16_flipper = !mips16_flipper;
1250       entry = ggc_alloc_mflip_mips16_entry ();
1251       entry->name = name;
1252       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1253       *slot = entry;
1254     }
1255   return entry->mips16_p;
1256 }
1257 \f
1258 /* Predicates to test for presence of "near" and "far"/"long_call"
1259    attributes on the given TYPE.  */
1260
1261 static bool
1262 mips_near_type_p (const_tree type)
1263 {
1264   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1265 }
1266
1267 static bool
1268 mips_far_type_p (const_tree type)
1269 {
1270   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1271           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1272 }
1273
1274 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1275
1276 static bool
1277 mips_mips16_decl_p (const_tree decl)
1278 {
1279   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1280 }
1281
1282 static bool
1283 mips_nomips16_decl_p (const_tree decl)
1284 {
1285   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1286 }
1287
1288 /* Check if the interrupt attribute is set for a function.  */
1289
1290 static bool
1291 mips_interrupt_type_p (tree type)
1292 {
1293   return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1294 }
1295
1296 /* Check if the attribute to use shadow register set is set for a function.  */
1297
1298 static bool
1299 mips_use_shadow_register_set_p (tree type)
1300 {
1301   return lookup_attribute ("use_shadow_register_set",
1302                            TYPE_ATTRIBUTES (type)) != NULL;
1303 }
1304
1305 /* Check if the attribute to keep interrupts masked is set for a function.  */
1306
1307 static bool
1308 mips_keep_interrupts_masked_p (tree type)
1309 {
1310   return lookup_attribute ("keep_interrupts_masked",
1311                            TYPE_ATTRIBUTES (type)) != NULL;
1312 }
1313
1314 /* Check if the attribute to use debug exception return is set for
1315    a function.  */
1316
1317 static bool
1318 mips_use_debug_exception_return_p (tree type)
1319 {
1320   return lookup_attribute ("use_debug_exception_return",
1321                            TYPE_ATTRIBUTES (type)) != NULL;
1322 }
1323
1324 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1325    setting if DECL is null.  */
1326
1327 static bool
1328 mips_use_mips16_mode_p (tree decl)
1329 {
1330   if (decl)
1331     {
1332       /* Nested functions must use the same frame pointer as their
1333          parent and must therefore use the same ISA mode.  */
1334       tree parent = decl_function_context (decl);
1335       if (parent)
1336         decl = parent;
1337       if (mips_mips16_decl_p (decl))
1338         return true;
1339       if (mips_nomips16_decl_p (decl))
1340         return false;
1341     }
1342   return mips_base_mips16;
1343 }
1344
1345 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1346
1347 static int
1348 mips_comp_type_attributes (const_tree type1, const_tree type2)
1349 {
1350   /* Disallow mixed near/far attributes.  */
1351   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1352     return 0;
1353   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1354     return 0;
1355   return 1;
1356 }
1357
1358 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1359
1360 static void
1361 mips_insert_attributes (tree decl, tree *attributes)
1362 {
1363   const char *name;
1364   bool mips16_p, nomips16_p;
1365
1366   /* Check for "mips16" and "nomips16" attributes.  */
1367   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1368   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1369   if (TREE_CODE (decl) != FUNCTION_DECL)
1370     {
1371       if (mips16_p)
1372         error ("%qs attribute only applies to functions", "mips16");
1373       if (nomips16_p)
1374         error ("%qs attribute only applies to functions", "nomips16");
1375     }
1376   else
1377     {
1378       mips16_p |= mips_mips16_decl_p (decl);
1379       nomips16_p |= mips_nomips16_decl_p (decl);
1380       if (mips16_p || nomips16_p)
1381         {
1382           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1383           if (mips16_p && nomips16_p)
1384             error ("%qE cannot have both %<mips16%> and "
1385                    "%<nomips16%> attributes",
1386                    DECL_NAME (decl));
1387         }
1388       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1389         {
1390           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1391              "mips16" attribute, arbitrarily pick one.  We must pick the same
1392              setting for duplicate declarations of a function.  */
1393           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1394           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1395         }
1396     }
1397 }
1398
1399 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1400
1401 static tree
1402 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1403 {
1404   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1405   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1406     error ("%qE redeclared with conflicting %qs attributes",
1407            DECL_NAME (newdecl), "mips16");
1408   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1409     error ("%qE redeclared with conflicting %qs attributes",
1410            DECL_NAME (newdecl), "nomips16");
1411
1412   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1413                            DECL_ATTRIBUTES (newdecl));
1414 }
1415 \f
1416 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1417    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1418
1419 static void
1420 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1421 {
1422   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1423     {
1424       *base_ptr = XEXP (x, 0);
1425       *offset_ptr = INTVAL (XEXP (x, 1));
1426     }
1427   else
1428     {
1429       *base_ptr = x;
1430       *offset_ptr = 0;
1431     }
1432 }
1433 \f
1434 static unsigned int mips_build_integer (struct mips_integer_op *,
1435                                         unsigned HOST_WIDE_INT);
1436
1437 /* A subroutine of mips_build_integer, with the same interface.
1438    Assume that the final action in the sequence should be a left shift.  */
1439
1440 static unsigned int
1441 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1442 {
1443   unsigned int i, shift;
1444
1445   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1446      since signed numbers are easier to load than unsigned ones.  */
1447   shift = 0;
1448   while ((value & 1) == 0)
1449     value /= 2, shift++;
1450
1451   i = mips_build_integer (codes, value);
1452   codes[i].code = ASHIFT;
1453   codes[i].value = shift;
1454   return i + 1;
1455 }
1456
1457 /* As for mips_build_shift, but assume that the final action will be
1458    an IOR or PLUS operation.  */
1459
1460 static unsigned int
1461 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1462 {
1463   unsigned HOST_WIDE_INT high;
1464   unsigned int i;
1465
1466   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1467   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1468     {
1469       /* The constant is too complex to load with a simple LUI/ORI pair,
1470          so we want to give the recursive call as many trailing zeros as
1471          possible.  In this case, we know bit 16 is set and that the
1472          low 16 bits form a negative number.  If we subtract that number
1473          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1474       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1475       codes[i].code = PLUS;
1476       codes[i].value = CONST_LOW_PART (value);
1477     }
1478   else
1479     {
1480       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1481          bits gives a value with at least 17 trailing zeros.  */
1482       i = mips_build_integer (codes, high);
1483       codes[i].code = IOR;
1484       codes[i].value = value & 0xffff;
1485     }
1486   return i + 1;
1487 }
1488
1489 /* Fill CODES with a sequence of rtl operations to load VALUE.
1490    Return the number of operations needed.  */
1491
1492 static unsigned int
1493 mips_build_integer (struct mips_integer_op *codes,
1494                     unsigned HOST_WIDE_INT value)
1495 {
1496   if (SMALL_OPERAND (value)
1497       || SMALL_OPERAND_UNSIGNED (value)
1498       || LUI_OPERAND (value))
1499     {
1500       /* The value can be loaded with a single instruction.  */
1501       codes[0].code = UNKNOWN;
1502       codes[0].value = value;
1503       return 1;
1504     }
1505   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1506     {
1507       /* Either the constant is a simple LUI/ORI combination or its
1508          lowest bit is set.  We don't want to shift in this case.  */
1509       return mips_build_lower (codes, value);
1510     }
1511   else if ((value & 0xffff) == 0)
1512     {
1513       /* The constant will need at least three actions.  The lowest
1514          16 bits are clear, so the final action will be a shift.  */
1515       return mips_build_shift (codes, value);
1516     }
1517   else
1518     {
1519       /* The final action could be a shift, add or inclusive OR.
1520          Rather than use a complex condition to select the best
1521          approach, try both mips_build_shift and mips_build_lower
1522          and pick the one that gives the shortest sequence.
1523          Note that this case is only used once per constant.  */
1524       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1525       unsigned int cost, alt_cost;
1526
1527       cost = mips_build_shift (codes, value);
1528       alt_cost = mips_build_lower (alt_codes, value);
1529       if (alt_cost < cost)
1530         {
1531           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1532           cost = alt_cost;
1533         }
1534       return cost;
1535     }
1536 }
1537 \f
1538 /* Return true if symbols of type TYPE require a GOT access.  */
1539
1540 static bool
1541 mips_got_symbol_type_p (enum mips_symbol_type type)
1542 {
1543   switch (type)
1544     {
1545     case SYMBOL_GOT_PAGE_OFST:
1546     case SYMBOL_GOT_DISP:
1547       return true;
1548
1549     default:
1550       return false;
1551     }
1552 }
1553
1554 /* Return true if X is a thread-local symbol.  */
1555
1556 static bool
1557 mips_tls_symbol_p (rtx x)
1558 {
1559   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1560 }
1561
1562 /* Return true if SYMBOL_REF X is associated with a global symbol
1563    (in the STB_GLOBAL sense).  */
1564
1565 static bool
1566 mips_global_symbol_p (const_rtx x)
1567 {
1568   const_tree decl = SYMBOL_REF_DECL (x);
1569
1570   if (!decl)
1571     return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1572
1573   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1574      or weak symbols.  Relocations in the object file will be against
1575      the target symbol, so it's that symbol's binding that matters here.  */
1576   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1577 }
1578
1579 /* Return true if function X is a libgcc MIPS16 stub function.  */
1580
1581 static bool
1582 mips16_stub_function_p (const_rtx x)
1583 {
1584   return (GET_CODE (x) == SYMBOL_REF
1585           && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1586 }
1587
1588 /* Return true if function X is a locally-defined and locally-binding
1589    MIPS16 function.  */
1590
1591 static bool
1592 mips16_local_function_p (const_rtx x)
1593 {
1594   return (GET_CODE (x) == SYMBOL_REF
1595           && SYMBOL_REF_LOCAL_P (x)
1596           && !SYMBOL_REF_EXTERNAL_P (x)
1597           && mips_use_mips16_mode_p (SYMBOL_REF_DECL (x)));
1598 }
1599
1600 /* Return true if SYMBOL_REF X binds locally.  */
1601
1602 static bool
1603 mips_symbol_binds_local_p (const_rtx x)
1604 {
1605   return (SYMBOL_REF_DECL (x)
1606           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1607           : SYMBOL_REF_LOCAL_P (x));
1608 }
1609
1610 /* Return true if rtx constants of mode MODE should be put into a small
1611    data section.  */
1612
1613 static bool
1614 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1615 {
1616   return (!TARGET_EMBEDDED_DATA
1617           && TARGET_LOCAL_SDATA
1618           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1619 }
1620
1621 /* Return true if X should not be moved directly into register $25.
1622    We need this because many versions of GAS will treat "la $25,foo" as
1623    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1624
1625 bool
1626 mips_dangerous_for_la25_p (rtx x)
1627 {
1628   return (!TARGET_EXPLICIT_RELOCS
1629           && TARGET_USE_GOT
1630           && GET_CODE (x) == SYMBOL_REF
1631           && mips_global_symbol_p (x));
1632 }
1633
1634 /* Return true if calls to X might need $25 to be valid on entry.  */
1635
1636 bool
1637 mips_use_pic_fn_addr_reg_p (const_rtx x)
1638 {
1639   if (!TARGET_USE_PIC_FN_ADDR_REG)
1640     return false;
1641
1642   /* MIPS16 stub functions are guaranteed not to use $25.  */
1643   if (mips16_stub_function_p (x))
1644     return false;
1645
1646   if (GET_CODE (x) == SYMBOL_REF)
1647     {
1648       /* If PLTs and copy relocations are available, the static linker
1649          will make sure that $25 is valid on entry to the target function.  */
1650       if (TARGET_ABICALLS_PIC0)
1651         return false;
1652
1653       /* Locally-defined functions use absolute accesses to set up
1654          the global pointer.  */
1655       if (TARGET_ABSOLUTE_ABICALLS
1656           && mips_symbol_binds_local_p (x)
1657           && !SYMBOL_REF_EXTERNAL_P (x))
1658         return false;
1659     }
1660
1661   return true;
1662 }
1663
1664 /* Return the method that should be used to access SYMBOL_REF or
1665    LABEL_REF X in context CONTEXT.  */
1666
1667 static enum mips_symbol_type
1668 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1669 {
1670   if (TARGET_RTP_PIC)
1671     return SYMBOL_GOT_DISP;
1672
1673   if (GET_CODE (x) == LABEL_REF)
1674     {
1675       /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1676          code and if we know that the label is in the current function's
1677          text section.  LABEL_REFs are used for jump tables as well as
1678          text labels, so we must check whether jump tables live in the
1679          text section.  */
1680       if (TARGET_MIPS16_SHORT_JUMP_TABLES
1681           && !LABEL_REF_NONLOCAL_P (x))
1682         return SYMBOL_PC_RELATIVE;
1683
1684       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1685         return SYMBOL_GOT_PAGE_OFST;
1686
1687       return SYMBOL_ABSOLUTE;
1688     }
1689
1690   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1691
1692   if (SYMBOL_REF_TLS_MODEL (x))
1693     return SYMBOL_TLS;
1694
1695   if (CONSTANT_POOL_ADDRESS_P (x))
1696     {
1697       if (TARGET_MIPS16_TEXT_LOADS)
1698         return SYMBOL_PC_RELATIVE;
1699
1700       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1701         return SYMBOL_PC_RELATIVE;
1702
1703       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1704         return SYMBOL_GP_RELATIVE;
1705     }
1706
1707   /* Do not use small-data accesses for weak symbols; they may end up
1708      being zero.  */
1709   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1710     return SYMBOL_GP_RELATIVE;
1711
1712   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1713      is in effect.  */
1714   if (TARGET_ABICALLS_PIC2
1715       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1716     {
1717       /* There are three cases to consider:
1718
1719             - o32 PIC (either with or without explicit relocs)
1720             - n32/n64 PIC without explicit relocs
1721             - n32/n64 PIC with explicit relocs
1722
1723          In the first case, both local and global accesses will use an
1724          R_MIPS_GOT16 relocation.  We must correctly predict which of
1725          the two semantics (local or global) the assembler and linker
1726          will apply.  The choice depends on the symbol's binding rather
1727          than its visibility.
1728
1729          In the second case, the assembler will not use R_MIPS_GOT16
1730          relocations, but it chooses between local and global accesses
1731          in the same way as for o32 PIC.
1732
1733          In the third case we have more freedom since both forms of
1734          access will work for any kind of symbol.  However, there seems
1735          little point in doing things differently.  */
1736       if (mips_global_symbol_p (x))
1737         return SYMBOL_GOT_DISP;
1738
1739       return SYMBOL_GOT_PAGE_OFST;
1740     }
1741
1742   if (TARGET_MIPS16_PCREL_LOADS && context != SYMBOL_CONTEXT_CALL)
1743     return SYMBOL_FORCE_TO_MEM;
1744
1745   return SYMBOL_ABSOLUTE;
1746 }
1747
1748 /* Classify the base of symbolic expression X, given that X appears in
1749    context CONTEXT.  */
1750
1751 static enum mips_symbol_type
1752 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1753 {
1754   rtx offset;
1755
1756   split_const (x, &x, &offset);
1757   if (UNSPEC_ADDRESS_P (x))
1758     return UNSPEC_ADDRESS_TYPE (x);
1759
1760   return mips_classify_symbol (x, context);
1761 }
1762
1763 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1764    is the alignment in bytes of SYMBOL_REF X.  */
1765
1766 static bool
1767 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1768 {
1769   HOST_WIDE_INT align;
1770
1771   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1772   return IN_RANGE (offset, 0, align - 1);
1773 }
1774
1775 /* Return true if X is a symbolic constant that can be used in context
1776    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1777
1778 bool
1779 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1780                           enum mips_symbol_type *symbol_type)
1781 {
1782   rtx offset;
1783
1784   split_const (x, &x, &offset);
1785   if (UNSPEC_ADDRESS_P (x))
1786     {
1787       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1788       x = UNSPEC_ADDRESS (x);
1789     }
1790   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1791     {
1792       *symbol_type = mips_classify_symbol (x, context);
1793       if (*symbol_type == SYMBOL_TLS)
1794         return false;
1795     }
1796   else
1797     return false;
1798
1799   if (offset == const0_rtx)
1800     return true;
1801
1802   /* Check whether a nonzero offset is valid for the underlying
1803      relocations.  */
1804   switch (*symbol_type)
1805     {
1806     case SYMBOL_ABSOLUTE:
1807     case SYMBOL_FORCE_TO_MEM:
1808     case SYMBOL_32_HIGH:
1809     case SYMBOL_64_HIGH:
1810     case SYMBOL_64_MID:
1811     case SYMBOL_64_LOW:
1812       /* If the target has 64-bit pointers and the object file only
1813          supports 32-bit symbols, the values of those symbols will be
1814          sign-extended.  In this case we can't allow an arbitrary offset
1815          in case the 32-bit value X + OFFSET has a different sign from X.  */
1816       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1817         return offset_within_block_p (x, INTVAL (offset));
1818
1819       /* In other cases the relocations can handle any offset.  */
1820       return true;
1821
1822     case SYMBOL_PC_RELATIVE:
1823       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1824          In this case, we no longer have access to the underlying constant,
1825          but the original symbol-based access was known to be valid.  */
1826       if (GET_CODE (x) == LABEL_REF)
1827         return true;
1828
1829       /* Fall through.  */
1830
1831     case SYMBOL_GP_RELATIVE:
1832       /* Make sure that the offset refers to something within the
1833          same object block.  This should guarantee that the final
1834          PC- or GP-relative offset is within the 16-bit limit.  */
1835       return offset_within_block_p (x, INTVAL (offset));
1836
1837     case SYMBOL_GOT_PAGE_OFST:
1838     case SYMBOL_GOTOFF_PAGE:
1839       /* If the symbol is global, the GOT entry will contain the symbol's
1840          address, and we will apply a 16-bit offset after loading it.
1841          If the symbol is local, the linker should provide enough local
1842          GOT entries for a 16-bit offset, but larger offsets may lead
1843          to GOT overflow.  */
1844       return SMALL_INT (offset);
1845
1846     case SYMBOL_TPREL:
1847     case SYMBOL_DTPREL:
1848       /* There is no carry between the HI and LO REL relocations, so the
1849          offset is only valid if we know it won't lead to such a carry.  */
1850       return mips_offset_within_alignment_p (x, INTVAL (offset));
1851
1852     case SYMBOL_GOT_DISP:
1853     case SYMBOL_GOTOFF_DISP:
1854     case SYMBOL_GOTOFF_CALL:
1855     case SYMBOL_GOTOFF_LOADGP:
1856     case SYMBOL_TLSGD:
1857     case SYMBOL_TLSLDM:
1858     case SYMBOL_GOTTPREL:
1859     case SYMBOL_TLS:
1860     case SYMBOL_HALF:
1861       return false;
1862     }
1863   gcc_unreachable ();
1864 }
1865 \f
1866 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1867    single instruction.  We rely on the fact that, in the worst case,
1868    all instructions involved in a MIPS16 address calculation are usually
1869    extended ones.  */
1870
1871 static int
1872 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1873 {
1874   switch (type)
1875     {
1876     case SYMBOL_ABSOLUTE:
1877       /* When using 64-bit symbols, we need 5 preparatory instructions,
1878          such as:
1879
1880              lui     $at,%highest(symbol)
1881              daddiu  $at,$at,%higher(symbol)
1882              dsll    $at,$at,16
1883              daddiu  $at,$at,%hi(symbol)
1884              dsll    $at,$at,16
1885
1886          The final address is then $at + %lo(symbol).  With 32-bit
1887          symbols we just need a preparatory LUI for normal mode and
1888          a preparatory LI and SLL for MIPS16.  */
1889       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1890
1891     case SYMBOL_GP_RELATIVE:
1892       /* Treat GP-relative accesses as taking a single instruction on
1893          MIPS16 too; the copy of $gp can often be shared.  */
1894       return 1;
1895
1896     case SYMBOL_PC_RELATIVE:
1897       /* PC-relative constants can be only be used with ADDIUPC,
1898          DADDIUPC, LWPC and LDPC.  */
1899       if (mode == MAX_MACHINE_MODE
1900           || GET_MODE_SIZE (mode) == 4
1901           || GET_MODE_SIZE (mode) == 8)
1902         return 1;
1903
1904       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1905       return 0;
1906
1907     case SYMBOL_FORCE_TO_MEM:
1908       /* LEAs will be converted into constant-pool references by
1909          mips_reorg.  */
1910       if (mode == MAX_MACHINE_MODE)
1911         return 1;
1912
1913       /* The constant must be loaded and then dereferenced.  */
1914       return 0;
1915
1916     case SYMBOL_GOT_DISP:
1917       /* The constant will have to be loaded from the GOT before it
1918          is used in an address.  */
1919       if (mode != MAX_MACHINE_MODE)
1920         return 0;
1921
1922       /* Fall through.  */
1923
1924     case SYMBOL_GOT_PAGE_OFST:
1925       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1926          local/global classification is accurate.  The worst cases are:
1927
1928          (1) For local symbols when generating o32 or o64 code.  The assembler
1929              will use:
1930
1931                  lw           $at,%got(symbol)
1932                  nop
1933
1934              ...and the final address will be $at + %lo(symbol).
1935
1936          (2) For global symbols when -mxgot.  The assembler will use:
1937
1938                  lui     $at,%got_hi(symbol)
1939                  (d)addu $at,$at,$gp
1940
1941              ...and the final address will be $at + %got_lo(symbol).  */
1942       return 3;
1943
1944     case SYMBOL_GOTOFF_PAGE:
1945     case SYMBOL_GOTOFF_DISP:
1946     case SYMBOL_GOTOFF_CALL:
1947     case SYMBOL_GOTOFF_LOADGP:
1948     case SYMBOL_32_HIGH:
1949     case SYMBOL_64_HIGH:
1950     case SYMBOL_64_MID:
1951     case SYMBOL_64_LOW:
1952     case SYMBOL_TLSGD:
1953     case SYMBOL_TLSLDM:
1954     case SYMBOL_DTPREL:
1955     case SYMBOL_GOTTPREL:
1956     case SYMBOL_TPREL:
1957     case SYMBOL_HALF:
1958       /* A 16-bit constant formed by a single relocation, or a 32-bit
1959          constant formed from a high 16-bit relocation and a low 16-bit
1960          relocation.  Use mips_split_p to determine which.  32-bit
1961          constants need an "lui; addiu" sequence for normal mode and
1962          an "li; sll; addiu" sequence for MIPS16 mode.  */
1963       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1964
1965     case SYMBOL_TLS:
1966       /* We don't treat a bare TLS symbol as a constant.  */
1967       return 0;
1968     }
1969   gcc_unreachable ();
1970 }
1971
1972 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1973    to load symbols of type TYPE into a register.  Return 0 if the given
1974    type of symbol cannot be used as an immediate operand.
1975
1976    Otherwise, return the number of instructions needed to load or store
1977    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1978    the given type of symbol is not valid in addresses.
1979
1980    In both cases, treat extended MIPS16 instructions as two instructions.  */
1981
1982 static int
1983 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1984 {
1985   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1986 }
1987 \f
1988 /* A for_each_rtx callback.  Stop the search if *X references a
1989    thread-local symbol.  */
1990
1991 static int
1992 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1993 {
1994   return mips_tls_symbol_p (*x);
1995 }
1996
1997 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1998
1999 static bool
2000 mips_cannot_force_const_mem (rtx x)
2001 {
2002   enum mips_symbol_type type;
2003   rtx base, offset;
2004
2005   /* There is no assembler syntax for expressing an address-sized
2006      high part.  */
2007   if (GET_CODE (x) == HIGH)
2008     return true;
2009
2010   /* As an optimization, reject constants that mips_legitimize_move
2011      can expand inline.
2012
2013      Suppose we have a multi-instruction sequence that loads constant C
2014      into register R.  If R does not get allocated a hard register, and
2015      R is used in an operand that allows both registers and memory
2016      references, reload will consider forcing C into memory and using
2017      one of the instruction's memory alternatives.  Returning false
2018      here will force it to use an input reload instead.  */
2019   if (CONST_INT_P (x) && LEGITIMATE_CONSTANT_P (x))
2020     return true;
2021
2022   split_const (x, &base, &offset);
2023   if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type)
2024       && type != SYMBOL_FORCE_TO_MEM)
2025     {
2026       /* The same optimization as for CONST_INT.  */
2027       if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
2028         return true;
2029
2030       /* If MIPS16 constant pools live in the text section, they should
2031          not refer to anything that might need run-time relocation.  */
2032       if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2033         return true;
2034     }
2035
2036   /* TLS symbols must be computed by mips_legitimize_move.  */
2037   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
2038     return true;
2039
2040   return false;
2041 }
2042
2043 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
2044    constants when we're using a per-function constant pool.  */
2045
2046 static bool
2047 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
2048                                 const_rtx x ATTRIBUTE_UNUSED)
2049 {
2050   return !TARGET_MIPS16_PCREL_LOADS;
2051 }
2052 \f
2053 /* Return true if register REGNO is a valid base register for mode MODE.
2054    STRICT_P is true if REG_OK_STRICT is in effect.  */
2055
2056 int
2057 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
2058                                bool strict_p)
2059 {
2060   if (!HARD_REGISTER_NUM_P (regno))
2061     {
2062       if (!strict_p)
2063         return true;
2064       regno = reg_renumber[regno];
2065     }
2066
2067   /* These fake registers will be eliminated to either the stack or
2068      hard frame pointer, both of which are usually valid base registers.
2069      Reload deals with the cases where the eliminated form isn't valid.  */
2070   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2071     return true;
2072
2073   /* In MIPS16 mode, the stack pointer can only address word and doubleword
2074      values, nothing smaller.  There are two problems here:
2075
2076        (a) Instantiating virtual registers can introduce new uses of the
2077            stack pointer.  If these virtual registers are valid addresses,
2078            the stack pointer should be too.
2079
2080        (b) Most uses of the stack pointer are not made explicit until
2081            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2082            We don't know until that stage whether we'll be eliminating to the
2083            stack pointer (which needs the restriction) or the hard frame
2084            pointer (which doesn't).
2085
2086      All in all, it seems more consistent to only enforce this restriction
2087      during and after reload.  */
2088   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2089     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2090
2091   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2092 }
2093
2094 /* Return true if X is a valid base register for mode MODE.
2095    STRICT_P is true if REG_OK_STRICT is in effect.  */
2096
2097 static bool
2098 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2099 {
2100   if (!strict_p && GET_CODE (x) == SUBREG)
2101     x = SUBREG_REG (x);
2102
2103   return (REG_P (x)
2104           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2105 }
2106
2107 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2108    can address a value of mode MODE.  */
2109
2110 static bool
2111 mips_valid_offset_p (rtx x, enum machine_mode mode)
2112 {
2113   /* Check that X is a signed 16-bit number.  */
2114   if (!const_arith_operand (x, Pmode))
2115     return false;
2116
2117   /* We may need to split multiword moves, so make sure that every word
2118      is accessible.  */
2119   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2120       && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2121     return false;
2122
2123   return true;
2124 }
2125
2126 /* Return true if a LO_SUM can address a value of mode MODE when the
2127    LO_SUM symbol has type SYMBOL_TYPE.  */
2128
2129 static bool
2130 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2131 {
2132   /* Check that symbols of type SYMBOL_TYPE can be used to access values
2133      of mode MODE.  */
2134   if (mips_symbol_insns (symbol_type, mode) == 0)
2135     return false;
2136
2137   /* Check that there is a known low-part relocation.  */
2138   if (mips_lo_relocs[symbol_type] == NULL)
2139     return false;
2140
2141   /* We may need to split multiword moves, so make sure that each word
2142      can be accessed without inducing a carry.  This is mainly needed
2143      for o64, which has historically only guaranteed 64-bit alignment
2144      for 128-bit types.  */
2145   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2146       && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2147     return false;
2148
2149   return true;
2150 }
2151
2152 /* Return true if X is a valid address for machine mode MODE.  If it is,
2153    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2154    effect.  */
2155
2156 static bool
2157 mips_classify_address (struct mips_address_info *info, rtx x,
2158                        enum machine_mode mode, bool strict_p)
2159 {
2160   switch (GET_CODE (x))
2161     {
2162     case REG:
2163     case SUBREG:
2164       info->type = ADDRESS_REG;
2165       info->reg = x;
2166       info->offset = const0_rtx;
2167       return mips_valid_base_register_p (info->reg, mode, strict_p);
2168
2169     case PLUS:
2170       info->type = ADDRESS_REG;
2171       info->reg = XEXP (x, 0);
2172       info->offset = XEXP (x, 1);
2173       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2174               && mips_valid_offset_p (info->offset, mode));
2175
2176     case LO_SUM:
2177       info->type = ADDRESS_LO_SUM;
2178       info->reg = XEXP (x, 0);
2179       info->offset = XEXP (x, 1);
2180       /* We have to trust the creator of the LO_SUM to do something vaguely
2181          sane.  Target-independent code that creates a LO_SUM should also
2182          create and verify the matching HIGH.  Target-independent code that
2183          adds an offset to a LO_SUM must prove that the offset will not
2184          induce a carry.  Failure to do either of these things would be
2185          a bug, and we are not required to check for it here.  The MIPS
2186          backend itself should only create LO_SUMs for valid symbolic
2187          constants, with the high part being either a HIGH or a copy
2188          of _gp. */
2189       info->symbol_type
2190         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2191       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2192               && mips_valid_lo_sum_p (info->symbol_type, mode));
2193
2194     case CONST_INT:
2195       /* Small-integer addresses don't occur very often, but they
2196          are legitimate if $0 is a valid base register.  */
2197       info->type = ADDRESS_CONST_INT;
2198       return !TARGET_MIPS16 && SMALL_INT (x);
2199
2200     case CONST:
2201     case LABEL_REF:
2202     case SYMBOL_REF:
2203       info->type = ADDRESS_SYMBOLIC;
2204       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2205                                         &info->symbol_type)
2206               && mips_symbol_insns (info->symbol_type, mode) > 0
2207               && !mips_split_p[info->symbol_type]);
2208
2209     default:
2210       return false;
2211     }
2212 }
2213
2214 /* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
2215
2216 static bool
2217 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2218 {
2219   struct mips_address_info addr;
2220
2221   return mips_classify_address (&addr, x, mode, strict_p);
2222 }
2223
2224 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2225
2226 bool
2227 mips_stack_address_p (rtx x, enum machine_mode mode)
2228 {
2229   struct mips_address_info addr;
2230
2231   return (mips_classify_address (&addr, x, mode, false)
2232           && addr.type == ADDRESS_REG
2233           && addr.reg == stack_pointer_rtx);
2234 }
2235
2236 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2237    address instruction.  Note that such addresses are not considered
2238    legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2239    is so restricted.  */
2240
2241 static bool
2242 mips_lwxs_address_p (rtx addr)
2243 {
2244   if (ISA_HAS_LWXS
2245       && GET_CODE (addr) == PLUS
2246       && REG_P (XEXP (addr, 1)))
2247     {
2248       rtx offset = XEXP (addr, 0);
2249       if (GET_CODE (offset) == MULT
2250           && REG_P (XEXP (offset, 0))
2251           && CONST_INT_P (XEXP (offset, 1))
2252           && INTVAL (XEXP (offset, 1)) == 4)
2253         return true;
2254     }
2255   return false;
2256 }
2257 \f
2258 /* Return true if a value at OFFSET bytes from base register BASE can be
2259    accessed using an unextended MIPS16 instruction.  MODE is the mode of
2260    the value.
2261
2262    Usually the offset in an unextended instruction is a 5-bit field.
2263    The offset is unsigned and shifted left once for LH and SH, twice
2264    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2265    an 8-bit immediate field that's shifted left twice.  */
2266
2267 static bool
2268 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2269                                unsigned HOST_WIDE_INT offset)
2270 {
2271   if (offset % GET_MODE_SIZE (mode) == 0)
2272     {
2273       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2274         return offset < 256U * GET_MODE_SIZE (mode);
2275       return offset < 32U * GET_MODE_SIZE (mode);
2276     }
2277   return false;
2278 }
2279
2280 /* Return the number of instructions needed to load or store a value
2281    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
2282    Assume that multiword moves may need to be split into word moves
2283    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2284    enough.
2285
2286    For MIPS16 code, count extended instructions as two instructions.  */
2287
2288 int
2289 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2290 {
2291   struct mips_address_info addr;
2292   int factor;
2293
2294   /* BLKmode is used for single unaligned loads and stores and should
2295      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2296      meaningless, so we have to single it out as a special case one way
2297      or the other.)  */
2298   if (mode != BLKmode && might_split_p)
2299     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2300   else
2301     factor = 1;
2302
2303   if (mips_classify_address (&addr, x, mode, false))
2304     switch (addr.type)
2305       {
2306       case ADDRESS_REG:
2307         if (TARGET_MIPS16
2308             && !mips16_unextended_reference_p (mode, addr.reg,
2309                                                UINTVAL (addr.offset)))
2310           return factor * 2;
2311         return factor;
2312
2313       case ADDRESS_LO_SUM:
2314         return TARGET_MIPS16 ? factor * 2 : factor;
2315
2316       case ADDRESS_CONST_INT:
2317         return factor;
2318
2319       case ADDRESS_SYMBOLIC:
2320         return factor * mips_symbol_insns (addr.symbol_type, mode);
2321       }
2322   return 0;
2323 }
2324
2325 /* Return the number of instructions needed to load constant X.
2326    Return 0 if X isn't a valid constant.  */
2327
2328 int
2329 mips_const_insns (rtx x)
2330 {
2331   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2332   enum mips_symbol_type symbol_type;
2333   rtx offset;
2334
2335   switch (GET_CODE (x))
2336     {
2337     case HIGH:
2338       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2339                                      &symbol_type)
2340           || !mips_split_p[symbol_type])
2341         return 0;
2342
2343       /* This is simply an LUI for normal mode.  It is an extended
2344          LI followed by an extended SLL for MIPS16.  */
2345       return TARGET_MIPS16 ? 4 : 1;
2346
2347     case CONST_INT:
2348       if (TARGET_MIPS16)
2349         /* Unsigned 8-bit constants can be loaded using an unextended
2350            LI instruction.  Unsigned 16-bit constants can be loaded
2351            using an extended LI.  Negative constants must be loaded
2352            using LI and then negated.  */
2353         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2354                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2355                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2356                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2357                 : 0);
2358
2359       return mips_build_integer (codes, INTVAL (x));
2360
2361     case CONST_DOUBLE:
2362     case CONST_VECTOR:
2363       /* Allow zeros for normal mode, where we can use $0.  */
2364       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2365
2366     case CONST:
2367       if (CONST_GP_P (x))
2368         return 1;
2369
2370       /* See if we can refer to X directly.  */
2371       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2372         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2373
2374       /* Otherwise try splitting the constant into a base and offset.
2375          If the offset is a 16-bit value, we can load the base address
2376          into a register and then use (D)ADDIU to add in the offset.
2377          If the offset is larger, we can load the base and offset
2378          into separate registers and add them together with (D)ADDU.
2379          However, the latter is only possible before reload; during
2380          and after reload, we must have the option of forcing the
2381          constant into the pool instead.  */
2382       split_const (x, &x, &offset);
2383       if (offset != 0)
2384         {
2385           int n = mips_const_insns (x);
2386           if (n != 0)
2387             {
2388               if (SMALL_INT (offset))
2389                 return n + 1;
2390               else if (!targetm.cannot_force_const_mem (x))
2391                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2392             }
2393         }
2394       return 0;
2395
2396     case SYMBOL_REF:
2397     case LABEL_REF:
2398       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2399                                 MAX_MACHINE_MODE);
2400
2401     default:
2402       return 0;
2403     }
2404 }
2405
2406 /* X is a doubleword constant that can be handled by splitting it into
2407    two words and loading each word separately.  Return the number of
2408    instructions required to do this.  */
2409
2410 int
2411 mips_split_const_insns (rtx x)
2412 {
2413   unsigned int low, high;
2414
2415   low = mips_const_insns (mips_subword (x, false));
2416   high = mips_const_insns (mips_subword (x, true));
2417   gcc_assert (low > 0 && high > 0);
2418   return low + high;
2419 }
2420
2421 /* Return the number of instructions needed to implement INSN,
2422    given that it loads from or stores to MEM.  Count extended
2423    MIPS16 instructions as two instructions.  */
2424
2425 int
2426 mips_load_store_insns (rtx mem, rtx insn)
2427 {
2428   enum machine_mode mode;
2429   bool might_split_p;
2430   rtx set;
2431
2432   gcc_assert (MEM_P (mem));
2433   mode = GET_MODE (mem);
2434
2435   /* Try to prove that INSN does not need to be split.  */
2436   might_split_p = true;
2437   if (GET_MODE_BITSIZE (mode) == 64)
2438     {
2439       set = single_set (insn);
2440       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2441         might_split_p = false;
2442     }
2443
2444   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2445 }
2446
2447 /* Return the number of instructions needed for an integer division.  */
2448
2449 int
2450 mips_idiv_insns (void)
2451 {
2452   int count;
2453
2454   count = 1;
2455   if (TARGET_CHECK_ZERO_DIV)
2456     {
2457       if (GENERATE_DIVIDE_TRAPS)
2458         count++;
2459       else
2460         count += 2;
2461     }
2462
2463   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2464     count++;
2465   return count;
2466 }
2467 \f
2468 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2469    handle all moves if !can_create_pseudo_p ().  The distinction is
2470    important because, unlike emit_move_insn, the move expanders know
2471    how to force Pmode objects into the constant pool even when the
2472    constant pool address is not itself legitimate.  */
2473
2474 rtx
2475 mips_emit_move (rtx dest, rtx src)
2476 {
2477   return (can_create_pseudo_p ()
2478           ? emit_move_insn (dest, src)
2479           : emit_move_insn_1 (dest, src));
2480 }
2481
2482 /* Emit an instruction of the form (set TARGET (CODE OP0)).  */
2483
2484 static void
2485 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2486 {
2487   emit_insn (gen_rtx_SET (VOIDmode, target,
2488                           gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2489 }
2490
2491 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2492    Return that new register.  */
2493
2494 static rtx
2495 mips_force_unary (enum machine_mode mode, enum rtx_code code, rtx op0)
2496 {
2497   rtx reg;
2498
2499   reg = gen_reg_rtx (mode);
2500   mips_emit_unary (code, reg, op0);
2501   return reg;
2502 }
2503
2504 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2505
2506 static void
2507 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2508 {
2509   emit_insn (gen_rtx_SET (VOIDmode, target,
2510                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2511 }
2512
2513 /* Compute (CODE OP0 OP1) and store the result in a new register
2514    of mode MODE.  Return that new register.  */
2515
2516 static rtx
2517 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2518 {
2519   rtx reg;
2520
2521   reg = gen_reg_rtx (mode);
2522   mips_emit_binary (code, reg, op0, op1);
2523   return reg;
2524 }
2525
2526 /* Copy VALUE to a register and return that register.  If new pseudos
2527    are allowed, copy it into a new register, otherwise use DEST.  */
2528
2529 static rtx
2530 mips_force_temporary (rtx dest, rtx value)
2531 {
2532   if (can_create_pseudo_p ())
2533     return force_reg (Pmode, value);
2534   else
2535     {
2536       mips_emit_move (dest, value);
2537       return dest;
2538     }
2539 }
2540
2541 /* Emit a call sequence with call pattern PATTERN and return the call
2542    instruction itself (which is not necessarily the last instruction
2543    emitted).  ORIG_ADDR is the original, unlegitimized address,
2544    ADDR is the legitimized form, and LAZY_P is true if the call
2545    address is lazily-bound.  */
2546
2547 static rtx
2548 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2549 {
2550   rtx insn, reg;
2551
2552   insn = emit_call_insn (pattern);
2553
2554   if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2555     {
2556       /* MIPS16 JALRs only take MIPS16 registers.  If the target
2557          function requires $25 to be valid on entry, we must copy it
2558          there separately.  The move instruction can be put in the
2559          call's delay slot.  */
2560       reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2561       emit_insn_before (gen_move_insn (reg, addr), insn);
2562       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2563     }
2564
2565   if (lazy_p)
2566     /* Lazy-binding stubs require $gp to be valid on entry.  */
2567     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2568
2569   if (TARGET_USE_GOT)
2570     {
2571       /* See the comment above load_call<mode> for details.  */
2572       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2573                gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2574       emit_insn (gen_update_got_version ());
2575     }
2576   return insn;
2577 }
2578 \f
2579 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2580    then add CONST_INT OFFSET to the result.  */
2581
2582 static rtx
2583 mips_unspec_address_offset (rtx base, rtx offset,
2584                             enum mips_symbol_type symbol_type)
2585 {
2586   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2587                          UNSPEC_ADDRESS_FIRST + symbol_type);
2588   if (offset != const0_rtx)
2589     base = gen_rtx_PLUS (Pmode, base, offset);
2590   return gen_rtx_CONST (Pmode, base);
2591 }
2592
2593 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2594    type SYMBOL_TYPE.  */
2595
2596 rtx
2597 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2598 {
2599   rtx base, offset;
2600
2601   split_const (address, &base, &offset);
2602   return mips_unspec_address_offset (base, offset, symbol_type);
2603 }
2604
2605 /* If OP is an UNSPEC address, return the address to which it refers,
2606    otherwise return OP itself.  */
2607
2608 static rtx
2609 mips_strip_unspec_address (rtx op)
2610 {
2611   rtx base, offset;
2612
2613   split_const (op, &base, &offset);
2614   if (UNSPEC_ADDRESS_P (base))
2615     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
2616   return op;
2617 }
2618
2619 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2620    high part to BASE and return the result.  Just return BASE otherwise.
2621    TEMP is as for mips_force_temporary.
2622
2623    The returned expression can be used as the first operand to a LO_SUM.  */
2624
2625 static rtx
2626 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2627                          enum mips_symbol_type symbol_type)
2628 {
2629   if (mips_split_p[symbol_type])
2630     {
2631       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2632       addr = mips_force_temporary (temp, addr);
2633       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2634     }
2635   return base;
2636 }
2637 \f
2638 /* Return an instruction that copies $gp into register REG.  We want
2639    GCC to treat the register's value as constant, so that its value
2640    can be rematerialized on demand.  */
2641
2642 static rtx
2643 gen_load_const_gp (rtx reg)
2644 {
2645   return (Pmode == SImode
2646           ? gen_load_const_gp_si (reg)
2647           : gen_load_const_gp_di (reg));
2648 }
2649
2650 /* Return a pseudo register that contains the value of $gp throughout
2651    the current function.  Such registers are needed by MIPS16 functions,
2652    for which $gp itself is not a valid base register or addition operand.  */
2653
2654 static rtx
2655 mips16_gp_pseudo_reg (void)
2656 {
2657   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2658     {
2659       rtx insn, scan;
2660
2661       cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2662
2663       push_topmost_sequence ();
2664
2665       scan = get_insns ();
2666       while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2667         scan = NEXT_INSN (scan);
2668
2669       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2670       emit_insn_after (insn, scan);
2671
2672       pop_topmost_sequence ();
2673     }
2674
2675   return cfun->machine->mips16_gp_pseudo_rtx;
2676 }
2677
2678 /* Return a base register that holds pic_offset_table_rtx.
2679    TEMP, if nonnull, is a scratch Pmode base register.  */
2680
2681 rtx
2682 mips_pic_base_register (rtx temp)
2683 {
2684   if (!TARGET_MIPS16)
2685     return pic_offset_table_rtx;
2686
2687   if (currently_expanding_to_rtl)
2688     return mips16_gp_pseudo_reg ();
2689
2690   if (can_create_pseudo_p ())
2691     temp = gen_reg_rtx (Pmode);
2692
2693   if (TARGET_USE_GOT)
2694     /* The first post-reload split exposes all references to $gp
2695        (both uses and definitions).  All references must remain
2696        explicit after that point.
2697
2698        It is safe to introduce uses of $gp at any time, so for
2699        simplicity, we do that before the split too.  */
2700     mips_emit_move (temp, pic_offset_table_rtx);
2701   else
2702     emit_insn (gen_load_const_gp (temp));
2703   return temp;
2704 }
2705
2706 /* Return the RHS of a load_call<mode> insn.  */
2707
2708 static rtx
2709 mips_unspec_call (rtx reg, rtx symbol)
2710 {
2711   rtvec vec;
2712
2713   vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2714   return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2715 }
2716
2717 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2718    reference.  Return NULL_RTX otherwise.  */
2719
2720 static rtx
2721 mips_strip_unspec_call (rtx src)
2722 {
2723   if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2724     return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2725   return NULL_RTX;
2726 }
2727
2728 /* Create and return a GOT reference of type TYPE for address ADDR.
2729    TEMP, if nonnull, is a scratch Pmode base register.  */
2730
2731 rtx
2732 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2733 {
2734   rtx base, high, lo_sum_symbol;
2735
2736   base = mips_pic_base_register (temp);
2737
2738   /* If we used the temporary register to load $gp, we can't use
2739      it for the high part as well.  */
2740   if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2741     temp = NULL;
2742
2743   high = mips_unspec_offset_high (temp, base, addr, type);
2744   lo_sum_symbol = mips_unspec_address (addr, type);
2745
2746   if (type == SYMBOL_GOTOFF_CALL)
2747     return mips_unspec_call (high, lo_sum_symbol);
2748   else
2749     return (Pmode == SImode
2750             ? gen_unspec_gotsi (high, lo_sum_symbol)
2751             : gen_unspec_gotdi (high, lo_sum_symbol));
2752 }
2753
2754 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2755    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2756    constant in that context and can be split into high and low parts.
2757    If so, and if LOW_OUT is nonnull, emit the high part and store the
2758    low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
2759
2760    TEMP is as for mips_force_temporary and is used to load the high
2761    part into a register.
2762
2763    When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2764    a legitimize SET_SRC for an .md pattern, otherwise the low part
2765    is guaranteed to be a legitimate address for mode MODE.  */
2766
2767 bool
2768 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2769 {
2770   enum mips_symbol_context context;
2771   enum mips_symbol_type symbol_type;
2772   rtx high;
2773
2774   context = (mode == MAX_MACHINE_MODE
2775              ? SYMBOL_CONTEXT_LEA
2776              : SYMBOL_CONTEXT_MEM);
2777   if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2778     {
2779       addr = XEXP (addr, 0);
2780       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2781           && mips_symbol_insns (symbol_type, mode) > 0
2782           && mips_split_hi_p[symbol_type])
2783         {
2784           if (low_out)
2785             switch (symbol_type)
2786               {
2787               case SYMBOL_GOT_PAGE_OFST:
2788                 /* The high part of a page/ofst pair is loaded from the GOT.  */
2789                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2790                 break;
2791
2792               default:
2793                 gcc_unreachable ();
2794               }
2795           return true;
2796         }
2797     }
2798   else
2799     {
2800       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2801           && mips_symbol_insns (symbol_type, mode) > 0
2802           && mips_split_p[symbol_type])
2803         {
2804           if (low_out)
2805             switch (symbol_type)
2806               {
2807               case SYMBOL_GOT_DISP:
2808                 /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
2809                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2810                 break;
2811
2812               case SYMBOL_GP_RELATIVE:
2813                 high = mips_pic_base_register (temp);
2814                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2815                 break;
2816
2817               default:
2818                 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2819                 high = mips_force_temporary (temp, high);
2820                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2821                 break;
2822               }
2823           return true;
2824         }
2825     }
2826   return false;
2827 }
2828
2829 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2830    mips_force_temporary; it is only needed when OFFSET is not a
2831    SMALL_OPERAND.  */
2832
2833 static rtx
2834 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2835 {
2836   if (!SMALL_OPERAND (offset))
2837     {
2838       rtx high;
2839
2840       if (TARGET_MIPS16)
2841         {
2842           /* Load the full offset into a register so that we can use
2843              an unextended instruction for the address itself.  */
2844           high = GEN_INT (offset);
2845           offset = 0;
2846         }
2847       else
2848         {
2849           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
2850              The addition inside the macro CONST_HIGH_PART may cause an
2851              overflow, so we need to force a sign-extension check.  */
2852           high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
2853           offset = CONST_LOW_PART (offset);
2854         }
2855       high = mips_force_temporary (temp, high);
2856       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2857     }
2858   return plus_constant (reg, offset);
2859 }
2860 \f
2861 /* The __tls_get_attr symbol.  */
2862 static GTY(()) rtx mips_tls_symbol;
2863
2864 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2865    the TLS symbol we are referencing and TYPE is the symbol type to use
2866    (either global dynamic or local dynamic).  V0 is an RTX for the
2867    return value location.  */
2868
2869 static rtx
2870 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2871 {
2872   rtx insn, loc, a0;
2873
2874   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2875
2876   if (!mips_tls_symbol)
2877     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2878
2879   loc = mips_unspec_address (sym, type);
2880
2881   start_sequence ();
2882
2883   emit_insn (gen_rtx_SET (Pmode, a0,
2884                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2885   insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
2886                            const0_rtx, NULL_RTX, false);
2887   RTL_CONST_CALL_P (insn) = 1;
2888   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2889   insn = get_insns ();
2890
2891   end_sequence ();
2892
2893   return insn;
2894 }
2895
2896 /* Return a pseudo register that contains the current thread pointer.  */
2897
2898 static rtx
2899 mips_get_tp (void)
2900 {
2901   rtx tp;
2902
2903   tp = gen_reg_rtx (Pmode);
2904   if (Pmode == DImode)
2905     emit_insn (gen_tls_get_tp_di (tp));
2906   else
2907     emit_insn (gen_tls_get_tp_si (tp));
2908   return tp;
2909 }
2910
2911 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2912    its address.  The return value will be both a valid address and a valid
2913    SET_SRC (either a REG or a LO_SUM).  */
2914
2915 static rtx
2916 mips_legitimize_tls_address (rtx loc)
2917 {
2918   rtx dest, insn, v0, tp, tmp1, tmp2, eqv;
2919   enum tls_model model;
2920
2921   if (TARGET_MIPS16)
2922     {
2923       sorry ("MIPS16 TLS");
2924       return gen_reg_rtx (Pmode);
2925     }
2926
2927   model = SYMBOL_REF_TLS_MODEL (loc);
2928   /* Only TARGET_ABICALLS code can have more than one module; other
2929      code must be be static and should not use a GOT.  All TLS models
2930      reduce to local exec in this situation.  */
2931   if (!TARGET_ABICALLS)
2932     model = TLS_MODEL_LOCAL_EXEC;
2933
2934   switch (model)
2935     {
2936     case TLS_MODEL_GLOBAL_DYNAMIC:
2937       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2938       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2939       dest = gen_reg_rtx (Pmode);
2940       emit_libcall_block (insn, dest, v0, loc);
2941       break;
2942
2943     case TLS_MODEL_LOCAL_DYNAMIC:
2944       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2945       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2946       tmp1 = gen_reg_rtx (Pmode);
2947
2948       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2949          share the LDM result with other LD model accesses.  */
2950       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2951                             UNSPEC_TLS_LDM);
2952       emit_libcall_block (insn, tmp1, v0, eqv);
2953
2954       tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2955       dest = gen_rtx_LO_SUM (Pmode, tmp2,
2956                              mips_unspec_address (loc, SYMBOL_DTPREL));
2957       break;
2958
2959     case TLS_MODEL_INITIAL_EXEC:
2960       tp = mips_get_tp ();
2961       tmp1 = gen_reg_rtx (Pmode);
2962       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2963       if (Pmode == DImode)
2964         emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2965       else
2966         emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2967       dest = gen_reg_rtx (Pmode);
2968       emit_insn (gen_add3_insn (dest, tmp1, tp));
2969       break;
2970
2971     case TLS_MODEL_LOCAL_EXEC:
2972       tp = mips_get_tp ();
2973       tmp1 = mips_unspec_offset_high (NULL, tp, loc, SYMBOL_TPREL);
2974       dest = gen_rtx_LO_SUM (Pmode, tmp1,
2975                              mips_unspec_address (loc, SYMBOL_TPREL));
2976       break;
2977
2978     default:
2979       gcc_unreachable ();
2980     }
2981   return dest;
2982 }
2983 \f
2984 /* If X is not a valid address for mode MODE, force it into a register.  */
2985
2986 static rtx
2987 mips_force_address (rtx x, enum machine_mode mode)
2988 {
2989   if (!mips_legitimate_address_p (mode, x, false))
2990     x = force_reg (Pmode, x);
2991   return x;
2992 }
2993
2994 /* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
2995    be legitimized in a way that the generic machinery might not expect,
2996    return a new address, otherwise return NULL.  MODE is the mode of
2997    the memory being accessed.  */
2998
2999 static rtx
3000 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3001                          enum machine_mode mode)
3002 {
3003   rtx base, addr;
3004   HOST_WIDE_INT offset;
3005
3006   if (mips_tls_symbol_p (x))
3007     return mips_legitimize_tls_address (x);
3008
3009   /* See if the address can split into a high part and a LO_SUM.  */
3010   if (mips_split_symbol (NULL, x, mode, &addr))
3011     return mips_force_address (addr, mode);
3012
3013   /* Handle BASE + OFFSET using mips_add_offset.  */
3014   mips_split_plus (x, &base, &offset);
3015   if (offset != 0)
3016     {
3017       if (!mips_valid_base_register_p (base, mode, false))
3018         base = copy_to_mode_reg (Pmode, base);
3019       addr = mips_add_offset (NULL, base, offset);
3020       return mips_force_address (addr, mode);
3021     }
3022
3023   return x;
3024 }
3025
3026 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
3027
3028 void
3029 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3030 {
3031   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3032   enum machine_mode mode;
3033   unsigned int i, num_ops;
3034   rtx x;
3035
3036   mode = GET_MODE (dest);
3037   num_ops = mips_build_integer (codes, value);
3038
3039   /* Apply each binary operation to X.  Invariant: X is a legitimate
3040      source operand for a SET pattern.  */
3041   x = GEN_INT (codes[0].value);
3042   for (i = 1; i < num_ops; i++)
3043     {
3044       if (!can_create_pseudo_p ())
3045         {
3046           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
3047           x = temp;
3048         }
3049       else
3050         x = force_reg (mode, x);
3051       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3052     }
3053
3054   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3055 }
3056
3057 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
3058    DEST given that SRC satisfies immediate_operand but doesn't satisfy
3059    move_operand.  */
3060
3061 static void
3062 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3063 {
3064   rtx base, offset;
3065
3066   /* Split moves of big integers into smaller pieces.  */
3067   if (splittable_const_int_operand (src, mode))
3068     {
3069       mips_move_integer (dest, dest, INTVAL (src));
3070       return;
3071     }
3072
3073   /* Split moves of symbolic constants into high/low pairs.  */
3074   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3075     {
3076       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3077       return;
3078     }
3079
3080   /* Generate the appropriate access sequences for TLS symbols.  */
3081   if (mips_tls_symbol_p (src))
3082     {
3083       mips_emit_move (dest, mips_legitimize_tls_address (src));
3084       return;
3085     }
3086
3087   /* If we have (const (plus symbol offset)), and that expression cannot
3088      be forced into memory, load the symbol first and add in the offset.
3089      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3090      forced into memory, as it usually produces better code.  */
3091   split_const (src, &base, &offset);
3092   if (offset != const0_rtx
3093       && (targetm.cannot_force_const_mem (src)
3094           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3095     {
3096       base = mips_force_temporary (dest, base);
3097       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3098       return;
3099     }
3100
3101   src = force_const_mem (mode, src);
3102
3103   /* When using explicit relocs, constant pool references are sometimes
3104      not legitimate addresses.  */
3105   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3106   mips_emit_move (dest, src);
3107 }
3108
3109 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3110    sequence that is valid.  */
3111
3112 bool
3113 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3114 {
3115   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3116     {
3117       mips_emit_move (dest, force_reg (mode, src));
3118       return true;
3119     }
3120
3121   /* We need to deal with constants that would be legitimate
3122      immediate_operands but aren't legitimate move_operands.  */
3123   if (CONSTANT_P (src) && !move_operand (src, mode))
3124     {
3125       mips_legitimize_const_move (mode, dest, src);
3126       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3127       return true;
3128     }
3129   return false;
3130 }
3131 \f
3132 /* Return true if value X in context CONTEXT is a small-data address
3133    that can be rewritten as a LO_SUM.  */
3134
3135 static bool
3136 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3137 {
3138   enum mips_symbol_type symbol_type;
3139
3140   return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3141           && !mips_split_p[SYMBOL_GP_RELATIVE]
3142           && mips_symbolic_constant_p (x, context, &symbol_type)
3143           && symbol_type == SYMBOL_GP_RELATIVE);
3144 }
3145
3146 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3147    containing MEM, or null if none.  */
3148
3149 static int
3150 mips_small_data_pattern_1 (rtx *loc, void *data)
3151 {
3152   enum mips_symbol_context context;
3153
3154   if (GET_CODE (*loc) == LO_SUM)
3155     return -1;
3156
3157   if (MEM_P (*loc))
3158     {
3159       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3160         return 1;
3161       return -1;
3162     }
3163
3164   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3165   return mips_rewrite_small_data_p (*loc, context);
3166 }
3167
3168 /* Return true if OP refers to small data symbols directly, not through
3169    a LO_SUM.  */
3170
3171 bool
3172 mips_small_data_pattern_p (rtx op)
3173 {
3174   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3175 }
3176
3177 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3178    DATA is the containing MEM, or null if none.  */
3179
3180 static int
3181 mips_rewrite_small_data_1 (rtx *loc, void *data)
3182 {
3183   enum mips_symbol_context context;
3184
3185   if (MEM_P (*loc))
3186     {
3187       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3188       return -1;
3189     }
3190
3191   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3192   if (mips_rewrite_small_data_p (*loc, context))
3193     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3194
3195   if (GET_CODE (*loc) == LO_SUM)
3196     return -1;
3197
3198   return 0;
3199 }
3200
3201 /* Rewrite instruction pattern PATTERN so that it refers to small data
3202    using explicit relocations.  */
3203
3204 rtx
3205 mips_rewrite_small_data (rtx pattern)
3206 {
3207   pattern = copy_insn (pattern);
3208   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3209   return pattern;
3210 }
3211 \f
3212 /* We need a lot of little routines to check the range of MIPS16 immediate
3213    operands.  */
3214
3215 static int
3216 m16_check_op (rtx op, int low, int high, int mask)
3217 {
3218   return (CONST_INT_P (op)
3219           && IN_RANGE (INTVAL (op), low, high)
3220           && (INTVAL (op) & mask) == 0);
3221 }
3222
3223 int
3224 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3225 {
3226   return m16_check_op (op, 0x1, 0x8, 0);
3227 }
3228
3229 int
3230 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3231 {
3232   return m16_check_op (op, -0x8, 0x7, 0);
3233 }
3234
3235 int
3236 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3237 {
3238   return m16_check_op (op, -0x7, 0x8, 0);
3239 }
3240
3241 int
3242 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3243 {
3244   return m16_check_op (op, -0x10, 0xf, 0);
3245 }
3246
3247 int
3248 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3249 {
3250   return m16_check_op (op, -0xf, 0x10, 0);
3251 }
3252
3253 int
3254 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3255 {
3256   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
3257 }
3258
3259 int
3260 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3261 {
3262   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
3263 }
3264
3265 int
3266 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3267 {
3268   return m16_check_op (op, -0x80, 0x7f, 0);
3269 }
3270
3271 int
3272 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3273 {
3274   return m16_check_op (op, -0x7f, 0x80, 0);
3275 }
3276
3277 int
3278 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3279 {
3280   return m16_check_op (op, 0x0, 0xff, 0);
3281 }
3282
3283 int
3284 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3285 {
3286   return m16_check_op (op, -0xff, 0x0, 0);
3287 }
3288
3289 int
3290 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3291 {
3292   return m16_check_op (op, -0x1, 0xfe, 0);
3293 }
3294
3295 int
3296 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3297 {
3298   return m16_check_op (op, 0x0, 0xff << 2, 3);
3299 }
3300
3301 int
3302 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3303 {
3304   return m16_check_op (op, -0xff << 2, 0x0, 3);
3305 }
3306
3307 int
3308 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3309 {
3310   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
3311 }
3312
3313 int
3314 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3315 {
3316   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
3317 }
3318 \f
3319 /* The cost of loading values from the constant pool.  It should be
3320    larger than the cost of any constant we want to synthesize inline.  */
3321 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3322
3323 /* Return the cost of X when used as an operand to the MIPS16 instruction
3324    that implements CODE.  Return -1 if there is no such instruction, or if
3325    X is not a valid immediate operand for it.  */
3326
3327 static int
3328 mips16_constant_cost (int code, HOST_WIDE_INT x)
3329 {
3330   switch (code)
3331     {
3332     case ASHIFT:
3333     case ASHIFTRT:
3334     case LSHIFTRT:
3335       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3336          other shifts are extended.  The shift patterns truncate the shift
3337          count to the right size, so there are no out-of-range values.  */
3338       if (IN_RANGE (x, 1, 8))
3339         return 0;
3340       return COSTS_N_INSNS (1);
3341
3342     case PLUS:
3343       if (IN_RANGE (x, -128, 127))
3344         return 0;
3345       if (SMALL_OPERAND (x))
3346         return COSTS_N_INSNS (1);
3347       return -1;
3348
3349     case LEU:
3350       /* Like LE, but reject the always-true case.  */
3351       if (x == -1)
3352         return -1;
3353     case LE:
3354       /* We add 1 to the immediate and use SLT.  */
3355       x += 1;
3356     case XOR:
3357       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3358     case LT:
3359     case LTU:
3360       if (IN_RANGE (x, 0, 255))
3361         return 0;
3362       if (SMALL_OPERAND_UNSIGNED (x))
3363         return COSTS_N_INSNS (1);
3364       return -1;
3365
3366     case EQ:
3367     case NE:
3368       /* Equality comparisons with 0 are cheap.  */
3369       if (x == 0)
3370         return 0;
3371       return -1;
3372
3373     default:
3374       return -1;
3375     }
3376 }
3377
3378 /* Return true if there is a non-MIPS16 instruction that implements CODE
3379    and if that instruction accepts X as an immediate operand.  */
3380
3381 static int
3382 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3383 {
3384   switch (code)
3385     {
3386     case ASHIFT:
3387     case ASHIFTRT:
3388     case LSHIFTRT:
3389       /* All shift counts are truncated to a valid constant.  */
3390       return true;
3391
3392     case ROTATE:
3393     case ROTATERT:
3394       /* Likewise rotates, if the target supports rotates at all.  */
3395       return ISA_HAS_ROR;
3396
3397     case AND:
3398     case IOR:
3399     case XOR:
3400       /* These instructions take 16-bit unsigned immediates.  */
3401       return SMALL_OPERAND_UNSIGNED (x);
3402
3403     case PLUS:
3404     case LT:
3405     case LTU:
3406       /* These instructions take 16-bit signed immediates.  */
3407       return SMALL_OPERAND (x);
3408
3409     case EQ:
3410     case NE:
3411     case GT:
3412     case GTU:
3413       /* The "immediate" forms of these instructions are really
3414          implemented as comparisons with register 0.  */
3415       return x == 0;
3416
3417     case GE:
3418     case GEU:
3419       /* Likewise, meaning that the only valid immediate operand is 1.  */
3420       return x == 1;
3421
3422     case LE:
3423       /* We add 1 to the immediate and use SLT.  */
3424       return SMALL_OPERAND (x + 1);
3425
3426     case LEU:
3427       /* Likewise SLTU, but reject the always-true case.  */
3428       return SMALL_OPERAND (x + 1) && x + 1 != 0;
3429
3430     case SIGN_EXTRACT:
3431     case ZERO_EXTRACT:
3432       /* The bit position and size are immediate operands.  */
3433       return ISA_HAS_EXT_INS;
3434
3435     default:
3436       /* By default assume that $0 can be used for 0.  */
3437       return x == 0;
3438     }
3439 }
3440
3441 /* Return the cost of binary operation X, given that the instruction
3442    sequence for a word-sized or smaller operation has cost SINGLE_COST
3443    and that the sequence of a double-word operation has cost DOUBLE_COST.
3444    If SPEED is true, optimize for speed otherwise optimize for size.  */
3445
3446 static int
3447 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3448 {
3449   int cost;
3450
3451   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3452     cost = double_cost;
3453   else
3454     cost = single_cost;
3455   return (cost
3456           + rtx_cost (XEXP (x, 0), SET, speed)
3457           + rtx_cost (XEXP (x, 1), GET_CODE (x), speed));
3458 }
3459
3460 /* Return the cost of floating-point multiplications of mode MODE.  */
3461
3462 static int
3463 mips_fp_mult_cost (enum machine_mode mode)
3464 {
3465   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3466 }
3467
3468 /* Return the cost of floating-point divisions of mode MODE.  */
3469
3470 static int
3471 mips_fp_div_cost (enum machine_mode mode)
3472 {
3473   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3474 }
3475
3476 /* Return the cost of sign-extending OP to mode MODE, not including the
3477    cost of OP itself.  */
3478
3479 static int
3480 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3481 {
3482   if (MEM_P (op))
3483     /* Extended loads are as cheap as unextended ones.  */
3484     return 0;
3485
3486   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3487     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3488     return 0;
3489
3490   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3491     /* We can use SEB or SEH.  */
3492     return COSTS_N_INSNS (1);
3493
3494   /* We need to use a shift left and a shift right.  */
3495   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3496 }
3497
3498 /* Return the cost of zero-extending OP to mode MODE, not including the
3499    cost of OP itself.  */
3500
3501 static int
3502 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3503 {
3504   if (MEM_P (op))
3505     /* Extended loads are as cheap as unextended ones.  */
3506     return 0;
3507
3508   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3509     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3510     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3511
3512   if (GENERATE_MIPS16E)
3513     /* We can use ZEB or ZEH.  */
3514     return COSTS_N_INSNS (1);
3515
3516   if (TARGET_MIPS16)
3517     /* We need to load 0xff or 0xffff into a register and use AND.  */
3518     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3519
3520   /* We can use ANDI.  */
3521   return COSTS_N_INSNS (1);
3522 }
3523
3524 /* Implement TARGET_RTX_COSTS.  */
3525
3526 static bool
3527 mips_rtx_costs (rtx x, int code, int outer_code, int *total, bool speed)
3528 {
3529   enum machine_mode mode = GET_MODE (x);
3530   bool float_mode_p = FLOAT_MODE_P (mode);
3531   int cost;
3532   rtx addr;
3533
3534   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3535      appear in the instruction stream, and the cost of a comparison is
3536      really the cost of the branch or scc condition.  At the time of
3537      writing, GCC only uses an explicit outer COMPARE code when optabs
3538      is testing whether a constant is expensive enough to force into a
3539      register.  We want optabs to pass such constants through the MIPS
3540      expanders instead, so make all constants very cheap here.  */
3541   if (outer_code == COMPARE)
3542     {
3543       gcc_assert (CONSTANT_P (x));
3544       *total = 0;
3545       return true;
3546     }
3547
3548   switch (code)
3549     {
3550     case CONST_INT:
3551       /* Treat *clear_upper32-style ANDs as having zero cost in the
3552          second operand.  The cost is entirely in the first operand.
3553
3554          ??? This is needed because we would otherwise try to CSE
3555          the constant operand.  Although that's the right thing for
3556          instructions that continue to be a register operation throughout
3557          compilation, it is disastrous for instructions that could
3558          later be converted into a memory operation.  */
3559       if (TARGET_64BIT
3560           && outer_code == AND
3561           && UINTVAL (x) == 0xffffffff)
3562         {
3563           *total = 0;
3564           return true;
3565         }
3566
3567       if (TARGET_MIPS16)
3568         {
3569           cost = mips16_constant_cost (outer_code, INTVAL (x));
3570           if (cost >= 0)
3571             {
3572               *total = cost;
3573               return true;
3574             }
3575         }
3576       else
3577         {
3578           /* When not optimizing for size, we care more about the cost
3579              of hot code, and hot code is often in a loop.  If a constant
3580              operand needs to be forced into a register, we will often be
3581              able to hoist the constant load out of the loop, so the load
3582              should not contribute to the cost.  */
3583           if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3584             {
3585               *total = 0;
3586               return true;
3587             }
3588         }
3589       /* Fall through.  */
3590
3591     case CONST:
3592     case SYMBOL_REF:
3593     case LABEL_REF:
3594     case CONST_DOUBLE:
3595       if (force_to_mem_operand (x, VOIDmode))
3596         {
3597           *total = COSTS_N_INSNS (1);
3598           return true;
3599         }
3600       cost = mips_const_insns (x);
3601       if (cost > 0)
3602         {
3603           /* If the constant is likely to be stored in a GPR, SETs of
3604              single-insn constants are as cheap as register sets; we
3605              never want to CSE them.
3606
3607              Don't reduce the cost of storing a floating-point zero in
3608              FPRs.  If we have a zero in an FPR for other reasons, we
3609              can get better cfg-cleanup and delayed-branch results by
3610              using it consistently, rather than using $0 sometimes and
3611              an FPR at other times.  Also, moves between floating-point
3612              registers are sometimes cheaper than (D)MTC1 $0.  */
3613           if (cost == 1
3614               && outer_code == SET
3615               && !(float_mode_p && TARGET_HARD_FLOAT))
3616             cost = 0;
3617           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3618              want to CSE the constant itself.  It is usually better to
3619              have N copies of the last operation in the sequence and one
3620              shared copy of the other operations.  (Note that this is
3621              not true for MIPS16 code, where the final operation in the
3622              sequence is often an extended instruction.)
3623
3624              Also, if we have a CONST_INT, we don't know whether it is
3625              for a word or doubleword operation, so we cannot rely on
3626              the result of mips_build_integer.  */
3627           else if (!TARGET_MIPS16
3628                    && (outer_code == SET || mode == VOIDmode))
3629             cost = 1;
3630           *total = COSTS_N_INSNS (cost);
3631           return true;
3632         }
3633       /* The value will need to be fetched from the constant pool.  */
3634       *total = CONSTANT_POOL_COST;
3635       return true;
3636
3637     case MEM:
3638       /* If the address is legitimate, return the number of
3639          instructions it needs.  */
3640       addr = XEXP (x, 0);
3641       cost = mips_address_insns (addr, mode, true);
3642       if (cost > 0)
3643         {
3644           *total = COSTS_N_INSNS (cost + 1);
3645           return true;
3646         }
3647       /* Check for a scaled indexed address.  */
3648       if (mips_lwxs_address_p (addr))
3649         {
3650           *total = COSTS_N_INSNS (2);
3651           return true;
3652         }
3653       /* Otherwise use the default handling.  */
3654       return false;
3655
3656     case FFS:
3657       *total = COSTS_N_INSNS (6);
3658       return false;
3659
3660     case NOT:
3661       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3662       return false;
3663
3664     case AND:
3665       /* Check for a *clear_upper32 pattern and treat it like a zero
3666          extension.  See the pattern's comment for details.  */
3667       if (TARGET_64BIT
3668           && mode == DImode
3669           && CONST_INT_P (XEXP (x, 1))
3670           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3671         {
3672           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3673                     + rtx_cost (XEXP (x, 0), SET, speed));
3674           return true;
3675         }
3676       /* Fall through.  */
3677
3678     case IOR:
3679     case XOR:
3680       /* Double-word operations use two single-word operations.  */
3681       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3682                                  speed);
3683       return true;
3684
3685     case ASHIFT:
3686     case ASHIFTRT:
3687     case LSHIFTRT:
3688     case ROTATE:
3689     case ROTATERT:
3690       if (CONSTANT_P (XEXP (x, 1)))
3691         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3692                                    speed);
3693       else
3694         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3695                                    speed);
3696       return true;
3697
3698     case ABS:
3699       if (float_mode_p)
3700         *total = mips_cost->fp_add;
3701       else
3702         *total = COSTS_N_INSNS (4);
3703       return false;
3704
3705     case LO_SUM:
3706       /* Low-part immediates need an extended MIPS16 instruction.  */
3707       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3708                 + rtx_cost (XEXP (x, 0), SET, speed));
3709       return true;
3710
3711     case LT:
3712     case LTU:
3713     case LE:
3714     case LEU:
3715     case GT:
3716     case GTU:
3717     case GE:
3718     case GEU:
3719     case EQ:
3720     case NE:
3721     case UNORDERED:
3722     case LTGT:
3723       /* Branch comparisons have VOIDmode, so use the first operand's
3724          mode instead.  */
3725       mode = GET_MODE (XEXP (x, 0));
3726       if (FLOAT_MODE_P (mode))
3727         {
3728           *total = mips_cost->fp_add;
3729           return false;
3730         }
3731       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3732                                  speed);
3733       return true;
3734
3735     case MINUS:
3736       if (float_mode_p
3737           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3738           && TARGET_FUSED_MADD
3739           && !HONOR_NANS (mode)
3740           && !HONOR_SIGNED_ZEROS (mode))
3741         {
3742           /* See if we can use NMADD or NMSUB.  See mips.md for the
3743              associated patterns.  */
3744           rtx op0 = XEXP (x, 0);
3745           rtx op1 = XEXP (x, 1);
3746           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3747             {
3748               *total = (mips_fp_mult_cost (mode)
3749                         + rtx_cost (XEXP (XEXP (op0, 0), 0), SET, speed)
3750                         + rtx_cost (XEXP (op0, 1), SET, speed)
3751                         + rtx_cost (op1, SET, speed));
3752               return true;
3753             }
3754           if (GET_CODE (op1) == MULT)
3755             {
3756               *total = (mips_fp_mult_cost (mode)
3757                         + rtx_cost (op0, SET, speed)
3758                         + rtx_cost (XEXP (op1, 0), SET, speed)
3759                         + rtx_cost (XEXP (op1, 1), SET, speed));
3760               return true;
3761             }
3762         }
3763       /* Fall through.  */
3764
3765     case PLUS:
3766       if (float_mode_p)
3767         {
3768           /* If this is part of a MADD or MSUB, treat the PLUS as
3769              being free.  */
3770           if (ISA_HAS_FP4
3771               && TARGET_FUSED_MADD
3772               && GET_CODE (XEXP (x, 0)) == MULT)
3773             *total = 0;
3774           else
3775             *total = mips_cost->fp_add;
3776           return false;
3777         }
3778
3779       /* Double-word operations require three single-word operations and
3780          an SLTU.  The MIPS16 version then needs to move the result of
3781          the SLTU from $24 to a MIPS16 register.  */
3782       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3783                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
3784                                  speed);
3785       return true;
3786
3787     case NEG:
3788       if (float_mode_p
3789           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3790           && TARGET_FUSED_MADD
3791           && !HONOR_NANS (mode)
3792           && HONOR_SIGNED_ZEROS (mode))
3793         {
3794           /* See if we can use NMADD or NMSUB.  See mips.md for the
3795              associated patterns.  */
3796           rtx op = XEXP (x, 0);
3797           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3798               && GET_CODE (XEXP (op, 0)) == MULT)
3799             {
3800               *total = (mips_fp_mult_cost (mode)
3801                         + rtx_cost (XEXP (XEXP (op, 0), 0), SET, speed)
3802                         + rtx_cost (XEXP (XEXP (op, 0), 1), SET, speed)
3803                         + rtx_cost (XEXP (op, 1), SET, speed));
3804               return true;
3805             }
3806         }
3807
3808       if (float_mode_p)
3809         *total = mips_cost->fp_add;
3810       else
3811         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3812       return false;
3813
3814     case MULT:
3815       if (float_mode_p)
3816         *total = mips_fp_mult_cost (mode);
3817       else if (mode == DImode && !TARGET_64BIT)
3818         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3819            where the mulsidi3 always includes an MFHI and an MFLO.  */
3820         *total = (speed
3821                   ? mips_cost->int_mult_si * 3 + 6
3822                   : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
3823       else if (!speed)
3824         *total = (ISA_HAS_MUL3 ? 1 : 2);
3825       else if (mode == DImode)
3826         *total = mips_cost->int_mult_di;
3827       else
3828         *total = mips_cost->int_mult_si;
3829       return false;
3830
3831     case DIV:
3832       /* Check for a reciprocal.  */
3833       if (float_mode_p
3834           && ISA_HAS_FP4
3835           && flag_unsafe_math_optimizations
3836           && XEXP (x, 0) == CONST1_RTX (mode))
3837         {
3838           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3839             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3840                division as being free.  */
3841             *total = rtx_cost (XEXP (x, 1), SET, speed);
3842           else
3843             *total = (mips_fp_div_cost (mode)
3844                       + rtx_cost (XEXP (x, 1), SET, speed));
3845           return true;
3846         }
3847       /* Fall through.  */
3848
3849     case SQRT:
3850     case MOD:
3851       if (float_mode_p)
3852         {
3853           *total = mips_fp_div_cost (mode);
3854           return false;
3855         }
3856       /* Fall through.  */
3857
3858     case UDIV:
3859     case UMOD:
3860       if (!speed)
3861         {
3862           /* It is our responsibility to make division by a power of 2
3863              as cheap as 2 register additions if we want the division
3864              expanders to be used for such operations; see the setting
3865              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3866              should always produce shorter code than using
3867              expand_sdiv2_pow2.  */
3868           if (TARGET_MIPS16
3869               && CONST_INT_P (XEXP (x, 1))
3870               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3871             {
3872               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), SET, speed);
3873               return true;
3874             }
3875           *total = COSTS_N_INSNS (mips_idiv_insns ());
3876         }
3877       else if (mode == DImode)
3878         *total = mips_cost->int_div_di;
3879       else
3880         *total = mips_cost->int_div_si;
3881       return false;
3882
3883     case SIGN_EXTEND:
3884       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3885       return false;
3886
3887     case ZERO_EXTEND:
3888       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3889       return false;
3890
3891     case FLOAT:
3892     case UNSIGNED_FLOAT:
3893     case FIX:
3894     case FLOAT_EXTEND:
3895     case FLOAT_TRUNCATE:
3896       *total = mips_cost->fp_add;
3897       return false;
3898
3899     default:
3900       return false;
3901     }
3902 }
3903
3904 /* Implement TARGET_ADDRESS_COST.  */
3905
3906 static int
3907 mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
3908 {
3909   return mips_address_insns (addr, SImode, false);
3910 }
3911 \f
3912 /* Information about a single instruction in a multi-instruction
3913    asm sequence.  */
3914 struct mips_multi_member {
3915   /* True if this is a label, false if it is code.  */
3916   bool is_label_p;
3917
3918   /* The output_asm_insn format of the instruction.  */
3919   const char *format;
3920
3921   /* The operands to the instruction.  */
3922   rtx operands[MAX_RECOG_OPERANDS];
3923 };
3924 typedef struct mips_multi_member mips_multi_member;
3925
3926 /* Vector definitions for the above.  */
3927 DEF_VEC_O(mips_multi_member);
3928 DEF_VEC_ALLOC_O(mips_multi_member, heap);
3929
3930 /* The instructions that make up the current multi-insn sequence.  */
3931 static VEC (mips_multi_member, heap) *mips_multi_members;
3932
3933 /* How many instructions (as opposed to labels) are in the current
3934    multi-insn sequence.  */
3935 static unsigned int mips_multi_num_insns;
3936
3937 /* Start a new multi-insn sequence.  */
3938
3939 static void
3940 mips_multi_start (void)
3941 {
3942   VEC_truncate (mips_multi_member, mips_multi_members, 0);
3943   mips_multi_num_insns = 0;
3944 }
3945
3946 /* Add a new, uninitialized member to the current multi-insn sequence.  */
3947
3948 static struct mips_multi_member *
3949 mips_multi_add (void)
3950 {
3951   return VEC_safe_push (mips_multi_member, heap, mips_multi_members, 0);
3952 }
3953
3954 /* Add a normal insn with the given asm format to the current multi-insn
3955    sequence.  The other arguments are a null-terminated list of operands.  */
3956
3957 static void
3958 mips_multi_add_insn (const char *format, ...)
3959 {
3960   struct mips_multi_member *member;
3961   va_list ap;
3962   unsigned int i;
3963   rtx op;
3964
3965   member = mips_multi_add ();
3966   member->is_label_p = false;
3967   member->format = format;
3968   va_start (ap, format);
3969   i = 0;
3970   while ((op = va_arg (ap, rtx)))
3971     member->operands[i++] = op;
3972   va_end (ap);
3973   mips_multi_num_insns++;
3974 }
3975
3976 /* Add the given label definition to the current multi-insn sequence.
3977    The definition should include the colon.  */
3978
3979 static void
3980 mips_multi_add_label (const char *label)
3981 {
3982   struct mips_multi_member *member;
3983
3984   member = mips_multi_add ();
3985   member->is_label_p = true;
3986   member->format = label;
3987 }
3988
3989 /* Return the index of the last member of the current multi-insn sequence.  */
3990
3991 static unsigned int
3992 mips_multi_last_index (void)
3993 {
3994   return VEC_length (mips_multi_member, mips_multi_members) - 1;
3995 }
3996
3997 /* Add a copy of an existing instruction to the current multi-insn
3998    sequence.  I is the index of the instruction that should be copied.  */
3999
4000 static void
4001 mips_multi_copy_insn (unsigned int i)
4002 {
4003   struct mips_multi_member *member;
4004
4005   member = mips_multi_add ();
4006   memcpy (member, VEC_index (mips_multi_member, mips_multi_members, i),
4007           sizeof (*member));
4008   gcc_assert (!member->is_label_p);
4009 }
4010
4011 /* Change the operand of an existing instruction in the current
4012    multi-insn sequence.  I is the index of the instruction,
4013    OP is the index of the operand, and X is the new value.  */
4014
4015 static void
4016 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
4017 {
4018   VEC_index (mips_multi_member, mips_multi_members, i)->operands[op] = x;
4019 }
4020
4021 /* Write out the asm code for the current multi-insn sequence.  */
4022
4023 static void
4024 mips_multi_write (void)
4025 {
4026   struct mips_multi_member *member;
4027   unsigned int i;
4028
4029   FOR_EACH_VEC_ELT (mips_multi_member, mips_multi_members, i, member)
4030     if (member->is_label_p)
4031       fprintf (asm_out_file, "%s\n", member->format);
4032     else
4033       output_asm_insn (member->format, member->operands);
4034 }
4035 \f
4036 /* Return one word of double-word value OP, taking into account the fixed
4037    endianness of certain registers.  HIGH_P is true to select the high part,
4038    false to select the low part.  */
4039
4040 rtx
4041 mips_subword (rtx op, bool high_p)
4042 {
4043   unsigned int byte, offset;
4044   enum machine_mode mode;
4045
4046   mode = GET_MODE (op);
4047   if (mode == VOIDmode)
4048     mode = TARGET_64BIT ? TImode : DImode;
4049
4050   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4051     byte = UNITS_PER_WORD;
4052   else
4053     byte = 0;
4054
4055   if (FP_REG_RTX_P (op))
4056     {
4057       /* Paired FPRs are always ordered little-endian.  */
4058       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4059       return gen_rtx_REG (word_mode, REGNO (op) + offset);
4060     }
4061
4062   if (MEM_P (op))
4063     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4064
4065   return simplify_gen_subreg (word_mode, op, mode, byte);
4066 }
4067
4068 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
4069
4070 bool
4071 mips_split_64bit_move_p (rtx dest, rtx src)
4072 {
4073   if (TARGET_64BIT)
4074     return false;
4075
4076   /* FPR-to-FPR moves can be done in a single instruction, if they're
4077      allowed at all.  */
4078   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4079     return false;
4080
4081   /* Check for floating-point loads and stores.  */
4082   if (ISA_HAS_LDC1_SDC1)
4083     {
4084       if (FP_REG_RTX_P (dest) && MEM_P (src))
4085         return false;
4086       if (FP_REG_RTX_P (src) && MEM_P (dest))
4087         return false;
4088     }
4089   return true;
4090 }
4091
4092 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
4093    this function handles 64-bit moves for which mips_split_64bit_move_p
4094    holds.  For 64-bit targets, this function handles 128-bit moves.  */
4095
4096 void
4097 mips_split_doubleword_move (rtx dest, rtx src)
4098 {
4099   rtx low_dest;
4100
4101   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4102     {
4103       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4104         emit_insn (gen_move_doubleword_fprdi (dest, src));
4105       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4106         emit_insn (gen_move_doubleword_fprdf (dest, src));
4107       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4108         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4109       else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4110         emit_insn (gen_move_doubleword_fprv2si (dest, src));
4111       else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4112         emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4113       else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4114         emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4115       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4116         emit_insn (gen_move_doubleword_fprtf (dest, src));
4117       else
4118         gcc_unreachable ();
4119     }
4120   else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4121     {
4122       low_dest = mips_subword (dest, false);
4123       mips_emit_move (low_dest, mips_subword (src, false));
4124       if (TARGET_64BIT)
4125         emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4126       else
4127         emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4128     }
4129   else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4130     {
4131       mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4132       if (TARGET_64BIT)
4133         emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4134       else
4135         emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4136     }
4137   else
4138     {
4139       /* The operation can be split into two normal moves.  Decide in
4140          which order to do them.  */
4141       low_dest = mips_subword (dest, false);
4142       if (REG_P (low_dest)
4143           && reg_overlap_mentioned_p (low_dest, src))
4144         {
4145           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4146           mips_emit_move (low_dest, mips_subword (src, false));
4147         }
4148       else
4149         {
4150           mips_emit_move (low_dest, mips_subword (src, false));
4151           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4152         }
4153     }
4154 }
4155 \f
4156 /* Return the appropriate instructions to move SRC into DEST.  Assume
4157    that SRC is operand 1 and DEST is operand 0.  */
4158
4159 const char *
4160 mips_output_move (rtx dest, rtx src)
4161 {
4162   enum rtx_code dest_code, src_code;
4163   enum machine_mode mode;
4164   enum mips_symbol_type symbol_type;
4165   bool dbl_p;
4166
4167   dest_code = GET_CODE (dest);
4168   src_code = GET_CODE (src);
4169   mode = GET_MODE (dest);
4170   dbl_p = (GET_MODE_SIZE (mode) == 8);
4171
4172   if (dbl_p && mips_split_64bit_move_p (dest, src))
4173     return "#";
4174
4175   if ((src_code == REG && GP_REG_P (REGNO (src)))
4176       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4177     {
4178       if (dest_code == REG)
4179         {
4180           if (GP_REG_P (REGNO (dest)))
4181             return "move\t%0,%z1";
4182
4183           /* Moves to HI are handled by special .md insns.  */
4184           if (REGNO (dest) == LO_REGNUM)
4185             return "mtlo\t%z1";
4186
4187           if (DSP_ACC_REG_P (REGNO (dest)))
4188             {
4189               static char retval[] = "mt__\t%z1,%q0";
4190
4191               retval[2] = reg_names[REGNO (dest)][4];
4192               retval[3] = reg_names[REGNO (dest)][5];
4193               return retval;
4194             }
4195
4196           if (FP_REG_P (REGNO (dest)))
4197             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4198
4199           if (ALL_COP_REG_P (REGNO (dest)))
4200             {
4201               static char retval[] = "dmtc_\t%z1,%0";
4202
4203               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4204               return dbl_p ? retval : retval + 1;
4205             }
4206         }
4207       if (dest_code == MEM)
4208         switch (GET_MODE_SIZE (mode))
4209           {
4210           case 1: return "sb\t%z1,%0";
4211           case 2: return "sh\t%z1,%0";
4212           case 4: return "sw\t%z1,%0";
4213           case 8: return "sd\t%z1,%0";
4214           }
4215     }
4216   if (dest_code == REG && GP_REG_P (REGNO (dest)))
4217     {
4218       if (src_code == REG)
4219         {
4220           /* Moves from HI are handled by special .md insns.  */
4221           if (REGNO (src) == LO_REGNUM)
4222             {
4223               /* When generating VR4120 or VR4130 code, we use MACC and
4224                  DMACC instead of MFLO.  This avoids both the normal
4225                  MIPS III HI/LO hazards and the errata related to
4226                  -mfix-vr4130.  */
4227               if (ISA_HAS_MACCHI)
4228                 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4229               return "mflo\t%0";
4230             }
4231
4232           if (DSP_ACC_REG_P (REGNO (src)))
4233             {
4234               static char retval[] = "mf__\t%0,%q1";
4235
4236               retval[2] = reg_names[REGNO (src)][4];
4237               retval[3] = reg_names[REGNO (src)][5];
4238               return retval;
4239             }
4240
4241           if (FP_REG_P (REGNO (src)))
4242             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4243
4244           if (ALL_COP_REG_P (REGNO (src)))
4245             {
4246               static char retval[] = "dmfc_\t%0,%1";
4247
4248               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4249               return dbl_p ? retval : retval + 1;
4250             }
4251
4252           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
4253             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
4254         }
4255
4256       if (src_code == MEM)
4257         switch (GET_MODE_SIZE (mode))
4258           {
4259           case 1: return "lbu\t%0,%1";
4260           case 2: return "lhu\t%0,%1";
4261           case 4: return "lw\t%0,%1";
4262           case 8: return "ld\t%0,%1";
4263           }
4264
4265       if (src_code == CONST_INT)
4266         {
4267           /* Don't use the X format for the operand itself, because that
4268              will give out-of-range numbers for 64-bit hosts and 32-bit
4269              targets.  */
4270           if (!TARGET_MIPS16)
4271             return "li\t%0,%1\t\t\t# %X1";
4272
4273           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4274             return "li\t%0,%1";
4275
4276           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4277             return "#";
4278         }
4279
4280       if (src_code == HIGH)
4281         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4282
4283       if (CONST_GP_P (src))
4284         return "move\t%0,%1";
4285
4286       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4287           && mips_lo_relocs[symbol_type] != 0)
4288         {
4289           /* A signed 16-bit constant formed by applying a relocation
4290              operator to a symbolic address.  */
4291           gcc_assert (!mips_split_p[symbol_type]);
4292           return "li\t%0,%R1";
4293         }
4294
4295       if (symbolic_operand (src, VOIDmode))
4296         {
4297           gcc_assert (TARGET_MIPS16
4298                       ? TARGET_MIPS16_TEXT_LOADS
4299                       : !TARGET_EXPLICIT_RELOCS);
4300           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4301         }
4302     }
4303   if (src_code == REG && FP_REG_P (REGNO (src)))
4304     {
4305       if (dest_code == REG && FP_REG_P (REGNO (dest)))
4306         {
4307           if (GET_MODE (dest) == V2SFmode)
4308             return "mov.ps\t%0,%1";
4309           else
4310             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4311         }
4312
4313       if (dest_code == MEM)
4314         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4315     }
4316   if (dest_code == REG && FP_REG_P (REGNO (dest)))
4317     {
4318       if (src_code == MEM)
4319         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4320     }
4321   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4322     {
4323       static char retval[] = "l_c_\t%0,%1";
4324
4325       retval[1] = (dbl_p ? 'd' : 'w');
4326       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4327       return retval;
4328     }
4329   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4330     {
4331       static char retval[] = "s_c_\t%1,%0";
4332
4333       retval[1] = (dbl_p ? 'd' : 'w');
4334       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4335       return retval;
4336     }
4337   gcc_unreachable ();
4338 }
4339 \f
4340 /* Return true if CMP1 is a suitable second operand for integer ordering
4341    test CODE.  See also the *sCC patterns in mips.md.  */
4342
4343 static bool
4344 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4345 {
4346   switch (code)
4347     {
4348     case GT:
4349     case GTU:
4350       return reg_or_0_operand (cmp1, VOIDmode);
4351
4352     case GE:
4353     case GEU:
4354       return !TARGET_MIPS16 && cmp1 == const1_rtx;
4355
4356     case LT:
4357     case LTU:
4358       return arith_operand (cmp1, VOIDmode);
4359
4360     case LE:
4361       return sle_operand (cmp1, VOIDmode);
4362
4363     case LEU:
4364       return sleu_operand (cmp1, VOIDmode);
4365
4366     default:
4367       gcc_unreachable ();
4368     }
4369 }
4370
4371 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4372    integer ordering test *CODE, or if an equivalent combination can
4373    be formed by adjusting *CODE and *CMP1.  When returning true, update
4374    *CODE and *CMP1 with the chosen code and operand, otherwise leave
4375    them alone.  */
4376
4377 static bool
4378 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4379                                   enum machine_mode mode)
4380 {
4381   HOST_WIDE_INT plus_one;
4382
4383   if (mips_int_order_operand_ok_p (*code, *cmp1))
4384     return true;
4385
4386   if (CONST_INT_P (*cmp1))
4387     switch (*code)
4388       {
4389       case LE:
4390         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4391         if (INTVAL (*cmp1) < plus_one)
4392           {
4393             *code = LT;
4394             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4395             return true;
4396           }
4397         break;
4398
4399       case LEU:
4400         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4401         if (plus_one != 0)
4402           {
4403             *code = LTU;
4404             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4405             return true;
4406           }
4407         break;
4408
4409       default:
4410         break;
4411       }
4412   return false;
4413 }
4414
4415 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4416    in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4417    is nonnull, it's OK to set TARGET to the inverse of the result and
4418    flip *INVERT_PTR instead.  */
4419
4420 static void
4421 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4422                           rtx target, rtx cmp0, rtx cmp1)
4423 {
4424   enum machine_mode mode;
4425
4426   /* First see if there is a MIPS instruction that can do this operation.
4427      If not, try doing the same for the inverse operation.  If that also
4428      fails, force CMP1 into a register and try again.  */
4429   mode = GET_MODE (cmp0);
4430   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4431     mips_emit_binary (code, target, cmp0, cmp1);
4432   else
4433     {
4434       enum rtx_code inv_code = reverse_condition (code);
4435       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4436         {
4437           cmp1 = force_reg (mode, cmp1);
4438           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4439         }
4440       else if (invert_ptr == 0)
4441         {
4442           rtx inv_target;
4443
4444           inv_target = mips_force_binary (GET_MODE (target),
4445                                           inv_code, cmp0, cmp1);
4446           mips_emit_binary (XOR, target, inv_target, const1_rtx);
4447         }
4448       else
4449         {
4450           *invert_ptr = !*invert_ptr;
4451           mips_emit_binary (inv_code, target, cmp0, cmp1);
4452         }
4453     }
4454 }
4455
4456 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4457    The register will have the same mode as CMP0.  */
4458
4459 static rtx
4460 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4461 {
4462   if (cmp1 == const0_rtx)
4463     return cmp0;
4464
4465   if (uns_arith_operand (cmp1, VOIDmode))
4466     return expand_binop (GET_MODE (cmp0), xor_optab,
4467                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4468
4469   return expand_binop (GET_MODE (cmp0), sub_optab,
4470                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4471 }
4472
4473 /* Convert *CODE into a code that can be used in a floating-point
4474    scc instruction (C.cond.fmt).  Return true if the values of
4475    the condition code registers will be inverted, with 0 indicating
4476    that the condition holds.  */
4477
4478 static bool
4479 mips_reversed_fp_cond (enum rtx_code *code)
4480 {
4481   switch (*code)
4482     {
4483     case NE:
4484     case LTGT:
4485     case ORDERED:
4486       *code = reverse_condition_maybe_unordered (*code);
4487       return true;
4488
4489     default:
4490       return false;
4491     }
4492 }
4493
4494 /* Convert a comparison into something that can be used in a branch or
4495    conditional move.  On entry, *OP0 and *OP1 are the values being
4496    compared and *CODE is the code used to compare them.
4497
4498    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4499    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4500    otherwise any standard branch condition can be used.  The standard branch
4501    conditions are:
4502
4503       - EQ or NE between two registers.
4504       - any comparison between a register and zero.  */
4505
4506 static void
4507 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4508 {
4509   rtx cmp_op0 = *op0;
4510   rtx cmp_op1 = *op1;
4511
4512   if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4513     {
4514       if (!need_eq_ne_p && *op1 == const0_rtx)
4515         ;
4516       else if (*code == EQ || *code == NE)
4517         {
4518           if (need_eq_ne_p)
4519             {
4520               *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4521               *op1 = const0_rtx;
4522             }
4523           else
4524             *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4525         }
4526       else
4527         {
4528           /* The comparison needs a separate scc instruction.  Store the
4529              result of the scc in *OP0 and compare it against zero.  */
4530           bool invert = false;
4531           *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4532           mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4533           *code = (invert ? EQ : NE);
4534           *op1 = const0_rtx;
4535         }
4536     }
4537   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4538     {
4539       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4540       mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4541       *code = NE;
4542       *op1 = const0_rtx;
4543     }
4544   else
4545     {
4546       enum rtx_code cmp_code;
4547
4548       /* Floating-point tests use a separate C.cond.fmt comparison to
4549          set a condition code register.  The branch or conditional move
4550          will then compare that register against zero.
4551
4552          Set CMP_CODE to the code of the comparison instruction and
4553          *CODE to the code that the branch or move should use.  */
4554       cmp_code = *code;
4555       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4556       *op0 = (ISA_HAS_8CC
4557               ? gen_reg_rtx (CCmode)
4558               : gen_rtx_REG (CCmode, FPSW_REGNUM));
4559       *op1 = const0_rtx;
4560       mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4561     }
4562 }
4563 \f
4564 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4565    and OPERAND[3].  Store the result in OPERANDS[0].
4566
4567    On 64-bit targets, the mode of the comparison and target will always be
4568    SImode, thus possibly narrower than that of the comparison's operands.  */
4569
4570 void
4571 mips_expand_scc (rtx operands[])
4572 {
4573   rtx target = operands[0];
4574   enum rtx_code code = GET_CODE (operands[1]);
4575   rtx op0 = operands[2];
4576   rtx op1 = operands[3];
4577
4578   gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4579
4580   if (code == EQ || code == NE)
4581     {
4582       if (ISA_HAS_SEQ_SNE
4583           && reg_imm10_operand (op1, GET_MODE (op1)))
4584         mips_emit_binary (code, target, op0, op1);
4585       else
4586         {
4587           rtx zie = mips_zero_if_equal (op0, op1);
4588           mips_emit_binary (code, target, zie, const0_rtx);
4589         }
4590     }
4591   else
4592     mips_emit_int_order_test (code, 0, target, op0, op1);
4593 }
4594
4595 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4596    CODE and jump to OPERANDS[3] if the condition holds.  */
4597
4598 void
4599 mips_expand_conditional_branch (rtx *operands)
4600 {
4601   enum rtx_code code = GET_CODE (operands[0]);
4602   rtx op0 = operands[1];
4603   rtx op1 = operands[2];
4604   rtx condition;
4605
4606   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4607   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4608   emit_jump_insn (gen_condjump (condition, operands[3]));
4609 }
4610
4611 /* Implement:
4612
4613    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4614    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
4615
4616 void
4617 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4618                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4619 {
4620   rtx cmp_result;
4621   bool reversed_p;
4622
4623   reversed_p = mips_reversed_fp_cond (&cond);
4624   cmp_result = gen_reg_rtx (CCV2mode);
4625   emit_insn (gen_scc_ps (cmp_result,
4626                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4627   if (reversed_p)
4628     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4629                                          cmp_result));
4630   else
4631     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4632                                          cmp_result));
4633 }
4634
4635 /* Perform the comparison in OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0]
4636    if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
4637
4638 void
4639 mips_expand_conditional_move (rtx *operands)
4640 {
4641   rtx cond;
4642   enum rtx_code code = GET_CODE (operands[1]);
4643   rtx op0 = XEXP (operands[1], 0);
4644   rtx op1 = XEXP (operands[1], 1);
4645
4646   mips_emit_compare (&code, &op0, &op1, true);
4647   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
4648   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4649                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4650                                                 operands[2], operands[3])));
4651 }
4652
4653 /* Perform the comparison in COMPARISON, then trap if the condition holds.  */
4654
4655 void
4656 mips_expand_conditional_trap (rtx comparison)
4657 {
4658   rtx op0, op1;
4659   enum machine_mode mode;
4660   enum rtx_code code;
4661
4662   /* MIPS conditional trap instructions don't have GT or LE flavors,
4663      so we must swap the operands and convert to LT and GE respectively.  */
4664   code = GET_CODE (comparison);
4665   switch (code)
4666     {
4667     case GT:
4668     case LE:
4669     case GTU:
4670     case LEU:
4671       code = swap_condition (code);
4672       op0 = XEXP (comparison, 1);
4673       op1 = XEXP (comparison, 0);
4674       break;
4675
4676     default:
4677       op0 = XEXP (comparison, 0);
4678       op1 = XEXP (comparison, 1);
4679       break;
4680     }
4681
4682   mode = GET_MODE (XEXP (comparison, 0));
4683   op0 = force_reg (mode, op0);
4684   if (!arith_operand (op1, mode))
4685     op1 = force_reg (mode, op1);
4686
4687   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4688                               gen_rtx_fmt_ee (code, mode, op0, op1),
4689                               const0_rtx));
4690 }
4691 \f
4692 /* Initialize *CUM for a call to a function of type FNTYPE.  */
4693
4694 void
4695 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4696 {
4697   memset (cum, 0, sizeof (*cum));
4698   cum->prototype = (fntype && prototype_p (fntype));
4699   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4700 }
4701
4702 /* Fill INFO with information about a single argument.  CUM is the
4703    cumulative state for earlier arguments.  MODE is the mode of this
4704    argument and TYPE is its type (if known).  NAMED is true if this
4705    is a named (fixed) argument rather than a variable one.  */
4706
4707 static void
4708 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4709                    enum machine_mode mode, const_tree type, bool named)
4710 {
4711   bool doubleword_aligned_p;
4712   unsigned int num_bytes, num_words, max_regs;
4713
4714   /* Work out the size of the argument.  */
4715   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4716   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4717
4718   /* Decide whether it should go in a floating-point register, assuming
4719      one is free.  Later code checks for availability.
4720
4721      The checks against UNITS_PER_FPVALUE handle the soft-float and
4722      single-float cases.  */
4723   switch (mips_abi)
4724     {
4725     case ABI_EABI:
4726       /* The EABI conventions have traditionally been defined in terms
4727          of TYPE_MODE, regardless of the actual type.  */
4728       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4729                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4730                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4731       break;
4732
4733     case ABI_32:
4734     case ABI_O64:
4735       /* Only leading floating-point scalars are passed in
4736          floating-point registers.  We also handle vector floats the same
4737          say, which is OK because they are not covered by the standard ABI.  */
4738       info->fpr_p = (!cum->gp_reg_found
4739                      && cum->arg_number < 2
4740                      && (type == 0
4741                          || SCALAR_FLOAT_TYPE_P (type)
4742                          || VECTOR_FLOAT_TYPE_P (type))
4743                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4744                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4745                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4746       break;
4747
4748     case ABI_N32:
4749     case ABI_64:
4750       /* Scalar, complex and vector floating-point types are passed in
4751          floating-point registers, as long as this is a named rather
4752          than a variable argument.  */
4753       info->fpr_p = (named
4754                      && (type == 0 || FLOAT_TYPE_P (type))
4755                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4756                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4757                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4758                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4759
4760       /* ??? According to the ABI documentation, the real and imaginary
4761          parts of complex floats should be passed in individual registers.
4762          The real and imaginary parts of stack arguments are supposed
4763          to be contiguous and there should be an extra word of padding
4764          at the end.
4765
4766          This has two problems.  First, it makes it impossible to use a
4767          single "void *" va_list type, since register and stack arguments
4768          are passed differently.  (At the time of writing, MIPSpro cannot
4769          handle complex float varargs correctly.)  Second, it's unclear
4770          what should happen when there is only one register free.
4771
4772          For now, we assume that named complex floats should go into FPRs
4773          if there are two FPRs free, otherwise they should be passed in the
4774          same way as a struct containing two floats.  */
4775       if (info->fpr_p
4776           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4777           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4778         {
4779           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4780             info->fpr_p = false;
4781           else
4782             num_words = 2;
4783         }
4784       break;
4785
4786     default:
4787       gcc_unreachable ();
4788     }
4789
4790   /* See whether the argument has doubleword alignment.  */
4791   doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
4792                           > BITS_PER_WORD);
4793
4794   /* Set REG_OFFSET to the register count we're interested in.
4795      The EABI allocates the floating-point registers separately,
4796      but the other ABIs allocate them like integer registers.  */
4797   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4798                       ? cum->num_fprs
4799                       : cum->num_gprs);
4800
4801   /* Advance to an even register if the argument is doubleword-aligned.  */
4802   if (doubleword_aligned_p)
4803     info->reg_offset += info->reg_offset & 1;
4804
4805   /* Work out the offset of a stack argument.  */
4806   info->stack_offset = cum->stack_words;
4807   if (doubleword_aligned_p)
4808     info->stack_offset += info->stack_offset & 1;
4809
4810   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4811
4812   /* Partition the argument between registers and stack.  */
4813   info->reg_words = MIN (num_words, max_regs);
4814   info->stack_words = num_words - info->reg_words;
4815 }
4816
4817 /* INFO describes a register argument that has the normal format for the
4818    argument's mode.  Return the register it uses, assuming that FPRs are
4819    available if HARD_FLOAT_P.  */
4820
4821 static unsigned int
4822 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4823 {
4824   if (!info->fpr_p || !hard_float_p)
4825     return GP_ARG_FIRST + info->reg_offset;
4826   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4827     /* In o32, the second argument is always passed in $f14
4828        for TARGET_DOUBLE_FLOAT, regardless of whether the
4829        first argument was a word or doubleword.  */
4830     return FP_ARG_FIRST + 2;
4831   else
4832     return FP_ARG_FIRST + info->reg_offset;
4833 }
4834
4835 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4836
4837 static bool
4838 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4839 {
4840   return !TARGET_OLDABI;
4841 }
4842
4843 /* Implement TARGET_FUNCTION_ARG.  */
4844
4845 static rtx
4846 mips_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4847                    const_tree type, bool named)
4848 {
4849   struct mips_arg_info info;
4850
4851   /* We will be called with a mode of VOIDmode after the last argument
4852      has been seen.  Whatever we return will be passed to the call expander.
4853      If we need a MIPS16 fp_code, return a REG with the code stored as
4854      the mode.  */
4855   if (mode == VOIDmode)
4856     {
4857       if (TARGET_MIPS16 && cum->fp_code != 0)
4858         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4859       else
4860         return NULL;
4861     }
4862
4863   mips_get_arg_info (&info, cum, mode, type, named);
4864
4865   /* Return straight away if the whole argument is passed on the stack.  */
4866   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4867     return NULL;
4868
4869   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4870      contains a double in its entirety, then that 64-bit chunk is passed
4871      in a floating-point register.  */
4872   if (TARGET_NEWABI
4873       && TARGET_HARD_FLOAT
4874       && named
4875       && type != 0
4876       && TREE_CODE (type) == RECORD_TYPE
4877       && TYPE_SIZE_UNIT (type)
4878       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4879     {
4880       tree field;
4881
4882       /* First check to see if there is any such field.  */
4883       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
4884         if (TREE_CODE (field) == FIELD_DECL
4885             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4886             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4887             && host_integerp (bit_position (field), 0)
4888             && int_bit_position (field) % BITS_PER_WORD == 0)
4889           break;
4890
4891       if (field != 0)
4892         {
4893           /* Now handle the special case by returning a PARALLEL
4894              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4895              chunks are passed in registers.  */
4896           unsigned int i;
4897           HOST_WIDE_INT bitpos;
4898           rtx ret;
4899
4900           /* assign_parms checks the mode of ENTRY_PARM, so we must
4901              use the actual mode here.  */
4902           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4903
4904           bitpos = 0;
4905           field = TYPE_FIELDS (type);
4906           for (i = 0; i < info.reg_words; i++)
4907             {
4908               rtx reg;
4909
4910               for (; field; field = DECL_CHAIN (field))
4911                 if (TREE_CODE (field) == FIELD_DECL
4912                     && int_bit_position (field) >= bitpos)
4913                   break;
4914
4915               if (field
4916                   && int_bit_position (field) == bitpos
4917                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4918                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4919                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4920               else
4921                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4922
4923               XVECEXP (ret, 0, i)
4924                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4925                                      GEN_INT (bitpos / BITS_PER_UNIT));
4926
4927               bitpos += BITS_PER_WORD;
4928             }
4929           return ret;
4930         }
4931     }
4932
4933   /* Handle the n32/n64 conventions for passing complex floating-point
4934      arguments in FPR pairs.  The real part goes in the lower register
4935      and the imaginary part goes in the upper register.  */
4936   if (TARGET_NEWABI
4937       && info.fpr_p
4938       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4939     {
4940       rtx real, imag;
4941       enum machine_mode inner;
4942       unsigned int regno;
4943
4944       inner = GET_MODE_INNER (mode);
4945       regno = FP_ARG_FIRST + info.reg_offset;
4946       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4947         {
4948           /* Real part in registers, imaginary part on stack.  */
4949           gcc_assert (info.stack_words == info.reg_words);
4950           return gen_rtx_REG (inner, regno);
4951         }
4952       else
4953         {
4954           gcc_assert (info.stack_words == 0);
4955           real = gen_rtx_EXPR_LIST (VOIDmode,
4956                                     gen_rtx_REG (inner, regno),
4957                                     const0_rtx);
4958           imag = gen_rtx_EXPR_LIST (VOIDmode,
4959                                     gen_rtx_REG (inner,
4960                                                  regno + info.reg_words / 2),
4961                                     GEN_INT (GET_MODE_SIZE (inner)));
4962           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4963         }
4964     }
4965
4966   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4967 }
4968
4969 /* Implement TARGET_FUNCTION_ARG_ADVANCE.  */
4970
4971 static void
4972 mips_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4973                            const_tree type, bool named)
4974 {
4975   struct mips_arg_info info;
4976
4977   mips_get_arg_info (&info, cum, mode, type, named);
4978
4979   if (!info.fpr_p)
4980     cum->gp_reg_found = true;
4981
4982   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4983      an explanation of what this code does.  It assumes that we're using
4984      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4985      in FPRs.  */
4986   if (cum->arg_number < 2 && info.fpr_p)
4987     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4988
4989   /* Advance the register count.  This has the effect of setting
4990      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4991      argument required us to skip the final GPR and pass the whole
4992      argument on the stack.  */
4993   if (mips_abi != ABI_EABI || !info.fpr_p)
4994     cum->num_gprs = info.reg_offset + info.reg_words;
4995   else if (info.reg_words > 0)
4996     cum->num_fprs += MAX_FPRS_PER_FMT;
4997
4998   /* Advance the stack word count.  */
4999   if (info.stack_words > 0)
5000     cum->stack_words = info.stack_offset + info.stack_words;
5001
5002   cum->arg_number++;
5003 }
5004
5005 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
5006
5007 static int
5008 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
5009                         enum machine_mode mode, tree type, bool named)
5010 {
5011   struct mips_arg_info info;
5012
5013   mips_get_arg_info (&info, cum, mode, type, named);
5014   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
5015 }
5016
5017 /* Implement TARGET_FUNCTION_ARG_BOUNDARY.  Every parameter gets at
5018    least PARM_BOUNDARY bits of alignment, but will be given anything up
5019    to STACK_BOUNDARY bits if the type requires it.  */
5020
5021 static unsigned int
5022 mips_function_arg_boundary (enum machine_mode mode, const_tree type)
5023 {
5024   unsigned int alignment;
5025
5026   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5027   if (alignment < PARM_BOUNDARY)
5028     alignment = PARM_BOUNDARY;
5029   if (alignment > STACK_BOUNDARY)
5030     alignment = STACK_BOUNDARY;
5031   return alignment;
5032 }
5033
5034 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5035    upward rather than downward.  In other words, return true if the
5036    first byte of the stack slot has useful data, false if the last
5037    byte does.  */
5038
5039 bool
5040 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
5041 {
5042   /* On little-endian targets, the first byte of every stack argument
5043      is passed in the first byte of the stack slot.  */
5044   if (!BYTES_BIG_ENDIAN)
5045     return true;
5046
5047   /* Otherwise, integral types are padded downward: the last byte of a
5048      stack argument is passed in the last byte of the stack slot.  */
5049   if (type != 0
5050       ? (INTEGRAL_TYPE_P (type)
5051          || POINTER_TYPE_P (type)
5052          || FIXED_POINT_TYPE_P (type))
5053       : (SCALAR_INT_MODE_P (mode)
5054          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5055     return false;
5056
5057   /* Big-endian o64 pads floating-point arguments downward.  */
5058   if (mips_abi == ABI_O64)
5059     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5060       return false;
5061
5062   /* Other types are padded upward for o32, o64, n32 and n64.  */
5063   if (mips_abi != ABI_EABI)
5064     return true;
5065
5066   /* Arguments smaller than a stack slot are padded downward.  */
5067   if (mode != BLKmode)
5068     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5069   else
5070     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5071 }
5072
5073 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
5074    if the least significant byte of the register has useful data.  Return
5075    the opposite if the most significant byte does.  */
5076
5077 bool
5078 mips_pad_reg_upward (enum machine_mode mode, tree type)
5079 {
5080   /* No shifting is required for floating-point arguments.  */
5081   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5082     return !BYTES_BIG_ENDIAN;
5083
5084   /* Otherwise, apply the same padding to register arguments as we do
5085      to stack arguments.  */
5086   return mips_pad_arg_upward (mode, type);
5087 }
5088
5089 /* Return nonzero when an argument must be passed by reference.  */
5090
5091 static bool
5092 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5093                         enum machine_mode mode, const_tree type,
5094                         bool named ATTRIBUTE_UNUSED)
5095 {
5096   if (mips_abi == ABI_EABI)
5097     {
5098       int size;
5099
5100       /* ??? How should SCmode be handled?  */
5101       if (mode == DImode || mode == DFmode
5102           || mode == DQmode || mode == UDQmode
5103           || mode == DAmode || mode == UDAmode)
5104         return 0;
5105
5106       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5107       return size == -1 || size > UNITS_PER_WORD;
5108     }
5109   else
5110     {
5111       /* If we have a variable-sized parameter, we have no choice.  */
5112       return targetm.calls.must_pass_in_stack (mode, type);
5113     }
5114 }
5115
5116 /* Implement TARGET_CALLEE_COPIES.  */
5117
5118 static bool
5119 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5120                     enum machine_mode mode ATTRIBUTE_UNUSED,
5121                     const_tree type ATTRIBUTE_UNUSED, bool named)
5122 {
5123   return mips_abi == ABI_EABI && named;
5124 }
5125 \f
5126 /* See whether VALTYPE is a record whose fields should be returned in
5127    floating-point registers.  If so, return the number of fields and
5128    list them in FIELDS (which should have two elements).  Return 0
5129    otherwise.
5130
5131    For n32 & n64, a structure with one or two fields is returned in
5132    floating-point registers as long as every field has a floating-point
5133    type.  */
5134
5135 static int
5136 mips_fpr_return_fields (const_tree valtype, tree *fields)
5137 {
5138   tree field;
5139   int i;
5140
5141   if (!TARGET_NEWABI)
5142     return 0;
5143
5144   if (TREE_CODE (valtype) != RECORD_TYPE)
5145     return 0;
5146
5147   i = 0;
5148   for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5149     {
5150       if (TREE_CODE (field) != FIELD_DECL)
5151         continue;
5152
5153       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5154         return 0;
5155
5156       if (i == 2)
5157         return 0;
5158
5159       fields[i++] = field;
5160     }
5161   return i;
5162 }
5163
5164 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
5165    a value in the most significant part of $2/$3 if:
5166
5167       - the target is big-endian;
5168
5169       - the value has a structure or union type (we generalize this to
5170         cover aggregates from other languages too); and
5171
5172       - the structure is not returned in floating-point registers.  */
5173
5174 static bool
5175 mips_return_in_msb (const_tree valtype)
5176 {
5177   tree fields[2];
5178
5179   return (TARGET_NEWABI
5180           && TARGET_BIG_ENDIAN
5181           && AGGREGATE_TYPE_P (valtype)
5182           && mips_fpr_return_fields (valtype, fields) == 0);
5183 }
5184
5185 /* Return true if the function return value MODE will get returned in a
5186    floating-point register.  */
5187
5188 static bool
5189 mips_return_mode_in_fpr_p (enum machine_mode mode)
5190 {
5191   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5192            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
5193            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5194           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5195 }
5196
5197 /* Return the representation of an FPR return register when the
5198    value being returned in FP_RETURN has mode VALUE_MODE and the
5199    return type itself has mode TYPE_MODE.  On NewABI targets,
5200    the two modes may be different for structures like:
5201
5202        struct __attribute__((packed)) foo { float f; }
5203
5204    where we return the SFmode value of "f" in FP_RETURN, but where
5205    the structure itself has mode BLKmode.  */
5206
5207 static rtx
5208 mips_return_fpr_single (enum machine_mode type_mode,
5209                         enum machine_mode value_mode)
5210 {
5211   rtx x;
5212
5213   x = gen_rtx_REG (value_mode, FP_RETURN);
5214   if (type_mode != value_mode)
5215     {
5216       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5217       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5218     }
5219   return x;
5220 }
5221
5222 /* Return a composite value in a pair of floating-point registers.
5223    MODE1 and OFFSET1 are the mode and byte offset for the first value,
5224    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
5225    complete value.
5226
5227    For n32 & n64, $f0 always holds the first value and $f2 the second.
5228    Otherwise the values are packed together as closely as possible.  */
5229
5230 static rtx
5231 mips_return_fpr_pair (enum machine_mode mode,
5232                       enum machine_mode mode1, HOST_WIDE_INT offset1,
5233                       enum machine_mode mode2, HOST_WIDE_INT offset2)
5234 {
5235   int inc;
5236
5237   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5238   return gen_rtx_PARALLEL
5239     (mode,
5240      gen_rtvec (2,
5241                 gen_rtx_EXPR_LIST (VOIDmode,
5242                                    gen_rtx_REG (mode1, FP_RETURN),
5243                                    GEN_INT (offset1)),
5244                 gen_rtx_EXPR_LIST (VOIDmode,
5245                                    gen_rtx_REG (mode2, FP_RETURN + inc),
5246                                    GEN_INT (offset2))));
5247
5248 }
5249
5250 /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5251    For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5252    For libcalls, VALTYPE is null and MODE is the mode of the return value.  */
5253
5254 static rtx
5255 mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5256                        enum machine_mode mode)
5257 {
5258   if (valtype)
5259     {
5260       tree fields[2];
5261       int unsigned_p;
5262       const_tree func;
5263
5264       if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5265         func = fn_decl_or_type;
5266       else
5267         func = NULL;
5268
5269       mode = TYPE_MODE (valtype);
5270       unsigned_p = TYPE_UNSIGNED (valtype);
5271
5272       /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5273          return values, promote the mode here too.  */
5274       mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5275
5276       /* Handle structures whose fields are returned in $f0/$f2.  */
5277       switch (mips_fpr_return_fields (valtype, fields))
5278         {
5279         case 1:
5280           return mips_return_fpr_single (mode,
5281                                          TYPE_MODE (TREE_TYPE (fields[0])));
5282
5283         case 2:
5284           return mips_return_fpr_pair (mode,
5285                                        TYPE_MODE (TREE_TYPE (fields[0])),
5286                                        int_byte_position (fields[0]),
5287                                        TYPE_MODE (TREE_TYPE (fields[1])),
5288                                        int_byte_position (fields[1]));
5289         }
5290
5291       /* If a value is passed in the most significant part of a register, see
5292          whether we have to round the mode up to a whole number of words.  */
5293       if (mips_return_in_msb (valtype))
5294         {
5295           HOST_WIDE_INT size = int_size_in_bytes (valtype);
5296           if (size % UNITS_PER_WORD != 0)
5297             {
5298               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5299               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5300             }
5301         }
5302
5303       /* For EABI, the class of return register depends entirely on MODE.
5304          For example, "struct { some_type x; }" and "union { some_type x; }"
5305          are returned in the same way as a bare "some_type" would be.
5306          Other ABIs only use FPRs for scalar, complex or vector types.  */
5307       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5308         return gen_rtx_REG (mode, GP_RETURN);
5309     }
5310
5311   if (!TARGET_MIPS16)
5312     {
5313       /* Handle long doubles for n32 & n64.  */
5314       if (mode == TFmode)
5315         return mips_return_fpr_pair (mode,
5316                                      DImode, 0,
5317                                      DImode, GET_MODE_SIZE (mode) / 2);
5318
5319       if (mips_return_mode_in_fpr_p (mode))
5320         {
5321           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5322             return mips_return_fpr_pair (mode,
5323                                          GET_MODE_INNER (mode), 0,
5324                                          GET_MODE_INNER (mode),
5325                                          GET_MODE_SIZE (mode) / 2);
5326           else
5327             return gen_rtx_REG (mode, FP_RETURN);
5328         }
5329     }
5330
5331   return gen_rtx_REG (mode, GP_RETURN);
5332 }
5333
5334 /* Implement TARGET_FUNCTION_VALUE.  */
5335
5336 static rtx
5337 mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5338                      bool outgoing ATTRIBUTE_UNUSED)
5339 {
5340   return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5341 }
5342
5343 /* Implement TARGET_LIBCALL_VALUE.  */
5344
5345 static rtx
5346 mips_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5347 {
5348   return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5349 }
5350
5351 /* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5352
5353    On the MIPS, R2 R3 and F0 F2 are the only register thus used.
5354    Currently, R2 and F0 are only implemented here (C has no complex type).  */
5355
5356 static bool
5357 mips_function_value_regno_p (const unsigned int regno)
5358 {
5359   if (regno == GP_RETURN
5360       || regno == FP_RETURN
5361       || (LONG_DOUBLE_TYPE_SIZE == 128
5362           && FP_RETURN != GP_RETURN
5363           && regno == FP_RETURN + 2))
5364     return true;
5365
5366   return false;
5367 }
5368
5369 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5370    all BLKmode objects are returned in memory.  Under the n32, n64
5371    and embedded ABIs, small structures are returned in a register.
5372    Objects with varying size must still be returned in memory, of
5373    course.  */
5374
5375 static bool
5376 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5377 {
5378   return (TARGET_OLDABI
5379           ? TYPE_MODE (type) == BLKmode
5380           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5381 }
5382 \f
5383 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5384
5385 static void
5386 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5387                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
5388                              int no_rtl)
5389 {
5390   CUMULATIVE_ARGS local_cum;
5391   int gp_saved, fp_saved;
5392
5393   /* The caller has advanced CUM up to, but not beyond, the last named
5394      argument.  Advance a local copy of CUM past the last "real" named
5395      argument, to find out how many registers are left over.  */
5396   local_cum = *cum;
5397   mips_function_arg_advance (&local_cum, mode, type, true);
5398
5399   /* Found out how many registers we need to save.  */
5400   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5401   fp_saved = (EABI_FLOAT_VARARGS_P
5402               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5403               : 0);
5404
5405   if (!no_rtl)
5406     {
5407       if (gp_saved > 0)
5408         {
5409           rtx ptr, mem;
5410
5411           ptr = plus_constant (virtual_incoming_args_rtx,
5412                                REG_PARM_STACK_SPACE (cfun->decl)
5413                                - gp_saved * UNITS_PER_WORD);
5414           mem = gen_frame_mem (BLKmode, ptr);
5415           set_mem_alias_set (mem, get_varargs_alias_set ());
5416
5417           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5418                                mem, gp_saved);
5419         }
5420       if (fp_saved > 0)
5421         {
5422           /* We can't use move_block_from_reg, because it will use
5423              the wrong mode.  */
5424           enum machine_mode mode;
5425           int off, i;
5426
5427           /* Set OFF to the offset from virtual_incoming_args_rtx of
5428              the first float register.  The FP save area lies below
5429              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5430           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5431           off -= fp_saved * UNITS_PER_FPREG;
5432
5433           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5434
5435           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5436                i += MAX_FPRS_PER_FMT)
5437             {
5438               rtx ptr, mem;
5439
5440               ptr = plus_constant (virtual_incoming_args_rtx, off);
5441               mem = gen_frame_mem (mode, ptr);
5442               set_mem_alias_set (mem, get_varargs_alias_set ());
5443               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5444               off += UNITS_PER_HWFPVALUE;
5445             }
5446         }
5447     }
5448   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5449     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5450                                    + fp_saved * UNITS_PER_FPREG);
5451 }
5452
5453 /* Implement TARGET_BUILTIN_VA_LIST.  */
5454
5455 static tree
5456 mips_build_builtin_va_list (void)
5457 {
5458   if (EABI_FLOAT_VARARGS_P)
5459     {
5460       /* We keep 3 pointers, and two offsets.
5461
5462          Two pointers are to the overflow area, which starts at the CFA.
5463          One of these is constant, for addressing into the GPR save area
5464          below it.  The other is advanced up the stack through the
5465          overflow region.
5466
5467          The third pointer is to the bottom of the GPR save area.
5468          Since the FPR save area is just below it, we can address
5469          FPR slots off this pointer.
5470
5471          We also keep two one-byte offsets, which are to be subtracted
5472          from the constant pointers to yield addresses in the GPR and
5473          FPR save areas.  These are downcounted as float or non-float
5474          arguments are used, and when they get to zero, the argument
5475          must be obtained from the overflow region.  */
5476       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5477       tree array, index;
5478
5479       record = lang_hooks.types.make_type (RECORD_TYPE);
5480
5481       f_ovfl = build_decl (BUILTINS_LOCATION,
5482                            FIELD_DECL, get_identifier ("__overflow_argptr"),
5483                            ptr_type_node);
5484       f_gtop = build_decl (BUILTINS_LOCATION,
5485                            FIELD_DECL, get_identifier ("__gpr_top"),
5486                            ptr_type_node);
5487       f_ftop = build_decl (BUILTINS_LOCATION,
5488                            FIELD_DECL, get_identifier ("__fpr_top"),
5489                            ptr_type_node);
5490       f_goff = build_decl (BUILTINS_LOCATION,
5491                            FIELD_DECL, get_identifier ("__gpr_offset"),
5492                            unsigned_char_type_node);
5493       f_foff = build_decl (BUILTINS_LOCATION,
5494                            FIELD_DECL, get_identifier ("__fpr_offset"),
5495                            unsigned_char_type_node);
5496       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5497          warn on every user file.  */
5498       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5499       array = build_array_type (unsigned_char_type_node,
5500                                 build_index_type (index));
5501       f_res = build_decl (BUILTINS_LOCATION,
5502                           FIELD_DECL, get_identifier ("__reserved"), array);
5503
5504       DECL_FIELD_CONTEXT (f_ovfl) = record;
5505       DECL_FIELD_CONTEXT (f_gtop) = record;
5506       DECL_FIELD_CONTEXT (f_ftop) = record;
5507       DECL_FIELD_CONTEXT (f_goff) = record;
5508       DECL_FIELD_CONTEXT (f_foff) = record;
5509       DECL_FIELD_CONTEXT (f_res) = record;
5510
5511       TYPE_FIELDS (record) = f_ovfl;
5512       DECL_CHAIN (f_ovfl) = f_gtop;
5513       DECL_CHAIN (f_gtop) = f_ftop;
5514       DECL_CHAIN (f_ftop) = f_goff;
5515       DECL_CHAIN (f_goff) = f_foff;
5516       DECL_CHAIN (f_foff) = f_res;
5517
5518       layout_type (record);
5519       return record;
5520     }
5521   else if (TARGET_IRIX6)
5522     /* On IRIX 6, this type is 'char *'.  */
5523     return build_pointer_type (char_type_node);
5524   else
5525     /* Otherwise, we use 'void *'.  */
5526     return ptr_type_node;
5527 }
5528
5529 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5530
5531 static void
5532 mips_va_start (tree valist, rtx nextarg)
5533 {
5534   if (EABI_FLOAT_VARARGS_P)
5535     {
5536       const CUMULATIVE_ARGS *cum;
5537       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5538       tree ovfl, gtop, ftop, goff, foff;
5539       tree t;
5540       int gpr_save_area_size;
5541       int fpr_save_area_size;
5542       int fpr_offset;
5543
5544       cum = &crtl->args.info;
5545       gpr_save_area_size
5546         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5547       fpr_save_area_size
5548         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5549
5550       f_ovfl = TYPE_FIELDS (va_list_type_node);
5551       f_gtop = DECL_CHAIN (f_ovfl);
5552       f_ftop = DECL_CHAIN (f_gtop);
5553       f_goff = DECL_CHAIN (f_ftop);
5554       f_foff = DECL_CHAIN (f_goff);
5555
5556       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5557                      NULL_TREE);
5558       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5559                      NULL_TREE);
5560       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5561                      NULL_TREE);
5562       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5563                      NULL_TREE);
5564       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5565                      NULL_TREE);
5566
5567       /* Emit code to initialize OVFL, which points to the next varargs
5568          stack argument.  CUM->STACK_WORDS gives the number of stack
5569          words used by named arguments.  */
5570       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5571       if (cum->stack_words > 0)
5572         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
5573                     size_int (cum->stack_words * UNITS_PER_WORD));
5574       t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5575       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5576
5577       /* Emit code to initialize GTOP, the top of the GPR save area.  */
5578       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5579       t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5580       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5581
5582       /* Emit code to initialize FTOP, the top of the FPR save area.
5583          This address is gpr_save_area_bytes below GTOP, rounded
5584          down to the next fp-aligned boundary.  */
5585       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5586       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5587       fpr_offset &= -UNITS_PER_FPVALUE;
5588       if (fpr_offset)
5589         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
5590                     size_int (-fpr_offset));
5591       t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5592       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5593
5594       /* Emit code to initialize GOFF, the offset from GTOP of the
5595          next GPR argument.  */
5596       t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5597                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5598       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5599
5600       /* Likewise emit code to initialize FOFF, the offset from FTOP
5601          of the next FPR argument.  */
5602       t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5603                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5604       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5605     }
5606   else
5607     {
5608       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
5609       std_expand_builtin_va_start (valist, nextarg);
5610     }
5611 }
5612
5613 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
5614
5615 static tree
5616 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5617                            gimple_seq *post_p)
5618 {
5619   tree addr;
5620   bool indirect_p;
5621
5622   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5623   if (indirect_p)
5624     type = build_pointer_type (type);
5625
5626   if (!EABI_FLOAT_VARARGS_P)
5627     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5628   else
5629     {
5630       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5631       tree ovfl, top, off, align;
5632       HOST_WIDE_INT size, rsize, osize;
5633       tree t, u;
5634
5635       f_ovfl = TYPE_FIELDS (va_list_type_node);
5636       f_gtop = DECL_CHAIN (f_ovfl);
5637       f_ftop = DECL_CHAIN (f_gtop);
5638       f_goff = DECL_CHAIN (f_ftop);
5639       f_foff = DECL_CHAIN (f_goff);
5640
5641       /* Let:
5642
5643          TOP be the top of the GPR or FPR save area;
5644          OFF be the offset from TOP of the next register;
5645          ADDR_RTX be the address of the argument;
5646          SIZE be the number of bytes in the argument type;
5647          RSIZE be the number of bytes used to store the argument
5648            when it's in the register save area; and
5649          OSIZE be the number of bytes used to store it when it's
5650            in the stack overflow area.
5651
5652          The code we want is:
5653
5654          1: off &= -rsize;        // round down
5655          2: if (off != 0)
5656          3:   {
5657          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
5658          5:     off -= rsize;
5659          6:   }
5660          7: else
5661          8:   {
5662          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
5663          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
5664          11:    ovfl += osize;
5665          14:  }
5666
5667          [1] and [9] can sometimes be optimized away.  */
5668
5669       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5670                      NULL_TREE);
5671       size = int_size_in_bytes (type);
5672
5673       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
5674           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
5675         {
5676           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
5677                         unshare_expr (valist), f_ftop, NULL_TREE);
5678           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
5679                         unshare_expr (valist), f_foff, NULL_TREE);
5680
5681           /* When va_start saves FPR arguments to the stack, each slot
5682              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
5683              argument's precision.  */
5684           rsize = UNITS_PER_HWFPVALUE;
5685
5686           /* Overflow arguments are padded to UNITS_PER_WORD bytes
5687              (= PARM_BOUNDARY bits).  This can be different from RSIZE
5688              in two cases:
5689
5690              (1) On 32-bit targets when TYPE is a structure such as:
5691
5692              struct s { float f; };
5693
5694              Such structures are passed in paired FPRs, so RSIZE
5695              will be 8 bytes.  However, the structure only takes
5696              up 4 bytes of memory, so OSIZE will only be 4.
5697
5698              (2) In combinations such as -mgp64 -msingle-float
5699              -fshort-double.  Doubles passed in registers will then take
5700              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
5701              stack take up UNITS_PER_WORD bytes.  */
5702           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
5703         }
5704       else
5705         {
5706           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
5707                         unshare_expr (valist), f_gtop, NULL_TREE);
5708           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
5709                         unshare_expr (valist), f_goff, NULL_TREE);
5710           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5711           if (rsize > UNITS_PER_WORD)
5712             {
5713               /* [1] Emit code for: off &= -rsize.      */
5714               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
5715                           build_int_cst (TREE_TYPE (off), -rsize));
5716               gimplify_assign (unshare_expr (off), t, pre_p);
5717             }
5718           osize = rsize;
5719         }
5720
5721       /* [2] Emit code to branch if off == 0.  */
5722       t = build2 (NE_EXPR, boolean_type_node, off,
5723                   build_int_cst (TREE_TYPE (off), 0));
5724       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
5725
5726       /* [5] Emit code for: off -= rsize.  We do this as a form of
5727          post-decrement not available to C.  */
5728       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
5729       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
5730
5731       /* [4] Emit code for:
5732          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
5733       t = fold_convert (sizetype, t);
5734       t = fold_build1 (NEGATE_EXPR, sizetype, t);
5735       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
5736       if (BYTES_BIG_ENDIAN && rsize > size)
5737         {
5738           u = size_int (rsize - size);
5739           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5740         }
5741       COND_EXPR_THEN (addr) = t;
5742
5743       if (osize > UNITS_PER_WORD)
5744         {
5745           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
5746           u = size_int (osize - 1);
5747           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
5748                       unshare_expr (ovfl), u);
5749           t = fold_convert (sizetype, t);
5750           u = size_int (-osize);
5751           t = build2 (BIT_AND_EXPR, sizetype, t, u);
5752           t = fold_convert (TREE_TYPE (ovfl), t);
5753           align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
5754                           unshare_expr (ovfl), t);
5755         }
5756       else
5757         align = NULL;
5758
5759       /* [10, 11] Emit code for:
5760          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
5761          ovfl += osize.  */
5762       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
5763       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5764       if (BYTES_BIG_ENDIAN && osize > size)
5765         {
5766           u = size_int (osize - size);
5767           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5768         }
5769
5770       /* String [9] and [10, 11] together.  */
5771       if (align)
5772         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5773       COND_EXPR_ELSE (addr) = t;
5774
5775       addr = fold_convert (build_pointer_type (type), addr);
5776       addr = build_va_arg_indirect_ref (addr);
5777     }
5778
5779   if (indirect_p)
5780     addr = build_va_arg_indirect_ref (addr);
5781
5782   return addr;
5783 }
5784 \f
5785 /* Start a definition of function NAME.  MIPS16_P indicates whether the
5786    function contains MIPS16 code.  */
5787
5788 static void
5789 mips_start_function_definition (const char *name, bool mips16_p)
5790 {
5791   if (mips16_p)
5792     fprintf (asm_out_file, "\t.set\tmips16\n");
5793   else
5794     fprintf (asm_out_file, "\t.set\tnomips16\n");
5795
5796   if (!flag_inhibit_size_directive)
5797     {
5798       fputs ("\t.ent\t", asm_out_file);
5799       assemble_name (asm_out_file, name);
5800       fputs ("\n", asm_out_file);
5801     }
5802
5803   ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
5804
5805   /* Start the definition proper.  */
5806   assemble_name (asm_out_file, name);
5807   fputs (":\n", asm_out_file);
5808 }
5809
5810 /* End a function definition started by mips_start_function_definition.  */
5811
5812 static void
5813 mips_end_function_definition (const char *name)
5814 {
5815   if (!flag_inhibit_size_directive)
5816     {
5817       fputs ("\t.end\t", asm_out_file);
5818       assemble_name (asm_out_file, name);
5819       fputs ("\n", asm_out_file);
5820     }
5821 }
5822 \f
5823 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5824
5825 static bool
5826 mips_ok_for_lazy_binding_p (rtx x)
5827 {
5828   return (TARGET_USE_GOT
5829           && GET_CODE (x) == SYMBOL_REF
5830           && !SYMBOL_REF_BIND_NOW_P (x)
5831           && !mips_symbol_binds_local_p (x));
5832 }
5833
5834 /* Load function address ADDR into register DEST.  TYPE is as for
5835    mips_expand_call.  Return true if we used an explicit lazy-binding
5836    sequence.  */
5837
5838 static bool
5839 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
5840 {
5841   /* If we're generating PIC, and this call is to a global function,
5842      try to allow its address to be resolved lazily.  This isn't
5843      possible for sibcalls when $gp is call-saved because the value
5844      of $gp on entry to the stub would be our caller's gp, not ours.  */
5845   if (TARGET_EXPLICIT_RELOCS
5846       && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
5847       && mips_ok_for_lazy_binding_p (addr))
5848     {
5849       addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
5850       emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
5851       return true;
5852     }
5853   else
5854     {
5855       mips_emit_move (dest, addr);
5856       return false;
5857     }
5858 }
5859 \f
5860 /* Each locally-defined hard-float MIPS16 function has a local symbol
5861    associated with it.  This hash table maps the function symbol (FUNC)
5862    to the local symbol (LOCAL). */
5863 struct GTY(()) mips16_local_alias {
5864   rtx func;
5865   rtx local;
5866 };
5867 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
5868
5869 /* Hash table callbacks for mips16_local_aliases.  */
5870
5871 static hashval_t
5872 mips16_local_aliases_hash (const void *entry)
5873 {
5874   const struct mips16_local_alias *alias;
5875
5876   alias = (const struct mips16_local_alias *) entry;
5877   return htab_hash_string (XSTR (alias->func, 0));
5878 }
5879
5880 static int
5881 mips16_local_aliases_eq (const void *entry1, const void *entry2)
5882 {
5883   const struct mips16_local_alias *alias1, *alias2;
5884
5885   alias1 = (const struct mips16_local_alias *) entry1;
5886   alias2 = (const struct mips16_local_alias *) entry2;
5887   return rtx_equal_p (alias1->func, alias2->func);
5888 }
5889
5890 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
5891    Return a local alias for it, creating a new one if necessary.  */
5892
5893 static rtx
5894 mips16_local_alias (rtx func)
5895 {
5896   struct mips16_local_alias *alias, tmp_alias;
5897   void **slot;
5898
5899   /* Create the hash table if this is the first call.  */
5900   if (mips16_local_aliases == NULL)
5901     mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
5902                                             mips16_local_aliases_eq, NULL);
5903
5904   /* Look up the function symbol, creating a new entry if need be.  */
5905   tmp_alias.func = func;
5906   slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
5907   gcc_assert (slot != NULL);
5908
5909   alias = (struct mips16_local_alias *) *slot;
5910   if (alias == NULL)
5911     {
5912       const char *func_name, *local_name;
5913       rtx local;
5914
5915       /* Create a new SYMBOL_REF for the local symbol.  The choice of
5916          __fn_local_* is based on the __fn_stub_* names that we've
5917          traditionally used for the non-MIPS16 stub.  */
5918       func_name = targetm.strip_name_encoding (XSTR (func, 0));
5919       local_name = ACONCAT (("__fn_local_", func_name, NULL));
5920       local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
5921       SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
5922
5923       /* Create a new structure to represent the mapping.  */
5924       alias = ggc_alloc_mips16_local_alias ();
5925       alias->func = func;
5926       alias->local = local;
5927       *slot = alias;
5928     }
5929   return alias->local;
5930 }
5931 \f
5932 /* A chained list of functions for which mips16_build_call_stub has already
5933    generated a stub.  NAME is the name of the function and FP_RET_P is true
5934    if the function returns a value in floating-point registers.  */
5935 struct mips16_stub {
5936   struct mips16_stub *next;
5937   char *name;
5938   bool fp_ret_p;
5939 };
5940 static struct mips16_stub *mips16_stubs;
5941
5942 /* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
5943
5944 static rtx
5945 mips16_stub_function (const char *name)
5946 {
5947   rtx x;
5948
5949   x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
5950   SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
5951   return x;
5952 }
5953
5954 /* Return the two-character string that identifies floating-point
5955    return mode MODE in the name of a MIPS16 function stub.  */
5956
5957 static const char *
5958 mips16_call_stub_mode_suffix (enum machine_mode mode)
5959 {
5960   if (mode == SFmode)
5961     return "sf";
5962   else if (mode == DFmode)
5963     return "df";
5964   else if (mode == SCmode)
5965     return "sc";
5966   else if (mode == DCmode)
5967     return "dc";
5968   else if (mode == V2SFmode)
5969     return "df";
5970   else
5971     gcc_unreachable ();
5972 }
5973
5974 /* Write instructions to move a 32-bit value between general register
5975    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5976    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5977
5978 static void
5979 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5980 {
5981   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5982            reg_names[gpreg], reg_names[fpreg]);
5983 }
5984
5985 /* Likewise for 64-bit values.  */
5986
5987 static void
5988 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5989 {
5990   if (TARGET_64BIT)
5991     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5992              reg_names[gpreg], reg_names[fpreg]);
5993   else if (TARGET_FLOAT64)
5994     {
5995       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5996                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5997       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5998                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5999     }
6000   else
6001     {
6002       /* Move the least-significant word.  */
6003       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6004                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6005       /* ...then the most significant word.  */
6006       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6007                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6008     }
6009 }
6010
6011 /* Write out code to move floating-point arguments into or out of
6012    general registers.  FP_CODE is the code describing which arguments
6013    are present (see the comment above the definition of CUMULATIVE_ARGS
6014    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
6015
6016 static void
6017 mips_output_args_xfer (int fp_code, char direction)
6018 {
6019   unsigned int gparg, fparg, f;
6020   CUMULATIVE_ARGS cum;
6021
6022   /* This code only works for o32 and o64.  */
6023   gcc_assert (TARGET_OLDABI);
6024
6025   mips_init_cumulative_args (&cum, NULL);
6026
6027   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6028     {
6029       enum machine_mode mode;
6030       struct mips_arg_info info;
6031
6032       if ((f & 3) == 1)
6033         mode = SFmode;
6034       else if ((f & 3) == 2)
6035         mode = DFmode;
6036       else
6037         gcc_unreachable ();
6038
6039       mips_get_arg_info (&info, &cum, mode, NULL, true);
6040       gparg = mips_arg_regno (&info, false);
6041       fparg = mips_arg_regno (&info, true);
6042
6043       if (mode == SFmode)
6044         mips_output_32bit_xfer (direction, gparg, fparg);
6045       else
6046         mips_output_64bit_xfer (direction, gparg, fparg);
6047
6048       mips_function_arg_advance (&cum, mode, NULL, true);
6049     }
6050 }
6051
6052 /* Write a MIPS16 stub for the current function.  This stub is used
6053    for functions which take arguments in the floating-point registers.
6054    It is normal-mode code that moves the floating-point arguments
6055    into the general registers and then jumps to the MIPS16 code.  */
6056
6057 static void
6058 mips16_build_function_stub (void)
6059 {
6060   const char *fnname, *alias_name, *separator;
6061   char *secname, *stubname;
6062   tree stubdecl;
6063   unsigned int f;
6064   rtx symbol, alias;
6065
6066   /* Create the name of the stub, and its unique section.  */
6067   symbol = XEXP (DECL_RTL (current_function_decl), 0);
6068   alias = mips16_local_alias (symbol);
6069
6070   fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6071   alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6072   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6073   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6074
6075   /* Build a decl for the stub.  */
6076   stubdecl = build_decl (BUILTINS_LOCATION,
6077                          FUNCTION_DECL, get_identifier (stubname),
6078                          build_function_type (void_type_node, NULL_TREE));
6079   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6080   DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6081                                        RESULT_DECL, NULL_TREE, void_type_node);
6082
6083   /* Output a comment.  */
6084   fprintf (asm_out_file, "\t# Stub function for %s (",
6085            current_function_name ());
6086   separator = "";
6087   for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6088     {
6089       fprintf (asm_out_file, "%s%s", separator,
6090                (f & 3) == 1 ? "float" : "double");
6091       separator = ", ";
6092     }
6093   fprintf (asm_out_file, ")\n");
6094
6095   /* Start the function definition.  */
6096   assemble_start_function (stubdecl, stubname);
6097   mips_start_function_definition (stubname, false);
6098
6099   /* If generating pic2 code, either set up the global pointer or
6100      switch to pic0.  */
6101   if (TARGET_ABICALLS_PIC2)
6102     {
6103       if (TARGET_ABSOLUTE_ABICALLS)
6104         fprintf (asm_out_file, "\t.option\tpic0\n");
6105       else
6106         {
6107           output_asm_insn ("%(.cpload\t%^%)", NULL);
6108           /* Emit an R_MIPS_NONE relocation to tell the linker what the
6109              target function is.  Use a local GOT access when loading the
6110              symbol, to cut down on the number of unnecessary GOT entries
6111              for stubs that aren't needed.  */
6112           output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6113           symbol = alias;
6114         }
6115     }
6116
6117   /* Load the address of the MIPS16 function into $25.  Do this first so
6118      that targets with coprocessor interlocks can use an MFC1 to fill the
6119      delay slot.  */
6120   output_asm_insn ("la\t%^,%0", &symbol);
6121
6122   /* Move the arguments from floating-point registers to general registers.  */
6123   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6124
6125   /* Jump to the MIPS16 function.  */
6126   output_asm_insn ("jr\t%^", NULL);
6127
6128   if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6129     fprintf (asm_out_file, "\t.option\tpic2\n");
6130
6131   mips_end_function_definition (stubname);
6132
6133   /* If the linker needs to create a dynamic symbol for the target
6134      function, it will associate the symbol with the stub (which,
6135      unlike the target function, follows the proper calling conventions).
6136      It is therefore useful to have a local alias for the target function,
6137      so that it can still be identified as MIPS16 code.  As an optimization,
6138      this symbol can also be used for indirect MIPS16 references from
6139      within this file.  */
6140   ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6141
6142   switch_to_section (function_section (current_function_decl));
6143 }
6144
6145 /* The current function is a MIPS16 function that returns a value in an FPR.
6146    Copy the return value from its soft-float to its hard-float location.
6147    libgcc2 has special non-MIPS16 helper functions for each case.  */
6148
6149 static void
6150 mips16_copy_fpr_return_value (void)
6151 {
6152   rtx fn, insn, retval;
6153   tree return_type;
6154   enum machine_mode return_mode;
6155   const char *name;
6156
6157   return_type = DECL_RESULT (current_function_decl);
6158   return_mode = DECL_MODE (return_type);
6159
6160   name = ACONCAT (("__mips16_ret_",
6161                    mips16_call_stub_mode_suffix (return_mode),
6162                    NULL));
6163   fn = mips16_stub_function (name);
6164
6165   /* The function takes arguments in $2 (and possibly $3), so calls
6166      to it cannot be lazily bound.  */
6167   SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6168
6169   /* Model the call as something that takes the GPR return value as
6170      argument and returns an "updated" value.  */
6171   retval = gen_rtx_REG (return_mode, GP_RETURN);
6172   insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6173                            const0_rtx, NULL_RTX, false);
6174   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6175 }
6176
6177 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6178    RETVAL is the location of the return value, or null if this is
6179    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
6180    arguments and FP_CODE is the code built by mips_function_arg;
6181    see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6182
6183    There are three alternatives:
6184
6185    - If a stub was needed, emit the call and return the call insn itself.
6186
6187    - If we can avoid using a stub by redirecting the call, set *FN_PTR
6188      to the new target and return null.
6189
6190    - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6191      unmodified.
6192
6193    A stub is needed for calls to functions that, in normal mode,
6194    receive arguments in FPRs or return values in FPRs.  The stub
6195    copies the arguments from their soft-float positions to their
6196    hard-float positions, calls the real function, then copies the
6197    return value from its hard-float position to its soft-float
6198    position.
6199
6200    We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6201    If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6202    automatically redirects the JAL to the stub, otherwise the JAL
6203    continues to call FN directly.  */
6204
6205 static rtx
6206 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6207 {
6208   const char *fnname;
6209   bool fp_ret_p;
6210   struct mips16_stub *l;
6211   rtx insn, fn;
6212
6213   /* We don't need to do anything if we aren't in MIPS16 mode, or if
6214      we were invoked with the -msoft-float option.  */
6215   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6216     return NULL_RTX;
6217
6218   /* Figure out whether the value might come back in a floating-point
6219      register.  */
6220   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6221
6222   /* We don't need to do anything if there were no floating-point
6223      arguments and the value will not be returned in a floating-point
6224      register.  */
6225   if (fp_code == 0 && !fp_ret_p)
6226     return NULL_RTX;
6227
6228   /* We don't need to do anything if this is a call to a special
6229      MIPS16 support function.  */
6230   fn = *fn_ptr;
6231   if (mips16_stub_function_p (fn))
6232     return NULL_RTX;
6233
6234   /* This code will only work for o32 and o64 abis.  The other ABI's
6235      require more sophisticated support.  */
6236   gcc_assert (TARGET_OLDABI);
6237
6238   /* If we're calling via a function pointer, use one of the magic
6239      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6240      Each stub expects the function address to arrive in register $2.  */
6241   if (GET_CODE (fn) != SYMBOL_REF
6242       || !call_insn_operand (fn, VOIDmode))
6243     {
6244       char buf[30];
6245       rtx stub_fn, insn, addr;
6246       bool lazy_p;
6247
6248       /* If this is a locally-defined and locally-binding function,
6249          avoid the stub by calling the local alias directly.  */
6250       if (mips16_local_function_p (fn))
6251         {
6252           *fn_ptr = mips16_local_alias (fn);
6253           return NULL_RTX;
6254         }
6255
6256       /* Create a SYMBOL_REF for the libgcc.a function.  */
6257       if (fp_ret_p)
6258         sprintf (buf, "__mips16_call_stub_%s_%d",
6259                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
6260                  fp_code);
6261       else
6262         sprintf (buf, "__mips16_call_stub_%d", fp_code);
6263       stub_fn = mips16_stub_function (buf);
6264
6265       /* The function uses $2 as an argument, so calls to it
6266          cannot be lazily bound.  */
6267       SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6268
6269       /* Load the target function into $2.  */
6270       addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6271       lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6272
6273       /* Emit the call.  */
6274       insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6275                                args_size, NULL_RTX, lazy_p);
6276
6277       /* Tell GCC that this call does indeed use the value of $2.  */
6278       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6279
6280       /* If we are handling a floating-point return value, we need to
6281          save $18 in the function prologue.  Putting a note on the
6282          call will mean that df_regs_ever_live_p ($18) will be true if the
6283          call is not eliminated, and we can check that in the prologue
6284          code.  */
6285       if (fp_ret_p)
6286         CALL_INSN_FUNCTION_USAGE (insn) =
6287           gen_rtx_EXPR_LIST (VOIDmode,
6288                              gen_rtx_CLOBBER (VOIDmode,
6289                                               gen_rtx_REG (word_mode, 18)),
6290                              CALL_INSN_FUNCTION_USAGE (insn));
6291
6292       return insn;
6293     }
6294
6295   /* We know the function we are going to call.  If we have already
6296      built a stub, we don't need to do anything further.  */
6297   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6298   for (l = mips16_stubs; l != NULL; l = l->next)
6299     if (strcmp (l->name, fnname) == 0)
6300       break;
6301
6302   if (l == NULL)
6303     {
6304       const char *separator;
6305       char *secname, *stubname;
6306       tree stubid, stubdecl;
6307       unsigned int f;
6308
6309       /* If the function does not return in FPRs, the special stub
6310          section is named
6311              .mips16.call.FNNAME
6312
6313          If the function does return in FPRs, the stub section is named
6314              .mips16.call.fp.FNNAME
6315
6316          Build a decl for the stub.  */
6317       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6318                           fnname, NULL));
6319       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6320                            fnname, NULL));
6321       stubid = get_identifier (stubname);
6322       stubdecl = build_decl (BUILTINS_LOCATION,
6323                              FUNCTION_DECL, stubid,
6324                              build_function_type (void_type_node, NULL_TREE));
6325       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6326       DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6327                                            RESULT_DECL, NULL_TREE,
6328                                            void_type_node);
6329
6330       /* Output a comment.  */
6331       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6332                (fp_ret_p
6333                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6334                 : ""),
6335                fnname);
6336       separator = "";
6337       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6338         {
6339           fprintf (asm_out_file, "%s%s", separator,
6340                    (f & 3) == 1 ? "float" : "double");
6341           separator = ", ";
6342         }
6343       fprintf (asm_out_file, ")\n");
6344
6345       /* Start the function definition.  */
6346       assemble_start_function (stubdecl, stubname);
6347       mips_start_function_definition (stubname, false);
6348
6349       if (!fp_ret_p)
6350         {
6351           /* Load the address of the MIPS16 function into $25.  Do this
6352              first so that targets with coprocessor interlocks can use
6353              an MFC1 to fill the delay slot.  */
6354           if (TARGET_EXPLICIT_RELOCS)
6355             {
6356               output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6357               output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6358             }
6359           else
6360             output_asm_insn ("la\t%^,%0", &fn);
6361         }
6362
6363       /* Move the arguments from general registers to floating-point
6364          registers.  */
6365       mips_output_args_xfer (fp_code, 't');
6366
6367       if (!fp_ret_p)
6368         {
6369           /* Jump to the previously-loaded address.  */
6370           output_asm_insn ("jr\t%^", NULL);
6371         }
6372       else
6373         {
6374           /* Save the return address in $18 and call the non-MIPS16 function.
6375              The stub's caller knows that $18 might be clobbered, even though
6376              $18 is usually a call-saved register.  */
6377           fprintf (asm_out_file, "\tmove\t%s,%s\n",
6378                    reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6379           output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6380
6381           /* Move the result from floating-point registers to
6382              general registers.  */
6383           switch (GET_MODE (retval))
6384             {
6385             case SCmode:
6386               mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
6387                                       TARGET_BIG_ENDIAN
6388                                       ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6389                                       : FP_REG_FIRST);
6390               mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
6391                                       TARGET_LITTLE_ENDIAN
6392                                       ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6393                                       : FP_REG_FIRST);
6394               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6395                 {
6396                   /* On 64-bit targets, complex floats are returned in
6397                      a single GPR, such that "sd" on a suitably-aligned
6398                      target would store the value correctly.  */
6399                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6400                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6401                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6402                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6403                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6404                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6405                   fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
6406                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6407                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6408                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6409                            reg_names[GP_RETURN],
6410                            reg_names[GP_RETURN],
6411                            reg_names[GP_RETURN + 1]);
6412                 }
6413               break;
6414
6415             case SFmode:
6416               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6417               break;
6418
6419             case DCmode:
6420               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6421                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6422               /* Fall though.  */
6423             case DFmode:
6424             case V2SFmode:
6425               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6426               break;
6427
6428             default:
6429               gcc_unreachable ();
6430             }
6431           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6432         }
6433
6434 #ifdef ASM_DECLARE_FUNCTION_SIZE
6435       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6436 #endif
6437
6438       mips_end_function_definition (stubname);
6439
6440       /* Record this stub.  */
6441       l = XNEW (struct mips16_stub);
6442       l->name = xstrdup (fnname);
6443       l->fp_ret_p = fp_ret_p;
6444       l->next = mips16_stubs;
6445       mips16_stubs = l;
6446     }
6447
6448   /* If we expect a floating-point return value, but we've built a
6449      stub which does not expect one, then we're in trouble.  We can't
6450      use the existing stub, because it won't handle the floating-point
6451      value.  We can't build a new stub, because the linker won't know
6452      which stub to use for the various calls in this object file.
6453      Fortunately, this case is illegal, since it means that a function
6454      was declared in two different ways in a single compilation.  */
6455   if (fp_ret_p && !l->fp_ret_p)
6456     error ("cannot handle inconsistent calls to %qs", fnname);
6457
6458   if (retval == NULL_RTX)
6459     insn = gen_call_internal_direct (fn, args_size);
6460   else
6461     insn = gen_call_value_internal_direct (retval, fn, args_size);
6462   insn = mips_emit_call_insn (insn, fn, fn, false);
6463
6464   /* If we are calling a stub which handles a floating-point return
6465      value, we need to arrange to save $18 in the prologue.  We do this
6466      by marking the function call as using the register.  The prologue
6467      will later see that it is used, and emit code to save it.  */
6468   if (fp_ret_p)
6469     CALL_INSN_FUNCTION_USAGE (insn) =
6470       gen_rtx_EXPR_LIST (VOIDmode,
6471                          gen_rtx_CLOBBER (VOIDmode,
6472                                           gen_rtx_REG (word_mode, 18)),
6473                          CALL_INSN_FUNCTION_USAGE (insn));
6474
6475   return insn;
6476 }
6477 \f
6478 /* Expand a call of type TYPE.  RESULT is where the result will go (null
6479    for "call"s and "sibcall"s), ADDR is the address of the function,
6480    ARGS_SIZE is the size of the arguments and AUX is the value passed
6481    to us by mips_function_arg.  LAZY_P is true if this call already
6482    involves a lazily-bound function address (such as when calling
6483    functions through a MIPS16 hard-float stub).
6484
6485    Return the call itself.  */
6486
6487 rtx
6488 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6489                   rtx args_size, rtx aux, bool lazy_p)
6490 {
6491   rtx orig_addr, pattern, insn;
6492   int fp_code;
6493
6494   fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6495   insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6496   if (insn)
6497     {
6498       gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6499       return insn;
6500     }
6501                                  ;
6502   orig_addr = addr;
6503   if (!call_insn_operand (addr, VOIDmode))
6504     {
6505       if (type == MIPS_CALL_EPILOGUE)
6506         addr = MIPS_EPILOGUE_TEMP (Pmode);
6507       else
6508         addr = gen_reg_rtx (Pmode);
6509       lazy_p |= mips_load_call_address (type, addr, orig_addr);
6510     }
6511
6512   if (result == 0)
6513     {
6514       rtx (*fn) (rtx, rtx);
6515
6516       if (type == MIPS_CALL_SIBCALL)
6517         fn = gen_sibcall_internal;
6518       else
6519         fn = gen_call_internal;
6520
6521       pattern = fn (addr, args_size);
6522     }
6523   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6524     {
6525       /* Handle return values created by mips_return_fpr_pair.  */
6526       rtx (*fn) (rtx, rtx, rtx, rtx);
6527       rtx reg1, reg2;
6528
6529       if (type == MIPS_CALL_SIBCALL)
6530         fn = gen_sibcall_value_multiple_internal;
6531       else
6532         fn = gen_call_value_multiple_internal;
6533
6534       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6535       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6536       pattern = fn (reg1, addr, args_size, reg2);
6537     }
6538   else
6539     {
6540       rtx (*fn) (rtx, rtx, rtx);
6541
6542       if (type == MIPS_CALL_SIBCALL)
6543         fn = gen_sibcall_value_internal;
6544       else
6545         fn = gen_call_value_internal;
6546
6547       /* Handle return values created by mips_return_fpr_single.  */
6548       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6549         result = XEXP (XVECEXP (result, 0, 0), 0);
6550       pattern = fn (result, addr, args_size);
6551     }
6552
6553   return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6554 }
6555
6556 /* Split call instruction INSN into a $gp-clobbering call and
6557    (where necessary) an instruction to restore $gp from its save slot.
6558    CALL_PATTERN is the pattern of the new call.  */
6559
6560 void
6561 mips_split_call (rtx insn, rtx call_pattern)
6562 {
6563   emit_call_insn (call_pattern);
6564   if (!find_reg_note (insn, REG_NORETURN, 0))
6565     /* Pick a temporary register that is suitable for both MIPS16 and
6566        non-MIPS16 code.  $4 and $5 are used for returning complex double
6567        values in soft-float code, so $6 is the first suitable candidate.  */
6568     mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6569 }
6570
6571 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
6572
6573 static bool
6574 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
6575 {
6576   if (!TARGET_SIBCALLS)
6577     return false;
6578
6579   /* Interrupt handlers need special epilogue code and therefore can't
6580      use sibcalls.  */
6581   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
6582     return false;
6583
6584   /* We can't do a sibcall if the called function is a MIPS16 function
6585      because there is no direct "jx" instruction equivalent to "jalx" to
6586      switch the ISA mode.  We only care about cases where the sibling
6587      and normal calls would both be direct.  */
6588   if (decl
6589       && mips_use_mips16_mode_p (decl)
6590       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6591     return false;
6592
6593   /* When -minterlink-mips16 is in effect, assume that non-locally-binding
6594      functions could be MIPS16 ones unless an attribute explicitly tells
6595      us otherwise.  */
6596   if (TARGET_INTERLINK_MIPS16
6597       && decl
6598       && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
6599       && !mips_nomips16_decl_p (decl)
6600       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6601     return false;
6602
6603   /* Otherwise OK.  */
6604   return true;
6605 }
6606 \f
6607 /* Emit code to move general operand SRC into condition-code
6608    register DEST given that SCRATCH is a scratch TFmode FPR.
6609    The sequence is:
6610
6611         FP1 = SRC
6612         FP2 = 0.0f
6613         DEST = FP2 < FP1
6614
6615    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
6616
6617 void
6618 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
6619 {
6620   rtx fp1, fp2;
6621
6622   /* Change the source to SFmode.  */
6623   if (MEM_P (src))
6624     src = adjust_address (src, SFmode, 0);
6625   else if (REG_P (src) || GET_CODE (src) == SUBREG)
6626     src = gen_rtx_REG (SFmode, true_regnum (src));
6627
6628   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
6629   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
6630
6631   mips_emit_move (copy_rtx (fp1), src);
6632   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
6633   emit_insn (gen_slt_sf (dest, fp2, fp1));
6634 }
6635 \f
6636 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
6637    Assume that the areas do not overlap.  */
6638
6639 static void
6640 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
6641 {
6642   HOST_WIDE_INT offset, delta;
6643   unsigned HOST_WIDE_INT bits;
6644   int i;
6645   enum machine_mode mode;
6646   rtx *regs;
6647
6648   /* Work out how many bits to move at a time.  If both operands have
6649      half-word alignment, it is usually better to move in half words.
6650      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
6651      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
6652      Otherwise move word-sized chunks.  */
6653   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
6654       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
6655     bits = BITS_PER_WORD / 2;
6656   else
6657     bits = BITS_PER_WORD;
6658
6659   mode = mode_for_size (bits, MODE_INT, 0);
6660   delta = bits / BITS_PER_UNIT;
6661
6662   /* Allocate a buffer for the temporary registers.  */
6663   regs = XALLOCAVEC (rtx, length / delta);
6664
6665   /* Load as many BITS-sized chunks as possible.  Use a normal load if
6666      the source has enough alignment, otherwise use left/right pairs.  */
6667   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6668     {
6669       regs[i] = gen_reg_rtx (mode);
6670       if (MEM_ALIGN (src) >= bits)
6671         mips_emit_move (regs[i], adjust_address (src, mode, offset));
6672       else
6673         {
6674           rtx part = adjust_address (src, BLKmode, offset);
6675           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
6676             gcc_unreachable ();
6677         }
6678     }
6679
6680   /* Copy the chunks to the destination.  */
6681   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6682     if (MEM_ALIGN (dest) >= bits)
6683       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
6684     else
6685       {
6686         rtx part = adjust_address (dest, BLKmode, offset);
6687         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
6688           gcc_unreachable ();
6689       }
6690
6691   /* Mop up any left-over bytes.  */
6692   if (offset < length)
6693     {
6694       src = adjust_address (src, BLKmode, offset);
6695       dest = adjust_address (dest, BLKmode, offset);
6696       move_by_pieces (dest, src, length - offset,
6697                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
6698     }
6699 }
6700
6701 /* Helper function for doing a loop-based block operation on memory
6702    reference MEM.  Each iteration of the loop will operate on LENGTH
6703    bytes of MEM.
6704
6705    Create a new base register for use within the loop and point it to
6706    the start of MEM.  Create a new memory reference that uses this
6707    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
6708
6709 static void
6710 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
6711                        rtx *loop_reg, rtx *loop_mem)
6712 {
6713   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
6714
6715   /* Although the new mem does not refer to a known location,
6716      it does keep up to LENGTH bytes of alignment.  */
6717   *loop_mem = change_address (mem, BLKmode, *loop_reg);
6718   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
6719 }
6720
6721 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
6722    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
6723    the memory regions do not overlap.  */
6724
6725 static void
6726 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
6727                       HOST_WIDE_INT bytes_per_iter)
6728 {
6729   rtx label, src_reg, dest_reg, final_src, test;
6730   HOST_WIDE_INT leftover;
6731
6732   leftover = length % bytes_per_iter;
6733   length -= leftover;
6734
6735   /* Create registers and memory references for use within the loop.  */
6736   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
6737   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
6738
6739   /* Calculate the value that SRC_REG should have after the last iteration
6740      of the loop.  */
6741   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
6742                                    0, 0, OPTAB_WIDEN);
6743
6744   /* Emit the start of the loop.  */
6745   label = gen_label_rtx ();
6746   emit_label (label);
6747
6748   /* Emit the loop body.  */
6749   mips_block_move_straight (dest, src, bytes_per_iter);
6750
6751   /* Move on to the next block.  */
6752   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
6753   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
6754
6755   /* Emit the loop condition.  */
6756   test = gen_rtx_NE (VOIDmode, src_reg, final_src);
6757   if (Pmode == DImode)
6758     emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
6759   else
6760     emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
6761
6762   /* Mop up any left-over bytes.  */
6763   if (leftover)
6764     mips_block_move_straight (dest, src, leftover);
6765 }
6766
6767 /* Expand a movmemsi instruction, which copies LENGTH bytes from
6768    memory reference SRC to memory reference DEST.  */
6769
6770 bool
6771 mips_expand_block_move (rtx dest, rtx src, rtx length)
6772 {
6773   if (CONST_INT_P (length))
6774     {
6775       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
6776         {
6777           mips_block_move_straight (dest, src, INTVAL (length));
6778           return true;
6779         }
6780       else if (optimize)
6781         {
6782           mips_block_move_loop (dest, src, INTVAL (length),
6783                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
6784           return true;
6785         }
6786     }
6787   return false;
6788 }
6789 \f
6790 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
6791
6792 void
6793 mips_expand_synci_loop (rtx begin, rtx end)
6794 {
6795   rtx inc, label, end_label, cmp_result, mask, length;
6796
6797   /* Create end_label.  */
6798   end_label = gen_label_rtx ();
6799
6800   /* Check if begin equals end.  */
6801   cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
6802   emit_jump_insn (gen_condjump (cmp_result, end_label));
6803
6804   /* Load INC with the cache line size (rdhwr INC,$1).  */
6805   inc = gen_reg_rtx (Pmode);
6806   emit_insn (Pmode == SImode
6807              ? gen_rdhwr_synci_step_si (inc)
6808              : gen_rdhwr_synci_step_di (inc));
6809
6810   /* Check if inc is 0.  */
6811   cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
6812   emit_jump_insn (gen_condjump (cmp_result, end_label));
6813
6814   /* Calculate mask.  */
6815   mask = mips_force_unary (Pmode, NEG, inc);
6816
6817   /* Mask out begin by mask.  */
6818   begin = mips_force_binary (Pmode, AND, begin, mask);
6819
6820   /* Calculate length.  */
6821   length = mips_force_binary (Pmode, MINUS, end, begin);
6822
6823   /* Loop back to here.  */
6824   label = gen_label_rtx ();
6825   emit_label (label);
6826
6827   emit_insn (gen_synci (begin));
6828
6829   /* Update length.  */
6830   mips_emit_binary (MINUS, length, length, inc);
6831
6832   /* Update begin.  */
6833   mips_emit_binary (PLUS, begin, begin, inc);
6834
6835   /* Check if length is greater than 0.  */
6836   cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
6837   emit_jump_insn (gen_condjump (cmp_result, label));
6838
6839   emit_label (end_label);
6840 }
6841 \f
6842 /* Expand a QI or HI mode atomic memory operation.
6843
6844    GENERATOR contains a pointer to the gen_* function that generates
6845    the SI mode underlying atomic operation using masks that we
6846    calculate.
6847
6848    RESULT is the return register for the operation.  Its value is NULL
6849    if unused.
6850
6851    MEM is the location of the atomic access.
6852
6853    OLDVAL is the first operand for the operation.
6854
6855    NEWVAL is the optional second operand for the operation.  Its value
6856    is NULL if unused.  */
6857
6858 void
6859 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
6860                          rtx result, rtx mem, rtx oldval, rtx newval)
6861 {
6862   rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
6863   rtx unshifted_mask_reg, mask, inverted_mask, si_op;
6864   rtx res = NULL;
6865   enum machine_mode mode;
6866
6867   mode = GET_MODE (mem);
6868
6869   /* Compute the address of the containing SImode value.  */
6870   orig_addr = force_reg (Pmode, XEXP (mem, 0));
6871   memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
6872                                   force_reg (Pmode, GEN_INT (-4)));
6873
6874   /* Create a memory reference for it.  */
6875   memsi = gen_rtx_MEM (SImode, memsi_addr);
6876   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
6877   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
6878
6879   /* Work out the byte offset of the QImode or HImode value,
6880      counting from the least significant byte.  */
6881   shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
6882   if (TARGET_BIG_ENDIAN)
6883     mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
6884
6885   /* Multiply by eight to convert the shift value from bytes to bits.  */
6886   mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
6887
6888   /* Make the final shift an SImode value, so that it can be used in
6889      SImode operations.  */
6890   shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
6891
6892   /* Set MASK to an inclusive mask of the QImode or HImode value.  */
6893   unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
6894   unshifted_mask_reg = force_reg (SImode, unshifted_mask);
6895   mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
6896
6897   /* Compute the equivalent exclusive mask.  */
6898   inverted_mask = gen_reg_rtx (SImode);
6899   emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
6900                           gen_rtx_NOT (SImode, mask)));
6901
6902   /* Shift the old value into place.  */
6903   if (oldval != const0_rtx)
6904     {
6905       oldval = convert_modes (SImode, mode, oldval, true);
6906       oldval = force_reg (SImode, oldval);
6907       oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
6908     }
6909
6910   /* Do the same for the new value.  */
6911   if (newval && newval != const0_rtx)
6912     {
6913       newval = convert_modes (SImode, mode, newval, true);
6914       newval = force_reg (SImode, newval);
6915       newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
6916     }
6917
6918   /* Do the SImode atomic access.  */
6919   if (result)
6920     res = gen_reg_rtx (SImode);
6921   if (newval)
6922     si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
6923   else if (result)
6924     si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
6925   else
6926     si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
6927
6928   emit_insn (si_op);
6929
6930   if (result)
6931     {
6932       /* Shift and convert the result.  */
6933       mips_emit_binary (AND, res, res, mask);
6934       mips_emit_binary (LSHIFTRT, res, res, shiftsi);
6935       mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
6936     }
6937 }
6938
6939 /* Return true if it is possible to use left/right accesses for a
6940    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
6941    returning true, update *OP, *LEFT and *RIGHT as follows:
6942
6943    *OP is a BLKmode reference to the whole field.
6944
6945    *LEFT is a QImode reference to the first byte if big endian or
6946    the last byte if little endian.  This address can be used in the
6947    left-side instructions (LWL, SWL, LDL, SDL).
6948
6949    *RIGHT is a QImode reference to the opposite end of the field and
6950    can be used in the patterning right-side instruction.  */
6951
6952 static bool
6953 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
6954                         rtx *left, rtx *right)
6955 {
6956   rtx first, last;
6957
6958   /* Check that the operand really is a MEM.  Not all the extv and
6959      extzv predicates are checked.  */
6960   if (!MEM_P (*op))
6961     return false;
6962
6963   /* Check that the size is valid.  */
6964   if (width != 32 && (!TARGET_64BIT || width != 64))
6965     return false;
6966
6967   /* We can only access byte-aligned values.  Since we are always passed
6968      a reference to the first byte of the field, it is not necessary to
6969      do anything with BITPOS after this check.  */
6970   if (bitpos % BITS_PER_UNIT != 0)
6971     return false;
6972
6973   /* Reject aligned bitfields: we want to use a normal load or store
6974      instead of a left/right pair.  */
6975   if (MEM_ALIGN (*op) >= width)
6976     return false;
6977
6978   /* Adjust *OP to refer to the whole field.  This also has the effect
6979      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
6980   *op = adjust_address (*op, BLKmode, 0);
6981   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
6982
6983   /* Get references to both ends of the field.  We deliberately don't
6984      use the original QImode *OP for FIRST since the new BLKmode one
6985      might have a simpler address.  */
6986   first = adjust_address (*op, QImode, 0);
6987   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
6988
6989   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
6990      correspond to the MSB and RIGHT to the LSB.  */
6991   if (TARGET_BIG_ENDIAN)
6992     *left = first, *right = last;
6993   else
6994     *left = last, *right = first;
6995
6996   return true;
6997 }
6998
6999 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7000    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7001    the operation is the equivalent of:
7002
7003       (set DEST (*_extract SRC WIDTH BITPOS))
7004
7005    Return true on success.  */
7006
7007 bool
7008 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7009                                    HOST_WIDE_INT bitpos)
7010 {
7011   rtx left, right, temp;
7012
7013   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7014      be a paradoxical word_mode subreg.  This is the only case in which
7015      we allow the destination to be larger than the source.  */
7016   if (GET_CODE (dest) == SUBREG
7017       && GET_MODE (dest) == DImode
7018       && GET_MODE (SUBREG_REG (dest)) == SImode)
7019     dest = SUBREG_REG (dest);
7020
7021   /* After the above adjustment, the destination must be the same
7022      width as the source.  */
7023   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
7024     return false;
7025
7026   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
7027     return false;
7028
7029   temp = gen_reg_rtx (GET_MODE (dest));
7030   if (GET_MODE (dest) == DImode)
7031     {
7032       emit_insn (gen_mov_ldl (temp, src, left));
7033       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7034     }
7035   else
7036     {
7037       emit_insn (gen_mov_lwl (temp, src, left));
7038       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7039     }
7040   return true;
7041 }
7042
7043 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
7044    BITPOS and SRC are the operands passed to the expander; the operation
7045    is the equivalent of:
7046
7047        (set (zero_extract DEST WIDTH BITPOS) SRC)
7048
7049    Return true on success.  */
7050
7051 bool
7052 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7053                                     HOST_WIDE_INT bitpos)
7054 {
7055   rtx left, right;
7056   enum machine_mode mode;
7057
7058   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
7059     return false;
7060
7061   mode = mode_for_size (width, MODE_INT, 0);
7062   src = gen_lowpart (mode, src);
7063   if (mode == DImode)
7064     {
7065       emit_insn (gen_mov_sdl (dest, src, left));
7066       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7067     }
7068   else
7069     {
7070       emit_insn (gen_mov_swl (dest, src, left));
7071       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7072     }
7073   return true;
7074 }
7075
7076 /* Return true if X is a MEM with the same size as MODE.  */
7077
7078 bool
7079 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
7080 {
7081   rtx size;
7082
7083   if (!MEM_P (x))
7084     return false;
7085
7086   size = MEM_SIZE (x);
7087   return size && INTVAL (size) == GET_MODE_SIZE (mode);
7088 }
7089
7090 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7091    source of an "ext" instruction or the destination of an "ins"
7092    instruction.  OP must be a register operand and the following
7093    conditions must hold:
7094
7095      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7096      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7097      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7098
7099    Also reject lengths equal to a word as they are better handled
7100    by the move patterns.  */
7101
7102 bool
7103 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7104 {
7105   if (!ISA_HAS_EXT_INS
7106       || !register_operand (op, VOIDmode)
7107       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7108     return false;
7109
7110   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7111     return false;
7112
7113   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7114     return false;
7115
7116   return true;
7117 }
7118
7119 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7120    operation if MAXLEN is the maxium length of consecutive bits that
7121    can make up MASK.  MODE is the mode of the operation.  See
7122    mask_low_and_shift_len for the actual definition.  */
7123
7124 bool
7125 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
7126 {
7127   return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7128 }
7129
7130 /* Return true iff OP1 and OP2 are valid operands together for the
7131    *and<MODE>3 and *and<MODE>3_mips16 patterns.  For the cases to consider,
7132    see the table in the comment before the pattern.  */
7133
7134 bool
7135 and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7136 {
7137   return (memory_operand (op1, mode)
7138           ? and_load_operand (op2, mode)
7139           : and_reg_operand (op2, mode));
7140 }
7141
7142 /* The canonical form of a mask-low-and-shift-left operation is
7143    (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7144    cleared.  Thus we need to shift MASK to the right before checking if it
7145    is a valid mask value.  MODE is the mode of the operation.  If true
7146    return the length of the mask, otherwise return -1.  */
7147
7148 int
7149 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7150 {
7151   HOST_WIDE_INT shval;
7152
7153   shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7154   return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7155 }
7156 \f
7157 /* Return true if -msplit-addresses is selected and should be honored.
7158
7159    -msplit-addresses is a half-way house between explicit relocations
7160    and the traditional assembler macros.  It can split absolute 32-bit
7161    symbolic constants into a high/lo_sum pair but uses macros for other
7162    sorts of access.
7163
7164    Like explicit relocation support for REL targets, it relies
7165    on GNU extensions in the assembler and the linker.
7166
7167    Although this code should work for -O0, it has traditionally
7168    been treated as an optimization.  */
7169
7170 static bool
7171 mips_split_addresses_p (void)
7172 {
7173   return (TARGET_SPLIT_ADDRESSES
7174           && optimize
7175           && !TARGET_MIPS16
7176           && !flag_pic
7177           && !ABI_HAS_64BIT_SYMBOLS);
7178 }
7179
7180 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
7181
7182 static void
7183 mips_init_relocs (void)
7184 {
7185   memset (mips_split_p, '\0', sizeof (mips_split_p));
7186   memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7187   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7188   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7189
7190   if (ABI_HAS_64BIT_SYMBOLS)
7191     {
7192       if (TARGET_EXPLICIT_RELOCS)
7193         {
7194           mips_split_p[SYMBOL_64_HIGH] = true;
7195           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7196           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7197
7198           mips_split_p[SYMBOL_64_MID] = true;
7199           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7200           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7201
7202           mips_split_p[SYMBOL_64_LOW] = true;
7203           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7204           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7205
7206           mips_split_p[SYMBOL_ABSOLUTE] = true;
7207           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7208         }
7209     }
7210   else
7211     {
7212       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses_p () || TARGET_MIPS16)
7213         {
7214           mips_split_p[SYMBOL_ABSOLUTE] = true;
7215           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7216           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7217
7218           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
7219         }
7220     }
7221
7222   if (TARGET_MIPS16)
7223     {
7224       /* The high part is provided by a pseudo copy of $gp.  */
7225       mips_split_p[SYMBOL_GP_RELATIVE] = true;
7226       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7227     }
7228   else if (TARGET_EXPLICIT_RELOCS)
7229     /* Small data constants are kept whole until after reload,
7230        then lowered by mips_rewrite_small_data.  */
7231     mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7232
7233   if (TARGET_EXPLICIT_RELOCS)
7234     {
7235       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7236       if (TARGET_NEWABI)
7237         {
7238           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7239           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7240         }
7241       else
7242         {
7243           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7244           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7245         }
7246       if (TARGET_MIPS16)
7247         /* Expose the use of $28 as soon as possible.  */
7248         mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7249
7250       if (TARGET_XGOT)
7251         {
7252           /* The HIGH and LO_SUM are matched by special .md patterns.  */
7253           mips_split_p[SYMBOL_GOT_DISP] = true;
7254
7255           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7256           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7257           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7258
7259           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7260           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7261           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7262         }
7263       else
7264         {
7265           if (TARGET_NEWABI)
7266             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7267           else
7268             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7269           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7270           if (TARGET_MIPS16)
7271             /* Expose the use of $28 as soon as possible.  */
7272             mips_split_p[SYMBOL_GOT_DISP] = true;
7273         }
7274     }
7275
7276   if (TARGET_NEWABI)
7277     {
7278       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7279       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7280       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7281     }
7282
7283   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7284   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7285
7286   mips_split_p[SYMBOL_DTPREL] = true;
7287   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7288   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7289
7290   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7291
7292   mips_split_p[SYMBOL_TPREL] = true;
7293   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7294   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7295
7296   mips_lo_relocs[SYMBOL_HALF] = "%half(";
7297 }
7298
7299 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7300    in context CONTEXT.  RELOCS is the array of relocations to use.  */
7301
7302 static void
7303 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7304                           const char **relocs)
7305 {
7306   enum mips_symbol_type symbol_type;
7307   const char *p;
7308
7309   symbol_type = mips_classify_symbolic_expression (op, context);
7310   gcc_assert (relocs[symbol_type]);
7311
7312   fputs (relocs[symbol_type], file);
7313   output_addr_const (file, mips_strip_unspec_address (op));
7314   for (p = relocs[symbol_type]; *p != 0; p++)
7315     if (*p == '(')
7316       fputc (')', file);
7317 }
7318
7319 /* Start a new block with the given asm switch enabled.  If we need
7320    to print a directive, emit PREFIX before it and SUFFIX after it.  */
7321
7322 static void
7323 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7324                         const char *prefix, const char *suffix)
7325 {
7326   if (asm_switch->nesting_level == 0)
7327     fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7328   asm_switch->nesting_level++;
7329 }
7330
7331 /* Likewise, but end a block.  */
7332
7333 static void
7334 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7335                        const char *prefix, const char *suffix)
7336 {
7337   gcc_assert (asm_switch->nesting_level);
7338   asm_switch->nesting_level--;
7339   if (asm_switch->nesting_level == 0)
7340     fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7341 }
7342
7343 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7344    that either print a complete line or print nothing.  */
7345
7346 void
7347 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
7348 {
7349   mips_push_asm_switch_1 (asm_switch, "\t", "\n");
7350 }
7351
7352 void
7353 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
7354 {
7355   mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
7356 }
7357
7358 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
7359    The punctuation characters are:
7360
7361    '('  Start a nested ".set noreorder" block.
7362    ')'  End a nested ".set noreorder" block.
7363    '['  Start a nested ".set noat" block.
7364    ']'  End a nested ".set noat" block.
7365    '<'  Start a nested ".set nomacro" block.
7366    '>'  End a nested ".set nomacro" block.
7367    '*'  Behave like %(%< if generating a delayed-branch sequence.
7368    '#'  Print a nop if in a ".set noreorder" block.
7369    '/'  Like '#', but do nothing within a delayed-branch sequence.
7370    '?'  Print "l" if mips_branch_likely is true
7371    '~'  Print a nop if mips_branch_likely is true
7372    '.'  Print the name of the register with a hard-wired zero (zero or $0).
7373    '@'  Print the name of the assembler temporary register (at or $1).
7374    '^'  Print the name of the pic call-through register (t9 or $25).
7375    '+'  Print the name of the gp register (usually gp or $28).
7376    '$'  Print the name of the stack pointer register (sp or $29).
7377
7378    See also mips_init_print_operand_pucnt.  */
7379
7380 static void
7381 mips_print_operand_punctuation (FILE *file, int ch)
7382 {
7383   switch (ch)
7384     {
7385     case '(':
7386       mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
7387       break;
7388
7389     case ')':
7390       mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
7391       break;
7392
7393     case '[':
7394       mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
7395       break;
7396
7397     case ']':
7398       mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
7399       break;
7400
7401     case '<':
7402       mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
7403       break;
7404
7405     case '>':
7406       mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
7407       break;
7408
7409     case '*':
7410       if (final_sequence != 0)
7411         {
7412           mips_print_operand_punctuation (file, '(');
7413           mips_print_operand_punctuation (file, '<');
7414         }
7415       break;
7416
7417     case '#':
7418       if (mips_noreorder.nesting_level > 0)
7419         fputs ("\n\tnop", file);
7420       break;
7421
7422     case '/':
7423       /* Print an extra newline so that the delayed insn is separated
7424          from the following ones.  This looks neater and is consistent
7425          with non-nop delayed sequences.  */
7426       if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
7427         fputs ("\n\tnop\n", file);
7428       break;
7429
7430     case '?':
7431       if (mips_branch_likely)
7432         putc ('l', file);
7433       break;
7434
7435     case '~':
7436       if (mips_branch_likely)
7437         fputs ("\n\tnop", file);
7438       break;
7439
7440     case '.':
7441       fputs (reg_names[GP_REG_FIRST + 0], file);
7442       break;
7443
7444     case '@':
7445       fputs (reg_names[AT_REGNUM], file);
7446       break;
7447
7448     case '^':
7449       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7450       break;
7451
7452     case '+':
7453       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7454       break;
7455
7456     case '$':
7457       fputs (reg_names[STACK_POINTER_REGNUM], file);
7458       break;
7459
7460     default:
7461       gcc_unreachable ();
7462       break;
7463     }
7464 }
7465
7466 /* Initialize mips_print_operand_punct.  */
7467
7468 static void
7469 mips_init_print_operand_punct (void)
7470 {
7471   const char *p;
7472
7473   for (p = "()[]<>*#/?~.@^+$"; *p; p++)
7474     mips_print_operand_punct[(unsigned char) *p] = true;
7475 }
7476
7477 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
7478    associated with condition CODE.  Print the condition part of the
7479    opcode to FILE.  */
7480
7481 static void
7482 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
7483 {
7484   switch (code)
7485     {
7486     case EQ:
7487     case NE:
7488     case GT:
7489     case GE:
7490     case LT:
7491     case LE:
7492     case GTU:
7493     case GEU:
7494     case LTU:
7495     case LEU:
7496       /* Conveniently, the MIPS names for these conditions are the same
7497          as their RTL equivalents.  */
7498       fputs (GET_RTX_NAME (code), file);
7499       break;
7500
7501     default:
7502       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7503       break;
7504     }
7505 }
7506
7507 /* Likewise floating-point branches.  */
7508
7509 static void
7510 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
7511 {
7512   switch (code)
7513     {
7514     case EQ:
7515       fputs ("c1f", file);
7516       break;
7517
7518     case NE:
7519       fputs ("c1t", file);
7520       break;
7521
7522     default:
7523       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7524       break;
7525     }
7526 }
7527
7528 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
7529
7530 static bool
7531 mips_print_operand_punct_valid_p (unsigned char code)
7532 {
7533   return mips_print_operand_punct[code];
7534 }
7535
7536 /* Implement TARGET_PRINT_OPERAND.  The MIPS-specific operand codes are:
7537
7538    'X'  Print CONST_INT OP in hexadecimal format.
7539    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
7540    'd'  Print CONST_INT OP in decimal.
7541    'm'  Print one less than CONST_INT OP in decimal.
7542    'h'  Print the high-part relocation associated with OP, after stripping
7543           any outermost HIGH.
7544    'R'  Print the low-part relocation associated with OP.
7545    'C'  Print the integer branch condition for comparison OP.
7546    'N'  Print the inverse of the integer branch condition for comparison OP.
7547    'F'  Print the FPU branch condition for comparison OP.
7548    'W'  Print the inverse of the FPU branch condition for comparison OP.
7549    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
7550               'z' for (eq:?I ...), 'n' for (ne:?I ...).
7551    't'  Like 'T', but with the EQ/NE cases reversed
7552    'Y'  Print mips_fp_conditions[INTVAL (OP)]
7553    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
7554    'q'  Print a DSP accumulator register.
7555    'D'  Print the second part of a double-word register or memory operand.
7556    'L'  Print the low-order register in a double-word register operand.
7557    'M'  Print high-order register in a double-word register operand.
7558    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
7559
7560 static void
7561 mips_print_operand (FILE *file, rtx op, int letter)
7562 {
7563   enum rtx_code code;
7564
7565   if (mips_print_operand_punct_valid_p (letter))
7566     {
7567       mips_print_operand_punctuation (file, letter);
7568       return;
7569     }
7570
7571   gcc_assert (op);
7572   code = GET_CODE (op);
7573
7574   switch (letter)
7575     {
7576     case 'X':
7577       if (CONST_INT_P (op))
7578         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
7579       else
7580         output_operand_lossage ("invalid use of '%%%c'", letter);
7581       break;
7582
7583     case 'x':
7584       if (CONST_INT_P (op))
7585         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
7586       else
7587         output_operand_lossage ("invalid use of '%%%c'", letter);
7588       break;
7589
7590     case 'd':
7591       if (CONST_INT_P (op))
7592         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
7593       else
7594         output_operand_lossage ("invalid use of '%%%c'", letter);
7595       break;
7596
7597     case 'm':
7598       if (CONST_INT_P (op))
7599         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
7600       else
7601         output_operand_lossage ("invalid use of '%%%c'", letter);
7602       break;
7603
7604     case 'h':
7605       if (code == HIGH)
7606         op = XEXP (op, 0);
7607       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
7608       break;
7609
7610     case 'R':
7611       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
7612       break;
7613
7614     case 'C':
7615       mips_print_int_branch_condition (file, code, letter);
7616       break;
7617
7618     case 'N':
7619       mips_print_int_branch_condition (file, reverse_condition (code), letter);
7620       break;
7621
7622     case 'F':
7623       mips_print_float_branch_condition (file, code, letter);
7624       break;
7625
7626     case 'W':
7627       mips_print_float_branch_condition (file, reverse_condition (code),
7628                                          letter);
7629       break;
7630
7631     case 'T':
7632     case 't':
7633       {
7634         int truth = (code == NE) == (letter == 'T');
7635         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
7636       }
7637       break;
7638
7639     case 'Y':
7640       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
7641         fputs (mips_fp_conditions[UINTVAL (op)], file);
7642       else
7643         output_operand_lossage ("'%%%c' is not a valid operand prefix",
7644                                 letter);
7645       break;
7646
7647     case 'Z':
7648       if (ISA_HAS_8CC)
7649         {
7650           mips_print_operand (file, op, 0);
7651           fputc (',', file);
7652         }
7653       break;
7654
7655     case 'q':
7656       if (code == REG && MD_REG_P (REGNO (op)))
7657         fprintf (file, "$ac0");
7658       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
7659         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
7660       else
7661         output_operand_lossage ("invalid use of '%%%c'", letter);
7662       break;
7663
7664     default:
7665       switch (code)
7666         {
7667         case REG:
7668           {
7669             unsigned int regno = REGNO (op);
7670             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
7671                 || (letter == 'L' && TARGET_BIG_ENDIAN)
7672                 || letter == 'D')
7673               regno++;
7674             else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
7675               output_operand_lossage ("invalid use of '%%%c'", letter);
7676             /* We need to print $0 .. $31 for COP0 registers.  */
7677             if (COP0_REG_P (regno))
7678               fprintf (file, "$%s", &reg_names[regno][4]);
7679             else
7680               fprintf (file, "%s", reg_names[regno]);
7681           }
7682           break;
7683
7684         case MEM:
7685           if (letter == 'D')
7686             output_address (plus_constant (XEXP (op, 0), 4));
7687           else if (letter && letter != 'z')
7688             output_operand_lossage ("invalid use of '%%%c'", letter);
7689           else
7690             output_address (XEXP (op, 0));
7691           break;
7692
7693         default:
7694           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
7695             fputs (reg_names[GP_REG_FIRST], file);
7696           else if (letter && letter != 'z')
7697             output_operand_lossage ("invalid use of '%%%c'", letter);
7698           else if (CONST_GP_P (op))
7699             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
7700           else
7701             output_addr_const (file, mips_strip_unspec_address (op));
7702           break;
7703         }
7704     }
7705 }
7706
7707 /* Implement TARGET_PRINT_OPERAND_ADDRESS.  */
7708
7709 static void
7710 mips_print_operand_address (FILE *file, rtx x)
7711 {
7712   struct mips_address_info addr;
7713
7714   if (mips_classify_address (&addr, x, word_mode, true))
7715     switch (addr.type)
7716       {
7717       case ADDRESS_REG:
7718         mips_print_operand (file, addr.offset, 0);
7719         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7720         return;
7721
7722       case ADDRESS_LO_SUM:
7723         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
7724                                   mips_lo_relocs);
7725         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7726         return;
7727
7728       case ADDRESS_CONST_INT:
7729         output_addr_const (file, x);
7730         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
7731         return;
7732
7733       case ADDRESS_SYMBOLIC:
7734         output_addr_const (file, mips_strip_unspec_address (x));
7735         return;
7736       }
7737   gcc_unreachable ();
7738 }
7739 \f
7740 /* Implement TARGET_ENCODE_SECTION_INFO.  */
7741
7742 static void
7743 mips_encode_section_info (tree decl, rtx rtl, int first)
7744 {
7745   default_encode_section_info (decl, rtl, first);
7746
7747   if (TREE_CODE (decl) == FUNCTION_DECL)
7748     {
7749       rtx symbol = XEXP (rtl, 0);
7750       tree type = TREE_TYPE (decl);
7751
7752       /* Encode whether the symbol is short or long.  */
7753       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
7754           || mips_far_type_p (type))
7755         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
7756     }
7757 }
7758
7759 /* Implement TARGET_SELECT_RTX_SECTION.  */
7760
7761 static section *
7762 mips_select_rtx_section (enum machine_mode mode, rtx x,
7763                          unsigned HOST_WIDE_INT align)
7764 {
7765   /* ??? Consider using mergeable small data sections.  */
7766   if (mips_rtx_constant_in_small_data_p (mode))
7767     return get_named_section (NULL, ".sdata", 0);
7768
7769   return default_elf_select_rtx_section (mode, x, align);
7770 }
7771
7772 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7773
7774    The complication here is that, with the combination TARGET_ABICALLS
7775    && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
7776    absolute addresses, and should therefore not be included in the
7777    read-only part of a DSO.  Handle such cases by selecting a normal
7778    data section instead of a read-only one.  The logic apes that in
7779    default_function_rodata_section.  */
7780
7781 static section *
7782 mips_function_rodata_section (tree decl)
7783 {
7784   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
7785     return default_function_rodata_section (decl);
7786
7787   if (decl && DECL_SECTION_NAME (decl))
7788     {
7789       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7790       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7791         {
7792           char *rname = ASTRDUP (name);
7793           rname[14] = 'd';
7794           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7795         }
7796       else if (flag_function_sections
7797                && flag_data_sections
7798                && strncmp (name, ".text.", 6) == 0)
7799         {
7800           char *rname = ASTRDUP (name);
7801           memcpy (rname + 1, "data", 4);
7802           return get_section (rname, SECTION_WRITE, decl);
7803         }
7804     }
7805   return data_section;
7806 }
7807
7808 /* Implement TARGET_IN_SMALL_DATA_P.  */
7809
7810 static bool
7811 mips_in_small_data_p (const_tree decl)
7812 {
7813   unsigned HOST_WIDE_INT size;
7814
7815   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7816     return false;
7817
7818   /* We don't yet generate small-data references for -mabicalls
7819      or VxWorks RTP code.  See the related -G handling in
7820      mips_option_override.  */
7821   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
7822     return false;
7823
7824   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7825     {
7826       const char *name;
7827
7828       /* Reject anything that isn't in a known small-data section.  */
7829       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7830       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7831         return false;
7832
7833       /* If a symbol is defined externally, the assembler will use the
7834          usual -G rules when deciding how to implement macros.  */
7835       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
7836         return true;
7837     }
7838   else if (TARGET_EMBEDDED_DATA)
7839     {
7840       /* Don't put constants into the small data section: we want them
7841          to be in ROM rather than RAM.  */
7842       if (TREE_CODE (decl) != VAR_DECL)
7843         return false;
7844
7845       if (TREE_READONLY (decl)
7846           && !TREE_SIDE_EFFECTS (decl)
7847           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7848         return false;
7849     }
7850
7851   /* Enforce -mlocal-sdata.  */
7852   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
7853     return false;
7854
7855   /* Enforce -mextern-sdata.  */
7856   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
7857     {
7858       if (DECL_EXTERNAL (decl))
7859         return false;
7860       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
7861         return false;
7862     }
7863
7864   /* We have traditionally not treated zero-sized objects as small data,
7865      so this is now effectively part of the ABI.  */
7866   size = int_size_in_bytes (TREE_TYPE (decl));
7867   return size > 0 && size <= mips_small_data_threshold;
7868 }
7869
7870 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
7871    anchors for small data: the GP register acts as an anchor in that
7872    case.  We also don't want to use them for PC-relative accesses,
7873    where the PC acts as an anchor.  */
7874
7875 static bool
7876 mips_use_anchors_for_symbol_p (const_rtx symbol)
7877 {
7878   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
7879     {
7880     case SYMBOL_PC_RELATIVE:
7881     case SYMBOL_GP_RELATIVE:
7882       return false;
7883
7884     default:
7885       return default_use_anchors_for_symbol_p (symbol);
7886     }
7887 }
7888 \f
7889 /* The MIPS debug format wants all automatic variables and arguments
7890    to be in terms of the virtual frame pointer (stack pointer before
7891    any adjustment in the function), while the MIPS 3.0 linker wants
7892    the frame pointer to be the stack pointer after the initial
7893    adjustment.  So, we do the adjustment here.  The arg pointer (which
7894    is eliminated) points to the virtual frame pointer, while the frame
7895    pointer (which may be eliminated) points to the stack pointer after
7896    the initial adjustments.  */
7897
7898 HOST_WIDE_INT
7899 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
7900 {
7901   rtx offset2 = const0_rtx;
7902   rtx reg = eliminate_constant_term (addr, &offset2);
7903
7904   if (offset == 0)
7905     offset = INTVAL (offset2);
7906
7907   if (reg == stack_pointer_rtx
7908       || reg == frame_pointer_rtx
7909       || reg == hard_frame_pointer_rtx)
7910     {
7911       offset -= cfun->machine->frame.total_size;
7912       if (reg == hard_frame_pointer_rtx)
7913         offset += cfun->machine->frame.hard_frame_pointer_offset;
7914     }
7915
7916   /* sdbout_parms does not want this to crash for unrecognized cases.  */
7917 #if 0
7918   else if (reg != arg_pointer_rtx)
7919     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
7920                 addr);
7921 #endif
7922
7923   return offset;
7924 }
7925 \f
7926 /* Implement ASM_OUTPUT_EXTERNAL.  */
7927
7928 void
7929 mips_output_external (FILE *file, tree decl, const char *name)
7930 {
7931   default_elf_asm_output_external (file, decl, name);
7932
7933   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7934      set in order to avoid putting out names that are never really
7935      used. */
7936   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
7937     {
7938       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
7939         {
7940           /* When using assembler macros, emit .extern directives for
7941              all small-data externs so that the assembler knows how
7942              big they are.
7943
7944              In most cases it would be safe (though pointless) to emit
7945              .externs for other symbols too.  One exception is when an
7946              object is within the -G limit but declared by the user to
7947              be in a section other than .sbss or .sdata.  */
7948           fputs ("\t.extern\t", file);
7949           assemble_name (file, name);
7950           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
7951                    int_size_in_bytes (TREE_TYPE (decl)));
7952         }
7953     }
7954 }
7955
7956 /* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME.  */
7957
7958 static void
7959 mips_output_filename (FILE *stream, const char *name)
7960 {
7961   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
7962      directives.  */
7963   if (write_symbols == DWARF2_DEBUG)
7964     return;
7965   else if (mips_output_filename_first_time)
7966     {
7967       mips_output_filename_first_time = 0;
7968       num_source_filenames += 1;
7969       current_function_file = name;
7970       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7971       output_quoted_string (stream, name);
7972       putc ('\n', stream);
7973     }
7974   /* If we are emitting stabs, let dbxout.c handle this (except for
7975      the mips_output_filename_first_time case).  */
7976   else if (write_symbols == DBX_DEBUG)
7977     return;
7978   else if (name != current_function_file
7979            && strcmp (name, current_function_file) != 0)
7980     {
7981       num_source_filenames += 1;
7982       current_function_file = name;
7983       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7984       output_quoted_string (stream, name);
7985       putc ('\n', stream);
7986     }
7987 }
7988
7989 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
7990
7991 static void ATTRIBUTE_UNUSED
7992 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
7993 {
7994   switch (size)
7995     {
7996     case 4:
7997       fputs ("\t.dtprelword\t", file);
7998       break;
7999
8000     case 8:
8001       fputs ("\t.dtpreldword\t", file);
8002       break;
8003
8004     default:
8005       gcc_unreachable ();
8006     }
8007   output_addr_const (file, x);
8008   fputs ("+0x8000", file);
8009 }
8010
8011 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
8012
8013 static rtx
8014 mips_dwarf_register_span (rtx reg)
8015 {
8016   rtx high, low;
8017   enum machine_mode mode;
8018
8019   /* By default, GCC maps increasing register numbers to increasing
8020      memory locations, but paired FPRs are always little-endian,
8021      regardless of the prevailing endianness.  */
8022   mode = GET_MODE (reg);
8023   if (FP_REG_P (REGNO (reg))
8024       && TARGET_BIG_ENDIAN
8025       && MAX_FPRS_PER_FMT > 1
8026       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8027     {
8028       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8029       high = mips_subword (reg, true);
8030       low = mips_subword (reg, false);
8031       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8032     }
8033
8034   return NULL_RTX;
8035 }
8036
8037 /* Implement ASM_OUTPUT_ASCII.  */
8038
8039 void
8040 mips_output_ascii (FILE *stream, const char *string, size_t len)
8041 {
8042   size_t i;
8043   int cur_pos;
8044
8045   cur_pos = 17;
8046   fprintf (stream, "\t.ascii\t\"");
8047   for (i = 0; i < len; i++)
8048     {
8049       int c;
8050
8051       c = (unsigned char) string[i];
8052       if (ISPRINT (c))
8053         {
8054           if (c == '\\' || c == '\"')
8055             {
8056               putc ('\\', stream);
8057               cur_pos++;
8058             }
8059           putc (c, stream);
8060           cur_pos++;
8061         }
8062       else
8063         {
8064           fprintf (stream, "\\%03o", c);
8065           cur_pos += 4;
8066         }
8067
8068       if (cur_pos > 72 && i+1 < len)
8069         {
8070           cur_pos = 17;
8071           fprintf (stream, "\"\n\t.ascii\t\"");
8072         }
8073     }
8074   fprintf (stream, "\"\n");
8075 }
8076
8077 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
8078    macros, mark the symbol as written so that mips_asm_output_external
8079    won't emit an .extern for it.  STREAM is the output file, NAME is the
8080    name of the symbol, INIT_STRING is the string that should be written
8081    before the symbol and FINAL_STRING is the string that should be
8082    written after it.  FINAL_STRING is a printf format that consumes the
8083    remaining arguments.  */
8084
8085 void
8086 mips_declare_object (FILE *stream, const char *name, const char *init_string,
8087                      const char *final_string, ...)
8088 {
8089   va_list ap;
8090
8091   fputs (init_string, stream);
8092   assemble_name (stream, name);
8093   va_start (ap, final_string);
8094   vfprintf (stream, final_string, ap);
8095   va_end (ap);
8096
8097   if (!TARGET_EXPLICIT_RELOCS)
8098     {
8099       tree name_tree = get_identifier (name);
8100       TREE_ASM_WRITTEN (name_tree) = 1;
8101     }
8102 }
8103
8104 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8105    NAME is the name of the object and ALIGN is the required alignment
8106    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
8107    alignment argument.  */
8108
8109 void
8110 mips_declare_common_object (FILE *stream, const char *name,
8111                             const char *init_string,
8112                             unsigned HOST_WIDE_INT size,
8113                             unsigned int align, bool takes_alignment_p)
8114 {
8115   if (!takes_alignment_p)
8116     {
8117       size += (align / BITS_PER_UNIT) - 1;
8118       size -= size % (align / BITS_PER_UNIT);
8119       mips_declare_object (stream, name, init_string,
8120                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8121     }
8122   else
8123     mips_declare_object (stream, name, init_string,
8124                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8125                          size, align / BITS_PER_UNIT);
8126 }
8127
8128 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
8129    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
8130
8131 void
8132 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8133                                  unsigned HOST_WIDE_INT size,
8134                                  unsigned int align)
8135 {
8136   /* If the target wants uninitialized const declarations in
8137      .rdata then don't put them in .comm.  */
8138   if (TARGET_EMBEDDED_DATA
8139       && TARGET_UNINIT_CONST_IN_RODATA
8140       && TREE_CODE (decl) == VAR_DECL
8141       && TREE_READONLY (decl)
8142       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8143     {
8144       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8145         targetm.asm_out.globalize_label (stream, name);
8146
8147       switch_to_section (readonly_data_section);
8148       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8149       mips_declare_object (stream, name, "",
8150                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8151                            size);
8152     }
8153   else
8154     mips_declare_common_object (stream, name, "\n\t.comm\t",
8155                                 size, align, true);
8156 }
8157
8158 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8159 extern int size_directive_output;
8160
8161 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
8162    definitions except that it uses mips_declare_object to emit the label.  */
8163
8164 void
8165 mips_declare_object_name (FILE *stream, const char *name,
8166                           tree decl ATTRIBUTE_UNUSED)
8167 {
8168 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8169   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8170 #endif
8171
8172   size_directive_output = 0;
8173   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8174     {
8175       HOST_WIDE_INT size;
8176
8177       size_directive_output = 1;
8178       size = int_size_in_bytes (TREE_TYPE (decl));
8179       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8180     }
8181
8182   mips_declare_object (stream, name, "", ":\n");
8183 }
8184
8185 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
8186
8187 void
8188 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8189 {
8190   const char *name;
8191
8192   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8193   if (!flag_inhibit_size_directive
8194       && DECL_SIZE (decl) != 0
8195       && !at_end
8196       && top_level
8197       && DECL_INITIAL (decl) == error_mark_node
8198       && !size_directive_output)
8199     {
8200       HOST_WIDE_INT size;
8201
8202       size_directive_output = 1;
8203       size = int_size_in_bytes (TREE_TYPE (decl));
8204       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8205     }
8206 }
8207 #endif
8208 \f
8209 /* Return the FOO in the name of the ".mdebug.FOO" section associated
8210    with the current ABI.  */
8211
8212 static const char *
8213 mips_mdebug_abi_name (void)
8214 {
8215   switch (mips_abi)
8216     {
8217     case ABI_32:
8218       return "abi32";
8219     case ABI_O64:
8220       return "abiO64";
8221     case ABI_N32:
8222       return "abiN32";
8223     case ABI_64:
8224       return "abi64";
8225     case ABI_EABI:
8226       return TARGET_64BIT ? "eabi64" : "eabi32";
8227     default:
8228       gcc_unreachable ();
8229     }
8230 }
8231
8232 /* Implement TARGET_ASM_FILE_START.  */
8233
8234 static void
8235 mips_file_start (void)
8236 {
8237   default_file_start ();
8238
8239   /* Generate a special section to describe the ABI switches used to
8240      produce the resultant binary.  This is unnecessary on IRIX and
8241      causes unwanted warnings from the native linker.  */
8242   if (!TARGET_IRIX6)
8243     {
8244       /* Record the ABI itself.  Modern versions of binutils encode
8245          this information in the ELF header flags, but GDB needs the
8246          information in order to correctly debug binaries produced by
8247          older binutils.  See the function mips_gdbarch_init in
8248          gdb/mips-tdep.c.  */
8249       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8250                mips_mdebug_abi_name ());
8251
8252       /* There is no ELF header flag to distinguish long32 forms of the
8253          EABI from long64 forms.  Emit a special section to help tools
8254          such as GDB.  Do the same for o64, which is sometimes used with
8255          -mlong64.  */
8256       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8257         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8258                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8259
8260 #ifdef HAVE_AS_GNU_ATTRIBUTE
8261       {
8262         int attr;
8263
8264         /* No floating-point operations, -mno-float.  */
8265         if (TARGET_NO_FLOAT)
8266           attr = 0;
8267         /* Soft-float code, -msoft-float.  */
8268         else if (!TARGET_HARD_FLOAT_ABI)
8269           attr = 3;
8270         /* Single-float code, -msingle-float.  */
8271         else if (!TARGET_DOUBLE_FLOAT)
8272           attr = 2;
8273         /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.  */
8274         else if (!TARGET_64BIT && TARGET_FLOAT64)
8275           attr = 4;
8276         /* Regular FP code, FP regs same size as GP regs, -mdouble-float.  */
8277         else
8278           attr = 1;
8279
8280         fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
8281       }
8282 #endif
8283     }
8284
8285   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
8286   if (TARGET_ABICALLS)
8287     {
8288       fprintf (asm_out_file, "\t.abicalls\n");
8289       if (TARGET_ABICALLS_PIC0)
8290         fprintf (asm_out_file, "\t.option\tpic0\n");
8291     }
8292
8293   if (flag_verbose_asm)
8294     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
8295              ASM_COMMENT_START,
8296              mips_small_data_threshold, mips_arch_info->name, mips_isa);
8297 }
8298 \f
8299 /* Make the last instruction frame-related and note that it performs
8300    the operation described by FRAME_PATTERN.  */
8301
8302 static void
8303 mips_set_frame_expr (rtx frame_pattern)
8304 {
8305   rtx insn;
8306
8307   insn = get_last_insn ();
8308   RTX_FRAME_RELATED_P (insn) = 1;
8309   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8310                                       frame_pattern,
8311                                       REG_NOTES (insn));
8312 }
8313
8314 /* Return a frame-related rtx that stores REG at MEM.
8315    REG must be a single register.  */
8316
8317 static rtx
8318 mips_frame_set (rtx mem, rtx reg)
8319 {
8320   rtx set;
8321
8322   /* If we're saving the return address register and the DWARF return
8323      address column differs from the hard register number, adjust the
8324      note reg to refer to the former.  */
8325   if (REGNO (reg) == RETURN_ADDR_REGNUM
8326       && DWARF_FRAME_RETURN_COLUMN != RETURN_ADDR_REGNUM)
8327     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
8328
8329   set = gen_rtx_SET (VOIDmode, mem, reg);
8330   RTX_FRAME_RELATED_P (set) = 1;
8331
8332   return set;
8333 }
8334 \f
8335 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
8336    mips16e_s2_s8_regs[X], it must also save the registers in indexes
8337    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
8338 static const unsigned char mips16e_s2_s8_regs[] = {
8339   30, 23, 22, 21, 20, 19, 18
8340 };
8341 static const unsigned char mips16e_a0_a3_regs[] = {
8342   4, 5, 6, 7
8343 };
8344
8345 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
8346    ordered from the uppermost in memory to the lowest in memory.  */
8347 static const unsigned char mips16e_save_restore_regs[] = {
8348   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
8349 };
8350
8351 /* Return the index of the lowest X in the range [0, SIZE) for which
8352    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
8353
8354 static unsigned int
8355 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
8356                              unsigned int size)
8357 {
8358   unsigned int i;
8359
8360   for (i = 0; i < size; i++)
8361     if (BITSET_P (mask, regs[i]))
8362       break;
8363
8364   return i;
8365 }
8366
8367 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
8368    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
8369    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
8370    is true for all indexes (X, SIZE).  */
8371
8372 static void
8373 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
8374                         unsigned int size, unsigned int *num_regs_ptr)
8375 {
8376   unsigned int i;
8377
8378   i = mips16e_find_first_register (*mask_ptr, regs, size);
8379   for (i++; i < size; i++)
8380     if (!BITSET_P (*mask_ptr, regs[i]))
8381       {
8382         *num_regs_ptr += 1;
8383         *mask_ptr |= 1 << regs[i];
8384       }
8385 }
8386
8387 /* Return a simplified form of X using the register values in REG_VALUES.
8388    REG_VALUES[R] is the last value assigned to hard register R, or null
8389    if R has not been modified.
8390
8391    This function is rather limited, but is good enough for our purposes.  */
8392
8393 static rtx
8394 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
8395 {
8396   x = avoid_constant_pool_reference (x);
8397
8398   if (UNARY_P (x))
8399     {
8400       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8401       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
8402                                  x0, GET_MODE (XEXP (x, 0)));
8403     }
8404
8405   if (ARITHMETIC_P (x))
8406     {
8407       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8408       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
8409       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
8410     }
8411
8412   if (REG_P (x)
8413       && reg_values[REGNO (x)]
8414       && !rtx_unstable_p (reg_values[REGNO (x)]))
8415     return reg_values[REGNO (x)];
8416
8417   return x;
8418 }
8419
8420 /* Return true if (set DEST SRC) stores an argument register into its
8421    caller-allocated save slot, storing the number of that argument
8422    register in *REGNO_PTR if so.  REG_VALUES is as for
8423    mips16e_collect_propagate_value.  */
8424
8425 static bool
8426 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
8427                                  unsigned int *regno_ptr)
8428 {
8429   unsigned int argno, regno;
8430   HOST_WIDE_INT offset, required_offset;
8431   rtx addr, base;
8432
8433   /* Check that this is a word-mode store.  */
8434   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
8435     return false;
8436
8437   /* Check that the register being saved is an unmodified argument
8438      register.  */
8439   regno = REGNO (src);
8440   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
8441     return false;
8442   argno = regno - GP_ARG_FIRST;
8443
8444   /* Check whether the address is an appropriate stack-pointer or
8445      frame-pointer access.  */
8446   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
8447   mips_split_plus (addr, &base, &offset);
8448   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
8449   if (base == hard_frame_pointer_rtx)
8450     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
8451   else if (base != stack_pointer_rtx)
8452     return false;
8453   if (offset != required_offset)
8454     return false;
8455
8456   *regno_ptr = regno;
8457   return true;
8458 }
8459
8460 /* A subroutine of mips_expand_prologue, called only when generating
8461    MIPS16e SAVE instructions.  Search the start of the function for any
8462    instructions that save argument registers into their caller-allocated
8463    save slots.  Delete such instructions and return a value N such that
8464    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
8465    instructions redundant.  */
8466
8467 static unsigned int
8468 mips16e_collect_argument_saves (void)
8469 {
8470   rtx reg_values[FIRST_PSEUDO_REGISTER];
8471   rtx insn, next, set, dest, src;
8472   unsigned int nargs, regno;
8473
8474   push_topmost_sequence ();
8475   nargs = 0;
8476   memset (reg_values, 0, sizeof (reg_values));
8477   for (insn = get_insns (); insn; insn = next)
8478     {
8479       next = NEXT_INSN (insn);
8480       if (NOTE_P (insn) || DEBUG_INSN_P (insn))
8481         continue;
8482
8483       if (!INSN_P (insn))
8484         break;
8485
8486       set = PATTERN (insn);
8487       if (GET_CODE (set) != SET)
8488         break;
8489
8490       dest = SET_DEST (set);
8491       src = SET_SRC (set);
8492       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
8493         {
8494           if (!BITSET_P (cfun->machine->frame.mask, regno))
8495             {
8496               delete_insn (insn);
8497               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
8498             }
8499         }
8500       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
8501         reg_values[REGNO (dest)]
8502           = mips16e_collect_propagate_value (src, reg_values);
8503       else
8504         break;
8505     }
8506   pop_topmost_sequence ();
8507
8508   return nargs;
8509 }
8510
8511 /* Return a move between register REGNO and memory location SP + OFFSET.
8512    Make the move a load if RESTORE_P, otherwise make it a frame-related
8513    store.  */
8514
8515 static rtx
8516 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
8517                           unsigned int regno)
8518 {
8519   rtx reg, mem;
8520
8521   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
8522   reg = gen_rtx_REG (SImode, regno);
8523   return (restore_p
8524           ? gen_rtx_SET (VOIDmode, reg, mem)
8525           : mips_frame_set (mem, reg));
8526 }
8527
8528 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
8529    The instruction must:
8530
8531      - Allocate or deallocate SIZE bytes in total; SIZE is known
8532        to be nonzero.
8533
8534      - Save or restore as many registers in *MASK_PTR as possible.
8535        The instruction saves the first registers at the top of the
8536        allocated area, with the other registers below it.
8537
8538      - Save NARGS argument registers above the allocated area.
8539
8540    (NARGS is always zero if RESTORE_P.)
8541
8542    The SAVE and RESTORE instructions cannot save and restore all general
8543    registers, so there may be some registers left over for the caller to
8544    handle.  Destructively modify *MASK_PTR so that it contains the registers
8545    that still need to be saved or restored.  The caller can save these
8546    registers in the memory immediately below *OFFSET_PTR, which is a
8547    byte offset from the bottom of the allocated stack area.  */
8548
8549 static rtx
8550 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
8551                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
8552                             HOST_WIDE_INT size)
8553 {
8554   rtx pattern, set;
8555   HOST_WIDE_INT offset, top_offset;
8556   unsigned int i, regno;
8557   int n;
8558
8559   gcc_assert (cfun->machine->frame.num_fp == 0);
8560
8561   /* Calculate the number of elements in the PARALLEL.  We need one element
8562      for the stack adjustment, one for each argument register save, and one
8563      for each additional register move.  */
8564   n = 1 + nargs;
8565   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8566     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
8567       n++;
8568
8569   /* Create the final PARALLEL.  */
8570   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
8571   n = 0;
8572
8573   /* Add the stack pointer adjustment.  */
8574   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8575                      plus_constant (stack_pointer_rtx,
8576                                     restore_p ? size : -size));
8577   RTX_FRAME_RELATED_P (set) = 1;
8578   XVECEXP (pattern, 0, n++) = set;
8579
8580   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8581   top_offset = restore_p ? size : 0;
8582
8583   /* Save the arguments.  */
8584   for (i = 0; i < nargs; i++)
8585     {
8586       offset = top_offset + i * UNITS_PER_WORD;
8587       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
8588       XVECEXP (pattern, 0, n++) = set;
8589     }
8590
8591   /* Then fill in the other register moves.  */
8592   offset = top_offset;
8593   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8594     {
8595       regno = mips16e_save_restore_regs[i];
8596       if (BITSET_P (*mask_ptr, regno))
8597         {
8598           offset -= UNITS_PER_WORD;
8599           set = mips16e_save_restore_reg (restore_p, offset, regno);
8600           XVECEXP (pattern, 0, n++) = set;
8601           *mask_ptr &= ~(1 << regno);
8602         }
8603     }
8604
8605   /* Tell the caller what offset it should use for the remaining registers.  */
8606   *offset_ptr = size + (offset - top_offset);
8607
8608   gcc_assert (n == XVECLEN (pattern, 0));
8609
8610   return pattern;
8611 }
8612
8613 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
8614    pointer.  Return true if PATTERN matches the kind of instruction
8615    generated by mips16e_build_save_restore.  If INFO is nonnull,
8616    initialize it when returning true.  */
8617
8618 bool
8619 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
8620                                 struct mips16e_save_restore_info *info)
8621 {
8622   unsigned int i, nargs, mask, extra;
8623   HOST_WIDE_INT top_offset, save_offset, offset;
8624   rtx set, reg, mem, base;
8625   int n;
8626
8627   if (!GENERATE_MIPS16E_SAVE_RESTORE)
8628     return false;
8629
8630   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8631   top_offset = adjust > 0 ? adjust : 0;
8632
8633   /* Interpret all other members of the PARALLEL.  */
8634   save_offset = top_offset - UNITS_PER_WORD;
8635   mask = 0;
8636   nargs = 0;
8637   i = 0;
8638   for (n = 1; n < XVECLEN (pattern, 0); n++)
8639     {
8640       /* Check that we have a SET.  */
8641       set = XVECEXP (pattern, 0, n);
8642       if (GET_CODE (set) != SET)
8643         return false;
8644
8645       /* Check that the SET is a load (if restoring) or a store
8646          (if saving).  */
8647       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
8648       if (!MEM_P (mem))
8649         return false;
8650
8651       /* Check that the address is the sum of the stack pointer and a
8652          possibly-zero constant offset.  */
8653       mips_split_plus (XEXP (mem, 0), &base, &offset);
8654       if (base != stack_pointer_rtx)
8655         return false;
8656
8657       /* Check that SET's other operand is a register.  */
8658       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
8659       if (!REG_P (reg))
8660         return false;
8661
8662       /* Check for argument saves.  */
8663       if (offset == top_offset + nargs * UNITS_PER_WORD
8664           && REGNO (reg) == GP_ARG_FIRST + nargs)
8665         nargs++;
8666       else if (offset == save_offset)
8667         {
8668           while (mips16e_save_restore_regs[i++] != REGNO (reg))
8669             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
8670               return false;
8671
8672           mask |= 1 << REGNO (reg);
8673           save_offset -= UNITS_PER_WORD;
8674         }
8675       else
8676         return false;
8677     }
8678
8679   /* Check that the restrictions on register ranges are met.  */
8680   extra = 0;
8681   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
8682                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
8683   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
8684                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
8685   if (extra != 0)
8686     return false;
8687
8688   /* Make sure that the topmost argument register is not saved twice.
8689      The checks above ensure that the same is then true for the other
8690      argument registers.  */
8691   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
8692     return false;
8693
8694   /* Pass back information, if requested.  */
8695   if (info)
8696     {
8697       info->nargs = nargs;
8698       info->mask = mask;
8699       info->size = (adjust > 0 ? adjust : -adjust);
8700     }
8701
8702   return true;
8703 }
8704
8705 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
8706    for the register range [MIN_REG, MAX_REG].  Return a pointer to
8707    the null terminator.  */
8708
8709 static char *
8710 mips16e_add_register_range (char *s, unsigned int min_reg,
8711                             unsigned int max_reg)
8712 {
8713   if (min_reg != max_reg)
8714     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
8715   else
8716     s += sprintf (s, ",%s", reg_names[min_reg]);
8717   return s;
8718 }
8719
8720 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
8721    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
8722
8723 const char *
8724 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
8725 {
8726   static char buffer[300];
8727
8728   struct mips16e_save_restore_info info;
8729   unsigned int i, end;
8730   char *s;
8731
8732   /* Parse the pattern.  */
8733   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
8734     gcc_unreachable ();
8735
8736   /* Add the mnemonic.  */
8737   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
8738   s += strlen (s);
8739
8740   /* Save the arguments.  */
8741   if (info.nargs > 1)
8742     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
8743                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
8744   else if (info.nargs == 1)
8745     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
8746
8747   /* Emit the amount of stack space to allocate or deallocate.  */
8748   s += sprintf (s, "%d", (int) info.size);
8749
8750   /* Save or restore $16.  */
8751   if (BITSET_P (info.mask, 16))
8752     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
8753
8754   /* Save or restore $17.  */
8755   if (BITSET_P (info.mask, 17))
8756     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
8757
8758   /* Save or restore registers in the range $s2...$s8, which
8759      mips16e_s2_s8_regs lists in decreasing order.  Note that this
8760      is a software register range; the hardware registers are not
8761      numbered consecutively.  */
8762   end = ARRAY_SIZE (mips16e_s2_s8_regs);
8763   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
8764   if (i < end)
8765     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
8766                                     mips16e_s2_s8_regs[i]);
8767
8768   /* Save or restore registers in the range $a0...$a3.  */
8769   end = ARRAY_SIZE (mips16e_a0_a3_regs);
8770   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
8771   if (i < end)
8772     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
8773                                     mips16e_a0_a3_regs[end - 1]);
8774
8775   /* Save or restore $31.  */
8776   if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
8777     s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
8778
8779   return buffer;
8780 }
8781 \f
8782 /* Return true if the current function returns its value in a floating-point
8783    register in MIPS16 mode.  */
8784
8785 static bool
8786 mips16_cfun_returns_in_fpr_p (void)
8787 {
8788   tree return_type = DECL_RESULT (current_function_decl);
8789   return (TARGET_MIPS16
8790           && TARGET_HARD_FLOAT_ABI
8791           && !aggregate_value_p (return_type, current_function_decl)
8792           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
8793 }
8794
8795 /* Return true if predicate PRED is true for at least one instruction.
8796    Cache the result in *CACHE, and assume that the result is true
8797    if *CACHE is already true.  */
8798
8799 static bool
8800 mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
8801 {
8802   rtx insn;
8803
8804   if (!*cache)
8805     {
8806       push_topmost_sequence ();
8807       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8808         if (USEFUL_INSN_P (insn) && pred (insn))
8809           {
8810             *cache = true;
8811             break;
8812           }
8813       pop_topmost_sequence ();
8814     }
8815   return *cache;
8816 }
8817
8818 /* Return true if INSN refers to the global pointer in an "inflexible" way.
8819    See mips_cfun_has_inflexible_gp_ref_p for details.  */
8820
8821 static bool
8822 mips_insn_has_inflexible_gp_ref_p (rtx insn)
8823 {
8824   /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
8825      indicate that the target could be a traditional MIPS
8826      lazily-binding stub.  */
8827   return find_reg_fusage (insn, USE, pic_offset_table_rtx);
8828 }
8829
8830 /* Return true if the current function refers to the global pointer
8831    in a way that forces $28 to be valid.  This means that we can't
8832    change the choice of global pointer, even for NewABI code.
8833
8834    One example of this (and one which needs several checks) is that
8835    $28 must be valid when calling traditional MIPS lazy-binding stubs.
8836    (This restriction does not apply to PLTs.)  */
8837
8838 static bool
8839 mips_cfun_has_inflexible_gp_ref_p (void)
8840 {
8841   /* If the function has a nonlocal goto, $28 must hold the correct
8842      global pointer for the target function.  That is, the target
8843      of the goto implicitly uses $28.  */
8844   if (crtl->has_nonlocal_goto)
8845     return true;
8846
8847   if (TARGET_ABICALLS_PIC2)
8848     {
8849       /* Symbolic accesses implicitly use the global pointer unless
8850          -mexplicit-relocs is in effect.  JAL macros to symbolic addresses
8851          might go to traditional MIPS lazy-binding stubs.  */
8852       if (!TARGET_EXPLICIT_RELOCS)
8853         return true;
8854
8855       /* FUNCTION_PROFILER includes a JAL to _mcount, which again
8856          can be lazily-bound.  */
8857       if (crtl->profile)
8858         return true;
8859
8860       /* MIPS16 functions that return in FPRs need to call an
8861          external libgcc routine.  This call is only made explict
8862          during mips_expand_epilogue, and it too might be lazily bound.  */
8863       if (mips16_cfun_returns_in_fpr_p ())
8864         return true;
8865     }
8866
8867   return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
8868                            mips_insn_has_inflexible_gp_ref_p);
8869 }
8870
8871 /* Return true if INSN refers to the global pointer in a "flexible" way.
8872    See mips_cfun_has_flexible_gp_ref_p for details.  */
8873
8874 static bool
8875 mips_insn_has_flexible_gp_ref_p (rtx insn)
8876 {
8877   return (get_attr_got (insn) != GOT_UNSET
8878           || mips_small_data_pattern_p (PATTERN (insn))
8879           || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
8880 }
8881
8882 /* Return true if the current function references the global pointer,
8883    but if those references do not inherently require the global pointer
8884    to be $28.  Assume !mips_cfun_has_inflexible_gp_ref_p ().  */
8885
8886 static bool
8887 mips_cfun_has_flexible_gp_ref_p (void)
8888 {
8889   /* Reload can sometimes introduce constant pool references
8890      into a function that otherwise didn't need them.  For example,
8891      suppose we have an instruction like:
8892
8893         (set (reg:DF R1) (float:DF (reg:SI R2)))
8894
8895      If R2 turns out to be a constant such as 1, the instruction may
8896      have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
8897      the option of using this constant if R2 doesn't get allocated
8898      to a register.
8899
8900      In cases like these, reload will have added the constant to the
8901      pool but no instruction will yet refer to it.  */
8902   if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
8903     return true;
8904
8905   return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
8906                            mips_insn_has_flexible_gp_ref_p);
8907 }
8908
8909 /* Return the register that should be used as the global pointer
8910    within this function.  Return INVALID_REGNUM if the function
8911    doesn't need a global pointer.  */
8912
8913 static unsigned int
8914 mips_global_pointer (void)
8915 {
8916   unsigned int regno;
8917
8918   /* $gp is always available unless we're using a GOT.  */
8919   if (!TARGET_USE_GOT)
8920     return GLOBAL_POINTER_REGNUM;
8921
8922   /* If there are inflexible references to $gp, we must use the
8923      standard register.  */
8924   if (mips_cfun_has_inflexible_gp_ref_p ())
8925     return GLOBAL_POINTER_REGNUM;
8926
8927   /* If there are no current references to $gp, then the only uses
8928      we can introduce later are those involved in long branches.  */
8929   if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
8930     return INVALID_REGNUM;
8931
8932   /* If the global pointer is call-saved, try to use a call-clobbered
8933      alternative.  */
8934   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
8935     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
8936       if (!df_regs_ever_live_p (regno)
8937           && call_really_used_regs[regno]
8938           && !fixed_regs[regno]
8939           && regno != PIC_FUNCTION_ADDR_REGNUM)
8940         return regno;
8941
8942   return GLOBAL_POINTER_REGNUM;
8943 }
8944
8945 /* Return true if the current function's prologue must load the global
8946    pointer value into pic_offset_table_rtx and store the same value in
8947    the function's cprestore slot (if any).
8948
8949    One problem we have to deal with is that, when emitting GOT-based
8950    position independent code, long-branch sequences will need to load
8951    the address of the branch target from the GOT.  We don't know until
8952    the very end of compilation whether (and where) the function needs
8953    long branches, so we must ensure that _any_ branch can access the
8954    global pointer in some form.  However, we do not want to pessimize
8955    the usual case in which all branches are short.
8956
8957    We handle this as follows:
8958
8959    (1) During reload, we set cfun->machine->global_pointer to
8960        INVALID_REGNUM if we _know_ that the current function
8961        doesn't need a global pointer.  This is only valid if
8962        long branches don't need the GOT.
8963
8964        Otherwise, we assume that we might need a global pointer
8965        and pick an appropriate register.
8966
8967    (2) If cfun->machine->global_pointer != INVALID_REGNUM,
8968        we ensure that the global pointer is available at every
8969        block boundary bar entry and exit.  We do this in one of two ways:
8970
8971        - If the function has a cprestore slot, we ensure that this
8972          slot is valid at every branch.  However, as explained in
8973          point (6) below, there is no guarantee that pic_offset_table_rtx
8974          itself is valid if new uses of the global pointer are introduced
8975          after the first post-epilogue split.
8976
8977          We guarantee that the cprestore slot is valid by loading it
8978          into a fake register, CPRESTORE_SLOT_REGNUM.  We then make
8979          this register live at every block boundary bar function entry
8980          and exit.  It is then invalid to move the load (and thus the
8981          preceding store) across a block boundary.
8982
8983        - If the function has no cprestore slot, we guarantee that
8984          pic_offset_table_rtx itself is valid at every branch.
8985
8986        See mips_eh_uses for the handling of the register liveness.
8987
8988    (3) During prologue and epilogue generation, we emit "ghost"
8989        placeholder instructions to manipulate the global pointer.
8990
8991    (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
8992        and cfun->machine->must_restore_gp_when_clobbered_p if we already know
8993        that the function needs a global pointer.  (There is no need to set
8994        them earlier than this, and doing it as late as possible leads to
8995        fewer false positives.)
8996
8997    (5) If cfun->machine->must_initialize_gp_p is true during a
8998        split_insns pass, we split the ghost instructions into real
8999        instructions.  These split instructions can then be optimized in
9000        the usual way.  Otherwise, we keep the ghost instructions intact,
9001        and optimize for the case where they aren't needed.  We still
9002        have the option of splitting them later, if we need to introduce
9003        new uses of the global pointer.
9004
9005        For example, the scheduler ignores a ghost instruction that
9006        stores $28 to the stack, but it handles the split form of
9007        the ghost instruction as an ordinary store.
9008
9009    (6) [OldABI only.]  If cfun->machine->must_restore_gp_when_clobbered_p
9010        is true during the first post-epilogue split_insns pass, we split
9011        calls and restore_gp patterns into instructions that explicitly
9012        load pic_offset_table_rtx from the cprestore slot.  Otherwise,
9013        we split these patterns into instructions that _don't_ load from
9014        the cprestore slot.
9015
9016        If cfun->machine->must_restore_gp_when_clobbered_p is true at the
9017        time of the split, then any instructions that exist at that time
9018        can make free use of pic_offset_table_rtx.  However, if we want
9019        to introduce new uses of the global pointer after the split,
9020        we must explicitly load the value from the cprestore slot, since
9021        pic_offset_table_rtx itself might not be valid at a given point
9022        in the function.
9023
9024        The idea is that we want to be able to delete redundant
9025        loads from the cprestore slot in the usual case where no
9026        long branches are needed.
9027
9028    (7) If cfun->machine->must_initialize_gp_p is still false at the end
9029        of md_reorg, we decide whether the global pointer is needed for
9030        long branches.  If so, we set cfun->machine->must_initialize_gp_p
9031        to true and split the ghost instructions into real instructions
9032        at that stage.
9033
9034    Note that the ghost instructions must have a zero length for three reasons:
9035
9036    - Giving the length of the underlying $gp sequence might cause
9037      us to use long branches in cases where they aren't really needed.
9038
9039    - They would perturb things like alignment calculations.
9040
9041    - More importantly, the hazard detection in md_reorg relies on
9042      empty instructions having a zero length.
9043
9044    If we find a long branch and split the ghost instructions at the
9045    end of md_reorg, the split could introduce more long branches.
9046    That isn't a problem though, because we still do the split before
9047    the final shorten_branches pass.
9048
9049    This is extremely ugly, but it seems like the best compromise between
9050    correctness and efficiency.  */
9051
9052 bool
9053 mips_must_initialize_gp_p (void)
9054 {
9055   return cfun->machine->must_initialize_gp_p;
9056 }
9057
9058 /* Return true if REGNO is a register that is ordinarily call-clobbered
9059    but must nevertheless be preserved by an interrupt handler.  */
9060
9061 static bool
9062 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
9063 {
9064   if (MD_REG_P (regno))
9065     return true;
9066
9067   if (TARGET_DSP && DSP_ACC_REG_P (regno))
9068     return true;
9069
9070   if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
9071     {
9072       /* $0 is hard-wired.  */
9073       if (regno == GP_REG_FIRST)
9074         return false;
9075
9076       /* The interrupt handler can treat kernel registers as
9077          scratch registers.  */
9078       if (KERNEL_REG_P (regno))
9079         return false;
9080
9081       /* The function will return the stack pointer to its original value
9082          anyway.  */
9083       if (regno == STACK_POINTER_REGNUM)
9084         return false;
9085
9086       /* Otherwise, return true for registers that aren't ordinarily
9087          call-clobbered.  */
9088       return call_really_used_regs[regno];
9089     }
9090
9091   return false;
9092 }
9093
9094 /* Return true if the current function should treat register REGNO
9095    as call-saved.  */
9096
9097 static bool
9098 mips_cfun_call_saved_reg_p (unsigned int regno)
9099 {
9100   /* Interrupt handlers need to save extra registers.  */
9101   if (cfun->machine->interrupt_handler_p
9102       && mips_interrupt_extra_call_saved_reg_p (regno))
9103     return true;
9104
9105   /* call_insns preserve $28 unless they explicitly say otherwise,
9106      so call_really_used_regs[] treats $28 as call-saved.  However,
9107      we want the ABI property rather than the default call_insn
9108      property here.  */
9109   return (regno == GLOBAL_POINTER_REGNUM
9110           ? TARGET_CALL_SAVED_GP
9111           : !call_really_used_regs[regno]);
9112 }
9113
9114 /* Return true if the function body might clobber register REGNO.
9115    We know that REGNO is call-saved.  */
9116
9117 static bool
9118 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9119 {
9120   /* Some functions should be treated as clobbering all call-saved
9121      registers.  */
9122   if (crtl->saves_all_registers)
9123     return true;
9124
9125   /* DF handles cases where a register is explicitly referenced in
9126      the rtl.  Incoming values are passed in call-clobbered registers,
9127      so we can assume that any live call-saved register is set within
9128      the function.  */
9129   if (df_regs_ever_live_p (regno))
9130     return true;
9131
9132   /* Check for registers that are clobbered by FUNCTION_PROFILER.
9133      These clobbers are not explicit in the rtl.  */
9134   if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9135     return true;
9136
9137   /* If we're using a call-saved global pointer, the function's
9138      prologue will need to set it up.  */
9139   if (cfun->machine->global_pointer == regno)
9140     return true;
9141
9142   /* The function's prologue will need to set the frame pointer if
9143      frame_pointer_needed.  */
9144   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9145     return true;
9146
9147   /* If a MIPS16 function returns a value in FPRs, its epilogue
9148      will need to call an external libgcc routine.  This yet-to-be
9149      generated call_insn will clobber $31.  */
9150   if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9151     return true;
9152
9153   /* If REGNO is ordinarily call-clobbered, we must assume that any
9154      called function could modify it.  */
9155   if (cfun->machine->interrupt_handler_p
9156       && !current_function_is_leaf
9157       && mips_interrupt_extra_call_saved_reg_p (regno))
9158     return true;
9159
9160   return false;
9161 }
9162
9163 /* Return true if the current function must save register REGNO.  */
9164
9165 static bool
9166 mips_save_reg_p (unsigned int regno)
9167 {
9168   if (mips_cfun_call_saved_reg_p (regno))
9169     {
9170       if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9171         return true;
9172
9173       /* Save both registers in an FPR pair if either one is used.  This is
9174          needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9175          register to be used without the even register.  */
9176       if (FP_REG_P (regno)
9177           && MAX_FPRS_PER_FMT == 2
9178           && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9179         return true;
9180     }
9181
9182   /* We need to save the incoming return address if __builtin_eh_return
9183      is being used to set a different return address.  */
9184   if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9185     return true;
9186
9187   return false;
9188 }
9189
9190 /* Populate the current function's mips_frame_info structure.
9191
9192    MIPS stack frames look like:
9193
9194         +-------------------------------+
9195         |                               |
9196         |  incoming stack arguments     |
9197         |                               |
9198         +-------------------------------+
9199         |                               |
9200         |  caller-allocated save area   |
9201       A |  for register arguments       |
9202         |                               |
9203         +-------------------------------+ <-- incoming stack pointer
9204         |                               |
9205         |  callee-allocated save area   |
9206       B |  for arguments that are       |
9207         |  split between registers and  |
9208         |  the stack                    |
9209         |                               |
9210         +-------------------------------+ <-- arg_pointer_rtx
9211         |                               |
9212       C |  callee-allocated save area   |
9213         |  for register varargs         |
9214         |                               |
9215         +-------------------------------+ <-- frame_pointer_rtx
9216         |                               |       + cop0_sp_offset
9217         |  COP0 reg save area           |       + UNITS_PER_WORD
9218         |                               |
9219         +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9220         |                               |       + UNITS_PER_WORD
9221         |  accumulator save area        |
9222         |                               |
9223         +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9224         |                               |       + UNITS_PER_HWFPVALUE
9225         |  FPR save area                |
9226         |                               |
9227         +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9228         |                               |       + UNITS_PER_WORD
9229         |  GPR save area                |
9230         |                               |
9231         +-------------------------------+ <-- frame_pointer_rtx with
9232         |                               | \     -fstack-protector
9233         |  local variables              |  | var_size
9234         |                               | /
9235         +-------------------------------+
9236         |                               | \
9237         |  $gp save area                |  | cprestore_size
9238         |                               | /
9239       P +-------------------------------+ <-- hard_frame_pointer_rtx for
9240         |                               | \     MIPS16 code
9241         |  outgoing stack arguments     |  |
9242         |                               |  |
9243         +-------------------------------+  | args_size
9244         |                               |  |
9245         |  caller-allocated save area   |  |
9246         |  for register arguments       |  |
9247         |                               | /
9248         +-------------------------------+ <-- stack_pointer_rtx
9249                                               frame_pointer_rtx without
9250                                                 -fstack-protector
9251                                               hard_frame_pointer_rtx for
9252                                                 non-MIPS16 code.
9253
9254    At least two of A, B and C will be empty.
9255
9256    Dynamic stack allocations such as alloca insert data at point P.
9257    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
9258    hard_frame_pointer_rtx unchanged.  */
9259
9260 static void
9261 mips_compute_frame_info (void)
9262 {
9263   struct mips_frame_info *frame;
9264   HOST_WIDE_INT offset, size;
9265   unsigned int regno, i;
9266
9267   /* Set this function's interrupt properties.  */
9268   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
9269     {
9270       if (!ISA_MIPS32R2)
9271         error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
9272       else if (TARGET_HARD_FLOAT)
9273         error ("the %<interrupt%> attribute requires %<-msoft-float%>");
9274       else if (TARGET_MIPS16)
9275         error ("interrupt handlers cannot be MIPS16 functions");
9276       else
9277         {
9278           cfun->machine->interrupt_handler_p = true;
9279           cfun->machine->use_shadow_register_set_p =
9280             mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
9281           cfun->machine->keep_interrupts_masked_p =
9282             mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
9283           cfun->machine->use_debug_exception_return_p =
9284             mips_use_debug_exception_return_p (TREE_TYPE
9285                                                (current_function_decl));
9286         }
9287     }
9288
9289   frame = &cfun->machine->frame;
9290   memset (frame, 0, sizeof (*frame));
9291   size = get_frame_size ();
9292
9293   cfun->machine->global_pointer = mips_global_pointer ();
9294
9295   /* The first two blocks contain the outgoing argument area and the $gp save
9296      slot.  This area isn't needed in leaf functions, but if the
9297      target-independent frame size is nonzero, we have already committed to
9298      allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
9299   if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf)
9300     {
9301       /* The MIPS 3.0 linker does not like functions that dynamically
9302          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
9303          looks like we are trying to create a second frame pointer to the
9304          function, so allocate some stack space to make it happy.  */
9305       if (cfun->calls_alloca)
9306         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
9307       else
9308         frame->args_size = 0;
9309       frame->cprestore_size = 0;
9310     }
9311   else
9312     {
9313       frame->args_size = crtl->outgoing_args_size;
9314       frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
9315     }
9316   offset = frame->args_size + frame->cprestore_size;
9317
9318   /* Move above the local variables.  */
9319   frame->var_size = MIPS_STACK_ALIGN (size);
9320   offset += frame->var_size;
9321
9322   /* Find out which GPRs we need to save.  */
9323   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9324     if (mips_save_reg_p (regno))
9325       {
9326         frame->num_gp++;
9327         frame->mask |= 1 << (regno - GP_REG_FIRST);
9328       }
9329
9330   /* If this function calls eh_return, we must also save and restore the
9331      EH data registers.  */
9332   if (crtl->calls_eh_return)
9333     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
9334       {
9335         frame->num_gp++;
9336         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
9337       }
9338
9339   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
9340      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
9341      save all later registers too.  */
9342   if (GENERATE_MIPS16E_SAVE_RESTORE)
9343     {
9344       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
9345                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
9346       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
9347                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
9348     }
9349
9350   /* Move above the GPR save area.  */
9351   if (frame->num_gp > 0)
9352     {
9353       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
9354       frame->gp_sp_offset = offset - UNITS_PER_WORD;
9355     }
9356
9357   /* Find out which FPRs we need to save.  This loop must iterate over
9358      the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
9359   if (TARGET_HARD_FLOAT)
9360     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
9361       if (mips_save_reg_p (regno))
9362         {
9363           frame->num_fp += MAX_FPRS_PER_FMT;
9364           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
9365         }
9366
9367   /* Move above the FPR save area.  */
9368   if (frame->num_fp > 0)
9369     {
9370       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
9371       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
9372     }
9373
9374   /* Add in space for the interrupt context information.  */
9375   if (cfun->machine->interrupt_handler_p)
9376     {
9377       /* Check HI/LO.  */
9378       if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
9379         {
9380           frame->num_acc++;
9381           frame->acc_mask |= (1 << 0);
9382         }
9383
9384       /* Check accumulators 1, 2, 3.  */
9385       for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
9386         if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
9387           {
9388             frame->num_acc++;
9389             frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
9390           }
9391
9392       /* All interrupt context functions need space to preserve STATUS.  */
9393       frame->num_cop0_regs++;
9394
9395       /* If we don't keep interrupts masked, we need to save EPC.  */
9396       if (!cfun->machine->keep_interrupts_masked_p)
9397         frame->num_cop0_regs++;
9398     }
9399
9400   /* Move above the accumulator save area.  */
9401   if (frame->num_acc > 0)
9402     {
9403       /* Each accumulator needs 2 words.  */
9404       offset += frame->num_acc * 2 * UNITS_PER_WORD;
9405       frame->acc_sp_offset = offset - UNITS_PER_WORD;
9406     }
9407
9408   /* Move above the COP0 register save area.  */
9409   if (frame->num_cop0_regs > 0)
9410     {
9411       offset += frame->num_cop0_regs * UNITS_PER_WORD;
9412       frame->cop0_sp_offset = offset - UNITS_PER_WORD;
9413     }
9414
9415   /* Move above the callee-allocated varargs save area.  */
9416   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
9417   frame->arg_pointer_offset = offset;
9418
9419   /* Move above the callee-allocated area for pretend stack arguments.  */
9420   offset += crtl->args.pretend_args_size;
9421   frame->total_size = offset;
9422
9423   /* Work out the offsets of the save areas from the top of the frame.  */
9424   if (frame->gp_sp_offset > 0)
9425     frame->gp_save_offset = frame->gp_sp_offset - offset;
9426   if (frame->fp_sp_offset > 0)
9427     frame->fp_save_offset = frame->fp_sp_offset - offset;
9428   if (frame->acc_sp_offset > 0)
9429     frame->acc_save_offset = frame->acc_sp_offset - offset;
9430   if (frame->num_cop0_regs > 0)
9431     frame->cop0_save_offset = frame->cop0_sp_offset - offset;
9432
9433   /* MIPS16 code offsets the frame pointer by the size of the outgoing
9434      arguments.  This tends to increase the chances of using unextended
9435      instructions for local variables and incoming arguments.  */
9436   if (TARGET_MIPS16)
9437     frame->hard_frame_pointer_offset = frame->args_size;
9438 }
9439
9440 /* Return the style of GP load sequence that is being used for the
9441    current function.  */
9442
9443 enum mips_loadgp_style
9444 mips_current_loadgp_style (void)
9445 {
9446   if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
9447     return LOADGP_NONE;
9448
9449   if (TARGET_RTP_PIC)
9450     return LOADGP_RTP;
9451
9452   if (TARGET_ABSOLUTE_ABICALLS)
9453     return LOADGP_ABSOLUTE;
9454
9455   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
9456 }
9457
9458 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
9459
9460 static bool
9461 mips_frame_pointer_required (void)
9462 {
9463   /* If the function contains dynamic stack allocations, we need to
9464      use the frame pointer to access the static parts of the frame.  */
9465   if (cfun->calls_alloca)
9466     return true;
9467
9468   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
9469      reload may be unable to compute the address of a local variable,
9470      since there is no way to add a large constant to the stack pointer
9471      without using a second temporary register.  */
9472   if (TARGET_MIPS16)
9473     {
9474       mips_compute_frame_info ();
9475       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
9476         return true;
9477     }
9478
9479   return false;
9480 }
9481
9482 /* Make sure that we're not trying to eliminate to the wrong hard frame
9483    pointer.  */
9484
9485 static bool
9486 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
9487 {
9488   return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
9489 }
9490
9491 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
9492    or argument pointer.  TO is either the stack pointer or hard frame
9493    pointer.  */
9494
9495 HOST_WIDE_INT
9496 mips_initial_elimination_offset (int from, int to)
9497 {
9498   HOST_WIDE_INT offset;
9499
9500   mips_compute_frame_info ();
9501
9502   /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
9503   switch (from)
9504     {
9505     case FRAME_POINTER_REGNUM:
9506       if (FRAME_GROWS_DOWNWARD)
9507         offset = (cfun->machine->frame.args_size
9508                   + cfun->machine->frame.cprestore_size
9509                   + cfun->machine->frame.var_size);
9510       else
9511         offset = 0;
9512       break;
9513
9514     case ARG_POINTER_REGNUM:
9515       offset = cfun->machine->frame.arg_pointer_offset;
9516       break;
9517
9518     default:
9519       gcc_unreachable ();
9520     }
9521
9522   if (to == HARD_FRAME_POINTER_REGNUM)
9523     offset -= cfun->machine->frame.hard_frame_pointer_offset;
9524
9525   return offset;
9526 }
9527 \f
9528 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
9529
9530 static void
9531 mips_extra_live_on_entry (bitmap regs)
9532 {
9533   if (TARGET_USE_GOT)
9534     {
9535       /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
9536          the global pointer.   */
9537       if (!TARGET_ABSOLUTE_ABICALLS)
9538         bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
9539
9540       /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
9541          the global pointer.  */
9542       if (TARGET_MIPS16)
9543         bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
9544
9545       /* See the comment above load_call<mode> for details.  */
9546       bitmap_set_bit (regs, GOT_VERSION_REGNUM);
9547     }
9548 }
9549
9550 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
9551    previous frame.  */
9552
9553 rtx
9554 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
9555 {
9556   if (count != 0)
9557     return const0_rtx;
9558
9559   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
9560 }
9561
9562 /* Emit code to change the current function's return address to
9563    ADDRESS.  SCRATCH is available as a scratch register, if needed.
9564    ADDRESS and SCRATCH are both word-mode GPRs.  */
9565
9566 void
9567 mips_set_return_address (rtx address, rtx scratch)
9568 {
9569   rtx slot_address;
9570
9571   gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
9572   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
9573                                   cfun->machine->frame.gp_sp_offset);
9574   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
9575 }
9576
9577 /* Return true if the current function has a cprestore slot.  */
9578
9579 bool
9580 mips_cfun_has_cprestore_slot_p (void)
9581 {
9582   return (cfun->machine->global_pointer != INVALID_REGNUM
9583           && cfun->machine->frame.cprestore_size > 0);
9584 }
9585
9586 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
9587    cprestore slot.  LOAD_P is true if the caller wants to load from
9588    the cprestore slot; it is false if the caller wants to store to
9589    the slot.  */
9590
9591 static void
9592 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
9593                                     bool load_p)
9594 {
9595   const struct mips_frame_info *frame;
9596
9597   frame = &cfun->machine->frame;
9598   /* .cprestore always uses the stack pointer instead of the frame pointer.
9599      We have a free choice for direct stores for non-MIPS16 functions,
9600      and for MIPS16 functions whose cprestore slot is in range of the
9601      stack pointer.  Using the stack pointer would sometimes give more
9602      (early) scheduling freedom, but using the frame pointer would
9603      sometimes give more (late) scheduling freedom.  It's hard to
9604      predict which applies to a given function, so let's keep things
9605      simple.
9606
9607      Loads must always use the frame pointer in functions that call
9608      alloca, and there's little benefit to using the stack pointer
9609      otherwise.  */
9610   if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
9611     {
9612       *base = hard_frame_pointer_rtx;
9613       *offset = frame->args_size - frame->hard_frame_pointer_offset;
9614     }
9615   else
9616     {
9617       *base = stack_pointer_rtx;
9618       *offset = frame->args_size;
9619     }
9620 }
9621
9622 /* Return true if X is the load or store address of the cprestore slot;
9623    LOAD_P says which.  */
9624
9625 bool
9626 mips_cprestore_address_p (rtx x, bool load_p)
9627 {
9628   rtx given_base, required_base;
9629   HOST_WIDE_INT given_offset, required_offset;
9630
9631   mips_split_plus (x, &given_base, &given_offset);
9632   mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
9633   return given_base == required_base && given_offset == required_offset;
9634 }
9635
9636 /* Return a MEM rtx for the cprestore slot.  LOAD_P is true if we are
9637    going to load from it, false if we are going to store to it.
9638    Use TEMP as a temporary register if need be.  */
9639
9640 static rtx
9641 mips_cprestore_slot (rtx temp, bool load_p)
9642 {
9643   rtx base;
9644   HOST_WIDE_INT offset;
9645
9646   mips_get_cprestore_base_and_offset (&base, &offset, load_p);
9647   return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
9648 }
9649
9650 /* Emit instructions to save global pointer value GP into cprestore
9651    slot MEM.  OFFSET is the offset that MEM applies to the base register.
9652
9653    MEM may not be a legitimate address.  If it isn't, TEMP is a
9654    temporary register that can be used, otherwise it is a SCRATCH.  */
9655
9656 void
9657 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
9658 {
9659   if (TARGET_CPRESTORE_DIRECTIVE)
9660     {
9661       gcc_assert (gp == pic_offset_table_rtx);
9662       emit_insn (gen_cprestore (mem, offset));
9663     }
9664   else
9665     mips_emit_move (mips_cprestore_slot (temp, false), gp);
9666 }
9667
9668 /* Restore $gp from its save slot, using TEMP as a temporary base register
9669    if need be.  This function is for o32 and o64 abicalls only.
9670
9671    See mips_must_initialize_gp_p for details about how we manage the
9672    global pointer.  */
9673
9674 void
9675 mips_restore_gp_from_cprestore_slot (rtx temp)
9676 {
9677   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
9678
9679   if (!cfun->machine->must_restore_gp_when_clobbered_p)
9680     {
9681       emit_note (NOTE_INSN_DELETED);
9682       return;
9683     }
9684
9685   if (TARGET_MIPS16)
9686     {
9687       mips_emit_move (temp, mips_cprestore_slot (temp, true));
9688       mips_emit_move (pic_offset_table_rtx, temp);
9689     }
9690   else
9691     mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
9692   if (!TARGET_EXPLICIT_RELOCS)
9693     emit_insn (gen_blockage ());
9694 }
9695 \f
9696 /* A function to save or store a register.  The first argument is the
9697    register and the second is the stack slot.  */
9698 typedef void (*mips_save_restore_fn) (rtx, rtx);
9699
9700 /* Use FN to save or restore register REGNO.  MODE is the register's
9701    mode and OFFSET is the offset of its save slot from the current
9702    stack pointer.  */
9703
9704 static void
9705 mips_save_restore_reg (enum machine_mode mode, int regno,
9706                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
9707 {
9708   rtx mem;
9709
9710   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
9711   fn (gen_rtx_REG (mode, regno), mem);
9712 }
9713
9714 /* Call FN for each accumlator that is saved by the current function.
9715    SP_OFFSET is the offset of the current stack pointer from the start
9716    of the frame.  */
9717
9718 static void
9719 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
9720 {
9721   HOST_WIDE_INT offset;
9722   int regno;
9723
9724   offset = cfun->machine->frame.acc_sp_offset - sp_offset;
9725   if (BITSET_P (cfun->machine->frame.acc_mask, 0))
9726     {
9727       mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
9728       offset -= UNITS_PER_WORD;
9729       mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
9730       offset -= UNITS_PER_WORD;
9731     }
9732
9733   for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
9734     if (BITSET_P (cfun->machine->frame.acc_mask,
9735                   ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
9736       {
9737         mips_save_restore_reg (word_mode, regno, offset, fn);
9738         offset -= UNITS_PER_WORD;
9739       }
9740 }
9741
9742 /* Call FN for each register that is saved by the current function.
9743    SP_OFFSET is the offset of the current stack pointer from the start
9744    of the frame.  */
9745
9746 static void
9747 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
9748                                  mips_save_restore_fn fn)
9749 {
9750   enum machine_mode fpr_mode;
9751   HOST_WIDE_INT offset;
9752   int regno;
9753
9754   /* Save registers starting from high to low.  The debuggers prefer at least
9755      the return register be stored at func+4, and also it allows us not to
9756      need a nop in the epilogue if at least one register is reloaded in
9757      addition to return address.  */
9758   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
9759   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
9760     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
9761       {
9762         /* Record the ra offset for use by mips_function_profiler.  */
9763         if (regno == RETURN_ADDR_REGNUM)
9764           cfun->machine->frame.ra_fp_offset = offset + sp_offset;
9765         mips_save_restore_reg (word_mode, regno, offset, fn);
9766         offset -= UNITS_PER_WORD;
9767       }
9768
9769   /* This loop must iterate over the same space as its companion in
9770      mips_compute_frame_info.  */
9771   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
9772   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
9773   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
9774        regno >= FP_REG_FIRST;
9775        regno -= MAX_FPRS_PER_FMT)
9776     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
9777       {
9778         mips_save_restore_reg (fpr_mode, regno, offset, fn);
9779         offset -= GET_MODE_SIZE (fpr_mode);
9780       }
9781 }
9782
9783 /* Return true if a move between register REGNO and its save slot (MEM)
9784    can be done in a single move.  LOAD_P is true if we are loading
9785    from the slot, false if we are storing to it.  */
9786
9787 static bool
9788 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
9789 {
9790   /* There is a specific MIPS16 instruction for saving $31 to the stack.  */
9791   if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
9792     return false;
9793
9794   return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
9795                                       GET_MODE (mem), mem, load_p) == NO_REGS;
9796 }
9797
9798 /* Emit a move from SRC to DEST, given that one of them is a register
9799    save slot and that the other is a register.  TEMP is a temporary
9800    GPR of the same mode that is available if need be.  */
9801
9802 void
9803 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
9804 {
9805   unsigned int regno;
9806   rtx mem;
9807
9808   if (REG_P (src))
9809     {
9810       regno = REGNO (src);
9811       mem = dest;
9812     }
9813   else
9814     {
9815       regno = REGNO (dest);
9816       mem = src;
9817     }
9818
9819   if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
9820     {
9821       /* We don't yet know whether we'll need this instruction or not.
9822          Postpone the decision by emitting a ghost move.  This move
9823          is specifically not frame-related; only the split version is.  */
9824       if (TARGET_64BIT)
9825         emit_insn (gen_move_gpdi (dest, src));
9826       else
9827         emit_insn (gen_move_gpsi (dest, src));
9828       return;
9829     }
9830
9831   if (regno == HI_REGNUM)
9832     {
9833       if (REG_P (dest))
9834         {
9835           mips_emit_move (temp, src);
9836           if (TARGET_64BIT)
9837             emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
9838                                       temp, gen_rtx_REG (DImode, LO_REGNUM)));
9839           else
9840             emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
9841                                       temp, gen_rtx_REG (SImode, LO_REGNUM)));
9842         }
9843       else
9844         {
9845           if (TARGET_64BIT)
9846             emit_insn (gen_mfhidi_ti (temp,
9847                                       gen_rtx_REG (TImode, MD_REG_FIRST)));
9848           else
9849             emit_insn (gen_mfhisi_di (temp,
9850                                       gen_rtx_REG (DImode, MD_REG_FIRST)));
9851           mips_emit_move (dest, temp);
9852         }
9853     }
9854   else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
9855     mips_emit_move (dest, src);
9856   else
9857     {
9858       gcc_assert (!reg_overlap_mentioned_p (dest, temp));
9859       mips_emit_move (temp, src);
9860       mips_emit_move (dest, temp);
9861     }
9862   if (MEM_P (dest))
9863     mips_set_frame_expr (mips_frame_set (dest, src));
9864 }
9865 \f
9866 /* If we're generating n32 or n64 abicalls, and the current function
9867    does not use $28 as its global pointer, emit a cplocal directive.
9868    Use pic_offset_table_rtx as the argument to the directive.  */
9869
9870 static void
9871 mips_output_cplocal (void)
9872 {
9873   if (!TARGET_EXPLICIT_RELOCS
9874       && mips_must_initialize_gp_p ()
9875       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
9876     output_asm_insn (".cplocal %+", 0);
9877 }
9878
9879 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
9880
9881 static void
9882 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9883 {
9884   const char *fnname;
9885
9886 #ifdef SDB_DEBUGGING_INFO
9887   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
9888     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
9889 #endif
9890
9891   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
9892      floating-point arguments.  */
9893   if (TARGET_MIPS16
9894       && TARGET_HARD_FLOAT_ABI
9895       && crtl->args.info.fp_code != 0)
9896     mips16_build_function_stub ();
9897
9898   /* Get the function name the same way that toplev.c does before calling
9899      assemble_start_function.  This is needed so that the name used here
9900      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9901   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9902   mips_start_function_definition (fnname, TARGET_MIPS16);
9903
9904   /* Output MIPS-specific frame information.  */
9905   if (!flag_inhibit_size_directive)
9906     {
9907       const struct mips_frame_info *frame;
9908
9909       frame = &cfun->machine->frame;
9910
9911       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
9912       fprintf (file,
9913                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
9914                "# vars= " HOST_WIDE_INT_PRINT_DEC
9915                ", regs= %d/%d"
9916                ", args= " HOST_WIDE_INT_PRINT_DEC
9917                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
9918                reg_names[frame_pointer_needed
9919                          ? HARD_FRAME_POINTER_REGNUM
9920                          : STACK_POINTER_REGNUM],
9921                (frame_pointer_needed
9922                 ? frame->total_size - frame->hard_frame_pointer_offset
9923                 : frame->total_size),
9924                reg_names[RETURN_ADDR_REGNUM],
9925                frame->var_size,
9926                frame->num_gp, frame->num_fp,
9927                frame->args_size,
9928                frame->cprestore_size);
9929
9930       /* .mask MASK, OFFSET.  */
9931       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9932                frame->mask, frame->gp_save_offset);
9933
9934       /* .fmask MASK, OFFSET.  */
9935       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9936                frame->fmask, frame->fp_save_offset);
9937     }
9938
9939   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
9940      Also emit the ".set noreorder; .set nomacro" sequence for functions
9941      that need it.  */
9942   if (mips_must_initialize_gp_p ()
9943       && mips_current_loadgp_style () == LOADGP_OLDABI)
9944     {
9945       if (TARGET_MIPS16)
9946         {
9947           /* This is a fixed-form sequence.  The position of the
9948              first two instructions is important because of the
9949              way _gp_disp is defined.  */
9950           output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
9951           output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
9952           output_asm_insn ("sll\t$2,16", 0);
9953           output_asm_insn ("addu\t$2,$3", 0);
9954         }
9955       else
9956         {
9957           /* .cpload must be in a .set noreorder but not a
9958              .set nomacro block.  */
9959           mips_push_asm_switch (&mips_noreorder);
9960           output_asm_insn (".cpload\t%^", 0);
9961           if (!cfun->machine->all_noreorder_p)
9962             mips_pop_asm_switch (&mips_noreorder);
9963           else
9964             mips_push_asm_switch (&mips_nomacro);
9965         }
9966     }
9967   else if (cfun->machine->all_noreorder_p)
9968     {
9969       mips_push_asm_switch (&mips_noreorder);
9970       mips_push_asm_switch (&mips_nomacro);
9971     }
9972
9973   /* Tell the assembler which register we're using as the global
9974      pointer.  This is needed for thunks, since they can use either
9975      explicit relocs or assembler macros.  */
9976   mips_output_cplocal ();
9977 }
9978
9979 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
9980
9981 static void
9982 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9983                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9984 {
9985   const char *fnname;
9986
9987   /* Reinstate the normal $gp.  */
9988   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
9989   mips_output_cplocal ();
9990
9991   if (cfun->machine->all_noreorder_p)
9992     {
9993       mips_pop_asm_switch (&mips_nomacro);
9994       mips_pop_asm_switch (&mips_noreorder);
9995     }
9996
9997   /* Get the function name the same way that toplev.c does before calling
9998      assemble_start_function.  This is needed so that the name used here
9999      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
10000   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10001   mips_end_function_definition (fnname);
10002 }
10003 \f
10004 /* Save register REG to MEM.  Make the instruction frame-related.  */
10005
10006 static void
10007 mips_save_reg (rtx reg, rtx mem)
10008 {
10009   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
10010     {
10011       rtx x1, x2;
10012
10013       if (mips_split_64bit_move_p (mem, reg))
10014         mips_split_doubleword_move (mem, reg);
10015       else
10016         mips_emit_move (mem, reg);
10017
10018       x1 = mips_frame_set (mips_subword (mem, false),
10019                            mips_subword (reg, false));
10020       x2 = mips_frame_set (mips_subword (mem, true),
10021                            mips_subword (reg, true));
10022       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10023     }
10024   else
10025     mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10026 }
10027
10028 /* The __gnu_local_gp symbol.  */
10029
10030 static GTY(()) rtx mips_gnu_local_gp;
10031
10032 /* If we're generating n32 or n64 abicalls, emit instructions
10033    to set up the global pointer.  */
10034
10035 static void
10036 mips_emit_loadgp (void)
10037 {
10038   rtx addr, offset, incoming_address, base, index, pic_reg;
10039
10040   pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10041   switch (mips_current_loadgp_style ())
10042     {
10043     case LOADGP_ABSOLUTE:
10044       if (mips_gnu_local_gp == NULL)
10045         {
10046           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
10047           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
10048         }
10049       emit_insn (Pmode == SImode
10050                  ? gen_loadgp_absolute_si (pic_reg, mips_gnu_local_gp)
10051                  : gen_loadgp_absolute_di (pic_reg, mips_gnu_local_gp));
10052       break;
10053
10054     case LOADGP_OLDABI:
10055       /* Added by mips_output_function_prologue.  */
10056       break;
10057
10058     case LOADGP_NEWABI:
10059       addr = XEXP (DECL_RTL (current_function_decl), 0);
10060       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
10061       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
10062       emit_insn (Pmode == SImode
10063                  ? gen_loadgp_newabi_si (pic_reg, offset, incoming_address)
10064                  : gen_loadgp_newabi_di (pic_reg, offset, incoming_address));
10065       break;
10066
10067     case LOADGP_RTP:
10068       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
10069       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
10070       emit_insn (Pmode == SImode
10071                  ? gen_loadgp_rtp_si (pic_reg, base, index)
10072                  : gen_loadgp_rtp_di (pic_reg, base, index));
10073       break;
10074
10075     default:
10076       return;
10077     }
10078
10079   if (TARGET_MIPS16)
10080     emit_insn (gen_copygp_mips16 (pic_offset_table_rtx, pic_reg));
10081
10082   /* Emit a blockage if there are implicit uses of the GP register.
10083      This includes profiled functions, because FUNCTION_PROFILE uses
10084      a jal macro.  */
10085   if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
10086     emit_insn (gen_loadgp_blockage ());
10087 }
10088
10089 /* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
10090
10091 static int
10092 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
10093 {
10094   return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
10095 }
10096
10097 /* Expand the "prologue" pattern.  */
10098
10099 void
10100 mips_expand_prologue (void)
10101 {
10102   const struct mips_frame_info *frame;
10103   HOST_WIDE_INT size;
10104   unsigned int nargs;
10105   rtx insn;
10106
10107   if (cfun->machine->global_pointer != INVALID_REGNUM)
10108     {
10109       /* Check whether an insn uses pic_offset_table_rtx, either explicitly
10110          or implicitly.  If so, we can commit to using a global pointer
10111          straight away, otherwise we need to defer the decision.  */
10112       if (mips_cfun_has_inflexible_gp_ref_p ()
10113           || mips_cfun_has_flexible_gp_ref_p ())
10114         {
10115           cfun->machine->must_initialize_gp_p = true;
10116           cfun->machine->must_restore_gp_when_clobbered_p = true;
10117         }
10118
10119       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
10120     }
10121
10122   frame = &cfun->machine->frame;
10123   size = frame->total_size;
10124
10125   if (flag_stack_usage)
10126     current_function_static_stack_size = size;
10127
10128   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
10129      bytes beforehand; this is enough to cover the register save area
10130      without going out of range.  */
10131   if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
10132       || frame->num_cop0_regs > 0)
10133     {
10134       HOST_WIDE_INT step1;
10135
10136       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
10137       if (GENERATE_MIPS16E_SAVE_RESTORE)
10138         {
10139           HOST_WIDE_INT offset;
10140           unsigned int mask, regno;
10141
10142           /* Try to merge argument stores into the save instruction.  */
10143           nargs = mips16e_collect_argument_saves ();
10144
10145           /* Build the save instruction.  */
10146           mask = frame->mask;
10147           insn = mips16e_build_save_restore (false, &mask, &offset,
10148                                              nargs, step1);
10149           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10150           size -= step1;
10151
10152           /* Check if we need to save other registers.  */
10153           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10154             if (BITSET_P (mask, regno - GP_REG_FIRST))
10155               {
10156                 offset -= UNITS_PER_WORD;
10157                 mips_save_restore_reg (word_mode, regno,
10158                                        offset, mips_save_reg);
10159               }
10160         }
10161       else
10162         {
10163           if (cfun->machine->interrupt_handler_p)
10164             {
10165               HOST_WIDE_INT offset;
10166               rtx mem;
10167
10168               /* If this interrupt is using a shadow register set, we need to
10169                  get the stack pointer from the previous register set.  */
10170               if (cfun->machine->use_shadow_register_set_p)
10171                 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
10172                                             stack_pointer_rtx));
10173
10174               if (!cfun->machine->keep_interrupts_masked_p)
10175                 {
10176                   /* Move from COP0 Cause to K0.  */
10177                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
10178                                             gen_rtx_REG (SImode,
10179                                                          COP0_CAUSE_REG_NUM)));
10180                   /* Move from COP0 EPC to K1.  */
10181                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10182                                             gen_rtx_REG (SImode,
10183                                                          COP0_EPC_REG_NUM)));
10184                 }
10185
10186               /* Allocate the first part of the frame.  */
10187               insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
10188                                     GEN_INT (-step1));
10189               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10190               size -= step1;
10191
10192               /* Start at the uppermost location for saving.  */
10193               offset = frame->cop0_sp_offset - size;
10194               if (!cfun->machine->keep_interrupts_masked_p)
10195                 {
10196                   /* Push EPC into its stack slot.  */
10197                   mem = gen_frame_mem (word_mode,
10198                                        plus_constant (stack_pointer_rtx,
10199                                                       offset));
10200                   mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10201                   offset -= UNITS_PER_WORD;
10202                 }
10203
10204               /* Move from COP0 Status to K1.  */
10205               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10206                                         gen_rtx_REG (SImode,
10207                                                      COP0_STATUS_REG_NUM)));
10208
10209               /* Right justify the RIPL in k0.  */
10210               if (!cfun->machine->keep_interrupts_masked_p)
10211                 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
10212                                         gen_rtx_REG (SImode, K0_REG_NUM),
10213                                         GEN_INT (CAUSE_IPL)));
10214
10215               /* Push Status into its stack slot.  */
10216               mem = gen_frame_mem (word_mode,
10217                                    plus_constant (stack_pointer_rtx, offset));
10218               mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10219               offset -= UNITS_PER_WORD;
10220
10221               /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
10222               if (!cfun->machine->keep_interrupts_masked_p)
10223                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10224                                        GEN_INT (6),
10225                                        GEN_INT (SR_IPL),
10226                                        gen_rtx_REG (SImode, K0_REG_NUM)));
10227
10228               if (!cfun->machine->keep_interrupts_masked_p)
10229                 /* Enable interrupts by clearing the KSU ERL and EXL bits.
10230                    IE is already the correct value, so we don't have to do
10231                    anything explicit.  */
10232                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10233                                        GEN_INT (4),
10234                                        GEN_INT (SR_EXL),
10235                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10236               else
10237                 /* Disable interrupts by clearing the KSU, ERL, EXL,
10238                    and IE bits.  */
10239                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10240                                        GEN_INT (5),
10241                                        GEN_INT (SR_IE),
10242                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10243             }
10244           else
10245             {
10246               insn = gen_add3_insn (stack_pointer_rtx,
10247                                     stack_pointer_rtx,
10248                                     GEN_INT (-step1));
10249               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10250               size -= step1;
10251             }
10252           mips_for_each_saved_acc (size, mips_save_reg);
10253           mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
10254         }
10255     }
10256
10257   /* Allocate the rest of the frame.  */
10258   if (size > 0)
10259     {
10260       if (SMALL_OPERAND (-size))
10261         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
10262                                                        stack_pointer_rtx,
10263                                                        GEN_INT (-size)))) = 1;
10264       else
10265         {
10266           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
10267           if (TARGET_MIPS16)
10268             {
10269               /* There are no instructions to add or subtract registers
10270                  from the stack pointer, so use the frame pointer as a
10271                  temporary.  We should always be using a frame pointer
10272                  in this case anyway.  */
10273               gcc_assert (frame_pointer_needed);
10274               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10275               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
10276                                         hard_frame_pointer_rtx,
10277                                         MIPS_PROLOGUE_TEMP (Pmode)));
10278               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
10279             }
10280           else
10281             emit_insn (gen_sub3_insn (stack_pointer_rtx,
10282                                       stack_pointer_rtx,
10283                                       MIPS_PROLOGUE_TEMP (Pmode)));
10284
10285           /* Describe the combined effect of the previous instructions.  */
10286           mips_set_frame_expr
10287             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10288                           plus_constant (stack_pointer_rtx, -size)));
10289         }
10290     }
10291
10292   /* Set up the frame pointer, if we're using one.  */
10293   if (frame_pointer_needed)
10294     {
10295       HOST_WIDE_INT offset;
10296
10297       offset = frame->hard_frame_pointer_offset;
10298       if (offset == 0)
10299         {
10300           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10301           RTX_FRAME_RELATED_P (insn) = 1;
10302         }
10303       else if (SMALL_OPERAND (offset))
10304         {
10305           insn = gen_add3_insn (hard_frame_pointer_rtx,
10306                                 stack_pointer_rtx, GEN_INT (offset));
10307           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10308         }
10309       else
10310         {
10311           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
10312           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10313           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
10314                                     hard_frame_pointer_rtx,
10315                                     MIPS_PROLOGUE_TEMP (Pmode)));
10316           mips_set_frame_expr
10317             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10318                           plus_constant (stack_pointer_rtx, offset)));
10319         }
10320     }
10321
10322   mips_emit_loadgp ();
10323
10324   /* Initialize the $gp save slot.  */
10325   if (mips_cfun_has_cprestore_slot_p ())
10326     {
10327       rtx base, mem, gp, temp;
10328       HOST_WIDE_INT offset;
10329
10330       mips_get_cprestore_base_and_offset (&base, &offset, false);
10331       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10332       gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10333       temp = (SMALL_OPERAND (offset)
10334               ? gen_rtx_SCRATCH (Pmode)
10335               : MIPS_PROLOGUE_TEMP (Pmode));
10336       emit_insn (gen_potential_cprestore (mem, GEN_INT (offset), gp, temp));
10337
10338       mips_get_cprestore_base_and_offset (&base, &offset, true);
10339       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10340       emit_insn (gen_use_cprestore (mem));
10341     }
10342
10343   /* We need to search back to the last use of K0 or K1.  */
10344   if (cfun->machine->interrupt_handler_p)
10345     {
10346       for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
10347         if (INSN_P (insn)
10348             && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
10349           break;
10350       /* Emit a move from K1 to COP0 Status after insn.  */
10351       gcc_assert (insn != NULL_RTX);
10352       emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10353                                       gen_rtx_REG (SImode, K1_REG_NUM)),
10354                        insn);
10355     }
10356
10357   /* If we are profiling, make sure no instructions are scheduled before
10358      the call to mcount.  */
10359   if (crtl->profile)
10360     emit_insn (gen_blockage ());
10361 }
10362 \f
10363 /* Emit instructions to restore register REG from slot MEM.  */
10364
10365 static void
10366 mips_restore_reg (rtx reg, rtx mem)
10367 {
10368   /* There's no MIPS16 instruction to load $31 directly.  Load into
10369      $7 instead and adjust the return insn appropriately.  */
10370   if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
10371     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
10372
10373   mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
10374 }
10375
10376 /* Emit any instructions needed before a return.  */
10377
10378 void
10379 mips_expand_before_return (void)
10380 {
10381   /* When using a call-clobbered gp, we start out with unified call
10382      insns that include instructions to restore the gp.  We then split
10383      these unified calls after reload.  These split calls explicitly
10384      clobber gp, so there is no need to define
10385      PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
10386
10387      For consistency, we should also insert an explicit clobber of $28
10388      before return insns, so that the post-reload optimizers know that
10389      the register is not live on exit.  */
10390   if (TARGET_CALL_CLOBBERED_GP)
10391     emit_clobber (pic_offset_table_rtx);
10392 }
10393
10394 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
10395    says which.  */
10396
10397 void
10398 mips_expand_epilogue (bool sibcall_p)
10399 {
10400   const struct mips_frame_info *frame;
10401   HOST_WIDE_INT step1, step2;
10402   rtx base, target, insn;
10403
10404   if (!sibcall_p && mips_can_use_return_insn ())
10405     {
10406       emit_jump_insn (gen_return ());
10407       return;
10408     }
10409
10410   /* In MIPS16 mode, if the return value should go into a floating-point
10411      register, we need to call a helper routine to copy it over.  */
10412   if (mips16_cfun_returns_in_fpr_p ())
10413     mips16_copy_fpr_return_value ();
10414
10415   /* Split the frame into two.  STEP1 is the amount of stack we should
10416      deallocate before restoring the registers.  STEP2 is the amount we
10417      should deallocate afterwards.
10418
10419      Start off by assuming that no registers need to be restored.  */
10420   frame = &cfun->machine->frame;
10421   step1 = frame->total_size;
10422   step2 = 0;
10423
10424   /* Work out which register holds the frame address.  */
10425   if (!frame_pointer_needed)
10426     base = stack_pointer_rtx;
10427   else
10428     {
10429       base = hard_frame_pointer_rtx;
10430       step1 -= frame->hard_frame_pointer_offset;
10431     }
10432
10433   /* If we need to restore registers, deallocate as much stack as
10434      possible in the second step without going out of range.  */
10435   if ((frame->mask | frame->fmask | frame->acc_mask) != 0
10436       || frame->num_cop0_regs > 0)
10437     {
10438       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
10439       step1 -= step2;
10440     }
10441
10442   /* Set TARGET to BASE + STEP1.  */
10443   target = base;
10444   if (step1 > 0)
10445     {
10446       rtx adjust;
10447
10448       /* Get an rtx for STEP1 that we can add to BASE.  */
10449       adjust = GEN_INT (step1);
10450       if (!SMALL_OPERAND (step1))
10451         {
10452           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
10453           adjust = MIPS_EPILOGUE_TEMP (Pmode);
10454         }
10455
10456       /* Normal mode code can copy the result straight into $sp.  */
10457       if (!TARGET_MIPS16)
10458         target = stack_pointer_rtx;
10459
10460       emit_insn (gen_add3_insn (target, base, adjust));
10461     }
10462
10463   /* Copy TARGET into the stack pointer.  */
10464   if (target != stack_pointer_rtx)
10465     mips_emit_move (stack_pointer_rtx, target);
10466
10467   /* If we're using addressing macros, $gp is implicitly used by all
10468      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
10469      from the stack.  */
10470   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
10471     emit_insn (gen_blockage ());
10472
10473   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
10474     {
10475       unsigned int regno, mask;
10476       HOST_WIDE_INT offset;
10477       rtx restore;
10478
10479       /* Generate the restore instruction.  */
10480       mask = frame->mask;
10481       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
10482
10483       /* Restore any other registers manually.  */
10484       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10485         if (BITSET_P (mask, regno - GP_REG_FIRST))
10486           {
10487             offset -= UNITS_PER_WORD;
10488             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
10489           }
10490
10491       /* Restore the remaining registers and deallocate the final bit
10492          of the frame.  */
10493       emit_insn (restore);
10494     }
10495   else
10496     {
10497       /* Restore the registers.  */
10498       mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
10499       mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
10500                                        mips_restore_reg);
10501
10502       if (cfun->machine->interrupt_handler_p)
10503         {
10504           HOST_WIDE_INT offset;
10505           rtx mem;
10506
10507           offset = frame->cop0_sp_offset - (frame->total_size - step2);
10508           if (!cfun->machine->keep_interrupts_masked_p)
10509             {
10510               /* Restore the original EPC.  */
10511               mem = gen_frame_mem (word_mode,
10512                                    plus_constant (stack_pointer_rtx, offset));
10513               mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10514               offset -= UNITS_PER_WORD;
10515
10516               /* Move to COP0 EPC.  */
10517               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
10518                                         gen_rtx_REG (SImode, K0_REG_NUM)));
10519             }
10520
10521           /* Restore the original Status.  */
10522           mem = gen_frame_mem (word_mode,
10523                                plus_constant (stack_pointer_rtx, offset));
10524           mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10525           offset -= UNITS_PER_WORD;
10526
10527           /* If we don't use shoadow register set, we need to update SP.  */
10528           if (!cfun->machine->use_shadow_register_set_p && step2 > 0)
10529             emit_insn (gen_add3_insn (stack_pointer_rtx,
10530                                       stack_pointer_rtx,
10531                                       GEN_INT (step2)));
10532
10533           /* Move to COP0 Status.  */
10534           emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10535                                     gen_rtx_REG (SImode, K0_REG_NUM)));
10536         }
10537       else
10538         {
10539           /* Deallocate the final bit of the frame.  */
10540           if (step2 > 0)
10541             emit_insn (gen_add3_insn (stack_pointer_rtx,
10542                                       stack_pointer_rtx,
10543                                       GEN_INT (step2)));
10544         }
10545     }
10546
10547   /* Add in the __builtin_eh_return stack adjustment.  We need to
10548      use a temporary in MIPS16 code.  */
10549   if (crtl->calls_eh_return)
10550     {
10551       if (TARGET_MIPS16)
10552         {
10553           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
10554           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
10555                                     MIPS_EPILOGUE_TEMP (Pmode),
10556                                     EH_RETURN_STACKADJ_RTX));
10557           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
10558         }
10559       else
10560         emit_insn (gen_add3_insn (stack_pointer_rtx,
10561                                   stack_pointer_rtx,
10562                                   EH_RETURN_STACKADJ_RTX));
10563     }
10564
10565   if (!sibcall_p)
10566     {
10567       mips_expand_before_return ();
10568       if (cfun->machine->interrupt_handler_p)
10569         {
10570           /* Interrupt handlers generate eret or deret.  */
10571           if (cfun->machine->use_debug_exception_return_p)
10572             emit_jump_insn (gen_mips_deret ());
10573           else
10574             emit_jump_insn (gen_mips_eret ());
10575         }
10576       else
10577         {
10578           unsigned int regno;
10579
10580           /* When generating MIPS16 code, the normal
10581              mips_for_each_saved_gpr_and_fpr path will restore the return
10582              address into $7 rather than $31.  */
10583           if (TARGET_MIPS16
10584               && !GENERATE_MIPS16E_SAVE_RESTORE
10585               && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
10586             regno = GP_REG_FIRST + 7;
10587           else
10588             regno = RETURN_ADDR_REGNUM;
10589           emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
10590         }
10591     }
10592
10593   /* Search from the beginning to the first use of K0 or K1.  */
10594   if (cfun->machine->interrupt_handler_p
10595       && !cfun->machine->keep_interrupts_masked_p)
10596     {
10597       for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
10598         if (INSN_P (insn)
10599             && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
10600           break;
10601       gcc_assert (insn != NULL_RTX);
10602       /* Insert disable interrupts before the first use of K0 or K1.  */
10603       emit_insn_before (gen_mips_di (), insn);
10604       emit_insn_before (gen_mips_ehb (), insn);
10605     }
10606 }
10607 \f
10608 /* Return nonzero if this function is known to have a null epilogue.
10609    This allows the optimizer to omit jumps to jumps if no stack
10610    was created.  */
10611
10612 bool
10613 mips_can_use_return_insn (void)
10614 {
10615   /* Interrupt handlers need to go through the epilogue.  */
10616   if (cfun->machine->interrupt_handler_p)
10617     return false;
10618
10619   if (!reload_completed)
10620     return false;
10621
10622   if (crtl->profile)
10623     return false;
10624
10625   /* In MIPS16 mode, a function that returns a floating-point value
10626      needs to arrange to copy the return value into the floating-point
10627      registers.  */
10628   if (mips16_cfun_returns_in_fpr_p ())
10629     return false;
10630
10631   return cfun->machine->frame.total_size == 0;
10632 }
10633 \f
10634 /* Return true if register REGNO can store a value of mode MODE.
10635    The result of this function is cached in mips_hard_regno_mode_ok.  */
10636
10637 static bool
10638 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
10639 {
10640   unsigned int size;
10641   enum mode_class mclass;
10642
10643   if (mode == CCV2mode)
10644     return (ISA_HAS_8CC
10645             && ST_REG_P (regno)
10646             && (regno - ST_REG_FIRST) % 2 == 0);
10647
10648   if (mode == CCV4mode)
10649     return (ISA_HAS_8CC
10650             && ST_REG_P (regno)
10651             && (regno - ST_REG_FIRST) % 4 == 0);
10652
10653   if (mode == CCmode)
10654     {
10655       if (!ISA_HAS_8CC)
10656         return regno == FPSW_REGNUM;
10657
10658       return (ST_REG_P (regno)
10659               || GP_REG_P (regno)
10660               || FP_REG_P (regno));
10661     }
10662
10663   size = GET_MODE_SIZE (mode);
10664   mclass = GET_MODE_CLASS (mode);
10665
10666   if (GP_REG_P (regno))
10667     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
10668
10669   if (FP_REG_P (regno)
10670       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
10671           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
10672     {
10673       /* Allow TFmode for CCmode reloads.  */
10674       if (mode == TFmode && ISA_HAS_8CC)
10675         return true;
10676
10677       /* Allow 64-bit vector modes for Loongson-2E/2F.  */
10678       if (TARGET_LOONGSON_VECTORS
10679           && (mode == V2SImode
10680               || mode == V4HImode
10681               || mode == V8QImode
10682               || mode == DImode))
10683         return true;
10684
10685       if (mclass == MODE_FLOAT
10686           || mclass == MODE_COMPLEX_FLOAT
10687           || mclass == MODE_VECTOR_FLOAT)
10688         return size <= UNITS_PER_FPVALUE;
10689
10690       /* Allow integer modes that fit into a single register.  We need
10691          to put integers into FPRs when using instructions like CVT
10692          and TRUNC.  There's no point allowing sizes smaller than a word,
10693          because the FPU has no appropriate load/store instructions.  */
10694       if (mclass == MODE_INT)
10695         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
10696     }
10697
10698   if (ACC_REG_P (regno)
10699       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
10700     {
10701       if (MD_REG_P (regno))
10702         {
10703           /* After a multiplication or division, clobbering HI makes
10704              the value of LO unpredictable, and vice versa.  This means
10705              that, for all interesting cases, HI and LO are effectively
10706              a single register.
10707
10708              We model this by requiring that any value that uses HI
10709              also uses LO.  */
10710           if (size <= UNITS_PER_WORD * 2)
10711             return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
10712         }
10713       else
10714         {
10715           /* DSP accumulators do not have the same restrictions as
10716              HI and LO, so we can treat them as normal doubleword
10717              registers.  */
10718           if (size <= UNITS_PER_WORD)
10719             return true;
10720
10721           if (size <= UNITS_PER_WORD * 2
10722               && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
10723             return true;
10724         }
10725     }
10726
10727   if (ALL_COP_REG_P (regno))
10728     return mclass == MODE_INT && size <= UNITS_PER_WORD;
10729
10730   if (regno == GOT_VERSION_REGNUM)
10731     return mode == SImode;
10732
10733   return false;
10734 }
10735
10736 /* Implement HARD_REGNO_NREGS.  */
10737
10738 unsigned int
10739 mips_hard_regno_nregs (int regno, enum machine_mode mode)
10740 {
10741   if (ST_REG_P (regno))
10742     /* The size of FP status registers is always 4, because they only hold
10743        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
10744     return (GET_MODE_SIZE (mode) + 3) / 4;
10745
10746   if (FP_REG_P (regno))
10747     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
10748
10749   /* All other registers are word-sized.  */
10750   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
10751 }
10752
10753 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
10754    in mips_hard_regno_nregs.  */
10755
10756 int
10757 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
10758 {
10759   int size;
10760   HARD_REG_SET left;
10761
10762   size = 0x8000;
10763   COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
10764   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
10765     {
10766       size = MIN (size, 4);
10767       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
10768     }
10769   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
10770     {
10771       size = MIN (size, UNITS_PER_FPREG);
10772       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
10773     }
10774   if (!hard_reg_set_empty_p (left))
10775     size = MIN (size, UNITS_PER_WORD);
10776   return (GET_MODE_SIZE (mode) + size - 1) / size;
10777 }
10778
10779 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
10780
10781 bool
10782 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
10783                                enum machine_mode to ATTRIBUTE_UNUSED,
10784                                enum reg_class rclass)
10785 {
10786   /* There are several problems with changing the modes of values
10787      in floating-point registers:
10788
10789      - When a multi-word value is stored in paired floating-point
10790        registers, the first register always holds the low word.
10791        We therefore can't allow FPRs to change between single-word
10792        and multi-word modes on big-endian targets.
10793
10794      - GCC assumes that each word of a multiword register can be accessed
10795        individually using SUBREGs.  This is not true for floating-point
10796        registers if they are bigger than a word.
10797
10798      - Loading a 32-bit value into a 64-bit floating-point register
10799        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
10800        We can't allow FPRs to change from SImode to to a wider mode on
10801        64-bit targets.
10802
10803      - If the FPU has already interpreted a value in one format, we must
10804        not ask it to treat the value as having a different format.
10805
10806      We therefore disallow all mode changes involving FPRs.  */
10807   return reg_classes_intersect_p (FP_REGS, rclass);
10808 }
10809
10810 /* Implement target hook small_register_classes_for_mode_p.  */
10811
10812 static bool
10813 mips_small_register_classes_for_mode_p (enum machine_mode mode
10814                                         ATTRIBUTE_UNUSED)
10815 {
10816   return TARGET_MIPS16;
10817 }
10818
10819 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
10820
10821 static bool
10822 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
10823 {
10824   switch (mode)
10825     {
10826     case SFmode:
10827       return TARGET_HARD_FLOAT;
10828
10829     case DFmode:
10830       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
10831
10832     case V2SFmode:
10833       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
10834
10835     default:
10836       return false;
10837     }
10838 }
10839
10840 /* Implement MODES_TIEABLE_P.  */
10841
10842 bool
10843 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
10844 {
10845   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
10846      prefer to put one of them in FPRs.  */
10847   return (mode1 == mode2
10848           || (!mips_mode_ok_for_mov_fmt_p (mode1)
10849               && !mips_mode_ok_for_mov_fmt_p (mode2)));
10850 }
10851
10852 /* Implement TARGET_PREFERRED_RELOAD_CLASS.  */
10853
10854 static reg_class_t
10855 mips_preferred_reload_class (rtx x, reg_class_t rclass)
10856 {
10857   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
10858     return LEA_REGS;
10859
10860   if (reg_class_subset_p (FP_REGS, rclass)
10861       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
10862     return FP_REGS;
10863
10864   if (reg_class_subset_p (GR_REGS, rclass))
10865     rclass = GR_REGS;
10866
10867   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
10868     rclass = M16_REGS;
10869
10870   return rclass;
10871 }
10872
10873 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
10874    Return a "canonical" class to represent it in later calculations.  */
10875
10876 static reg_class_t
10877 mips_canonicalize_move_class (reg_class_t rclass)
10878 {
10879   /* All moves involving accumulator registers have the same cost.  */
10880   if (reg_class_subset_p (rclass, ACC_REGS))
10881     rclass = ACC_REGS;
10882
10883   /* Likewise promote subclasses of general registers to the most
10884      interesting containing class.  */
10885   if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
10886     rclass = M16_REGS;
10887   else if (reg_class_subset_p (rclass, GENERAL_REGS))
10888     rclass = GENERAL_REGS;
10889
10890   return rclass;
10891 }
10892
10893 /* Return the cost of moving a value of mode MODE from a register of
10894    class FROM to a GPR.  Return 0 for classes that are unions of other
10895    classes handled by this function.  */
10896
10897 static int
10898 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10899                        reg_class_t from)
10900 {
10901   switch (from)
10902     {
10903     case GENERAL_REGS:
10904       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10905       return 2;
10906
10907     case ACC_REGS:
10908       /* MFLO and MFHI.  */
10909       return 6;
10910
10911     case FP_REGS:
10912       /* MFC1, etc.  */
10913       return 4;
10914
10915     case ST_REGS:
10916       /* LUI followed by MOVF.  */
10917       return 4;
10918
10919     case COP0_REGS:
10920     case COP2_REGS:
10921     case COP3_REGS:
10922       /* This choice of value is historical.  */
10923       return 5;
10924
10925     default:
10926       return 0;
10927     }
10928 }
10929
10930 /* Return the cost of moving a value of mode MODE from a GPR to a
10931    register of class TO.  Return 0 for classes that are unions of
10932    other classes handled by this function.  */
10933
10934 static int
10935 mips_move_from_gpr_cost (enum machine_mode mode, reg_class_t to)
10936 {
10937   switch (to)
10938     {
10939     case GENERAL_REGS:
10940       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10941       return 2;
10942
10943     case ACC_REGS:
10944       /* MTLO and MTHI.  */
10945       return 6;
10946
10947     case FP_REGS:
10948       /* MTC1, etc.  */
10949       return 4;
10950
10951     case ST_REGS:
10952       /* A secondary reload through an FPR scratch.  */
10953       return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
10954               + mips_register_move_cost (mode, FP_REGS, ST_REGS));
10955
10956     case COP0_REGS:
10957     case COP2_REGS:
10958     case COP3_REGS:
10959       /* This choice of value is historical.  */
10960       return 5;
10961
10962     default:
10963       return 0;
10964     }
10965 }
10966
10967 /* Implement TARGET_REGISTER_MOVE_COST.  Return 0 for classes that are the
10968    maximum of the move costs for subclasses; regclass will work out
10969    the maximum for us.  */
10970
10971 static int
10972 mips_register_move_cost (enum machine_mode mode,
10973                          reg_class_t from, reg_class_t to)
10974 {
10975   reg_class_t dregs;
10976   int cost1, cost2;
10977
10978   from = mips_canonicalize_move_class (from);
10979   to = mips_canonicalize_move_class (to);
10980
10981   /* Handle moves that can be done without using general-purpose registers.  */
10982   if (from == FP_REGS)
10983     {
10984       if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
10985         /* MOV.FMT.  */
10986         return 4;
10987       if (to == ST_REGS)
10988         /* The sequence generated by mips_expand_fcc_reload.  */
10989         return 8;
10990     }
10991
10992   /* Handle cases in which only one class deviates from the ideal.  */
10993   dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
10994   if (from == dregs)
10995     return mips_move_from_gpr_cost (mode, to);
10996   if (to == dregs)
10997     return mips_move_to_gpr_cost (mode, from);
10998
10999   /* Handles cases that require a GPR temporary.  */
11000   cost1 = mips_move_to_gpr_cost (mode, from);
11001   if (cost1 != 0)
11002     {
11003       cost2 = mips_move_from_gpr_cost (mode, to);
11004       if (cost2 != 0)
11005         return cost1 + cost2;
11006     }
11007
11008   return 0;
11009 }
11010
11011 /* Implement TARGET_MEMORY_MOVE_COST.  */
11012
11013 static int
11014 mips_memory_move_cost (enum machine_mode mode, reg_class_t rclass, bool in)
11015 {
11016   return (mips_cost->memory_latency
11017           + memory_move_secondary_cost (mode, rclass, in));
11018
11019
11020 /* Return the register class required for a secondary register when
11021    copying between one of the registers in RCLASS and value X, which
11022    has mode MODE.  X is the source of the move if IN_P, otherwise it
11023    is the destination.  Return NO_REGS if no secondary register is
11024    needed.  */
11025
11026 enum reg_class
11027 mips_secondary_reload_class (enum reg_class rclass,
11028                              enum machine_mode mode, rtx x, bool in_p)
11029 {
11030   int regno;
11031
11032   /* If X is a constant that cannot be loaded into $25, it must be loaded
11033      into some other GPR.  No other register class allows a direct move.  */
11034   if (mips_dangerous_for_la25_p (x))
11035     return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
11036
11037   regno = true_regnum (x);
11038   if (TARGET_MIPS16)
11039     {
11040       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
11041       if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
11042         return M16_REGS;
11043
11044       return NO_REGS;
11045     }
11046
11047   /* Copying from accumulator registers to anywhere other than a general
11048      register requires a temporary general register.  */
11049   if (reg_class_subset_p (rclass, ACC_REGS))
11050     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
11051   if (ACC_REG_P (regno))
11052     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11053
11054   /* We can only copy a value to a condition code register from a
11055      floating-point register, and even then we require a scratch
11056      floating-point register.  We can only copy a value out of a
11057      condition-code register into a general register.  */
11058   if (reg_class_subset_p (rclass, ST_REGS))
11059     {
11060       if (in_p)
11061         return FP_REGS;
11062       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
11063     }
11064   if (ST_REG_P (regno))
11065     {
11066       if (!in_p)
11067         return FP_REGS;
11068       return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11069     }
11070
11071   if (reg_class_subset_p (rclass, FP_REGS))
11072     {
11073       if (MEM_P (x)
11074           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
11075         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
11076            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
11077         return NO_REGS;
11078
11079       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
11080         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
11081         return NO_REGS;
11082
11083       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
11084         /* We can force the constant to memory and use lwc1
11085            and ldc1.  As above, we will use pairs of lwc1s if
11086            ldc1 is not supported.  */
11087         return NO_REGS;
11088
11089       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
11090         /* In this case we can use mov.fmt.  */
11091         return NO_REGS;
11092
11093       /* Otherwise, we need to reload through an integer register.  */
11094       return GR_REGS;
11095     }
11096   if (FP_REG_P (regno))
11097     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11098
11099   return NO_REGS;
11100 }
11101
11102 /* Implement TARGET_MODE_REP_EXTENDED.  */
11103
11104 static int
11105 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
11106 {
11107   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
11108   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
11109     return SIGN_EXTEND;
11110
11111   return UNKNOWN;
11112 }
11113 \f
11114 /* Implement TARGET_VALID_POINTER_MODE.  */
11115
11116 static bool
11117 mips_valid_pointer_mode (enum machine_mode mode)
11118 {
11119   return mode == SImode || (TARGET_64BIT && mode == DImode);
11120 }
11121
11122 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
11123
11124 static bool
11125 mips_vector_mode_supported_p (enum machine_mode mode)
11126 {
11127   switch (mode)
11128     {
11129     case V2SFmode:
11130       return TARGET_PAIRED_SINGLE_FLOAT;
11131
11132     case V2HImode:
11133     case V4QImode:
11134     case V2HQmode:
11135     case V2UHQmode:
11136     case V2HAmode:
11137     case V2UHAmode:
11138     case V4QQmode:
11139     case V4UQQmode:
11140       return TARGET_DSP;
11141
11142     case V2SImode:
11143     case V4HImode:
11144     case V8QImode:
11145       return TARGET_LOONGSON_VECTORS;
11146
11147     default:
11148       return false;
11149     }
11150 }
11151
11152 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
11153
11154 static bool
11155 mips_scalar_mode_supported_p (enum machine_mode mode)
11156 {
11157   if (ALL_FIXED_POINT_MODE_P (mode)
11158       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
11159     return true;
11160
11161   return default_scalar_mode_supported_p (mode);
11162 }
11163 \f
11164 /* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE.  */
11165
11166 static enum machine_mode
11167 mips_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED)
11168 {
11169   if (TARGET_PAIRED_SINGLE_FLOAT
11170       && mode == SFmode)
11171     return V2SFmode;
11172   return word_mode;
11173 }
11174
11175 /* Implement TARGET_INIT_LIBFUNCS.  */
11176
11177 static void
11178 mips_init_libfuncs (void)
11179 {
11180   if (TARGET_FIX_VR4120)
11181     {
11182       /* Register the special divsi3 and modsi3 functions needed to work
11183          around VR4120 division errata.  */
11184       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
11185       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
11186     }
11187
11188   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
11189     {
11190       /* Register the MIPS16 -mhard-float stubs.  */
11191       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
11192       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
11193       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
11194       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
11195
11196       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
11197       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
11198       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
11199       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
11200       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
11201       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
11202       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
11203
11204       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
11205       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
11206       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
11207
11208       if (TARGET_DOUBLE_FLOAT)
11209         {
11210           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
11211           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
11212           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
11213           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
11214
11215           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
11216           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
11217           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
11218           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
11219           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
11220           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
11221           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
11222
11223           set_conv_libfunc (sext_optab, DFmode, SFmode,
11224                             "__mips16_extendsfdf2");
11225           set_conv_libfunc (trunc_optab, SFmode, DFmode,
11226                             "__mips16_truncdfsf2");
11227           set_conv_libfunc (sfix_optab, SImode, DFmode,
11228                             "__mips16_fix_truncdfsi");
11229           set_conv_libfunc (sfloat_optab, DFmode, SImode,
11230                             "__mips16_floatsidf");
11231           set_conv_libfunc (ufloat_optab, DFmode, SImode,
11232                             "__mips16_floatunsidf");
11233         }
11234     }
11235
11236   /* The MIPS16 ISA does not have an encoding for "sync", so we rely
11237      on an external non-MIPS16 routine to implement __sync_synchronize.  */
11238   if (TARGET_MIPS16)
11239     synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
11240 }
11241
11242 /* Build up a multi-insn sequence that loads label TARGET into $AT.  */
11243
11244 static void
11245 mips_process_load_label (rtx target)
11246 {
11247   rtx base, gp, intop;
11248   HOST_WIDE_INT offset;
11249
11250   mips_multi_start ();
11251   switch (mips_abi)
11252     {
11253     case ABI_N32:
11254       mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
11255       mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
11256       break;
11257
11258     case ABI_64:
11259       mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
11260       mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
11261       break;
11262
11263     default:
11264       gp = pic_offset_table_rtx;
11265       if (mips_cfun_has_cprestore_slot_p ())
11266         {
11267           gp = gen_rtx_REG (Pmode, AT_REGNUM);
11268           mips_get_cprestore_base_and_offset (&base, &offset, true);
11269           if (!SMALL_OPERAND (offset))
11270             {
11271               intop = GEN_INT (CONST_HIGH_PART (offset));
11272               mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
11273               mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
11274
11275               base = gp;
11276               offset = CONST_LOW_PART (offset);
11277             }
11278           intop = GEN_INT (offset);
11279           if (ISA_HAS_LOAD_DELAY)
11280             mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
11281           else
11282             mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
11283         }
11284       if (ISA_HAS_LOAD_DELAY)
11285         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
11286       else
11287         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
11288       mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
11289       break;
11290     }
11291 }
11292
11293 /* Return the number of instructions needed to load a label into $AT.  */
11294
11295 static unsigned int
11296 mips_load_label_num_insns (void)
11297 {
11298   if (cfun->machine->load_label_num_insns == 0)
11299     {
11300       mips_process_load_label (pc_rtx);
11301       cfun->machine->load_label_num_insns = mips_multi_num_insns;
11302     }
11303   return cfun->machine->load_label_num_insns;
11304 }
11305
11306 /* Emit an asm sequence to start a noat block and load the address
11307    of a label into $1.  */
11308
11309 void
11310 mips_output_load_label (rtx target)
11311 {
11312   mips_push_asm_switch (&mips_noat);
11313   if (TARGET_EXPLICIT_RELOCS)
11314     {
11315       mips_process_load_label (target);
11316       mips_multi_write ();
11317     }
11318   else
11319     {
11320       if (Pmode == DImode)
11321         output_asm_insn ("dla\t%@,%0", &target);
11322       else
11323         output_asm_insn ("la\t%@,%0", &target);
11324     }
11325 }
11326
11327 /* Return the length of INSN.  LENGTH is the initial length computed by
11328    attributes in the machine-description file.  */
11329
11330 int
11331 mips_adjust_insn_length (rtx insn, int length)
11332 {
11333   /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
11334      of a PIC long-branch sequence.  Substitute the correct value.  */
11335   if (length == MAX_PIC_BRANCH_LENGTH
11336       && INSN_CODE (insn) >= 0
11337       && get_attr_type (insn) == TYPE_BRANCH)
11338     {
11339       /* Add the branch-over instruction and its delay slot, if this
11340          is a conditional branch.  */
11341       length = simplejump_p (insn) ? 0 : 8;
11342
11343       /* Load the label into $AT and jump to it.  Ignore the delay
11344          slot of the jump.  */
11345       length += 4 * mips_load_label_num_insns() + 4;
11346     }
11347
11348   /* A unconditional jump has an unfilled delay slot if it is not part
11349      of a sequence.  A conditional jump normally has a delay slot, but
11350      does not on MIPS16.  */
11351   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
11352     length += 4;
11353
11354   /* See how many nops might be needed to avoid hardware hazards.  */
11355   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
11356     switch (get_attr_hazard (insn))
11357       {
11358       case HAZARD_NONE:
11359         break;
11360
11361       case HAZARD_DELAY:
11362         length += 4;
11363         break;
11364
11365       case HAZARD_HILO:
11366         length += 8;
11367         break;
11368       }
11369
11370   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
11371      the .md file length attributes are 4-based for both modes.
11372      Adjust the MIPS16 ones here.  */
11373   if (TARGET_MIPS16)
11374     length /= 2;
11375
11376   return length;
11377 }
11378
11379 /* Return the assembly code for INSN, which has the operands given by
11380    OPERANDS, and which branches to OPERANDS[0] if some condition is true.
11381    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
11382    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
11383    version of BRANCH_IF_TRUE.  */
11384
11385 const char *
11386 mips_output_conditional_branch (rtx insn, rtx *operands,
11387                                 const char *branch_if_true,
11388                                 const char *branch_if_false)
11389 {
11390   unsigned int length;
11391   rtx taken, not_taken;
11392
11393   gcc_assert (LABEL_P (operands[0]));
11394
11395   length = get_attr_length (insn);
11396   if (length <= 8)
11397     {
11398       /* Just a simple conditional branch.  */
11399       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
11400       return branch_if_true;
11401     }
11402
11403   /* Generate a reversed branch around a direct jump.  This fallback does
11404      not use branch-likely instructions.  */
11405   mips_branch_likely = false;
11406   not_taken = gen_label_rtx ();
11407   taken = operands[0];
11408
11409   /* Generate the reversed branch to NOT_TAKEN.  */
11410   operands[0] = not_taken;
11411   output_asm_insn (branch_if_false, operands);
11412
11413   /* If INSN has a delay slot, we must provide delay slots for both the
11414      branch to NOT_TAKEN and the conditional jump.  We must also ensure
11415      that INSN's delay slot is executed in the appropriate cases.  */
11416   if (final_sequence)
11417     {
11418       /* This first delay slot will always be executed, so use INSN's
11419          delay slot if is not annulled.  */
11420       if (!INSN_ANNULLED_BRANCH_P (insn))
11421         {
11422           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11423                            asm_out_file, optimize, 1, NULL);
11424           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11425         }
11426       else
11427         output_asm_insn ("nop", 0);
11428       fprintf (asm_out_file, "\n");
11429     }
11430
11431   /* Output the unconditional branch to TAKEN.  */
11432   if (TARGET_ABSOLUTE_JUMPS)
11433     output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
11434   else
11435     {
11436       mips_output_load_label (taken);
11437       output_asm_insn ("jr\t%@%]%/", 0);
11438     }
11439
11440   /* Now deal with its delay slot; see above.  */
11441   if (final_sequence)
11442     {
11443       /* This delay slot will only be executed if the branch is taken.
11444          Use INSN's delay slot if is annulled.  */
11445       if (INSN_ANNULLED_BRANCH_P (insn))
11446         {
11447           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11448                            asm_out_file, optimize, 1, NULL);
11449           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11450         }
11451       else
11452         output_asm_insn ("nop", 0);
11453       fprintf (asm_out_file, "\n");
11454     }
11455
11456   /* Output NOT_TAKEN.  */
11457   targetm.asm_out.internal_label (asm_out_file, "L",
11458                                   CODE_LABEL_NUMBER (not_taken));
11459   return "";
11460 }
11461
11462 /* Return the assembly code for INSN, which branches to OPERANDS[0]
11463    if some ordering condition is true.  The condition is given by
11464    OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
11465    OPERANDS[1].  OPERANDS[2] is the comparison's first operand;
11466    its second is always zero.  */
11467
11468 const char *
11469 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
11470 {
11471   const char *branch[2];
11472
11473   /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
11474      Make BRANCH[0] branch on the inverse condition.  */
11475   switch (GET_CODE (operands[1]))
11476     {
11477       /* These cases are equivalent to comparisons against zero.  */
11478     case LEU:
11479       inverted_p = !inverted_p;
11480       /* Fall through.  */
11481     case GTU:
11482       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
11483       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
11484       break;
11485
11486       /* These cases are always true or always false.  */
11487     case LTU:
11488       inverted_p = !inverted_p;
11489       /* Fall through.  */
11490     case GEU:
11491       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
11492       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
11493       break;
11494
11495     default:
11496       branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
11497       branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
11498       break;
11499     }
11500   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
11501 }
11502 \f
11503 /* Start a block of code that needs access to the LL, SC and SYNC
11504    instructions.  */
11505
11506 static void
11507 mips_start_ll_sc_sync_block (void)
11508 {
11509   if (!ISA_HAS_LL_SC)
11510     {
11511       output_asm_insn (".set\tpush", 0);
11512       output_asm_insn (".set\tmips2", 0);
11513     }
11514 }
11515
11516 /* End a block started by mips_start_ll_sc_sync_block.  */
11517
11518 static void
11519 mips_end_ll_sc_sync_block (void)
11520 {
11521   if (!ISA_HAS_LL_SC)
11522     output_asm_insn (".set\tpop", 0);
11523 }
11524
11525 /* Output and/or return the asm template for a sync instruction.  */
11526
11527 const char *
11528 mips_output_sync (void)
11529 {
11530   mips_start_ll_sc_sync_block ();
11531   output_asm_insn ("sync", 0);
11532   mips_end_ll_sc_sync_block ();
11533   return "";
11534 }
11535
11536 /* Return the asm template associated with sync_insn1 value TYPE.
11537    IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation.  */
11538
11539 static const char *
11540 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
11541 {
11542   switch (type)
11543     {
11544     case SYNC_INSN1_MOVE:
11545       return "move\t%0,%z2";
11546     case SYNC_INSN1_LI:
11547       return "li\t%0,%2";
11548     case SYNC_INSN1_ADDU:
11549       return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
11550     case SYNC_INSN1_ADDIU:
11551       return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
11552     case SYNC_INSN1_SUBU:
11553       return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
11554     case SYNC_INSN1_AND:
11555       return "and\t%0,%1,%z2";
11556     case SYNC_INSN1_ANDI:
11557       return "andi\t%0,%1,%2";
11558     case SYNC_INSN1_OR:
11559       return "or\t%0,%1,%z2";
11560     case SYNC_INSN1_ORI:
11561       return "ori\t%0,%1,%2";
11562     case SYNC_INSN1_XOR:
11563       return "xor\t%0,%1,%z2";
11564     case SYNC_INSN1_XORI:
11565       return "xori\t%0,%1,%2";
11566     }
11567   gcc_unreachable ();
11568 }
11569
11570 /* Return the asm template associated with sync_insn2 value TYPE.  */
11571
11572 static const char *
11573 mips_sync_insn2_template (enum attr_sync_insn2 type)
11574 {
11575   switch (type)
11576     {
11577     case SYNC_INSN2_NOP:
11578       gcc_unreachable ();
11579     case SYNC_INSN2_AND:
11580       return "and\t%0,%1,%z2";
11581     case SYNC_INSN2_XOR:
11582       return "xor\t%0,%1,%z2";
11583     case SYNC_INSN2_NOT:
11584       return "nor\t%0,%1,%.";
11585     }
11586   gcc_unreachable ();
11587 }
11588
11589 /* OPERANDS are the operands to a sync loop instruction and INDEX is
11590    the value of the one of the sync_* attributes.  Return the operand
11591    referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
11592    have the associated attribute.  */
11593
11594 static rtx
11595 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
11596 {
11597   if (index > 0)
11598     default_value = operands[index - 1];
11599   return default_value;
11600 }
11601
11602 /* INSN is a sync loop with operands OPERANDS.  Build up a multi-insn
11603    sequence for it.  */
11604
11605 static void
11606 mips_process_sync_loop (rtx insn, rtx *operands)
11607 {
11608   rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
11609   rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3;
11610   unsigned int tmp3_insn;
11611   enum attr_sync_insn1 insn1;
11612   enum attr_sync_insn2 insn2;
11613   bool is_64bit_p;
11614
11615   /* Read an operand from the sync_WHAT attribute and store it in
11616      variable WHAT.  DEFAULT is the default value if no attribute
11617      is specified.  */
11618 #define READ_OPERAND(WHAT, DEFAULT) \
11619   WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
11620                                 DEFAULT)
11621
11622   /* Read the memory.  */
11623   READ_OPERAND (mem, 0);
11624   gcc_assert (mem);
11625   is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
11626
11627   /* Read the other attributes.  */
11628   at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
11629   READ_OPERAND (oldval, at);
11630   READ_OPERAND (newval, at);
11631   READ_OPERAND (inclusive_mask, 0);
11632   READ_OPERAND (exclusive_mask, 0);
11633   READ_OPERAND (required_oldval, 0);
11634   READ_OPERAND (insn1_op2, 0);
11635   insn1 = get_attr_sync_insn1 (insn);
11636   insn2 = get_attr_sync_insn2 (insn);
11637
11638   mips_multi_start ();
11639
11640   /* Output the release side of the memory barrier.  */
11641   if (get_attr_sync_release_barrier (insn) == SYNC_RELEASE_BARRIER_YES)
11642     {
11643       if (required_oldval == 0 && TARGET_OCTEON)
11644         {
11645           /* Octeon doesn't reorder reads, so a full barrier can be
11646              created by using SYNCW to order writes combined with the
11647              write from the following SC.  When the SC successfully
11648              completes, we know that all preceding writes are also
11649              committed to the coherent memory system.  It is possible
11650              for a single SYNCW to fail, but a pair of them will never
11651              fail, so we use two.  */
11652           mips_multi_add_insn ("syncw", NULL);
11653           mips_multi_add_insn ("syncw", NULL);
11654         }
11655       else
11656         mips_multi_add_insn ("sync", NULL);
11657     }
11658
11659   /* Output the branch-back label.  */
11660   mips_multi_add_label ("1:");
11661
11662   /* OLDVAL = *MEM.  */
11663   mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
11664                        oldval, mem, NULL);
11665
11666   /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2.  */
11667   if (required_oldval)
11668     {
11669       if (inclusive_mask == 0)
11670         tmp1 = oldval;
11671       else
11672         {
11673           gcc_assert (oldval != at);
11674           mips_multi_add_insn ("and\t%0,%1,%2",
11675                                at, oldval, inclusive_mask, NULL);
11676           tmp1 = at;
11677         }
11678       mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
11679     }
11680
11681   /* $TMP1 = OLDVAL & EXCLUSIVE_MASK.  */
11682   if (exclusive_mask == 0)
11683     tmp1 = const0_rtx;
11684   else
11685     {
11686       gcc_assert (oldval != at);
11687       mips_multi_add_insn ("and\t%0,%1,%z2",
11688                            at, oldval, exclusive_mask, NULL);
11689       tmp1 = at;
11690     }
11691
11692   /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
11693
11694      We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
11695      at least one instruction in that case.  */
11696   if (insn1 == SYNC_INSN1_MOVE
11697       && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
11698     tmp2 = insn1_op2;
11699   else
11700     {
11701       mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
11702                            newval, oldval, insn1_op2, NULL);
11703       tmp2 = newval;
11704     }
11705
11706   /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK).  */
11707   if (insn2 == SYNC_INSN2_NOP)
11708     tmp3 = tmp2;
11709   else
11710     {
11711       mips_multi_add_insn (mips_sync_insn2_template (insn2),
11712                            newval, tmp2, inclusive_mask, NULL);
11713       tmp3 = newval;
11714     }
11715   tmp3_insn = mips_multi_last_index ();
11716
11717   /* $AT = $TMP1 | $TMP3.  */
11718   if (tmp1 == const0_rtx || tmp3 == const0_rtx)
11719     {
11720       mips_multi_set_operand (tmp3_insn, 0, at);
11721       tmp3 = at;
11722     }
11723   else
11724     {
11725       gcc_assert (tmp1 != tmp3);
11726       mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
11727     }
11728
11729   /* if (!commit (*MEM = $AT)) goto 1.
11730
11731      This will sometimes be a delayed branch; see the write code below
11732      for details.  */
11733   mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
11734   mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
11735
11736   /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot].  */
11737   if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
11738     {
11739       mips_multi_copy_insn (tmp3_insn);
11740       mips_multi_set_operand (mips_multi_last_index (), 0, newval);
11741     }
11742   else
11743     mips_multi_add_insn ("nop", NULL);
11744
11745   /* Output the acquire side of the memory barrier.  */
11746   if (TARGET_SYNC_AFTER_SC)
11747     mips_multi_add_insn ("sync", NULL);
11748
11749   /* Output the exit label, if needed.  */
11750   if (required_oldval)
11751     mips_multi_add_label ("2:");
11752
11753 #undef READ_OPERAND
11754 }
11755
11756 /* Output and/or return the asm template for sync loop INSN, which has
11757    the operands given by OPERANDS.  */
11758
11759 const char *
11760 mips_output_sync_loop (rtx insn, rtx *operands)
11761 {
11762   mips_process_sync_loop (insn, operands);
11763
11764   /* Use branch-likely instructions to work around the LL/SC R10000
11765      errata.  */
11766   mips_branch_likely = TARGET_FIX_R10000;
11767
11768   mips_push_asm_switch (&mips_noreorder);
11769   mips_push_asm_switch (&mips_nomacro);
11770   mips_push_asm_switch (&mips_noat);
11771   mips_start_ll_sc_sync_block ();
11772
11773   mips_multi_write ();
11774
11775   mips_end_ll_sc_sync_block ();
11776   mips_pop_asm_switch (&mips_noat);
11777   mips_pop_asm_switch (&mips_nomacro);
11778   mips_pop_asm_switch (&mips_noreorder);
11779
11780   return "";
11781 }
11782
11783 /* Return the number of individual instructions in sync loop INSN,
11784    which has the operands given by OPERANDS.  */
11785
11786 unsigned int
11787 mips_sync_loop_insns (rtx insn, rtx *operands)
11788 {
11789   mips_process_sync_loop (insn, operands);
11790   return mips_multi_num_insns;
11791 }
11792 \f
11793 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
11794    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
11795
11796    When working around R4000 and R4400 errata, we need to make sure that
11797    the division is not immediately followed by a shift[1][2].  We also
11798    need to stop the division from being put into a branch delay slot[3].
11799    The easiest way to avoid both problems is to add a nop after the
11800    division.  When a divide-by-zero check is needed, this nop can be
11801    used to fill the branch delay slot.
11802
11803    [1] If a double-word or a variable shift executes immediately
11804        after starting an integer division, the shift may give an
11805        incorrect result.  See quotations of errata #16 and #28 from
11806        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11807        in mips.md for details.
11808
11809    [2] A similar bug to [1] exists for all revisions of the
11810        R4000 and the R4400 when run in an MC configuration.
11811        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
11812
11813        "19. In this following sequence:
11814
11815                     ddiv                (or ddivu or div or divu)
11816                     dsll32              (or dsrl32, dsra32)
11817
11818             if an MPT stall occurs, while the divide is slipping the cpu
11819             pipeline, then the following double shift would end up with an
11820             incorrect result.
11821
11822             Workaround: The compiler needs to avoid generating any
11823             sequence with divide followed by extended double shift."
11824
11825        This erratum is also present in "MIPS R4400MC Errata, Processor
11826        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
11827        & 3.0" as errata #10 and #4, respectively.
11828
11829    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11830        (also valid for MIPS R4000MC processors):
11831
11832        "52. R4000SC: This bug does not apply for the R4000PC.
11833
11834             There are two flavors of this bug:
11835
11836             1) If the instruction just after divide takes an RF exception
11837                (tlb-refill, tlb-invalid) and gets an instruction cache
11838                miss (both primary and secondary) and the line which is
11839                currently in secondary cache at this index had the first
11840                data word, where the bits 5..2 are set, then R4000 would
11841                get a wrong result for the div.
11842
11843             ##1
11844                     nop
11845                     div r8, r9
11846                     -------------------         # end-of page. -tlb-refill
11847                     nop
11848             ##2
11849                     nop
11850                     div r8, r9
11851                     -------------------         # end-of page. -tlb-invalid
11852                     nop
11853
11854             2) If the divide is in the taken branch delay slot, where the
11855                target takes RF exception and gets an I-cache miss for the
11856                exception vector or where I-cache miss occurs for the
11857                target address, under the above mentioned scenarios, the
11858                div would get wrong results.
11859
11860             ##1
11861                     j   r2              # to next page mapped or unmapped
11862                     div r8,r9           # this bug would be there as long
11863                                         # as there is an ICache miss and
11864                     nop                 # the "data pattern" is present
11865
11866             ##2
11867                     beq r0, r0, NextPage        # to Next page
11868                     div r8,r9
11869                     nop
11870
11871             This bug is present for div, divu, ddiv, and ddivu
11872             instructions.
11873
11874             Workaround: For item 1), OS could make sure that the next page
11875             after the divide instruction is also mapped.  For item 2), the
11876             compiler could make sure that the divide instruction is not in
11877             the branch delay slot."
11878
11879        These processors have PRId values of 0x00004220 and 0x00004300 for
11880        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
11881
11882 const char *
11883 mips_output_division (const char *division, rtx *operands)
11884 {
11885   const char *s;
11886
11887   s = division;
11888   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
11889     {
11890       output_asm_insn (s, operands);
11891       s = "nop";
11892     }
11893   if (TARGET_CHECK_ZERO_DIV)
11894     {
11895       if (TARGET_MIPS16)
11896         {
11897           output_asm_insn (s, operands);
11898           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
11899         }
11900       else if (GENERATE_DIVIDE_TRAPS)
11901         {
11902           /* Avoid long replay penalty on load miss by putting the trap before
11903              the divide.  */
11904           if (TUNE_74K)
11905             output_asm_insn ("teq\t%2,%.,7", operands);
11906           else
11907             {
11908               output_asm_insn (s, operands);
11909               s = "teq\t%2,%.,7";
11910             }
11911         }
11912       else
11913         {
11914           output_asm_insn ("%(bne\t%2,%.,1f", operands);
11915           output_asm_insn (s, operands);
11916           s = "break\t7%)\n1:";
11917         }
11918     }
11919   return s;
11920 }
11921 \f
11922 /* Return true if IN_INSN is a multiply-add or multiply-subtract
11923    instruction and if OUT_INSN assigns to the accumulator operand.  */
11924
11925 bool
11926 mips_linked_madd_p (rtx out_insn, rtx in_insn)
11927 {
11928   rtx x;
11929
11930   x = single_set (in_insn);
11931   if (x == 0)
11932     return false;
11933
11934   x = SET_SRC (x);
11935
11936   if (GET_CODE (x) == PLUS
11937       && GET_CODE (XEXP (x, 0)) == MULT
11938       && reg_set_p (XEXP (x, 1), out_insn))
11939     return true;
11940
11941   if (GET_CODE (x) == MINUS
11942       && GET_CODE (XEXP (x, 1)) == MULT
11943       && reg_set_p (XEXP (x, 0), out_insn))
11944     return true;
11945
11946   return false;
11947 }
11948
11949 /* True if the dependency between OUT_INSN and IN_INSN is on the store
11950    data rather than the address.  We need this because the cprestore
11951    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
11952    which causes the default routine to abort.  We just return false
11953    for that case.  */
11954
11955 bool
11956 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
11957 {
11958   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
11959     return false;
11960
11961   return !store_data_bypass_p (out_insn, in_insn);
11962 }
11963 \f
11964
11965 /* Variables and flags used in scheduler hooks when tuning for
11966    Loongson 2E/2F.  */
11967 static struct
11968 {
11969   /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
11970      strategy.  */
11971
11972   /* If true, then next ALU1/2 instruction will go to ALU1.  */
11973   bool alu1_turn_p;
11974
11975   /* If true, then next FALU1/2 unstruction will go to FALU1.  */
11976   bool falu1_turn_p;
11977
11978   /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
11979   int alu1_core_unit_code;
11980   int alu2_core_unit_code;
11981   int falu1_core_unit_code;
11982   int falu2_core_unit_code;
11983
11984   /* True if current cycle has a multi instruction.
11985      This flag is used in mips_ls2_dfa_post_advance_cycle.  */
11986   bool cycle_has_multi_p;
11987
11988   /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
11989      These are used in mips_ls2_dfa_post_advance_cycle to initialize
11990      DFA state.
11991      E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
11992      instruction to go ALU1.  */
11993   rtx alu1_turn_enabled_insn;
11994   rtx alu2_turn_enabled_insn;
11995   rtx falu1_turn_enabled_insn;
11996   rtx falu2_turn_enabled_insn;
11997 } mips_ls2;
11998
11999 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
12000    dependencies have no cost, except on the 20Kc where output-dependence
12001    is treated like input-dependence.  */
12002
12003 static int
12004 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
12005                   rtx dep ATTRIBUTE_UNUSED, int cost)
12006 {
12007   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
12008       && TUNE_20KC)
12009     return cost;
12010   if (REG_NOTE_KIND (link) != 0)
12011     return 0;
12012   return cost;
12013 }
12014
12015 /* Return the number of instructions that can be issued per cycle.  */
12016
12017 static int
12018 mips_issue_rate (void)
12019 {
12020   switch (mips_tune)
12021     {
12022     case PROCESSOR_74KC:
12023     case PROCESSOR_74KF2_1:
12024     case PROCESSOR_74KF1_1:
12025     case PROCESSOR_74KF3_2:
12026       /* The 74k is not strictly quad-issue cpu, but can be seen as one
12027          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
12028          but in reality only a maximum of 3 insns can be issued as
12029          floating-point loads and stores also require a slot in the
12030          AGEN pipe.  */
12031     case PROCESSOR_R10000:
12032       /* All R10K Processors are quad-issue (being the first MIPS
12033          processors to support this feature). */
12034       return 4;
12035
12036     case PROCESSOR_20KC:
12037     case PROCESSOR_R4130:
12038     case PROCESSOR_R5400:
12039     case PROCESSOR_R5500:
12040     case PROCESSOR_R7000:
12041     case PROCESSOR_R9000:
12042     case PROCESSOR_OCTEON:
12043       return 2;
12044
12045     case PROCESSOR_SB1:
12046     case PROCESSOR_SB1A:
12047       /* This is actually 4, but we get better performance if we claim 3.
12048          This is partly because of unwanted speculative code motion with the
12049          larger number, and partly because in most common cases we can't
12050          reach the theoretical max of 4.  */
12051       return 3;
12052
12053     case PROCESSOR_LOONGSON_2E:
12054     case PROCESSOR_LOONGSON_2F:
12055     case PROCESSOR_LOONGSON_3A:
12056       return 4;
12057
12058     default:
12059       return 1;
12060     }
12061 }
12062
12063 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
12064
12065 static void
12066 mips_ls2_init_dfa_post_cycle_insn (void)
12067 {
12068   start_sequence ();
12069   emit_insn (gen_ls2_alu1_turn_enabled_insn ());
12070   mips_ls2.alu1_turn_enabled_insn = get_insns ();
12071   end_sequence ();
12072
12073   start_sequence ();
12074   emit_insn (gen_ls2_alu2_turn_enabled_insn ());
12075   mips_ls2.alu2_turn_enabled_insn = get_insns ();
12076   end_sequence ();
12077
12078   start_sequence ();
12079   emit_insn (gen_ls2_falu1_turn_enabled_insn ());
12080   mips_ls2.falu1_turn_enabled_insn = get_insns ();
12081   end_sequence ();
12082
12083   start_sequence ();
12084   emit_insn (gen_ls2_falu2_turn_enabled_insn ());
12085   mips_ls2.falu2_turn_enabled_insn = get_insns ();
12086   end_sequence ();
12087
12088   mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
12089   mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
12090   mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
12091   mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
12092 }
12093
12094 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
12095    Init data used in mips_dfa_post_advance_cycle.  */
12096
12097 static void
12098 mips_init_dfa_post_cycle_insn (void)
12099 {
12100   if (TUNE_LOONGSON_2EF)
12101     mips_ls2_init_dfa_post_cycle_insn ();
12102 }
12103
12104 /* Initialize STATE when scheduling for Loongson 2E/2F.
12105    Support round-robin dispatch scheme by enabling only one of
12106    ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
12107    respectively.  */
12108
12109 static void
12110 mips_ls2_dfa_post_advance_cycle (state_t state)
12111 {
12112   if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
12113     {
12114       /* Though there are no non-pipelined ALU1 insns,
12115          we can get an instruction of type 'multi' before reload.  */
12116       gcc_assert (mips_ls2.cycle_has_multi_p);
12117       mips_ls2.alu1_turn_p = false;
12118     }
12119
12120   mips_ls2.cycle_has_multi_p = false;
12121
12122   if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
12123     /* We have a non-pipelined alu instruction in the core,
12124        adjust round-robin counter.  */
12125     mips_ls2.alu1_turn_p = true;
12126
12127   if (mips_ls2.alu1_turn_p)
12128     {
12129       if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
12130         gcc_unreachable ();
12131     }
12132   else
12133     {
12134       if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
12135         gcc_unreachable ();
12136     }
12137
12138   if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
12139     {
12140       /* There are no non-pipelined FALU1 insns.  */
12141       gcc_unreachable ();
12142       mips_ls2.falu1_turn_p = false;
12143     }
12144
12145   if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
12146     /* We have a non-pipelined falu instruction in the core,
12147        adjust round-robin counter.  */
12148     mips_ls2.falu1_turn_p = true;
12149
12150   if (mips_ls2.falu1_turn_p)
12151     {
12152       if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
12153         gcc_unreachable ();
12154     }
12155   else
12156     {
12157       if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
12158         gcc_unreachable ();
12159     }
12160 }
12161
12162 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
12163    This hook is being called at the start of each cycle.  */
12164
12165 static void
12166 mips_dfa_post_advance_cycle (void)
12167 {
12168   if (TUNE_LOONGSON_2EF)
12169     mips_ls2_dfa_post_advance_cycle (curr_state);
12170 }
12171
12172 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
12173    be as wide as the scheduling freedom in the DFA.  */
12174
12175 static int
12176 mips_multipass_dfa_lookahead (void)
12177 {
12178   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
12179   if (TUNE_SB1)
12180     return 4;
12181
12182   if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
12183     return 4;
12184
12185   if (TUNE_OCTEON)
12186     return 2;
12187
12188   return 0;
12189 }
12190 \f
12191 /* Remove the instruction at index LOWER from ready queue READY and
12192    reinsert it in front of the instruction at index HIGHER.  LOWER must
12193    be <= HIGHER.  */
12194
12195 static void
12196 mips_promote_ready (rtx *ready, int lower, int higher)
12197 {
12198   rtx new_head;
12199   int i;
12200
12201   new_head = ready[lower];
12202   for (i = lower; i < higher; i++)
12203     ready[i] = ready[i + 1];
12204   ready[i] = new_head;
12205 }
12206
12207 /* If the priority of the instruction at POS2 in the ready queue READY
12208    is within LIMIT units of that of the instruction at POS1, swap the
12209    instructions if POS2 is not already less than POS1.  */
12210
12211 static void
12212 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
12213 {
12214   if (pos1 < pos2
12215       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
12216     {
12217       rtx temp;
12218
12219       temp = ready[pos1];
12220       ready[pos1] = ready[pos2];
12221       ready[pos2] = temp;
12222     }
12223 }
12224 \f
12225 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
12226    that may clobber hi or lo.  */
12227 static rtx mips_macc_chains_last_hilo;
12228
12229 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
12230    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
12231
12232 static void
12233 mips_macc_chains_record (rtx insn)
12234 {
12235   if (get_attr_may_clobber_hilo (insn))
12236     mips_macc_chains_last_hilo = insn;
12237 }
12238
12239 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
12240    has NREADY elements, looking for a multiply-add or multiply-subtract
12241    instruction that is cumulative with mips_macc_chains_last_hilo.
12242    If there is one, promote it ahead of anything else that might
12243    clobber hi or lo.  */
12244
12245 static void
12246 mips_macc_chains_reorder (rtx *ready, int nready)
12247 {
12248   int i, j;
12249
12250   if (mips_macc_chains_last_hilo != 0)
12251     for (i = nready - 1; i >= 0; i--)
12252       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
12253         {
12254           for (j = nready - 1; j > i; j--)
12255             if (recog_memoized (ready[j]) >= 0
12256                 && get_attr_may_clobber_hilo (ready[j]))
12257               {
12258                 mips_promote_ready (ready, i, j);
12259                 break;
12260               }
12261           break;
12262         }
12263 }
12264 \f
12265 /* The last instruction to be scheduled.  */
12266 static rtx vr4130_last_insn;
12267
12268 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
12269    points to an rtx that is initially an instruction.  Nullify the rtx
12270    if the instruction uses the value of register X.  */
12271
12272 static void
12273 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
12274                                 void *data)
12275 {
12276   rtx *insn_ptr;
12277
12278   insn_ptr = (rtx *) data;
12279   if (REG_P (x)
12280       && *insn_ptr != 0
12281       && reg_referenced_p (x, PATTERN (*insn_ptr)))
12282     *insn_ptr = 0;
12283 }
12284
12285 /* Return true if there is true register dependence between vr4130_last_insn
12286    and INSN.  */
12287
12288 static bool
12289 vr4130_true_reg_dependence_p (rtx insn)
12290 {
12291   note_stores (PATTERN (vr4130_last_insn),
12292                vr4130_true_reg_dependence_p_1, &insn);
12293   return insn == 0;
12294 }
12295
12296 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
12297    the ready queue and that INSN2 is the instruction after it, return
12298    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
12299    in which INSN1 and INSN2 can probably issue in parallel, but for
12300    which (INSN2, INSN1) should be less sensitive to instruction
12301    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
12302
12303 static bool
12304 vr4130_swap_insns_p (rtx insn1, rtx insn2)
12305 {
12306   sd_iterator_def sd_it;
12307   dep_t dep;
12308
12309   /* Check for the following case:
12310
12311      1) there is some other instruction X with an anti dependence on INSN1;
12312      2) X has a higher priority than INSN2; and
12313      3) X is an arithmetic instruction (and thus has no unit restrictions).
12314
12315      If INSN1 is the last instruction blocking X, it would better to
12316      choose (INSN1, X) over (INSN2, INSN1).  */
12317   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
12318     if (DEP_TYPE (dep) == REG_DEP_ANTI
12319         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
12320         && recog_memoized (DEP_CON (dep)) >= 0
12321         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
12322       return false;
12323
12324   if (vr4130_last_insn != 0
12325       && recog_memoized (insn1) >= 0
12326       && recog_memoized (insn2) >= 0)
12327     {
12328       /* See whether INSN1 and INSN2 use different execution units,
12329          or if they are both ALU-type instructions.  If so, they can
12330          probably execute in parallel.  */
12331       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
12332       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
12333       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
12334         {
12335           /* If only one of the instructions has a dependence on
12336              vr4130_last_insn, prefer to schedule the other one first.  */
12337           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
12338           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
12339           if (dep1_p != dep2_p)
12340             return dep1_p;
12341
12342           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
12343              is not an ALU-type instruction and if INSN1 uses the same
12344              execution unit.  (Note that if this condition holds, we already
12345              know that INSN2 uses a different execution unit.)  */
12346           if (class1 != VR4130_CLASS_ALU
12347               && recog_memoized (vr4130_last_insn) >= 0
12348               && class1 == get_attr_vr4130_class (vr4130_last_insn))
12349             return true;
12350         }
12351     }
12352   return false;
12353 }
12354
12355 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
12356    queue with at least two instructions.  Swap the first two if
12357    vr4130_swap_insns_p says that it could be worthwhile.  */
12358
12359 static void
12360 vr4130_reorder (rtx *ready, int nready)
12361 {
12362   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
12363     mips_promote_ready (ready, nready - 2, nready - 1);
12364 }
12365 \f
12366 /* Record whether last 74k AGEN instruction was a load or store.  */
12367 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
12368
12369 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
12370    resets to TYPE_UNKNOWN state.  */
12371
12372 static void
12373 mips_74k_agen_init (rtx insn)
12374 {
12375   if (!insn || CALL_P (insn) || JUMP_P (insn))
12376     mips_last_74k_agen_insn = TYPE_UNKNOWN;
12377   else
12378     {
12379       enum attr_type type = get_attr_type (insn);
12380       if (type == TYPE_LOAD || type == TYPE_STORE)
12381         mips_last_74k_agen_insn = type;
12382     }
12383 }
12384
12385 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
12386    loads to be grouped together, and multiple stores to be grouped
12387    together.  Swap things around in the ready queue to make this happen.  */
12388
12389 static void
12390 mips_74k_agen_reorder (rtx *ready, int nready)
12391 {
12392   int i;
12393   int store_pos, load_pos;
12394
12395   store_pos = -1;
12396   load_pos = -1;
12397
12398   for (i = nready - 1; i >= 0; i--)
12399     {
12400       rtx insn = ready[i];
12401       if (USEFUL_INSN_P (insn))
12402         switch (get_attr_type (insn))
12403           {
12404           case TYPE_STORE:
12405             if (store_pos == -1)
12406               store_pos = i;
12407             break;
12408
12409           case TYPE_LOAD:
12410             if (load_pos == -1)
12411               load_pos = i;
12412             break;
12413
12414           default:
12415             break;
12416           }
12417     }
12418
12419   if (load_pos == -1 || store_pos == -1)
12420     return;
12421
12422   switch (mips_last_74k_agen_insn)
12423     {
12424     case TYPE_UNKNOWN:
12425       /* Prefer to schedule loads since they have a higher latency.  */
12426     case TYPE_LOAD:
12427       /* Swap loads to the front of the queue.  */
12428       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
12429       break;
12430     case TYPE_STORE:
12431       /* Swap stores to the front of the queue.  */
12432       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
12433       break;
12434     default:
12435       break;
12436     }
12437 }
12438 \f
12439 /* Implement TARGET_SCHED_INIT.  */
12440
12441 static void
12442 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12443                  int max_ready ATTRIBUTE_UNUSED)
12444 {
12445   mips_macc_chains_last_hilo = 0;
12446   vr4130_last_insn = 0;
12447   mips_74k_agen_init (NULL_RTX);
12448
12449   /* When scheduling for Loongson2, branch instructions go to ALU1,
12450      therefore basic block is most likely to start with round-robin counter
12451      pointed to ALU2.  */
12452   mips_ls2.alu1_turn_p = false;
12453   mips_ls2.falu1_turn_p = true;
12454 }
12455
12456 /* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
12457
12458 static void
12459 mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12460                       rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12461 {
12462   if (!reload_completed
12463       && TUNE_MACC_CHAINS
12464       && *nreadyp > 0)
12465     mips_macc_chains_reorder (ready, *nreadyp);
12466
12467   if (reload_completed
12468       && TUNE_MIPS4130
12469       && !TARGET_VR4130_ALIGN
12470       && *nreadyp > 1)
12471     vr4130_reorder (ready, *nreadyp);
12472
12473   if (TUNE_74K)
12474     mips_74k_agen_reorder (ready, *nreadyp);
12475 }
12476
12477 /* Implement TARGET_SCHED_REORDER.  */
12478
12479 static int
12480 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12481                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12482 {
12483   mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
12484   return mips_issue_rate ();
12485 }
12486
12487 /* Implement TARGET_SCHED_REORDER2.  */
12488
12489 static int
12490 mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12491                      rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12492 {
12493   mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
12494   return cached_can_issue_more;
12495 }
12496
12497 /* Update round-robin counters for ALU1/2 and FALU1/2.  */
12498
12499 static void
12500 mips_ls2_variable_issue (rtx insn)
12501 {
12502   if (mips_ls2.alu1_turn_p)
12503     {
12504       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
12505         mips_ls2.alu1_turn_p = false;
12506     }
12507   else
12508     {
12509       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
12510         mips_ls2.alu1_turn_p = true;
12511     }
12512
12513   if (mips_ls2.falu1_turn_p)
12514     {
12515       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
12516         mips_ls2.falu1_turn_p = false;
12517     }
12518   else
12519     {
12520       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
12521         mips_ls2.falu1_turn_p = true;
12522     }
12523
12524   if (recog_memoized (insn) >= 0)
12525     mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
12526 }
12527
12528 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
12529
12530 static int
12531 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12532                      rtx insn, int more)
12533 {
12534   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
12535   if (USEFUL_INSN_P (insn))
12536     {
12537       if (get_attr_type (insn) != TYPE_GHOST)
12538         more--;
12539       if (!reload_completed && TUNE_MACC_CHAINS)
12540         mips_macc_chains_record (insn);
12541       vr4130_last_insn = insn;
12542       if (TUNE_74K)
12543         mips_74k_agen_init (insn);
12544       else if (TUNE_LOONGSON_2EF)
12545         mips_ls2_variable_issue (insn);
12546     }
12547
12548   /* Instructions of type 'multi' should all be split before
12549      the second scheduling pass.  */
12550   gcc_assert (!reload_completed
12551               || recog_memoized (insn) < 0
12552               || get_attr_type (insn) != TYPE_MULTI);
12553
12554   cached_can_issue_more = more;
12555   return more;
12556 }
12557 \f
12558 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
12559    return the first operand of the associated PREF or PREFX insn.  */
12560
12561 rtx
12562 mips_prefetch_cookie (rtx write, rtx locality)
12563 {
12564   /* store_streamed / load_streamed.  */
12565   if (INTVAL (locality) <= 0)
12566     return GEN_INT (INTVAL (write) + 4);
12567
12568   /* store / load.  */
12569   if (INTVAL (locality) <= 2)
12570     return write;
12571
12572   /* store_retained / load_retained.  */
12573   return GEN_INT (INTVAL (write) + 6);
12574 }
12575 \f
12576 /* Flags that indicate when a built-in function is available.
12577
12578    BUILTIN_AVAIL_NON_MIPS16
12579         The function is available on the current target, but only
12580         in non-MIPS16 mode.  */
12581 #define BUILTIN_AVAIL_NON_MIPS16 1
12582
12583 /* Declare an availability predicate for built-in functions that
12584    require non-MIPS16 mode and also require COND to be true.
12585    NAME is the main part of the predicate's name.  */
12586 #define AVAIL_NON_MIPS16(NAME, COND)                                    \
12587  static unsigned int                                                    \
12588  mips_builtin_avail_##NAME (void)                                       \
12589  {                                                                      \
12590    return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                        \
12591  }
12592
12593 /* This structure describes a single built-in function.  */
12594 struct mips_builtin_description {
12595   /* The code of the main .md file instruction.  See mips_builtin_type
12596      for more information.  */
12597   enum insn_code icode;
12598
12599   /* The floating-point comparison code to use with ICODE, if any.  */
12600   enum mips_fp_condition cond;
12601
12602   /* The name of the built-in function.  */
12603   const char *name;
12604
12605   /* Specifies how the function should be expanded.  */
12606   enum mips_builtin_type builtin_type;
12607
12608   /* The function's prototype.  */
12609   enum mips_function_type function_type;
12610
12611   /* Whether the function is available.  */
12612   unsigned int (*avail) (void);
12613 };
12614
12615 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
12616 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
12617 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
12618 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
12619 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
12620 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
12621 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
12622 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
12623 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
12624
12625 /* Construct a mips_builtin_description from the given arguments.
12626
12627    INSN is the name of the associated instruction pattern, without the
12628    leading CODE_FOR_mips_.
12629
12630    CODE is the floating-point condition code associated with the
12631    function.  It can be 'f' if the field is not applicable.
12632
12633    NAME is the name of the function itself, without the leading
12634    "__builtin_mips_".
12635
12636    BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
12637
12638    AVAIL is the name of the availability predicate, without the leading
12639    mips_builtin_avail_.  */
12640 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
12641                      FUNCTION_TYPE, AVAIL)                              \
12642   { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
12643     "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
12644     mips_builtin_avail_ ## AVAIL }
12645
12646 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
12647    mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
12648    are as for MIPS_BUILTIN.  */
12649 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
12650   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
12651
12652 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
12653    are subject to mips_builtin_avail_<AVAIL>.  */
12654 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
12655   MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
12656                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
12657   MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
12658                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
12659
12660 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
12661    The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
12662    while the any and all forms are subject to mips_builtin_avail_mips3d.  */
12663 #define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
12664   MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
12665                 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
12666                 mips3d),                                                \
12667   MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
12668                 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
12669                 mips3d),                                                \
12670   MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
12671                 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12672                 AVAIL),                                                 \
12673   MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
12674                 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12675                 AVAIL)
12676
12677 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
12678    are subject to mips_builtin_avail_mips3d.  */
12679 #define CMP_4S_BUILTINS(INSN, COND)                                     \
12680   MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
12681                 MIPS_BUILTIN_CMP_ANY,                                   \
12682                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
12683   MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
12684                 MIPS_BUILTIN_CMP_ALL,                                   \
12685                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
12686
12687 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
12688    instruction requires mips_builtin_avail_<AVAIL>.  */
12689 #define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
12690   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
12691                 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12692                 AVAIL),                                                 \
12693   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
12694                 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12695                 AVAIL)
12696
12697 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
12698 #define CMP_BUILTINS(COND)                                              \
12699   MOVTF_BUILTINS (c, COND, paired_single),                              \
12700   MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
12701   CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
12702   CMP_PS_BUILTINS (c, COND, paired_single),                             \
12703   CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
12704   CMP_4S_BUILTINS (c, COND),                                            \
12705   CMP_4S_BUILTINS (cabs, COND)
12706
12707 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
12708    function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
12709    and AVAIL are as for MIPS_BUILTIN.  */
12710 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
12711   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
12712                 FUNCTION_TYPE, AVAIL)
12713
12714 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
12715    branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
12716 #define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
12717   MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
12718                 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
12719
12720 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
12721    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12722    builtin_description field.  */
12723 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
12724   { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
12725     "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
12726     FUNCTION_TYPE, mips_builtin_avail_loongson }
12727
12728 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
12729    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12730    builtin_description field.  */
12731 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
12732   LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
12733
12734 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
12735    We use functions of this form when the same insn can be usefully applied
12736    to more than one datatype.  */
12737 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
12738   LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
12739
12740 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
12741 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
12742 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
12743 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
12744 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
12745 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
12746 #define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
12747 #define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
12748
12749 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
12750 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
12751 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
12752 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
12753 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
12754 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
12755 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
12756 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
12757 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
12758 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
12759 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
12760 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
12761 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
12762 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
12763 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
12764 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
12765 #define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
12766 #define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
12767 #define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
12768 #define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
12769 #define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
12770 #define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
12771 #define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
12772 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
12773 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
12774 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
12775 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
12776 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
12777 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
12778 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
12779 #define CODE_FOR_loongson_punpckhbh CODE_FOR_vec_interleave_highv8qi
12780 #define CODE_FOR_loongson_punpckhhw CODE_FOR_vec_interleave_highv4hi
12781 #define CODE_FOR_loongson_punpckhwd CODE_FOR_vec_interleave_highv2si
12782 #define CODE_FOR_loongson_punpcklbh CODE_FOR_vec_interleave_lowv8qi
12783 #define CODE_FOR_loongson_punpcklhw CODE_FOR_vec_interleave_lowv4hi
12784 #define CODE_FOR_loongson_punpcklwd CODE_FOR_vec_interleave_lowv2si
12785
12786 static const struct mips_builtin_description mips_builtins[] = {
12787   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12788   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12789   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12790   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12791   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
12792   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
12793   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
12794   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
12795
12796   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
12797   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12798   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12799   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12800   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
12801
12802   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
12803   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
12804   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12805   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12806   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12807   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12808
12809   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
12810   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
12811   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12812   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12813   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12814   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12815
12816   MIPS_FP_CONDITIONS (CMP_BUILTINS),
12817
12818   /* Built-in functions for the SB-1 processor.  */
12819   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
12820
12821   /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
12822   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12823   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12824   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12825   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12826   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12827   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12828   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12829   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12830   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12831   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12832   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
12833   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
12834   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
12835   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
12836   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
12837   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
12838   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12839   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12840   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12841   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12842   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
12843   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
12844   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12845   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12846   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12847   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12848   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12849   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12850   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12851   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12852   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12853   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12854   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12855   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12856   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12857   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12858   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12859   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
12860   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12861   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12862   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12863   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12864   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12865   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
12866   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
12867   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
12868   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
12869   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12870   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12871   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12872   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12873   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12874   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12875   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12876   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12877   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12878   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12879   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12880   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12881   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
12882   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
12883   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
12884   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12885   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12886   BPOSGE_BUILTIN (32, dsp),
12887
12888   /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
12889   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
12890   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12891   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12892   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12893   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12894   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12895   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12896   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12897   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12898   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12899   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12900   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12901   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12902   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12903   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12904   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
12905   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12906   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12907   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12908   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12909   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12910   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
12911   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12912   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12913   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12914   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12915   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12916   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12917   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12918   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12919   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12920   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12921   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12922   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12923
12924   /* Built-in functions for the DSP ASE (32-bit only).  */
12925   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12926   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12927   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12928   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12929   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12930   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12931   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12932   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12933   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12934   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12935   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12936   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12937   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12938   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12939   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12940   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12941   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
12942   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12943   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12944   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
12945   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
12946   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12947   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
12948   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12949   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
12950   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
12951   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
12952
12953   /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
12954   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12955   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12956   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12957   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12958   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12959   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12960   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12961   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12962   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12963
12964   /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
12965   LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
12966   LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
12967   LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
12968   LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12969   LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12970   LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12971   LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12972   LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12973   LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12974   LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
12975   LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
12976   LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12977   LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12978   LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12979   LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12980   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
12981   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12982   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12983   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12984   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
12985   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
12986   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12987   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12988   LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12989   LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12990   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12991   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12992   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12993   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12994   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12995   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12996   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12997   LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12998   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12999   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13000   LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13001   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13002   LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
13003   LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
13004   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13005   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13006   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13007   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13008   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13009   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13010   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13011   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13012   LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
13013   LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13014   LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13015   LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13016   LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13017   LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
13018   LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
13019   LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13020   LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13021   LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13022   LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
13023   LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13024   LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
13025   LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
13026   LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI_UQI),
13027   LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_V4HI_UQI),
13028   LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13029   LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13030   LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13031   LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13032   LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13033   LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13034   LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13035   LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13036   LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13037   LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13038   LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13039   LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13040   LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13041   LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13042   LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13043   LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13044   LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13045   LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13046   LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
13047   LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
13048   LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13049   LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
13050   LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13051   LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13052   LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13053   LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13054   LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13055   LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13056   LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13057   LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13058   LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13059   LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13060   LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13061   LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13062   LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13063   LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13064
13065   /* Sundry other built-in functions.  */
13066   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
13067 };
13068
13069 /* Index I is the function declaration for mips_builtins[I], or null if the
13070    function isn't defined on this target.  */
13071 static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
13072
13073 /* MODE is a vector mode whose elements have type TYPE.  Return the type
13074    of the vector itself.  */
13075
13076 static tree
13077 mips_builtin_vector_type (tree type, enum machine_mode mode)
13078 {
13079   static tree types[2 * (int) MAX_MACHINE_MODE];
13080   int mode_index;
13081
13082   mode_index = (int) mode;
13083
13084   if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
13085     mode_index += MAX_MACHINE_MODE;
13086
13087   if (types[mode_index] == NULL_TREE)
13088     types[mode_index] = build_vector_type_for_mode (type, mode);
13089   return types[mode_index];
13090 }
13091
13092 /* Return a type for 'const volatile void *'.  */
13093
13094 static tree
13095 mips_build_cvpointer_type (void)
13096 {
13097   static tree cache;
13098
13099   if (cache == NULL_TREE)
13100     cache = build_pointer_type (build_qualified_type
13101                                 (void_type_node,
13102                                  TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
13103   return cache;
13104 }
13105
13106 /* Source-level argument types.  */
13107 #define MIPS_ATYPE_VOID void_type_node
13108 #define MIPS_ATYPE_INT integer_type_node
13109 #define MIPS_ATYPE_POINTER ptr_type_node
13110 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
13111
13112 /* Standard mode-based argument types.  */
13113 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
13114 #define MIPS_ATYPE_SI intSI_type_node
13115 #define MIPS_ATYPE_USI unsigned_intSI_type_node
13116 #define MIPS_ATYPE_DI intDI_type_node
13117 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
13118 #define MIPS_ATYPE_SF float_type_node
13119 #define MIPS_ATYPE_DF double_type_node
13120
13121 /* Vector argument types.  */
13122 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
13123 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
13124 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
13125 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
13126 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
13127 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
13128 #define MIPS_ATYPE_UV2SI                                        \
13129   mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
13130 #define MIPS_ATYPE_UV4HI                                        \
13131   mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
13132 #define MIPS_ATYPE_UV8QI                                        \
13133   mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
13134
13135 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
13136    their associated MIPS_ATYPEs.  */
13137 #define MIPS_FTYPE_ATYPES1(A, B) \
13138   MIPS_ATYPE_##A, MIPS_ATYPE_##B
13139
13140 #define MIPS_FTYPE_ATYPES2(A, B, C) \
13141   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
13142
13143 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
13144   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
13145
13146 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
13147   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
13148   MIPS_ATYPE_##E
13149
13150 /* Return the function type associated with function prototype TYPE.  */
13151
13152 static tree
13153 mips_build_function_type (enum mips_function_type type)
13154 {
13155   static tree types[(int) MIPS_MAX_FTYPE_MAX];
13156
13157   if (types[(int) type] == NULL_TREE)
13158     switch (type)
13159       {
13160 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
13161   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
13162     types[(int) type]                                                   \
13163       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
13164                                   NULL_TREE);                           \
13165     break;
13166 #include "config/mips/mips-ftypes.def"
13167 #undef DEF_MIPS_FTYPE
13168       default:
13169         gcc_unreachable ();
13170       }
13171
13172   return types[(int) type];
13173 }
13174
13175 /* Implement TARGET_INIT_BUILTINS.  */
13176
13177 static void
13178 mips_init_builtins (void)
13179 {
13180   const struct mips_builtin_description *d;
13181   unsigned int i;
13182
13183   /* Iterate through all of the bdesc arrays, initializing all of the
13184      builtin functions.  */
13185   for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
13186     {
13187       d = &mips_builtins[i];
13188       if (d->avail ())
13189         mips_builtin_decls[i]
13190           = add_builtin_function (d->name,
13191                                   mips_build_function_type (d->function_type),
13192                                   i, BUILT_IN_MD, NULL, NULL);
13193     }
13194 }
13195
13196 /* Implement TARGET_BUILTIN_DECL.  */
13197
13198 static tree
13199 mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
13200 {
13201   if (code >= ARRAY_SIZE (mips_builtins))
13202     return error_mark_node;
13203   return mips_builtin_decls[code];
13204 }
13205
13206 /* Take argument ARGNO from EXP's argument list and convert it into
13207    an expand operand.  Store the operand in *OP.  */
13208
13209 static void
13210 mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
13211                           unsigned int argno)
13212 {
13213   tree arg;
13214   rtx value;
13215
13216   arg = CALL_EXPR_ARG (exp, argno);
13217   value = expand_normal (arg);
13218   create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
13219 }
13220
13221 /* Expand instruction ICODE as part of a built-in function sequence.
13222    Use the first NOPS elements of OPS as the instruction's operands.
13223    HAS_TARGET_P is true if operand 0 is a target; it is false if the
13224    instruction has no target.
13225
13226    Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx.  */
13227
13228 static rtx
13229 mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
13230                           struct expand_operand *ops, bool has_target_p)
13231 {
13232   if (!maybe_expand_insn (icode, nops, ops))
13233     {
13234       error ("invalid argument to built-in function");
13235       return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
13236     }
13237   return has_target_p ? ops[0].value : const0_rtx;
13238 }
13239
13240 /* Expand a floating-point comparison for built-in function call EXP.
13241    The first NARGS arguments are the values to be compared.  ICODE is
13242    the .md pattern that does the comparison and COND is the condition
13243    that is being tested.  Return an rtx for the result.  */
13244
13245 static rtx
13246 mips_expand_builtin_compare_1 (enum insn_code icode,
13247                                enum mips_fp_condition cond,
13248                                tree exp, int nargs)
13249 {
13250   struct expand_operand ops[MAX_RECOG_OPERANDS];
13251   int opno, argno;
13252
13253   /* The instruction should have a target operand, an operand for each
13254      argument, and an operand for COND.  */
13255   gcc_assert (nargs + 2 == insn_data[(int) icode].n_operands);
13256
13257   opno = 0;
13258   create_output_operand (&ops[opno++], NULL_RTX,
13259                          insn_data[(int) icode].operand[0].mode);
13260   for (argno = 0; argno < nargs; argno++)
13261     mips_prepare_builtin_arg (&ops[opno++], exp, argno);
13262   create_integer_operand (&ops[opno++], (int) cond);
13263   return mips_expand_builtin_insn (icode, opno, ops, true);
13264 }
13265
13266 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
13267    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
13268    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
13269    suggests a good place to put the result.  */
13270
13271 static rtx
13272 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
13273                             bool has_target_p)
13274 {
13275   struct expand_operand ops[MAX_RECOG_OPERANDS];
13276   int opno, argno;
13277
13278   /* Map any target to operand 0.  */
13279   opno = 0;
13280   if (has_target_p)
13281     create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
13282
13283   /* Map the arguments to the other operands.  The n_operands value
13284      for an expander includes match_dups and match_scratches as well as
13285      match_operands, so n_operands is only an upper bound on the number
13286      of arguments to the expander function.  */
13287   gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands);
13288   for (argno = 0; argno < call_expr_nargs (exp); argno++)
13289     mips_prepare_builtin_arg (&ops[opno++], exp, argno);
13290
13291   return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
13292 }
13293
13294 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
13295    function; TYPE says which.  EXP is the CALL_EXPR that calls the
13296    function, ICODE is the instruction that should be used to compare
13297    the first two arguments, and COND is the condition it should test.
13298    TARGET, if nonnull, suggests a good place to put the result.  */
13299
13300 static rtx
13301 mips_expand_builtin_movtf (enum mips_builtin_type type,
13302                            enum insn_code icode, enum mips_fp_condition cond,
13303                            rtx target, tree exp)
13304 {
13305   struct expand_operand ops[4];
13306   rtx cmp_result;
13307
13308   cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
13309   create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
13310   if (type == MIPS_BUILTIN_MOVT)
13311     {
13312       mips_prepare_builtin_arg (&ops[2], exp, 2);
13313       mips_prepare_builtin_arg (&ops[1], exp, 3);
13314     }
13315   else
13316     {
13317       mips_prepare_builtin_arg (&ops[1], exp, 2);
13318       mips_prepare_builtin_arg (&ops[2], exp, 3);
13319     }
13320   create_fixed_operand (&ops[3], cmp_result);
13321   return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
13322                                    4, ops, true);
13323 }
13324
13325 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
13326    into TARGET otherwise.  Return TARGET.  */
13327
13328 static rtx
13329 mips_builtin_branch_and_move (rtx condition, rtx target,
13330                               rtx value_if_true, rtx value_if_false)
13331 {
13332   rtx true_label, done_label;
13333
13334   true_label = gen_label_rtx ();
13335   done_label = gen_label_rtx ();
13336
13337   /* First assume that CONDITION is false.  */
13338   mips_emit_move (target, value_if_false);
13339
13340   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
13341   emit_jump_insn (gen_condjump (condition, true_label));
13342   emit_jump_insn (gen_jump (done_label));
13343   emit_barrier ();
13344
13345   /* Fix TARGET if CONDITION is true.  */
13346   emit_label (true_label);
13347   mips_emit_move (target, value_if_true);
13348
13349   emit_label (done_label);
13350   return target;
13351 }
13352
13353 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
13354    the CALL_EXPR that calls the function, ICODE is the code of the
13355    comparison instruction, and COND is the condition it should test.
13356    TARGET, if nonnull, suggests a good place to put the boolean result.  */
13357
13358 static rtx
13359 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
13360                              enum insn_code icode, enum mips_fp_condition cond,
13361                              rtx target, tree exp)
13362 {
13363   rtx offset, condition, cmp_result;
13364
13365   if (target == 0 || GET_MODE (target) != SImode)
13366     target = gen_reg_rtx (SImode);
13367   cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
13368                                               call_expr_nargs (exp));
13369
13370   /* If the comparison sets more than one register, we define the result
13371      to be 0 if all registers are false and -1 if all registers are true.
13372      The value of the complete result is indeterminate otherwise.  */
13373   switch (builtin_type)
13374     {
13375     case MIPS_BUILTIN_CMP_ALL:
13376       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
13377       return mips_builtin_branch_and_move (condition, target,
13378                                            const0_rtx, const1_rtx);
13379
13380     case MIPS_BUILTIN_CMP_UPPER:
13381     case MIPS_BUILTIN_CMP_LOWER:
13382       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
13383       condition = gen_single_cc (cmp_result, offset);
13384       return mips_builtin_branch_and_move (condition, target,
13385                                            const1_rtx, const0_rtx);
13386
13387     default:
13388       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
13389       return mips_builtin_branch_and_move (condition, target,
13390                                            const1_rtx, const0_rtx);
13391     }
13392 }
13393
13394 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
13395    if nonnull, suggests a good place to put the boolean result.  */
13396
13397 static rtx
13398 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
13399 {
13400   rtx condition, cmp_result;
13401   int cmp_value;
13402
13403   if (target == 0 || GET_MODE (target) != SImode)
13404     target = gen_reg_rtx (SImode);
13405
13406   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
13407
13408   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
13409     cmp_value = 32;
13410   else
13411     gcc_assert (0);
13412
13413   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
13414   return mips_builtin_branch_and_move (condition, target,
13415                                        const1_rtx, const0_rtx);
13416 }
13417
13418 /* Implement TARGET_EXPAND_BUILTIN.  */
13419
13420 static rtx
13421 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
13422                      enum machine_mode mode, int ignore)
13423 {
13424   tree fndecl;
13425   unsigned int fcode, avail;
13426   const struct mips_builtin_description *d;
13427
13428   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13429   fcode = DECL_FUNCTION_CODE (fndecl);
13430   gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
13431   d = &mips_builtins[fcode];
13432   avail = d->avail ();
13433   gcc_assert (avail != 0);
13434   if (TARGET_MIPS16)
13435     {
13436       error ("built-in function %qE not supported for MIPS16",
13437              DECL_NAME (fndecl));
13438       return ignore ? const0_rtx : CONST0_RTX (mode);
13439     }
13440   switch (d->builtin_type)
13441     {
13442     case MIPS_BUILTIN_DIRECT:
13443       return mips_expand_builtin_direct (d->icode, target, exp, true);
13444
13445     case MIPS_BUILTIN_DIRECT_NO_TARGET:
13446       return mips_expand_builtin_direct (d->icode, target, exp, false);
13447
13448     case MIPS_BUILTIN_MOVT:
13449     case MIPS_BUILTIN_MOVF:
13450       return mips_expand_builtin_movtf (d->builtin_type, d->icode,
13451                                         d->cond, target, exp);
13452
13453     case MIPS_BUILTIN_CMP_ANY:
13454     case MIPS_BUILTIN_CMP_ALL:
13455     case MIPS_BUILTIN_CMP_UPPER:
13456     case MIPS_BUILTIN_CMP_LOWER:
13457     case MIPS_BUILTIN_CMP_SINGLE:
13458       return mips_expand_builtin_compare (d->builtin_type, d->icode,
13459                                           d->cond, target, exp);
13460
13461     case MIPS_BUILTIN_BPOSGE32:
13462       return mips_expand_builtin_bposge (d->builtin_type, target);
13463     }
13464   gcc_unreachable ();
13465 }
13466 \f
13467 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
13468    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
13469 struct mips16_constant {
13470   struct mips16_constant *next;
13471   rtx value;
13472   rtx label;
13473   enum machine_mode mode;
13474 };
13475
13476 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
13477    first constant, HIGHEST_ADDRESS is the highest address that the first
13478    byte of the pool can have, and INSN_ADDRESS is the current instruction
13479    address.  */
13480 struct mips16_constant_pool {
13481   struct mips16_constant *first;
13482   int highest_address;
13483   int insn_address;
13484 };
13485
13486 /* Add constant VALUE to POOL and return its label.  MODE is the
13487    value's mode (used for CONST_INTs, etc.).  */
13488
13489 static rtx
13490 mips16_add_constant (struct mips16_constant_pool *pool,
13491                      rtx value, enum machine_mode mode)
13492 {
13493   struct mips16_constant **p, *c;
13494   bool first_of_size_p;
13495
13496   /* See whether the constant is already in the pool.  If so, return the
13497      existing label, otherwise leave P pointing to the place where the
13498      constant should be added.
13499
13500      Keep the pool sorted in increasing order of mode size so that we can
13501      reduce the number of alignments needed.  */
13502   first_of_size_p = true;
13503   for (p = &pool->first; *p != 0; p = &(*p)->next)
13504     {
13505       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
13506         return (*p)->label;
13507       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
13508         break;
13509       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
13510         first_of_size_p = false;
13511     }
13512
13513   /* In the worst case, the constant needed by the earliest instruction
13514      will end up at the end of the pool.  The entire pool must then be
13515      accessible from that instruction.
13516
13517      When adding the first constant, set the pool's highest address to
13518      the address of the first out-of-range byte.  Adjust this address
13519      downwards each time a new constant is added.  */
13520   if (pool->first == 0)
13521     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
13522        of the instruction with the lowest two bits clear.  The base PC
13523        value for LDPC has the lowest three bits clear.  Assume the worst
13524        case here; namely that the PC-relative instruction occupies the
13525        last 2 bytes in an aligned word.  */
13526     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
13527   pool->highest_address -= GET_MODE_SIZE (mode);
13528   if (first_of_size_p)
13529     /* Take into account the worst possible padding due to alignment.  */
13530     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
13531
13532   /* Create a new entry.  */
13533   c = XNEW (struct mips16_constant);
13534   c->value = value;
13535   c->mode = mode;
13536   c->label = gen_label_rtx ();
13537   c->next = *p;
13538   *p = c;
13539
13540   return c->label;
13541 }
13542
13543 /* Output constant VALUE after instruction INSN and return the last
13544    instruction emitted.  MODE is the mode of the constant.  */
13545
13546 static rtx
13547 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
13548 {
13549   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
13550     {
13551       rtx size = GEN_INT (GET_MODE_SIZE (mode));
13552       return emit_insn_after (gen_consttable_int (value, size), insn);
13553     }
13554
13555   if (SCALAR_FLOAT_MODE_P (mode))
13556     return emit_insn_after (gen_consttable_float (value), insn);
13557
13558   if (VECTOR_MODE_P (mode))
13559     {
13560       int i;
13561
13562       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
13563         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
13564                                         CONST_VECTOR_ELT (value, i), insn);
13565       return insn;
13566     }
13567
13568   gcc_unreachable ();
13569 }
13570
13571 /* Dump out the constants in CONSTANTS after INSN.  */
13572
13573 static void
13574 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
13575 {
13576   struct mips16_constant *c, *next;
13577   int align;
13578
13579   align = 0;
13580   for (c = constants; c != NULL; c = next)
13581     {
13582       /* If necessary, increase the alignment of PC.  */
13583       if (align < GET_MODE_SIZE (c->mode))
13584         {
13585           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
13586           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
13587         }
13588       align = GET_MODE_SIZE (c->mode);
13589
13590       insn = emit_label_after (c->label, insn);
13591       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
13592
13593       next = c->next;
13594       free (c);
13595     }
13596
13597   emit_barrier_after (insn);
13598 }
13599
13600 /* Return the length of instruction INSN.  */
13601
13602 static int
13603 mips16_insn_length (rtx insn)
13604 {
13605   if (JUMP_P (insn))
13606     {
13607       rtx body = PATTERN (insn);
13608       if (GET_CODE (body) == ADDR_VEC)
13609         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
13610       if (GET_CODE (body) == ADDR_DIFF_VEC)
13611         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
13612     }
13613   return get_attr_length (insn);
13614 }
13615
13616 /* If *X is a symbolic constant that refers to the constant pool, add
13617    the constant to POOL and rewrite *X to use the constant's label.  */
13618
13619 static void
13620 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
13621 {
13622   rtx base, offset, label;
13623
13624   split_const (*x, &base, &offset);
13625   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
13626     {
13627       label = mips16_add_constant (pool, get_pool_constant (base),
13628                                    get_pool_mode (base));
13629       base = gen_rtx_LABEL_REF (Pmode, label);
13630       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
13631     }
13632 }
13633
13634 /* This structure is used to communicate with mips16_rewrite_pool_refs.
13635    INSN is the instruction we're rewriting and POOL points to the current
13636    constant pool.  */
13637 struct mips16_rewrite_pool_refs_info {
13638   rtx insn;
13639   struct mips16_constant_pool *pool;
13640 };
13641
13642 /* Rewrite *X so that constant pool references refer to the constant's
13643    label instead.  DATA points to a mips16_rewrite_pool_refs_info
13644    structure.  */
13645
13646 static int
13647 mips16_rewrite_pool_refs (rtx *x, void *data)
13648 {
13649   struct mips16_rewrite_pool_refs_info *info =
13650     (struct mips16_rewrite_pool_refs_info *) data;
13651
13652   if (force_to_mem_operand (*x, Pmode))
13653     {
13654       rtx mem = force_const_mem (GET_MODE (*x), *x);
13655       validate_change (info->insn, x, mem, false);
13656     }
13657
13658   if (MEM_P (*x))
13659     {
13660       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
13661       return -1;
13662     }
13663
13664   if (TARGET_MIPS16_TEXT_LOADS)
13665     mips16_rewrite_pool_constant (info->pool, x);
13666
13667   return GET_CODE (*x) == CONST ? -1 : 0;
13668 }
13669
13670 /* Return whether CFG is used in mips_reorg.  */
13671
13672 static bool
13673 mips_cfg_in_reorg (void)
13674 {
13675   return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
13676           || TARGET_RELAX_PIC_CALLS);
13677 }
13678
13679 /* Build MIPS16 constant pools.  */
13680
13681 static void
13682 mips16_lay_out_constants (void)
13683 {
13684   struct mips16_constant_pool pool;
13685   struct mips16_rewrite_pool_refs_info info;
13686   rtx insn, barrier;
13687
13688   if (!TARGET_MIPS16_PCREL_LOADS)
13689     return;
13690
13691   if (mips_cfg_in_reorg ())
13692     split_all_insns ();
13693   else
13694     split_all_insns_noflow ();
13695   barrier = 0;
13696   memset (&pool, 0, sizeof (pool));
13697   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
13698     {
13699       /* Rewrite constant pool references in INSN.  */
13700       if (USEFUL_INSN_P (insn))
13701         {
13702           info.insn = insn;
13703           info.pool = &pool;
13704           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
13705         }
13706
13707       pool.insn_address += mips16_insn_length (insn);
13708
13709       if (pool.first != NULL)
13710         {
13711           /* If there are no natural barriers between the first user of
13712              the pool and the highest acceptable address, we'll need to
13713              create a new instruction to jump around the constant pool.
13714              In the worst case, this instruction will be 4 bytes long.
13715
13716              If it's too late to do this transformation after INSN,
13717              do it immediately before INSN.  */
13718           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
13719             {
13720               rtx label, jump;
13721
13722               label = gen_label_rtx ();
13723
13724               jump = emit_jump_insn_before (gen_jump (label), insn);
13725               JUMP_LABEL (jump) = label;
13726               LABEL_NUSES (label) = 1;
13727               barrier = emit_barrier_after (jump);
13728
13729               emit_label_after (label, barrier);
13730               pool.insn_address += 4;
13731             }
13732
13733           /* See whether the constant pool is now out of range of the first
13734              user.  If so, output the constants after the previous barrier.
13735              Note that any instructions between BARRIER and INSN (inclusive)
13736              will use negative offsets to refer to the pool.  */
13737           if (pool.insn_address > pool.highest_address)
13738             {
13739               mips16_emit_constants (pool.first, barrier);
13740               pool.first = NULL;
13741               barrier = 0;
13742             }
13743           else if (BARRIER_P (insn))
13744             barrier = insn;
13745         }
13746     }
13747   mips16_emit_constants (pool.first, get_last_insn ());
13748 }
13749 \f
13750 /* Return true if it is worth r10k_simplify_address's while replacing
13751    an address with X.  We are looking for constants, and for addresses
13752    at a known offset from the incoming stack pointer.  */
13753
13754 static bool
13755 r10k_simplified_address_p (rtx x)
13756 {
13757   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
13758     x = XEXP (x, 0);
13759   return x == virtual_incoming_args_rtx || CONSTANT_P (x);
13760 }
13761
13762 /* X is an expression that appears in INSN.  Try to use the UD chains
13763    to simplify it, returning the simplified form on success and the
13764    original form otherwise.  Replace the incoming value of $sp with
13765    virtual_incoming_args_rtx (which should never occur in X otherwise).  */
13766
13767 static rtx
13768 r10k_simplify_address (rtx x, rtx insn)
13769 {
13770   rtx newx, op0, op1, set, def_insn, note;
13771   df_ref use, def;
13772   struct df_link *defs;
13773
13774   newx = NULL_RTX;
13775   if (UNARY_P (x))
13776     {
13777       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13778       if (op0 != XEXP (x, 0))
13779         newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
13780                                    op0, GET_MODE (XEXP (x, 0)));
13781     }
13782   else if (BINARY_P (x))
13783     {
13784       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13785       op1 = r10k_simplify_address (XEXP (x, 1), insn);
13786       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
13787         newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
13788     }
13789   else if (GET_CODE (x) == LO_SUM)
13790     {
13791       /* LO_SUMs can be offset from HIGHs, if we know they won't
13792          overflow.  See mips_classify_address for the rationale behind
13793          the lax check.  */
13794       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13795       if (GET_CODE (op0) == HIGH)
13796         newx = XEXP (x, 1);
13797     }
13798   else if (REG_P (x))
13799     {
13800       /* Uses are recorded by regno_reg_rtx, not X itself.  */
13801       use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
13802       gcc_assert (use);
13803       defs = DF_REF_CHAIN (use);
13804
13805       /* Require a single definition.  */
13806       if (defs && defs->next == NULL)
13807         {
13808           def = defs->ref;
13809           if (DF_REF_IS_ARTIFICIAL (def))
13810             {
13811               /* Replace the incoming value of $sp with
13812                  virtual_incoming_args_rtx.  */
13813               if (x == stack_pointer_rtx
13814                   && DF_REF_BB (def) == ENTRY_BLOCK_PTR)
13815                 newx = virtual_incoming_args_rtx;
13816             }
13817           else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
13818                                    DF_REF_BB (def)))
13819             {
13820               /* Make sure that DEF_INSN is a single set of REG.  */
13821               def_insn = DF_REF_INSN (def);
13822               if (NONJUMP_INSN_P (def_insn))
13823                 {
13824                   set = single_set (def_insn);
13825                   if (set && rtx_equal_p (SET_DEST (set), x))
13826                     {
13827                       /* Prefer to use notes, since the def-use chains
13828                          are often shorter.  */
13829                       note = find_reg_equal_equiv_note (def_insn);
13830                       if (note)
13831                         newx = XEXP (note, 0);
13832                       else
13833                         newx = SET_SRC (set);
13834                       newx = r10k_simplify_address (newx, def_insn);
13835                     }
13836                 }
13837             }
13838         }
13839     }
13840   if (newx && r10k_simplified_address_p (newx))
13841     return newx;
13842   return x;
13843 }
13844
13845 /* Return true if ADDRESS is known to be an uncached address
13846    on R10K systems.  */
13847
13848 static bool
13849 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
13850 {
13851   unsigned HOST_WIDE_INT upper;
13852
13853   /* Check for KSEG1.  */
13854   if (address + 0x60000000 < 0x20000000)
13855     return true;
13856
13857   /* Check for uncached XKPHYS addresses.  */
13858   if (Pmode == DImode)
13859     {
13860       upper = (address >> 40) & 0xf9ffff;
13861       if (upper == 0x900000 || upper == 0xb80000)
13862         return true;
13863     }
13864   return false;
13865 }
13866
13867 /* Return true if we can prove that an access to address X in instruction
13868    INSN would be safe from R10K speculation.  This X is a general
13869    expression; it might not be a legitimate address.  */
13870
13871 static bool
13872 r10k_safe_address_p (rtx x, rtx insn)
13873 {
13874   rtx base, offset;
13875   HOST_WIDE_INT offset_val;
13876
13877   x = r10k_simplify_address (x, insn);
13878
13879   /* Check for references to the stack frame.  It doesn't really matter
13880      how much of the frame has been allocated at INSN; -mr10k-cache-barrier
13881      allows us to assume that accesses to any part of the eventual frame
13882      is safe from speculation at any point in the function.  */
13883   mips_split_plus (x, &base, &offset_val);
13884   if (base == virtual_incoming_args_rtx
13885       && offset_val >= -cfun->machine->frame.total_size
13886       && offset_val < cfun->machine->frame.args_size)
13887     return true;
13888
13889   /* Check for uncached addresses.  */
13890   if (CONST_INT_P (x))
13891     return r10k_uncached_address_p (INTVAL (x));
13892
13893   /* Check for accesses to a static object.  */
13894   split_const (x, &base, &offset);
13895   return offset_within_block_p (base, INTVAL (offset));
13896 }
13897
13898 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
13899    an in-range access to an automatic variable, or to an object with
13900    a link-time-constant address.  */
13901
13902 static bool
13903 r10k_safe_mem_expr_p (tree expr, rtx offset)
13904 {
13905   if (expr == NULL_TREE
13906       || offset == NULL_RTX
13907       || !CONST_INT_P (offset)
13908       || INTVAL (offset) < 0
13909       || INTVAL (offset) >= int_size_in_bytes (TREE_TYPE (expr)))
13910     return false;
13911
13912   while (TREE_CODE (expr) == COMPONENT_REF)
13913     {
13914       expr = TREE_OPERAND (expr, 0);
13915       if (expr == NULL_TREE)
13916         return false;
13917     }
13918
13919   return DECL_P (expr);
13920 }
13921
13922 /* A for_each_rtx callback for which DATA points to the instruction
13923    containing *X.  Stop the search if we find a MEM that is not safe
13924    from R10K speculation.  */
13925
13926 static int
13927 r10k_needs_protection_p_1 (rtx *loc, void *data)
13928 {
13929   rtx mem;
13930
13931   mem = *loc;
13932   if (!MEM_P (mem))
13933     return 0;
13934
13935   if (r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
13936     return -1;
13937
13938   if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
13939     return -1;
13940
13941   return 1;
13942 }
13943
13944 /* A note_stores callback for which DATA points to an instruction pointer.
13945    If *DATA is nonnull, make it null if it X contains a MEM that is not
13946    safe from R10K speculation.  */
13947
13948 static void
13949 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13950                                void *data)
13951 {
13952   rtx *insn_ptr;
13953
13954   insn_ptr = (rtx *) data;
13955   if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
13956     *insn_ptr = NULL_RTX;
13957 }
13958
13959 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
13960    Return nonzero if the call is not to a declared function.  */
13961
13962 static int
13963 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
13964 {
13965   rtx x;
13966
13967   x = *loc;
13968   if (!MEM_P (x))
13969     return 0;
13970
13971   x = XEXP (x, 0);
13972   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
13973     return -1;
13974
13975   return 1;
13976 }
13977
13978 /* Return true if instruction INSN needs to be protected by an R10K
13979    cache barrier.  */
13980
13981 static bool
13982 r10k_needs_protection_p (rtx insn)
13983 {
13984   if (CALL_P (insn))
13985     return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
13986
13987   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
13988     {
13989       note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
13990       return insn == NULL_RTX;
13991     }
13992
13993   return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
13994 }
13995
13996 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
13997    edge is unconditional.  */
13998
13999 static bool
14000 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
14001 {
14002   edge_iterator ei;
14003   edge e;
14004
14005   FOR_EACH_EDGE (e, ei, bb->preds)
14006     if (!single_succ_p (e->src)
14007         || !TEST_BIT (protected_bbs, e->src->index)
14008         || (e->flags & EDGE_COMPLEX) != 0)
14009       return false;
14010   return true;
14011 }
14012
14013 /* Implement -mr10k-cache-barrier= for the current function.  */
14014
14015 static void
14016 r10k_insert_cache_barriers (void)
14017 {
14018   int *rev_post_order;
14019   unsigned int i, n;
14020   basic_block bb;
14021   sbitmap protected_bbs;
14022   rtx insn, end, unprotected_region;
14023
14024   if (TARGET_MIPS16)
14025     {
14026       sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
14027       return;
14028     }
14029
14030   /* Calculate dominators.  */
14031   calculate_dominance_info (CDI_DOMINATORS);
14032
14033   /* Bit X of PROTECTED_BBS is set if the last operation in basic block
14034      X is protected by a cache barrier.  */
14035   protected_bbs = sbitmap_alloc (last_basic_block);
14036   sbitmap_zero (protected_bbs);
14037
14038   /* Iterate over the basic blocks in reverse post-order.  */
14039   rev_post_order = XNEWVEC (int, last_basic_block);
14040   n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
14041   for (i = 0; i < n; i++)
14042     {
14043       bb = BASIC_BLOCK (rev_post_order[i]);
14044
14045       /* If this block is only reached by unconditional edges, and if the
14046          source of every edge is protected, the beginning of the block is
14047          also protected.  */
14048       if (r10k_protected_bb_p (bb, protected_bbs))
14049         unprotected_region = NULL_RTX;
14050       else
14051         unprotected_region = pc_rtx;
14052       end = NEXT_INSN (BB_END (bb));
14053
14054       /* UNPROTECTED_REGION is:
14055
14056          - null if we are processing a protected region,
14057          - pc_rtx if we are processing an unprotected region but have
14058            not yet found the first instruction in it
14059          - the first instruction in an unprotected region otherwise.  */
14060       for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
14061         {
14062           if (unprotected_region && USEFUL_INSN_P (insn))
14063             {
14064               if (recog_memoized (insn) == CODE_FOR_mips_cache)
14065                 /* This CACHE instruction protects the following code.  */
14066                 unprotected_region = NULL_RTX;
14067               else
14068                 {
14069                   /* See if INSN is the first instruction in this
14070                      unprotected region.  */
14071                   if (unprotected_region == pc_rtx)
14072                     unprotected_region = insn;
14073
14074                   /* See if INSN needs to be protected.  If so,
14075                      we must insert a cache barrier somewhere between
14076                      PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
14077                      clear which position is better performance-wise,
14078                      but as a tie-breaker, we assume that it is better
14079                      to allow delay slots to be back-filled where
14080                      possible, and that it is better not to insert
14081                      barriers in the middle of already-scheduled code.
14082                      We therefore insert the barrier at the beginning
14083                      of the region.  */
14084                   if (r10k_needs_protection_p (insn))
14085                     {
14086                       emit_insn_before (gen_r10k_cache_barrier (),
14087                                         unprotected_region);
14088                       unprotected_region = NULL_RTX;
14089                     }
14090                 }
14091             }
14092
14093           if (CALL_P (insn))
14094             /* The called function is not required to protect the exit path.
14095                The code that follows a call is therefore unprotected.  */
14096             unprotected_region = pc_rtx;
14097         }
14098
14099       /* Record whether the end of this block is protected.  */
14100       if (unprotected_region == NULL_RTX)
14101         SET_BIT (protected_bbs, bb->index);
14102     }
14103   XDELETEVEC (rev_post_order);
14104
14105   sbitmap_free (protected_bbs);
14106
14107   free_dominance_info (CDI_DOMINATORS);
14108 }
14109 \f
14110 /* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
14111    otherwise.  If INSN has two call rtx, then store the second one in
14112    SECOND_CALL.  */
14113
14114 static rtx
14115 mips_call_expr_from_insn (rtx insn, rtx *second_call)
14116 {
14117   rtx x;
14118   rtx x2;
14119
14120   if (!CALL_P (insn))
14121     return NULL_RTX;
14122
14123   x = PATTERN (insn);
14124   if (GET_CODE (x) == PARALLEL)
14125     {
14126       /* Calls returning complex values have two CALL rtx.  Look for the second
14127          one here, and return it via the SECOND_CALL arg.  */
14128       x2 = XVECEXP (x, 0, 1);
14129       if (GET_CODE (x2) == SET)
14130         x2 = XEXP (x2, 1);
14131       if (GET_CODE (x2) == CALL)
14132         *second_call = x2;
14133
14134       x = XVECEXP (x, 0, 0);
14135     }
14136   if (GET_CODE (x) == SET)
14137     x = XEXP (x, 1);
14138   gcc_assert (GET_CODE (x) == CALL);
14139
14140   return x;
14141 }
14142
14143 /* REG is set in DEF.  See if the definition is one of the ways we load a
14144    register with a symbol address for a mips_use_pic_fn_addr_reg_p call.  If
14145    it is return the symbol reference of the function, otherwise return
14146    NULL_RTX.  */
14147
14148 static rtx
14149 mips_pic_call_symbol_from_set (df_ref def, rtx reg)
14150 {
14151   rtx def_insn, set;
14152
14153   if (DF_REF_IS_ARTIFICIAL (def))
14154     return NULL_RTX;
14155
14156   def_insn = DF_REF_INSN (def);
14157   set = single_set (def_insn);
14158   if (set && rtx_equal_p (SET_DEST (set), reg))
14159     {
14160       rtx note, src, symbol;
14161
14162       /* First, look at REG_EQUAL/EQUIV notes.  */
14163       note = find_reg_equal_equiv_note (def_insn);
14164       if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
14165         return XEXP (note, 0);
14166
14167       /* For %call16 references we don't have REG_EQUAL.  */
14168       src = SET_SRC (set);
14169       symbol = mips_strip_unspec_call (src);
14170       if (symbol)
14171         {
14172           gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14173           return symbol;
14174         }
14175
14176       /* Follow simple register copies.  */
14177       if (REG_P (src))
14178         return mips_find_pic_call_symbol (def_insn, src);
14179     }
14180
14181   return NULL_RTX;
14182 }
14183
14184 /* Find the definition of the use of REG in INSN.  See if the definition is
14185    one of the ways we load a register with a symbol address for a
14186    mips_use_pic_fn_addr_reg_p call.  If it is return the symbol reference of
14187    the function, otherwise return NULL_RTX.  */
14188
14189 static rtx
14190 mips_find_pic_call_symbol (rtx insn, rtx reg)
14191 {
14192   df_ref use;
14193   struct df_link *defs;
14194   rtx symbol;
14195
14196   use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
14197   if (!use)
14198     return NULL_RTX;
14199   defs = DF_REF_CHAIN (use);
14200   if (!defs)
14201     return NULL_RTX;
14202   symbol = mips_pic_call_symbol_from_set (defs->ref, reg);
14203   if (!symbol)
14204     return NULL_RTX;
14205
14206   /* If we have more than one definition, they need to be identical.  */
14207   for (defs = defs->next; defs; defs = defs->next)
14208     {
14209       rtx other;
14210
14211       other = mips_pic_call_symbol_from_set (defs->ref, reg);
14212       if (!rtx_equal_p (symbol, other))
14213         return NULL_RTX;
14214     }
14215
14216   return symbol;
14217 }
14218
14219 /* Replace the args_size operand of the call expression CALL with the
14220    call-attribute UNSPEC and fill in SYMBOL as the function symbol.  */
14221
14222 static void
14223 mips_annotate_pic_call_expr (rtx call, rtx symbol)
14224 {
14225   rtx args_size;
14226
14227   args_size = XEXP (call, 1);
14228   XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
14229                                    gen_rtvec (2, args_size, symbol),
14230                                    UNSPEC_CALL_ATTR);
14231 }
14232
14233 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression.  See
14234    if instead of the arg_size argument it contains the call attributes.  If
14235    yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
14236    symbol from the call attributes.  Also return false if ARGS_SIZE_OPNO is
14237    -1.  */
14238
14239 bool
14240 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
14241 {
14242   rtx args_size, symbol;
14243
14244   if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
14245     return false;
14246
14247   args_size = operands[args_size_opno];
14248   if (GET_CODE (args_size) != UNSPEC)
14249     return false;
14250   gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
14251
14252   symbol = XVECEXP (args_size, 0, 1);
14253   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14254
14255   operands[args_size_opno] = symbol;
14256   return true;
14257 }
14258
14259 /* Use DF to annotate PIC indirect calls with the function symbol they
14260    dispatch to.  */
14261
14262 static void
14263 mips_annotate_pic_calls (void)
14264 {
14265   basic_block bb;
14266   rtx insn;
14267
14268   FOR_EACH_BB (bb)
14269     FOR_BB_INSNS (bb, insn)
14270     {
14271       rtx call, reg, symbol, second_call;
14272
14273       second_call = 0;
14274       call = mips_call_expr_from_insn (insn, &second_call);
14275       if (!call)
14276         continue;
14277       gcc_assert (MEM_P (XEXP (call, 0)));
14278       reg = XEXP (XEXP (call, 0), 0);
14279       if (!REG_P (reg))
14280         continue;
14281
14282       symbol = mips_find_pic_call_symbol (insn, reg);
14283       if (symbol)
14284         {
14285           mips_annotate_pic_call_expr (call, symbol);
14286           if (second_call)
14287             mips_annotate_pic_call_expr (second_call, symbol);
14288         }
14289     }
14290 }
14291 \f
14292 /* A temporary variable used by for_each_rtx callbacks, etc.  */
14293 static rtx mips_sim_insn;
14294
14295 /* A structure representing the state of the processor pipeline.
14296    Used by the mips_sim_* family of functions.  */
14297 struct mips_sim {
14298   /* The maximum number of instructions that can be issued in a cycle.
14299      (Caches mips_issue_rate.)  */
14300   unsigned int issue_rate;
14301
14302   /* The current simulation time.  */
14303   unsigned int time;
14304
14305   /* How many more instructions can be issued in the current cycle.  */
14306   unsigned int insns_left;
14307
14308   /* LAST_SET[X].INSN is the last instruction to set register X.
14309      LAST_SET[X].TIME is the time at which that instruction was issued.
14310      INSN is null if no instruction has yet set register X.  */
14311   struct {
14312     rtx insn;
14313     unsigned int time;
14314   } last_set[FIRST_PSEUDO_REGISTER];
14315
14316   /* The pipeline's current DFA state.  */
14317   state_t dfa_state;
14318 };
14319
14320 /* Reset STATE to the initial simulation state.  */
14321
14322 static void
14323 mips_sim_reset (struct mips_sim *state)
14324 {
14325   state->time = 0;
14326   state->insns_left = state->issue_rate;
14327   memset (&state->last_set, 0, sizeof (state->last_set));
14328   state_reset (state->dfa_state);
14329 }
14330
14331 /* Initialize STATE before its first use.  DFA_STATE points to an
14332    allocated but uninitialized DFA state.  */
14333
14334 static void
14335 mips_sim_init (struct mips_sim *state, state_t dfa_state)
14336 {
14337   state->issue_rate = mips_issue_rate ();
14338   state->dfa_state = dfa_state;
14339   mips_sim_reset (state);
14340 }
14341
14342 /* Advance STATE by one clock cycle.  */
14343
14344 static void
14345 mips_sim_next_cycle (struct mips_sim *state)
14346 {
14347   state->time++;
14348   state->insns_left = state->issue_rate;
14349   state_transition (state->dfa_state, 0);
14350 }
14351
14352 /* Advance simulation state STATE until instruction INSN can read
14353    register REG.  */
14354
14355 static void
14356 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
14357 {
14358   unsigned int regno, end_regno;
14359
14360   end_regno = END_REGNO (reg);
14361   for (regno = REGNO (reg); regno < end_regno; regno++)
14362     if (state->last_set[regno].insn != 0)
14363       {
14364         unsigned int t;
14365
14366         t = (state->last_set[regno].time
14367              + insn_latency (state->last_set[regno].insn, insn));
14368         while (state->time < t)
14369           mips_sim_next_cycle (state);
14370     }
14371 }
14372
14373 /* A for_each_rtx callback.  If *X is a register, advance simulation state
14374    DATA until mips_sim_insn can read the register's value.  */
14375
14376 static int
14377 mips_sim_wait_regs_2 (rtx *x, void *data)
14378 {
14379   if (REG_P (*x))
14380     mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
14381   return 0;
14382 }
14383
14384 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
14385
14386 static void
14387 mips_sim_wait_regs_1 (rtx *x, void *data)
14388 {
14389   for_each_rtx (x, mips_sim_wait_regs_2, data);
14390 }
14391
14392 /* Advance simulation state STATE until all of INSN's register
14393    dependencies are satisfied.  */
14394
14395 static void
14396 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
14397 {
14398   mips_sim_insn = insn;
14399   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
14400 }
14401
14402 /* Advance simulation state STATE until the units required by
14403    instruction INSN are available.  */
14404
14405 static void
14406 mips_sim_wait_units (struct mips_sim *state, rtx insn)
14407 {
14408   state_t tmp_state;
14409
14410   tmp_state = alloca (state_size ());
14411   while (state->insns_left == 0
14412          || (memcpy (tmp_state, state->dfa_state, state_size ()),
14413              state_transition (tmp_state, insn) >= 0))
14414     mips_sim_next_cycle (state);
14415 }
14416
14417 /* Advance simulation state STATE until INSN is ready to issue.  */
14418
14419 static void
14420 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
14421 {
14422   mips_sim_wait_regs (state, insn);
14423   mips_sim_wait_units (state, insn);
14424 }
14425
14426 /* mips_sim_insn has just set X.  Update the LAST_SET array
14427    in simulation state DATA.  */
14428
14429 static void
14430 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
14431 {
14432   struct mips_sim *state;
14433
14434   state = (struct mips_sim *) data;
14435   if (REG_P (x))
14436     {
14437       unsigned int regno, end_regno;
14438
14439       end_regno = END_REGNO (x);
14440       for (regno = REGNO (x); regno < end_regno; regno++)
14441         {
14442           state->last_set[regno].insn = mips_sim_insn;
14443           state->last_set[regno].time = state->time;
14444         }
14445     }
14446 }
14447
14448 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
14449    can issue immediately (i.e., that mips_sim_wait_insn has already
14450    been called).  */
14451
14452 static void
14453 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
14454 {
14455   state_transition (state->dfa_state, insn);
14456   state->insns_left--;
14457
14458   mips_sim_insn = insn;
14459   note_stores (PATTERN (insn), mips_sim_record_set, state);
14460 }
14461
14462 /* Simulate issuing a NOP in state STATE.  */
14463
14464 static void
14465 mips_sim_issue_nop (struct mips_sim *state)
14466 {
14467   if (state->insns_left == 0)
14468     mips_sim_next_cycle (state);
14469   state->insns_left--;
14470 }
14471
14472 /* Update simulation state STATE so that it's ready to accept the instruction
14473    after INSN.  INSN should be part of the main rtl chain, not a member of a
14474    SEQUENCE.  */
14475
14476 static void
14477 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
14478 {
14479   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
14480   if (JUMP_P (insn))
14481     mips_sim_issue_nop (state);
14482
14483   switch (GET_CODE (SEQ_BEGIN (insn)))
14484     {
14485     case CODE_LABEL:
14486     case CALL_INSN:
14487       /* We can't predict the processor state after a call or label.  */
14488       mips_sim_reset (state);
14489       break;
14490
14491     case JUMP_INSN:
14492       /* The delay slots of branch likely instructions are only executed
14493          when the branch is taken.  Therefore, if the caller has simulated
14494          the delay slot instruction, STATE does not really reflect the state
14495          of the pipeline for the instruction after the delay slot.  Also,
14496          branch likely instructions tend to incur a penalty when not taken,
14497          so there will probably be an extra delay between the branch and
14498          the instruction after the delay slot.  */
14499       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
14500         mips_sim_reset (state);
14501       break;
14502
14503     default:
14504       break;
14505     }
14506 }
14507 \f
14508 /* The VR4130 pipeline issues aligned pairs of instructions together,
14509    but it stalls the second instruction if it depends on the first.
14510    In order to cut down the amount of logic required, this dependence
14511    check is not based on a full instruction decode.  Instead, any non-SPECIAL
14512    instruction is assumed to modify the register specified by bits 20-16
14513    (which is usually the "rt" field).
14514
14515    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
14516    input, so we can end up with a false dependence between the branch
14517    and its delay slot.  If this situation occurs in instruction INSN,
14518    try to avoid it by swapping rs and rt.  */
14519
14520 static void
14521 vr4130_avoid_branch_rt_conflict (rtx insn)
14522 {
14523   rtx first, second;
14524
14525   first = SEQ_BEGIN (insn);
14526   second = SEQ_END (insn);
14527   if (JUMP_P (first)
14528       && NONJUMP_INSN_P (second)
14529       && GET_CODE (PATTERN (first)) == SET
14530       && GET_CODE (SET_DEST (PATTERN (first))) == PC
14531       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
14532     {
14533       /* Check for the right kind of condition.  */
14534       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
14535       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
14536           && REG_P (XEXP (cond, 0))
14537           && REG_P (XEXP (cond, 1))
14538           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
14539           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
14540         {
14541           /* SECOND mentions the rt register but not the rs register.  */
14542           rtx tmp = XEXP (cond, 0);
14543           XEXP (cond, 0) = XEXP (cond, 1);
14544           XEXP (cond, 1) = tmp;
14545         }
14546     }
14547 }
14548
14549 /* Implement -mvr4130-align.  Go through each basic block and simulate the
14550    processor pipeline.  If we find that a pair of instructions could execute
14551    in parallel, and the first of those instructions is not 8-byte aligned,
14552    insert a nop to make it aligned.  */
14553
14554 static void
14555 vr4130_align_insns (void)
14556 {
14557   struct mips_sim state;
14558   rtx insn, subinsn, last, last2, next;
14559   bool aligned_p;
14560
14561   dfa_start ();
14562
14563   /* LAST is the last instruction before INSN to have a nonzero length.
14564      LAST2 is the last such instruction before LAST.  */
14565   last = 0;
14566   last2 = 0;
14567
14568   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
14569   aligned_p = true;
14570
14571   mips_sim_init (&state, alloca (state_size ()));
14572   for (insn = get_insns (); insn != 0; insn = next)
14573     {
14574       unsigned int length;
14575
14576       next = NEXT_INSN (insn);
14577
14578       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
14579          This isn't really related to the alignment pass, but we do it on
14580          the fly to avoid a separate instruction walk.  */
14581       vr4130_avoid_branch_rt_conflict (insn);
14582
14583       if (USEFUL_INSN_P (insn))
14584         FOR_EACH_SUBINSN (subinsn, insn)
14585           {
14586             mips_sim_wait_insn (&state, subinsn);
14587
14588             /* If we want this instruction to issue in parallel with the
14589                previous one, make sure that the previous instruction is
14590                aligned.  There are several reasons why this isn't worthwhile
14591                when the second instruction is a call:
14592
14593                   - Calls are less likely to be performance critical,
14594                   - There's a good chance that the delay slot can execute
14595                     in parallel with the call.
14596                   - The return address would then be unaligned.
14597
14598                In general, if we're going to insert a nop between instructions
14599                X and Y, it's better to insert it immediately after X.  That
14600                way, if the nop makes Y aligned, it will also align any labels
14601                between X and Y.  */
14602             if (state.insns_left != state.issue_rate
14603                 && !CALL_P (subinsn))
14604               {
14605                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
14606                   {
14607                     /* SUBINSN is the first instruction in INSN and INSN is
14608                        aligned.  We want to align the previous instruction
14609                        instead, so insert a nop between LAST2 and LAST.
14610
14611                        Note that LAST could be either a single instruction
14612                        or a branch with a delay slot.  In the latter case,
14613                        LAST, like INSN, is already aligned, but the delay
14614                        slot must have some extra delay that stops it from
14615                        issuing at the same time as the branch.  We therefore
14616                        insert a nop before the branch in order to align its
14617                        delay slot.  */
14618                     emit_insn_after (gen_nop (), last2);
14619                     aligned_p = false;
14620                   }
14621                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
14622                   {
14623                     /* SUBINSN is the delay slot of INSN, but INSN is
14624                        currently unaligned.  Insert a nop between
14625                        LAST and INSN to align it.  */
14626                     emit_insn_after (gen_nop (), last);
14627                     aligned_p = true;
14628                   }
14629               }
14630             mips_sim_issue_insn (&state, subinsn);
14631           }
14632       mips_sim_finish_insn (&state, insn);
14633
14634       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
14635       length = get_attr_length (insn);
14636       if (length > 0)
14637         {
14638           /* If the instruction is an asm statement or multi-instruction
14639              mips.md patern, the length is only an estimate.  Insert an
14640              8 byte alignment after it so that the following instructions
14641              can be handled correctly.  */
14642           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
14643               && (recog_memoized (insn) < 0 || length >= 8))
14644             {
14645               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
14646               next = NEXT_INSN (next);
14647               mips_sim_next_cycle (&state);
14648               aligned_p = true;
14649             }
14650           else if (length & 4)
14651             aligned_p = !aligned_p;
14652           last2 = last;
14653           last = insn;
14654         }
14655
14656       /* See whether INSN is an aligned label.  */
14657       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
14658         aligned_p = true;
14659     }
14660   dfa_finish ();
14661 }
14662 \f
14663 /* This structure records that the current function has a LO_SUM
14664    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
14665    the largest offset applied to BASE by all such LO_SUMs.  */
14666 struct mips_lo_sum_offset {
14667   rtx base;
14668   HOST_WIDE_INT offset;
14669 };
14670
14671 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
14672
14673 static hashval_t
14674 mips_hash_base (rtx base)
14675 {
14676   int do_not_record_p;
14677
14678   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
14679 }
14680
14681 /* Hash-table callbacks for mips_lo_sum_offsets.  */
14682
14683 static hashval_t
14684 mips_lo_sum_offset_hash (const void *entry)
14685 {
14686   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
14687 }
14688
14689 static int
14690 mips_lo_sum_offset_eq (const void *entry, const void *value)
14691 {
14692   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
14693                       (const_rtx) value);
14694 }
14695
14696 /* Look up symbolic constant X in HTAB, which is a hash table of
14697    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
14698    paired with a recorded LO_SUM, otherwise record X in the table.  */
14699
14700 static bool
14701 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
14702 {
14703   rtx base, offset;
14704   void **slot;
14705   struct mips_lo_sum_offset *entry;
14706
14707   /* Split X into a base and offset.  */
14708   split_const (x, &base, &offset);
14709   if (UNSPEC_ADDRESS_P (base))
14710     base = UNSPEC_ADDRESS (base);
14711
14712   /* Look up the base in the hash table.  */
14713   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
14714   if (slot == NULL)
14715     return false;
14716
14717   entry = (struct mips_lo_sum_offset *) *slot;
14718   if (option == INSERT)
14719     {
14720       if (entry == NULL)
14721         {
14722           entry = XNEW (struct mips_lo_sum_offset);
14723           entry->base = base;
14724           entry->offset = INTVAL (offset);
14725           *slot = entry;
14726         }
14727       else
14728         {
14729           if (INTVAL (offset) > entry->offset)
14730             entry->offset = INTVAL (offset);
14731         }
14732     }
14733   return INTVAL (offset) <= entry->offset;
14734 }
14735
14736 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
14737    Record every LO_SUM in *LOC.  */
14738
14739 static int
14740 mips_record_lo_sum (rtx *loc, void *data)
14741 {
14742   if (GET_CODE (*loc) == LO_SUM)
14743     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
14744   return 0;
14745 }
14746
14747 /* Return true if INSN is a SET of an orphaned high-part relocation.
14748    HTAB is a hash table of mips_lo_sum_offsets that describes all the
14749    LO_SUMs in the current function.  */
14750
14751 static bool
14752 mips_orphaned_high_part_p (htab_t htab, rtx insn)
14753 {
14754   enum mips_symbol_type type;
14755   rtx x, set;
14756
14757   set = single_set (insn);
14758   if (set)
14759     {
14760       /* Check for %his.  */
14761       x = SET_SRC (set);
14762       if (GET_CODE (x) == HIGH
14763           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
14764         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
14765
14766       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
14767       if (GET_CODE (x) == UNSPEC
14768           && XINT (x, 1) == UNSPEC_LOAD_GOT
14769           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
14770                                        SYMBOL_CONTEXT_LEA, &type)
14771           && type == SYMBOL_GOTOFF_PAGE)
14772         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
14773     }
14774   return false;
14775 }
14776
14777 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
14778    INSN and a previous instruction, avoid it by inserting nops after
14779    instruction AFTER.
14780
14781    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
14782    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
14783    before using the value of that register.  *HILO_DELAY counts the
14784    number of instructions since the last hilo hazard (that is,
14785    the number of instructions since the last MFLO or MFHI).
14786
14787    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
14788    for the next instruction.
14789
14790    LO_REG is an rtx for the LO register, used in dependence checking.  */
14791
14792 static void
14793 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
14794                    rtx *delayed_reg, rtx lo_reg)
14795 {
14796   rtx pattern, set;
14797   int nops, ninsns;
14798
14799   pattern = PATTERN (insn);
14800
14801   /* Do not put the whole function in .set noreorder if it contains
14802      an asm statement.  We don't know whether there will be hazards
14803      between the asm statement and the gcc-generated code.  */
14804   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
14805     cfun->machine->all_noreorder_p = false;
14806
14807   /* Ignore zero-length instructions (barriers and the like).  */
14808   ninsns = get_attr_length (insn) / 4;
14809   if (ninsns == 0)
14810     return;
14811
14812   /* Work out how many nops are needed.  Note that we only care about
14813      registers that are explicitly mentioned in the instruction's pattern.
14814      It doesn't matter that calls use the argument registers or that they
14815      clobber hi and lo.  */
14816   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
14817     nops = 2 - *hilo_delay;
14818   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
14819     nops = 1;
14820   else
14821     nops = 0;
14822
14823   /* Insert the nops between this instruction and the previous one.
14824      Each new nop takes us further from the last hilo hazard.  */
14825   *hilo_delay += nops;
14826   while (nops-- > 0)
14827     emit_insn_after (gen_hazard_nop (), after);
14828
14829   /* Set up the state for the next instruction.  */
14830   *hilo_delay += ninsns;
14831   *delayed_reg = 0;
14832   if (INSN_CODE (insn) >= 0)
14833     switch (get_attr_hazard (insn))
14834       {
14835       case HAZARD_NONE:
14836         break;
14837
14838       case HAZARD_HILO:
14839         *hilo_delay = 0;
14840         break;
14841
14842       case HAZARD_DELAY:
14843         set = single_set (insn);
14844         gcc_assert (set);
14845         *delayed_reg = SET_DEST (set);
14846         break;
14847       }
14848 }
14849
14850 /* Go through the instruction stream and insert nops where necessary.
14851    Also delete any high-part relocations whose partnering low parts
14852    are now all dead.  See if the whole function can then be put into
14853    .set noreorder and .set nomacro.  */
14854
14855 static void
14856 mips_reorg_process_insns (void)
14857 {
14858   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
14859   int hilo_delay;
14860   htab_t htab;
14861
14862   /* Force all instructions to be split into their final form.  */
14863   split_all_insns_noflow ();
14864
14865   /* Recalculate instruction lengths without taking nops into account.  */
14866   cfun->machine->ignore_hazard_length_p = true;
14867   shorten_branches (get_insns ());
14868
14869   cfun->machine->all_noreorder_p = true;
14870
14871   /* We don't track MIPS16 PC-relative offsets closely enough to make
14872      a good job of "set .noreorder" code in MIPS16 mode.  */
14873   if (TARGET_MIPS16)
14874     cfun->machine->all_noreorder_p = false;
14875
14876   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
14877   if (!TARGET_EXPLICIT_RELOCS)
14878     cfun->machine->all_noreorder_p = false;
14879
14880   /* Profiled functions can't be all noreorder because the profiler
14881      support uses assembler macros.  */
14882   if (crtl->profile)
14883     cfun->machine->all_noreorder_p = false;
14884
14885   /* Code compiled with -mfix-vr4120 can't be all noreorder because
14886      we rely on the assembler to work around some errata.  */
14887   if (TARGET_FIX_VR4120)
14888     cfun->machine->all_noreorder_p = false;
14889
14890   /* The same is true for -mfix-vr4130 if we might generate MFLO or
14891      MFHI instructions.  Note that we avoid using MFLO and MFHI if
14892      the VR4130 MACC and DMACC instructions are available instead;
14893      see the *mfhilo_{si,di}_macc patterns.  */
14894   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
14895     cfun->machine->all_noreorder_p = false;
14896
14897   htab = htab_create (37, mips_lo_sum_offset_hash,
14898                       mips_lo_sum_offset_eq, free);
14899
14900   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
14901   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14902     FOR_EACH_SUBINSN (subinsn, insn)
14903       if (USEFUL_INSN_P (subinsn))
14904         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
14905
14906   last_insn = 0;
14907   hilo_delay = 2;
14908   delayed_reg = 0;
14909   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
14910
14911   /* Make a second pass over the instructions.  Delete orphaned
14912      high-part relocations or turn them into NOPs.  Avoid hazards
14913      by inserting NOPs.  */
14914   for (insn = get_insns (); insn != 0; insn = next_insn)
14915     {
14916       next_insn = NEXT_INSN (insn);
14917       if (USEFUL_INSN_P (insn))
14918         {
14919           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
14920             {
14921               /* If we find an orphaned high-part relocation in a delay
14922                  slot, it's easier to turn that instruction into a NOP than
14923                  to delete it.  The delay slot will be a NOP either way.  */
14924               FOR_EACH_SUBINSN (subinsn, insn)
14925                 if (INSN_P (subinsn))
14926                   {
14927                     if (mips_orphaned_high_part_p (htab, subinsn))
14928                       {
14929                         PATTERN (subinsn) = gen_nop ();
14930                         INSN_CODE (subinsn) = CODE_FOR_nop;
14931                       }
14932                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
14933                                        &delayed_reg, lo_reg);
14934                   }
14935               last_insn = insn;
14936             }
14937           else
14938             {
14939               /* INSN is a single instruction.  Delete it if it's an
14940                  orphaned high-part relocation.  */
14941               if (mips_orphaned_high_part_p (htab, insn))
14942                 delete_insn (insn);
14943               /* Also delete cache barriers if the last instruction
14944                  was an annulled branch.  INSN will not be speculatively
14945                  executed.  */
14946               else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
14947                        && last_insn
14948                        && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
14949                 delete_insn (insn);
14950               else
14951                 {
14952                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
14953                                      &delayed_reg, lo_reg);
14954                   last_insn = insn;
14955                 }
14956             }
14957         }
14958     }
14959
14960   htab_delete (htab);
14961 }
14962
14963 /* If we are using a GOT, but have not decided to use a global pointer yet,
14964    see whether we need one to implement long branches.  Convert the ghost
14965    global-pointer instructions into real ones if so.  */
14966
14967 static bool
14968 mips_expand_ghost_gp_insns (void)
14969 {
14970   rtx insn;
14971   int normal_length;
14972
14973   /* Quick exit if we already know that we will or won't need a
14974      global pointer.  */
14975   if (!TARGET_USE_GOT
14976       || cfun->machine->global_pointer == INVALID_REGNUM
14977       || mips_must_initialize_gp_p ())
14978     return false;
14979
14980   shorten_branches (get_insns ());
14981
14982   /* Look for a branch that is longer than normal.  The normal length for
14983      non-MIPS16 branches is 8, because the length includes the delay slot.
14984      It is 4 for MIPS16, because MIPS16 branches are extended instructions,
14985      but they have no delay slot.  */
14986   normal_length = (TARGET_MIPS16 ? 4 : 8);
14987   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14988     if (JUMP_P (insn)
14989         && USEFUL_INSN_P (insn)
14990         && get_attr_length (insn) > normal_length)
14991       break;
14992
14993   if (insn == NULL_RTX)
14994     return false;
14995
14996   /* We've now established that we need $gp.  */
14997   cfun->machine->must_initialize_gp_p = true;
14998   split_all_insns_noflow ();
14999
15000   return true;
15001 }
15002
15003 /* Subroutine of mips_reorg to manage passes that require DF.  */
15004
15005 static void
15006 mips_df_reorg (void)
15007 {
15008   /* Create def-use chains.  */
15009   df_set_flags (DF_EQ_NOTES);
15010   df_chain_add_problem (DF_UD_CHAIN);
15011   df_analyze ();
15012
15013   if (TARGET_RELAX_PIC_CALLS)
15014     mips_annotate_pic_calls ();
15015
15016   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
15017     r10k_insert_cache_barriers ();
15018
15019   df_finish_pass (false);
15020 }
15021
15022 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
15023
15024 static void
15025 mips_reorg (void)
15026 {
15027   /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  Also during
15028      insn splitting in mips16_lay_out_constants, DF insn info is only kept up
15029      to date if the CFG is available.  */
15030   if (mips_cfg_in_reorg ())
15031     compute_bb_for_insn ();
15032   mips16_lay_out_constants ();
15033   if (mips_cfg_in_reorg ())
15034     {
15035       mips_df_reorg ();
15036       free_bb_for_insn ();
15037     }
15038
15039   if (optimize > 0 && flag_delayed_branch)
15040     dbr_schedule (get_insns ());
15041   mips_reorg_process_insns ();
15042   if (!TARGET_MIPS16
15043       && TARGET_EXPLICIT_RELOCS
15044       && TUNE_MIPS4130
15045       && TARGET_VR4130_ALIGN)
15046     vr4130_align_insns ();
15047   if (mips_expand_ghost_gp_insns ())
15048     /* The expansion could invalidate some of the VR4130 alignment
15049        optimizations, but this should be an extremely rare case anyhow.  */
15050     mips_reorg_process_insns ();
15051 }
15052 \f
15053 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
15054    in order to avoid duplicating too much logic from elsewhere.  */
15055
15056 static void
15057 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
15058                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
15059                       tree function)
15060 {
15061   rtx this_rtx, temp1, temp2, insn, fnaddr;
15062   bool use_sibcall_p;
15063
15064   /* Pretend to be a post-reload pass while generating rtl.  */
15065   reload_completed = 1;
15066
15067   /* Mark the end of the (empty) prologue.  */
15068   emit_note (NOTE_INSN_PROLOGUE_END);
15069
15070   /* Determine if we can use a sibcall to call FUNCTION directly.  */
15071   fnaddr = XEXP (DECL_RTL (function), 0);
15072   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
15073                    && const_call_insn_operand (fnaddr, Pmode));
15074
15075   /* Determine if we need to load FNADDR from the GOT.  */
15076   if (!use_sibcall_p
15077       && (mips_got_symbol_type_p
15078           (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
15079     {
15080       /* Pick a global pointer.  Use a call-clobbered register if
15081          TARGET_CALL_SAVED_GP.  */
15082       cfun->machine->global_pointer
15083         = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
15084       cfun->machine->must_initialize_gp_p = true;
15085       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
15086
15087       /* Set up the global pointer for n32 or n64 abicalls.  */
15088       mips_emit_loadgp ();
15089     }
15090
15091   /* We need two temporary registers in some cases.  */
15092   temp1 = gen_rtx_REG (Pmode, 2);
15093   temp2 = gen_rtx_REG (Pmode, 3);
15094
15095   /* Find out which register contains the "this" pointer.  */
15096   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
15097     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
15098   else
15099     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
15100
15101   /* Add DELTA to THIS_RTX.  */
15102   if (delta != 0)
15103     {
15104       rtx offset = GEN_INT (delta);
15105       if (!SMALL_OPERAND (delta))
15106         {
15107           mips_emit_move (temp1, offset);
15108           offset = temp1;
15109         }
15110       emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
15111     }
15112
15113   /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
15114   if (vcall_offset != 0)
15115     {
15116       rtx addr;
15117
15118       /* Set TEMP1 to *THIS_RTX.  */
15119       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
15120
15121       /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
15122       addr = mips_add_offset (temp2, temp1, vcall_offset);
15123
15124       /* Load the offset and add it to THIS_RTX.  */
15125       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
15126       emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
15127     }
15128
15129   /* Jump to the target function.  Use a sibcall if direct jumps are
15130      allowed, otherwise load the address into a register first.  */
15131   if (use_sibcall_p)
15132     {
15133       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
15134       SIBLING_CALL_P (insn) = 1;
15135     }
15136   else
15137     {
15138       /* This is messy.  GAS treats "la $25,foo" as part of a call
15139          sequence and may allow a global "foo" to be lazily bound.
15140          The general move patterns therefore reject this combination.
15141
15142          In this context, lazy binding would actually be OK
15143          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
15144          TARGET_CALL_SAVED_GP; see mips_load_call_address.
15145          We must therefore load the address via a temporary
15146          register if mips_dangerous_for_la25_p.
15147
15148          If we jump to the temporary register rather than $25,
15149          the assembler can use the move insn to fill the jump's
15150          delay slot.
15151
15152          We can use the same technique for MIPS16 code, where $25
15153          is not a valid JR register.  */
15154       if (TARGET_USE_PIC_FN_ADDR_REG
15155           && !TARGET_MIPS16
15156           && !mips_dangerous_for_la25_p (fnaddr))
15157         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
15158       mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
15159
15160       if (TARGET_USE_PIC_FN_ADDR_REG
15161           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
15162         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
15163       emit_jump_insn (gen_indirect_jump (temp1));
15164     }
15165
15166   /* Run just enough of rest_of_compilation.  This sequence was
15167      "borrowed" from alpha.c.  */
15168   insn = get_insns ();
15169   insn_locators_alloc ();
15170   split_all_insns_noflow ();
15171   mips16_lay_out_constants ();
15172   shorten_branches (insn);
15173   final_start_function (insn, file, 1);
15174   final (insn, file, 1);
15175   final_end_function ();
15176
15177   /* Clean up the vars set above.  Note that final_end_function resets
15178      the global pointer for us.  */
15179   reload_completed = 0;
15180 }
15181 \f
15182 /* The last argument passed to mips_set_mips16_mode, or negative if the
15183    function hasn't been called yet.
15184
15185    There are two copies of this information.  One is saved and restored
15186    by the PCH process while the other is specific to this compiler
15187    invocation.  The information calculated by mips_set_mips16_mode
15188    is invalid unless the two variables are the same.  */
15189 static int was_mips16_p = -1;
15190 static GTY(()) int was_mips16_pch_p = -1;
15191
15192 /* Set up the target-dependent global state so that it matches the
15193    current function's ISA mode.  */
15194
15195 static void
15196 mips_set_mips16_mode (int mips16_p)
15197 {
15198   if (mips16_p == was_mips16_p
15199       && mips16_p == was_mips16_pch_p)
15200     return;
15201
15202   /* Restore base settings of various flags.  */
15203   target_flags = mips_base_target_flags;
15204   flag_schedule_insns = mips_base_schedule_insns;
15205   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
15206   flag_move_loop_invariants = mips_base_move_loop_invariants;
15207   align_loops = mips_base_align_loops;
15208   align_jumps = mips_base_align_jumps;
15209   align_functions = mips_base_align_functions;
15210
15211   if (mips16_p)
15212     {
15213       /* Switch to MIPS16 mode.  */
15214       target_flags |= MASK_MIPS16;
15215
15216       /* Don't run the scheduler before reload, since it tends to
15217          increase register pressure.  */
15218       flag_schedule_insns = 0;
15219
15220       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
15221          the whole function to be in a single section.  */
15222       flag_reorder_blocks_and_partition = 0;
15223
15224       /* Don't move loop invariants, because it tends to increase
15225          register pressure.  It also introduces an extra move in cases
15226          where the constant is the first operand in a two-operand binary
15227          instruction, or when it forms a register argument to a functon
15228          call.  */
15229       flag_move_loop_invariants = 0;
15230
15231       target_flags |= MASK_EXPLICIT_RELOCS;
15232
15233       /* Experiments suggest we get the best overall section-anchor
15234          results from using the range of an unextended LW or SW.  Code
15235          that makes heavy use of byte or short accesses can do better
15236          with ranges of 0...31 and 0...63 respectively, but most code is
15237          sensitive to the range of LW and SW instead.  */
15238       targetm.min_anchor_offset = 0;
15239       targetm.max_anchor_offset = 127;
15240
15241       targetm.const_anchor = 0;
15242
15243       /* MIPS16 has no BAL instruction.  */
15244       target_flags &= ~MASK_RELAX_PIC_CALLS;
15245
15246       if (flag_pic && !TARGET_OLDABI)
15247         sorry ("MIPS16 PIC for ABIs other than o32 and o64");
15248
15249       if (TARGET_XGOT)
15250         sorry ("MIPS16 -mxgot code");
15251
15252       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
15253         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
15254     }
15255   else
15256     {
15257       /* Switch to normal (non-MIPS16) mode.  */
15258       target_flags &= ~MASK_MIPS16;
15259
15260       /* Provide default values for align_* for 64-bit targets.  */
15261       if (TARGET_64BIT)
15262         {
15263           if (align_loops == 0)
15264             align_loops = 8;
15265           if (align_jumps == 0)
15266             align_jumps = 8;
15267           if (align_functions == 0)
15268             align_functions = 8;
15269         }
15270
15271       targetm.min_anchor_offset = -32768;
15272       targetm.max_anchor_offset = 32767;
15273
15274       targetm.const_anchor = 0x8000;
15275     }
15276
15277   /* (Re)initialize MIPS target internals for new ISA.  */
15278   mips_init_relocs ();
15279
15280   if (mips16_p)
15281     {
15282       if (!mips16_globals)
15283         mips16_globals = save_target_globals ();
15284       else
15285         restore_target_globals (mips16_globals);
15286     }
15287   else
15288     restore_target_globals (&default_target_globals);
15289
15290   was_mips16_p = mips16_p;
15291   was_mips16_pch_p = mips16_p;
15292 }
15293
15294 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
15295    function should use the MIPS16 ISA and switch modes accordingly.  */
15296
15297 static void
15298 mips_set_current_function (tree fndecl)
15299 {
15300   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
15301 }
15302 \f
15303 /* Allocate a chunk of memory for per-function machine-dependent data.  */
15304
15305 static struct machine_function *
15306 mips_init_machine_status (void)
15307 {
15308   return ggc_alloc_cleared_machine_function ();
15309 }
15310
15311 /* Return the processor associated with the given ISA level, or null
15312    if the ISA isn't valid.  */
15313
15314 static const struct mips_cpu_info *
15315 mips_cpu_info_from_isa (int isa)
15316 {
15317   unsigned int i;
15318
15319   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15320     if (mips_cpu_info_table[i].isa == isa)
15321       return mips_cpu_info_table + i;
15322
15323   return NULL;
15324 }
15325
15326 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15327    with a final "000" replaced by "k".  Ignore case.
15328
15329    Note: this function is shared between GCC and GAS.  */
15330
15331 static bool
15332 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15333 {
15334   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15335     given++, canonical++;
15336
15337   return ((*given == 0 && *canonical == 0)
15338           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15339 }
15340
15341 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15342    CPU name.  We've traditionally allowed a lot of variation here.
15343
15344    Note: this function is shared between GCC and GAS.  */
15345
15346 static bool
15347 mips_matching_cpu_name_p (const char *canonical, const char *given)
15348 {
15349   /* First see if the name matches exactly, or with a final "000"
15350      turned into "k".  */
15351   if (mips_strict_matching_cpu_name_p (canonical, given))
15352     return true;
15353
15354   /* If not, try comparing based on numerical designation alone.
15355      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15356   if (TOLOWER (*given) == 'r')
15357     given++;
15358   if (!ISDIGIT (*given))
15359     return false;
15360
15361   /* Skip over some well-known prefixes in the canonical name,
15362      hoping to find a number there too.  */
15363   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15364     canonical += 2;
15365   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15366     canonical += 2;
15367   else if (TOLOWER (canonical[0]) == 'r')
15368     canonical += 1;
15369
15370   return mips_strict_matching_cpu_name_p (canonical, given);
15371 }
15372
15373 /* Return the mips_cpu_info entry for the processor or ISA given
15374    by CPU_STRING.  Return null if the string isn't recognized.
15375
15376    A similar function exists in GAS.  */
15377
15378 static const struct mips_cpu_info *
15379 mips_parse_cpu (const char *cpu_string)
15380 {
15381   unsigned int i;
15382   const char *s;
15383
15384   /* In the past, we allowed upper-case CPU names, but it doesn't
15385      work well with the multilib machinery.  */
15386   for (s = cpu_string; *s != 0; s++)
15387     if (ISUPPER (*s))
15388       {
15389         warning (0, "CPU names must be lower case");
15390         break;
15391       }
15392
15393   /* 'from-abi' selects the most compatible architecture for the given
15394      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15395      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15396      version.  */
15397   if (strcasecmp (cpu_string, "from-abi") == 0)
15398     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
15399                                    : ABI_NEEDS_64BIT_REGS ? 3
15400                                    : (TARGET_64BIT ? 3 : 1));
15401
15402   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15403   if (strcasecmp (cpu_string, "default") == 0)
15404     return NULL;
15405
15406   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15407     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
15408       return mips_cpu_info_table + i;
15409
15410   return NULL;
15411 }
15412
15413 /* Set up globals to generate code for the ISA or processor
15414    described by INFO.  */
15415
15416 static void
15417 mips_set_architecture (const struct mips_cpu_info *info)
15418 {
15419   if (info != 0)
15420     {
15421       mips_arch_info = info;
15422       mips_arch = info->cpu;
15423       mips_isa = info->isa;
15424     }
15425 }
15426
15427 /* Likewise for tuning.  */
15428
15429 static void
15430 mips_set_tune (const struct mips_cpu_info *info)
15431 {
15432   if (info != 0)
15433     {
15434       mips_tune_info = info;
15435       mips_tune = info->cpu;
15436     }
15437 }
15438
15439 /* Implement TARGET_HANDLE_OPTION.  */
15440
15441 static bool
15442 mips_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
15443                     const struct cl_decoded_option *decoded,
15444                     location_t loc ATTRIBUTE_UNUSED)
15445 {
15446   size_t code = decoded->opt_index;
15447   const char *arg = decoded->arg;
15448
15449   gcc_assert (opts == &global_options);
15450   gcc_assert (opts_set == &global_options_set);
15451
15452   switch (code)
15453     {
15454     case OPT_mabi_:
15455       if (strcmp (arg, "32") == 0)
15456         mips_abi = ABI_32;
15457       else if (strcmp (arg, "o64") == 0)
15458         mips_abi = ABI_O64;
15459       else if (strcmp (arg, "n32") == 0)
15460         mips_abi = ABI_N32;
15461       else if (strcmp (arg, "64") == 0)
15462         mips_abi = ABI_64;
15463       else if (strcmp (arg, "eabi") == 0)
15464         mips_abi = ABI_EABI;
15465       else
15466         return false;
15467       return true;
15468
15469     case OPT_march_:
15470     case OPT_mtune_:
15471       return mips_parse_cpu (arg) != 0;
15472
15473     case OPT_mips:
15474       mips_isa_option_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
15475       return mips_isa_option_info != 0;
15476
15477     case OPT_mno_flush_func:
15478       mips_cache_flush_func = NULL;
15479       return true;
15480
15481     case OPT_mcode_readable_:
15482       if (strcmp (arg, "yes") == 0)
15483         mips_code_readable = CODE_READABLE_YES;
15484       else if (strcmp (arg, "pcrel") == 0)
15485         mips_code_readable = CODE_READABLE_PCREL;
15486       else if (strcmp (arg, "no") == 0)
15487         mips_code_readable = CODE_READABLE_NO;
15488       else
15489         return false;
15490       return true;
15491
15492     case OPT_mr10k_cache_barrier_:
15493       if (strcmp (arg, "load-store") == 0)
15494         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_LOAD_STORE;
15495       else if (strcmp (arg, "store") == 0)
15496         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_STORE;
15497       else if (strcmp (arg, "none") == 0)
15498         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15499       else
15500         return false;
15501       return true;
15502
15503     default:
15504       return true;
15505     }
15506 }
15507
15508 /* Implement TARGET_OPTION_OVERRIDE.  */
15509
15510 static void
15511 mips_option_override (void)
15512 {
15513   int i, start, regno, mode;
15514
15515   /* Process flags as though we were generating non-MIPS16 code.  */
15516   mips_base_mips16 = TARGET_MIPS16;
15517   target_flags &= ~MASK_MIPS16;
15518
15519 #ifdef SUBTARGET_OVERRIDE_OPTIONS
15520   SUBTARGET_OVERRIDE_OPTIONS;
15521 #endif
15522
15523   /* -mno-float overrides -mhard-float and -msoft-float.  */
15524   if (TARGET_NO_FLOAT)
15525     {
15526       target_flags |= MASK_SOFT_FLOAT_ABI;
15527       target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
15528     }
15529
15530   if (TARGET_FLIP_MIPS16)
15531     TARGET_INTERLINK_MIPS16 = 1;
15532
15533   /* Set the small data limit.  */
15534   mips_small_data_threshold = (global_options_set.x_g_switch_value
15535                                ? g_switch_value
15536                                : MIPS_DEFAULT_GVALUE);
15537
15538   /* The following code determines the architecture and register size.
15539      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
15540      The GAS and GCC code should be kept in sync as much as possible.  */
15541
15542   if (mips_arch_string != 0)
15543     mips_set_architecture (mips_parse_cpu (mips_arch_string));
15544
15545   if (mips_isa_option_info != 0)
15546     {
15547       if (mips_arch_info == 0)
15548         mips_set_architecture (mips_isa_option_info);
15549       else if (mips_arch_info->isa != mips_isa_option_info->isa)
15550         error ("%<-%s%> conflicts with the other architecture options, "
15551                "which specify a %s processor",
15552                mips_isa_option_info->name,
15553                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
15554     }
15555
15556   if (mips_arch_info == 0)
15557     {
15558 #ifdef MIPS_CPU_STRING_DEFAULT
15559       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
15560 #else
15561       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
15562 #endif
15563     }
15564
15565   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
15566     error ("%<-march=%s%> is not compatible with the selected ABI",
15567            mips_arch_info->name);
15568
15569   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
15570   if (mips_tune_string != 0)
15571     mips_set_tune (mips_parse_cpu (mips_tune_string));
15572
15573   if (mips_tune_info == 0)
15574     mips_set_tune (mips_arch_info);
15575
15576   if ((target_flags_explicit & MASK_64BIT) != 0)
15577     {
15578       /* The user specified the size of the integer registers.  Make sure
15579          it agrees with the ABI and ISA.  */
15580       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
15581         error ("%<-mgp64%> used with a 32-bit processor");
15582       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
15583         error ("%<-mgp32%> used with a 64-bit ABI");
15584       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
15585         error ("%<-mgp64%> used with a 32-bit ABI");
15586     }
15587   else
15588     {
15589       /* Infer the integer register size from the ABI and processor.
15590          Restrict ourselves to 32-bit registers if that's all the
15591          processor has, or if the ABI cannot handle 64-bit registers.  */
15592       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
15593         target_flags &= ~MASK_64BIT;
15594       else
15595         target_flags |= MASK_64BIT;
15596     }
15597
15598   if ((target_flags_explicit & MASK_FLOAT64) != 0)
15599     {
15600       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
15601         error ("unsupported combination: %s", "-mfp64 -msingle-float");
15602       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
15603         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
15604       else if (!TARGET_64BIT && TARGET_FLOAT64)
15605         {
15606           if (!ISA_HAS_MXHC1)
15607             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
15608                    " the target supports the mfhc1 and mthc1 instructions");
15609           else if (mips_abi != ABI_32)
15610             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
15611                    " the o32 ABI");
15612         }
15613     }
15614   else
15615     {
15616       /* -msingle-float selects 32-bit float registers.  Otherwise the
15617          float registers should be the same size as the integer ones.  */
15618       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
15619         target_flags |= MASK_FLOAT64;
15620       else
15621         target_flags &= ~MASK_FLOAT64;
15622     }
15623
15624   /* End of code shared with GAS.  */
15625
15626   /* If no -mlong* option was given, infer it from the other options.  */
15627   if ((target_flags_explicit & MASK_LONG64) == 0)
15628     {
15629       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
15630         target_flags |= MASK_LONG64;
15631       else
15632         target_flags &= ~MASK_LONG64;
15633     }
15634
15635   if (!TARGET_OLDABI)
15636     flag_pcc_struct_return = 0;
15637
15638   /* Decide which rtx_costs structure to use.  */
15639   if (optimize_size)
15640     mips_cost = &mips_rtx_cost_optimize_size;
15641   else
15642     mips_cost = &mips_rtx_cost_data[mips_tune];
15643
15644   /* If the user hasn't specified a branch cost, use the processor's
15645      default.  */
15646   if (mips_branch_cost == 0)
15647     mips_branch_cost = mips_cost->branch_cost;
15648
15649   /* If neither -mbranch-likely nor -mno-branch-likely was given
15650      on the command line, set MASK_BRANCHLIKELY based on the target
15651      architecture and tuning flags.  Annulled delay slots are a
15652      size win, so we only consider the processor-specific tuning
15653      for !optimize_size.  */
15654   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
15655     {
15656       if (ISA_HAS_BRANCHLIKELY
15657           && (optimize_size
15658               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
15659         target_flags |= MASK_BRANCHLIKELY;
15660       else
15661         target_flags &= ~MASK_BRANCHLIKELY;
15662     }
15663   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
15664     warning (0, "the %qs architecture does not support branch-likely"
15665              " instructions", mips_arch_info->name);
15666
15667   /* The effect of -mabicalls isn't defined for the EABI.  */
15668   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
15669     {
15670       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
15671       target_flags &= ~MASK_ABICALLS;
15672     }
15673
15674   if (TARGET_ABICALLS_PIC2)
15675     /* We need to set flag_pic for executables as well as DSOs
15676        because we may reference symbols that are not defined in
15677        the final executable.  (MIPS does not use things like
15678        copy relocs, for example.)
15679
15680        There is a body of code that uses __PIC__ to distinguish
15681        between -mabicalls and -mno-abicalls code.  The non-__PIC__
15682        variant is usually appropriate for TARGET_ABICALLS_PIC0, as
15683        long as any indirect jumps use $25.  */
15684     flag_pic = 1;
15685
15686   /* -mvr4130-align is a "speed over size" optimization: it usually produces
15687      faster code, but at the expense of more nops.  Enable it at -O3 and
15688      above.  */
15689   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
15690     target_flags |= MASK_VR4130_ALIGN;
15691
15692   /* Prefer a call to memcpy over inline code when optimizing for size,
15693      though see MOVE_RATIO in mips.h.  */
15694   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
15695     target_flags |= MASK_MEMCPY;
15696
15697   /* If we have a nonzero small-data limit, check that the -mgpopt
15698      setting is consistent with the other target flags.  */
15699   if (mips_small_data_threshold > 0)
15700     {
15701       if (!TARGET_GPOPT)
15702         {
15703           if (!TARGET_EXPLICIT_RELOCS)
15704             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
15705
15706           TARGET_LOCAL_SDATA = false;
15707           TARGET_EXTERN_SDATA = false;
15708         }
15709       else
15710         {
15711           if (TARGET_VXWORKS_RTP)
15712             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
15713
15714           if (TARGET_ABICALLS)
15715             warning (0, "cannot use small-data accesses for %qs",
15716                      "-mabicalls");
15717         }
15718     }
15719
15720 #ifdef MIPS_TFMODE_FORMAT
15721   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
15722 #endif
15723
15724   /* Make sure that the user didn't turn off paired single support when
15725      MIPS-3D support is requested.  */
15726   if (TARGET_MIPS3D
15727       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
15728       && !TARGET_PAIRED_SINGLE_FLOAT)
15729     error ("%<-mips3d%> requires %<-mpaired-single%>");
15730
15731   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
15732   if (TARGET_MIPS3D)
15733     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
15734
15735   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
15736      and TARGET_HARD_FLOAT_ABI are both true.  */
15737   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
15738     error ("%qs must be used with %qs",
15739            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
15740            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
15741
15742   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
15743      enabled.  */
15744   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
15745     warning (0, "the %qs architecture does not support paired-single"
15746              " instructions", mips_arch_info->name);
15747
15748   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
15749       && !TARGET_CACHE_BUILTIN)
15750     {
15751       error ("%qs requires a target that provides the %qs instruction",
15752              "-mr10k-cache-barrier", "cache");
15753       mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15754     }
15755
15756   /* If TARGET_DSPR2, enable MASK_DSP.  */
15757   if (TARGET_DSPR2)
15758     target_flags |= MASK_DSP;
15759
15760   /* .eh_frame addresses should be the same width as a C pointer.
15761      Most MIPS ABIs support only one pointer size, so the assembler
15762      will usually know exactly how big an .eh_frame address is.
15763
15764      Unfortunately, this is not true of the 64-bit EABI.  The ABI was
15765      originally defined to use 64-bit pointers (i.e. it is LP64), and
15766      this is still the default mode.  However, we also support an n32-like
15767      ILP32 mode, which is selected by -mlong32.  The problem is that the
15768      assembler has traditionally not had an -mlong option, so it has
15769      traditionally not known whether we're using the ILP32 or LP64 form.
15770
15771      As it happens, gas versions up to and including 2.19 use _32-bit_
15772      addresses for EABI64 .cfi_* directives.  This is wrong for the
15773      default LP64 mode, so we can't use the directives by default.
15774      Moreover, since gas's current behavior is at odds with gcc's
15775      default behavior, it seems unwise to rely on future versions
15776      of gas behaving the same way.  We therefore avoid using .cfi
15777      directives for -mlong32 as well.  */
15778   if (mips_abi == ABI_EABI && TARGET_64BIT)
15779     flag_dwarf2_cfi_asm = 0;
15780
15781   /* .cfi_* directives generate a read-only section, so fall back on
15782      manual .eh_frame creation if we need the section to be writable.  */
15783   if (TARGET_WRITABLE_EH_FRAME)
15784     flag_dwarf2_cfi_asm = 0;
15785
15786   mips_init_print_operand_punct ();
15787
15788   /* Set up array to map GCC register number to debug register number.
15789      Ignore the special purpose register numbers.  */
15790
15791   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
15792     {
15793       mips_dbx_regno[i] = INVALID_REGNUM;
15794       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
15795         mips_dwarf_regno[i] = i;
15796       else
15797         mips_dwarf_regno[i] = INVALID_REGNUM;
15798     }
15799
15800   start = GP_DBX_FIRST - GP_REG_FIRST;
15801   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
15802     mips_dbx_regno[i] = i + start;
15803
15804   start = FP_DBX_FIRST - FP_REG_FIRST;
15805   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
15806     mips_dbx_regno[i] = i + start;
15807
15808   /* Accumulator debug registers use big-endian ordering.  */
15809   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
15810   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
15811   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
15812   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
15813   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
15814     {
15815       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
15816       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
15817     }
15818
15819   /* Set up mips_hard_regno_mode_ok.  */
15820   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
15821     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
15822       mips_hard_regno_mode_ok[mode][regno]
15823         = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
15824
15825   /* Function to allocate machine-dependent function status.  */
15826   init_machine_status = &mips_init_machine_status;
15827
15828   /* Default to working around R4000 errata only if the processor
15829      was selected explicitly.  */
15830   if ((target_flags_explicit & MASK_FIX_R4000) == 0
15831       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
15832     target_flags |= MASK_FIX_R4000;
15833
15834   /* Default to working around R4400 errata only if the processor
15835      was selected explicitly.  */
15836   if ((target_flags_explicit & MASK_FIX_R4400) == 0
15837       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
15838     target_flags |= MASK_FIX_R4400;
15839
15840   /* Default to working around R10000 errata only if the processor
15841      was selected explicitly.  */
15842   if ((target_flags_explicit & MASK_FIX_R10000) == 0
15843       && mips_matching_cpu_name_p (mips_arch_info->name, "r10000"))
15844     target_flags |= MASK_FIX_R10000;
15845
15846   /* Make sure that branch-likely instructions available when using
15847      -mfix-r10000.  The instructions are not available if either:
15848
15849         1. -mno-branch-likely was passed.
15850         2. The selected ISA does not support branch-likely and
15851            the command line does not include -mbranch-likely.  */
15852   if (TARGET_FIX_R10000
15853       && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
15854           ? !ISA_HAS_BRANCHLIKELY
15855           : !TARGET_BRANCHLIKELY))
15856     sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
15857
15858   if (TARGET_SYNCI && !ISA_HAS_SYNCI)
15859     {
15860       warning (0, "the %qs architecture does not support the synci "
15861                "instruction", mips_arch_info->name);
15862       target_flags &= ~MASK_SYNCI;
15863     }
15864
15865   /* Only optimize PIC indirect calls if they are actually required.  */
15866   if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
15867     target_flags &= ~MASK_RELAX_PIC_CALLS;
15868
15869   /* Save base state of options.  */
15870   mips_base_target_flags = target_flags;
15871   mips_base_schedule_insns = flag_schedule_insns;
15872   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
15873   mips_base_move_loop_invariants = flag_move_loop_invariants;
15874   mips_base_align_loops = align_loops;
15875   mips_base_align_jumps = align_jumps;
15876   mips_base_align_functions = align_functions;
15877
15878   /* Now select the ISA mode.
15879
15880      Do all CPP-sensitive stuff in non-MIPS16 mode; we'll switch to
15881      MIPS16 mode afterwards if need be.  */
15882   mips_set_mips16_mode (false);
15883 }
15884
15885 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
15886 static const struct default_options mips_option_optimization_table[] =
15887   {
15888     { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
15889     { OPT_LEVELS_NONE, 0, NULL, 0 }
15890   };
15891
15892 /* Swap the register information for registers I and I + 1, which
15893    currently have the wrong endianness.  Note that the registers'
15894    fixedness and call-clobberedness might have been set on the
15895    command line.  */
15896
15897 static void
15898 mips_swap_registers (unsigned int i)
15899 {
15900   int tmpi;
15901   const char *tmps;
15902
15903 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
15904 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
15905
15906   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
15907   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
15908   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
15909   SWAP_STRING (reg_names[i], reg_names[i + 1]);
15910
15911 #undef SWAP_STRING
15912 #undef SWAP_INT
15913 }
15914
15915 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE.  */
15916
15917 static void
15918 mips_conditional_register_usage (void)
15919 {
15920
15921   if (ISA_HAS_DSP)
15922     {
15923       /* These DSP control register fields are global.  */
15924       global_regs[CCDSP_PO_REGNUM] = 1;
15925       global_regs[CCDSP_SC_REGNUM] = 1;
15926     }
15927   else 
15928     {
15929       int regno;
15930
15931       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
15932         fixed_regs[regno] = call_used_regs[regno] = 1;
15933     }
15934   if (!TARGET_HARD_FLOAT)
15935     {
15936       int regno;
15937
15938       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
15939         fixed_regs[regno] = call_used_regs[regno] = 1;
15940       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15941         fixed_regs[regno] = call_used_regs[regno] = 1;
15942     }
15943   else if (! ISA_HAS_8CC)
15944     {
15945       int regno;
15946
15947       /* We only have a single condition-code register.  We implement
15948          this by fixing all the condition-code registers and generating
15949          RTL that refers directly to ST_REG_FIRST.  */
15950       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15951         fixed_regs[regno] = call_used_regs[regno] = 1;
15952     }
15953   /* In MIPS16 mode, we permit the $t temporary registers to be used
15954      for reload.  We prohibit the unused $s registers, since they
15955      are call-saved, and saving them via a MIPS16 register would
15956      probably waste more time than just reloading the value.  */
15957   if (TARGET_MIPS16)
15958     {
15959       fixed_regs[18] = call_used_regs[18] = 1;
15960       fixed_regs[19] = call_used_regs[19] = 1;
15961       fixed_regs[20] = call_used_regs[20] = 1;
15962       fixed_regs[21] = call_used_regs[21] = 1;
15963       fixed_regs[22] = call_used_regs[22] = 1;
15964       fixed_regs[23] = call_used_regs[23] = 1;
15965       fixed_regs[26] = call_used_regs[26] = 1;
15966       fixed_regs[27] = call_used_regs[27] = 1;
15967       fixed_regs[30] = call_used_regs[30] = 1;
15968     }
15969   /* $f20-$f23 are call-clobbered for n64.  */
15970   if (mips_abi == ABI_64)
15971     {
15972       int regno;
15973       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
15974         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15975     }
15976   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
15977      for n32.  */
15978   if (mips_abi == ABI_N32)
15979     {
15980       int regno;
15981       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
15982         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15983     }
15984   /* Make sure that double-register accumulator values are correctly
15985      ordered for the current endianness.  */
15986   if (TARGET_LITTLE_ENDIAN)
15987     {
15988       unsigned int regno;
15989
15990       mips_swap_registers (MD_REG_FIRST);
15991       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
15992         mips_swap_registers (regno);
15993     }
15994 }
15995
15996 /* Initialize vector TARGET to VALS.  */
15997
15998 void
15999 mips_expand_vector_init (rtx target, rtx vals)
16000 {
16001   enum machine_mode mode;
16002   enum machine_mode inner;
16003   unsigned int i, n_elts;
16004   rtx mem;
16005
16006   mode = GET_MODE (target);
16007   inner = GET_MODE_INNER (mode);
16008   n_elts = GET_MODE_NUNITS (mode);
16009
16010   gcc_assert (VECTOR_MODE_P (mode));
16011
16012   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
16013   for (i = 0; i < n_elts; i++)
16014     emit_move_insn (adjust_address_nv (mem, inner, i * GET_MODE_SIZE (inner)),
16015                     XVECEXP (vals, 0, i));
16016
16017   emit_move_insn (target, mem);
16018 }
16019
16020 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
16021    other registers for instructions for which it is possible.  This
16022    encourages the compiler to use CMP in cases where an XOR would
16023    require some register shuffling.  */
16024
16025 void
16026 mips_order_regs_for_local_alloc (void)
16027 {
16028   int i;
16029
16030   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
16031     reg_alloc_order[i] = i;
16032
16033   if (TARGET_MIPS16)
16034     {
16035       /* It really doesn't matter where we put register 0, since it is
16036          a fixed register anyhow.  */
16037       reg_alloc_order[0] = 24;
16038       reg_alloc_order[24] = 0;
16039     }
16040 }
16041
16042 /* Implement EH_USES.  */
16043
16044 bool
16045 mips_eh_uses (unsigned int regno)
16046 {
16047   if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
16048     {
16049       /* We need to force certain registers to be live in order to handle
16050          PIC long branches correctly.  See mips_must_initialize_gp_p for
16051          details.  */
16052       if (mips_cfun_has_cprestore_slot_p ())
16053         {
16054           if (regno == CPRESTORE_SLOT_REGNUM)
16055             return true;
16056         }
16057       else
16058         {
16059           if (cfun->machine->global_pointer == regno)
16060             return true;
16061         }
16062     }
16063
16064   return false;
16065 }
16066
16067 /* Implement EPILOGUE_USES.  */
16068
16069 bool
16070 mips_epilogue_uses (unsigned int regno)
16071 {
16072   /* Say that the epilogue uses the return address register.  Note that
16073      in the case of sibcalls, the values "used by the epilogue" are
16074      considered live at the start of the called function.  */
16075   if (regno == RETURN_ADDR_REGNUM)
16076     return true;
16077
16078   /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
16079      See the comment above load_call<mode> for details.  */
16080   if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
16081     return true;
16082
16083   /* An interrupt handler must preserve some registers that are
16084      ordinarily call-clobbered.  */
16085   if (cfun->machine->interrupt_handler_p
16086       && mips_interrupt_extra_call_saved_reg_p (regno))
16087     return true;
16088
16089   return false;
16090 }
16091
16092 /* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
16093
16094 static int
16095 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
16096 {
16097   return REG_P (*x) && REGNO (*x) == AT_REGNUM;
16098 }
16099
16100 /* Return true if INSN needs to be wrapped in ".set noat".
16101    INSN has NOPERANDS operands, stored in OPVEC.  */
16102
16103 static bool
16104 mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
16105 {
16106   int i;
16107
16108   if (recog_memoized (insn) >= 0)
16109     for (i = 0; i < noperands; i++)
16110       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
16111         return true;
16112   return false;
16113 }
16114
16115 /* Implement FINAL_PRESCAN_INSN.  */
16116
16117 void
16118 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
16119 {
16120   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
16121     mips_push_asm_switch (&mips_noat);
16122 }
16123
16124 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
16125
16126 static void
16127 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
16128                           rtx *opvec, int noperands)
16129 {
16130   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
16131     mips_pop_asm_switch (&mips_noat);
16132 }
16133
16134 /* Return the function that is used to expand the <u>mulsidi3 pattern.
16135    EXT_CODE is the code of the extension used.  Return NULL if widening
16136    multiplication shouldn't be used.  */
16137
16138 mulsidi3_gen_fn
16139 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
16140 {
16141   bool signed_p;
16142
16143   signed_p = ext_code == SIGN_EXTEND;
16144   if (TARGET_64BIT)
16145     {
16146       /* Don't use widening multiplication with MULT when we have DMUL.  Even
16147          with the extension of its input operands DMUL is faster.  Note that
16148          the extension is not needed for signed multiplication.  In order to
16149          ensure that we always remove the redundant sign-extension in this
16150          case we still expand mulsidi3 for DMUL.  */
16151       if (ISA_HAS_DMUL3)
16152         return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
16153       if (TARGET_FIX_R4000)
16154         return NULL;
16155       return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
16156     }
16157   else
16158     {
16159       if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
16160         return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
16161       return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
16162     }
16163 }
16164 \f
16165 /* Return the size in bytes of the trampoline code, padded to
16166    TRAMPOLINE_ALIGNMENT bits.  The static chain pointer and target
16167    function address immediately follow.  */
16168
16169 int
16170 mips_trampoline_code_size (void)
16171 {
16172   if (TARGET_USE_PIC_FN_ADDR_REG)
16173     return 4 * 4;
16174   else if (ptr_mode == DImode)
16175     return 8 * 4;
16176   else if (ISA_HAS_LOAD_DELAY)
16177     return 6 * 4;
16178   else
16179     return 4 * 4;
16180 }
16181
16182 /* Implement TARGET_TRAMPOLINE_INIT.  */
16183
16184 static void
16185 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
16186 {
16187   rtx addr, end_addr, high, low, opcode, mem;
16188   rtx trampoline[8];
16189   unsigned int i, j;
16190   HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
16191
16192   /* Work out the offsets of the pointers from the start of the
16193      trampoline code.  */
16194   end_addr_offset = mips_trampoline_code_size ();
16195   static_chain_offset = end_addr_offset;
16196   target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
16197
16198   /* Get pointers to the beginning and end of the code block.  */
16199   addr = force_reg (Pmode, XEXP (m_tramp, 0));
16200   end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
16201
16202 #define OP(X) gen_int_mode (X, SImode)
16203
16204   /* Build up the code in TRAMPOLINE.  */
16205   i = 0;
16206   if (TARGET_USE_PIC_FN_ADDR_REG)
16207     {
16208       /* $25 contains the address of the trampoline.  Emit code of the form:
16209
16210              l[wd]    $1, target_function_offset($25)
16211              l[wd]    $static_chain, static_chain_offset($25)
16212              jr       $1
16213              move     $25,$1.  */
16214       trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
16215                                            target_function_offset,
16216                                            PIC_FUNCTION_ADDR_REGNUM));
16217       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16218                                            static_chain_offset,
16219                                            PIC_FUNCTION_ADDR_REGNUM));
16220       trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
16221       trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
16222     }
16223   else if (ptr_mode == DImode)
16224     {
16225       /* It's too cumbersome to create the full 64-bit address, so let's
16226          instead use:
16227
16228              move    $1, $31
16229              bal     1f
16230              nop
16231          1:  l[wd]   $25, target_function_offset - 12($31)
16232              l[wd]   $static_chain, static_chain_offset - 12($31)
16233              jr      $25
16234              move    $31, $1
16235
16236         where 12 is the offset of "1:" from the start of the code block.  */
16237       trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
16238       trampoline[i++] = OP (MIPS_BAL (1));
16239       trampoline[i++] = OP (MIPS_NOP);
16240       trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16241                                            target_function_offset - 12,
16242                                            RETURN_ADDR_REGNUM));
16243       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16244                                            static_chain_offset - 12,
16245                                            RETURN_ADDR_REGNUM));
16246       trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16247       trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
16248     }
16249   else
16250     {
16251       /* If the target has load delays, emit:
16252
16253              lui     $1, %hi(end_addr)
16254              lw      $25, %lo(end_addr + ...)($1)
16255              lw      $static_chain, %lo(end_addr + ...)($1)
16256              jr      $25
16257              nop
16258
16259          Otherwise emit:
16260
16261              lui     $1, %hi(end_addr)
16262              lw      $25, %lo(end_addr + ...)($1)
16263              jr      $25
16264              lw      $static_chain, %lo(end_addr + ...)($1).  */
16265
16266       /* Split END_ADDR into %hi and %lo values.  Trampolines are aligned
16267          to 64 bits, so the %lo value will have the bottom 3 bits clear.  */
16268       high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
16269                                   NULL, false, OPTAB_WIDEN);
16270       high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
16271                                   NULL, false, OPTAB_WIDEN);
16272       low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
16273
16274       /* Emit the LUI.  */
16275       opcode = OP (MIPS_LUI (AT_REGNUM, 0));
16276       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
16277                                              NULL, false, OPTAB_WIDEN);
16278
16279       /* Emit the load of the target function.  */
16280       opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16281                                   target_function_offset - end_addr_offset,
16282                                   AT_REGNUM));
16283       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16284                                              NULL, false, OPTAB_WIDEN);
16285
16286       /* Emit the JR here, if we can.  */
16287       if (!ISA_HAS_LOAD_DELAY)
16288         trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16289
16290       /* Emit the load of the static chain register.  */
16291       opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16292                                   static_chain_offset - end_addr_offset,
16293                                   AT_REGNUM));
16294       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16295                                              NULL, false, OPTAB_WIDEN);
16296
16297       /* Emit the JR, if we couldn't above.  */
16298       if (ISA_HAS_LOAD_DELAY)
16299         {
16300           trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16301           trampoline[i++] = OP (MIPS_NOP);
16302         }
16303     }
16304
16305 #undef OP
16306
16307   /* Copy the trampoline code.  Leave any padding uninitialized.  */
16308   for (j = 0; j < i; j++)
16309     {
16310       mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
16311       mips_emit_move (mem, trampoline[j]);
16312     }
16313
16314   /* Set up the static chain pointer field.  */
16315   mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
16316   mips_emit_move (mem, chain_value);
16317
16318   /* Set up the target function field.  */
16319   mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
16320   mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
16321
16322   /* Flush the code part of the trampoline.  */
16323   emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
16324   emit_insn (gen_clear_cache (addr, end_addr));
16325 }
16326
16327 /* Implement FUNCTION_PROFILER.  */
16328
16329 void mips_function_profiler (FILE *file)
16330 {
16331   if (TARGET_MIPS16)
16332     sorry ("mips16 function profiling");
16333   if (TARGET_LONG_CALLS)
16334     {
16335       /* For TARGET_LONG_CALLS use $3 for the address of _mcount.  */
16336       if (Pmode == DImode)
16337         fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
16338       else
16339         fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
16340     }
16341   mips_push_asm_switch (&mips_noat);
16342   fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
16343            reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
16344   /* _mcount treats $2 as the static chain register.  */
16345   if (cfun->static_chain_decl != NULL)
16346     fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
16347              reg_names[STATIC_CHAIN_REGNUM]);
16348   if (TARGET_MCOUNT_RA_ADDRESS)
16349     {
16350       /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
16351          ra save location.  */
16352       if (cfun->machine->frame.ra_fp_offset == 0)
16353         /* ra not saved, pass zero.  */
16354         fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
16355       else
16356         fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
16357                  Pmode == DImode ? "dla" : "la", reg_names[12],
16358                  cfun->machine->frame.ra_fp_offset,
16359                  reg_names[STACK_POINTER_REGNUM]);
16360     }
16361   if (!TARGET_NEWABI)
16362     fprintf (file,
16363              "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from  stack\n",
16364              TARGET_64BIT ? "dsubu" : "subu",
16365              reg_names[STACK_POINTER_REGNUM],
16366              reg_names[STACK_POINTER_REGNUM],
16367              Pmode == DImode ? 16 : 8);
16368
16369   if (TARGET_LONG_CALLS)
16370     fprintf (file, "\tjalr\t%s\n", reg_names[3]);
16371   else
16372     fprintf (file, "\tjal\t_mcount\n");
16373   mips_pop_asm_switch (&mips_noat);
16374   /* _mcount treats $2 as the static chain register.  */
16375   if (cfun->static_chain_decl != NULL)
16376     fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
16377              reg_names[2]);
16378 }
16379
16380 /* Implement TARGET_SHIFT_TRUNCATION_MASK.  We want to keep the default
16381    behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
16382    when TARGET_LOONGSON_VECTORS is true.  */
16383
16384 static unsigned HOST_WIDE_INT
16385 mips_shift_truncation_mask (enum machine_mode mode)
16386 {
16387   if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
16388     return 0;
16389
16390   return GET_MODE_BITSIZE (mode) - 1;
16391 }
16392
16393 \f
16394 /* Initialize the GCC target structure.  */
16395 #undef TARGET_ASM_ALIGNED_HI_OP
16396 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
16397 #undef TARGET_ASM_ALIGNED_SI_OP
16398 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
16399 #undef TARGET_ASM_ALIGNED_DI_OP
16400 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
16401
16402 #undef TARGET_OPTION_OVERRIDE
16403 #define TARGET_OPTION_OVERRIDE mips_option_override
16404 #undef TARGET_OPTION_OPTIMIZATION_TABLE
16405 #define TARGET_OPTION_OPTIMIZATION_TABLE mips_option_optimization_table
16406
16407 #undef TARGET_LEGITIMIZE_ADDRESS
16408 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
16409
16410 #undef TARGET_ASM_FUNCTION_PROLOGUE
16411 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
16412 #undef TARGET_ASM_FUNCTION_EPILOGUE
16413 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
16414 #undef TARGET_ASM_SELECT_RTX_SECTION
16415 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
16416 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
16417 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
16418
16419 #undef TARGET_SCHED_INIT
16420 #define TARGET_SCHED_INIT mips_sched_init
16421 #undef TARGET_SCHED_REORDER
16422 #define TARGET_SCHED_REORDER mips_sched_reorder
16423 #undef TARGET_SCHED_REORDER2
16424 #define TARGET_SCHED_REORDER2 mips_sched_reorder2
16425 #undef TARGET_SCHED_VARIABLE_ISSUE
16426 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
16427 #undef TARGET_SCHED_ADJUST_COST
16428 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
16429 #undef TARGET_SCHED_ISSUE_RATE
16430 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
16431 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
16432 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
16433 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
16434 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
16435 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
16436 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
16437   mips_multipass_dfa_lookahead
16438 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
16439 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
16440   mips_small_register_classes_for_mode_p
16441
16442 #undef TARGET_DEFAULT_TARGET_FLAGS
16443 #define TARGET_DEFAULT_TARGET_FLAGS             \
16444   (TARGET_DEFAULT                               \
16445    | TARGET_CPU_DEFAULT                         \
16446    | TARGET_ENDIAN_DEFAULT                      \
16447    | TARGET_FP_EXCEPTIONS_DEFAULT               \
16448    | MASK_CHECK_ZERO_DIV                        \
16449    | MASK_FUSED_MADD)
16450 #undef TARGET_HANDLE_OPTION
16451 #define TARGET_HANDLE_OPTION mips_handle_option
16452
16453 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
16454 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
16455
16456 #undef TARGET_INSERT_ATTRIBUTES
16457 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
16458 #undef TARGET_MERGE_DECL_ATTRIBUTES
16459 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
16460 #undef TARGET_SET_CURRENT_FUNCTION
16461 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
16462
16463 #undef TARGET_VALID_POINTER_MODE
16464 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
16465 #undef TARGET_REGISTER_MOVE_COST
16466 #define TARGET_REGISTER_MOVE_COST mips_register_move_cost
16467 #undef TARGET_MEMORY_MOVE_COST
16468 #define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
16469 #undef TARGET_RTX_COSTS
16470 #define TARGET_RTX_COSTS mips_rtx_costs
16471 #undef TARGET_ADDRESS_COST
16472 #define TARGET_ADDRESS_COST mips_address_cost
16473
16474 #undef TARGET_IN_SMALL_DATA_P
16475 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
16476
16477 #undef TARGET_MACHINE_DEPENDENT_REORG
16478 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
16479
16480 #undef  TARGET_PREFERRED_RELOAD_CLASS
16481 #define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
16482
16483 #undef TARGET_ASM_FILE_START
16484 #define TARGET_ASM_FILE_START mips_file_start
16485 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
16486 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
16487
16488 #undef TARGET_INIT_LIBFUNCS
16489 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
16490
16491 #undef TARGET_BUILD_BUILTIN_VA_LIST
16492 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
16493 #undef TARGET_EXPAND_BUILTIN_VA_START
16494 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
16495 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
16496 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
16497
16498 #undef  TARGET_PROMOTE_FUNCTION_MODE
16499 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
16500 #undef TARGET_PROMOTE_PROTOTYPES
16501 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
16502
16503 #undef TARGET_FUNCTION_VALUE
16504 #define TARGET_FUNCTION_VALUE mips_function_value
16505 #undef TARGET_LIBCALL_VALUE
16506 #define TARGET_LIBCALL_VALUE mips_libcall_value
16507 #undef TARGET_FUNCTION_VALUE_REGNO_P
16508 #define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
16509 #undef TARGET_RETURN_IN_MEMORY
16510 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
16511 #undef TARGET_RETURN_IN_MSB
16512 #define TARGET_RETURN_IN_MSB mips_return_in_msb
16513
16514 #undef TARGET_ASM_OUTPUT_MI_THUNK
16515 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
16516 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
16517 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
16518
16519 #undef TARGET_PRINT_OPERAND
16520 #define TARGET_PRINT_OPERAND mips_print_operand
16521 #undef TARGET_PRINT_OPERAND_ADDRESS
16522 #define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
16523 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
16524 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
16525
16526 #undef TARGET_SETUP_INCOMING_VARARGS
16527 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
16528 #undef TARGET_STRICT_ARGUMENT_NAMING
16529 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
16530 #undef TARGET_MUST_PASS_IN_STACK
16531 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
16532 #undef TARGET_PASS_BY_REFERENCE
16533 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
16534 #undef TARGET_CALLEE_COPIES
16535 #define TARGET_CALLEE_COPIES mips_callee_copies
16536 #undef TARGET_ARG_PARTIAL_BYTES
16537 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
16538 #undef TARGET_FUNCTION_ARG
16539 #define TARGET_FUNCTION_ARG mips_function_arg
16540 #undef TARGET_FUNCTION_ARG_ADVANCE
16541 #define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
16542 #undef TARGET_FUNCTION_ARG_BOUNDARY
16543 #define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
16544
16545 #undef TARGET_MODE_REP_EXTENDED
16546 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
16547
16548 #undef TARGET_VECTOR_MODE_SUPPORTED_P
16549 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
16550
16551 #undef TARGET_SCALAR_MODE_SUPPORTED_P
16552 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
16553
16554 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
16555 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
16556
16557 #undef TARGET_INIT_BUILTINS
16558 #define TARGET_INIT_BUILTINS mips_init_builtins
16559 #undef TARGET_BUILTIN_DECL
16560 #define TARGET_BUILTIN_DECL mips_builtin_decl
16561 #undef TARGET_EXPAND_BUILTIN
16562 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
16563
16564 #undef TARGET_HAVE_TLS
16565 #define TARGET_HAVE_TLS HAVE_AS_TLS
16566
16567 #undef TARGET_CANNOT_FORCE_CONST_MEM
16568 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
16569
16570 #undef TARGET_ENCODE_SECTION_INFO
16571 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
16572
16573 #undef TARGET_ATTRIBUTE_TABLE
16574 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
16575 /* All our function attributes are related to how out-of-line copies should
16576    be compiled or called.  They don't in themselves prevent inlining.  */
16577 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
16578 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
16579
16580 #undef TARGET_EXTRA_LIVE_ON_ENTRY
16581 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
16582
16583 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
16584 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
16585 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
16586 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
16587
16588 #undef  TARGET_COMP_TYPE_ATTRIBUTES
16589 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
16590
16591 #ifdef HAVE_AS_DTPRELWORD
16592 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
16593 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
16594 #endif
16595 #undef TARGET_DWARF_REGISTER_SPAN
16596 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
16597
16598 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
16599 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
16600
16601 #undef TARGET_LEGITIMATE_ADDRESS_P
16602 #define TARGET_LEGITIMATE_ADDRESS_P     mips_legitimate_address_p
16603
16604 #undef TARGET_FRAME_POINTER_REQUIRED
16605 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
16606
16607 #undef TARGET_CAN_ELIMINATE
16608 #define TARGET_CAN_ELIMINATE mips_can_eliminate
16609
16610 #undef TARGET_CONDITIONAL_REGISTER_USAGE
16611 #define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
16612
16613 #undef TARGET_TRAMPOLINE_INIT
16614 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
16615
16616 #undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
16617 #define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
16618
16619 #undef TARGET_SHIFT_TRUNCATION_MASK
16620 #define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
16621
16622 struct gcc_target targetm = TARGET_INITIALIZER;
16623 \f
16624 #include "gt-mips.h"