OSDN Git Service

* config/arm/arm.h (MAX_LDM_STM_OPS): New macro.
[pf3gnuchains/gcc-fork.git] / gcc / config / mips / mips.c
1 /* Subroutines used for MIPS code generation.
2    Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5    Contributed by A. Lichnewsky, lich@inria.inria.fr.
6    Changes by Michael Meissner, meissner@osf.org.
7    64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
8    Brendan Eich, brendan@microunity.com.
9
10 This file is part of GCC.
11
12 GCC is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16
17 GCC is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3.  If not see
24 <http://www.gnu.org/licenses/>.  */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include <signal.h>
31 #include "rtl.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "real.h"
35 #include "insn-config.h"
36 #include "conditions.h"
37 #include "insn-attr.h"
38 #include "recog.h"
39 #include "toplev.h"
40 #include "output.h"
41 #include "tree.h"
42 #include "function.h"
43 #include "expr.h"
44 #include "optabs.h"
45 #include "libfuncs.h"
46 #include "flags.h"
47 #include "reload.h"
48 #include "tm_p.h"
49 #include "ggc.h"
50 #include "gstab.h"
51 #include "hashtab.h"
52 #include "debug.h"
53 #include "target.h"
54 #include "target-def.h"
55 #include "integrate.h"
56 #include "langhooks.h"
57 #include "cfglayout.h"
58 #include "sched-int.h"
59 #include "gimple.h"
60 #include "bitmap.h"
61 #include "diagnostic.h"
62
63 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
64 #define UNSPEC_ADDRESS_P(X)                                     \
65   (GET_CODE (X) == UNSPEC                                       \
66    && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
67    && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
68
69 /* Extract the symbol or label from UNSPEC wrapper X.  */
70 #define UNSPEC_ADDRESS(X) \
71   XVECEXP (X, 0, 0)
72
73 /* Extract the symbol type from UNSPEC wrapper X.  */
74 #define UNSPEC_ADDRESS_TYPE(X) \
75   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
76
77 /* The maximum distance between the top of the stack frame and the
78    value $sp has when we save and restore registers.
79
80    The value for normal-mode code must be a SMALL_OPERAND and must
81    preserve the maximum stack alignment.  We therefore use a value
82    of 0x7ff0 in this case.
83
84    MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
85    up to 0x7f8 bytes and can usually save or restore all the registers
86    that we need to save or restore.  (Note that we can only use these
87    instructions for o32, for which the stack alignment is 8 bytes.)
88
89    We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
90    RESTORE are not available.  We can then use unextended instructions
91    to save and restore registers, and to allocate and deallocate the top
92    part of the frame.  */
93 #define MIPS_MAX_FIRST_STACK_STEP                                       \
94   (!TARGET_MIPS16 ? 0x7ff0                                              \
95    : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8                              \
96    : TARGET_64BIT ? 0x100 : 0x400)
97
98 /* True if INSN is a mips.md pattern or asm statement.  */
99 #define USEFUL_INSN_P(INSN)                                             \
100   (NONDEBUG_INSN_P (INSN)                                               \
101    && GET_CODE (PATTERN (INSN)) != USE                                  \
102    && GET_CODE (PATTERN (INSN)) != CLOBBER                              \
103    && GET_CODE (PATTERN (INSN)) != ADDR_VEC                             \
104    && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
105
106 /* If INSN is a delayed branch sequence, return the first instruction
107    in the sequence, otherwise return INSN itself.  */
108 #define SEQ_BEGIN(INSN)                                                 \
109   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
110    ? XVECEXP (PATTERN (INSN), 0, 0)                                     \
111    : (INSN))
112
113 /* Likewise for the last instruction in a delayed branch sequence.  */
114 #define SEQ_END(INSN)                                                   \
115   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
116    ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1)       \
117    : (INSN))
118
119 /* Execute the following loop body with SUBINSN set to each instruction
120    between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive.  */
121 #define FOR_EACH_SUBINSN(SUBINSN, INSN)                                 \
122   for ((SUBINSN) = SEQ_BEGIN (INSN);                                    \
123        (SUBINSN) != NEXT_INSN (SEQ_END (INSN));                         \
124        (SUBINSN) = NEXT_INSN (SUBINSN))
125
126 /* True if bit BIT is set in VALUE.  */
127 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
128
129 /* Return the opcode for a ptr_mode load of the form:
130
131        l[wd]    DEST, OFFSET(BASE).  */
132 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE)       \
133   (((ptr_mode == DImode ? 0x37 : 0x23) << 26)   \
134    | ((BASE) << 21)                             \
135    | ((DEST) << 16)                             \
136    | (OFFSET))
137
138 /* Return the opcode to move register SRC into register DEST.  */
139 #define MIPS_MOVE(DEST, SRC)            \
140   ((TARGET_64BIT ? 0x2d : 0x21)         \
141    | ((DEST) << 11)                     \
142    | ((SRC) << 21))
143
144 /* Return the opcode for:
145
146        lui      DEST, VALUE.  */
147 #define MIPS_LUI(DEST, VALUE) \
148   ((0xf << 26) | ((DEST) << 16) | (VALUE))
149
150 /* Return the opcode to jump to register DEST.  */
151 #define MIPS_JR(DEST) \
152   (((DEST) << 21) | 0x8)
153
154 /* Return the opcode for:
155
156        bal     . + (1 + OFFSET) * 4.  */
157 #define MIPS_BAL(OFFSET) \
158   ((0x1 << 26) | (0x11 << 16) | (OFFSET))
159
160 /* Return the usual opcode for a nop.  */
161 #define MIPS_NOP 0
162
163 /* Classifies an address.
164
165    ADDRESS_REG
166        A natural register + offset address.  The register satisfies
167        mips_valid_base_register_p and the offset is a const_arith_operand.
168
169    ADDRESS_LO_SUM
170        A LO_SUM rtx.  The first operand is a valid base register and
171        the second operand is a symbolic address.
172
173    ADDRESS_CONST_INT
174        A signed 16-bit constant address.
175
176    ADDRESS_SYMBOLIC:
177        A constant symbolic address.  */
178 enum mips_address_type {
179   ADDRESS_REG,
180   ADDRESS_LO_SUM,
181   ADDRESS_CONST_INT,
182   ADDRESS_SYMBOLIC
183 };
184
185 /* Enumerates the setting of the -mr10k-cache-barrier option.  */
186 enum mips_r10k_cache_barrier_setting {
187   R10K_CACHE_BARRIER_NONE,
188   R10K_CACHE_BARRIER_STORE,
189   R10K_CACHE_BARRIER_LOAD_STORE
190 };
191
192 /* Macros to create an enumeration identifier for a function prototype.  */
193 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
194 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
195 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
196 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
197
198 /* Classifies the prototype of a built-in function.  */
199 enum mips_function_type {
200 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
201 #include "config/mips/mips-ftypes.def"
202 #undef DEF_MIPS_FTYPE
203   MIPS_MAX_FTYPE_MAX
204 };
205
206 /* Specifies how a built-in function should be converted into rtl.  */
207 enum mips_builtin_type {
208   /* The function corresponds directly to an .md pattern.  The return
209      value is mapped to operand 0 and the arguments are mapped to
210      operands 1 and above.  */
211   MIPS_BUILTIN_DIRECT,
212
213   /* The function corresponds directly to an .md pattern.  There is no return
214      value and the arguments are mapped to operands 0 and above.  */
215   MIPS_BUILTIN_DIRECT_NO_TARGET,
216
217   /* The function corresponds to a comparison instruction followed by
218      a mips_cond_move_tf_ps pattern.  The first two arguments are the
219      values to compare and the second two arguments are the vector
220      operands for the movt.ps or movf.ps instruction (in assembly order).  */
221   MIPS_BUILTIN_MOVF,
222   MIPS_BUILTIN_MOVT,
223
224   /* The function corresponds to a V2SF comparison instruction.  Operand 0
225      of this instruction is the result of the comparison, which has mode
226      CCV2 or CCV4.  The function arguments are mapped to operands 1 and
227      above.  The function's return value is an SImode boolean that is
228      true under the following conditions:
229
230      MIPS_BUILTIN_CMP_ANY: one of the registers is true
231      MIPS_BUILTIN_CMP_ALL: all of the registers are true
232      MIPS_BUILTIN_CMP_LOWER: the first register is true
233      MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
234   MIPS_BUILTIN_CMP_ANY,
235   MIPS_BUILTIN_CMP_ALL,
236   MIPS_BUILTIN_CMP_UPPER,
237   MIPS_BUILTIN_CMP_LOWER,
238
239   /* As above, but the instruction only sets a single $fcc register.  */
240   MIPS_BUILTIN_CMP_SINGLE,
241
242   /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
243   MIPS_BUILTIN_BPOSGE32
244 };
245
246 /* Invoke MACRO (COND) for each C.cond.fmt condition.  */
247 #define MIPS_FP_CONDITIONS(MACRO) \
248   MACRO (f),    \
249   MACRO (un),   \
250   MACRO (eq),   \
251   MACRO (ueq),  \
252   MACRO (olt),  \
253   MACRO (ult),  \
254   MACRO (ole),  \
255   MACRO (ule),  \
256   MACRO (sf),   \
257   MACRO (ngle), \
258   MACRO (seq),  \
259   MACRO (ngl),  \
260   MACRO (lt),   \
261   MACRO (nge),  \
262   MACRO (le),   \
263   MACRO (ngt)
264
265 /* Enumerates the codes above as MIPS_FP_COND_<X>.  */
266 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
267 enum mips_fp_condition {
268   MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
269 };
270
271 /* Index X provides the string representation of MIPS_FP_COND_<X>.  */
272 #define STRINGIFY(X) #X
273 static const char *const mips_fp_conditions[] = {
274   MIPS_FP_CONDITIONS (STRINGIFY)
275 };
276
277 /* Information about a function's frame layout.  */
278 struct GTY(())  mips_frame_info {
279   /* The size of the frame in bytes.  */
280   HOST_WIDE_INT total_size;
281
282   /* The number of bytes allocated to variables.  */
283   HOST_WIDE_INT var_size;
284
285   /* The number of bytes allocated to outgoing function arguments.  */
286   HOST_WIDE_INT args_size;
287
288   /* The number of bytes allocated to the .cprestore slot, or 0 if there
289      is no such slot.  */
290   HOST_WIDE_INT cprestore_size;
291
292   /* Bit X is set if the function saves or restores GPR X.  */
293   unsigned int mask;
294
295   /* Likewise FPR X.  */
296   unsigned int fmask;
297
298   /* Likewise doubleword accumulator X ($acX).  */
299   unsigned int acc_mask;
300
301   /* The number of GPRs, FPRs, doubleword accumulators and COP0
302      registers saved.  */
303   unsigned int num_gp;
304   unsigned int num_fp;
305   unsigned int num_acc;
306   unsigned int num_cop0_regs;
307
308   /* The offset of the topmost GPR, FPR, accumulator and COP0-register
309      save slots from the top of the frame, or zero if no such slots are
310      needed.  */
311   HOST_WIDE_INT gp_save_offset;
312   HOST_WIDE_INT fp_save_offset;
313   HOST_WIDE_INT acc_save_offset;
314   HOST_WIDE_INT cop0_save_offset;
315
316   /* Likewise, but giving offsets from the bottom of the frame.  */
317   HOST_WIDE_INT gp_sp_offset;
318   HOST_WIDE_INT fp_sp_offset;
319   HOST_WIDE_INT acc_sp_offset;
320   HOST_WIDE_INT cop0_sp_offset;
321
322   /* 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_length;
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 we have emitted an instruction to initialize
378      mips16_gp_pseudo_rtx.  */
379   bool initialized_mips16_gp_pseudo_p;
380
381   /* True if this is an interrupt handler.  */
382   bool interrupt_handler_p;
383
384   /* True if this is an interrupt handler that uses shadow registers.  */
385   bool use_shadow_register_set_p;
386
387   /* True if this is an interrupt handler that should keep interrupts
388      masked.  */
389   bool keep_interrupts_masked_p;
390
391   /* True if this is an interrupt handler that should use DERET
392      instead of ERET.  */
393   bool use_debug_exception_return_p;
394 };
395
396 /* Information about a single argument.  */
397 struct mips_arg_info {
398   /* True if the argument is passed in a floating-point register, or
399      would have been if we hadn't run out of registers.  */
400   bool fpr_p;
401
402   /* The number of words passed in registers, rounded up.  */
403   unsigned int reg_words;
404
405   /* For EABI, the offset of the first register from GP_ARG_FIRST or
406      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
407      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
408      comment for details).
409
410      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
411      on the stack.  */
412   unsigned int reg_offset;
413
414   /* The number of words that must be passed on the stack, rounded up.  */
415   unsigned int stack_words;
416
417   /* The offset from the start of the stack overflow area of the argument's
418      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
419   unsigned int stack_offset;
420 };
421
422 /* Information about an address described by mips_address_type.
423
424    ADDRESS_CONST_INT
425        No fields are used.
426
427    ADDRESS_REG
428        REG is the base register and OFFSET is the constant offset.
429
430    ADDRESS_LO_SUM
431        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
432        is the type of symbol it references.
433
434    ADDRESS_SYMBOLIC
435        SYMBOL_TYPE is the type of symbol that the address references.  */
436 struct mips_address_info {
437   enum mips_address_type type;
438   rtx reg;
439   rtx offset;
440   enum mips_symbol_type symbol_type;
441 };
442
443 /* One stage in a constant building sequence.  These sequences have
444    the form:
445
446         A = VALUE[0]
447         A = A CODE[1] VALUE[1]
448         A = A CODE[2] VALUE[2]
449         ...
450
451    where A is an accumulator, each CODE[i] is a binary rtl operation
452    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
453 struct mips_integer_op {
454   enum rtx_code code;
455   unsigned HOST_WIDE_INT value;
456 };
457
458 /* The largest number of operations needed to load an integer constant.
459    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
460    When the lowest bit is clear, we can try, but reject a sequence with
461    an extra SLL at the end.  */
462 #define MIPS_MAX_INTEGER_OPS 7
463
464 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
465 struct mips16e_save_restore_info {
466   /* The number of argument registers saved by a SAVE instruction.
467      0 for RESTORE instructions.  */
468   unsigned int nargs;
469
470   /* Bit X is set if the instruction saves or restores GPR X.  */
471   unsigned int mask;
472
473   /* The total number of bytes to allocate.  */
474   HOST_WIDE_INT size;
475 };
476
477 /* Global variables for machine-dependent things.  */
478
479 /* The -G setting, or the configuration's default small-data limit if
480    no -G option is given.  */
481 static unsigned int mips_small_data_threshold;
482
483 /* The number of file directives written by mips_output_filename.  */
484 int num_source_filenames;
485
486 /* The name that appeared in the last .file directive written by
487    mips_output_filename, or "" if mips_output_filename hasn't
488    written anything yet.  */
489 const char *current_function_file = "";
490
491 /* A label counter used by PUT_SDB_BLOCK_START and PUT_SDB_BLOCK_END.  */
492 int sdb_label_count;
493
494 /* Arrays that map GCC register numbers to debugger register numbers.  */
495 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
496 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
497
498 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
499 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
500 struct mips_asm_switch mips_nomacro = { "macro", 0 };
501 struct mips_asm_switch mips_noat = { "at", 0 };
502
503 /* True if we're writing out a branch-likely instruction rather than a
504    normal branch.  */
505 static bool mips_branch_likely;
506
507 /* The current instruction-set architecture.  */
508 enum processor_type mips_arch;
509 const struct mips_cpu_info *mips_arch_info;
510
511 /* The processor that we should tune the code for.  */
512 enum processor_type mips_tune;
513 const struct mips_cpu_info *mips_tune_info;
514
515 /* The ISA level associated with mips_arch.  */
516 int mips_isa;
517
518 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
519 static const struct mips_cpu_info *mips_isa_option_info;
520
521 /* Which ABI to use.  */
522 int mips_abi = MIPS_ABI_DEFAULT;
523
524 /* Which cost information to use.  */
525 const struct mips_rtx_cost_data *mips_cost;
526
527 /* The ambient target flags, excluding MASK_MIPS16.  */
528 static int mips_base_target_flags;
529
530 /* True if MIPS16 is the default mode.  */
531 bool mips_base_mips16;
532
533 /* The ambient values of other global variables.  */
534 static int mips_base_schedule_insns; /* flag_schedule_insns */
535 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
536 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
537 static int mips_base_align_loops; /* align_loops */
538 static int mips_base_align_jumps; /* align_jumps */
539 static int mips_base_align_functions; /* align_functions */
540
541 /* The -mcode-readable setting.  */
542 enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES;
543
544 /* The -mr10k-cache-barrier setting.  */
545 static enum mips_r10k_cache_barrier_setting mips_r10k_cache_barrier;
546
547 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
548 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
549
550 /* Index C is true if character C is a valid PRINT_OPERAND punctation
551    character.  */
552 bool mips_print_operand_punct[256];
553
554 static GTY (()) int mips_output_filename_first_time = 1;
555
556 /* mips_split_p[X] is true if symbols of type X can be split by
557    mips_split_symbol.  */
558 bool mips_split_p[NUM_SYMBOL_TYPES];
559
560 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
561    can be split by mips_split_symbol.  */
562 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
563
564 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
565    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
566    if they are matched by a special .md file pattern.  */
567 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
568
569 /* Likewise for HIGHs.  */
570 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
571
572 /* Index R is the smallest register class that contains register R.  */
573 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
574   LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
575   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
576   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
577   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
578   M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
579   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
580   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
581   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
582   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
583   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
584   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
585   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
586   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
587   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
588   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
589   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
590   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
591   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
592   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
593   NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
594   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
595   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
596   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
597   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
598   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
599   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
600   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
601   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
602   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
603   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
604   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
605   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
606   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
607   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
608   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
609   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
610   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
611   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
612   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
613   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
614   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
615   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
616   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
617   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
618   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
619   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
620   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
621 };
622
623 /* The value of TARGET_ATTRIBUTE_TABLE.  */
624 static const struct attribute_spec mips_attribute_table[] = {
625   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
626   { "long_call",   0, 0, false, true,  true,  NULL },
627   { "far",         0, 0, false, true,  true,  NULL },
628   { "near",        0, 0, false, true,  true,  NULL },
629   /* We would really like to treat "mips16" and "nomips16" as type
630      attributes, but GCC doesn't provide the hooks we need to support
631      the right conversion rules.  As declaration attributes, they affect
632      code generation but don't carry other semantics.  */
633   { "mips16",      0, 0, true,  false, false, NULL },
634   { "nomips16",    0, 0, true,  false, false, NULL },
635   /* Allow functions to be specified as interrupt handlers */
636   { "interrupt",   0, 0, false, true,  true, NULL },
637   { "use_shadow_register_set",  0, 0, false, true,  true, NULL },
638   { "keep_interrupts_masked",   0, 0, false, true,  true, NULL },
639   { "use_debug_exception_return", 0, 0, false, true,  true, NULL },
640   { NULL,          0, 0, false, false, false, NULL }
641 };
642 \f
643 /* A table describing all the processors GCC knows about.  Names are
644    matched in the order listed.  The first mention of an ISA level is
645    taken as the canonical name for that ISA.
646
647    To ease comparison, please keep this table in the same order
648    as GAS's mips_cpu_info_table.  Please also make sure that
649    MIPS_ISA_LEVEL_SPEC and MIPS_ARCH_FLOAT_SPEC handle all -march
650    options correctly.  */
651 static const struct mips_cpu_info mips_cpu_info_table[] = {
652   /* Entries for generic ISAs.  */
653   { "mips1", PROCESSOR_R3000, 1, 0 },
654   { "mips2", PROCESSOR_R6000, 2, 0 },
655   { "mips3", PROCESSOR_R4000, 3, 0 },
656   { "mips4", PROCESSOR_R8000, 4, 0 },
657   /* Prefer not to use branch-likely instructions for generic MIPS32rX
658      and MIPS64rX code.  The instructions were officially deprecated
659      in revisions 2 and earlier, but revision 3 is likely to downgrade
660      that to a recommendation to avoid the instructions in code that
661      isn't tuned to a specific processor.  */
662   { "mips32", PROCESSOR_4KC, 32, PTF_AVOID_BRANCHLIKELY },
663   { "mips32r2", PROCESSOR_M4K, 33, PTF_AVOID_BRANCHLIKELY },
664   { "mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY },
665   /* ??? For now just tune the generic MIPS64r2 for 5KC as well.   */
666   { "mips64r2", PROCESSOR_5KC, 65, PTF_AVOID_BRANCHLIKELY },
667
668   /* MIPS I processors.  */
669   { "r3000", PROCESSOR_R3000, 1, 0 },
670   { "r2000", PROCESSOR_R3000, 1, 0 },
671   { "r3900", PROCESSOR_R3900, 1, 0 },
672
673   /* MIPS II processors.  */
674   { "r6000", PROCESSOR_R6000, 2, 0 },
675
676   /* MIPS III processors.  */
677   { "r4000", PROCESSOR_R4000, 3, 0 },
678   { "vr4100", PROCESSOR_R4100, 3, 0 },
679   { "vr4111", PROCESSOR_R4111, 3, 0 },
680   { "vr4120", PROCESSOR_R4120, 3, 0 },
681   { "vr4130", PROCESSOR_R4130, 3, 0 },
682   { "vr4300", PROCESSOR_R4300, 3, 0 },
683   { "r4400", PROCESSOR_R4000, 3, 0 },
684   { "r4600", PROCESSOR_R4600, 3, 0 },
685   { "orion", PROCESSOR_R4600, 3, 0 },
686   { "r4650", PROCESSOR_R4650, 3, 0 },
687   /* ST Loongson 2E/2F processors.  */
688   { "loongson2e", PROCESSOR_LOONGSON_2E, 3, PTF_AVOID_BRANCHLIKELY },
689   { "loongson2f", PROCESSOR_LOONGSON_2F, 3, PTF_AVOID_BRANCHLIKELY },
690
691   /* MIPS IV processors. */
692   { "r8000", PROCESSOR_R8000, 4, 0 },
693   { "r10000", PROCESSOR_R10000, 4, 0 },
694   { "r12000", PROCESSOR_R10000, 4, 0 },
695   { "r14000", PROCESSOR_R10000, 4, 0 },
696   { "r16000", PROCESSOR_R10000, 4, 0 },
697   { "vr5000", PROCESSOR_R5000, 4, 0 },
698   { "vr5400", PROCESSOR_R5400, 4, 0 },
699   { "vr5500", PROCESSOR_R5500, 4, PTF_AVOID_BRANCHLIKELY },
700   { "rm7000", PROCESSOR_R7000, 4, 0 },
701   { "rm9000", PROCESSOR_R9000, 4, 0 },
702
703   /* MIPS32 processors.  */
704   { "4kc", PROCESSOR_4KC, 32, 0 },
705   { "4km", PROCESSOR_4KC, 32, 0 },
706   { "4kp", PROCESSOR_4KP, 32, 0 },
707   { "4ksc", PROCESSOR_4KC, 32, 0 },
708
709   /* MIPS32 Release 2 processors.  */
710   { "m4k", PROCESSOR_M4K, 33, 0 },
711   { "4kec", PROCESSOR_4KC, 33, 0 },
712   { "4kem", PROCESSOR_4KC, 33, 0 },
713   { "4kep", PROCESSOR_4KP, 33, 0 },
714   { "4ksd", PROCESSOR_4KC, 33, 0 },
715
716   { "24kc", PROCESSOR_24KC, 33, 0 },
717   { "24kf2_1", PROCESSOR_24KF2_1, 33, 0 },
718   { "24kf", PROCESSOR_24KF2_1, 33, 0 },
719   { "24kf1_1", PROCESSOR_24KF1_1, 33, 0 },
720   { "24kfx", PROCESSOR_24KF1_1, 33, 0 },
721   { "24kx", PROCESSOR_24KF1_1, 33, 0 },
722
723   { "24kec", PROCESSOR_24KC, 33, 0 }, /* 24K with DSP.  */
724   { "24kef2_1", PROCESSOR_24KF2_1, 33, 0 },
725   { "24kef", PROCESSOR_24KF2_1, 33, 0 },
726   { "24kef1_1", PROCESSOR_24KF1_1, 33, 0 },
727   { "24kefx", PROCESSOR_24KF1_1, 33, 0 },
728   { "24kex", PROCESSOR_24KF1_1, 33, 0 },
729
730   { "34kc", PROCESSOR_24KC, 33, 0 }, /* 34K with MT/DSP.  */
731   { "34kf2_1", PROCESSOR_24KF2_1, 33, 0 },
732   { "34kf", PROCESSOR_24KF2_1, 33, 0 },
733   { "34kf1_1", PROCESSOR_24KF1_1, 33, 0 },
734   { "34kfx", PROCESSOR_24KF1_1, 33, 0 },
735   { "34kx", PROCESSOR_24KF1_1, 33, 0 },
736
737   { "74kc", PROCESSOR_74KC, 33, 0 }, /* 74K with DSPr2.  */
738   { "74kf2_1", PROCESSOR_74KF2_1, 33, 0 },
739   { "74kf", PROCESSOR_74KF2_1, 33, 0 },
740   { "74kf1_1", PROCESSOR_74KF1_1, 33, 0 },
741   { "74kfx", PROCESSOR_74KF1_1, 33, 0 },
742   { "74kx", PROCESSOR_74KF1_1, 33, 0 },
743   { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
744
745   { "1004kc", PROCESSOR_24KC, 33, 0 }, /* 1004K with MT/DSP.  */
746   { "1004kf2_1", PROCESSOR_24KF2_1, 33, 0 },
747   { "1004kf", PROCESSOR_24KF2_1, 33, 0 },
748   { "1004kf1_1", PROCESSOR_24KF1_1, 33, 0 },
749
750   /* MIPS64 processors.  */
751   { "5kc", PROCESSOR_5KC, 64, 0 },
752   { "5kf", PROCESSOR_5KF, 64, 0 },
753   { "20kc", PROCESSOR_20KC, 64, PTF_AVOID_BRANCHLIKELY },
754   { "sb1", PROCESSOR_SB1, 64, PTF_AVOID_BRANCHLIKELY },
755   { "sb1a", PROCESSOR_SB1A, 64, PTF_AVOID_BRANCHLIKELY },
756   { "sr71000", PROCESSOR_SR71000, 64, PTF_AVOID_BRANCHLIKELY },
757   { "xlr", PROCESSOR_XLR, 64, 0 },
758
759   /* MIPS64 Release 2 processors.  */
760   { "octeon", PROCESSOR_OCTEON, 65, PTF_AVOID_BRANCHLIKELY }
761 };
762
763 /* Default costs.  If these are used for a processor we should look
764    up the actual costs.  */
765 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
766                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
767                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
768                       COSTS_N_INSNS (23), /* fp_div_sf */    \
769                       COSTS_N_INSNS (36), /* fp_div_df */    \
770                       COSTS_N_INSNS (10), /* int_mult_si */  \
771                       COSTS_N_INSNS (10), /* int_mult_di */  \
772                       COSTS_N_INSNS (69), /* int_div_si */   \
773                       COSTS_N_INSNS (69), /* int_div_di */   \
774                                        2, /* branch_cost */  \
775                                        4  /* memory_latency */
776
777 /* Floating-point costs for processors without an FPU.  Just assume that
778    all floating-point libcalls are very expensive.  */
779 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
780                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
781                       COSTS_N_INSNS (256), /* fp_mult_df */   \
782                       COSTS_N_INSNS (256), /* fp_div_sf */    \
783                       COSTS_N_INSNS (256)  /* fp_div_df */
784
785 /* Costs to use when optimizing for size.  */
786 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
787   COSTS_N_INSNS (1),            /* fp_add */
788   COSTS_N_INSNS (1),            /* fp_mult_sf */
789   COSTS_N_INSNS (1),            /* fp_mult_df */
790   COSTS_N_INSNS (1),            /* fp_div_sf */
791   COSTS_N_INSNS (1),            /* fp_div_df */
792   COSTS_N_INSNS (1),            /* int_mult_si */
793   COSTS_N_INSNS (1),            /* int_mult_di */
794   COSTS_N_INSNS (1),            /* int_div_si */
795   COSTS_N_INSNS (1),            /* int_div_di */
796                    2,           /* branch_cost */
797                    4            /* memory_latency */
798 };
799
800 /* Costs to use when optimizing for speed, indexed by processor.  */
801 static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX] = {
802   { /* R3000 */
803     COSTS_N_INSNS (2),            /* fp_add */
804     COSTS_N_INSNS (4),            /* fp_mult_sf */
805     COSTS_N_INSNS (5),            /* fp_mult_df */
806     COSTS_N_INSNS (12),           /* fp_div_sf */
807     COSTS_N_INSNS (19),           /* fp_div_df */
808     COSTS_N_INSNS (12),           /* int_mult_si */
809     COSTS_N_INSNS (12),           /* int_mult_di */
810     COSTS_N_INSNS (35),           /* int_div_si */
811     COSTS_N_INSNS (35),           /* int_div_di */
812                      1,           /* branch_cost */
813                      4            /* memory_latency */
814   },
815   { /* 4KC */
816     SOFT_FP_COSTS,
817     COSTS_N_INSNS (6),            /* int_mult_si */
818     COSTS_N_INSNS (6),            /* int_mult_di */
819     COSTS_N_INSNS (36),           /* int_div_si */
820     COSTS_N_INSNS (36),           /* int_div_di */
821                      1,           /* branch_cost */
822                      4            /* memory_latency */
823   },
824   { /* 4KP */
825     SOFT_FP_COSTS,
826     COSTS_N_INSNS (36),           /* int_mult_si */
827     COSTS_N_INSNS (36),           /* int_mult_di */
828     COSTS_N_INSNS (37),           /* int_div_si */
829     COSTS_N_INSNS (37),           /* int_div_di */
830                      1,           /* branch_cost */
831                      4            /* memory_latency */
832   },
833   { /* 5KC */
834     SOFT_FP_COSTS,
835     COSTS_N_INSNS (4),            /* int_mult_si */
836     COSTS_N_INSNS (11),           /* int_mult_di */
837     COSTS_N_INSNS (36),           /* int_div_si */
838     COSTS_N_INSNS (68),           /* int_div_di */
839                      1,           /* branch_cost */
840                      4            /* memory_latency */
841   },
842   { /* 5KF */
843     COSTS_N_INSNS (4),            /* fp_add */
844     COSTS_N_INSNS (4),            /* fp_mult_sf */
845     COSTS_N_INSNS (5),            /* fp_mult_df */
846     COSTS_N_INSNS (17),           /* fp_div_sf */
847     COSTS_N_INSNS (32),           /* fp_div_df */
848     COSTS_N_INSNS (4),            /* int_mult_si */
849     COSTS_N_INSNS (11),           /* int_mult_di */
850     COSTS_N_INSNS (36),           /* int_div_si */
851     COSTS_N_INSNS (68),           /* int_div_di */
852                      1,           /* branch_cost */
853                      4            /* memory_latency */
854   },
855   { /* 20KC */
856     COSTS_N_INSNS (4),            /* fp_add */
857     COSTS_N_INSNS (4),            /* fp_mult_sf */
858     COSTS_N_INSNS (5),            /* fp_mult_df */
859     COSTS_N_INSNS (17),           /* fp_div_sf */
860     COSTS_N_INSNS (32),           /* fp_div_df */
861     COSTS_N_INSNS (4),            /* int_mult_si */
862     COSTS_N_INSNS (7),            /* int_mult_di */
863     COSTS_N_INSNS (42),           /* int_div_si */
864     COSTS_N_INSNS (72),           /* int_div_di */
865                      1,           /* branch_cost */
866                      4            /* memory_latency */
867   },
868   { /* 24KC */
869     SOFT_FP_COSTS,
870     COSTS_N_INSNS (5),            /* int_mult_si */
871     COSTS_N_INSNS (5),            /* int_mult_di */
872     COSTS_N_INSNS (41),           /* int_div_si */
873     COSTS_N_INSNS (41),           /* int_div_di */
874                      1,           /* branch_cost */
875                      4            /* memory_latency */
876   },
877   { /* 24KF2_1 */
878     COSTS_N_INSNS (8),            /* fp_add */
879     COSTS_N_INSNS (8),            /* fp_mult_sf */
880     COSTS_N_INSNS (10),           /* fp_mult_df */
881     COSTS_N_INSNS (34),           /* fp_div_sf */
882     COSTS_N_INSNS (64),           /* fp_div_df */
883     COSTS_N_INSNS (5),            /* int_mult_si */
884     COSTS_N_INSNS (5),            /* int_mult_di */
885     COSTS_N_INSNS (41),           /* int_div_si */
886     COSTS_N_INSNS (41),           /* int_div_di */
887                      1,           /* branch_cost */
888                      4            /* memory_latency */
889   },
890   { /* 24KF1_1 */
891     COSTS_N_INSNS (4),            /* fp_add */
892     COSTS_N_INSNS (4),            /* fp_mult_sf */
893     COSTS_N_INSNS (5),            /* fp_mult_df */
894     COSTS_N_INSNS (17),           /* fp_div_sf */
895     COSTS_N_INSNS (32),           /* fp_div_df */
896     COSTS_N_INSNS (5),            /* int_mult_si */
897     COSTS_N_INSNS (5),            /* int_mult_di */
898     COSTS_N_INSNS (41),           /* int_div_si */
899     COSTS_N_INSNS (41),           /* int_div_di */
900                      1,           /* branch_cost */
901                      4            /* memory_latency */
902   },
903   { /* 74KC */
904     SOFT_FP_COSTS,
905     COSTS_N_INSNS (5),            /* int_mult_si */
906     COSTS_N_INSNS (5),            /* int_mult_di */
907     COSTS_N_INSNS (41),           /* int_div_si */
908     COSTS_N_INSNS (41),           /* int_div_di */
909                      1,           /* branch_cost */
910                      4            /* memory_latency */
911   },
912   { /* 74KF2_1 */
913     COSTS_N_INSNS (8),            /* fp_add */
914     COSTS_N_INSNS (8),            /* fp_mult_sf */
915     COSTS_N_INSNS (10),           /* fp_mult_df */
916     COSTS_N_INSNS (34),           /* fp_div_sf */
917     COSTS_N_INSNS (64),           /* fp_div_df */
918     COSTS_N_INSNS (5),            /* int_mult_si */
919     COSTS_N_INSNS (5),            /* int_mult_di */
920     COSTS_N_INSNS (41),           /* int_div_si */
921     COSTS_N_INSNS (41),           /* int_div_di */
922                      1,           /* branch_cost */
923                      4            /* memory_latency */
924   },
925   { /* 74KF1_1 */
926     COSTS_N_INSNS (4),            /* fp_add */
927     COSTS_N_INSNS (4),            /* fp_mult_sf */
928     COSTS_N_INSNS (5),            /* fp_mult_df */
929     COSTS_N_INSNS (17),           /* fp_div_sf */
930     COSTS_N_INSNS (32),           /* fp_div_df */
931     COSTS_N_INSNS (5),            /* int_mult_si */
932     COSTS_N_INSNS (5),            /* int_mult_di */
933     COSTS_N_INSNS (41),           /* int_div_si */
934     COSTS_N_INSNS (41),           /* int_div_di */
935                      1,           /* branch_cost */
936                      4            /* memory_latency */
937   },
938   { /* 74KF3_2 */
939     COSTS_N_INSNS (6),            /* fp_add */
940     COSTS_N_INSNS (6),            /* fp_mult_sf */
941     COSTS_N_INSNS (7),            /* fp_mult_df */
942     COSTS_N_INSNS (25),           /* fp_div_sf */
943     COSTS_N_INSNS (48),           /* fp_div_df */
944     COSTS_N_INSNS (5),            /* int_mult_si */
945     COSTS_N_INSNS (5),            /* int_mult_di */
946     COSTS_N_INSNS (41),           /* int_div_si */
947     COSTS_N_INSNS (41),           /* int_div_di */
948                      1,           /* branch_cost */
949                      4            /* memory_latency */
950   },
951   { /* Loongson-2E */
952     DEFAULT_COSTS
953   },
954   { /* Loongson-2F */
955     DEFAULT_COSTS
956   },
957   { /* M4k */
958     DEFAULT_COSTS
959   },
960     /* Octeon */
961   {
962     SOFT_FP_COSTS,
963     COSTS_N_INSNS (5),            /* int_mult_si */
964     COSTS_N_INSNS (5),            /* int_mult_di */
965     COSTS_N_INSNS (72),           /* int_div_si */
966     COSTS_N_INSNS (72),           /* int_div_di */
967                      1,           /* branch_cost */
968                      4            /* memory_latency */
969   },
970   { /* R3900 */
971     COSTS_N_INSNS (2),            /* fp_add */
972     COSTS_N_INSNS (4),            /* fp_mult_sf */
973     COSTS_N_INSNS (5),            /* fp_mult_df */
974     COSTS_N_INSNS (12),           /* fp_div_sf */
975     COSTS_N_INSNS (19),           /* fp_div_df */
976     COSTS_N_INSNS (2),            /* int_mult_si */
977     COSTS_N_INSNS (2),            /* int_mult_di */
978     COSTS_N_INSNS (35),           /* int_div_si */
979     COSTS_N_INSNS (35),           /* int_div_di */
980                      1,           /* branch_cost */
981                      4            /* memory_latency */
982   },
983   { /* R6000 */
984     COSTS_N_INSNS (3),            /* fp_add */
985     COSTS_N_INSNS (5),            /* fp_mult_sf */
986     COSTS_N_INSNS (6),            /* fp_mult_df */
987     COSTS_N_INSNS (15),           /* fp_div_sf */
988     COSTS_N_INSNS (16),           /* fp_div_df */
989     COSTS_N_INSNS (17),           /* int_mult_si */
990     COSTS_N_INSNS (17),           /* int_mult_di */
991     COSTS_N_INSNS (38),           /* int_div_si */
992     COSTS_N_INSNS (38),           /* int_div_di */
993                      2,           /* branch_cost */
994                      6            /* memory_latency */
995   },
996   { /* R4000 */
997      COSTS_N_INSNS (6),           /* fp_add */
998      COSTS_N_INSNS (7),           /* fp_mult_sf */
999      COSTS_N_INSNS (8),           /* fp_mult_df */
1000      COSTS_N_INSNS (23),          /* fp_div_sf */
1001      COSTS_N_INSNS (36),          /* fp_div_df */
1002      COSTS_N_INSNS (10),          /* int_mult_si */
1003      COSTS_N_INSNS (10),          /* int_mult_di */
1004      COSTS_N_INSNS (69),          /* int_div_si */
1005      COSTS_N_INSNS (69),          /* int_div_di */
1006                       2,          /* branch_cost */
1007                       6           /* memory_latency */
1008   },
1009   { /* R4100 */
1010     DEFAULT_COSTS
1011   },
1012   { /* R4111 */
1013     DEFAULT_COSTS
1014   },
1015   { /* R4120 */
1016     DEFAULT_COSTS
1017   },
1018   { /* R4130 */
1019     /* The only costs that appear to be updated here are
1020        integer multiplication.  */
1021     SOFT_FP_COSTS,
1022     COSTS_N_INSNS (4),            /* int_mult_si */
1023     COSTS_N_INSNS (6),            /* int_mult_di */
1024     COSTS_N_INSNS (69),           /* int_div_si */
1025     COSTS_N_INSNS (69),           /* int_div_di */
1026                      1,           /* branch_cost */
1027                      4            /* memory_latency */
1028   },
1029   { /* R4300 */
1030     DEFAULT_COSTS
1031   },
1032   { /* R4600 */
1033     DEFAULT_COSTS
1034   },
1035   { /* R4650 */
1036     DEFAULT_COSTS
1037   },
1038   { /* R5000 */
1039     COSTS_N_INSNS (6),            /* fp_add */
1040     COSTS_N_INSNS (4),            /* fp_mult_sf */
1041     COSTS_N_INSNS (5),            /* fp_mult_df */
1042     COSTS_N_INSNS (23),           /* fp_div_sf */
1043     COSTS_N_INSNS (36),           /* fp_div_df */
1044     COSTS_N_INSNS (5),            /* int_mult_si */
1045     COSTS_N_INSNS (5),            /* int_mult_di */
1046     COSTS_N_INSNS (36),           /* int_div_si */
1047     COSTS_N_INSNS (36),           /* int_div_di */
1048                      1,           /* branch_cost */
1049                      4            /* memory_latency */
1050   },
1051   { /* R5400 */
1052     COSTS_N_INSNS (6),            /* fp_add */
1053     COSTS_N_INSNS (5),            /* fp_mult_sf */
1054     COSTS_N_INSNS (6),            /* fp_mult_df */
1055     COSTS_N_INSNS (30),           /* fp_div_sf */
1056     COSTS_N_INSNS (59),           /* fp_div_df */
1057     COSTS_N_INSNS (3),            /* int_mult_si */
1058     COSTS_N_INSNS (4),            /* int_mult_di */
1059     COSTS_N_INSNS (42),           /* int_div_si */
1060     COSTS_N_INSNS (74),           /* int_div_di */
1061                      1,           /* branch_cost */
1062                      4            /* memory_latency */
1063   },
1064   { /* R5500 */
1065     COSTS_N_INSNS (6),            /* fp_add */
1066     COSTS_N_INSNS (5),            /* fp_mult_sf */
1067     COSTS_N_INSNS (6),            /* fp_mult_df */
1068     COSTS_N_INSNS (30),           /* fp_div_sf */
1069     COSTS_N_INSNS (59),           /* fp_div_df */
1070     COSTS_N_INSNS (5),            /* int_mult_si */
1071     COSTS_N_INSNS (9),            /* int_mult_di */
1072     COSTS_N_INSNS (42),           /* int_div_si */
1073     COSTS_N_INSNS (74),           /* int_div_di */
1074                      1,           /* branch_cost */
1075                      4            /* memory_latency */
1076   },
1077   { /* R7000 */
1078     /* The only costs that are changed here are
1079        integer multiplication.  */
1080     COSTS_N_INSNS (6),            /* fp_add */
1081     COSTS_N_INSNS (7),            /* fp_mult_sf */
1082     COSTS_N_INSNS (8),            /* fp_mult_df */
1083     COSTS_N_INSNS (23),           /* fp_div_sf */
1084     COSTS_N_INSNS (36),           /* fp_div_df */
1085     COSTS_N_INSNS (5),            /* int_mult_si */
1086     COSTS_N_INSNS (9),            /* int_mult_di */
1087     COSTS_N_INSNS (69),           /* int_div_si */
1088     COSTS_N_INSNS (69),           /* int_div_di */
1089                      1,           /* branch_cost */
1090                      4            /* memory_latency */
1091   },
1092   { /* R8000 */
1093     DEFAULT_COSTS
1094   },
1095   { /* R9000 */
1096     /* The only costs that are changed here are
1097        integer multiplication.  */
1098     COSTS_N_INSNS (6),            /* fp_add */
1099     COSTS_N_INSNS (7),            /* fp_mult_sf */
1100     COSTS_N_INSNS (8),            /* fp_mult_df */
1101     COSTS_N_INSNS (23),           /* fp_div_sf */
1102     COSTS_N_INSNS (36),           /* fp_div_df */
1103     COSTS_N_INSNS (3),            /* int_mult_si */
1104     COSTS_N_INSNS (8),            /* int_mult_di */
1105     COSTS_N_INSNS (69),           /* int_div_si */
1106     COSTS_N_INSNS (69),           /* int_div_di */
1107                      1,           /* branch_cost */
1108                      4            /* memory_latency */
1109   },
1110   { /* R1x000 */
1111     COSTS_N_INSNS (2),            /* fp_add */
1112     COSTS_N_INSNS (2),            /* fp_mult_sf */
1113     COSTS_N_INSNS (2),            /* fp_mult_df */
1114     COSTS_N_INSNS (12),           /* fp_div_sf */
1115     COSTS_N_INSNS (19),           /* fp_div_df */
1116     COSTS_N_INSNS (5),            /* int_mult_si */
1117     COSTS_N_INSNS (9),            /* int_mult_di */
1118     COSTS_N_INSNS (34),           /* int_div_si */
1119     COSTS_N_INSNS (66),           /* int_div_di */
1120                      1,           /* branch_cost */
1121                      4            /* memory_latency */
1122   },
1123   { /* SB1 */
1124     /* These costs are the same as the SB-1A below.  */
1125     COSTS_N_INSNS (4),            /* fp_add */
1126     COSTS_N_INSNS (4),            /* fp_mult_sf */
1127     COSTS_N_INSNS (4),            /* fp_mult_df */
1128     COSTS_N_INSNS (24),           /* fp_div_sf */
1129     COSTS_N_INSNS (32),           /* fp_div_df */
1130     COSTS_N_INSNS (3),            /* int_mult_si */
1131     COSTS_N_INSNS (4),            /* int_mult_di */
1132     COSTS_N_INSNS (36),           /* int_div_si */
1133     COSTS_N_INSNS (68),           /* int_div_di */
1134                      1,           /* branch_cost */
1135                      4            /* memory_latency */
1136   },
1137   { /* SB1-A */
1138     /* These costs are the same as the SB-1 above.  */
1139     COSTS_N_INSNS (4),            /* fp_add */
1140     COSTS_N_INSNS (4),            /* fp_mult_sf */
1141     COSTS_N_INSNS (4),            /* fp_mult_df */
1142     COSTS_N_INSNS (24),           /* fp_div_sf */
1143     COSTS_N_INSNS (32),           /* fp_div_df */
1144     COSTS_N_INSNS (3),            /* int_mult_si */
1145     COSTS_N_INSNS (4),            /* int_mult_di */
1146     COSTS_N_INSNS (36),           /* int_div_si */
1147     COSTS_N_INSNS (68),           /* int_div_di */
1148                      1,           /* branch_cost */
1149                      4            /* memory_latency */
1150   },
1151   { /* SR71000 */
1152     DEFAULT_COSTS
1153   },
1154   { /* XLR */
1155     SOFT_FP_COSTS,
1156     COSTS_N_INSNS (8),            /* int_mult_si */
1157     COSTS_N_INSNS (8),            /* int_mult_di */
1158     COSTS_N_INSNS (72),           /* int_div_si */
1159     COSTS_N_INSNS (72),           /* int_div_di */
1160                      1,           /* branch_cost */
1161                      4            /* memory_latency */
1162   }
1163 };
1164 \f
1165 static rtx mips_find_pic_call_symbol (rtx, rtx);
1166 \f
1167 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1168    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1169 struct GTY (())  mflip_mips16_entry {
1170   const char *name;
1171   bool mips16_p;
1172 };
1173 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1174
1175 /* Hash table callbacks for mflip_mips16_htab.  */
1176
1177 static hashval_t
1178 mflip_mips16_htab_hash (const void *entry)
1179 {
1180   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1181 }
1182
1183 static int
1184 mflip_mips16_htab_eq (const void *entry, const void *name)
1185 {
1186   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1187                  (const char *) name) == 0;
1188 }
1189
1190 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1191    mode, false if it should next add an attribute for the opposite mode.  */
1192 static GTY(()) bool mips16_flipper;
1193
1194 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1195    for -mflip-mips16.  Return true if it should use "mips16" and false if
1196    it should use "nomips16".  */
1197
1198 static bool
1199 mflip_mips16_use_mips16_p (tree decl)
1200 {
1201   struct mflip_mips16_entry *entry;
1202   const char *name;
1203   hashval_t hash;
1204   void **slot;
1205
1206   /* Use the opposite of the command-line setting for anonymous decls.  */
1207   if (!DECL_NAME (decl))
1208     return !mips_base_mips16;
1209
1210   if (!mflip_mips16_htab)
1211     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1212                                          mflip_mips16_htab_eq, NULL);
1213
1214   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1215   hash = htab_hash_string (name);
1216   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1217   entry = (struct mflip_mips16_entry *) *slot;
1218   if (!entry)
1219     {
1220       mips16_flipper = !mips16_flipper;
1221       entry = GGC_NEW (struct mflip_mips16_entry);
1222       entry->name = name;
1223       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1224       *slot = entry;
1225     }
1226   return entry->mips16_p;
1227 }
1228 \f
1229 /* Predicates to test for presence of "near" and "far"/"long_call"
1230    attributes on the given TYPE.  */
1231
1232 static bool
1233 mips_near_type_p (const_tree type)
1234 {
1235   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1236 }
1237
1238 static bool
1239 mips_far_type_p (const_tree type)
1240 {
1241   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1242           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1243 }
1244
1245 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1246
1247 static bool
1248 mips_mips16_decl_p (const_tree decl)
1249 {
1250   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1251 }
1252
1253 static bool
1254 mips_nomips16_decl_p (const_tree decl)
1255 {
1256   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1257 }
1258
1259 /* Check if the interrupt attribute is set for a function.  */
1260
1261 static bool
1262 mips_interrupt_type_p (tree type)
1263 {
1264   return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1265 }
1266
1267 /* Check if the attribute to use shadow register set is set for a function.  */
1268
1269 static bool
1270 mips_use_shadow_register_set_p (tree type)
1271 {
1272   return lookup_attribute ("use_shadow_register_set",
1273                            TYPE_ATTRIBUTES (type)) != NULL;
1274 }
1275
1276 /* Check if the attribute to keep interrupts masked is set for a function.  */
1277
1278 static bool
1279 mips_keep_interrupts_masked_p (tree type)
1280 {
1281   return lookup_attribute ("keep_interrupts_masked",
1282                            TYPE_ATTRIBUTES (type)) != NULL;
1283 }
1284
1285 /* Check if the attribute to use debug exception return is set for
1286    a function.  */
1287
1288 static bool
1289 mips_use_debug_exception_return_p (tree type)
1290 {
1291   return lookup_attribute ("use_debug_exception_return",
1292                            TYPE_ATTRIBUTES (type)) != NULL;
1293 }
1294
1295 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1296    setting if DECL is null.  */
1297
1298 static bool
1299 mips_use_mips16_mode_p (tree decl)
1300 {
1301   if (decl)
1302     {
1303       /* Nested functions must use the same frame pointer as their
1304          parent and must therefore use the same ISA mode.  */
1305       tree parent = decl_function_context (decl);
1306       if (parent)
1307         decl = parent;
1308       if (mips_mips16_decl_p (decl))
1309         return true;
1310       if (mips_nomips16_decl_p (decl))
1311         return false;
1312     }
1313   return mips_base_mips16;
1314 }
1315
1316 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1317
1318 static int
1319 mips_comp_type_attributes (const_tree type1, const_tree type2)
1320 {
1321   /* Disallow mixed near/far attributes.  */
1322   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1323     return 0;
1324   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1325     return 0;
1326   return 1;
1327 }
1328
1329 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1330
1331 static void
1332 mips_insert_attributes (tree decl, tree *attributes)
1333 {
1334   const char *name;
1335   bool mips16_p, nomips16_p;
1336
1337   /* Check for "mips16" and "nomips16" attributes.  */
1338   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1339   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1340   if (TREE_CODE (decl) != FUNCTION_DECL)
1341     {
1342       if (mips16_p)
1343         error ("%qs attribute only applies to functions", "mips16");
1344       if (nomips16_p)
1345         error ("%qs attribute only applies to functions", "nomips16");
1346     }
1347   else
1348     {
1349       mips16_p |= mips_mips16_decl_p (decl);
1350       nomips16_p |= mips_nomips16_decl_p (decl);
1351       if (mips16_p || nomips16_p)
1352         {
1353           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1354           if (mips16_p && nomips16_p)
1355             error ("%qE cannot have both %<mips16%> and "
1356                    "%<nomips16%> attributes",
1357                    DECL_NAME (decl));
1358         }
1359       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1360         {
1361           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1362              "mips16" attribute, arbitrarily pick one.  We must pick the same
1363              setting for duplicate declarations of a function.  */
1364           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1365           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1366         }
1367     }
1368 }
1369
1370 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1371
1372 static tree
1373 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1374 {
1375   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1376   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1377     error ("%qE redeclared with conflicting %qs attributes",
1378            DECL_NAME (newdecl), "mips16");
1379   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1380     error ("%qE redeclared with conflicting %qs attributes",
1381            DECL_NAME (newdecl), "nomips16");
1382
1383   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1384                            DECL_ATTRIBUTES (newdecl));
1385 }
1386 \f
1387 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1388    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1389
1390 static void
1391 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1392 {
1393   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1394     {
1395       *base_ptr = XEXP (x, 0);
1396       *offset_ptr = INTVAL (XEXP (x, 1));
1397     }
1398   else
1399     {
1400       *base_ptr = x;
1401       *offset_ptr = 0;
1402     }
1403 }
1404 \f
1405 static unsigned int mips_build_integer (struct mips_integer_op *,
1406                                         unsigned HOST_WIDE_INT);
1407
1408 /* A subroutine of mips_build_integer, with the same interface.
1409    Assume that the final action in the sequence should be a left shift.  */
1410
1411 static unsigned int
1412 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1413 {
1414   unsigned int i, shift;
1415
1416   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1417      since signed numbers are easier to load than unsigned ones.  */
1418   shift = 0;
1419   while ((value & 1) == 0)
1420     value /= 2, shift++;
1421
1422   i = mips_build_integer (codes, value);
1423   codes[i].code = ASHIFT;
1424   codes[i].value = shift;
1425   return i + 1;
1426 }
1427
1428 /* As for mips_build_shift, but assume that the final action will be
1429    an IOR or PLUS operation.  */
1430
1431 static unsigned int
1432 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1433 {
1434   unsigned HOST_WIDE_INT high;
1435   unsigned int i;
1436
1437   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1438   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1439     {
1440       /* The constant is too complex to load with a simple LUI/ORI pair,
1441          so we want to give the recursive call as many trailing zeros as
1442          possible.  In this case, we know bit 16 is set and that the
1443          low 16 bits form a negative number.  If we subtract that number
1444          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1445       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1446       codes[i].code = PLUS;
1447       codes[i].value = CONST_LOW_PART (value);
1448     }
1449   else
1450     {
1451       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1452          bits gives a value with at least 17 trailing zeros.  */
1453       i = mips_build_integer (codes, high);
1454       codes[i].code = IOR;
1455       codes[i].value = value & 0xffff;
1456     }
1457   return i + 1;
1458 }
1459
1460 /* Fill CODES with a sequence of rtl operations to load VALUE.
1461    Return the number of operations needed.  */
1462
1463 static unsigned int
1464 mips_build_integer (struct mips_integer_op *codes,
1465                     unsigned HOST_WIDE_INT value)
1466 {
1467   if (SMALL_OPERAND (value)
1468       || SMALL_OPERAND_UNSIGNED (value)
1469       || LUI_OPERAND (value))
1470     {
1471       /* The value can be loaded with a single instruction.  */
1472       codes[0].code = UNKNOWN;
1473       codes[0].value = value;
1474       return 1;
1475     }
1476   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1477     {
1478       /* Either the constant is a simple LUI/ORI combination or its
1479          lowest bit is set.  We don't want to shift in this case.  */
1480       return mips_build_lower (codes, value);
1481     }
1482   else if ((value & 0xffff) == 0)
1483     {
1484       /* The constant will need at least three actions.  The lowest
1485          16 bits are clear, so the final action will be a shift.  */
1486       return mips_build_shift (codes, value);
1487     }
1488   else
1489     {
1490       /* The final action could be a shift, add or inclusive OR.
1491          Rather than use a complex condition to select the best
1492          approach, try both mips_build_shift and mips_build_lower
1493          and pick the one that gives the shortest sequence.
1494          Note that this case is only used once per constant.  */
1495       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1496       unsigned int cost, alt_cost;
1497
1498       cost = mips_build_shift (codes, value);
1499       alt_cost = mips_build_lower (alt_codes, value);
1500       if (alt_cost < cost)
1501         {
1502           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1503           cost = alt_cost;
1504         }
1505       return cost;
1506     }
1507 }
1508 \f
1509 /* Return true if symbols of type TYPE require a GOT access.  */
1510
1511 static bool
1512 mips_got_symbol_type_p (enum mips_symbol_type type)
1513 {
1514   switch (type)
1515     {
1516     case SYMBOL_GOT_PAGE_OFST:
1517     case SYMBOL_GOT_DISP:
1518       return true;
1519
1520     default:
1521       return false;
1522     }
1523 }
1524
1525 /* Return true if X is a thread-local symbol.  */
1526
1527 static bool
1528 mips_tls_symbol_p (rtx x)
1529 {
1530   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1531 }
1532
1533 /* Return true if SYMBOL_REF X is associated with a global symbol
1534    (in the STB_GLOBAL sense).  */
1535
1536 static bool
1537 mips_global_symbol_p (const_rtx x)
1538 {
1539   const_tree decl = SYMBOL_REF_DECL (x);
1540
1541   if (!decl)
1542     return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1543
1544   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1545      or weak symbols.  Relocations in the object file will be against
1546      the target symbol, so it's that symbol's binding that matters here.  */
1547   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1548 }
1549
1550 /* Return true if function X is a libgcc MIPS16 stub function.  */
1551
1552 static bool
1553 mips16_stub_function_p (const_rtx x)
1554 {
1555   return (GET_CODE (x) == SYMBOL_REF
1556           && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1557 }
1558
1559 /* Return true if function X is a locally-defined and locally-binding
1560    MIPS16 function.  */
1561
1562 static bool
1563 mips16_local_function_p (const_rtx x)
1564 {
1565   return (GET_CODE (x) == SYMBOL_REF
1566           && SYMBOL_REF_LOCAL_P (x)
1567           && !SYMBOL_REF_EXTERNAL_P (x)
1568           && mips_use_mips16_mode_p (SYMBOL_REF_DECL (x)));
1569 }
1570
1571 /* Return true if SYMBOL_REF X binds locally.  */
1572
1573 static bool
1574 mips_symbol_binds_local_p (const_rtx x)
1575 {
1576   return (SYMBOL_REF_DECL (x)
1577           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1578           : SYMBOL_REF_LOCAL_P (x));
1579 }
1580
1581 /* Return true if rtx constants of mode MODE should be put into a small
1582    data section.  */
1583
1584 static bool
1585 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1586 {
1587   return (!TARGET_EMBEDDED_DATA
1588           && TARGET_LOCAL_SDATA
1589           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1590 }
1591
1592 /* Return true if X should not be moved directly into register $25.
1593    We need this because many versions of GAS will treat "la $25,foo" as
1594    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1595
1596 bool
1597 mips_dangerous_for_la25_p (rtx x)
1598 {
1599   return (!TARGET_EXPLICIT_RELOCS
1600           && TARGET_USE_GOT
1601           && GET_CODE (x) == SYMBOL_REF
1602           && mips_global_symbol_p (x));
1603 }
1604
1605 /* Return true if calls to X might need $25 to be valid on entry.  */
1606
1607 bool
1608 mips_use_pic_fn_addr_reg_p (const_rtx x)
1609 {
1610   if (!TARGET_USE_PIC_FN_ADDR_REG)
1611     return false;
1612
1613   /* MIPS16 stub functions are guaranteed not to use $25.  */
1614   if (mips16_stub_function_p (x))
1615     return false;
1616
1617   if (GET_CODE (x) == SYMBOL_REF)
1618     {
1619       /* If PLTs and copy relocations are available, the static linker
1620          will make sure that $25 is valid on entry to the target function.  */
1621       if (TARGET_ABICALLS_PIC0)
1622         return false;
1623
1624       /* Locally-defined functions use absolute accesses to set up
1625          the global pointer.  */
1626       if (TARGET_ABSOLUTE_ABICALLS
1627           && mips_symbol_binds_local_p (x)
1628           && !SYMBOL_REF_EXTERNAL_P (x))
1629         return false;
1630     }
1631
1632   return true;
1633 }
1634
1635 /* Return the method that should be used to access SYMBOL_REF or
1636    LABEL_REF X in context CONTEXT.  */
1637
1638 static enum mips_symbol_type
1639 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1640 {
1641   if (TARGET_RTP_PIC)
1642     return SYMBOL_GOT_DISP;
1643
1644   if (GET_CODE (x) == LABEL_REF)
1645     {
1646       /* LABEL_REFs are used for jump tables as well as text labels.
1647          Only return SYMBOL_PC_RELATIVE if we know the label is in
1648          the text section.  */
1649       if (TARGET_MIPS16_SHORT_JUMP_TABLES)
1650         return SYMBOL_PC_RELATIVE;
1651
1652       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1653         return SYMBOL_GOT_PAGE_OFST;
1654
1655       return SYMBOL_ABSOLUTE;
1656     }
1657
1658   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1659
1660   if (SYMBOL_REF_TLS_MODEL (x))
1661     return SYMBOL_TLS;
1662
1663   if (CONSTANT_POOL_ADDRESS_P (x))
1664     {
1665       if (TARGET_MIPS16_TEXT_LOADS)
1666         return SYMBOL_PC_RELATIVE;
1667
1668       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1669         return SYMBOL_PC_RELATIVE;
1670
1671       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1672         return SYMBOL_GP_RELATIVE;
1673     }
1674
1675   /* Do not use small-data accesses for weak symbols; they may end up
1676      being zero.  */
1677   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1678     return SYMBOL_GP_RELATIVE;
1679
1680   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1681      is in effect.  */
1682   if (TARGET_ABICALLS_PIC2
1683       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1684     {
1685       /* There are three cases to consider:
1686
1687             - o32 PIC (either with or without explicit relocs)
1688             - n32/n64 PIC without explicit relocs
1689             - n32/n64 PIC with explicit relocs
1690
1691          In the first case, both local and global accesses will use an
1692          R_MIPS_GOT16 relocation.  We must correctly predict which of
1693          the two semantics (local or global) the assembler and linker
1694          will apply.  The choice depends on the symbol's binding rather
1695          than its visibility.
1696
1697          In the second case, the assembler will not use R_MIPS_GOT16
1698          relocations, but it chooses between local and global accesses
1699          in the same way as for o32 PIC.
1700
1701          In the third case we have more freedom since both forms of
1702          access will work for any kind of symbol.  However, there seems
1703          little point in doing things differently.  */
1704       if (mips_global_symbol_p (x))
1705         return SYMBOL_GOT_DISP;
1706
1707       return SYMBOL_GOT_PAGE_OFST;
1708     }
1709
1710   if (TARGET_MIPS16_PCREL_LOADS && context != SYMBOL_CONTEXT_CALL)
1711     return SYMBOL_FORCE_TO_MEM;
1712
1713   return SYMBOL_ABSOLUTE;
1714 }
1715
1716 /* Classify the base of symbolic expression X, given that X appears in
1717    context CONTEXT.  */
1718
1719 static enum mips_symbol_type
1720 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1721 {
1722   rtx offset;
1723
1724   split_const (x, &x, &offset);
1725   if (UNSPEC_ADDRESS_P (x))
1726     return UNSPEC_ADDRESS_TYPE (x);
1727
1728   return mips_classify_symbol (x, context);
1729 }
1730
1731 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1732    is the alignment in bytes of SYMBOL_REF X.  */
1733
1734 static bool
1735 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1736 {
1737   HOST_WIDE_INT align;
1738
1739   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1740   return IN_RANGE (offset, 0, align - 1);
1741 }
1742
1743 /* Return true if X is a symbolic constant that can be used in context
1744    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1745
1746 bool
1747 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1748                           enum mips_symbol_type *symbol_type)
1749 {
1750   rtx offset;
1751
1752   split_const (x, &x, &offset);
1753   if (UNSPEC_ADDRESS_P (x))
1754     {
1755       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1756       x = UNSPEC_ADDRESS (x);
1757     }
1758   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1759     {
1760       *symbol_type = mips_classify_symbol (x, context);
1761       if (*symbol_type == SYMBOL_TLS)
1762         return false;
1763     }
1764   else
1765     return false;
1766
1767   if (offset == const0_rtx)
1768     return true;
1769
1770   /* Check whether a nonzero offset is valid for the underlying
1771      relocations.  */
1772   switch (*symbol_type)
1773     {
1774     case SYMBOL_ABSOLUTE:
1775     case SYMBOL_FORCE_TO_MEM:
1776     case SYMBOL_32_HIGH:
1777     case SYMBOL_64_HIGH:
1778     case SYMBOL_64_MID:
1779     case SYMBOL_64_LOW:
1780       /* If the target has 64-bit pointers and the object file only
1781          supports 32-bit symbols, the values of those symbols will be
1782          sign-extended.  In this case we can't allow an arbitrary offset
1783          in case the 32-bit value X + OFFSET has a different sign from X.  */
1784       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1785         return offset_within_block_p (x, INTVAL (offset));
1786
1787       /* In other cases the relocations can handle any offset.  */
1788       return true;
1789
1790     case SYMBOL_PC_RELATIVE:
1791       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1792          In this case, we no longer have access to the underlying constant,
1793          but the original symbol-based access was known to be valid.  */
1794       if (GET_CODE (x) == LABEL_REF)
1795         return true;
1796
1797       /* Fall through.  */
1798
1799     case SYMBOL_GP_RELATIVE:
1800       /* Make sure that the offset refers to something within the
1801          same object block.  This should guarantee that the final
1802          PC- or GP-relative offset is within the 16-bit limit.  */
1803       return offset_within_block_p (x, INTVAL (offset));
1804
1805     case SYMBOL_GOT_PAGE_OFST:
1806     case SYMBOL_GOTOFF_PAGE:
1807       /* If the symbol is global, the GOT entry will contain the symbol's
1808          address, and we will apply a 16-bit offset after loading it.
1809          If the symbol is local, the linker should provide enough local
1810          GOT entries for a 16-bit offset, but larger offsets may lead
1811          to GOT overflow.  */
1812       return SMALL_INT (offset);
1813
1814     case SYMBOL_TPREL:
1815     case SYMBOL_DTPREL:
1816       /* There is no carry between the HI and LO REL relocations, so the
1817          offset is only valid if we know it won't lead to such a carry.  */
1818       return mips_offset_within_alignment_p (x, INTVAL (offset));
1819
1820     case SYMBOL_GOT_DISP:
1821     case SYMBOL_GOTOFF_DISP:
1822     case SYMBOL_GOTOFF_CALL:
1823     case SYMBOL_GOTOFF_LOADGP:
1824     case SYMBOL_TLSGD:
1825     case SYMBOL_TLSLDM:
1826     case SYMBOL_GOTTPREL:
1827     case SYMBOL_TLS:
1828     case SYMBOL_HALF:
1829       return false;
1830     }
1831   gcc_unreachable ();
1832 }
1833 \f
1834 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1835    single instruction.  We rely on the fact that, in the worst case,
1836    all instructions involved in a MIPS16 address calculation are usually
1837    extended ones.  */
1838
1839 static int
1840 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1841 {
1842   switch (type)
1843     {
1844     case SYMBOL_ABSOLUTE:
1845       /* When using 64-bit symbols, we need 5 preparatory instructions,
1846          such as:
1847
1848              lui     $at,%highest(symbol)
1849              daddiu  $at,$at,%higher(symbol)
1850              dsll    $at,$at,16
1851              daddiu  $at,$at,%hi(symbol)
1852              dsll    $at,$at,16
1853
1854          The final address is then $at + %lo(symbol).  With 32-bit
1855          symbols we just need a preparatory LUI for normal mode and
1856          a preparatory LI and SLL for MIPS16.  */
1857       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1858
1859     case SYMBOL_GP_RELATIVE:
1860       /* Treat GP-relative accesses as taking a single instruction on
1861          MIPS16 too; the copy of $gp can often be shared.  */
1862       return 1;
1863
1864     case SYMBOL_PC_RELATIVE:
1865       /* PC-relative constants can be only be used with ADDIUPC,
1866          DADDIUPC, LWPC and LDPC.  */
1867       if (mode == MAX_MACHINE_MODE
1868           || GET_MODE_SIZE (mode) == 4
1869           || GET_MODE_SIZE (mode) == 8)
1870         return 1;
1871
1872       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1873       return 0;
1874
1875     case SYMBOL_FORCE_TO_MEM:
1876       /* LEAs will be converted into constant-pool references by
1877          mips_reorg.  */
1878       if (mode == MAX_MACHINE_MODE)
1879         return 1;
1880
1881       /* The constant must be loaded and then dereferenced.  */
1882       return 0;
1883
1884     case SYMBOL_GOT_DISP:
1885       /* The constant will have to be loaded from the GOT before it
1886          is used in an address.  */
1887       if (mode != MAX_MACHINE_MODE)
1888         return 0;
1889
1890       /* Fall through.  */
1891
1892     case SYMBOL_GOT_PAGE_OFST:
1893       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1894          local/global classification is accurate.  The worst cases are:
1895
1896          (1) For local symbols when generating o32 or o64 code.  The assembler
1897              will use:
1898
1899                  lw           $at,%got(symbol)
1900                  nop
1901
1902              ...and the final address will be $at + %lo(symbol).
1903
1904          (2) For global symbols when -mxgot.  The assembler will use:
1905
1906                  lui     $at,%got_hi(symbol)
1907                  (d)addu $at,$at,$gp
1908
1909              ...and the final address will be $at + %got_lo(symbol).  */
1910       return 3;
1911
1912     case SYMBOL_GOTOFF_PAGE:
1913     case SYMBOL_GOTOFF_DISP:
1914     case SYMBOL_GOTOFF_CALL:
1915     case SYMBOL_GOTOFF_LOADGP:
1916     case SYMBOL_32_HIGH:
1917     case SYMBOL_64_HIGH:
1918     case SYMBOL_64_MID:
1919     case SYMBOL_64_LOW:
1920     case SYMBOL_TLSGD:
1921     case SYMBOL_TLSLDM:
1922     case SYMBOL_DTPREL:
1923     case SYMBOL_GOTTPREL:
1924     case SYMBOL_TPREL:
1925     case SYMBOL_HALF:
1926       /* A 16-bit constant formed by a single relocation, or a 32-bit
1927          constant formed from a high 16-bit relocation and a low 16-bit
1928          relocation.  Use mips_split_p to determine which.  32-bit
1929          constants need an "lui; addiu" sequence for normal mode and
1930          an "li; sll; addiu" sequence for MIPS16 mode.  */
1931       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1932
1933     case SYMBOL_TLS:
1934       /* We don't treat a bare TLS symbol as a constant.  */
1935       return 0;
1936     }
1937   gcc_unreachable ();
1938 }
1939
1940 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1941    to load symbols of type TYPE into a register.  Return 0 if the given
1942    type of symbol cannot be used as an immediate operand.
1943
1944    Otherwise, return the number of instructions needed to load or store
1945    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1946    the given type of symbol is not valid in addresses.
1947
1948    In both cases, treat extended MIPS16 instructions as two instructions.  */
1949
1950 static int
1951 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1952 {
1953   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1954 }
1955 \f
1956 /* A for_each_rtx callback.  Stop the search if *X references a
1957    thread-local symbol.  */
1958
1959 static int
1960 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1961 {
1962   return mips_tls_symbol_p (*x);
1963 }
1964
1965 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1966
1967 static bool
1968 mips_cannot_force_const_mem (rtx x)
1969 {
1970   enum mips_symbol_type type;
1971   rtx base, offset;
1972
1973   /* There is no assembler syntax for expressing an address-sized
1974      high part.  */
1975   if (GET_CODE (x) == HIGH)
1976     return true;
1977
1978   /* As an optimization, reject constants that mips_legitimize_move
1979      can expand inline.
1980
1981      Suppose we have a multi-instruction sequence that loads constant C
1982      into register R.  If R does not get allocated a hard register, and
1983      R is used in an operand that allows both registers and memory
1984      references, reload will consider forcing C into memory and using
1985      one of the instruction's memory alternatives.  Returning false
1986      here will force it to use an input reload instead.  */
1987   if (CONST_INT_P (x) && LEGITIMATE_CONSTANT_P (x))
1988     return true;
1989
1990   split_const (x, &base, &offset);
1991   if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type)
1992       && type != SYMBOL_FORCE_TO_MEM)
1993     {
1994       /* The same optimization as for CONST_INT.  */
1995       if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
1996         return true;
1997
1998       /* If MIPS16 constant pools live in the text section, they should
1999          not refer to anything that might need run-time relocation.  */
2000       if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2001         return true;
2002     }
2003
2004   /* TLS symbols must be computed by mips_legitimize_move.  */
2005   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
2006     return true;
2007
2008   return false;
2009 }
2010
2011 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
2012    constants when we're using a per-function constant pool.  */
2013
2014 static bool
2015 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
2016                                 const_rtx x ATTRIBUTE_UNUSED)
2017 {
2018   return !TARGET_MIPS16_PCREL_LOADS;
2019 }
2020 \f
2021 /* Return true if register REGNO is a valid base register for mode MODE.
2022    STRICT_P is true if REG_OK_STRICT is in effect.  */
2023
2024 int
2025 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
2026                                bool strict_p)
2027 {
2028   if (!HARD_REGISTER_NUM_P (regno))
2029     {
2030       if (!strict_p)
2031         return true;
2032       regno = reg_renumber[regno];
2033     }
2034
2035   /* These fake registers will be eliminated to either the stack or
2036      hard frame pointer, both of which are usually valid base registers.
2037      Reload deals with the cases where the eliminated form isn't valid.  */
2038   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2039     return true;
2040
2041   /* In MIPS16 mode, the stack pointer can only address word and doubleword
2042      values, nothing smaller.  There are two problems here:
2043
2044        (a) Instantiating virtual registers can introduce new uses of the
2045            stack pointer.  If these virtual registers are valid addresses,
2046            the stack pointer should be too.
2047
2048        (b) Most uses of the stack pointer are not made explicit until
2049            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2050            We don't know until that stage whether we'll be eliminating to the
2051            stack pointer (which needs the restriction) or the hard frame
2052            pointer (which doesn't).
2053
2054      All in all, it seems more consistent to only enforce this restriction
2055      during and after reload.  */
2056   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2057     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2058
2059   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2060 }
2061
2062 /* Return true if X is a valid base register for mode MODE.
2063    STRICT_P is true if REG_OK_STRICT is in effect.  */
2064
2065 static bool
2066 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2067 {
2068   if (!strict_p && GET_CODE (x) == SUBREG)
2069     x = SUBREG_REG (x);
2070
2071   return (REG_P (x)
2072           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2073 }
2074
2075 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2076    can address a value of mode MODE.  */
2077
2078 static bool
2079 mips_valid_offset_p (rtx x, enum machine_mode mode)
2080 {
2081   /* Check that X is a signed 16-bit number.  */
2082   if (!const_arith_operand (x, Pmode))
2083     return false;
2084
2085   /* We may need to split multiword moves, so make sure that every word
2086      is accessible.  */
2087   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2088       && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2089     return false;
2090
2091   return true;
2092 }
2093
2094 /* Return true if a LO_SUM can address a value of mode MODE when the
2095    LO_SUM symbol has type SYMBOL_TYPE.  */
2096
2097 static bool
2098 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2099 {
2100   /* Check that symbols of type SYMBOL_TYPE can be used to access values
2101      of mode MODE.  */
2102   if (mips_symbol_insns (symbol_type, mode) == 0)
2103     return false;
2104
2105   /* Check that there is a known low-part relocation.  */
2106   if (mips_lo_relocs[symbol_type] == NULL)
2107     return false;
2108
2109   /* We may need to split multiword moves, so make sure that each word
2110      can be accessed without inducing a carry.  This is mainly needed
2111      for o64, which has historically only guaranteed 64-bit alignment
2112      for 128-bit types.  */
2113   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2114       && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2115     return false;
2116
2117   return true;
2118 }
2119
2120 /* Return true if X is a valid address for machine mode MODE.  If it is,
2121    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2122    effect.  */
2123
2124 static bool
2125 mips_classify_address (struct mips_address_info *info, rtx x,
2126                        enum machine_mode mode, bool strict_p)
2127 {
2128   switch (GET_CODE (x))
2129     {
2130     case REG:
2131     case SUBREG:
2132       info->type = ADDRESS_REG;
2133       info->reg = x;
2134       info->offset = const0_rtx;
2135       return mips_valid_base_register_p (info->reg, mode, strict_p);
2136
2137     case PLUS:
2138       info->type = ADDRESS_REG;
2139       info->reg = XEXP (x, 0);
2140       info->offset = XEXP (x, 1);
2141       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2142               && mips_valid_offset_p (info->offset, mode));
2143
2144     case LO_SUM:
2145       info->type = ADDRESS_LO_SUM;
2146       info->reg = XEXP (x, 0);
2147       info->offset = XEXP (x, 1);
2148       /* We have to trust the creator of the LO_SUM to do something vaguely
2149          sane.  Target-independent code that creates a LO_SUM should also
2150          create and verify the matching HIGH.  Target-independent code that
2151          adds an offset to a LO_SUM must prove that the offset will not
2152          induce a carry.  Failure to do either of these things would be
2153          a bug, and we are not required to check for it here.  The MIPS
2154          backend itself should only create LO_SUMs for valid symbolic
2155          constants, with the high part being either a HIGH or a copy
2156          of _gp. */
2157       info->symbol_type
2158         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2159       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2160               && mips_valid_lo_sum_p (info->symbol_type, mode));
2161
2162     case CONST_INT:
2163       /* Small-integer addresses don't occur very often, but they
2164          are legitimate if $0 is a valid base register.  */
2165       info->type = ADDRESS_CONST_INT;
2166       return !TARGET_MIPS16 && SMALL_INT (x);
2167
2168     case CONST:
2169     case LABEL_REF:
2170     case SYMBOL_REF:
2171       info->type = ADDRESS_SYMBOLIC;
2172       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2173                                         &info->symbol_type)
2174               && mips_symbol_insns (info->symbol_type, mode) > 0
2175               && !mips_split_p[info->symbol_type]);
2176
2177     default:
2178       return false;
2179     }
2180 }
2181
2182 /* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
2183
2184 static bool
2185 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2186 {
2187   struct mips_address_info addr;
2188
2189   return mips_classify_address (&addr, x, mode, strict_p);
2190 }
2191
2192 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2193
2194 bool
2195 mips_stack_address_p (rtx x, enum machine_mode mode)
2196 {
2197   struct mips_address_info addr;
2198
2199   return (mips_classify_address (&addr, x, mode, false)
2200           && addr.type == ADDRESS_REG
2201           && addr.reg == stack_pointer_rtx);
2202 }
2203
2204 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2205    address instruction.  Note that such addresses are not considered
2206    legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2207    is so restricted.  */
2208
2209 static bool
2210 mips_lwxs_address_p (rtx addr)
2211 {
2212   if (ISA_HAS_LWXS
2213       && GET_CODE (addr) == PLUS
2214       && REG_P (XEXP (addr, 1)))
2215     {
2216       rtx offset = XEXP (addr, 0);
2217       if (GET_CODE (offset) == MULT
2218           && REG_P (XEXP (offset, 0))
2219           && CONST_INT_P (XEXP (offset, 1))
2220           && INTVAL (XEXP (offset, 1)) == 4)
2221         return true;
2222     }
2223   return false;
2224 }
2225 \f
2226 /* Return true if a value at OFFSET bytes from base register BASE can be
2227    accessed using an unextended MIPS16 instruction.  MODE is the mode of
2228    the value.
2229
2230    Usually the offset in an unextended instruction is a 5-bit field.
2231    The offset is unsigned and shifted left once for LH and SH, twice
2232    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2233    an 8-bit immediate field that's shifted left twice.  */
2234
2235 static bool
2236 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2237                                unsigned HOST_WIDE_INT offset)
2238 {
2239   if (offset % GET_MODE_SIZE (mode) == 0)
2240     {
2241       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2242         return offset < 256U * GET_MODE_SIZE (mode);
2243       return offset < 32U * GET_MODE_SIZE (mode);
2244     }
2245   return false;
2246 }
2247
2248 /* Return the number of instructions needed to load or store a value
2249    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
2250    Assume that multiword moves may need to be split into word moves
2251    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2252    enough.
2253
2254    For MIPS16 code, count extended instructions as two instructions.  */
2255
2256 int
2257 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2258 {
2259   struct mips_address_info addr;
2260   int factor;
2261
2262   /* BLKmode is used for single unaligned loads and stores and should
2263      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2264      meaningless, so we have to single it out as a special case one way
2265      or the other.)  */
2266   if (mode != BLKmode && might_split_p)
2267     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2268   else
2269     factor = 1;
2270
2271   if (mips_classify_address (&addr, x, mode, false))
2272     switch (addr.type)
2273       {
2274       case ADDRESS_REG:
2275         if (TARGET_MIPS16
2276             && !mips16_unextended_reference_p (mode, addr.reg,
2277                                                UINTVAL (addr.offset)))
2278           return factor * 2;
2279         return factor;
2280
2281       case ADDRESS_LO_SUM:
2282         return TARGET_MIPS16 ? factor * 2 : factor;
2283
2284       case ADDRESS_CONST_INT:
2285         return factor;
2286
2287       case ADDRESS_SYMBOLIC:
2288         return factor * mips_symbol_insns (addr.symbol_type, mode);
2289       }
2290   return 0;
2291 }
2292
2293 /* Return the number of instructions needed to load constant X.
2294    Return 0 if X isn't a valid constant.  */
2295
2296 int
2297 mips_const_insns (rtx x)
2298 {
2299   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2300   enum mips_symbol_type symbol_type;
2301   rtx offset;
2302
2303   switch (GET_CODE (x))
2304     {
2305     case HIGH:
2306       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2307                                      &symbol_type)
2308           || !mips_split_p[symbol_type])
2309         return 0;
2310
2311       /* This is simply an LUI for normal mode.  It is an extended
2312          LI followed by an extended SLL for MIPS16.  */
2313       return TARGET_MIPS16 ? 4 : 1;
2314
2315     case CONST_INT:
2316       if (TARGET_MIPS16)
2317         /* Unsigned 8-bit constants can be loaded using an unextended
2318            LI instruction.  Unsigned 16-bit constants can be loaded
2319            using an extended LI.  Negative constants must be loaded
2320            using LI and then negated.  */
2321         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2322                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2323                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2324                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2325                 : 0);
2326
2327       return mips_build_integer (codes, INTVAL (x));
2328
2329     case CONST_DOUBLE:
2330     case CONST_VECTOR:
2331       /* Allow zeros for normal mode, where we can use $0.  */
2332       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2333
2334     case CONST:
2335       if (CONST_GP_P (x))
2336         return 1;
2337
2338       /* See if we can refer to X directly.  */
2339       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2340         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2341
2342       /* Otherwise try splitting the constant into a base and offset.
2343          If the offset is a 16-bit value, we can load the base address
2344          into a register and then use (D)ADDIU to add in the offset.
2345          If the offset is larger, we can load the base and offset
2346          into separate registers and add them together with (D)ADDU.
2347          However, the latter is only possible before reload; during
2348          and after reload, we must have the option of forcing the
2349          constant into the pool instead.  */
2350       split_const (x, &x, &offset);
2351       if (offset != 0)
2352         {
2353           int n = mips_const_insns (x);
2354           if (n != 0)
2355             {
2356               if (SMALL_INT (offset))
2357                 return n + 1;
2358               else if (!targetm.cannot_force_const_mem (x))
2359                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2360             }
2361         }
2362       return 0;
2363
2364     case SYMBOL_REF:
2365     case LABEL_REF:
2366       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2367                                 MAX_MACHINE_MODE);
2368
2369     default:
2370       return 0;
2371     }
2372 }
2373
2374 /* X is a doubleword constant that can be handled by splitting it into
2375    two words and loading each word separately.  Return the number of
2376    instructions required to do this.  */
2377
2378 int
2379 mips_split_const_insns (rtx x)
2380 {
2381   unsigned int low, high;
2382
2383   low = mips_const_insns (mips_subword (x, false));
2384   high = mips_const_insns (mips_subword (x, true));
2385   gcc_assert (low > 0 && high > 0);
2386   return low + high;
2387 }
2388
2389 /* Return the number of instructions needed to implement INSN,
2390    given that it loads from or stores to MEM.  Count extended
2391    MIPS16 instructions as two instructions.  */
2392
2393 int
2394 mips_load_store_insns (rtx mem, rtx insn)
2395 {
2396   enum machine_mode mode;
2397   bool might_split_p;
2398   rtx set;
2399
2400   gcc_assert (MEM_P (mem));
2401   mode = GET_MODE (mem);
2402
2403   /* Try to prove that INSN does not need to be split.  */
2404   might_split_p = true;
2405   if (GET_MODE_BITSIZE (mode) == 64)
2406     {
2407       set = single_set (insn);
2408       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2409         might_split_p = false;
2410     }
2411
2412   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2413 }
2414
2415 /* Return the number of instructions needed for an integer division.  */
2416
2417 int
2418 mips_idiv_insns (void)
2419 {
2420   int count;
2421
2422   count = 1;
2423   if (TARGET_CHECK_ZERO_DIV)
2424     {
2425       if (GENERATE_DIVIDE_TRAPS)
2426         count++;
2427       else
2428         count += 2;
2429     }
2430
2431   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2432     count++;
2433   return count;
2434 }
2435 \f
2436 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2437    handle all moves if !can_create_pseudo_p ().  The distinction is
2438    important because, unlike emit_move_insn, the move expanders know
2439    how to force Pmode objects into the constant pool even when the
2440    constant pool address is not itself legitimate.  */
2441
2442 rtx
2443 mips_emit_move (rtx dest, rtx src)
2444 {
2445   return (can_create_pseudo_p ()
2446           ? emit_move_insn (dest, src)
2447           : emit_move_insn_1 (dest, src));
2448 }
2449
2450 /* Emit an instruction of the form (set TARGET (CODE OP0)).  */
2451
2452 static void
2453 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2454 {
2455   emit_insn (gen_rtx_SET (VOIDmode, target,
2456                           gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2457 }
2458
2459 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2460    Return that new register.  */
2461
2462 static rtx
2463 mips_force_unary (enum machine_mode mode, enum rtx_code code, rtx op0)
2464 {
2465   rtx reg;
2466
2467   reg = gen_reg_rtx (mode);
2468   mips_emit_unary (code, reg, op0);
2469   return reg;
2470 }
2471
2472 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2473
2474 static void
2475 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2476 {
2477   emit_insn (gen_rtx_SET (VOIDmode, target,
2478                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2479 }
2480
2481 /* Compute (CODE OP0 OP1) and store the result in a new register
2482    of mode MODE.  Return that new register.  */
2483
2484 static rtx
2485 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2486 {
2487   rtx reg;
2488
2489   reg = gen_reg_rtx (mode);
2490   mips_emit_binary (code, reg, op0, op1);
2491   return reg;
2492 }
2493
2494 /* Copy VALUE to a register and return that register.  If new pseudos
2495    are allowed, copy it into a new register, otherwise use DEST.  */
2496
2497 static rtx
2498 mips_force_temporary (rtx dest, rtx value)
2499 {
2500   if (can_create_pseudo_p ())
2501     return force_reg (Pmode, value);
2502   else
2503     {
2504       mips_emit_move (dest, value);
2505       return dest;
2506     }
2507 }
2508
2509 /* Emit a call sequence with call pattern PATTERN and return the call
2510    instruction itself (which is not necessarily the last instruction
2511    emitted).  ORIG_ADDR is the original, unlegitimized address,
2512    ADDR is the legitimized form, and LAZY_P is true if the call
2513    address is lazily-bound.  */
2514
2515 static rtx
2516 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2517 {
2518   rtx insn, reg;
2519
2520   insn = emit_call_insn (pattern);
2521
2522   if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2523     {
2524       /* MIPS16 JALRs only take MIPS16 registers.  If the target
2525          function requires $25 to be valid on entry, we must copy it
2526          there separately.  The move instruction can be put in the
2527          call's delay slot.  */
2528       reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2529       emit_insn_before (gen_move_insn (reg, addr), insn);
2530       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2531     }
2532
2533   if (lazy_p)
2534     /* Lazy-binding stubs require $gp to be valid on entry.  */
2535     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2536
2537   if (TARGET_USE_GOT)
2538     {
2539       /* See the comment above load_call<mode> for details.  */
2540       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2541                gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2542       emit_insn (gen_update_got_version ());
2543     }
2544   return insn;
2545 }
2546 \f
2547 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2548    then add CONST_INT OFFSET to the result.  */
2549
2550 static rtx
2551 mips_unspec_address_offset (rtx base, rtx offset,
2552                             enum mips_symbol_type symbol_type)
2553 {
2554   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2555                          UNSPEC_ADDRESS_FIRST + symbol_type);
2556   if (offset != const0_rtx)
2557     base = gen_rtx_PLUS (Pmode, base, offset);
2558   return gen_rtx_CONST (Pmode, base);
2559 }
2560
2561 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2562    type SYMBOL_TYPE.  */
2563
2564 rtx
2565 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2566 {
2567   rtx base, offset;
2568
2569   split_const (address, &base, &offset);
2570   return mips_unspec_address_offset (base, offset, symbol_type);
2571 }
2572
2573 /* If OP is an UNSPEC address, return the address to which it refers,
2574    otherwise return OP itself.  */
2575
2576 static rtx
2577 mips_strip_unspec_address (rtx op)
2578 {
2579   rtx base, offset;
2580
2581   split_const (op, &base, &offset);
2582   if (UNSPEC_ADDRESS_P (base))
2583     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
2584   return op;
2585 }
2586
2587 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2588    high part to BASE and return the result.  Just return BASE otherwise.
2589    TEMP is as for mips_force_temporary.
2590
2591    The returned expression can be used as the first operand to a LO_SUM.  */
2592
2593 static rtx
2594 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2595                          enum mips_symbol_type symbol_type)
2596 {
2597   if (mips_split_p[symbol_type])
2598     {
2599       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2600       addr = mips_force_temporary (temp, addr);
2601       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2602     }
2603   return base;
2604 }
2605 \f
2606 /* Return an instruction that copies $gp into register REG.  We want
2607    GCC to treat the register's value as constant, so that its value
2608    can be rematerialized on demand.  */
2609
2610 static rtx
2611 gen_load_const_gp (rtx reg)
2612 {
2613   return (Pmode == SImode
2614           ? gen_load_const_gp_si (reg)
2615           : gen_load_const_gp_di (reg));
2616 }
2617
2618 /* Return a pseudo register that contains the value of $gp throughout
2619    the current function.  Such registers are needed by MIPS16 functions,
2620    for which $gp itself is not a valid base register or addition operand.  */
2621
2622 static rtx
2623 mips16_gp_pseudo_reg (void)
2624 {
2625   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2626     cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2627
2628   /* Don't emit an instruction to initialize the pseudo register if
2629      we are being called from the tree optimizers' cost-calculation
2630      routines.  */
2631   if (!cfun->machine->initialized_mips16_gp_pseudo_p
2632       && (current_ir_type () != IR_GIMPLE || currently_expanding_to_rtl))
2633     {
2634       rtx insn, scan;
2635
2636       push_topmost_sequence ();
2637
2638       scan = get_insns ();
2639       while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2640         scan = NEXT_INSN (scan);
2641
2642       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2643       emit_insn_after (insn, scan);
2644
2645       pop_topmost_sequence ();
2646
2647       cfun->machine->initialized_mips16_gp_pseudo_p = true;
2648     }
2649
2650   return cfun->machine->mips16_gp_pseudo_rtx;
2651 }
2652
2653 /* Return a base register that holds pic_offset_table_rtx.
2654    TEMP, if nonnull, is a scratch Pmode base register.  */
2655
2656 rtx
2657 mips_pic_base_register (rtx temp)
2658 {
2659   if (!TARGET_MIPS16)
2660     return pic_offset_table_rtx;
2661
2662   if (can_create_pseudo_p ())
2663     return mips16_gp_pseudo_reg ();
2664
2665   if (TARGET_USE_GOT)
2666     /* The first post-reload split exposes all references to $gp
2667        (both uses and definitions).  All references must remain
2668        explicit after that point.
2669
2670        It is safe to introduce uses of $gp at any time, so for
2671        simplicity, we do that before the split too.  */
2672     mips_emit_move (temp, pic_offset_table_rtx);
2673   else
2674     emit_insn (gen_load_const_gp (temp));
2675   return temp;
2676 }
2677
2678 /* Return the RHS of a load_call<mode> insn.  */
2679
2680 static rtx
2681 mips_unspec_call (rtx reg, rtx symbol)
2682 {
2683   rtvec vec;
2684
2685   vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2686   return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2687 }
2688
2689 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2690    reference.  Return NULL_RTX otherwise.  */
2691
2692 static rtx
2693 mips_strip_unspec_call (rtx src)
2694 {
2695   if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2696     return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2697   return NULL_RTX;
2698 }
2699
2700 /* Create and return a GOT reference of type TYPE for address ADDR.
2701    TEMP, if nonnull, is a scratch Pmode base register.  */
2702
2703 rtx
2704 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2705 {
2706   rtx base, high, lo_sum_symbol;
2707
2708   base = mips_pic_base_register (temp);
2709
2710   /* If we used the temporary register to load $gp, we can't use
2711      it for the high part as well.  */
2712   if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2713     temp = NULL;
2714
2715   high = mips_unspec_offset_high (temp, base, addr, type);
2716   lo_sum_symbol = mips_unspec_address (addr, type);
2717
2718   if (type == SYMBOL_GOTOFF_CALL)
2719     return mips_unspec_call (high, lo_sum_symbol);
2720   else
2721     return (Pmode == SImode
2722             ? gen_unspec_gotsi (high, lo_sum_symbol)
2723             : gen_unspec_gotdi (high, lo_sum_symbol));
2724 }
2725
2726 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2727    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2728    constant in that context and can be split into high and low parts.
2729    If so, and if LOW_OUT is nonnull, emit the high part and store the
2730    low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
2731
2732    TEMP is as for mips_force_temporary and is used to load the high
2733    part into a register.
2734
2735    When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2736    a legitimize SET_SRC for an .md pattern, otherwise the low part
2737    is guaranteed to be a legitimate address for mode MODE.  */
2738
2739 bool
2740 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2741 {
2742   enum mips_symbol_context context;
2743   enum mips_symbol_type symbol_type;
2744   rtx high;
2745
2746   context = (mode == MAX_MACHINE_MODE
2747              ? SYMBOL_CONTEXT_LEA
2748              : SYMBOL_CONTEXT_MEM);
2749   if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2750     {
2751       addr = XEXP (addr, 0);
2752       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2753           && mips_symbol_insns (symbol_type, mode) > 0
2754           && mips_split_hi_p[symbol_type])
2755         {
2756           if (low_out)
2757             switch (symbol_type)
2758               {
2759               case SYMBOL_GOT_PAGE_OFST:
2760                 /* The high part of a page/ofst pair is loaded from the GOT.  */
2761                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2762                 break;
2763
2764               default:
2765                 gcc_unreachable ();
2766               }
2767           return true;
2768         }
2769     }
2770   else
2771     {
2772       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2773           && mips_symbol_insns (symbol_type, mode) > 0
2774           && mips_split_p[symbol_type])
2775         {
2776           if (low_out)
2777             switch (symbol_type)
2778               {
2779               case SYMBOL_GOT_DISP:
2780                 /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
2781                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2782                 break;
2783
2784               case SYMBOL_GP_RELATIVE:
2785                 high = mips_pic_base_register (temp);
2786                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2787                 break;
2788
2789               default:
2790                 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2791                 high = mips_force_temporary (temp, high);
2792                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2793                 break;
2794               }
2795           return true;
2796         }
2797     }
2798   return false;
2799 }
2800
2801 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2802    mips_force_temporary; it is only needed when OFFSET is not a
2803    SMALL_OPERAND.  */
2804
2805 static rtx
2806 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2807 {
2808   if (!SMALL_OPERAND (offset))
2809     {
2810       rtx high;
2811
2812       if (TARGET_MIPS16)
2813         {
2814           /* Load the full offset into a register so that we can use
2815              an unextended instruction for the address itself.  */
2816           high = GEN_INT (offset);
2817           offset = 0;
2818         }
2819       else
2820         {
2821           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
2822              The addition inside the macro CONST_HIGH_PART may cause an
2823              overflow, so we need to force a sign-extension check.  */
2824           high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
2825           offset = CONST_LOW_PART (offset);
2826         }
2827       high = mips_force_temporary (temp, high);
2828       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2829     }
2830   return plus_constant (reg, offset);
2831 }
2832 \f
2833 /* The __tls_get_attr symbol.  */
2834 static GTY(()) rtx mips_tls_symbol;
2835
2836 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2837    the TLS symbol we are referencing and TYPE is the symbol type to use
2838    (either global dynamic or local dynamic).  V0 is an RTX for the
2839    return value location.  */
2840
2841 static rtx
2842 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2843 {
2844   rtx insn, loc, a0;
2845
2846   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2847
2848   if (!mips_tls_symbol)
2849     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2850
2851   loc = mips_unspec_address (sym, type);
2852
2853   start_sequence ();
2854
2855   emit_insn (gen_rtx_SET (Pmode, a0,
2856                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2857   insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
2858                            const0_rtx, NULL_RTX, false);
2859   RTL_CONST_CALL_P (insn) = 1;
2860   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2861   insn = get_insns ();
2862
2863   end_sequence ();
2864
2865   return insn;
2866 }
2867
2868 /* Return a pseudo register that contains the current thread pointer.  */
2869
2870 static rtx
2871 mips_get_tp (void)
2872 {
2873   rtx tp;
2874
2875   tp = gen_reg_rtx (Pmode);
2876   if (Pmode == DImode)
2877     emit_insn (gen_tls_get_tp_di (tp));
2878   else
2879     emit_insn (gen_tls_get_tp_si (tp));
2880   return tp;
2881 }
2882
2883 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2884    its address.  The return value will be both a valid address and a valid
2885    SET_SRC (either a REG or a LO_SUM).  */
2886
2887 static rtx
2888 mips_legitimize_tls_address (rtx loc)
2889 {
2890   rtx dest, insn, v0, tp, tmp1, tmp2, eqv;
2891   enum tls_model model;
2892
2893   if (TARGET_MIPS16)
2894     {
2895       sorry ("MIPS16 TLS");
2896       return gen_reg_rtx (Pmode);
2897     }
2898
2899   model = SYMBOL_REF_TLS_MODEL (loc);
2900   /* Only TARGET_ABICALLS code can have more than one module; other
2901      code must be be static and should not use a GOT.  All TLS models
2902      reduce to local exec in this situation.  */
2903   if (!TARGET_ABICALLS)
2904     model = TLS_MODEL_LOCAL_EXEC;
2905
2906   switch (model)
2907     {
2908     case TLS_MODEL_GLOBAL_DYNAMIC:
2909       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2910       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2911       dest = gen_reg_rtx (Pmode);
2912       emit_libcall_block (insn, dest, v0, loc);
2913       break;
2914
2915     case TLS_MODEL_LOCAL_DYNAMIC:
2916       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2917       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2918       tmp1 = gen_reg_rtx (Pmode);
2919
2920       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2921          share the LDM result with other LD model accesses.  */
2922       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2923                             UNSPEC_TLS_LDM);
2924       emit_libcall_block (insn, tmp1, v0, eqv);
2925
2926       tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2927       dest = gen_rtx_LO_SUM (Pmode, tmp2,
2928                              mips_unspec_address (loc, SYMBOL_DTPREL));
2929       break;
2930
2931     case TLS_MODEL_INITIAL_EXEC:
2932       tp = mips_get_tp ();
2933       tmp1 = gen_reg_rtx (Pmode);
2934       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2935       if (Pmode == DImode)
2936         emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2937       else
2938         emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2939       dest = gen_reg_rtx (Pmode);
2940       emit_insn (gen_add3_insn (dest, tmp1, tp));
2941       break;
2942
2943     case TLS_MODEL_LOCAL_EXEC:
2944       tp = mips_get_tp ();
2945       tmp1 = mips_unspec_offset_high (NULL, tp, loc, SYMBOL_TPREL);
2946       dest = gen_rtx_LO_SUM (Pmode, tmp1,
2947                              mips_unspec_address (loc, SYMBOL_TPREL));
2948       break;
2949
2950     default:
2951       gcc_unreachable ();
2952     }
2953   return dest;
2954 }
2955 \f
2956 /* If X is not a valid address for mode MODE, force it into a register.  */
2957
2958 static rtx
2959 mips_force_address (rtx x, enum machine_mode mode)
2960 {
2961   if (!mips_legitimate_address_p (mode, x, false))
2962     x = force_reg (Pmode, x);
2963   return x;
2964 }
2965
2966 /* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
2967    be legitimized in a way that the generic machinery might not expect,
2968    return a new address, otherwise return NULL.  MODE is the mode of
2969    the memory being accessed.  */
2970
2971 static rtx
2972 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2973                          enum machine_mode mode)
2974 {
2975   rtx base, addr;
2976   HOST_WIDE_INT offset;
2977
2978   if (mips_tls_symbol_p (x))
2979     return mips_legitimize_tls_address (x);
2980
2981   /* See if the address can split into a high part and a LO_SUM.  */
2982   if (mips_split_symbol (NULL, x, mode, &addr))
2983     return mips_force_address (addr, mode);
2984
2985   /* Handle BASE + OFFSET using mips_add_offset.  */
2986   mips_split_plus (x, &base, &offset);
2987   if (offset != 0)
2988     {
2989       if (!mips_valid_base_register_p (base, mode, false))
2990         base = copy_to_mode_reg (Pmode, base);
2991       addr = mips_add_offset (NULL, base, offset);
2992       return mips_force_address (addr, mode);
2993     }
2994
2995   return x;
2996 }
2997
2998 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
2999
3000 void
3001 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3002 {
3003   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3004   enum machine_mode mode;
3005   unsigned int i, num_ops;
3006   rtx x;
3007
3008   mode = GET_MODE (dest);
3009   num_ops = mips_build_integer (codes, value);
3010
3011   /* Apply each binary operation to X.  Invariant: X is a legitimate
3012      source operand for a SET pattern.  */
3013   x = GEN_INT (codes[0].value);
3014   for (i = 1; i < num_ops; i++)
3015     {
3016       if (!can_create_pseudo_p ())
3017         {
3018           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
3019           x = temp;
3020         }
3021       else
3022         x = force_reg (mode, x);
3023       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3024     }
3025
3026   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3027 }
3028
3029 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
3030    DEST given that SRC satisfies immediate_operand but doesn't satisfy
3031    move_operand.  */
3032
3033 static void
3034 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3035 {
3036   rtx base, offset;
3037
3038   /* Split moves of big integers into smaller pieces.  */
3039   if (splittable_const_int_operand (src, mode))
3040     {
3041       mips_move_integer (dest, dest, INTVAL (src));
3042       return;
3043     }
3044
3045   /* Split moves of symbolic constants into high/low pairs.  */
3046   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3047     {
3048       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3049       return;
3050     }
3051
3052   /* Generate the appropriate access sequences for TLS symbols.  */
3053   if (mips_tls_symbol_p (src))
3054     {
3055       mips_emit_move (dest, mips_legitimize_tls_address (src));
3056       return;
3057     }
3058
3059   /* If we have (const (plus symbol offset)), and that expression cannot
3060      be forced into memory, load the symbol first and add in the offset.
3061      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3062      forced into memory, as it usually produces better code.  */
3063   split_const (src, &base, &offset);
3064   if (offset != const0_rtx
3065       && (targetm.cannot_force_const_mem (src)
3066           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3067     {
3068       base = mips_force_temporary (dest, base);
3069       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3070       return;
3071     }
3072
3073   src = force_const_mem (mode, src);
3074
3075   /* When using explicit relocs, constant pool references are sometimes
3076      not legitimate addresses.  */
3077   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3078   mips_emit_move (dest, src);
3079 }
3080
3081 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3082    sequence that is valid.  */
3083
3084 bool
3085 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3086 {
3087   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3088     {
3089       mips_emit_move (dest, force_reg (mode, src));
3090       return true;
3091     }
3092
3093   /* We need to deal with constants that would be legitimate
3094      immediate_operands but aren't legitimate move_operands.  */
3095   if (CONSTANT_P (src) && !move_operand (src, mode))
3096     {
3097       mips_legitimize_const_move (mode, dest, src);
3098       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3099       return true;
3100     }
3101   return false;
3102 }
3103 \f
3104 /* Return true if value X in context CONTEXT is a small-data address
3105    that can be rewritten as a LO_SUM.  */
3106
3107 static bool
3108 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3109 {
3110   enum mips_symbol_type symbol_type;
3111
3112   return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3113           && !mips_split_p[SYMBOL_GP_RELATIVE]
3114           && mips_symbolic_constant_p (x, context, &symbol_type)
3115           && symbol_type == SYMBOL_GP_RELATIVE);
3116 }
3117
3118 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3119    containing MEM, or null if none.  */
3120
3121 static int
3122 mips_small_data_pattern_1 (rtx *loc, void *data)
3123 {
3124   enum mips_symbol_context context;
3125
3126   if (GET_CODE (*loc) == LO_SUM)
3127     return -1;
3128
3129   if (MEM_P (*loc))
3130     {
3131       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3132         return 1;
3133       return -1;
3134     }
3135
3136   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3137   return mips_rewrite_small_data_p (*loc, context);
3138 }
3139
3140 /* Return true if OP refers to small data symbols directly, not through
3141    a LO_SUM.  */
3142
3143 bool
3144 mips_small_data_pattern_p (rtx op)
3145 {
3146   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3147 }
3148
3149 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3150    DATA is the containing MEM, or null if none.  */
3151
3152 static int
3153 mips_rewrite_small_data_1 (rtx *loc, void *data)
3154 {
3155   enum mips_symbol_context context;
3156
3157   if (MEM_P (*loc))
3158     {
3159       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3160       return -1;
3161     }
3162
3163   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3164   if (mips_rewrite_small_data_p (*loc, context))
3165     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3166
3167   if (GET_CODE (*loc) == LO_SUM)
3168     return -1;
3169
3170   return 0;
3171 }
3172
3173 /* Rewrite instruction pattern PATTERN so that it refers to small data
3174    using explicit relocations.  */
3175
3176 rtx
3177 mips_rewrite_small_data (rtx pattern)
3178 {
3179   pattern = copy_insn (pattern);
3180   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3181   return pattern;
3182 }
3183 \f
3184 /* We need a lot of little routines to check the range of MIPS16 immediate
3185    operands.  */
3186
3187 static int
3188 m16_check_op (rtx op, int low, int high, int mask)
3189 {
3190   return (CONST_INT_P (op)
3191           && IN_RANGE (INTVAL (op), low, high)
3192           && (INTVAL (op) & mask) == 0);
3193 }
3194
3195 int
3196 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3197 {
3198   return m16_check_op (op, 0x1, 0x8, 0);
3199 }
3200
3201 int
3202 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3203 {
3204   return m16_check_op (op, -0x8, 0x7, 0);
3205 }
3206
3207 int
3208 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3209 {
3210   return m16_check_op (op, -0x7, 0x8, 0);
3211 }
3212
3213 int
3214 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3215 {
3216   return m16_check_op (op, -0x10, 0xf, 0);
3217 }
3218
3219 int
3220 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3221 {
3222   return m16_check_op (op, -0xf, 0x10, 0);
3223 }
3224
3225 int
3226 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3227 {
3228   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
3229 }
3230
3231 int
3232 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3233 {
3234   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
3235 }
3236
3237 int
3238 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3239 {
3240   return m16_check_op (op, -0x80, 0x7f, 0);
3241 }
3242
3243 int
3244 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3245 {
3246   return m16_check_op (op, -0x7f, 0x80, 0);
3247 }
3248
3249 int
3250 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3251 {
3252   return m16_check_op (op, 0x0, 0xff, 0);
3253 }
3254
3255 int
3256 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3257 {
3258   return m16_check_op (op, -0xff, 0x0, 0);
3259 }
3260
3261 int
3262 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3263 {
3264   return m16_check_op (op, -0x1, 0xfe, 0);
3265 }
3266
3267 int
3268 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3269 {
3270   return m16_check_op (op, 0x0, 0xff << 2, 3);
3271 }
3272
3273 int
3274 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3275 {
3276   return m16_check_op (op, -0xff << 2, 0x0, 3);
3277 }
3278
3279 int
3280 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3281 {
3282   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
3283 }
3284
3285 int
3286 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3287 {
3288   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
3289 }
3290 \f
3291 /* The cost of loading values from the constant pool.  It should be
3292    larger than the cost of any constant we want to synthesize inline.  */
3293 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3294
3295 /* Return the cost of X when used as an operand to the MIPS16 instruction
3296    that implements CODE.  Return -1 if there is no such instruction, or if
3297    X is not a valid immediate operand for it.  */
3298
3299 static int
3300 mips16_constant_cost (int code, HOST_WIDE_INT x)
3301 {
3302   switch (code)
3303     {
3304     case ASHIFT:
3305     case ASHIFTRT:
3306     case LSHIFTRT:
3307       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3308          other shifts are extended.  The shift patterns truncate the shift
3309          count to the right size, so there are no out-of-range values.  */
3310       if (IN_RANGE (x, 1, 8))
3311         return 0;
3312       return COSTS_N_INSNS (1);
3313
3314     case PLUS:
3315       if (IN_RANGE (x, -128, 127))
3316         return 0;
3317       if (SMALL_OPERAND (x))
3318         return COSTS_N_INSNS (1);
3319       return -1;
3320
3321     case LEU:
3322       /* Like LE, but reject the always-true case.  */
3323       if (x == -1)
3324         return -1;
3325     case LE:
3326       /* We add 1 to the immediate and use SLT.  */
3327       x += 1;
3328     case XOR:
3329       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3330     case LT:
3331     case LTU:
3332       if (IN_RANGE (x, 0, 255))
3333         return 0;
3334       if (SMALL_OPERAND_UNSIGNED (x))
3335         return COSTS_N_INSNS (1);
3336       return -1;
3337
3338     case EQ:
3339     case NE:
3340       /* Equality comparisons with 0 are cheap.  */
3341       if (x == 0)
3342         return 0;
3343       return -1;
3344
3345     default:
3346       return -1;
3347     }
3348 }
3349
3350 /* Return true if there is a non-MIPS16 instruction that implements CODE
3351    and if that instruction accepts X as an immediate operand.  */
3352
3353 static int
3354 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3355 {
3356   switch (code)
3357     {
3358     case ASHIFT:
3359     case ASHIFTRT:
3360     case LSHIFTRT:
3361       /* All shift counts are truncated to a valid constant.  */
3362       return true;
3363
3364     case ROTATE:
3365     case ROTATERT:
3366       /* Likewise rotates, if the target supports rotates at all.  */
3367       return ISA_HAS_ROR;
3368
3369     case AND:
3370     case IOR:
3371     case XOR:
3372       /* These instructions take 16-bit unsigned immediates.  */
3373       return SMALL_OPERAND_UNSIGNED (x);
3374
3375     case PLUS:
3376     case LT:
3377     case LTU:
3378       /* These instructions take 16-bit signed immediates.  */
3379       return SMALL_OPERAND (x);
3380
3381     case EQ:
3382     case NE:
3383     case GT:
3384     case GTU:
3385       /* The "immediate" forms of these instructions are really
3386          implemented as comparisons with register 0.  */
3387       return x == 0;
3388
3389     case GE:
3390     case GEU:
3391       /* Likewise, meaning that the only valid immediate operand is 1.  */
3392       return x == 1;
3393
3394     case LE:
3395       /* We add 1 to the immediate and use SLT.  */
3396       return SMALL_OPERAND (x + 1);
3397
3398     case LEU:
3399       /* Likewise SLTU, but reject the always-true case.  */
3400       return SMALL_OPERAND (x + 1) && x + 1 != 0;
3401
3402     case SIGN_EXTRACT:
3403     case ZERO_EXTRACT:
3404       /* The bit position and size are immediate operands.  */
3405       return ISA_HAS_EXT_INS;
3406
3407     default:
3408       /* By default assume that $0 can be used for 0.  */
3409       return x == 0;
3410     }
3411 }
3412
3413 /* Return the cost of binary operation X, given that the instruction
3414    sequence for a word-sized or smaller operation has cost SINGLE_COST
3415    and that the sequence of a double-word operation has cost DOUBLE_COST.
3416    If SPEED is true, optimize for speed otherwise optimize for size.  */
3417
3418 static int
3419 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3420 {
3421   int cost;
3422
3423   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3424     cost = double_cost;
3425   else
3426     cost = single_cost;
3427   return (cost
3428           + rtx_cost (XEXP (x, 0), SET, speed)
3429           + rtx_cost (XEXP (x, 1), GET_CODE (x), speed));
3430 }
3431
3432 /* Return the cost of floating-point multiplications of mode MODE.  */
3433
3434 static int
3435 mips_fp_mult_cost (enum machine_mode mode)
3436 {
3437   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3438 }
3439
3440 /* Return the cost of floating-point divisions of mode MODE.  */
3441
3442 static int
3443 mips_fp_div_cost (enum machine_mode mode)
3444 {
3445   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3446 }
3447
3448 /* Return the cost of sign-extending OP to mode MODE, not including the
3449    cost of OP itself.  */
3450
3451 static int
3452 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3453 {
3454   if (MEM_P (op))
3455     /* Extended loads are as cheap as unextended ones.  */
3456     return 0;
3457
3458   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3459     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3460     return 0;
3461
3462   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3463     /* We can use SEB or SEH.  */
3464     return COSTS_N_INSNS (1);
3465
3466   /* We need to use a shift left and a shift right.  */
3467   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3468 }
3469
3470 /* Return the cost of zero-extending OP to mode MODE, not including the
3471    cost of OP itself.  */
3472
3473 static int
3474 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3475 {
3476   if (MEM_P (op))
3477     /* Extended loads are as cheap as unextended ones.  */
3478     return 0;
3479
3480   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3481     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3482     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3483
3484   if (GENERATE_MIPS16E)
3485     /* We can use ZEB or ZEH.  */
3486     return COSTS_N_INSNS (1);
3487
3488   if (TARGET_MIPS16)
3489     /* We need to load 0xff or 0xffff into a register and use AND.  */
3490     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3491
3492   /* We can use ANDI.  */
3493   return COSTS_N_INSNS (1);
3494 }
3495
3496 /* Implement TARGET_RTX_COSTS.  */
3497
3498 static bool
3499 mips_rtx_costs (rtx x, int code, int outer_code, int *total, bool speed)
3500 {
3501   enum machine_mode mode = GET_MODE (x);
3502   bool float_mode_p = FLOAT_MODE_P (mode);
3503   int cost;
3504   rtx addr;
3505
3506   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3507      appear in the instruction stream, and the cost of a comparison is
3508      really the cost of the branch or scc condition.  At the time of
3509      writing, GCC only uses an explicit outer COMPARE code when optabs
3510      is testing whether a constant is expensive enough to force into a
3511      register.  We want optabs to pass such constants through the MIPS
3512      expanders instead, so make all constants very cheap here.  */
3513   if (outer_code == COMPARE)
3514     {
3515       gcc_assert (CONSTANT_P (x));
3516       *total = 0;
3517       return true;
3518     }
3519
3520   switch (code)
3521     {
3522     case CONST_INT:
3523       /* Treat *clear_upper32-style ANDs as having zero cost in the
3524          second operand.  The cost is entirely in the first operand.
3525
3526          ??? This is needed because we would otherwise try to CSE
3527          the constant operand.  Although that's the right thing for
3528          instructions that continue to be a register operation throughout
3529          compilation, it is disastrous for instructions that could
3530          later be converted into a memory operation.  */
3531       if (TARGET_64BIT
3532           && outer_code == AND
3533           && UINTVAL (x) == 0xffffffff)
3534         {
3535           *total = 0;
3536           return true;
3537         }
3538
3539       if (TARGET_MIPS16)
3540         {
3541           cost = mips16_constant_cost (outer_code, INTVAL (x));
3542           if (cost >= 0)
3543             {
3544               *total = cost;
3545               return true;
3546             }
3547         }
3548       else
3549         {
3550           /* When not optimizing for size, we care more about the cost
3551              of hot code, and hot code is often in a loop.  If a constant
3552              operand needs to be forced into a register, we will often be
3553              able to hoist the constant load out of the loop, so the load
3554              should not contribute to the cost.  */
3555           if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3556             {
3557               *total = 0;
3558               return true;
3559             }
3560         }
3561       /* Fall through.  */
3562
3563     case CONST:
3564     case SYMBOL_REF:
3565     case LABEL_REF:
3566     case CONST_DOUBLE:
3567       if (force_to_mem_operand (x, VOIDmode))
3568         {
3569           *total = COSTS_N_INSNS (1);
3570           return true;
3571         }
3572       cost = mips_const_insns (x);
3573       if (cost > 0)
3574         {
3575           /* If the constant is likely to be stored in a GPR, SETs of
3576              single-insn constants are as cheap as register sets; we
3577              never want to CSE them.
3578
3579              Don't reduce the cost of storing a floating-point zero in
3580              FPRs.  If we have a zero in an FPR for other reasons, we
3581              can get better cfg-cleanup and delayed-branch results by
3582              using it consistently, rather than using $0 sometimes and
3583              an FPR at other times.  Also, moves between floating-point
3584              registers are sometimes cheaper than (D)MTC1 $0.  */
3585           if (cost == 1
3586               && outer_code == SET
3587               && !(float_mode_p && TARGET_HARD_FLOAT))
3588             cost = 0;
3589           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3590              want to CSE the constant itself.  It is usually better to
3591              have N copies of the last operation in the sequence and one
3592              shared copy of the other operations.  (Note that this is
3593              not true for MIPS16 code, where the final operation in the
3594              sequence is often an extended instruction.)
3595
3596              Also, if we have a CONST_INT, we don't know whether it is
3597              for a word or doubleword operation, so we cannot rely on
3598              the result of mips_build_integer.  */
3599           else if (!TARGET_MIPS16
3600                    && (outer_code == SET || mode == VOIDmode))
3601             cost = 1;
3602           *total = COSTS_N_INSNS (cost);
3603           return true;
3604         }
3605       /* The value will need to be fetched from the constant pool.  */
3606       *total = CONSTANT_POOL_COST;
3607       return true;
3608
3609     case MEM:
3610       /* If the address is legitimate, return the number of
3611          instructions it needs.  */
3612       addr = XEXP (x, 0);
3613       cost = mips_address_insns (addr, mode, true);
3614       if (cost > 0)
3615         {
3616           *total = COSTS_N_INSNS (cost + 1);
3617           return true;
3618         }
3619       /* Check for a scaled indexed address.  */
3620       if (mips_lwxs_address_p (addr))
3621         {
3622           *total = COSTS_N_INSNS (2);
3623           return true;
3624         }
3625       /* Otherwise use the default handling.  */
3626       return false;
3627
3628     case FFS:
3629       *total = COSTS_N_INSNS (6);
3630       return false;
3631
3632     case NOT:
3633       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3634       return false;
3635
3636     case AND:
3637       /* Check for a *clear_upper32 pattern and treat it like a zero
3638          extension.  See the pattern's comment for details.  */
3639       if (TARGET_64BIT
3640           && mode == DImode
3641           && CONST_INT_P (XEXP (x, 1))
3642           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3643         {
3644           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3645                     + rtx_cost (XEXP (x, 0), SET, speed));
3646           return true;
3647         }
3648       /* Fall through.  */
3649
3650     case IOR:
3651     case XOR:
3652       /* Double-word operations use two single-word operations.  */
3653       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3654                                  speed);
3655       return true;
3656
3657     case ASHIFT:
3658     case ASHIFTRT:
3659     case LSHIFTRT:
3660     case ROTATE:
3661     case ROTATERT:
3662       if (CONSTANT_P (XEXP (x, 1)))
3663         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3664                                    speed);
3665       else
3666         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3667                                    speed);
3668       return true;
3669
3670     case ABS:
3671       if (float_mode_p)
3672         *total = mips_cost->fp_add;
3673       else
3674         *total = COSTS_N_INSNS (4);
3675       return false;
3676
3677     case LO_SUM:
3678       /* Low-part immediates need an extended MIPS16 instruction.  */
3679       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3680                 + rtx_cost (XEXP (x, 0), SET, speed));
3681       return true;
3682
3683     case LT:
3684     case LTU:
3685     case LE:
3686     case LEU:
3687     case GT:
3688     case GTU:
3689     case GE:
3690     case GEU:
3691     case EQ:
3692     case NE:
3693     case UNORDERED:
3694     case LTGT:
3695       /* Branch comparisons have VOIDmode, so use the first operand's
3696          mode instead.  */
3697       mode = GET_MODE (XEXP (x, 0));
3698       if (FLOAT_MODE_P (mode))
3699         {
3700           *total = mips_cost->fp_add;
3701           return false;
3702         }
3703       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3704                                  speed);
3705       return true;
3706
3707     case MINUS:
3708       if (float_mode_p
3709           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3710           && TARGET_FUSED_MADD
3711           && !HONOR_NANS (mode)
3712           && !HONOR_SIGNED_ZEROS (mode))
3713         {
3714           /* See if we can use NMADD or NMSUB.  See mips.md for the
3715              associated patterns.  */
3716           rtx op0 = XEXP (x, 0);
3717           rtx op1 = XEXP (x, 1);
3718           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3719             {
3720               *total = (mips_fp_mult_cost (mode)
3721                         + rtx_cost (XEXP (XEXP (op0, 0), 0), SET, speed)
3722                         + rtx_cost (XEXP (op0, 1), SET, speed)
3723                         + rtx_cost (op1, SET, speed));
3724               return true;
3725             }
3726           if (GET_CODE (op1) == MULT)
3727             {
3728               *total = (mips_fp_mult_cost (mode)
3729                         + rtx_cost (op0, SET, speed)
3730                         + rtx_cost (XEXP (op1, 0), SET, speed)
3731                         + rtx_cost (XEXP (op1, 1), SET, speed));
3732               return true;
3733             }
3734         }
3735       /* Fall through.  */
3736
3737     case PLUS:
3738       if (float_mode_p)
3739         {
3740           /* If this is part of a MADD or MSUB, treat the PLUS as
3741              being free.  */
3742           if (ISA_HAS_FP4
3743               && TARGET_FUSED_MADD
3744               && GET_CODE (XEXP (x, 0)) == MULT)
3745             *total = 0;
3746           else
3747             *total = mips_cost->fp_add;
3748           return false;
3749         }
3750
3751       /* Double-word operations require three single-word operations and
3752          an SLTU.  The MIPS16 version then needs to move the result of
3753          the SLTU from $24 to a MIPS16 register.  */
3754       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3755                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
3756                                  speed);
3757       return true;
3758
3759     case NEG:
3760       if (float_mode_p
3761           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3762           && TARGET_FUSED_MADD
3763           && !HONOR_NANS (mode)
3764           && HONOR_SIGNED_ZEROS (mode))
3765         {
3766           /* See if we can use NMADD or NMSUB.  See mips.md for the
3767              associated patterns.  */
3768           rtx op = XEXP (x, 0);
3769           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3770               && GET_CODE (XEXP (op, 0)) == MULT)
3771             {
3772               *total = (mips_fp_mult_cost (mode)
3773                         + rtx_cost (XEXP (XEXP (op, 0), 0), SET, speed)
3774                         + rtx_cost (XEXP (XEXP (op, 0), 1), SET, speed)
3775                         + rtx_cost (XEXP (op, 1), SET, speed));
3776               return true;
3777             }
3778         }
3779
3780       if (float_mode_p)
3781         *total = mips_cost->fp_add;
3782       else
3783         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3784       return false;
3785
3786     case MULT:
3787       if (float_mode_p)
3788         *total = mips_fp_mult_cost (mode);
3789       else if (mode == DImode && !TARGET_64BIT)
3790         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3791            where the mulsidi3 always includes an MFHI and an MFLO.  */
3792         *total = (speed
3793                   ? mips_cost->int_mult_si * 3 + 6
3794                   : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
3795       else if (!speed)
3796         *total = (ISA_HAS_MUL3 ? 1 : 2);
3797       else if (mode == DImode)
3798         *total = mips_cost->int_mult_di;
3799       else
3800         *total = mips_cost->int_mult_si;
3801       return false;
3802
3803     case DIV:
3804       /* Check for a reciprocal.  */
3805       if (float_mode_p
3806           && ISA_HAS_FP4
3807           && flag_unsafe_math_optimizations
3808           && XEXP (x, 0) == CONST1_RTX (mode))
3809         {
3810           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3811             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3812                division as being free.  */
3813             *total = rtx_cost (XEXP (x, 1), SET, speed);
3814           else
3815             *total = (mips_fp_div_cost (mode)
3816                       + rtx_cost (XEXP (x, 1), SET, speed));
3817           return true;
3818         }
3819       /* Fall through.  */
3820
3821     case SQRT:
3822     case MOD:
3823       if (float_mode_p)
3824         {
3825           *total = mips_fp_div_cost (mode);
3826           return false;
3827         }
3828       /* Fall through.  */
3829
3830     case UDIV:
3831     case UMOD:
3832       if (!speed)
3833         {
3834           /* It is our responsibility to make division by a power of 2
3835              as cheap as 2 register additions if we want the division
3836              expanders to be used for such operations; see the setting
3837              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3838              should always produce shorter code than using
3839              expand_sdiv2_pow2.  */
3840           if (TARGET_MIPS16
3841               && CONST_INT_P (XEXP (x, 1))
3842               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3843             {
3844               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), SET, speed);
3845               return true;
3846             }
3847           *total = COSTS_N_INSNS (mips_idiv_insns ());
3848         }
3849       else if (mode == DImode)
3850         *total = mips_cost->int_div_di;
3851       else
3852         *total = mips_cost->int_div_si;
3853       return false;
3854
3855     case SIGN_EXTEND:
3856       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3857       return false;
3858
3859     case ZERO_EXTEND:
3860       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3861       return false;
3862
3863     case FLOAT:
3864     case UNSIGNED_FLOAT:
3865     case FIX:
3866     case FLOAT_EXTEND:
3867     case FLOAT_TRUNCATE:
3868       *total = mips_cost->fp_add;
3869       return false;
3870
3871     default:
3872       return false;
3873     }
3874 }
3875
3876 /* Implement TARGET_ADDRESS_COST.  */
3877
3878 static int
3879 mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
3880 {
3881   return mips_address_insns (addr, SImode, false);
3882 }
3883 \f
3884 /* Information about a single instruction in a multi-instruction
3885    asm sequence.  */
3886 struct mips_multi_member {
3887   /* True if this is a label, false if it is code.  */
3888   bool is_label_p;
3889
3890   /* The output_asm_insn format of the instruction.  */
3891   const char *format;
3892
3893   /* The operands to the instruction.  */
3894   rtx operands[MAX_RECOG_OPERANDS];
3895 };
3896 typedef struct mips_multi_member mips_multi_member;
3897
3898 /* Vector definitions for the above.  */
3899 DEF_VEC_O(mips_multi_member);
3900 DEF_VEC_ALLOC_O(mips_multi_member, heap);
3901
3902 /* The instructions that make up the current multi-insn sequence.  */
3903 static VEC (mips_multi_member, heap) *mips_multi_members;
3904
3905 /* How many instructions (as opposed to labels) are in the current
3906    multi-insn sequence.  */
3907 static unsigned int mips_multi_num_insns;
3908
3909 /* Start a new multi-insn sequence.  */
3910
3911 static void
3912 mips_multi_start (void)
3913 {
3914   VEC_truncate (mips_multi_member, mips_multi_members, 0);
3915   mips_multi_num_insns = 0;
3916 }
3917
3918 /* Add a new, uninitialized member to the current multi-insn sequence.  */
3919
3920 static struct mips_multi_member *
3921 mips_multi_add (void)
3922 {
3923   return VEC_safe_push (mips_multi_member, heap, mips_multi_members, 0);
3924 }
3925
3926 /* Add a normal insn with the given asm format to the current multi-insn
3927    sequence.  The other arguments are a null-terminated list of operands.  */
3928
3929 static void
3930 mips_multi_add_insn (const char *format, ...)
3931 {
3932   struct mips_multi_member *member;
3933   va_list ap;
3934   unsigned int i;
3935   rtx op;
3936
3937   member = mips_multi_add ();
3938   member->is_label_p = false;
3939   member->format = format;
3940   va_start (ap, format);
3941   i = 0;
3942   while ((op = va_arg (ap, rtx)))
3943     member->operands[i++] = op;
3944   va_end (ap);
3945   mips_multi_num_insns++;
3946 }
3947
3948 /* Add the given label definition to the current multi-insn sequence.
3949    The definition should include the colon.  */
3950
3951 static void
3952 mips_multi_add_label (const char *label)
3953 {
3954   struct mips_multi_member *member;
3955
3956   member = mips_multi_add ();
3957   member->is_label_p = true;
3958   member->format = label;
3959 }
3960
3961 /* Return the index of the last member of the current multi-insn sequence.  */
3962
3963 static unsigned int
3964 mips_multi_last_index (void)
3965 {
3966   return VEC_length (mips_multi_member, mips_multi_members) - 1;
3967 }
3968
3969 /* Add a copy of an existing instruction to the current multi-insn
3970    sequence.  I is the index of the instruction that should be copied.  */
3971
3972 static void
3973 mips_multi_copy_insn (unsigned int i)
3974 {
3975   struct mips_multi_member *member;
3976
3977   member = mips_multi_add ();
3978   memcpy (member, VEC_index (mips_multi_member, mips_multi_members, i),
3979           sizeof (*member));
3980   gcc_assert (!member->is_label_p);
3981 }
3982
3983 /* Change the operand of an existing instruction in the current
3984    multi-insn sequence.  I is the index of the instruction,
3985    OP is the index of the operand, and X is the new value.  */
3986
3987 static void
3988 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
3989 {
3990   VEC_index (mips_multi_member, mips_multi_members, i)->operands[op] = x;
3991 }
3992
3993 /* Write out the asm code for the current multi-insn sequence.  */
3994
3995 static void
3996 mips_multi_write (void)
3997 {
3998   struct mips_multi_member *member;
3999   unsigned int i;
4000
4001   for (i = 0;
4002        VEC_iterate (mips_multi_member, mips_multi_members, i, member);
4003        i++)
4004     if (member->is_label_p)
4005       fprintf (asm_out_file, "%s\n", member->format);
4006     else
4007       output_asm_insn (member->format, member->operands);
4008 }
4009 \f
4010 /* Return one word of double-word value OP, taking into account the fixed
4011    endianness of certain registers.  HIGH_P is true to select the high part,
4012    false to select the low part.  */
4013
4014 rtx
4015 mips_subword (rtx op, bool high_p)
4016 {
4017   unsigned int byte, offset;
4018   enum machine_mode mode;
4019
4020   mode = GET_MODE (op);
4021   if (mode == VOIDmode)
4022     mode = TARGET_64BIT ? TImode : DImode;
4023
4024   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4025     byte = UNITS_PER_WORD;
4026   else
4027     byte = 0;
4028
4029   if (FP_REG_RTX_P (op))
4030     {
4031       /* Paired FPRs are always ordered little-endian.  */
4032       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4033       return gen_rtx_REG (word_mode, REGNO (op) + offset);
4034     }
4035
4036   if (MEM_P (op))
4037     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4038
4039   return simplify_gen_subreg (word_mode, op, mode, byte);
4040 }
4041
4042 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
4043
4044 bool
4045 mips_split_64bit_move_p (rtx dest, rtx src)
4046 {
4047   if (TARGET_64BIT)
4048     return false;
4049
4050   /* FPR-to-FPR moves can be done in a single instruction, if they're
4051      allowed at all.  */
4052   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4053     return false;
4054
4055   /* Check for floating-point loads and stores.  */
4056   if (ISA_HAS_LDC1_SDC1)
4057     {
4058       if (FP_REG_RTX_P (dest) && MEM_P (src))
4059         return false;
4060       if (FP_REG_RTX_P (src) && MEM_P (dest))
4061         return false;
4062     }
4063   return true;
4064 }
4065
4066 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
4067    this function handles 64-bit moves for which mips_split_64bit_move_p
4068    holds.  For 64-bit targets, this function handles 128-bit moves.  */
4069
4070 void
4071 mips_split_doubleword_move (rtx dest, rtx src)
4072 {
4073   rtx low_dest;
4074
4075   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4076     {
4077       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4078         emit_insn (gen_move_doubleword_fprdi (dest, src));
4079       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4080         emit_insn (gen_move_doubleword_fprdf (dest, src));
4081       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4082         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4083       else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4084         emit_insn (gen_move_doubleword_fprv2si (dest, src));
4085       else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4086         emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4087       else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4088         emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4089       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4090         emit_insn (gen_move_doubleword_fprtf (dest, src));
4091       else
4092         gcc_unreachable ();
4093     }
4094   else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4095     {
4096       low_dest = mips_subword (dest, false);
4097       mips_emit_move (low_dest, mips_subword (src, false));
4098       if (TARGET_64BIT)
4099         emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4100       else
4101         emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4102     }
4103   else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4104     {
4105       mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4106       if (TARGET_64BIT)
4107         emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4108       else
4109         emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4110     }
4111   else
4112     {
4113       /* The operation can be split into two normal moves.  Decide in
4114          which order to do them.  */
4115       low_dest = mips_subword (dest, false);
4116       if (REG_P (low_dest)
4117           && reg_overlap_mentioned_p (low_dest, src))
4118         {
4119           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4120           mips_emit_move (low_dest, mips_subword (src, false));
4121         }
4122       else
4123         {
4124           mips_emit_move (low_dest, mips_subword (src, false));
4125           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4126         }
4127     }
4128 }
4129 \f
4130 /* Return the appropriate instructions to move SRC into DEST.  Assume
4131    that SRC is operand 1 and DEST is operand 0.  */
4132
4133 const char *
4134 mips_output_move (rtx dest, rtx src)
4135 {
4136   enum rtx_code dest_code, src_code;
4137   enum machine_mode mode;
4138   enum mips_symbol_type symbol_type;
4139   bool dbl_p;
4140
4141   dest_code = GET_CODE (dest);
4142   src_code = GET_CODE (src);
4143   mode = GET_MODE (dest);
4144   dbl_p = (GET_MODE_SIZE (mode) == 8);
4145
4146   if (dbl_p && mips_split_64bit_move_p (dest, src))
4147     return "#";
4148
4149   if ((src_code == REG && GP_REG_P (REGNO (src)))
4150       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4151     {
4152       if (dest_code == REG)
4153         {
4154           if (GP_REG_P (REGNO (dest)))
4155             return "move\t%0,%z1";
4156
4157           /* Moves to HI are handled by special .md insns.  */
4158           if (REGNO (dest) == LO_REGNUM)
4159             return "mtlo\t%z1";
4160
4161           if (DSP_ACC_REG_P (REGNO (dest)))
4162             {
4163               static char retval[] = "mt__\t%z1,%q0";
4164
4165               retval[2] = reg_names[REGNO (dest)][4];
4166               retval[3] = reg_names[REGNO (dest)][5];
4167               return retval;
4168             }
4169
4170           if (FP_REG_P (REGNO (dest)))
4171             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4172
4173           if (ALL_COP_REG_P (REGNO (dest)))
4174             {
4175               static char retval[] = "dmtc_\t%z1,%0";
4176
4177               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4178               return dbl_p ? retval : retval + 1;
4179             }
4180         }
4181       if (dest_code == MEM)
4182         switch (GET_MODE_SIZE (mode))
4183           {
4184           case 1: return "sb\t%z1,%0";
4185           case 2: return "sh\t%z1,%0";
4186           case 4: return "sw\t%z1,%0";
4187           case 8: return "sd\t%z1,%0";
4188           }
4189     }
4190   if (dest_code == REG && GP_REG_P (REGNO (dest)))
4191     {
4192       if (src_code == REG)
4193         {
4194           /* Moves from HI are handled by special .md insns.  */
4195           if (REGNO (src) == LO_REGNUM)
4196             {
4197               /* When generating VR4120 or VR4130 code, we use MACC and
4198                  DMACC instead of MFLO.  This avoids both the normal
4199                  MIPS III HI/LO hazards and the errata related to
4200                  -mfix-vr4130.  */
4201               if (ISA_HAS_MACCHI)
4202                 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4203               return "mflo\t%0";
4204             }
4205
4206           if (DSP_ACC_REG_P (REGNO (src)))
4207             {
4208               static char retval[] = "mf__\t%0,%q1";
4209
4210               retval[2] = reg_names[REGNO (src)][4];
4211               retval[3] = reg_names[REGNO (src)][5];
4212               return retval;
4213             }
4214
4215           if (FP_REG_P (REGNO (src)))
4216             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4217
4218           if (ALL_COP_REG_P (REGNO (src)))
4219             {
4220               static char retval[] = "dmfc_\t%0,%1";
4221
4222               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4223               return dbl_p ? retval : retval + 1;
4224             }
4225
4226           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
4227             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
4228         }
4229
4230       if (src_code == MEM)
4231         switch (GET_MODE_SIZE (mode))
4232           {
4233           case 1: return "lbu\t%0,%1";
4234           case 2: return "lhu\t%0,%1";
4235           case 4: return "lw\t%0,%1";
4236           case 8: return "ld\t%0,%1";
4237           }
4238
4239       if (src_code == CONST_INT)
4240         {
4241           /* Don't use the X format for the operand itself, because that
4242              will give out-of-range numbers for 64-bit hosts and 32-bit
4243              targets.  */
4244           if (!TARGET_MIPS16)
4245             return "li\t%0,%1\t\t\t# %X1";
4246
4247           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4248             return "li\t%0,%1";
4249
4250           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4251             return "#";
4252         }
4253
4254       if (src_code == HIGH)
4255         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4256
4257       if (CONST_GP_P (src))
4258         return "move\t%0,%1";
4259
4260       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4261           && mips_lo_relocs[symbol_type] != 0)
4262         {
4263           /* A signed 16-bit constant formed by applying a relocation
4264              operator to a symbolic address.  */
4265           gcc_assert (!mips_split_p[symbol_type]);
4266           return "li\t%0,%R1";
4267         }
4268
4269       if (symbolic_operand (src, VOIDmode))
4270         {
4271           gcc_assert (TARGET_MIPS16
4272                       ? TARGET_MIPS16_TEXT_LOADS
4273                       : !TARGET_EXPLICIT_RELOCS);
4274           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4275         }
4276     }
4277   if (src_code == REG && FP_REG_P (REGNO (src)))
4278     {
4279       if (dest_code == REG && FP_REG_P (REGNO (dest)))
4280         {
4281           if (GET_MODE (dest) == V2SFmode)
4282             return "mov.ps\t%0,%1";
4283           else
4284             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4285         }
4286
4287       if (dest_code == MEM)
4288         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4289     }
4290   if (dest_code == REG && FP_REG_P (REGNO (dest)))
4291     {
4292       if (src_code == MEM)
4293         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4294     }
4295   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4296     {
4297       static char retval[] = "l_c_\t%0,%1";
4298
4299       retval[1] = (dbl_p ? 'd' : 'w');
4300       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4301       return retval;
4302     }
4303   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4304     {
4305       static char retval[] = "s_c_\t%1,%0";
4306
4307       retval[1] = (dbl_p ? 'd' : 'w');
4308       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4309       return retval;
4310     }
4311   gcc_unreachable ();
4312 }
4313 \f
4314 /* Return true if CMP1 is a suitable second operand for integer ordering
4315    test CODE.  See also the *sCC patterns in mips.md.  */
4316
4317 static bool
4318 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4319 {
4320   switch (code)
4321     {
4322     case GT:
4323     case GTU:
4324       return reg_or_0_operand (cmp1, VOIDmode);
4325
4326     case GE:
4327     case GEU:
4328       return !TARGET_MIPS16 && cmp1 == const1_rtx;
4329
4330     case LT:
4331     case LTU:
4332       return arith_operand (cmp1, VOIDmode);
4333
4334     case LE:
4335       return sle_operand (cmp1, VOIDmode);
4336
4337     case LEU:
4338       return sleu_operand (cmp1, VOIDmode);
4339
4340     default:
4341       gcc_unreachable ();
4342     }
4343 }
4344
4345 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4346    integer ordering test *CODE, or if an equivalent combination can
4347    be formed by adjusting *CODE and *CMP1.  When returning true, update
4348    *CODE and *CMP1 with the chosen code and operand, otherwise leave
4349    them alone.  */
4350
4351 static bool
4352 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4353                                   enum machine_mode mode)
4354 {
4355   HOST_WIDE_INT plus_one;
4356
4357   if (mips_int_order_operand_ok_p (*code, *cmp1))
4358     return true;
4359
4360   if (CONST_INT_P (*cmp1))
4361     switch (*code)
4362       {
4363       case LE:
4364         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4365         if (INTVAL (*cmp1) < plus_one)
4366           {
4367             *code = LT;
4368             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4369             return true;
4370           }
4371         break;
4372
4373       case LEU:
4374         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4375         if (plus_one != 0)
4376           {
4377             *code = LTU;
4378             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4379             return true;
4380           }
4381         break;
4382
4383       default:
4384         break;
4385       }
4386   return false;
4387 }
4388
4389 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4390    in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4391    is nonnull, it's OK to set TARGET to the inverse of the result and
4392    flip *INVERT_PTR instead.  */
4393
4394 static void
4395 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4396                           rtx target, rtx cmp0, rtx cmp1)
4397 {
4398   enum machine_mode mode;
4399
4400   /* First see if there is a MIPS instruction that can do this operation.
4401      If not, try doing the same for the inverse operation.  If that also
4402      fails, force CMP1 into a register and try again.  */
4403   mode = GET_MODE (cmp0);
4404   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4405     mips_emit_binary (code, target, cmp0, cmp1);
4406   else
4407     {
4408       enum rtx_code inv_code = reverse_condition (code);
4409       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4410         {
4411           cmp1 = force_reg (mode, cmp1);
4412           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4413         }
4414       else if (invert_ptr == 0)
4415         {
4416           rtx inv_target;
4417
4418           inv_target = mips_force_binary (GET_MODE (target),
4419                                           inv_code, cmp0, cmp1);
4420           mips_emit_binary (XOR, target, inv_target, const1_rtx);
4421         }
4422       else
4423         {
4424           *invert_ptr = !*invert_ptr;
4425           mips_emit_binary (inv_code, target, cmp0, cmp1);
4426         }
4427     }
4428 }
4429
4430 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4431    The register will have the same mode as CMP0.  */
4432
4433 static rtx
4434 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4435 {
4436   if (cmp1 == const0_rtx)
4437     return cmp0;
4438
4439   if (uns_arith_operand (cmp1, VOIDmode))
4440     return expand_binop (GET_MODE (cmp0), xor_optab,
4441                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4442
4443   return expand_binop (GET_MODE (cmp0), sub_optab,
4444                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4445 }
4446
4447 /* Convert *CODE into a code that can be used in a floating-point
4448    scc instruction (C.cond.fmt).  Return true if the values of
4449    the condition code registers will be inverted, with 0 indicating
4450    that the condition holds.  */
4451
4452 static bool
4453 mips_reversed_fp_cond (enum rtx_code *code)
4454 {
4455   switch (*code)
4456     {
4457     case NE:
4458     case LTGT:
4459     case ORDERED:
4460       *code = reverse_condition_maybe_unordered (*code);
4461       return true;
4462
4463     default:
4464       return false;
4465     }
4466 }
4467
4468 /* Convert a comparison into something that can be used in a branch or
4469    conditional move.  On entry, *OP0 and *OP1 are the values being
4470    compared and *CODE is the code used to compare them.
4471
4472    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4473    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4474    otherwise any standard branch condition can be used.  The standard branch
4475    conditions are:
4476
4477       - EQ or NE between two registers.
4478       - any comparison between a register and zero.  */
4479
4480 static void
4481 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4482 {
4483   rtx cmp_op0 = *op0;
4484   rtx cmp_op1 = *op1;
4485
4486   if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4487     {
4488       if (!need_eq_ne_p && *op1 == const0_rtx)
4489         ;
4490       else if (*code == EQ || *code == NE)
4491         {
4492           if (need_eq_ne_p)
4493             {
4494               *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4495               *op1 = const0_rtx;
4496             }
4497           else
4498             *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4499         }
4500       else
4501         {
4502           /* The comparison needs a separate scc instruction.  Store the
4503              result of the scc in *OP0 and compare it against zero.  */
4504           bool invert = false;
4505           *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4506           mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4507           *code = (invert ? EQ : NE);
4508           *op1 = const0_rtx;
4509         }
4510     }
4511   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4512     {
4513       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4514       mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4515       *code = NE;
4516       *op1 = const0_rtx;
4517     }
4518   else
4519     {
4520       enum rtx_code cmp_code;
4521
4522       /* Floating-point tests use a separate C.cond.fmt comparison to
4523          set a condition code register.  The branch or conditional move
4524          will then compare that register against zero.
4525
4526          Set CMP_CODE to the code of the comparison instruction and
4527          *CODE to the code that the branch or move should use.  */
4528       cmp_code = *code;
4529       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4530       *op0 = (ISA_HAS_8CC
4531               ? gen_reg_rtx (CCmode)
4532               : gen_rtx_REG (CCmode, FPSW_REGNUM));
4533       *op1 = const0_rtx;
4534       mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4535     }
4536 }
4537 \f
4538 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4539    and OPERAND[3].  Store the result in OPERANDS[0].
4540
4541    On 64-bit targets, the mode of the comparison and target will always be
4542    SImode, thus possibly narrower than that of the comparison's operands.  */
4543
4544 void
4545 mips_expand_scc (rtx operands[])
4546 {
4547   rtx target = operands[0];
4548   enum rtx_code code = GET_CODE (operands[1]);
4549   rtx op0 = operands[2];
4550   rtx op1 = operands[3];
4551
4552   gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4553
4554   if (code == EQ || code == NE)
4555     {
4556       if (ISA_HAS_SEQ_SNE
4557           && reg_imm10_operand (op1, GET_MODE (op1)))
4558         mips_emit_binary (code, target, op0, op1);
4559       else
4560         {
4561           rtx zie = mips_zero_if_equal (op0, op1);
4562           mips_emit_binary (code, target, zie, const0_rtx);
4563         }
4564     }
4565   else
4566     mips_emit_int_order_test (code, 0, target, op0, op1);
4567 }
4568
4569 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4570    CODE and jump to OPERANDS[3] if the condition holds.  */
4571
4572 void
4573 mips_expand_conditional_branch (rtx *operands)
4574 {
4575   enum rtx_code code = GET_CODE (operands[0]);
4576   rtx op0 = operands[1];
4577   rtx op1 = operands[2];
4578   rtx condition;
4579
4580   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4581   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4582   emit_jump_insn (gen_condjump (condition, operands[3]));
4583 }
4584
4585 /* Implement:
4586
4587    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4588    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
4589
4590 void
4591 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4592                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4593 {
4594   rtx cmp_result;
4595   bool reversed_p;
4596
4597   reversed_p = mips_reversed_fp_cond (&cond);
4598   cmp_result = gen_reg_rtx (CCV2mode);
4599   emit_insn (gen_scc_ps (cmp_result,
4600                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4601   if (reversed_p)
4602     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4603                                          cmp_result));
4604   else
4605     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4606                                          cmp_result));
4607 }
4608
4609 /* Perform the comparison in OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0]
4610    if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
4611
4612 void
4613 mips_expand_conditional_move (rtx *operands)
4614 {
4615   rtx cond;
4616   enum rtx_code code = GET_CODE (operands[1]);
4617   rtx op0 = XEXP (operands[1], 0);
4618   rtx op1 = XEXP (operands[1], 1);
4619
4620   mips_emit_compare (&code, &op0, &op1, true);
4621   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
4622   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4623                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4624                                                 operands[2], operands[3])));
4625 }
4626
4627 /* Perform the comparison in COMPARISON, then trap if the condition holds.  */
4628
4629 void
4630 mips_expand_conditional_trap (rtx comparison)
4631 {
4632   rtx op0, op1;
4633   enum machine_mode mode;
4634   enum rtx_code code;
4635
4636   /* MIPS conditional trap instructions don't have GT or LE flavors,
4637      so we must swap the operands and convert to LT and GE respectively.  */
4638   code = GET_CODE (comparison);
4639   switch (code)
4640     {
4641     case GT:
4642     case LE:
4643     case GTU:
4644     case LEU:
4645       code = swap_condition (code);
4646       op0 = XEXP (comparison, 1);
4647       op1 = XEXP (comparison, 0);
4648       break;
4649
4650     default:
4651       op0 = XEXP (comparison, 0);
4652       op1 = XEXP (comparison, 1);
4653       break;
4654     }
4655
4656   mode = GET_MODE (XEXP (comparison, 0));
4657   op0 = force_reg (mode, op0);
4658   if (!arith_operand (op1, mode))
4659     op1 = force_reg (mode, op1);
4660
4661   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4662                               gen_rtx_fmt_ee (code, mode, op0, op1),
4663                               const0_rtx));
4664 }
4665 \f
4666 /* Initialize *CUM for a call to a function of type FNTYPE.  */
4667
4668 void
4669 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4670 {
4671   memset (cum, 0, sizeof (*cum));
4672   cum->prototype = (fntype && prototype_p (fntype));
4673   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4674 }
4675
4676 /* Fill INFO with information about a single argument.  CUM is the
4677    cumulative state for earlier arguments.  MODE is the mode of this
4678    argument and TYPE is its type (if known).  NAMED is true if this
4679    is a named (fixed) argument rather than a variable one.  */
4680
4681 static void
4682 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4683                    enum machine_mode mode, tree type, int named)
4684 {
4685   bool doubleword_aligned_p;
4686   unsigned int num_bytes, num_words, max_regs;
4687
4688   /* Work out the size of the argument.  */
4689   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4690   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4691
4692   /* Decide whether it should go in a floating-point register, assuming
4693      one is free.  Later code checks for availability.
4694
4695      The checks against UNITS_PER_FPVALUE handle the soft-float and
4696      single-float cases.  */
4697   switch (mips_abi)
4698     {
4699     case ABI_EABI:
4700       /* The EABI conventions have traditionally been defined in terms
4701          of TYPE_MODE, regardless of the actual type.  */
4702       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4703                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4704                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4705       break;
4706
4707     case ABI_32:
4708     case ABI_O64:
4709       /* Only leading floating-point scalars are passed in
4710          floating-point registers.  We also handle vector floats the same
4711          say, which is OK because they are not covered by the standard ABI.  */
4712       info->fpr_p = (!cum->gp_reg_found
4713                      && cum->arg_number < 2
4714                      && (type == 0
4715                          || SCALAR_FLOAT_TYPE_P (type)
4716                          || VECTOR_FLOAT_TYPE_P (type))
4717                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4718                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4719                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4720       break;
4721
4722     case ABI_N32:
4723     case ABI_64:
4724       /* Scalar, complex and vector floating-point types are passed in
4725          floating-point registers, as long as this is a named rather
4726          than a variable argument.  */
4727       info->fpr_p = (named
4728                      && (type == 0 || FLOAT_TYPE_P (type))
4729                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4730                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4731                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4732                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4733
4734       /* ??? According to the ABI documentation, the real and imaginary
4735          parts of complex floats should be passed in individual registers.
4736          The real and imaginary parts of stack arguments are supposed
4737          to be contiguous and there should be an extra word of padding
4738          at the end.
4739
4740          This has two problems.  First, it makes it impossible to use a
4741          single "void *" va_list type, since register and stack arguments
4742          are passed differently.  (At the time of writing, MIPSpro cannot
4743          handle complex float varargs correctly.)  Second, it's unclear
4744          what should happen when there is only one register free.
4745
4746          For now, we assume that named complex floats should go into FPRs
4747          if there are two FPRs free, otherwise they should be passed in the
4748          same way as a struct containing two floats.  */
4749       if (info->fpr_p
4750           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4751           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4752         {
4753           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4754             info->fpr_p = false;
4755           else
4756             num_words = 2;
4757         }
4758       break;
4759
4760     default:
4761       gcc_unreachable ();
4762     }
4763
4764   /* See whether the argument has doubleword alignment.  */
4765   doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4766
4767   /* Set REG_OFFSET to the register count we're interested in.
4768      The EABI allocates the floating-point registers separately,
4769      but the other ABIs allocate them like integer registers.  */
4770   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4771                       ? cum->num_fprs
4772                       : cum->num_gprs);
4773
4774   /* Advance to an even register if the argument is doubleword-aligned.  */
4775   if (doubleword_aligned_p)
4776     info->reg_offset += info->reg_offset & 1;
4777
4778   /* Work out the offset of a stack argument.  */
4779   info->stack_offset = cum->stack_words;
4780   if (doubleword_aligned_p)
4781     info->stack_offset += info->stack_offset & 1;
4782
4783   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4784
4785   /* Partition the argument between registers and stack.  */
4786   info->reg_words = MIN (num_words, max_regs);
4787   info->stack_words = num_words - info->reg_words;
4788 }
4789
4790 /* INFO describes a register argument that has the normal format for the
4791    argument's mode.  Return the register it uses, assuming that FPRs are
4792    available if HARD_FLOAT_P.  */
4793
4794 static unsigned int
4795 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4796 {
4797   if (!info->fpr_p || !hard_float_p)
4798     return GP_ARG_FIRST + info->reg_offset;
4799   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4800     /* In o32, the second argument is always passed in $f14
4801        for TARGET_DOUBLE_FLOAT, regardless of whether the
4802        first argument was a word or doubleword.  */
4803     return FP_ARG_FIRST + 2;
4804   else
4805     return FP_ARG_FIRST + info->reg_offset;
4806 }
4807
4808 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4809
4810 static bool
4811 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4812 {
4813   return !TARGET_OLDABI;
4814 }
4815
4816 /* Implement FUNCTION_ARG.  */
4817
4818 rtx
4819 mips_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4820                    tree type, int named)
4821 {
4822   struct mips_arg_info info;
4823
4824   /* We will be called with a mode of VOIDmode after the last argument
4825      has been seen.  Whatever we return will be passed to the call expander.
4826      If we need a MIPS16 fp_code, return a REG with the code stored as
4827      the mode.  */
4828   if (mode == VOIDmode)
4829     {
4830       if (TARGET_MIPS16 && cum->fp_code != 0)
4831         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4832       else
4833         return NULL;
4834     }
4835
4836   mips_get_arg_info (&info, cum, mode, type, named);
4837
4838   /* Return straight away if the whole argument is passed on the stack.  */
4839   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4840     return NULL;
4841
4842   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4843      contains a double in its entirety, then that 64-bit chunk is passed
4844      in a floating-point register.  */
4845   if (TARGET_NEWABI
4846       && TARGET_HARD_FLOAT
4847       && named
4848       && type != 0
4849       && TREE_CODE (type) == RECORD_TYPE
4850       && TYPE_SIZE_UNIT (type)
4851       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4852     {
4853       tree field;
4854
4855       /* First check to see if there is any such field.  */
4856       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4857         if (TREE_CODE (field) == FIELD_DECL
4858             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4859             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4860             && host_integerp (bit_position (field), 0)
4861             && int_bit_position (field) % BITS_PER_WORD == 0)
4862           break;
4863
4864       if (field != 0)
4865         {
4866           /* Now handle the special case by returning a PARALLEL
4867              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4868              chunks are passed in registers.  */
4869           unsigned int i;
4870           HOST_WIDE_INT bitpos;
4871           rtx ret;
4872
4873           /* assign_parms checks the mode of ENTRY_PARM, so we must
4874              use the actual mode here.  */
4875           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4876
4877           bitpos = 0;
4878           field = TYPE_FIELDS (type);
4879           for (i = 0; i < info.reg_words; i++)
4880             {
4881               rtx reg;
4882
4883               for (; field; field = TREE_CHAIN (field))
4884                 if (TREE_CODE (field) == FIELD_DECL
4885                     && int_bit_position (field) >= bitpos)
4886                   break;
4887
4888               if (field
4889                   && int_bit_position (field) == bitpos
4890                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4891                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4892                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4893               else
4894                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4895
4896               XVECEXP (ret, 0, i)
4897                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4898                                      GEN_INT (bitpos / BITS_PER_UNIT));
4899
4900               bitpos += BITS_PER_WORD;
4901             }
4902           return ret;
4903         }
4904     }
4905
4906   /* Handle the n32/n64 conventions for passing complex floating-point
4907      arguments in FPR pairs.  The real part goes in the lower register
4908      and the imaginary part goes in the upper register.  */
4909   if (TARGET_NEWABI
4910       && info.fpr_p
4911       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4912     {
4913       rtx real, imag;
4914       enum machine_mode inner;
4915       unsigned int regno;
4916
4917       inner = GET_MODE_INNER (mode);
4918       regno = FP_ARG_FIRST + info.reg_offset;
4919       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4920         {
4921           /* Real part in registers, imaginary part on stack.  */
4922           gcc_assert (info.stack_words == info.reg_words);
4923           return gen_rtx_REG (inner, regno);
4924         }
4925       else
4926         {
4927           gcc_assert (info.stack_words == 0);
4928           real = gen_rtx_EXPR_LIST (VOIDmode,
4929                                     gen_rtx_REG (inner, regno),
4930                                     const0_rtx);
4931           imag = gen_rtx_EXPR_LIST (VOIDmode,
4932                                     gen_rtx_REG (inner,
4933                                                  regno + info.reg_words / 2),
4934                                     GEN_INT (GET_MODE_SIZE (inner)));
4935           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4936         }
4937     }
4938
4939   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4940 }
4941
4942 /* Implement FUNCTION_ARG_ADVANCE.  */
4943
4944 void
4945 mips_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4946                            tree type, int named)
4947 {
4948   struct mips_arg_info info;
4949
4950   mips_get_arg_info (&info, cum, mode, type, named);
4951
4952   if (!info.fpr_p)
4953     cum->gp_reg_found = true;
4954
4955   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4956      an explanation of what this code does.  It assumes that we're using
4957      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4958      in FPRs.  */
4959   if (cum->arg_number < 2 && info.fpr_p)
4960     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4961
4962   /* Advance the register count.  This has the effect of setting
4963      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4964      argument required us to skip the final GPR and pass the whole
4965      argument on the stack.  */
4966   if (mips_abi != ABI_EABI || !info.fpr_p)
4967     cum->num_gprs = info.reg_offset + info.reg_words;
4968   else if (info.reg_words > 0)
4969     cum->num_fprs += MAX_FPRS_PER_FMT;
4970
4971   /* Advance the stack word count.  */
4972   if (info.stack_words > 0)
4973     cum->stack_words = info.stack_offset + info.stack_words;
4974
4975   cum->arg_number++;
4976 }
4977
4978 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4979
4980 static int
4981 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4982                         enum machine_mode mode, tree type, bool named)
4983 {
4984   struct mips_arg_info info;
4985
4986   mips_get_arg_info (&info, cum, mode, type, named);
4987   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4988 }
4989
4990 /* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
4991    PARM_BOUNDARY bits of alignment, but will be given anything up
4992    to STACK_BOUNDARY bits if the type requires it.  */
4993
4994 int
4995 mips_function_arg_boundary (enum machine_mode mode, tree type)
4996 {
4997   unsigned int alignment;
4998
4999   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5000   if (alignment < PARM_BOUNDARY)
5001     alignment = PARM_BOUNDARY;
5002   if (alignment > STACK_BOUNDARY)
5003     alignment = STACK_BOUNDARY;
5004   return alignment;
5005 }
5006
5007 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5008    upward rather than downward.  In other words, return true if the
5009    first byte of the stack slot has useful data, false if the last
5010    byte does.  */
5011
5012 bool
5013 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
5014 {
5015   /* On little-endian targets, the first byte of every stack argument
5016      is passed in the first byte of the stack slot.  */
5017   if (!BYTES_BIG_ENDIAN)
5018     return true;
5019
5020   /* Otherwise, integral types are padded downward: the last byte of a
5021      stack argument is passed in the last byte of the stack slot.  */
5022   if (type != 0
5023       ? (INTEGRAL_TYPE_P (type)
5024          || POINTER_TYPE_P (type)
5025          || FIXED_POINT_TYPE_P (type))
5026       : (SCALAR_INT_MODE_P (mode)
5027          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5028     return false;
5029
5030   /* Big-endian o64 pads floating-point arguments downward.  */
5031   if (mips_abi == ABI_O64)
5032     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5033       return false;
5034
5035   /* Other types are padded upward for o32, o64, n32 and n64.  */
5036   if (mips_abi != ABI_EABI)
5037     return true;
5038
5039   /* Arguments smaller than a stack slot are padded downward.  */
5040   if (mode != BLKmode)
5041     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5042   else
5043     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5044 }
5045
5046 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
5047    if the least significant byte of the register has useful data.  Return
5048    the opposite if the most significant byte does.  */
5049
5050 bool
5051 mips_pad_reg_upward (enum machine_mode mode, tree type)
5052 {
5053   /* No shifting is required for floating-point arguments.  */
5054   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5055     return !BYTES_BIG_ENDIAN;
5056
5057   /* Otherwise, apply the same padding to register arguments as we do
5058      to stack arguments.  */
5059   return mips_pad_arg_upward (mode, type);
5060 }
5061
5062 /* Return nonzero when an argument must be passed by reference.  */
5063
5064 static bool
5065 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5066                         enum machine_mode mode, const_tree type,
5067                         bool named ATTRIBUTE_UNUSED)
5068 {
5069   if (mips_abi == ABI_EABI)
5070     {
5071       int size;
5072
5073       /* ??? How should SCmode be handled?  */
5074       if (mode == DImode || mode == DFmode
5075           || mode == DQmode || mode == UDQmode
5076           || mode == DAmode || mode == UDAmode)
5077         return 0;
5078
5079       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5080       return size == -1 || size > UNITS_PER_WORD;
5081     }
5082   else
5083     {
5084       /* If we have a variable-sized parameter, we have no choice.  */
5085       return targetm.calls.must_pass_in_stack (mode, type);
5086     }
5087 }
5088
5089 /* Implement TARGET_CALLEE_COPIES.  */
5090
5091 static bool
5092 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5093                     enum machine_mode mode ATTRIBUTE_UNUSED,
5094                     const_tree type ATTRIBUTE_UNUSED, bool named)
5095 {
5096   return mips_abi == ABI_EABI && named;
5097 }
5098 \f
5099 /* See whether VALTYPE is a record whose fields should be returned in
5100    floating-point registers.  If so, return the number of fields and
5101    list them in FIELDS (which should have two elements).  Return 0
5102    otherwise.
5103
5104    For n32 & n64, a structure with one or two fields is returned in
5105    floating-point registers as long as every field has a floating-point
5106    type.  */
5107
5108 static int
5109 mips_fpr_return_fields (const_tree valtype, tree *fields)
5110 {
5111   tree field;
5112   int i;
5113
5114   if (!TARGET_NEWABI)
5115     return 0;
5116
5117   if (TREE_CODE (valtype) != RECORD_TYPE)
5118     return 0;
5119
5120   i = 0;
5121   for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
5122     {
5123       if (TREE_CODE (field) != FIELD_DECL)
5124         continue;
5125
5126       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5127         return 0;
5128
5129       if (i == 2)
5130         return 0;
5131
5132       fields[i++] = field;
5133     }
5134   return i;
5135 }
5136
5137 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
5138    a value in the most significant part of $2/$3 if:
5139
5140       - the target is big-endian;
5141
5142       - the value has a structure or union type (we generalize this to
5143         cover aggregates from other languages too); and
5144
5145       - the structure is not returned in floating-point registers.  */
5146
5147 static bool
5148 mips_return_in_msb (const_tree valtype)
5149 {
5150   tree fields[2];
5151
5152   return (TARGET_NEWABI
5153           && TARGET_BIG_ENDIAN
5154           && AGGREGATE_TYPE_P (valtype)
5155           && mips_fpr_return_fields (valtype, fields) == 0);
5156 }
5157
5158 /* Return true if the function return value MODE will get returned in a
5159    floating-point register.  */
5160
5161 static bool
5162 mips_return_mode_in_fpr_p (enum machine_mode mode)
5163 {
5164   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5165            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
5166            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5167           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5168 }
5169
5170 /* Return the representation of an FPR return register when the
5171    value being returned in FP_RETURN has mode VALUE_MODE and the
5172    return type itself has mode TYPE_MODE.  On NewABI targets,
5173    the two modes may be different for structures like:
5174
5175        struct __attribute__((packed)) foo { float f; }
5176
5177    where we return the SFmode value of "f" in FP_RETURN, but where
5178    the structure itself has mode BLKmode.  */
5179
5180 static rtx
5181 mips_return_fpr_single (enum machine_mode type_mode,
5182                         enum machine_mode value_mode)
5183 {
5184   rtx x;
5185
5186   x = gen_rtx_REG (value_mode, FP_RETURN);
5187   if (type_mode != value_mode)
5188     {
5189       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5190       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5191     }
5192   return x;
5193 }
5194
5195 /* Return a composite value in a pair of floating-point registers.
5196    MODE1 and OFFSET1 are the mode and byte offset for the first value,
5197    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
5198    complete value.
5199
5200    For n32 & n64, $f0 always holds the first value and $f2 the second.
5201    Otherwise the values are packed together as closely as possible.  */
5202
5203 static rtx
5204 mips_return_fpr_pair (enum machine_mode mode,
5205                       enum machine_mode mode1, HOST_WIDE_INT offset1,
5206                       enum machine_mode mode2, HOST_WIDE_INT offset2)
5207 {
5208   int inc;
5209
5210   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5211   return gen_rtx_PARALLEL
5212     (mode,
5213      gen_rtvec (2,
5214                 gen_rtx_EXPR_LIST (VOIDmode,
5215                                    gen_rtx_REG (mode1, FP_RETURN),
5216                                    GEN_INT (offset1)),
5217                 gen_rtx_EXPR_LIST (VOIDmode,
5218                                    gen_rtx_REG (mode2, FP_RETURN + inc),
5219                                    GEN_INT (offset2))));
5220
5221 }
5222
5223 /* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
5224    VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
5225    VALTYPE is null and MODE is the mode of the return value.  */
5226
5227 rtx
5228 mips_function_value (const_tree valtype, const_tree func, enum machine_mode mode)
5229 {
5230   if (valtype)
5231     {
5232       tree fields[2];
5233       int unsigned_p;
5234
5235       mode = TYPE_MODE (valtype);
5236       unsigned_p = TYPE_UNSIGNED (valtype);
5237
5238       /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5239          return values, promote the mode here too.  */
5240       mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5241
5242       /* Handle structures whose fields are returned in $f0/$f2.  */
5243       switch (mips_fpr_return_fields (valtype, fields))
5244         {
5245         case 1:
5246           return mips_return_fpr_single (mode,
5247                                          TYPE_MODE (TREE_TYPE (fields[0])));
5248
5249         case 2:
5250           return mips_return_fpr_pair (mode,
5251                                        TYPE_MODE (TREE_TYPE (fields[0])),
5252                                        int_byte_position (fields[0]),
5253                                        TYPE_MODE (TREE_TYPE (fields[1])),
5254                                        int_byte_position (fields[1]));
5255         }
5256
5257       /* If a value is passed in the most significant part of a register, see
5258          whether we have to round the mode up to a whole number of words.  */
5259       if (mips_return_in_msb (valtype))
5260         {
5261           HOST_WIDE_INT size = int_size_in_bytes (valtype);
5262           if (size % UNITS_PER_WORD != 0)
5263             {
5264               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5265               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5266             }
5267         }
5268
5269       /* For EABI, the class of return register depends entirely on MODE.
5270          For example, "struct { some_type x; }" and "union { some_type x; }"
5271          are returned in the same way as a bare "some_type" would be.
5272          Other ABIs only use FPRs for scalar, complex or vector types.  */
5273       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5274         return gen_rtx_REG (mode, GP_RETURN);
5275     }
5276
5277   if (!TARGET_MIPS16)
5278     {
5279       /* Handle long doubles for n32 & n64.  */
5280       if (mode == TFmode)
5281         return mips_return_fpr_pair (mode,
5282                                      DImode, 0,
5283                                      DImode, GET_MODE_SIZE (mode) / 2);
5284
5285       if (mips_return_mode_in_fpr_p (mode))
5286         {
5287           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5288             return mips_return_fpr_pair (mode,
5289                                          GET_MODE_INNER (mode), 0,
5290                                          GET_MODE_INNER (mode),
5291                                          GET_MODE_SIZE (mode) / 2);
5292           else
5293             return gen_rtx_REG (mode, FP_RETURN);
5294         }
5295     }
5296
5297   return gen_rtx_REG (mode, GP_RETURN);
5298 }
5299
5300 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5301    all BLKmode objects are returned in memory.  Under the n32, n64
5302    and embedded ABIs, small structures are returned in a register.
5303    Objects with varying size must still be returned in memory, of
5304    course.  */
5305
5306 static bool
5307 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5308 {
5309   return (TARGET_OLDABI
5310           ? TYPE_MODE (type) == BLKmode
5311           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5312 }
5313 \f
5314 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5315
5316 static void
5317 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5318                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
5319                              int no_rtl)
5320 {
5321   CUMULATIVE_ARGS local_cum;
5322   int gp_saved, fp_saved;
5323
5324   /* The caller has advanced CUM up to, but not beyond, the last named
5325      argument.  Advance a local copy of CUM past the last "real" named
5326      argument, to find out how many registers are left over.  */
5327   local_cum = *cum;
5328   FUNCTION_ARG_ADVANCE (local_cum, mode, type, true);
5329
5330   /* Found out how many registers we need to save.  */
5331   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5332   fp_saved = (EABI_FLOAT_VARARGS_P
5333               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5334               : 0);
5335
5336   if (!no_rtl)
5337     {
5338       if (gp_saved > 0)
5339         {
5340           rtx ptr, mem;
5341
5342           ptr = plus_constant (virtual_incoming_args_rtx,
5343                                REG_PARM_STACK_SPACE (cfun->decl)
5344                                - gp_saved * UNITS_PER_WORD);
5345           mem = gen_frame_mem (BLKmode, ptr);
5346           set_mem_alias_set (mem, get_varargs_alias_set ());
5347
5348           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5349                                mem, gp_saved);
5350         }
5351       if (fp_saved > 0)
5352         {
5353           /* We can't use move_block_from_reg, because it will use
5354              the wrong mode.  */
5355           enum machine_mode mode;
5356           int off, i;
5357
5358           /* Set OFF to the offset from virtual_incoming_args_rtx of
5359              the first float register.  The FP save area lies below
5360              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5361           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5362           off -= fp_saved * UNITS_PER_FPREG;
5363
5364           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5365
5366           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5367                i += MAX_FPRS_PER_FMT)
5368             {
5369               rtx ptr, mem;
5370
5371               ptr = plus_constant (virtual_incoming_args_rtx, off);
5372               mem = gen_frame_mem (mode, ptr);
5373               set_mem_alias_set (mem, get_varargs_alias_set ());
5374               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5375               off += UNITS_PER_HWFPVALUE;
5376             }
5377         }
5378     }
5379   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5380     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5381                                    + fp_saved * UNITS_PER_FPREG);
5382 }
5383
5384 /* Implement TARGET_BUILTIN_VA_LIST.  */
5385
5386 static tree
5387 mips_build_builtin_va_list (void)
5388 {
5389   if (EABI_FLOAT_VARARGS_P)
5390     {
5391       /* We keep 3 pointers, and two offsets.
5392
5393          Two pointers are to the overflow area, which starts at the CFA.
5394          One of these is constant, for addressing into the GPR save area
5395          below it.  The other is advanced up the stack through the
5396          overflow region.
5397
5398          The third pointer is to the bottom of the GPR save area.
5399          Since the FPR save area is just below it, we can address
5400          FPR slots off this pointer.
5401
5402          We also keep two one-byte offsets, which are to be subtracted
5403          from the constant pointers to yield addresses in the GPR and
5404          FPR save areas.  These are downcounted as float or non-float
5405          arguments are used, and when they get to zero, the argument
5406          must be obtained from the overflow region.  */
5407       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5408       tree array, index;
5409
5410       record = lang_hooks.types.make_type (RECORD_TYPE);
5411
5412       f_ovfl = build_decl (BUILTINS_LOCATION,
5413                            FIELD_DECL, get_identifier ("__overflow_argptr"),
5414                            ptr_type_node);
5415       f_gtop = build_decl (BUILTINS_LOCATION,
5416                            FIELD_DECL, get_identifier ("__gpr_top"),
5417                            ptr_type_node);
5418       f_ftop = build_decl (BUILTINS_LOCATION,
5419                            FIELD_DECL, get_identifier ("__fpr_top"),
5420                            ptr_type_node);
5421       f_goff = build_decl (BUILTINS_LOCATION,
5422                            FIELD_DECL, get_identifier ("__gpr_offset"),
5423                            unsigned_char_type_node);
5424       f_foff = build_decl (BUILTINS_LOCATION,
5425                            FIELD_DECL, get_identifier ("__fpr_offset"),
5426                            unsigned_char_type_node);
5427       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5428          warn on every user file.  */
5429       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5430       array = build_array_type (unsigned_char_type_node,
5431                                 build_index_type (index));
5432       f_res = build_decl (BUILTINS_LOCATION,
5433                           FIELD_DECL, get_identifier ("__reserved"), array);
5434
5435       DECL_FIELD_CONTEXT (f_ovfl) = record;
5436       DECL_FIELD_CONTEXT (f_gtop) = record;
5437       DECL_FIELD_CONTEXT (f_ftop) = record;
5438       DECL_FIELD_CONTEXT (f_goff) = record;
5439       DECL_FIELD_CONTEXT (f_foff) = record;
5440       DECL_FIELD_CONTEXT (f_res) = record;
5441
5442       TYPE_FIELDS (record) = f_ovfl;
5443       TREE_CHAIN (f_ovfl) = f_gtop;
5444       TREE_CHAIN (f_gtop) = f_ftop;
5445       TREE_CHAIN (f_ftop) = f_goff;
5446       TREE_CHAIN (f_goff) = f_foff;
5447       TREE_CHAIN (f_foff) = f_res;
5448
5449       layout_type (record);
5450       return record;
5451     }
5452   else if (TARGET_IRIX && TARGET_IRIX6)
5453     /* On IRIX 6, this type is 'char *'.  */
5454     return build_pointer_type (char_type_node);
5455   else
5456     /* Otherwise, we use 'void *'.  */
5457     return ptr_type_node;
5458 }
5459
5460 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5461
5462 static void
5463 mips_va_start (tree valist, rtx nextarg)
5464 {
5465   if (EABI_FLOAT_VARARGS_P)
5466     {
5467       const CUMULATIVE_ARGS *cum;
5468       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5469       tree ovfl, gtop, ftop, goff, foff;
5470       tree t;
5471       int gpr_save_area_size;
5472       int fpr_save_area_size;
5473       int fpr_offset;
5474
5475       cum = &crtl->args.info;
5476       gpr_save_area_size
5477         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5478       fpr_save_area_size
5479         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5480
5481       f_ovfl = TYPE_FIELDS (va_list_type_node);
5482       f_gtop = TREE_CHAIN (f_ovfl);
5483       f_ftop = TREE_CHAIN (f_gtop);
5484       f_goff = TREE_CHAIN (f_ftop);
5485       f_foff = TREE_CHAIN (f_goff);
5486
5487       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5488                      NULL_TREE);
5489       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5490                      NULL_TREE);
5491       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5492                      NULL_TREE);
5493       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5494                      NULL_TREE);
5495       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5496                      NULL_TREE);
5497
5498       /* Emit code to initialize OVFL, which points to the next varargs
5499          stack argument.  CUM->STACK_WORDS gives the number of stack
5500          words used by named arguments.  */
5501       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5502       if (cum->stack_words > 0)
5503         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
5504                     size_int (cum->stack_words * UNITS_PER_WORD));
5505       t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5506       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5507
5508       /* Emit code to initialize GTOP, the top of the GPR save area.  */
5509       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5510       t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5511       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5512
5513       /* Emit code to initialize FTOP, the top of the FPR save area.
5514          This address is gpr_save_area_bytes below GTOP, rounded
5515          down to the next fp-aligned boundary.  */
5516       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5517       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5518       fpr_offset &= -UNITS_PER_FPVALUE;
5519       if (fpr_offset)
5520         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
5521                     size_int (-fpr_offset));
5522       t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5523       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5524
5525       /* Emit code to initialize GOFF, the offset from GTOP of the
5526          next GPR argument.  */
5527       t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5528                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5529       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5530
5531       /* Likewise emit code to initialize FOFF, the offset from FTOP
5532          of the next FPR argument.  */
5533       t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5534                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5535       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5536     }
5537   else
5538     {
5539       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
5540       std_expand_builtin_va_start (valist, nextarg);
5541     }
5542 }
5543
5544 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
5545
5546 static tree
5547 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5548                            gimple_seq *post_p)
5549 {
5550   tree addr;
5551   bool indirect_p;
5552
5553   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5554   if (indirect_p)
5555     type = build_pointer_type (type);
5556
5557   if (!EABI_FLOAT_VARARGS_P)
5558     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5559   else
5560     {
5561       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5562       tree ovfl, top, off, align;
5563       HOST_WIDE_INT size, rsize, osize;
5564       tree t, u;
5565
5566       f_ovfl = TYPE_FIELDS (va_list_type_node);
5567       f_gtop = TREE_CHAIN (f_ovfl);
5568       f_ftop = TREE_CHAIN (f_gtop);
5569       f_goff = TREE_CHAIN (f_ftop);
5570       f_foff = TREE_CHAIN (f_goff);
5571
5572       /* Let:
5573
5574          TOP be the top of the GPR or FPR save area;
5575          OFF be the offset from TOP of the next register;
5576          ADDR_RTX be the address of the argument;
5577          SIZE be the number of bytes in the argument type;
5578          RSIZE be the number of bytes used to store the argument
5579            when it's in the register save area; and
5580          OSIZE be the number of bytes used to store it when it's
5581            in the stack overflow area.
5582
5583          The code we want is:
5584
5585          1: off &= -rsize;        // round down
5586          2: if (off != 0)
5587          3:   {
5588          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
5589          5:     off -= rsize;
5590          6:   }
5591          7: else
5592          8:   {
5593          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
5594          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
5595          11:    ovfl += osize;
5596          14:  }
5597
5598          [1] and [9] can sometimes be optimized away.  */
5599
5600       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5601                      NULL_TREE);
5602       size = int_size_in_bytes (type);
5603
5604       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
5605           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
5606         {
5607           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
5608                         unshare_expr (valist), f_ftop, NULL_TREE);
5609           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
5610                         unshare_expr (valist), f_foff, NULL_TREE);
5611
5612           /* When va_start saves FPR arguments to the stack, each slot
5613              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
5614              argument's precision.  */
5615           rsize = UNITS_PER_HWFPVALUE;
5616
5617           /* Overflow arguments are padded to UNITS_PER_WORD bytes
5618              (= PARM_BOUNDARY bits).  This can be different from RSIZE
5619              in two cases:
5620
5621              (1) On 32-bit targets when TYPE is a structure such as:
5622
5623              struct s { float f; };
5624
5625              Such structures are passed in paired FPRs, so RSIZE
5626              will be 8 bytes.  However, the structure only takes
5627              up 4 bytes of memory, so OSIZE will only be 4.
5628
5629              (2) In combinations such as -mgp64 -msingle-float
5630              -fshort-double.  Doubles passed in registers will then take
5631              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
5632              stack take up UNITS_PER_WORD bytes.  */
5633           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
5634         }
5635       else
5636         {
5637           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
5638                         unshare_expr (valist), f_gtop, NULL_TREE);
5639           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
5640                         unshare_expr (valist), f_goff, NULL_TREE);
5641           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5642           if (rsize > UNITS_PER_WORD)
5643             {
5644               /* [1] Emit code for: off &= -rsize.      */
5645               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
5646                           build_int_cst (TREE_TYPE (off), -rsize));
5647               gimplify_assign (unshare_expr (off), t, pre_p);
5648             }
5649           osize = rsize;
5650         }
5651
5652       /* [2] Emit code to branch if off == 0.  */
5653       t = build2 (NE_EXPR, boolean_type_node, off,
5654                   build_int_cst (TREE_TYPE (off), 0));
5655       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
5656
5657       /* [5] Emit code for: off -= rsize.  We do this as a form of
5658          post-decrement not available to C.  */
5659       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
5660       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
5661
5662       /* [4] Emit code for:
5663          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
5664       t = fold_convert (sizetype, t);
5665       t = fold_build1 (NEGATE_EXPR, sizetype, t);
5666       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
5667       if (BYTES_BIG_ENDIAN && rsize > size)
5668         {
5669           u = size_int (rsize - size);
5670           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5671         }
5672       COND_EXPR_THEN (addr) = t;
5673
5674       if (osize > UNITS_PER_WORD)
5675         {
5676           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
5677           u = size_int (osize - 1);
5678           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
5679                       unshare_expr (ovfl), u);
5680           t = fold_convert (sizetype, t);
5681           u = size_int (-osize);
5682           t = build2 (BIT_AND_EXPR, sizetype, t, u);
5683           t = fold_convert (TREE_TYPE (ovfl), t);
5684           align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
5685                           unshare_expr (ovfl), t);
5686         }
5687       else
5688         align = NULL;
5689
5690       /* [10, 11] Emit code for:
5691          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
5692          ovfl += osize.  */
5693       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
5694       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5695       if (BYTES_BIG_ENDIAN && osize > size)
5696         {
5697           u = size_int (osize - size);
5698           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5699         }
5700
5701       /* String [9] and [10, 11] together.  */
5702       if (align)
5703         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5704       COND_EXPR_ELSE (addr) = t;
5705
5706       addr = fold_convert (build_pointer_type (type), addr);
5707       addr = build_va_arg_indirect_ref (addr);
5708     }
5709
5710   if (indirect_p)
5711     addr = build_va_arg_indirect_ref (addr);
5712
5713   return addr;
5714 }
5715 \f
5716 /* Start a definition of function NAME.  MIPS16_P indicates whether the
5717    function contains MIPS16 code.  */
5718
5719 static void
5720 mips_start_function_definition (const char *name, bool mips16_p)
5721 {
5722   if (mips16_p)
5723     fprintf (asm_out_file, "\t.set\tmips16\n");
5724   else
5725     fprintf (asm_out_file, "\t.set\tnomips16\n");
5726
5727   if (!flag_inhibit_size_directive)
5728     {
5729       fputs ("\t.ent\t", asm_out_file);
5730       assemble_name (asm_out_file, name);
5731       fputs ("\n", asm_out_file);
5732     }
5733
5734   ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
5735
5736   /* Start the definition proper.  */
5737   assemble_name (asm_out_file, name);
5738   fputs (":\n", asm_out_file);
5739 }
5740
5741 /* End a function definition started by mips_start_function_definition.  */
5742
5743 static void
5744 mips_end_function_definition (const char *name)
5745 {
5746   if (!flag_inhibit_size_directive)
5747     {
5748       fputs ("\t.end\t", asm_out_file);
5749       assemble_name (asm_out_file, name);
5750       fputs ("\n", asm_out_file);
5751     }
5752 }
5753 \f
5754 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5755
5756 static bool
5757 mips_ok_for_lazy_binding_p (rtx x)
5758 {
5759   return (TARGET_USE_GOT
5760           && GET_CODE (x) == SYMBOL_REF
5761           && !SYMBOL_REF_BIND_NOW_P (x)
5762           && !mips_symbol_binds_local_p (x));
5763 }
5764
5765 /* Load function address ADDR into register DEST.  TYPE is as for
5766    mips_expand_call.  Return true if we used an explicit lazy-binding
5767    sequence.  */
5768
5769 static bool
5770 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
5771 {
5772   /* If we're generating PIC, and this call is to a global function,
5773      try to allow its address to be resolved lazily.  This isn't
5774      possible for sibcalls when $gp is call-saved because the value
5775      of $gp on entry to the stub would be our caller's gp, not ours.  */
5776   if (TARGET_EXPLICIT_RELOCS
5777       && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
5778       && mips_ok_for_lazy_binding_p (addr))
5779     {
5780       addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
5781       emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
5782       return true;
5783     }
5784   else
5785     {
5786       mips_emit_move (dest, addr);
5787       return false;
5788     }
5789 }
5790 \f
5791 /* Each locally-defined hard-float MIPS16 function has a local symbol
5792    associated with it.  This hash table maps the function symbol (FUNC)
5793    to the local symbol (LOCAL). */
5794 struct GTY(()) mips16_local_alias {
5795   rtx func;
5796   rtx local;
5797 };
5798 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
5799
5800 /* Hash table callbacks for mips16_local_aliases.  */
5801
5802 static hashval_t
5803 mips16_local_aliases_hash (const void *entry)
5804 {
5805   const struct mips16_local_alias *alias;
5806
5807   alias = (const struct mips16_local_alias *) entry;
5808   return htab_hash_string (XSTR (alias->func, 0));
5809 }
5810
5811 static int
5812 mips16_local_aliases_eq (const void *entry1, const void *entry2)
5813 {
5814   const struct mips16_local_alias *alias1, *alias2;
5815
5816   alias1 = (const struct mips16_local_alias *) entry1;
5817   alias2 = (const struct mips16_local_alias *) entry2;
5818   return rtx_equal_p (alias1->func, alias2->func);
5819 }
5820
5821 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
5822    Return a local alias for it, creating a new one if necessary.  */
5823
5824 static rtx
5825 mips16_local_alias (rtx func)
5826 {
5827   struct mips16_local_alias *alias, tmp_alias;
5828   void **slot;
5829
5830   /* Create the hash table if this is the first call.  */
5831   if (mips16_local_aliases == NULL)
5832     mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
5833                                             mips16_local_aliases_eq, NULL);
5834
5835   /* Look up the function symbol, creating a new entry if need be.  */
5836   tmp_alias.func = func;
5837   slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
5838   gcc_assert (slot != NULL);
5839
5840   alias = (struct mips16_local_alias *) *slot;
5841   if (alias == NULL)
5842     {
5843       const char *func_name, *local_name;
5844       rtx local;
5845
5846       /* Create a new SYMBOL_REF for the local symbol.  The choice of
5847          __fn_local_* is based on the __fn_stub_* names that we've
5848          traditionally used for the non-MIPS16 stub.  */
5849       func_name = targetm.strip_name_encoding (XSTR (func, 0));
5850       local_name = ACONCAT (("__fn_local_", func_name, NULL));
5851       local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
5852       SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
5853
5854       /* Create a new structure to represent the mapping.  */
5855       alias = GGC_NEW (struct mips16_local_alias);
5856       alias->func = func;
5857       alias->local = local;
5858       *slot = alias;
5859     }
5860   return alias->local;
5861 }
5862 \f
5863 /* A chained list of functions for which mips16_build_call_stub has already
5864    generated a stub.  NAME is the name of the function and FP_RET_P is true
5865    if the function returns a value in floating-point registers.  */
5866 struct mips16_stub {
5867   struct mips16_stub *next;
5868   char *name;
5869   bool fp_ret_p;
5870 };
5871 static struct mips16_stub *mips16_stubs;
5872
5873 /* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
5874
5875 static rtx
5876 mips16_stub_function (const char *name)
5877 {
5878   rtx x;
5879
5880   x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
5881   SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
5882   return x;
5883 }
5884
5885 /* Return the two-character string that identifies floating-point
5886    return mode MODE in the name of a MIPS16 function stub.  */
5887
5888 static const char *
5889 mips16_call_stub_mode_suffix (enum machine_mode mode)
5890 {
5891   if (mode == SFmode)
5892     return "sf";
5893   else if (mode == DFmode)
5894     return "df";
5895   else if (mode == SCmode)
5896     return "sc";
5897   else if (mode == DCmode)
5898     return "dc";
5899   else if (mode == V2SFmode)
5900     return "df";
5901   else
5902     gcc_unreachable ();
5903 }
5904
5905 /* Write instructions to move a 32-bit value between general register
5906    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5907    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5908
5909 static void
5910 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5911 {
5912   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5913            reg_names[gpreg], reg_names[fpreg]);
5914 }
5915
5916 /* Likewise for 64-bit values.  */
5917
5918 static void
5919 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5920 {
5921   if (TARGET_64BIT)
5922     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5923              reg_names[gpreg], reg_names[fpreg]);
5924   else if (TARGET_FLOAT64)
5925     {
5926       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5927                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5928       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5929                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5930     }
5931   else
5932     {
5933       /* Move the least-significant word.  */
5934       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5935                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5936       /* ...then the most significant word.  */
5937       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5938                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
5939     }
5940 }
5941
5942 /* Write out code to move floating-point arguments into or out of
5943    general registers.  FP_CODE is the code describing which arguments
5944    are present (see the comment above the definition of CUMULATIVE_ARGS
5945    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
5946
5947 static void
5948 mips_output_args_xfer (int fp_code, char direction)
5949 {
5950   unsigned int gparg, fparg, f;
5951   CUMULATIVE_ARGS cum;
5952
5953   /* This code only works for o32 and o64.  */
5954   gcc_assert (TARGET_OLDABI);
5955
5956   mips_init_cumulative_args (&cum, NULL);
5957
5958   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5959     {
5960       enum machine_mode mode;
5961       struct mips_arg_info info;
5962
5963       if ((f & 3) == 1)
5964         mode = SFmode;
5965       else if ((f & 3) == 2)
5966         mode = DFmode;
5967       else
5968         gcc_unreachable ();
5969
5970       mips_get_arg_info (&info, &cum, mode, NULL, true);
5971       gparg = mips_arg_regno (&info, false);
5972       fparg = mips_arg_regno (&info, true);
5973
5974       if (mode == SFmode)
5975         mips_output_32bit_xfer (direction, gparg, fparg);
5976       else
5977         mips_output_64bit_xfer (direction, gparg, fparg);
5978
5979       mips_function_arg_advance (&cum, mode, NULL, true);
5980     }
5981 }
5982
5983 /* Write a MIPS16 stub for the current function.  This stub is used
5984    for functions which take arguments in the floating-point registers.
5985    It is normal-mode code that moves the floating-point arguments
5986    into the general registers and then jumps to the MIPS16 code.  */
5987
5988 static void
5989 mips16_build_function_stub (void)
5990 {
5991   const char *fnname, *alias_name, *separator;
5992   char *secname, *stubname;
5993   tree stubdecl;
5994   unsigned int f;
5995   rtx symbol, alias;
5996
5997   /* Create the name of the stub, and its unique section.  */
5998   symbol = XEXP (DECL_RTL (current_function_decl), 0);
5999   alias = mips16_local_alias (symbol);
6000
6001   fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6002   alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6003   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6004   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6005
6006   /* Build a decl for the stub.  */
6007   stubdecl = build_decl (BUILTINS_LOCATION,
6008                          FUNCTION_DECL, get_identifier (stubname),
6009                          build_function_type (void_type_node, NULL_TREE));
6010   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6011   DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6012                                        RESULT_DECL, NULL_TREE, void_type_node);
6013
6014   /* Output a comment.  */
6015   fprintf (asm_out_file, "\t# Stub function for %s (",
6016            current_function_name ());
6017   separator = "";
6018   for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6019     {
6020       fprintf (asm_out_file, "%s%s", separator,
6021                (f & 3) == 1 ? "float" : "double");
6022       separator = ", ";
6023     }
6024   fprintf (asm_out_file, ")\n");
6025
6026   /* Start the function definition.  */
6027   assemble_start_function (stubdecl, stubname);
6028   mips_start_function_definition (stubname, false);
6029
6030   /* If generating pic2 code, either set up the global pointer or
6031      switch to pic0.  */
6032   if (TARGET_ABICALLS_PIC2)
6033     {
6034       if (TARGET_ABSOLUTE_ABICALLS)
6035         fprintf (asm_out_file, "\t.option\tpic0\n");
6036       else
6037         {
6038           output_asm_insn ("%(.cpload\t%^%)", NULL);
6039           /* Emit an R_MIPS_NONE relocation to tell the linker what the
6040              target function is.  Use a local GOT access when loading the
6041              symbol, to cut down on the number of unnecessary GOT entries
6042              for stubs that aren't needed.  */
6043           output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6044           symbol = alias;
6045         }
6046     }
6047
6048   /* Load the address of the MIPS16 function into $25.  Do this first so
6049      that targets with coprocessor interlocks can use an MFC1 to fill the
6050      delay slot.  */
6051   output_asm_insn ("la\t%^,%0", &symbol);
6052
6053   /* Move the arguments from floating-point registers to general registers.  */
6054   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6055
6056   /* Jump to the MIPS16 function.  */
6057   output_asm_insn ("jr\t%^", NULL);
6058
6059   if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6060     fprintf (asm_out_file, "\t.option\tpic2\n");
6061
6062   mips_end_function_definition (stubname);
6063
6064   /* If the linker needs to create a dynamic symbol for the target
6065      function, it will associate the symbol with the stub (which,
6066      unlike the target function, follows the proper calling conventions).
6067      It is therefore useful to have a local alias for the target function,
6068      so that it can still be identified as MIPS16 code.  As an optimization,
6069      this symbol can also be used for indirect MIPS16 references from
6070      within this file.  */
6071   ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6072
6073   switch_to_section (function_section (current_function_decl));
6074 }
6075
6076 /* The current function is a MIPS16 function that returns a value in an FPR.
6077    Copy the return value from its soft-float to its hard-float location.
6078    libgcc2 has special non-MIPS16 helper functions for each case.  */
6079
6080 static void
6081 mips16_copy_fpr_return_value (void)
6082 {
6083   rtx fn, insn, retval;
6084   tree return_type;
6085   enum machine_mode return_mode;
6086   const char *name;
6087
6088   return_type = DECL_RESULT (current_function_decl);
6089   return_mode = DECL_MODE (return_type);
6090
6091   name = ACONCAT (("__mips16_ret_",
6092                    mips16_call_stub_mode_suffix (return_mode),
6093                    NULL));
6094   fn = mips16_stub_function (name);
6095
6096   /* The function takes arguments in $2 (and possibly $3), so calls
6097      to it cannot be lazily bound.  */
6098   SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6099
6100   /* Model the call as something that takes the GPR return value as
6101      argument and returns an "updated" value.  */
6102   retval = gen_rtx_REG (return_mode, GP_RETURN);
6103   insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6104                            const0_rtx, NULL_RTX, false);
6105   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6106 }
6107
6108 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6109    RETVAL is the location of the return value, or null if this is
6110    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
6111    arguments and FP_CODE is the code built by mips_function_arg;
6112    see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6113
6114    There are three alternatives:
6115
6116    - If a stub was needed, emit the call and return the call insn itself.
6117
6118    - If we can avoid using a stub by redirecting the call, set *FN_PTR
6119      to the new target and return null.
6120
6121    - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6122      unmodified.
6123
6124    A stub is needed for calls to functions that, in normal mode,
6125    receive arguments in FPRs or return values in FPRs.  The stub
6126    copies the arguments from their soft-float positions to their
6127    hard-float positions, calls the real function, then copies the
6128    return value from its hard-float position to its soft-float
6129    position.
6130
6131    We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6132    If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6133    automatically redirects the JAL to the stub, otherwise the JAL
6134    continues to call FN directly.  */
6135
6136 static rtx
6137 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6138 {
6139   const char *fnname;
6140   bool fp_ret_p;
6141   struct mips16_stub *l;
6142   rtx insn, fn;
6143
6144   /* We don't need to do anything if we aren't in MIPS16 mode, or if
6145      we were invoked with the -msoft-float option.  */
6146   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6147     return NULL_RTX;
6148
6149   /* Figure out whether the value might come back in a floating-point
6150      register.  */
6151   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6152
6153   /* We don't need to do anything if there were no floating-point
6154      arguments and the value will not be returned in a floating-point
6155      register.  */
6156   if (fp_code == 0 && !fp_ret_p)
6157     return NULL_RTX;
6158
6159   /* We don't need to do anything if this is a call to a special
6160      MIPS16 support function.  */
6161   fn = *fn_ptr;
6162   if (mips16_stub_function_p (fn))
6163     return NULL_RTX;
6164
6165   /* This code will only work for o32 and o64 abis.  The other ABI's
6166      require more sophisticated support.  */
6167   gcc_assert (TARGET_OLDABI);
6168
6169   /* If we're calling via a function pointer, use one of the magic
6170      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6171      Each stub expects the function address to arrive in register $2.  */
6172   if (GET_CODE (fn) != SYMBOL_REF
6173       || !call_insn_operand (fn, VOIDmode))
6174     {
6175       char buf[30];
6176       rtx stub_fn, insn, addr;
6177       bool lazy_p;
6178
6179       /* If this is a locally-defined and locally-binding function,
6180          avoid the stub by calling the local alias directly.  */
6181       if (mips16_local_function_p (fn))
6182         {
6183           *fn_ptr = mips16_local_alias (fn);
6184           return NULL_RTX;
6185         }
6186
6187       /* Create a SYMBOL_REF for the libgcc.a function.  */
6188       if (fp_ret_p)
6189         sprintf (buf, "__mips16_call_stub_%s_%d",
6190                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
6191                  fp_code);
6192       else
6193         sprintf (buf, "__mips16_call_stub_%d", fp_code);
6194       stub_fn = mips16_stub_function (buf);
6195
6196       /* The function uses $2 as an argument, so calls to it
6197          cannot be lazily bound.  */
6198       SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6199
6200       /* Load the target function into $2.  */
6201       addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6202       lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6203
6204       /* Emit the call.  */
6205       insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6206                                args_size, NULL_RTX, lazy_p);
6207
6208       /* Tell GCC that this call does indeed use the value of $2.  */
6209       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6210
6211       /* If we are handling a floating-point return value, we need to
6212          save $18 in the function prologue.  Putting a note on the
6213          call will mean that df_regs_ever_live_p ($18) will be true if the
6214          call is not eliminated, and we can check that in the prologue
6215          code.  */
6216       if (fp_ret_p)
6217         CALL_INSN_FUNCTION_USAGE (insn) =
6218           gen_rtx_EXPR_LIST (VOIDmode,
6219                              gen_rtx_CLOBBER (VOIDmode,
6220                                               gen_rtx_REG (word_mode, 18)),
6221                              CALL_INSN_FUNCTION_USAGE (insn));
6222
6223       return insn;
6224     }
6225
6226   /* We know the function we are going to call.  If we have already
6227      built a stub, we don't need to do anything further.  */
6228   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6229   for (l = mips16_stubs; l != NULL; l = l->next)
6230     if (strcmp (l->name, fnname) == 0)
6231       break;
6232
6233   if (l == NULL)
6234     {
6235       const char *separator;
6236       char *secname, *stubname;
6237       tree stubid, stubdecl;
6238       unsigned int f;
6239
6240       /* If the function does not return in FPRs, the special stub
6241          section is named
6242              .mips16.call.FNNAME
6243
6244          If the function does return in FPRs, the stub section is named
6245              .mips16.call.fp.FNNAME
6246
6247          Build a decl for the stub.  */
6248       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6249                           fnname, NULL));
6250       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6251                            fnname, NULL));
6252       stubid = get_identifier (stubname);
6253       stubdecl = build_decl (BUILTINS_LOCATION,
6254                              FUNCTION_DECL, stubid,
6255                              build_function_type (void_type_node, NULL_TREE));
6256       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6257       DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6258                                            RESULT_DECL, NULL_TREE,
6259                                            void_type_node);
6260
6261       /* Output a comment.  */
6262       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6263                (fp_ret_p
6264                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6265                 : ""),
6266                fnname);
6267       separator = "";
6268       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6269         {
6270           fprintf (asm_out_file, "%s%s", separator,
6271                    (f & 3) == 1 ? "float" : "double");
6272           separator = ", ";
6273         }
6274       fprintf (asm_out_file, ")\n");
6275
6276       /* Start the function definition.  */
6277       assemble_start_function (stubdecl, stubname);
6278       mips_start_function_definition (stubname, false);
6279
6280       if (!fp_ret_p)
6281         {
6282           /* Load the address of the MIPS16 function into $25.  Do this
6283              first so that targets with coprocessor interlocks can use
6284              an MFC1 to fill the delay slot.  */
6285           if (TARGET_EXPLICIT_RELOCS)
6286             {
6287               output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6288               output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6289             }
6290           else
6291             output_asm_insn ("la\t%^,%0", &fn);
6292         }
6293
6294       /* Move the arguments from general registers to floating-point
6295          registers.  */
6296       mips_output_args_xfer (fp_code, 't');
6297
6298       if (!fp_ret_p)
6299         {
6300           /* Jump to the previously-loaded address.  */
6301           output_asm_insn ("jr\t%^", NULL);
6302         }
6303       else
6304         {
6305           /* Save the return address in $18 and call the non-MIPS16 function.
6306              The stub's caller knows that $18 might be clobbered, even though
6307              $18 is usually a call-saved register.  */
6308           fprintf (asm_out_file, "\tmove\t%s,%s\n",
6309                    reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6310           output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6311
6312           /* Move the result from floating-point registers to
6313              general registers.  */
6314           switch (GET_MODE (retval))
6315             {
6316             case SCmode:
6317               mips_output_32bit_xfer ('f', GP_RETURN + 1,
6318                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6319               /* Fall though.  */
6320             case SFmode:
6321               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6322               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6323                 {
6324                   /* On 64-bit targets, complex floats are returned in
6325                      a single GPR, such that "sd" on a suitably-aligned
6326                      target would store the value correctly.  */
6327                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6328                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6329                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6330                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6331                            reg_names[GP_RETURN],
6332                            reg_names[GP_RETURN],
6333                            reg_names[GP_RETURN + 1]);
6334                 }
6335               break;
6336
6337             case DCmode:
6338               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6339                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6340               /* Fall though.  */
6341             case DFmode:
6342             case V2SFmode:
6343               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6344               break;
6345
6346             default:
6347               gcc_unreachable ();
6348             }
6349           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6350         }
6351
6352 #ifdef ASM_DECLARE_FUNCTION_SIZE
6353       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6354 #endif
6355
6356       mips_end_function_definition (stubname);
6357
6358       /* Record this stub.  */
6359       l = XNEW (struct mips16_stub);
6360       l->name = xstrdup (fnname);
6361       l->fp_ret_p = fp_ret_p;
6362       l->next = mips16_stubs;
6363       mips16_stubs = l;
6364     }
6365
6366   /* If we expect a floating-point return value, but we've built a
6367      stub which does not expect one, then we're in trouble.  We can't
6368      use the existing stub, because it won't handle the floating-point
6369      value.  We can't build a new stub, because the linker won't know
6370      which stub to use for the various calls in this object file.
6371      Fortunately, this case is illegal, since it means that a function
6372      was declared in two different ways in a single compilation.  */
6373   if (fp_ret_p && !l->fp_ret_p)
6374     error ("cannot handle inconsistent calls to %qs", fnname);
6375
6376   if (retval == NULL_RTX)
6377     insn = gen_call_internal_direct (fn, args_size);
6378   else
6379     insn = gen_call_value_internal_direct (retval, fn, args_size);
6380   insn = mips_emit_call_insn (insn, fn, fn, false);
6381
6382   /* If we are calling a stub which handles a floating-point return
6383      value, we need to arrange to save $18 in the prologue.  We do this
6384      by marking the function call as using the register.  The prologue
6385      will later see that it is used, and emit code to save it.  */
6386   if (fp_ret_p)
6387     CALL_INSN_FUNCTION_USAGE (insn) =
6388       gen_rtx_EXPR_LIST (VOIDmode,
6389                          gen_rtx_CLOBBER (VOIDmode,
6390                                           gen_rtx_REG (word_mode, 18)),
6391                          CALL_INSN_FUNCTION_USAGE (insn));
6392
6393   return insn;
6394 }
6395 \f
6396 /* Expand a call of type TYPE.  RESULT is where the result will go (null
6397    for "call"s and "sibcall"s), ADDR is the address of the function,
6398    ARGS_SIZE is the size of the arguments and AUX is the value passed
6399    to us by mips_function_arg.  LAZY_P is true if this call already
6400    involves a lazily-bound function address (such as when calling
6401    functions through a MIPS16 hard-float stub).
6402
6403    Return the call itself.  */
6404
6405 rtx
6406 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6407                   rtx args_size, rtx aux, bool lazy_p)
6408 {
6409   rtx orig_addr, pattern, insn;
6410   int fp_code;
6411
6412   fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6413   insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6414   if (insn)
6415     {
6416       gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6417       return insn;
6418     }
6419                                  ;
6420   orig_addr = addr;
6421   if (!call_insn_operand (addr, VOIDmode))
6422     {
6423       if (type == MIPS_CALL_EPILOGUE)
6424         addr = MIPS_EPILOGUE_TEMP (Pmode);
6425       else
6426         addr = gen_reg_rtx (Pmode);
6427       lazy_p |= mips_load_call_address (type, addr, orig_addr);
6428     }
6429
6430   if (result == 0)
6431     {
6432       rtx (*fn) (rtx, rtx);
6433
6434       if (type == MIPS_CALL_SIBCALL)
6435         fn = gen_sibcall_internal;
6436       else
6437         fn = gen_call_internal;
6438
6439       pattern = fn (addr, args_size);
6440     }
6441   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6442     {
6443       /* Handle return values created by mips_return_fpr_pair.  */
6444       rtx (*fn) (rtx, rtx, rtx, rtx);
6445       rtx reg1, reg2;
6446
6447       if (type == MIPS_CALL_SIBCALL)
6448         fn = gen_sibcall_value_multiple_internal;
6449       else
6450         fn = gen_call_value_multiple_internal;
6451
6452       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6453       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6454       pattern = fn (reg1, addr, args_size, reg2);
6455     }
6456   else
6457     {
6458       rtx (*fn) (rtx, rtx, rtx);
6459
6460       if (type == MIPS_CALL_SIBCALL)
6461         fn = gen_sibcall_value_internal;
6462       else
6463         fn = gen_call_value_internal;
6464
6465       /* Handle return values created by mips_return_fpr_single.  */
6466       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6467         result = XEXP (XVECEXP (result, 0, 0), 0);
6468       pattern = fn (result, addr, args_size);
6469     }
6470
6471   return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6472 }
6473
6474 /* Split call instruction INSN into a $gp-clobbering call and
6475    (where necessary) an instruction to restore $gp from its save slot.
6476    CALL_PATTERN is the pattern of the new call.  */
6477
6478 void
6479 mips_split_call (rtx insn, rtx call_pattern)
6480 {
6481   rtx new_insn;
6482
6483   new_insn = emit_call_insn (call_pattern);
6484   CALL_INSN_FUNCTION_USAGE (new_insn)
6485     = copy_rtx (CALL_INSN_FUNCTION_USAGE (insn));
6486   if (!find_reg_note (insn, REG_NORETURN, 0))
6487     /* Pick a temporary register that is suitable for both MIPS16 and
6488        non-MIPS16 code.  $4 and $5 are used for returning complex double
6489        values in soft-float code, so $6 is the first suitable candidate.  */
6490     mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6491 }
6492
6493 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
6494
6495 static bool
6496 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
6497 {
6498   if (!TARGET_SIBCALLS)
6499     return false;
6500
6501   /* Interrupt handlers need special epilogue code and therefore can't
6502      use sibcalls.  */
6503   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
6504     return false;
6505
6506   /* We can't do a sibcall if the called function is a MIPS16 function
6507      because there is no direct "jx" instruction equivalent to "jalx" to
6508      switch the ISA mode.  We only care about cases where the sibling
6509      and normal calls would both be direct.  */
6510   if (decl
6511       && mips_use_mips16_mode_p (decl)
6512       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6513     return false;
6514
6515   /* When -minterlink-mips16 is in effect, assume that non-locally-binding
6516      functions could be MIPS16 ones unless an attribute explicitly tells
6517      us otherwise.  */
6518   if (TARGET_INTERLINK_MIPS16
6519       && decl
6520       && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
6521       && !mips_nomips16_decl_p (decl)
6522       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6523     return false;
6524
6525   /* Otherwise OK.  */
6526   return true;
6527 }
6528 \f
6529 /* Emit code to move general operand SRC into condition-code
6530    register DEST given that SCRATCH is a scratch TFmode FPR.
6531    The sequence is:
6532
6533         FP1 = SRC
6534         FP2 = 0.0f
6535         DEST = FP2 < FP1
6536
6537    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
6538
6539 void
6540 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
6541 {
6542   rtx fp1, fp2;
6543
6544   /* Change the source to SFmode.  */
6545   if (MEM_P (src))
6546     src = adjust_address (src, SFmode, 0);
6547   else if (REG_P (src) || GET_CODE (src) == SUBREG)
6548     src = gen_rtx_REG (SFmode, true_regnum (src));
6549
6550   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
6551   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
6552
6553   mips_emit_move (copy_rtx (fp1), src);
6554   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
6555   emit_insn (gen_slt_sf (dest, fp2, fp1));
6556 }
6557 \f
6558 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
6559    Assume that the areas do not overlap.  */
6560
6561 static void
6562 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
6563 {
6564   HOST_WIDE_INT offset, delta;
6565   unsigned HOST_WIDE_INT bits;
6566   int i;
6567   enum machine_mode mode;
6568   rtx *regs;
6569
6570   /* Work out how many bits to move at a time.  If both operands have
6571      half-word alignment, it is usually better to move in half words.
6572      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
6573      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
6574      Otherwise move word-sized chunks.  */
6575   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
6576       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
6577     bits = BITS_PER_WORD / 2;
6578   else
6579     bits = BITS_PER_WORD;
6580
6581   mode = mode_for_size (bits, MODE_INT, 0);
6582   delta = bits / BITS_PER_UNIT;
6583
6584   /* Allocate a buffer for the temporary registers.  */
6585   regs = XALLOCAVEC (rtx, length / delta);
6586
6587   /* Load as many BITS-sized chunks as possible.  Use a normal load if
6588      the source has enough alignment, otherwise use left/right pairs.  */
6589   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6590     {
6591       regs[i] = gen_reg_rtx (mode);
6592       if (MEM_ALIGN (src) >= bits)
6593         mips_emit_move (regs[i], adjust_address (src, mode, offset));
6594       else
6595         {
6596           rtx part = adjust_address (src, BLKmode, offset);
6597           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
6598             gcc_unreachable ();
6599         }
6600     }
6601
6602   /* Copy the chunks to the destination.  */
6603   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6604     if (MEM_ALIGN (dest) >= bits)
6605       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
6606     else
6607       {
6608         rtx part = adjust_address (dest, BLKmode, offset);
6609         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
6610           gcc_unreachable ();
6611       }
6612
6613   /* Mop up any left-over bytes.  */
6614   if (offset < length)
6615     {
6616       src = adjust_address (src, BLKmode, offset);
6617       dest = adjust_address (dest, BLKmode, offset);
6618       move_by_pieces (dest, src, length - offset,
6619                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
6620     }
6621 }
6622
6623 /* Helper function for doing a loop-based block operation on memory
6624    reference MEM.  Each iteration of the loop will operate on LENGTH
6625    bytes of MEM.
6626
6627    Create a new base register for use within the loop and point it to
6628    the start of MEM.  Create a new memory reference that uses this
6629    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
6630
6631 static void
6632 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
6633                        rtx *loop_reg, rtx *loop_mem)
6634 {
6635   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
6636
6637   /* Although the new mem does not refer to a known location,
6638      it does keep up to LENGTH bytes of alignment.  */
6639   *loop_mem = change_address (mem, BLKmode, *loop_reg);
6640   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
6641 }
6642
6643 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
6644    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
6645    the memory regions do not overlap.  */
6646
6647 static void
6648 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
6649                       HOST_WIDE_INT bytes_per_iter)
6650 {
6651   rtx label, src_reg, dest_reg, final_src, test;
6652   HOST_WIDE_INT leftover;
6653
6654   leftover = length % bytes_per_iter;
6655   length -= leftover;
6656
6657   /* Create registers and memory references for use within the loop.  */
6658   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
6659   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
6660
6661   /* Calculate the value that SRC_REG should have after the last iteration
6662      of the loop.  */
6663   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
6664                                    0, 0, OPTAB_WIDEN);
6665
6666   /* Emit the start of the loop.  */
6667   label = gen_label_rtx ();
6668   emit_label (label);
6669
6670   /* Emit the loop body.  */
6671   mips_block_move_straight (dest, src, bytes_per_iter);
6672
6673   /* Move on to the next block.  */
6674   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
6675   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
6676
6677   /* Emit the loop condition.  */
6678   test = gen_rtx_NE (VOIDmode, src_reg, final_src);
6679   if (Pmode == DImode)
6680     emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
6681   else
6682     emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
6683
6684   /* Mop up any left-over bytes.  */
6685   if (leftover)
6686     mips_block_move_straight (dest, src, leftover);
6687 }
6688
6689 /* Expand a movmemsi instruction, which copies LENGTH bytes from
6690    memory reference SRC to memory reference DEST.  */
6691
6692 bool
6693 mips_expand_block_move (rtx dest, rtx src, rtx length)
6694 {
6695   if (CONST_INT_P (length))
6696     {
6697       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
6698         {
6699           mips_block_move_straight (dest, src, INTVAL (length));
6700           return true;
6701         }
6702       else if (optimize)
6703         {
6704           mips_block_move_loop (dest, src, INTVAL (length),
6705                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
6706           return true;
6707         }
6708     }
6709   return false;
6710 }
6711 \f
6712 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
6713
6714 void
6715 mips_expand_synci_loop (rtx begin, rtx end)
6716 {
6717   rtx inc, label, end_label, cmp_result, mask, length;
6718
6719   /* Create end_label.  */
6720   end_label = gen_label_rtx ();
6721
6722   /* Check if begin equals end.  */
6723   cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
6724   emit_jump_insn (gen_condjump (cmp_result, end_label));
6725
6726   /* Load INC with the cache line size (rdhwr INC,$1).  */
6727   inc = gen_reg_rtx (Pmode);
6728   emit_insn (Pmode == SImode
6729              ? gen_rdhwr_synci_step_si (inc)
6730              : gen_rdhwr_synci_step_di (inc));
6731
6732   /* Check if inc is 0.  */
6733   cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
6734   emit_jump_insn (gen_condjump (cmp_result, end_label));
6735
6736   /* Calculate mask.  */
6737   mask = mips_force_unary (Pmode, NEG, inc);
6738
6739   /* Mask out begin by mask.  */
6740   begin = mips_force_binary (Pmode, AND, begin, mask);
6741
6742   /* Calculate length.  */
6743   length = mips_force_binary (Pmode, MINUS, end, begin);
6744
6745   /* Loop back to here.  */
6746   label = gen_label_rtx ();
6747   emit_label (label);
6748
6749   emit_insn (gen_synci (begin));
6750
6751   /* Update length.  */
6752   mips_emit_binary (MINUS, length, length, inc);
6753
6754   /* Update begin.  */
6755   mips_emit_binary (PLUS, begin, begin, inc);
6756
6757   /* Check if length is greater than 0.  */
6758   cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
6759   emit_jump_insn (gen_condjump (cmp_result, label));
6760
6761   emit_label (end_label);
6762 }
6763 \f
6764 /* Expand a QI or HI mode atomic memory operation.
6765
6766    GENERATOR contains a pointer to the gen_* function that generates
6767    the SI mode underlying atomic operation using masks that we
6768    calculate.
6769
6770    RESULT is the return register for the operation.  Its value is NULL
6771    if unused.
6772
6773    MEM is the location of the atomic access.
6774
6775    OLDVAL is the first operand for the operation.
6776
6777    NEWVAL is the optional second operand for the operation.  Its value
6778    is NULL if unused.  */
6779
6780 void
6781 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
6782                          rtx result, rtx mem, rtx oldval, rtx newval)
6783 {
6784   rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
6785   rtx unshifted_mask_reg, mask, inverted_mask, si_op;
6786   rtx res = NULL;
6787   enum machine_mode mode;
6788
6789   mode = GET_MODE (mem);
6790
6791   /* Compute the address of the containing SImode value.  */
6792   orig_addr = force_reg (Pmode, XEXP (mem, 0));
6793   memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
6794                                   force_reg (Pmode, GEN_INT (-4)));
6795
6796   /* Create a memory reference for it.  */
6797   memsi = gen_rtx_MEM (SImode, memsi_addr);
6798   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
6799   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
6800
6801   /* Work out the byte offset of the QImode or HImode value,
6802      counting from the least significant byte.  */
6803   shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
6804   if (TARGET_BIG_ENDIAN)
6805     mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
6806
6807   /* Multiply by eight to convert the shift value from bytes to bits.  */
6808   mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
6809
6810   /* Make the final shift an SImode value, so that it can be used in
6811      SImode operations.  */
6812   shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
6813
6814   /* Set MASK to an inclusive mask of the QImode or HImode value.  */
6815   unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
6816   unshifted_mask_reg = force_reg (SImode, unshifted_mask);
6817   mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
6818
6819   /* Compute the equivalent exclusive mask.  */
6820   inverted_mask = gen_reg_rtx (SImode);
6821   emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
6822                           gen_rtx_NOT (SImode, mask)));
6823
6824   /* Shift the old value into place.  */
6825   if (oldval != const0_rtx)
6826     {
6827       oldval = convert_modes (SImode, mode, oldval, true);
6828       oldval = force_reg (SImode, oldval);
6829       oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
6830     }
6831
6832   /* Do the same for the new value.  */
6833   if (newval && newval != const0_rtx)
6834     {
6835       newval = convert_modes (SImode, mode, newval, true);
6836       newval = force_reg (SImode, newval);
6837       newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
6838     }
6839
6840   /* Do the SImode atomic access.  */
6841   if (result)
6842     res = gen_reg_rtx (SImode);
6843   if (newval)
6844     si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
6845   else if (result)
6846     si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
6847   else
6848     si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
6849
6850   emit_insn (si_op);
6851
6852   if (result)
6853     {
6854       /* Shift and convert the result.  */
6855       mips_emit_binary (AND, res, res, mask);
6856       mips_emit_binary (LSHIFTRT, res, res, shiftsi);
6857       mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
6858     }
6859 }
6860
6861 /* Return true if it is possible to use left/right accesses for a
6862    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
6863    returning true, update *OP, *LEFT and *RIGHT as follows:
6864
6865    *OP is a BLKmode reference to the whole field.
6866
6867    *LEFT is a QImode reference to the first byte if big endian or
6868    the last byte if little endian.  This address can be used in the
6869    left-side instructions (LWL, SWL, LDL, SDL).
6870
6871    *RIGHT is a QImode reference to the opposite end of the field and
6872    can be used in the patterning right-side instruction.  */
6873
6874 static bool
6875 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
6876                         rtx *left, rtx *right)
6877 {
6878   rtx first, last;
6879
6880   /* Check that the operand really is a MEM.  Not all the extv and
6881      extzv predicates are checked.  */
6882   if (!MEM_P (*op))
6883     return false;
6884
6885   /* Check that the size is valid.  */
6886   if (width != 32 && (!TARGET_64BIT || width != 64))
6887     return false;
6888
6889   /* We can only access byte-aligned values.  Since we are always passed
6890      a reference to the first byte of the field, it is not necessary to
6891      do anything with BITPOS after this check.  */
6892   if (bitpos % BITS_PER_UNIT != 0)
6893     return false;
6894
6895   /* Reject aligned bitfields: we want to use a normal load or store
6896      instead of a left/right pair.  */
6897   if (MEM_ALIGN (*op) >= width)
6898     return false;
6899
6900   /* Adjust *OP to refer to the whole field.  This also has the effect
6901      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
6902   *op = adjust_address (*op, BLKmode, 0);
6903   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
6904
6905   /* Get references to both ends of the field.  We deliberately don't
6906      use the original QImode *OP for FIRST since the new BLKmode one
6907      might have a simpler address.  */
6908   first = adjust_address (*op, QImode, 0);
6909   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
6910
6911   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
6912      correspond to the MSB and RIGHT to the LSB.  */
6913   if (TARGET_BIG_ENDIAN)
6914     *left = first, *right = last;
6915   else
6916     *left = last, *right = first;
6917
6918   return true;
6919 }
6920
6921 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
6922    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
6923    the operation is the equivalent of:
6924
6925       (set DEST (*_extract SRC WIDTH BITPOS))
6926
6927    Return true on success.  */
6928
6929 bool
6930 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
6931                                    HOST_WIDE_INT bitpos)
6932 {
6933   rtx left, right, temp;
6934
6935   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
6936      be a paradoxical word_mode subreg.  This is the only case in which
6937      we allow the destination to be larger than the source.  */
6938   if (GET_CODE (dest) == SUBREG
6939       && GET_MODE (dest) == DImode
6940       && GET_MODE (SUBREG_REG (dest)) == SImode)
6941     dest = SUBREG_REG (dest);
6942
6943   /* After the above adjustment, the destination must be the same
6944      width as the source.  */
6945   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
6946     return false;
6947
6948   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
6949     return false;
6950
6951   temp = gen_reg_rtx (GET_MODE (dest));
6952   if (GET_MODE (dest) == DImode)
6953     {
6954       emit_insn (gen_mov_ldl (temp, src, left));
6955       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
6956     }
6957   else
6958     {
6959       emit_insn (gen_mov_lwl (temp, src, left));
6960       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
6961     }
6962   return true;
6963 }
6964
6965 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
6966    BITPOS and SRC are the operands passed to the expander; the operation
6967    is the equivalent of:
6968
6969        (set (zero_extract DEST WIDTH BITPOS) SRC)
6970
6971    Return true on success.  */
6972
6973 bool
6974 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
6975                                     HOST_WIDE_INT bitpos)
6976 {
6977   rtx left, right;
6978   enum machine_mode mode;
6979
6980   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
6981     return false;
6982
6983   mode = mode_for_size (width, MODE_INT, 0);
6984   src = gen_lowpart (mode, src);
6985   if (mode == DImode)
6986     {
6987       emit_insn (gen_mov_sdl (dest, src, left));
6988       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
6989     }
6990   else
6991     {
6992       emit_insn (gen_mov_swl (dest, src, left));
6993       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
6994     }
6995   return true;
6996 }
6997
6998 /* Return true if X is a MEM with the same size as MODE.  */
6999
7000 bool
7001 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
7002 {
7003   rtx size;
7004
7005   if (!MEM_P (x))
7006     return false;
7007
7008   size = MEM_SIZE (x);
7009   return size && INTVAL (size) == GET_MODE_SIZE (mode);
7010 }
7011
7012 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7013    source of an "ext" instruction or the destination of an "ins"
7014    instruction.  OP must be a register operand and the following
7015    conditions must hold:
7016
7017      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7018      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7019      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7020
7021    Also reject lengths equal to a word as they are better handled
7022    by the move patterns.  */
7023
7024 bool
7025 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7026 {
7027   if (!ISA_HAS_EXT_INS
7028       || !register_operand (op, VOIDmode)
7029       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7030     return false;
7031
7032   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7033     return false;
7034
7035   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7036     return false;
7037
7038   return true;
7039 }
7040
7041 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7042    operation if MAXLEN is the maxium length of consecutive bits that
7043    can make up MASK.  MODE is the mode of the operation.  See
7044    mask_low_and_shift_len for the actual definition.  */
7045
7046 bool
7047 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
7048 {
7049   return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7050 }
7051
7052 /* Return true iff OP1 and OP2 are valid operands together for the
7053    *and<MODE>3 and *and<MODE>3_mips16 patterns.  For the cases to consider,
7054    see the table in the comment before the pattern.  */
7055
7056 bool
7057 and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7058 {
7059   return (memory_operand (op1, mode)
7060           ? and_load_operand (op2, mode)
7061           : and_reg_operand (op2, mode));
7062 }
7063
7064 /* The canonical form of a mask-low-and-shift-left operation is
7065    (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7066    cleared.  Thus we need to shift MASK to the right before checking if it
7067    is a valid mask value.  MODE is the mode of the operation.  If true
7068    return the length of the mask, otherwise return -1.  */
7069
7070 int
7071 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7072 {
7073   HOST_WIDE_INT shval;
7074
7075   shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7076   return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7077 }
7078 \f
7079 /* Return true if -msplit-addresses is selected and should be honored.
7080
7081    -msplit-addresses is a half-way house between explicit relocations
7082    and the traditional assembler macros.  It can split absolute 32-bit
7083    symbolic constants into a high/lo_sum pair but uses macros for other
7084    sorts of access.
7085
7086    Like explicit relocation support for REL targets, it relies
7087    on GNU extensions in the assembler and the linker.
7088
7089    Although this code should work for -O0, it has traditionally
7090    been treated as an optimization.  */
7091
7092 static bool
7093 mips_split_addresses_p (void)
7094 {
7095   return (TARGET_SPLIT_ADDRESSES
7096           && optimize
7097           && !TARGET_MIPS16
7098           && !flag_pic
7099           && !ABI_HAS_64BIT_SYMBOLS);
7100 }
7101
7102 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
7103
7104 static void
7105 mips_init_relocs (void)
7106 {
7107   memset (mips_split_p, '\0', sizeof (mips_split_p));
7108   memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7109   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7110   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7111
7112   if (ABI_HAS_64BIT_SYMBOLS)
7113     {
7114       if (TARGET_EXPLICIT_RELOCS)
7115         {
7116           mips_split_p[SYMBOL_64_HIGH] = true;
7117           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7118           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7119
7120           mips_split_p[SYMBOL_64_MID] = true;
7121           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7122           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7123
7124           mips_split_p[SYMBOL_64_LOW] = true;
7125           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7126           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7127
7128           mips_split_p[SYMBOL_ABSOLUTE] = true;
7129           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7130         }
7131     }
7132   else
7133     {
7134       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses_p () || TARGET_MIPS16)
7135         {
7136           mips_split_p[SYMBOL_ABSOLUTE] = true;
7137           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7138           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7139
7140           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
7141         }
7142     }
7143
7144   if (TARGET_MIPS16)
7145     {
7146       /* The high part is provided by a pseudo copy of $gp.  */
7147       mips_split_p[SYMBOL_GP_RELATIVE] = true;
7148       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7149     }
7150   else if (TARGET_EXPLICIT_RELOCS)
7151     /* Small data constants are kept whole until after reload,
7152        then lowered by mips_rewrite_small_data.  */
7153     mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7154
7155   if (TARGET_EXPLICIT_RELOCS)
7156     {
7157       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7158       if (TARGET_NEWABI)
7159         {
7160           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7161           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7162         }
7163       else
7164         {
7165           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7166           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7167         }
7168       if (TARGET_MIPS16)
7169         /* Expose the use of $28 as soon as possible.  */
7170         mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7171
7172       if (TARGET_XGOT)
7173         {
7174           /* The HIGH and LO_SUM are matched by special .md patterns.  */
7175           mips_split_p[SYMBOL_GOT_DISP] = true;
7176
7177           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7178           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7179           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7180
7181           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7182           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7183           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7184         }
7185       else
7186         {
7187           if (TARGET_NEWABI)
7188             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7189           else
7190             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7191           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7192           if (TARGET_MIPS16)
7193             /* Expose the use of $28 as soon as possible.  */
7194             mips_split_p[SYMBOL_GOT_DISP] = true;
7195         }
7196     }
7197
7198   if (TARGET_NEWABI)
7199     {
7200       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7201       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7202       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7203     }
7204
7205   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7206   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7207
7208   mips_split_p[SYMBOL_DTPREL] = true;
7209   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7210   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7211
7212   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7213
7214   mips_split_p[SYMBOL_TPREL] = true;
7215   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7216   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7217
7218   mips_lo_relocs[SYMBOL_HALF] = "%half(";
7219 }
7220
7221 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7222    in context CONTEXT.  RELOCS is the array of relocations to use.  */
7223
7224 static void
7225 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7226                           const char **relocs)
7227 {
7228   enum mips_symbol_type symbol_type;
7229   const char *p;
7230
7231   symbol_type = mips_classify_symbolic_expression (op, context);
7232   gcc_assert (relocs[symbol_type]);
7233
7234   fputs (relocs[symbol_type], file);
7235   output_addr_const (file, mips_strip_unspec_address (op));
7236   for (p = relocs[symbol_type]; *p != 0; p++)
7237     if (*p == '(')
7238       fputc (')', file);
7239 }
7240
7241 /* Start a new block with the given asm switch enabled.  If we need
7242    to print a directive, emit PREFIX before it and SUFFIX after it.  */
7243
7244 static void
7245 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7246                         const char *prefix, const char *suffix)
7247 {
7248   if (asm_switch->nesting_level == 0)
7249     fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7250   asm_switch->nesting_level++;
7251 }
7252
7253 /* Likewise, but end a block.  */
7254
7255 static void
7256 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7257                        const char *prefix, const char *suffix)
7258 {
7259   gcc_assert (asm_switch->nesting_level);
7260   asm_switch->nesting_level--;
7261   if (asm_switch->nesting_level == 0)
7262     fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7263 }
7264
7265 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7266    that either print a complete line or print nothing.  */
7267
7268 void
7269 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
7270 {
7271   mips_push_asm_switch_1 (asm_switch, "\t", "\n");
7272 }
7273
7274 void
7275 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
7276 {
7277   mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
7278 }
7279
7280 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
7281    The punctuation characters are:
7282
7283    '('  Start a nested ".set noreorder" block.
7284    ')'  End a nested ".set noreorder" block.
7285    '['  Start a nested ".set noat" block.
7286    ']'  End a nested ".set noat" block.
7287    '<'  Start a nested ".set nomacro" block.
7288    '>'  End a nested ".set nomacro" block.
7289    '*'  Behave like %(%< if generating a delayed-branch sequence.
7290    '#'  Print a nop if in a ".set noreorder" block.
7291    '/'  Like '#', but do nothing within a delayed-branch sequence.
7292    '?'  Print "l" if mips_branch_likely is true
7293    '~'  Print a nop if mips_branch_likely is true
7294    '.'  Print the name of the register with a hard-wired zero (zero or $0).
7295    '@'  Print the name of the assembler temporary register (at or $1).
7296    '^'  Print the name of the pic call-through register (t9 or $25).
7297    '+'  Print the name of the gp register (usually gp or $28).
7298    '$'  Print the name of the stack pointer register (sp or $29).
7299
7300    See also mips_init_print_operand_pucnt.  */
7301
7302 static void
7303 mips_print_operand_punctuation (FILE *file, int ch)
7304 {
7305   switch (ch)
7306     {
7307     case '(':
7308       mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
7309       break;
7310
7311     case ')':
7312       mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
7313       break;
7314
7315     case '[':
7316       mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
7317       break;
7318
7319     case ']':
7320       mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
7321       break;
7322
7323     case '<':
7324       mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
7325       break;
7326
7327     case '>':
7328       mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
7329       break;
7330
7331     case '*':
7332       if (final_sequence != 0)
7333         {
7334           mips_print_operand_punctuation (file, '(');
7335           mips_print_operand_punctuation (file, '<');
7336         }
7337       break;
7338
7339     case '#':
7340       if (mips_noreorder.nesting_level > 0)
7341         fputs ("\n\tnop", file);
7342       break;
7343
7344     case '/':
7345       /* Print an extra newline so that the delayed insn is separated
7346          from the following ones.  This looks neater and is consistent
7347          with non-nop delayed sequences.  */
7348       if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
7349         fputs ("\n\tnop\n", file);
7350       break;
7351
7352     case '?':
7353       if (mips_branch_likely)
7354         putc ('l', file);
7355       break;
7356
7357     case '~':
7358       if (mips_branch_likely)
7359         fputs ("\n\tnop", file);
7360       break;
7361
7362     case '.':
7363       fputs (reg_names[GP_REG_FIRST + 0], file);
7364       break;
7365
7366     case '@':
7367       fputs (reg_names[AT_REGNUM], file);
7368       break;
7369
7370     case '^':
7371       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7372       break;
7373
7374     case '+':
7375       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7376       break;
7377
7378     case '$':
7379       fputs (reg_names[STACK_POINTER_REGNUM], file);
7380       break;
7381
7382     default:
7383       gcc_unreachable ();
7384       break;
7385     }
7386 }
7387
7388 /* Initialize mips_print_operand_punct.  */
7389
7390 static void
7391 mips_init_print_operand_punct (void)
7392 {
7393   const char *p;
7394
7395   for (p = "()[]<>*#/?~.@^+$"; *p; p++)
7396     mips_print_operand_punct[(unsigned char) *p] = true;
7397 }
7398
7399 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
7400    associated with condition CODE.  Print the condition part of the
7401    opcode to FILE.  */
7402
7403 static void
7404 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
7405 {
7406   switch (code)
7407     {
7408     case EQ:
7409     case NE:
7410     case GT:
7411     case GE:
7412     case LT:
7413     case LE:
7414     case GTU:
7415     case GEU:
7416     case LTU:
7417     case LEU:
7418       /* Conveniently, the MIPS names for these conditions are the same
7419          as their RTL equivalents.  */
7420       fputs (GET_RTX_NAME (code), file);
7421       break;
7422
7423     default:
7424       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7425       break;
7426     }
7427 }
7428
7429 /* Likewise floating-point branches.  */
7430
7431 static void
7432 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
7433 {
7434   switch (code)
7435     {
7436     case EQ:
7437       fputs ("c1f", file);
7438       break;
7439
7440     case NE:
7441       fputs ("c1t", file);
7442       break;
7443
7444     default:
7445       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7446       break;
7447     }
7448 }
7449
7450 /* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
7451
7452    'X'  Print CONST_INT OP in hexadecimal format.
7453    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
7454    'd'  Print CONST_INT OP in decimal.
7455    'm'  Print one less than CONST_INT OP in decimal.
7456    'h'  Print the high-part relocation associated with OP, after stripping
7457           any outermost HIGH.
7458    'R'  Print the low-part relocation associated with OP.
7459    'C'  Print the integer branch condition for comparison OP.
7460    'N'  Print the inverse of the integer branch condition for comparison OP.
7461    'F'  Print the FPU branch condition for comparison OP.
7462    'W'  Print the inverse of the FPU branch condition for comparison OP.
7463    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
7464               'z' for (eq:?I ...), 'n' for (ne:?I ...).
7465    't'  Like 'T', but with the EQ/NE cases reversed
7466    'Y'  Print mips_fp_conditions[INTVAL (OP)]
7467    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
7468    'q'  Print a DSP accumulator register.
7469    'D'  Print the second part of a double-word register or memory operand.
7470    'L'  Print the low-order register in a double-word register operand.
7471    'M'  Print high-order register in a double-word register operand.
7472    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
7473
7474 void
7475 mips_print_operand (FILE *file, rtx op, int letter)
7476 {
7477   enum rtx_code code;
7478
7479   if (PRINT_OPERAND_PUNCT_VALID_P (letter))
7480     {
7481       mips_print_operand_punctuation (file, letter);
7482       return;
7483     }
7484
7485   gcc_assert (op);
7486   code = GET_CODE (op);
7487
7488   switch (letter)
7489     {
7490     case 'X':
7491       if (CONST_INT_P (op))
7492         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
7493       else
7494         output_operand_lossage ("invalid use of '%%%c'", letter);
7495       break;
7496
7497     case 'x':
7498       if (CONST_INT_P (op))
7499         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
7500       else
7501         output_operand_lossage ("invalid use of '%%%c'", letter);
7502       break;
7503
7504     case 'd':
7505       if (CONST_INT_P (op))
7506         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
7507       else
7508         output_operand_lossage ("invalid use of '%%%c'", letter);
7509       break;
7510
7511     case 'm':
7512       if (CONST_INT_P (op))
7513         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
7514       else
7515         output_operand_lossage ("invalid use of '%%%c'", letter);
7516       break;
7517
7518     case 'h':
7519       if (code == HIGH)
7520         op = XEXP (op, 0);
7521       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
7522       break;
7523
7524     case 'R':
7525       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
7526       break;
7527
7528     case 'C':
7529       mips_print_int_branch_condition (file, code, letter);
7530       break;
7531
7532     case 'N':
7533       mips_print_int_branch_condition (file, reverse_condition (code), letter);
7534       break;
7535
7536     case 'F':
7537       mips_print_float_branch_condition (file, code, letter);
7538       break;
7539
7540     case 'W':
7541       mips_print_float_branch_condition (file, reverse_condition (code),
7542                                          letter);
7543       break;
7544
7545     case 'T':
7546     case 't':
7547       {
7548         int truth = (code == NE) == (letter == 'T');
7549         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
7550       }
7551       break;
7552
7553     case 'Y':
7554       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
7555         fputs (mips_fp_conditions[UINTVAL (op)], file);
7556       else
7557         output_operand_lossage ("'%%%c' is not a valid operand prefix",
7558                                 letter);
7559       break;
7560
7561     case 'Z':
7562       if (ISA_HAS_8CC)
7563         {
7564           mips_print_operand (file, op, 0);
7565           fputc (',', file);
7566         }
7567       break;
7568
7569     case 'q':
7570       if (code == REG && MD_REG_P (REGNO (op)))
7571         fprintf (file, "$ac0");
7572       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
7573         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
7574       else
7575         output_operand_lossage ("invalid use of '%%%c'", letter);
7576       break;
7577
7578     default:
7579       switch (code)
7580         {
7581         case REG:
7582           {
7583             unsigned int regno = REGNO (op);
7584             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
7585                 || (letter == 'L' && TARGET_BIG_ENDIAN)
7586                 || letter == 'D')
7587               regno++;
7588             else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
7589               output_operand_lossage ("invalid use of '%%%c'", letter);
7590             /* We need to print $0 .. $31 for COP0 registers.  */
7591             if (COP0_REG_P (regno))
7592               fprintf (file, "$%s", &reg_names[regno][4]);
7593             else
7594               fprintf (file, "%s", reg_names[regno]);
7595           }
7596           break;
7597
7598         case MEM:
7599           if (letter == 'D')
7600             output_address (plus_constant (XEXP (op, 0), 4));
7601           else if (letter && letter != 'z')
7602             output_operand_lossage ("invalid use of '%%%c'", letter);
7603           else
7604             output_address (XEXP (op, 0));
7605           break;
7606
7607         default:
7608           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
7609             fputs (reg_names[GP_REG_FIRST], file);
7610           else if (letter && letter != 'z')
7611             output_operand_lossage ("invalid use of '%%%c'", letter);
7612           else if (CONST_GP_P (op))
7613             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
7614           else
7615             output_addr_const (file, mips_strip_unspec_address (op));
7616           break;
7617         }
7618     }
7619 }
7620
7621 /* Output address operand X to FILE.  */
7622
7623 void
7624 mips_print_operand_address (FILE *file, rtx x)
7625 {
7626   struct mips_address_info addr;
7627
7628   if (mips_classify_address (&addr, x, word_mode, true))
7629     switch (addr.type)
7630       {
7631       case ADDRESS_REG:
7632         mips_print_operand (file, addr.offset, 0);
7633         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7634         return;
7635
7636       case ADDRESS_LO_SUM:
7637         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
7638                                   mips_lo_relocs);
7639         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7640         return;
7641
7642       case ADDRESS_CONST_INT:
7643         output_addr_const (file, x);
7644         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
7645         return;
7646
7647       case ADDRESS_SYMBOLIC:
7648         output_addr_const (file, mips_strip_unspec_address (x));
7649         return;
7650       }
7651   gcc_unreachable ();
7652 }
7653 \f
7654 /* Implement TARGET_ENCODE_SECTION_INFO.  */
7655
7656 static void
7657 mips_encode_section_info (tree decl, rtx rtl, int first)
7658 {
7659   default_encode_section_info (decl, rtl, first);
7660
7661   if (TREE_CODE (decl) == FUNCTION_DECL)
7662     {
7663       rtx symbol = XEXP (rtl, 0);
7664       tree type = TREE_TYPE (decl);
7665
7666       /* Encode whether the symbol is short or long.  */
7667       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
7668           || mips_far_type_p (type))
7669         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
7670     }
7671 }
7672
7673 /* Implement TARGET_SELECT_RTX_SECTION.  */
7674
7675 static section *
7676 mips_select_rtx_section (enum machine_mode mode, rtx x,
7677                          unsigned HOST_WIDE_INT align)
7678 {
7679   /* ??? Consider using mergeable small data sections.  */
7680   if (mips_rtx_constant_in_small_data_p (mode))
7681     return get_named_section (NULL, ".sdata", 0);
7682
7683   return default_elf_select_rtx_section (mode, x, align);
7684 }
7685
7686 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7687
7688    The complication here is that, with the combination TARGET_ABICALLS
7689    && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
7690    absolute addresses, and should therefore not be included in the
7691    read-only part of a DSO.  Handle such cases by selecting a normal
7692    data section instead of a read-only one.  The logic apes that in
7693    default_function_rodata_section.  */
7694
7695 static section *
7696 mips_function_rodata_section (tree decl)
7697 {
7698   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
7699     return default_function_rodata_section (decl);
7700
7701   if (decl && DECL_SECTION_NAME (decl))
7702     {
7703       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7704       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7705         {
7706           char *rname = ASTRDUP (name);
7707           rname[14] = 'd';
7708           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7709         }
7710       else if (flag_function_sections
7711                && flag_data_sections
7712                && strncmp (name, ".text.", 6) == 0)
7713         {
7714           char *rname = ASTRDUP (name);
7715           memcpy (rname + 1, "data", 4);
7716           return get_section (rname, SECTION_WRITE, decl);
7717         }
7718     }
7719   return data_section;
7720 }
7721
7722 /* Implement TARGET_IN_SMALL_DATA_P.  */
7723
7724 static bool
7725 mips_in_small_data_p (const_tree decl)
7726 {
7727   unsigned HOST_WIDE_INT size;
7728
7729   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7730     return false;
7731
7732   /* We don't yet generate small-data references for -mabicalls
7733      or VxWorks RTP code.  See the related -G handling in
7734      mips_override_options.  */
7735   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
7736     return false;
7737
7738   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7739     {
7740       const char *name;
7741
7742       /* Reject anything that isn't in a known small-data section.  */
7743       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7744       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7745         return false;
7746
7747       /* If a symbol is defined externally, the assembler will use the
7748          usual -G rules when deciding how to implement macros.  */
7749       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
7750         return true;
7751     }
7752   else if (TARGET_EMBEDDED_DATA)
7753     {
7754       /* Don't put constants into the small data section: we want them
7755          to be in ROM rather than RAM.  */
7756       if (TREE_CODE (decl) != VAR_DECL)
7757         return false;
7758
7759       if (TREE_READONLY (decl)
7760           && !TREE_SIDE_EFFECTS (decl)
7761           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7762         return false;
7763     }
7764
7765   /* Enforce -mlocal-sdata.  */
7766   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
7767     return false;
7768
7769   /* Enforce -mextern-sdata.  */
7770   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
7771     {
7772       if (DECL_EXTERNAL (decl))
7773         return false;
7774       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
7775         return false;
7776     }
7777
7778   /* We have traditionally not treated zero-sized objects as small data,
7779      so this is now effectively part of the ABI.  */
7780   size = int_size_in_bytes (TREE_TYPE (decl));
7781   return size > 0 && size <= mips_small_data_threshold;
7782 }
7783
7784 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
7785    anchors for small data: the GP register acts as an anchor in that
7786    case.  We also don't want to use them for PC-relative accesses,
7787    where the PC acts as an anchor.  */
7788
7789 static bool
7790 mips_use_anchors_for_symbol_p (const_rtx symbol)
7791 {
7792   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
7793     {
7794     case SYMBOL_PC_RELATIVE:
7795     case SYMBOL_GP_RELATIVE:
7796       return false;
7797
7798     default:
7799       return default_use_anchors_for_symbol_p (symbol);
7800     }
7801 }
7802 \f
7803 /* The MIPS debug format wants all automatic variables and arguments
7804    to be in terms of the virtual frame pointer (stack pointer before
7805    any adjustment in the function), while the MIPS 3.0 linker wants
7806    the frame pointer to be the stack pointer after the initial
7807    adjustment.  So, we do the adjustment here.  The arg pointer (which
7808    is eliminated) points to the virtual frame pointer, while the frame
7809    pointer (which may be eliminated) points to the stack pointer after
7810    the initial adjustments.  */
7811
7812 HOST_WIDE_INT
7813 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
7814 {
7815   rtx offset2 = const0_rtx;
7816   rtx reg = eliminate_constant_term (addr, &offset2);
7817
7818   if (offset == 0)
7819     offset = INTVAL (offset2);
7820
7821   if (reg == stack_pointer_rtx
7822       || reg == frame_pointer_rtx
7823       || reg == hard_frame_pointer_rtx)
7824     {
7825       offset -= cfun->machine->frame.total_size;
7826       if (reg == hard_frame_pointer_rtx)
7827         offset += cfun->machine->frame.hard_frame_pointer_offset;
7828     }
7829
7830   /* sdbout_parms does not want this to crash for unrecognized cases.  */
7831 #if 0
7832   else if (reg != arg_pointer_rtx)
7833     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
7834                 addr);
7835 #endif
7836
7837   return offset;
7838 }
7839 \f
7840 /* Implement ASM_OUTPUT_EXTERNAL.  */
7841
7842 void
7843 mips_output_external (FILE *file, tree decl, const char *name)
7844 {
7845   default_elf_asm_output_external (file, decl, name);
7846
7847   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7848      set in order to avoid putting out names that are never really
7849      used. */
7850   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
7851     {
7852       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
7853         {
7854           /* When using assembler macros, emit .extern directives for
7855              all small-data externs so that the assembler knows how
7856              big they are.
7857
7858              In most cases it would be safe (though pointless) to emit
7859              .externs for other symbols too.  One exception is when an
7860              object is within the -G limit but declared by the user to
7861              be in a section other than .sbss or .sdata.  */
7862           fputs ("\t.extern\t", file);
7863           assemble_name (file, name);
7864           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
7865                    int_size_in_bytes (TREE_TYPE (decl)));
7866         }
7867       else if (TARGET_IRIX
7868                && mips_abi == ABI_32
7869                && TREE_CODE (decl) == FUNCTION_DECL)
7870         {
7871           /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
7872              `.global name .text' directive for every used but
7873              undefined function.  If we don't, the linker may perform
7874              an optimization (skipping over the insns that set $gp)
7875              when it is unsafe.  */
7876           fputs ("\t.globl ", file);
7877           assemble_name (file, name);
7878           fputs (" .text\n", file);
7879         }
7880     }
7881 }
7882
7883 /* Implement ASM_OUTPUT_SOURCE_FILENAME.  */
7884
7885 void
7886 mips_output_filename (FILE *stream, const char *name)
7887 {
7888   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
7889      directives.  */
7890   if (write_symbols == DWARF2_DEBUG)
7891     return;
7892   else if (mips_output_filename_first_time)
7893     {
7894       mips_output_filename_first_time = 0;
7895       num_source_filenames += 1;
7896       current_function_file = name;
7897       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7898       output_quoted_string (stream, name);
7899       putc ('\n', stream);
7900     }
7901   /* If we are emitting stabs, let dbxout.c handle this (except for
7902      the mips_output_filename_first_time case).  */
7903   else if (write_symbols == DBX_DEBUG)
7904     return;
7905   else if (name != current_function_file
7906            && strcmp (name, current_function_file) != 0)
7907     {
7908       num_source_filenames += 1;
7909       current_function_file = name;
7910       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7911       output_quoted_string (stream, name);
7912       putc ('\n', stream);
7913     }
7914 }
7915
7916 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
7917
7918 static void ATTRIBUTE_UNUSED
7919 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
7920 {
7921   switch (size)
7922     {
7923     case 4:
7924       fputs ("\t.dtprelword\t", file);
7925       break;
7926
7927     case 8:
7928       fputs ("\t.dtpreldword\t", file);
7929       break;
7930
7931     default:
7932       gcc_unreachable ();
7933     }
7934   output_addr_const (file, x);
7935   fputs ("+0x8000", file);
7936 }
7937
7938 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
7939
7940 static rtx
7941 mips_dwarf_register_span (rtx reg)
7942 {
7943   rtx high, low;
7944   enum machine_mode mode;
7945
7946   /* By default, GCC maps increasing register numbers to increasing
7947      memory locations, but paired FPRs are always little-endian,
7948      regardless of the prevailing endianness.  */
7949   mode = GET_MODE (reg);
7950   if (FP_REG_P (REGNO (reg))
7951       && TARGET_BIG_ENDIAN
7952       && MAX_FPRS_PER_FMT > 1
7953       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
7954     {
7955       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
7956       high = mips_subword (reg, true);
7957       low = mips_subword (reg, false);
7958       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
7959     }
7960
7961   return NULL_RTX;
7962 }
7963
7964 /* Implement ASM_OUTPUT_ASCII.  */
7965
7966 void
7967 mips_output_ascii (FILE *stream, const char *string, size_t len)
7968 {
7969   size_t i;
7970   int cur_pos;
7971
7972   cur_pos = 17;
7973   fprintf (stream, "\t.ascii\t\"");
7974   for (i = 0; i < len; i++)
7975     {
7976       int c;
7977
7978       c = (unsigned char) string[i];
7979       if (ISPRINT (c))
7980         {
7981           if (c == '\\' || c == '\"')
7982             {
7983               putc ('\\', stream);
7984               cur_pos++;
7985             }
7986           putc (c, stream);
7987           cur_pos++;
7988         }
7989       else
7990         {
7991           fprintf (stream, "\\%03o", c);
7992           cur_pos += 4;
7993         }
7994
7995       if (cur_pos > 72 && i+1 < len)
7996         {
7997           cur_pos = 17;
7998           fprintf (stream, "\"\n\t.ascii\t\"");
7999         }
8000     }
8001   fprintf (stream, "\"\n");
8002 }
8003
8004 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
8005    macros, mark the symbol as written so that mips_asm_output_external
8006    won't emit an .extern for it.  STREAM is the output file, NAME is the
8007    name of the symbol, INIT_STRING is the string that should be written
8008    before the symbol and FINAL_STRING is the string that should be
8009    written after it.  FINAL_STRING is a printf format that consumes the
8010    remaining arguments.  */
8011
8012 void
8013 mips_declare_object (FILE *stream, const char *name, const char *init_string,
8014                      const char *final_string, ...)
8015 {
8016   va_list ap;
8017
8018   fputs (init_string, stream);
8019   assemble_name (stream, name);
8020   va_start (ap, final_string);
8021   vfprintf (stream, final_string, ap);
8022   va_end (ap);
8023
8024   if (!TARGET_EXPLICIT_RELOCS)
8025     {
8026       tree name_tree = get_identifier (name);
8027       TREE_ASM_WRITTEN (name_tree) = 1;
8028     }
8029 }
8030
8031 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8032    NAME is the name of the object and ALIGN is the required alignment
8033    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
8034    alignment argument.  */
8035
8036 void
8037 mips_declare_common_object (FILE *stream, const char *name,
8038                             const char *init_string,
8039                             unsigned HOST_WIDE_INT size,
8040                             unsigned int align, bool takes_alignment_p)
8041 {
8042   if (!takes_alignment_p)
8043     {
8044       size += (align / BITS_PER_UNIT) - 1;
8045       size -= size % (align / BITS_PER_UNIT);
8046       mips_declare_object (stream, name, init_string,
8047                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8048     }
8049   else
8050     mips_declare_object (stream, name, init_string,
8051                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8052                          size, align / BITS_PER_UNIT);
8053 }
8054
8055 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
8056    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
8057
8058 void
8059 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8060                                  unsigned HOST_WIDE_INT size,
8061                                  unsigned int align)
8062 {
8063   /* If the target wants uninitialized const declarations in
8064      .rdata then don't put them in .comm.  */
8065   if (TARGET_EMBEDDED_DATA
8066       && TARGET_UNINIT_CONST_IN_RODATA
8067       && TREE_CODE (decl) == VAR_DECL
8068       && TREE_READONLY (decl)
8069       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8070     {
8071       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8072         targetm.asm_out.globalize_label (stream, name);
8073
8074       switch_to_section (readonly_data_section);
8075       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8076       mips_declare_object (stream, name, "",
8077                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8078                            size);
8079     }
8080   else
8081     mips_declare_common_object (stream, name, "\n\t.comm\t",
8082                                 size, align, true);
8083 }
8084
8085 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8086 extern int size_directive_output;
8087
8088 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
8089    definitions except that it uses mips_declare_object to emit the label.  */
8090
8091 void
8092 mips_declare_object_name (FILE *stream, const char *name,
8093                           tree decl ATTRIBUTE_UNUSED)
8094 {
8095 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8096   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8097 #endif
8098
8099   size_directive_output = 0;
8100   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8101     {
8102       HOST_WIDE_INT size;
8103
8104       size_directive_output = 1;
8105       size = int_size_in_bytes (TREE_TYPE (decl));
8106       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8107     }
8108
8109   mips_declare_object (stream, name, "", ":\n");
8110 }
8111
8112 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
8113
8114 void
8115 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8116 {
8117   const char *name;
8118
8119   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8120   if (!flag_inhibit_size_directive
8121       && DECL_SIZE (decl) != 0
8122       && !at_end
8123       && top_level
8124       && DECL_INITIAL (decl) == error_mark_node
8125       && !size_directive_output)
8126     {
8127       HOST_WIDE_INT size;
8128
8129       size_directive_output = 1;
8130       size = int_size_in_bytes (TREE_TYPE (decl));
8131       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8132     }
8133 }
8134 #endif
8135 \f
8136 /* Return the FOO in the name of the ".mdebug.FOO" section associated
8137    with the current ABI.  */
8138
8139 static const char *
8140 mips_mdebug_abi_name (void)
8141 {
8142   switch (mips_abi)
8143     {
8144     case ABI_32:
8145       return "abi32";
8146     case ABI_O64:
8147       return "abiO64";
8148     case ABI_N32:
8149       return "abiN32";
8150     case ABI_64:
8151       return "abi64";
8152     case ABI_EABI:
8153       return TARGET_64BIT ? "eabi64" : "eabi32";
8154     default:
8155       gcc_unreachable ();
8156     }
8157 }
8158
8159 /* Implement TARGET_ASM_FILE_START.  */
8160
8161 static void
8162 mips_file_start (void)
8163 {
8164   default_file_start ();
8165
8166   /* Generate a special section to describe the ABI switches used to
8167      produce the resultant binary.  This is unnecessary on IRIX and
8168      causes unwanted warnings from the native linker.  */
8169   if (!TARGET_IRIX)
8170     {
8171       /* Record the ABI itself.  Modern versions of binutils encode
8172          this information in the ELF header flags, but GDB needs the
8173          information in order to correctly debug binaries produced by
8174          older binutils.  See the function mips_gdbarch_init in
8175          gdb/mips-tdep.c.  */
8176       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8177                mips_mdebug_abi_name ());
8178
8179       /* There is no ELF header flag to distinguish long32 forms of the
8180          EABI from long64 forms.  Emit a special section to help tools
8181          such as GDB.  Do the same for o64, which is sometimes used with
8182          -mlong64.  */
8183       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8184         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8185                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8186
8187 #ifdef HAVE_AS_GNU_ATTRIBUTE
8188       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
8189                (TARGET_HARD_FLOAT_ABI
8190                 ? (TARGET_DOUBLE_FLOAT
8191                    ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
8192 #endif
8193     }
8194
8195   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
8196   if (TARGET_ABICALLS)
8197     {
8198       fprintf (asm_out_file, "\t.abicalls\n");
8199       if (TARGET_ABICALLS_PIC0)
8200         fprintf (asm_out_file, "\t.option\tpic0\n");
8201     }
8202
8203   if (flag_verbose_asm)
8204     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
8205              ASM_COMMENT_START,
8206              mips_small_data_threshold, mips_arch_info->name, mips_isa);
8207 }
8208 \f
8209 /* Make the last instruction frame-related and note that it performs
8210    the operation described by FRAME_PATTERN.  */
8211
8212 static void
8213 mips_set_frame_expr (rtx frame_pattern)
8214 {
8215   rtx insn;
8216
8217   insn = get_last_insn ();
8218   RTX_FRAME_RELATED_P (insn) = 1;
8219   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8220                                       frame_pattern,
8221                                       REG_NOTES (insn));
8222 }
8223
8224 /* Return a frame-related rtx that stores REG at MEM.
8225    REG must be a single register.  */
8226
8227 static rtx
8228 mips_frame_set (rtx mem, rtx reg)
8229 {
8230   rtx set;
8231
8232   /* If we're saving the return address register and the DWARF return
8233      address column differs from the hard register number, adjust the
8234      note reg to refer to the former.  */
8235   if (REGNO (reg) == RETURN_ADDR_REGNUM
8236       && DWARF_FRAME_RETURN_COLUMN != RETURN_ADDR_REGNUM)
8237     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
8238
8239   set = gen_rtx_SET (VOIDmode, mem, reg);
8240   RTX_FRAME_RELATED_P (set) = 1;
8241
8242   return set;
8243 }
8244 \f
8245 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
8246    mips16e_s2_s8_regs[X], it must also save the registers in indexes
8247    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
8248 static const unsigned char mips16e_s2_s8_regs[] = {
8249   30, 23, 22, 21, 20, 19, 18
8250 };
8251 static const unsigned char mips16e_a0_a3_regs[] = {
8252   4, 5, 6, 7
8253 };
8254
8255 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
8256    ordered from the uppermost in memory to the lowest in memory.  */
8257 static const unsigned char mips16e_save_restore_regs[] = {
8258   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
8259 };
8260
8261 /* Return the index of the lowest X in the range [0, SIZE) for which
8262    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
8263
8264 static unsigned int
8265 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
8266                              unsigned int size)
8267 {
8268   unsigned int i;
8269
8270   for (i = 0; i < size; i++)
8271     if (BITSET_P (mask, regs[i]))
8272       break;
8273
8274   return i;
8275 }
8276
8277 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
8278    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
8279    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
8280    is true for all indexes (X, SIZE).  */
8281
8282 static void
8283 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
8284                         unsigned int size, unsigned int *num_regs_ptr)
8285 {
8286   unsigned int i;
8287
8288   i = mips16e_find_first_register (*mask_ptr, regs, size);
8289   for (i++; i < size; i++)
8290     if (!BITSET_P (*mask_ptr, regs[i]))
8291       {
8292         *num_regs_ptr += 1;
8293         *mask_ptr |= 1 << regs[i];
8294       }
8295 }
8296
8297 /* Return a simplified form of X using the register values in REG_VALUES.
8298    REG_VALUES[R] is the last value assigned to hard register R, or null
8299    if R has not been modified.
8300
8301    This function is rather limited, but is good enough for our purposes.  */
8302
8303 static rtx
8304 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
8305 {
8306   x = avoid_constant_pool_reference (x);
8307
8308   if (UNARY_P (x))
8309     {
8310       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8311       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
8312                                  x0, GET_MODE (XEXP (x, 0)));
8313     }
8314
8315   if (ARITHMETIC_P (x))
8316     {
8317       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8318       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
8319       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
8320     }
8321
8322   if (REG_P (x)
8323       && reg_values[REGNO (x)]
8324       && !rtx_unstable_p (reg_values[REGNO (x)]))
8325     return reg_values[REGNO (x)];
8326
8327   return x;
8328 }
8329
8330 /* Return true if (set DEST SRC) stores an argument register into its
8331    caller-allocated save slot, storing the number of that argument
8332    register in *REGNO_PTR if so.  REG_VALUES is as for
8333    mips16e_collect_propagate_value.  */
8334
8335 static bool
8336 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
8337                                  unsigned int *regno_ptr)
8338 {
8339   unsigned int argno, regno;
8340   HOST_WIDE_INT offset, required_offset;
8341   rtx addr, base;
8342
8343   /* Check that this is a word-mode store.  */
8344   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
8345     return false;
8346
8347   /* Check that the register being saved is an unmodified argument
8348      register.  */
8349   regno = REGNO (src);
8350   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
8351     return false;
8352   argno = regno - GP_ARG_FIRST;
8353
8354   /* Check whether the address is an appropriate stack-pointer or
8355      frame-pointer access.  */
8356   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
8357   mips_split_plus (addr, &base, &offset);
8358   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
8359   if (base == hard_frame_pointer_rtx)
8360     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
8361   else if (base != stack_pointer_rtx)
8362     return false;
8363   if (offset != required_offset)
8364     return false;
8365
8366   *regno_ptr = regno;
8367   return true;
8368 }
8369
8370 /* A subroutine of mips_expand_prologue, called only when generating
8371    MIPS16e SAVE instructions.  Search the start of the function for any
8372    instructions that save argument registers into their caller-allocated
8373    save slots.  Delete such instructions and return a value N such that
8374    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
8375    instructions redundant.  */
8376
8377 static unsigned int
8378 mips16e_collect_argument_saves (void)
8379 {
8380   rtx reg_values[FIRST_PSEUDO_REGISTER];
8381   rtx insn, next, set, dest, src;
8382   unsigned int nargs, regno;
8383
8384   push_topmost_sequence ();
8385   nargs = 0;
8386   memset (reg_values, 0, sizeof (reg_values));
8387   for (insn = get_insns (); insn; insn = next)
8388     {
8389       next = NEXT_INSN (insn);
8390       if (NOTE_P (insn) || DEBUG_INSN_P (insn))
8391         continue;
8392
8393       if (!INSN_P (insn))
8394         break;
8395
8396       set = PATTERN (insn);
8397       if (GET_CODE (set) != SET)
8398         break;
8399
8400       dest = SET_DEST (set);
8401       src = SET_SRC (set);
8402       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
8403         {
8404           if (!BITSET_P (cfun->machine->frame.mask, regno))
8405             {
8406               delete_insn (insn);
8407               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
8408             }
8409         }
8410       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
8411         reg_values[REGNO (dest)]
8412           = mips16e_collect_propagate_value (src, reg_values);
8413       else
8414         break;
8415     }
8416   pop_topmost_sequence ();
8417
8418   return nargs;
8419 }
8420
8421 /* Return a move between register REGNO and memory location SP + OFFSET.
8422    Make the move a load if RESTORE_P, otherwise make it a frame-related
8423    store.  */
8424
8425 static rtx
8426 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
8427                           unsigned int regno)
8428 {
8429   rtx reg, mem;
8430
8431   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
8432   reg = gen_rtx_REG (SImode, regno);
8433   return (restore_p
8434           ? gen_rtx_SET (VOIDmode, reg, mem)
8435           : mips_frame_set (mem, reg));
8436 }
8437
8438 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
8439    The instruction must:
8440
8441      - Allocate or deallocate SIZE bytes in total; SIZE is known
8442        to be nonzero.
8443
8444      - Save or restore as many registers in *MASK_PTR as possible.
8445        The instruction saves the first registers at the top of the
8446        allocated area, with the other registers below it.
8447
8448      - Save NARGS argument registers above the allocated area.
8449
8450    (NARGS is always zero if RESTORE_P.)
8451
8452    The SAVE and RESTORE instructions cannot save and restore all general
8453    registers, so there may be some registers left over for the caller to
8454    handle.  Destructively modify *MASK_PTR so that it contains the registers
8455    that still need to be saved or restored.  The caller can save these
8456    registers in the memory immediately below *OFFSET_PTR, which is a
8457    byte offset from the bottom of the allocated stack area.  */
8458
8459 static rtx
8460 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
8461                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
8462                             HOST_WIDE_INT size)
8463 {
8464   rtx pattern, set;
8465   HOST_WIDE_INT offset, top_offset;
8466   unsigned int i, regno;
8467   int n;
8468
8469   gcc_assert (cfun->machine->frame.num_fp == 0);
8470
8471   /* Calculate the number of elements in the PARALLEL.  We need one element
8472      for the stack adjustment, one for each argument register save, and one
8473      for each additional register move.  */
8474   n = 1 + nargs;
8475   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8476     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
8477       n++;
8478
8479   /* Create the final PARALLEL.  */
8480   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
8481   n = 0;
8482
8483   /* Add the stack pointer adjustment.  */
8484   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8485                      plus_constant (stack_pointer_rtx,
8486                                     restore_p ? size : -size));
8487   RTX_FRAME_RELATED_P (set) = 1;
8488   XVECEXP (pattern, 0, n++) = set;
8489
8490   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8491   top_offset = restore_p ? size : 0;
8492
8493   /* Save the arguments.  */
8494   for (i = 0; i < nargs; i++)
8495     {
8496       offset = top_offset + i * UNITS_PER_WORD;
8497       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
8498       XVECEXP (pattern, 0, n++) = set;
8499     }
8500
8501   /* Then fill in the other register moves.  */
8502   offset = top_offset;
8503   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8504     {
8505       regno = mips16e_save_restore_regs[i];
8506       if (BITSET_P (*mask_ptr, regno))
8507         {
8508           offset -= UNITS_PER_WORD;
8509           set = mips16e_save_restore_reg (restore_p, offset, regno);
8510           XVECEXP (pattern, 0, n++) = set;
8511           *mask_ptr &= ~(1 << regno);
8512         }
8513     }
8514
8515   /* Tell the caller what offset it should use for the remaining registers.  */
8516   *offset_ptr = size + (offset - top_offset);
8517
8518   gcc_assert (n == XVECLEN (pattern, 0));
8519
8520   return pattern;
8521 }
8522
8523 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
8524    pointer.  Return true if PATTERN matches the kind of instruction
8525    generated by mips16e_build_save_restore.  If INFO is nonnull,
8526    initialize it when returning true.  */
8527
8528 bool
8529 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
8530                                 struct mips16e_save_restore_info *info)
8531 {
8532   unsigned int i, nargs, mask, extra;
8533   HOST_WIDE_INT top_offset, save_offset, offset;
8534   rtx set, reg, mem, base;
8535   int n;
8536
8537   if (!GENERATE_MIPS16E_SAVE_RESTORE)
8538     return false;
8539
8540   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8541   top_offset = adjust > 0 ? adjust : 0;
8542
8543   /* Interpret all other members of the PARALLEL.  */
8544   save_offset = top_offset - UNITS_PER_WORD;
8545   mask = 0;
8546   nargs = 0;
8547   i = 0;
8548   for (n = 1; n < XVECLEN (pattern, 0); n++)
8549     {
8550       /* Check that we have a SET.  */
8551       set = XVECEXP (pattern, 0, n);
8552       if (GET_CODE (set) != SET)
8553         return false;
8554
8555       /* Check that the SET is a load (if restoring) or a store
8556          (if saving).  */
8557       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
8558       if (!MEM_P (mem))
8559         return false;
8560
8561       /* Check that the address is the sum of the stack pointer and a
8562          possibly-zero constant offset.  */
8563       mips_split_plus (XEXP (mem, 0), &base, &offset);
8564       if (base != stack_pointer_rtx)
8565         return false;
8566
8567       /* Check that SET's other operand is a register.  */
8568       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
8569       if (!REG_P (reg))
8570         return false;
8571
8572       /* Check for argument saves.  */
8573       if (offset == top_offset + nargs * UNITS_PER_WORD
8574           && REGNO (reg) == GP_ARG_FIRST + nargs)
8575         nargs++;
8576       else if (offset == save_offset)
8577         {
8578           while (mips16e_save_restore_regs[i++] != REGNO (reg))
8579             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
8580               return false;
8581
8582           mask |= 1 << REGNO (reg);
8583           save_offset -= UNITS_PER_WORD;
8584         }
8585       else
8586         return false;
8587     }
8588
8589   /* Check that the restrictions on register ranges are met.  */
8590   extra = 0;
8591   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
8592                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
8593   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
8594                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
8595   if (extra != 0)
8596     return false;
8597
8598   /* Make sure that the topmost argument register is not saved twice.
8599      The checks above ensure that the same is then true for the other
8600      argument registers.  */
8601   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
8602     return false;
8603
8604   /* Pass back information, if requested.  */
8605   if (info)
8606     {
8607       info->nargs = nargs;
8608       info->mask = mask;
8609       info->size = (adjust > 0 ? adjust : -adjust);
8610     }
8611
8612   return true;
8613 }
8614
8615 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
8616    for the register range [MIN_REG, MAX_REG].  Return a pointer to
8617    the null terminator.  */
8618
8619 static char *
8620 mips16e_add_register_range (char *s, unsigned int min_reg,
8621                             unsigned int max_reg)
8622 {
8623   if (min_reg != max_reg)
8624     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
8625   else
8626     s += sprintf (s, ",%s", reg_names[min_reg]);
8627   return s;
8628 }
8629
8630 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
8631    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
8632
8633 const char *
8634 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
8635 {
8636   static char buffer[300];
8637
8638   struct mips16e_save_restore_info info;
8639   unsigned int i, end;
8640   char *s;
8641
8642   /* Parse the pattern.  */
8643   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
8644     gcc_unreachable ();
8645
8646   /* Add the mnemonic.  */
8647   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
8648   s += strlen (s);
8649
8650   /* Save the arguments.  */
8651   if (info.nargs > 1)
8652     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
8653                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
8654   else if (info.nargs == 1)
8655     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
8656
8657   /* Emit the amount of stack space to allocate or deallocate.  */
8658   s += sprintf (s, "%d", (int) info.size);
8659
8660   /* Save or restore $16.  */
8661   if (BITSET_P (info.mask, 16))
8662     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
8663
8664   /* Save or restore $17.  */
8665   if (BITSET_P (info.mask, 17))
8666     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
8667
8668   /* Save or restore registers in the range $s2...$s8, which
8669      mips16e_s2_s8_regs lists in decreasing order.  Note that this
8670      is a software register range; the hardware registers are not
8671      numbered consecutively.  */
8672   end = ARRAY_SIZE (mips16e_s2_s8_regs);
8673   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
8674   if (i < end)
8675     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
8676                                     mips16e_s2_s8_regs[i]);
8677
8678   /* Save or restore registers in the range $a0...$a3.  */
8679   end = ARRAY_SIZE (mips16e_a0_a3_regs);
8680   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
8681   if (i < end)
8682     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
8683                                     mips16e_a0_a3_regs[end - 1]);
8684
8685   /* Save or restore $31.  */
8686   if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
8687     s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
8688
8689   return buffer;
8690 }
8691 \f
8692 /* Return true if the current function returns its value in a floating-point
8693    register in MIPS16 mode.  */
8694
8695 static bool
8696 mips16_cfun_returns_in_fpr_p (void)
8697 {
8698   tree return_type = DECL_RESULT (current_function_decl);
8699   return (TARGET_MIPS16
8700           && TARGET_HARD_FLOAT_ABI
8701           && !aggregate_value_p (return_type, current_function_decl)
8702           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
8703 }
8704
8705 /* Return true if predicate PRED is true for at least one instruction.
8706    Cache the result in *CACHE, and assume that the result is true
8707    if *CACHE is already true.  */
8708
8709 static bool
8710 mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
8711 {
8712   rtx insn;
8713
8714   if (!*cache)
8715     {
8716       push_topmost_sequence ();
8717       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8718         if (USEFUL_INSN_P (insn) && pred (insn))
8719           {
8720             *cache = true;
8721             break;
8722           }
8723       pop_topmost_sequence ();
8724     }
8725   return *cache;
8726 }
8727
8728 /* Return true if INSN refers to the global pointer in an "inflexible" way.
8729    See mips_cfun_has_inflexible_gp_ref_p for details.  */
8730
8731 static bool
8732 mips_insn_has_inflexible_gp_ref_p (rtx insn)
8733 {
8734   /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
8735      indicate that the target could be a traditional MIPS
8736      lazily-binding stub.  */
8737   return find_reg_fusage (insn, USE, pic_offset_table_rtx);
8738 }
8739
8740 /* Return true if the current function refers to the global pointer
8741    in a way that forces $28 to be valid.  This means that we can't
8742    change the choice of global pointer, even for NewABI code.
8743
8744    One example of this (and one which needs several checks) is that
8745    $28 must be valid when calling traditional MIPS lazy-binding stubs.
8746    (This restriction does not apply to PLTs.)  */
8747
8748 static bool
8749 mips_cfun_has_inflexible_gp_ref_p (void)
8750 {
8751   /* If the function has a nonlocal goto, $28 must hold the correct
8752      global pointer for the target function.  That is, the target
8753      of the goto implicitly uses $28.  */
8754   if (crtl->has_nonlocal_goto)
8755     return true;
8756
8757   if (TARGET_ABICALLS_PIC2)
8758     {
8759       /* Symbolic accesses implicitly use the global pointer unless
8760          -mexplicit-relocs is in effect.  JAL macros to symbolic addresses
8761          might go to traditional MIPS lazy-binding stubs.  */
8762       if (!TARGET_EXPLICIT_RELOCS)
8763         return true;
8764
8765       /* FUNCTION_PROFILER includes a JAL to _mcount, which again
8766          can be lazily-bound.  */
8767       if (crtl->profile)
8768         return true;
8769
8770       /* MIPS16 functions that return in FPRs need to call an
8771          external libgcc routine.  This call is only made explict
8772          during mips_expand_epilogue, and it too might be lazily bound.  */
8773       if (mips16_cfun_returns_in_fpr_p ())
8774         return true;
8775     }
8776
8777   return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
8778                            mips_insn_has_inflexible_gp_ref_p);
8779 }
8780
8781 /* Return true if INSN refers to the global pointer in a "flexible" way.
8782    See mips_cfun_has_flexible_gp_ref_p for details.  */
8783
8784 static bool
8785 mips_insn_has_flexible_gp_ref_p (rtx insn)
8786 {
8787   return (get_attr_got (insn) != GOT_UNSET
8788           || mips_small_data_pattern_p (PATTERN (insn))
8789           || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
8790 }
8791
8792 /* Return true if the current function references the global pointer,
8793    but if those references do not inherently require the global pointer
8794    to be $28.  Assume !mips_cfun_has_inflexible_gp_ref_p ().  */
8795
8796 static bool
8797 mips_cfun_has_flexible_gp_ref_p (void)
8798 {
8799   /* Reload can sometimes introduce constant pool references
8800      into a function that otherwise didn't need them.  For example,
8801      suppose we have an instruction like:
8802
8803         (set (reg:DF R1) (float:DF (reg:SI R2)))
8804
8805      If R2 turns out to be a constant such as 1, the instruction may
8806      have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
8807      the option of using this constant if R2 doesn't get allocated
8808      to a register.
8809
8810      In cases like these, reload will have added the constant to the
8811      pool but no instruction will yet refer to it.  */
8812   if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
8813     return true;
8814
8815   return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
8816                            mips_insn_has_flexible_gp_ref_p);
8817 }
8818
8819 /* Return the register that should be used as the global pointer
8820    within this function.  Return INVALID_REGNUM if the function
8821    doesn't need a global pointer.  */
8822
8823 static unsigned int
8824 mips_global_pointer (void)
8825 {
8826   unsigned int regno;
8827
8828   /* $gp is always available unless we're using a GOT.  */
8829   if (!TARGET_USE_GOT)
8830     return GLOBAL_POINTER_REGNUM;
8831
8832   /* If there are inflexible references to $gp, we must use the
8833      standard register.  */
8834   if (mips_cfun_has_inflexible_gp_ref_p ())
8835     return GLOBAL_POINTER_REGNUM;
8836
8837   /* If there are no current references to $gp, then the only uses
8838      we can introduce later are those involved in long branches.  */
8839   if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
8840     return INVALID_REGNUM;
8841
8842   /* If the global pointer is call-saved, try to use a call-clobbered
8843      alternative.  */
8844   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
8845     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
8846       if (!df_regs_ever_live_p (regno)
8847           && call_really_used_regs[regno]
8848           && !fixed_regs[regno]
8849           && regno != PIC_FUNCTION_ADDR_REGNUM)
8850         return regno;
8851
8852   return GLOBAL_POINTER_REGNUM;
8853 }
8854
8855 /* Return true if the current function's prologue must load the global
8856    pointer value into pic_offset_table_rtx and store the same value in
8857    the function's cprestore slot (if any).
8858
8859    One problem we have to deal with is that, when emitting GOT-based
8860    position independent code, long-branch sequences will need to load
8861    the address of the branch target from the GOT.  We don't know until
8862    the very end of compilation whether (and where) the function needs
8863    long branches, so we must ensure that _any_ branch can access the
8864    global pointer in some form.  However, we do not want to pessimize
8865    the usual case in which all branches are short.
8866
8867    We handle this as follows:
8868
8869    (1) During reload, we set cfun->machine->global_pointer to
8870        INVALID_REGNUM if we _know_ that the current function
8871        doesn't need a global pointer.  This is only valid if
8872        long branches don't need the GOT.
8873
8874        Otherwise, we assume that we might need a global pointer
8875        and pick an appropriate register.
8876
8877    (2) If cfun->machine->global_pointer != INVALID_REGNUM,
8878        we ensure that the global pointer is available at every
8879        block boundary bar entry and exit.  We do this in one of two ways:
8880
8881        - If the function has a cprestore slot, we ensure that this
8882          slot is valid at every branch.  However, as explained in
8883          point (6) below, there is no guarantee that pic_offset_table_rtx
8884          itself is valid if new uses of the global pointer are introduced
8885          after the first post-epilogue split.
8886
8887          We guarantee that the cprestore slot is valid by loading it
8888          into a fake register, CPRESTORE_SLOT_REGNUM.  We then make
8889          this register live at every block boundary bar function entry
8890          and exit.  It is then invalid to move the load (and thus the
8891          preceding store) across a block boundary.
8892
8893        - If the function has no cprestore slot, we guarantee that
8894          pic_offset_table_rtx itself is valid at every branch.
8895
8896        See mips_eh_uses for the handling of the register liveness.
8897
8898    (3) During prologue and epilogue generation, we emit "ghost"
8899        placeholder instructions to manipulate the global pointer.
8900
8901    (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
8902        and cfun->machine->must_restore_gp_when_clobbered_p if we already know
8903        that the function needs a global pointer.  (There is no need to set
8904        them earlier than this, and doing it as late as possible leads to
8905        fewer false positives.)
8906
8907    (5) If cfun->machine->must_initialize_gp_p is true during a
8908        split_insns pass, we split the ghost instructions into real
8909        instructions.  These split instructions can then be optimized in
8910        the usual way.  Otherwise, we keep the ghost instructions intact,
8911        and optimize for the case where they aren't needed.  We still
8912        have the option of splitting them later, if we need to introduce
8913        new uses of the global pointer.
8914
8915        For example, the scheduler ignores a ghost instruction that
8916        stores $28 to the stack, but it handles the split form of
8917        the ghost instruction as an ordinary store.
8918
8919    (6) [OldABI only.]  If cfun->machine->must_restore_gp_when_clobbered_p
8920        is true during the first post-epilogue split_insns pass, we split
8921        calls and restore_gp patterns into instructions that explicitly
8922        load pic_offset_table_rtx from the cprestore slot.  Otherwise,
8923        we split these patterns into instructions that _don't_ load from
8924        the cprestore slot.
8925
8926        If cfun->machine->must_restore_gp_when_clobbered_p is true at the
8927        time of the split, then any instructions that exist at that time
8928        can make free use of pic_offset_table_rtx.  However, if we want
8929        to introduce new uses of the global pointer after the split,
8930        we must explicitly load the value from the cprestore slot, since
8931        pic_offset_table_rtx itself might not be valid at a given point
8932        in the function.
8933
8934        The idea is that we want to be able to delete redundant
8935        loads from the cprestore slot in the usual case where no
8936        long branches are needed.
8937
8938    (7) If cfun->machine->must_initialize_gp_p is still false at the end
8939        of md_reorg, we decide whether the global pointer is needed for
8940        long branches.  If so, we set cfun->machine->must_initialize_gp_p
8941        to true and split the ghost instructions into real instructions
8942        at that stage.
8943
8944    Note that the ghost instructions must have a zero length for three reasons:
8945
8946    - Giving the length of the underlying $gp sequence might cause
8947      us to use long branches in cases where they aren't really needed.
8948
8949    - They would perturb things like alignment calculations.
8950
8951    - More importantly, the hazard detection in md_reorg relies on
8952      empty instructions having a zero length.
8953
8954    If we find a long branch and split the ghost instructions at the
8955    end of md_reorg, the split could introduce more long branches.
8956    That isn't a problem though, because we still do the split before
8957    the final shorten_branches pass.
8958
8959    This is extremely ugly, but it seems like the best compromise between
8960    correctness and efficiency.  */
8961
8962 bool
8963 mips_must_initialize_gp_p (void)
8964 {
8965   return cfun->machine->must_initialize_gp_p;
8966 }
8967
8968 /* Return true if REGNO is a register that is ordinarily call-clobbered
8969    but must nevertheless be preserved by an interrupt handler.  */
8970
8971 static bool
8972 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
8973 {
8974   if (MD_REG_P (regno))
8975     return true;
8976
8977   if (TARGET_DSP && DSP_ACC_REG_P (regno))
8978     return true;
8979
8980   if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
8981     {
8982       /* $0 is hard-wired.  */
8983       if (regno == GP_REG_FIRST)
8984         return false;
8985
8986       /* The interrupt handler can treat kernel registers as
8987          scratch registers.  */
8988       if (KERNEL_REG_P (regno))
8989         return false;
8990
8991       /* The function will return the stack pointer to its original value
8992          anyway.  */
8993       if (regno == STACK_POINTER_REGNUM)
8994         return false;
8995
8996       /* Otherwise, return true for registers that aren't ordinarily
8997          call-clobbered.  */
8998       return call_really_used_regs[regno];
8999     }
9000
9001   return false;
9002 }
9003
9004 /* Return true if the current function should treat register REGNO
9005    as call-saved.  */
9006
9007 static bool
9008 mips_cfun_call_saved_reg_p (unsigned int regno)
9009 {
9010   /* Interrupt handlers need to save extra registers.  */
9011   if (cfun->machine->interrupt_handler_p
9012       && mips_interrupt_extra_call_saved_reg_p (regno))
9013     return true;
9014
9015   /* call_insns preserve $28 unless they explicitly say otherwise,
9016      so call_really_used_regs[] treats $28 as call-saved.  However,
9017      we want the ABI property rather than the default call_insn
9018      property here.  */
9019   return (regno == GLOBAL_POINTER_REGNUM
9020           ? TARGET_CALL_SAVED_GP
9021           : !call_really_used_regs[regno]);
9022 }
9023
9024 /* Return true if the function body might clobber register REGNO.
9025    We know that REGNO is call-saved.  */
9026
9027 static bool
9028 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9029 {
9030   /* Some functions should be treated as clobbering all call-saved
9031      registers.  */
9032   if (crtl->saves_all_registers)
9033     return true;
9034
9035   /* DF handles cases where a register is explicitly referenced in
9036      the rtl.  Incoming values are passed in call-clobbered registers,
9037      so we can assume that any live call-saved register is set within
9038      the function.  */
9039   if (df_regs_ever_live_p (regno))
9040     return true;
9041
9042   /* Check for registers that are clobbered by FUNCTION_PROFILER.
9043      These clobbers are not explicit in the rtl.  */
9044   if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9045     return true;
9046
9047   /* If we're using a call-saved global pointer, the function's
9048      prologue will need to set it up.  */
9049   if (cfun->machine->global_pointer == regno)
9050     return true;
9051
9052   /* The function's prologue will need to set the frame pointer if
9053      frame_pointer_needed.  */
9054   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9055     return true;
9056
9057   /* If a MIPS16 function returns a value in FPRs, its epilogue
9058      will need to call an external libgcc routine.  This yet-to-be
9059      generated call_insn will clobber $31.  */
9060   if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9061     return true;
9062
9063   /* If REGNO is ordinarily call-clobbered, we must assume that any
9064      called function could modify it.  */
9065   if (cfun->machine->interrupt_handler_p
9066       && !current_function_is_leaf
9067       && mips_interrupt_extra_call_saved_reg_p (regno))
9068     return true;
9069
9070   return false;
9071 }
9072
9073 /* Return true if the current function must save register REGNO.  */
9074
9075 static bool
9076 mips_save_reg_p (unsigned int regno)
9077 {
9078   if (mips_cfun_call_saved_reg_p (regno))
9079     {
9080       if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9081         return true;
9082
9083       /* Save both registers in an FPR pair if either one is used.  This is
9084          needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9085          register to be used without the even register.  */
9086       if (FP_REG_P (regno)
9087           && MAX_FPRS_PER_FMT == 2
9088           && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9089         return true;
9090     }
9091
9092   /* We need to save the incoming return address if __builtin_eh_return
9093      is being used to set a different return address.  */
9094   if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9095     return true;
9096
9097   return false;
9098 }
9099
9100 /* Populate the current function's mips_frame_info structure.
9101
9102    MIPS stack frames look like:
9103
9104         +-------------------------------+
9105         |                               |
9106         |  incoming stack arguments     |
9107         |                               |
9108         +-------------------------------+
9109         |                               |
9110         |  caller-allocated save area   |
9111       A |  for register arguments       |
9112         |                               |
9113         +-------------------------------+ <-- incoming stack pointer
9114         |                               |
9115         |  callee-allocated save area   |
9116       B |  for arguments that are       |
9117         |  split between registers and  |
9118         |  the stack                    |
9119         |                               |
9120         +-------------------------------+ <-- arg_pointer_rtx
9121         |                               |
9122       C |  callee-allocated save area   |
9123         |  for register varargs         |
9124         |                               |
9125         +-------------------------------+ <-- frame_pointer_rtx
9126         |                               |       + cop0_sp_offset
9127         |  COP0 reg save area           |       + UNITS_PER_WORD
9128         |                               |
9129         +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9130         |                               |       + UNITS_PER_WORD
9131         |  accumulator save area        |
9132         |                               |
9133         +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9134         |                               |       + UNITS_PER_HWFPVALUE
9135         |  FPR save area                |
9136         |                               |
9137         +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9138         |                               |       + UNITS_PER_WORD
9139         |  GPR save area                |
9140         |                               |
9141         +-------------------------------+ <-- frame_pointer_rtx with
9142         |                               | \     -fstack-protector
9143         |  local variables              |  | var_size
9144         |                               | /
9145         +-------------------------------+
9146         |                               | \
9147         |  $gp save area                |  | cprestore_size
9148         |                               | /
9149       P +-------------------------------+ <-- hard_frame_pointer_rtx for
9150         |                               | \     MIPS16 code
9151         |  outgoing stack arguments     |  |
9152         |                               |  |
9153         +-------------------------------+  | args_size
9154         |                               |  |
9155         |  caller-allocated save area   |  |
9156         |  for register arguments       |  |
9157         |                               | /
9158         +-------------------------------+ <-- stack_pointer_rtx
9159                                               frame_pointer_rtx without
9160                                                 -fstack-protector
9161                                               hard_frame_pointer_rtx for
9162                                                 non-MIPS16 code.
9163
9164    At least two of A, B and C will be empty.
9165
9166    Dynamic stack allocations such as alloca insert data at point P.
9167    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
9168    hard_frame_pointer_rtx unchanged.  */
9169
9170 static void
9171 mips_compute_frame_info (void)
9172 {
9173   struct mips_frame_info *frame;
9174   HOST_WIDE_INT offset, size;
9175   unsigned int regno, i;
9176
9177   /* Set this function's interrupt properties.  */
9178   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
9179     {
9180       if (!ISA_MIPS32R2)
9181         error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
9182       else if (TARGET_HARD_FLOAT)
9183         error ("the %<interrupt%> attribute requires %<-msoft-float%>");
9184       else if (TARGET_MIPS16)
9185         error ("interrupt handlers cannot be MIPS16 functions");
9186       else
9187         {
9188           cfun->machine->interrupt_handler_p = true;
9189           cfun->machine->use_shadow_register_set_p =
9190             mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
9191           cfun->machine->keep_interrupts_masked_p =
9192             mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
9193           cfun->machine->use_debug_exception_return_p =
9194             mips_use_debug_exception_return_p (TREE_TYPE
9195                                                (current_function_decl));
9196         }
9197     }
9198
9199   frame = &cfun->machine->frame;
9200   memset (frame, 0, sizeof (*frame));
9201   size = get_frame_size ();
9202
9203   cfun->machine->global_pointer = mips_global_pointer ();
9204
9205   /* The first two blocks contain the outgoing argument area and the $gp save
9206      slot.  This area isn't needed in leaf functions, but if the
9207      target-independent frame size is nonzero, we have already committed to
9208      allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
9209   if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf)
9210     {
9211       /* The MIPS 3.0 linker does not like functions that dynamically
9212          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
9213          looks like we are trying to create a second frame pointer to the
9214          function, so allocate some stack space to make it happy.  */
9215       if (cfun->calls_alloca)
9216         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
9217       else
9218         frame->args_size = 0;
9219       frame->cprestore_size = 0;
9220     }
9221   else
9222     {
9223       frame->args_size = crtl->outgoing_args_size;
9224       frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
9225     }
9226   offset = frame->args_size + frame->cprestore_size;
9227
9228   /* Move above the local variables.  */
9229   frame->var_size = MIPS_STACK_ALIGN (size);
9230   offset += frame->var_size;
9231
9232   /* Find out which GPRs we need to save.  */
9233   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9234     if (mips_save_reg_p (regno))
9235       {
9236         frame->num_gp++;
9237         frame->mask |= 1 << (regno - GP_REG_FIRST);
9238       }
9239
9240   /* If this function calls eh_return, we must also save and restore the
9241      EH data registers.  */
9242   if (crtl->calls_eh_return)
9243     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
9244       {
9245         frame->num_gp++;
9246         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
9247       }
9248
9249   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
9250      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
9251      save all later registers too.  */
9252   if (GENERATE_MIPS16E_SAVE_RESTORE)
9253     {
9254       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
9255                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
9256       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
9257                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
9258     }
9259
9260   /* Move above the GPR save area.  */
9261   if (frame->num_gp > 0)
9262     {
9263       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
9264       frame->gp_sp_offset = offset - UNITS_PER_WORD;
9265     }
9266
9267   /* Find out which FPRs we need to save.  This loop must iterate over
9268      the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
9269   if (TARGET_HARD_FLOAT)
9270     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
9271       if (mips_save_reg_p (regno))
9272         {
9273           frame->num_fp += MAX_FPRS_PER_FMT;
9274           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
9275         }
9276
9277   /* Move above the FPR save area.  */
9278   if (frame->num_fp > 0)
9279     {
9280       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
9281       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
9282     }
9283
9284   /* Add in space for the interrupt context information.  */
9285   if (cfun->machine->interrupt_handler_p)
9286     {
9287       /* Check HI/LO.  */
9288       if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
9289         {
9290           frame->num_acc++;
9291           frame->acc_mask |= (1 << 0);
9292         }
9293
9294       /* Check accumulators 1, 2, 3.  */
9295       for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
9296         if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
9297           {
9298             frame->num_acc++;
9299             frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
9300           }
9301
9302       /* All interrupt context functions need space to preserve STATUS.  */
9303       frame->num_cop0_regs++;
9304
9305       /* If we don't keep interrupts masked, we need to save EPC.  */
9306       if (!cfun->machine->keep_interrupts_masked_p)
9307         frame->num_cop0_regs++;
9308     }
9309
9310   /* Move above the accumulator save area.  */
9311   if (frame->num_acc > 0)
9312     {
9313       /* Each accumulator needs 2 words.  */
9314       offset += frame->num_acc * 2 * UNITS_PER_WORD;
9315       frame->acc_sp_offset = offset - UNITS_PER_WORD;
9316     }
9317
9318   /* Move above the COP0 register save area.  */
9319   if (frame->num_cop0_regs > 0)
9320     {
9321       offset += frame->num_cop0_regs * UNITS_PER_WORD;
9322       frame->cop0_sp_offset = offset - UNITS_PER_WORD;
9323     }
9324
9325   /* Move above the callee-allocated varargs save area.  */
9326   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
9327   frame->arg_pointer_offset = offset;
9328
9329   /* Move above the callee-allocated area for pretend stack arguments.  */
9330   offset += crtl->args.pretend_args_size;
9331   frame->total_size = offset;
9332
9333   /* Work out the offsets of the save areas from the top of the frame.  */
9334   if (frame->gp_sp_offset > 0)
9335     frame->gp_save_offset = frame->gp_sp_offset - offset;
9336   if (frame->fp_sp_offset > 0)
9337     frame->fp_save_offset = frame->fp_sp_offset - offset;
9338   if (frame->acc_sp_offset > 0)
9339     frame->acc_save_offset = frame->acc_sp_offset - offset;
9340   if (frame->num_cop0_regs > 0)
9341     frame->cop0_save_offset = frame->cop0_sp_offset - offset;
9342
9343   /* MIPS16 code offsets the frame pointer by the size of the outgoing
9344      arguments.  This tends to increase the chances of using unextended
9345      instructions for local variables and incoming arguments.  */
9346   if (TARGET_MIPS16)
9347     frame->hard_frame_pointer_offset = frame->args_size;
9348 }
9349
9350 /* Return the style of GP load sequence that is being used for the
9351    current function.  */
9352
9353 enum mips_loadgp_style
9354 mips_current_loadgp_style (void)
9355 {
9356   if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
9357     return LOADGP_NONE;
9358
9359   if (TARGET_RTP_PIC)
9360     return LOADGP_RTP;
9361
9362   if (TARGET_ABSOLUTE_ABICALLS)
9363     return LOADGP_ABSOLUTE;
9364
9365   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
9366 }
9367
9368 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
9369
9370 static bool
9371 mips_frame_pointer_required (void)
9372 {
9373   /* If the function contains dynamic stack allocations, we need to
9374      use the frame pointer to access the static parts of the frame.  */
9375   if (cfun->calls_alloca)
9376     return true;
9377
9378   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
9379      reload may be unable to compute the address of a local variable,
9380      since there is no way to add a large constant to the stack pointer
9381      without using a second temporary register.  */
9382   if (TARGET_MIPS16)
9383     {
9384       mips_compute_frame_info ();
9385       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
9386         return true;
9387     }
9388
9389   return false;
9390 }
9391
9392 /* Make sure that we're not trying to eliminate to the wrong hard frame
9393    pointer.  */
9394
9395 static bool
9396 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
9397 {
9398   return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
9399 }
9400
9401 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
9402    or argument pointer.  TO is either the stack pointer or hard frame
9403    pointer.  */
9404
9405 HOST_WIDE_INT
9406 mips_initial_elimination_offset (int from, int to)
9407 {
9408   HOST_WIDE_INT offset;
9409
9410   mips_compute_frame_info ();
9411
9412   /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
9413   switch (from)
9414     {
9415     case FRAME_POINTER_REGNUM:
9416       if (FRAME_GROWS_DOWNWARD)
9417         offset = (cfun->machine->frame.args_size
9418                   + cfun->machine->frame.cprestore_size
9419                   + cfun->machine->frame.var_size);
9420       else
9421         offset = 0;
9422       break;
9423
9424     case ARG_POINTER_REGNUM:
9425       offset = cfun->machine->frame.arg_pointer_offset;
9426       break;
9427
9428     default:
9429       gcc_unreachable ();
9430     }
9431
9432   if (to == HARD_FRAME_POINTER_REGNUM)
9433     offset -= cfun->machine->frame.hard_frame_pointer_offset;
9434
9435   return offset;
9436 }
9437 \f
9438 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
9439
9440 static void
9441 mips_extra_live_on_entry (bitmap regs)
9442 {
9443   if (TARGET_USE_GOT)
9444     {
9445       /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
9446          the global pointer.   */
9447       if (!TARGET_ABSOLUTE_ABICALLS)
9448         bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
9449
9450       /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
9451          the global pointer.  */
9452       if (TARGET_MIPS16)
9453         bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
9454
9455       /* See the comment above load_call<mode> for details.  */
9456       bitmap_set_bit (regs, GOT_VERSION_REGNUM);
9457     }
9458 }
9459
9460 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
9461    previous frame.  */
9462
9463 rtx
9464 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
9465 {
9466   if (count != 0)
9467     return const0_rtx;
9468
9469   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
9470 }
9471
9472 /* Emit code to change the current function's return address to
9473    ADDRESS.  SCRATCH is available as a scratch register, if needed.
9474    ADDRESS and SCRATCH are both word-mode GPRs.  */
9475
9476 void
9477 mips_set_return_address (rtx address, rtx scratch)
9478 {
9479   rtx slot_address;
9480
9481   gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
9482   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
9483                                   cfun->machine->frame.gp_sp_offset);
9484   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
9485 }
9486
9487 /* Return true if the current function has a cprestore slot.  */
9488
9489 bool
9490 mips_cfun_has_cprestore_slot_p (void)
9491 {
9492   return (cfun->machine->global_pointer != INVALID_REGNUM
9493           && cfun->machine->frame.cprestore_size > 0);
9494 }
9495
9496 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
9497    cprestore slot.  LOAD_P is true if the caller wants to load from
9498    the cprestore slot; it is false if the caller wants to store to
9499    the slot.  */
9500
9501 static void
9502 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
9503                                     bool load_p)
9504 {
9505   const struct mips_frame_info *frame;
9506
9507   frame = &cfun->machine->frame;
9508   /* .cprestore always uses the stack pointer instead of the frame pointer.
9509      We have a free choice for direct stores for non-MIPS16 functions,
9510      and for MIPS16 functions whose cprestore slot is in range of the
9511      stack pointer.  Using the stack pointer would sometimes give more
9512      (early) scheduling freedom, but using the frame pointer would
9513      sometimes give more (late) scheduling freedom.  It's hard to
9514      predict which applies to a given function, so let's keep things
9515      simple.
9516
9517      Loads must always use the frame pointer in functions that call
9518      alloca, and there's little benefit to using the stack pointer
9519      otherwise.  */
9520   if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
9521     {
9522       *base = hard_frame_pointer_rtx;
9523       *offset = frame->args_size - frame->hard_frame_pointer_offset;
9524     }
9525   else
9526     {
9527       *base = stack_pointer_rtx;
9528       *offset = frame->args_size;
9529     }
9530 }
9531
9532 /* Return true if X is the load or store address of the cprestore slot;
9533    LOAD_P says which.  */
9534
9535 bool
9536 mips_cprestore_address_p (rtx x, bool load_p)
9537 {
9538   rtx given_base, required_base;
9539   HOST_WIDE_INT given_offset, required_offset;
9540
9541   mips_split_plus (x, &given_base, &given_offset);
9542   mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
9543   return given_base == required_base && given_offset == required_offset;
9544 }
9545
9546 /* Return a MEM rtx for the cprestore slot.  LOAD_P is true if we are
9547    going to load from it, false if we are going to store to it.
9548    Use TEMP as a temporary register if need be.  */
9549
9550 static rtx
9551 mips_cprestore_slot (rtx temp, bool load_p)
9552 {
9553   rtx base;
9554   HOST_WIDE_INT offset;
9555
9556   mips_get_cprestore_base_and_offset (&base, &offset, load_p);
9557   return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
9558 }
9559
9560 /* Emit instructions to save global pointer value GP into cprestore
9561    slot MEM.  OFFSET is the offset that MEM applies to the base register.
9562
9563    MEM may not be a legitimate address.  If it isn't, TEMP is a
9564    temporary register that can be used, otherwise it is a SCRATCH.  */
9565
9566 void
9567 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
9568 {
9569   if (TARGET_CPRESTORE_DIRECTIVE)
9570     {
9571       gcc_assert (gp == pic_offset_table_rtx);
9572       emit_insn (gen_cprestore (mem, offset));
9573     }
9574   else
9575     mips_emit_move (mips_cprestore_slot (temp, false), gp);
9576 }
9577
9578 /* Restore $gp from its save slot, using TEMP as a temporary base register
9579    if need be.  This function is for o32 and o64 abicalls only.
9580
9581    See mips_must_initialize_gp_p for details about how we manage the
9582    global pointer.  */
9583
9584 void
9585 mips_restore_gp_from_cprestore_slot (rtx temp)
9586 {
9587   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
9588
9589   if (!cfun->machine->must_restore_gp_when_clobbered_p)
9590     {
9591       emit_note (NOTE_INSN_DELETED);
9592       return;
9593     }
9594
9595   if (TARGET_MIPS16)
9596     {
9597       mips_emit_move (temp, mips_cprestore_slot (temp, true));
9598       mips_emit_move (pic_offset_table_rtx, temp);
9599     }
9600   else
9601     mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
9602   if (!TARGET_EXPLICIT_RELOCS)
9603     emit_insn (gen_blockage ());
9604 }
9605 \f
9606 /* A function to save or store a register.  The first argument is the
9607    register and the second is the stack slot.  */
9608 typedef void (*mips_save_restore_fn) (rtx, rtx);
9609
9610 /* Use FN to save or restore register REGNO.  MODE is the register's
9611    mode and OFFSET is the offset of its save slot from the current
9612    stack pointer.  */
9613
9614 static void
9615 mips_save_restore_reg (enum machine_mode mode, int regno,
9616                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
9617 {
9618   rtx mem;
9619
9620   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
9621   fn (gen_rtx_REG (mode, regno), mem);
9622 }
9623
9624 /* Call FN for each accumlator that is saved by the current function.
9625    SP_OFFSET is the offset of the current stack pointer from the start
9626    of the frame.  */
9627
9628 static void
9629 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
9630 {
9631   HOST_WIDE_INT offset;
9632   int regno;
9633
9634   offset = cfun->machine->frame.acc_sp_offset - sp_offset;
9635   if (BITSET_P (cfun->machine->frame.acc_mask, 0))
9636     {
9637       mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
9638       offset -= UNITS_PER_WORD;
9639       mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
9640       offset -= UNITS_PER_WORD;
9641     }
9642
9643   for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
9644     if (BITSET_P (cfun->machine->frame.acc_mask,
9645                   ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
9646       {
9647         mips_save_restore_reg (word_mode, regno, offset, fn);
9648         offset -= UNITS_PER_WORD;
9649       }
9650 }
9651
9652 /* Call FN for each register that is saved by the current function.
9653    SP_OFFSET is the offset of the current stack pointer from the start
9654    of the frame.  */
9655
9656 static void
9657 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
9658                                  mips_save_restore_fn fn)
9659 {
9660   enum machine_mode fpr_mode;
9661   HOST_WIDE_INT offset;
9662   int regno;
9663
9664   /* Save registers starting from high to low.  The debuggers prefer at least
9665      the return register be stored at func+4, and also it allows us not to
9666      need a nop in the epilogue if at least one register is reloaded in
9667      addition to return address.  */
9668   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
9669   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
9670     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
9671       {
9672         /* Record the ra offset for use by mips_function_profiler.  */
9673         if (regno == RETURN_ADDR_REGNUM)
9674           cfun->machine->frame.ra_fp_offset = offset + sp_offset;
9675         mips_save_restore_reg (word_mode, regno, offset, fn);
9676         offset -= UNITS_PER_WORD;
9677       }
9678
9679   /* This loop must iterate over the same space as its companion in
9680      mips_compute_frame_info.  */
9681   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
9682   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
9683   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
9684        regno >= FP_REG_FIRST;
9685        regno -= MAX_FPRS_PER_FMT)
9686     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
9687       {
9688         mips_save_restore_reg (fpr_mode, regno, offset, fn);
9689         offset -= GET_MODE_SIZE (fpr_mode);
9690       }
9691 }
9692
9693 /* Return true if a move between register REGNO and its save slot (MEM)
9694    can be done in a single move.  LOAD_P is true if we are loading
9695    from the slot, false if we are storing to it.  */
9696
9697 static bool
9698 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
9699 {
9700   /* There is a specific MIPS16 instruction for saving $31 to the stack.  */
9701   if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
9702     return false;
9703
9704   return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
9705                                       GET_MODE (mem), mem, load_p) == NO_REGS;
9706 }
9707
9708 /* Emit a move from SRC to DEST, given that one of them is a register
9709    save slot and that the other is a register.  TEMP is a temporary
9710    GPR of the same mode that is available if need be.  */
9711
9712 void
9713 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
9714 {
9715   unsigned int regno;
9716   rtx mem;
9717
9718   if (REG_P (src))
9719     {
9720       regno = REGNO (src);
9721       mem = dest;
9722     }
9723   else
9724     {
9725       regno = REGNO (dest);
9726       mem = src;
9727     }
9728
9729   if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
9730     {
9731       /* We don't yet know whether we'll need this instruction or not.
9732          Postpone the decision by emitting a ghost move.  This move
9733          is specifically not frame-related; only the split version is.  */
9734       if (TARGET_64BIT)
9735         emit_insn (gen_move_gpdi (dest, src));
9736       else
9737         emit_insn (gen_move_gpsi (dest, src));
9738       return;
9739     }
9740
9741   if (regno == HI_REGNUM)
9742     {
9743       if (REG_P (dest))
9744         {
9745           mips_emit_move (temp, src);
9746           if (TARGET_64BIT)
9747             emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
9748                                       temp, gen_rtx_REG (DImode, LO_REGNUM)));
9749           else
9750             emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
9751                                       temp, gen_rtx_REG (SImode, LO_REGNUM)));
9752         }
9753       else
9754         {
9755           if (TARGET_64BIT)
9756             emit_insn (gen_mfhidi_ti (temp,
9757                                       gen_rtx_REG (TImode, MD_REG_FIRST)));
9758           else
9759             emit_insn (gen_mfhisi_di (temp,
9760                                       gen_rtx_REG (DImode, MD_REG_FIRST)));
9761           mips_emit_move (dest, temp);
9762         }
9763     }
9764   else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
9765     mips_emit_move (dest, src);
9766   else
9767     {
9768       gcc_assert (!reg_overlap_mentioned_p (dest, temp));
9769       mips_emit_move (temp, src);
9770       mips_emit_move (dest, temp);
9771     }
9772   if (MEM_P (dest))
9773     mips_set_frame_expr (mips_frame_set (dest, src));
9774 }
9775 \f
9776 /* If we're generating n32 or n64 abicalls, and the current function
9777    does not use $28 as its global pointer, emit a cplocal directive.
9778    Use pic_offset_table_rtx as the argument to the directive.  */
9779
9780 static void
9781 mips_output_cplocal (void)
9782 {
9783   if (!TARGET_EXPLICIT_RELOCS
9784       && mips_must_initialize_gp_p ()
9785       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
9786     output_asm_insn (".cplocal %+", 0);
9787 }
9788
9789 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
9790
9791 static void
9792 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9793 {
9794   const char *fnname;
9795
9796 #ifdef SDB_DEBUGGING_INFO
9797   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
9798     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
9799 #endif
9800
9801   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
9802      floating-point arguments.  */
9803   if (TARGET_MIPS16
9804       && TARGET_HARD_FLOAT_ABI
9805       && crtl->args.info.fp_code != 0)
9806     mips16_build_function_stub ();
9807
9808   /* Get the function name the same way that toplev.c does before calling
9809      assemble_start_function.  This is needed so that the name used here
9810      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9811   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9812   mips_start_function_definition (fnname, TARGET_MIPS16);
9813
9814   /* Stop mips_file_end from treating this function as external.  */
9815   if (TARGET_IRIX && mips_abi == ABI_32)
9816     TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
9817
9818   /* Output MIPS-specific frame information.  */
9819   if (!flag_inhibit_size_directive)
9820     {
9821       const struct mips_frame_info *frame;
9822
9823       frame = &cfun->machine->frame;
9824
9825       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
9826       fprintf (file,
9827                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
9828                "# vars= " HOST_WIDE_INT_PRINT_DEC
9829                ", regs= %d/%d"
9830                ", args= " HOST_WIDE_INT_PRINT_DEC
9831                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
9832                reg_names[frame_pointer_needed
9833                          ? HARD_FRAME_POINTER_REGNUM
9834                          : STACK_POINTER_REGNUM],
9835                (frame_pointer_needed
9836                 ? frame->total_size - frame->hard_frame_pointer_offset
9837                 : frame->total_size),
9838                reg_names[RETURN_ADDR_REGNUM],
9839                frame->var_size,
9840                frame->num_gp, frame->num_fp,
9841                frame->args_size,
9842                frame->cprestore_size);
9843
9844       /* .mask MASK, OFFSET.  */
9845       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9846                frame->mask, frame->gp_save_offset);
9847
9848       /* .fmask MASK, OFFSET.  */
9849       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9850                frame->fmask, frame->fp_save_offset);
9851     }
9852
9853   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
9854      Also emit the ".set noreorder; .set nomacro" sequence for functions
9855      that need it.  */
9856   if (mips_must_initialize_gp_p ()
9857       && mips_current_loadgp_style () == LOADGP_OLDABI)
9858     {
9859       if (TARGET_MIPS16)
9860         {
9861           /* This is a fixed-form sequence.  The position of the
9862              first two instructions is important because of the
9863              way _gp_disp is defined.  */
9864           output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
9865           output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
9866           output_asm_insn ("sll\t$2,16", 0);
9867           output_asm_insn ("addu\t$2,$3", 0);
9868         }
9869       else
9870         {
9871           /* .cpload must be in a .set noreorder but not a
9872              .set nomacro block.  */
9873           mips_push_asm_switch (&mips_noreorder);
9874           output_asm_insn (".cpload\t%^", 0);
9875           if (!cfun->machine->all_noreorder_p)
9876             mips_pop_asm_switch (&mips_noreorder);
9877           else
9878             mips_push_asm_switch (&mips_nomacro);
9879         }
9880     }
9881   else if (cfun->machine->all_noreorder_p)
9882     {
9883       mips_push_asm_switch (&mips_noreorder);
9884       mips_push_asm_switch (&mips_nomacro);
9885     }
9886
9887   /* Tell the assembler which register we're using as the global
9888      pointer.  This is needed for thunks, since they can use either
9889      explicit relocs or assembler macros.  */
9890   mips_output_cplocal ();
9891 }
9892
9893 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
9894
9895 static void
9896 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9897                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9898 {
9899   const char *fnname;
9900
9901   /* Reinstate the normal $gp.  */
9902   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
9903   mips_output_cplocal ();
9904
9905   if (cfun->machine->all_noreorder_p)
9906     {
9907       mips_pop_asm_switch (&mips_nomacro);
9908       mips_pop_asm_switch (&mips_noreorder);
9909     }
9910
9911   /* Get the function name the same way that toplev.c does before calling
9912      assemble_start_function.  This is needed so that the name used here
9913      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9914   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9915   mips_end_function_definition (fnname);
9916 }
9917 \f
9918 /* Save register REG to MEM.  Make the instruction frame-related.  */
9919
9920 static void
9921 mips_save_reg (rtx reg, rtx mem)
9922 {
9923   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
9924     {
9925       rtx x1, x2;
9926
9927       if (mips_split_64bit_move_p (mem, reg))
9928         mips_split_doubleword_move (mem, reg);
9929       else
9930         mips_emit_move (mem, reg);
9931
9932       x1 = mips_frame_set (mips_subword (mem, false),
9933                            mips_subword (reg, false));
9934       x2 = mips_frame_set (mips_subword (mem, true),
9935                            mips_subword (reg, true));
9936       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
9937     }
9938   else
9939     mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
9940 }
9941
9942 /* The __gnu_local_gp symbol.  */
9943
9944 static GTY(()) rtx mips_gnu_local_gp;
9945
9946 /* If we're generating n32 or n64 abicalls, emit instructions
9947    to set up the global pointer.  */
9948
9949 static void
9950 mips_emit_loadgp (void)
9951 {
9952   rtx addr, offset, incoming_address, base, index, pic_reg;
9953
9954   pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
9955   switch (mips_current_loadgp_style ())
9956     {
9957     case LOADGP_ABSOLUTE:
9958       if (mips_gnu_local_gp == NULL)
9959         {
9960           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
9961           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
9962         }
9963       emit_insn (Pmode == SImode
9964                  ? gen_loadgp_absolute_si (pic_reg, mips_gnu_local_gp)
9965                  : gen_loadgp_absolute_di (pic_reg, mips_gnu_local_gp));
9966       break;
9967
9968     case LOADGP_OLDABI:
9969       /* Added by mips_output_function_prologue.  */
9970       break;
9971
9972     case LOADGP_NEWABI:
9973       addr = XEXP (DECL_RTL (current_function_decl), 0);
9974       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
9975       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
9976       emit_insn (Pmode == SImode
9977                  ? gen_loadgp_newabi_si (pic_reg, offset, incoming_address)
9978                  : gen_loadgp_newabi_di (pic_reg, offset, incoming_address));
9979       break;
9980
9981     case LOADGP_RTP:
9982       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
9983       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
9984       emit_insn (Pmode == SImode
9985                  ? gen_loadgp_rtp_si (pic_reg, base, index)
9986                  : gen_loadgp_rtp_di (pic_reg, base, index));
9987       break;
9988
9989     default:
9990       return;
9991     }
9992
9993   if (TARGET_MIPS16)
9994     emit_insn (gen_copygp_mips16 (pic_offset_table_rtx, pic_reg));
9995
9996   /* Emit a blockage if there are implicit uses of the GP register.
9997      This includes profiled functions, because FUNCTION_PROFILE uses
9998      a jal macro.  */
9999   if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
10000     emit_insn (gen_loadgp_blockage ());
10001 }
10002
10003 /* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
10004
10005 static int
10006 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
10007 {
10008   return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
10009 }
10010
10011 /* Expand the "prologue" pattern.  */
10012
10013 void
10014 mips_expand_prologue (void)
10015 {
10016   const struct mips_frame_info *frame;
10017   HOST_WIDE_INT size;
10018   unsigned int nargs;
10019   rtx insn;
10020
10021   if (cfun->machine->global_pointer != INVALID_REGNUM)
10022     {
10023       /* Check whether an insn uses pic_offset_table_rtx, either explicitly
10024          or implicitly.  If so, we can commit to using a global pointer
10025          straight away, otherwise we need to defer the decision.  */
10026       if (mips_cfun_has_inflexible_gp_ref_p ()
10027           || mips_cfun_has_flexible_gp_ref_p ())
10028         {
10029           cfun->machine->must_initialize_gp_p = true;
10030           cfun->machine->must_restore_gp_when_clobbered_p = true;
10031         }
10032
10033       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
10034     }
10035
10036   frame = &cfun->machine->frame;
10037   size = frame->total_size;
10038
10039   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
10040      bytes beforehand; this is enough to cover the register save area
10041      without going out of range.  */
10042   if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
10043       || frame->num_cop0_regs > 0)
10044     {
10045       HOST_WIDE_INT step1;
10046
10047       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
10048       if (GENERATE_MIPS16E_SAVE_RESTORE)
10049         {
10050           HOST_WIDE_INT offset;
10051           unsigned int mask, regno;
10052
10053           /* Try to merge argument stores into the save instruction.  */
10054           nargs = mips16e_collect_argument_saves ();
10055
10056           /* Build the save instruction.  */
10057           mask = frame->mask;
10058           insn = mips16e_build_save_restore (false, &mask, &offset,
10059                                              nargs, step1);
10060           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10061           size -= step1;
10062
10063           /* Check if we need to save other registers.  */
10064           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10065             if (BITSET_P (mask, regno - GP_REG_FIRST))
10066               {
10067                 offset -= UNITS_PER_WORD;
10068                 mips_save_restore_reg (word_mode, regno,
10069                                        offset, mips_save_reg);
10070               }
10071         }
10072       else
10073         {
10074           if (cfun->machine->interrupt_handler_p)
10075             {
10076               HOST_WIDE_INT offset;
10077               rtx mem;
10078
10079               /* If this interrupt is using a shadow register set, we need to
10080                  get the stack pointer from the previous register set.  */
10081               if (cfun->machine->use_shadow_register_set_p)
10082                 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
10083                                             stack_pointer_rtx));
10084
10085               if (!cfun->machine->keep_interrupts_masked_p)
10086                 {
10087                   /* Move from COP0 Cause to K0.  */
10088                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
10089                                             gen_rtx_REG (SImode,
10090                                                          COP0_CAUSE_REG_NUM)));
10091                   /* Move from COP0 EPC to K1.  */
10092                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10093                                             gen_rtx_REG (SImode,
10094                                                          COP0_EPC_REG_NUM)));
10095                 }
10096
10097               /* Allocate the first part of the frame.  */
10098               insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
10099                                     GEN_INT (-step1));
10100               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10101               size -= step1;
10102
10103               /* Start at the uppermost location for saving.  */
10104               offset = frame->cop0_sp_offset - size;
10105               if (!cfun->machine->keep_interrupts_masked_p)
10106                 {
10107                   /* Push EPC into its stack slot.  */
10108                   mem = gen_frame_mem (word_mode,
10109                                        plus_constant (stack_pointer_rtx,
10110                                                       offset));
10111                   mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10112                   offset -= UNITS_PER_WORD;
10113                 }
10114
10115               /* Move from COP0 Status to K1.  */
10116               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10117                                         gen_rtx_REG (SImode,
10118                                                      COP0_STATUS_REG_NUM)));
10119
10120               /* Right justify the RIPL in k0.  */
10121               if (!cfun->machine->keep_interrupts_masked_p)
10122                 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
10123                                         gen_rtx_REG (SImode, K0_REG_NUM),
10124                                         GEN_INT (CAUSE_IPL)));
10125
10126               /* Push Status into its stack slot.  */
10127               mem = gen_frame_mem (word_mode,
10128                                    plus_constant (stack_pointer_rtx, offset));
10129               mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10130               offset -= UNITS_PER_WORD;
10131
10132               /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
10133               if (!cfun->machine->keep_interrupts_masked_p)
10134                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10135                                        GEN_INT (6),
10136                                        GEN_INT (SR_IPL),
10137                                        gen_rtx_REG (SImode, K0_REG_NUM)));
10138
10139               if (!cfun->machine->keep_interrupts_masked_p)
10140                 /* Enable interrupts by clearing the KSU ERL and EXL bits.
10141                    IE is already the correct value, so we don't have to do
10142                    anything explicit.  */
10143                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10144                                        GEN_INT (4),
10145                                        GEN_INT (SR_EXL),
10146                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10147               else
10148                 /* Disable interrupts by clearing the KSU, ERL, EXL,
10149                    and IE bits.  */
10150                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10151                                        GEN_INT (5),
10152                                        GEN_INT (SR_IE),
10153                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10154             }
10155           else
10156             {
10157               insn = gen_add3_insn (stack_pointer_rtx,
10158                                     stack_pointer_rtx,
10159                                     GEN_INT (-step1));
10160               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10161               size -= step1;
10162             }
10163           mips_for_each_saved_acc (size, mips_save_reg);
10164           mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
10165         }
10166     }
10167
10168   /* Allocate the rest of the frame.  */
10169   if (size > 0)
10170     {
10171       if (SMALL_OPERAND (-size))
10172         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
10173                                                        stack_pointer_rtx,
10174                                                        GEN_INT (-size)))) = 1;
10175       else
10176         {
10177           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
10178           if (TARGET_MIPS16)
10179             {
10180               /* There are no instructions to add or subtract registers
10181                  from the stack pointer, so use the frame pointer as a
10182                  temporary.  We should always be using a frame pointer
10183                  in this case anyway.  */
10184               gcc_assert (frame_pointer_needed);
10185               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10186               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
10187                                         hard_frame_pointer_rtx,
10188                                         MIPS_PROLOGUE_TEMP (Pmode)));
10189               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
10190             }
10191           else
10192             emit_insn (gen_sub3_insn (stack_pointer_rtx,
10193                                       stack_pointer_rtx,
10194                                       MIPS_PROLOGUE_TEMP (Pmode)));
10195
10196           /* Describe the combined effect of the previous instructions.  */
10197           mips_set_frame_expr
10198             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10199                           plus_constant (stack_pointer_rtx, -size)));
10200         }
10201     }
10202
10203   /* Set up the frame pointer, if we're using one.  */
10204   if (frame_pointer_needed)
10205     {
10206       HOST_WIDE_INT offset;
10207
10208       offset = frame->hard_frame_pointer_offset;
10209       if (offset == 0)
10210         {
10211           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10212           RTX_FRAME_RELATED_P (insn) = 1;
10213         }
10214       else if (SMALL_OPERAND (offset))
10215         {
10216           insn = gen_add3_insn (hard_frame_pointer_rtx,
10217                                 stack_pointer_rtx, GEN_INT (offset));
10218           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10219         }
10220       else
10221         {
10222           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
10223           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10224           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
10225                                     hard_frame_pointer_rtx,
10226                                     MIPS_PROLOGUE_TEMP (Pmode)));
10227           mips_set_frame_expr
10228             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10229                           plus_constant (stack_pointer_rtx, offset)));
10230         }
10231     }
10232
10233   mips_emit_loadgp ();
10234
10235   /* Initialize the $gp save slot.  */
10236   if (mips_cfun_has_cprestore_slot_p ())
10237     {
10238       rtx base, mem, gp, temp;
10239       HOST_WIDE_INT offset;
10240
10241       mips_get_cprestore_base_and_offset (&base, &offset, false);
10242       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10243       gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10244       temp = (SMALL_OPERAND (offset)
10245               ? gen_rtx_SCRATCH (Pmode)
10246               : MIPS_PROLOGUE_TEMP (Pmode));
10247       emit_insn (gen_potential_cprestore (mem, GEN_INT (offset), gp, temp));
10248
10249       mips_get_cprestore_base_and_offset (&base, &offset, true);
10250       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10251       emit_insn (gen_use_cprestore (mem));
10252     }
10253
10254   /* We need to search back to the last use of K0 or K1.  */
10255   if (cfun->machine->interrupt_handler_p)
10256     {
10257       for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
10258         if (INSN_P (insn)
10259             && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
10260           break;
10261       /* Emit a move from K1 to COP0 Status after insn.  */
10262       gcc_assert (insn != NULL_RTX);
10263       emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10264                                       gen_rtx_REG (SImode, K1_REG_NUM)),
10265                        insn);
10266     }
10267
10268   /* If we are profiling, make sure no instructions are scheduled before
10269      the call to mcount.  */
10270   if (crtl->profile)
10271     emit_insn (gen_blockage ());
10272 }
10273 \f
10274 /* Emit instructions to restore register REG from slot MEM.  */
10275
10276 static void
10277 mips_restore_reg (rtx reg, rtx mem)
10278 {
10279   /* There's no MIPS16 instruction to load $31 directly.  Load into
10280      $7 instead and adjust the return insn appropriately.  */
10281   if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
10282     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
10283
10284   mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
10285 }
10286
10287 /* Emit any instructions needed before a return.  */
10288
10289 void
10290 mips_expand_before_return (void)
10291 {
10292   /* When using a call-clobbered gp, we start out with unified call
10293      insns that include instructions to restore the gp.  We then split
10294      these unified calls after reload.  These split calls explicitly
10295      clobber gp, so there is no need to define
10296      PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
10297
10298      For consistency, we should also insert an explicit clobber of $28
10299      before return insns, so that the post-reload optimizers know that
10300      the register is not live on exit.  */
10301   if (TARGET_CALL_CLOBBERED_GP)
10302     emit_clobber (pic_offset_table_rtx);
10303 }
10304
10305 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
10306    says which.  */
10307
10308 void
10309 mips_expand_epilogue (bool sibcall_p)
10310 {
10311   const struct mips_frame_info *frame;
10312   HOST_WIDE_INT step1, step2;
10313   rtx base, target, insn;
10314
10315   if (!sibcall_p && mips_can_use_return_insn ())
10316     {
10317       emit_jump_insn (gen_return ());
10318       return;
10319     }
10320
10321   /* In MIPS16 mode, if the return value should go into a floating-point
10322      register, we need to call a helper routine to copy it over.  */
10323   if (mips16_cfun_returns_in_fpr_p ())
10324     mips16_copy_fpr_return_value ();
10325
10326   /* Split the frame into two.  STEP1 is the amount of stack we should
10327      deallocate before restoring the registers.  STEP2 is the amount we
10328      should deallocate afterwards.
10329
10330      Start off by assuming that no registers need to be restored.  */
10331   frame = &cfun->machine->frame;
10332   step1 = frame->total_size;
10333   step2 = 0;
10334
10335   /* Work out which register holds the frame address.  */
10336   if (!frame_pointer_needed)
10337     base = stack_pointer_rtx;
10338   else
10339     {
10340       base = hard_frame_pointer_rtx;
10341       step1 -= frame->hard_frame_pointer_offset;
10342     }
10343
10344   /* If we need to restore registers, deallocate as much stack as
10345      possible in the second step without going out of range.  */
10346   if ((frame->mask | frame->fmask | frame->acc_mask) != 0
10347       || frame->num_cop0_regs > 0)
10348     {
10349       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
10350       step1 -= step2;
10351     }
10352
10353   /* Set TARGET to BASE + STEP1.  */
10354   target = base;
10355   if (step1 > 0)
10356     {
10357       rtx adjust;
10358
10359       /* Get an rtx for STEP1 that we can add to BASE.  */
10360       adjust = GEN_INT (step1);
10361       if (!SMALL_OPERAND (step1))
10362         {
10363           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
10364           adjust = MIPS_EPILOGUE_TEMP (Pmode);
10365         }
10366
10367       /* Normal mode code can copy the result straight into $sp.  */
10368       if (!TARGET_MIPS16)
10369         target = stack_pointer_rtx;
10370
10371       emit_insn (gen_add3_insn (target, base, adjust));
10372     }
10373
10374   /* Copy TARGET into the stack pointer.  */
10375   if (target != stack_pointer_rtx)
10376     mips_emit_move (stack_pointer_rtx, target);
10377
10378   /* If we're using addressing macros, $gp is implicitly used by all
10379      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
10380      from the stack.  */
10381   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
10382     emit_insn (gen_blockage ());
10383
10384   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
10385     {
10386       unsigned int regno, mask;
10387       HOST_WIDE_INT offset;
10388       rtx restore;
10389
10390       /* Generate the restore instruction.  */
10391       mask = frame->mask;
10392       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
10393
10394       /* Restore any other registers manually.  */
10395       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10396         if (BITSET_P (mask, regno - GP_REG_FIRST))
10397           {
10398             offset -= UNITS_PER_WORD;
10399             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
10400           }
10401
10402       /* Restore the remaining registers and deallocate the final bit
10403          of the frame.  */
10404       emit_insn (restore);
10405     }
10406   else
10407     {
10408       /* Restore the registers.  */
10409       mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
10410       mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
10411                                        mips_restore_reg);
10412
10413       if (cfun->machine->interrupt_handler_p)
10414         {
10415           HOST_WIDE_INT offset;
10416           rtx mem;
10417
10418           offset = frame->cop0_sp_offset - (frame->total_size - step2);
10419           if (!cfun->machine->keep_interrupts_masked_p)
10420             {
10421               /* Restore the original EPC.  */
10422               mem = gen_frame_mem (word_mode,
10423                                    plus_constant (stack_pointer_rtx, offset));
10424               mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10425               offset -= UNITS_PER_WORD;
10426
10427               /* Move to COP0 EPC.  */
10428               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
10429                                         gen_rtx_REG (SImode, K0_REG_NUM)));
10430             }
10431
10432           /* Restore the original Status.  */
10433           mem = gen_frame_mem (word_mode,
10434                                plus_constant (stack_pointer_rtx, offset));
10435           mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10436           offset -= UNITS_PER_WORD;
10437
10438           /* If we don't use shoadow register set, we need to update SP.  */
10439           if (!cfun->machine->use_shadow_register_set_p && step2 > 0)
10440             emit_insn (gen_add3_insn (stack_pointer_rtx,
10441                                       stack_pointer_rtx,
10442                                       GEN_INT (step2)));
10443
10444           /* Move to COP0 Status.  */
10445           emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10446                                     gen_rtx_REG (SImode, K0_REG_NUM)));
10447         }
10448       else
10449         {
10450           /* Deallocate the final bit of the frame.  */
10451           if (step2 > 0)
10452             emit_insn (gen_add3_insn (stack_pointer_rtx,
10453                                       stack_pointer_rtx,
10454                                       GEN_INT (step2)));
10455         }
10456     }
10457
10458   /* Add in the __builtin_eh_return stack adjustment.  We need to
10459      use a temporary in MIPS16 code.  */
10460   if (crtl->calls_eh_return)
10461     {
10462       if (TARGET_MIPS16)
10463         {
10464           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
10465           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
10466                                     MIPS_EPILOGUE_TEMP (Pmode),
10467                                     EH_RETURN_STACKADJ_RTX));
10468           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
10469         }
10470       else
10471         emit_insn (gen_add3_insn (stack_pointer_rtx,
10472                                   stack_pointer_rtx,
10473                                   EH_RETURN_STACKADJ_RTX));
10474     }
10475
10476   if (!sibcall_p)
10477     {
10478       mips_expand_before_return ();
10479       if (cfun->machine->interrupt_handler_p)
10480         {
10481           /* Interrupt handlers generate eret or deret.  */
10482           if (cfun->machine->use_debug_exception_return_p)
10483             emit_jump_insn (gen_mips_deret ());
10484           else
10485             emit_jump_insn (gen_mips_eret ());
10486         }
10487       else
10488         {
10489           unsigned int regno;
10490
10491           /* When generating MIPS16 code, the normal
10492              mips_for_each_saved_gpr_and_fpr path will restore the return
10493              address into $7 rather than $31.  */
10494           if (TARGET_MIPS16
10495               && !GENERATE_MIPS16E_SAVE_RESTORE
10496               && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
10497             regno = GP_REG_FIRST + 7;
10498           else
10499             regno = RETURN_ADDR_REGNUM;
10500           emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
10501         }
10502     }
10503
10504   /* Search from the beginning to the first use of K0 or K1.  */
10505   if (cfun->machine->interrupt_handler_p
10506       && !cfun->machine->keep_interrupts_masked_p)
10507     {
10508       for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
10509         if (INSN_P (insn)
10510             && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
10511           break;
10512       gcc_assert (insn != NULL_RTX);
10513       /* Insert disable interrupts before the first use of K0 or K1.  */
10514       emit_insn_before (gen_mips_di (), insn);
10515       emit_insn_before (gen_mips_ehb (), insn);
10516     }
10517 }
10518 \f
10519 /* Return nonzero if this function is known to have a null epilogue.
10520    This allows the optimizer to omit jumps to jumps if no stack
10521    was created.  */
10522
10523 bool
10524 mips_can_use_return_insn (void)
10525 {
10526   /* Interrupt handlers need to go through the epilogue.  */
10527   if (cfun->machine->interrupt_handler_p)
10528     return false;
10529
10530   if (!reload_completed)
10531     return false;
10532
10533   if (crtl->profile)
10534     return false;
10535
10536   /* In MIPS16 mode, a function that returns a floating-point value
10537      needs to arrange to copy the return value into the floating-point
10538      registers.  */
10539   if (mips16_cfun_returns_in_fpr_p ())
10540     return false;
10541
10542   return cfun->machine->frame.total_size == 0;
10543 }
10544 \f
10545 /* Return true if register REGNO can store a value of mode MODE.
10546    The result of this function is cached in mips_hard_regno_mode_ok.  */
10547
10548 static bool
10549 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
10550 {
10551   unsigned int size;
10552   enum mode_class mclass;
10553
10554   if (mode == CCV2mode)
10555     return (ISA_HAS_8CC
10556             && ST_REG_P (regno)
10557             && (regno - ST_REG_FIRST) % 2 == 0);
10558
10559   if (mode == CCV4mode)
10560     return (ISA_HAS_8CC
10561             && ST_REG_P (regno)
10562             && (regno - ST_REG_FIRST) % 4 == 0);
10563
10564   if (mode == CCmode)
10565     {
10566       if (!ISA_HAS_8CC)
10567         return regno == FPSW_REGNUM;
10568
10569       return (ST_REG_P (regno)
10570               || GP_REG_P (regno)
10571               || FP_REG_P (regno));
10572     }
10573
10574   size = GET_MODE_SIZE (mode);
10575   mclass = GET_MODE_CLASS (mode);
10576
10577   if (GP_REG_P (regno))
10578     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
10579
10580   if (FP_REG_P (regno)
10581       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
10582           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
10583     {
10584       /* Allow TFmode for CCmode reloads.  */
10585       if (mode == TFmode && ISA_HAS_8CC)
10586         return true;
10587
10588       /* Allow 64-bit vector modes for Loongson-2E/2F.  */
10589       if (TARGET_LOONGSON_VECTORS
10590           && (mode == V2SImode
10591               || mode == V4HImode
10592               || mode == V8QImode
10593               || mode == DImode))
10594         return true;
10595
10596       if (mclass == MODE_FLOAT
10597           || mclass == MODE_COMPLEX_FLOAT
10598           || mclass == MODE_VECTOR_FLOAT)
10599         return size <= UNITS_PER_FPVALUE;
10600
10601       /* Allow integer modes that fit into a single register.  We need
10602          to put integers into FPRs when using instructions like CVT
10603          and TRUNC.  There's no point allowing sizes smaller than a word,
10604          because the FPU has no appropriate load/store instructions.  */
10605       if (mclass == MODE_INT)
10606         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
10607     }
10608
10609   if (ACC_REG_P (regno)
10610       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
10611     {
10612       if (MD_REG_P (regno))
10613         {
10614           /* After a multiplication or division, clobbering HI makes
10615              the value of LO unpredictable, and vice versa.  This means
10616              that, for all interesting cases, HI and LO are effectively
10617              a single register.
10618
10619              We model this by requiring that any value that uses HI
10620              also uses LO.  */
10621           if (size <= UNITS_PER_WORD * 2)
10622             return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
10623         }
10624       else
10625         {
10626           /* DSP accumulators do not have the same restrictions as
10627              HI and LO, so we can treat them as normal doubleword
10628              registers.  */
10629           if (size <= UNITS_PER_WORD)
10630             return true;
10631
10632           if (size <= UNITS_PER_WORD * 2
10633               && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
10634             return true;
10635         }
10636     }
10637
10638   if (ALL_COP_REG_P (regno))
10639     return mclass == MODE_INT && size <= UNITS_PER_WORD;
10640
10641   if (regno == GOT_VERSION_REGNUM)
10642     return mode == SImode;
10643
10644   return false;
10645 }
10646
10647 /* Implement HARD_REGNO_NREGS.  */
10648
10649 unsigned int
10650 mips_hard_regno_nregs (int regno, enum machine_mode mode)
10651 {
10652   if (ST_REG_P (regno))
10653     /* The size of FP status registers is always 4, because they only hold
10654        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
10655     return (GET_MODE_SIZE (mode) + 3) / 4;
10656
10657   if (FP_REG_P (regno))
10658     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
10659
10660   /* All other registers are word-sized.  */
10661   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
10662 }
10663
10664 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
10665    in mips_hard_regno_nregs.  */
10666
10667 int
10668 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
10669 {
10670   int size;
10671   HARD_REG_SET left;
10672
10673   size = 0x8000;
10674   COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
10675   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
10676     {
10677       size = MIN (size, 4);
10678       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
10679     }
10680   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
10681     {
10682       size = MIN (size, UNITS_PER_FPREG);
10683       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
10684     }
10685   if (!hard_reg_set_empty_p (left))
10686     size = MIN (size, UNITS_PER_WORD);
10687   return (GET_MODE_SIZE (mode) + size - 1) / size;
10688 }
10689
10690 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
10691
10692 bool
10693 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
10694                                enum machine_mode to ATTRIBUTE_UNUSED,
10695                                enum reg_class rclass)
10696 {
10697   /* There are several problems with changing the modes of values
10698      in floating-point registers:
10699
10700      - When a multi-word value is stored in paired floating-point
10701        registers, the first register always holds the low word.
10702        We therefore can't allow FPRs to change between single-word
10703        and multi-word modes on big-endian targets.
10704
10705      - GCC assumes that each word of a multiword register can be accessed
10706        individually using SUBREGs.  This is not true for floating-point
10707        registers if they are bigger than a word.
10708
10709      - Loading a 32-bit value into a 64-bit floating-point register
10710        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
10711        We can't allow FPRs to change from SImode to to a wider mode on
10712        64-bit targets.
10713
10714      - If the FPU has already interpreted a value in one format, we must
10715        not ask it to treat the value as having a different format.
10716
10717      We therefore disallow all mode changes involving FPRs.  */
10718   return reg_classes_intersect_p (FP_REGS, rclass);
10719 }
10720
10721 /* Implement target hook small_register_classes_for_mode_p.  */
10722
10723 static bool
10724 mips_small_register_classes_for_mode_p (enum machine_mode mode
10725                                         ATTRIBUTE_UNUSED)
10726 {
10727   return TARGET_MIPS16;
10728 }
10729
10730 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
10731
10732 static bool
10733 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
10734 {
10735   switch (mode)
10736     {
10737     case SFmode:
10738       return TARGET_HARD_FLOAT;
10739
10740     case DFmode:
10741       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
10742
10743     case V2SFmode:
10744       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
10745
10746     default:
10747       return false;
10748     }
10749 }
10750
10751 /* Implement MODES_TIEABLE_P.  */
10752
10753 bool
10754 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
10755 {
10756   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
10757      prefer to put one of them in FPRs.  */
10758   return (mode1 == mode2
10759           || (!mips_mode_ok_for_mov_fmt_p (mode1)
10760               && !mips_mode_ok_for_mov_fmt_p (mode2)));
10761 }
10762
10763 /* Implement PREFERRED_RELOAD_CLASS.  */
10764
10765 enum reg_class
10766 mips_preferred_reload_class (rtx x, enum reg_class rclass)
10767 {
10768   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
10769     return LEA_REGS;
10770
10771   if (reg_class_subset_p (FP_REGS, rclass)
10772       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
10773     return FP_REGS;
10774
10775   if (reg_class_subset_p (GR_REGS, rclass))
10776     rclass = GR_REGS;
10777
10778   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
10779     rclass = M16_REGS;
10780
10781   return rclass;
10782 }
10783
10784 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
10785    Return a "canonical" class to represent it in later calculations.  */
10786
10787 static enum reg_class
10788 mips_canonicalize_move_class (enum reg_class rclass)
10789 {
10790   /* All moves involving accumulator registers have the same cost.  */
10791   if (reg_class_subset_p (rclass, ACC_REGS))
10792     rclass = ACC_REGS;
10793
10794   /* Likewise promote subclasses of general registers to the most
10795      interesting containing class.  */
10796   if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
10797     rclass = M16_REGS;
10798   else if (reg_class_subset_p (rclass, GENERAL_REGS))
10799     rclass = GENERAL_REGS;
10800
10801   return rclass;
10802 }
10803
10804 /* Return the cost of moving a value of mode MODE from a register of
10805    class FROM to a GPR.  Return 0 for classes that are unions of other
10806    classes handled by this function.  */
10807
10808 static int
10809 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10810                        enum reg_class from)
10811 {
10812   switch (from)
10813     {
10814     case GENERAL_REGS:
10815       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10816       return 2;
10817
10818     case ACC_REGS:
10819       /* MFLO and MFHI.  */
10820       return 6;
10821
10822     case FP_REGS:
10823       /* MFC1, etc.  */
10824       return 4;
10825
10826     case ST_REGS:
10827       /* LUI followed by MOVF.  */
10828       return 4;
10829
10830     case COP0_REGS:
10831     case COP2_REGS:
10832     case COP3_REGS:
10833       /* This choice of value is historical.  */
10834       return 5;
10835
10836     default:
10837       return 0;
10838     }
10839 }
10840
10841 /* Return the cost of moving a value of mode MODE from a GPR to a
10842    register of class TO.  Return 0 for classes that are unions of
10843    other classes handled by this function.  */
10844
10845 static int
10846 mips_move_from_gpr_cost (enum machine_mode mode, enum reg_class to)
10847 {
10848   switch (to)
10849     {
10850     case GENERAL_REGS:
10851       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10852       return 2;
10853
10854     case ACC_REGS:
10855       /* MTLO and MTHI.  */
10856       return 6;
10857
10858     case FP_REGS:
10859       /* MTC1, etc.  */
10860       return 4;
10861
10862     case ST_REGS:
10863       /* A secondary reload through an FPR scratch.  */
10864       return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
10865               + mips_register_move_cost (mode, FP_REGS, ST_REGS));
10866
10867     case COP0_REGS:
10868     case COP2_REGS:
10869     case COP3_REGS:
10870       /* This choice of value is historical.  */
10871       return 5;
10872
10873     default:
10874       return 0;
10875     }
10876 }
10877
10878 /* Implement REGISTER_MOVE_COST.  Return 0 for classes that are the
10879    maximum of the move costs for subclasses; regclass will work out
10880    the maximum for us.  */
10881
10882 int
10883 mips_register_move_cost (enum machine_mode mode,
10884                          enum reg_class from, enum reg_class to)
10885 {
10886   enum reg_class dregs;
10887   int cost1, cost2;
10888
10889   from = mips_canonicalize_move_class (from);
10890   to = mips_canonicalize_move_class (to);
10891
10892   /* Handle moves that can be done without using general-purpose registers.  */
10893   if (from == FP_REGS)
10894     {
10895       if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
10896         /* MOV.FMT.  */
10897         return 4;
10898       if (to == ST_REGS)
10899         /* The sequence generated by mips_expand_fcc_reload.  */
10900         return 8;
10901     }
10902
10903   /* Handle cases in which only one class deviates from the ideal.  */
10904   dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
10905   if (from == dregs)
10906     return mips_move_from_gpr_cost (mode, to);
10907   if (to == dregs)
10908     return mips_move_to_gpr_cost (mode, from);
10909
10910   /* Handles cases that require a GPR temporary.  */
10911   cost1 = mips_move_to_gpr_cost (mode, from);
10912   if (cost1 != 0)
10913     {
10914       cost2 = mips_move_from_gpr_cost (mode, to);
10915       if (cost2 != 0)
10916         return cost1 + cost2;
10917     }
10918
10919   return 0;
10920 }
10921
10922 /* Implement TARGET_IRA_COVER_CLASSES.  */
10923
10924 static const enum reg_class *
10925 mips_ira_cover_classes (void)
10926 {
10927   static const enum reg_class acc_classes[] = {
10928     GR_AND_ACC_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10929     ST_REGS, LIM_REG_CLASSES
10930   };
10931   static const enum reg_class no_acc_classes[] = {
10932     GR_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10933     ST_REGS, LIM_REG_CLASSES
10934   };
10935
10936   /* Don't allow the register allocators to use LO and HI in MIPS16 mode,
10937      which has no MTLO or MTHI instructions.  Also, using GR_AND_ACC_REGS
10938      as a cover class only works well when we keep per-register costs.
10939      Using it when not optimizing can cause us to think accumulators
10940      have the same cost as GPRs in cases where GPRs are actually much
10941      cheaper.  */
10942   return TARGET_MIPS16 || !optimize ? no_acc_classes : acc_classes;
10943 }
10944
10945 /* Return the register class required for a secondary register when
10946    copying between one of the registers in RCLASS and value X, which
10947    has mode MODE.  X is the source of the move if IN_P, otherwise it
10948    is the destination.  Return NO_REGS if no secondary register is
10949    needed.  */
10950
10951 enum reg_class
10952 mips_secondary_reload_class (enum reg_class rclass,
10953                              enum machine_mode mode, rtx x, bool in_p)
10954 {
10955   int regno;
10956
10957   /* If X is a constant that cannot be loaded into $25, it must be loaded
10958      into some other GPR.  No other register class allows a direct move.  */
10959   if (mips_dangerous_for_la25_p (x))
10960     return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
10961
10962   regno = true_regnum (x);
10963   if (TARGET_MIPS16)
10964     {
10965       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
10966       if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
10967         return M16_REGS;
10968
10969       return NO_REGS;
10970     }
10971
10972   /* Copying from accumulator registers to anywhere other than a general
10973      register requires a temporary general register.  */
10974   if (reg_class_subset_p (rclass, ACC_REGS))
10975     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10976   if (ACC_REG_P (regno))
10977     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10978
10979   /* We can only copy a value to a condition code register from a
10980      floating-point register, and even then we require a scratch
10981      floating-point register.  We can only copy a value out of a
10982      condition-code register into a general register.  */
10983   if (reg_class_subset_p (rclass, ST_REGS))
10984     {
10985       if (in_p)
10986         return FP_REGS;
10987       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10988     }
10989   if (ST_REG_P (regno))
10990     {
10991       if (!in_p)
10992         return FP_REGS;
10993       return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10994     }
10995
10996   if (reg_class_subset_p (rclass, FP_REGS))
10997     {
10998       if (MEM_P (x)
10999           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
11000         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
11001            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
11002         return NO_REGS;
11003
11004       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
11005         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
11006         return NO_REGS;
11007
11008       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
11009         /* We can force the constant to memory and use lwc1
11010            and ldc1.  As above, we will use pairs of lwc1s if
11011            ldc1 is not supported.  */
11012         return NO_REGS;
11013
11014       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
11015         /* In this case we can use mov.fmt.  */
11016         return NO_REGS;
11017
11018       /* Otherwise, we need to reload through an integer register.  */
11019       return GR_REGS;
11020     }
11021   if (FP_REG_P (regno))
11022     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11023
11024   return NO_REGS;
11025 }
11026
11027 /* Implement TARGET_MODE_REP_EXTENDED.  */
11028
11029 static int
11030 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
11031 {
11032   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
11033   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
11034     return SIGN_EXTEND;
11035
11036   return UNKNOWN;
11037 }
11038 \f
11039 /* Implement TARGET_VALID_POINTER_MODE.  */
11040
11041 static bool
11042 mips_valid_pointer_mode (enum machine_mode mode)
11043 {
11044   return mode == SImode || (TARGET_64BIT && mode == DImode);
11045 }
11046
11047 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
11048
11049 static bool
11050 mips_vector_mode_supported_p (enum machine_mode mode)
11051 {
11052   switch (mode)
11053     {
11054     case V2SFmode:
11055       return TARGET_PAIRED_SINGLE_FLOAT;
11056
11057     case V2HImode:
11058     case V4QImode:
11059     case V2HQmode:
11060     case V2UHQmode:
11061     case V2HAmode:
11062     case V2UHAmode:
11063     case V4QQmode:
11064     case V4UQQmode:
11065       return TARGET_DSP;
11066
11067     case V2SImode:
11068     case V4HImode:
11069     case V8QImode:
11070       return TARGET_LOONGSON_VECTORS;
11071
11072     default:
11073       return false;
11074     }
11075 }
11076
11077 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
11078
11079 static bool
11080 mips_scalar_mode_supported_p (enum machine_mode mode)
11081 {
11082   if (ALL_FIXED_POINT_MODE_P (mode)
11083       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
11084     return true;
11085
11086   return default_scalar_mode_supported_p (mode);
11087 }
11088 \f
11089 /* Implement TARGET_INIT_LIBFUNCS.  */
11090
11091 #include "config/gofast.h"
11092
11093 static void
11094 mips_init_libfuncs (void)
11095 {
11096   if (TARGET_FIX_VR4120)
11097     {
11098       /* Register the special divsi3 and modsi3 functions needed to work
11099          around VR4120 division errata.  */
11100       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
11101       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
11102     }
11103
11104   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
11105     {
11106       /* Register the MIPS16 -mhard-float stubs.  */
11107       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
11108       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
11109       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
11110       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
11111
11112       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
11113       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
11114       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
11115       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
11116       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
11117       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
11118       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
11119
11120       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
11121       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
11122       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
11123
11124       if (TARGET_DOUBLE_FLOAT)
11125         {
11126           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
11127           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
11128           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
11129           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
11130
11131           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
11132           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
11133           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
11134           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
11135           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
11136           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
11137           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
11138
11139           set_conv_libfunc (sext_optab, DFmode, SFmode,
11140                             "__mips16_extendsfdf2");
11141           set_conv_libfunc (trunc_optab, SFmode, DFmode,
11142                             "__mips16_truncdfsf2");
11143           set_conv_libfunc (sfix_optab, SImode, DFmode,
11144                             "__mips16_fix_truncdfsi");
11145           set_conv_libfunc (sfloat_optab, DFmode, SImode,
11146                             "__mips16_floatsidf");
11147           set_conv_libfunc (ufloat_optab, DFmode, SImode,
11148                             "__mips16_floatunsidf");
11149         }
11150     }
11151   else
11152     /* Register the gofast functions if selected using --enable-gofast.  */
11153     gofast_maybe_init_libfuncs ();
11154
11155   /* The MIPS16 ISA does not have an encoding for "sync", so we rely
11156      on an external non-MIPS16 routine to implement __sync_synchronize.  */
11157   if (TARGET_MIPS16)
11158     synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
11159 }
11160
11161 /* Build up a multi-insn sequence that loads label TARGET into $AT.  */
11162
11163 static void
11164 mips_process_load_label (rtx target)
11165 {
11166   rtx base, gp, intop;
11167   HOST_WIDE_INT offset;
11168
11169   mips_multi_start ();
11170   switch (mips_abi)
11171     {
11172     case ABI_N32:
11173       mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
11174       mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
11175       break;
11176
11177     case ABI_64:
11178       mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
11179       mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
11180       break;
11181
11182     default:
11183       gp = pic_offset_table_rtx;
11184       if (mips_cfun_has_cprestore_slot_p ())
11185         {
11186           gp = gen_rtx_REG (Pmode, AT_REGNUM);
11187           mips_get_cprestore_base_and_offset (&base, &offset, true);
11188           if (!SMALL_OPERAND (offset))
11189             {
11190               intop = GEN_INT (CONST_HIGH_PART (offset));
11191               mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
11192               mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
11193
11194               base = gp;
11195               offset = CONST_LOW_PART (offset);
11196             }
11197           intop = GEN_INT (offset);
11198           if (ISA_HAS_LOAD_DELAY)
11199             mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
11200           else
11201             mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
11202         }
11203       if (ISA_HAS_LOAD_DELAY)
11204         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
11205       else
11206         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
11207       mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
11208       break;
11209     }
11210 }
11211
11212 /* Return the number of instructions needed to load a label into $AT.  */
11213
11214 static unsigned int
11215 mips_load_label_length (void)
11216 {
11217   if (cfun->machine->load_label_length == 0)
11218     {
11219       mips_process_load_label (pc_rtx);
11220       cfun->machine->load_label_length = mips_multi_num_insns;
11221     }
11222   return cfun->machine->load_label_length;
11223 }
11224
11225 /* Emit an asm sequence to start a noat block and load the address
11226    of a label into $1.  */
11227
11228 void
11229 mips_output_load_label (rtx target)
11230 {
11231   mips_push_asm_switch (&mips_noat);
11232   if (TARGET_EXPLICIT_RELOCS)
11233     {
11234       mips_process_load_label (target);
11235       mips_multi_write ();
11236     }
11237   else
11238     {
11239       if (Pmode == DImode)
11240         output_asm_insn ("dla\t%@,%0", &target);
11241       else
11242         output_asm_insn ("la\t%@,%0", &target);
11243     }
11244 }
11245
11246 /* Return the length of INSN.  LENGTH is the initial length computed by
11247    attributes in the machine-description file.  */
11248
11249 int
11250 mips_adjust_insn_length (rtx insn, int length)
11251 {
11252   /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
11253      of a PIC long-branch sequence.  Substitute the correct value.  */
11254   if (length == MAX_PIC_BRANCH_LENGTH
11255       && INSN_CODE (insn) >= 0
11256       && get_attr_type (insn) == TYPE_BRANCH)
11257     {
11258       /* Add the branch-over instruction and its delay slot, if this
11259          is a conditional branch.  */
11260       length = simplejump_p (insn) ? 0 : 8;
11261
11262       /* Load the label into $AT and jump to it.  Ignore the delay
11263          slot of the jump.  */
11264       length += mips_load_label_length () + 4;
11265     }
11266
11267   /* A unconditional jump has an unfilled delay slot if it is not part
11268      of a sequence.  A conditional jump normally has a delay slot, but
11269      does not on MIPS16.  */
11270   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
11271     length += 4;
11272
11273   /* See how many nops might be needed to avoid hardware hazards.  */
11274   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
11275     switch (get_attr_hazard (insn))
11276       {
11277       case HAZARD_NONE:
11278         break;
11279
11280       case HAZARD_DELAY:
11281         length += 4;
11282         break;
11283
11284       case HAZARD_HILO:
11285         length += 8;
11286         break;
11287       }
11288
11289   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
11290      the .md file length attributes are 4-based for both modes.
11291      Adjust the MIPS16 ones here.  */
11292   if (TARGET_MIPS16)
11293     length /= 2;
11294
11295   return length;
11296 }
11297
11298 /* Return the assembly code for INSN, which has the operands given by
11299    OPERANDS, and which branches to OPERANDS[0] if some condition is true.
11300    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
11301    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
11302    version of BRANCH_IF_TRUE.  */
11303
11304 const char *
11305 mips_output_conditional_branch (rtx insn, rtx *operands,
11306                                 const char *branch_if_true,
11307                                 const char *branch_if_false)
11308 {
11309   unsigned int length;
11310   rtx taken, not_taken;
11311
11312   gcc_assert (LABEL_P (operands[0]));
11313
11314   length = get_attr_length (insn);
11315   if (length <= 8)
11316     {
11317       /* Just a simple conditional branch.  */
11318       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
11319       return branch_if_true;
11320     }
11321
11322   /* Generate a reversed branch around a direct jump.  This fallback does
11323      not use branch-likely instructions.  */
11324   mips_branch_likely = false;
11325   not_taken = gen_label_rtx ();
11326   taken = operands[0];
11327
11328   /* Generate the reversed branch to NOT_TAKEN.  */
11329   operands[0] = not_taken;
11330   output_asm_insn (branch_if_false, operands);
11331
11332   /* If INSN has a delay slot, we must provide delay slots for both the
11333      branch to NOT_TAKEN and the conditional jump.  We must also ensure
11334      that INSN's delay slot is executed in the appropriate cases.  */
11335   if (final_sequence)
11336     {
11337       /* This first delay slot will always be executed, so use INSN's
11338          delay slot if is not annulled.  */
11339       if (!INSN_ANNULLED_BRANCH_P (insn))
11340         {
11341           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11342                            asm_out_file, optimize, 1, NULL);
11343           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11344         }
11345       else
11346         output_asm_insn ("nop", 0);
11347       fprintf (asm_out_file, "\n");
11348     }
11349
11350   /* Output the unconditional branch to TAKEN.  */
11351   if (TARGET_ABSOLUTE_JUMPS)
11352     output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
11353   else
11354     {
11355       mips_output_load_label (taken);
11356       output_asm_insn ("jr\t%@%]%/", 0);
11357     }
11358
11359   /* Now deal with its delay slot; see above.  */
11360   if (final_sequence)
11361     {
11362       /* This delay slot will only be executed if the branch is taken.
11363          Use INSN's delay slot if is annulled.  */
11364       if (INSN_ANNULLED_BRANCH_P (insn))
11365         {
11366           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11367                            asm_out_file, optimize, 1, NULL);
11368           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11369         }
11370       else
11371         output_asm_insn ("nop", 0);
11372       fprintf (asm_out_file, "\n");
11373     }
11374
11375   /* Output NOT_TAKEN.  */
11376   targetm.asm_out.internal_label (asm_out_file, "L",
11377                                   CODE_LABEL_NUMBER (not_taken));
11378   return "";
11379 }
11380
11381 /* Return the assembly code for INSN, which branches to OPERANDS[0]
11382    if some ordering condition is true.  The condition is given by
11383    OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
11384    OPERANDS[1].  OPERANDS[2] is the comparison's first operand;
11385    its second is always zero.  */
11386
11387 const char *
11388 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
11389 {
11390   const char *branch[2];
11391
11392   /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
11393      Make BRANCH[0] branch on the inverse condition.  */
11394   switch (GET_CODE (operands[1]))
11395     {
11396       /* These cases are equivalent to comparisons against zero.  */
11397     case LEU:
11398       inverted_p = !inverted_p;
11399       /* Fall through.  */
11400     case GTU:
11401       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
11402       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
11403       break;
11404
11405       /* These cases are always true or always false.  */
11406     case LTU:
11407       inverted_p = !inverted_p;
11408       /* Fall through.  */
11409     case GEU:
11410       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
11411       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
11412       break;
11413
11414     default:
11415       branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
11416       branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
11417       break;
11418     }
11419   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
11420 }
11421 \f
11422 /* Start a block of code that needs access to the LL, SC and SYNC
11423    instructions.  */
11424
11425 static void
11426 mips_start_ll_sc_sync_block (void)
11427 {
11428   if (!ISA_HAS_LL_SC)
11429     {
11430       output_asm_insn (".set\tpush", 0);
11431       output_asm_insn (".set\tmips2", 0);
11432     }
11433 }
11434
11435 /* End a block started by mips_start_ll_sc_sync_block.  */
11436
11437 static void
11438 mips_end_ll_sc_sync_block (void)
11439 {
11440   if (!ISA_HAS_LL_SC)
11441     output_asm_insn (".set\tpop", 0);
11442 }
11443
11444 /* Output and/or return the asm template for a sync instruction.  */
11445
11446 const char *
11447 mips_output_sync (void)
11448 {
11449   mips_start_ll_sc_sync_block ();
11450   output_asm_insn ("sync", 0);
11451   mips_end_ll_sc_sync_block ();
11452   return "";
11453 }
11454
11455 /* Return the asm template associated with sync_insn1 value TYPE.
11456    IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation.  */
11457
11458 static const char *
11459 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
11460 {
11461   switch (type)
11462     {
11463     case SYNC_INSN1_MOVE:
11464       return "move\t%0,%z2";
11465     case SYNC_INSN1_LI:
11466       return "li\t%0,%2";
11467     case SYNC_INSN1_ADDU:
11468       return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
11469     case SYNC_INSN1_ADDIU:
11470       return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
11471     case SYNC_INSN1_SUBU:
11472       return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
11473     case SYNC_INSN1_AND:
11474       return "and\t%0,%1,%z2";
11475     case SYNC_INSN1_ANDI:
11476       return "andi\t%0,%1,%2";
11477     case SYNC_INSN1_OR:
11478       return "or\t%0,%1,%z2";
11479     case SYNC_INSN1_ORI:
11480       return "ori\t%0,%1,%2";
11481     case SYNC_INSN1_XOR:
11482       return "xor\t%0,%1,%z2";
11483     case SYNC_INSN1_XORI:
11484       return "xori\t%0,%1,%2";
11485     }
11486   gcc_unreachable ();
11487 }
11488
11489 /* Return the asm template associated with sync_insn2 value TYPE.  */
11490
11491 static const char *
11492 mips_sync_insn2_template (enum attr_sync_insn2 type)
11493 {
11494   switch (type)
11495     {
11496     case SYNC_INSN2_NOP:
11497       gcc_unreachable ();
11498     case SYNC_INSN2_AND:
11499       return "and\t%0,%1,%z2";
11500     case SYNC_INSN2_XOR:
11501       return "xor\t%0,%1,%z2";
11502     case SYNC_INSN2_NOT:
11503       return "nor\t%0,%1,%.";
11504     }
11505   gcc_unreachable ();
11506 }
11507
11508 /* OPERANDS are the operands to a sync loop instruction and INDEX is
11509    the value of the one of the sync_* attributes.  Return the operand
11510    referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
11511    have the associated attribute.  */
11512
11513 static rtx
11514 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
11515 {
11516   if (index > 0)
11517     default_value = operands[index - 1];
11518   return default_value;
11519 }
11520
11521 /* INSN is a sync loop with operands OPERANDS.  Build up a multi-insn
11522    sequence for it.  */
11523
11524 static void
11525 mips_process_sync_loop (rtx insn, rtx *operands)
11526 {
11527   rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
11528   rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3;
11529   unsigned int tmp3_insn;
11530   enum attr_sync_insn1 insn1;
11531   enum attr_sync_insn2 insn2;
11532   bool is_64bit_p;
11533
11534   /* Read an operand from the sync_WHAT attribute and store it in
11535      variable WHAT.  DEFAULT is the default value if no attribute
11536      is specified.  */
11537 #define READ_OPERAND(WHAT, DEFAULT) \
11538   WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
11539                                 DEFAULT)
11540
11541   /* Read the memory.  */
11542   READ_OPERAND (mem, 0);
11543   gcc_assert (mem);
11544   is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
11545
11546   /* Read the other attributes.  */
11547   at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
11548   READ_OPERAND (oldval, at);
11549   READ_OPERAND (newval, at);
11550   READ_OPERAND (inclusive_mask, 0);
11551   READ_OPERAND (exclusive_mask, 0);
11552   READ_OPERAND (required_oldval, 0);
11553   READ_OPERAND (insn1_op2, 0);
11554   insn1 = get_attr_sync_insn1 (insn);
11555   insn2 = get_attr_sync_insn2 (insn);
11556
11557   mips_multi_start ();
11558
11559   /* Output the release side of the memory barrier.  */
11560   if (get_attr_sync_release_barrier (insn) == SYNC_RELEASE_BARRIER_YES)
11561     {
11562       if (required_oldval == 0 && TARGET_OCTEON)
11563         {
11564           /* Octeon doesn't reorder reads, so a full barrier can be
11565              created by using SYNCW to order writes combined with the
11566              write from the following SC.  When the SC successfully
11567              completes, we know that all preceding writes are also
11568              committed to the coherent memory system.  It is possible
11569              for a single SYNCW to fail, but a pair of them will never
11570              fail, so we use two.  */
11571           mips_multi_add_insn ("syncw", NULL);
11572           mips_multi_add_insn ("syncw", NULL);
11573         }
11574       else
11575         mips_multi_add_insn ("sync", NULL);
11576     }
11577
11578   /* Output the branch-back label.  */
11579   mips_multi_add_label ("1:");
11580
11581   /* OLDVAL = *MEM.  */
11582   mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
11583                        oldval, mem, NULL);
11584
11585   /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2.  */
11586   if (required_oldval)
11587     {
11588       if (inclusive_mask == 0)
11589         tmp1 = oldval;
11590       else
11591         {
11592           gcc_assert (oldval != at);
11593           mips_multi_add_insn ("and\t%0,%1,%2",
11594                                at, oldval, inclusive_mask, NULL);
11595           tmp1 = at;
11596         }
11597       mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
11598     }
11599
11600   /* $TMP1 = OLDVAL & EXCLUSIVE_MASK.  */
11601   if (exclusive_mask == 0)
11602     tmp1 = const0_rtx;
11603   else
11604     {
11605       gcc_assert (oldval != at);
11606       mips_multi_add_insn ("and\t%0,%1,%z2",
11607                            at, oldval, exclusive_mask, NULL);
11608       tmp1 = at;
11609     }
11610
11611   /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
11612
11613      We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
11614      at least one instruction in that case.  */
11615   if (insn1 == SYNC_INSN1_MOVE
11616       && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
11617     tmp2 = insn1_op2;
11618   else
11619     {
11620       mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
11621                            newval, oldval, insn1_op2, NULL);
11622       tmp2 = newval;
11623     }
11624
11625   /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK).  */
11626   if (insn2 == SYNC_INSN2_NOP)
11627     tmp3 = tmp2;
11628   else
11629     {
11630       mips_multi_add_insn (mips_sync_insn2_template (insn2),
11631                            newval, tmp2, inclusive_mask, NULL);
11632       tmp3 = newval;
11633     }
11634   tmp3_insn = mips_multi_last_index ();
11635
11636   /* $AT = $TMP1 | $TMP3.  */
11637   if (tmp1 == const0_rtx || tmp3 == const0_rtx)
11638     {
11639       mips_multi_set_operand (tmp3_insn, 0, at);
11640       tmp3 = at;
11641     }
11642   else
11643     {
11644       gcc_assert (tmp1 != tmp3);
11645       mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
11646     }
11647
11648   /* if (!commit (*MEM = $AT)) goto 1.
11649
11650      This will sometimes be a delayed branch; see the write code below
11651      for details.  */
11652   mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
11653   mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
11654
11655   /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot].  */
11656   if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
11657     {
11658       mips_multi_copy_insn (tmp3_insn);
11659       mips_multi_set_operand (mips_multi_last_index (), 0, newval);
11660     }
11661   else
11662     mips_multi_add_insn ("nop", NULL);
11663
11664   /* Output the acquire side of the memory barrier.  */
11665   if (TARGET_SYNC_AFTER_SC)
11666     mips_multi_add_insn ("sync", NULL);
11667
11668   /* Output the exit label, if needed.  */
11669   if (required_oldval)
11670     mips_multi_add_label ("2:");
11671
11672 #undef READ_OPERAND
11673 }
11674
11675 /* Output and/or return the asm template for sync loop INSN, which has
11676    the operands given by OPERANDS.  */
11677
11678 const char *
11679 mips_output_sync_loop (rtx insn, rtx *operands)
11680 {
11681   mips_process_sync_loop (insn, operands);
11682
11683   /* Use branch-likely instructions to work around the LL/SC R10000
11684      errata.  */
11685   mips_branch_likely = TARGET_FIX_R10000;
11686
11687   mips_push_asm_switch (&mips_noreorder);
11688   mips_push_asm_switch (&mips_nomacro);
11689   mips_push_asm_switch (&mips_noat);
11690   mips_start_ll_sc_sync_block ();
11691
11692   mips_multi_write ();
11693
11694   mips_end_ll_sc_sync_block ();
11695   mips_pop_asm_switch (&mips_noat);
11696   mips_pop_asm_switch (&mips_nomacro);
11697   mips_pop_asm_switch (&mips_noreorder);
11698
11699   return "";
11700 }
11701
11702 /* Return the number of individual instructions in sync loop INSN,
11703    which has the operands given by OPERANDS.  */
11704
11705 unsigned int
11706 mips_sync_loop_insns (rtx insn, rtx *operands)
11707 {
11708   mips_process_sync_loop (insn, operands);
11709   return mips_multi_num_insns;
11710 }
11711 \f
11712 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
11713    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
11714
11715    When working around R4000 and R4400 errata, we need to make sure that
11716    the division is not immediately followed by a shift[1][2].  We also
11717    need to stop the division from being put into a branch delay slot[3].
11718    The easiest way to avoid both problems is to add a nop after the
11719    division.  When a divide-by-zero check is needed, this nop can be
11720    used to fill the branch delay slot.
11721
11722    [1] If a double-word or a variable shift executes immediately
11723        after starting an integer division, the shift may give an
11724        incorrect result.  See quotations of errata #16 and #28 from
11725        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11726        in mips.md for details.
11727
11728    [2] A similar bug to [1] exists for all revisions of the
11729        R4000 and the R4400 when run in an MC configuration.
11730        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
11731
11732        "19. In this following sequence:
11733
11734                     ddiv                (or ddivu or div or divu)
11735                     dsll32              (or dsrl32, dsra32)
11736
11737             if an MPT stall occurs, while the divide is slipping the cpu
11738             pipeline, then the following double shift would end up with an
11739             incorrect result.
11740
11741             Workaround: The compiler needs to avoid generating any
11742             sequence with divide followed by extended double shift."
11743
11744        This erratum is also present in "MIPS R4400MC Errata, Processor
11745        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
11746        & 3.0" as errata #10 and #4, respectively.
11747
11748    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11749        (also valid for MIPS R4000MC processors):
11750
11751        "52. R4000SC: This bug does not apply for the R4000PC.
11752
11753             There are two flavors of this bug:
11754
11755             1) If the instruction just after divide takes an RF exception
11756                (tlb-refill, tlb-invalid) and gets an instruction cache
11757                miss (both primary and secondary) and the line which is
11758                currently in secondary cache at this index had the first
11759                data word, where the bits 5..2 are set, then R4000 would
11760                get a wrong result for the div.
11761
11762             ##1
11763                     nop
11764                     div r8, r9
11765                     -------------------         # end-of page. -tlb-refill
11766                     nop
11767             ##2
11768                     nop
11769                     div r8, r9
11770                     -------------------         # end-of page. -tlb-invalid
11771                     nop
11772
11773             2) If the divide is in the taken branch delay slot, where the
11774                target takes RF exception and gets an I-cache miss for the
11775                exception vector or where I-cache miss occurs for the
11776                target address, under the above mentioned scenarios, the
11777                div would get wrong results.
11778
11779             ##1
11780                     j   r2              # to next page mapped or unmapped
11781                     div r8,r9           # this bug would be there as long
11782                                         # as there is an ICache miss and
11783                     nop                 # the "data pattern" is present
11784
11785             ##2
11786                     beq r0, r0, NextPage        # to Next page
11787                     div r8,r9
11788                     nop
11789
11790             This bug is present for div, divu, ddiv, and ddivu
11791             instructions.
11792
11793             Workaround: For item 1), OS could make sure that the next page
11794             after the divide instruction is also mapped.  For item 2), the
11795             compiler could make sure that the divide instruction is not in
11796             the branch delay slot."
11797
11798        These processors have PRId values of 0x00004220 and 0x00004300 for
11799        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
11800
11801 const char *
11802 mips_output_division (const char *division, rtx *operands)
11803 {
11804   const char *s;
11805
11806   s = division;
11807   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
11808     {
11809       output_asm_insn (s, operands);
11810       s = "nop";
11811     }
11812   if (TARGET_CHECK_ZERO_DIV)
11813     {
11814       if (TARGET_MIPS16)
11815         {
11816           output_asm_insn (s, operands);
11817           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
11818         }
11819       else if (GENERATE_DIVIDE_TRAPS)
11820         {
11821           /* Avoid long replay penalty on load miss by putting the trap before
11822              the divide.  */
11823           if (TUNE_74K)
11824             output_asm_insn ("teq\t%2,%.,7", operands);
11825           else
11826             {
11827               output_asm_insn (s, operands);
11828               s = "teq\t%2,%.,7";
11829             }
11830         }
11831       else
11832         {
11833           output_asm_insn ("%(bne\t%2,%.,1f", operands);
11834           output_asm_insn (s, operands);
11835           s = "break\t7%)\n1:";
11836         }
11837     }
11838   return s;
11839 }
11840 \f
11841 /* Return true if IN_INSN is a multiply-add or multiply-subtract
11842    instruction and if OUT_INSN assigns to the accumulator operand.  */
11843
11844 bool
11845 mips_linked_madd_p (rtx out_insn, rtx in_insn)
11846 {
11847   rtx x;
11848
11849   x = single_set (in_insn);
11850   if (x == 0)
11851     return false;
11852
11853   x = SET_SRC (x);
11854
11855   if (GET_CODE (x) == PLUS
11856       && GET_CODE (XEXP (x, 0)) == MULT
11857       && reg_set_p (XEXP (x, 1), out_insn))
11858     return true;
11859
11860   if (GET_CODE (x) == MINUS
11861       && GET_CODE (XEXP (x, 1)) == MULT
11862       && reg_set_p (XEXP (x, 0), out_insn))
11863     return true;
11864
11865   return false;
11866 }
11867
11868 /* True if the dependency between OUT_INSN and IN_INSN is on the store
11869    data rather than the address.  We need this because the cprestore
11870    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
11871    which causes the default routine to abort.  We just return false
11872    for that case.  */
11873
11874 bool
11875 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
11876 {
11877   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
11878     return false;
11879
11880   return !store_data_bypass_p (out_insn, in_insn);
11881 }
11882 \f
11883
11884 /* Variables and flags used in scheduler hooks when tuning for
11885    Loongson 2E/2F.  */
11886 static struct
11887 {
11888   /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
11889      strategy.  */
11890
11891   /* If true, then next ALU1/2 instruction will go to ALU1.  */
11892   bool alu1_turn_p;
11893
11894   /* If true, then next FALU1/2 unstruction will go to FALU1.  */
11895   bool falu1_turn_p;
11896
11897   /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
11898   int alu1_core_unit_code;
11899   int alu2_core_unit_code;
11900   int falu1_core_unit_code;
11901   int falu2_core_unit_code;
11902
11903   /* True if current cycle has a multi instruction.
11904      This flag is used in mips_ls2_dfa_post_advance_cycle.  */
11905   bool cycle_has_multi_p;
11906
11907   /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
11908      These are used in mips_ls2_dfa_post_advance_cycle to initialize
11909      DFA state.
11910      E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
11911      instruction to go ALU1.  */
11912   rtx alu1_turn_enabled_insn;
11913   rtx alu2_turn_enabled_insn;
11914   rtx falu1_turn_enabled_insn;
11915   rtx falu2_turn_enabled_insn;
11916 } mips_ls2;
11917
11918 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
11919    dependencies have no cost, except on the 20Kc where output-dependence
11920    is treated like input-dependence.  */
11921
11922 static int
11923 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
11924                   rtx dep ATTRIBUTE_UNUSED, int cost)
11925 {
11926   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
11927       && TUNE_20KC)
11928     return cost;
11929   if (REG_NOTE_KIND (link) != 0)
11930     return 0;
11931   return cost;
11932 }
11933
11934 /* Return the number of instructions that can be issued per cycle.  */
11935
11936 static int
11937 mips_issue_rate (void)
11938 {
11939   switch (mips_tune)
11940     {
11941     case PROCESSOR_74KC:
11942     case PROCESSOR_74KF2_1:
11943     case PROCESSOR_74KF1_1:
11944     case PROCESSOR_74KF3_2:
11945       /* The 74k is not strictly quad-issue cpu, but can be seen as one
11946          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
11947          but in reality only a maximum of 3 insns can be issued as
11948          floating-point loads and stores also require a slot in the
11949          AGEN pipe.  */
11950     case PROCESSOR_R10000:
11951       /* All R10K Processors are quad-issue (being the first MIPS
11952          processors to support this feature). */
11953       return 4;
11954
11955     case PROCESSOR_20KC:
11956     case PROCESSOR_R4130:
11957     case PROCESSOR_R5400:
11958     case PROCESSOR_R5500:
11959     case PROCESSOR_R7000:
11960     case PROCESSOR_R9000:
11961     case PROCESSOR_OCTEON:
11962       return 2;
11963
11964     case PROCESSOR_SB1:
11965     case PROCESSOR_SB1A:
11966       /* This is actually 4, but we get better performance if we claim 3.
11967          This is partly because of unwanted speculative code motion with the
11968          larger number, and partly because in most common cases we can't
11969          reach the theoretical max of 4.  */
11970       return 3;
11971
11972     case PROCESSOR_LOONGSON_2E:
11973     case PROCESSOR_LOONGSON_2F:
11974       return 4;
11975
11976     default:
11977       return 1;
11978     }
11979 }
11980
11981 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
11982
11983 static void
11984 mips_ls2_init_dfa_post_cycle_insn (void)
11985 {
11986   start_sequence ();
11987   emit_insn (gen_ls2_alu1_turn_enabled_insn ());
11988   mips_ls2.alu1_turn_enabled_insn = get_insns ();
11989   end_sequence ();
11990
11991   start_sequence ();
11992   emit_insn (gen_ls2_alu2_turn_enabled_insn ());
11993   mips_ls2.alu2_turn_enabled_insn = get_insns ();
11994   end_sequence ();
11995
11996   start_sequence ();
11997   emit_insn (gen_ls2_falu1_turn_enabled_insn ());
11998   mips_ls2.falu1_turn_enabled_insn = get_insns ();
11999   end_sequence ();
12000
12001   start_sequence ();
12002   emit_insn (gen_ls2_falu2_turn_enabled_insn ());
12003   mips_ls2.falu2_turn_enabled_insn = get_insns ();
12004   end_sequence ();
12005
12006   mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
12007   mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
12008   mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
12009   mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
12010 }
12011
12012 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
12013    Init data used in mips_dfa_post_advance_cycle.  */
12014
12015 static void
12016 mips_init_dfa_post_cycle_insn (void)
12017 {
12018   if (TUNE_LOONGSON_2EF)
12019     mips_ls2_init_dfa_post_cycle_insn ();
12020 }
12021
12022 /* Initialize STATE when scheduling for Loongson 2E/2F.
12023    Support round-robin dispatch scheme by enabling only one of
12024    ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
12025    respectively.  */
12026
12027 static void
12028 mips_ls2_dfa_post_advance_cycle (state_t state)
12029 {
12030   if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
12031     {
12032       /* Though there are no non-pipelined ALU1 insns,
12033          we can get an instruction of type 'multi' before reload.  */
12034       gcc_assert (mips_ls2.cycle_has_multi_p);
12035       mips_ls2.alu1_turn_p = false;
12036     }
12037
12038   mips_ls2.cycle_has_multi_p = false;
12039
12040   if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
12041     /* We have a non-pipelined alu instruction in the core,
12042        adjust round-robin counter.  */
12043     mips_ls2.alu1_turn_p = true;
12044
12045   if (mips_ls2.alu1_turn_p)
12046     {
12047       if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
12048         gcc_unreachable ();
12049     }
12050   else
12051     {
12052       if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
12053         gcc_unreachable ();
12054     }
12055
12056   if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
12057     {
12058       /* There are no non-pipelined FALU1 insns.  */
12059       gcc_unreachable ();
12060       mips_ls2.falu1_turn_p = false;
12061     }
12062
12063   if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
12064     /* We have a non-pipelined falu instruction in the core,
12065        adjust round-robin counter.  */
12066     mips_ls2.falu1_turn_p = true;
12067
12068   if (mips_ls2.falu1_turn_p)
12069     {
12070       if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
12071         gcc_unreachable ();
12072     }
12073   else
12074     {
12075       if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
12076         gcc_unreachable ();
12077     }
12078 }
12079
12080 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
12081    This hook is being called at the start of each cycle.  */
12082
12083 static void
12084 mips_dfa_post_advance_cycle (void)
12085 {
12086   if (TUNE_LOONGSON_2EF)
12087     mips_ls2_dfa_post_advance_cycle (curr_state);
12088 }
12089
12090 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
12091    be as wide as the scheduling freedom in the DFA.  */
12092
12093 static int
12094 mips_multipass_dfa_lookahead (void)
12095 {
12096   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
12097   if (TUNE_SB1)
12098     return 4;
12099
12100   if (TUNE_LOONGSON_2EF)
12101     return 4;
12102
12103   if (TUNE_OCTEON)
12104     return 2;
12105
12106   return 0;
12107 }
12108 \f
12109 /* Remove the instruction at index LOWER from ready queue READY and
12110    reinsert it in front of the instruction at index HIGHER.  LOWER must
12111    be <= HIGHER.  */
12112
12113 static void
12114 mips_promote_ready (rtx *ready, int lower, int higher)
12115 {
12116   rtx new_head;
12117   int i;
12118
12119   new_head = ready[lower];
12120   for (i = lower; i < higher; i++)
12121     ready[i] = ready[i + 1];
12122   ready[i] = new_head;
12123 }
12124
12125 /* If the priority of the instruction at POS2 in the ready queue READY
12126    is within LIMIT units of that of the instruction at POS1, swap the
12127    instructions if POS2 is not already less than POS1.  */
12128
12129 static void
12130 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
12131 {
12132   if (pos1 < pos2
12133       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
12134     {
12135       rtx temp;
12136
12137       temp = ready[pos1];
12138       ready[pos1] = ready[pos2];
12139       ready[pos2] = temp;
12140     }
12141 }
12142 \f
12143 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
12144    that may clobber hi or lo.  */
12145 static rtx mips_macc_chains_last_hilo;
12146
12147 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
12148    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
12149
12150 static void
12151 mips_macc_chains_record (rtx insn)
12152 {
12153   if (get_attr_may_clobber_hilo (insn))
12154     mips_macc_chains_last_hilo = insn;
12155 }
12156
12157 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
12158    has NREADY elements, looking for a multiply-add or multiply-subtract
12159    instruction that is cumulative with mips_macc_chains_last_hilo.
12160    If there is one, promote it ahead of anything else that might
12161    clobber hi or lo.  */
12162
12163 static void
12164 mips_macc_chains_reorder (rtx *ready, int nready)
12165 {
12166   int i, j;
12167
12168   if (mips_macc_chains_last_hilo != 0)
12169     for (i = nready - 1; i >= 0; i--)
12170       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
12171         {
12172           for (j = nready - 1; j > i; j--)
12173             if (recog_memoized (ready[j]) >= 0
12174                 && get_attr_may_clobber_hilo (ready[j]))
12175               {
12176                 mips_promote_ready (ready, i, j);
12177                 break;
12178               }
12179           break;
12180         }
12181 }
12182 \f
12183 /* The last instruction to be scheduled.  */
12184 static rtx vr4130_last_insn;
12185
12186 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
12187    points to an rtx that is initially an instruction.  Nullify the rtx
12188    if the instruction uses the value of register X.  */
12189
12190 static void
12191 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
12192                                 void *data)
12193 {
12194   rtx *insn_ptr;
12195
12196   insn_ptr = (rtx *) data;
12197   if (REG_P (x)
12198       && *insn_ptr != 0
12199       && reg_referenced_p (x, PATTERN (*insn_ptr)))
12200     *insn_ptr = 0;
12201 }
12202
12203 /* Return true if there is true register dependence between vr4130_last_insn
12204    and INSN.  */
12205
12206 static bool
12207 vr4130_true_reg_dependence_p (rtx insn)
12208 {
12209   note_stores (PATTERN (vr4130_last_insn),
12210                vr4130_true_reg_dependence_p_1, &insn);
12211   return insn == 0;
12212 }
12213
12214 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
12215    the ready queue and that INSN2 is the instruction after it, return
12216    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
12217    in which INSN1 and INSN2 can probably issue in parallel, but for
12218    which (INSN2, INSN1) should be less sensitive to instruction
12219    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
12220
12221 static bool
12222 vr4130_swap_insns_p (rtx insn1, rtx insn2)
12223 {
12224   sd_iterator_def sd_it;
12225   dep_t dep;
12226
12227   /* Check for the following case:
12228
12229      1) there is some other instruction X with an anti dependence on INSN1;
12230      2) X has a higher priority than INSN2; and
12231      3) X is an arithmetic instruction (and thus has no unit restrictions).
12232
12233      If INSN1 is the last instruction blocking X, it would better to
12234      choose (INSN1, X) over (INSN2, INSN1).  */
12235   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
12236     if (DEP_TYPE (dep) == REG_DEP_ANTI
12237         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
12238         && recog_memoized (DEP_CON (dep)) >= 0
12239         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
12240       return false;
12241
12242   if (vr4130_last_insn != 0
12243       && recog_memoized (insn1) >= 0
12244       && recog_memoized (insn2) >= 0)
12245     {
12246       /* See whether INSN1 and INSN2 use different execution units,
12247          or if they are both ALU-type instructions.  If so, they can
12248          probably execute in parallel.  */
12249       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
12250       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
12251       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
12252         {
12253           /* If only one of the instructions has a dependence on
12254              vr4130_last_insn, prefer to schedule the other one first.  */
12255           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
12256           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
12257           if (dep1_p != dep2_p)
12258             return dep1_p;
12259
12260           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
12261              is not an ALU-type instruction and if INSN1 uses the same
12262              execution unit.  (Note that if this condition holds, we already
12263              know that INSN2 uses a different execution unit.)  */
12264           if (class1 != VR4130_CLASS_ALU
12265               && recog_memoized (vr4130_last_insn) >= 0
12266               && class1 == get_attr_vr4130_class (vr4130_last_insn))
12267             return true;
12268         }
12269     }
12270   return false;
12271 }
12272
12273 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
12274    queue with at least two instructions.  Swap the first two if
12275    vr4130_swap_insns_p says that it could be worthwhile.  */
12276
12277 static void
12278 vr4130_reorder (rtx *ready, int nready)
12279 {
12280   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
12281     mips_promote_ready (ready, nready - 2, nready - 1);
12282 }
12283 \f
12284 /* Record whether last 74k AGEN instruction was a load or store.  */
12285 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
12286
12287 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
12288    resets to TYPE_UNKNOWN state.  */
12289
12290 static void
12291 mips_74k_agen_init (rtx insn)
12292 {
12293   if (!insn || CALL_P (insn) || JUMP_P (insn))
12294     mips_last_74k_agen_insn = TYPE_UNKNOWN;
12295   else
12296     {
12297       enum attr_type type = get_attr_type (insn);
12298       if (type == TYPE_LOAD || type == TYPE_STORE)
12299         mips_last_74k_agen_insn = type;
12300     }
12301 }
12302
12303 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
12304    loads to be grouped together, and multiple stores to be grouped
12305    together.  Swap things around in the ready queue to make this happen.  */
12306
12307 static void
12308 mips_74k_agen_reorder (rtx *ready, int nready)
12309 {
12310   int i;
12311   int store_pos, load_pos;
12312
12313   store_pos = -1;
12314   load_pos = -1;
12315
12316   for (i = nready - 1; i >= 0; i--)
12317     {
12318       rtx insn = ready[i];
12319       if (USEFUL_INSN_P (insn))
12320         switch (get_attr_type (insn))
12321           {
12322           case TYPE_STORE:
12323             if (store_pos == -1)
12324               store_pos = i;
12325             break;
12326
12327           case TYPE_LOAD:
12328             if (load_pos == -1)
12329               load_pos = i;
12330             break;
12331
12332           default:
12333             break;
12334           }
12335     }
12336
12337   if (load_pos == -1 || store_pos == -1)
12338     return;
12339
12340   switch (mips_last_74k_agen_insn)
12341     {
12342     case TYPE_UNKNOWN:
12343       /* Prefer to schedule loads since they have a higher latency.  */
12344     case TYPE_LOAD:
12345       /* Swap loads to the front of the queue.  */
12346       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
12347       break;
12348     case TYPE_STORE:
12349       /* Swap stores to the front of the queue.  */
12350       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
12351       break;
12352     default:
12353       break;
12354     }
12355 }
12356 \f
12357 /* Implement TARGET_SCHED_INIT.  */
12358
12359 static void
12360 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12361                  int max_ready ATTRIBUTE_UNUSED)
12362 {
12363   mips_macc_chains_last_hilo = 0;
12364   vr4130_last_insn = 0;
12365   mips_74k_agen_init (NULL_RTX);
12366
12367   /* When scheduling for Loongson2, branch instructions go to ALU1,
12368      therefore basic block is most likely to start with round-robin counter
12369      pointed to ALU2.  */
12370   mips_ls2.alu1_turn_p = false;
12371   mips_ls2.falu1_turn_p = true;
12372 }
12373
12374 /* Implement TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
12375
12376 static int
12377 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12378                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12379 {
12380   if (!reload_completed
12381       && TUNE_MACC_CHAINS
12382       && *nreadyp > 0)
12383     mips_macc_chains_reorder (ready, *nreadyp);
12384
12385   if (reload_completed
12386       && TUNE_MIPS4130
12387       && !TARGET_VR4130_ALIGN
12388       && *nreadyp > 1)
12389     vr4130_reorder (ready, *nreadyp);
12390
12391   if (TUNE_74K)
12392     mips_74k_agen_reorder (ready, *nreadyp);
12393
12394   return mips_issue_rate ();
12395 }
12396
12397 /* Update round-robin counters for ALU1/2 and FALU1/2.  */
12398
12399 static void
12400 mips_ls2_variable_issue (rtx insn)
12401 {
12402   if (mips_ls2.alu1_turn_p)
12403     {
12404       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
12405         mips_ls2.alu1_turn_p = false;
12406     }
12407   else
12408     {
12409       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
12410         mips_ls2.alu1_turn_p = true;
12411     }
12412
12413   if (mips_ls2.falu1_turn_p)
12414     {
12415       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
12416         mips_ls2.falu1_turn_p = false;
12417     }
12418   else
12419     {
12420       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
12421         mips_ls2.falu1_turn_p = true;
12422     }
12423
12424   if (recog_memoized (insn) >= 0)
12425     mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
12426 }
12427
12428 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
12429
12430 static int
12431 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12432                      rtx insn, int more)
12433 {
12434   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
12435   if (USEFUL_INSN_P (insn))
12436     {
12437       if (get_attr_type (insn) != TYPE_GHOST)
12438         more--;
12439       if (!reload_completed && TUNE_MACC_CHAINS)
12440         mips_macc_chains_record (insn);
12441       vr4130_last_insn = insn;
12442       if (TUNE_74K)
12443         mips_74k_agen_init (insn);
12444       else if (TUNE_LOONGSON_2EF)
12445         mips_ls2_variable_issue (insn);
12446     }
12447
12448   /* Instructions of type 'multi' should all be split before
12449      the second scheduling pass.  */
12450   gcc_assert (!reload_completed
12451               || recog_memoized (insn) < 0
12452               || get_attr_type (insn) != TYPE_MULTI);
12453
12454   return more;
12455 }
12456 \f
12457 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
12458    return the first operand of the associated PREF or PREFX insn.  */
12459
12460 rtx
12461 mips_prefetch_cookie (rtx write, rtx locality)
12462 {
12463   /* store_streamed / load_streamed.  */
12464   if (INTVAL (locality) <= 0)
12465     return GEN_INT (INTVAL (write) + 4);
12466
12467   /* store / load.  */
12468   if (INTVAL (locality) <= 2)
12469     return write;
12470
12471   /* store_retained / load_retained.  */
12472   return GEN_INT (INTVAL (write) + 6);
12473 }
12474 \f
12475 /* Flags that indicate when a built-in function is available.
12476
12477    BUILTIN_AVAIL_NON_MIPS16
12478         The function is available on the current target, but only
12479         in non-MIPS16 mode.  */
12480 #define BUILTIN_AVAIL_NON_MIPS16 1
12481
12482 /* Declare an availability predicate for built-in functions that
12483    require non-MIPS16 mode and also require COND to be true.
12484    NAME is the main part of the predicate's name.  */
12485 #define AVAIL_NON_MIPS16(NAME, COND)                                    \
12486  static unsigned int                                                    \
12487  mips_builtin_avail_##NAME (void)                                       \
12488  {                                                                      \
12489    return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                        \
12490  }
12491
12492 /* This structure describes a single built-in function.  */
12493 struct mips_builtin_description {
12494   /* The code of the main .md file instruction.  See mips_builtin_type
12495      for more information.  */
12496   enum insn_code icode;
12497
12498   /* The floating-point comparison code to use with ICODE, if any.  */
12499   enum mips_fp_condition cond;
12500
12501   /* The name of the built-in function.  */
12502   const char *name;
12503
12504   /* Specifies how the function should be expanded.  */
12505   enum mips_builtin_type builtin_type;
12506
12507   /* The function's prototype.  */
12508   enum mips_function_type function_type;
12509
12510   /* Whether the function is available.  */
12511   unsigned int (*avail) (void);
12512 };
12513
12514 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
12515 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
12516 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
12517 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
12518 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
12519 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
12520 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
12521 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
12522 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
12523
12524 /* Construct a mips_builtin_description from the given arguments.
12525
12526    INSN is the name of the associated instruction pattern, without the
12527    leading CODE_FOR_mips_.
12528
12529    CODE is the floating-point condition code associated with the
12530    function.  It can be 'f' if the field is not applicable.
12531
12532    NAME is the name of the function itself, without the leading
12533    "__builtin_mips_".
12534
12535    BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
12536
12537    AVAIL is the name of the availability predicate, without the leading
12538    mips_builtin_avail_.  */
12539 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
12540                      FUNCTION_TYPE, AVAIL)                              \
12541   { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
12542     "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
12543     mips_builtin_avail_ ## AVAIL }
12544
12545 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
12546    mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
12547    are as for MIPS_BUILTIN.  */
12548 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
12549   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
12550
12551 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
12552    are subject to mips_builtin_avail_<AVAIL>.  */
12553 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
12554   MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
12555                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
12556   MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
12557                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
12558
12559 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
12560    The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
12561    while the any and all forms are subject to mips_builtin_avail_mips3d.  */
12562 #define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
12563   MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
12564                 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
12565                 mips3d),                                                \
12566   MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
12567                 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
12568                 mips3d),                                                \
12569   MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
12570                 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12571                 AVAIL),                                                 \
12572   MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
12573                 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12574                 AVAIL)
12575
12576 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
12577    are subject to mips_builtin_avail_mips3d.  */
12578 #define CMP_4S_BUILTINS(INSN, COND)                                     \
12579   MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
12580                 MIPS_BUILTIN_CMP_ANY,                                   \
12581                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
12582   MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
12583                 MIPS_BUILTIN_CMP_ALL,                                   \
12584                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
12585
12586 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
12587    instruction requires mips_builtin_avail_<AVAIL>.  */
12588 #define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
12589   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
12590                 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12591                 AVAIL),                                                 \
12592   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
12593                 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12594                 AVAIL)
12595
12596 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
12597 #define CMP_BUILTINS(COND)                                              \
12598   MOVTF_BUILTINS (c, COND, paired_single),                              \
12599   MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
12600   CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
12601   CMP_PS_BUILTINS (c, COND, paired_single),                             \
12602   CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
12603   CMP_4S_BUILTINS (c, COND),                                            \
12604   CMP_4S_BUILTINS (cabs, COND)
12605
12606 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
12607    function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
12608    and AVAIL are as for MIPS_BUILTIN.  */
12609 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
12610   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
12611                 FUNCTION_TYPE, AVAIL)
12612
12613 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
12614    branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
12615 #define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
12616   MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
12617                 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
12618
12619 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
12620    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12621    builtin_description field.  */
12622 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
12623   { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
12624     "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
12625     FUNCTION_TYPE, mips_builtin_avail_loongson }
12626
12627 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
12628    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12629    builtin_description field.  */
12630 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
12631   LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
12632
12633 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
12634    We use functions of this form when the same insn can be usefully applied
12635    to more than one datatype.  */
12636 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
12637   LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
12638
12639 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
12640 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
12641 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
12642 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
12643 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
12644 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
12645
12646 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
12647 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
12648 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
12649 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
12650 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
12651 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
12652 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
12653 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
12654 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
12655 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
12656 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
12657 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
12658 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
12659 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
12660 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
12661 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
12662 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
12663 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
12664 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
12665 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
12666 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
12667 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
12668 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
12669 #define CODE_FOR_loongson_punpckhbh CODE_FOR_vec_interleave_highv8qi
12670 #define CODE_FOR_loongson_punpckhhw CODE_FOR_vec_interleave_highv4hi
12671 #define CODE_FOR_loongson_punpckhwd CODE_FOR_vec_interleave_highv2si
12672 #define CODE_FOR_loongson_punpcklbh CODE_FOR_vec_interleave_lowv8qi
12673 #define CODE_FOR_loongson_punpcklhw CODE_FOR_vec_interleave_lowv4hi
12674 #define CODE_FOR_loongson_punpcklwd CODE_FOR_vec_interleave_lowv2si
12675
12676 static const struct mips_builtin_description mips_builtins[] = {
12677   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12678   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12679   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12680   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12681   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
12682   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
12683   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
12684   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
12685
12686   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
12687   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12688   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12689   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12690   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
12691
12692   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
12693   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
12694   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12695   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12696   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12697   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12698
12699   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
12700   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
12701   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12702   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12703   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12704   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12705
12706   MIPS_FP_CONDITIONS (CMP_BUILTINS),
12707
12708   /* Built-in functions for the SB-1 processor.  */
12709   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
12710
12711   /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
12712   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12713   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12714   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12715   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12716   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12717   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12718   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12719   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12720   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12721   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12722   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
12723   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
12724   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
12725   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
12726   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
12727   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
12728   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12729   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12730   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12731   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12732   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
12733   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
12734   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12735   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12736   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12737   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12738   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12739   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12740   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12741   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12742   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12743   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12744   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12745   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12746   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12747   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12748   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12749   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
12750   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12751   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12752   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12753   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12754   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12755   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
12756   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
12757   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
12758   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
12759   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12760   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12761   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12762   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12763   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12764   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12765   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12766   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12767   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12768   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12769   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12770   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12771   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
12772   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
12773   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
12774   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12775   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12776   BPOSGE_BUILTIN (32, dsp),
12777
12778   /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
12779   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
12780   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12781   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12782   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12783   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12784   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12785   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12786   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12787   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12788   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12789   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12790   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12791   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12792   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12793   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12794   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
12795   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12796   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12797   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12798   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12799   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12800   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
12801   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12802   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12803   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12804   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12805   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12806   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12807   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12808   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12809   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12810   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12811   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12812   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12813
12814   /* Built-in functions for the DSP ASE (32-bit only).  */
12815   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12816   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12817   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12818   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12819   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12820   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12821   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12822   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12823   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12824   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12825   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12826   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12827   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12828   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12829   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12830   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12831   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
12832   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12833   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12834   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
12835   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
12836
12837   /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
12838   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12839   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12840   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
12841   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
12842   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
12843   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
12844   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12845   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dspr2_32),
12846   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dspr2_32),
12847   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12848   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12849   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12850   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12851   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12852   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12853
12854   /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
12855   LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
12856   LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
12857   LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
12858   LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12859   LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12860   LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12861   LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12862   LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12863   LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12864   LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
12865   LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
12866   LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12867   LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12868   LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12869   LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12870   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
12871   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12872   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12873   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12874   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
12875   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
12876   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12877   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12878   LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12879   LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12880   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12881   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12882   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12883   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12884   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12885   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12886   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12887   LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12888   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12889   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12890   LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12891   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12892   LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
12893   LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
12894   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12895   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12896   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12897   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12898   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12899   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12900   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12901   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12902   LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
12903   LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12904   LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12905   LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12906   LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12907   LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
12908   LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
12909   LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12910   LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12911   LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12912   LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
12913   LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12914   LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
12915   LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
12916   LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI_UQI),
12917   LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_V4HI_UQI),
12918   LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12919   LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12920   LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12921   LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12922   LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12923   LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12924   LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12925   LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12926   LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12927   LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12928   LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12929   LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12930   LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12931   LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12932   LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12933   LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12934   LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12935   LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12936   LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
12937   LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
12938   LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12939   LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12940   LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12941   LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12942   LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12943   LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12944   LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12945   LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12946   LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12947   LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12948   LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12949   LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12950   LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12951   LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12952   LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12953   LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12954
12955   /* Sundry other built-in functions.  */
12956   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
12957 };
12958
12959 /* MODE is a vector mode whose elements have type TYPE.  Return the type
12960    of the vector itself.  */
12961
12962 static tree
12963 mips_builtin_vector_type (tree type, enum machine_mode mode)
12964 {
12965   static tree types[2 * (int) MAX_MACHINE_MODE];
12966   int mode_index;
12967
12968   mode_index = (int) mode;
12969
12970   if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
12971     mode_index += MAX_MACHINE_MODE;
12972
12973   if (types[mode_index] == NULL_TREE)
12974     types[mode_index] = build_vector_type_for_mode (type, mode);
12975   return types[mode_index];
12976 }
12977
12978 /* Return a type for 'const volatile void *'.  */
12979
12980 static tree
12981 mips_build_cvpointer_type (void)
12982 {
12983   static tree cache;
12984
12985   if (cache == NULL_TREE)
12986     cache = build_pointer_type (build_qualified_type
12987                                 (void_type_node,
12988                                  TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
12989   return cache;
12990 }
12991
12992 /* Source-level argument types.  */
12993 #define MIPS_ATYPE_VOID void_type_node
12994 #define MIPS_ATYPE_INT integer_type_node
12995 #define MIPS_ATYPE_POINTER ptr_type_node
12996 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
12997
12998 /* Standard mode-based argument types.  */
12999 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
13000 #define MIPS_ATYPE_SI intSI_type_node
13001 #define MIPS_ATYPE_USI unsigned_intSI_type_node
13002 #define MIPS_ATYPE_DI intDI_type_node
13003 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
13004 #define MIPS_ATYPE_SF float_type_node
13005 #define MIPS_ATYPE_DF double_type_node
13006
13007 /* Vector argument types.  */
13008 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
13009 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
13010 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
13011 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
13012 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
13013 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
13014 #define MIPS_ATYPE_UV2SI                                        \
13015   mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
13016 #define MIPS_ATYPE_UV4HI                                        \
13017   mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
13018 #define MIPS_ATYPE_UV8QI                                        \
13019   mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
13020
13021 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
13022    their associated MIPS_ATYPEs.  */
13023 #define MIPS_FTYPE_ATYPES1(A, B) \
13024   MIPS_ATYPE_##A, MIPS_ATYPE_##B
13025
13026 #define MIPS_FTYPE_ATYPES2(A, B, C) \
13027   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
13028
13029 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
13030   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
13031
13032 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
13033   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
13034   MIPS_ATYPE_##E
13035
13036 /* Return the function type associated with function prototype TYPE.  */
13037
13038 static tree
13039 mips_build_function_type (enum mips_function_type type)
13040 {
13041   static tree types[(int) MIPS_MAX_FTYPE_MAX];
13042
13043   if (types[(int) type] == NULL_TREE)
13044     switch (type)
13045       {
13046 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
13047   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
13048     types[(int) type]                                                   \
13049       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
13050                                   NULL_TREE);                           \
13051     break;
13052 #include "config/mips/mips-ftypes.def"
13053 #undef DEF_MIPS_FTYPE
13054       default:
13055         gcc_unreachable ();
13056       }
13057
13058   return types[(int) type];
13059 }
13060
13061 /* Implement TARGET_INIT_BUILTINS.  */
13062
13063 static void
13064 mips_init_builtins (void)
13065 {
13066   const struct mips_builtin_description *d;
13067   unsigned int i;
13068
13069   /* Iterate through all of the bdesc arrays, initializing all of the
13070      builtin functions.  */
13071   for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
13072     {
13073       d = &mips_builtins[i];
13074       if (d->avail ())
13075         add_builtin_function (d->name,
13076                               mips_build_function_type (d->function_type),
13077                               i, BUILT_IN_MD, NULL, NULL);
13078     }
13079 }
13080
13081 /* Take argument ARGNO from EXP's argument list and convert it into a
13082    form suitable for input operand OPNO of instruction ICODE.  Return the
13083    value.  */
13084
13085 static rtx
13086 mips_prepare_builtin_arg (enum insn_code icode,
13087                           unsigned int opno, tree exp, unsigned int argno)
13088 {
13089   tree arg;
13090   rtx value;
13091   enum machine_mode mode;
13092
13093   arg = CALL_EXPR_ARG (exp, argno);
13094   value = expand_normal (arg);
13095   mode = insn_data[icode].operand[opno].mode;
13096   if (!insn_data[icode].operand[opno].predicate (value, mode))
13097     {
13098       /* We need to get the mode from ARG for two reasons:
13099
13100            - to cope with address operands, where MODE is the mode of the
13101              memory, rather than of VALUE itself.
13102
13103            - to cope with special predicates like pmode_register_operand,
13104              where MODE is VOIDmode.  */
13105       value = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (arg)), value);
13106
13107       /* Check the predicate again.  */
13108       if (!insn_data[icode].operand[opno].predicate (value, mode))
13109         {
13110           error ("invalid argument to built-in function");
13111           return const0_rtx;
13112         }
13113     }
13114
13115   return value;
13116 }
13117
13118 /* Return an rtx suitable for output operand OP of instruction ICODE.
13119    If TARGET is non-null, try to use it where possible.  */
13120
13121 static rtx
13122 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
13123 {
13124   enum machine_mode mode;
13125
13126   mode = insn_data[icode].operand[op].mode;
13127   if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
13128     target = gen_reg_rtx (mode);
13129
13130   return target;
13131 }
13132
13133 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
13134    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
13135    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
13136    suggests a good place to put the result.  */
13137
13138 static rtx
13139 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
13140                             bool has_target_p)
13141 {
13142   rtx ops[MAX_RECOG_OPERANDS];
13143   int opno, argno;
13144
13145   /* Map any target to operand 0.  */
13146   opno = 0;
13147   if (has_target_p)
13148     {
13149       target = mips_prepare_builtin_target (icode, opno, target);
13150       ops[opno] = target;
13151       opno++;
13152     }
13153
13154   /* Map the arguments to the other operands.  The n_operands value
13155      for an expander includes match_dups and match_scratches as well as
13156      match_operands, so n_operands is only an upper bound on the number
13157      of arguments to the expander function.  */
13158   gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands);
13159   for (argno = 0; argno < call_expr_nargs (exp); argno++, opno++)
13160     ops[opno] = mips_prepare_builtin_arg (icode, opno, exp, argno);
13161
13162   switch (opno)
13163     {
13164     case 2:
13165       emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
13166       break;
13167
13168     case 3:
13169       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
13170       break;
13171
13172     case 4:
13173       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
13174       break;
13175
13176     default:
13177       gcc_unreachable ();
13178     }
13179   return target;
13180 }
13181
13182 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
13183    function; TYPE says which.  EXP is the CALL_EXPR that calls the
13184    function, ICODE is the instruction that should be used to compare
13185    the first two arguments, and COND is the condition it should test.
13186    TARGET, if nonnull, suggests a good place to put the result.  */
13187
13188 static rtx
13189 mips_expand_builtin_movtf (enum mips_builtin_type type,
13190                            enum insn_code icode, enum mips_fp_condition cond,
13191                            rtx target, tree exp)
13192 {
13193   rtx cmp_result, op0, op1;
13194
13195   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
13196   op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
13197   op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
13198   emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
13199
13200   icode = CODE_FOR_mips_cond_move_tf_ps;
13201   target = mips_prepare_builtin_target (icode, 0, target);
13202   if (type == MIPS_BUILTIN_MOVT)
13203     {
13204       op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
13205       op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
13206     }
13207   else
13208     {
13209       op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
13210       op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
13211     }
13212   emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
13213   return target;
13214 }
13215
13216 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
13217    into TARGET otherwise.  Return TARGET.  */
13218
13219 static rtx
13220 mips_builtin_branch_and_move (rtx condition, rtx target,
13221                               rtx value_if_true, rtx value_if_false)
13222 {
13223   rtx true_label, done_label;
13224
13225   true_label = gen_label_rtx ();
13226   done_label = gen_label_rtx ();
13227
13228   /* First assume that CONDITION is false.  */
13229   mips_emit_move (target, value_if_false);
13230
13231   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
13232   emit_jump_insn (gen_condjump (condition, true_label));
13233   emit_jump_insn (gen_jump (done_label));
13234   emit_barrier ();
13235
13236   /* Fix TARGET if CONDITION is true.  */
13237   emit_label (true_label);
13238   mips_emit_move (target, value_if_true);
13239
13240   emit_label (done_label);
13241   return target;
13242 }
13243
13244 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
13245    the CALL_EXPR that calls the function, ICODE is the code of the
13246    comparison instruction, and COND is the condition it should test.
13247    TARGET, if nonnull, suggests a good place to put the boolean result.  */
13248
13249 static rtx
13250 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
13251                              enum insn_code icode, enum mips_fp_condition cond,
13252                              rtx target, tree exp)
13253 {
13254   rtx offset, condition, cmp_result, args[MAX_RECOG_OPERANDS];
13255   int argno;
13256
13257   if (target == 0 || GET_MODE (target) != SImode)
13258     target = gen_reg_rtx (SImode);
13259
13260   /* The instruction should have a target operand, an operand for each
13261      argument, and an operand for COND.  */
13262   gcc_assert (call_expr_nargs (exp) + 2 == insn_data[icode].n_operands);
13263
13264   /* Prepare the operands to the comparison.  */
13265   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
13266   for (argno = 0; argno < call_expr_nargs (exp); argno++)
13267     args[argno] = mips_prepare_builtin_arg (icode, argno + 1, exp, argno);
13268
13269   switch (insn_data[icode].n_operands)
13270     {
13271     case 4:
13272       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
13273                                   GEN_INT (cond)));
13274       break;
13275
13276     case 6:
13277       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
13278                                   args[2], args[3], GEN_INT (cond)));
13279       break;
13280
13281     default:
13282       gcc_unreachable ();
13283     }
13284
13285   /* If the comparison sets more than one register, we define the result
13286      to be 0 if all registers are false and -1 if all registers are true.
13287      The value of the complete result is indeterminate otherwise.  */
13288   switch (builtin_type)
13289     {
13290     case MIPS_BUILTIN_CMP_ALL:
13291       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
13292       return mips_builtin_branch_and_move (condition, target,
13293                                            const0_rtx, const1_rtx);
13294
13295     case MIPS_BUILTIN_CMP_UPPER:
13296     case MIPS_BUILTIN_CMP_LOWER:
13297       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
13298       condition = gen_single_cc (cmp_result, offset);
13299       return mips_builtin_branch_and_move (condition, target,
13300                                            const1_rtx, const0_rtx);
13301
13302     default:
13303       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
13304       return mips_builtin_branch_and_move (condition, target,
13305                                            const1_rtx, const0_rtx);
13306     }
13307 }
13308
13309 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
13310    if nonnull, suggests a good place to put the boolean result.  */
13311
13312 static rtx
13313 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
13314 {
13315   rtx condition, cmp_result;
13316   int cmp_value;
13317
13318   if (target == 0 || GET_MODE (target) != SImode)
13319     target = gen_reg_rtx (SImode);
13320
13321   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
13322
13323   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
13324     cmp_value = 32;
13325   else
13326     gcc_assert (0);
13327
13328   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
13329   return mips_builtin_branch_and_move (condition, target,
13330                                        const1_rtx, const0_rtx);
13331 }
13332
13333 /* Implement TARGET_EXPAND_BUILTIN.  */
13334
13335 static rtx
13336 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
13337                      enum machine_mode mode, int ignore)
13338 {
13339   tree fndecl;
13340   unsigned int fcode, avail;
13341   const struct mips_builtin_description *d;
13342
13343   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13344   fcode = DECL_FUNCTION_CODE (fndecl);
13345   gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
13346   d = &mips_builtins[fcode];
13347   avail = d->avail ();
13348   gcc_assert (avail != 0);
13349   if (TARGET_MIPS16)
13350     {
13351       error ("built-in function %qE not supported for MIPS16",
13352              DECL_NAME (fndecl));
13353       return ignore ? const0_rtx : CONST0_RTX (mode);
13354     }
13355   switch (d->builtin_type)
13356     {
13357     case MIPS_BUILTIN_DIRECT:
13358       return mips_expand_builtin_direct (d->icode, target, exp, true);
13359
13360     case MIPS_BUILTIN_DIRECT_NO_TARGET:
13361       return mips_expand_builtin_direct (d->icode, target, exp, false);
13362
13363     case MIPS_BUILTIN_MOVT:
13364     case MIPS_BUILTIN_MOVF:
13365       return mips_expand_builtin_movtf (d->builtin_type, d->icode,
13366                                         d->cond, target, exp);
13367
13368     case MIPS_BUILTIN_CMP_ANY:
13369     case MIPS_BUILTIN_CMP_ALL:
13370     case MIPS_BUILTIN_CMP_UPPER:
13371     case MIPS_BUILTIN_CMP_LOWER:
13372     case MIPS_BUILTIN_CMP_SINGLE:
13373       return mips_expand_builtin_compare (d->builtin_type, d->icode,
13374                                           d->cond, target, exp);
13375
13376     case MIPS_BUILTIN_BPOSGE32:
13377       return mips_expand_builtin_bposge (d->builtin_type, target);
13378     }
13379   gcc_unreachable ();
13380 }
13381 \f
13382 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
13383    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
13384 struct mips16_constant {
13385   struct mips16_constant *next;
13386   rtx value;
13387   rtx label;
13388   enum machine_mode mode;
13389 };
13390
13391 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
13392    first constant, HIGHEST_ADDRESS is the highest address that the first
13393    byte of the pool can have, and INSN_ADDRESS is the current instruction
13394    address.  */
13395 struct mips16_constant_pool {
13396   struct mips16_constant *first;
13397   int highest_address;
13398   int insn_address;
13399 };
13400
13401 /* Add constant VALUE to POOL and return its label.  MODE is the
13402    value's mode (used for CONST_INTs, etc.).  */
13403
13404 static rtx
13405 mips16_add_constant (struct mips16_constant_pool *pool,
13406                      rtx value, enum machine_mode mode)
13407 {
13408   struct mips16_constant **p, *c;
13409   bool first_of_size_p;
13410
13411   /* See whether the constant is already in the pool.  If so, return the
13412      existing label, otherwise leave P pointing to the place where the
13413      constant should be added.
13414
13415      Keep the pool sorted in increasing order of mode size so that we can
13416      reduce the number of alignments needed.  */
13417   first_of_size_p = true;
13418   for (p = &pool->first; *p != 0; p = &(*p)->next)
13419     {
13420       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
13421         return (*p)->label;
13422       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
13423         break;
13424       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
13425         first_of_size_p = false;
13426     }
13427
13428   /* In the worst case, the constant needed by the earliest instruction
13429      will end up at the end of the pool.  The entire pool must then be
13430      accessible from that instruction.
13431
13432      When adding the first constant, set the pool's highest address to
13433      the address of the first out-of-range byte.  Adjust this address
13434      downwards each time a new constant is added.  */
13435   if (pool->first == 0)
13436     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
13437        of the instruction with the lowest two bits clear.  The base PC
13438        value for LDPC has the lowest three bits clear.  Assume the worst
13439        case here; namely that the PC-relative instruction occupies the
13440        last 2 bytes in an aligned word.  */
13441     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
13442   pool->highest_address -= GET_MODE_SIZE (mode);
13443   if (first_of_size_p)
13444     /* Take into account the worst possible padding due to alignment.  */
13445     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
13446
13447   /* Create a new entry.  */
13448   c = XNEW (struct mips16_constant);
13449   c->value = value;
13450   c->mode = mode;
13451   c->label = gen_label_rtx ();
13452   c->next = *p;
13453   *p = c;
13454
13455   return c->label;
13456 }
13457
13458 /* Output constant VALUE after instruction INSN and return the last
13459    instruction emitted.  MODE is the mode of the constant.  */
13460
13461 static rtx
13462 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
13463 {
13464   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
13465     {
13466       rtx size = GEN_INT (GET_MODE_SIZE (mode));
13467       return emit_insn_after (gen_consttable_int (value, size), insn);
13468     }
13469
13470   if (SCALAR_FLOAT_MODE_P (mode))
13471     return emit_insn_after (gen_consttable_float (value), insn);
13472
13473   if (VECTOR_MODE_P (mode))
13474     {
13475       int i;
13476
13477       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
13478         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
13479                                         CONST_VECTOR_ELT (value, i), insn);
13480       return insn;
13481     }
13482
13483   gcc_unreachable ();
13484 }
13485
13486 /* Dump out the constants in CONSTANTS after INSN.  */
13487
13488 static void
13489 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
13490 {
13491   struct mips16_constant *c, *next;
13492   int align;
13493
13494   align = 0;
13495   for (c = constants; c != NULL; c = next)
13496     {
13497       /* If necessary, increase the alignment of PC.  */
13498       if (align < GET_MODE_SIZE (c->mode))
13499         {
13500           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
13501           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
13502         }
13503       align = GET_MODE_SIZE (c->mode);
13504
13505       insn = emit_label_after (c->label, insn);
13506       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
13507
13508       next = c->next;
13509       free (c);
13510     }
13511
13512   emit_barrier_after (insn);
13513 }
13514
13515 /* Return the length of instruction INSN.  */
13516
13517 static int
13518 mips16_insn_length (rtx insn)
13519 {
13520   if (JUMP_P (insn))
13521     {
13522       rtx body = PATTERN (insn);
13523       if (GET_CODE (body) == ADDR_VEC)
13524         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
13525       if (GET_CODE (body) == ADDR_DIFF_VEC)
13526         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
13527     }
13528   return get_attr_length (insn);
13529 }
13530
13531 /* If *X is a symbolic constant that refers to the constant pool, add
13532    the constant to POOL and rewrite *X to use the constant's label.  */
13533
13534 static void
13535 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
13536 {
13537   rtx base, offset, label;
13538
13539   split_const (*x, &base, &offset);
13540   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
13541     {
13542       label = mips16_add_constant (pool, get_pool_constant (base),
13543                                    get_pool_mode (base));
13544       base = gen_rtx_LABEL_REF (Pmode, label);
13545       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
13546     }
13547 }
13548
13549 /* This structure is used to communicate with mips16_rewrite_pool_refs.
13550    INSN is the instruction we're rewriting and POOL points to the current
13551    constant pool.  */
13552 struct mips16_rewrite_pool_refs_info {
13553   rtx insn;
13554   struct mips16_constant_pool *pool;
13555 };
13556
13557 /* Rewrite *X so that constant pool references refer to the constant's
13558    label instead.  DATA points to a mips16_rewrite_pool_refs_info
13559    structure.  */
13560
13561 static int
13562 mips16_rewrite_pool_refs (rtx *x, void *data)
13563 {
13564   struct mips16_rewrite_pool_refs_info *info =
13565     (struct mips16_rewrite_pool_refs_info *) data;
13566
13567   if (force_to_mem_operand (*x, Pmode))
13568     {
13569       rtx mem = force_const_mem (GET_MODE (*x), *x);
13570       validate_change (info->insn, x, mem, false);
13571     }
13572
13573   if (MEM_P (*x))
13574     {
13575       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
13576       return -1;
13577     }
13578
13579   if (TARGET_MIPS16_TEXT_LOADS)
13580     mips16_rewrite_pool_constant (info->pool, x);
13581
13582   return GET_CODE (*x) == CONST ? -1 : 0;
13583 }
13584
13585 /* Return whether CFG is used in mips_reorg.  */
13586
13587 static bool
13588 mips_cfg_in_reorg (void)
13589 {
13590   return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
13591           || TARGET_RELAX_PIC_CALLS);
13592 }
13593
13594 /* Build MIPS16 constant pools.  */
13595
13596 static void
13597 mips16_lay_out_constants (void)
13598 {
13599   struct mips16_constant_pool pool;
13600   struct mips16_rewrite_pool_refs_info info;
13601   rtx insn, barrier;
13602
13603   if (!TARGET_MIPS16_PCREL_LOADS)
13604     return;
13605
13606   if (mips_cfg_in_reorg ())
13607     split_all_insns ();
13608   else
13609     split_all_insns_noflow ();
13610   barrier = 0;
13611   memset (&pool, 0, sizeof (pool));
13612   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
13613     {
13614       /* Rewrite constant pool references in INSN.  */
13615       if (USEFUL_INSN_P (insn))
13616         {
13617           info.insn = insn;
13618           info.pool = &pool;
13619           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
13620         }
13621
13622       pool.insn_address += mips16_insn_length (insn);
13623
13624       if (pool.first != NULL)
13625         {
13626           /* If there are no natural barriers between the first user of
13627              the pool and the highest acceptable address, we'll need to
13628              create a new instruction to jump around the constant pool.
13629              In the worst case, this instruction will be 4 bytes long.
13630
13631              If it's too late to do this transformation after INSN,
13632              do it immediately before INSN.  */
13633           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
13634             {
13635               rtx label, jump;
13636
13637               label = gen_label_rtx ();
13638
13639               jump = emit_jump_insn_before (gen_jump (label), insn);
13640               JUMP_LABEL (jump) = label;
13641               LABEL_NUSES (label) = 1;
13642               barrier = emit_barrier_after (jump);
13643
13644               emit_label_after (label, barrier);
13645               pool.insn_address += 4;
13646             }
13647
13648           /* See whether the constant pool is now out of range of the first
13649              user.  If so, output the constants after the previous barrier.
13650              Note that any instructions between BARRIER and INSN (inclusive)
13651              will use negative offsets to refer to the pool.  */
13652           if (pool.insn_address > pool.highest_address)
13653             {
13654               mips16_emit_constants (pool.first, barrier);
13655               pool.first = NULL;
13656               barrier = 0;
13657             }
13658           else if (BARRIER_P (insn))
13659             barrier = insn;
13660         }
13661     }
13662   mips16_emit_constants (pool.first, get_last_insn ());
13663 }
13664 \f
13665 /* Return true if it is worth r10k_simplify_address's while replacing
13666    an address with X.  We are looking for constants, and for addresses
13667    at a known offset from the incoming stack pointer.  */
13668
13669 static bool
13670 r10k_simplified_address_p (rtx x)
13671 {
13672   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
13673     x = XEXP (x, 0);
13674   return x == virtual_incoming_args_rtx || CONSTANT_P (x);
13675 }
13676
13677 /* X is an expression that appears in INSN.  Try to use the UD chains
13678    to simplify it, returning the simplified form on success and the
13679    original form otherwise.  Replace the incoming value of $sp with
13680    virtual_incoming_args_rtx (which should never occur in X otherwise).  */
13681
13682 static rtx
13683 r10k_simplify_address (rtx x, rtx insn)
13684 {
13685   rtx newx, op0, op1, set, def_insn, note;
13686   df_ref use, def;
13687   struct df_link *defs;
13688
13689   newx = NULL_RTX;
13690   if (UNARY_P (x))
13691     {
13692       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13693       if (op0 != XEXP (x, 0))
13694         newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
13695                                    op0, GET_MODE (XEXP (x, 0)));
13696     }
13697   else if (BINARY_P (x))
13698     {
13699       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13700       op1 = r10k_simplify_address (XEXP (x, 1), insn);
13701       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
13702         newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
13703     }
13704   else if (GET_CODE (x) == LO_SUM)
13705     {
13706       /* LO_SUMs can be offset from HIGHs, if we know they won't
13707          overflow.  See mips_classify_address for the rationale behind
13708          the lax check.  */
13709       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13710       if (GET_CODE (op0) == HIGH)
13711         newx = XEXP (x, 1);
13712     }
13713   else if (REG_P (x))
13714     {
13715       /* Uses are recorded by regno_reg_rtx, not X itself.  */
13716       use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
13717       gcc_assert (use);
13718       defs = DF_REF_CHAIN (use);
13719
13720       /* Require a single definition.  */
13721       if (defs && defs->next == NULL)
13722         {
13723           def = defs->ref;
13724           if (DF_REF_IS_ARTIFICIAL (def))
13725             {
13726               /* Replace the incoming value of $sp with
13727                  virtual_incoming_args_rtx.  */
13728               if (x == stack_pointer_rtx
13729                   && DF_REF_BB (def) == ENTRY_BLOCK_PTR)
13730                 newx = virtual_incoming_args_rtx;
13731             }
13732           else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
13733                                    DF_REF_BB (def)))
13734             {
13735               /* Make sure that DEF_INSN is a single set of REG.  */
13736               def_insn = DF_REF_INSN (def);
13737               if (NONJUMP_INSN_P (def_insn))
13738                 {
13739                   set = single_set (def_insn);
13740                   if (set && rtx_equal_p (SET_DEST (set), x))
13741                     {
13742                       /* Prefer to use notes, since the def-use chains
13743                          are often shorter.  */
13744                       note = find_reg_equal_equiv_note (def_insn);
13745                       if (note)
13746                         newx = XEXP (note, 0);
13747                       else
13748                         newx = SET_SRC (set);
13749                       newx = r10k_simplify_address (newx, def_insn);
13750                     }
13751                 }
13752             }
13753         }
13754     }
13755   if (newx && r10k_simplified_address_p (newx))
13756     return newx;
13757   return x;
13758 }
13759
13760 /* Return true if ADDRESS is known to be an uncached address
13761    on R10K systems.  */
13762
13763 static bool
13764 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
13765 {
13766   unsigned HOST_WIDE_INT upper;
13767
13768   /* Check for KSEG1.  */
13769   if (address + 0x60000000 < 0x20000000)
13770     return true;
13771
13772   /* Check for uncached XKPHYS addresses.  */
13773   if (Pmode == DImode)
13774     {
13775       upper = (address >> 40) & 0xf9ffff;
13776       if (upper == 0x900000 || upper == 0xb80000)
13777         return true;
13778     }
13779   return false;
13780 }
13781
13782 /* Return true if we can prove that an access to address X in instruction
13783    INSN would be safe from R10K speculation.  This X is a general
13784    expression; it might not be a legitimate address.  */
13785
13786 static bool
13787 r10k_safe_address_p (rtx x, rtx insn)
13788 {
13789   rtx base, offset;
13790   HOST_WIDE_INT offset_val;
13791
13792   x = r10k_simplify_address (x, insn);
13793
13794   /* Check for references to the stack frame.  It doesn't really matter
13795      how much of the frame has been allocated at INSN; -mr10k-cache-barrier
13796      allows us to assume that accesses to any part of the eventual frame
13797      is safe from speculation at any point in the function.  */
13798   mips_split_plus (x, &base, &offset_val);
13799   if (base == virtual_incoming_args_rtx
13800       && offset_val >= -cfun->machine->frame.total_size
13801       && offset_val < cfun->machine->frame.args_size)
13802     return true;
13803
13804   /* Check for uncached addresses.  */
13805   if (CONST_INT_P (x))
13806     return r10k_uncached_address_p (INTVAL (x));
13807
13808   /* Check for accesses to a static object.  */
13809   split_const (x, &base, &offset);
13810   return offset_within_block_p (base, INTVAL (offset));
13811 }
13812
13813 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
13814    an in-range access to an automatic variable, or to an object with
13815    a link-time-constant address.  */
13816
13817 static bool
13818 r10k_safe_mem_expr_p (tree expr, rtx offset)
13819 {
13820   if (expr == NULL_TREE
13821       || offset == NULL_RTX
13822       || !CONST_INT_P (offset)
13823       || INTVAL (offset) < 0
13824       || INTVAL (offset) >= int_size_in_bytes (TREE_TYPE (expr)))
13825     return false;
13826
13827   while (TREE_CODE (expr) == COMPONENT_REF)
13828     {
13829       expr = TREE_OPERAND (expr, 0);
13830       if (expr == NULL_TREE)
13831         return false;
13832     }
13833
13834   return DECL_P (expr);
13835 }
13836
13837 /* A for_each_rtx callback for which DATA points to the instruction
13838    containing *X.  Stop the search if we find a MEM that is not safe
13839    from R10K speculation.  */
13840
13841 static int
13842 r10k_needs_protection_p_1 (rtx *loc, void *data)
13843 {
13844   rtx mem;
13845
13846   mem = *loc;
13847   if (!MEM_P (mem))
13848     return 0;
13849
13850   if (r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
13851     return -1;
13852
13853   if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
13854     return -1;
13855
13856   return 1;
13857 }
13858
13859 /* A note_stores callback for which DATA points to an instruction pointer.
13860    If *DATA is nonnull, make it null if it X contains a MEM that is not
13861    safe from R10K speculation.  */
13862
13863 static void
13864 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13865                                void *data)
13866 {
13867   rtx *insn_ptr;
13868
13869   insn_ptr = (rtx *) data;
13870   if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
13871     *insn_ptr = NULL_RTX;
13872 }
13873
13874 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
13875    Return nonzero if the call is not to a declared function.  */
13876
13877 static int
13878 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
13879 {
13880   rtx x;
13881
13882   x = *loc;
13883   if (!MEM_P (x))
13884     return 0;
13885
13886   x = XEXP (x, 0);
13887   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
13888     return -1;
13889
13890   return 1;
13891 }
13892
13893 /* Return true if instruction INSN needs to be protected by an R10K
13894    cache barrier.  */
13895
13896 static bool
13897 r10k_needs_protection_p (rtx insn)
13898 {
13899   if (CALL_P (insn))
13900     return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
13901
13902   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
13903     {
13904       note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
13905       return insn == NULL_RTX;
13906     }
13907
13908   return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
13909 }
13910
13911 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
13912    edge is unconditional.  */
13913
13914 static bool
13915 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
13916 {
13917   edge_iterator ei;
13918   edge e;
13919
13920   FOR_EACH_EDGE (e, ei, bb->preds)
13921     if (!single_succ_p (e->src)
13922         || !TEST_BIT (protected_bbs, e->src->index)
13923         || (e->flags & EDGE_COMPLEX) != 0)
13924       return false;
13925   return true;
13926 }
13927
13928 /* Implement -mr10k-cache-barrier= for the current function.  */
13929
13930 static void
13931 r10k_insert_cache_barriers (void)
13932 {
13933   int *rev_post_order;
13934   unsigned int i, n;
13935   basic_block bb;
13936   sbitmap protected_bbs;
13937   rtx insn, end, unprotected_region;
13938
13939   if (TARGET_MIPS16)
13940     {
13941       sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
13942       return;
13943     }
13944
13945   /* Calculate dominators.  */
13946   calculate_dominance_info (CDI_DOMINATORS);
13947
13948   /* Bit X of PROTECTED_BBS is set if the last operation in basic block
13949      X is protected by a cache barrier.  */
13950   protected_bbs = sbitmap_alloc (last_basic_block);
13951   sbitmap_zero (protected_bbs);
13952
13953   /* Iterate over the basic blocks in reverse post-order.  */
13954   rev_post_order = XNEWVEC (int, last_basic_block);
13955   n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
13956   for (i = 0; i < n; i++)
13957     {
13958       bb = BASIC_BLOCK (rev_post_order[i]);
13959
13960       /* If this block is only reached by unconditional edges, and if the
13961          source of every edge is protected, the beginning of the block is
13962          also protected.  */
13963       if (r10k_protected_bb_p (bb, protected_bbs))
13964         unprotected_region = NULL_RTX;
13965       else
13966         unprotected_region = pc_rtx;
13967       end = NEXT_INSN (BB_END (bb));
13968
13969       /* UNPROTECTED_REGION is:
13970
13971          - null if we are processing a protected region,
13972          - pc_rtx if we are processing an unprotected region but have
13973            not yet found the first instruction in it
13974          - the first instruction in an unprotected region otherwise.  */
13975       for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
13976         {
13977           if (unprotected_region && USEFUL_INSN_P (insn))
13978             {
13979               if (recog_memoized (insn) == CODE_FOR_mips_cache)
13980                 /* This CACHE instruction protects the following code.  */
13981                 unprotected_region = NULL_RTX;
13982               else
13983                 {
13984                   /* See if INSN is the first instruction in this
13985                      unprotected region.  */
13986                   if (unprotected_region == pc_rtx)
13987                     unprotected_region = insn;
13988
13989                   /* See if INSN needs to be protected.  If so,
13990                      we must insert a cache barrier somewhere between
13991                      PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
13992                      clear which position is better performance-wise,
13993                      but as a tie-breaker, we assume that it is better
13994                      to allow delay slots to be back-filled where
13995                      possible, and that it is better not to insert
13996                      barriers in the middle of already-scheduled code.
13997                      We therefore insert the barrier at the beginning
13998                      of the region.  */
13999                   if (r10k_needs_protection_p (insn))
14000                     {
14001                       emit_insn_before (gen_r10k_cache_barrier (),
14002                                         unprotected_region);
14003                       unprotected_region = NULL_RTX;
14004                     }
14005                 }
14006             }
14007
14008           if (CALL_P (insn))
14009             /* The called function is not required to protect the exit path.
14010                The code that follows a call is therefore unprotected.  */
14011             unprotected_region = pc_rtx;
14012         }
14013
14014       /* Record whether the end of this block is protected.  */
14015       if (unprotected_region == NULL_RTX)
14016         SET_BIT (protected_bbs, bb->index);
14017     }
14018   XDELETEVEC (rev_post_order);
14019
14020   sbitmap_free (protected_bbs);
14021
14022   free_dominance_info (CDI_DOMINATORS);
14023 }
14024 \f
14025 /* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
14026    otherwise.  */
14027
14028 static rtx
14029 mips_call_expr_from_insn (rtx insn)
14030 {
14031   rtx x;
14032
14033   if (!CALL_P (insn))
14034     return NULL_RTX;
14035
14036   x = PATTERN (insn);
14037   if (GET_CODE (x) == PARALLEL)
14038     x = XVECEXP (x, 0, 0);
14039   if (GET_CODE (x) == SET)
14040     x = XEXP (x, 1);
14041
14042   gcc_assert (GET_CODE (x) == CALL);
14043   return x;
14044 }
14045
14046 /* REG is set in DEF.  See if the definition is one of the ways we load a
14047    register with a symbol address for a mips_use_pic_fn_addr_reg_p call.  If
14048    it is return the symbol reference of the function, otherwise return
14049    NULL_RTX.  */
14050
14051 static rtx
14052 mips_pic_call_symbol_from_set (df_ref def, rtx reg)
14053 {
14054   rtx def_insn, set;
14055
14056   if (DF_REF_IS_ARTIFICIAL (def))
14057     return NULL_RTX;
14058
14059   def_insn = DF_REF_INSN (def);
14060   set = single_set (def_insn);
14061   if (set && rtx_equal_p (SET_DEST (set), reg))
14062     {
14063       rtx note, src, symbol;
14064
14065       /* First, look at REG_EQUAL/EQUIV notes.  */
14066       note = find_reg_equal_equiv_note (def_insn);
14067       if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
14068         return XEXP (note, 0);
14069
14070       /* For %call16 references we don't have REG_EQUAL.  */
14071       src = SET_SRC (set);
14072       symbol = mips_strip_unspec_call (src);
14073       if (symbol)
14074         {
14075           gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14076           return symbol;
14077         }
14078
14079       /* Follow simple register copies.  */
14080       if (REG_P (src))
14081         return mips_find_pic_call_symbol (def_insn, src);
14082     }
14083
14084   return NULL_RTX;
14085 }
14086
14087 /* Find the definition of the use of REG in INSN.  See if the definition is
14088    one of the ways we load a register with a symbol address for a
14089    mips_use_pic_fn_addr_reg_p call.  If it is return the symbol reference of
14090    the function, otherwise return NULL_RTX.  */
14091
14092 static rtx
14093 mips_find_pic_call_symbol (rtx insn, rtx reg)
14094 {
14095   df_ref use;
14096   struct df_link *defs;
14097   rtx symbol;
14098
14099   use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
14100   if (!use)
14101     return NULL_RTX;
14102   defs = DF_REF_CHAIN (use);
14103   if (!defs)
14104     return NULL_RTX;
14105   symbol = mips_pic_call_symbol_from_set (defs->ref, reg);
14106   if (!symbol)
14107     return NULL_RTX;
14108
14109   /* If we have more than one definition, they need to be identical.  */
14110   for (defs = defs->next; defs; defs = defs->next)
14111     {
14112       rtx other;
14113
14114       other = mips_pic_call_symbol_from_set (defs->ref, reg);
14115       if (!rtx_equal_p (symbol, other))
14116         return NULL_RTX;
14117     }
14118
14119   return symbol;
14120 }
14121
14122 /* Replace the args_size operand of the call expression CALL with the
14123    call-attribute UNSPEC and fill in SYMBOL as the function symbol.  */
14124
14125 static void
14126 mips_annotate_pic_call_expr (rtx call, rtx symbol)
14127 {
14128   rtx args_size;
14129
14130   args_size = XEXP (call, 1);
14131   XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
14132                                    gen_rtvec (2, args_size, symbol),
14133                                    UNSPEC_CALL_ATTR);
14134 }
14135
14136 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression.  See
14137    if instead of the arg_size argument it contains the call attributes.  If
14138    yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
14139    symbol from the call attributes.  Also return false if ARGS_SIZE_OPNO is
14140    -1.  */
14141
14142 bool
14143 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
14144 {
14145   rtx args_size, symbol;
14146
14147   if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
14148     return false;
14149
14150   args_size = operands[args_size_opno];
14151   if (GET_CODE (args_size) != UNSPEC)
14152     return false;
14153   gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
14154
14155   symbol = XVECEXP (args_size, 0, 1);
14156   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14157
14158   operands[args_size_opno] = symbol;
14159   return true;
14160 }
14161
14162 /* Use DF to annotate PIC indirect calls with the function symbol they
14163    dispatch to.  */
14164
14165 static void
14166 mips_annotate_pic_calls (void)
14167 {
14168   basic_block bb;
14169   rtx insn;
14170
14171   FOR_EACH_BB (bb)
14172     FOR_BB_INSNS (bb, insn)
14173     {
14174       rtx call, reg, symbol;
14175
14176       call = mips_call_expr_from_insn (insn);
14177       if (!call)
14178         continue;
14179       gcc_assert (MEM_P (XEXP (call, 0)));
14180       reg = XEXP (XEXP (call, 0), 0);
14181       if (!REG_P (reg))
14182         continue;
14183
14184       symbol = mips_find_pic_call_symbol (insn, reg);
14185       if (symbol)
14186         mips_annotate_pic_call_expr (call, symbol);
14187     }
14188 }
14189 \f
14190 /* A temporary variable used by for_each_rtx callbacks, etc.  */
14191 static rtx mips_sim_insn;
14192
14193 /* A structure representing the state of the processor pipeline.
14194    Used by the mips_sim_* family of functions.  */
14195 struct mips_sim {
14196   /* The maximum number of instructions that can be issued in a cycle.
14197      (Caches mips_issue_rate.)  */
14198   unsigned int issue_rate;
14199
14200   /* The current simulation time.  */
14201   unsigned int time;
14202
14203   /* How many more instructions can be issued in the current cycle.  */
14204   unsigned int insns_left;
14205
14206   /* LAST_SET[X].INSN is the last instruction to set register X.
14207      LAST_SET[X].TIME is the time at which that instruction was issued.
14208      INSN is null if no instruction has yet set register X.  */
14209   struct {
14210     rtx insn;
14211     unsigned int time;
14212   } last_set[FIRST_PSEUDO_REGISTER];
14213
14214   /* The pipeline's current DFA state.  */
14215   state_t dfa_state;
14216 };
14217
14218 /* Reset STATE to the initial simulation state.  */
14219
14220 static void
14221 mips_sim_reset (struct mips_sim *state)
14222 {
14223   state->time = 0;
14224   state->insns_left = state->issue_rate;
14225   memset (&state->last_set, 0, sizeof (state->last_set));
14226   state_reset (state->dfa_state);
14227 }
14228
14229 /* Initialize STATE before its first use.  DFA_STATE points to an
14230    allocated but uninitialized DFA state.  */
14231
14232 static void
14233 mips_sim_init (struct mips_sim *state, state_t dfa_state)
14234 {
14235   state->issue_rate = mips_issue_rate ();
14236   state->dfa_state = dfa_state;
14237   mips_sim_reset (state);
14238 }
14239
14240 /* Advance STATE by one clock cycle.  */
14241
14242 static void
14243 mips_sim_next_cycle (struct mips_sim *state)
14244 {
14245   state->time++;
14246   state->insns_left = state->issue_rate;
14247   state_transition (state->dfa_state, 0);
14248 }
14249
14250 /* Advance simulation state STATE until instruction INSN can read
14251    register REG.  */
14252
14253 static void
14254 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
14255 {
14256   unsigned int regno, end_regno;
14257
14258   end_regno = END_REGNO (reg);
14259   for (regno = REGNO (reg); regno < end_regno; regno++)
14260     if (state->last_set[regno].insn != 0)
14261       {
14262         unsigned int t;
14263
14264         t = (state->last_set[regno].time
14265              + insn_latency (state->last_set[regno].insn, insn));
14266         while (state->time < t)
14267           mips_sim_next_cycle (state);
14268     }
14269 }
14270
14271 /* A for_each_rtx callback.  If *X is a register, advance simulation state
14272    DATA until mips_sim_insn can read the register's value.  */
14273
14274 static int
14275 mips_sim_wait_regs_2 (rtx *x, void *data)
14276 {
14277   if (REG_P (*x))
14278     mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
14279   return 0;
14280 }
14281
14282 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
14283
14284 static void
14285 mips_sim_wait_regs_1 (rtx *x, void *data)
14286 {
14287   for_each_rtx (x, mips_sim_wait_regs_2, data);
14288 }
14289
14290 /* Advance simulation state STATE until all of INSN's register
14291    dependencies are satisfied.  */
14292
14293 static void
14294 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
14295 {
14296   mips_sim_insn = insn;
14297   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
14298 }
14299
14300 /* Advance simulation state STATE until the units required by
14301    instruction INSN are available.  */
14302
14303 static void
14304 mips_sim_wait_units (struct mips_sim *state, rtx insn)
14305 {
14306   state_t tmp_state;
14307
14308   tmp_state = alloca (state_size ());
14309   while (state->insns_left == 0
14310          || (memcpy (tmp_state, state->dfa_state, state_size ()),
14311              state_transition (tmp_state, insn) >= 0))
14312     mips_sim_next_cycle (state);
14313 }
14314
14315 /* Advance simulation state STATE until INSN is ready to issue.  */
14316
14317 static void
14318 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
14319 {
14320   mips_sim_wait_regs (state, insn);
14321   mips_sim_wait_units (state, insn);
14322 }
14323
14324 /* mips_sim_insn has just set X.  Update the LAST_SET array
14325    in simulation state DATA.  */
14326
14327 static void
14328 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
14329 {
14330   struct mips_sim *state;
14331
14332   state = (struct mips_sim *) data;
14333   if (REG_P (x))
14334     {
14335       unsigned int regno, end_regno;
14336
14337       end_regno = END_REGNO (x);
14338       for (regno = REGNO (x); regno < end_regno; regno++)
14339         {
14340           state->last_set[regno].insn = mips_sim_insn;
14341           state->last_set[regno].time = state->time;
14342         }
14343     }
14344 }
14345
14346 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
14347    can issue immediately (i.e., that mips_sim_wait_insn has already
14348    been called).  */
14349
14350 static void
14351 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
14352 {
14353   state_transition (state->dfa_state, insn);
14354   state->insns_left--;
14355
14356   mips_sim_insn = insn;
14357   note_stores (PATTERN (insn), mips_sim_record_set, state);
14358 }
14359
14360 /* Simulate issuing a NOP in state STATE.  */
14361
14362 static void
14363 mips_sim_issue_nop (struct mips_sim *state)
14364 {
14365   if (state->insns_left == 0)
14366     mips_sim_next_cycle (state);
14367   state->insns_left--;
14368 }
14369
14370 /* Update simulation state STATE so that it's ready to accept the instruction
14371    after INSN.  INSN should be part of the main rtl chain, not a member of a
14372    SEQUENCE.  */
14373
14374 static void
14375 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
14376 {
14377   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
14378   if (JUMP_P (insn))
14379     mips_sim_issue_nop (state);
14380
14381   switch (GET_CODE (SEQ_BEGIN (insn)))
14382     {
14383     case CODE_LABEL:
14384     case CALL_INSN:
14385       /* We can't predict the processor state after a call or label.  */
14386       mips_sim_reset (state);
14387       break;
14388
14389     case JUMP_INSN:
14390       /* The delay slots of branch likely instructions are only executed
14391          when the branch is taken.  Therefore, if the caller has simulated
14392          the delay slot instruction, STATE does not really reflect the state
14393          of the pipeline for the instruction after the delay slot.  Also,
14394          branch likely instructions tend to incur a penalty when not taken,
14395          so there will probably be an extra delay between the branch and
14396          the instruction after the delay slot.  */
14397       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
14398         mips_sim_reset (state);
14399       break;
14400
14401     default:
14402       break;
14403     }
14404 }
14405 \f
14406 /* The VR4130 pipeline issues aligned pairs of instructions together,
14407    but it stalls the second instruction if it depends on the first.
14408    In order to cut down the amount of logic required, this dependence
14409    check is not based on a full instruction decode.  Instead, any non-SPECIAL
14410    instruction is assumed to modify the register specified by bits 20-16
14411    (which is usually the "rt" field).
14412
14413    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
14414    input, so we can end up with a false dependence between the branch
14415    and its delay slot.  If this situation occurs in instruction INSN,
14416    try to avoid it by swapping rs and rt.  */
14417
14418 static void
14419 vr4130_avoid_branch_rt_conflict (rtx insn)
14420 {
14421   rtx first, second;
14422
14423   first = SEQ_BEGIN (insn);
14424   second = SEQ_END (insn);
14425   if (JUMP_P (first)
14426       && NONJUMP_INSN_P (second)
14427       && GET_CODE (PATTERN (first)) == SET
14428       && GET_CODE (SET_DEST (PATTERN (first))) == PC
14429       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
14430     {
14431       /* Check for the right kind of condition.  */
14432       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
14433       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
14434           && REG_P (XEXP (cond, 0))
14435           && REG_P (XEXP (cond, 1))
14436           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
14437           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
14438         {
14439           /* SECOND mentions the rt register but not the rs register.  */
14440           rtx tmp = XEXP (cond, 0);
14441           XEXP (cond, 0) = XEXP (cond, 1);
14442           XEXP (cond, 1) = tmp;
14443         }
14444     }
14445 }
14446
14447 /* Implement -mvr4130-align.  Go through each basic block and simulate the
14448    processor pipeline.  If we find that a pair of instructions could execute
14449    in parallel, and the first of those instructions is not 8-byte aligned,
14450    insert a nop to make it aligned.  */
14451
14452 static void
14453 vr4130_align_insns (void)
14454 {
14455   struct mips_sim state;
14456   rtx insn, subinsn, last, last2, next;
14457   bool aligned_p;
14458
14459   dfa_start ();
14460
14461   /* LAST is the last instruction before INSN to have a nonzero length.
14462      LAST2 is the last such instruction before LAST.  */
14463   last = 0;
14464   last2 = 0;
14465
14466   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
14467   aligned_p = true;
14468
14469   mips_sim_init (&state, alloca (state_size ()));
14470   for (insn = get_insns (); insn != 0; insn = next)
14471     {
14472       unsigned int length;
14473
14474       next = NEXT_INSN (insn);
14475
14476       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
14477          This isn't really related to the alignment pass, but we do it on
14478          the fly to avoid a separate instruction walk.  */
14479       vr4130_avoid_branch_rt_conflict (insn);
14480
14481       if (USEFUL_INSN_P (insn))
14482         FOR_EACH_SUBINSN (subinsn, insn)
14483           {
14484             mips_sim_wait_insn (&state, subinsn);
14485
14486             /* If we want this instruction to issue in parallel with the
14487                previous one, make sure that the previous instruction is
14488                aligned.  There are several reasons why this isn't worthwhile
14489                when the second instruction is a call:
14490
14491                   - Calls are less likely to be performance critical,
14492                   - There's a good chance that the delay slot can execute
14493                     in parallel with the call.
14494                   - The return address would then be unaligned.
14495
14496                In general, if we're going to insert a nop between instructions
14497                X and Y, it's better to insert it immediately after X.  That
14498                way, if the nop makes Y aligned, it will also align any labels
14499                between X and Y.  */
14500             if (state.insns_left != state.issue_rate
14501                 && !CALL_P (subinsn))
14502               {
14503                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
14504                   {
14505                     /* SUBINSN is the first instruction in INSN and INSN is
14506                        aligned.  We want to align the previous instruction
14507                        instead, so insert a nop between LAST2 and LAST.
14508
14509                        Note that LAST could be either a single instruction
14510                        or a branch with a delay slot.  In the latter case,
14511                        LAST, like INSN, is already aligned, but the delay
14512                        slot must have some extra delay that stops it from
14513                        issuing at the same time as the branch.  We therefore
14514                        insert a nop before the branch in order to align its
14515                        delay slot.  */
14516                     emit_insn_after (gen_nop (), last2);
14517                     aligned_p = false;
14518                   }
14519                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
14520                   {
14521                     /* SUBINSN is the delay slot of INSN, but INSN is
14522                        currently unaligned.  Insert a nop between
14523                        LAST and INSN to align it.  */
14524                     emit_insn_after (gen_nop (), last);
14525                     aligned_p = true;
14526                   }
14527               }
14528             mips_sim_issue_insn (&state, subinsn);
14529           }
14530       mips_sim_finish_insn (&state, insn);
14531
14532       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
14533       length = get_attr_length (insn);
14534       if (length > 0)
14535         {
14536           /* If the instruction is an asm statement or multi-instruction
14537              mips.md patern, the length is only an estimate.  Insert an
14538              8 byte alignment after it so that the following instructions
14539              can be handled correctly.  */
14540           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
14541               && (recog_memoized (insn) < 0 || length >= 8))
14542             {
14543               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
14544               next = NEXT_INSN (next);
14545               mips_sim_next_cycle (&state);
14546               aligned_p = true;
14547             }
14548           else if (length & 4)
14549             aligned_p = !aligned_p;
14550           last2 = last;
14551           last = insn;
14552         }
14553
14554       /* See whether INSN is an aligned label.  */
14555       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
14556         aligned_p = true;
14557     }
14558   dfa_finish ();
14559 }
14560 \f
14561 /* This structure records that the current function has a LO_SUM
14562    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
14563    the largest offset applied to BASE by all such LO_SUMs.  */
14564 struct mips_lo_sum_offset {
14565   rtx base;
14566   HOST_WIDE_INT offset;
14567 };
14568
14569 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
14570
14571 static hashval_t
14572 mips_hash_base (rtx base)
14573 {
14574   int do_not_record_p;
14575
14576   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
14577 }
14578
14579 /* Hash-table callbacks for mips_lo_sum_offsets.  */
14580
14581 static hashval_t
14582 mips_lo_sum_offset_hash (const void *entry)
14583 {
14584   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
14585 }
14586
14587 static int
14588 mips_lo_sum_offset_eq (const void *entry, const void *value)
14589 {
14590   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
14591                       (const_rtx) value);
14592 }
14593
14594 /* Look up symbolic constant X in HTAB, which is a hash table of
14595    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
14596    paired with a recorded LO_SUM, otherwise record X in the table.  */
14597
14598 static bool
14599 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
14600 {
14601   rtx base, offset;
14602   void **slot;
14603   struct mips_lo_sum_offset *entry;
14604
14605   /* Split X into a base and offset.  */
14606   split_const (x, &base, &offset);
14607   if (UNSPEC_ADDRESS_P (base))
14608     base = UNSPEC_ADDRESS (base);
14609
14610   /* Look up the base in the hash table.  */
14611   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
14612   if (slot == NULL)
14613     return false;
14614
14615   entry = (struct mips_lo_sum_offset *) *slot;
14616   if (option == INSERT)
14617     {
14618       if (entry == NULL)
14619         {
14620           entry = XNEW (struct mips_lo_sum_offset);
14621           entry->base = base;
14622           entry->offset = INTVAL (offset);
14623           *slot = entry;
14624         }
14625       else
14626         {
14627           if (INTVAL (offset) > entry->offset)
14628             entry->offset = INTVAL (offset);
14629         }
14630     }
14631   return INTVAL (offset) <= entry->offset;
14632 }
14633
14634 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
14635    Record every LO_SUM in *LOC.  */
14636
14637 static int
14638 mips_record_lo_sum (rtx *loc, void *data)
14639 {
14640   if (GET_CODE (*loc) == LO_SUM)
14641     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
14642   return 0;
14643 }
14644
14645 /* Return true if INSN is a SET of an orphaned high-part relocation.
14646    HTAB is a hash table of mips_lo_sum_offsets that describes all the
14647    LO_SUMs in the current function.  */
14648
14649 static bool
14650 mips_orphaned_high_part_p (htab_t htab, rtx insn)
14651 {
14652   enum mips_symbol_type type;
14653   rtx x, set;
14654
14655   set = single_set (insn);
14656   if (set)
14657     {
14658       /* Check for %his.  */
14659       x = SET_SRC (set);
14660       if (GET_CODE (x) == HIGH
14661           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
14662         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
14663
14664       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
14665       if (GET_CODE (x) == UNSPEC
14666           && XINT (x, 1) == UNSPEC_LOAD_GOT
14667           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
14668                                        SYMBOL_CONTEXT_LEA, &type)
14669           && type == SYMBOL_GOTOFF_PAGE)
14670         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
14671     }
14672   return false;
14673 }
14674
14675 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
14676    INSN and a previous instruction, avoid it by inserting nops after
14677    instruction AFTER.
14678
14679    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
14680    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
14681    before using the value of that register.  *HILO_DELAY counts the
14682    number of instructions since the last hilo hazard (that is,
14683    the number of instructions since the last MFLO or MFHI).
14684
14685    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
14686    for the next instruction.
14687
14688    LO_REG is an rtx for the LO register, used in dependence checking.  */
14689
14690 static void
14691 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
14692                    rtx *delayed_reg, rtx lo_reg)
14693 {
14694   rtx pattern, set;
14695   int nops, ninsns;
14696
14697   pattern = PATTERN (insn);
14698
14699   /* Do not put the whole function in .set noreorder if it contains
14700      an asm statement.  We don't know whether there will be hazards
14701      between the asm statement and the gcc-generated code.  */
14702   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
14703     cfun->machine->all_noreorder_p = false;
14704
14705   /* Ignore zero-length instructions (barriers and the like).  */
14706   ninsns = get_attr_length (insn) / 4;
14707   if (ninsns == 0)
14708     return;
14709
14710   /* Work out how many nops are needed.  Note that we only care about
14711      registers that are explicitly mentioned in the instruction's pattern.
14712      It doesn't matter that calls use the argument registers or that they
14713      clobber hi and lo.  */
14714   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
14715     nops = 2 - *hilo_delay;
14716   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
14717     nops = 1;
14718   else
14719     nops = 0;
14720
14721   /* Insert the nops between this instruction and the previous one.
14722      Each new nop takes us further from the last hilo hazard.  */
14723   *hilo_delay += nops;
14724   while (nops-- > 0)
14725     emit_insn_after (gen_hazard_nop (), after);
14726
14727   /* Set up the state for the next instruction.  */
14728   *hilo_delay += ninsns;
14729   *delayed_reg = 0;
14730   if (INSN_CODE (insn) >= 0)
14731     switch (get_attr_hazard (insn))
14732       {
14733       case HAZARD_NONE:
14734         break;
14735
14736       case HAZARD_HILO:
14737         *hilo_delay = 0;
14738         break;
14739
14740       case HAZARD_DELAY:
14741         set = single_set (insn);
14742         gcc_assert (set);
14743         *delayed_reg = SET_DEST (set);
14744         break;
14745       }
14746 }
14747
14748 /* Go through the instruction stream and insert nops where necessary.
14749    Also delete any high-part relocations whose partnering low parts
14750    are now all dead.  See if the whole function can then be put into
14751    .set noreorder and .set nomacro.  */
14752
14753 static void
14754 mips_reorg_process_insns (void)
14755 {
14756   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
14757   int hilo_delay;
14758   htab_t htab;
14759
14760   /* Force all instructions to be split into their final form.  */
14761   split_all_insns_noflow ();
14762
14763   /* Recalculate instruction lengths without taking nops into account.  */
14764   cfun->machine->ignore_hazard_length_p = true;
14765   shorten_branches (get_insns ());
14766
14767   cfun->machine->all_noreorder_p = true;
14768
14769   /* We don't track MIPS16 PC-relative offsets closely enough to make
14770      a good job of "set .noreorder" code in MIPS16 mode.  */
14771   if (TARGET_MIPS16)
14772     cfun->machine->all_noreorder_p = false;
14773
14774   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
14775   if (!TARGET_EXPLICIT_RELOCS)
14776     cfun->machine->all_noreorder_p = false;
14777
14778   /* Profiled functions can't be all noreorder because the profiler
14779      support uses assembler macros.  */
14780   if (crtl->profile)
14781     cfun->machine->all_noreorder_p = false;
14782
14783   /* Code compiled with -mfix-vr4120 can't be all noreorder because
14784      we rely on the assembler to work around some errata.  */
14785   if (TARGET_FIX_VR4120)
14786     cfun->machine->all_noreorder_p = false;
14787
14788   /* The same is true for -mfix-vr4130 if we might generate MFLO or
14789      MFHI instructions.  Note that we avoid using MFLO and MFHI if
14790      the VR4130 MACC and DMACC instructions are available instead;
14791      see the *mfhilo_{si,di}_macc patterns.  */
14792   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
14793     cfun->machine->all_noreorder_p = false;
14794
14795   htab = htab_create (37, mips_lo_sum_offset_hash,
14796                       mips_lo_sum_offset_eq, free);
14797
14798   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
14799   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14800     FOR_EACH_SUBINSN (subinsn, insn)
14801       if (USEFUL_INSN_P (subinsn))
14802         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
14803
14804   last_insn = 0;
14805   hilo_delay = 2;
14806   delayed_reg = 0;
14807   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
14808
14809   /* Make a second pass over the instructions.  Delete orphaned
14810      high-part relocations or turn them into NOPs.  Avoid hazards
14811      by inserting NOPs.  */
14812   for (insn = get_insns (); insn != 0; insn = next_insn)
14813     {
14814       next_insn = NEXT_INSN (insn);
14815       if (USEFUL_INSN_P (insn))
14816         {
14817           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
14818             {
14819               /* If we find an orphaned high-part relocation in a delay
14820                  slot, it's easier to turn that instruction into a NOP than
14821                  to delete it.  The delay slot will be a NOP either way.  */
14822               FOR_EACH_SUBINSN (subinsn, insn)
14823                 if (INSN_P (subinsn))
14824                   {
14825                     if (mips_orphaned_high_part_p (htab, subinsn))
14826                       {
14827                         PATTERN (subinsn) = gen_nop ();
14828                         INSN_CODE (subinsn) = CODE_FOR_nop;
14829                       }
14830                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
14831                                        &delayed_reg, lo_reg);
14832                   }
14833               last_insn = insn;
14834             }
14835           else
14836             {
14837               /* INSN is a single instruction.  Delete it if it's an
14838                  orphaned high-part relocation.  */
14839               if (mips_orphaned_high_part_p (htab, insn))
14840                 delete_insn (insn);
14841               /* Also delete cache barriers if the last instruction
14842                  was an annulled branch.  INSN will not be speculatively
14843                  executed.  */
14844               else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
14845                        && last_insn
14846                        && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
14847                 delete_insn (insn);
14848               else
14849                 {
14850                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
14851                                      &delayed_reg, lo_reg);
14852                   last_insn = insn;
14853                 }
14854             }
14855         }
14856     }
14857
14858   htab_delete (htab);
14859 }
14860
14861 /* If we are using a GOT, but have not decided to use a global pointer yet,
14862    see whether we need one to implement long branches.  Convert the ghost
14863    global-pointer instructions into real ones if so.  */
14864
14865 static bool
14866 mips_expand_ghost_gp_insns (void)
14867 {
14868   rtx insn;
14869   int normal_length;
14870
14871   /* Quick exit if we already know that we will or won't need a
14872      global pointer.  */
14873   if (!TARGET_USE_GOT
14874       || cfun->machine->global_pointer == INVALID_REGNUM
14875       || mips_must_initialize_gp_p ())
14876     return false;
14877
14878   shorten_branches (get_insns ());
14879
14880   /* Look for a branch that is longer than normal.  The normal length for
14881      non-MIPS16 branches is 8, because the length includes the delay slot.
14882      It is 4 for MIPS16, because MIPS16 branches are extended instructions,
14883      but they have no delay slot.  */
14884   normal_length = (TARGET_MIPS16 ? 4 : 8);
14885   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14886     if (JUMP_P (insn)
14887         && USEFUL_INSN_P (insn)
14888         && get_attr_length (insn) > normal_length)
14889       break;
14890
14891   if (insn == NULL_RTX)
14892     return false;
14893
14894   /* We've now established that we need $gp.  */
14895   cfun->machine->must_initialize_gp_p = true;
14896   split_all_insns_noflow ();
14897
14898   return true;
14899 }
14900
14901 /* Subroutine of mips_reorg to manage passes that require DF.  */
14902
14903 static void
14904 mips_df_reorg (void)
14905 {
14906   /* Create def-use chains.  */
14907   df_set_flags (DF_EQ_NOTES);
14908   df_chain_add_problem (DF_UD_CHAIN);
14909   df_analyze ();
14910
14911   if (TARGET_RELAX_PIC_CALLS)
14912     mips_annotate_pic_calls ();
14913
14914   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
14915     r10k_insert_cache_barriers ();
14916
14917   df_finish_pass (false);
14918 }
14919
14920 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
14921
14922 static void
14923 mips_reorg (void)
14924 {
14925   /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  Also during
14926      insn splitting in mips16_lay_out_constants, DF insn info is only kept up
14927      to date if the CFG is available.  */
14928   if (mips_cfg_in_reorg ())
14929     compute_bb_for_insn ();
14930   mips16_lay_out_constants ();
14931   if (mips_cfg_in_reorg ())
14932     {
14933       mips_df_reorg ();
14934       free_bb_for_insn ();
14935     }
14936
14937   if (optimize > 0 && flag_delayed_branch)
14938     dbr_schedule (get_insns ());
14939   mips_reorg_process_insns ();
14940   if (!TARGET_MIPS16
14941       && TARGET_EXPLICIT_RELOCS
14942       && TUNE_MIPS4130
14943       && TARGET_VR4130_ALIGN)
14944     vr4130_align_insns ();
14945   if (mips_expand_ghost_gp_insns ())
14946     /* The expansion could invalidate some of the VR4130 alignment
14947        optimizations, but this should be an extremely rare case anyhow.  */
14948     mips_reorg_process_insns ();
14949 }
14950 \f
14951 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
14952    in order to avoid duplicating too much logic from elsewhere.  */
14953
14954 static void
14955 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
14956                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
14957                       tree function)
14958 {
14959   rtx this_rtx, temp1, temp2, insn, fnaddr;
14960   bool use_sibcall_p;
14961
14962   /* Pretend to be a post-reload pass while generating rtl.  */
14963   reload_completed = 1;
14964
14965   /* Mark the end of the (empty) prologue.  */
14966   emit_note (NOTE_INSN_PROLOGUE_END);
14967
14968   /* Determine if we can use a sibcall to call FUNCTION directly.  */
14969   fnaddr = XEXP (DECL_RTL (function), 0);
14970   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
14971                    && const_call_insn_operand (fnaddr, Pmode));
14972
14973   /* Determine if we need to load FNADDR from the GOT.  */
14974   if (!use_sibcall_p
14975       && (mips_got_symbol_type_p
14976           (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
14977     {
14978       /* Pick a global pointer.  Use a call-clobbered register if
14979          TARGET_CALL_SAVED_GP.  */
14980       cfun->machine->global_pointer
14981         = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
14982       cfun->machine->must_initialize_gp_p = true;
14983       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
14984
14985       /* Set up the global pointer for n32 or n64 abicalls.  */
14986       mips_emit_loadgp ();
14987     }
14988
14989   /* We need two temporary registers in some cases.  */
14990   temp1 = gen_rtx_REG (Pmode, 2);
14991   temp2 = gen_rtx_REG (Pmode, 3);
14992
14993   /* Find out which register contains the "this" pointer.  */
14994   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
14995     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
14996   else
14997     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
14998
14999   /* Add DELTA to THIS_RTX.  */
15000   if (delta != 0)
15001     {
15002       rtx offset = GEN_INT (delta);
15003       if (!SMALL_OPERAND (delta))
15004         {
15005           mips_emit_move (temp1, offset);
15006           offset = temp1;
15007         }
15008       emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
15009     }
15010
15011   /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
15012   if (vcall_offset != 0)
15013     {
15014       rtx addr;
15015
15016       /* Set TEMP1 to *THIS_RTX.  */
15017       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
15018
15019       /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
15020       addr = mips_add_offset (temp2, temp1, vcall_offset);
15021
15022       /* Load the offset and add it to THIS_RTX.  */
15023       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
15024       emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
15025     }
15026
15027   /* Jump to the target function.  Use a sibcall if direct jumps are
15028      allowed, otherwise load the address into a register first.  */
15029   if (use_sibcall_p)
15030     {
15031       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
15032       SIBLING_CALL_P (insn) = 1;
15033     }
15034   else
15035     {
15036       /* This is messy.  GAS treats "la $25,foo" as part of a call
15037          sequence and may allow a global "foo" to be lazily bound.
15038          The general move patterns therefore reject this combination.
15039
15040          In this context, lazy binding would actually be OK
15041          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
15042          TARGET_CALL_SAVED_GP; see mips_load_call_address.
15043          We must therefore load the address via a temporary
15044          register if mips_dangerous_for_la25_p.
15045
15046          If we jump to the temporary register rather than $25,
15047          the assembler can use the move insn to fill the jump's
15048          delay slot.
15049
15050          We can use the same technique for MIPS16 code, where $25
15051          is not a valid JR register.  */
15052       if (TARGET_USE_PIC_FN_ADDR_REG
15053           && !TARGET_MIPS16
15054           && !mips_dangerous_for_la25_p (fnaddr))
15055         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
15056       mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
15057
15058       if (TARGET_USE_PIC_FN_ADDR_REG
15059           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
15060         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
15061       emit_jump_insn (gen_indirect_jump (temp1));
15062     }
15063
15064   /* Run just enough of rest_of_compilation.  This sequence was
15065      "borrowed" from alpha.c.  */
15066   insn = get_insns ();
15067   insn_locators_alloc ();
15068   split_all_insns_noflow ();
15069   mips16_lay_out_constants ();
15070   shorten_branches (insn);
15071   final_start_function (insn, file, 1);
15072   final (insn, file, 1);
15073   final_end_function ();
15074
15075   /* Clean up the vars set above.  Note that final_end_function resets
15076      the global pointer for us.  */
15077   reload_completed = 0;
15078 }
15079 \f
15080 /* The last argument passed to mips_set_mips16_mode, or negative if the
15081    function hasn't been called yet.
15082
15083    There are two copies of this information.  One is saved and restored
15084    by the PCH process while the other is specific to this compiler
15085    invocation.  The information calculated by mips_set_mips16_mode
15086    is invalid unless the two variables are the same.  */
15087 static int was_mips16_p = -1;
15088 static GTY(()) int was_mips16_pch_p = -1;
15089
15090 /* Set up the target-dependent global state so that it matches the
15091    current function's ISA mode.  */
15092
15093 static void
15094 mips_set_mips16_mode (int mips16_p)
15095 {
15096   if (mips16_p == was_mips16_p
15097       && mips16_p == was_mips16_pch_p)
15098     return;
15099
15100   /* Restore base settings of various flags.  */
15101   target_flags = mips_base_target_flags;
15102   flag_schedule_insns = mips_base_schedule_insns;
15103   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
15104   flag_move_loop_invariants = mips_base_move_loop_invariants;
15105   align_loops = mips_base_align_loops;
15106   align_jumps = mips_base_align_jumps;
15107   align_functions = mips_base_align_functions;
15108
15109   if (mips16_p)
15110     {
15111       /* Switch to MIPS16 mode.  */
15112       target_flags |= MASK_MIPS16;
15113
15114       /* Don't run the scheduler before reload, since it tends to
15115          increase register pressure.  */
15116       flag_schedule_insns = 0;
15117
15118       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
15119          the whole function to be in a single section.  */
15120       flag_reorder_blocks_and_partition = 0;
15121
15122       /* Don't move loop invariants, because it tends to increase
15123          register pressure.  It also introduces an extra move in cases
15124          where the constant is the first operand in a two-operand binary
15125          instruction, or when it forms a register argument to a functon
15126          call.  */
15127       flag_move_loop_invariants = 0;
15128
15129       target_flags |= MASK_EXPLICIT_RELOCS;
15130
15131       /* Experiments suggest we get the best overall section-anchor
15132          results from using the range of an unextended LW or SW.  Code
15133          that makes heavy use of byte or short accesses can do better
15134          with ranges of 0...31 and 0...63 respectively, but most code is
15135          sensitive to the range of LW and SW instead.  */
15136       targetm.min_anchor_offset = 0;
15137       targetm.max_anchor_offset = 127;
15138
15139       targetm.const_anchor = 0;
15140
15141       /* MIPS16 has no BAL instruction.  */
15142       target_flags &= ~MASK_RELAX_PIC_CALLS;
15143
15144       if (flag_pic && !TARGET_OLDABI)
15145         sorry ("MIPS16 PIC for ABIs other than o32 and o64");
15146
15147       if (TARGET_XGOT)
15148         sorry ("MIPS16 -mxgot code");
15149
15150       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
15151         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
15152     }
15153   else
15154     {
15155       /* Switch to normal (non-MIPS16) mode.  */
15156       target_flags &= ~MASK_MIPS16;
15157
15158       /* Provide default values for align_* for 64-bit targets.  */
15159       if (TARGET_64BIT)
15160         {
15161           if (align_loops == 0)
15162             align_loops = 8;
15163           if (align_jumps == 0)
15164             align_jumps = 8;
15165           if (align_functions == 0)
15166             align_functions = 8;
15167         }
15168
15169       targetm.min_anchor_offset = -32768;
15170       targetm.max_anchor_offset = 32767;
15171
15172       targetm.const_anchor = 0x8000;
15173     }
15174
15175   /* (Re)initialize MIPS target internals for new ISA.  */
15176   mips_init_relocs ();
15177
15178   if (was_mips16_p >= 0 || was_mips16_pch_p >= 0)
15179     /* Reinitialize target-dependent state.  */
15180     target_reinit ();
15181
15182   was_mips16_p = mips16_p;
15183   was_mips16_pch_p = mips16_p;
15184 }
15185
15186 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
15187    function should use the MIPS16 ISA and switch modes accordingly.  */
15188
15189 static void
15190 mips_set_current_function (tree fndecl)
15191 {
15192   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
15193 }
15194 \f
15195 /* Allocate a chunk of memory for per-function machine-dependent data.  */
15196
15197 static struct machine_function *
15198 mips_init_machine_status (void)
15199 {
15200   return ((struct machine_function *)
15201           ggc_alloc_cleared (sizeof (struct machine_function)));
15202 }
15203
15204 /* Return the processor associated with the given ISA level, or null
15205    if the ISA isn't valid.  */
15206
15207 static const struct mips_cpu_info *
15208 mips_cpu_info_from_isa (int isa)
15209 {
15210   unsigned int i;
15211
15212   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15213     if (mips_cpu_info_table[i].isa == isa)
15214       return mips_cpu_info_table + i;
15215
15216   return NULL;
15217 }
15218
15219 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15220    with a final "000" replaced by "k".  Ignore case.
15221
15222    Note: this function is shared between GCC and GAS.  */
15223
15224 static bool
15225 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15226 {
15227   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15228     given++, canonical++;
15229
15230   return ((*given == 0 && *canonical == 0)
15231           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15232 }
15233
15234 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15235    CPU name.  We've traditionally allowed a lot of variation here.
15236
15237    Note: this function is shared between GCC and GAS.  */
15238
15239 static bool
15240 mips_matching_cpu_name_p (const char *canonical, const char *given)
15241 {
15242   /* First see if the name matches exactly, or with a final "000"
15243      turned into "k".  */
15244   if (mips_strict_matching_cpu_name_p (canonical, given))
15245     return true;
15246
15247   /* If not, try comparing based on numerical designation alone.
15248      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15249   if (TOLOWER (*given) == 'r')
15250     given++;
15251   if (!ISDIGIT (*given))
15252     return false;
15253
15254   /* Skip over some well-known prefixes in the canonical name,
15255      hoping to find a number there too.  */
15256   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15257     canonical += 2;
15258   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15259     canonical += 2;
15260   else if (TOLOWER (canonical[0]) == 'r')
15261     canonical += 1;
15262
15263   return mips_strict_matching_cpu_name_p (canonical, given);
15264 }
15265
15266 /* Return the mips_cpu_info entry for the processor or ISA given
15267    by CPU_STRING.  Return null if the string isn't recognized.
15268
15269    A similar function exists in GAS.  */
15270
15271 static const struct mips_cpu_info *
15272 mips_parse_cpu (const char *cpu_string)
15273 {
15274   unsigned int i;
15275   const char *s;
15276
15277   /* In the past, we allowed upper-case CPU names, but it doesn't
15278      work well with the multilib machinery.  */
15279   for (s = cpu_string; *s != 0; s++)
15280     if (ISUPPER (*s))
15281       {
15282         warning (0, "CPU names must be lower case");
15283         break;
15284       }
15285
15286   /* 'from-abi' selects the most compatible architecture for the given
15287      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15288      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15289      version.  */
15290   if (strcasecmp (cpu_string, "from-abi") == 0)
15291     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
15292                                    : ABI_NEEDS_64BIT_REGS ? 3
15293                                    : (TARGET_64BIT ? 3 : 1));
15294
15295   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15296   if (strcasecmp (cpu_string, "default") == 0)
15297     return NULL;
15298
15299   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15300     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
15301       return mips_cpu_info_table + i;
15302
15303   return NULL;
15304 }
15305
15306 /* Set up globals to generate code for the ISA or processor
15307    described by INFO.  */
15308
15309 static void
15310 mips_set_architecture (const struct mips_cpu_info *info)
15311 {
15312   if (info != 0)
15313     {
15314       mips_arch_info = info;
15315       mips_arch = info->cpu;
15316       mips_isa = info->isa;
15317     }
15318 }
15319
15320 /* Likewise for tuning.  */
15321
15322 static void
15323 mips_set_tune (const struct mips_cpu_info *info)
15324 {
15325   if (info != 0)
15326     {
15327       mips_tune_info = info;
15328       mips_tune = info->cpu;
15329     }
15330 }
15331
15332 /* Implement TARGET_HANDLE_OPTION.  */
15333
15334 static bool
15335 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
15336 {
15337   switch (code)
15338     {
15339     case OPT_mabi_:
15340       if (strcmp (arg, "32") == 0)
15341         mips_abi = ABI_32;
15342       else if (strcmp (arg, "o64") == 0)
15343         mips_abi = ABI_O64;
15344       else if (strcmp (arg, "n32") == 0)
15345         mips_abi = ABI_N32;
15346       else if (strcmp (arg, "64") == 0)
15347         mips_abi = ABI_64;
15348       else if (strcmp (arg, "eabi") == 0)
15349         mips_abi = ABI_EABI;
15350       else
15351         return false;
15352       return true;
15353
15354     case OPT_march_:
15355     case OPT_mtune_:
15356       return mips_parse_cpu (arg) != 0;
15357
15358     case OPT_mips:
15359       mips_isa_option_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
15360       return mips_isa_option_info != 0;
15361
15362     case OPT_mno_flush_func:
15363       mips_cache_flush_func = NULL;
15364       return true;
15365
15366     case OPT_mcode_readable_:
15367       if (strcmp (arg, "yes") == 0)
15368         mips_code_readable = CODE_READABLE_YES;
15369       else if (strcmp (arg, "pcrel") == 0)
15370         mips_code_readable = CODE_READABLE_PCREL;
15371       else if (strcmp (arg, "no") == 0)
15372         mips_code_readable = CODE_READABLE_NO;
15373       else
15374         return false;
15375       return true;
15376
15377     case OPT_mr10k_cache_barrier_:
15378       if (strcmp (arg, "load-store") == 0)
15379         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_LOAD_STORE;
15380       else if (strcmp (arg, "store") == 0)
15381         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_STORE;
15382       else if (strcmp (arg, "none") == 0)
15383         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15384       else
15385         return false;
15386       return true;
15387
15388     default:
15389       return true;
15390     }
15391 }
15392
15393 /* Implement OVERRIDE_OPTIONS.  */
15394
15395 void
15396 mips_override_options (void)
15397 {
15398   int i, start, regno, mode;
15399
15400   /* Process flags as though we were generating non-MIPS16 code.  */
15401   mips_base_mips16 = TARGET_MIPS16;
15402   target_flags &= ~MASK_MIPS16;
15403
15404 #ifdef SUBTARGET_OVERRIDE_OPTIONS
15405   SUBTARGET_OVERRIDE_OPTIONS;
15406 #endif
15407
15408   /* Set the small data limit.  */
15409   mips_small_data_threshold = (g_switch_set
15410                                ? g_switch_value
15411                                : MIPS_DEFAULT_GVALUE);
15412
15413   /* The following code determines the architecture and register size.
15414      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
15415      The GAS and GCC code should be kept in sync as much as possible.  */
15416
15417   if (mips_arch_string != 0)
15418     mips_set_architecture (mips_parse_cpu (mips_arch_string));
15419
15420   if (mips_isa_option_info != 0)
15421     {
15422       if (mips_arch_info == 0)
15423         mips_set_architecture (mips_isa_option_info);
15424       else if (mips_arch_info->isa != mips_isa_option_info->isa)
15425         error ("%<-%s%> conflicts with the other architecture options, "
15426                "which specify a %s processor",
15427                mips_isa_option_info->name,
15428                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
15429     }
15430
15431   if (mips_arch_info == 0)
15432     {
15433 #ifdef MIPS_CPU_STRING_DEFAULT
15434       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
15435 #else
15436       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
15437 #endif
15438     }
15439
15440   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
15441     error ("%<-march=%s%> is not compatible with the selected ABI",
15442            mips_arch_info->name);
15443
15444   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
15445   if (mips_tune_string != 0)
15446     mips_set_tune (mips_parse_cpu (mips_tune_string));
15447
15448   if (mips_tune_info == 0)
15449     mips_set_tune (mips_arch_info);
15450
15451   if ((target_flags_explicit & MASK_64BIT) != 0)
15452     {
15453       /* The user specified the size of the integer registers.  Make sure
15454          it agrees with the ABI and ISA.  */
15455       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
15456         error ("%<-mgp64%> used with a 32-bit processor");
15457       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
15458         error ("%<-mgp32%> used with a 64-bit ABI");
15459       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
15460         error ("%<-mgp64%> used with a 32-bit ABI");
15461     }
15462   else
15463     {
15464       /* Infer the integer register size from the ABI and processor.
15465          Restrict ourselves to 32-bit registers if that's all the
15466          processor has, or if the ABI cannot handle 64-bit registers.  */
15467       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
15468         target_flags &= ~MASK_64BIT;
15469       else
15470         target_flags |= MASK_64BIT;
15471     }
15472
15473   if ((target_flags_explicit & MASK_FLOAT64) != 0)
15474     {
15475       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
15476         error ("unsupported combination: %s", "-mfp64 -msingle-float");
15477       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
15478         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
15479       else if (!TARGET_64BIT && TARGET_FLOAT64)
15480         {
15481           if (!ISA_HAS_MXHC1)
15482             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
15483                    " the target supports the mfhc1 and mthc1 instructions");
15484           else if (mips_abi != ABI_32)
15485             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
15486                    " the o32 ABI");
15487         }
15488     }
15489   else
15490     {
15491       /* -msingle-float selects 32-bit float registers.  Otherwise the
15492          float registers should be the same size as the integer ones.  */
15493       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
15494         target_flags |= MASK_FLOAT64;
15495       else
15496         target_flags &= ~MASK_FLOAT64;
15497     }
15498
15499   /* End of code shared with GAS.  */
15500
15501   /* If no -mlong* option was given, infer it from the other options.  */
15502   if ((target_flags_explicit & MASK_LONG64) == 0)
15503     {
15504       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
15505         target_flags |= MASK_LONG64;
15506       else
15507         target_flags &= ~MASK_LONG64;
15508     }
15509
15510   if (!TARGET_OLDABI)
15511     flag_pcc_struct_return = 0;
15512
15513   /* Decide which rtx_costs structure to use.  */
15514   if (optimize_size)
15515     mips_cost = &mips_rtx_cost_optimize_size;
15516   else
15517     mips_cost = &mips_rtx_cost_data[mips_tune];
15518
15519   /* If the user hasn't specified a branch cost, use the processor's
15520      default.  */
15521   if (mips_branch_cost == 0)
15522     mips_branch_cost = mips_cost->branch_cost;
15523
15524   /* If neither -mbranch-likely nor -mno-branch-likely was given
15525      on the command line, set MASK_BRANCHLIKELY based on the target
15526      architecture and tuning flags.  Annulled delay slots are a
15527      size win, so we only consider the processor-specific tuning
15528      for !optimize_size.  */
15529   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
15530     {
15531       if (ISA_HAS_BRANCHLIKELY
15532           && (optimize_size
15533               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
15534         target_flags |= MASK_BRANCHLIKELY;
15535       else
15536         target_flags &= ~MASK_BRANCHLIKELY;
15537     }
15538   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
15539     warning (0, "the %qs architecture does not support branch-likely"
15540              " instructions", mips_arch_info->name);
15541
15542   /* The effect of -mabicalls isn't defined for the EABI.  */
15543   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
15544     {
15545       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
15546       target_flags &= ~MASK_ABICALLS;
15547     }
15548
15549   if (TARGET_ABICALLS_PIC2)
15550     /* We need to set flag_pic for executables as well as DSOs
15551        because we may reference symbols that are not defined in
15552        the final executable.  (MIPS does not use things like
15553        copy relocs, for example.)
15554
15555        There is a body of code that uses __PIC__ to distinguish
15556        between -mabicalls and -mno-abicalls code.  The non-__PIC__
15557        variant is usually appropriate for TARGET_ABICALLS_PIC0, as
15558        long as any indirect jumps use $25.  */
15559     flag_pic = 1;
15560
15561   /* -mvr4130-align is a "speed over size" optimization: it usually produces
15562      faster code, but at the expense of more nops.  Enable it at -O3 and
15563      above.  */
15564   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
15565     target_flags |= MASK_VR4130_ALIGN;
15566
15567   /* Prefer a call to memcpy over inline code when optimizing for size,
15568      though see MOVE_RATIO in mips.h.  */
15569   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
15570     target_flags |= MASK_MEMCPY;
15571
15572   /* If we have a nonzero small-data limit, check that the -mgpopt
15573      setting is consistent with the other target flags.  */
15574   if (mips_small_data_threshold > 0)
15575     {
15576       if (!TARGET_GPOPT)
15577         {
15578           if (!TARGET_EXPLICIT_RELOCS)
15579             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
15580
15581           TARGET_LOCAL_SDATA = false;
15582           TARGET_EXTERN_SDATA = false;
15583         }
15584       else
15585         {
15586           if (TARGET_VXWORKS_RTP)
15587             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
15588
15589           if (TARGET_ABICALLS)
15590             warning (0, "cannot use small-data accesses for %qs",
15591                      "-mabicalls");
15592         }
15593     }
15594
15595 #ifdef MIPS_TFMODE_FORMAT
15596   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
15597 #endif
15598
15599   /* Make sure that the user didn't turn off paired single support when
15600      MIPS-3D support is requested.  */
15601   if (TARGET_MIPS3D
15602       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
15603       && !TARGET_PAIRED_SINGLE_FLOAT)
15604     error ("%<-mips3d%> requires %<-mpaired-single%>");
15605
15606   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
15607   if (TARGET_MIPS3D)
15608     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
15609
15610   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
15611      and TARGET_HARD_FLOAT_ABI are both true.  */
15612   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
15613     error ("%qs must be used with %qs",
15614            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
15615            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
15616
15617   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
15618      enabled.  */
15619   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
15620     warning (0, "the %qs architecture does not support paired-single"
15621              " instructions", mips_arch_info->name);
15622
15623   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
15624       && !TARGET_CACHE_BUILTIN)
15625     {
15626       error ("%qs requires a target that provides the %qs instruction",
15627              "-mr10k-cache-barrier", "cache");
15628       mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15629     }
15630
15631   /* If TARGET_DSPR2, enable MASK_DSP.  */
15632   if (TARGET_DSPR2)
15633     target_flags |= MASK_DSP;
15634
15635   /* .eh_frame addresses should be the same width as a C pointer.
15636      Most MIPS ABIs support only one pointer size, so the assembler
15637      will usually know exactly how big an .eh_frame address is.
15638
15639      Unfortunately, this is not true of the 64-bit EABI.  The ABI was
15640      originally defined to use 64-bit pointers (i.e. it is LP64), and
15641      this is still the default mode.  However, we also support an n32-like
15642      ILP32 mode, which is selected by -mlong32.  The problem is that the
15643      assembler has traditionally not had an -mlong option, so it has
15644      traditionally not known whether we're using the ILP32 or LP64 form.
15645
15646      As it happens, gas versions up to and including 2.19 use _32-bit_
15647      addresses for EABI64 .cfi_* directives.  This is wrong for the
15648      default LP64 mode, so we can't use the directives by default.
15649      Moreover, since gas's current behavior is at odds with gcc's
15650      default behavior, it seems unwise to rely on future versions
15651      of gas behaving the same way.  We therefore avoid using .cfi
15652      directives for -mlong32 as well.  */
15653   if (mips_abi == ABI_EABI && TARGET_64BIT)
15654     flag_dwarf2_cfi_asm = 0;
15655
15656   /* .cfi_* directives generate a read-only section, so fall back on
15657      manual .eh_frame creation if we need the section to be writable.  */
15658   if (TARGET_WRITABLE_EH_FRAME)
15659     flag_dwarf2_cfi_asm = 0;
15660
15661   mips_init_print_operand_punct ();
15662
15663   /* Set up array to map GCC register number to debug register number.
15664      Ignore the special purpose register numbers.  */
15665
15666   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
15667     {
15668       mips_dbx_regno[i] = INVALID_REGNUM;
15669       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
15670         mips_dwarf_regno[i] = i;
15671       else
15672         mips_dwarf_regno[i] = INVALID_REGNUM;
15673     }
15674
15675   start = GP_DBX_FIRST - GP_REG_FIRST;
15676   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
15677     mips_dbx_regno[i] = i + start;
15678
15679   start = FP_DBX_FIRST - FP_REG_FIRST;
15680   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
15681     mips_dbx_regno[i] = i + start;
15682
15683   /* Accumulator debug registers use big-endian ordering.  */
15684   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
15685   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
15686   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
15687   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
15688   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
15689     {
15690       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
15691       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
15692     }
15693
15694   /* Set up mips_hard_regno_mode_ok.  */
15695   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
15696     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
15697       mips_hard_regno_mode_ok[mode][regno]
15698         = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
15699
15700   /* Function to allocate machine-dependent function status.  */
15701   init_machine_status = &mips_init_machine_status;
15702
15703   /* Default to working around R4000 errata only if the processor
15704      was selected explicitly.  */
15705   if ((target_flags_explicit & MASK_FIX_R4000) == 0
15706       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
15707     target_flags |= MASK_FIX_R4000;
15708
15709   /* Default to working around R4400 errata only if the processor
15710      was selected explicitly.  */
15711   if ((target_flags_explicit & MASK_FIX_R4400) == 0
15712       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
15713     target_flags |= MASK_FIX_R4400;
15714
15715   /* Default to working around R10000 errata only if the processor
15716      was selected explicitly.  */
15717   if ((target_flags_explicit & MASK_FIX_R10000) == 0
15718       && mips_matching_cpu_name_p (mips_arch_info->name, "r10000"))
15719     target_flags |= MASK_FIX_R10000;
15720
15721   /* Make sure that branch-likely instructions available when using
15722      -mfix-r10000.  The instructions are not available if either:
15723
15724         1. -mno-branch-likely was passed.
15725         2. The selected ISA does not support branch-likely and
15726            the command line does not include -mbranch-likely.  */
15727   if (TARGET_FIX_R10000
15728       && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
15729           ? !ISA_HAS_BRANCHLIKELY
15730           : !TARGET_BRANCHLIKELY))
15731     sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
15732
15733   if (TARGET_SYNCI && !ISA_HAS_SYNCI)
15734     {
15735       warning (0, "the %qs architecture does not support the synci "
15736                "instruction", mips_arch_info->name);
15737       target_flags &= ~MASK_SYNCI;
15738     }
15739
15740   /* Only optimize PIC indirect calls if they are actually required.  */
15741   if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
15742     target_flags &= ~MASK_RELAX_PIC_CALLS;
15743
15744   /* Save base state of options.  */
15745   mips_base_target_flags = target_flags;
15746   mips_base_schedule_insns = flag_schedule_insns;
15747   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
15748   mips_base_move_loop_invariants = flag_move_loop_invariants;
15749   mips_base_align_loops = align_loops;
15750   mips_base_align_jumps = align_jumps;
15751   mips_base_align_functions = align_functions;
15752
15753   /* Now select the ISA mode.
15754
15755      Do all CPP-sensitive stuff in non-MIPS16 mode; we'll switch to
15756      MIPS16 mode afterwards if need be.  */
15757   mips_set_mips16_mode (false);
15758 }
15759
15760 /* Swap the register information for registers I and I + 1, which
15761    currently have the wrong endianness.  Note that the registers'
15762    fixedness and call-clobberedness might have been set on the
15763    command line.  */
15764
15765 static void
15766 mips_swap_registers (unsigned int i)
15767 {
15768   int tmpi;
15769   const char *tmps;
15770
15771 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
15772 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
15773
15774   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
15775   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
15776   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
15777   SWAP_STRING (reg_names[i], reg_names[i + 1]);
15778
15779 #undef SWAP_STRING
15780 #undef SWAP_INT
15781 }
15782
15783 /* Implement CONDITIONAL_REGISTER_USAGE.  */
15784
15785 void
15786 mips_conditional_register_usage (void)
15787 {
15788
15789   if (ISA_HAS_DSP)
15790     {
15791       /* These DSP control register fields are global.  */
15792       global_regs[CCDSP_PO_REGNUM] = 1;
15793       global_regs[CCDSP_SC_REGNUM] = 1;
15794     }
15795   else 
15796     {
15797       int regno;
15798
15799       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
15800         fixed_regs[regno] = call_used_regs[regno] = 1;
15801     }
15802   if (!TARGET_HARD_FLOAT)
15803     {
15804       int regno;
15805
15806       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
15807         fixed_regs[regno] = call_used_regs[regno] = 1;
15808       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15809         fixed_regs[regno] = call_used_regs[regno] = 1;
15810     }
15811   else if (! ISA_HAS_8CC)
15812     {
15813       int regno;
15814
15815       /* We only have a single condition-code register.  We implement
15816          this by fixing all the condition-code registers and generating
15817          RTL that refers directly to ST_REG_FIRST.  */
15818       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15819         fixed_regs[regno] = call_used_regs[regno] = 1;
15820     }
15821   /* In MIPS16 mode, we permit the $t temporary registers to be used
15822      for reload.  We prohibit the unused $s registers, since they
15823      are call-saved, and saving them via a MIPS16 register would
15824      probably waste more time than just reloading the value.  */
15825   if (TARGET_MIPS16)
15826     {
15827       fixed_regs[18] = call_used_regs[18] = 1;
15828       fixed_regs[19] = call_used_regs[19] = 1;
15829       fixed_regs[20] = call_used_regs[20] = 1;
15830       fixed_regs[21] = call_used_regs[21] = 1;
15831       fixed_regs[22] = call_used_regs[22] = 1;
15832       fixed_regs[23] = call_used_regs[23] = 1;
15833       fixed_regs[26] = call_used_regs[26] = 1;
15834       fixed_regs[27] = call_used_regs[27] = 1;
15835       fixed_regs[30] = call_used_regs[30] = 1;
15836     }
15837   /* $f20-$f23 are call-clobbered for n64.  */
15838   if (mips_abi == ABI_64)
15839     {
15840       int regno;
15841       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
15842         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15843     }
15844   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
15845      for n32.  */
15846   if (mips_abi == ABI_N32)
15847     {
15848       int regno;
15849       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
15850         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15851     }
15852   /* Make sure that double-register accumulator values are correctly
15853      ordered for the current endianness.  */
15854   if (TARGET_LITTLE_ENDIAN)
15855     {
15856       unsigned int regno;
15857
15858       mips_swap_registers (MD_REG_FIRST);
15859       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
15860         mips_swap_registers (regno);
15861     }
15862 }
15863
15864 /* Initialize vector TARGET to VALS.  */
15865
15866 void
15867 mips_expand_vector_init (rtx target, rtx vals)
15868 {
15869   enum machine_mode mode;
15870   enum machine_mode inner;
15871   unsigned int i, n_elts;
15872   rtx mem;
15873
15874   mode = GET_MODE (target);
15875   inner = GET_MODE_INNER (mode);
15876   n_elts = GET_MODE_NUNITS (mode);
15877
15878   gcc_assert (VECTOR_MODE_P (mode));
15879
15880   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
15881   for (i = 0; i < n_elts; i++)
15882     emit_move_insn (adjust_address_nv (mem, inner, i * GET_MODE_SIZE (inner)),
15883                     XVECEXP (vals, 0, i));
15884
15885   emit_move_insn (target, mem);
15886 }
15887
15888 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
15889    other registers for instructions for which it is possible.  This
15890    encourages the compiler to use CMP in cases where an XOR would
15891    require some register shuffling.  */
15892
15893 void
15894 mips_order_regs_for_local_alloc (void)
15895 {
15896   int i;
15897
15898   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
15899     reg_alloc_order[i] = i;
15900
15901   if (TARGET_MIPS16)
15902     {
15903       /* It really doesn't matter where we put register 0, since it is
15904          a fixed register anyhow.  */
15905       reg_alloc_order[0] = 24;
15906       reg_alloc_order[24] = 0;
15907     }
15908 }
15909
15910 /* Implement EH_USES.  */
15911
15912 bool
15913 mips_eh_uses (unsigned int regno)
15914 {
15915   if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
15916     {
15917       /* We need to force certain registers to be live in order to handle
15918          PIC long branches correctly.  See mips_must_initialize_gp_p for
15919          details.  */
15920       if (mips_cfun_has_cprestore_slot_p ())
15921         {
15922           if (regno == CPRESTORE_SLOT_REGNUM)
15923             return true;
15924         }
15925       else
15926         {
15927           if (cfun->machine->global_pointer == regno)
15928             return true;
15929         }
15930     }
15931
15932   return false;
15933 }
15934
15935 /* Implement EPILOGUE_USES.  */
15936
15937 bool
15938 mips_epilogue_uses (unsigned int regno)
15939 {
15940   /* Say that the epilogue uses the return address register.  Note that
15941      in the case of sibcalls, the values "used by the epilogue" are
15942      considered live at the start of the called function.  */
15943   if (regno == RETURN_ADDR_REGNUM)
15944     return true;
15945
15946   /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
15947      See the comment above load_call<mode> for details.  */
15948   if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
15949     return true;
15950
15951   /* An interrupt handler must preserve some registers that are
15952      ordinarily call-clobbered.  */
15953   if (cfun->machine->interrupt_handler_p
15954       && mips_interrupt_extra_call_saved_reg_p (regno))
15955     return true;
15956
15957   return false;
15958 }
15959
15960 /* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
15961
15962 static int
15963 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
15964 {
15965   return REG_P (*x) && REGNO (*x) == AT_REGNUM;
15966 }
15967
15968 /* Return true if INSN needs to be wrapped in ".set noat".
15969    INSN has NOPERANDS operands, stored in OPVEC.  */
15970
15971 static bool
15972 mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
15973 {
15974   int i;
15975
15976   if (recog_memoized (insn) >= 0)
15977     for (i = 0; i < noperands; i++)
15978       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
15979         return true;
15980   return false;
15981 }
15982
15983 /* Implement FINAL_PRESCAN_INSN.  */
15984
15985 void
15986 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
15987 {
15988   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
15989     mips_push_asm_switch (&mips_noat);
15990 }
15991
15992 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
15993
15994 static void
15995 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
15996                           rtx *opvec, int noperands)
15997 {
15998   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
15999     mips_pop_asm_switch (&mips_noat);
16000 }
16001
16002 /* Return the function that is used to expand the <u>mulsidi3 pattern.
16003    EXT_CODE is the code of the extension used.  Return NULL if widening
16004    multiplication shouldn't be used.  */
16005
16006 mulsidi3_gen_fn
16007 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
16008 {
16009   bool signed_p;
16010
16011   signed_p = ext_code == SIGN_EXTEND;
16012   if (TARGET_64BIT)
16013     {
16014       /* Don't use widening multiplication with MULT when we have DMUL.  Even
16015          with the extension of its input operands DMUL is faster.  Note that
16016          the extension is not needed for signed multiplication.  In order to
16017          ensure that we always remove the redundant sign-extension in this
16018          case we still expand mulsidi3 for DMUL.  */
16019       if (ISA_HAS_DMUL3)
16020         return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
16021       if (TARGET_FIX_R4000)
16022         return NULL;
16023       return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
16024     }
16025   else
16026     {
16027       if (TARGET_FIX_R4000)
16028         return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
16029       if (ISA_HAS_DSPR2)
16030         return signed_p ? gen_mips_mult : gen_mips_multu;
16031       return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
16032     }
16033 }
16034 \f
16035 /* Return the size in bytes of the trampoline code, padded to
16036    TRAMPOLINE_ALIGNMENT bits.  The static chain pointer and target
16037    function address immediately follow.  */
16038
16039 int
16040 mips_trampoline_code_size (void)
16041 {
16042   if (TARGET_USE_PIC_FN_ADDR_REG)
16043     return 4 * 4;
16044   else if (ptr_mode == DImode)
16045     return 8 * 4;
16046   else if (ISA_HAS_LOAD_DELAY)
16047     return 6 * 4;
16048   else
16049     return 4 * 4;
16050 }
16051
16052 /* Implement TARGET_TRAMPOLINE_INIT.  */
16053
16054 static void
16055 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
16056 {
16057   rtx addr, end_addr, high, low, opcode, mem;
16058   rtx trampoline[8];
16059   unsigned int i, j;
16060   HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
16061
16062   /* Work out the offsets of the pointers from the start of the
16063      trampoline code.  */
16064   end_addr_offset = mips_trampoline_code_size ();
16065   static_chain_offset = end_addr_offset;
16066   target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
16067
16068   /* Get pointers to the beginning and end of the code block.  */
16069   addr = force_reg (Pmode, XEXP (m_tramp, 0));
16070   end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
16071
16072 #define OP(X) gen_int_mode (X, SImode)
16073
16074   /* Build up the code in TRAMPOLINE.  */
16075   i = 0;
16076   if (TARGET_USE_PIC_FN_ADDR_REG)
16077     {
16078       /* $25 contains the address of the trampoline.  Emit code of the form:
16079
16080              l[wd]    $1, target_function_offset($25)
16081              l[wd]    $static_chain, static_chain_offset($25)
16082              jr       $1
16083              move     $25,$1.  */
16084       trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
16085                                            target_function_offset,
16086                                            PIC_FUNCTION_ADDR_REGNUM));
16087       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16088                                            static_chain_offset,
16089                                            PIC_FUNCTION_ADDR_REGNUM));
16090       trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
16091       trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
16092     }
16093   else if (ptr_mode == DImode)
16094     {
16095       /* It's too cumbersome to create the full 64-bit address, so let's
16096          instead use:
16097
16098              move    $1, $31
16099              bal     1f
16100              nop
16101          1:  l[wd]   $25, target_function_offset - 12($31)
16102              l[wd]   $static_chain, static_chain_offset - 12($31)
16103              jr      $25
16104              move    $31, $1
16105
16106         where 12 is the offset of "1:" from the start of the code block.  */
16107       trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
16108       trampoline[i++] = OP (MIPS_BAL (1));
16109       trampoline[i++] = OP (MIPS_NOP);
16110       trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16111                                            target_function_offset - 12,
16112                                            RETURN_ADDR_REGNUM));
16113       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16114                                            static_chain_offset - 12,
16115                                            RETURN_ADDR_REGNUM));
16116       trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16117       trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
16118     }
16119   else
16120     {
16121       /* If the target has load delays, emit:
16122
16123              lui     $1, %hi(end_addr)
16124              lw      $25, %lo(end_addr + ...)($1)
16125              lw      $static_chain, %lo(end_addr + ...)($1)
16126              jr      $25
16127              nop
16128
16129          Otherwise emit:
16130
16131              lui     $1, %hi(end_addr)
16132              lw      $25, %lo(end_addr + ...)($1)
16133              jr      $25
16134              lw      $static_chain, %lo(end_addr + ...)($1).  */
16135
16136       /* Split END_ADDR into %hi and %lo values.  Trampolines are aligned
16137          to 64 bits, so the %lo value will have the bottom 3 bits clear.  */
16138       high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
16139                                   NULL, false, OPTAB_WIDEN);
16140       high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
16141                                   NULL, false, OPTAB_WIDEN);
16142       low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
16143
16144       /* Emit the LUI.  */
16145       opcode = OP (MIPS_LUI (AT_REGNUM, 0));
16146       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
16147                                              NULL, false, OPTAB_WIDEN);
16148
16149       /* Emit the load of the target function.  */
16150       opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16151                                   target_function_offset - end_addr_offset,
16152                                   AT_REGNUM));
16153       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16154                                              NULL, false, OPTAB_WIDEN);
16155
16156       /* Emit the JR here, if we can.  */
16157       if (!ISA_HAS_LOAD_DELAY)
16158         trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16159
16160       /* Emit the load of the static chain register.  */
16161       opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16162                                   static_chain_offset - end_addr_offset,
16163                                   AT_REGNUM));
16164       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16165                                              NULL, false, OPTAB_WIDEN);
16166
16167       /* Emit the JR, if we couldn't above.  */
16168       if (ISA_HAS_LOAD_DELAY)
16169         {
16170           trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16171           trampoline[i++] = OP (MIPS_NOP);
16172         }
16173     }
16174
16175 #undef OP
16176
16177   /* Copy the trampoline code.  Leave any padding uninitialized.  */
16178   for (j = 0; j < i; j++)
16179     {
16180       mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
16181       mips_emit_move (mem, trampoline[j]);
16182     }
16183
16184   /* Set up the static chain pointer field.  */
16185   mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
16186   mips_emit_move (mem, chain_value);
16187
16188   /* Set up the target function field.  */
16189   mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
16190   mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
16191
16192   /* Flush the code part of the trampoline.  */
16193   emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
16194   emit_insn (gen_clear_cache (addr, end_addr));
16195 }
16196
16197 /* Implement FUNCTION_PROFILER.  */
16198
16199 void mips_function_profiler (FILE *file)
16200 {
16201   if (TARGET_MIPS16)
16202     sorry ("mips16 function profiling");
16203   if (TARGET_LONG_CALLS)
16204     {
16205       /* For TARGET_LONG_CALLS use $3 for the address of _mcount.  */
16206       if (Pmode == DImode)
16207         fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
16208       else
16209         fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
16210     }
16211   mips_push_asm_switch (&mips_noat);
16212   fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
16213            reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
16214   /* _mcount treats $2 as the static chain register.  */
16215   if (cfun->static_chain_decl != NULL)
16216     fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
16217              reg_names[STATIC_CHAIN_REGNUM]);
16218   if (TARGET_MCOUNT_RA_ADDRESS)
16219     {
16220       /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
16221          ra save location.  */
16222       if (cfun->machine->frame.ra_fp_offset == 0)
16223         /* ra not saved, pass zero.  */
16224         fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
16225       else
16226         fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
16227                  Pmode == DImode ? "dla" : "la", reg_names[12],
16228                  cfun->machine->frame.ra_fp_offset,
16229                  reg_names[STACK_POINTER_REGNUM]);
16230     }
16231   if (!TARGET_NEWABI)
16232     fprintf (file,
16233              "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from  stack\n",
16234              TARGET_64BIT ? "dsubu" : "subu",
16235              reg_names[STACK_POINTER_REGNUM],
16236              reg_names[STACK_POINTER_REGNUM],
16237              Pmode == DImode ? 16 : 8);
16238
16239   if (TARGET_LONG_CALLS)
16240     fprintf (file, "\tjalr\t%s\n", reg_names[3]);
16241   else
16242     fprintf (file, "\tjal\t_mcount\n");
16243   mips_pop_asm_switch (&mips_noat);
16244   /* _mcount treats $2 as the static chain register.  */
16245   if (cfun->static_chain_decl != NULL)
16246     fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
16247              reg_names[2]);
16248 }
16249 \f
16250 /* Initialize the GCC target structure.  */
16251 #undef TARGET_ASM_ALIGNED_HI_OP
16252 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
16253 #undef TARGET_ASM_ALIGNED_SI_OP
16254 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
16255 #undef TARGET_ASM_ALIGNED_DI_OP
16256 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
16257
16258 #undef TARGET_LEGITIMIZE_ADDRESS
16259 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
16260
16261 #undef TARGET_ASM_FUNCTION_PROLOGUE
16262 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
16263 #undef TARGET_ASM_FUNCTION_EPILOGUE
16264 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
16265 #undef TARGET_ASM_SELECT_RTX_SECTION
16266 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
16267 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
16268 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
16269
16270 #undef TARGET_SCHED_INIT
16271 #define TARGET_SCHED_INIT mips_sched_init
16272 #undef TARGET_SCHED_REORDER
16273 #define TARGET_SCHED_REORDER mips_sched_reorder
16274 #undef TARGET_SCHED_REORDER2
16275 #define TARGET_SCHED_REORDER2 mips_sched_reorder
16276 #undef TARGET_SCHED_VARIABLE_ISSUE
16277 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
16278 #undef TARGET_SCHED_ADJUST_COST
16279 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
16280 #undef TARGET_SCHED_ISSUE_RATE
16281 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
16282 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
16283 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
16284 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
16285 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
16286 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
16287 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
16288   mips_multipass_dfa_lookahead
16289
16290 #undef TARGET_DEFAULT_TARGET_FLAGS
16291 #define TARGET_DEFAULT_TARGET_FLAGS             \
16292   (TARGET_DEFAULT                               \
16293    | TARGET_CPU_DEFAULT                         \
16294    | TARGET_ENDIAN_DEFAULT                      \
16295    | TARGET_FP_EXCEPTIONS_DEFAULT               \
16296    | MASK_CHECK_ZERO_DIV                        \
16297    | MASK_FUSED_MADD)
16298 #undef TARGET_HANDLE_OPTION
16299 #define TARGET_HANDLE_OPTION mips_handle_option
16300
16301 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
16302 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
16303
16304 #undef TARGET_INSERT_ATTRIBUTES
16305 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
16306 #undef TARGET_MERGE_DECL_ATTRIBUTES
16307 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
16308 #undef TARGET_SET_CURRENT_FUNCTION
16309 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
16310
16311 #undef TARGET_VALID_POINTER_MODE
16312 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
16313 #undef TARGET_RTX_COSTS
16314 #define TARGET_RTX_COSTS mips_rtx_costs
16315 #undef TARGET_ADDRESS_COST
16316 #define TARGET_ADDRESS_COST mips_address_cost
16317
16318 #undef TARGET_IN_SMALL_DATA_P
16319 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
16320
16321 #undef TARGET_MACHINE_DEPENDENT_REORG
16322 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
16323
16324 #undef TARGET_ASM_FILE_START
16325 #define TARGET_ASM_FILE_START mips_file_start
16326 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
16327 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
16328
16329 #undef TARGET_INIT_LIBFUNCS
16330 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
16331
16332 #undef TARGET_BUILD_BUILTIN_VA_LIST
16333 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
16334 #undef TARGET_EXPAND_BUILTIN_VA_START
16335 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
16336 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
16337 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
16338
16339 #undef  TARGET_PROMOTE_FUNCTION_MODE
16340 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
16341 #undef TARGET_PROMOTE_PROTOTYPES
16342 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
16343
16344 #undef TARGET_RETURN_IN_MEMORY
16345 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
16346 #undef TARGET_RETURN_IN_MSB
16347 #define TARGET_RETURN_IN_MSB mips_return_in_msb
16348
16349 #undef TARGET_ASM_OUTPUT_MI_THUNK
16350 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
16351 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
16352 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
16353
16354 #undef TARGET_SETUP_INCOMING_VARARGS
16355 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
16356 #undef TARGET_STRICT_ARGUMENT_NAMING
16357 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
16358 #undef TARGET_MUST_PASS_IN_STACK
16359 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
16360 #undef TARGET_PASS_BY_REFERENCE
16361 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
16362 #undef TARGET_CALLEE_COPIES
16363 #define TARGET_CALLEE_COPIES mips_callee_copies
16364 #undef TARGET_ARG_PARTIAL_BYTES
16365 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
16366
16367 #undef TARGET_MODE_REP_EXTENDED
16368 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
16369
16370 #undef TARGET_VECTOR_MODE_SUPPORTED_P
16371 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
16372
16373 #undef TARGET_SCALAR_MODE_SUPPORTED_P
16374 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
16375
16376 #undef TARGET_INIT_BUILTINS
16377 #define TARGET_INIT_BUILTINS mips_init_builtins
16378 #undef TARGET_EXPAND_BUILTIN
16379 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
16380
16381 #undef TARGET_HAVE_TLS
16382 #define TARGET_HAVE_TLS HAVE_AS_TLS
16383
16384 #undef TARGET_CANNOT_FORCE_CONST_MEM
16385 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
16386
16387 #undef TARGET_ENCODE_SECTION_INFO
16388 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
16389
16390 #undef TARGET_ATTRIBUTE_TABLE
16391 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
16392 /* All our function attributes are related to how out-of-line copies should
16393    be compiled or called.  They don't in themselves prevent inlining.  */
16394 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
16395 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
16396
16397 #undef TARGET_EXTRA_LIVE_ON_ENTRY
16398 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
16399
16400 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
16401 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
16402 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
16403 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
16404
16405 #undef  TARGET_COMP_TYPE_ATTRIBUTES
16406 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
16407
16408 #ifdef HAVE_AS_DTPRELWORD
16409 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
16410 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
16411 #endif
16412 #undef TARGET_DWARF_REGISTER_SPAN
16413 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
16414
16415 #undef TARGET_IRA_COVER_CLASSES
16416 #define TARGET_IRA_COVER_CLASSES mips_ira_cover_classes
16417
16418 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
16419 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
16420
16421 #undef TARGET_LEGITIMATE_ADDRESS_P
16422 #define TARGET_LEGITIMATE_ADDRESS_P     mips_legitimate_address_p
16423
16424 #undef TARGET_FRAME_POINTER_REQUIRED
16425 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
16426
16427 #undef TARGET_CAN_ELIMINATE
16428 #define TARGET_CAN_ELIMINATE mips_can_eliminate
16429
16430 #undef TARGET_TRAMPOLINE_INIT
16431 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
16432
16433 struct gcc_target targetm = TARGET_INITIALIZER;
16434 \f
16435 #include "gt-mips.h"