Remove obsolete OpenBSD/MIPS support
[platform/upstream/gcc.git] / gcc / config / mips / mips.c
1 /* Subroutines used for MIPS code generation.
2    Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4    2011, 2012
5    Free Software Foundation, Inc.
6    Contributed by A. Lichnewsky, lich@inria.inria.fr.
7    Changes by Michael Meissner, meissner@osf.org.
8    64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
9    Brendan Eich, brendan@microunity.com.
10
11 This file is part of GCC.
12
13 GCC is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 3, or (at your option)
16 any later version.
17
18 GCC is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with GCC; see the file COPYING3.  If not see
25 <http://www.gnu.org/licenses/>.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "rtl.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "insn-attr.h"
37 #include "recog.h"
38 #include "output.h"
39 #include "tree.h"
40 #include "function.h"
41 #include "expr.h"
42 #include "optabs.h"
43 #include "libfuncs.h"
44 #include "flags.h"
45 #include "reload.h"
46 #include "tm_p.h"
47 #include "ggc.h"
48 #include "gstab.h"
49 #include "hashtab.h"
50 #include "debug.h"
51 #include "target.h"
52 #include "target-def.h"
53 #include "integrate.h"
54 #include "langhooks.h"
55 #include "cfglayout.h"
56 #include "sched-int.h"
57 #include "gimple.h"
58 #include "bitmap.h"
59 #include "diagnostic.h"
60 #include "target-globals.h"
61 #include "opts.h"
62
63 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
64 #define UNSPEC_ADDRESS_P(X)                                     \
65   (GET_CODE (X) == UNSPEC                                       \
66    && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
67    && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
68
69 /* Extract the symbol or label from UNSPEC wrapper X.  */
70 #define UNSPEC_ADDRESS(X) \
71   XVECEXP (X, 0, 0)
72
73 /* Extract the symbol type from UNSPEC wrapper X.  */
74 #define UNSPEC_ADDRESS_TYPE(X) \
75   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
76
77 /* The maximum distance between the top of the stack frame and the
78    value $sp has when we save and restore registers.
79
80    The value for normal-mode code must be a SMALL_OPERAND and must
81    preserve the maximum stack alignment.  We therefore use a value
82    of 0x7ff0 in this case.
83
84    MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
85    up to 0x7f8 bytes and can usually save or restore all the registers
86    that we need to save or restore.  (Note that we can only use these
87    instructions for o32, for which the stack alignment is 8 bytes.)
88
89    We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
90    RESTORE are not available.  We can then use unextended instructions
91    to save and restore registers, and to allocate and deallocate the top
92    part of the frame.  */
93 #define MIPS_MAX_FIRST_STACK_STEP                                       \
94   (!TARGET_MIPS16 ? 0x7ff0                                              \
95    : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8                              \
96    : TARGET_64BIT ? 0x100 : 0x400)
97
98 /* True if INSN is a mips.md pattern or asm statement.  */
99 #define USEFUL_INSN_P(INSN)                                             \
100   (NONDEBUG_INSN_P (INSN)                                               \
101    && GET_CODE (PATTERN (INSN)) != USE                                  \
102    && GET_CODE (PATTERN (INSN)) != CLOBBER                              \
103    && GET_CODE (PATTERN (INSN)) != ADDR_VEC                             \
104    && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
105
106 /* If INSN is a delayed branch sequence, return the first instruction
107    in the sequence, otherwise return INSN itself.  */
108 #define SEQ_BEGIN(INSN)                                                 \
109   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
110    ? XVECEXP (PATTERN (INSN), 0, 0)                                     \
111    : (INSN))
112
113 /* Likewise for the last instruction in a delayed branch sequence.  */
114 #define SEQ_END(INSN)                                                   \
115   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
116    ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1)       \
117    : (INSN))
118
119 /* Execute the following loop body with SUBINSN set to each instruction
120    between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive.  */
121 #define FOR_EACH_SUBINSN(SUBINSN, INSN)                                 \
122   for ((SUBINSN) = SEQ_BEGIN (INSN);                                    \
123        (SUBINSN) != NEXT_INSN (SEQ_END (INSN));                         \
124        (SUBINSN) = NEXT_INSN (SUBINSN))
125
126 /* True if bit BIT is set in VALUE.  */
127 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
128
129 /* Return the opcode for a ptr_mode load of the form:
130
131        l[wd]    DEST, OFFSET(BASE).  */
132 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE)       \
133   (((ptr_mode == DImode ? 0x37 : 0x23) << 26)   \
134    | ((BASE) << 21)                             \
135    | ((DEST) << 16)                             \
136    | (OFFSET))
137
138 /* Return the opcode to move register SRC into register DEST.  */
139 #define MIPS_MOVE(DEST, SRC)            \
140   ((TARGET_64BIT ? 0x2d : 0x21)         \
141    | ((DEST) << 11)                     \
142    | ((SRC) << 21))
143
144 /* Return the opcode for:
145
146        lui      DEST, VALUE.  */
147 #define MIPS_LUI(DEST, VALUE) \
148   ((0xf << 26) | ((DEST) << 16) | (VALUE))
149
150 /* Return the opcode to jump to register DEST.  */
151 #define MIPS_JR(DEST) \
152   (((DEST) << 21) | 0x8)
153
154 /* Return the opcode for:
155
156        bal     . + (1 + OFFSET) * 4.  */
157 #define MIPS_BAL(OFFSET) \
158   ((0x1 << 26) | (0x11 << 16) | (OFFSET))
159
160 /* Return the usual opcode for a nop.  */
161 #define MIPS_NOP 0
162
163 /* Classifies an address.
164
165    ADDRESS_REG
166        A natural register + offset address.  The register satisfies
167        mips_valid_base_register_p and the offset is a const_arith_operand.
168
169    ADDRESS_LO_SUM
170        A LO_SUM rtx.  The first operand is a valid base register and
171        the second operand is a symbolic address.
172
173    ADDRESS_CONST_INT
174        A signed 16-bit constant address.
175
176    ADDRESS_SYMBOLIC:
177        A constant symbolic address.  */
178 enum mips_address_type {
179   ADDRESS_REG,
180   ADDRESS_LO_SUM,
181   ADDRESS_CONST_INT,
182   ADDRESS_SYMBOLIC
183 };
184
185 /* Macros to create an enumeration identifier for a function prototype.  */
186 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
187 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
188 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
189 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
190
191 /* Classifies the prototype of a built-in function.  */
192 enum mips_function_type {
193 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
194 #include "config/mips/mips-ftypes.def"
195 #undef DEF_MIPS_FTYPE
196   MIPS_MAX_FTYPE_MAX
197 };
198
199 /* Specifies how a built-in function should be converted into rtl.  */
200 enum mips_builtin_type {
201   /* The function corresponds directly to an .md pattern.  The return
202      value is mapped to operand 0 and the arguments are mapped to
203      operands 1 and above.  */
204   MIPS_BUILTIN_DIRECT,
205
206   /* The function corresponds directly to an .md pattern.  There is no return
207      value and the arguments are mapped to operands 0 and above.  */
208   MIPS_BUILTIN_DIRECT_NO_TARGET,
209
210   /* The function corresponds to a comparison instruction followed by
211      a mips_cond_move_tf_ps pattern.  The first two arguments are the
212      values to compare and the second two arguments are the vector
213      operands for the movt.ps or movf.ps instruction (in assembly order).  */
214   MIPS_BUILTIN_MOVF,
215   MIPS_BUILTIN_MOVT,
216
217   /* The function corresponds to a V2SF comparison instruction.  Operand 0
218      of this instruction is the result of the comparison, which has mode
219      CCV2 or CCV4.  The function arguments are mapped to operands 1 and
220      above.  The function's return value is an SImode boolean that is
221      true under the following conditions:
222
223      MIPS_BUILTIN_CMP_ANY: one of the registers is true
224      MIPS_BUILTIN_CMP_ALL: all of the registers are true
225      MIPS_BUILTIN_CMP_LOWER: the first register is true
226      MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
227   MIPS_BUILTIN_CMP_ANY,
228   MIPS_BUILTIN_CMP_ALL,
229   MIPS_BUILTIN_CMP_UPPER,
230   MIPS_BUILTIN_CMP_LOWER,
231
232   /* As above, but the instruction only sets a single $fcc register.  */
233   MIPS_BUILTIN_CMP_SINGLE,
234
235   /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
236   MIPS_BUILTIN_BPOSGE32
237 };
238
239 /* Invoke MACRO (COND) for each C.cond.fmt condition.  */
240 #define MIPS_FP_CONDITIONS(MACRO) \
241   MACRO (f),    \
242   MACRO (un),   \
243   MACRO (eq),   \
244   MACRO (ueq),  \
245   MACRO (olt),  \
246   MACRO (ult),  \
247   MACRO (ole),  \
248   MACRO (ule),  \
249   MACRO (sf),   \
250   MACRO (ngle), \
251   MACRO (seq),  \
252   MACRO (ngl),  \
253   MACRO (lt),   \
254   MACRO (nge),  \
255   MACRO (le),   \
256   MACRO (ngt)
257
258 /* Enumerates the codes above as MIPS_FP_COND_<X>.  */
259 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
260 enum mips_fp_condition {
261   MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
262 };
263
264 /* Index X provides the string representation of MIPS_FP_COND_<X>.  */
265 #define STRINGIFY(X) #X
266 static const char *const mips_fp_conditions[] = {
267   MIPS_FP_CONDITIONS (STRINGIFY)
268 };
269
270 /* Information about a function's frame layout.  */
271 struct GTY(())  mips_frame_info {
272   /* The size of the frame in bytes.  */
273   HOST_WIDE_INT total_size;
274
275   /* The number of bytes allocated to variables.  */
276   HOST_WIDE_INT var_size;
277
278   /* The number of bytes allocated to outgoing function arguments.  */
279   HOST_WIDE_INT args_size;
280
281   /* The number of bytes allocated to the .cprestore slot, or 0 if there
282      is no such slot.  */
283   HOST_WIDE_INT cprestore_size;
284
285   /* Bit X is set if the function saves or restores GPR X.  */
286   unsigned int mask;
287
288   /* Likewise FPR X.  */
289   unsigned int fmask;
290
291   /* Likewise doubleword accumulator X ($acX).  */
292   unsigned int acc_mask;
293
294   /* The number of GPRs, FPRs, doubleword accumulators and COP0
295      registers saved.  */
296   unsigned int num_gp;
297   unsigned int num_fp;
298   unsigned int num_acc;
299   unsigned int num_cop0_regs;
300
301   /* The offset of the topmost GPR, FPR, accumulator and COP0-register
302      save slots from the top of the frame, or zero if no such slots are
303      needed.  */
304   HOST_WIDE_INT gp_save_offset;
305   HOST_WIDE_INT fp_save_offset;
306   HOST_WIDE_INT acc_save_offset;
307   HOST_WIDE_INT cop0_save_offset;
308
309   /* Likewise, but giving offsets from the bottom of the frame.  */
310   HOST_WIDE_INT gp_sp_offset;
311   HOST_WIDE_INT fp_sp_offset;
312   HOST_WIDE_INT acc_sp_offset;
313   HOST_WIDE_INT cop0_sp_offset;
314
315   /* Similar, but the value passed to _mcount.  */
316   HOST_WIDE_INT ra_fp_offset;
317
318   /* The offset of arg_pointer_rtx from the bottom of the frame.  */
319   HOST_WIDE_INT arg_pointer_offset;
320
321   /* The offset of hard_frame_pointer_rtx from the bottom of the frame.  */
322   HOST_WIDE_INT hard_frame_pointer_offset;
323 };
324
325 struct GTY(())  machine_function {
326   /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
327   rtx mips16_gp_pseudo_rtx;
328
329   /* The number of extra stack bytes taken up by register varargs.
330      This area is allocated by the callee at the very top of the frame.  */
331   int varargs_size;
332
333   /* The current frame information, calculated by mips_compute_frame_info.  */
334   struct mips_frame_info frame;
335
336   /* The register to use as the function's global pointer, or INVALID_REGNUM
337      if the function doesn't need one.  */
338   unsigned int global_pointer;
339
340   /* How many instructions it takes to load a label into $AT, or 0 if
341      this property hasn't yet been calculated.  */
342   unsigned int load_label_num_insns;
343
344   /* True if mips_adjust_insn_length should ignore an instruction's
345      hazard attribute.  */
346   bool ignore_hazard_length_p;
347
348   /* True if the whole function is suitable for .set noreorder and
349      .set nomacro.  */
350   bool all_noreorder_p;
351
352   /* True if the function has "inflexible" and "flexible" references
353      to the global pointer.  See mips_cfun_has_inflexible_gp_ref_p
354      and mips_cfun_has_flexible_gp_ref_p for details.  */
355   bool has_inflexible_gp_insn_p;
356   bool has_flexible_gp_insn_p;
357
358   /* True if the function's prologue must load the global pointer
359      value into pic_offset_table_rtx and store the same value in
360      the function's cprestore slot (if any).  Even if this value
361      is currently false, we may decide to set it to true later;
362      see mips_must_initialize_gp_p () for details.  */
363   bool must_initialize_gp_p;
364
365   /* True if the current function must restore $gp after any potential
366      clobber.  This value is only meaningful during the first post-epilogue
367      split_insns pass; see mips_must_initialize_gp_p () for details.  */
368   bool must_restore_gp_when_clobbered_p;
369
370   /* True if this is an interrupt handler.  */
371   bool interrupt_handler_p;
372
373   /* True if this is an interrupt handler that uses shadow registers.  */
374   bool use_shadow_register_set_p;
375
376   /* True if this is an interrupt handler that should keep interrupts
377      masked.  */
378   bool keep_interrupts_masked_p;
379
380   /* True if this is an interrupt handler that should use DERET
381      instead of ERET.  */
382   bool use_debug_exception_return_p;
383 };
384
385 /* Information about a single argument.  */
386 struct mips_arg_info {
387   /* True if the argument is passed in a floating-point register, or
388      would have been if we hadn't run out of registers.  */
389   bool fpr_p;
390
391   /* The number of words passed in registers, rounded up.  */
392   unsigned int reg_words;
393
394   /* For EABI, the offset of the first register from GP_ARG_FIRST or
395      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
396      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
397      comment for details).
398
399      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
400      on the stack.  */
401   unsigned int reg_offset;
402
403   /* The number of words that must be passed on the stack, rounded up.  */
404   unsigned int stack_words;
405
406   /* The offset from the start of the stack overflow area of the argument's
407      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
408   unsigned int stack_offset;
409 };
410
411 /* Information about an address described by mips_address_type.
412
413    ADDRESS_CONST_INT
414        No fields are used.
415
416    ADDRESS_REG
417        REG is the base register and OFFSET is the constant offset.
418
419    ADDRESS_LO_SUM
420        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
421        is the type of symbol it references.
422
423    ADDRESS_SYMBOLIC
424        SYMBOL_TYPE is the type of symbol that the address references.  */
425 struct mips_address_info {
426   enum mips_address_type type;
427   rtx reg;
428   rtx offset;
429   enum mips_symbol_type symbol_type;
430 };
431
432 /* One stage in a constant building sequence.  These sequences have
433    the form:
434
435         A = VALUE[0]
436         A = A CODE[1] VALUE[1]
437         A = A CODE[2] VALUE[2]
438         ...
439
440    where A is an accumulator, each CODE[i] is a binary rtl operation
441    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
442 struct mips_integer_op {
443   enum rtx_code code;
444   unsigned HOST_WIDE_INT value;
445 };
446
447 /* The largest number of operations needed to load an integer constant.
448    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
449    When the lowest bit is clear, we can try, but reject a sequence with
450    an extra SLL at the end.  */
451 #define MIPS_MAX_INTEGER_OPS 7
452
453 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
454 struct mips16e_save_restore_info {
455   /* The number of argument registers saved by a SAVE instruction.
456      0 for RESTORE instructions.  */
457   unsigned int nargs;
458
459   /* Bit X is set if the instruction saves or restores GPR X.  */
460   unsigned int mask;
461
462   /* The total number of bytes to allocate.  */
463   HOST_WIDE_INT size;
464 };
465
466 /* Costs of various operations on the different architectures.  */
467
468 struct mips_rtx_cost_data
469 {
470   unsigned short fp_add;
471   unsigned short fp_mult_sf;
472   unsigned short fp_mult_df;
473   unsigned short fp_div_sf;
474   unsigned short fp_div_df;
475   unsigned short int_mult_si;
476   unsigned short int_mult_di;
477   unsigned short int_div_si;
478   unsigned short int_div_di;
479   unsigned short branch_cost;
480   unsigned short memory_latency;
481 };
482
483 /* Global variables for machine-dependent things.  */
484
485 /* The -G setting, or the configuration's default small-data limit if
486    no -G option is given.  */
487 static unsigned int mips_small_data_threshold;
488
489 /* The number of file directives written by mips_output_filename.  */
490 int num_source_filenames;
491
492 /* The name that appeared in the last .file directive written by
493    mips_output_filename, or "" if mips_output_filename hasn't
494    written anything yet.  */
495 const char *current_function_file = "";
496
497 /* Arrays that map GCC register numbers to debugger register numbers.  */
498 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
499 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
500
501 /* Information about the current function's epilogue, used only while
502    expanding it.  */
503 static struct {
504   /* A list of queued REG_CFA_RESTORE notes.  */
505   rtx cfa_restores;
506
507   /* The CFA is currently defined as CFA_REG + CFA_OFFSET.  */
508   rtx cfa_reg;
509   HOST_WIDE_INT cfa_offset;
510
511   /* The offset of the CFA from the stack pointer while restoring
512      registers.  */
513   HOST_WIDE_INT cfa_restore_sp_offset;
514 } mips_epilogue;
515
516 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
517 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
518 struct mips_asm_switch mips_nomacro = { "macro", 0 };
519 struct mips_asm_switch mips_noat = { "at", 0 };
520
521 /* True if we're writing out a branch-likely instruction rather than a
522    normal branch.  */
523 static bool mips_branch_likely;
524
525 /* The current instruction-set architecture.  */
526 enum processor mips_arch;
527 const struct mips_cpu_info *mips_arch_info;
528
529 /* The processor that we should tune the code for.  */
530 enum processor mips_tune;
531 const struct mips_cpu_info *mips_tune_info;
532
533 /* The ISA level associated with mips_arch.  */
534 int mips_isa;
535
536 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
537 static const struct mips_cpu_info *mips_isa_option_info;
538
539 /* Which cost information to use.  */
540 static const struct mips_rtx_cost_data *mips_cost;
541
542 /* The ambient target flags, excluding MASK_MIPS16.  */
543 static int mips_base_target_flags;
544
545 /* True if MIPS16 is the default mode.  */
546 bool mips_base_mips16;
547
548 /* The ambient values of other global variables.  */
549 static int mips_base_schedule_insns; /* flag_schedule_insns */
550 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
551 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
552 static int mips_base_align_loops; /* align_loops */
553 static int mips_base_align_jumps; /* align_jumps */
554 static int mips_base_align_functions; /* align_functions */
555
556 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
557 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
558
559 /* Index C is true if character C is a valid PRINT_OPERAND punctation
560    character.  */
561 static bool mips_print_operand_punct[256];
562
563 static GTY (()) int mips_output_filename_first_time = 1;
564
565 /* mips_split_p[X] is true if symbols of type X can be split by
566    mips_split_symbol.  */
567 bool mips_split_p[NUM_SYMBOL_TYPES];
568
569 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
570    can be split by mips_split_symbol.  */
571 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
572
573 /* mips_use_pcrel_pool_p[X] is true if symbols of type X should be
574    forced into a PC-relative constant pool.  */
575 bool mips_use_pcrel_pool_p[NUM_SYMBOL_TYPES];
576
577 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
578    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
579    if they are matched by a special .md file pattern.  */
580 const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
581
582 /* Likewise for HIGHs.  */
583 const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
584
585 /* Target state for MIPS16.  */
586 struct target_globals *mips16_globals;
587
588 /* Cached value of can_issue_more. This is cached in mips_variable_issue hook
589    and returned from mips_sched_reorder2.  */
590 static int cached_can_issue_more;
591
592 /* True if the output uses __mips16_rdhwr.  */
593 static bool mips_need_mips16_rdhwr_p;
594
595 /* Index R is the smallest register class that contains register R.  */
596 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
597   LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
598   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
599   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
600   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
601   M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
602   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
603   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
604   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
605   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
606   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
607   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
608   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
609   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
610   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
611   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
612   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
613   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
614   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
615   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
616   NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
617   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
618   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
619   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
620   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
621   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
622   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
623   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
624   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
625   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
626   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
627   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
628   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
629   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
630   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
631   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
632   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
633   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
634   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
635   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
636   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
637   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
638   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
639   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
640   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
641   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
642   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
643   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
644 };
645
646 /* The value of TARGET_ATTRIBUTE_TABLE.  */
647 static const struct attribute_spec mips_attribute_table[] = {
648   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
649        om_diagnostic } */
650   { "long_call",   0, 0, false, true,  true,  NULL, false },
651   { "far",         0, 0, false, true,  true,  NULL, false },
652   { "near",        0, 0, false, true,  true,  NULL, false },
653   /* We would really like to treat "mips16" and "nomips16" as type
654      attributes, but GCC doesn't provide the hooks we need to support
655      the right conversion rules.  As declaration attributes, they affect
656      code generation but don't carry other semantics.  */
657   { "mips16",      0, 0, true,  false, false, NULL, false },
658   { "nomips16",    0, 0, true,  false, false, NULL, false },
659   /* Allow functions to be specified as interrupt handlers */
660   { "interrupt",   0, 0, false, true,  true, NULL, false },
661   { "use_shadow_register_set",  0, 0, false, true,  true, NULL, false },
662   { "keep_interrupts_masked",   0, 0, false, true,  true, NULL, false },
663   { "use_debug_exception_return", 0, 0, false, true,  true, NULL, false },
664   { NULL,          0, 0, false, false, false, NULL, false }
665 };
666 \f
667 /* A table describing all the processors GCC knows about; see
668    mips-cpus.def for details.  */
669 static const struct mips_cpu_info mips_cpu_info_table[] = {
670 #define MIPS_CPU(NAME, CPU, ISA, FLAGS) \
671   { NAME, CPU, ISA, FLAGS },
672 #include "mips-cpus.def"
673 #undef MIPS_CPU
674 };
675
676 /* Default costs.  If these are used for a processor we should look
677    up the actual costs.  */
678 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
679                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
680                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
681                       COSTS_N_INSNS (23), /* fp_div_sf */    \
682                       COSTS_N_INSNS (36), /* fp_div_df */    \
683                       COSTS_N_INSNS (10), /* int_mult_si */  \
684                       COSTS_N_INSNS (10), /* int_mult_di */  \
685                       COSTS_N_INSNS (69), /* int_div_si */   \
686                       COSTS_N_INSNS (69), /* int_div_di */   \
687                                        2, /* branch_cost */  \
688                                        4  /* memory_latency */
689
690 /* Floating-point costs for processors without an FPU.  Just assume that
691    all floating-point libcalls are very expensive.  */
692 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
693                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
694                       COSTS_N_INSNS (256), /* fp_mult_df */   \
695                       COSTS_N_INSNS (256), /* fp_div_sf */    \
696                       COSTS_N_INSNS (256)  /* fp_div_df */
697
698 /* Costs to use when optimizing for size.  */
699 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
700   COSTS_N_INSNS (1),            /* fp_add */
701   COSTS_N_INSNS (1),            /* fp_mult_sf */
702   COSTS_N_INSNS (1),            /* fp_mult_df */
703   COSTS_N_INSNS (1),            /* fp_div_sf */
704   COSTS_N_INSNS (1),            /* fp_div_df */
705   COSTS_N_INSNS (1),            /* int_mult_si */
706   COSTS_N_INSNS (1),            /* int_mult_di */
707   COSTS_N_INSNS (1),            /* int_div_si */
708   COSTS_N_INSNS (1),            /* int_div_di */
709                    2,           /* branch_cost */
710                    4            /* memory_latency */
711 };
712
713 /* Costs to use when optimizing for speed, indexed by processor.  */
714 static const struct mips_rtx_cost_data
715   mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
716   { /* R3000 */
717     COSTS_N_INSNS (2),            /* fp_add */
718     COSTS_N_INSNS (4),            /* fp_mult_sf */
719     COSTS_N_INSNS (5),            /* fp_mult_df */
720     COSTS_N_INSNS (12),           /* fp_div_sf */
721     COSTS_N_INSNS (19),           /* fp_div_df */
722     COSTS_N_INSNS (12),           /* int_mult_si */
723     COSTS_N_INSNS (12),           /* int_mult_di */
724     COSTS_N_INSNS (35),           /* int_div_si */
725     COSTS_N_INSNS (35),           /* int_div_di */
726                      1,           /* branch_cost */
727                      4            /* memory_latency */
728   },
729   { /* 4KC */
730     SOFT_FP_COSTS,
731     COSTS_N_INSNS (6),            /* int_mult_si */
732     COSTS_N_INSNS (6),            /* int_mult_di */
733     COSTS_N_INSNS (36),           /* int_div_si */
734     COSTS_N_INSNS (36),           /* int_div_di */
735                      1,           /* branch_cost */
736                      4            /* memory_latency */
737   },
738   { /* 4KP */
739     SOFT_FP_COSTS,
740     COSTS_N_INSNS (36),           /* int_mult_si */
741     COSTS_N_INSNS (36),           /* int_mult_di */
742     COSTS_N_INSNS (37),           /* int_div_si */
743     COSTS_N_INSNS (37),           /* int_div_di */
744                      1,           /* branch_cost */
745                      4            /* memory_latency */
746   },
747   { /* 5KC */
748     SOFT_FP_COSTS,
749     COSTS_N_INSNS (4),            /* int_mult_si */
750     COSTS_N_INSNS (11),           /* int_mult_di */
751     COSTS_N_INSNS (36),           /* int_div_si */
752     COSTS_N_INSNS (68),           /* int_div_di */
753                      1,           /* branch_cost */
754                      4            /* memory_latency */
755   },
756   { /* 5KF */
757     COSTS_N_INSNS (4),            /* fp_add */
758     COSTS_N_INSNS (4),            /* fp_mult_sf */
759     COSTS_N_INSNS (5),            /* fp_mult_df */
760     COSTS_N_INSNS (17),           /* fp_div_sf */
761     COSTS_N_INSNS (32),           /* fp_div_df */
762     COSTS_N_INSNS (4),            /* int_mult_si */
763     COSTS_N_INSNS (11),           /* int_mult_di */
764     COSTS_N_INSNS (36),           /* int_div_si */
765     COSTS_N_INSNS (68),           /* int_div_di */
766                      1,           /* branch_cost */
767                      4            /* memory_latency */
768   },
769   { /* 20KC */
770     COSTS_N_INSNS (4),            /* fp_add */
771     COSTS_N_INSNS (4),            /* fp_mult_sf */
772     COSTS_N_INSNS (5),            /* fp_mult_df */
773     COSTS_N_INSNS (17),           /* fp_div_sf */
774     COSTS_N_INSNS (32),           /* fp_div_df */
775     COSTS_N_INSNS (4),            /* int_mult_si */
776     COSTS_N_INSNS (7),            /* int_mult_di */
777     COSTS_N_INSNS (42),           /* int_div_si */
778     COSTS_N_INSNS (72),           /* int_div_di */
779                      1,           /* branch_cost */
780                      4            /* memory_latency */
781   },
782   { /* 24KC */
783     SOFT_FP_COSTS,
784     COSTS_N_INSNS (5),            /* int_mult_si */
785     COSTS_N_INSNS (5),            /* int_mult_di */
786     COSTS_N_INSNS (41),           /* int_div_si */
787     COSTS_N_INSNS (41),           /* int_div_di */
788                      1,           /* branch_cost */
789                      4            /* memory_latency */
790   },
791   { /* 24KF2_1 */
792     COSTS_N_INSNS (8),            /* fp_add */
793     COSTS_N_INSNS (8),            /* fp_mult_sf */
794     COSTS_N_INSNS (10),           /* fp_mult_df */
795     COSTS_N_INSNS (34),           /* fp_div_sf */
796     COSTS_N_INSNS (64),           /* fp_div_df */
797     COSTS_N_INSNS (5),            /* int_mult_si */
798     COSTS_N_INSNS (5),            /* int_mult_di */
799     COSTS_N_INSNS (41),           /* int_div_si */
800     COSTS_N_INSNS (41),           /* int_div_di */
801                      1,           /* branch_cost */
802                      4            /* memory_latency */
803   },
804   { /* 24KF1_1 */
805     COSTS_N_INSNS (4),            /* fp_add */
806     COSTS_N_INSNS (4),            /* fp_mult_sf */
807     COSTS_N_INSNS (5),            /* fp_mult_df */
808     COSTS_N_INSNS (17),           /* fp_div_sf */
809     COSTS_N_INSNS (32),           /* fp_div_df */
810     COSTS_N_INSNS (5),            /* int_mult_si */
811     COSTS_N_INSNS (5),            /* int_mult_di */
812     COSTS_N_INSNS (41),           /* int_div_si */
813     COSTS_N_INSNS (41),           /* int_div_di */
814                      1,           /* branch_cost */
815                      4            /* memory_latency */
816   },
817   { /* 74KC */
818     SOFT_FP_COSTS,
819     COSTS_N_INSNS (5),            /* int_mult_si */
820     COSTS_N_INSNS (5),            /* int_mult_di */
821     COSTS_N_INSNS (41),           /* int_div_si */
822     COSTS_N_INSNS (41),           /* int_div_di */
823                      1,           /* branch_cost */
824                      4            /* memory_latency */
825   },
826   { /* 74KF2_1 */
827     COSTS_N_INSNS (8),            /* fp_add */
828     COSTS_N_INSNS (8),            /* fp_mult_sf */
829     COSTS_N_INSNS (10),           /* fp_mult_df */
830     COSTS_N_INSNS (34),           /* fp_div_sf */
831     COSTS_N_INSNS (64),           /* fp_div_df */
832     COSTS_N_INSNS (5),            /* int_mult_si */
833     COSTS_N_INSNS (5),            /* int_mult_di */
834     COSTS_N_INSNS (41),           /* int_div_si */
835     COSTS_N_INSNS (41),           /* int_div_di */
836                      1,           /* branch_cost */
837                      4            /* memory_latency */
838   },
839   { /* 74KF1_1 */
840     COSTS_N_INSNS (4),            /* fp_add */
841     COSTS_N_INSNS (4),            /* fp_mult_sf */
842     COSTS_N_INSNS (5),            /* fp_mult_df */
843     COSTS_N_INSNS (17),           /* fp_div_sf */
844     COSTS_N_INSNS (32),           /* fp_div_df */
845     COSTS_N_INSNS (5),            /* int_mult_si */
846     COSTS_N_INSNS (5),            /* int_mult_di */
847     COSTS_N_INSNS (41),           /* int_div_si */
848     COSTS_N_INSNS (41),           /* int_div_di */
849                      1,           /* branch_cost */
850                      4            /* memory_latency */
851   },
852   { /* 74KF3_2 */
853     COSTS_N_INSNS (6),            /* fp_add */
854     COSTS_N_INSNS (6),            /* fp_mult_sf */
855     COSTS_N_INSNS (7),            /* fp_mult_df */
856     COSTS_N_INSNS (25),           /* fp_div_sf */
857     COSTS_N_INSNS (48),           /* fp_div_df */
858     COSTS_N_INSNS (5),            /* int_mult_si */
859     COSTS_N_INSNS (5),            /* int_mult_di */
860     COSTS_N_INSNS (41),           /* int_div_si */
861     COSTS_N_INSNS (41),           /* int_div_di */
862                      1,           /* branch_cost */
863                      4            /* memory_latency */
864   },
865   { /* Loongson-2E */
866     DEFAULT_COSTS
867   },
868   { /* Loongson-2F */
869     DEFAULT_COSTS
870   },
871   { /* Loongson-3A */
872     DEFAULT_COSTS
873   },
874   { /* M4k */
875     DEFAULT_COSTS
876   },
877     /* Octeon */
878   {
879     SOFT_FP_COSTS,
880     COSTS_N_INSNS (5),            /* int_mult_si */
881     COSTS_N_INSNS (5),            /* int_mult_di */
882     COSTS_N_INSNS (72),           /* int_div_si */
883     COSTS_N_INSNS (72),           /* int_div_di */
884                      1,           /* branch_cost */
885                      4            /* memory_latency */
886   },
887     /* Octeon II */
888   {
889     SOFT_FP_COSTS,
890     COSTS_N_INSNS (6),            /* int_mult_si */
891     COSTS_N_INSNS (6),            /* int_mult_di */
892     COSTS_N_INSNS (18),           /* int_div_si */
893     COSTS_N_INSNS (35),           /* int_div_di */
894                      4,           /* branch_cost */
895                      4            /* memory_latency */
896   },
897   { /* R3900 */
898     COSTS_N_INSNS (2),            /* fp_add */
899     COSTS_N_INSNS (4),            /* fp_mult_sf */
900     COSTS_N_INSNS (5),            /* fp_mult_df */
901     COSTS_N_INSNS (12),           /* fp_div_sf */
902     COSTS_N_INSNS (19),           /* fp_div_df */
903     COSTS_N_INSNS (2),            /* int_mult_si */
904     COSTS_N_INSNS (2),            /* int_mult_di */
905     COSTS_N_INSNS (35),           /* int_div_si */
906     COSTS_N_INSNS (35),           /* int_div_di */
907                      1,           /* branch_cost */
908                      4            /* memory_latency */
909   },
910   { /* R6000 */
911     COSTS_N_INSNS (3),            /* fp_add */
912     COSTS_N_INSNS (5),            /* fp_mult_sf */
913     COSTS_N_INSNS (6),            /* fp_mult_df */
914     COSTS_N_INSNS (15),           /* fp_div_sf */
915     COSTS_N_INSNS (16),           /* fp_div_df */
916     COSTS_N_INSNS (17),           /* int_mult_si */
917     COSTS_N_INSNS (17),           /* int_mult_di */
918     COSTS_N_INSNS (38),           /* int_div_si */
919     COSTS_N_INSNS (38),           /* int_div_di */
920                      2,           /* branch_cost */
921                      6            /* memory_latency */
922   },
923   { /* R4000 */
924      COSTS_N_INSNS (6),           /* fp_add */
925      COSTS_N_INSNS (7),           /* fp_mult_sf */
926      COSTS_N_INSNS (8),           /* fp_mult_df */
927      COSTS_N_INSNS (23),          /* fp_div_sf */
928      COSTS_N_INSNS (36),          /* fp_div_df */
929      COSTS_N_INSNS (10),          /* int_mult_si */
930      COSTS_N_INSNS (10),          /* int_mult_di */
931      COSTS_N_INSNS (69),          /* int_div_si */
932      COSTS_N_INSNS (69),          /* int_div_di */
933                       2,          /* branch_cost */
934                       6           /* memory_latency */
935   },
936   { /* R4100 */
937     DEFAULT_COSTS
938   },
939   { /* R4111 */
940     DEFAULT_COSTS
941   },
942   { /* R4120 */
943     DEFAULT_COSTS
944   },
945   { /* R4130 */
946     /* The only costs that appear to be updated here are
947        integer multiplication.  */
948     SOFT_FP_COSTS,
949     COSTS_N_INSNS (4),            /* int_mult_si */
950     COSTS_N_INSNS (6),            /* int_mult_di */
951     COSTS_N_INSNS (69),           /* int_div_si */
952     COSTS_N_INSNS (69),           /* int_div_di */
953                      1,           /* branch_cost */
954                      4            /* memory_latency */
955   },
956   { /* R4300 */
957     DEFAULT_COSTS
958   },
959   { /* R4600 */
960     DEFAULT_COSTS
961   },
962   { /* R4650 */
963     DEFAULT_COSTS
964   },
965   { /* R5000 */
966     COSTS_N_INSNS (6),            /* fp_add */
967     COSTS_N_INSNS (4),            /* fp_mult_sf */
968     COSTS_N_INSNS (5),            /* fp_mult_df */
969     COSTS_N_INSNS (23),           /* fp_div_sf */
970     COSTS_N_INSNS (36),           /* fp_div_df */
971     COSTS_N_INSNS (5),            /* int_mult_si */
972     COSTS_N_INSNS (5),            /* int_mult_di */
973     COSTS_N_INSNS (36),           /* int_div_si */
974     COSTS_N_INSNS (36),           /* int_div_di */
975                      1,           /* branch_cost */
976                      4            /* memory_latency */
977   },
978   { /* R5400 */
979     COSTS_N_INSNS (6),            /* fp_add */
980     COSTS_N_INSNS (5),            /* fp_mult_sf */
981     COSTS_N_INSNS (6),            /* fp_mult_df */
982     COSTS_N_INSNS (30),           /* fp_div_sf */
983     COSTS_N_INSNS (59),           /* fp_div_df */
984     COSTS_N_INSNS (3),            /* int_mult_si */
985     COSTS_N_INSNS (4),            /* int_mult_di */
986     COSTS_N_INSNS (42),           /* int_div_si */
987     COSTS_N_INSNS (74),           /* int_div_di */
988                      1,           /* branch_cost */
989                      4            /* memory_latency */
990   },
991   { /* R5500 */
992     COSTS_N_INSNS (6),            /* fp_add */
993     COSTS_N_INSNS (5),            /* fp_mult_sf */
994     COSTS_N_INSNS (6),            /* fp_mult_df */
995     COSTS_N_INSNS (30),           /* fp_div_sf */
996     COSTS_N_INSNS (59),           /* fp_div_df */
997     COSTS_N_INSNS (5),            /* int_mult_si */
998     COSTS_N_INSNS (9),            /* int_mult_di */
999     COSTS_N_INSNS (42),           /* int_div_si */
1000     COSTS_N_INSNS (74),           /* int_div_di */
1001                      1,           /* branch_cost */
1002                      4            /* memory_latency */
1003   },
1004   { /* R7000 */
1005     /* The only costs that are changed here are
1006        integer multiplication.  */
1007     COSTS_N_INSNS (6),            /* fp_add */
1008     COSTS_N_INSNS (7),            /* fp_mult_sf */
1009     COSTS_N_INSNS (8),            /* fp_mult_df */
1010     COSTS_N_INSNS (23),           /* fp_div_sf */
1011     COSTS_N_INSNS (36),           /* fp_div_df */
1012     COSTS_N_INSNS (5),            /* int_mult_si */
1013     COSTS_N_INSNS (9),            /* int_mult_di */
1014     COSTS_N_INSNS (69),           /* int_div_si */
1015     COSTS_N_INSNS (69),           /* int_div_di */
1016                      1,           /* branch_cost */
1017                      4            /* memory_latency */
1018   },
1019   { /* R8000 */
1020     DEFAULT_COSTS
1021   },
1022   { /* R9000 */
1023     /* The only costs that are changed here are
1024        integer multiplication.  */
1025     COSTS_N_INSNS (6),            /* fp_add */
1026     COSTS_N_INSNS (7),            /* fp_mult_sf */
1027     COSTS_N_INSNS (8),            /* fp_mult_df */
1028     COSTS_N_INSNS (23),           /* fp_div_sf */
1029     COSTS_N_INSNS (36),           /* fp_div_df */
1030     COSTS_N_INSNS (3),            /* int_mult_si */
1031     COSTS_N_INSNS (8),            /* int_mult_di */
1032     COSTS_N_INSNS (69),           /* int_div_si */
1033     COSTS_N_INSNS (69),           /* int_div_di */
1034                      1,           /* branch_cost */
1035                      4            /* memory_latency */
1036   },
1037   { /* R1x000 */
1038     COSTS_N_INSNS (2),            /* fp_add */
1039     COSTS_N_INSNS (2),            /* fp_mult_sf */
1040     COSTS_N_INSNS (2),            /* fp_mult_df */
1041     COSTS_N_INSNS (12),           /* fp_div_sf */
1042     COSTS_N_INSNS (19),           /* fp_div_df */
1043     COSTS_N_INSNS (5),            /* int_mult_si */
1044     COSTS_N_INSNS (9),            /* int_mult_di */
1045     COSTS_N_INSNS (34),           /* int_div_si */
1046     COSTS_N_INSNS (66),           /* int_div_di */
1047                      1,           /* branch_cost */
1048                      4            /* memory_latency */
1049   },
1050   { /* SB1 */
1051     /* These costs are the same as the SB-1A below.  */
1052     COSTS_N_INSNS (4),            /* fp_add */
1053     COSTS_N_INSNS (4),            /* fp_mult_sf */
1054     COSTS_N_INSNS (4),            /* fp_mult_df */
1055     COSTS_N_INSNS (24),           /* fp_div_sf */
1056     COSTS_N_INSNS (32),           /* fp_div_df */
1057     COSTS_N_INSNS (3),            /* int_mult_si */
1058     COSTS_N_INSNS (4),            /* int_mult_di */
1059     COSTS_N_INSNS (36),           /* int_div_si */
1060     COSTS_N_INSNS (68),           /* int_div_di */
1061                      1,           /* branch_cost */
1062                      4            /* memory_latency */
1063   },
1064   { /* SB1-A */
1065     /* These costs are the same as the SB-1 above.  */
1066     COSTS_N_INSNS (4),            /* fp_add */
1067     COSTS_N_INSNS (4),            /* fp_mult_sf */
1068     COSTS_N_INSNS (4),            /* fp_mult_df */
1069     COSTS_N_INSNS (24),           /* fp_div_sf */
1070     COSTS_N_INSNS (32),           /* fp_div_df */
1071     COSTS_N_INSNS (3),            /* int_mult_si */
1072     COSTS_N_INSNS (4),            /* int_mult_di */
1073     COSTS_N_INSNS (36),           /* int_div_si */
1074     COSTS_N_INSNS (68),           /* int_div_di */
1075                      1,           /* branch_cost */
1076                      4            /* memory_latency */
1077   },
1078   { /* SR71000 */
1079     DEFAULT_COSTS
1080   },
1081   { /* XLR */
1082     SOFT_FP_COSTS,
1083     COSTS_N_INSNS (8),            /* int_mult_si */
1084     COSTS_N_INSNS (8),            /* int_mult_di */
1085     COSTS_N_INSNS (72),           /* int_div_si */
1086     COSTS_N_INSNS (72),           /* int_div_di */
1087                      1,           /* branch_cost */
1088                      4            /* memory_latency */
1089   }
1090 };
1091 \f
1092 static rtx mips_find_pic_call_symbol (rtx, rtx, bool);
1093 static int mips_register_move_cost (enum machine_mode, reg_class_t,
1094                                     reg_class_t);
1095 static unsigned int mips_function_arg_boundary (enum machine_mode, const_tree);
1096 \f
1097 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1098    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1099 struct GTY (())  mflip_mips16_entry {
1100   const char *name;
1101   bool mips16_p;
1102 };
1103 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1104
1105 /* Hash table callbacks for mflip_mips16_htab.  */
1106
1107 static hashval_t
1108 mflip_mips16_htab_hash (const void *entry)
1109 {
1110   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1111 }
1112
1113 static int
1114 mflip_mips16_htab_eq (const void *entry, const void *name)
1115 {
1116   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1117                  (const char *) name) == 0;
1118 }
1119
1120 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1121    mode, false if it should next add an attribute for the opposite mode.  */
1122 static GTY(()) bool mips16_flipper;
1123
1124 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1125    for -mflip-mips16.  Return true if it should use "mips16" and false if
1126    it should use "nomips16".  */
1127
1128 static bool
1129 mflip_mips16_use_mips16_p (tree decl)
1130 {
1131   struct mflip_mips16_entry *entry;
1132   const char *name;
1133   hashval_t hash;
1134   void **slot;
1135
1136   /* Use the opposite of the command-line setting for anonymous decls.  */
1137   if (!DECL_NAME (decl))
1138     return !mips_base_mips16;
1139
1140   if (!mflip_mips16_htab)
1141     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1142                                          mflip_mips16_htab_eq, NULL);
1143
1144   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1145   hash = htab_hash_string (name);
1146   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1147   entry = (struct mflip_mips16_entry *) *slot;
1148   if (!entry)
1149     {
1150       mips16_flipper = !mips16_flipper;
1151       entry = ggc_alloc_mflip_mips16_entry ();
1152       entry->name = name;
1153       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1154       *slot = entry;
1155     }
1156   return entry->mips16_p;
1157 }
1158 \f
1159 /* Predicates to test for presence of "near" and "far"/"long_call"
1160    attributes on the given TYPE.  */
1161
1162 static bool
1163 mips_near_type_p (const_tree type)
1164 {
1165   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1166 }
1167
1168 static bool
1169 mips_far_type_p (const_tree type)
1170 {
1171   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1172           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1173 }
1174
1175 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1176
1177 static bool
1178 mips_mips16_decl_p (const_tree decl)
1179 {
1180   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1181 }
1182
1183 static bool
1184 mips_nomips16_decl_p (const_tree decl)
1185 {
1186   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1187 }
1188
1189 /* Check if the interrupt attribute is set for a function.  */
1190
1191 static bool
1192 mips_interrupt_type_p (tree type)
1193 {
1194   return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1195 }
1196
1197 /* Check if the attribute to use shadow register set is set for a function.  */
1198
1199 static bool
1200 mips_use_shadow_register_set_p (tree type)
1201 {
1202   return lookup_attribute ("use_shadow_register_set",
1203                            TYPE_ATTRIBUTES (type)) != NULL;
1204 }
1205
1206 /* Check if the attribute to keep interrupts masked is set for a function.  */
1207
1208 static bool
1209 mips_keep_interrupts_masked_p (tree type)
1210 {
1211   return lookup_attribute ("keep_interrupts_masked",
1212                            TYPE_ATTRIBUTES (type)) != NULL;
1213 }
1214
1215 /* Check if the attribute to use debug exception return is set for
1216    a function.  */
1217
1218 static bool
1219 mips_use_debug_exception_return_p (tree type)
1220 {
1221   return lookup_attribute ("use_debug_exception_return",
1222                            TYPE_ATTRIBUTES (type)) != NULL;
1223 }
1224
1225 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1226    setting if DECL is null.  */
1227
1228 static bool
1229 mips_use_mips16_mode_p (tree decl)
1230 {
1231   if (decl)
1232     {
1233       /* Nested functions must use the same frame pointer as their
1234          parent and must therefore use the same ISA mode.  */
1235       tree parent = decl_function_context (decl);
1236       if (parent)
1237         decl = parent;
1238       if (mips_mips16_decl_p (decl))
1239         return true;
1240       if (mips_nomips16_decl_p (decl))
1241         return false;
1242     }
1243   return mips_base_mips16;
1244 }
1245
1246 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1247
1248 static int
1249 mips_comp_type_attributes (const_tree type1, const_tree type2)
1250 {
1251   /* Disallow mixed near/far attributes.  */
1252   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1253     return 0;
1254   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1255     return 0;
1256   return 1;
1257 }
1258
1259 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1260
1261 static void
1262 mips_insert_attributes (tree decl, tree *attributes)
1263 {
1264   const char *name;
1265   bool mips16_p, nomips16_p;
1266
1267   /* Check for "mips16" and "nomips16" attributes.  */
1268   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1269   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1270   if (TREE_CODE (decl) != FUNCTION_DECL)
1271     {
1272       if (mips16_p)
1273         error ("%qs attribute only applies to functions", "mips16");
1274       if (nomips16_p)
1275         error ("%qs attribute only applies to functions", "nomips16");
1276     }
1277   else
1278     {
1279       mips16_p |= mips_mips16_decl_p (decl);
1280       nomips16_p |= mips_nomips16_decl_p (decl);
1281       if (mips16_p || nomips16_p)
1282         {
1283           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1284           if (mips16_p && nomips16_p)
1285             error ("%qE cannot have both %<mips16%> and "
1286                    "%<nomips16%> attributes",
1287                    DECL_NAME (decl));
1288         }
1289       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1290         {
1291           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1292              "mips16" attribute, arbitrarily pick one.  We must pick the same
1293              setting for duplicate declarations of a function.  */
1294           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1295           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1296         }
1297     }
1298 }
1299
1300 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1301
1302 static tree
1303 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1304 {
1305   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1306   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1307     error ("%qE redeclared with conflicting %qs attributes",
1308            DECL_NAME (newdecl), "mips16");
1309   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1310     error ("%qE redeclared with conflicting %qs attributes",
1311            DECL_NAME (newdecl), "nomips16");
1312
1313   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1314                            DECL_ATTRIBUTES (newdecl));
1315 }
1316 \f
1317 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1318    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1319
1320 static void
1321 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1322 {
1323   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1324     {
1325       *base_ptr = XEXP (x, 0);
1326       *offset_ptr = INTVAL (XEXP (x, 1));
1327     }
1328   else
1329     {
1330       *base_ptr = x;
1331       *offset_ptr = 0;
1332     }
1333 }
1334 \f
1335 static unsigned int mips_build_integer (struct mips_integer_op *,
1336                                         unsigned HOST_WIDE_INT);
1337
1338 /* A subroutine of mips_build_integer, with the same interface.
1339    Assume that the final action in the sequence should be a left shift.  */
1340
1341 static unsigned int
1342 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1343 {
1344   unsigned int i, shift;
1345
1346   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1347      since signed numbers are easier to load than unsigned ones.  */
1348   shift = 0;
1349   while ((value & 1) == 0)
1350     value /= 2, shift++;
1351
1352   i = mips_build_integer (codes, value);
1353   codes[i].code = ASHIFT;
1354   codes[i].value = shift;
1355   return i + 1;
1356 }
1357
1358 /* As for mips_build_shift, but assume that the final action will be
1359    an IOR or PLUS operation.  */
1360
1361 static unsigned int
1362 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1363 {
1364   unsigned HOST_WIDE_INT high;
1365   unsigned int i;
1366
1367   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1368   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1369     {
1370       /* The constant is too complex to load with a simple LUI/ORI pair,
1371          so we want to give the recursive call as many trailing zeros as
1372          possible.  In this case, we know bit 16 is set and that the
1373          low 16 bits form a negative number.  If we subtract that number
1374          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1375       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1376       codes[i].code = PLUS;
1377       codes[i].value = CONST_LOW_PART (value);
1378     }
1379   else
1380     {
1381       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1382          bits gives a value with at least 17 trailing zeros.  */
1383       i = mips_build_integer (codes, high);
1384       codes[i].code = IOR;
1385       codes[i].value = value & 0xffff;
1386     }
1387   return i + 1;
1388 }
1389
1390 /* Fill CODES with a sequence of rtl operations to load VALUE.
1391    Return the number of operations needed.  */
1392
1393 static unsigned int
1394 mips_build_integer (struct mips_integer_op *codes,
1395                     unsigned HOST_WIDE_INT value)
1396 {
1397   if (SMALL_OPERAND (value)
1398       || SMALL_OPERAND_UNSIGNED (value)
1399       || LUI_OPERAND (value))
1400     {
1401       /* The value can be loaded with a single instruction.  */
1402       codes[0].code = UNKNOWN;
1403       codes[0].value = value;
1404       return 1;
1405     }
1406   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1407     {
1408       /* Either the constant is a simple LUI/ORI combination or its
1409          lowest bit is set.  We don't want to shift in this case.  */
1410       return mips_build_lower (codes, value);
1411     }
1412   else if ((value & 0xffff) == 0)
1413     {
1414       /* The constant will need at least three actions.  The lowest
1415          16 bits are clear, so the final action will be a shift.  */
1416       return mips_build_shift (codes, value);
1417     }
1418   else
1419     {
1420       /* The final action could be a shift, add or inclusive OR.
1421          Rather than use a complex condition to select the best
1422          approach, try both mips_build_shift and mips_build_lower
1423          and pick the one that gives the shortest sequence.
1424          Note that this case is only used once per constant.  */
1425       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1426       unsigned int cost, alt_cost;
1427
1428       cost = mips_build_shift (codes, value);
1429       alt_cost = mips_build_lower (alt_codes, value);
1430       if (alt_cost < cost)
1431         {
1432           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1433           cost = alt_cost;
1434         }
1435       return cost;
1436     }
1437 }
1438 \f
1439 /* Implement TARGET_LEGITIMATE_CONSTANT_P.  */
1440
1441 static bool
1442 mips_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1443 {
1444   return mips_const_insns (x) > 0;
1445 }
1446 \f
1447 /* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
1448
1449 static rtx
1450 mips16_stub_function (const char *name)
1451 {
1452   rtx x;
1453
1454   x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
1455   SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
1456   return x;
1457 }
1458 \f
1459 /* Return true if symbols of type TYPE require a GOT access.  */
1460
1461 static bool
1462 mips_got_symbol_type_p (enum mips_symbol_type type)
1463 {
1464   switch (type)
1465     {
1466     case SYMBOL_GOT_PAGE_OFST:
1467     case SYMBOL_GOT_DISP:
1468       return true;
1469
1470     default:
1471       return false;
1472     }
1473 }
1474
1475 /* Return true if X is a thread-local symbol.  */
1476
1477 static bool
1478 mips_tls_symbol_p (rtx x)
1479 {
1480   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1481 }
1482
1483 /* Return true if SYMBOL_REF X is associated with a global symbol
1484    (in the STB_GLOBAL sense).  */
1485
1486 static bool
1487 mips_global_symbol_p (const_rtx x)
1488 {
1489   const_tree decl = SYMBOL_REF_DECL (x);
1490
1491   if (!decl)
1492     return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1493
1494   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1495      or weak symbols.  Relocations in the object file will be against
1496      the target symbol, so it's that symbol's binding that matters here.  */
1497   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1498 }
1499
1500 /* Return true if function X is a libgcc MIPS16 stub function.  */
1501
1502 static bool
1503 mips16_stub_function_p (const_rtx x)
1504 {
1505   return (GET_CODE (x) == SYMBOL_REF
1506           && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1507 }
1508
1509 /* Return true if function X is a locally-defined and locally-binding
1510    MIPS16 function.  */
1511
1512 static bool
1513 mips16_local_function_p (const_rtx x)
1514 {
1515   return (GET_CODE (x) == SYMBOL_REF
1516           && SYMBOL_REF_LOCAL_P (x)
1517           && !SYMBOL_REF_EXTERNAL_P (x)
1518           && mips_use_mips16_mode_p (SYMBOL_REF_DECL (x)));
1519 }
1520
1521 /* Return true if SYMBOL_REF X binds locally.  */
1522
1523 static bool
1524 mips_symbol_binds_local_p (const_rtx x)
1525 {
1526   return (SYMBOL_REF_DECL (x)
1527           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1528           : SYMBOL_REF_LOCAL_P (x));
1529 }
1530
1531 /* Return true if rtx constants of mode MODE should be put into a small
1532    data section.  */
1533
1534 static bool
1535 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1536 {
1537   return (!TARGET_EMBEDDED_DATA
1538           && TARGET_LOCAL_SDATA
1539           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1540 }
1541
1542 /* Return true if X should not be moved directly into register $25.
1543    We need this because many versions of GAS will treat "la $25,foo" as
1544    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1545
1546 bool
1547 mips_dangerous_for_la25_p (rtx x)
1548 {
1549   return (!TARGET_EXPLICIT_RELOCS
1550           && TARGET_USE_GOT
1551           && GET_CODE (x) == SYMBOL_REF
1552           && mips_global_symbol_p (x));
1553 }
1554
1555 /* Return true if calls to X might need $25 to be valid on entry.  */
1556
1557 bool
1558 mips_use_pic_fn_addr_reg_p (const_rtx x)
1559 {
1560   if (!TARGET_USE_PIC_FN_ADDR_REG)
1561     return false;
1562
1563   /* MIPS16 stub functions are guaranteed not to use $25.  */
1564   if (mips16_stub_function_p (x))
1565     return false;
1566
1567   if (GET_CODE (x) == SYMBOL_REF)
1568     {
1569       /* If PLTs and copy relocations are available, the static linker
1570          will make sure that $25 is valid on entry to the target function.  */
1571       if (TARGET_ABICALLS_PIC0)
1572         return false;
1573
1574       /* Locally-defined functions use absolute accesses to set up
1575          the global pointer.  */
1576       if (TARGET_ABSOLUTE_ABICALLS
1577           && mips_symbol_binds_local_p (x)
1578           && !SYMBOL_REF_EXTERNAL_P (x))
1579         return false;
1580     }
1581
1582   return true;
1583 }
1584
1585 /* Return the method that should be used to access SYMBOL_REF or
1586    LABEL_REF X in context CONTEXT.  */
1587
1588 static enum mips_symbol_type
1589 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1590 {
1591   if (TARGET_RTP_PIC)
1592     return SYMBOL_GOT_DISP;
1593
1594   if (GET_CODE (x) == LABEL_REF)
1595     {
1596       /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1597          code and if we know that the label is in the current function's
1598          text section.  LABEL_REFs are used for jump tables as well as
1599          text labels, so we must check whether jump tables live in the
1600          text section.  */
1601       if (TARGET_MIPS16_SHORT_JUMP_TABLES
1602           && !LABEL_REF_NONLOCAL_P (x))
1603         return SYMBOL_PC_RELATIVE;
1604
1605       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1606         return SYMBOL_GOT_PAGE_OFST;
1607
1608       return SYMBOL_ABSOLUTE;
1609     }
1610
1611   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1612
1613   if (SYMBOL_REF_TLS_MODEL (x))
1614     return SYMBOL_TLS;
1615
1616   if (CONSTANT_POOL_ADDRESS_P (x))
1617     {
1618       if (TARGET_MIPS16_TEXT_LOADS)
1619         return SYMBOL_PC_RELATIVE;
1620
1621       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1622         return SYMBOL_PC_RELATIVE;
1623
1624       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1625         return SYMBOL_GP_RELATIVE;
1626     }
1627
1628   /* Do not use small-data accesses for weak symbols; they may end up
1629      being zero.  */
1630   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1631     return SYMBOL_GP_RELATIVE;
1632
1633   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1634      is in effect.  */
1635   if (TARGET_ABICALLS_PIC2
1636       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1637     {
1638       /* There are three cases to consider:
1639
1640             - o32 PIC (either with or without explicit relocs)
1641             - n32/n64 PIC without explicit relocs
1642             - n32/n64 PIC with explicit relocs
1643
1644          In the first case, both local and global accesses will use an
1645          R_MIPS_GOT16 relocation.  We must correctly predict which of
1646          the two semantics (local or global) the assembler and linker
1647          will apply.  The choice depends on the symbol's binding rather
1648          than its visibility.
1649
1650          In the second case, the assembler will not use R_MIPS_GOT16
1651          relocations, but it chooses between local and global accesses
1652          in the same way as for o32 PIC.
1653
1654          In the third case we have more freedom since both forms of
1655          access will work for any kind of symbol.  However, there seems
1656          little point in doing things differently.  */
1657       if (mips_global_symbol_p (x))
1658         return SYMBOL_GOT_DISP;
1659
1660       return SYMBOL_GOT_PAGE_OFST;
1661     }
1662
1663   return SYMBOL_ABSOLUTE;
1664 }
1665
1666 /* Classify the base of symbolic expression X, given that X appears in
1667    context CONTEXT.  */
1668
1669 static enum mips_symbol_type
1670 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1671 {
1672   rtx offset;
1673
1674   split_const (x, &x, &offset);
1675   if (UNSPEC_ADDRESS_P (x))
1676     return UNSPEC_ADDRESS_TYPE (x);
1677
1678   return mips_classify_symbol (x, context);
1679 }
1680
1681 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1682    is the alignment in bytes of SYMBOL_REF X.  */
1683
1684 static bool
1685 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1686 {
1687   HOST_WIDE_INT align;
1688
1689   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1690   return IN_RANGE (offset, 0, align - 1);
1691 }
1692
1693 /* Return true if X is a symbolic constant that can be used in context
1694    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1695
1696 bool
1697 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1698                           enum mips_symbol_type *symbol_type)
1699 {
1700   rtx offset;
1701
1702   split_const (x, &x, &offset);
1703   if (UNSPEC_ADDRESS_P (x))
1704     {
1705       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1706       x = UNSPEC_ADDRESS (x);
1707     }
1708   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1709     {
1710       *symbol_type = mips_classify_symbol (x, context);
1711       if (*symbol_type == SYMBOL_TLS)
1712         return false;
1713     }
1714   else
1715     return false;
1716
1717   if (offset == const0_rtx)
1718     return true;
1719
1720   /* Check whether a nonzero offset is valid for the underlying
1721      relocations.  */
1722   switch (*symbol_type)
1723     {
1724     case SYMBOL_ABSOLUTE:
1725     case SYMBOL_64_HIGH:
1726     case SYMBOL_64_MID:
1727     case SYMBOL_64_LOW:
1728       /* If the target has 64-bit pointers and the object file only
1729          supports 32-bit symbols, the values of those symbols will be
1730          sign-extended.  In this case we can't allow an arbitrary offset
1731          in case the 32-bit value X + OFFSET has a different sign from X.  */
1732       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1733         return offset_within_block_p (x, INTVAL (offset));
1734
1735       /* In other cases the relocations can handle any offset.  */
1736       return true;
1737
1738     case SYMBOL_PC_RELATIVE:
1739       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1740          In this case, we no longer have access to the underlying constant,
1741          but the original symbol-based access was known to be valid.  */
1742       if (GET_CODE (x) == LABEL_REF)
1743         return true;
1744
1745       /* Fall through.  */
1746
1747     case SYMBOL_GP_RELATIVE:
1748       /* Make sure that the offset refers to something within the
1749          same object block.  This should guarantee that the final
1750          PC- or GP-relative offset is within the 16-bit limit.  */
1751       return offset_within_block_p (x, INTVAL (offset));
1752
1753     case SYMBOL_GOT_PAGE_OFST:
1754     case SYMBOL_GOTOFF_PAGE:
1755       /* If the symbol is global, the GOT entry will contain the symbol's
1756          address, and we will apply a 16-bit offset after loading it.
1757          If the symbol is local, the linker should provide enough local
1758          GOT entries for a 16-bit offset, but larger offsets may lead
1759          to GOT overflow.  */
1760       return SMALL_INT (offset);
1761
1762     case SYMBOL_TPREL:
1763     case SYMBOL_DTPREL:
1764       /* There is no carry between the HI and LO REL relocations, so the
1765          offset is only valid if we know it won't lead to such a carry.  */
1766       return mips_offset_within_alignment_p (x, INTVAL (offset));
1767
1768     case SYMBOL_GOT_DISP:
1769     case SYMBOL_GOTOFF_DISP:
1770     case SYMBOL_GOTOFF_CALL:
1771     case SYMBOL_GOTOFF_LOADGP:
1772     case SYMBOL_TLSGD:
1773     case SYMBOL_TLSLDM:
1774     case SYMBOL_GOTTPREL:
1775     case SYMBOL_TLS:
1776     case SYMBOL_HALF:
1777       return false;
1778     }
1779   gcc_unreachable ();
1780 }
1781 \f
1782 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1783    single instruction.  We rely on the fact that, in the worst case,
1784    all instructions involved in a MIPS16 address calculation are usually
1785    extended ones.  */
1786
1787 static int
1788 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1789 {
1790   if (mips_use_pcrel_pool_p[(int) type])
1791     {
1792       if (mode == MAX_MACHINE_MODE)
1793         /* LEAs will be converted into constant-pool references by
1794            mips_reorg.  */
1795         type = SYMBOL_PC_RELATIVE;
1796       else
1797         /* The constant must be loaded and then dereferenced.  */
1798         return 0;
1799     }
1800
1801   switch (type)
1802     {
1803     case SYMBOL_ABSOLUTE:
1804       /* When using 64-bit symbols, we need 5 preparatory instructions,
1805          such as:
1806
1807              lui     $at,%highest(symbol)
1808              daddiu  $at,$at,%higher(symbol)
1809              dsll    $at,$at,16
1810              daddiu  $at,$at,%hi(symbol)
1811              dsll    $at,$at,16
1812
1813          The final address is then $at + %lo(symbol).  With 32-bit
1814          symbols we just need a preparatory LUI for normal mode and
1815          a preparatory LI and SLL for MIPS16.  */
1816       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1817
1818     case SYMBOL_GP_RELATIVE:
1819       /* Treat GP-relative accesses as taking a single instruction on
1820          MIPS16 too; the copy of $gp can often be shared.  */
1821       return 1;
1822
1823     case SYMBOL_PC_RELATIVE:
1824       /* PC-relative constants can be only be used with ADDIUPC,
1825          DADDIUPC, LWPC and LDPC.  */
1826       if (mode == MAX_MACHINE_MODE
1827           || GET_MODE_SIZE (mode) == 4
1828           || GET_MODE_SIZE (mode) == 8)
1829         return 1;
1830
1831       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1832       return 0;
1833
1834     case SYMBOL_GOT_DISP:
1835       /* The constant will have to be loaded from the GOT before it
1836          is used in an address.  */
1837       if (mode != MAX_MACHINE_MODE)
1838         return 0;
1839
1840       /* Fall through.  */
1841
1842     case SYMBOL_GOT_PAGE_OFST:
1843       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1844          local/global classification is accurate.  The worst cases are:
1845
1846          (1) For local symbols when generating o32 or o64 code.  The assembler
1847              will use:
1848
1849                  lw           $at,%got(symbol)
1850                  nop
1851
1852              ...and the final address will be $at + %lo(symbol).
1853
1854          (2) For global symbols when -mxgot.  The assembler will use:
1855
1856                  lui     $at,%got_hi(symbol)
1857                  (d)addu $at,$at,$gp
1858
1859              ...and the final address will be $at + %got_lo(symbol).  */
1860       return 3;
1861
1862     case SYMBOL_GOTOFF_PAGE:
1863     case SYMBOL_GOTOFF_DISP:
1864     case SYMBOL_GOTOFF_CALL:
1865     case SYMBOL_GOTOFF_LOADGP:
1866     case SYMBOL_64_HIGH:
1867     case SYMBOL_64_MID:
1868     case SYMBOL_64_LOW:
1869     case SYMBOL_TLSGD:
1870     case SYMBOL_TLSLDM:
1871     case SYMBOL_DTPREL:
1872     case SYMBOL_GOTTPREL:
1873     case SYMBOL_TPREL:
1874     case SYMBOL_HALF:
1875       /* A 16-bit constant formed by a single relocation, or a 32-bit
1876          constant formed from a high 16-bit relocation and a low 16-bit
1877          relocation.  Use mips_split_p to determine which.  32-bit
1878          constants need an "lui; addiu" sequence for normal mode and
1879          an "li; sll; addiu" sequence for MIPS16 mode.  */
1880       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1881
1882     case SYMBOL_TLS:
1883       /* We don't treat a bare TLS symbol as a constant.  */
1884       return 0;
1885     }
1886   gcc_unreachable ();
1887 }
1888
1889 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1890    to load symbols of type TYPE into a register.  Return 0 if the given
1891    type of symbol cannot be used as an immediate operand.
1892
1893    Otherwise, return the number of instructions needed to load or store
1894    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1895    the given type of symbol is not valid in addresses.
1896
1897    In both cases, treat extended MIPS16 instructions as two instructions.  */
1898
1899 static int
1900 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1901 {
1902   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1903 }
1904 \f
1905 /* A for_each_rtx callback.  Stop the search if *X references a
1906    thread-local symbol.  */
1907
1908 static int
1909 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1910 {
1911   return mips_tls_symbol_p (*x);
1912 }
1913
1914 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1915
1916 static bool
1917 mips_cannot_force_const_mem (enum machine_mode mode, rtx x)
1918 {
1919   enum mips_symbol_type type;
1920   rtx base, offset;
1921
1922   /* There is no assembler syntax for expressing an address-sized
1923      high part.  */
1924   if (GET_CODE (x) == HIGH)
1925     return true;
1926
1927   /* As an optimization, reject constants that mips_legitimize_move
1928      can expand inline.
1929
1930      Suppose we have a multi-instruction sequence that loads constant C
1931      into register R.  If R does not get allocated a hard register, and
1932      R is used in an operand that allows both registers and memory
1933      references, reload will consider forcing C into memory and using
1934      one of the instruction's memory alternatives.  Returning false
1935      here will force it to use an input reload instead.  */
1936   if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x))
1937     return true;
1938
1939   split_const (x, &base, &offset);
1940   if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type))
1941     {
1942       /* See whether we explicitly want these symbols in the pool.  */
1943       if (mips_use_pcrel_pool_p[(int) type])
1944         return false;
1945
1946       /* The same optimization as for CONST_INT.  */
1947       if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
1948         return true;
1949
1950       /* If MIPS16 constant pools live in the text section, they should
1951          not refer to anything that might need run-time relocation.  */
1952       if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
1953         return true;
1954     }
1955
1956   /* TLS symbols must be computed by mips_legitimize_move.  */
1957   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
1958     return true;
1959
1960   return false;
1961 }
1962
1963 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
1964    constants when we're using a per-function constant pool.  */
1965
1966 static bool
1967 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
1968                                 const_rtx x ATTRIBUTE_UNUSED)
1969 {
1970   return !TARGET_MIPS16_PCREL_LOADS;
1971 }
1972 \f
1973 /* Return true if register REGNO is a valid base register for mode MODE.
1974    STRICT_P is true if REG_OK_STRICT is in effect.  */
1975
1976 int
1977 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
1978                                bool strict_p)
1979 {
1980   if (!HARD_REGISTER_NUM_P (regno))
1981     {
1982       if (!strict_p)
1983         return true;
1984       regno = reg_renumber[regno];
1985     }
1986
1987   /* These fake registers will be eliminated to either the stack or
1988      hard frame pointer, both of which are usually valid base registers.
1989      Reload deals with the cases where the eliminated form isn't valid.  */
1990   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
1991     return true;
1992
1993   /* In MIPS16 mode, the stack pointer can only address word and doubleword
1994      values, nothing smaller.  There are two problems here:
1995
1996        (a) Instantiating virtual registers can introduce new uses of the
1997            stack pointer.  If these virtual registers are valid addresses,
1998            the stack pointer should be too.
1999
2000        (b) Most uses of the stack pointer are not made explicit until
2001            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2002            We don't know until that stage whether we'll be eliminating to the
2003            stack pointer (which needs the restriction) or the hard frame
2004            pointer (which doesn't).
2005
2006      All in all, it seems more consistent to only enforce this restriction
2007      during and after reload.  */
2008   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2009     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2010
2011   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2012 }
2013
2014 /* Return true if X is a valid base register for mode MODE.
2015    STRICT_P is true if REG_OK_STRICT is in effect.  */
2016
2017 static bool
2018 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2019 {
2020   if (!strict_p && GET_CODE (x) == SUBREG)
2021     x = SUBREG_REG (x);
2022
2023   return (REG_P (x)
2024           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2025 }
2026
2027 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2028    can address a value of mode MODE.  */
2029
2030 static bool
2031 mips_valid_offset_p (rtx x, enum machine_mode mode)
2032 {
2033   /* Check that X is a signed 16-bit number.  */
2034   if (!const_arith_operand (x, Pmode))
2035     return false;
2036
2037   /* We may need to split multiword moves, so make sure that every word
2038      is accessible.  */
2039   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2040       && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2041     return false;
2042
2043   return true;
2044 }
2045
2046 /* Return true if a LO_SUM can address a value of mode MODE when the
2047    LO_SUM symbol has type SYMBOL_TYPE.  */
2048
2049 static bool
2050 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2051 {
2052   /* Check that symbols of type SYMBOL_TYPE can be used to access values
2053      of mode MODE.  */
2054   if (mips_symbol_insns (symbol_type, mode) == 0)
2055     return false;
2056
2057   /* Check that there is a known low-part relocation.  */
2058   if (mips_lo_relocs[symbol_type] == NULL)
2059     return false;
2060
2061   /* We may need to split multiword moves, so make sure that each word
2062      can be accessed without inducing a carry.  This is mainly needed
2063      for o64, which has historically only guaranteed 64-bit alignment
2064      for 128-bit types.  */
2065   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2066       && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2067     return false;
2068
2069   return true;
2070 }
2071
2072 /* Return true if X is a valid address for machine mode MODE.  If it is,
2073    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2074    effect.  */
2075
2076 static bool
2077 mips_classify_address (struct mips_address_info *info, rtx x,
2078                        enum machine_mode mode, bool strict_p)
2079 {
2080   switch (GET_CODE (x))
2081     {
2082     case REG:
2083     case SUBREG:
2084       info->type = ADDRESS_REG;
2085       info->reg = x;
2086       info->offset = const0_rtx;
2087       return mips_valid_base_register_p (info->reg, mode, strict_p);
2088
2089     case PLUS:
2090       info->type = ADDRESS_REG;
2091       info->reg = XEXP (x, 0);
2092       info->offset = XEXP (x, 1);
2093       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2094               && mips_valid_offset_p (info->offset, mode));
2095
2096     case LO_SUM:
2097       info->type = ADDRESS_LO_SUM;
2098       info->reg = XEXP (x, 0);
2099       info->offset = XEXP (x, 1);
2100       /* We have to trust the creator of the LO_SUM to do something vaguely
2101          sane.  Target-independent code that creates a LO_SUM should also
2102          create and verify the matching HIGH.  Target-independent code that
2103          adds an offset to a LO_SUM must prove that the offset will not
2104          induce a carry.  Failure to do either of these things would be
2105          a bug, and we are not required to check for it here.  The MIPS
2106          backend itself should only create LO_SUMs for valid symbolic
2107          constants, with the high part being either a HIGH or a copy
2108          of _gp. */
2109       info->symbol_type
2110         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2111       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2112               && mips_valid_lo_sum_p (info->symbol_type, mode));
2113
2114     case CONST_INT:
2115       /* Small-integer addresses don't occur very often, but they
2116          are legitimate if $0 is a valid base register.  */
2117       info->type = ADDRESS_CONST_INT;
2118       return !TARGET_MIPS16 && SMALL_INT (x);
2119
2120     case CONST:
2121     case LABEL_REF:
2122     case SYMBOL_REF:
2123       info->type = ADDRESS_SYMBOLIC;
2124       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2125                                         &info->symbol_type)
2126               && mips_symbol_insns (info->symbol_type, mode) > 0
2127               && !mips_split_p[info->symbol_type]);
2128
2129     default:
2130       return false;
2131     }
2132 }
2133
2134 /* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
2135
2136 static bool
2137 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2138 {
2139   struct mips_address_info addr;
2140
2141   return mips_classify_address (&addr, x, mode, strict_p);
2142 }
2143
2144 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2145
2146 bool
2147 mips_stack_address_p (rtx x, enum machine_mode mode)
2148 {
2149   struct mips_address_info addr;
2150
2151   return (mips_classify_address (&addr, x, mode, false)
2152           && addr.type == ADDRESS_REG
2153           && addr.reg == stack_pointer_rtx);
2154 }
2155
2156 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2157    address instruction.  Note that such addresses are not considered
2158    legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2159    is so restricted.  */
2160
2161 static bool
2162 mips_lwxs_address_p (rtx addr)
2163 {
2164   if (ISA_HAS_LWXS
2165       && GET_CODE (addr) == PLUS
2166       && REG_P (XEXP (addr, 1)))
2167     {
2168       rtx offset = XEXP (addr, 0);
2169       if (GET_CODE (offset) == MULT
2170           && REG_P (XEXP (offset, 0))
2171           && CONST_INT_P (XEXP (offset, 1))
2172           && INTVAL (XEXP (offset, 1)) == 4)
2173         return true;
2174     }
2175   return false;
2176 }
2177
2178 /* Return true if ADDR matches the pattern for the L{B,H,W,D}{,U}X load 
2179    indexed address instruction.  Note that such addresses are
2180    not considered legitimate in the TARGET_LEGITIMATE_ADDRESS_P
2181    sense, because their use is so restricted.  */
2182
2183 static bool
2184 mips_lx_address_p (rtx addr, enum machine_mode mode)
2185 {
2186   if (GET_CODE (addr) != PLUS
2187       || !REG_P (XEXP (addr, 0))
2188       || !REG_P (XEXP (addr, 1)))
2189     return false;
2190   if (ISA_HAS_LBX && mode == QImode)
2191     return true;
2192   if (ISA_HAS_LHX && mode == HImode)
2193     return true;
2194   if (ISA_HAS_LWX && mode == SImode)
2195     return true;
2196   if (ISA_HAS_LDX && mode == DImode)
2197     return true;
2198   return false;
2199 }
2200 \f
2201 /* Return true if a value at OFFSET bytes from base register BASE can be
2202    accessed using an unextended MIPS16 instruction.  MODE is the mode of
2203    the value.
2204
2205    Usually the offset in an unextended instruction is a 5-bit field.
2206    The offset is unsigned and shifted left once for LH and SH, twice
2207    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2208    an 8-bit immediate field that's shifted left twice.  */
2209
2210 static bool
2211 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2212                                unsigned HOST_WIDE_INT offset)
2213 {
2214   if (mode != BLKmode && offset % GET_MODE_SIZE (mode) == 0)
2215     {
2216       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2217         return offset < 256U * GET_MODE_SIZE (mode);
2218       return offset < 32U * GET_MODE_SIZE (mode);
2219     }
2220   return false;
2221 }
2222
2223 /* Return the number of instructions needed to load or store a value
2224    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
2225    Assume that multiword moves may need to be split into word moves
2226    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2227    enough.
2228
2229    For MIPS16 code, count extended instructions as two instructions.  */
2230
2231 int
2232 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2233 {
2234   struct mips_address_info addr;
2235   int factor;
2236
2237   /* BLKmode is used for single unaligned loads and stores and should
2238      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2239      meaningless, so we have to single it out as a special case one way
2240      or the other.)  */
2241   if (mode != BLKmode && might_split_p)
2242     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2243   else
2244     factor = 1;
2245
2246   if (mips_classify_address (&addr, x, mode, false))
2247     switch (addr.type)
2248       {
2249       case ADDRESS_REG:
2250         if (TARGET_MIPS16
2251             && !mips16_unextended_reference_p (mode, addr.reg,
2252                                                UINTVAL (addr.offset)))
2253           return factor * 2;
2254         return factor;
2255
2256       case ADDRESS_LO_SUM:
2257         return TARGET_MIPS16 ? factor * 2 : factor;
2258
2259       case ADDRESS_CONST_INT:
2260         return factor;
2261
2262       case ADDRESS_SYMBOLIC:
2263         return factor * mips_symbol_insns (addr.symbol_type, mode);
2264       }
2265   return 0;
2266 }
2267
2268 /* Return the number of instructions needed to load constant X.
2269    Return 0 if X isn't a valid constant.  */
2270
2271 int
2272 mips_const_insns (rtx x)
2273 {
2274   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2275   enum mips_symbol_type symbol_type;
2276   rtx offset;
2277
2278   switch (GET_CODE (x))
2279     {
2280     case HIGH:
2281       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2282                                      &symbol_type)
2283           || !mips_split_p[symbol_type])
2284         return 0;
2285
2286       /* This is simply an LUI for normal mode.  It is an extended
2287          LI followed by an extended SLL for MIPS16.  */
2288       return TARGET_MIPS16 ? 4 : 1;
2289
2290     case CONST_INT:
2291       if (TARGET_MIPS16)
2292         /* Unsigned 8-bit constants can be loaded using an unextended
2293            LI instruction.  Unsigned 16-bit constants can be loaded
2294            using an extended LI.  Negative constants must be loaded
2295            using LI and then negated.  */
2296         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2297                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2298                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2299                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2300                 : 0);
2301
2302       return mips_build_integer (codes, INTVAL (x));
2303
2304     case CONST_DOUBLE:
2305     case CONST_VECTOR:
2306       /* Allow zeros for normal mode, where we can use $0.  */
2307       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2308
2309     case CONST:
2310       if (CONST_GP_P (x))
2311         return 1;
2312
2313       /* See if we can refer to X directly.  */
2314       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2315         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2316
2317       /* Otherwise try splitting the constant into a base and offset.
2318          If the offset is a 16-bit value, we can load the base address
2319          into a register and then use (D)ADDIU to add in the offset.
2320          If the offset is larger, we can load the base and offset
2321          into separate registers and add them together with (D)ADDU.
2322          However, the latter is only possible before reload; during
2323          and after reload, we must have the option of forcing the
2324          constant into the pool instead.  */
2325       split_const (x, &x, &offset);
2326       if (offset != 0)
2327         {
2328           int n = mips_const_insns (x);
2329           if (n != 0)
2330             {
2331               if (SMALL_INT (offset))
2332                 return n + 1;
2333               else if (!targetm.cannot_force_const_mem (GET_MODE (x), x))
2334                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2335             }
2336         }
2337       return 0;
2338
2339     case SYMBOL_REF:
2340     case LABEL_REF:
2341       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2342                                 MAX_MACHINE_MODE);
2343
2344     default:
2345       return 0;
2346     }
2347 }
2348
2349 /* X is a doubleword constant that can be handled by splitting it into
2350    two words and loading each word separately.  Return the number of
2351    instructions required to do this.  */
2352
2353 int
2354 mips_split_const_insns (rtx x)
2355 {
2356   unsigned int low, high;
2357
2358   low = mips_const_insns (mips_subword (x, false));
2359   high = mips_const_insns (mips_subword (x, true));
2360   gcc_assert (low > 0 && high > 0);
2361   return low + high;
2362 }
2363
2364 /* Return the number of instructions needed to implement INSN,
2365    given that it loads from or stores to MEM.  Count extended
2366    MIPS16 instructions as two instructions.  */
2367
2368 int
2369 mips_load_store_insns (rtx mem, rtx insn)
2370 {
2371   enum machine_mode mode;
2372   bool might_split_p;
2373   rtx set;
2374
2375   gcc_assert (MEM_P (mem));
2376   mode = GET_MODE (mem);
2377
2378   /* Try to prove that INSN does not need to be split.  */
2379   might_split_p = true;
2380   if (GET_MODE_BITSIZE (mode) == 64)
2381     {
2382       set = single_set (insn);
2383       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2384         might_split_p = false;
2385     }
2386
2387   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2388 }
2389
2390 /* Return the number of instructions needed for an integer division.  */
2391
2392 int
2393 mips_idiv_insns (void)
2394 {
2395   int count;
2396
2397   count = 1;
2398   if (TARGET_CHECK_ZERO_DIV)
2399     {
2400       if (GENERATE_DIVIDE_TRAPS)
2401         count++;
2402       else
2403         count += 2;
2404     }
2405
2406   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2407     count++;
2408   return count;
2409 }
2410 \f
2411 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2412    handle all moves if !can_create_pseudo_p ().  The distinction is
2413    important because, unlike emit_move_insn, the move expanders know
2414    how to force Pmode objects into the constant pool even when the
2415    constant pool address is not itself legitimate.  */
2416
2417 rtx
2418 mips_emit_move (rtx dest, rtx src)
2419 {
2420   return (can_create_pseudo_p ()
2421           ? emit_move_insn (dest, src)
2422           : emit_move_insn_1 (dest, src));
2423 }
2424
2425 /* Emit an instruction of the form (set TARGET (CODE OP0)).  */
2426
2427 static void
2428 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2429 {
2430   emit_insn (gen_rtx_SET (VOIDmode, target,
2431                           gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2432 }
2433
2434 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2435    Return that new register.  */
2436
2437 static rtx
2438 mips_force_unary (enum machine_mode mode, enum rtx_code code, rtx op0)
2439 {
2440   rtx reg;
2441
2442   reg = gen_reg_rtx (mode);
2443   mips_emit_unary (code, reg, op0);
2444   return reg;
2445 }
2446
2447 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2448
2449 void
2450 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2451 {
2452   emit_insn (gen_rtx_SET (VOIDmode, target,
2453                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2454 }
2455
2456 /* Compute (CODE OP0 OP1) and store the result in a new register
2457    of mode MODE.  Return that new register.  */
2458
2459 static rtx
2460 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2461 {
2462   rtx reg;
2463
2464   reg = gen_reg_rtx (mode);
2465   mips_emit_binary (code, reg, op0, op1);
2466   return reg;
2467 }
2468
2469 /* Copy VALUE to a register and return that register.  If new pseudos
2470    are allowed, copy it into a new register, otherwise use DEST.  */
2471
2472 static rtx
2473 mips_force_temporary (rtx dest, rtx value)
2474 {
2475   if (can_create_pseudo_p ())
2476     return force_reg (Pmode, value);
2477   else
2478     {
2479       mips_emit_move (dest, value);
2480       return dest;
2481     }
2482 }
2483
2484 /* Emit a call sequence with call pattern PATTERN and return the call
2485    instruction itself (which is not necessarily the last instruction
2486    emitted).  ORIG_ADDR is the original, unlegitimized address,
2487    ADDR is the legitimized form, and LAZY_P is true if the call
2488    address is lazily-bound.  */
2489
2490 static rtx
2491 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2492 {
2493   rtx insn, reg;
2494
2495   insn = emit_call_insn (pattern);
2496
2497   if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2498     {
2499       /* MIPS16 JALRs only take MIPS16 registers.  If the target
2500          function requires $25 to be valid on entry, we must copy it
2501          there separately.  The move instruction can be put in the
2502          call's delay slot.  */
2503       reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2504       emit_insn_before (gen_move_insn (reg, addr), insn);
2505       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2506     }
2507
2508   if (lazy_p)
2509     /* Lazy-binding stubs require $gp to be valid on entry.  */
2510     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2511
2512   if (TARGET_USE_GOT)
2513     {
2514       /* See the comment above load_call<mode> for details.  */
2515       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2516                gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2517       emit_insn (gen_update_got_version ());
2518     }
2519   return insn;
2520 }
2521 \f
2522 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2523    then add CONST_INT OFFSET to the result.  */
2524
2525 static rtx
2526 mips_unspec_address_offset (rtx base, rtx offset,
2527                             enum mips_symbol_type symbol_type)
2528 {
2529   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2530                          UNSPEC_ADDRESS_FIRST + symbol_type);
2531   if (offset != const0_rtx)
2532     base = gen_rtx_PLUS (Pmode, base, offset);
2533   return gen_rtx_CONST (Pmode, base);
2534 }
2535
2536 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2537    type SYMBOL_TYPE.  */
2538
2539 rtx
2540 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2541 {
2542   rtx base, offset;
2543
2544   split_const (address, &base, &offset);
2545   return mips_unspec_address_offset (base, offset, symbol_type);
2546 }
2547
2548 /* If OP is an UNSPEC address, return the address to which it refers,
2549    otherwise return OP itself.  */
2550
2551 static rtx
2552 mips_strip_unspec_address (rtx op)
2553 {
2554   rtx base, offset;
2555
2556   split_const (op, &base, &offset);
2557   if (UNSPEC_ADDRESS_P (base))
2558     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
2559   return op;
2560 }
2561
2562 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2563    high part to BASE and return the result.  Just return BASE otherwise.
2564    TEMP is as for mips_force_temporary.
2565
2566    The returned expression can be used as the first operand to a LO_SUM.  */
2567
2568 static rtx
2569 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2570                          enum mips_symbol_type symbol_type)
2571 {
2572   if (mips_split_p[symbol_type])
2573     {
2574       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2575       addr = mips_force_temporary (temp, addr);
2576       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2577     }
2578   return base;
2579 }
2580 \f
2581 /* Return an instruction that copies $gp into register REG.  We want
2582    GCC to treat the register's value as constant, so that its value
2583    can be rematerialized on demand.  */
2584
2585 static rtx
2586 gen_load_const_gp (rtx reg)
2587 {
2588   return PMODE_INSN (gen_load_const_gp, (reg));
2589 }
2590
2591 /* Return a pseudo register that contains the value of $gp throughout
2592    the current function.  Such registers are needed by MIPS16 functions,
2593    for which $gp itself is not a valid base register or addition operand.  */
2594
2595 static rtx
2596 mips16_gp_pseudo_reg (void)
2597 {
2598   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2599     {
2600       rtx insn, scan;
2601
2602       cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2603
2604       push_topmost_sequence ();
2605
2606       scan = get_insns ();
2607       while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2608         scan = NEXT_INSN (scan);
2609
2610       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2611       emit_insn_after (insn, scan);
2612
2613       pop_topmost_sequence ();
2614     }
2615
2616   return cfun->machine->mips16_gp_pseudo_rtx;
2617 }
2618
2619 /* Return a base register that holds pic_offset_table_rtx.
2620    TEMP, if nonnull, is a scratch Pmode base register.  */
2621
2622 rtx
2623 mips_pic_base_register (rtx temp)
2624 {
2625   if (!TARGET_MIPS16)
2626     return pic_offset_table_rtx;
2627
2628   if (currently_expanding_to_rtl)
2629     return mips16_gp_pseudo_reg ();
2630
2631   if (can_create_pseudo_p ())
2632     temp = gen_reg_rtx (Pmode);
2633
2634   if (TARGET_USE_GOT)
2635     /* The first post-reload split exposes all references to $gp
2636        (both uses and definitions).  All references must remain
2637        explicit after that point.
2638
2639        It is safe to introduce uses of $gp at any time, so for
2640        simplicity, we do that before the split too.  */
2641     mips_emit_move (temp, pic_offset_table_rtx);
2642   else
2643     emit_insn (gen_load_const_gp (temp));
2644   return temp;
2645 }
2646
2647 /* Return the RHS of a load_call<mode> insn.  */
2648
2649 static rtx
2650 mips_unspec_call (rtx reg, rtx symbol)
2651 {
2652   rtvec vec;
2653
2654   vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2655   return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2656 }
2657
2658 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2659    reference.  Return NULL_RTX otherwise.  */
2660
2661 static rtx
2662 mips_strip_unspec_call (rtx src)
2663 {
2664   if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2665     return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2666   return NULL_RTX;
2667 }
2668
2669 /* Create and return a GOT reference of type TYPE for address ADDR.
2670    TEMP, if nonnull, is a scratch Pmode base register.  */
2671
2672 rtx
2673 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2674 {
2675   rtx base, high, lo_sum_symbol;
2676
2677   base = mips_pic_base_register (temp);
2678
2679   /* If we used the temporary register to load $gp, we can't use
2680      it for the high part as well.  */
2681   if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2682     temp = NULL;
2683
2684   high = mips_unspec_offset_high (temp, base, addr, type);
2685   lo_sum_symbol = mips_unspec_address (addr, type);
2686
2687   if (type == SYMBOL_GOTOFF_CALL)
2688     return mips_unspec_call (high, lo_sum_symbol);
2689   else
2690     return PMODE_INSN (gen_unspec_got, (high, lo_sum_symbol));
2691 }
2692
2693 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2694    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2695    constant in that context and can be split into high and low parts.
2696    If so, and if LOW_OUT is nonnull, emit the high part and store the
2697    low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
2698
2699    TEMP is as for mips_force_temporary and is used to load the high
2700    part into a register.
2701
2702    When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2703    a legitimize SET_SRC for an .md pattern, otherwise the low part
2704    is guaranteed to be a legitimate address for mode MODE.  */
2705
2706 bool
2707 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2708 {
2709   enum mips_symbol_context context;
2710   enum mips_symbol_type symbol_type;
2711   rtx high;
2712
2713   context = (mode == MAX_MACHINE_MODE
2714              ? SYMBOL_CONTEXT_LEA
2715              : SYMBOL_CONTEXT_MEM);
2716   if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2717     {
2718       addr = XEXP (addr, 0);
2719       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2720           && mips_symbol_insns (symbol_type, mode) > 0
2721           && mips_split_hi_p[symbol_type])
2722         {
2723           if (low_out)
2724             switch (symbol_type)
2725               {
2726               case SYMBOL_GOT_PAGE_OFST:
2727                 /* The high part of a page/ofst pair is loaded from the GOT.  */
2728                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2729                 break;
2730
2731               default:
2732                 gcc_unreachable ();
2733               }
2734           return true;
2735         }
2736     }
2737   else
2738     {
2739       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2740           && mips_symbol_insns (symbol_type, mode) > 0
2741           && mips_split_p[symbol_type])
2742         {
2743           if (low_out)
2744             switch (symbol_type)
2745               {
2746               case SYMBOL_GOT_DISP:
2747                 /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
2748                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2749                 break;
2750
2751               case SYMBOL_GP_RELATIVE:
2752                 high = mips_pic_base_register (temp);
2753                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2754                 break;
2755
2756               default:
2757                 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2758                 high = mips_force_temporary (temp, high);
2759                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2760                 break;
2761               }
2762           return true;
2763         }
2764     }
2765   return false;
2766 }
2767
2768 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2769    mips_force_temporary; it is only needed when OFFSET is not a
2770    SMALL_OPERAND.  */
2771
2772 static rtx
2773 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2774 {
2775   if (!SMALL_OPERAND (offset))
2776     {
2777       rtx high;
2778
2779       if (TARGET_MIPS16)
2780         {
2781           /* Load the full offset into a register so that we can use
2782              an unextended instruction for the address itself.  */
2783           high = GEN_INT (offset);
2784           offset = 0;
2785         }
2786       else
2787         {
2788           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
2789              The addition inside the macro CONST_HIGH_PART may cause an
2790              overflow, so we need to force a sign-extension check.  */
2791           high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
2792           offset = CONST_LOW_PART (offset);
2793         }
2794       high = mips_force_temporary (temp, high);
2795       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2796     }
2797   return plus_constant (reg, offset);
2798 }
2799 \f
2800 /* The __tls_get_attr symbol.  */
2801 static GTY(()) rtx mips_tls_symbol;
2802
2803 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2804    the TLS symbol we are referencing and TYPE is the symbol type to use
2805    (either global dynamic or local dynamic).  V0 is an RTX for the
2806    return value location.  */
2807
2808 static rtx
2809 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2810 {
2811   rtx insn, loc, a0;
2812
2813   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2814
2815   if (!mips_tls_symbol)
2816     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2817
2818   loc = mips_unspec_address (sym, type);
2819
2820   start_sequence ();
2821
2822   emit_insn (gen_rtx_SET (Pmode, a0,
2823                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2824   insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
2825                            const0_rtx, NULL_RTX, false);
2826   RTL_CONST_CALL_P (insn) = 1;
2827   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2828   insn = get_insns ();
2829
2830   end_sequence ();
2831
2832   return insn;
2833 }
2834
2835 /* Return a pseudo register that contains the current thread pointer.  */
2836
2837 static rtx
2838 mips_get_tp (void)
2839 {
2840   rtx tp, fn;
2841
2842   tp = gen_reg_rtx (Pmode);
2843   if (TARGET_MIPS16)
2844     {
2845       mips_need_mips16_rdhwr_p = true;
2846       fn = mips16_stub_function ("__mips16_rdhwr");
2847       SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_LOCAL;
2848       if (!call_insn_operand (fn, VOIDmode))
2849         fn = force_reg (Pmode, fn);
2850       emit_insn (PMODE_INSN (gen_tls_get_tp_mips16, (tp, fn)));
2851     }
2852   else
2853     emit_insn (PMODE_INSN (gen_tls_get_tp, (tp)));
2854   return tp;
2855 }
2856
2857 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2858    its address.  The return value will be both a valid address and a valid
2859    SET_SRC (either a REG or a LO_SUM).  */
2860
2861 static rtx
2862 mips_legitimize_tls_address (rtx loc)
2863 {
2864   rtx dest, insn, v0, tp, tmp1, tmp2, eqv, offset;
2865   enum tls_model model;
2866
2867   model = SYMBOL_REF_TLS_MODEL (loc);
2868   /* Only TARGET_ABICALLS code can have more than one module; other
2869      code must be be static and should not use a GOT.  All TLS models
2870      reduce to local exec in this situation.  */
2871   if (!TARGET_ABICALLS)
2872     model = TLS_MODEL_LOCAL_EXEC;
2873
2874   switch (model)
2875     {
2876     case TLS_MODEL_GLOBAL_DYNAMIC:
2877       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2878       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2879       dest = gen_reg_rtx (Pmode);
2880       emit_libcall_block (insn, dest, v0, loc);
2881       break;
2882
2883     case TLS_MODEL_LOCAL_DYNAMIC:
2884       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2885       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2886       tmp1 = gen_reg_rtx (Pmode);
2887
2888       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2889          share the LDM result with other LD model accesses.  */
2890       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2891                             UNSPEC_TLS_LDM);
2892       emit_libcall_block (insn, tmp1, v0, eqv);
2893
2894       offset = mips_unspec_address (loc, SYMBOL_DTPREL);
2895       if (mips_split_p[SYMBOL_DTPREL])
2896         {
2897           tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2898           dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
2899         }
2900       else
2901         dest = expand_binop (Pmode, add_optab, tmp1, offset,
2902                              0, 0, OPTAB_DIRECT);
2903       break;
2904
2905     case TLS_MODEL_INITIAL_EXEC:
2906       tp = mips_get_tp ();
2907       tmp1 = gen_reg_rtx (Pmode);
2908       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2909       if (Pmode == DImode)
2910         emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2911       else
2912         emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2913       dest = gen_reg_rtx (Pmode);
2914       emit_insn (gen_add3_insn (dest, tmp1, tp));
2915       break;
2916
2917     case TLS_MODEL_LOCAL_EXEC:
2918       tmp1 = mips_get_tp ();
2919       offset = mips_unspec_address (loc, SYMBOL_TPREL);
2920       if (mips_split_p[SYMBOL_TPREL])
2921         {
2922           tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_TPREL);
2923           dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
2924         }
2925       else
2926         dest = expand_binop (Pmode, add_optab, tmp1, offset,
2927                              0, 0, OPTAB_DIRECT);
2928       break;
2929
2930     default:
2931       gcc_unreachable ();
2932     }
2933   return dest;
2934 }
2935 \f
2936 /* If X is not a valid address for mode MODE, force it into a register.  */
2937
2938 static rtx
2939 mips_force_address (rtx x, enum machine_mode mode)
2940 {
2941   if (!mips_legitimate_address_p (mode, x, false))
2942     x = force_reg (Pmode, x);
2943   return x;
2944 }
2945
2946 /* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
2947    be legitimized in a way that the generic machinery might not expect,
2948    return a new address, otherwise return NULL.  MODE is the mode of
2949    the memory being accessed.  */
2950
2951 static rtx
2952 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2953                          enum machine_mode mode)
2954 {
2955   rtx base, addr;
2956   HOST_WIDE_INT offset;
2957
2958   if (mips_tls_symbol_p (x))
2959     return mips_legitimize_tls_address (x);
2960
2961   /* See if the address can split into a high part and a LO_SUM.  */
2962   if (mips_split_symbol (NULL, x, mode, &addr))
2963     return mips_force_address (addr, mode);
2964
2965   /* Handle BASE + OFFSET using mips_add_offset.  */
2966   mips_split_plus (x, &base, &offset);
2967   if (offset != 0)
2968     {
2969       if (!mips_valid_base_register_p (base, mode, false))
2970         base = copy_to_mode_reg (Pmode, base);
2971       addr = mips_add_offset (NULL, base, offset);
2972       return mips_force_address (addr, mode);
2973     }
2974
2975   return x;
2976 }
2977
2978 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
2979
2980 void
2981 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
2982 {
2983   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2984   enum machine_mode mode;
2985   unsigned int i, num_ops;
2986   rtx x;
2987
2988   mode = GET_MODE (dest);
2989   num_ops = mips_build_integer (codes, value);
2990
2991   /* Apply each binary operation to X.  Invariant: X is a legitimate
2992      source operand for a SET pattern.  */
2993   x = GEN_INT (codes[0].value);
2994   for (i = 1; i < num_ops; i++)
2995     {
2996       if (!can_create_pseudo_p ())
2997         {
2998           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
2999           x = temp;
3000         }
3001       else
3002         x = force_reg (mode, x);
3003       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3004     }
3005
3006   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3007 }
3008
3009 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
3010    DEST given that SRC satisfies immediate_operand but doesn't satisfy
3011    move_operand.  */
3012
3013 static void
3014 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3015 {
3016   rtx base, offset;
3017
3018   /* Split moves of big integers into smaller pieces.  */
3019   if (splittable_const_int_operand (src, mode))
3020     {
3021       mips_move_integer (dest, dest, INTVAL (src));
3022       return;
3023     }
3024
3025   /* Split moves of symbolic constants into high/low pairs.  */
3026   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3027     {
3028       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3029       return;
3030     }
3031
3032   /* Generate the appropriate access sequences for TLS symbols.  */
3033   if (mips_tls_symbol_p (src))
3034     {
3035       mips_emit_move (dest, mips_legitimize_tls_address (src));
3036       return;
3037     }
3038
3039   /* If we have (const (plus symbol offset)), and that expression cannot
3040      be forced into memory, load the symbol first and add in the offset.
3041      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3042      forced into memory, as it usually produces better code.  */
3043   split_const (src, &base, &offset);
3044   if (offset != const0_rtx
3045       && (targetm.cannot_force_const_mem (mode, src)
3046           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3047     {
3048       base = mips_force_temporary (dest, base);
3049       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3050       return;
3051     }
3052
3053   src = force_const_mem (mode, src);
3054
3055   /* When using explicit relocs, constant pool references are sometimes
3056      not legitimate addresses.  */
3057   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3058   mips_emit_move (dest, src);
3059 }
3060
3061 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3062    sequence that is valid.  */
3063
3064 bool
3065 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3066 {
3067   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3068     {
3069       mips_emit_move (dest, force_reg (mode, src));
3070       return true;
3071     }
3072
3073   /* We need to deal with constants that would be legitimate
3074      immediate_operands but aren't legitimate move_operands.  */
3075   if (CONSTANT_P (src) && !move_operand (src, mode))
3076     {
3077       mips_legitimize_const_move (mode, dest, src);
3078       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3079       return true;
3080     }
3081   return false;
3082 }
3083 \f
3084 /* Return true if value X in context CONTEXT is a small-data address
3085    that can be rewritten as a LO_SUM.  */
3086
3087 static bool
3088 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3089 {
3090   enum mips_symbol_type symbol_type;
3091
3092   return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3093           && !mips_split_p[SYMBOL_GP_RELATIVE]
3094           && mips_symbolic_constant_p (x, context, &symbol_type)
3095           && symbol_type == SYMBOL_GP_RELATIVE);
3096 }
3097
3098 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3099    containing MEM, or null if none.  */
3100
3101 static int
3102 mips_small_data_pattern_1 (rtx *loc, void *data)
3103 {
3104   enum mips_symbol_context context;
3105
3106   /* Ignore things like "g" constraints in asms.  We make no particular
3107      guarantee about which symbolic constants are acceptable as asm operands
3108      versus which must be forced into a GPR.  */
3109   if (GET_CODE (*loc) == LO_SUM || GET_CODE (*loc) == ASM_OPERANDS)
3110     return -1;
3111
3112   if (MEM_P (*loc))
3113     {
3114       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3115         return 1;
3116       return -1;
3117     }
3118
3119   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3120   return mips_rewrite_small_data_p (*loc, context);
3121 }
3122
3123 /* Return true if OP refers to small data symbols directly, not through
3124    a LO_SUM.  */
3125
3126 bool
3127 mips_small_data_pattern_p (rtx op)
3128 {
3129   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3130 }
3131
3132 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3133    DATA is the containing MEM, or null if none.  */
3134
3135 static int
3136 mips_rewrite_small_data_1 (rtx *loc, void *data)
3137 {
3138   enum mips_symbol_context context;
3139
3140   if (MEM_P (*loc))
3141     {
3142       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3143       return -1;
3144     }
3145
3146   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3147   if (mips_rewrite_small_data_p (*loc, context))
3148     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3149
3150   if (GET_CODE (*loc) == LO_SUM)
3151     return -1;
3152
3153   return 0;
3154 }
3155
3156 /* Rewrite instruction pattern PATTERN so that it refers to small data
3157    using explicit relocations.  */
3158
3159 rtx
3160 mips_rewrite_small_data (rtx pattern)
3161 {
3162   pattern = copy_insn (pattern);
3163   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3164   return pattern;
3165 }
3166 \f
3167 /* We need a lot of little routines to check the range of MIPS16 immediate
3168    operands.  */
3169
3170 static int
3171 m16_check_op (rtx op, int low, int high, int mask)
3172 {
3173   return (CONST_INT_P (op)
3174           && IN_RANGE (INTVAL (op), low, high)
3175           && (INTVAL (op) & mask) == 0);
3176 }
3177
3178 int
3179 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3180 {
3181   return m16_check_op (op, 0x1, 0x8, 0);
3182 }
3183
3184 int
3185 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3186 {
3187   return m16_check_op (op, -0x8, 0x7, 0);
3188 }
3189
3190 int
3191 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3192 {
3193   return m16_check_op (op, -0x7, 0x8, 0);
3194 }
3195
3196 int
3197 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3198 {
3199   return m16_check_op (op, -0x10, 0xf, 0);
3200 }
3201
3202 int
3203 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3204 {
3205   return m16_check_op (op, -0xf, 0x10, 0);
3206 }
3207
3208 int
3209 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3210 {
3211   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
3212 }
3213
3214 int
3215 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3216 {
3217   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
3218 }
3219
3220 int
3221 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3222 {
3223   return m16_check_op (op, -0x80, 0x7f, 0);
3224 }
3225
3226 int
3227 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3228 {
3229   return m16_check_op (op, -0x7f, 0x80, 0);
3230 }
3231
3232 int
3233 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3234 {
3235   return m16_check_op (op, 0x0, 0xff, 0);
3236 }
3237
3238 int
3239 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3240 {
3241   return m16_check_op (op, -0xff, 0x0, 0);
3242 }
3243
3244 int
3245 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3246 {
3247   return m16_check_op (op, -0x1, 0xfe, 0);
3248 }
3249
3250 int
3251 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3252 {
3253   return m16_check_op (op, 0x0, 0xff << 2, 3);
3254 }
3255
3256 int
3257 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3258 {
3259   return m16_check_op (op, -0xff << 2, 0x0, 3);
3260 }
3261
3262 int
3263 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3264 {
3265   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
3266 }
3267
3268 int
3269 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3270 {
3271   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
3272 }
3273 \f
3274 /* The cost of loading values from the constant pool.  It should be
3275    larger than the cost of any constant we want to synthesize inline.  */
3276 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3277
3278 /* Return the cost of X when used as an operand to the MIPS16 instruction
3279    that implements CODE.  Return -1 if there is no such instruction, or if
3280    X is not a valid immediate operand for it.  */
3281
3282 static int
3283 mips16_constant_cost (int code, HOST_WIDE_INT x)
3284 {
3285   switch (code)
3286     {
3287     case ASHIFT:
3288     case ASHIFTRT:
3289     case LSHIFTRT:
3290       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3291          other shifts are extended.  The shift patterns truncate the shift
3292          count to the right size, so there are no out-of-range values.  */
3293       if (IN_RANGE (x, 1, 8))
3294         return 0;
3295       return COSTS_N_INSNS (1);
3296
3297     case PLUS:
3298       if (IN_RANGE (x, -128, 127))
3299         return 0;
3300       if (SMALL_OPERAND (x))
3301         return COSTS_N_INSNS (1);
3302       return -1;
3303
3304     case LEU:
3305       /* Like LE, but reject the always-true case.  */
3306       if (x == -1)
3307         return -1;
3308     case LE:
3309       /* We add 1 to the immediate and use SLT.  */
3310       x += 1;
3311     case XOR:
3312       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3313     case LT:
3314     case LTU:
3315       if (IN_RANGE (x, 0, 255))
3316         return 0;
3317       if (SMALL_OPERAND_UNSIGNED (x))
3318         return COSTS_N_INSNS (1);
3319       return -1;
3320
3321     case EQ:
3322     case NE:
3323       /* Equality comparisons with 0 are cheap.  */
3324       if (x == 0)
3325         return 0;
3326       return -1;
3327
3328     default:
3329       return -1;
3330     }
3331 }
3332
3333 /* Return true if there is a non-MIPS16 instruction that implements CODE
3334    and if that instruction accepts X as an immediate operand.  */
3335
3336 static int
3337 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3338 {
3339   switch (code)
3340     {
3341     case ASHIFT:
3342     case ASHIFTRT:
3343     case LSHIFTRT:
3344       /* All shift counts are truncated to a valid constant.  */
3345       return true;
3346
3347     case ROTATE:
3348     case ROTATERT:
3349       /* Likewise rotates, if the target supports rotates at all.  */
3350       return ISA_HAS_ROR;
3351
3352     case AND:
3353     case IOR:
3354     case XOR:
3355       /* These instructions take 16-bit unsigned immediates.  */
3356       return SMALL_OPERAND_UNSIGNED (x);
3357
3358     case PLUS:
3359     case LT:
3360     case LTU:
3361       /* These instructions take 16-bit signed immediates.  */
3362       return SMALL_OPERAND (x);
3363
3364     case EQ:
3365     case NE:
3366     case GT:
3367     case GTU:
3368       /* The "immediate" forms of these instructions are really
3369          implemented as comparisons with register 0.  */
3370       return x == 0;
3371
3372     case GE:
3373     case GEU:
3374       /* Likewise, meaning that the only valid immediate operand is 1.  */
3375       return x == 1;
3376
3377     case LE:
3378       /* We add 1 to the immediate and use SLT.  */
3379       return SMALL_OPERAND (x + 1);
3380
3381     case LEU:
3382       /* Likewise SLTU, but reject the always-true case.  */
3383       return SMALL_OPERAND (x + 1) && x + 1 != 0;
3384
3385     case SIGN_EXTRACT:
3386     case ZERO_EXTRACT:
3387       /* The bit position and size are immediate operands.  */
3388       return ISA_HAS_EXT_INS;
3389
3390     default:
3391       /* By default assume that $0 can be used for 0.  */
3392       return x == 0;
3393     }
3394 }
3395
3396 /* Return the cost of binary operation X, given that the instruction
3397    sequence for a word-sized or smaller operation has cost SINGLE_COST
3398    and that the sequence of a double-word operation has cost DOUBLE_COST.
3399    If SPEED is true, optimize for speed otherwise optimize for size.  */
3400
3401 static int
3402 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3403 {
3404   int cost;
3405
3406   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3407     cost = double_cost;
3408   else
3409     cost = single_cost;
3410   return (cost
3411           + set_src_cost (XEXP (x, 0), speed)
3412           + rtx_cost (XEXP (x, 1), GET_CODE (x), 1, speed));
3413 }
3414
3415 /* Return the cost of floating-point multiplications of mode MODE.  */
3416
3417 static int
3418 mips_fp_mult_cost (enum machine_mode mode)
3419 {
3420   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3421 }
3422
3423 /* Return the cost of floating-point divisions of mode MODE.  */
3424
3425 static int
3426 mips_fp_div_cost (enum machine_mode mode)
3427 {
3428   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3429 }
3430
3431 /* Return the cost of sign-extending OP to mode MODE, not including the
3432    cost of OP itself.  */
3433
3434 static int
3435 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3436 {
3437   if (MEM_P (op))
3438     /* Extended loads are as cheap as unextended ones.  */
3439     return 0;
3440
3441   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3442     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3443     return 0;
3444
3445   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3446     /* We can use SEB or SEH.  */
3447     return COSTS_N_INSNS (1);
3448
3449   /* We need to use a shift left and a shift right.  */
3450   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3451 }
3452
3453 /* Return the cost of zero-extending OP to mode MODE, not including the
3454    cost of OP itself.  */
3455
3456 static int
3457 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3458 {
3459   if (MEM_P (op))
3460     /* Extended loads are as cheap as unextended ones.  */
3461     return 0;
3462
3463   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3464     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3465     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3466
3467   if (GENERATE_MIPS16E)
3468     /* We can use ZEB or ZEH.  */
3469     return COSTS_N_INSNS (1);
3470
3471   if (TARGET_MIPS16)
3472     /* We need to load 0xff or 0xffff into a register and use AND.  */
3473     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3474
3475   /* We can use ANDI.  */
3476   return COSTS_N_INSNS (1);
3477 }
3478
3479 /* Implement TARGET_RTX_COSTS.  */
3480
3481 static bool
3482 mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
3483                 int *total, bool speed)
3484 {
3485   enum machine_mode mode = GET_MODE (x);
3486   bool float_mode_p = FLOAT_MODE_P (mode);
3487   int cost;
3488   rtx addr;
3489
3490   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3491      appear in the instruction stream, and the cost of a comparison is
3492      really the cost of the branch or scc condition.  At the time of
3493      writing, GCC only uses an explicit outer COMPARE code when optabs
3494      is testing whether a constant is expensive enough to force into a
3495      register.  We want optabs to pass such constants through the MIPS
3496      expanders instead, so make all constants very cheap here.  */
3497   if (outer_code == COMPARE)
3498     {
3499       gcc_assert (CONSTANT_P (x));
3500       *total = 0;
3501       return true;
3502     }
3503
3504   switch (code)
3505     {
3506     case CONST_INT:
3507       /* Treat *clear_upper32-style ANDs as having zero cost in the
3508          second operand.  The cost is entirely in the first operand.
3509
3510          ??? This is needed because we would otherwise try to CSE
3511          the constant operand.  Although that's the right thing for
3512          instructions that continue to be a register operation throughout
3513          compilation, it is disastrous for instructions that could
3514          later be converted into a memory operation.  */
3515       if (TARGET_64BIT
3516           && outer_code == AND
3517           && UINTVAL (x) == 0xffffffff)
3518         {
3519           *total = 0;
3520           return true;
3521         }
3522
3523       if (TARGET_MIPS16)
3524         {
3525           cost = mips16_constant_cost (outer_code, INTVAL (x));
3526           if (cost >= 0)
3527             {
3528               *total = cost;
3529               return true;
3530             }
3531         }
3532       else
3533         {
3534           /* When not optimizing for size, we care more about the cost
3535              of hot code, and hot code is often in a loop.  If a constant
3536              operand needs to be forced into a register, we will often be
3537              able to hoist the constant load out of the loop, so the load
3538              should not contribute to the cost.  */
3539           if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3540             {
3541               *total = 0;
3542               return true;
3543             }
3544         }
3545       /* Fall through.  */
3546
3547     case CONST:
3548     case SYMBOL_REF:
3549     case LABEL_REF:
3550     case CONST_DOUBLE:
3551       if (force_to_mem_operand (x, VOIDmode))
3552         {
3553           *total = COSTS_N_INSNS (1);
3554           return true;
3555         }
3556       cost = mips_const_insns (x);
3557       if (cost > 0)
3558         {
3559           /* If the constant is likely to be stored in a GPR, SETs of
3560              single-insn constants are as cheap as register sets; we
3561              never want to CSE them.
3562
3563              Don't reduce the cost of storing a floating-point zero in
3564              FPRs.  If we have a zero in an FPR for other reasons, we
3565              can get better cfg-cleanup and delayed-branch results by
3566              using it consistently, rather than using $0 sometimes and
3567              an FPR at other times.  Also, moves between floating-point
3568              registers are sometimes cheaper than (D)MTC1 $0.  */
3569           if (cost == 1
3570               && outer_code == SET
3571               && !(float_mode_p && TARGET_HARD_FLOAT))
3572             cost = 0;
3573           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3574              want to CSE the constant itself.  It is usually better to
3575              have N copies of the last operation in the sequence and one
3576              shared copy of the other operations.  (Note that this is
3577              not true for MIPS16 code, where the final operation in the
3578              sequence is often an extended instruction.)
3579
3580              Also, if we have a CONST_INT, we don't know whether it is
3581              for a word or doubleword operation, so we cannot rely on
3582              the result of mips_build_integer.  */
3583           else if (!TARGET_MIPS16
3584                    && (outer_code == SET || mode == VOIDmode))
3585             cost = 1;
3586           *total = COSTS_N_INSNS (cost);
3587           return true;
3588         }
3589       /* The value will need to be fetched from the constant pool.  */
3590       *total = CONSTANT_POOL_COST;
3591       return true;
3592
3593     case MEM:
3594       /* If the address is legitimate, return the number of
3595          instructions it needs.  */
3596       addr = XEXP (x, 0);
3597       cost = mips_address_insns (addr, mode, true);
3598       if (cost > 0)
3599         {
3600           *total = COSTS_N_INSNS (cost + 1);
3601           return true;
3602         }
3603       /* Check for a scaled indexed address.  */
3604       if (mips_lwxs_address_p (addr)
3605           || mips_lx_address_p (addr, mode))
3606         {
3607           *total = COSTS_N_INSNS (2);
3608           return true;
3609         }
3610       /* Otherwise use the default handling.  */
3611       return false;
3612
3613     case FFS:
3614       *total = COSTS_N_INSNS (6);
3615       return false;
3616
3617     case NOT:
3618       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3619       return false;
3620
3621     case AND:
3622       /* Check for a *clear_upper32 pattern and treat it like a zero
3623          extension.  See the pattern's comment for details.  */
3624       if (TARGET_64BIT
3625           && mode == DImode
3626           && CONST_INT_P (XEXP (x, 1))
3627           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3628         {
3629           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3630                     + set_src_cost (XEXP (x, 0), speed));
3631           return true;
3632         }
3633       /* Fall through.  */
3634
3635     case IOR:
3636     case XOR:
3637       /* Double-word operations use two single-word operations.  */
3638       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3639                                  speed);
3640       return true;
3641
3642     case ASHIFT:
3643     case ASHIFTRT:
3644     case LSHIFTRT:
3645     case ROTATE:
3646     case ROTATERT:
3647       if (CONSTANT_P (XEXP (x, 1)))
3648         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3649                                    speed);
3650       else
3651         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3652                                    speed);
3653       return true;
3654
3655     case ABS:
3656       if (float_mode_p)
3657         *total = mips_cost->fp_add;
3658       else
3659         *total = COSTS_N_INSNS (4);
3660       return false;
3661
3662     case LO_SUM:
3663       /* Low-part immediates need an extended MIPS16 instruction.  */
3664       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3665                 + set_src_cost (XEXP (x, 0), speed));
3666       return true;
3667
3668     case LT:
3669     case LTU:
3670     case LE:
3671     case LEU:
3672     case GT:
3673     case GTU:
3674     case GE:
3675     case GEU:
3676     case EQ:
3677     case NE:
3678     case UNORDERED:
3679     case LTGT:
3680       /* Branch comparisons have VOIDmode, so use the first operand's
3681          mode instead.  */
3682       mode = GET_MODE (XEXP (x, 0));
3683       if (FLOAT_MODE_P (mode))
3684         {
3685           *total = mips_cost->fp_add;
3686           return false;
3687         }
3688       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3689                                  speed);
3690       return true;
3691
3692     case MINUS:
3693       if (float_mode_p
3694           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3695           && TARGET_FUSED_MADD
3696           && !HONOR_NANS (mode)
3697           && !HONOR_SIGNED_ZEROS (mode))
3698         {
3699           /* See if we can use NMADD or NMSUB.  See mips.md for the
3700              associated patterns.  */
3701           rtx op0 = XEXP (x, 0);
3702           rtx op1 = XEXP (x, 1);
3703           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3704             {
3705               *total = (mips_fp_mult_cost (mode)
3706                         + set_src_cost (XEXP (XEXP (op0, 0), 0), speed)
3707                         + set_src_cost (XEXP (op0, 1), speed)
3708                         + set_src_cost (op1, speed));
3709               return true;
3710             }
3711           if (GET_CODE (op1) == MULT)
3712             {
3713               *total = (mips_fp_mult_cost (mode)
3714                         + set_src_cost (op0, speed)
3715                         + set_src_cost (XEXP (op1, 0), speed)
3716                         + set_src_cost (XEXP (op1, 1), speed));
3717               return true;
3718             }
3719         }
3720       /* Fall through.  */
3721
3722     case PLUS:
3723       if (float_mode_p)
3724         {
3725           /* If this is part of a MADD or MSUB, treat the PLUS as
3726              being free.  */
3727           if (ISA_HAS_FP4
3728               && TARGET_FUSED_MADD
3729               && GET_CODE (XEXP (x, 0)) == MULT)
3730             *total = 0;
3731           else
3732             *total = mips_cost->fp_add;
3733           return false;
3734         }
3735
3736       /* Double-word operations require three single-word operations and
3737          an SLTU.  The MIPS16 version then needs to move the result of
3738          the SLTU from $24 to a MIPS16 register.  */
3739       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3740                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
3741                                  speed);
3742       return true;
3743
3744     case NEG:
3745       if (float_mode_p
3746           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3747           && TARGET_FUSED_MADD
3748           && !HONOR_NANS (mode)
3749           && HONOR_SIGNED_ZEROS (mode))
3750         {
3751           /* See if we can use NMADD or NMSUB.  See mips.md for the
3752              associated patterns.  */
3753           rtx op = XEXP (x, 0);
3754           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3755               && GET_CODE (XEXP (op, 0)) == MULT)
3756             {
3757               *total = (mips_fp_mult_cost (mode)
3758                         + set_src_cost (XEXP (XEXP (op, 0), 0), speed)
3759                         + set_src_cost (XEXP (XEXP (op, 0), 1), speed)
3760                         + set_src_cost (XEXP (op, 1), speed));
3761               return true;
3762             }
3763         }
3764
3765       if (float_mode_p)
3766         *total = mips_cost->fp_add;
3767       else
3768         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3769       return false;
3770
3771     case MULT:
3772       if (float_mode_p)
3773         *total = mips_fp_mult_cost (mode);
3774       else if (mode == DImode && !TARGET_64BIT)
3775         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3776            where the mulsidi3 always includes an MFHI and an MFLO.  */
3777         *total = (speed
3778                   ? mips_cost->int_mult_si * 3 + 6
3779                   : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
3780       else if (!speed)
3781         *total = (ISA_HAS_MUL3 ? 1 : 2);
3782       else if (mode == DImode)
3783         *total = mips_cost->int_mult_di;
3784       else
3785         *total = mips_cost->int_mult_si;
3786       return false;
3787
3788     case DIV:
3789       /* Check for a reciprocal.  */
3790       if (float_mode_p
3791           && ISA_HAS_FP4
3792           && flag_unsafe_math_optimizations
3793           && XEXP (x, 0) == CONST1_RTX (mode))
3794         {
3795           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3796             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3797                division as being free.  */
3798             *total = set_src_cost (XEXP (x, 1), speed);
3799           else
3800             *total = (mips_fp_div_cost (mode)
3801                       + set_src_cost (XEXP (x, 1), speed));
3802           return true;
3803         }
3804       /* Fall through.  */
3805
3806     case SQRT:
3807     case MOD:
3808       if (float_mode_p)
3809         {
3810           *total = mips_fp_div_cost (mode);
3811           return false;
3812         }
3813       /* Fall through.  */
3814
3815     case UDIV:
3816     case UMOD:
3817       if (!speed)
3818         {
3819           /* It is our responsibility to make division by a power of 2
3820              as cheap as 2 register additions if we want the division
3821              expanders to be used for such operations; see the setting
3822              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3823              should always produce shorter code than using
3824              expand_sdiv2_pow2.  */
3825           if (TARGET_MIPS16
3826               && CONST_INT_P (XEXP (x, 1))
3827               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3828             {
3829               *total = COSTS_N_INSNS (2) + set_src_cost (XEXP (x, 0), speed);
3830               return true;
3831             }
3832           *total = COSTS_N_INSNS (mips_idiv_insns ());
3833         }
3834       else if (mode == DImode)
3835         *total = mips_cost->int_div_di;
3836       else
3837         *total = mips_cost->int_div_si;
3838       return false;
3839
3840     case SIGN_EXTEND:
3841       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3842       return false;
3843
3844     case ZERO_EXTEND:
3845       if (outer_code == SET
3846           && ISA_HAS_BADDU
3847           && (GET_CODE (XEXP (x, 0)) == TRUNCATE
3848               || GET_CODE (XEXP (x, 0)) == SUBREG)
3849           && GET_MODE (XEXP (x, 0)) == QImode
3850           && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
3851         {
3852           *total = set_src_cost (XEXP (XEXP (x, 0), 0), speed);
3853           return true;
3854         }
3855       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3856       return false;
3857
3858     case FLOAT:
3859     case UNSIGNED_FLOAT:
3860     case FIX:
3861     case FLOAT_EXTEND:
3862     case FLOAT_TRUNCATE:
3863       *total = mips_cost->fp_add;
3864       return false;
3865
3866     default:
3867       return false;
3868     }
3869 }
3870
3871 /* Implement TARGET_ADDRESS_COST.  */
3872
3873 static int
3874 mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
3875 {
3876   return mips_address_insns (addr, SImode, false);
3877 }
3878 \f
3879 /* Information about a single instruction in a multi-instruction
3880    asm sequence.  */
3881 struct mips_multi_member {
3882   /* True if this is a label, false if it is code.  */
3883   bool is_label_p;
3884
3885   /* The output_asm_insn format of the instruction.  */
3886   const char *format;
3887
3888   /* The operands to the instruction.  */
3889   rtx operands[MAX_RECOG_OPERANDS];
3890 };
3891 typedef struct mips_multi_member mips_multi_member;
3892
3893 /* Vector definitions for the above.  */
3894 DEF_VEC_O(mips_multi_member);
3895 DEF_VEC_ALLOC_O(mips_multi_member, heap);
3896
3897 /* The instructions that make up the current multi-insn sequence.  */
3898 static VEC (mips_multi_member, heap) *mips_multi_members;
3899
3900 /* How many instructions (as opposed to labels) are in the current
3901    multi-insn sequence.  */
3902 static unsigned int mips_multi_num_insns;
3903
3904 /* Start a new multi-insn sequence.  */
3905
3906 static void
3907 mips_multi_start (void)
3908 {
3909   VEC_truncate (mips_multi_member, mips_multi_members, 0);
3910   mips_multi_num_insns = 0;
3911 }
3912
3913 /* Add a new, uninitialized member to the current multi-insn sequence.  */
3914
3915 static struct mips_multi_member *
3916 mips_multi_add (void)
3917 {
3918   return VEC_safe_push (mips_multi_member, heap, mips_multi_members, 0);
3919 }
3920
3921 /* Add a normal insn with the given asm format to the current multi-insn
3922    sequence.  The other arguments are a null-terminated list of operands.  */
3923
3924 static void
3925 mips_multi_add_insn (const char *format, ...)
3926 {
3927   struct mips_multi_member *member;
3928   va_list ap;
3929   unsigned int i;
3930   rtx op;
3931
3932   member = mips_multi_add ();
3933   member->is_label_p = false;
3934   member->format = format;
3935   va_start (ap, format);
3936   i = 0;
3937   while ((op = va_arg (ap, rtx)))
3938     member->operands[i++] = op;
3939   va_end (ap);
3940   mips_multi_num_insns++;
3941 }
3942
3943 /* Add the given label definition to the current multi-insn sequence.
3944    The definition should include the colon.  */
3945
3946 static void
3947 mips_multi_add_label (const char *label)
3948 {
3949   struct mips_multi_member *member;
3950
3951   member = mips_multi_add ();
3952   member->is_label_p = true;
3953   member->format = label;
3954 }
3955
3956 /* Return the index of the last member of the current multi-insn sequence.  */
3957
3958 static unsigned int
3959 mips_multi_last_index (void)
3960 {
3961   return VEC_length (mips_multi_member, mips_multi_members) - 1;
3962 }
3963
3964 /* Add a copy of an existing instruction to the current multi-insn
3965    sequence.  I is the index of the instruction that should be copied.  */
3966
3967 static void
3968 mips_multi_copy_insn (unsigned int i)
3969 {
3970   struct mips_multi_member *member;
3971
3972   member = mips_multi_add ();
3973   memcpy (member, VEC_index (mips_multi_member, mips_multi_members, i),
3974           sizeof (*member));
3975   gcc_assert (!member->is_label_p);
3976 }
3977
3978 /* Change the operand of an existing instruction in the current
3979    multi-insn sequence.  I is the index of the instruction,
3980    OP is the index of the operand, and X is the new value.  */
3981
3982 static void
3983 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
3984 {
3985   VEC_index (mips_multi_member, mips_multi_members, i)->operands[op] = x;
3986 }
3987
3988 /* Write out the asm code for the current multi-insn sequence.  */
3989
3990 static void
3991 mips_multi_write (void)
3992 {
3993   struct mips_multi_member *member;
3994   unsigned int i;
3995
3996   FOR_EACH_VEC_ELT (mips_multi_member, mips_multi_members, i, member)
3997     if (member->is_label_p)
3998       fprintf (asm_out_file, "%s\n", member->format);
3999     else
4000       output_asm_insn (member->format, member->operands);
4001 }
4002 \f
4003 /* Return one word of double-word value OP, taking into account the fixed
4004    endianness of certain registers.  HIGH_P is true to select the high part,
4005    false to select the low part.  */
4006
4007 rtx
4008 mips_subword (rtx op, bool high_p)
4009 {
4010   unsigned int byte, offset;
4011   enum machine_mode mode;
4012
4013   mode = GET_MODE (op);
4014   if (mode == VOIDmode)
4015     mode = TARGET_64BIT ? TImode : DImode;
4016
4017   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4018     byte = UNITS_PER_WORD;
4019   else
4020     byte = 0;
4021
4022   if (FP_REG_RTX_P (op))
4023     {
4024       /* Paired FPRs are always ordered little-endian.  */
4025       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4026       return gen_rtx_REG (word_mode, REGNO (op) + offset);
4027     }
4028
4029   if (MEM_P (op))
4030     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4031
4032   return simplify_gen_subreg (word_mode, op, mode, byte);
4033 }
4034
4035 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
4036
4037 bool
4038 mips_split_64bit_move_p (rtx dest, rtx src)
4039 {
4040   if (TARGET_64BIT)
4041     return false;
4042
4043   /* FPR-to-FPR moves can be done in a single instruction, if they're
4044      allowed at all.  */
4045   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4046     return false;
4047
4048   /* Check for floating-point loads and stores.  */
4049   if (ISA_HAS_LDC1_SDC1)
4050     {
4051       if (FP_REG_RTX_P (dest) && MEM_P (src))
4052         return false;
4053       if (FP_REG_RTX_P (src) && MEM_P (dest))
4054         return false;
4055     }
4056   return true;
4057 }
4058
4059 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
4060    this function handles 64-bit moves for which mips_split_64bit_move_p
4061    holds.  For 64-bit targets, this function handles 128-bit moves.  */
4062
4063 void
4064 mips_split_doubleword_move (rtx dest, rtx src)
4065 {
4066   rtx low_dest;
4067
4068   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4069     {
4070       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4071         emit_insn (gen_move_doubleword_fprdi (dest, src));
4072       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4073         emit_insn (gen_move_doubleword_fprdf (dest, src));
4074       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4075         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4076       else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4077         emit_insn (gen_move_doubleword_fprv2si (dest, src));
4078       else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4079         emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4080       else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4081         emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4082       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4083         emit_insn (gen_move_doubleword_fprtf (dest, src));
4084       else
4085         gcc_unreachable ();
4086     }
4087   else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4088     {
4089       low_dest = mips_subword (dest, false);
4090       mips_emit_move (low_dest, mips_subword (src, false));
4091       if (TARGET_64BIT)
4092         emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4093       else
4094         emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4095     }
4096   else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4097     {
4098       mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4099       if (TARGET_64BIT)
4100         emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4101       else
4102         emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4103     }
4104   else
4105     {
4106       /* The operation can be split into two normal moves.  Decide in
4107          which order to do them.  */
4108       low_dest = mips_subword (dest, false);
4109       if (REG_P (low_dest)
4110           && reg_overlap_mentioned_p (low_dest, src))
4111         {
4112           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4113           mips_emit_move (low_dest, mips_subword (src, false));
4114         }
4115       else
4116         {
4117           mips_emit_move (low_dest, mips_subword (src, false));
4118           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4119         }
4120     }
4121 }
4122 \f
4123 /* Return the appropriate instructions to move SRC into DEST.  Assume
4124    that SRC is operand 1 and DEST is operand 0.  */
4125
4126 const char *
4127 mips_output_move (rtx dest, rtx src)
4128 {
4129   enum rtx_code dest_code, src_code;
4130   enum machine_mode mode;
4131   enum mips_symbol_type symbol_type;
4132   bool dbl_p;
4133
4134   dest_code = GET_CODE (dest);
4135   src_code = GET_CODE (src);
4136   mode = GET_MODE (dest);
4137   dbl_p = (GET_MODE_SIZE (mode) == 8);
4138
4139   if (dbl_p && mips_split_64bit_move_p (dest, src))
4140     return "#";
4141
4142   if ((src_code == REG && GP_REG_P (REGNO (src)))
4143       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4144     {
4145       if (dest_code == REG)
4146         {
4147           if (GP_REG_P (REGNO (dest)))
4148             return "move\t%0,%z1";
4149
4150           /* Moves to HI are handled by special .md insns.  */
4151           if (REGNO (dest) == LO_REGNUM)
4152             return "mtlo\t%z1";
4153
4154           if (DSP_ACC_REG_P (REGNO (dest)))
4155             {
4156               static char retval[] = "mt__\t%z1,%q0";
4157
4158               retval[2] = reg_names[REGNO (dest)][4];
4159               retval[3] = reg_names[REGNO (dest)][5];
4160               return retval;
4161             }
4162
4163           if (FP_REG_P (REGNO (dest)))
4164             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4165
4166           if (ALL_COP_REG_P (REGNO (dest)))
4167             {
4168               static char retval[] = "dmtc_\t%z1,%0";
4169
4170               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4171               return dbl_p ? retval : retval + 1;
4172             }
4173         }
4174       if (dest_code == MEM)
4175         switch (GET_MODE_SIZE (mode))
4176           {
4177           case 1: return "sb\t%z1,%0";
4178           case 2: return "sh\t%z1,%0";
4179           case 4: return "sw\t%z1,%0";
4180           case 8: return "sd\t%z1,%0";
4181           }
4182     }
4183   if (dest_code == REG && GP_REG_P (REGNO (dest)))
4184     {
4185       if (src_code == REG)
4186         {
4187           /* Moves from HI are handled by special .md insns.  */
4188           if (REGNO (src) == LO_REGNUM)
4189             {
4190               /* When generating VR4120 or VR4130 code, we use MACC and
4191                  DMACC instead of MFLO.  This avoids both the normal
4192                  MIPS III HI/LO hazards and the errata related to
4193                  -mfix-vr4130.  */
4194               if (ISA_HAS_MACCHI)
4195                 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4196               return "mflo\t%0";
4197             }
4198
4199           if (DSP_ACC_REG_P (REGNO (src)))
4200             {
4201               static char retval[] = "mf__\t%0,%q1";
4202
4203               retval[2] = reg_names[REGNO (src)][4];
4204               retval[3] = reg_names[REGNO (src)][5];
4205               return retval;
4206             }
4207
4208           if (FP_REG_P (REGNO (src)))
4209             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4210
4211           if (ALL_COP_REG_P (REGNO (src)))
4212             {
4213               static char retval[] = "dmfc_\t%0,%1";
4214
4215               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4216               return dbl_p ? retval : retval + 1;
4217             }
4218
4219           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
4220             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
4221         }
4222
4223       if (src_code == MEM)
4224         switch (GET_MODE_SIZE (mode))
4225           {
4226           case 1: return "lbu\t%0,%1";
4227           case 2: return "lhu\t%0,%1";
4228           case 4: return "lw\t%0,%1";
4229           case 8: return "ld\t%0,%1";
4230           }
4231
4232       if (src_code == CONST_INT)
4233         {
4234           /* Don't use the X format for the operand itself, because that
4235              will give out-of-range numbers for 64-bit hosts and 32-bit
4236              targets.  */
4237           if (!TARGET_MIPS16)
4238             return "li\t%0,%1\t\t\t# %X1";
4239
4240           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4241             return "li\t%0,%1";
4242
4243           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4244             return "#";
4245         }
4246
4247       if (src_code == HIGH)
4248         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4249
4250       if (CONST_GP_P (src))
4251         return "move\t%0,%1";
4252
4253       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4254           && mips_lo_relocs[symbol_type] != 0)
4255         {
4256           /* A signed 16-bit constant formed by applying a relocation
4257              operator to a symbolic address.  */
4258           gcc_assert (!mips_split_p[symbol_type]);
4259           return "li\t%0,%R1";
4260         }
4261
4262       if (symbolic_operand (src, VOIDmode))
4263         {
4264           gcc_assert (TARGET_MIPS16
4265                       ? TARGET_MIPS16_TEXT_LOADS
4266                       : !TARGET_EXPLICIT_RELOCS);
4267           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4268         }
4269     }
4270   if (src_code == REG && FP_REG_P (REGNO (src)))
4271     {
4272       if (dest_code == REG && FP_REG_P (REGNO (dest)))
4273         {
4274           if (GET_MODE (dest) == V2SFmode)
4275             return "mov.ps\t%0,%1";
4276           else
4277             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4278         }
4279
4280       if (dest_code == MEM)
4281         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4282     }
4283   if (dest_code == REG && FP_REG_P (REGNO (dest)))
4284     {
4285       if (src_code == MEM)
4286         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4287     }
4288   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4289     {
4290       static char retval[] = "l_c_\t%0,%1";
4291
4292       retval[1] = (dbl_p ? 'd' : 'w');
4293       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4294       return retval;
4295     }
4296   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4297     {
4298       static char retval[] = "s_c_\t%1,%0";
4299
4300       retval[1] = (dbl_p ? 'd' : 'w');
4301       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4302       return retval;
4303     }
4304   gcc_unreachable ();
4305 }
4306 \f
4307 /* Return true if CMP1 is a suitable second operand for integer ordering
4308    test CODE.  See also the *sCC patterns in mips.md.  */
4309
4310 static bool
4311 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4312 {
4313   switch (code)
4314     {
4315     case GT:
4316     case GTU:
4317       return reg_or_0_operand (cmp1, VOIDmode);
4318
4319     case GE:
4320     case GEU:
4321       return !TARGET_MIPS16 && cmp1 == const1_rtx;
4322
4323     case LT:
4324     case LTU:
4325       return arith_operand (cmp1, VOIDmode);
4326
4327     case LE:
4328       return sle_operand (cmp1, VOIDmode);
4329
4330     case LEU:
4331       return sleu_operand (cmp1, VOIDmode);
4332
4333     default:
4334       gcc_unreachable ();
4335     }
4336 }
4337
4338 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4339    integer ordering test *CODE, or if an equivalent combination can
4340    be formed by adjusting *CODE and *CMP1.  When returning true, update
4341    *CODE and *CMP1 with the chosen code and operand, otherwise leave
4342    them alone.  */
4343
4344 static bool
4345 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4346                                   enum machine_mode mode)
4347 {
4348   HOST_WIDE_INT plus_one;
4349
4350   if (mips_int_order_operand_ok_p (*code, *cmp1))
4351     return true;
4352
4353   if (CONST_INT_P (*cmp1))
4354     switch (*code)
4355       {
4356       case LE:
4357         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4358         if (INTVAL (*cmp1) < plus_one)
4359           {
4360             *code = LT;
4361             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4362             return true;
4363           }
4364         break;
4365
4366       case LEU:
4367         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4368         if (plus_one != 0)
4369           {
4370             *code = LTU;
4371             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4372             return true;
4373           }
4374         break;
4375
4376       default:
4377         break;
4378       }
4379   return false;
4380 }
4381
4382 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4383    in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4384    is nonnull, it's OK to set TARGET to the inverse of the result and
4385    flip *INVERT_PTR instead.  */
4386
4387 static void
4388 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4389                           rtx target, rtx cmp0, rtx cmp1)
4390 {
4391   enum machine_mode mode;
4392
4393   /* First see if there is a MIPS instruction that can do this operation.
4394      If not, try doing the same for the inverse operation.  If that also
4395      fails, force CMP1 into a register and try again.  */
4396   mode = GET_MODE (cmp0);
4397   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4398     mips_emit_binary (code, target, cmp0, cmp1);
4399   else
4400     {
4401       enum rtx_code inv_code = reverse_condition (code);
4402       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4403         {
4404           cmp1 = force_reg (mode, cmp1);
4405           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4406         }
4407       else if (invert_ptr == 0)
4408         {
4409           rtx inv_target;
4410
4411           inv_target = mips_force_binary (GET_MODE (target),
4412                                           inv_code, cmp0, cmp1);
4413           mips_emit_binary (XOR, target, inv_target, const1_rtx);
4414         }
4415       else
4416         {
4417           *invert_ptr = !*invert_ptr;
4418           mips_emit_binary (inv_code, target, cmp0, cmp1);
4419         }
4420     }
4421 }
4422
4423 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4424    The register will have the same mode as CMP0.  */
4425
4426 static rtx
4427 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4428 {
4429   if (cmp1 == const0_rtx)
4430     return cmp0;
4431
4432   if (uns_arith_operand (cmp1, VOIDmode))
4433     return expand_binop (GET_MODE (cmp0), xor_optab,
4434                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4435
4436   return expand_binop (GET_MODE (cmp0), sub_optab,
4437                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4438 }
4439
4440 /* Convert *CODE into a code that can be used in a floating-point
4441    scc instruction (C.cond.fmt).  Return true if the values of
4442    the condition code registers will be inverted, with 0 indicating
4443    that the condition holds.  */
4444
4445 static bool
4446 mips_reversed_fp_cond (enum rtx_code *code)
4447 {
4448   switch (*code)
4449     {
4450     case NE:
4451     case LTGT:
4452     case ORDERED:
4453       *code = reverse_condition_maybe_unordered (*code);
4454       return true;
4455
4456     default:
4457       return false;
4458     }
4459 }
4460
4461 /* Convert a comparison into something that can be used in a branch or
4462    conditional move.  On entry, *OP0 and *OP1 are the values being
4463    compared and *CODE is the code used to compare them.
4464
4465    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4466    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4467    otherwise any standard branch condition can be used.  The standard branch
4468    conditions are:
4469
4470       - EQ or NE between two registers.
4471       - any comparison between a register and zero.  */
4472
4473 static void
4474 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4475 {
4476   rtx cmp_op0 = *op0;
4477   rtx cmp_op1 = *op1;
4478
4479   if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4480     {
4481       if (!need_eq_ne_p && *op1 == const0_rtx)
4482         ;
4483       else if (*code == EQ || *code == NE)
4484         {
4485           if (need_eq_ne_p)
4486             {
4487               *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4488               *op1 = const0_rtx;
4489             }
4490           else
4491             *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4492         }
4493       else
4494         {
4495           /* The comparison needs a separate scc instruction.  Store the
4496              result of the scc in *OP0 and compare it against zero.  */
4497           bool invert = false;
4498           *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4499           mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4500           *code = (invert ? EQ : NE);
4501           *op1 = const0_rtx;
4502         }
4503     }
4504   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4505     {
4506       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4507       mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4508       *code = NE;
4509       *op1 = const0_rtx;
4510     }
4511   else
4512     {
4513       enum rtx_code cmp_code;
4514
4515       /* Floating-point tests use a separate C.cond.fmt comparison to
4516          set a condition code register.  The branch or conditional move
4517          will then compare that register against zero.
4518
4519          Set CMP_CODE to the code of the comparison instruction and
4520          *CODE to the code that the branch or move should use.  */
4521       cmp_code = *code;
4522       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4523       *op0 = (ISA_HAS_8CC
4524               ? gen_reg_rtx (CCmode)
4525               : gen_rtx_REG (CCmode, FPSW_REGNUM));
4526       *op1 = const0_rtx;
4527       mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4528     }
4529 }
4530 \f
4531 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4532    and OPERAND[3].  Store the result in OPERANDS[0].
4533
4534    On 64-bit targets, the mode of the comparison and target will always be
4535    SImode, thus possibly narrower than that of the comparison's operands.  */
4536
4537 void
4538 mips_expand_scc (rtx operands[])
4539 {
4540   rtx target = operands[0];
4541   enum rtx_code code = GET_CODE (operands[1]);
4542   rtx op0 = operands[2];
4543   rtx op1 = operands[3];
4544
4545   gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4546
4547   if (code == EQ || code == NE)
4548     {
4549       if (ISA_HAS_SEQ_SNE
4550           && reg_imm10_operand (op1, GET_MODE (op1)))
4551         mips_emit_binary (code, target, op0, op1);
4552       else
4553         {
4554           rtx zie = mips_zero_if_equal (op0, op1);
4555           mips_emit_binary (code, target, zie, const0_rtx);
4556         }
4557     }
4558   else
4559     mips_emit_int_order_test (code, 0, target, op0, op1);
4560 }
4561
4562 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4563    CODE and jump to OPERANDS[3] if the condition holds.  */
4564
4565 void
4566 mips_expand_conditional_branch (rtx *operands)
4567 {
4568   enum rtx_code code = GET_CODE (operands[0]);
4569   rtx op0 = operands[1];
4570   rtx op1 = operands[2];
4571   rtx condition;
4572
4573   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4574   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4575   emit_jump_insn (gen_condjump (condition, operands[3]));
4576 }
4577
4578 /* Implement:
4579
4580    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4581    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
4582
4583 void
4584 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4585                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4586 {
4587   rtx cmp_result;
4588   bool reversed_p;
4589
4590   reversed_p = mips_reversed_fp_cond (&cond);
4591   cmp_result = gen_reg_rtx (CCV2mode);
4592   emit_insn (gen_scc_ps (cmp_result,
4593                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4594   if (reversed_p)
4595     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4596                                          cmp_result));
4597   else
4598     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4599                                          cmp_result));
4600 }
4601
4602 /* Perform the comparison in OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0]
4603    if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
4604
4605 void
4606 mips_expand_conditional_move (rtx *operands)
4607 {
4608   rtx cond;
4609   enum rtx_code code = GET_CODE (operands[1]);
4610   rtx op0 = XEXP (operands[1], 0);
4611   rtx op1 = XEXP (operands[1], 1);
4612
4613   mips_emit_compare (&code, &op0, &op1, true);
4614   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
4615   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4616                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4617                                                 operands[2], operands[3])));
4618 }
4619
4620 /* Perform the comparison in COMPARISON, then trap if the condition holds.  */
4621
4622 void
4623 mips_expand_conditional_trap (rtx comparison)
4624 {
4625   rtx op0, op1;
4626   enum machine_mode mode;
4627   enum rtx_code code;
4628
4629   /* MIPS conditional trap instructions don't have GT or LE flavors,
4630      so we must swap the operands and convert to LT and GE respectively.  */
4631   code = GET_CODE (comparison);
4632   switch (code)
4633     {
4634     case GT:
4635     case LE:
4636     case GTU:
4637     case LEU:
4638       code = swap_condition (code);
4639       op0 = XEXP (comparison, 1);
4640       op1 = XEXP (comparison, 0);
4641       break;
4642
4643     default:
4644       op0 = XEXP (comparison, 0);
4645       op1 = XEXP (comparison, 1);
4646       break;
4647     }
4648
4649   mode = GET_MODE (XEXP (comparison, 0));
4650   op0 = force_reg (mode, op0);
4651   if (!arith_operand (op1, mode))
4652     op1 = force_reg (mode, op1);
4653
4654   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4655                               gen_rtx_fmt_ee (code, mode, op0, op1),
4656                               const0_rtx));
4657 }
4658 \f
4659 /* Initialize *CUM for a call to a function of type FNTYPE.  */
4660
4661 void
4662 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4663 {
4664   memset (cum, 0, sizeof (*cum));
4665   cum->prototype = (fntype && prototype_p (fntype));
4666   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4667 }
4668
4669 /* Fill INFO with information about a single argument.  CUM is the
4670    cumulative state for earlier arguments.  MODE is the mode of this
4671    argument and TYPE is its type (if known).  NAMED is true if this
4672    is a named (fixed) argument rather than a variable one.  */
4673
4674 static void
4675 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4676                    enum machine_mode mode, const_tree type, bool named)
4677 {
4678   bool doubleword_aligned_p;
4679   unsigned int num_bytes, num_words, max_regs;
4680
4681   /* Work out the size of the argument.  */
4682   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4683   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4684
4685   /* Decide whether it should go in a floating-point register, assuming
4686      one is free.  Later code checks for availability.
4687
4688      The checks against UNITS_PER_FPVALUE handle the soft-float and
4689      single-float cases.  */
4690   switch (mips_abi)
4691     {
4692     case ABI_EABI:
4693       /* The EABI conventions have traditionally been defined in terms
4694          of TYPE_MODE, regardless of the actual type.  */
4695       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4696                       || mode == V2SFmode)
4697                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4698       break;
4699
4700     case ABI_32:
4701     case ABI_O64:
4702       /* Only leading floating-point scalars are passed in
4703          floating-point registers.  We also handle vector floats the same
4704          say, which is OK because they are not covered by the standard ABI.  */
4705       info->fpr_p = (!cum->gp_reg_found
4706                      && cum->arg_number < 2
4707                      && (type == 0
4708                          || SCALAR_FLOAT_TYPE_P (type)
4709                          || VECTOR_FLOAT_TYPE_P (type))
4710                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4711                          || mode == V2SFmode)
4712                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4713       break;
4714
4715     case ABI_N32:
4716     case ABI_64:
4717       /* Scalar, complex and vector floating-point types are passed in
4718          floating-point registers, as long as this is a named rather
4719          than a variable argument.  */
4720       info->fpr_p = (named
4721                      && (type == 0 || FLOAT_TYPE_P (type))
4722                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4723                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4724                          || mode == V2SFmode)
4725                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4726
4727       /* ??? According to the ABI documentation, the real and imaginary
4728          parts of complex floats should be passed in individual registers.
4729          The real and imaginary parts of stack arguments are supposed
4730          to be contiguous and there should be an extra word of padding
4731          at the end.
4732
4733          This has two problems.  First, it makes it impossible to use a
4734          single "void *" va_list type, since register and stack arguments
4735          are passed differently.  (At the time of writing, MIPSpro cannot
4736          handle complex float varargs correctly.)  Second, it's unclear
4737          what should happen when there is only one register free.
4738
4739          For now, we assume that named complex floats should go into FPRs
4740          if there are two FPRs free, otherwise they should be passed in the
4741          same way as a struct containing two floats.  */
4742       if (info->fpr_p
4743           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4744           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4745         {
4746           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4747             info->fpr_p = false;
4748           else
4749             num_words = 2;
4750         }
4751       break;
4752
4753     default:
4754       gcc_unreachable ();
4755     }
4756
4757   /* See whether the argument has doubleword alignment.  */
4758   doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
4759                           > BITS_PER_WORD);
4760
4761   /* Set REG_OFFSET to the register count we're interested in.
4762      The EABI allocates the floating-point registers separately,
4763      but the other ABIs allocate them like integer registers.  */
4764   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4765                       ? cum->num_fprs
4766                       : cum->num_gprs);
4767
4768   /* Advance to an even register if the argument is doubleword-aligned.  */
4769   if (doubleword_aligned_p)
4770     info->reg_offset += info->reg_offset & 1;
4771
4772   /* Work out the offset of a stack argument.  */
4773   info->stack_offset = cum->stack_words;
4774   if (doubleword_aligned_p)
4775     info->stack_offset += info->stack_offset & 1;
4776
4777   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4778
4779   /* Partition the argument between registers and stack.  */
4780   info->reg_words = MIN (num_words, max_regs);
4781   info->stack_words = num_words - info->reg_words;
4782 }
4783
4784 /* INFO describes a register argument that has the normal format for the
4785    argument's mode.  Return the register it uses, assuming that FPRs are
4786    available if HARD_FLOAT_P.  */
4787
4788 static unsigned int
4789 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4790 {
4791   if (!info->fpr_p || !hard_float_p)
4792     return GP_ARG_FIRST + info->reg_offset;
4793   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4794     /* In o32, the second argument is always passed in $f14
4795        for TARGET_DOUBLE_FLOAT, regardless of whether the
4796        first argument was a word or doubleword.  */
4797     return FP_ARG_FIRST + 2;
4798   else
4799     return FP_ARG_FIRST + info->reg_offset;
4800 }
4801
4802 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4803
4804 static bool
4805 mips_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
4806 {
4807   return !TARGET_OLDABI;
4808 }
4809
4810 /* Implement TARGET_FUNCTION_ARG.  */
4811
4812 static rtx
4813 mips_function_arg (cumulative_args_t cum_v, enum machine_mode mode,
4814                    const_tree type, bool named)
4815 {
4816   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
4817   struct mips_arg_info info;
4818
4819   /* We will be called with a mode of VOIDmode after the last argument
4820      has been seen.  Whatever we return will be passed to the call expander.
4821      If we need a MIPS16 fp_code, return a REG with the code stored as
4822      the mode.  */
4823   if (mode == VOIDmode)
4824     {
4825       if (TARGET_MIPS16 && cum->fp_code != 0)
4826         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4827       else
4828         return NULL;
4829     }
4830
4831   mips_get_arg_info (&info, cum, mode, type, named);
4832
4833   /* Return straight away if the whole argument is passed on the stack.  */
4834   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4835     return NULL;
4836
4837   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4838      contains a double in its entirety, then that 64-bit chunk is passed
4839      in a floating-point register.  */
4840   if (TARGET_NEWABI
4841       && TARGET_HARD_FLOAT
4842       && named
4843       && type != 0
4844       && TREE_CODE (type) == RECORD_TYPE
4845       && TYPE_SIZE_UNIT (type)
4846       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4847     {
4848       tree field;
4849
4850       /* First check to see if there is any such field.  */
4851       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
4852         if (TREE_CODE (field) == FIELD_DECL
4853             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4854             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4855             && host_integerp (bit_position (field), 0)
4856             && int_bit_position (field) % BITS_PER_WORD == 0)
4857           break;
4858
4859       if (field != 0)
4860         {
4861           /* Now handle the special case by returning a PARALLEL
4862              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4863              chunks are passed in registers.  */
4864           unsigned int i;
4865           HOST_WIDE_INT bitpos;
4866           rtx ret;
4867
4868           /* assign_parms checks the mode of ENTRY_PARM, so we must
4869              use the actual mode here.  */
4870           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4871
4872           bitpos = 0;
4873           field = TYPE_FIELDS (type);
4874           for (i = 0; i < info.reg_words; i++)
4875             {
4876               rtx reg;
4877
4878               for (; field; field = DECL_CHAIN (field))
4879                 if (TREE_CODE (field) == FIELD_DECL
4880                     && int_bit_position (field) >= bitpos)
4881                   break;
4882
4883               if (field
4884                   && int_bit_position (field) == bitpos
4885                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4886                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4887                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4888               else
4889                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4890
4891               XVECEXP (ret, 0, i)
4892                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4893                                      GEN_INT (bitpos / BITS_PER_UNIT));
4894
4895               bitpos += BITS_PER_WORD;
4896             }
4897           return ret;
4898         }
4899     }
4900
4901   /* Handle the n32/n64 conventions for passing complex floating-point
4902      arguments in FPR pairs.  The real part goes in the lower register
4903      and the imaginary part goes in the upper register.  */
4904   if (TARGET_NEWABI
4905       && info.fpr_p
4906       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4907     {
4908       rtx real, imag;
4909       enum machine_mode inner;
4910       unsigned int regno;
4911
4912       inner = GET_MODE_INNER (mode);
4913       regno = FP_ARG_FIRST + info.reg_offset;
4914       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4915         {
4916           /* Real part in registers, imaginary part on stack.  */
4917           gcc_assert (info.stack_words == info.reg_words);
4918           return gen_rtx_REG (inner, regno);
4919         }
4920       else
4921         {
4922           gcc_assert (info.stack_words == 0);
4923           real = gen_rtx_EXPR_LIST (VOIDmode,
4924                                     gen_rtx_REG (inner, regno),
4925                                     const0_rtx);
4926           imag = gen_rtx_EXPR_LIST (VOIDmode,
4927                                     gen_rtx_REG (inner,
4928                                                  regno + info.reg_words / 2),
4929                                     GEN_INT (GET_MODE_SIZE (inner)));
4930           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4931         }
4932     }
4933
4934   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4935 }
4936
4937 /* Implement TARGET_FUNCTION_ARG_ADVANCE.  */
4938
4939 static void
4940 mips_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
4941                            const_tree type, bool named)
4942 {
4943   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
4944   struct mips_arg_info info;
4945
4946   mips_get_arg_info (&info, cum, mode, type, named);
4947
4948   if (!info.fpr_p)
4949     cum->gp_reg_found = true;
4950
4951   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4952      an explanation of what this code does.  It assumes that we're using
4953      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4954      in FPRs.  */
4955   if (cum->arg_number < 2 && info.fpr_p)
4956     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4957
4958   /* Advance the register count.  This has the effect of setting
4959      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4960      argument required us to skip the final GPR and pass the whole
4961      argument on the stack.  */
4962   if (mips_abi != ABI_EABI || !info.fpr_p)
4963     cum->num_gprs = info.reg_offset + info.reg_words;
4964   else if (info.reg_words > 0)
4965     cum->num_fprs += MAX_FPRS_PER_FMT;
4966
4967   /* Advance the stack word count.  */
4968   if (info.stack_words > 0)
4969     cum->stack_words = info.stack_offset + info.stack_words;
4970
4971   cum->arg_number++;
4972 }
4973
4974 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4975
4976 static int
4977 mips_arg_partial_bytes (cumulative_args_t cum,
4978                         enum machine_mode mode, tree type, bool named)
4979 {
4980   struct mips_arg_info info;
4981
4982   mips_get_arg_info (&info, get_cumulative_args (cum), mode, type, named);
4983   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4984 }
4985
4986 /* Implement TARGET_FUNCTION_ARG_BOUNDARY.  Every parameter gets at
4987    least PARM_BOUNDARY bits of alignment, but will be given anything up
4988    to STACK_BOUNDARY bits if the type requires it.  */
4989
4990 static unsigned int
4991 mips_function_arg_boundary (enum machine_mode mode, const_tree type)
4992 {
4993   unsigned int alignment;
4994
4995   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4996   if (alignment < PARM_BOUNDARY)
4997     alignment = PARM_BOUNDARY;
4998   if (alignment > STACK_BOUNDARY)
4999     alignment = STACK_BOUNDARY;
5000   return alignment;
5001 }
5002
5003 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5004    upward rather than downward.  In other words, return true if the
5005    first byte of the stack slot has useful data, false if the last
5006    byte does.  */
5007
5008 bool
5009 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
5010 {
5011   /* On little-endian targets, the first byte of every stack argument
5012      is passed in the first byte of the stack slot.  */
5013   if (!BYTES_BIG_ENDIAN)
5014     return true;
5015
5016   /* Otherwise, integral types are padded downward: the last byte of a
5017      stack argument is passed in the last byte of the stack slot.  */
5018   if (type != 0
5019       ? (INTEGRAL_TYPE_P (type)
5020          || POINTER_TYPE_P (type)
5021          || FIXED_POINT_TYPE_P (type))
5022       : (SCALAR_INT_MODE_P (mode)
5023          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5024     return false;
5025
5026   /* Big-endian o64 pads floating-point arguments downward.  */
5027   if (mips_abi == ABI_O64)
5028     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5029       return false;
5030
5031   /* Other types are padded upward for o32, o64, n32 and n64.  */
5032   if (mips_abi != ABI_EABI)
5033     return true;
5034
5035   /* Arguments smaller than a stack slot are padded downward.  */
5036   if (mode != BLKmode)
5037     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5038   else
5039     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5040 }
5041
5042 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
5043    if the least significant byte of the register has useful data.  Return
5044    the opposite if the most significant byte does.  */
5045
5046 bool
5047 mips_pad_reg_upward (enum machine_mode mode, tree type)
5048 {
5049   /* No shifting is required for floating-point arguments.  */
5050   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5051     return !BYTES_BIG_ENDIAN;
5052
5053   /* Otherwise, apply the same padding to register arguments as we do
5054      to stack arguments.  */
5055   return mips_pad_arg_upward (mode, type);
5056 }
5057
5058 /* Return nonzero when an argument must be passed by reference.  */
5059
5060 static bool
5061 mips_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
5062                         enum machine_mode mode, const_tree type,
5063                         bool named ATTRIBUTE_UNUSED)
5064 {
5065   if (mips_abi == ABI_EABI)
5066     {
5067       int size;
5068
5069       /* ??? How should SCmode be handled?  */
5070       if (mode == DImode || mode == DFmode
5071           || mode == DQmode || mode == UDQmode
5072           || mode == DAmode || mode == UDAmode)
5073         return 0;
5074
5075       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5076       return size == -1 || size > UNITS_PER_WORD;
5077     }
5078   else
5079     {
5080       /* If we have a variable-sized parameter, we have no choice.  */
5081       return targetm.calls.must_pass_in_stack (mode, type);
5082     }
5083 }
5084
5085 /* Implement TARGET_CALLEE_COPIES.  */
5086
5087 static bool
5088 mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED,
5089                     enum machine_mode mode ATTRIBUTE_UNUSED,
5090                     const_tree type ATTRIBUTE_UNUSED, bool named)
5091 {
5092   return mips_abi == ABI_EABI && named;
5093 }
5094 \f
5095 /* See whether VALTYPE is a record whose fields should be returned in
5096    floating-point registers.  If so, return the number of fields and
5097    list them in FIELDS (which should have two elements).  Return 0
5098    otherwise.
5099
5100    For n32 & n64, a structure with one or two fields is returned in
5101    floating-point registers as long as every field has a floating-point
5102    type.  */
5103
5104 static int
5105 mips_fpr_return_fields (const_tree valtype, tree *fields)
5106 {
5107   tree field;
5108   int i;
5109
5110   if (!TARGET_NEWABI)
5111     return 0;
5112
5113   if (TREE_CODE (valtype) != RECORD_TYPE)
5114     return 0;
5115
5116   i = 0;
5117   for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5118     {
5119       if (TREE_CODE (field) != FIELD_DECL)
5120         continue;
5121
5122       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5123         return 0;
5124
5125       if (i == 2)
5126         return 0;
5127
5128       fields[i++] = field;
5129     }
5130   return i;
5131 }
5132
5133 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
5134    a value in the most significant part of $2/$3 if:
5135
5136       - the target is big-endian;
5137
5138       - the value has a structure or union type (we generalize this to
5139         cover aggregates from other languages too); and
5140
5141       - the structure is not returned in floating-point registers.  */
5142
5143 static bool
5144 mips_return_in_msb (const_tree valtype)
5145 {
5146   tree fields[2];
5147
5148   return (TARGET_NEWABI
5149           && TARGET_BIG_ENDIAN
5150           && AGGREGATE_TYPE_P (valtype)
5151           && mips_fpr_return_fields (valtype, fields) == 0);
5152 }
5153
5154 /* Return true if the function return value MODE will get returned in a
5155    floating-point register.  */
5156
5157 static bool
5158 mips_return_mode_in_fpr_p (enum machine_mode mode)
5159 {
5160   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5161            || mode == V2SFmode
5162            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5163           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5164 }
5165
5166 /* Return the representation of an FPR return register when the
5167    value being returned in FP_RETURN has mode VALUE_MODE and the
5168    return type itself has mode TYPE_MODE.  On NewABI targets,
5169    the two modes may be different for structures like:
5170
5171        struct __attribute__((packed)) foo { float f; }
5172
5173    where we return the SFmode value of "f" in FP_RETURN, but where
5174    the structure itself has mode BLKmode.  */
5175
5176 static rtx
5177 mips_return_fpr_single (enum machine_mode type_mode,
5178                         enum machine_mode value_mode)
5179 {
5180   rtx x;
5181
5182   x = gen_rtx_REG (value_mode, FP_RETURN);
5183   if (type_mode != value_mode)
5184     {
5185       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5186       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5187     }
5188   return x;
5189 }
5190
5191 /* Return a composite value in a pair of floating-point registers.
5192    MODE1 and OFFSET1 are the mode and byte offset for the first value,
5193    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
5194    complete value.
5195
5196    For n32 & n64, $f0 always holds the first value and $f2 the second.
5197    Otherwise the values are packed together as closely as possible.  */
5198
5199 static rtx
5200 mips_return_fpr_pair (enum machine_mode mode,
5201                       enum machine_mode mode1, HOST_WIDE_INT offset1,
5202                       enum machine_mode mode2, HOST_WIDE_INT offset2)
5203 {
5204   int inc;
5205
5206   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5207   return gen_rtx_PARALLEL
5208     (mode,
5209      gen_rtvec (2,
5210                 gen_rtx_EXPR_LIST (VOIDmode,
5211                                    gen_rtx_REG (mode1, FP_RETURN),
5212                                    GEN_INT (offset1)),
5213                 gen_rtx_EXPR_LIST (VOIDmode,
5214                                    gen_rtx_REG (mode2, FP_RETURN + inc),
5215                                    GEN_INT (offset2))));
5216
5217 }
5218
5219 /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5220    For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5221    For libcalls, VALTYPE is null and MODE is the mode of the return value.  */
5222
5223 static rtx
5224 mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5225                        enum machine_mode mode)
5226 {
5227   if (valtype)
5228     {
5229       tree fields[2];
5230       int unsigned_p;
5231       const_tree func;
5232
5233       if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5234         func = fn_decl_or_type;
5235       else
5236         func = NULL;
5237
5238       mode = TYPE_MODE (valtype);
5239       unsigned_p = TYPE_UNSIGNED (valtype);
5240
5241       /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5242          return values, promote the mode here too.  */
5243       mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5244
5245       /* Handle structures whose fields are returned in $f0/$f2.  */
5246       switch (mips_fpr_return_fields (valtype, fields))
5247         {
5248         case 1:
5249           return mips_return_fpr_single (mode,
5250                                          TYPE_MODE (TREE_TYPE (fields[0])));
5251
5252         case 2:
5253           return mips_return_fpr_pair (mode,
5254                                        TYPE_MODE (TREE_TYPE (fields[0])),
5255                                        int_byte_position (fields[0]),
5256                                        TYPE_MODE (TREE_TYPE (fields[1])),
5257                                        int_byte_position (fields[1]));
5258         }
5259
5260       /* If a value is passed in the most significant part of a register, see
5261          whether we have to round the mode up to a whole number of words.  */
5262       if (mips_return_in_msb (valtype))
5263         {
5264           HOST_WIDE_INT size = int_size_in_bytes (valtype);
5265           if (size % UNITS_PER_WORD != 0)
5266             {
5267               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5268               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5269             }
5270         }
5271
5272       /* For EABI, the class of return register depends entirely on MODE.
5273          For example, "struct { some_type x; }" and "union { some_type x; }"
5274          are returned in the same way as a bare "some_type" would be.
5275          Other ABIs only use FPRs for scalar, complex or vector types.  */
5276       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5277         return gen_rtx_REG (mode, GP_RETURN);
5278     }
5279
5280   if (!TARGET_MIPS16)
5281     {
5282       /* Handle long doubles for n32 & n64.  */
5283       if (mode == TFmode)
5284         return mips_return_fpr_pair (mode,
5285                                      DImode, 0,
5286                                      DImode, GET_MODE_SIZE (mode) / 2);
5287
5288       if (mips_return_mode_in_fpr_p (mode))
5289         {
5290           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5291             return mips_return_fpr_pair (mode,
5292                                          GET_MODE_INNER (mode), 0,
5293                                          GET_MODE_INNER (mode),
5294                                          GET_MODE_SIZE (mode) / 2);
5295           else
5296             return gen_rtx_REG (mode, FP_RETURN);
5297         }
5298     }
5299
5300   return gen_rtx_REG (mode, GP_RETURN);
5301 }
5302
5303 /* Implement TARGET_FUNCTION_VALUE.  */
5304
5305 static rtx
5306 mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5307                      bool outgoing ATTRIBUTE_UNUSED)
5308 {
5309   return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5310 }
5311
5312 /* Implement TARGET_LIBCALL_VALUE.  */
5313
5314 static rtx
5315 mips_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5316 {
5317   return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5318 }
5319
5320 /* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5321
5322    On the MIPS, R2 R3 and F0 F2 are the only register thus used.
5323    Currently, R2 and F0 are only implemented here (C has no complex type).  */
5324
5325 static bool
5326 mips_function_value_regno_p (const unsigned int regno)
5327 {
5328   if (regno == GP_RETURN
5329       || regno == FP_RETURN
5330       || (LONG_DOUBLE_TYPE_SIZE == 128
5331           && FP_RETURN != GP_RETURN
5332           && regno == FP_RETURN + 2))
5333     return true;
5334
5335   return false;
5336 }
5337
5338 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5339    all BLKmode objects are returned in memory.  Under the n32, n64
5340    and embedded ABIs, small structures are returned in a register.
5341    Objects with varying size must still be returned in memory, of
5342    course.  */
5343
5344 static bool
5345 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5346 {
5347   return (TARGET_OLDABI
5348           ? TYPE_MODE (type) == BLKmode
5349           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5350 }
5351 \f
5352 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5353
5354 static void
5355 mips_setup_incoming_varargs (cumulative_args_t cum, enum machine_mode mode,
5356                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
5357                              int no_rtl)
5358 {
5359   CUMULATIVE_ARGS local_cum;
5360   int gp_saved, fp_saved;
5361
5362   /* The caller has advanced CUM up to, but not beyond, the last named
5363      argument.  Advance a local copy of CUM past the last "real" named
5364      argument, to find out how many registers are left over.  */
5365   local_cum = *get_cumulative_args (cum);
5366   mips_function_arg_advance (pack_cumulative_args (&local_cum), mode, type,
5367                              true);
5368
5369   /* Found out how many registers we need to save.  */
5370   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5371   fp_saved = (EABI_FLOAT_VARARGS_P
5372               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5373               : 0);
5374
5375   if (!no_rtl)
5376     {
5377       if (gp_saved > 0)
5378         {
5379           rtx ptr, mem;
5380
5381           ptr = plus_constant (virtual_incoming_args_rtx,
5382                                REG_PARM_STACK_SPACE (cfun->decl)
5383                                - gp_saved * UNITS_PER_WORD);
5384           mem = gen_frame_mem (BLKmode, ptr);
5385           set_mem_alias_set (mem, get_varargs_alias_set ());
5386
5387           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5388                                mem, gp_saved);
5389         }
5390       if (fp_saved > 0)
5391         {
5392           /* We can't use move_block_from_reg, because it will use
5393              the wrong mode.  */
5394           enum machine_mode mode;
5395           int off, i;
5396
5397           /* Set OFF to the offset from virtual_incoming_args_rtx of
5398              the first float register.  The FP save area lies below
5399              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5400           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5401           off -= fp_saved * UNITS_PER_FPREG;
5402
5403           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5404
5405           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5406                i += MAX_FPRS_PER_FMT)
5407             {
5408               rtx ptr, mem;
5409
5410               ptr = plus_constant (virtual_incoming_args_rtx, off);
5411               mem = gen_frame_mem (mode, ptr);
5412               set_mem_alias_set (mem, get_varargs_alias_set ());
5413               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5414               off += UNITS_PER_HWFPVALUE;
5415             }
5416         }
5417     }
5418   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5419     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5420                                    + fp_saved * UNITS_PER_FPREG);
5421 }
5422
5423 /* Implement TARGET_BUILTIN_VA_LIST.  */
5424
5425 static tree
5426 mips_build_builtin_va_list (void)
5427 {
5428   if (EABI_FLOAT_VARARGS_P)
5429     {
5430       /* We keep 3 pointers, and two offsets.
5431
5432          Two pointers are to the overflow area, which starts at the CFA.
5433          One of these is constant, for addressing into the GPR save area
5434          below it.  The other is advanced up the stack through the
5435          overflow region.
5436
5437          The third pointer is to the bottom of the GPR save area.
5438          Since the FPR save area is just below it, we can address
5439          FPR slots off this pointer.
5440
5441          We also keep two one-byte offsets, which are to be subtracted
5442          from the constant pointers to yield addresses in the GPR and
5443          FPR save areas.  These are downcounted as float or non-float
5444          arguments are used, and when they get to zero, the argument
5445          must be obtained from the overflow region.  */
5446       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5447       tree array, index;
5448
5449       record = lang_hooks.types.make_type (RECORD_TYPE);
5450
5451       f_ovfl = build_decl (BUILTINS_LOCATION,
5452                            FIELD_DECL, get_identifier ("__overflow_argptr"),
5453                            ptr_type_node);
5454       f_gtop = build_decl (BUILTINS_LOCATION,
5455                            FIELD_DECL, get_identifier ("__gpr_top"),
5456                            ptr_type_node);
5457       f_ftop = build_decl (BUILTINS_LOCATION,
5458                            FIELD_DECL, get_identifier ("__fpr_top"),
5459                            ptr_type_node);
5460       f_goff = build_decl (BUILTINS_LOCATION,
5461                            FIELD_DECL, get_identifier ("__gpr_offset"),
5462                            unsigned_char_type_node);
5463       f_foff = build_decl (BUILTINS_LOCATION,
5464                            FIELD_DECL, get_identifier ("__fpr_offset"),
5465                            unsigned_char_type_node);
5466       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5467          warn on every user file.  */
5468       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5469       array = build_array_type (unsigned_char_type_node,
5470                                 build_index_type (index));
5471       f_res = build_decl (BUILTINS_LOCATION,
5472                           FIELD_DECL, get_identifier ("__reserved"), array);
5473
5474       DECL_FIELD_CONTEXT (f_ovfl) = record;
5475       DECL_FIELD_CONTEXT (f_gtop) = record;
5476       DECL_FIELD_CONTEXT (f_ftop) = record;
5477       DECL_FIELD_CONTEXT (f_goff) = record;
5478       DECL_FIELD_CONTEXT (f_foff) = record;
5479       DECL_FIELD_CONTEXT (f_res) = record;
5480
5481       TYPE_FIELDS (record) = f_ovfl;
5482       DECL_CHAIN (f_ovfl) = f_gtop;
5483       DECL_CHAIN (f_gtop) = f_ftop;
5484       DECL_CHAIN (f_ftop) = f_goff;
5485       DECL_CHAIN (f_goff) = f_foff;
5486       DECL_CHAIN (f_foff) = f_res;
5487
5488       layout_type (record);
5489       return record;
5490     }
5491   else if (TARGET_IRIX6)
5492     /* On IRIX 6, this type is 'char *'.  */
5493     return build_pointer_type (char_type_node);
5494   else
5495     /* Otherwise, we use 'void *'.  */
5496     return ptr_type_node;
5497 }
5498
5499 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5500
5501 static void
5502 mips_va_start (tree valist, rtx nextarg)
5503 {
5504   if (EABI_FLOAT_VARARGS_P)
5505     {
5506       const CUMULATIVE_ARGS *cum;
5507       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5508       tree ovfl, gtop, ftop, goff, foff;
5509       tree t;
5510       int gpr_save_area_size;
5511       int fpr_save_area_size;
5512       int fpr_offset;
5513
5514       cum = &crtl->args.info;
5515       gpr_save_area_size
5516         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5517       fpr_save_area_size
5518         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5519
5520       f_ovfl = TYPE_FIELDS (va_list_type_node);
5521       f_gtop = DECL_CHAIN (f_ovfl);
5522       f_ftop = DECL_CHAIN (f_gtop);
5523       f_goff = DECL_CHAIN (f_ftop);
5524       f_foff = DECL_CHAIN (f_goff);
5525
5526       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5527                      NULL_TREE);
5528       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5529                      NULL_TREE);
5530       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5531                      NULL_TREE);
5532       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5533                      NULL_TREE);
5534       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5535                      NULL_TREE);
5536
5537       /* Emit code to initialize OVFL, which points to the next varargs
5538          stack argument.  CUM->STACK_WORDS gives the number of stack
5539          words used by named arguments.  */
5540       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5541       if (cum->stack_words > 0)
5542         t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
5543       t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5544       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5545
5546       /* Emit code to initialize GTOP, the top of the GPR save area.  */
5547       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5548       t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5549       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5550
5551       /* Emit code to initialize FTOP, the top of the FPR save area.
5552          This address is gpr_save_area_bytes below GTOP, rounded
5553          down to the next fp-aligned boundary.  */
5554       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5555       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5556       fpr_offset &= -UNITS_PER_FPVALUE;
5557       if (fpr_offset)
5558         t = fold_build_pointer_plus_hwi (t, -fpr_offset);
5559       t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5560       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5561
5562       /* Emit code to initialize GOFF, the offset from GTOP of the
5563          next GPR argument.  */
5564       t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5565                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5566       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5567
5568       /* Likewise emit code to initialize FOFF, the offset from FTOP
5569          of the next FPR argument.  */
5570       t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5571                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5572       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5573     }
5574   else
5575     {
5576       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
5577       std_expand_builtin_va_start (valist, nextarg);
5578     }
5579 }
5580
5581 /* Like std_gimplify_va_arg_expr, but apply alignment to zero-sized
5582    types as well.  */
5583
5584 static tree
5585 mips_std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5586                                gimple_seq *post_p)
5587 {
5588   tree addr, t, type_size, rounded_size, valist_tmp;
5589   unsigned HOST_WIDE_INT align, boundary;
5590   bool indirect;
5591
5592   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
5593   if (indirect)
5594     type = build_pointer_type (type);
5595
5596   align = PARM_BOUNDARY / BITS_PER_UNIT;
5597   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
5598
5599   /* When we align parameter on stack for caller, if the parameter
5600      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
5601      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
5602      here with caller.  */
5603   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
5604     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
5605
5606   boundary /= BITS_PER_UNIT;
5607
5608   /* Hoist the valist value into a temporary for the moment.  */
5609   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
5610
5611   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
5612      requires greater alignment, we must perform dynamic alignment.  */
5613   if (boundary > align)
5614     {
5615       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
5616                   fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
5617       gimplify_and_add (t, pre_p);
5618
5619       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
5620                   fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
5621                                valist_tmp,
5622                                build_int_cst (TREE_TYPE (valist), -boundary)));
5623       gimplify_and_add (t, pre_p);
5624     }
5625   else
5626     boundary = align;
5627
5628   /* If the actual alignment is less than the alignment of the type,
5629      adjust the type accordingly so that we don't assume strict alignment
5630      when dereferencing the pointer.  */
5631   boundary *= BITS_PER_UNIT;
5632   if (boundary < TYPE_ALIGN (type))
5633     {
5634       type = build_variant_type_copy (type);
5635       TYPE_ALIGN (type) = boundary;
5636     }
5637
5638   /* Compute the rounded size of the type.  */
5639   type_size = size_in_bytes (type);
5640   rounded_size = round_up (type_size, align);
5641
5642   /* Reduce rounded_size so it's sharable with the postqueue.  */
5643   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
5644
5645   /* Get AP.  */
5646   addr = valist_tmp;
5647   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
5648     {
5649       /* Small args are padded downward.  */
5650       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
5651                        rounded_size, size_int (align));
5652       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
5653                        size_binop (MINUS_EXPR, rounded_size, type_size));
5654       addr = fold_build_pointer_plus (addr, t);
5655     }
5656
5657   /* Compute new value for AP.  */
5658   t = fold_build_pointer_plus (valist_tmp, rounded_size);
5659   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
5660   gimplify_and_add (t, pre_p);
5661
5662   addr = fold_convert (build_pointer_type (type), addr);
5663
5664   if (indirect)
5665     addr = build_va_arg_indirect_ref (addr);
5666
5667   return build_va_arg_indirect_ref (addr);
5668 }
5669
5670 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
5671
5672 static tree
5673 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5674                            gimple_seq *post_p)
5675 {
5676   tree addr;
5677   bool indirect_p;
5678
5679   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5680   if (indirect_p)
5681     type = build_pointer_type (type);
5682
5683   if (!EABI_FLOAT_VARARGS_P)
5684     addr = mips_std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5685   else
5686     {
5687       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5688       tree ovfl, top, off, align;
5689       HOST_WIDE_INT size, rsize, osize;
5690       tree t, u;
5691
5692       f_ovfl = TYPE_FIELDS (va_list_type_node);
5693       f_gtop = DECL_CHAIN (f_ovfl);
5694       f_ftop = DECL_CHAIN (f_gtop);
5695       f_goff = DECL_CHAIN (f_ftop);
5696       f_foff = DECL_CHAIN (f_goff);
5697
5698       /* Let:
5699
5700          TOP be the top of the GPR or FPR save area;
5701          OFF be the offset from TOP of the next register;
5702          ADDR_RTX be the address of the argument;
5703          SIZE be the number of bytes in the argument type;
5704          RSIZE be the number of bytes used to store the argument
5705            when it's in the register save area; and
5706          OSIZE be the number of bytes used to store it when it's
5707            in the stack overflow area.
5708
5709          The code we want is:
5710
5711          1: off &= -rsize;        // round down
5712          2: if (off != 0)
5713          3:   {
5714          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
5715          5:     off -= rsize;
5716          6:   }
5717          7: else
5718          8:   {
5719          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
5720          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
5721          11:    ovfl += osize;
5722          14:  }
5723
5724          [1] and [9] can sometimes be optimized away.  */
5725
5726       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5727                      NULL_TREE);
5728       size = int_size_in_bytes (type);
5729
5730       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
5731           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
5732         {
5733           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
5734                         unshare_expr (valist), f_ftop, NULL_TREE);
5735           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
5736                         unshare_expr (valist), f_foff, NULL_TREE);
5737
5738           /* When va_start saves FPR arguments to the stack, each slot
5739              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
5740              argument's precision.  */
5741           rsize = UNITS_PER_HWFPVALUE;
5742
5743           /* Overflow arguments are padded to UNITS_PER_WORD bytes
5744              (= PARM_BOUNDARY bits).  This can be different from RSIZE
5745              in two cases:
5746
5747              (1) On 32-bit targets when TYPE is a structure such as:
5748
5749              struct s { float f; };
5750
5751              Such structures are passed in paired FPRs, so RSIZE
5752              will be 8 bytes.  However, the structure only takes
5753              up 4 bytes of memory, so OSIZE will only be 4.
5754
5755              (2) In combinations such as -mgp64 -msingle-float
5756              -fshort-double.  Doubles passed in registers will then take
5757              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
5758              stack take up UNITS_PER_WORD bytes.  */
5759           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
5760         }
5761       else
5762         {
5763           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
5764                         unshare_expr (valist), f_gtop, NULL_TREE);
5765           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
5766                         unshare_expr (valist), f_goff, NULL_TREE);
5767           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5768           if (rsize > UNITS_PER_WORD)
5769             {
5770               /* [1] Emit code for: off &= -rsize.      */
5771               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
5772                           build_int_cst (TREE_TYPE (off), -rsize));
5773               gimplify_assign (unshare_expr (off), t, pre_p);
5774             }
5775           osize = rsize;
5776         }
5777
5778       /* [2] Emit code to branch if off == 0.  */
5779       t = build2 (NE_EXPR, boolean_type_node, unshare_expr (off),
5780                   build_int_cst (TREE_TYPE (off), 0));
5781       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
5782
5783       /* [5] Emit code for: off -= rsize.  We do this as a form of
5784          post-decrement not available to C.  */
5785       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
5786       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
5787
5788       /* [4] Emit code for:
5789          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
5790       t = fold_convert (sizetype, t);
5791       t = fold_build1 (NEGATE_EXPR, sizetype, t);
5792       t = fold_build_pointer_plus (top, t);
5793       if (BYTES_BIG_ENDIAN && rsize > size)
5794         t = fold_build_pointer_plus_hwi (t, rsize - size);
5795       COND_EXPR_THEN (addr) = t;
5796
5797       if (osize > UNITS_PER_WORD)
5798         {
5799           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
5800           t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
5801           u = build_int_cst (TREE_TYPE (t), -osize);
5802           t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
5803           align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
5804                           unshare_expr (ovfl), t);
5805         }
5806       else
5807         align = NULL;
5808
5809       /* [10, 11] Emit code for:
5810          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
5811          ovfl += osize.  */
5812       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
5813       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5814       if (BYTES_BIG_ENDIAN && osize > size)
5815         t = fold_build_pointer_plus_hwi (t, osize - size);
5816
5817       /* String [9] and [10, 11] together.  */
5818       if (align)
5819         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5820       COND_EXPR_ELSE (addr) = t;
5821
5822       addr = fold_convert (build_pointer_type (type), addr);
5823       addr = build_va_arg_indirect_ref (addr);
5824     }
5825
5826   if (indirect_p)
5827     addr = build_va_arg_indirect_ref (addr);
5828
5829   return addr;
5830 }
5831 \f
5832 /* Declare a unique, locally-binding function called NAME, then start
5833    its definition.  */
5834
5835 static void
5836 mips_start_unique_function (const char *name)
5837 {
5838   tree decl;
5839
5840   decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
5841                      get_identifier (name),
5842                      build_function_type_list (void_type_node, NULL_TREE));
5843   DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
5844                                    NULL_TREE, void_type_node);
5845   TREE_PUBLIC (decl) = 1;
5846   TREE_STATIC (decl) = 1;
5847
5848   DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
5849
5850   targetm.asm_out.unique_section (decl, 0);
5851   switch_to_section (get_named_section (decl, NULL, 0));
5852
5853   targetm.asm_out.globalize_label (asm_out_file, name);
5854   fputs ("\t.hidden\t", asm_out_file);
5855   assemble_name (asm_out_file, name);
5856   putc ('\n', asm_out_file);
5857 }
5858
5859 /* Start a definition of function NAME.  MIPS16_P indicates whether the
5860    function contains MIPS16 code.  */
5861
5862 static void
5863 mips_start_function_definition (const char *name, bool mips16_p)
5864 {
5865   if (mips16_p)
5866     fprintf (asm_out_file, "\t.set\tmips16\n");
5867   else
5868     fprintf (asm_out_file, "\t.set\tnomips16\n");
5869
5870   if (!flag_inhibit_size_directive)
5871     {
5872       fputs ("\t.ent\t", asm_out_file);
5873       assemble_name (asm_out_file, name);
5874       fputs ("\n", asm_out_file);
5875     }
5876
5877   ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
5878
5879   /* Start the definition proper.  */
5880   assemble_name (asm_out_file, name);
5881   fputs (":\n", asm_out_file);
5882 }
5883
5884 /* End a function definition started by mips_start_function_definition.  */
5885
5886 static void
5887 mips_end_function_definition (const char *name)
5888 {
5889   if (!flag_inhibit_size_directive)
5890     {
5891       fputs ("\t.end\t", asm_out_file);
5892       assemble_name (asm_out_file, name);
5893       fputs ("\n", asm_out_file);
5894     }
5895 }
5896 \f
5897 /* Output a definition of the __mips16_rdhwr function.  */
5898
5899 static void
5900 mips_output_mips16_rdhwr (void)
5901 {
5902   const char *name;
5903
5904   name = "__mips16_rdhwr";
5905   mips_start_unique_function (name);
5906   mips_start_function_definition (name, false);
5907   fprintf (asm_out_file,
5908            "\t.set\tpush\n"
5909            "\t.set\tmips32r2\n"
5910            "\t.set\tnoreorder\n"
5911            "\trdhwr\t$3,$29\n"
5912            "\t.set\tpop\n"
5913            "\tj\t$31\n");
5914   mips_end_function_definition (name);
5915 }
5916 \f
5917 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5918
5919 static bool
5920 mips_ok_for_lazy_binding_p (rtx x)
5921 {
5922   return (TARGET_USE_GOT
5923           && GET_CODE (x) == SYMBOL_REF
5924           && !SYMBOL_REF_BIND_NOW_P (x)
5925           && !mips_symbol_binds_local_p (x));
5926 }
5927
5928 /* Load function address ADDR into register DEST.  TYPE is as for
5929    mips_expand_call.  Return true if we used an explicit lazy-binding
5930    sequence.  */
5931
5932 static bool
5933 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
5934 {
5935   /* If we're generating PIC, and this call is to a global function,
5936      try to allow its address to be resolved lazily.  This isn't
5937      possible for sibcalls when $gp is call-saved because the value
5938      of $gp on entry to the stub would be our caller's gp, not ours.  */
5939   if (TARGET_EXPLICIT_RELOCS
5940       && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
5941       && mips_ok_for_lazy_binding_p (addr))
5942     {
5943       addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
5944       emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
5945       return true;
5946     }
5947   else
5948     {
5949       mips_emit_move (dest, addr);
5950       return false;
5951     }
5952 }
5953 \f
5954 /* Each locally-defined hard-float MIPS16 function has a local symbol
5955    associated with it.  This hash table maps the function symbol (FUNC)
5956    to the local symbol (LOCAL). */
5957 struct GTY(()) mips16_local_alias {
5958   rtx func;
5959   rtx local;
5960 };
5961 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
5962
5963 /* Hash table callbacks for mips16_local_aliases.  */
5964
5965 static hashval_t
5966 mips16_local_aliases_hash (const void *entry)
5967 {
5968   const struct mips16_local_alias *alias;
5969
5970   alias = (const struct mips16_local_alias *) entry;
5971   return htab_hash_string (XSTR (alias->func, 0));
5972 }
5973
5974 static int
5975 mips16_local_aliases_eq (const void *entry1, const void *entry2)
5976 {
5977   const struct mips16_local_alias *alias1, *alias2;
5978
5979   alias1 = (const struct mips16_local_alias *) entry1;
5980   alias2 = (const struct mips16_local_alias *) entry2;
5981   return rtx_equal_p (alias1->func, alias2->func);
5982 }
5983
5984 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
5985    Return a local alias for it, creating a new one if necessary.  */
5986
5987 static rtx
5988 mips16_local_alias (rtx func)
5989 {
5990   struct mips16_local_alias *alias, tmp_alias;
5991   void **slot;
5992
5993   /* Create the hash table if this is the first call.  */
5994   if (mips16_local_aliases == NULL)
5995     mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
5996                                             mips16_local_aliases_eq, NULL);
5997
5998   /* Look up the function symbol, creating a new entry if need be.  */
5999   tmp_alias.func = func;
6000   slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
6001   gcc_assert (slot != NULL);
6002
6003   alias = (struct mips16_local_alias *) *slot;
6004   if (alias == NULL)
6005     {
6006       const char *func_name, *local_name;
6007       rtx local;
6008
6009       /* Create a new SYMBOL_REF for the local symbol.  The choice of
6010          __fn_local_* is based on the __fn_stub_* names that we've
6011          traditionally used for the non-MIPS16 stub.  */
6012       func_name = targetm.strip_name_encoding (XSTR (func, 0));
6013       local_name = ACONCAT (("__fn_local_", func_name, NULL));
6014       local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
6015       SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
6016
6017       /* Create a new structure to represent the mapping.  */
6018       alias = ggc_alloc_mips16_local_alias ();
6019       alias->func = func;
6020       alias->local = local;
6021       *slot = alias;
6022     }
6023   return alias->local;
6024 }
6025 \f
6026 /* A chained list of functions for which mips16_build_call_stub has already
6027    generated a stub.  NAME is the name of the function and FP_RET_P is true
6028    if the function returns a value in floating-point registers.  */
6029 struct mips16_stub {
6030   struct mips16_stub *next;
6031   char *name;
6032   bool fp_ret_p;
6033 };
6034 static struct mips16_stub *mips16_stubs;
6035
6036 /* Return the two-character string that identifies floating-point
6037    return mode MODE in the name of a MIPS16 function stub.  */
6038
6039 static const char *
6040 mips16_call_stub_mode_suffix (enum machine_mode mode)
6041 {
6042   if (mode == SFmode)
6043     return "sf";
6044   else if (mode == DFmode)
6045     return "df";
6046   else if (mode == SCmode)
6047     return "sc";
6048   else if (mode == DCmode)
6049     return "dc";
6050   else if (mode == V2SFmode)
6051     return "df";
6052   else
6053     gcc_unreachable ();
6054 }
6055
6056 /* Write instructions to move a 32-bit value between general register
6057    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
6058    from GPREG to FPREG and 'f' to move in the opposite direction.  */
6059
6060 static void
6061 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6062 {
6063   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6064            reg_names[gpreg], reg_names[fpreg]);
6065 }
6066
6067 /* Likewise for 64-bit values.  */
6068
6069 static void
6070 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6071 {
6072   if (TARGET_64BIT)
6073     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
6074              reg_names[gpreg], reg_names[fpreg]);
6075   else if (TARGET_FLOAT64)
6076     {
6077       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6078                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6079       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
6080                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
6081     }
6082   else
6083     {
6084       /* Move the least-significant word.  */
6085       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6086                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6087       /* ...then the most significant word.  */
6088       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6089                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6090     }
6091 }
6092
6093 /* Write out code to move floating-point arguments into or out of
6094    general registers.  FP_CODE is the code describing which arguments
6095    are present (see the comment above the definition of CUMULATIVE_ARGS
6096    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
6097
6098 static void
6099 mips_output_args_xfer (int fp_code, char direction)
6100 {
6101   unsigned int gparg, fparg, f;
6102   CUMULATIVE_ARGS cum;
6103
6104   /* This code only works for o32 and o64.  */
6105   gcc_assert (TARGET_OLDABI);
6106
6107   mips_init_cumulative_args (&cum, NULL);
6108
6109   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6110     {
6111       enum machine_mode mode;
6112       struct mips_arg_info info;
6113
6114       if ((f & 3) == 1)
6115         mode = SFmode;
6116       else if ((f & 3) == 2)
6117         mode = DFmode;
6118       else
6119         gcc_unreachable ();
6120
6121       mips_get_arg_info (&info, &cum, mode, NULL, true);
6122       gparg = mips_arg_regno (&info, false);
6123       fparg = mips_arg_regno (&info, true);
6124
6125       if (mode == SFmode)
6126         mips_output_32bit_xfer (direction, gparg, fparg);
6127       else
6128         mips_output_64bit_xfer (direction, gparg, fparg);
6129
6130       mips_function_arg_advance (pack_cumulative_args (&cum), mode, NULL, true);
6131     }
6132 }
6133
6134 /* Write a MIPS16 stub for the current function.  This stub is used
6135    for functions which take arguments in the floating-point registers.
6136    It is normal-mode code that moves the floating-point arguments
6137    into the general registers and then jumps to the MIPS16 code.  */
6138
6139 static void
6140 mips16_build_function_stub (void)
6141 {
6142   const char *fnname, *alias_name, *separator;
6143   char *secname, *stubname;
6144   tree stubdecl;
6145   unsigned int f;
6146   rtx symbol, alias;
6147
6148   /* Create the name of the stub, and its unique section.  */
6149   symbol = XEXP (DECL_RTL (current_function_decl), 0);
6150   alias = mips16_local_alias (symbol);
6151
6152   fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6153   alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6154   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6155   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6156
6157   /* Build a decl for the stub.  */
6158   stubdecl = build_decl (BUILTINS_LOCATION,
6159                          FUNCTION_DECL, get_identifier (stubname),
6160                          build_function_type_list (void_type_node, NULL_TREE));
6161   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6162   DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6163                                        RESULT_DECL, NULL_TREE, void_type_node);
6164
6165   /* Output a comment.  */
6166   fprintf (asm_out_file, "\t# Stub function for %s (",
6167            current_function_name ());
6168   separator = "";
6169   for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6170     {
6171       fprintf (asm_out_file, "%s%s", separator,
6172                (f & 3) == 1 ? "float" : "double");
6173       separator = ", ";
6174     }
6175   fprintf (asm_out_file, ")\n");
6176
6177   /* Start the function definition.  */
6178   assemble_start_function (stubdecl, stubname);
6179   mips_start_function_definition (stubname, false);
6180
6181   /* If generating pic2 code, either set up the global pointer or
6182      switch to pic0.  */
6183   if (TARGET_ABICALLS_PIC2)
6184     {
6185       if (TARGET_ABSOLUTE_ABICALLS)
6186         fprintf (asm_out_file, "\t.option\tpic0\n");
6187       else
6188         {
6189           output_asm_insn ("%(.cpload\t%^%)", NULL);
6190           /* Emit an R_MIPS_NONE relocation to tell the linker what the
6191              target function is.  Use a local GOT access when loading the
6192              symbol, to cut down on the number of unnecessary GOT entries
6193              for stubs that aren't needed.  */
6194           output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6195           symbol = alias;
6196         }
6197     }
6198
6199   /* Load the address of the MIPS16 function into $25.  Do this first so
6200      that targets with coprocessor interlocks can use an MFC1 to fill the
6201      delay slot.  */
6202   output_asm_insn ("la\t%^,%0", &symbol);
6203
6204   /* Move the arguments from floating-point registers to general registers.  */
6205   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6206
6207   /* Jump to the MIPS16 function.  */
6208   output_asm_insn ("jr\t%^", NULL);
6209
6210   if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6211     fprintf (asm_out_file, "\t.option\tpic2\n");
6212
6213   mips_end_function_definition (stubname);
6214
6215   /* If the linker needs to create a dynamic symbol for the target
6216      function, it will associate the symbol with the stub (which,
6217      unlike the target function, follows the proper calling conventions).
6218      It is therefore useful to have a local alias for the target function,
6219      so that it can still be identified as MIPS16 code.  As an optimization,
6220      this symbol can also be used for indirect MIPS16 references from
6221      within this file.  */
6222   ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6223
6224   switch_to_section (function_section (current_function_decl));
6225 }
6226
6227 /* The current function is a MIPS16 function that returns a value in an FPR.
6228    Copy the return value from its soft-float to its hard-float location.
6229    libgcc2 has special non-MIPS16 helper functions for each case.  */
6230
6231 static void
6232 mips16_copy_fpr_return_value (void)
6233 {
6234   rtx fn, insn, retval;
6235   tree return_type;
6236   enum machine_mode return_mode;
6237   const char *name;
6238
6239   return_type = DECL_RESULT (current_function_decl);
6240   return_mode = DECL_MODE (return_type);
6241
6242   name = ACONCAT (("__mips16_ret_",
6243                    mips16_call_stub_mode_suffix (return_mode),
6244                    NULL));
6245   fn = mips16_stub_function (name);
6246
6247   /* The function takes arguments in $2 (and possibly $3), so calls
6248      to it cannot be lazily bound.  */
6249   SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6250
6251   /* Model the call as something that takes the GPR return value as
6252      argument and returns an "updated" value.  */
6253   retval = gen_rtx_REG (return_mode, GP_RETURN);
6254   insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6255                            const0_rtx, NULL_RTX, false);
6256   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6257 }
6258
6259 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6260    RETVAL is the location of the return value, or null if this is
6261    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
6262    arguments and FP_CODE is the code built by mips_function_arg;
6263    see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6264
6265    There are three alternatives:
6266
6267    - If a stub was needed, emit the call and return the call insn itself.
6268
6269    - If we can avoid using a stub by redirecting the call, set *FN_PTR
6270      to the new target and return null.
6271
6272    - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6273      unmodified.
6274
6275    A stub is needed for calls to functions that, in normal mode,
6276    receive arguments in FPRs or return values in FPRs.  The stub
6277    copies the arguments from their soft-float positions to their
6278    hard-float positions, calls the real function, then copies the
6279    return value from its hard-float position to its soft-float
6280    position.
6281
6282    We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6283    If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6284    automatically redirects the JAL to the stub, otherwise the JAL
6285    continues to call FN directly.  */
6286
6287 static rtx
6288 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6289 {
6290   const char *fnname;
6291   bool fp_ret_p;
6292   struct mips16_stub *l;
6293   rtx insn, fn;
6294
6295   /* We don't need to do anything if we aren't in MIPS16 mode, or if
6296      we were invoked with the -msoft-float option.  */
6297   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6298     return NULL_RTX;
6299
6300   /* Figure out whether the value might come back in a floating-point
6301      register.  */
6302   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6303
6304   /* We don't need to do anything if there were no floating-point
6305      arguments and the value will not be returned in a floating-point
6306      register.  */
6307   if (fp_code == 0 && !fp_ret_p)
6308     return NULL_RTX;
6309
6310   /* We don't need to do anything if this is a call to a special
6311      MIPS16 support function.  */
6312   fn = *fn_ptr;
6313   if (mips16_stub_function_p (fn))
6314     return NULL_RTX;
6315
6316   /* If we're calling a locally-defined MIPS16 function, we know that
6317      it will return values in both the "soft-float" and "hard-float"
6318      registers.  There is no need to use a stub to move the latter
6319      to the former.  */
6320   if (fp_code == 0 && mips16_local_function_p (fn))
6321     return NULL_RTX;
6322
6323   /* This code will only work for o32 and o64 abis.  The other ABI's
6324      require more sophisticated support.  */
6325   gcc_assert (TARGET_OLDABI);
6326
6327   /* If we're calling via a function pointer, use one of the magic
6328      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6329      Each stub expects the function address to arrive in register $2.  */
6330   if (GET_CODE (fn) != SYMBOL_REF
6331       || !call_insn_operand (fn, VOIDmode))
6332     {
6333       char buf[30];
6334       rtx stub_fn, insn, addr;
6335       bool lazy_p;
6336
6337       /* If this is a locally-defined and locally-binding function,
6338          avoid the stub by calling the local alias directly.  */
6339       if (mips16_local_function_p (fn))
6340         {
6341           *fn_ptr = mips16_local_alias (fn);
6342           return NULL_RTX;
6343         }
6344
6345       /* Create a SYMBOL_REF for the libgcc.a function.  */
6346       if (fp_ret_p)
6347         sprintf (buf, "__mips16_call_stub_%s_%d",
6348                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
6349                  fp_code);
6350       else
6351         sprintf (buf, "__mips16_call_stub_%d", fp_code);
6352       stub_fn = mips16_stub_function (buf);
6353
6354       /* The function uses $2 as an argument, so calls to it
6355          cannot be lazily bound.  */
6356       SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6357
6358       /* Load the target function into $2.  */
6359       addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6360       lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6361
6362       /* Emit the call.  */
6363       insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6364                                args_size, NULL_RTX, lazy_p);
6365
6366       /* Tell GCC that this call does indeed use the value of $2.  */
6367       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6368
6369       /* If we are handling a floating-point return value, we need to
6370          save $18 in the function prologue.  Putting a note on the
6371          call will mean that df_regs_ever_live_p ($18) will be true if the
6372          call is not eliminated, and we can check that in the prologue
6373          code.  */
6374       if (fp_ret_p)
6375         CALL_INSN_FUNCTION_USAGE (insn) =
6376           gen_rtx_EXPR_LIST (VOIDmode,
6377                              gen_rtx_CLOBBER (VOIDmode,
6378                                               gen_rtx_REG (word_mode, 18)),
6379                              CALL_INSN_FUNCTION_USAGE (insn));
6380
6381       return insn;
6382     }
6383
6384   /* We know the function we are going to call.  If we have already
6385      built a stub, we don't need to do anything further.  */
6386   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6387   for (l = mips16_stubs; l != NULL; l = l->next)
6388     if (strcmp (l->name, fnname) == 0)
6389       break;
6390
6391   if (l == NULL)
6392     {
6393       const char *separator;
6394       char *secname, *stubname;
6395       tree stubid, stubdecl;
6396       unsigned int f;
6397
6398       /* If the function does not return in FPRs, the special stub
6399          section is named
6400              .mips16.call.FNNAME
6401
6402          If the function does return in FPRs, the stub section is named
6403              .mips16.call.fp.FNNAME
6404
6405          Build a decl for the stub.  */
6406       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6407                           fnname, NULL));
6408       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6409                            fnname, NULL));
6410       stubid = get_identifier (stubname);
6411       stubdecl = build_decl (BUILTINS_LOCATION,
6412                              FUNCTION_DECL, stubid,
6413                              build_function_type_list (void_type_node,
6414                                                        NULL_TREE));
6415       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6416       DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6417                                            RESULT_DECL, NULL_TREE,
6418                                            void_type_node);
6419
6420       /* Output a comment.  */
6421       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6422                (fp_ret_p
6423                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6424                 : ""),
6425                fnname);
6426       separator = "";
6427       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6428         {
6429           fprintf (asm_out_file, "%s%s", separator,
6430                    (f & 3) == 1 ? "float" : "double");
6431           separator = ", ";
6432         }
6433       fprintf (asm_out_file, ")\n");
6434
6435       /* Start the function definition.  */
6436       assemble_start_function (stubdecl, stubname);
6437       mips_start_function_definition (stubname, false);
6438
6439       if (fp_ret_p)
6440         {
6441           fprintf (asm_out_file, "\t.cfi_startproc\n");
6442
6443           /* Create a fake CFA 4 bytes below the stack pointer.
6444              This works around unwinders (like libgcc's) that expect
6445              the CFA for non-signal frames to be unique.  */
6446           fprintf (asm_out_file, "\t.cfi_def_cfa 29,-4\n");
6447
6448           /* "Save" $sp in itself so we don't use the fake CFA.
6449              This is: DW_CFA_val_expression r29, { DW_OP_reg29 }.  */
6450           fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
6451         }
6452       else
6453         {
6454           /* Load the address of the MIPS16 function into $25.  Do this
6455              first so that targets with coprocessor interlocks can use
6456              an MFC1 to fill the delay slot.  */
6457           if (TARGET_EXPLICIT_RELOCS)
6458             {
6459               output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6460               output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6461             }
6462           else
6463             output_asm_insn ("la\t%^,%0", &fn);
6464         }
6465
6466       /* Move the arguments from general registers to floating-point
6467          registers.  */
6468       mips_output_args_xfer (fp_code, 't');
6469
6470       if (fp_ret_p)
6471         {
6472           /* Save the return address in $18 and call the non-MIPS16 function.
6473              The stub's caller knows that $18 might be clobbered, even though
6474              $18 is usually a call-saved register.  */
6475           fprintf (asm_out_file, "\tmove\t%s,%s\n",
6476                    reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6477           output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6478           fprintf (asm_out_file, "\t.cfi_register 31,18\n");
6479
6480           /* Move the result from floating-point registers to
6481              general registers.  */
6482           switch (GET_MODE (retval))
6483             {
6484             case SCmode:
6485               mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
6486                                       TARGET_BIG_ENDIAN
6487                                       ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6488                                       : FP_REG_FIRST);
6489               mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
6490                                       TARGET_LITTLE_ENDIAN
6491                                       ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6492                                       : FP_REG_FIRST);
6493               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6494                 {
6495                   /* On 64-bit targets, complex floats are returned in
6496                      a single GPR, such that "sd" on a suitably-aligned
6497                      target would store the value correctly.  */
6498                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6499                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6500                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6501                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6502                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6503                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6504                   fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
6505                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6506                            reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6507                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6508                            reg_names[GP_RETURN],
6509                            reg_names[GP_RETURN],
6510                            reg_names[GP_RETURN + 1]);
6511                 }
6512               break;
6513
6514             case SFmode:
6515               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6516               break;
6517
6518             case DCmode:
6519               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6520                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6521               /* Fall though.  */
6522             case DFmode:
6523             case V2SFmode:
6524               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6525               break;
6526
6527             default:
6528               gcc_unreachable ();
6529             }
6530           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6531           fprintf (asm_out_file, "\t.cfi_endproc\n");
6532         }
6533       else
6534         {
6535           /* Jump to the previously-loaded address.  */
6536           output_asm_insn ("jr\t%^", NULL);
6537         }
6538
6539 #ifdef ASM_DECLARE_FUNCTION_SIZE
6540       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6541 #endif
6542
6543       mips_end_function_definition (stubname);
6544
6545       /* Record this stub.  */
6546       l = XNEW (struct mips16_stub);
6547       l->name = xstrdup (fnname);
6548       l->fp_ret_p = fp_ret_p;
6549       l->next = mips16_stubs;
6550       mips16_stubs = l;
6551     }
6552
6553   /* If we expect a floating-point return value, but we've built a
6554      stub which does not expect one, then we're in trouble.  We can't
6555      use the existing stub, because it won't handle the floating-point
6556      value.  We can't build a new stub, because the linker won't know
6557      which stub to use for the various calls in this object file.
6558      Fortunately, this case is illegal, since it means that a function
6559      was declared in two different ways in a single compilation.  */
6560   if (fp_ret_p && !l->fp_ret_p)
6561     error ("cannot handle inconsistent calls to %qs", fnname);
6562
6563   if (retval == NULL_RTX)
6564     insn = gen_call_internal_direct (fn, args_size);
6565   else
6566     insn = gen_call_value_internal_direct (retval, fn, args_size);
6567   insn = mips_emit_call_insn (insn, fn, fn, false);
6568
6569   /* If we are calling a stub which handles a floating-point return
6570      value, we need to arrange to save $18 in the prologue.  We do this
6571      by marking the function call as using the register.  The prologue
6572      will later see that it is used, and emit code to save it.  */
6573   if (fp_ret_p)
6574     CALL_INSN_FUNCTION_USAGE (insn) =
6575       gen_rtx_EXPR_LIST (VOIDmode,
6576                          gen_rtx_CLOBBER (VOIDmode,
6577                                           gen_rtx_REG (word_mode, 18)),
6578                          CALL_INSN_FUNCTION_USAGE (insn));
6579
6580   return insn;
6581 }
6582 \f
6583 /* Expand a call of type TYPE.  RESULT is where the result will go (null
6584    for "call"s and "sibcall"s), ADDR is the address of the function,
6585    ARGS_SIZE is the size of the arguments and AUX is the value passed
6586    to us by mips_function_arg.  LAZY_P is true if this call already
6587    involves a lazily-bound function address (such as when calling
6588    functions through a MIPS16 hard-float stub).
6589
6590    Return the call itself.  */
6591
6592 rtx
6593 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6594                   rtx args_size, rtx aux, bool lazy_p)
6595 {
6596   rtx orig_addr, pattern, insn;
6597   int fp_code;
6598
6599   fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6600   insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6601   if (insn)
6602     {
6603       gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6604       return insn;
6605     }
6606                                  ;
6607   orig_addr = addr;
6608   if (!call_insn_operand (addr, VOIDmode))
6609     {
6610       if (type == MIPS_CALL_EPILOGUE)
6611         addr = MIPS_EPILOGUE_TEMP (Pmode);
6612       else
6613         addr = gen_reg_rtx (Pmode);
6614       lazy_p |= mips_load_call_address (type, addr, orig_addr);
6615     }
6616
6617   if (result == 0)
6618     {
6619       rtx (*fn) (rtx, rtx);
6620
6621       if (type == MIPS_CALL_SIBCALL)
6622         fn = gen_sibcall_internal;
6623       else
6624         fn = gen_call_internal;
6625
6626       pattern = fn (addr, args_size);
6627     }
6628   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6629     {
6630       /* Handle return values created by mips_return_fpr_pair.  */
6631       rtx (*fn) (rtx, rtx, rtx, rtx);
6632       rtx reg1, reg2;
6633
6634       if (type == MIPS_CALL_SIBCALL)
6635         fn = gen_sibcall_value_multiple_internal;
6636       else
6637         fn = gen_call_value_multiple_internal;
6638
6639       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6640       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6641       pattern = fn (reg1, addr, args_size, reg2);
6642     }
6643   else
6644     {
6645       rtx (*fn) (rtx, rtx, rtx);
6646
6647       if (type == MIPS_CALL_SIBCALL)
6648         fn = gen_sibcall_value_internal;
6649       else
6650         fn = gen_call_value_internal;
6651
6652       /* Handle return values created by mips_return_fpr_single.  */
6653       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6654         result = XEXP (XVECEXP (result, 0, 0), 0);
6655       pattern = fn (result, addr, args_size);
6656     }
6657
6658   return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6659 }
6660
6661 /* Split call instruction INSN into a $gp-clobbering call and
6662    (where necessary) an instruction to restore $gp from its save slot.
6663    CALL_PATTERN is the pattern of the new call.  */
6664
6665 void
6666 mips_split_call (rtx insn, rtx call_pattern)
6667 {
6668   emit_call_insn (call_pattern);
6669   if (!find_reg_note (insn, REG_NORETURN, 0))
6670     /* Pick a temporary register that is suitable for both MIPS16 and
6671        non-MIPS16 code.  $4 and $5 are used for returning complex double
6672        values in soft-float code, so $6 is the first suitable candidate.  */
6673     mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6674 }
6675
6676 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
6677
6678 static bool
6679 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
6680 {
6681   if (!TARGET_SIBCALLS)
6682     return false;
6683
6684   /* Interrupt handlers need special epilogue code and therefore can't
6685      use sibcalls.  */
6686   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
6687     return false;
6688
6689   /* We can't do a sibcall if the called function is a MIPS16 function
6690      because there is no direct "jx" instruction equivalent to "jalx" to
6691      switch the ISA mode.  We only care about cases where the sibling
6692      and normal calls would both be direct.  */
6693   if (decl
6694       && mips_use_mips16_mode_p (decl)
6695       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6696     return false;
6697
6698   /* When -minterlink-mips16 is in effect, assume that non-locally-binding
6699      functions could be MIPS16 ones unless an attribute explicitly tells
6700      us otherwise.  */
6701   if (TARGET_INTERLINK_MIPS16
6702       && decl
6703       && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
6704       && !mips_nomips16_decl_p (decl)
6705       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6706     return false;
6707
6708   /* Otherwise OK.  */
6709   return true;
6710 }
6711 \f
6712 /* Emit code to move general operand SRC into condition-code
6713    register DEST given that SCRATCH is a scratch TFmode FPR.
6714    The sequence is:
6715
6716         FP1 = SRC
6717         FP2 = 0.0f
6718         DEST = FP2 < FP1
6719
6720    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
6721
6722 void
6723 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
6724 {
6725   rtx fp1, fp2;
6726
6727   /* Change the source to SFmode.  */
6728   if (MEM_P (src))
6729     src = adjust_address (src, SFmode, 0);
6730   else if (REG_P (src) || GET_CODE (src) == SUBREG)
6731     src = gen_rtx_REG (SFmode, true_regnum (src));
6732
6733   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
6734   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
6735
6736   mips_emit_move (copy_rtx (fp1), src);
6737   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
6738   emit_insn (gen_slt_sf (dest, fp2, fp1));
6739 }
6740 \f
6741 /* Implement MOVE_BY_PIECES_P.  */
6742
6743 bool
6744 mips_move_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
6745 {
6746   if (HAVE_movmemsi)
6747     {
6748       /* movmemsi is meant to generate code that is at least as good as
6749          move_by_pieces.  However, movmemsi effectively uses a by-pieces
6750          implementation both for moves smaller than a word and for
6751          word-aligned moves of no more than MIPS_MAX_MOVE_BYTES_STRAIGHT
6752          bytes.  We should allow the tree-level optimisers to do such
6753          moves by pieces, as it often exposes other optimization
6754          opportunities.  We might as well continue to use movmemsi at
6755          the rtl level though, as it produces better code when
6756          scheduling is disabled (such as at -O).  */
6757       if (currently_expanding_to_rtl)
6758         return false;
6759       if (align < BITS_PER_WORD)
6760         return size < UNITS_PER_WORD;
6761       return size <= MIPS_MAX_MOVE_BYTES_STRAIGHT;
6762     }
6763   /* The default value.  If this becomes a target hook, we should
6764      call the default definition instead.  */
6765   return (move_by_pieces_ninsns (size, align, MOVE_MAX_PIECES + 1)
6766           < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ()));
6767 }
6768
6769 /* Implement STORE_BY_PIECES_P.  */
6770
6771 bool
6772 mips_store_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
6773 {
6774   /* Storing by pieces involves moving constants into registers
6775      of size MIN (ALIGN, BITS_PER_WORD), then storing them.
6776      We need to decide whether it is cheaper to load the address of
6777      constant data into a register and use a block move instead.  */
6778
6779   /* If the data is only byte aligned, then:
6780
6781      (a1) A block move of less than 4 bytes would involve three 3 LBs and
6782           3 SBs.  We might as well use 3 single-instruction LIs and 3 SBs
6783           instead.
6784
6785      (a2) A block move of 4 bytes from aligned source data can use an
6786           LW/SWL/SWR sequence.  This is often better than the 4 LIs and
6787           4 SBs that we would generate when storing by pieces.  */
6788   if (align <= BITS_PER_UNIT)
6789     return size < 4;
6790
6791   /* If the data is 2-byte aligned, then:
6792
6793      (b1) A block move of less than 4 bytes would use a combination of LBs,
6794           LHs, SBs and SHs.  We get better code by using single-instruction
6795           LIs, SBs and SHs instead.
6796
6797      (b2) A block move of 4 bytes from aligned source data would again use
6798           an LW/SWL/SWR sequence.  In most cases, loading the address of
6799           the source data would require at least one extra instruction.
6800           It is often more efficient to use 2 single-instruction LIs and
6801           2 SHs instead.
6802
6803      (b3) A block move of up to 3 additional bytes would be like (b1).
6804
6805      (b4) A block move of 8 bytes from aligned source data can use two
6806           LW/SWL/SWR sequences or a single LD/SDL/SDR sequence.  Both
6807           sequences are better than the 4 LIs and 4 SHs that we'd generate
6808           when storing by pieces.
6809
6810      The reasoning for higher alignments is similar:
6811
6812      (c1) A block move of less than 4 bytes would be the same as (b1).
6813
6814      (c2) A block move of 4 bytes would use an LW/SW sequence.  Again,
6815           loading the address of the source data would typically require
6816           at least one extra instruction.  It is generally better to use
6817           LUI/ORI/SW instead.
6818
6819      (c3) A block move of up to 3 additional bytes would be like (b1).
6820
6821      (c4) A block move of 8 bytes can use two LW/SW sequences or a single
6822           LD/SD sequence, and in these cases we've traditionally preferred
6823           the memory copy over the more bulky constant moves.  */
6824   return size < 8;
6825 }
6826
6827 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
6828    Assume that the areas do not overlap.  */
6829
6830 static void
6831 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
6832 {
6833   HOST_WIDE_INT offset, delta;
6834   unsigned HOST_WIDE_INT bits;
6835   int i;
6836   enum machine_mode mode;
6837   rtx *regs;
6838
6839   /* Work out how many bits to move at a time.  If both operands have
6840      half-word alignment, it is usually better to move in half words.
6841      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
6842      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
6843      Otherwise move word-sized chunks.  */
6844   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
6845       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
6846     bits = BITS_PER_WORD / 2;
6847   else
6848     bits = BITS_PER_WORD;
6849
6850   mode = mode_for_size (bits, MODE_INT, 0);
6851   delta = bits / BITS_PER_UNIT;
6852
6853   /* Allocate a buffer for the temporary registers.  */
6854   regs = XALLOCAVEC (rtx, length / delta);
6855
6856   /* Load as many BITS-sized chunks as possible.  Use a normal load if
6857      the source has enough alignment, otherwise use left/right pairs.  */
6858   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6859     {
6860       regs[i] = gen_reg_rtx (mode);
6861       if (MEM_ALIGN (src) >= bits)
6862         mips_emit_move (regs[i], adjust_address (src, mode, offset));
6863       else
6864         {
6865           rtx part = adjust_address (src, BLKmode, offset);
6866           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
6867             gcc_unreachable ();
6868         }
6869     }
6870
6871   /* Copy the chunks to the destination.  */
6872   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6873     if (MEM_ALIGN (dest) >= bits)
6874       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
6875     else
6876       {
6877         rtx part = adjust_address (dest, BLKmode, offset);
6878         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
6879           gcc_unreachable ();
6880       }
6881
6882   /* Mop up any left-over bytes.  */
6883   if (offset < length)
6884     {
6885       src = adjust_address (src, BLKmode, offset);
6886       dest = adjust_address (dest, BLKmode, offset);
6887       move_by_pieces (dest, src, length - offset,
6888                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
6889     }
6890 }
6891
6892 /* Helper function for doing a loop-based block operation on memory
6893    reference MEM.  Each iteration of the loop will operate on LENGTH
6894    bytes of MEM.
6895
6896    Create a new base register for use within the loop and point it to
6897    the start of MEM.  Create a new memory reference that uses this
6898    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
6899
6900 static void
6901 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
6902                        rtx *loop_reg, rtx *loop_mem)
6903 {
6904   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
6905
6906   /* Although the new mem does not refer to a known location,
6907      it does keep up to LENGTH bytes of alignment.  */
6908   *loop_mem = change_address (mem, BLKmode, *loop_reg);
6909   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
6910 }
6911
6912 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
6913    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
6914    the memory regions do not overlap.  */
6915
6916 static void
6917 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
6918                       HOST_WIDE_INT bytes_per_iter)
6919 {
6920   rtx label, src_reg, dest_reg, final_src, test;
6921   HOST_WIDE_INT leftover;
6922
6923   leftover = length % bytes_per_iter;
6924   length -= leftover;
6925
6926   /* Create registers and memory references for use within the loop.  */
6927   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
6928   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
6929
6930   /* Calculate the value that SRC_REG should have after the last iteration
6931      of the loop.  */
6932   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
6933                                    0, 0, OPTAB_WIDEN);
6934
6935   /* Emit the start of the loop.  */
6936   label = gen_label_rtx ();
6937   emit_label (label);
6938
6939   /* Emit the loop body.  */
6940   mips_block_move_straight (dest, src, bytes_per_iter);
6941
6942   /* Move on to the next block.  */
6943   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
6944   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
6945
6946   /* Emit the loop condition.  */
6947   test = gen_rtx_NE (VOIDmode, src_reg, final_src);
6948   if (Pmode == DImode)
6949     emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
6950   else
6951     emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
6952
6953   /* Mop up any left-over bytes.  */
6954   if (leftover)
6955     mips_block_move_straight (dest, src, leftover);
6956 }
6957
6958 /* Expand a movmemsi instruction, which copies LENGTH bytes from
6959    memory reference SRC to memory reference DEST.  */
6960
6961 bool
6962 mips_expand_block_move (rtx dest, rtx src, rtx length)
6963 {
6964   if (CONST_INT_P (length))
6965     {
6966       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
6967         {
6968           mips_block_move_straight (dest, src, INTVAL (length));
6969           return true;
6970         }
6971       else if (optimize)
6972         {
6973           mips_block_move_loop (dest, src, INTVAL (length),
6974                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
6975           return true;
6976         }
6977     }
6978   return false;
6979 }
6980 \f
6981 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
6982
6983 void
6984 mips_expand_synci_loop (rtx begin, rtx end)
6985 {
6986   rtx inc, label, end_label, cmp_result, mask, length;
6987
6988   /* Create end_label.  */
6989   end_label = gen_label_rtx ();
6990
6991   /* Check if begin equals end.  */
6992   cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
6993   emit_jump_insn (gen_condjump (cmp_result, end_label));
6994
6995   /* Load INC with the cache line size (rdhwr INC,$1).  */
6996   inc = gen_reg_rtx (Pmode);
6997   emit_insn (PMODE_INSN (gen_rdhwr_synci_step, (inc)));
6998
6999   /* Check if inc is 0.  */
7000   cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
7001   emit_jump_insn (gen_condjump (cmp_result, end_label));
7002
7003   /* Calculate mask.  */
7004   mask = mips_force_unary (Pmode, NEG, inc);
7005
7006   /* Mask out begin by mask.  */
7007   begin = mips_force_binary (Pmode, AND, begin, mask);
7008
7009   /* Calculate length.  */
7010   length = mips_force_binary (Pmode, MINUS, end, begin);
7011
7012   /* Loop back to here.  */
7013   label = gen_label_rtx ();
7014   emit_label (label);
7015
7016   emit_insn (gen_synci (begin));
7017
7018   /* Update length.  */
7019   mips_emit_binary (MINUS, length, length, inc);
7020
7021   /* Update begin.  */
7022   mips_emit_binary (PLUS, begin, begin, inc);
7023
7024   /* Check if length is greater than 0.  */
7025   cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
7026   emit_jump_insn (gen_condjump (cmp_result, label));
7027
7028   emit_label (end_label);
7029 }
7030 \f
7031 /* Expand a QI or HI mode atomic memory operation.
7032
7033    GENERATOR contains a pointer to the gen_* function that generates
7034    the SI mode underlying atomic operation using masks that we
7035    calculate.
7036
7037    RESULT is the return register for the operation.  Its value is NULL
7038    if unused.
7039
7040    MEM is the location of the atomic access.
7041
7042    OLDVAL is the first operand for the operation.
7043
7044    NEWVAL is the optional second operand for the operation.  Its value
7045    is NULL if unused.  */
7046
7047 void
7048 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
7049                          rtx result, rtx mem, rtx oldval, rtx newval)
7050 {
7051   rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
7052   rtx unshifted_mask_reg, mask, inverted_mask, si_op;
7053   rtx res = NULL;
7054   enum machine_mode mode;
7055
7056   mode = GET_MODE (mem);
7057
7058   /* Compute the address of the containing SImode value.  */
7059   orig_addr = force_reg (Pmode, XEXP (mem, 0));
7060   memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
7061                                   force_reg (Pmode, GEN_INT (-4)));
7062
7063   /* Create a memory reference for it.  */
7064   memsi = gen_rtx_MEM (SImode, memsi_addr);
7065   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
7066   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
7067
7068   /* Work out the byte offset of the QImode or HImode value,
7069      counting from the least significant byte.  */
7070   shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
7071   if (TARGET_BIG_ENDIAN)
7072     mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
7073
7074   /* Multiply by eight to convert the shift value from bytes to bits.  */
7075   mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
7076
7077   /* Make the final shift an SImode value, so that it can be used in
7078      SImode operations.  */
7079   shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
7080
7081   /* Set MASK to an inclusive mask of the QImode or HImode value.  */
7082   unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
7083   unshifted_mask_reg = force_reg (SImode, unshifted_mask);
7084   mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
7085
7086   /* Compute the equivalent exclusive mask.  */
7087   inverted_mask = gen_reg_rtx (SImode);
7088   emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
7089                           gen_rtx_NOT (SImode, mask)));
7090
7091   /* Shift the old value into place.  */
7092   if (oldval != const0_rtx)
7093     {
7094       oldval = convert_modes (SImode, mode, oldval, true);
7095       oldval = force_reg (SImode, oldval);
7096       oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
7097     }
7098
7099   /* Do the same for the new value.  */
7100   if (newval && newval != const0_rtx)
7101     {
7102       newval = convert_modes (SImode, mode, newval, true);
7103       newval = force_reg (SImode, newval);
7104       newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
7105     }
7106
7107   /* Do the SImode atomic access.  */
7108   if (result)
7109     res = gen_reg_rtx (SImode);
7110   if (newval)
7111     si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
7112   else if (result)
7113     si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
7114   else
7115     si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
7116
7117   emit_insn (si_op);
7118
7119   if (result)
7120     {
7121       /* Shift and convert the result.  */
7122       mips_emit_binary (AND, res, res, mask);
7123       mips_emit_binary (LSHIFTRT, res, res, shiftsi);
7124       mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
7125     }
7126 }
7127
7128 /* Return true if it is possible to use left/right accesses for a
7129    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
7130    returning true, update *OP, *LEFT and *RIGHT as follows:
7131
7132    *OP is a BLKmode reference to the whole field.
7133
7134    *LEFT is a QImode reference to the first byte if big endian or
7135    the last byte if little endian.  This address can be used in the
7136    left-side instructions (LWL, SWL, LDL, SDL).
7137
7138    *RIGHT is a QImode reference to the opposite end of the field and
7139    can be used in the patterning right-side instruction.  */
7140
7141 static bool
7142 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
7143                         rtx *left, rtx *right)
7144 {
7145   rtx first, last;
7146
7147   /* Check that the operand really is a MEM.  Not all the extv and
7148      extzv predicates are checked.  */
7149   if (!MEM_P (*op))
7150     return false;
7151
7152   /* Check that the size is valid.  */
7153   if (width != 32 && (!TARGET_64BIT || width != 64))
7154     return false;
7155
7156   /* We can only access byte-aligned values.  Since we are always passed
7157      a reference to the first byte of the field, it is not necessary to
7158      do anything with BITPOS after this check.  */
7159   if (bitpos % BITS_PER_UNIT != 0)
7160     return false;
7161
7162   /* Reject aligned bitfields: we want to use a normal load or store
7163      instead of a left/right pair.  */
7164   if (MEM_ALIGN (*op) >= width)
7165     return false;
7166
7167   /* Adjust *OP to refer to the whole field.  This also has the effect
7168      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
7169   *op = adjust_address (*op, BLKmode, 0);
7170   set_mem_size (*op, width / BITS_PER_UNIT);
7171
7172   /* Get references to both ends of the field.  We deliberately don't
7173      use the original QImode *OP for FIRST since the new BLKmode one
7174      might have a simpler address.  */
7175   first = adjust_address (*op, QImode, 0);
7176   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
7177
7178   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
7179      correspond to the MSB and RIGHT to the LSB.  */
7180   if (TARGET_BIG_ENDIAN)
7181     *left = first, *right = last;
7182   else
7183     *left = last, *right = first;
7184
7185   return true;
7186 }
7187
7188 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7189    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7190    the operation is the equivalent of:
7191
7192       (set DEST (*_extract SRC WIDTH BITPOS))
7193
7194    Return true on success.  */
7195
7196 bool
7197 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7198                                    HOST_WIDE_INT bitpos)
7199 {
7200   rtx left, right, temp;
7201
7202   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7203      be a paradoxical word_mode subreg.  This is the only case in which
7204      we allow the destination to be larger than the source.  */
7205   if (GET_CODE (dest) == SUBREG
7206       && GET_MODE (dest) == DImode
7207       && GET_MODE (SUBREG_REG (dest)) == SImode)
7208     dest = SUBREG_REG (dest);
7209
7210   /* After the above adjustment, the destination must be the same
7211      width as the source.  */
7212   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
7213     return false;
7214
7215   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
7216     return false;
7217
7218   temp = gen_reg_rtx (GET_MODE (dest));
7219   if (GET_MODE (dest) == DImode)
7220     {
7221       emit_insn (gen_mov_ldl (temp, src, left));
7222       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7223     }
7224   else
7225     {
7226       emit_insn (gen_mov_lwl (temp, src, left));
7227       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7228     }
7229   return true;
7230 }
7231
7232 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
7233    BITPOS and SRC are the operands passed to the expander; the operation
7234    is the equivalent of:
7235
7236        (set (zero_extract DEST WIDTH BITPOS) SRC)
7237
7238    Return true on success.  */
7239
7240 bool
7241 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7242                                     HOST_WIDE_INT bitpos)
7243 {
7244   rtx left, right;
7245   enum machine_mode mode;
7246
7247   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
7248     return false;
7249
7250   mode = mode_for_size (width, MODE_INT, 0);
7251   src = gen_lowpart (mode, src);
7252   if (mode == DImode)
7253     {
7254       emit_insn (gen_mov_sdl (dest, src, left));
7255       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7256     }
7257   else
7258     {
7259       emit_insn (gen_mov_swl (dest, src, left));
7260       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7261     }
7262   return true;
7263 }
7264
7265 /* Return true if X is a MEM with the same size as MODE.  */
7266
7267 bool
7268 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
7269 {
7270   return (MEM_P (x)
7271           && MEM_SIZE_KNOWN_P (x)
7272           && MEM_SIZE (x) == GET_MODE_SIZE (mode));
7273 }
7274
7275 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7276    source of an "ext" instruction or the destination of an "ins"
7277    instruction.  OP must be a register operand and the following
7278    conditions must hold:
7279
7280      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7281      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7282      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7283
7284    Also reject lengths equal to a word as they are better handled
7285    by the move patterns.  */
7286
7287 bool
7288 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7289 {
7290   if (!ISA_HAS_EXT_INS
7291       || !register_operand (op, VOIDmode)
7292       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7293     return false;
7294
7295   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7296     return false;
7297
7298   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7299     return false;
7300
7301   return true;
7302 }
7303
7304 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7305    operation if MAXLEN is the maxium length of consecutive bits that
7306    can make up MASK.  MODE is the mode of the operation.  See
7307    mask_low_and_shift_len for the actual definition.  */
7308
7309 bool
7310 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
7311 {
7312   return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7313 }
7314
7315 /* Return true iff OP1 and OP2 are valid operands together for the
7316    *and<MODE>3 and *and<MODE>3_mips16 patterns.  For the cases to consider,
7317    see the table in the comment before the pattern.  */
7318
7319 bool
7320 and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7321 {
7322   return (memory_operand (op1, mode)
7323           ? and_load_operand (op2, mode)
7324           : and_reg_operand (op2, mode));
7325 }
7326
7327 /* The canonical form of a mask-low-and-shift-left operation is
7328    (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7329    cleared.  Thus we need to shift MASK to the right before checking if it
7330    is a valid mask value.  MODE is the mode of the operation.  If true
7331    return the length of the mask, otherwise return -1.  */
7332
7333 int
7334 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7335 {
7336   HOST_WIDE_INT shval;
7337
7338   shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7339   return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7340 }
7341 \f
7342 /* Return true if -msplit-addresses is selected and should be honored.
7343
7344    -msplit-addresses is a half-way house between explicit relocations
7345    and the traditional assembler macros.  It can split absolute 32-bit
7346    symbolic constants into a high/lo_sum pair but uses macros for other
7347    sorts of access.
7348
7349    Like explicit relocation support for REL targets, it relies
7350    on GNU extensions in the assembler and the linker.
7351
7352    Although this code should work for -O0, it has traditionally
7353    been treated as an optimization.  */
7354
7355 static bool
7356 mips_split_addresses_p (void)
7357 {
7358   return (TARGET_SPLIT_ADDRESSES
7359           && optimize
7360           && !TARGET_MIPS16
7361           && !flag_pic
7362           && !ABI_HAS_64BIT_SYMBOLS);
7363 }
7364
7365 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
7366
7367 static void
7368 mips_init_relocs (void)
7369 {
7370   memset (mips_split_p, '\0', sizeof (mips_split_p));
7371   memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7372   memset (mips_use_pcrel_pool_p, '\0', sizeof (mips_use_pcrel_pool_p));
7373   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7374   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7375
7376   if (TARGET_MIPS16_PCREL_LOADS)
7377     mips_use_pcrel_pool_p[SYMBOL_ABSOLUTE] = true;
7378   else
7379     {
7380       if (ABI_HAS_64BIT_SYMBOLS)
7381         {
7382           if (TARGET_EXPLICIT_RELOCS)
7383             {
7384               mips_split_p[SYMBOL_64_HIGH] = true;
7385               mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7386               mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7387
7388               mips_split_p[SYMBOL_64_MID] = true;
7389               mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7390               mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7391
7392               mips_split_p[SYMBOL_64_LOW] = true;
7393               mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7394               mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7395
7396               mips_split_p[SYMBOL_ABSOLUTE] = true;
7397               mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7398             }
7399         }
7400       else
7401         {
7402           if (TARGET_EXPLICIT_RELOCS
7403               || mips_split_addresses_p ()
7404               || TARGET_MIPS16)
7405             {
7406               mips_split_p[SYMBOL_ABSOLUTE] = true;
7407               mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7408               mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7409             }
7410         }
7411     }
7412
7413   if (TARGET_MIPS16)
7414     {
7415       /* The high part is provided by a pseudo copy of $gp.  */
7416       mips_split_p[SYMBOL_GP_RELATIVE] = true;
7417       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7418     }
7419   else if (TARGET_EXPLICIT_RELOCS)
7420     /* Small data constants are kept whole until after reload,
7421        then lowered by mips_rewrite_small_data.  */
7422     mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7423
7424   if (TARGET_EXPLICIT_RELOCS)
7425     {
7426       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7427       if (TARGET_NEWABI)
7428         {
7429           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7430           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7431         }
7432       else
7433         {
7434           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7435           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7436         }
7437       if (TARGET_MIPS16)
7438         /* Expose the use of $28 as soon as possible.  */
7439         mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7440
7441       if (TARGET_XGOT)
7442         {
7443           /* The HIGH and LO_SUM are matched by special .md patterns.  */
7444           mips_split_p[SYMBOL_GOT_DISP] = true;
7445
7446           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7447           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7448           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7449
7450           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7451           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7452           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7453         }
7454       else
7455         {
7456           if (TARGET_NEWABI)
7457             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7458           else
7459             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7460           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7461           if (TARGET_MIPS16)
7462             /* Expose the use of $28 as soon as possible.  */
7463             mips_split_p[SYMBOL_GOT_DISP] = true;
7464         }
7465     }
7466
7467   if (TARGET_NEWABI)
7468     {
7469       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7470       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7471       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7472     }
7473
7474   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7475   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7476
7477   if (TARGET_MIPS16_PCREL_LOADS)
7478     {
7479       mips_use_pcrel_pool_p[SYMBOL_DTPREL] = true;
7480       mips_use_pcrel_pool_p[SYMBOL_TPREL] = true;
7481     }
7482   else
7483     {
7484       mips_split_p[SYMBOL_DTPREL] = true;
7485       mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7486       mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7487
7488       mips_split_p[SYMBOL_TPREL] = true;
7489       mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7490       mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7491     }
7492
7493   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7494   mips_lo_relocs[SYMBOL_HALF] = "%half(";
7495 }
7496
7497 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7498    in context CONTEXT.  RELOCS is the array of relocations to use.  */
7499
7500 static void
7501 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7502                           const char **relocs)
7503 {
7504   enum mips_symbol_type symbol_type;
7505   const char *p;
7506
7507   symbol_type = mips_classify_symbolic_expression (op, context);
7508   gcc_assert (relocs[symbol_type]);
7509
7510   fputs (relocs[symbol_type], file);
7511   output_addr_const (file, mips_strip_unspec_address (op));
7512   for (p = relocs[symbol_type]; *p != 0; p++)
7513     if (*p == '(')
7514       fputc (')', file);
7515 }
7516
7517 /* Start a new block with the given asm switch enabled.  If we need
7518    to print a directive, emit PREFIX before it and SUFFIX after it.  */
7519
7520 static void
7521 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7522                         const char *prefix, const char *suffix)
7523 {
7524   if (asm_switch->nesting_level == 0)
7525     fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7526   asm_switch->nesting_level++;
7527 }
7528
7529 /* Likewise, but end a block.  */
7530
7531 static void
7532 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7533                        const char *prefix, const char *suffix)
7534 {
7535   gcc_assert (asm_switch->nesting_level);
7536   asm_switch->nesting_level--;
7537   if (asm_switch->nesting_level == 0)
7538     fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7539 }
7540
7541 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7542    that either print a complete line or print nothing.  */
7543
7544 void
7545 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
7546 {
7547   mips_push_asm_switch_1 (asm_switch, "\t", "\n");
7548 }
7549
7550 void
7551 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
7552 {
7553   mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
7554 }
7555
7556 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
7557    The punctuation characters are:
7558
7559    '('  Start a nested ".set noreorder" block.
7560    ')'  End a nested ".set noreorder" block.
7561    '['  Start a nested ".set noat" block.
7562    ']'  End a nested ".set noat" block.
7563    '<'  Start a nested ".set nomacro" block.
7564    '>'  End a nested ".set nomacro" block.
7565    '*'  Behave like %(%< if generating a delayed-branch sequence.
7566    '#'  Print a nop if in a ".set noreorder" block.
7567    '/'  Like '#', but do nothing within a delayed-branch sequence.
7568    '?'  Print "l" if mips_branch_likely is true
7569    '~'  Print a nop if mips_branch_likely is true
7570    '.'  Print the name of the register with a hard-wired zero (zero or $0).
7571    '@'  Print the name of the assembler temporary register (at or $1).
7572    '^'  Print the name of the pic call-through register (t9 or $25).
7573    '+'  Print the name of the gp register (usually gp or $28).
7574    '$'  Print the name of the stack pointer register (sp or $29).
7575
7576    See also mips_init_print_operand_pucnt.  */
7577
7578 static void
7579 mips_print_operand_punctuation (FILE *file, int ch)
7580 {
7581   switch (ch)
7582     {
7583     case '(':
7584       mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
7585       break;
7586
7587     case ')':
7588       mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
7589       break;
7590
7591     case '[':
7592       mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
7593       break;
7594
7595     case ']':
7596       mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
7597       break;
7598
7599     case '<':
7600       mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
7601       break;
7602
7603     case '>':
7604       mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
7605       break;
7606
7607     case '*':
7608       if (final_sequence != 0)
7609         {
7610           mips_print_operand_punctuation (file, '(');
7611           mips_print_operand_punctuation (file, '<');
7612         }
7613       break;
7614
7615     case '#':
7616       if (mips_noreorder.nesting_level > 0)
7617         fputs ("\n\tnop", file);
7618       break;
7619
7620     case '/':
7621       /* Print an extra newline so that the delayed insn is separated
7622          from the following ones.  This looks neater and is consistent
7623          with non-nop delayed sequences.  */
7624       if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
7625         fputs ("\n\tnop\n", file);
7626       break;
7627
7628     case '?':
7629       if (mips_branch_likely)
7630         putc ('l', file);
7631       break;
7632
7633     case '~':
7634       if (mips_branch_likely)
7635         fputs ("\n\tnop", file);
7636       break;
7637
7638     case '.':
7639       fputs (reg_names[GP_REG_FIRST + 0], file);
7640       break;
7641
7642     case '@':
7643       fputs (reg_names[AT_REGNUM], file);
7644       break;
7645
7646     case '^':
7647       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7648       break;
7649
7650     case '+':
7651       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7652       break;
7653
7654     case '$':
7655       fputs (reg_names[STACK_POINTER_REGNUM], file);
7656       break;
7657
7658     default:
7659       gcc_unreachable ();
7660       break;
7661     }
7662 }
7663
7664 /* Initialize mips_print_operand_punct.  */
7665
7666 static void
7667 mips_init_print_operand_punct (void)
7668 {
7669   const char *p;
7670
7671   for (p = "()[]<>*#/?~.@^+$"; *p; p++)
7672     mips_print_operand_punct[(unsigned char) *p] = true;
7673 }
7674
7675 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
7676    associated with condition CODE.  Print the condition part of the
7677    opcode to FILE.  */
7678
7679 static void
7680 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
7681 {
7682   switch (code)
7683     {
7684     case EQ:
7685     case NE:
7686     case GT:
7687     case GE:
7688     case LT:
7689     case LE:
7690     case GTU:
7691     case GEU:
7692     case LTU:
7693     case LEU:
7694       /* Conveniently, the MIPS names for these conditions are the same
7695          as their RTL equivalents.  */
7696       fputs (GET_RTX_NAME (code), file);
7697       break;
7698
7699     default:
7700       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7701       break;
7702     }
7703 }
7704
7705 /* Likewise floating-point branches.  */
7706
7707 static void
7708 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
7709 {
7710   switch (code)
7711     {
7712     case EQ:
7713       fputs ("c1f", file);
7714       break;
7715
7716     case NE:
7717       fputs ("c1t", file);
7718       break;
7719
7720     default:
7721       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7722       break;
7723     }
7724 }
7725
7726 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
7727
7728 static bool
7729 mips_print_operand_punct_valid_p (unsigned char code)
7730 {
7731   return mips_print_operand_punct[code];
7732 }
7733
7734 /* Implement TARGET_PRINT_OPERAND.  The MIPS-specific operand codes are:
7735
7736    'X'  Print CONST_INT OP in hexadecimal format.
7737    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
7738    'd'  Print CONST_INT OP in decimal.
7739    'm'  Print one less than CONST_INT OP in decimal.
7740    'h'  Print the high-part relocation associated with OP, after stripping
7741           any outermost HIGH.
7742    'R'  Print the low-part relocation associated with OP.
7743    'C'  Print the integer branch condition for comparison OP.
7744    'N'  Print the inverse of the integer branch condition for comparison OP.
7745    'F'  Print the FPU branch condition for comparison OP.
7746    'W'  Print the inverse of the FPU branch condition for comparison OP.
7747    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
7748               'z' for (eq:?I ...), 'n' for (ne:?I ...).
7749    't'  Like 'T', but with the EQ/NE cases reversed
7750    'Y'  Print mips_fp_conditions[INTVAL (OP)]
7751    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
7752    'q'  Print a DSP accumulator register.
7753    'D'  Print the second part of a double-word register or memory operand.
7754    'L'  Print the low-order register in a double-word register operand.
7755    'M'  Print high-order register in a double-word register operand.
7756    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
7757
7758 static void
7759 mips_print_operand (FILE *file, rtx op, int letter)
7760 {
7761   enum rtx_code code;
7762
7763   if (mips_print_operand_punct_valid_p (letter))
7764     {
7765       mips_print_operand_punctuation (file, letter);
7766       return;
7767     }
7768
7769   gcc_assert (op);
7770   code = GET_CODE (op);
7771
7772   switch (letter)
7773     {
7774     case 'X':
7775       if (CONST_INT_P (op))
7776         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
7777       else
7778         output_operand_lossage ("invalid use of '%%%c'", letter);
7779       break;
7780
7781     case 'x':
7782       if (CONST_INT_P (op))
7783         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
7784       else
7785         output_operand_lossage ("invalid use of '%%%c'", letter);
7786       break;
7787
7788     case 'd':
7789       if (CONST_INT_P (op))
7790         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
7791       else
7792         output_operand_lossage ("invalid use of '%%%c'", letter);
7793       break;
7794
7795     case 'm':
7796       if (CONST_INT_P (op))
7797         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
7798       else
7799         output_operand_lossage ("invalid use of '%%%c'", letter);
7800       break;
7801
7802     case 'h':
7803       if (code == HIGH)
7804         op = XEXP (op, 0);
7805       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
7806       break;
7807
7808     case 'R':
7809       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
7810       break;
7811
7812     case 'C':
7813       mips_print_int_branch_condition (file, code, letter);
7814       break;
7815
7816     case 'N':
7817       mips_print_int_branch_condition (file, reverse_condition (code), letter);
7818       break;
7819
7820     case 'F':
7821       mips_print_float_branch_condition (file, code, letter);
7822       break;
7823
7824     case 'W':
7825       mips_print_float_branch_condition (file, reverse_condition (code),
7826                                          letter);
7827       break;
7828
7829     case 'T':
7830     case 't':
7831       {
7832         int truth = (code == NE) == (letter == 'T');
7833         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
7834       }
7835       break;
7836
7837     case 'Y':
7838       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
7839         fputs (mips_fp_conditions[UINTVAL (op)], file);
7840       else
7841         output_operand_lossage ("'%%%c' is not a valid operand prefix",
7842                                 letter);
7843       break;
7844
7845     case 'Z':
7846       if (ISA_HAS_8CC)
7847         {
7848           mips_print_operand (file, op, 0);
7849           fputc (',', file);
7850         }
7851       break;
7852
7853     case 'q':
7854       if (code == REG && MD_REG_P (REGNO (op)))
7855         fprintf (file, "$ac0");
7856       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
7857         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
7858       else
7859         output_operand_lossage ("invalid use of '%%%c'", letter);
7860       break;
7861
7862     default:
7863       switch (code)
7864         {
7865         case REG:
7866           {
7867             unsigned int regno = REGNO (op);
7868             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
7869                 || (letter == 'L' && TARGET_BIG_ENDIAN)
7870                 || letter == 'D')
7871               regno++;
7872             else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
7873               output_operand_lossage ("invalid use of '%%%c'", letter);
7874             /* We need to print $0 .. $31 for COP0 registers.  */
7875             if (COP0_REG_P (regno))
7876               fprintf (file, "$%s", &reg_names[regno][4]);
7877             else
7878               fprintf (file, "%s", reg_names[regno]);
7879           }
7880           break;
7881
7882         case MEM:
7883           if (letter == 'D')
7884             output_address (plus_constant (XEXP (op, 0), 4));
7885           else if (letter && letter != 'z')
7886             output_operand_lossage ("invalid use of '%%%c'", letter);
7887           else
7888             output_address (XEXP (op, 0));
7889           break;
7890
7891         default:
7892           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
7893             fputs (reg_names[GP_REG_FIRST], file);
7894           else if (letter && letter != 'z')
7895             output_operand_lossage ("invalid use of '%%%c'", letter);
7896           else if (CONST_GP_P (op))
7897             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
7898           else
7899             output_addr_const (file, mips_strip_unspec_address (op));
7900           break;
7901         }
7902     }
7903 }
7904
7905 /* Implement TARGET_PRINT_OPERAND_ADDRESS.  */
7906
7907 static void
7908 mips_print_operand_address (FILE *file, rtx x)
7909 {
7910   struct mips_address_info addr;
7911
7912   if (mips_classify_address (&addr, x, word_mode, true))
7913     switch (addr.type)
7914       {
7915       case ADDRESS_REG:
7916         mips_print_operand (file, addr.offset, 0);
7917         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7918         return;
7919
7920       case ADDRESS_LO_SUM:
7921         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
7922                                   mips_lo_relocs);
7923         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7924         return;
7925
7926       case ADDRESS_CONST_INT:
7927         output_addr_const (file, x);
7928         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
7929         return;
7930
7931       case ADDRESS_SYMBOLIC:
7932         output_addr_const (file, mips_strip_unspec_address (x));
7933         return;
7934       }
7935   gcc_unreachable ();
7936 }
7937 \f
7938 /* Implement TARGET_ENCODE_SECTION_INFO.  */
7939
7940 static void
7941 mips_encode_section_info (tree decl, rtx rtl, int first)
7942 {
7943   default_encode_section_info (decl, rtl, first);
7944
7945   if (TREE_CODE (decl) == FUNCTION_DECL)
7946     {
7947       rtx symbol = XEXP (rtl, 0);
7948       tree type = TREE_TYPE (decl);
7949
7950       /* Encode whether the symbol is short or long.  */
7951       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
7952           || mips_far_type_p (type))
7953         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
7954     }
7955 }
7956
7957 /* Implement TARGET_SELECT_RTX_SECTION.  */
7958
7959 static section *
7960 mips_select_rtx_section (enum machine_mode mode, rtx x,
7961                          unsigned HOST_WIDE_INT align)
7962 {
7963   /* ??? Consider using mergeable small data sections.  */
7964   if (mips_rtx_constant_in_small_data_p (mode))
7965     return get_named_section (NULL, ".sdata", 0);
7966
7967   return default_elf_select_rtx_section (mode, x, align);
7968 }
7969
7970 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7971
7972    The complication here is that, with the combination TARGET_ABICALLS
7973    && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
7974    absolute addresses, and should therefore not be included in the
7975    read-only part of a DSO.  Handle such cases by selecting a normal
7976    data section instead of a read-only one.  The logic apes that in
7977    default_function_rodata_section.  */
7978
7979 static section *
7980 mips_function_rodata_section (tree decl)
7981 {
7982   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
7983     return default_function_rodata_section (decl);
7984
7985   if (decl && DECL_SECTION_NAME (decl))
7986     {
7987       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7988       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7989         {
7990           char *rname = ASTRDUP (name);
7991           rname[14] = 'd';
7992           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7993         }
7994       else if (flag_function_sections
7995                && flag_data_sections
7996                && strncmp (name, ".text.", 6) == 0)
7997         {
7998           char *rname = ASTRDUP (name);
7999           memcpy (rname + 1, "data", 4);
8000           return get_section (rname, SECTION_WRITE, decl);
8001         }
8002     }
8003   return data_section;
8004 }
8005
8006 /* Implement TARGET_IN_SMALL_DATA_P.  */
8007
8008 static bool
8009 mips_in_small_data_p (const_tree decl)
8010 {
8011   unsigned HOST_WIDE_INT size;
8012
8013   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8014     return false;
8015
8016   /* We don't yet generate small-data references for -mabicalls
8017      or VxWorks RTP code.  See the related -G handling in
8018      mips_option_override.  */
8019   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8020     return false;
8021
8022   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8023     {
8024       const char *name;
8025
8026       /* Reject anything that isn't in a known small-data section.  */
8027       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8028       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8029         return false;
8030
8031       /* If a symbol is defined externally, the assembler will use the
8032          usual -G rules when deciding how to implement macros.  */
8033       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
8034         return true;
8035     }
8036   else if (TARGET_EMBEDDED_DATA)
8037     {
8038       /* Don't put constants into the small data section: we want them
8039          to be in ROM rather than RAM.  */
8040       if (TREE_CODE (decl) != VAR_DECL)
8041         return false;
8042
8043       if (TREE_READONLY (decl)
8044           && !TREE_SIDE_EFFECTS (decl)
8045           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8046         return false;
8047     }
8048
8049   /* Enforce -mlocal-sdata.  */
8050   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
8051     return false;
8052
8053   /* Enforce -mextern-sdata.  */
8054   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
8055     {
8056       if (DECL_EXTERNAL (decl))
8057         return false;
8058       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
8059         return false;
8060     }
8061
8062   /* We have traditionally not treated zero-sized objects as small data,
8063      so this is now effectively part of the ABI.  */
8064   size = int_size_in_bytes (TREE_TYPE (decl));
8065   return size > 0 && size <= mips_small_data_threshold;
8066 }
8067
8068 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
8069    anchors for small data: the GP register acts as an anchor in that
8070    case.  We also don't want to use them for PC-relative accesses,
8071    where the PC acts as an anchor.  */
8072
8073 static bool
8074 mips_use_anchors_for_symbol_p (const_rtx symbol)
8075 {
8076   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
8077     {
8078     case SYMBOL_PC_RELATIVE:
8079     case SYMBOL_GP_RELATIVE:
8080       return false;
8081
8082     default:
8083       return default_use_anchors_for_symbol_p (symbol);
8084     }
8085 }
8086 \f
8087 /* The MIPS debug format wants all automatic variables and arguments
8088    to be in terms of the virtual frame pointer (stack pointer before
8089    any adjustment in the function), while the MIPS 3.0 linker wants
8090    the frame pointer to be the stack pointer after the initial
8091    adjustment.  So, we do the adjustment here.  The arg pointer (which
8092    is eliminated) points to the virtual frame pointer, while the frame
8093    pointer (which may be eliminated) points to the stack pointer after
8094    the initial adjustments.  */
8095
8096 HOST_WIDE_INT
8097 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
8098 {
8099   rtx offset2 = const0_rtx;
8100   rtx reg = eliminate_constant_term (addr, &offset2);
8101
8102   if (offset == 0)
8103     offset = INTVAL (offset2);
8104
8105   if (reg == stack_pointer_rtx
8106       || reg == frame_pointer_rtx
8107       || reg == hard_frame_pointer_rtx)
8108     {
8109       offset -= cfun->machine->frame.total_size;
8110       if (reg == hard_frame_pointer_rtx)
8111         offset += cfun->machine->frame.hard_frame_pointer_offset;
8112     }
8113
8114   return offset;
8115 }
8116 \f
8117 /* Implement ASM_OUTPUT_EXTERNAL.  */
8118
8119 void
8120 mips_output_external (FILE *file, tree decl, const char *name)
8121 {
8122   default_elf_asm_output_external (file, decl, name);
8123
8124   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
8125      set in order to avoid putting out names that are never really
8126      used. */
8127   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
8128     {
8129       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
8130         {
8131           /* When using assembler macros, emit .extern directives for
8132              all small-data externs so that the assembler knows how
8133              big they are.
8134
8135              In most cases it would be safe (though pointless) to emit
8136              .externs for other symbols too.  One exception is when an
8137              object is within the -G limit but declared by the user to
8138              be in a section other than .sbss or .sdata.  */
8139           fputs ("\t.extern\t", file);
8140           assemble_name (file, name);
8141           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
8142                    int_size_in_bytes (TREE_TYPE (decl)));
8143         }
8144     }
8145 }
8146
8147 /* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME.  */
8148
8149 static void
8150 mips_output_filename (FILE *stream, const char *name)
8151 {
8152   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
8153      directives.  */
8154   if (write_symbols == DWARF2_DEBUG)
8155     return;
8156   else if (mips_output_filename_first_time)
8157     {
8158       mips_output_filename_first_time = 0;
8159       num_source_filenames += 1;
8160       current_function_file = name;
8161       fprintf (stream, "\t.file\t%d ", num_source_filenames);
8162       output_quoted_string (stream, name);
8163       putc ('\n', stream);
8164     }
8165   /* If we are emitting stabs, let dbxout.c handle this (except for
8166      the mips_output_filename_first_time case).  */
8167   else if (write_symbols == DBX_DEBUG)
8168     return;
8169   else if (name != current_function_file
8170            && strcmp (name, current_function_file) != 0)
8171     {
8172       num_source_filenames += 1;
8173       current_function_file = name;
8174       fprintf (stream, "\t.file\t%d ", num_source_filenames);
8175       output_quoted_string (stream, name);
8176       putc ('\n', stream);
8177     }
8178 }
8179
8180 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
8181
8182 static void ATTRIBUTE_UNUSED
8183 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
8184 {
8185   switch (size)
8186     {
8187     case 4:
8188       fputs ("\t.dtprelword\t", file);
8189       break;
8190
8191     case 8:
8192       fputs ("\t.dtpreldword\t", file);
8193       break;
8194
8195     default:
8196       gcc_unreachable ();
8197     }
8198   output_addr_const (file, x);
8199   fputs ("+0x8000", file);
8200 }
8201
8202 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
8203
8204 static rtx
8205 mips_dwarf_register_span (rtx reg)
8206 {
8207   rtx high, low;
8208   enum machine_mode mode;
8209
8210   /* By default, GCC maps increasing register numbers to increasing
8211      memory locations, but paired FPRs are always little-endian,
8212      regardless of the prevailing endianness.  */
8213   mode = GET_MODE (reg);
8214   if (FP_REG_P (REGNO (reg))
8215       && TARGET_BIG_ENDIAN
8216       && MAX_FPRS_PER_FMT > 1
8217       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8218     {
8219       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8220       high = mips_subword (reg, true);
8221       low = mips_subword (reg, false);
8222       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8223     }
8224
8225   return NULL_RTX;
8226 }
8227
8228 /* Implement ASM_OUTPUT_ASCII.  */
8229
8230 void
8231 mips_output_ascii (FILE *stream, const char *string, size_t len)
8232 {
8233   size_t i;
8234   int cur_pos;
8235
8236   cur_pos = 17;
8237   fprintf (stream, "\t.ascii\t\"");
8238   for (i = 0; i < len; i++)
8239     {
8240       int c;
8241
8242       c = (unsigned char) string[i];
8243       if (ISPRINT (c))
8244         {
8245           if (c == '\\' || c == '\"')
8246             {
8247               putc ('\\', stream);
8248               cur_pos++;
8249             }
8250           putc (c, stream);
8251           cur_pos++;
8252         }
8253       else
8254         {
8255           fprintf (stream, "\\%03o", c);
8256           cur_pos += 4;
8257         }
8258
8259       if (cur_pos > 72 && i+1 < len)
8260         {
8261           cur_pos = 17;
8262           fprintf (stream, "\"\n\t.ascii\t\"");
8263         }
8264     }
8265   fprintf (stream, "\"\n");
8266 }
8267
8268 /* Return the pseudo-op for full SYMBOL_(D)TPREL address *ADDR.
8269    Update *ADDR with the operand that should be printed.  */
8270
8271 const char *
8272 mips_output_tls_reloc_directive (rtx *addr)
8273 {
8274   enum mips_symbol_type type;
8275
8276   type = mips_classify_symbolic_expression (*addr, SYMBOL_CONTEXT_LEA);
8277   *addr = mips_strip_unspec_address (*addr);
8278   switch (type)
8279     {
8280     case SYMBOL_DTPREL:
8281       return Pmode == SImode ? ".dtprelword\t%0" : ".dtpreldword\t%0";
8282
8283     case SYMBOL_TPREL:
8284       return Pmode == SImode ? ".tprelword\t%0" : ".tpreldword\t%0";
8285
8286     default:
8287       gcc_unreachable ();
8288     }
8289 }
8290
8291 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
8292    macros, mark the symbol as written so that mips_asm_output_external
8293    won't emit an .extern for it.  STREAM is the output file, NAME is the
8294    name of the symbol, INIT_STRING is the string that should be written
8295    before the symbol and FINAL_STRING is the string that should be
8296    written after it.  FINAL_STRING is a printf format that consumes the
8297    remaining arguments.  */
8298
8299 void
8300 mips_declare_object (FILE *stream, const char *name, const char *init_string,
8301                      const char *final_string, ...)
8302 {
8303   va_list ap;
8304
8305   fputs (init_string, stream);
8306   assemble_name (stream, name);
8307   va_start (ap, final_string);
8308   vfprintf (stream, final_string, ap);
8309   va_end (ap);
8310
8311   if (!TARGET_EXPLICIT_RELOCS)
8312     {
8313       tree name_tree = get_identifier (name);
8314       TREE_ASM_WRITTEN (name_tree) = 1;
8315     }
8316 }
8317
8318 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8319    NAME is the name of the object and ALIGN is the required alignment
8320    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
8321    alignment argument.  */
8322
8323 void
8324 mips_declare_common_object (FILE *stream, const char *name,
8325                             const char *init_string,
8326                             unsigned HOST_WIDE_INT size,
8327                             unsigned int align, bool takes_alignment_p)
8328 {
8329   if (!takes_alignment_p)
8330     {
8331       size += (align / BITS_PER_UNIT) - 1;
8332       size -= size % (align / BITS_PER_UNIT);
8333       mips_declare_object (stream, name, init_string,
8334                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8335     }
8336   else
8337     mips_declare_object (stream, name, init_string,
8338                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8339                          size, align / BITS_PER_UNIT);
8340 }
8341
8342 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
8343    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
8344
8345 void
8346 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8347                                  unsigned HOST_WIDE_INT size,
8348                                  unsigned int align)
8349 {
8350   /* If the target wants uninitialized const declarations in
8351      .rdata then don't put them in .comm.  */
8352   if (TARGET_EMBEDDED_DATA
8353       && TARGET_UNINIT_CONST_IN_RODATA
8354       && TREE_CODE (decl) == VAR_DECL
8355       && TREE_READONLY (decl)
8356       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8357     {
8358       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8359         targetm.asm_out.globalize_label (stream, name);
8360
8361       switch_to_section (readonly_data_section);
8362       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8363       mips_declare_object (stream, name, "",
8364                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8365                            size);
8366     }
8367   else
8368     mips_declare_common_object (stream, name, "\n\t.comm\t",
8369                                 size, align, true);
8370 }
8371
8372 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8373 extern int size_directive_output;
8374
8375 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
8376    definitions except that it uses mips_declare_object to emit the label.  */
8377
8378 void
8379 mips_declare_object_name (FILE *stream, const char *name,
8380                           tree decl ATTRIBUTE_UNUSED)
8381 {
8382 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8383   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8384 #endif
8385
8386   size_directive_output = 0;
8387   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8388     {
8389       HOST_WIDE_INT size;
8390
8391       size_directive_output = 1;
8392       size = int_size_in_bytes (TREE_TYPE (decl));
8393       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8394     }
8395
8396   mips_declare_object (stream, name, "", ":\n");
8397 }
8398
8399 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
8400
8401 void
8402 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8403 {
8404   const char *name;
8405
8406   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8407   if (!flag_inhibit_size_directive
8408       && DECL_SIZE (decl) != 0
8409       && !at_end
8410       && top_level
8411       && DECL_INITIAL (decl) == error_mark_node
8412       && !size_directive_output)
8413     {
8414       HOST_WIDE_INT size;
8415
8416       size_directive_output = 1;
8417       size = int_size_in_bytes (TREE_TYPE (decl));
8418       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8419     }
8420 }
8421 #endif
8422 \f
8423 /* Return the FOO in the name of the ".mdebug.FOO" section associated
8424    with the current ABI.  */
8425
8426 static const char *
8427 mips_mdebug_abi_name (void)
8428 {
8429   switch (mips_abi)
8430     {
8431     case ABI_32:
8432       return "abi32";
8433     case ABI_O64:
8434       return "abiO64";
8435     case ABI_N32:
8436       return "abiN32";
8437     case ABI_64:
8438       return "abi64";
8439     case ABI_EABI:
8440       return TARGET_64BIT ? "eabi64" : "eabi32";
8441     default:
8442       gcc_unreachable ();
8443     }
8444 }
8445
8446 /* Implement TARGET_ASM_FILE_START.  */
8447
8448 static void
8449 mips_file_start (void)
8450 {
8451   default_file_start ();
8452
8453   /* Generate a special section to describe the ABI switches used to
8454      produce the resultant binary.  This is unnecessary on IRIX and
8455      causes unwanted warnings from the native linker.  */
8456   if (!TARGET_IRIX6)
8457     {
8458       /* Record the ABI itself.  Modern versions of binutils encode
8459          this information in the ELF header flags, but GDB needs the
8460          information in order to correctly debug binaries produced by
8461          older binutils.  See the function mips_gdbarch_init in
8462          gdb/mips-tdep.c.  */
8463       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8464                mips_mdebug_abi_name ());
8465
8466       /* There is no ELF header flag to distinguish long32 forms of the
8467          EABI from long64 forms.  Emit a special section to help tools
8468          such as GDB.  Do the same for o64, which is sometimes used with
8469          -mlong64.  */
8470       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8471         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8472                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8473
8474 #ifdef HAVE_AS_GNU_ATTRIBUTE
8475       {
8476         int attr;
8477
8478         /* No floating-point operations, -mno-float.  */
8479         if (TARGET_NO_FLOAT)
8480           attr = 0;
8481         /* Soft-float code, -msoft-float.  */
8482         else if (!TARGET_HARD_FLOAT_ABI)
8483           attr = 3;
8484         /* Single-float code, -msingle-float.  */
8485         else if (!TARGET_DOUBLE_FLOAT)
8486           attr = 2;
8487         /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.  */
8488         else if (!TARGET_64BIT && TARGET_FLOAT64)
8489           attr = 4;
8490         /* Regular FP code, FP regs same size as GP regs, -mdouble-float.  */
8491         else
8492           attr = 1;
8493
8494         fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
8495       }
8496 #endif
8497     }
8498
8499   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
8500   if (TARGET_ABICALLS)
8501     {
8502       fprintf (asm_out_file, "\t.abicalls\n");
8503       if (TARGET_ABICALLS_PIC0)
8504         fprintf (asm_out_file, "\t.option\tpic0\n");
8505     }
8506
8507   if (flag_verbose_asm)
8508     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
8509              ASM_COMMENT_START,
8510              mips_small_data_threshold, mips_arch_info->name, mips_isa);
8511 }
8512
8513 /* Implement TARGET_ASM_CODE_END.  */
8514
8515 static void
8516 mips_code_end (void)
8517 {
8518   if (mips_need_mips16_rdhwr_p)
8519     mips_output_mips16_rdhwr ();
8520 }
8521 \f
8522 /* Make the last instruction frame-related and note that it performs
8523    the operation described by FRAME_PATTERN.  */
8524
8525 static void
8526 mips_set_frame_expr (rtx frame_pattern)
8527 {
8528   rtx insn;
8529
8530   insn = get_last_insn ();
8531   RTX_FRAME_RELATED_P (insn) = 1;
8532   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8533                                       frame_pattern,
8534                                       REG_NOTES (insn));
8535 }
8536
8537 /* Return a frame-related rtx that stores REG at MEM.
8538    REG must be a single register.  */
8539
8540 static rtx
8541 mips_frame_set (rtx mem, rtx reg)
8542 {
8543   rtx set;
8544
8545   set = gen_rtx_SET (VOIDmode, mem, reg);
8546   RTX_FRAME_RELATED_P (set) = 1;
8547
8548   return set;
8549 }
8550
8551 /* Record that the epilogue has restored call-saved register REG.  */
8552
8553 static void
8554 mips_add_cfa_restore (rtx reg)
8555 {
8556   mips_epilogue.cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
8557                                                mips_epilogue.cfa_restores);
8558 }
8559 \f
8560 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
8561    mips16e_s2_s8_regs[X], it must also save the registers in indexes
8562    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
8563 static const unsigned char mips16e_s2_s8_regs[] = {
8564   30, 23, 22, 21, 20, 19, 18
8565 };
8566 static const unsigned char mips16e_a0_a3_regs[] = {
8567   4, 5, 6, 7
8568 };
8569
8570 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
8571    ordered from the uppermost in memory to the lowest in memory.  */
8572 static const unsigned char mips16e_save_restore_regs[] = {
8573   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
8574 };
8575
8576 /* Return the index of the lowest X in the range [0, SIZE) for which
8577    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
8578
8579 static unsigned int
8580 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
8581                              unsigned int size)
8582 {
8583   unsigned int i;
8584
8585   for (i = 0; i < size; i++)
8586     if (BITSET_P (mask, regs[i]))
8587       break;
8588
8589   return i;
8590 }
8591
8592 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
8593    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
8594    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
8595    is true for all indexes (X, SIZE).  */
8596
8597 static void
8598 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
8599                         unsigned int size, unsigned int *num_regs_ptr)
8600 {
8601   unsigned int i;
8602
8603   i = mips16e_find_first_register (*mask_ptr, regs, size);
8604   for (i++; i < size; i++)
8605     if (!BITSET_P (*mask_ptr, regs[i]))
8606       {
8607         *num_regs_ptr += 1;
8608         *mask_ptr |= 1 << regs[i];
8609       }
8610 }
8611
8612 /* Return a simplified form of X using the register values in REG_VALUES.
8613    REG_VALUES[R] is the last value assigned to hard register R, or null
8614    if R has not been modified.
8615
8616    This function is rather limited, but is good enough for our purposes.  */
8617
8618 static rtx
8619 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
8620 {
8621   x = avoid_constant_pool_reference (x);
8622
8623   if (UNARY_P (x))
8624     {
8625       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8626       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
8627                                  x0, GET_MODE (XEXP (x, 0)));
8628     }
8629
8630   if (ARITHMETIC_P (x))
8631     {
8632       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8633       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
8634       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
8635     }
8636
8637   if (REG_P (x)
8638       && reg_values[REGNO (x)]
8639       && !rtx_unstable_p (reg_values[REGNO (x)]))
8640     return reg_values[REGNO (x)];
8641
8642   return x;
8643 }
8644
8645 /* Return true if (set DEST SRC) stores an argument register into its
8646    caller-allocated save slot, storing the number of that argument
8647    register in *REGNO_PTR if so.  REG_VALUES is as for
8648    mips16e_collect_propagate_value.  */
8649
8650 static bool
8651 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
8652                                  unsigned int *regno_ptr)
8653 {
8654   unsigned int argno, regno;
8655   HOST_WIDE_INT offset, required_offset;
8656   rtx addr, base;
8657
8658   /* Check that this is a word-mode store.  */
8659   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
8660     return false;
8661
8662   /* Check that the register being saved is an unmodified argument
8663      register.  */
8664   regno = REGNO (src);
8665   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
8666     return false;
8667   argno = regno - GP_ARG_FIRST;
8668
8669   /* Check whether the address is an appropriate stack-pointer or
8670      frame-pointer access.  */
8671   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
8672   mips_split_plus (addr, &base, &offset);
8673   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
8674   if (base == hard_frame_pointer_rtx)
8675     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
8676   else if (base != stack_pointer_rtx)
8677     return false;
8678   if (offset != required_offset)
8679     return false;
8680
8681   *regno_ptr = regno;
8682   return true;
8683 }
8684
8685 /* A subroutine of mips_expand_prologue, called only when generating
8686    MIPS16e SAVE instructions.  Search the start of the function for any
8687    instructions that save argument registers into their caller-allocated
8688    save slots.  Delete such instructions and return a value N such that
8689    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
8690    instructions redundant.  */
8691
8692 static unsigned int
8693 mips16e_collect_argument_saves (void)
8694 {
8695   rtx reg_values[FIRST_PSEUDO_REGISTER];
8696   rtx insn, next, set, dest, src;
8697   unsigned int nargs, regno;
8698
8699   push_topmost_sequence ();
8700   nargs = 0;
8701   memset (reg_values, 0, sizeof (reg_values));
8702   for (insn = get_insns (); insn; insn = next)
8703     {
8704       next = NEXT_INSN (insn);
8705       if (NOTE_P (insn) || DEBUG_INSN_P (insn))
8706         continue;
8707
8708       if (!INSN_P (insn))
8709         break;
8710
8711       set = PATTERN (insn);
8712       if (GET_CODE (set) != SET)
8713         break;
8714
8715       dest = SET_DEST (set);
8716       src = SET_SRC (set);
8717       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
8718         {
8719           if (!BITSET_P (cfun->machine->frame.mask, regno))
8720             {
8721               delete_insn (insn);
8722               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
8723             }
8724         }
8725       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
8726         reg_values[REGNO (dest)]
8727           = mips16e_collect_propagate_value (src, reg_values);
8728       else
8729         break;
8730     }
8731   pop_topmost_sequence ();
8732
8733   return nargs;
8734 }
8735
8736 /* Return a move between register REGNO and memory location SP + OFFSET.
8737    REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
8738    Make the move a load if RESTORE_P, otherwise make it a store.  */
8739
8740 static rtx
8741 mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
8742                           HOST_WIDE_INT offset, unsigned int regno)
8743 {
8744   rtx reg, mem;
8745
8746   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
8747   reg = gen_rtx_REG (SImode, regno);
8748   if (restore_p)
8749     {
8750       mips_add_cfa_restore (reg);
8751       return gen_rtx_SET (VOIDmode, reg, mem);
8752     }
8753   if (reg_parm_p)
8754     return gen_rtx_SET (VOIDmode, mem, reg);
8755   return mips_frame_set (mem, reg);
8756 }
8757
8758 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
8759    The instruction must:
8760
8761      - Allocate or deallocate SIZE bytes in total; SIZE is known
8762        to be nonzero.
8763
8764      - Save or restore as many registers in *MASK_PTR as possible.
8765        The instruction saves the first registers at the top of the
8766        allocated area, with the other registers below it.
8767
8768      - Save NARGS argument registers above the allocated area.
8769
8770    (NARGS is always zero if RESTORE_P.)
8771
8772    The SAVE and RESTORE instructions cannot save and restore all general
8773    registers, so there may be some registers left over for the caller to
8774    handle.  Destructively modify *MASK_PTR so that it contains the registers
8775    that still need to be saved or restored.  The caller can save these
8776    registers in the memory immediately below *OFFSET_PTR, which is a
8777    byte offset from the bottom of the allocated stack area.  */
8778
8779 static rtx
8780 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
8781                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
8782                             HOST_WIDE_INT size)
8783 {
8784   rtx pattern, set;
8785   HOST_WIDE_INT offset, top_offset;
8786   unsigned int i, regno;
8787   int n;
8788
8789   gcc_assert (cfun->machine->frame.num_fp == 0);
8790
8791   /* Calculate the number of elements in the PARALLEL.  We need one element
8792      for the stack adjustment, one for each argument register save, and one
8793      for each additional register move.  */
8794   n = 1 + nargs;
8795   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8796     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
8797       n++;
8798
8799   /* Create the final PARALLEL.  */
8800   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
8801   n = 0;
8802
8803   /* Add the stack pointer adjustment.  */
8804   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8805                      plus_constant (stack_pointer_rtx,
8806                                     restore_p ? size : -size));
8807   RTX_FRAME_RELATED_P (set) = 1;
8808   XVECEXP (pattern, 0, n++) = set;
8809
8810   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8811   top_offset = restore_p ? size : 0;
8812
8813   /* Save the arguments.  */
8814   for (i = 0; i < nargs; i++)
8815     {
8816       offset = top_offset + i * UNITS_PER_WORD;
8817       set = mips16e_save_restore_reg (restore_p, true, offset,
8818                                       GP_ARG_FIRST + i);
8819       XVECEXP (pattern, 0, n++) = set;
8820     }
8821
8822   /* Then fill in the other register moves.  */
8823   offset = top_offset;
8824   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8825     {
8826       regno = mips16e_save_restore_regs[i];
8827       if (BITSET_P (*mask_ptr, regno))
8828         {
8829           offset -= UNITS_PER_WORD;
8830           set = mips16e_save_restore_reg (restore_p, false, offset, regno);
8831           XVECEXP (pattern, 0, n++) = set;
8832           *mask_ptr &= ~(1 << regno);
8833         }
8834     }
8835
8836   /* Tell the caller what offset it should use for the remaining registers.  */
8837   *offset_ptr = size + (offset - top_offset);
8838
8839   gcc_assert (n == XVECLEN (pattern, 0));
8840
8841   return pattern;
8842 }
8843
8844 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
8845    pointer.  Return true if PATTERN matches the kind of instruction
8846    generated by mips16e_build_save_restore.  If INFO is nonnull,
8847    initialize it when returning true.  */
8848
8849 bool
8850 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
8851                                 struct mips16e_save_restore_info *info)
8852 {
8853   unsigned int i, nargs, mask, extra;
8854   HOST_WIDE_INT top_offset, save_offset, offset;
8855   rtx set, reg, mem, base;
8856   int n;
8857
8858   if (!GENERATE_MIPS16E_SAVE_RESTORE)
8859     return false;
8860
8861   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8862   top_offset = adjust > 0 ? adjust : 0;
8863
8864   /* Interpret all other members of the PARALLEL.  */
8865   save_offset = top_offset - UNITS_PER_WORD;
8866   mask = 0;
8867   nargs = 0;
8868   i = 0;
8869   for (n = 1; n < XVECLEN (pattern, 0); n++)
8870     {
8871       /* Check that we have a SET.  */
8872       set = XVECEXP (pattern, 0, n);
8873       if (GET_CODE (set) != SET)
8874         return false;
8875
8876       /* Check that the SET is a load (if restoring) or a store
8877          (if saving).  */
8878       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
8879       if (!MEM_P (mem))
8880         return false;
8881
8882       /* Check that the address is the sum of the stack pointer and a
8883          possibly-zero constant offset.  */
8884       mips_split_plus (XEXP (mem, 0), &base, &offset);
8885       if (base != stack_pointer_rtx)
8886         return false;
8887
8888       /* Check that SET's other operand is a register.  */
8889       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
8890       if (!REG_P (reg))
8891         return false;
8892
8893       /* Check for argument saves.  */
8894       if (offset == top_offset + nargs * UNITS_PER_WORD
8895           && REGNO (reg) == GP_ARG_FIRST + nargs)
8896         nargs++;
8897       else if (offset == save_offset)
8898         {
8899           while (mips16e_save_restore_regs[i++] != REGNO (reg))
8900             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
8901               return false;
8902
8903           mask |= 1 << REGNO (reg);
8904           save_offset -= UNITS_PER_WORD;
8905         }
8906       else
8907         return false;
8908     }
8909
8910   /* Check that the restrictions on register ranges are met.  */
8911   extra = 0;
8912   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
8913                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
8914   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
8915                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
8916   if (extra != 0)
8917     return false;
8918
8919   /* Make sure that the topmost argument register is not saved twice.
8920      The checks above ensure that the same is then true for the other
8921      argument registers.  */
8922   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
8923     return false;
8924
8925   /* Pass back information, if requested.  */
8926   if (info)
8927     {
8928       info->nargs = nargs;
8929       info->mask = mask;
8930       info->size = (adjust > 0 ? adjust : -adjust);
8931     }
8932
8933   return true;
8934 }
8935
8936 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
8937    for the register range [MIN_REG, MAX_REG].  Return a pointer to
8938    the null terminator.  */
8939
8940 static char *
8941 mips16e_add_register_range (char *s, unsigned int min_reg,
8942                             unsigned int max_reg)
8943 {
8944   if (min_reg != max_reg)
8945     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
8946   else
8947     s += sprintf (s, ",%s", reg_names[min_reg]);
8948   return s;
8949 }
8950
8951 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
8952    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
8953
8954 const char *
8955 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
8956 {
8957   static char buffer[300];
8958
8959   struct mips16e_save_restore_info info;
8960   unsigned int i, end;
8961   char *s;
8962
8963   /* Parse the pattern.  */
8964   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
8965     gcc_unreachable ();
8966
8967   /* Add the mnemonic.  */
8968   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
8969   s += strlen (s);
8970
8971   /* Save the arguments.  */
8972   if (info.nargs > 1)
8973     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
8974                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
8975   else if (info.nargs == 1)
8976     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
8977
8978   /* Emit the amount of stack space to allocate or deallocate.  */
8979   s += sprintf (s, "%d", (int) info.size);
8980
8981   /* Save or restore $16.  */
8982   if (BITSET_P (info.mask, 16))
8983     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
8984
8985   /* Save or restore $17.  */
8986   if (BITSET_P (info.mask, 17))
8987     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
8988
8989   /* Save or restore registers in the range $s2...$s8, which
8990      mips16e_s2_s8_regs lists in decreasing order.  Note that this
8991      is a software register range; the hardware registers are not
8992      numbered consecutively.  */
8993   end = ARRAY_SIZE (mips16e_s2_s8_regs);
8994   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
8995   if (i < end)
8996     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
8997                                     mips16e_s2_s8_regs[i]);
8998
8999   /* Save or restore registers in the range $a0...$a3.  */
9000   end = ARRAY_SIZE (mips16e_a0_a3_regs);
9001   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
9002   if (i < end)
9003     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
9004                                     mips16e_a0_a3_regs[end - 1]);
9005
9006   /* Save or restore $31.  */
9007   if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
9008     s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
9009
9010   return buffer;
9011 }
9012 \f
9013 /* Return true if the current function returns its value in a floating-point
9014    register in MIPS16 mode.  */
9015
9016 static bool
9017 mips16_cfun_returns_in_fpr_p (void)
9018 {
9019   tree return_type = DECL_RESULT (current_function_decl);
9020   return (TARGET_MIPS16
9021           && TARGET_HARD_FLOAT_ABI
9022           && !aggregate_value_p (return_type, current_function_decl)
9023           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
9024 }
9025
9026 /* Return true if predicate PRED is true for at least one instruction.
9027    Cache the result in *CACHE, and assume that the result is true
9028    if *CACHE is already true.  */
9029
9030 static bool
9031 mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
9032 {
9033   rtx insn;
9034
9035   if (!*cache)
9036     {
9037       push_topmost_sequence ();
9038       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9039         if (USEFUL_INSN_P (insn) && pred (insn))
9040           {
9041             *cache = true;
9042             break;
9043           }
9044       pop_topmost_sequence ();
9045     }
9046   return *cache;
9047 }
9048
9049 /* Return true if INSN refers to the global pointer in an "inflexible" way.
9050    See mips_cfun_has_inflexible_gp_ref_p for details.  */
9051
9052 static bool
9053 mips_insn_has_inflexible_gp_ref_p (rtx insn)
9054 {
9055   /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
9056      indicate that the target could be a traditional MIPS
9057      lazily-binding stub.  */
9058   return find_reg_fusage (insn, USE, pic_offset_table_rtx);
9059 }
9060
9061 /* Return true if the current function refers to the global pointer
9062    in a way that forces $28 to be valid.  This means that we can't
9063    change the choice of global pointer, even for NewABI code.
9064
9065    One example of this (and one which needs several checks) is that
9066    $28 must be valid when calling traditional MIPS lazy-binding stubs.
9067    (This restriction does not apply to PLTs.)  */
9068
9069 static bool
9070 mips_cfun_has_inflexible_gp_ref_p (void)
9071 {
9072   /* If the function has a nonlocal goto, $28 must hold the correct
9073      global pointer for the target function.  That is, the target
9074      of the goto implicitly uses $28.  */
9075   if (crtl->has_nonlocal_goto)
9076     return true;
9077
9078   if (TARGET_ABICALLS_PIC2)
9079     {
9080       /* Symbolic accesses implicitly use the global pointer unless
9081          -mexplicit-relocs is in effect.  JAL macros to symbolic addresses
9082          might go to traditional MIPS lazy-binding stubs.  */
9083       if (!TARGET_EXPLICIT_RELOCS)
9084         return true;
9085
9086       /* FUNCTION_PROFILER includes a JAL to _mcount, which again
9087          can be lazily-bound.  */
9088       if (crtl->profile)
9089         return true;
9090
9091       /* MIPS16 functions that return in FPRs need to call an
9092          external libgcc routine.  This call is only made explict
9093          during mips_expand_epilogue, and it too might be lazily bound.  */
9094       if (mips16_cfun_returns_in_fpr_p ())
9095         return true;
9096     }
9097
9098   return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
9099                            mips_insn_has_inflexible_gp_ref_p);
9100 }
9101
9102 /* Return true if INSN refers to the global pointer in a "flexible" way.
9103    See mips_cfun_has_flexible_gp_ref_p for details.  */
9104
9105 static bool
9106 mips_insn_has_flexible_gp_ref_p (rtx insn)
9107 {
9108   return (get_attr_got (insn) != GOT_UNSET
9109           || mips_small_data_pattern_p (PATTERN (insn))
9110           || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
9111 }
9112
9113 /* Return true if the current function references the global pointer,
9114    but if those references do not inherently require the global pointer
9115    to be $28.  Assume !mips_cfun_has_inflexible_gp_ref_p ().  */
9116
9117 static bool
9118 mips_cfun_has_flexible_gp_ref_p (void)
9119 {
9120   /* Reload can sometimes introduce constant pool references
9121      into a function that otherwise didn't need them.  For example,
9122      suppose we have an instruction like:
9123
9124         (set (reg:DF R1) (float:DF (reg:SI R2)))
9125
9126      If R2 turns out to be a constant such as 1, the instruction may
9127      have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
9128      the option of using this constant if R2 doesn't get allocated
9129      to a register.
9130
9131      In cases like these, reload will have added the constant to the
9132      pool but no instruction will yet refer to it.  */
9133   if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
9134     return true;
9135
9136   return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
9137                            mips_insn_has_flexible_gp_ref_p);
9138 }
9139
9140 /* Return the register that should be used as the global pointer
9141    within this function.  Return INVALID_REGNUM if the function
9142    doesn't need a global pointer.  */
9143
9144 static unsigned int
9145 mips_global_pointer (void)
9146 {
9147   unsigned int regno;
9148
9149   /* $gp is always available unless we're using a GOT.  */
9150   if (!TARGET_USE_GOT)
9151     return GLOBAL_POINTER_REGNUM;
9152
9153   /* If there are inflexible references to $gp, we must use the
9154      standard register.  */
9155   if (mips_cfun_has_inflexible_gp_ref_p ())
9156     return GLOBAL_POINTER_REGNUM;
9157
9158   /* If there are no current references to $gp, then the only uses
9159      we can introduce later are those involved in long branches.  */
9160   if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
9161     return INVALID_REGNUM;
9162
9163   /* If the global pointer is call-saved, try to use a call-clobbered
9164      alternative.  */
9165   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
9166     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9167       if (!df_regs_ever_live_p (regno)
9168           && call_really_used_regs[regno]
9169           && !fixed_regs[regno]
9170           && regno != PIC_FUNCTION_ADDR_REGNUM)
9171         return regno;
9172
9173   return GLOBAL_POINTER_REGNUM;
9174 }
9175
9176 /* Return true if the current function's prologue must load the global
9177    pointer value into pic_offset_table_rtx and store the same value in
9178    the function's cprestore slot (if any).
9179
9180    One problem we have to deal with is that, when emitting GOT-based
9181    position independent code, long-branch sequences will need to load
9182    the address of the branch target from the GOT.  We don't know until
9183    the very end of compilation whether (and where) the function needs
9184    long branches, so we must ensure that _any_ branch can access the
9185    global pointer in some form.  However, we do not want to pessimize
9186    the usual case in which all branches are short.
9187
9188    We handle this as follows:
9189
9190    (1) During reload, we set cfun->machine->global_pointer to
9191        INVALID_REGNUM if we _know_ that the current function
9192        doesn't need a global pointer.  This is only valid if
9193        long branches don't need the GOT.
9194
9195        Otherwise, we assume that we might need a global pointer
9196        and pick an appropriate register.
9197
9198    (2) If cfun->machine->global_pointer != INVALID_REGNUM,
9199        we ensure that the global pointer is available at every
9200        block boundary bar entry and exit.  We do this in one of two ways:
9201
9202        - If the function has a cprestore slot, we ensure that this
9203          slot is valid at every branch.  However, as explained in
9204          point (6) below, there is no guarantee that pic_offset_table_rtx
9205          itself is valid if new uses of the global pointer are introduced
9206          after the first post-epilogue split.
9207
9208          We guarantee that the cprestore slot is valid by loading it
9209          into a fake register, CPRESTORE_SLOT_REGNUM.  We then make
9210          this register live at every block boundary bar function entry
9211          and exit.  It is then invalid to move the load (and thus the
9212          preceding store) across a block boundary.
9213
9214        - If the function has no cprestore slot, we guarantee that
9215          pic_offset_table_rtx itself is valid at every branch.
9216
9217        See mips_eh_uses for the handling of the register liveness.
9218
9219    (3) During prologue and epilogue generation, we emit "ghost"
9220        placeholder instructions to manipulate the global pointer.
9221
9222    (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
9223        and cfun->machine->must_restore_gp_when_clobbered_p if we already know
9224        that the function needs a global pointer.  (There is no need to set
9225        them earlier than this, and doing it as late as possible leads to
9226        fewer false positives.)
9227
9228    (5) If cfun->machine->must_initialize_gp_p is true during a
9229        split_insns pass, we split the ghost instructions into real
9230        instructions.  These split instructions can then be optimized in
9231        the usual way.  Otherwise, we keep the ghost instructions intact,
9232        and optimize for the case where they aren't needed.  We still
9233        have the option of splitting them later, if we need to introduce
9234        new uses of the global pointer.
9235
9236        For example, the scheduler ignores a ghost instruction that
9237        stores $28 to the stack, but it handles the split form of
9238        the ghost instruction as an ordinary store.
9239
9240    (6) [OldABI only.]  If cfun->machine->must_restore_gp_when_clobbered_p
9241        is true during the first post-epilogue split_insns pass, we split
9242        calls and restore_gp patterns into instructions that explicitly
9243        load pic_offset_table_rtx from the cprestore slot.  Otherwise,
9244        we split these patterns into instructions that _don't_ load from
9245        the cprestore slot.
9246
9247        If cfun->machine->must_restore_gp_when_clobbered_p is true at the
9248        time of the split, then any instructions that exist at that time
9249        can make free use of pic_offset_table_rtx.  However, if we want
9250        to introduce new uses of the global pointer after the split,
9251        we must explicitly load the value from the cprestore slot, since
9252        pic_offset_table_rtx itself might not be valid at a given point
9253        in the function.
9254
9255        The idea is that we want to be able to delete redundant
9256        loads from the cprestore slot in the usual case where no
9257        long branches are needed.
9258
9259    (7) If cfun->machine->must_initialize_gp_p is still false at the end
9260        of md_reorg, we decide whether the global pointer is needed for
9261        long branches.  If so, we set cfun->machine->must_initialize_gp_p
9262        to true and split the ghost instructions into real instructions
9263        at that stage.
9264
9265    Note that the ghost instructions must have a zero length for three reasons:
9266
9267    - Giving the length of the underlying $gp sequence might cause
9268      us to use long branches in cases where they aren't really needed.
9269
9270    - They would perturb things like alignment calculations.
9271
9272    - More importantly, the hazard detection in md_reorg relies on
9273      empty instructions having a zero length.
9274
9275    If we find a long branch and split the ghost instructions at the
9276    end of md_reorg, the split could introduce more long branches.
9277    That isn't a problem though, because we still do the split before
9278    the final shorten_branches pass.
9279
9280    This is extremely ugly, but it seems like the best compromise between
9281    correctness and efficiency.  */
9282
9283 bool
9284 mips_must_initialize_gp_p (void)
9285 {
9286   return cfun->machine->must_initialize_gp_p;
9287 }
9288
9289 /* Return true if REGNO is a register that is ordinarily call-clobbered
9290    but must nevertheless be preserved by an interrupt handler.  */
9291
9292 static bool
9293 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
9294 {
9295   if (MD_REG_P (regno))
9296     return true;
9297
9298   if (TARGET_DSP && DSP_ACC_REG_P (regno))
9299     return true;
9300
9301   if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
9302     {
9303       /* $0 is hard-wired.  */
9304       if (regno == GP_REG_FIRST)
9305         return false;
9306
9307       /* The interrupt handler can treat kernel registers as
9308          scratch registers.  */
9309       if (KERNEL_REG_P (regno))
9310         return false;
9311
9312       /* The function will return the stack pointer to its original value
9313          anyway.  */
9314       if (regno == STACK_POINTER_REGNUM)
9315         return false;
9316
9317       /* Otherwise, return true for registers that aren't ordinarily
9318          call-clobbered.  */
9319       return call_really_used_regs[regno];
9320     }
9321
9322   return false;
9323 }
9324
9325 /* Return true if the current function should treat register REGNO
9326    as call-saved.  */
9327
9328 static bool
9329 mips_cfun_call_saved_reg_p (unsigned int regno)
9330 {
9331   /* If the user makes an ordinarily-call-saved register global,
9332      that register is no longer call-saved.  */
9333   if (global_regs[regno])
9334     return false;
9335
9336   /* Interrupt handlers need to save extra registers.  */
9337   if (cfun->machine->interrupt_handler_p
9338       && mips_interrupt_extra_call_saved_reg_p (regno))
9339     return true;
9340
9341   /* call_insns preserve $28 unless they explicitly say otherwise,
9342      so call_really_used_regs[] treats $28 as call-saved.  However,
9343      we want the ABI property rather than the default call_insn
9344      property here.  */
9345   return (regno == GLOBAL_POINTER_REGNUM
9346           ? TARGET_CALL_SAVED_GP
9347           : !call_really_used_regs[regno]);
9348 }
9349
9350 /* Return true if the function body might clobber register REGNO.
9351    We know that REGNO is call-saved.  */
9352
9353 static bool
9354 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9355 {
9356   /* Some functions should be treated as clobbering all call-saved
9357      registers.  */
9358   if (crtl->saves_all_registers)
9359     return true;
9360
9361   /* DF handles cases where a register is explicitly referenced in
9362      the rtl.  Incoming values are passed in call-clobbered registers,
9363      so we can assume that any live call-saved register is set within
9364      the function.  */
9365   if (df_regs_ever_live_p (regno))
9366     return true;
9367
9368   /* Check for registers that are clobbered by FUNCTION_PROFILER.
9369      These clobbers are not explicit in the rtl.  */
9370   if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9371     return true;
9372
9373   /* If we're using a call-saved global pointer, the function's
9374      prologue will need to set it up.  */
9375   if (cfun->machine->global_pointer == regno)
9376     return true;
9377
9378   /* The function's prologue will need to set the frame pointer if
9379      frame_pointer_needed.  */
9380   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9381     return true;
9382
9383   /* If a MIPS16 function returns a value in FPRs, its epilogue
9384      will need to call an external libgcc routine.  This yet-to-be
9385      generated call_insn will clobber $31.  */
9386   if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9387     return true;
9388
9389   /* If REGNO is ordinarily call-clobbered, we must assume that any
9390      called function could modify it.  */
9391   if (cfun->machine->interrupt_handler_p
9392       && !current_function_is_leaf
9393       && mips_interrupt_extra_call_saved_reg_p (regno))
9394     return true;
9395
9396   return false;
9397 }
9398
9399 /* Return true if the current function must save register REGNO.  */
9400
9401 static bool
9402 mips_save_reg_p (unsigned int regno)
9403 {
9404   if (mips_cfun_call_saved_reg_p (regno))
9405     {
9406       if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9407         return true;
9408
9409       /* Save both registers in an FPR pair if either one is used.  This is
9410          needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9411          register to be used without the even register.  */
9412       if (FP_REG_P (regno)
9413           && MAX_FPRS_PER_FMT == 2
9414           && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9415         return true;
9416     }
9417
9418   /* We need to save the incoming return address if __builtin_eh_return
9419      is being used to set a different return address.  */
9420   if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9421     return true;
9422
9423   return false;
9424 }
9425
9426 /* Populate the current function's mips_frame_info structure.
9427
9428    MIPS stack frames look like:
9429
9430         +-------------------------------+
9431         |                               |
9432         |  incoming stack arguments     |
9433         |                               |
9434         +-------------------------------+
9435         |                               |
9436         |  caller-allocated save area   |
9437       A |  for register arguments       |
9438         |                               |
9439         +-------------------------------+ <-- incoming stack pointer
9440         |                               |
9441         |  callee-allocated save area   |
9442       B |  for arguments that are       |
9443         |  split between registers and  |
9444         |  the stack                    |
9445         |                               |
9446         +-------------------------------+ <-- arg_pointer_rtx
9447         |                               |
9448       C |  callee-allocated save area   |
9449         |  for register varargs         |
9450         |                               |
9451         +-------------------------------+ <-- frame_pointer_rtx
9452         |                               |       + cop0_sp_offset
9453         |  COP0 reg save area           |       + UNITS_PER_WORD
9454         |                               |
9455         +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9456         |                               |       + UNITS_PER_WORD
9457         |  accumulator save area        |
9458         |                               |
9459         +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9460         |                               |       + UNITS_PER_HWFPVALUE
9461         |  FPR save area                |
9462         |                               |
9463         +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9464         |                               |       + UNITS_PER_WORD
9465         |  GPR save area                |
9466         |                               |
9467         +-------------------------------+ <-- frame_pointer_rtx with
9468         |                               | \     -fstack-protector
9469         |  local variables              |  | var_size
9470         |                               | /
9471         +-------------------------------+
9472         |                               | \
9473         |  $gp save area                |  | cprestore_size
9474         |                               | /
9475       P +-------------------------------+ <-- hard_frame_pointer_rtx for
9476         |                               | \     MIPS16 code
9477         |  outgoing stack arguments     |  |
9478         |                               |  |
9479         +-------------------------------+  | args_size
9480         |                               |  |
9481         |  caller-allocated save area   |  |
9482         |  for register arguments       |  |
9483         |                               | /
9484         +-------------------------------+ <-- stack_pointer_rtx
9485                                               frame_pointer_rtx without
9486                                                 -fstack-protector
9487                                               hard_frame_pointer_rtx for
9488                                                 non-MIPS16 code.
9489
9490    At least two of A, B and C will be empty.
9491
9492    Dynamic stack allocations such as alloca insert data at point P.
9493    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
9494    hard_frame_pointer_rtx unchanged.  */
9495
9496 static void
9497 mips_compute_frame_info (void)
9498 {
9499   struct mips_frame_info *frame;
9500   HOST_WIDE_INT offset, size;
9501   unsigned int regno, i;
9502
9503   /* Set this function's interrupt properties.  */
9504   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
9505     {
9506       if (!ISA_MIPS32R2)
9507         error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
9508       else if (TARGET_HARD_FLOAT)
9509         error ("the %<interrupt%> attribute requires %<-msoft-float%>");
9510       else if (TARGET_MIPS16)
9511         error ("interrupt handlers cannot be MIPS16 functions");
9512       else
9513         {
9514           cfun->machine->interrupt_handler_p = true;
9515           cfun->machine->use_shadow_register_set_p =
9516             mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
9517           cfun->machine->keep_interrupts_masked_p =
9518             mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
9519           cfun->machine->use_debug_exception_return_p =
9520             mips_use_debug_exception_return_p (TREE_TYPE
9521                                                (current_function_decl));
9522         }
9523     }
9524
9525   frame = &cfun->machine->frame;
9526   memset (frame, 0, sizeof (*frame));
9527   size = get_frame_size ();
9528
9529   cfun->machine->global_pointer = mips_global_pointer ();
9530
9531   /* The first two blocks contain the outgoing argument area and the $gp save
9532      slot.  This area isn't needed in leaf functions, but if the
9533      target-independent frame size is nonzero, we have already committed to
9534      allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
9535   if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf)
9536     {
9537       /* The MIPS 3.0 linker does not like functions that dynamically
9538          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
9539          looks like we are trying to create a second frame pointer to the
9540          function, so allocate some stack space to make it happy.  */
9541       if (cfun->calls_alloca)
9542         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
9543       else
9544         frame->args_size = 0;
9545       frame->cprestore_size = 0;
9546     }
9547   else
9548     {
9549       frame->args_size = crtl->outgoing_args_size;
9550       frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
9551     }
9552   offset = frame->args_size + frame->cprestore_size;
9553
9554   /* Move above the local variables.  */
9555   frame->var_size = MIPS_STACK_ALIGN (size);
9556   offset += frame->var_size;
9557
9558   /* Find out which GPRs we need to save.  */
9559   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9560     if (mips_save_reg_p (regno))
9561       {
9562         frame->num_gp++;
9563         frame->mask |= 1 << (regno - GP_REG_FIRST);
9564       }
9565
9566   /* If this function calls eh_return, we must also save and restore the
9567      EH data registers.  */
9568   if (crtl->calls_eh_return)
9569     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
9570       {
9571         frame->num_gp++;
9572         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
9573       }
9574
9575   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
9576      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
9577      save all later registers too.  */
9578   if (GENERATE_MIPS16E_SAVE_RESTORE)
9579     {
9580       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
9581                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
9582       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
9583                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
9584     }
9585
9586   /* Move above the GPR save area.  */
9587   if (frame->num_gp > 0)
9588     {
9589       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
9590       frame->gp_sp_offset = offset - UNITS_PER_WORD;
9591     }
9592
9593   /* Find out which FPRs we need to save.  This loop must iterate over
9594      the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
9595   if (TARGET_HARD_FLOAT)
9596     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
9597       if (mips_save_reg_p (regno))
9598         {
9599           frame->num_fp += MAX_FPRS_PER_FMT;
9600           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
9601         }
9602
9603   /* Move above the FPR save area.  */
9604   if (frame->num_fp > 0)
9605     {
9606       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
9607       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
9608     }
9609
9610   /* Add in space for the interrupt context information.  */
9611   if (cfun->machine->interrupt_handler_p)
9612     {
9613       /* Check HI/LO.  */
9614       if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
9615         {
9616           frame->num_acc++;
9617           frame->acc_mask |= (1 << 0);
9618         }
9619
9620       /* Check accumulators 1, 2, 3.  */
9621       for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
9622         if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
9623           {
9624             frame->num_acc++;
9625             frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
9626           }
9627
9628       /* All interrupt context functions need space to preserve STATUS.  */
9629       frame->num_cop0_regs++;
9630
9631       /* If we don't keep interrupts masked, we need to save EPC.  */
9632       if (!cfun->machine->keep_interrupts_masked_p)
9633         frame->num_cop0_regs++;
9634     }
9635
9636   /* Move above the accumulator save area.  */
9637   if (frame->num_acc > 0)
9638     {
9639       /* Each accumulator needs 2 words.  */
9640       offset += frame->num_acc * 2 * UNITS_PER_WORD;
9641       frame->acc_sp_offset = offset - UNITS_PER_WORD;
9642     }
9643
9644   /* Move above the COP0 register save area.  */
9645   if (frame->num_cop0_regs > 0)
9646     {
9647       offset += frame->num_cop0_regs * UNITS_PER_WORD;
9648       frame->cop0_sp_offset = offset - UNITS_PER_WORD;
9649     }
9650
9651   /* Move above the callee-allocated varargs save area.  */
9652   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
9653   frame->arg_pointer_offset = offset;
9654
9655   /* Move above the callee-allocated area for pretend stack arguments.  */
9656   offset += crtl->args.pretend_args_size;
9657   frame->total_size = offset;
9658
9659   /* Work out the offsets of the save areas from the top of the frame.  */
9660   if (frame->gp_sp_offset > 0)
9661     frame->gp_save_offset = frame->gp_sp_offset - offset;
9662   if (frame->fp_sp_offset > 0)
9663     frame->fp_save_offset = frame->fp_sp_offset - offset;
9664   if (frame->acc_sp_offset > 0)
9665     frame->acc_save_offset = frame->acc_sp_offset - offset;
9666   if (frame->num_cop0_regs > 0)
9667     frame->cop0_save_offset = frame->cop0_sp_offset - offset;
9668
9669   /* MIPS16 code offsets the frame pointer by the size of the outgoing
9670      arguments.  This tends to increase the chances of using unextended
9671      instructions for local variables and incoming arguments.  */
9672   if (TARGET_MIPS16)
9673     frame->hard_frame_pointer_offset = frame->args_size;
9674 }
9675
9676 /* Return the style of GP load sequence that is being used for the
9677    current function.  */
9678
9679 enum mips_loadgp_style
9680 mips_current_loadgp_style (void)
9681 {
9682   if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
9683     return LOADGP_NONE;
9684
9685   if (TARGET_RTP_PIC)
9686     return LOADGP_RTP;
9687
9688   if (TARGET_ABSOLUTE_ABICALLS)
9689     return LOADGP_ABSOLUTE;
9690
9691   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
9692 }
9693
9694 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
9695
9696 static bool
9697 mips_frame_pointer_required (void)
9698 {
9699   /* If the function contains dynamic stack allocations, we need to
9700      use the frame pointer to access the static parts of the frame.  */
9701   if (cfun->calls_alloca)
9702     return true;
9703
9704   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
9705      reload may be unable to compute the address of a local variable,
9706      since there is no way to add a large constant to the stack pointer
9707      without using a second temporary register.  */
9708   if (TARGET_MIPS16)
9709     {
9710       mips_compute_frame_info ();
9711       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
9712         return true;
9713     }
9714
9715   return false;
9716 }
9717
9718 /* Make sure that we're not trying to eliminate to the wrong hard frame
9719    pointer.  */
9720
9721 static bool
9722 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
9723 {
9724   return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
9725 }
9726
9727 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
9728    or argument pointer.  TO is either the stack pointer or hard frame
9729    pointer.  */
9730
9731 HOST_WIDE_INT
9732 mips_initial_elimination_offset (int from, int to)
9733 {
9734   HOST_WIDE_INT offset;
9735
9736   mips_compute_frame_info ();
9737
9738   /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
9739   switch (from)
9740     {
9741     case FRAME_POINTER_REGNUM:
9742       if (FRAME_GROWS_DOWNWARD)
9743         offset = (cfun->machine->frame.args_size
9744                   + cfun->machine->frame.cprestore_size
9745                   + cfun->machine->frame.var_size);
9746       else
9747         offset = 0;
9748       break;
9749
9750     case ARG_POINTER_REGNUM:
9751       offset = cfun->machine->frame.arg_pointer_offset;
9752       break;
9753
9754     default:
9755       gcc_unreachable ();
9756     }
9757
9758   if (to == HARD_FRAME_POINTER_REGNUM)
9759     offset -= cfun->machine->frame.hard_frame_pointer_offset;
9760
9761   return offset;
9762 }
9763 \f
9764 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
9765
9766 static void
9767 mips_extra_live_on_entry (bitmap regs)
9768 {
9769   if (TARGET_USE_GOT)
9770     {
9771       /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
9772          the global pointer.   */
9773       if (!TARGET_ABSOLUTE_ABICALLS)
9774         bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
9775
9776       /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
9777          the global pointer.  */
9778       if (TARGET_MIPS16)
9779         bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
9780
9781       /* See the comment above load_call<mode> for details.  */
9782       bitmap_set_bit (regs, GOT_VERSION_REGNUM);
9783     }
9784 }
9785
9786 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
9787    previous frame.  */
9788
9789 rtx
9790 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
9791 {
9792   if (count != 0)
9793     return const0_rtx;
9794
9795   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
9796 }
9797
9798 /* Emit code to change the current function's return address to
9799    ADDRESS.  SCRATCH is available as a scratch register, if needed.
9800    ADDRESS and SCRATCH are both word-mode GPRs.  */
9801
9802 void
9803 mips_set_return_address (rtx address, rtx scratch)
9804 {
9805   rtx slot_address;
9806
9807   gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
9808   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
9809                                   cfun->machine->frame.gp_sp_offset);
9810   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
9811 }
9812
9813 /* Return true if the current function has a cprestore slot.  */
9814
9815 bool
9816 mips_cfun_has_cprestore_slot_p (void)
9817 {
9818   return (cfun->machine->global_pointer != INVALID_REGNUM
9819           && cfun->machine->frame.cprestore_size > 0);
9820 }
9821
9822 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
9823    cprestore slot.  LOAD_P is true if the caller wants to load from
9824    the cprestore slot; it is false if the caller wants to store to
9825    the slot.  */
9826
9827 static void
9828 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
9829                                     bool load_p)
9830 {
9831   const struct mips_frame_info *frame;
9832
9833   frame = &cfun->machine->frame;
9834   /* .cprestore always uses the stack pointer instead of the frame pointer.
9835      We have a free choice for direct stores for non-MIPS16 functions,
9836      and for MIPS16 functions whose cprestore slot is in range of the
9837      stack pointer.  Using the stack pointer would sometimes give more
9838      (early) scheduling freedom, but using the frame pointer would
9839      sometimes give more (late) scheduling freedom.  It's hard to
9840      predict which applies to a given function, so let's keep things
9841      simple.
9842
9843      Loads must always use the frame pointer in functions that call
9844      alloca, and there's little benefit to using the stack pointer
9845      otherwise.  */
9846   if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
9847     {
9848       *base = hard_frame_pointer_rtx;
9849       *offset = frame->args_size - frame->hard_frame_pointer_offset;
9850     }
9851   else
9852     {
9853       *base = stack_pointer_rtx;
9854       *offset = frame->args_size;
9855     }
9856 }
9857
9858 /* Return true if X is the load or store address of the cprestore slot;
9859    LOAD_P says which.  */
9860
9861 bool
9862 mips_cprestore_address_p (rtx x, bool load_p)
9863 {
9864   rtx given_base, required_base;
9865   HOST_WIDE_INT given_offset, required_offset;
9866
9867   mips_split_plus (x, &given_base, &given_offset);
9868   mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
9869   return given_base == required_base && given_offset == required_offset;
9870 }
9871
9872 /* Return a MEM rtx for the cprestore slot.  LOAD_P is true if we are
9873    going to load from it, false if we are going to store to it.
9874    Use TEMP as a temporary register if need be.  */
9875
9876 static rtx
9877 mips_cprestore_slot (rtx temp, bool load_p)
9878 {
9879   rtx base;
9880   HOST_WIDE_INT offset;
9881
9882   mips_get_cprestore_base_and_offset (&base, &offset, load_p);
9883   return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
9884 }
9885
9886 /* Emit instructions to save global pointer value GP into cprestore
9887    slot MEM.  OFFSET is the offset that MEM applies to the base register.
9888
9889    MEM may not be a legitimate address.  If it isn't, TEMP is a
9890    temporary register that can be used, otherwise it is a SCRATCH.  */
9891
9892 void
9893 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
9894 {
9895   if (TARGET_CPRESTORE_DIRECTIVE)
9896     {
9897       gcc_assert (gp == pic_offset_table_rtx);
9898       emit_insn (PMODE_INSN (gen_cprestore, (mem, offset)));
9899     }
9900   else
9901     mips_emit_move (mips_cprestore_slot (temp, false), gp);
9902 }
9903
9904 /* Restore $gp from its save slot, using TEMP as a temporary base register
9905    if need be.  This function is for o32 and o64 abicalls only.
9906
9907    See mips_must_initialize_gp_p for details about how we manage the
9908    global pointer.  */
9909
9910 void
9911 mips_restore_gp_from_cprestore_slot (rtx temp)
9912 {
9913   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
9914
9915   if (!cfun->machine->must_restore_gp_when_clobbered_p)
9916     {
9917       emit_note (NOTE_INSN_DELETED);
9918       return;
9919     }
9920
9921   if (TARGET_MIPS16)
9922     {
9923       mips_emit_move (temp, mips_cprestore_slot (temp, true));
9924       mips_emit_move (pic_offset_table_rtx, temp);
9925     }
9926   else
9927     mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
9928   if (!TARGET_EXPLICIT_RELOCS)
9929     emit_insn (gen_blockage ());
9930 }
9931 \f
9932 /* A function to save or store a register.  The first argument is the
9933    register and the second is the stack slot.  */
9934 typedef void (*mips_save_restore_fn) (rtx, rtx);
9935
9936 /* Use FN to save or restore register REGNO.  MODE is the register's
9937    mode and OFFSET is the offset of its save slot from the current
9938    stack pointer.  */
9939
9940 static void
9941 mips_save_restore_reg (enum machine_mode mode, int regno,
9942                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
9943 {
9944   rtx mem;
9945
9946   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
9947   fn (gen_rtx_REG (mode, regno), mem);
9948 }
9949
9950 /* Call FN for each accumlator that is saved by the current function.
9951    SP_OFFSET is the offset of the current stack pointer from the start
9952    of the frame.  */
9953
9954 static void
9955 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
9956 {
9957   HOST_WIDE_INT offset;
9958   int regno;
9959
9960   offset = cfun->machine->frame.acc_sp_offset - sp_offset;
9961   if (BITSET_P (cfun->machine->frame.acc_mask, 0))
9962     {
9963       mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
9964       offset -= UNITS_PER_WORD;
9965       mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
9966       offset -= UNITS_PER_WORD;
9967     }
9968
9969   for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
9970     if (BITSET_P (cfun->machine->frame.acc_mask,
9971                   ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
9972       {
9973         mips_save_restore_reg (word_mode, regno, offset, fn);
9974         offset -= UNITS_PER_WORD;
9975       }
9976 }
9977
9978 /* Call FN for each register that is saved by the current function.
9979    SP_OFFSET is the offset of the current stack pointer from the start
9980    of the frame.  */
9981
9982 static void
9983 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
9984                                  mips_save_restore_fn fn)
9985 {
9986   enum machine_mode fpr_mode;
9987   HOST_WIDE_INT offset;
9988   int regno;
9989
9990   /* Save registers starting from high to low.  The debuggers prefer at least
9991      the return register be stored at func+4, and also it allows us not to
9992      need a nop in the epilogue if at least one register is reloaded in
9993      addition to return address.  */
9994   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
9995   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
9996     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
9997       {
9998         /* Record the ra offset for use by mips_function_profiler.  */
9999         if (regno == RETURN_ADDR_REGNUM)
10000           cfun->machine->frame.ra_fp_offset = offset + sp_offset;
10001         mips_save_restore_reg (word_mode, regno, offset, fn);
10002         offset -= UNITS_PER_WORD;
10003       }
10004
10005   /* This loop must iterate over the same space as its companion in
10006      mips_compute_frame_info.  */
10007   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
10008   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
10009   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
10010        regno >= FP_REG_FIRST;
10011        regno -= MAX_FPRS_PER_FMT)
10012     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
10013       {
10014         mips_save_restore_reg (fpr_mode, regno, offset, fn);
10015         offset -= GET_MODE_SIZE (fpr_mode);
10016       }
10017 }
10018
10019 /* Return true if a move between register REGNO and its save slot (MEM)
10020    can be done in a single move.  LOAD_P is true if we are loading
10021    from the slot, false if we are storing to it.  */
10022
10023 static bool
10024 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
10025 {
10026   /* There is a specific MIPS16 instruction for saving $31 to the stack.  */
10027   if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
10028     return false;
10029
10030   return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
10031                                       GET_MODE (mem), mem, load_p) == NO_REGS;
10032 }
10033
10034 /* Emit a move from SRC to DEST, given that one of them is a register
10035    save slot and that the other is a register.  TEMP is a temporary
10036    GPR of the same mode that is available if need be.  */
10037
10038 void
10039 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
10040 {
10041   unsigned int regno;
10042   rtx mem;
10043
10044   if (REG_P (src))
10045     {
10046       regno = REGNO (src);
10047       mem = dest;
10048     }
10049   else
10050     {
10051       regno = REGNO (dest);
10052       mem = src;
10053     }
10054
10055   if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
10056     {
10057       /* We don't yet know whether we'll need this instruction or not.
10058          Postpone the decision by emitting a ghost move.  This move
10059          is specifically not frame-related; only the split version is.  */
10060       if (TARGET_64BIT)
10061         emit_insn (gen_move_gpdi (dest, src));
10062       else
10063         emit_insn (gen_move_gpsi (dest, src));
10064       return;
10065     }
10066
10067   if (regno == HI_REGNUM)
10068     {
10069       if (REG_P (dest))
10070         {
10071           mips_emit_move (temp, src);
10072           if (TARGET_64BIT)
10073             emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
10074                                       temp, gen_rtx_REG (DImode, LO_REGNUM)));
10075           else
10076             emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
10077                                       temp, gen_rtx_REG (SImode, LO_REGNUM)));
10078         }
10079       else
10080         {
10081           if (TARGET_64BIT)
10082             emit_insn (gen_mfhidi_ti (temp,
10083                                       gen_rtx_REG (TImode, MD_REG_FIRST)));
10084           else
10085             emit_insn (gen_mfhisi_di (temp,
10086                                       gen_rtx_REG (DImode, MD_REG_FIRST)));
10087           mips_emit_move (dest, temp);
10088         }
10089     }
10090   else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
10091     mips_emit_move (dest, src);
10092   else
10093     {
10094       gcc_assert (!reg_overlap_mentioned_p (dest, temp));
10095       mips_emit_move (temp, src);
10096       mips_emit_move (dest, temp);
10097     }
10098   if (MEM_P (dest))
10099     mips_set_frame_expr (mips_frame_set (dest, src));
10100 }
10101 \f
10102 /* If we're generating n32 or n64 abicalls, and the current function
10103    does not use $28 as its global pointer, emit a cplocal directive.
10104    Use pic_offset_table_rtx as the argument to the directive.  */
10105
10106 static void
10107 mips_output_cplocal (void)
10108 {
10109   if (!TARGET_EXPLICIT_RELOCS
10110       && mips_must_initialize_gp_p ()
10111       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
10112     output_asm_insn (".cplocal %+", 0);
10113 }
10114
10115 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
10116
10117 static void
10118 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10119 {
10120   const char *fnname;
10121
10122   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
10123      floating-point arguments.  */
10124   if (TARGET_MIPS16
10125       && TARGET_HARD_FLOAT_ABI
10126       && crtl->args.info.fp_code != 0)
10127     mips16_build_function_stub ();
10128
10129   /* Get the function name the same way that toplev.c does before calling
10130      assemble_start_function.  This is needed so that the name used here
10131      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
10132   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10133   mips_start_function_definition (fnname, TARGET_MIPS16);
10134
10135   /* Output MIPS-specific frame information.  */
10136   if (!flag_inhibit_size_directive)
10137     {
10138       const struct mips_frame_info *frame;
10139
10140       frame = &cfun->machine->frame;
10141
10142       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
10143       fprintf (file,
10144                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
10145                "# vars= " HOST_WIDE_INT_PRINT_DEC
10146                ", regs= %d/%d"
10147                ", args= " HOST_WIDE_INT_PRINT_DEC
10148                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
10149                reg_names[frame_pointer_needed
10150                          ? HARD_FRAME_POINTER_REGNUM
10151                          : STACK_POINTER_REGNUM],
10152                (frame_pointer_needed
10153                 ? frame->total_size - frame->hard_frame_pointer_offset
10154                 : frame->total_size),
10155                reg_names[RETURN_ADDR_REGNUM],
10156                frame->var_size,
10157                frame->num_gp, frame->num_fp,
10158                frame->args_size,
10159                frame->cprestore_size);
10160
10161       /* .mask MASK, OFFSET.  */
10162       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10163                frame->mask, frame->gp_save_offset);
10164
10165       /* .fmask MASK, OFFSET.  */
10166       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10167                frame->fmask, frame->fp_save_offset);
10168     }
10169
10170   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
10171      Also emit the ".set noreorder; .set nomacro" sequence for functions
10172      that need it.  */
10173   if (mips_must_initialize_gp_p ()
10174       && mips_current_loadgp_style () == LOADGP_OLDABI)
10175     {
10176       if (TARGET_MIPS16)
10177         {
10178           /* This is a fixed-form sequence.  The position of the
10179              first two instructions is important because of the
10180              way _gp_disp is defined.  */
10181           output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
10182           output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
10183           output_asm_insn ("sll\t$2,16", 0);
10184           output_asm_insn ("addu\t$2,$3", 0);
10185         }
10186       else
10187         {
10188           /* .cpload must be in a .set noreorder but not a
10189              .set nomacro block.  */
10190           mips_push_asm_switch (&mips_noreorder);
10191           output_asm_insn (".cpload\t%^", 0);
10192           if (!cfun->machine->all_noreorder_p)
10193             mips_pop_asm_switch (&mips_noreorder);
10194           else
10195             mips_push_asm_switch (&mips_nomacro);
10196         }
10197     }
10198   else if (cfun->machine->all_noreorder_p)
10199     {
10200       mips_push_asm_switch (&mips_noreorder);
10201       mips_push_asm_switch (&mips_nomacro);
10202     }
10203
10204   /* Tell the assembler which register we're using as the global
10205      pointer.  This is needed for thunks, since they can use either
10206      explicit relocs or assembler macros.  */
10207   mips_output_cplocal ();
10208 }
10209
10210 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
10211
10212 static void
10213 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
10214                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10215 {
10216   const char *fnname;
10217
10218   /* Reinstate the normal $gp.  */
10219   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
10220   mips_output_cplocal ();
10221
10222   if (cfun->machine->all_noreorder_p)
10223     {
10224       mips_pop_asm_switch (&mips_nomacro);
10225       mips_pop_asm_switch (&mips_noreorder);
10226     }
10227
10228   /* Get the function name the same way that toplev.c does before calling
10229      assemble_start_function.  This is needed so that the name used here
10230      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
10231   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10232   mips_end_function_definition (fnname);
10233 }
10234 \f
10235 /* Emit an optimisation barrier for accesses to the current frame.  */
10236
10237 static void
10238 mips_frame_barrier (void)
10239 {
10240   emit_clobber (gen_frame_mem (BLKmode, stack_pointer_rtx));
10241 }
10242
10243 /* Save register REG to MEM.  Make the instruction frame-related.  */
10244
10245 static void
10246 mips_save_reg (rtx reg, rtx mem)
10247 {
10248   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
10249     {
10250       rtx x1, x2;
10251
10252       if (mips_split_64bit_move_p (mem, reg))
10253         mips_split_doubleword_move (mem, reg);
10254       else
10255         mips_emit_move (mem, reg);
10256
10257       x1 = mips_frame_set (mips_subword (mem, false),
10258                            mips_subword (reg, false));
10259       x2 = mips_frame_set (mips_subword (mem, true),
10260                            mips_subword (reg, true));
10261       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10262     }
10263   else
10264     mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10265 }
10266
10267 /* The __gnu_local_gp symbol.  */
10268
10269 static GTY(()) rtx mips_gnu_local_gp;
10270
10271 /* If we're generating n32 or n64 abicalls, emit instructions
10272    to set up the global pointer.  */
10273
10274 static void
10275 mips_emit_loadgp (void)
10276 {
10277   rtx addr, offset, incoming_address, base, index, pic_reg;
10278
10279   pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10280   switch (mips_current_loadgp_style ())
10281     {
10282     case LOADGP_ABSOLUTE:
10283       if (mips_gnu_local_gp == NULL)
10284         {
10285           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
10286           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
10287         }
10288       emit_insn (PMODE_INSN (gen_loadgp_absolute,
10289                              (pic_reg, mips_gnu_local_gp)));
10290       break;
10291
10292     case LOADGP_OLDABI:
10293       /* Added by mips_output_function_prologue.  */
10294       break;
10295
10296     case LOADGP_NEWABI:
10297       addr = XEXP (DECL_RTL (current_function_decl), 0);
10298       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
10299       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
10300       emit_insn (PMODE_INSN (gen_loadgp_newabi,
10301                              (pic_reg, offset, incoming_address)));
10302       break;
10303
10304     case LOADGP_RTP:
10305       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
10306       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
10307       emit_insn (PMODE_INSN (gen_loadgp_rtp, (pic_reg, base, index)));
10308       break;
10309
10310     default:
10311       return;
10312     }
10313
10314   if (TARGET_MIPS16)
10315     emit_insn (PMODE_INSN (gen_copygp_mips16,
10316                            (pic_offset_table_rtx, pic_reg)));
10317
10318   /* Emit a blockage if there are implicit uses of the GP register.
10319      This includes profiled functions, because FUNCTION_PROFILE uses
10320      a jal macro.  */
10321   if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
10322     emit_insn (gen_loadgp_blockage ());
10323 }
10324
10325 /* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
10326
10327 static int
10328 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
10329 {
10330   return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
10331 }
10332
10333 /* Expand the "prologue" pattern.  */
10334
10335 void
10336 mips_expand_prologue (void)
10337 {
10338   const struct mips_frame_info *frame;
10339   HOST_WIDE_INT size;
10340   unsigned int nargs;
10341   rtx insn;
10342
10343   if (cfun->machine->global_pointer != INVALID_REGNUM)
10344     {
10345       /* Check whether an insn uses pic_offset_table_rtx, either explicitly
10346          or implicitly.  If so, we can commit to using a global pointer
10347          straight away, otherwise we need to defer the decision.  */
10348       if (mips_cfun_has_inflexible_gp_ref_p ()
10349           || mips_cfun_has_flexible_gp_ref_p ())
10350         {
10351           cfun->machine->must_initialize_gp_p = true;
10352           cfun->machine->must_restore_gp_when_clobbered_p = true;
10353         }
10354
10355       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
10356     }
10357
10358   frame = &cfun->machine->frame;
10359   size = frame->total_size;
10360
10361   if (flag_stack_usage_info)
10362     current_function_static_stack_size = size;
10363
10364   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
10365      bytes beforehand; this is enough to cover the register save area
10366      without going out of range.  */
10367   if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
10368       || frame->num_cop0_regs > 0)
10369     {
10370       HOST_WIDE_INT step1;
10371
10372       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
10373       if (GENERATE_MIPS16E_SAVE_RESTORE)
10374         {
10375           HOST_WIDE_INT offset;
10376           unsigned int mask, regno;
10377
10378           /* Try to merge argument stores into the save instruction.  */
10379           nargs = mips16e_collect_argument_saves ();
10380
10381           /* Build the save instruction.  */
10382           mask = frame->mask;
10383           insn = mips16e_build_save_restore (false, &mask, &offset,
10384                                              nargs, step1);
10385           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10386           mips_frame_barrier ();
10387           size -= step1;
10388
10389           /* Check if we need to save other registers.  */
10390           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10391             if (BITSET_P (mask, regno - GP_REG_FIRST))
10392               {
10393                 offset -= UNITS_PER_WORD;
10394                 mips_save_restore_reg (word_mode, regno,
10395                                        offset, mips_save_reg);
10396               }
10397         }
10398       else
10399         {
10400           if (cfun->machine->interrupt_handler_p)
10401             {
10402               HOST_WIDE_INT offset;
10403               rtx mem;
10404
10405               /* If this interrupt is using a shadow register set, we need to
10406                  get the stack pointer from the previous register set.  */
10407               if (cfun->machine->use_shadow_register_set_p)
10408                 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
10409                                             stack_pointer_rtx));
10410
10411               if (!cfun->machine->keep_interrupts_masked_p)
10412                 {
10413                   /* Move from COP0 Cause to K0.  */
10414                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
10415                                             gen_rtx_REG (SImode,
10416                                                          COP0_CAUSE_REG_NUM)));
10417                   /* Move from COP0 EPC to K1.  */
10418                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10419                                             gen_rtx_REG (SImode,
10420                                                          COP0_EPC_REG_NUM)));
10421                 }
10422
10423               /* Allocate the first part of the frame.  */
10424               insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
10425                                     GEN_INT (-step1));
10426               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10427               mips_frame_barrier ();
10428               size -= step1;
10429
10430               /* Start at the uppermost location for saving.  */
10431               offset = frame->cop0_sp_offset - size;
10432               if (!cfun->machine->keep_interrupts_masked_p)
10433                 {
10434                   /* Push EPC into its stack slot.  */
10435                   mem = gen_frame_mem (word_mode,
10436                                        plus_constant (stack_pointer_rtx,
10437                                                       offset));
10438                   mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10439                   offset -= UNITS_PER_WORD;
10440                 }
10441
10442               /* Move from COP0 Status to K1.  */
10443               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10444                                         gen_rtx_REG (SImode,
10445                                                      COP0_STATUS_REG_NUM)));
10446
10447               /* Right justify the RIPL in k0.  */
10448               if (!cfun->machine->keep_interrupts_masked_p)
10449                 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
10450                                         gen_rtx_REG (SImode, K0_REG_NUM),
10451                                         GEN_INT (CAUSE_IPL)));
10452
10453               /* Push Status into its stack slot.  */
10454               mem = gen_frame_mem (word_mode,
10455                                    plus_constant (stack_pointer_rtx, offset));
10456               mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10457               offset -= UNITS_PER_WORD;
10458
10459               /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
10460               if (!cfun->machine->keep_interrupts_masked_p)
10461                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10462                                        GEN_INT (6),
10463                                        GEN_INT (SR_IPL),
10464                                        gen_rtx_REG (SImode, K0_REG_NUM)));
10465
10466               if (!cfun->machine->keep_interrupts_masked_p)
10467                 /* Enable interrupts by clearing the KSU ERL and EXL bits.
10468                    IE is already the correct value, so we don't have to do
10469                    anything explicit.  */
10470                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10471                                        GEN_INT (4),
10472                                        GEN_INT (SR_EXL),
10473                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10474               else
10475                 /* Disable interrupts by clearing the KSU, ERL, EXL,
10476                    and IE bits.  */
10477                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10478                                        GEN_INT (5),
10479                                        GEN_INT (SR_IE),
10480                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10481             }
10482           else
10483             {
10484               insn = gen_add3_insn (stack_pointer_rtx,
10485                                     stack_pointer_rtx,
10486                                     GEN_INT (-step1));
10487               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10488               mips_frame_barrier ();
10489               size -= step1;
10490             }
10491           mips_for_each_saved_acc (size, mips_save_reg);
10492           mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
10493         }
10494     }
10495
10496   /* Allocate the rest of the frame.  */
10497   if (size > 0)
10498     {
10499       if (SMALL_OPERAND (-size))
10500         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
10501                                                        stack_pointer_rtx,
10502                                                        GEN_INT (-size)))) = 1;
10503       else
10504         {
10505           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
10506           if (TARGET_MIPS16)
10507             {
10508               /* There are no instructions to add or subtract registers
10509                  from the stack pointer, so use the frame pointer as a
10510                  temporary.  We should always be using a frame pointer
10511                  in this case anyway.  */
10512               gcc_assert (frame_pointer_needed);
10513               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10514               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
10515                                         hard_frame_pointer_rtx,
10516                                         MIPS_PROLOGUE_TEMP (Pmode)));
10517               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
10518             }
10519           else
10520             emit_insn (gen_sub3_insn (stack_pointer_rtx,
10521                                       stack_pointer_rtx,
10522                                       MIPS_PROLOGUE_TEMP (Pmode)));
10523
10524           /* Describe the combined effect of the previous instructions.  */
10525           mips_set_frame_expr
10526             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10527                           plus_constant (stack_pointer_rtx, -size)));
10528         }
10529       mips_frame_barrier ();
10530     }
10531
10532   /* Set up the frame pointer, if we're using one.  */
10533   if (frame_pointer_needed)
10534     {
10535       HOST_WIDE_INT offset;
10536
10537       offset = frame->hard_frame_pointer_offset;
10538       if (offset == 0)
10539         {
10540           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10541           RTX_FRAME_RELATED_P (insn) = 1;
10542         }
10543       else if (SMALL_OPERAND (offset))
10544         {
10545           insn = gen_add3_insn (hard_frame_pointer_rtx,
10546                                 stack_pointer_rtx, GEN_INT (offset));
10547           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10548         }
10549       else
10550         {
10551           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
10552           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10553           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
10554                                     hard_frame_pointer_rtx,
10555                                     MIPS_PROLOGUE_TEMP (Pmode)));
10556           mips_set_frame_expr
10557             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10558                           plus_constant (stack_pointer_rtx, offset)));
10559         }
10560     }
10561
10562   mips_emit_loadgp ();
10563
10564   /* Initialize the $gp save slot.  */
10565   if (mips_cfun_has_cprestore_slot_p ())
10566     {
10567       rtx base, mem, gp, temp;
10568       HOST_WIDE_INT offset;
10569
10570       mips_get_cprestore_base_and_offset (&base, &offset, false);
10571       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10572       gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10573       temp = (SMALL_OPERAND (offset)
10574               ? gen_rtx_SCRATCH (Pmode)
10575               : MIPS_PROLOGUE_TEMP (Pmode));
10576       emit_insn (PMODE_INSN (gen_potential_cprestore,
10577                              (mem, GEN_INT (offset), gp, temp)));
10578
10579       mips_get_cprestore_base_and_offset (&base, &offset, true);
10580       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10581       emit_insn (PMODE_INSN (gen_use_cprestore, (mem)));
10582     }
10583
10584   /* We need to search back to the last use of K0 or K1.  */
10585   if (cfun->machine->interrupt_handler_p)
10586     {
10587       for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
10588         if (INSN_P (insn)
10589             && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
10590           break;
10591       /* Emit a move from K1 to COP0 Status after insn.  */
10592       gcc_assert (insn != NULL_RTX);
10593       emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10594                                       gen_rtx_REG (SImode, K1_REG_NUM)),
10595                        insn);
10596     }
10597
10598   /* If we are profiling, make sure no instructions are scheduled before
10599      the call to mcount.  */
10600   if (crtl->profile)
10601     emit_insn (gen_blockage ());
10602 }
10603 \f
10604 /* Attach all pending register saves to the previous instruction.
10605    Return that instruction.  */
10606
10607 static rtx
10608 mips_epilogue_emit_cfa_restores (void)
10609 {
10610   rtx insn;
10611
10612   insn = get_last_insn ();
10613   gcc_assert (insn && !REG_NOTES (insn));
10614   if (mips_epilogue.cfa_restores)
10615     {
10616       RTX_FRAME_RELATED_P (insn) = 1;
10617       REG_NOTES (insn) = mips_epilogue.cfa_restores;
10618       mips_epilogue.cfa_restores = 0;
10619     }
10620   return insn;
10621 }
10622
10623 /* Like mips_epilogue_emit_cfa_restores, but also record that the CFA is
10624    now at REG + OFFSET.  */
10625
10626 static void
10627 mips_epilogue_set_cfa (rtx reg, HOST_WIDE_INT offset)
10628 {
10629   rtx insn;
10630
10631   insn = mips_epilogue_emit_cfa_restores ();
10632   if (reg != mips_epilogue.cfa_reg || offset != mips_epilogue.cfa_offset)
10633     {
10634       RTX_FRAME_RELATED_P (insn) = 1;
10635       REG_NOTES (insn) = alloc_reg_note (REG_CFA_DEF_CFA,
10636                                          plus_constant (reg, offset),
10637                                          REG_NOTES (insn));
10638       mips_epilogue.cfa_reg = reg;
10639       mips_epilogue.cfa_offset = offset;
10640     }
10641 }
10642
10643 /* Emit instructions to restore register REG from slot MEM.  Also update
10644    the cfa_restores list.  */
10645
10646 static void
10647 mips_restore_reg (rtx reg, rtx mem)
10648 {
10649   /* There's no MIPS16 instruction to load $31 directly.  Load into
10650      $7 instead and adjust the return insn appropriately.  */
10651   if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
10652     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
10653   else if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
10654     {
10655       mips_add_cfa_restore (mips_subword (reg, true));
10656       mips_add_cfa_restore (mips_subword (reg, false));
10657     }
10658   else
10659     mips_add_cfa_restore (reg);
10660
10661   mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
10662   if (REGNO (reg) == REGNO (mips_epilogue.cfa_reg))
10663     /* The CFA is currently defined in terms of the register whose
10664        value we have just restored.  Redefine the CFA in terms of
10665        the stack pointer.  */
10666     mips_epilogue_set_cfa (stack_pointer_rtx,
10667                            mips_epilogue.cfa_restore_sp_offset);
10668 }
10669
10670 /* Emit code to set the stack pointer to BASE + OFFSET, given that
10671    BASE + OFFSET is NEW_FRAME_SIZE bytes below the top of the frame.
10672    BASE, if not the stack pointer, is available as a temporary.  */
10673
10674 static void
10675 mips_deallocate_stack (rtx base, rtx offset, HOST_WIDE_INT new_frame_size)
10676 {
10677   if (base == stack_pointer_rtx && offset == const0_rtx)
10678     return;
10679
10680   mips_frame_barrier ();
10681   if (offset == const0_rtx)
10682     {
10683       emit_move_insn (stack_pointer_rtx, base);
10684       mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
10685     }
10686   else if (TARGET_MIPS16 && base != stack_pointer_rtx)
10687     {
10688       emit_insn (gen_add3_insn (base, base, offset));
10689       mips_epilogue_set_cfa (base, new_frame_size);
10690       emit_move_insn (stack_pointer_rtx, base);
10691     }
10692   else
10693     {
10694       emit_insn (gen_add3_insn (stack_pointer_rtx, base, offset));
10695       mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
10696     }
10697 }
10698
10699 /* Emit any instructions needed before a return.  */
10700
10701 void
10702 mips_expand_before_return (void)
10703 {
10704   /* When using a call-clobbered gp, we start out with unified call
10705      insns that include instructions to restore the gp.  We then split
10706      these unified calls after reload.  These split calls explicitly
10707      clobber gp, so there is no need to define
10708      PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
10709
10710      For consistency, we should also insert an explicit clobber of $28
10711      before return insns, so that the post-reload optimizers know that
10712      the register is not live on exit.  */
10713   if (TARGET_CALL_CLOBBERED_GP)
10714     emit_clobber (pic_offset_table_rtx);
10715 }
10716
10717 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
10718    says which.  */
10719
10720 void
10721 mips_expand_epilogue (bool sibcall_p)
10722 {
10723   const struct mips_frame_info *frame;
10724   HOST_WIDE_INT step1, step2;
10725   rtx base, adjust, insn;
10726
10727   if (!sibcall_p && mips_can_use_return_insn ())
10728     {
10729       emit_jump_insn (gen_return ());
10730       return;
10731     }
10732
10733   /* In MIPS16 mode, if the return value should go into a floating-point
10734      register, we need to call a helper routine to copy it over.  */
10735   if (mips16_cfun_returns_in_fpr_p ())
10736     mips16_copy_fpr_return_value ();
10737
10738   /* Split the frame into two.  STEP1 is the amount of stack we should
10739      deallocate before restoring the registers.  STEP2 is the amount we
10740      should deallocate afterwards.
10741
10742      Start off by assuming that no registers need to be restored.  */
10743   frame = &cfun->machine->frame;
10744   step1 = frame->total_size;
10745   step2 = 0;
10746
10747   /* Work out which register holds the frame address.  */
10748   if (!frame_pointer_needed)
10749     base = stack_pointer_rtx;
10750   else
10751     {
10752       base = hard_frame_pointer_rtx;
10753       step1 -= frame->hard_frame_pointer_offset;
10754     }
10755   mips_epilogue.cfa_reg = base;
10756   mips_epilogue.cfa_offset = step1;
10757   mips_epilogue.cfa_restores = NULL_RTX;
10758
10759   /* If we need to restore registers, deallocate as much stack as
10760      possible in the second step without going out of range.  */
10761   if ((frame->mask | frame->fmask | frame->acc_mask) != 0
10762       || frame->num_cop0_regs > 0)
10763     {
10764       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
10765       step1 -= step2;
10766     }
10767
10768   /* Get an rtx for STEP1 that we can add to BASE.  */
10769   adjust = GEN_INT (step1);
10770   if (!SMALL_OPERAND (step1))
10771     {
10772       mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
10773       adjust = MIPS_EPILOGUE_TEMP (Pmode);
10774     }
10775   mips_deallocate_stack (base, adjust, step2);
10776
10777   /* If we're using addressing macros, $gp is implicitly used by all
10778      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
10779      from the stack.  */
10780   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
10781     emit_insn (gen_blockage ());
10782
10783   mips_epilogue.cfa_restore_sp_offset = step2;
10784   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
10785     {
10786       unsigned int regno, mask;
10787       HOST_WIDE_INT offset;
10788       rtx restore;
10789
10790       /* Generate the restore instruction.  */
10791       mask = frame->mask;
10792       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
10793
10794       /* Restore any other registers manually.  */
10795       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10796         if (BITSET_P (mask, regno - GP_REG_FIRST))
10797           {
10798             offset -= UNITS_PER_WORD;
10799             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
10800           }
10801
10802       /* Restore the remaining registers and deallocate the final bit
10803          of the frame.  */
10804       mips_frame_barrier ();
10805       emit_insn (restore);
10806       mips_epilogue_set_cfa (stack_pointer_rtx, 0);
10807     }
10808   else
10809     {
10810       /* Restore the registers.  */
10811       mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
10812       mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
10813                                        mips_restore_reg);
10814
10815       if (cfun->machine->interrupt_handler_p)
10816         {
10817           HOST_WIDE_INT offset;
10818           rtx mem;
10819
10820           offset = frame->cop0_sp_offset - (frame->total_size - step2);
10821           if (!cfun->machine->keep_interrupts_masked_p)
10822             {
10823               /* Restore the original EPC.  */
10824               mem = gen_frame_mem (word_mode,
10825                                    plus_constant (stack_pointer_rtx, offset));
10826               mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10827               offset -= UNITS_PER_WORD;
10828
10829               /* Move to COP0 EPC.  */
10830               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
10831                                         gen_rtx_REG (SImode, K0_REG_NUM)));
10832             }
10833
10834           /* Restore the original Status.  */
10835           mem = gen_frame_mem (word_mode,
10836                                plus_constant (stack_pointer_rtx, offset));
10837           mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10838           offset -= UNITS_PER_WORD;
10839
10840           /* If we don't use shoadow register set, we need to update SP.  */
10841           if (!cfun->machine->use_shadow_register_set_p)
10842             mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
10843           else
10844             /* The choice of position is somewhat arbitrary in this case.  */
10845             mips_epilogue_emit_cfa_restores ();
10846
10847           /* Move to COP0 Status.  */
10848           emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10849                                     gen_rtx_REG (SImode, K0_REG_NUM)));
10850         }
10851       else
10852         /* Deallocate the final bit of the frame.  */
10853         mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
10854     }
10855   gcc_assert (!mips_epilogue.cfa_restores);
10856
10857   /* Add in the __builtin_eh_return stack adjustment.  We need to
10858      use a temporary in MIPS16 code.  */
10859   if (crtl->calls_eh_return)
10860     {
10861       if (TARGET_MIPS16)
10862         {
10863           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
10864           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
10865                                     MIPS_EPILOGUE_TEMP (Pmode),
10866                                     EH_RETURN_STACKADJ_RTX));
10867           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
10868         }
10869       else
10870         emit_insn (gen_add3_insn (stack_pointer_rtx,
10871                                   stack_pointer_rtx,
10872                                   EH_RETURN_STACKADJ_RTX));
10873     }
10874
10875   if (!sibcall_p)
10876     {
10877       mips_expand_before_return ();
10878       if (cfun->machine->interrupt_handler_p)
10879         {
10880           /* Interrupt handlers generate eret or deret.  */
10881           if (cfun->machine->use_debug_exception_return_p)
10882             emit_jump_insn (gen_mips_deret ());
10883           else
10884             emit_jump_insn (gen_mips_eret ());
10885         }
10886       else
10887         {
10888           rtx pat;
10889
10890           /* When generating MIPS16 code, the normal
10891              mips_for_each_saved_gpr_and_fpr path will restore the return
10892              address into $7 rather than $31.  */
10893           if (TARGET_MIPS16
10894               && !GENERATE_MIPS16E_SAVE_RESTORE
10895               && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
10896             {
10897               /* simple_returns cannot rely on values that are only available
10898                  on paths through the epilogue (because return paths that do
10899                  not pass through the epilogue may nevertheless reuse a
10900                  simple_return that occurs at the end of the epilogue).
10901                  Use a normal return here instead.  */
10902               rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
10903               pat = gen_return_internal (reg);
10904             }
10905           else
10906             {
10907               rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
10908               pat = gen_simple_return_internal (reg);
10909             }
10910           emit_jump_insn (pat);
10911         }
10912     }
10913
10914   /* Search from the beginning to the first use of K0 or K1.  */
10915   if (cfun->machine->interrupt_handler_p
10916       && !cfun->machine->keep_interrupts_masked_p)
10917     {
10918       for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
10919         if (INSN_P (insn)
10920             && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
10921           break;
10922       gcc_assert (insn != NULL_RTX);
10923       /* Insert disable interrupts before the first use of K0 or K1.  */
10924       emit_insn_before (gen_mips_di (), insn);
10925       emit_insn_before (gen_mips_ehb (), insn);
10926     }
10927 }
10928 \f
10929 /* Return nonzero if this function is known to have a null epilogue.
10930    This allows the optimizer to omit jumps to jumps if no stack
10931    was created.  */
10932
10933 bool
10934 mips_can_use_return_insn (void)
10935 {
10936   /* Interrupt handlers need to go through the epilogue.  */
10937   if (cfun->machine->interrupt_handler_p)
10938     return false;
10939
10940   if (!reload_completed)
10941     return false;
10942
10943   if (crtl->profile)
10944     return false;
10945
10946   /* In MIPS16 mode, a function that returns a floating-point value
10947      needs to arrange to copy the return value into the floating-point
10948      registers.  */
10949   if (mips16_cfun_returns_in_fpr_p ())
10950     return false;
10951
10952   return cfun->machine->frame.total_size == 0;
10953 }
10954 \f
10955 /* Return true if register REGNO can store a value of mode MODE.
10956    The result of this function is cached in mips_hard_regno_mode_ok.  */
10957
10958 static bool
10959 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
10960 {
10961   unsigned int size;
10962   enum mode_class mclass;
10963
10964   if (mode == CCV2mode)
10965     return (ISA_HAS_8CC
10966             && ST_REG_P (regno)
10967             && (regno - ST_REG_FIRST) % 2 == 0);
10968
10969   if (mode == CCV4mode)
10970     return (ISA_HAS_8CC
10971             && ST_REG_P (regno)
10972             && (regno - ST_REG_FIRST) % 4 == 0);
10973
10974   if (mode == CCmode)
10975     {
10976       if (!ISA_HAS_8CC)
10977         return regno == FPSW_REGNUM;
10978
10979       return (ST_REG_P (regno)
10980               || GP_REG_P (regno)
10981               || FP_REG_P (regno));
10982     }
10983
10984   size = GET_MODE_SIZE (mode);
10985   mclass = GET_MODE_CLASS (mode);
10986
10987   if (GP_REG_P (regno))
10988     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
10989
10990   if (FP_REG_P (regno)
10991       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
10992           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
10993     {
10994       /* Allow TFmode for CCmode reloads.  */
10995       if (mode == TFmode && ISA_HAS_8CC)
10996         return true;
10997
10998       /* Allow 64-bit vector modes for Loongson-2E/2F.  */
10999       if (TARGET_LOONGSON_VECTORS
11000           && (mode == V2SImode
11001               || mode == V4HImode
11002               || mode == V8QImode
11003               || mode == DImode))
11004         return true;
11005
11006       if (mclass == MODE_FLOAT
11007           || mclass == MODE_COMPLEX_FLOAT
11008           || mclass == MODE_VECTOR_FLOAT)
11009         return size <= UNITS_PER_FPVALUE;
11010
11011       /* Allow integer modes that fit into a single register.  We need
11012          to put integers into FPRs when using instructions like CVT
11013          and TRUNC.  There's no point allowing sizes smaller than a word,
11014          because the FPU has no appropriate load/store instructions.  */
11015       if (mclass == MODE_INT)
11016         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
11017     }
11018
11019   if (ACC_REG_P (regno)
11020       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
11021     {
11022       if (MD_REG_P (regno))
11023         {
11024           /* After a multiplication or division, clobbering HI makes
11025              the value of LO unpredictable, and vice versa.  This means
11026              that, for all interesting cases, HI and LO are effectively
11027              a single register.
11028
11029              We model this by requiring that any value that uses HI
11030              also uses LO.  */
11031           if (size <= UNITS_PER_WORD * 2)
11032             return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
11033         }
11034       else
11035         {
11036           /* DSP accumulators do not have the same restrictions as
11037              HI and LO, so we can treat them as normal doubleword
11038              registers.  */
11039           if (size <= UNITS_PER_WORD)
11040             return true;
11041
11042           if (size <= UNITS_PER_WORD * 2
11043               && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
11044             return true;
11045         }
11046     }
11047
11048   if (ALL_COP_REG_P (regno))
11049     return mclass == MODE_INT && size <= UNITS_PER_WORD;
11050
11051   if (regno == GOT_VERSION_REGNUM)
11052     return mode == SImode;
11053
11054   return false;
11055 }
11056
11057 /* Implement HARD_REGNO_NREGS.  */
11058
11059 unsigned int
11060 mips_hard_regno_nregs (int regno, enum machine_mode mode)
11061 {
11062   if (ST_REG_P (regno))
11063     /* The size of FP status registers is always 4, because they only hold
11064        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
11065     return (GET_MODE_SIZE (mode) + 3) / 4;
11066
11067   if (FP_REG_P (regno))
11068     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
11069
11070   /* All other registers are word-sized.  */
11071   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
11072 }
11073
11074 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
11075    in mips_hard_regno_nregs.  */
11076
11077 int
11078 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
11079 {
11080   int size;
11081   HARD_REG_SET left;
11082
11083   size = 0x8000;
11084   COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
11085   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
11086     {
11087       if (HARD_REGNO_MODE_OK (ST_REG_FIRST, mode))
11088         size = MIN (size, 4);
11089       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
11090     }
11091   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
11092     {
11093       if (HARD_REGNO_MODE_OK (FP_REG_FIRST, mode))
11094         size = MIN (size, UNITS_PER_FPREG);
11095       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
11096     }
11097   if (!hard_reg_set_empty_p (left))
11098     size = MIN (size, UNITS_PER_WORD);
11099   return (GET_MODE_SIZE (mode) + size - 1) / size;
11100 }
11101
11102 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
11103
11104 bool
11105 mips_cannot_change_mode_class (enum machine_mode from,
11106                                enum machine_mode to,
11107                                enum reg_class rclass)
11108 {
11109   /* Allow conversions between different Loongson integer vectors,
11110      and between those vectors and DImode.  */
11111   if (GET_MODE_SIZE (from) == 8 && GET_MODE_SIZE (to) == 8
11112       && INTEGRAL_MODE_P (from) && INTEGRAL_MODE_P (to))
11113     return false;
11114
11115   /* Otherwise, there are several problems with changing the modes of
11116      values in floating-point registers:
11117
11118      - When a multi-word value is stored in paired floating-point
11119        registers, the first register always holds the low word.  We
11120        therefore can't allow FPRs to change between single-word and
11121        multi-word modes on big-endian targets.
11122
11123      - GCC assumes that each word of a multiword register can be
11124        accessed individually using SUBREGs.  This is not true for
11125        floating-point registers if they are bigger than a word.
11126
11127      - Loading a 32-bit value into a 64-bit floating-point register
11128        will not sign-extend the value, despite what LOAD_EXTEND_OP
11129        says.  We can't allow FPRs to change from SImode to a wider
11130        mode on 64-bit targets.
11131
11132      - If the FPU has already interpreted a value in one format, we
11133        must not ask it to treat the value as having a different
11134        format.
11135
11136      We therefore disallow all mode changes involving FPRs.  */
11137
11138   return reg_classes_intersect_p (FP_REGS, rclass);
11139 }
11140
11141 /* Implement target hook small_register_classes_for_mode_p.  */
11142
11143 static bool
11144 mips_small_register_classes_for_mode_p (enum machine_mode mode
11145                                         ATTRIBUTE_UNUSED)
11146 {
11147   return TARGET_MIPS16;
11148 }
11149
11150 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
11151
11152 static bool
11153 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
11154 {
11155   switch (mode)
11156     {
11157     case SFmode:
11158       return TARGET_HARD_FLOAT;
11159
11160     case DFmode:
11161       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
11162
11163     case V2SFmode:
11164       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
11165
11166     default:
11167       return false;
11168     }
11169 }
11170
11171 /* Implement MODES_TIEABLE_P.  */
11172
11173 bool
11174 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
11175 {
11176   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
11177      prefer to put one of them in FPRs.  */
11178   return (mode1 == mode2
11179           || (!mips_mode_ok_for_mov_fmt_p (mode1)
11180               && !mips_mode_ok_for_mov_fmt_p (mode2)));
11181 }
11182
11183 /* Implement TARGET_PREFERRED_RELOAD_CLASS.  */
11184
11185 static reg_class_t
11186 mips_preferred_reload_class (rtx x, reg_class_t rclass)
11187 {
11188   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
11189     return LEA_REGS;
11190
11191   if (reg_class_subset_p (FP_REGS, rclass)
11192       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
11193     return FP_REGS;
11194
11195   if (reg_class_subset_p (GR_REGS, rclass))
11196     rclass = GR_REGS;
11197
11198   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
11199     rclass = M16_REGS;
11200
11201   return rclass;
11202 }
11203
11204 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
11205    Return a "canonical" class to represent it in later calculations.  */
11206
11207 static reg_class_t
11208 mips_canonicalize_move_class (reg_class_t rclass)
11209 {
11210   /* All moves involving accumulator registers have the same cost.  */
11211   if (reg_class_subset_p (rclass, ACC_REGS))
11212     rclass = ACC_REGS;
11213
11214   /* Likewise promote subclasses of general registers to the most
11215      interesting containing class.  */
11216   if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
11217     rclass = M16_REGS;
11218   else if (reg_class_subset_p (rclass, GENERAL_REGS))
11219     rclass = GENERAL_REGS;
11220
11221   return rclass;
11222 }
11223
11224 /* Return the cost of moving a value of mode MODE from a register of
11225    class FROM to a GPR.  Return 0 for classes that are unions of other
11226    classes handled by this function.  */
11227
11228 static int
11229 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
11230                        reg_class_t from)
11231 {
11232   switch (from)
11233     {
11234     case GENERAL_REGS:
11235       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
11236       return 2;
11237
11238     case ACC_REGS:
11239       /* MFLO and MFHI.  */
11240       return 6;
11241
11242     case FP_REGS:
11243       /* MFC1, etc.  */
11244       return 4;
11245
11246     case ST_REGS:
11247       /* LUI followed by MOVF.  */
11248       return 4;
11249
11250     case COP0_REGS:
11251     case COP2_REGS:
11252     case COP3_REGS:
11253       /* This choice of value is historical.  */
11254       return 5;
11255
11256     default:
11257       return 0;
11258     }
11259 }
11260
11261 /* Return the cost of moving a value of mode MODE from a GPR to a
11262    register of class TO.  Return 0 for classes that are unions of
11263    other classes handled by this function.  */
11264
11265 static int
11266 mips_move_from_gpr_cost (enum machine_mode mode, reg_class_t to)
11267 {
11268   switch (to)
11269     {
11270     case GENERAL_REGS:
11271       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
11272       return 2;
11273
11274     case ACC_REGS:
11275       /* MTLO and MTHI.  */
11276       return 6;
11277
11278     case FP_REGS:
11279       /* MTC1, etc.  */
11280       return 4;
11281
11282     case ST_REGS:
11283       /* A secondary reload through an FPR scratch.  */
11284       return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
11285               + mips_register_move_cost (mode, FP_REGS, ST_REGS));
11286
11287     case COP0_REGS:
11288     case COP2_REGS:
11289     case COP3_REGS:
11290       /* This choice of value is historical.  */
11291       return 5;
11292
11293     default:
11294       return 0;
11295     }
11296 }
11297
11298 /* Implement TARGET_REGISTER_MOVE_COST.  Return 0 for classes that are the
11299    maximum of the move costs for subclasses; regclass will work out
11300    the maximum for us.  */
11301
11302 static int
11303 mips_register_move_cost (enum machine_mode mode,
11304                          reg_class_t from, reg_class_t to)
11305 {
11306   reg_class_t dregs;
11307   int cost1, cost2;
11308
11309   from = mips_canonicalize_move_class (from);
11310   to = mips_canonicalize_move_class (to);
11311
11312   /* Handle moves that can be done without using general-purpose registers.  */
11313   if (from == FP_REGS)
11314     {
11315       if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
11316         /* MOV.FMT.  */
11317         return 4;
11318       if (to == ST_REGS)
11319         /* The sequence generated by mips_expand_fcc_reload.  */
11320         return 8;
11321     }
11322
11323   /* Handle cases in which only one class deviates from the ideal.  */
11324   dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
11325   if (from == dregs)
11326     return mips_move_from_gpr_cost (mode, to);
11327   if (to == dregs)
11328     return mips_move_to_gpr_cost (mode, from);
11329
11330   /* Handles cases that require a GPR temporary.  */
11331   cost1 = mips_move_to_gpr_cost (mode, from);
11332   if (cost1 != 0)
11333     {
11334       cost2 = mips_move_from_gpr_cost (mode, to);
11335       if (cost2 != 0)
11336         return cost1 + cost2;
11337     }
11338
11339   return 0;
11340 }
11341
11342 /* Implement TARGET_MEMORY_MOVE_COST.  */
11343
11344 static int
11345 mips_memory_move_cost (enum machine_mode mode, reg_class_t rclass, bool in)
11346 {
11347   return (mips_cost->memory_latency
11348           + memory_move_secondary_cost (mode, rclass, in));
11349
11350
11351 /* Return the register class required for a secondary register when
11352    copying between one of the registers in RCLASS and value X, which
11353    has mode MODE.  X is the source of the move if IN_P, otherwise it
11354    is the destination.  Return NO_REGS if no secondary register is
11355    needed.  */
11356
11357 enum reg_class
11358 mips_secondary_reload_class (enum reg_class rclass,
11359                              enum machine_mode mode, rtx x, bool in_p)
11360 {
11361   int regno;
11362
11363   /* If X is a constant that cannot be loaded into $25, it must be loaded
11364      into some other GPR.  No other register class allows a direct move.  */
11365   if (mips_dangerous_for_la25_p (x))
11366     return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
11367
11368   regno = true_regnum (x);
11369   if (TARGET_MIPS16)
11370     {
11371       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
11372       if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
11373         return M16_REGS;
11374
11375       return NO_REGS;
11376     }
11377
11378   /* Copying from accumulator registers to anywhere other than a general
11379      register requires a temporary general register.  */
11380   if (reg_class_subset_p (rclass, ACC_REGS))
11381     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
11382   if (ACC_REG_P (regno))
11383     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11384
11385   /* We can only copy a value to a condition code register from a
11386      floating-point register, and even then we require a scratch
11387      floating-point register.  We can only copy a value out of a
11388      condition-code register into a general register.  */
11389   if (reg_class_subset_p (rclass, ST_REGS))
11390     {
11391       if (in_p)
11392         return FP_REGS;
11393       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
11394     }
11395   if (ST_REG_P (regno))
11396     {
11397       if (!in_p)
11398         return FP_REGS;
11399       return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11400     }
11401
11402   if (reg_class_subset_p (rclass, FP_REGS))
11403     {
11404       if (MEM_P (x)
11405           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
11406         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
11407            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
11408         return NO_REGS;
11409
11410       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
11411         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
11412         return NO_REGS;
11413
11414       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (mode, x))
11415         /* We can force the constant to memory and use lwc1
11416            and ldc1.  As above, we will use pairs of lwc1s if
11417            ldc1 is not supported.  */
11418         return NO_REGS;
11419
11420       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
11421         /* In this case we can use mov.fmt.  */
11422         return NO_REGS;
11423
11424       /* Otherwise, we need to reload through an integer register.  */
11425       return GR_REGS;
11426     }
11427   if (FP_REG_P (regno))
11428     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
11429
11430   return NO_REGS;
11431 }
11432
11433 /* Implement TARGET_MODE_REP_EXTENDED.  */
11434
11435 static int
11436 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
11437 {
11438   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
11439   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
11440     return SIGN_EXTEND;
11441
11442   return UNKNOWN;
11443 }
11444 \f
11445 /* Implement TARGET_VALID_POINTER_MODE.  */
11446
11447 static bool
11448 mips_valid_pointer_mode (enum machine_mode mode)
11449 {
11450   return mode == SImode || (TARGET_64BIT && mode == DImode);
11451 }
11452
11453 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
11454
11455 static bool
11456 mips_vector_mode_supported_p (enum machine_mode mode)
11457 {
11458   switch (mode)
11459     {
11460     case V2SFmode:
11461       return TARGET_PAIRED_SINGLE_FLOAT;
11462
11463     case V2HImode:
11464     case V4QImode:
11465     case V2HQmode:
11466     case V2UHQmode:
11467     case V2HAmode:
11468     case V2UHAmode:
11469     case V4QQmode:
11470     case V4UQQmode:
11471       return TARGET_DSP;
11472
11473     case V2SImode:
11474     case V4HImode:
11475     case V8QImode:
11476       return TARGET_LOONGSON_VECTORS;
11477
11478     default:
11479       return false;
11480     }
11481 }
11482
11483 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
11484
11485 static bool
11486 mips_scalar_mode_supported_p (enum machine_mode mode)
11487 {
11488   if (ALL_FIXED_POINT_MODE_P (mode)
11489       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
11490     return true;
11491
11492   return default_scalar_mode_supported_p (mode);
11493 }
11494 \f
11495 /* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE.  */
11496
11497 static enum machine_mode
11498 mips_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED)
11499 {
11500   if (TARGET_PAIRED_SINGLE_FLOAT
11501       && mode == SFmode)
11502     return V2SFmode;
11503   return word_mode;
11504 }
11505
11506 /* Implement TARGET_INIT_LIBFUNCS.  */
11507
11508 static void
11509 mips_init_libfuncs (void)
11510 {
11511   if (TARGET_FIX_VR4120)
11512     {
11513       /* Register the special divsi3 and modsi3 functions needed to work
11514          around VR4120 division errata.  */
11515       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
11516       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
11517     }
11518
11519   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
11520     {
11521       /* Register the MIPS16 -mhard-float stubs.  */
11522       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
11523       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
11524       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
11525       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
11526
11527       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
11528       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
11529       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
11530       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
11531       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
11532       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
11533       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
11534
11535       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
11536       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
11537       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
11538
11539       if (TARGET_DOUBLE_FLOAT)
11540         {
11541           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
11542           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
11543           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
11544           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
11545
11546           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
11547           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
11548           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
11549           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
11550           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
11551           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
11552           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
11553
11554           set_conv_libfunc (sext_optab, DFmode, SFmode,
11555                             "__mips16_extendsfdf2");
11556           set_conv_libfunc (trunc_optab, SFmode, DFmode,
11557                             "__mips16_truncdfsf2");
11558           set_conv_libfunc (sfix_optab, SImode, DFmode,
11559                             "__mips16_fix_truncdfsi");
11560           set_conv_libfunc (sfloat_optab, DFmode, SImode,
11561                             "__mips16_floatsidf");
11562           set_conv_libfunc (ufloat_optab, DFmode, SImode,
11563                             "__mips16_floatunsidf");
11564         }
11565     }
11566
11567   /* The MIPS16 ISA does not have an encoding for "sync", so we rely
11568      on an external non-MIPS16 routine to implement __sync_synchronize.
11569      Similarly for the rest of the ll/sc libfuncs.  */
11570   if (TARGET_MIPS16)
11571     {
11572       synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
11573       init_sync_libfuncs (UNITS_PER_WORD);
11574     }
11575 }
11576
11577 /* Build up a multi-insn sequence that loads label TARGET into $AT.  */
11578
11579 static void
11580 mips_process_load_label (rtx target)
11581 {
11582   rtx base, gp, intop;
11583   HOST_WIDE_INT offset;
11584
11585   mips_multi_start ();
11586   switch (mips_abi)
11587     {
11588     case ABI_N32:
11589       mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
11590       mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
11591       break;
11592
11593     case ABI_64:
11594       mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
11595       mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
11596       break;
11597
11598     default:
11599       gp = pic_offset_table_rtx;
11600       if (mips_cfun_has_cprestore_slot_p ())
11601         {
11602           gp = gen_rtx_REG (Pmode, AT_REGNUM);
11603           mips_get_cprestore_base_and_offset (&base, &offset, true);
11604           if (!SMALL_OPERAND (offset))
11605             {
11606               intop = GEN_INT (CONST_HIGH_PART (offset));
11607               mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
11608               mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
11609
11610               base = gp;
11611               offset = CONST_LOW_PART (offset);
11612             }
11613           intop = GEN_INT (offset);
11614           if (ISA_HAS_LOAD_DELAY)
11615             mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
11616           else
11617             mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
11618         }
11619       if (ISA_HAS_LOAD_DELAY)
11620         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
11621       else
11622         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
11623       mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
11624       break;
11625     }
11626 }
11627
11628 /* Return the number of instructions needed to load a label into $AT.  */
11629
11630 static unsigned int
11631 mips_load_label_num_insns (void)
11632 {
11633   if (cfun->machine->load_label_num_insns == 0)
11634     {
11635       mips_process_load_label (pc_rtx);
11636       cfun->machine->load_label_num_insns = mips_multi_num_insns;
11637     }
11638   return cfun->machine->load_label_num_insns;
11639 }
11640
11641 /* Emit an asm sequence to start a noat block and load the address
11642    of a label into $1.  */
11643
11644 void
11645 mips_output_load_label (rtx target)
11646 {
11647   mips_push_asm_switch (&mips_noat);
11648   if (TARGET_EXPLICIT_RELOCS)
11649     {
11650       mips_process_load_label (target);
11651       mips_multi_write ();
11652     }
11653   else
11654     {
11655       if (Pmode == DImode)
11656         output_asm_insn ("dla\t%@,%0", &target);
11657       else
11658         output_asm_insn ("la\t%@,%0", &target);
11659     }
11660 }
11661
11662 /* Return the length of INSN.  LENGTH is the initial length computed by
11663    attributes in the machine-description file.  */
11664
11665 int
11666 mips_adjust_insn_length (rtx insn, int length)
11667 {
11668   /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
11669      of a PIC long-branch sequence.  Substitute the correct value.  */
11670   if (length == MAX_PIC_BRANCH_LENGTH
11671       && INSN_CODE (insn) >= 0
11672       && get_attr_type (insn) == TYPE_BRANCH)
11673     {
11674       /* Add the branch-over instruction and its delay slot, if this
11675          is a conditional branch.  */
11676       length = simplejump_p (insn) ? 0 : 8;
11677
11678       /* Load the label into $AT and jump to it.  Ignore the delay
11679          slot of the jump.  */
11680       length += 4 * mips_load_label_num_insns() + 4;
11681     }
11682
11683   /* A unconditional jump has an unfilled delay slot if it is not part
11684      of a sequence.  A conditional jump normally has a delay slot, but
11685      does not on MIPS16.  */
11686   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
11687     length += 4;
11688
11689   /* See how many nops might be needed to avoid hardware hazards.  */
11690   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
11691     switch (get_attr_hazard (insn))
11692       {
11693       case HAZARD_NONE:
11694         break;
11695
11696       case HAZARD_DELAY:
11697         length += 4;
11698         break;
11699
11700       case HAZARD_HILO:
11701         length += 8;
11702         break;
11703       }
11704
11705   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
11706      the .md file length attributes are 4-based for both modes.
11707      Adjust the MIPS16 ones here.  */
11708   if (TARGET_MIPS16)
11709     length /= 2;
11710
11711   return length;
11712 }
11713
11714 /* Return the assembly code for INSN, which has the operands given by
11715    OPERANDS, and which branches to OPERANDS[0] if some condition is true.
11716    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
11717    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
11718    version of BRANCH_IF_TRUE.  */
11719
11720 const char *
11721 mips_output_conditional_branch (rtx insn, rtx *operands,
11722                                 const char *branch_if_true,
11723                                 const char *branch_if_false)
11724 {
11725   unsigned int length;
11726   rtx taken, not_taken;
11727
11728   gcc_assert (LABEL_P (operands[0]));
11729
11730   length = get_attr_length (insn);
11731   if (length <= 8)
11732     {
11733       /* Just a simple conditional branch.  */
11734       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
11735       return branch_if_true;
11736     }
11737
11738   /* Generate a reversed branch around a direct jump.  This fallback does
11739      not use branch-likely instructions.  */
11740   mips_branch_likely = false;
11741   not_taken = gen_label_rtx ();
11742   taken = operands[0];
11743
11744   /* Generate the reversed branch to NOT_TAKEN.  */
11745   operands[0] = not_taken;
11746   output_asm_insn (branch_if_false, operands);
11747
11748   /* If INSN has a delay slot, we must provide delay slots for both the
11749      branch to NOT_TAKEN and the conditional jump.  We must also ensure
11750      that INSN's delay slot is executed in the appropriate cases.  */
11751   if (final_sequence)
11752     {
11753       /* This first delay slot will always be executed, so use INSN's
11754          delay slot if is not annulled.  */
11755       if (!INSN_ANNULLED_BRANCH_P (insn))
11756         {
11757           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11758                            asm_out_file, optimize, 1, NULL);
11759           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11760         }
11761       else
11762         output_asm_insn ("nop", 0);
11763       fprintf (asm_out_file, "\n");
11764     }
11765
11766   /* Output the unconditional branch to TAKEN.  */
11767   if (TARGET_ABSOLUTE_JUMPS)
11768     output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
11769   else
11770     {
11771       mips_output_load_label (taken);
11772       output_asm_insn ("jr\t%@%]%/", 0);
11773     }
11774
11775   /* Now deal with its delay slot; see above.  */
11776   if (final_sequence)
11777     {
11778       /* This delay slot will only be executed if the branch is taken.
11779          Use INSN's delay slot if is annulled.  */
11780       if (INSN_ANNULLED_BRANCH_P (insn))
11781         {
11782           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11783                            asm_out_file, optimize, 1, NULL);
11784           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11785         }
11786       else
11787         output_asm_insn ("nop", 0);
11788       fprintf (asm_out_file, "\n");
11789     }
11790
11791   /* Output NOT_TAKEN.  */
11792   targetm.asm_out.internal_label (asm_out_file, "L",
11793                                   CODE_LABEL_NUMBER (not_taken));
11794   return "";
11795 }
11796
11797 /* Return the assembly code for INSN, which branches to OPERANDS[0]
11798    if some ordering condition is true.  The condition is given by
11799    OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
11800    OPERANDS[1].  OPERANDS[2] is the comparison's first operand;
11801    its second is always zero.  */
11802
11803 const char *
11804 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
11805 {
11806   const char *branch[2];
11807
11808   /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
11809      Make BRANCH[0] branch on the inverse condition.  */
11810   switch (GET_CODE (operands[1]))
11811     {
11812       /* These cases are equivalent to comparisons against zero.  */
11813     case LEU:
11814       inverted_p = !inverted_p;
11815       /* Fall through.  */
11816     case GTU:
11817       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
11818       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
11819       break;
11820
11821       /* These cases are always true or always false.  */
11822     case LTU:
11823       inverted_p = !inverted_p;
11824       /* Fall through.  */
11825     case GEU:
11826       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
11827       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
11828       break;
11829
11830     default:
11831       branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
11832       branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
11833       break;
11834     }
11835   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
11836 }
11837 \f
11838 /* Start a block of code that needs access to the LL, SC and SYNC
11839    instructions.  */
11840
11841 static void
11842 mips_start_ll_sc_sync_block (void)
11843 {
11844   if (!ISA_HAS_LL_SC)
11845     {
11846       output_asm_insn (".set\tpush", 0);
11847       output_asm_insn (".set\tmips2", 0);
11848     }
11849 }
11850
11851 /* End a block started by mips_start_ll_sc_sync_block.  */
11852
11853 static void
11854 mips_end_ll_sc_sync_block (void)
11855 {
11856   if (!ISA_HAS_LL_SC)
11857     output_asm_insn (".set\tpop", 0);
11858 }
11859
11860 /* Output and/or return the asm template for a sync instruction.  */
11861
11862 const char *
11863 mips_output_sync (void)
11864 {
11865   mips_start_ll_sc_sync_block ();
11866   output_asm_insn ("sync", 0);
11867   mips_end_ll_sc_sync_block ();
11868   return "";
11869 }
11870
11871 /* Return the asm template associated with sync_insn1 value TYPE.
11872    IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation.  */
11873
11874 static const char *
11875 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
11876 {
11877   switch (type)
11878     {
11879     case SYNC_INSN1_MOVE:
11880       return "move\t%0,%z2";
11881     case SYNC_INSN1_LI:
11882       return "li\t%0,%2";
11883     case SYNC_INSN1_ADDU:
11884       return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
11885     case SYNC_INSN1_ADDIU:
11886       return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
11887     case SYNC_INSN1_SUBU:
11888       return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
11889     case SYNC_INSN1_AND:
11890       return "and\t%0,%1,%z2";
11891     case SYNC_INSN1_ANDI:
11892       return "andi\t%0,%1,%2";
11893     case SYNC_INSN1_OR:
11894       return "or\t%0,%1,%z2";
11895     case SYNC_INSN1_ORI:
11896       return "ori\t%0,%1,%2";
11897     case SYNC_INSN1_XOR:
11898       return "xor\t%0,%1,%z2";
11899     case SYNC_INSN1_XORI:
11900       return "xori\t%0,%1,%2";
11901     }
11902   gcc_unreachable ();
11903 }
11904
11905 /* Return the asm template associated with sync_insn2 value TYPE.  */
11906
11907 static const char *
11908 mips_sync_insn2_template (enum attr_sync_insn2 type)
11909 {
11910   switch (type)
11911     {
11912     case SYNC_INSN2_NOP:
11913       gcc_unreachable ();
11914     case SYNC_INSN2_AND:
11915       return "and\t%0,%1,%z2";
11916     case SYNC_INSN2_XOR:
11917       return "xor\t%0,%1,%z2";
11918     case SYNC_INSN2_NOT:
11919       return "nor\t%0,%1,%.";
11920     }
11921   gcc_unreachable ();
11922 }
11923
11924 /* OPERANDS are the operands to a sync loop instruction and INDEX is
11925    the value of the one of the sync_* attributes.  Return the operand
11926    referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
11927    have the associated attribute.  */
11928
11929 static rtx
11930 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
11931 {
11932   if (index > 0)
11933     default_value = operands[index - 1];
11934   return default_value;
11935 }
11936
11937 /* INSN is a sync loop with operands OPERANDS.  Build up a multi-insn
11938    sequence for it.  */
11939
11940 static void
11941 mips_process_sync_loop (rtx insn, rtx *operands)
11942 {
11943   rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
11944   rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3;
11945   unsigned int tmp3_insn;
11946   enum attr_sync_insn1 insn1;
11947   enum attr_sync_insn2 insn2;
11948   bool is_64bit_p;
11949
11950   /* Read an operand from the sync_WHAT attribute and store it in
11951      variable WHAT.  DEFAULT is the default value if no attribute
11952      is specified.  */
11953 #define READ_OPERAND(WHAT, DEFAULT) \
11954   WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
11955                                 DEFAULT)
11956
11957   /* Read the memory.  */
11958   READ_OPERAND (mem, 0);
11959   gcc_assert (mem);
11960   is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
11961
11962   /* Read the other attributes.  */
11963   at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
11964   READ_OPERAND (oldval, at);
11965   READ_OPERAND (newval, at);
11966   READ_OPERAND (inclusive_mask, 0);
11967   READ_OPERAND (exclusive_mask, 0);
11968   READ_OPERAND (required_oldval, 0);
11969   READ_OPERAND (insn1_op2, 0);
11970   insn1 = get_attr_sync_insn1 (insn);
11971   insn2 = get_attr_sync_insn2 (insn);
11972
11973   mips_multi_start ();
11974
11975   /* Output the release side of the memory barrier.  */
11976   if (get_attr_sync_release_barrier (insn) == SYNC_RELEASE_BARRIER_YES)
11977     {
11978       if (required_oldval == 0 && TARGET_OCTEON)
11979         {
11980           /* Octeon doesn't reorder reads, so a full barrier can be
11981              created by using SYNCW to order writes combined with the
11982              write from the following SC.  When the SC successfully
11983              completes, we know that all preceding writes are also
11984              committed to the coherent memory system.  It is possible
11985              for a single SYNCW to fail, but a pair of them will never
11986              fail, so we use two.  */
11987           mips_multi_add_insn ("syncw", NULL);
11988           mips_multi_add_insn ("syncw", NULL);
11989         }
11990       else
11991         mips_multi_add_insn ("sync", NULL);
11992     }
11993
11994   /* Output the branch-back label.  */
11995   mips_multi_add_label ("1:");
11996
11997   /* OLDVAL = *MEM.  */
11998   mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
11999                        oldval, mem, NULL);
12000
12001   /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2.  */
12002   if (required_oldval)
12003     {
12004       if (inclusive_mask == 0)
12005         tmp1 = oldval;
12006       else
12007         {
12008           gcc_assert (oldval != at);
12009           mips_multi_add_insn ("and\t%0,%1,%2",
12010                                at, oldval, inclusive_mask, NULL);
12011           tmp1 = at;
12012         }
12013       mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
12014     }
12015
12016   /* $TMP1 = OLDVAL & EXCLUSIVE_MASK.  */
12017   if (exclusive_mask == 0)
12018     tmp1 = const0_rtx;
12019   else
12020     {
12021       gcc_assert (oldval != at);
12022       mips_multi_add_insn ("and\t%0,%1,%z2",
12023                            at, oldval, exclusive_mask, NULL);
12024       tmp1 = at;
12025     }
12026
12027   /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
12028
12029      We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
12030      at least one instruction in that case.  */
12031   if (insn1 == SYNC_INSN1_MOVE
12032       && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
12033     tmp2 = insn1_op2;
12034   else
12035     {
12036       mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
12037                            newval, oldval, insn1_op2, NULL);
12038       tmp2 = newval;
12039     }
12040
12041   /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK).  */
12042   if (insn2 == SYNC_INSN2_NOP)
12043     tmp3 = tmp2;
12044   else
12045     {
12046       mips_multi_add_insn (mips_sync_insn2_template (insn2),
12047                            newval, tmp2, inclusive_mask, NULL);
12048       tmp3 = newval;
12049     }
12050   tmp3_insn = mips_multi_last_index ();
12051
12052   /* $AT = $TMP1 | $TMP3.  */
12053   if (tmp1 == const0_rtx || tmp3 == const0_rtx)
12054     {
12055       mips_multi_set_operand (tmp3_insn, 0, at);
12056       tmp3 = at;
12057     }
12058   else
12059     {
12060       gcc_assert (tmp1 != tmp3);
12061       mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
12062     }
12063
12064   /* if (!commit (*MEM = $AT)) goto 1.
12065
12066      This will sometimes be a delayed branch; see the write code below
12067      for details.  */
12068   mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
12069   mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
12070
12071   /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot].  */
12072   if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
12073     {
12074       mips_multi_copy_insn (tmp3_insn);
12075       mips_multi_set_operand (mips_multi_last_index (), 0, newval);
12076     }
12077   else
12078     mips_multi_add_insn ("nop", NULL);
12079
12080   /* Output the acquire side of the memory barrier.  */
12081   if (TARGET_SYNC_AFTER_SC)
12082     mips_multi_add_insn ("sync", NULL);
12083
12084   /* Output the exit label, if needed.  */
12085   if (required_oldval)
12086     mips_multi_add_label ("2:");
12087
12088 #undef READ_OPERAND
12089 }
12090
12091 /* Output and/or return the asm template for sync loop INSN, which has
12092    the operands given by OPERANDS.  */
12093
12094 const char *
12095 mips_output_sync_loop (rtx insn, rtx *operands)
12096 {
12097   mips_process_sync_loop (insn, operands);
12098
12099   /* Use branch-likely instructions to work around the LL/SC R10000
12100      errata.  */
12101   mips_branch_likely = TARGET_FIX_R10000;
12102
12103   mips_push_asm_switch (&mips_noreorder);
12104   mips_push_asm_switch (&mips_nomacro);
12105   mips_push_asm_switch (&mips_noat);
12106   mips_start_ll_sc_sync_block ();
12107
12108   mips_multi_write ();
12109
12110   mips_end_ll_sc_sync_block ();
12111   mips_pop_asm_switch (&mips_noat);
12112   mips_pop_asm_switch (&mips_nomacro);
12113   mips_pop_asm_switch (&mips_noreorder);
12114
12115   return "";
12116 }
12117
12118 /* Return the number of individual instructions in sync loop INSN,
12119    which has the operands given by OPERANDS.  */
12120
12121 unsigned int
12122 mips_sync_loop_insns (rtx insn, rtx *operands)
12123 {
12124   mips_process_sync_loop (insn, operands);
12125   return mips_multi_num_insns;
12126 }
12127 \f
12128 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
12129    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
12130
12131    When working around R4000 and R4400 errata, we need to make sure that
12132    the division is not immediately followed by a shift[1][2].  We also
12133    need to stop the division from being put into a branch delay slot[3].
12134    The easiest way to avoid both problems is to add a nop after the
12135    division.  When a divide-by-zero check is needed, this nop can be
12136    used to fill the branch delay slot.
12137
12138    [1] If a double-word or a variable shift executes immediately
12139        after starting an integer division, the shift may give an
12140        incorrect result.  See quotations of errata #16 and #28 from
12141        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12142        in mips.md for details.
12143
12144    [2] A similar bug to [1] exists for all revisions of the
12145        R4000 and the R4400 when run in an MC configuration.
12146        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
12147
12148        "19. In this following sequence:
12149
12150                     ddiv                (or ddivu or div or divu)
12151                     dsll32              (or dsrl32, dsra32)
12152
12153             if an MPT stall occurs, while the divide is slipping the cpu
12154             pipeline, then the following double shift would end up with an
12155             incorrect result.
12156
12157             Workaround: The compiler needs to avoid generating any
12158             sequence with divide followed by extended double shift."
12159
12160        This erratum is also present in "MIPS R4400MC Errata, Processor
12161        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
12162        & 3.0" as errata #10 and #4, respectively.
12163
12164    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12165        (also valid for MIPS R4000MC processors):
12166
12167        "52. R4000SC: This bug does not apply for the R4000PC.
12168
12169             There are two flavors of this bug:
12170
12171             1) If the instruction just after divide takes an RF exception
12172                (tlb-refill, tlb-invalid) and gets an instruction cache
12173                miss (both primary and secondary) and the line which is
12174                currently in secondary cache at this index had the first
12175                data word, where the bits 5..2 are set, then R4000 would
12176                get a wrong result for the div.
12177
12178             ##1
12179                     nop
12180                     div r8, r9
12181                     -------------------         # end-of page. -tlb-refill
12182                     nop
12183             ##2
12184                     nop
12185                     div r8, r9
12186                     -------------------         # end-of page. -tlb-invalid
12187                     nop
12188
12189             2) If the divide is in the taken branch delay slot, where the
12190                target takes RF exception and gets an I-cache miss for the
12191                exception vector or where I-cache miss occurs for the
12192                target address, under the above mentioned scenarios, the
12193                div would get wrong results.
12194
12195             ##1
12196                     j   r2              # to next page mapped or unmapped
12197                     div r8,r9           # this bug would be there as long
12198                                         # as there is an ICache miss and
12199                     nop                 # the "data pattern" is present
12200
12201             ##2
12202                     beq r0, r0, NextPage        # to Next page
12203                     div r8,r9
12204                     nop
12205
12206             This bug is present for div, divu, ddiv, and ddivu
12207             instructions.
12208
12209             Workaround: For item 1), OS could make sure that the next page
12210             after the divide instruction is also mapped.  For item 2), the
12211             compiler could make sure that the divide instruction is not in
12212             the branch delay slot."
12213
12214        These processors have PRId values of 0x00004220 and 0x00004300 for
12215        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
12216
12217 const char *
12218 mips_output_division (const char *division, rtx *operands)
12219 {
12220   const char *s;
12221
12222   s = division;
12223   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
12224     {
12225       output_asm_insn (s, operands);
12226       s = "nop";
12227     }
12228   if (TARGET_CHECK_ZERO_DIV)
12229     {
12230       if (TARGET_MIPS16)
12231         {
12232           output_asm_insn (s, operands);
12233           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
12234         }
12235       else if (GENERATE_DIVIDE_TRAPS)
12236         {
12237           /* Avoid long replay penalty on load miss by putting the trap before
12238              the divide.  */
12239           if (TUNE_74K)
12240             output_asm_insn ("teq\t%2,%.,7", operands);
12241           else
12242             {
12243               output_asm_insn (s, operands);
12244               s = "teq\t%2,%.,7";
12245             }
12246         }
12247       else
12248         {
12249           output_asm_insn ("%(bne\t%2,%.,1f", operands);
12250           output_asm_insn (s, operands);
12251           s = "break\t7%)\n1:";
12252         }
12253     }
12254   return s;
12255 }
12256 \f
12257 /* Return true if IN_INSN is a multiply-add or multiply-subtract
12258    instruction and if OUT_INSN assigns to the accumulator operand.  */
12259
12260 bool
12261 mips_linked_madd_p (rtx out_insn, rtx in_insn)
12262 {
12263   rtx x;
12264
12265   x = single_set (in_insn);
12266   if (x == 0)
12267     return false;
12268
12269   x = SET_SRC (x);
12270
12271   if (GET_CODE (x) == PLUS
12272       && GET_CODE (XEXP (x, 0)) == MULT
12273       && reg_set_p (XEXP (x, 1), out_insn))
12274     return true;
12275
12276   if (GET_CODE (x) == MINUS
12277       && GET_CODE (XEXP (x, 1)) == MULT
12278       && reg_set_p (XEXP (x, 0), out_insn))
12279     return true;
12280
12281   return false;
12282 }
12283
12284 /* True if the dependency between OUT_INSN and IN_INSN is on the store
12285    data rather than the address.  We need this because the cprestore
12286    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
12287    which causes the default routine to abort.  We just return false
12288    for that case.  */
12289
12290 bool
12291 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
12292 {
12293   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
12294     return false;
12295
12296   return !store_data_bypass_p (out_insn, in_insn);
12297 }
12298 \f
12299
12300 /* Variables and flags used in scheduler hooks when tuning for
12301    Loongson 2E/2F.  */
12302 static struct
12303 {
12304   /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
12305      strategy.  */
12306
12307   /* If true, then next ALU1/2 instruction will go to ALU1.  */
12308   bool alu1_turn_p;
12309
12310   /* If true, then next FALU1/2 unstruction will go to FALU1.  */
12311   bool falu1_turn_p;
12312
12313   /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
12314   int alu1_core_unit_code;
12315   int alu2_core_unit_code;
12316   int falu1_core_unit_code;
12317   int falu2_core_unit_code;
12318
12319   /* True if current cycle has a multi instruction.
12320      This flag is used in mips_ls2_dfa_post_advance_cycle.  */
12321   bool cycle_has_multi_p;
12322
12323   /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
12324      These are used in mips_ls2_dfa_post_advance_cycle to initialize
12325      DFA state.
12326      E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
12327      instruction to go ALU1.  */
12328   rtx alu1_turn_enabled_insn;
12329   rtx alu2_turn_enabled_insn;
12330   rtx falu1_turn_enabled_insn;
12331   rtx falu2_turn_enabled_insn;
12332 } mips_ls2;
12333
12334 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
12335    dependencies have no cost, except on the 20Kc where output-dependence
12336    is treated like input-dependence.  */
12337
12338 static int
12339 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
12340                   rtx dep ATTRIBUTE_UNUSED, int cost)
12341 {
12342   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
12343       && TUNE_20KC)
12344     return cost;
12345   if (REG_NOTE_KIND (link) != 0)
12346     return 0;
12347   return cost;
12348 }
12349
12350 /* Return the number of instructions that can be issued per cycle.  */
12351
12352 static int
12353 mips_issue_rate (void)
12354 {
12355   switch (mips_tune)
12356     {
12357     case PROCESSOR_74KC:
12358     case PROCESSOR_74KF2_1:
12359     case PROCESSOR_74KF1_1:
12360     case PROCESSOR_74KF3_2:
12361       /* The 74k is not strictly quad-issue cpu, but can be seen as one
12362          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
12363          but in reality only a maximum of 3 insns can be issued as
12364          floating-point loads and stores also require a slot in the
12365          AGEN pipe.  */
12366     case PROCESSOR_R10000:
12367       /* All R10K Processors are quad-issue (being the first MIPS
12368          processors to support this feature). */
12369       return 4;
12370
12371     case PROCESSOR_20KC:
12372     case PROCESSOR_R4130:
12373     case PROCESSOR_R5400:
12374     case PROCESSOR_R5500:
12375     case PROCESSOR_R7000:
12376     case PROCESSOR_R9000:
12377     case PROCESSOR_OCTEON:
12378     case PROCESSOR_OCTEON2:
12379       return 2;
12380
12381     case PROCESSOR_SB1:
12382     case PROCESSOR_SB1A:
12383       /* This is actually 4, but we get better performance if we claim 3.
12384          This is partly because of unwanted speculative code motion with the
12385          larger number, and partly because in most common cases we can't
12386          reach the theoretical max of 4.  */
12387       return 3;
12388
12389     case PROCESSOR_LOONGSON_2E:
12390     case PROCESSOR_LOONGSON_2F:
12391     case PROCESSOR_LOONGSON_3A:
12392       return 4;
12393
12394     default:
12395       return 1;
12396     }
12397 }
12398
12399 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
12400
12401 static void
12402 mips_ls2_init_dfa_post_cycle_insn (void)
12403 {
12404   start_sequence ();
12405   emit_insn (gen_ls2_alu1_turn_enabled_insn ());
12406   mips_ls2.alu1_turn_enabled_insn = get_insns ();
12407   end_sequence ();
12408
12409   start_sequence ();
12410   emit_insn (gen_ls2_alu2_turn_enabled_insn ());
12411   mips_ls2.alu2_turn_enabled_insn = get_insns ();
12412   end_sequence ();
12413
12414   start_sequence ();
12415   emit_insn (gen_ls2_falu1_turn_enabled_insn ());
12416   mips_ls2.falu1_turn_enabled_insn = get_insns ();
12417   end_sequence ();
12418
12419   start_sequence ();
12420   emit_insn (gen_ls2_falu2_turn_enabled_insn ());
12421   mips_ls2.falu2_turn_enabled_insn = get_insns ();
12422   end_sequence ();
12423
12424   mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
12425   mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
12426   mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
12427   mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
12428 }
12429
12430 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
12431    Init data used in mips_dfa_post_advance_cycle.  */
12432
12433 static void
12434 mips_init_dfa_post_cycle_insn (void)
12435 {
12436   if (TUNE_LOONGSON_2EF)
12437     mips_ls2_init_dfa_post_cycle_insn ();
12438 }
12439
12440 /* Initialize STATE when scheduling for Loongson 2E/2F.
12441    Support round-robin dispatch scheme by enabling only one of
12442    ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
12443    respectively.  */
12444
12445 static void
12446 mips_ls2_dfa_post_advance_cycle (state_t state)
12447 {
12448   if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
12449     {
12450       /* Though there are no non-pipelined ALU1 insns,
12451          we can get an instruction of type 'multi' before reload.  */
12452       gcc_assert (mips_ls2.cycle_has_multi_p);
12453       mips_ls2.alu1_turn_p = false;
12454     }
12455
12456   mips_ls2.cycle_has_multi_p = false;
12457
12458   if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
12459     /* We have a non-pipelined alu instruction in the core,
12460        adjust round-robin counter.  */
12461     mips_ls2.alu1_turn_p = true;
12462
12463   if (mips_ls2.alu1_turn_p)
12464     {
12465       if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
12466         gcc_unreachable ();
12467     }
12468   else
12469     {
12470       if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
12471         gcc_unreachable ();
12472     }
12473
12474   if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
12475     {
12476       /* There are no non-pipelined FALU1 insns.  */
12477       gcc_unreachable ();
12478       mips_ls2.falu1_turn_p = false;
12479     }
12480
12481   if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
12482     /* We have a non-pipelined falu instruction in the core,
12483        adjust round-robin counter.  */
12484     mips_ls2.falu1_turn_p = true;
12485
12486   if (mips_ls2.falu1_turn_p)
12487     {
12488       if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
12489         gcc_unreachable ();
12490     }
12491   else
12492     {
12493       if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
12494         gcc_unreachable ();
12495     }
12496 }
12497
12498 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
12499    This hook is being called at the start of each cycle.  */
12500
12501 static void
12502 mips_dfa_post_advance_cycle (void)
12503 {
12504   if (TUNE_LOONGSON_2EF)
12505     mips_ls2_dfa_post_advance_cycle (curr_state);
12506 }
12507
12508 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
12509    be as wide as the scheduling freedom in the DFA.  */
12510
12511 static int
12512 mips_multipass_dfa_lookahead (void)
12513 {
12514   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
12515   if (TUNE_SB1)
12516     return 4;
12517
12518   if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
12519     return 4;
12520
12521   if (TUNE_OCTEON)
12522     return 2;
12523
12524   return 0;
12525 }
12526 \f
12527 /* Remove the instruction at index LOWER from ready queue READY and
12528    reinsert it in front of the instruction at index HIGHER.  LOWER must
12529    be <= HIGHER.  */
12530
12531 static void
12532 mips_promote_ready (rtx *ready, int lower, int higher)
12533 {
12534   rtx new_head;
12535   int i;
12536
12537   new_head = ready[lower];
12538   for (i = lower; i < higher; i++)
12539     ready[i] = ready[i + 1];
12540   ready[i] = new_head;
12541 }
12542
12543 /* If the priority of the instruction at POS2 in the ready queue READY
12544    is within LIMIT units of that of the instruction at POS1, swap the
12545    instructions if POS2 is not already less than POS1.  */
12546
12547 static void
12548 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
12549 {
12550   if (pos1 < pos2
12551       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
12552     {
12553       rtx temp;
12554
12555       temp = ready[pos1];
12556       ready[pos1] = ready[pos2];
12557       ready[pos2] = temp;
12558     }
12559 }
12560 \f
12561 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
12562    that may clobber hi or lo.  */
12563 static rtx mips_macc_chains_last_hilo;
12564
12565 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
12566    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
12567
12568 static void
12569 mips_macc_chains_record (rtx insn)
12570 {
12571   if (get_attr_may_clobber_hilo (insn))
12572     mips_macc_chains_last_hilo = insn;
12573 }
12574
12575 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
12576    has NREADY elements, looking for a multiply-add or multiply-subtract
12577    instruction that is cumulative with mips_macc_chains_last_hilo.
12578    If there is one, promote it ahead of anything else that might
12579    clobber hi or lo.  */
12580
12581 static void
12582 mips_macc_chains_reorder (rtx *ready, int nready)
12583 {
12584   int i, j;
12585
12586   if (mips_macc_chains_last_hilo != 0)
12587     for (i = nready - 1; i >= 0; i--)
12588       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
12589         {
12590           for (j = nready - 1; j > i; j--)
12591             if (recog_memoized (ready[j]) >= 0
12592                 && get_attr_may_clobber_hilo (ready[j]))
12593               {
12594                 mips_promote_ready (ready, i, j);
12595                 break;
12596               }
12597           break;
12598         }
12599 }
12600 \f
12601 /* The last instruction to be scheduled.  */
12602 static rtx vr4130_last_insn;
12603
12604 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
12605    points to an rtx that is initially an instruction.  Nullify the rtx
12606    if the instruction uses the value of register X.  */
12607
12608 static void
12609 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
12610                                 void *data)
12611 {
12612   rtx *insn_ptr;
12613
12614   insn_ptr = (rtx *) data;
12615   if (REG_P (x)
12616       && *insn_ptr != 0
12617       && reg_referenced_p (x, PATTERN (*insn_ptr)))
12618     *insn_ptr = 0;
12619 }
12620
12621 /* Return true if there is true register dependence between vr4130_last_insn
12622    and INSN.  */
12623
12624 static bool
12625 vr4130_true_reg_dependence_p (rtx insn)
12626 {
12627   note_stores (PATTERN (vr4130_last_insn),
12628                vr4130_true_reg_dependence_p_1, &insn);
12629   return insn == 0;
12630 }
12631
12632 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
12633    the ready queue and that INSN2 is the instruction after it, return
12634    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
12635    in which INSN1 and INSN2 can probably issue in parallel, but for
12636    which (INSN2, INSN1) should be less sensitive to instruction
12637    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
12638
12639 static bool
12640 vr4130_swap_insns_p (rtx insn1, rtx insn2)
12641 {
12642   sd_iterator_def sd_it;
12643   dep_t dep;
12644
12645   /* Check for the following case:
12646
12647      1) there is some other instruction X with an anti dependence on INSN1;
12648      2) X has a higher priority than INSN2; and
12649      3) X is an arithmetic instruction (and thus has no unit restrictions).
12650
12651      If INSN1 is the last instruction blocking X, it would better to
12652      choose (INSN1, X) over (INSN2, INSN1).  */
12653   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
12654     if (DEP_TYPE (dep) == REG_DEP_ANTI
12655         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
12656         && recog_memoized (DEP_CON (dep)) >= 0
12657         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
12658       return false;
12659
12660   if (vr4130_last_insn != 0
12661       && recog_memoized (insn1) >= 0
12662       && recog_memoized (insn2) >= 0)
12663     {
12664       /* See whether INSN1 and INSN2 use different execution units,
12665          or if they are both ALU-type instructions.  If so, they can
12666          probably execute in parallel.  */
12667       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
12668       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
12669       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
12670         {
12671           /* If only one of the instructions has a dependence on
12672              vr4130_last_insn, prefer to schedule the other one first.  */
12673           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
12674           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
12675           if (dep1_p != dep2_p)
12676             return dep1_p;
12677
12678           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
12679              is not an ALU-type instruction and if INSN1 uses the same
12680              execution unit.  (Note that if this condition holds, we already
12681              know that INSN2 uses a different execution unit.)  */
12682           if (class1 != VR4130_CLASS_ALU
12683               && recog_memoized (vr4130_last_insn) >= 0
12684               && class1 == get_attr_vr4130_class (vr4130_last_insn))
12685             return true;
12686         }
12687     }
12688   return false;
12689 }
12690
12691 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
12692    queue with at least two instructions.  Swap the first two if
12693    vr4130_swap_insns_p says that it could be worthwhile.  */
12694
12695 static void
12696 vr4130_reorder (rtx *ready, int nready)
12697 {
12698   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
12699     mips_promote_ready (ready, nready - 2, nready - 1);
12700 }
12701 \f
12702 /* Record whether last 74k AGEN instruction was a load or store.  */
12703 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
12704
12705 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
12706    resets to TYPE_UNKNOWN state.  */
12707
12708 static void
12709 mips_74k_agen_init (rtx insn)
12710 {
12711   if (!insn || CALL_P (insn) || JUMP_P (insn))
12712     mips_last_74k_agen_insn = TYPE_UNKNOWN;
12713   else
12714     {
12715       enum attr_type type = get_attr_type (insn);
12716       if (type == TYPE_LOAD || type == TYPE_STORE)
12717         mips_last_74k_agen_insn = type;
12718     }
12719 }
12720
12721 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
12722    loads to be grouped together, and multiple stores to be grouped
12723    together.  Swap things around in the ready queue to make this happen.  */
12724
12725 static void
12726 mips_74k_agen_reorder (rtx *ready, int nready)
12727 {
12728   int i;
12729   int store_pos, load_pos;
12730
12731   store_pos = -1;
12732   load_pos = -1;
12733
12734   for (i = nready - 1; i >= 0; i--)
12735     {
12736       rtx insn = ready[i];
12737       if (USEFUL_INSN_P (insn))
12738         switch (get_attr_type (insn))
12739           {
12740           case TYPE_STORE:
12741             if (store_pos == -1)
12742               store_pos = i;
12743             break;
12744
12745           case TYPE_LOAD:
12746             if (load_pos == -1)
12747               load_pos = i;
12748             break;
12749
12750           default:
12751             break;
12752           }
12753     }
12754
12755   if (load_pos == -1 || store_pos == -1)
12756     return;
12757
12758   switch (mips_last_74k_agen_insn)
12759     {
12760     case TYPE_UNKNOWN:
12761       /* Prefer to schedule loads since they have a higher latency.  */
12762     case TYPE_LOAD:
12763       /* Swap loads to the front of the queue.  */
12764       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
12765       break;
12766     case TYPE_STORE:
12767       /* Swap stores to the front of the queue.  */
12768       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
12769       break;
12770     default:
12771       break;
12772     }
12773 }
12774 \f
12775 /* Implement TARGET_SCHED_INIT.  */
12776
12777 static void
12778 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12779                  int max_ready ATTRIBUTE_UNUSED)
12780 {
12781   mips_macc_chains_last_hilo = 0;
12782   vr4130_last_insn = 0;
12783   mips_74k_agen_init (NULL_RTX);
12784
12785   /* When scheduling for Loongson2, branch instructions go to ALU1,
12786      therefore basic block is most likely to start with round-robin counter
12787      pointed to ALU2.  */
12788   mips_ls2.alu1_turn_p = false;
12789   mips_ls2.falu1_turn_p = true;
12790 }
12791
12792 /* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
12793
12794 static void
12795 mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12796                       rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12797 {
12798   if (!reload_completed
12799       && TUNE_MACC_CHAINS
12800       && *nreadyp > 0)
12801     mips_macc_chains_reorder (ready, *nreadyp);
12802
12803   if (reload_completed
12804       && TUNE_MIPS4130
12805       && !TARGET_VR4130_ALIGN
12806       && *nreadyp > 1)
12807     vr4130_reorder (ready, *nreadyp);
12808
12809   if (TUNE_74K)
12810     mips_74k_agen_reorder (ready, *nreadyp);
12811 }
12812
12813 /* Implement TARGET_SCHED_REORDER.  */
12814
12815 static int
12816 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12817                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12818 {
12819   mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
12820   return mips_issue_rate ();
12821 }
12822
12823 /* Implement TARGET_SCHED_REORDER2.  */
12824
12825 static int
12826 mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12827                      rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12828 {
12829   mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
12830   return cached_can_issue_more;
12831 }
12832
12833 /* Update round-robin counters for ALU1/2 and FALU1/2.  */
12834
12835 static void
12836 mips_ls2_variable_issue (rtx insn)
12837 {
12838   if (mips_ls2.alu1_turn_p)
12839     {
12840       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
12841         mips_ls2.alu1_turn_p = false;
12842     }
12843   else
12844     {
12845       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
12846         mips_ls2.alu1_turn_p = true;
12847     }
12848
12849   if (mips_ls2.falu1_turn_p)
12850     {
12851       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
12852         mips_ls2.falu1_turn_p = false;
12853     }
12854   else
12855     {
12856       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
12857         mips_ls2.falu1_turn_p = true;
12858     }
12859
12860   if (recog_memoized (insn) >= 0)
12861     mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
12862 }
12863
12864 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
12865
12866 static int
12867 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12868                      rtx insn, int more)
12869 {
12870   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
12871   if (USEFUL_INSN_P (insn))
12872     {
12873       if (get_attr_type (insn) != TYPE_GHOST)
12874         more--;
12875       if (!reload_completed && TUNE_MACC_CHAINS)
12876         mips_macc_chains_record (insn);
12877       vr4130_last_insn = insn;
12878       if (TUNE_74K)
12879         mips_74k_agen_init (insn);
12880       else if (TUNE_LOONGSON_2EF)
12881         mips_ls2_variable_issue (insn);
12882     }
12883
12884   /* Instructions of type 'multi' should all be split before
12885      the second scheduling pass.  */
12886   gcc_assert (!reload_completed
12887               || recog_memoized (insn) < 0
12888               || get_attr_type (insn) != TYPE_MULTI);
12889
12890   cached_can_issue_more = more;
12891   return more;
12892 }
12893 \f
12894 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
12895    return the first operand of the associated PREF or PREFX insn.  */
12896
12897 rtx
12898 mips_prefetch_cookie (rtx write, rtx locality)
12899 {
12900   /* store_streamed / load_streamed.  */
12901   if (INTVAL (locality) <= 0)
12902     return GEN_INT (INTVAL (write) + 4);
12903
12904   /* store / load.  */
12905   if (INTVAL (locality) <= 2)
12906     return write;
12907
12908   /* store_retained / load_retained.  */
12909   return GEN_INT (INTVAL (write) + 6);
12910 }
12911 \f
12912 /* Flags that indicate when a built-in function is available.
12913
12914    BUILTIN_AVAIL_NON_MIPS16
12915         The function is available on the current target, but only
12916         in non-MIPS16 mode.  */
12917 #define BUILTIN_AVAIL_NON_MIPS16 1
12918
12919 /* Declare an availability predicate for built-in functions that
12920    require non-MIPS16 mode and also require COND to be true.
12921    NAME is the main part of the predicate's name.  */
12922 #define AVAIL_NON_MIPS16(NAME, COND)                                    \
12923  static unsigned int                                                    \
12924  mips_builtin_avail_##NAME (void)                                       \
12925  {                                                                      \
12926    return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                        \
12927  }
12928
12929 /* This structure describes a single built-in function.  */
12930 struct mips_builtin_description {
12931   /* The code of the main .md file instruction.  See mips_builtin_type
12932      for more information.  */
12933   enum insn_code icode;
12934
12935   /* The floating-point comparison code to use with ICODE, if any.  */
12936   enum mips_fp_condition cond;
12937
12938   /* The name of the built-in function.  */
12939   const char *name;
12940
12941   /* Specifies how the function should be expanded.  */
12942   enum mips_builtin_type builtin_type;
12943
12944   /* The function's prototype.  */
12945   enum mips_function_type function_type;
12946
12947   /* Whether the function is available.  */
12948   unsigned int (*avail) (void);
12949 };
12950
12951 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
12952 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
12953 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
12954 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
12955 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
12956 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
12957 AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
12958 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
12959 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
12960 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
12961
12962 /* Construct a mips_builtin_description from the given arguments.
12963
12964    INSN is the name of the associated instruction pattern, without the
12965    leading CODE_FOR_mips_.
12966
12967    CODE is the floating-point condition code associated with the
12968    function.  It can be 'f' if the field is not applicable.
12969
12970    NAME is the name of the function itself, without the leading
12971    "__builtin_mips_".
12972
12973    BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
12974
12975    AVAIL is the name of the availability predicate, without the leading
12976    mips_builtin_avail_.  */
12977 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
12978                      FUNCTION_TYPE, AVAIL)                              \
12979   { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
12980     "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
12981     mips_builtin_avail_ ## AVAIL }
12982
12983 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
12984    mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
12985    are as for MIPS_BUILTIN.  */
12986 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
12987   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
12988
12989 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
12990    are subject to mips_builtin_avail_<AVAIL>.  */
12991 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
12992   MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
12993                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
12994   MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
12995                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
12996
12997 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
12998    The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
12999    while the any and all forms are subject to mips_builtin_avail_mips3d.  */
13000 #define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
13001   MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
13002                 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
13003                 mips3d),                                                \
13004   MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
13005                 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
13006                 mips3d),                                                \
13007   MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
13008                 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
13009                 AVAIL),                                                 \
13010   MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
13011                 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
13012                 AVAIL)
13013
13014 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
13015    are subject to mips_builtin_avail_mips3d.  */
13016 #define CMP_4S_BUILTINS(INSN, COND)                                     \
13017   MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
13018                 MIPS_BUILTIN_CMP_ANY,                                   \
13019                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
13020   MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
13021                 MIPS_BUILTIN_CMP_ALL,                                   \
13022                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
13023
13024 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
13025    instruction requires mips_builtin_avail_<AVAIL>.  */
13026 #define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
13027   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
13028                 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13029                 AVAIL),                                                 \
13030   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
13031                 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13032                 AVAIL)
13033
13034 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
13035 #define CMP_BUILTINS(COND)                                              \
13036   MOVTF_BUILTINS (c, COND, paired_single),                              \
13037   MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
13038   CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
13039   CMP_PS_BUILTINS (c, COND, paired_single),                             \
13040   CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
13041   CMP_4S_BUILTINS (c, COND),                                            \
13042   CMP_4S_BUILTINS (cabs, COND)
13043
13044 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
13045    function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
13046    and AVAIL are as for MIPS_BUILTIN.  */
13047 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
13048   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
13049                 FUNCTION_TYPE, AVAIL)
13050
13051 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
13052    branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
13053 #define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
13054   MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
13055                 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
13056
13057 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
13058    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
13059    builtin_description field.  */
13060 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
13061   { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
13062     "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
13063     FUNCTION_TYPE, mips_builtin_avail_loongson }
13064
13065 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
13066    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
13067    builtin_description field.  */
13068 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
13069   LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
13070
13071 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
13072    We use functions of this form when the same insn can be usefully applied
13073    to more than one datatype.  */
13074 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
13075   LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
13076
13077 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
13078 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
13079 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
13080 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
13081 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
13082 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
13083 #define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
13084 #define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
13085
13086 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
13087 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
13088 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
13089 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
13090 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
13091 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
13092 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
13093 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
13094 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
13095 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
13096 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
13097 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
13098 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
13099 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
13100 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
13101 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
13102 #define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
13103 #define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
13104 #define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
13105 #define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
13106 #define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
13107 #define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
13108 #define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
13109 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
13110 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
13111 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
13112 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
13113 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
13114 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
13115 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
13116
13117 static const struct mips_builtin_description mips_builtins[] = {
13118   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13119   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13120   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13121   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13122   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
13123   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
13124   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
13125   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
13126
13127   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
13128   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13129   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13130   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13131   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
13132
13133   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
13134   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
13135   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13136   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13137   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13138   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13139
13140   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
13141   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
13142   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13143   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13144   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13145   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13146
13147   MIPS_FP_CONDITIONS (CMP_BUILTINS),
13148
13149   /* Built-in functions for the SB-1 processor.  */
13150   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
13151
13152   /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
13153   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13154   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13155   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13156   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13157   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13158   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13159   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13160   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13161   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13162   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13163   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
13164   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
13165   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
13166   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
13167   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
13168   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
13169   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
13170   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
13171   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
13172   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
13173   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
13174   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
13175   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
13176   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
13177   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
13178   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
13179   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
13180   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
13181   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
13182   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
13183   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
13184   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13185   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13186   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13187   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
13188   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13189   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13190   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
13191   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
13192   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
13193   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13194   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
13195   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
13196   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
13197   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
13198   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
13199   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
13200   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13201   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13202   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13203   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13204   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13205   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13206   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13207   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13208   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13209   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13210   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13211   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13212   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
13213   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
13214   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
13215   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
13216   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
13217   BPOSGE_BUILTIN (32, dsp),
13218
13219   /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
13220   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
13221   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13222   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13223   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13224   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13225   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13226   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13227   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13228   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13229   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13230   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13231   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13232   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13233   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13234   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13235   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
13236   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
13237   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
13238   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13239   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
13240   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
13241   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
13242   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13243   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13244   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13245   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13246   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13247   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13248   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13249   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13250   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13251   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13252   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13253   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13254
13255   /* Built-in functions for the DSP ASE (32-bit only).  */
13256   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13257   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13258   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13259   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13260   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13261   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13262   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13263   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13264   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13265   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13266   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13267   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13268   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13269   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13270   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13271   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13272   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
13273   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
13274   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
13275   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
13276   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
13277   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13278   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
13279   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13280   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
13281   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
13282   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
13283
13284   /* Built-in functions for the DSP ASE (64-bit only).  */
13285   DIRECT_BUILTIN (ldx, MIPS_DI_FTYPE_POINTER_SI, dsp_64),
13286
13287   /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
13288   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13289   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13290   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13291   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13292   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13293   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13294   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13295   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13296   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13297
13298   /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
13299   LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
13300   LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
13301   LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
13302   LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13303   LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13304   LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13305   LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13306   LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13307   LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13308   LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
13309   LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
13310   LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13311   LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
13312   LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13313   LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13314   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
13315   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13316   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13317   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13318   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
13319   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
13320   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13321   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
13322   LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13323   LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13324   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13325   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13326   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13327   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13328   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13329   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13330   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13331   LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13332   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13333   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13334   LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13335   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13336   LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
13337   LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
13338   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13339   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13340   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13341   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13342   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13343   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13344   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13345   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13346   LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
13347   LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13348   LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13349   LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13350   LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13351   LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
13352   LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
13353   LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13354   LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13355   LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13356   LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
13357   LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13358   LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
13359   LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
13360   LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13361   LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13362   LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13363   LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13364   LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13365   LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13366   LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13367   LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13368   LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13369   LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13370   LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
13371   LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
13372   LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
13373   LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
13374   LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13375   LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13376   LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13377   LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13378   LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13379   LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13380   LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
13381   LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
13382   LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13383   LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
13384   LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13385   LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13386   LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13387   LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13388   LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13389   LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13390   LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13391   LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13392   LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13393   LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13394   LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13395   LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13396   LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13397   LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13398
13399   /* Sundry other built-in functions.  */
13400   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
13401 };
13402
13403 /* Index I is the function declaration for mips_builtins[I], or null if the
13404    function isn't defined on this target.  */
13405 static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
13406
13407 /* MODE is a vector mode whose elements have type TYPE.  Return the type
13408    of the vector itself.  */
13409
13410 static tree
13411 mips_builtin_vector_type (tree type, enum machine_mode mode)
13412 {
13413   static tree types[2 * (int) MAX_MACHINE_MODE];
13414   int mode_index;
13415
13416   mode_index = (int) mode;
13417
13418   if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
13419     mode_index += MAX_MACHINE_MODE;
13420
13421   if (types[mode_index] == NULL_TREE)
13422     types[mode_index] = build_vector_type_for_mode (type, mode);
13423   return types[mode_index];
13424 }
13425
13426 /* Return a type for 'const volatile void *'.  */
13427
13428 static tree
13429 mips_build_cvpointer_type (void)
13430 {
13431   static tree cache;
13432
13433   if (cache == NULL_TREE)
13434     cache = build_pointer_type (build_qualified_type
13435                                 (void_type_node,
13436                                  TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
13437   return cache;
13438 }
13439
13440 /* Source-level argument types.  */
13441 #define MIPS_ATYPE_VOID void_type_node
13442 #define MIPS_ATYPE_INT integer_type_node
13443 #define MIPS_ATYPE_POINTER ptr_type_node
13444 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
13445
13446 /* Standard mode-based argument types.  */
13447 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
13448 #define MIPS_ATYPE_SI intSI_type_node
13449 #define MIPS_ATYPE_USI unsigned_intSI_type_node
13450 #define MIPS_ATYPE_DI intDI_type_node
13451 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
13452 #define MIPS_ATYPE_SF float_type_node
13453 #define MIPS_ATYPE_DF double_type_node
13454
13455 /* Vector argument types.  */
13456 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
13457 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
13458 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
13459 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
13460 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
13461 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
13462 #define MIPS_ATYPE_UV2SI                                        \
13463   mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
13464 #define MIPS_ATYPE_UV4HI                                        \
13465   mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
13466 #define MIPS_ATYPE_UV8QI                                        \
13467   mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
13468
13469 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
13470    their associated MIPS_ATYPEs.  */
13471 #define MIPS_FTYPE_ATYPES1(A, B) \
13472   MIPS_ATYPE_##A, MIPS_ATYPE_##B
13473
13474 #define MIPS_FTYPE_ATYPES2(A, B, C) \
13475   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
13476
13477 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
13478   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
13479
13480 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
13481   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
13482   MIPS_ATYPE_##E
13483
13484 /* Return the function type associated with function prototype TYPE.  */
13485
13486 static tree
13487 mips_build_function_type (enum mips_function_type type)
13488 {
13489   static tree types[(int) MIPS_MAX_FTYPE_MAX];
13490
13491   if (types[(int) type] == NULL_TREE)
13492     switch (type)
13493       {
13494 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
13495   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
13496     types[(int) type]                                                   \
13497       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
13498                                   NULL_TREE);                           \
13499     break;
13500 #include "config/mips/mips-ftypes.def"
13501 #undef DEF_MIPS_FTYPE
13502       default:
13503         gcc_unreachable ();
13504       }
13505
13506   return types[(int) type];
13507 }
13508
13509 /* Implement TARGET_INIT_BUILTINS.  */
13510
13511 static void
13512 mips_init_builtins (void)
13513 {
13514   const struct mips_builtin_description *d;
13515   unsigned int i;
13516
13517   /* Iterate through all of the bdesc arrays, initializing all of the
13518      builtin functions.  */
13519   for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
13520     {
13521       d = &mips_builtins[i];
13522       if (d->avail ())
13523         mips_builtin_decls[i]
13524           = add_builtin_function (d->name,
13525                                   mips_build_function_type (d->function_type),
13526                                   i, BUILT_IN_MD, NULL, NULL);
13527     }
13528 }
13529
13530 /* Implement TARGET_BUILTIN_DECL.  */
13531
13532 static tree
13533 mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
13534 {
13535   if (code >= ARRAY_SIZE (mips_builtins))
13536     return error_mark_node;
13537   return mips_builtin_decls[code];
13538 }
13539
13540 /* Take argument ARGNO from EXP's argument list and convert it into
13541    an expand operand.  Store the operand in *OP.  */
13542
13543 static void
13544 mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
13545                           unsigned int argno)
13546 {
13547   tree arg;
13548   rtx value;
13549
13550   arg = CALL_EXPR_ARG (exp, argno);
13551   value = expand_normal (arg);
13552   create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
13553 }
13554
13555 /* Expand instruction ICODE as part of a built-in function sequence.
13556    Use the first NOPS elements of OPS as the instruction's operands.
13557    HAS_TARGET_P is true if operand 0 is a target; it is false if the
13558    instruction has no target.
13559
13560    Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx.  */
13561
13562 static rtx
13563 mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
13564                           struct expand_operand *ops, bool has_target_p)
13565 {
13566   if (!maybe_expand_insn (icode, nops, ops))
13567     {
13568       error ("invalid argument to built-in function");
13569       return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
13570     }
13571   return has_target_p ? ops[0].value : const0_rtx;
13572 }
13573
13574 /* Expand a floating-point comparison for built-in function call EXP.
13575    The first NARGS arguments are the values to be compared.  ICODE is
13576    the .md pattern that does the comparison and COND is the condition
13577    that is being tested.  Return an rtx for the result.  */
13578
13579 static rtx
13580 mips_expand_builtin_compare_1 (enum insn_code icode,
13581                                enum mips_fp_condition cond,
13582                                tree exp, int nargs)
13583 {
13584   struct expand_operand ops[MAX_RECOG_OPERANDS];
13585   int opno, argno;
13586
13587   /* The instruction should have a target operand, an operand for each
13588      argument, and an operand for COND.  */
13589   gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args);
13590
13591   opno = 0;
13592   create_output_operand (&ops[opno++], NULL_RTX,
13593                          insn_data[(int) icode].operand[0].mode);
13594   for (argno = 0; argno < nargs; argno++)
13595     mips_prepare_builtin_arg (&ops[opno++], exp, argno);
13596   create_integer_operand (&ops[opno++], (int) cond);
13597   return mips_expand_builtin_insn (icode, opno, ops, true);
13598 }
13599
13600 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
13601    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
13602    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
13603    suggests a good place to put the result.  */
13604
13605 static rtx
13606 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
13607                             bool has_target_p)
13608 {
13609   struct expand_operand ops[MAX_RECOG_OPERANDS];
13610   int opno, argno;
13611
13612   /* Map any target to operand 0.  */
13613   opno = 0;
13614   if (has_target_p)
13615     create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
13616
13617   /* Map the arguments to the other operands.  */
13618   gcc_assert (opno + call_expr_nargs (exp)
13619               == insn_data[icode].n_generator_args);
13620   for (argno = 0; argno < call_expr_nargs (exp); argno++)
13621     mips_prepare_builtin_arg (&ops[opno++], exp, argno);
13622
13623   return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
13624 }
13625
13626 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
13627    function; TYPE says which.  EXP is the CALL_EXPR that calls the
13628    function, ICODE is the instruction that should be used to compare
13629    the first two arguments, and COND is the condition it should test.
13630    TARGET, if nonnull, suggests a good place to put the result.  */
13631
13632 static rtx
13633 mips_expand_builtin_movtf (enum mips_builtin_type type,
13634                            enum insn_code icode, enum mips_fp_condition cond,
13635                            rtx target, tree exp)
13636 {
13637   struct expand_operand ops[4];
13638   rtx cmp_result;
13639
13640   cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
13641   create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
13642   if (type == MIPS_BUILTIN_MOVT)
13643     {
13644       mips_prepare_builtin_arg (&ops[2], exp, 2);
13645       mips_prepare_builtin_arg (&ops[1], exp, 3);
13646     }
13647   else
13648     {
13649       mips_prepare_builtin_arg (&ops[1], exp, 2);
13650       mips_prepare_builtin_arg (&ops[2], exp, 3);
13651     }
13652   create_fixed_operand (&ops[3], cmp_result);
13653   return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
13654                                    4, ops, true);
13655 }
13656
13657 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
13658    into TARGET otherwise.  Return TARGET.  */
13659
13660 static rtx
13661 mips_builtin_branch_and_move (rtx condition, rtx target,
13662                               rtx value_if_true, rtx value_if_false)
13663 {
13664   rtx true_label, done_label;
13665
13666   true_label = gen_label_rtx ();
13667   done_label = gen_label_rtx ();
13668
13669   /* First assume that CONDITION is false.  */
13670   mips_emit_move (target, value_if_false);
13671
13672   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
13673   emit_jump_insn (gen_condjump (condition, true_label));
13674   emit_jump_insn (gen_jump (done_label));
13675   emit_barrier ();
13676
13677   /* Fix TARGET if CONDITION is true.  */
13678   emit_label (true_label);
13679   mips_emit_move (target, value_if_true);
13680
13681   emit_label (done_label);
13682   return target;
13683 }
13684
13685 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
13686    the CALL_EXPR that calls the function, ICODE is the code of the
13687    comparison instruction, and COND is the condition it should test.
13688    TARGET, if nonnull, suggests a good place to put the boolean result.  */
13689
13690 static rtx
13691 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
13692                              enum insn_code icode, enum mips_fp_condition cond,
13693                              rtx target, tree exp)
13694 {
13695   rtx offset, condition, cmp_result;
13696
13697   if (target == 0 || GET_MODE (target) != SImode)
13698     target = gen_reg_rtx (SImode);
13699   cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
13700                                               call_expr_nargs (exp));
13701
13702   /* If the comparison sets more than one register, we define the result
13703      to be 0 if all registers are false and -1 if all registers are true.
13704      The value of the complete result is indeterminate otherwise.  */
13705   switch (builtin_type)
13706     {
13707     case MIPS_BUILTIN_CMP_ALL:
13708       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
13709       return mips_builtin_branch_and_move (condition, target,
13710                                            const0_rtx, const1_rtx);
13711
13712     case MIPS_BUILTIN_CMP_UPPER:
13713     case MIPS_BUILTIN_CMP_LOWER:
13714       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
13715       condition = gen_single_cc (cmp_result, offset);
13716       return mips_builtin_branch_and_move (condition, target,
13717                                            const1_rtx, const0_rtx);
13718
13719     default:
13720       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
13721       return mips_builtin_branch_and_move (condition, target,
13722                                            const1_rtx, const0_rtx);
13723     }
13724 }
13725
13726 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
13727    if nonnull, suggests a good place to put the boolean result.  */
13728
13729 static rtx
13730 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
13731 {
13732   rtx condition, cmp_result;
13733   int cmp_value;
13734
13735   if (target == 0 || GET_MODE (target) != SImode)
13736     target = gen_reg_rtx (SImode);
13737
13738   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
13739
13740   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
13741     cmp_value = 32;
13742   else
13743     gcc_assert (0);
13744
13745   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
13746   return mips_builtin_branch_and_move (condition, target,
13747                                        const1_rtx, const0_rtx);
13748 }
13749
13750 /* Implement TARGET_EXPAND_BUILTIN.  */
13751
13752 static rtx
13753 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
13754                      enum machine_mode mode, int ignore)
13755 {
13756   tree fndecl;
13757   unsigned int fcode, avail;
13758   const struct mips_builtin_description *d;
13759
13760   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13761   fcode = DECL_FUNCTION_CODE (fndecl);
13762   gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
13763   d = &mips_builtins[fcode];
13764   avail = d->avail ();
13765   gcc_assert (avail != 0);
13766   if (TARGET_MIPS16)
13767     {
13768       error ("built-in function %qE not supported for MIPS16",
13769              DECL_NAME (fndecl));
13770       return ignore ? const0_rtx : CONST0_RTX (mode);
13771     }
13772   switch (d->builtin_type)
13773     {
13774     case MIPS_BUILTIN_DIRECT:
13775       return mips_expand_builtin_direct (d->icode, target, exp, true);
13776
13777     case MIPS_BUILTIN_DIRECT_NO_TARGET:
13778       return mips_expand_builtin_direct (d->icode, target, exp, false);
13779
13780     case MIPS_BUILTIN_MOVT:
13781     case MIPS_BUILTIN_MOVF:
13782       return mips_expand_builtin_movtf (d->builtin_type, d->icode,
13783                                         d->cond, target, exp);
13784
13785     case MIPS_BUILTIN_CMP_ANY:
13786     case MIPS_BUILTIN_CMP_ALL:
13787     case MIPS_BUILTIN_CMP_UPPER:
13788     case MIPS_BUILTIN_CMP_LOWER:
13789     case MIPS_BUILTIN_CMP_SINGLE:
13790       return mips_expand_builtin_compare (d->builtin_type, d->icode,
13791                                           d->cond, target, exp);
13792
13793     case MIPS_BUILTIN_BPOSGE32:
13794       return mips_expand_builtin_bposge (d->builtin_type, target);
13795     }
13796   gcc_unreachable ();
13797 }
13798 \f
13799 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
13800    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
13801 struct mips16_constant {
13802   struct mips16_constant *next;
13803   rtx value;
13804   rtx label;
13805   enum machine_mode mode;
13806 };
13807
13808 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
13809    first constant, HIGHEST_ADDRESS is the highest address that the first
13810    byte of the pool can have, and INSN_ADDRESS is the current instruction
13811    address.  */
13812 struct mips16_constant_pool {
13813   struct mips16_constant *first;
13814   int highest_address;
13815   int insn_address;
13816 };
13817
13818 /* Add constant VALUE to POOL and return its label.  MODE is the
13819    value's mode (used for CONST_INTs, etc.).  */
13820
13821 static rtx
13822 mips16_add_constant (struct mips16_constant_pool *pool,
13823                      rtx value, enum machine_mode mode)
13824 {
13825   struct mips16_constant **p, *c;
13826   bool first_of_size_p;
13827
13828   /* See whether the constant is already in the pool.  If so, return the
13829      existing label, otherwise leave P pointing to the place where the
13830      constant should be added.
13831
13832      Keep the pool sorted in increasing order of mode size so that we can
13833      reduce the number of alignments needed.  */
13834   first_of_size_p = true;
13835   for (p = &pool->first; *p != 0; p = &(*p)->next)
13836     {
13837       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
13838         return (*p)->label;
13839       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
13840         break;
13841       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
13842         first_of_size_p = false;
13843     }
13844
13845   /* In the worst case, the constant needed by the earliest instruction
13846      will end up at the end of the pool.  The entire pool must then be
13847      accessible from that instruction.
13848
13849      When adding the first constant, set the pool's highest address to
13850      the address of the first out-of-range byte.  Adjust this address
13851      downwards each time a new constant is added.  */
13852   if (pool->first == 0)
13853     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
13854        of the instruction with the lowest two bits clear.  The base PC
13855        value for LDPC has the lowest three bits clear.  Assume the worst
13856        case here; namely that the PC-relative instruction occupies the
13857        last 2 bytes in an aligned word.  */
13858     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
13859   pool->highest_address -= GET_MODE_SIZE (mode);
13860   if (first_of_size_p)
13861     /* Take into account the worst possible padding due to alignment.  */
13862     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
13863
13864   /* Create a new entry.  */
13865   c = XNEW (struct mips16_constant);
13866   c->value = value;
13867   c->mode = mode;
13868   c->label = gen_label_rtx ();
13869   c->next = *p;
13870   *p = c;
13871
13872   return c->label;
13873 }
13874
13875 /* Output constant VALUE after instruction INSN and return the last
13876    instruction emitted.  MODE is the mode of the constant.  */
13877
13878 static rtx
13879 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
13880 {
13881   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
13882     {
13883       rtx size = GEN_INT (GET_MODE_SIZE (mode));
13884       return emit_insn_after (gen_consttable_int (value, size), insn);
13885     }
13886
13887   if (SCALAR_FLOAT_MODE_P (mode))
13888     return emit_insn_after (gen_consttable_float (value), insn);
13889
13890   if (VECTOR_MODE_P (mode))
13891     {
13892       int i;
13893
13894       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
13895         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
13896                                         CONST_VECTOR_ELT (value, i), insn);
13897       return insn;
13898     }
13899
13900   gcc_unreachable ();
13901 }
13902
13903 /* Dump out the constants in CONSTANTS after INSN.  */
13904
13905 static void
13906 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
13907 {
13908   struct mips16_constant *c, *next;
13909   int align;
13910
13911   align = 0;
13912   for (c = constants; c != NULL; c = next)
13913     {
13914       /* If necessary, increase the alignment of PC.  */
13915       if (align < GET_MODE_SIZE (c->mode))
13916         {
13917           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
13918           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
13919         }
13920       align = GET_MODE_SIZE (c->mode);
13921
13922       insn = emit_label_after (c->label, insn);
13923       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
13924
13925       next = c->next;
13926       free (c);
13927     }
13928
13929   emit_barrier_after (insn);
13930 }
13931
13932 /* Return the length of instruction INSN.  */
13933
13934 static int
13935 mips16_insn_length (rtx insn)
13936 {
13937   if (JUMP_P (insn))
13938     {
13939       rtx body = PATTERN (insn);
13940       if (GET_CODE (body) == ADDR_VEC)
13941         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
13942       if (GET_CODE (body) == ADDR_DIFF_VEC)
13943         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
13944     }
13945   return get_attr_length (insn);
13946 }
13947
13948 /* If *X is a symbolic constant that refers to the constant pool, add
13949    the constant to POOL and rewrite *X to use the constant's label.  */
13950
13951 static void
13952 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
13953 {
13954   rtx base, offset, label;
13955
13956   split_const (*x, &base, &offset);
13957   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
13958     {
13959       label = mips16_add_constant (pool, get_pool_constant (base),
13960                                    get_pool_mode (base));
13961       base = gen_rtx_LABEL_REF (Pmode, label);
13962       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
13963     }
13964 }
13965
13966 /* This structure is used to communicate with mips16_rewrite_pool_refs.
13967    INSN is the instruction we're rewriting and POOL points to the current
13968    constant pool.  */
13969 struct mips16_rewrite_pool_refs_info {
13970   rtx insn;
13971   struct mips16_constant_pool *pool;
13972 };
13973
13974 /* Rewrite *X so that constant pool references refer to the constant's
13975    label instead.  DATA points to a mips16_rewrite_pool_refs_info
13976    structure.  */
13977
13978 static int
13979 mips16_rewrite_pool_refs (rtx *x, void *data)
13980 {
13981   struct mips16_rewrite_pool_refs_info *info =
13982     (struct mips16_rewrite_pool_refs_info *) data;
13983
13984   if (force_to_mem_operand (*x, Pmode))
13985     {
13986       rtx mem = force_const_mem (GET_MODE (*x), *x);
13987       validate_change (info->insn, x, mem, false);
13988     }
13989
13990   if (MEM_P (*x))
13991     {
13992       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
13993       return -1;
13994     }
13995
13996   /* Don't rewrite the __mips16_rdwr symbol.  */
13997   if (GET_CODE (*x) == UNSPEC && XINT (*x, 1) == UNSPEC_TLS_GET_TP)
13998     return -1;
13999
14000   if (TARGET_MIPS16_TEXT_LOADS)
14001     mips16_rewrite_pool_constant (info->pool, x);
14002
14003   return GET_CODE (*x) == CONST ? -1 : 0;
14004 }
14005
14006 /* Return whether CFG is used in mips_reorg.  */
14007
14008 static bool
14009 mips_cfg_in_reorg (void)
14010 {
14011   return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
14012           || TARGET_RELAX_PIC_CALLS);
14013 }
14014
14015 /* Build MIPS16 constant pools.  */
14016
14017 static void
14018 mips16_lay_out_constants (void)
14019 {
14020   struct mips16_constant_pool pool;
14021   struct mips16_rewrite_pool_refs_info info;
14022   rtx insn, barrier;
14023
14024   if (!TARGET_MIPS16_PCREL_LOADS)
14025     return;
14026
14027   if (mips_cfg_in_reorg ())
14028     split_all_insns ();
14029   else
14030     split_all_insns_noflow ();
14031   barrier = 0;
14032   memset (&pool, 0, sizeof (pool));
14033   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14034     {
14035       /* Rewrite constant pool references in INSN.  */
14036       if (USEFUL_INSN_P (insn))
14037         {
14038           info.insn = insn;
14039           info.pool = &pool;
14040           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
14041         }
14042
14043       pool.insn_address += mips16_insn_length (insn);
14044
14045       if (pool.first != NULL)
14046         {
14047           /* If there are no natural barriers between the first user of
14048              the pool and the highest acceptable address, we'll need to
14049              create a new instruction to jump around the constant pool.
14050              In the worst case, this instruction will be 4 bytes long.
14051
14052              If it's too late to do this transformation after INSN,
14053              do it immediately before INSN.  */
14054           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
14055             {
14056               rtx label, jump;
14057
14058               label = gen_label_rtx ();
14059
14060               jump = emit_jump_insn_before (gen_jump (label), insn);
14061               JUMP_LABEL (jump) = label;
14062               LABEL_NUSES (label) = 1;
14063               barrier = emit_barrier_after (jump);
14064
14065               emit_label_after (label, barrier);
14066               pool.insn_address += 4;
14067             }
14068
14069           /* See whether the constant pool is now out of range of the first
14070              user.  If so, output the constants after the previous barrier.
14071              Note that any instructions between BARRIER and INSN (inclusive)
14072              will use negative offsets to refer to the pool.  */
14073           if (pool.insn_address > pool.highest_address)
14074             {
14075               mips16_emit_constants (pool.first, barrier);
14076               pool.first = NULL;
14077               barrier = 0;
14078             }
14079           else if (BARRIER_P (insn))
14080             barrier = insn;
14081         }
14082     }
14083   mips16_emit_constants (pool.first, get_last_insn ());
14084 }
14085 \f
14086 /* Return true if it is worth r10k_simplify_address's while replacing
14087    an address with X.  We are looking for constants, and for addresses
14088    at a known offset from the incoming stack pointer.  */
14089
14090 static bool
14091 r10k_simplified_address_p (rtx x)
14092 {
14093   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
14094     x = XEXP (x, 0);
14095   return x == virtual_incoming_args_rtx || CONSTANT_P (x);
14096 }
14097
14098 /* X is an expression that appears in INSN.  Try to use the UD chains
14099    to simplify it, returning the simplified form on success and the
14100    original form otherwise.  Replace the incoming value of $sp with
14101    virtual_incoming_args_rtx (which should never occur in X otherwise).  */
14102
14103 static rtx
14104 r10k_simplify_address (rtx x, rtx insn)
14105 {
14106   rtx newx, op0, op1, set, def_insn, note;
14107   df_ref use, def;
14108   struct df_link *defs;
14109
14110   newx = NULL_RTX;
14111   if (UNARY_P (x))
14112     {
14113       op0 = r10k_simplify_address (XEXP (x, 0), insn);
14114       if (op0 != XEXP (x, 0))
14115         newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
14116                                    op0, GET_MODE (XEXP (x, 0)));
14117     }
14118   else if (BINARY_P (x))
14119     {
14120       op0 = r10k_simplify_address (XEXP (x, 0), insn);
14121       op1 = r10k_simplify_address (XEXP (x, 1), insn);
14122       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
14123         newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
14124     }
14125   else if (GET_CODE (x) == LO_SUM)
14126     {
14127       /* LO_SUMs can be offset from HIGHs, if we know they won't
14128          overflow.  See mips_classify_address for the rationale behind
14129          the lax check.  */
14130       op0 = r10k_simplify_address (XEXP (x, 0), insn);
14131       if (GET_CODE (op0) == HIGH)
14132         newx = XEXP (x, 1);
14133     }
14134   else if (REG_P (x))
14135     {
14136       /* Uses are recorded by regno_reg_rtx, not X itself.  */
14137       use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
14138       gcc_assert (use);
14139       defs = DF_REF_CHAIN (use);
14140
14141       /* Require a single definition.  */
14142       if (defs && defs->next == NULL)
14143         {
14144           def = defs->ref;
14145           if (DF_REF_IS_ARTIFICIAL (def))
14146             {
14147               /* Replace the incoming value of $sp with
14148                  virtual_incoming_args_rtx.  */
14149               if (x == stack_pointer_rtx
14150                   && DF_REF_BB (def) == ENTRY_BLOCK_PTR)
14151                 newx = virtual_incoming_args_rtx;
14152             }
14153           else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
14154                                    DF_REF_BB (def)))
14155             {
14156               /* Make sure that DEF_INSN is a single set of REG.  */
14157               def_insn = DF_REF_INSN (def);
14158               if (NONJUMP_INSN_P (def_insn))
14159                 {
14160                   set = single_set (def_insn);
14161                   if (set && rtx_equal_p (SET_DEST (set), x))
14162                     {
14163                       /* Prefer to use notes, since the def-use chains
14164                          are often shorter.  */
14165                       note = find_reg_equal_equiv_note (def_insn);
14166                       if (note)
14167                         newx = XEXP (note, 0);
14168                       else
14169                         newx = SET_SRC (set);
14170                       newx = r10k_simplify_address (newx, def_insn);
14171                     }
14172                 }
14173             }
14174         }
14175     }
14176   if (newx && r10k_simplified_address_p (newx))
14177     return newx;
14178   return x;
14179 }
14180
14181 /* Return true if ADDRESS is known to be an uncached address
14182    on R10K systems.  */
14183
14184 static bool
14185 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
14186 {
14187   unsigned HOST_WIDE_INT upper;
14188
14189   /* Check for KSEG1.  */
14190   if (address + 0x60000000 < 0x20000000)
14191     return true;
14192
14193   /* Check for uncached XKPHYS addresses.  */
14194   if (Pmode == DImode)
14195     {
14196       upper = (address >> 40) & 0xf9ffff;
14197       if (upper == 0x900000 || upper == 0xb80000)
14198         return true;
14199     }
14200   return false;
14201 }
14202
14203 /* Return true if we can prove that an access to address X in instruction
14204    INSN would be safe from R10K speculation.  This X is a general
14205    expression; it might not be a legitimate address.  */
14206
14207 static bool
14208 r10k_safe_address_p (rtx x, rtx insn)
14209 {
14210   rtx base, offset;
14211   HOST_WIDE_INT offset_val;
14212
14213   x = r10k_simplify_address (x, insn);
14214
14215   /* Check for references to the stack frame.  It doesn't really matter
14216      how much of the frame has been allocated at INSN; -mr10k-cache-barrier
14217      allows us to assume that accesses to any part of the eventual frame
14218      is safe from speculation at any point in the function.  */
14219   mips_split_plus (x, &base, &offset_val);
14220   if (base == virtual_incoming_args_rtx
14221       && offset_val >= -cfun->machine->frame.total_size
14222       && offset_val < cfun->machine->frame.args_size)
14223     return true;
14224
14225   /* Check for uncached addresses.  */
14226   if (CONST_INT_P (x))
14227     return r10k_uncached_address_p (INTVAL (x));
14228
14229   /* Check for accesses to a static object.  */
14230   split_const (x, &base, &offset);
14231   return offset_within_block_p (base, INTVAL (offset));
14232 }
14233
14234 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
14235    an in-range access to an automatic variable, or to an object with
14236    a link-time-constant address.  */
14237
14238 static bool
14239 r10k_safe_mem_expr_p (tree expr, HOST_WIDE_INT offset)
14240 {
14241   if (offset < 0 || offset >= int_size_in_bytes (TREE_TYPE (expr)))
14242     return false;
14243
14244   while (TREE_CODE (expr) == COMPONENT_REF)
14245     {
14246       expr = TREE_OPERAND (expr, 0);
14247       if (expr == NULL_TREE)
14248         return false;
14249     }
14250
14251   return DECL_P (expr);
14252 }
14253
14254 /* A for_each_rtx callback for which DATA points to the instruction
14255    containing *X.  Stop the search if we find a MEM that is not safe
14256    from R10K speculation.  */
14257
14258 static int
14259 r10k_needs_protection_p_1 (rtx *loc, void *data)
14260 {
14261   rtx mem;
14262
14263   mem = *loc;
14264   if (!MEM_P (mem))
14265     return 0;
14266
14267   if (MEM_EXPR (mem)
14268       && MEM_OFFSET_KNOWN_P (mem)
14269       && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
14270     return -1;
14271
14272   if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
14273     return -1;
14274
14275   return 1;
14276 }
14277
14278 /* A note_stores callback for which DATA points to an instruction pointer.
14279    If *DATA is nonnull, make it null if it X contains a MEM that is not
14280    safe from R10K speculation.  */
14281
14282 static void
14283 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
14284                                void *data)
14285 {
14286   rtx *insn_ptr;
14287
14288   insn_ptr = (rtx *) data;
14289   if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
14290     *insn_ptr = NULL_RTX;
14291 }
14292
14293 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
14294    Return nonzero if the call is not to a declared function.  */
14295
14296 static int
14297 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
14298 {
14299   rtx x;
14300
14301   x = *loc;
14302   if (!MEM_P (x))
14303     return 0;
14304
14305   x = XEXP (x, 0);
14306   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
14307     return -1;
14308
14309   return 1;
14310 }
14311
14312 /* Return true if instruction INSN needs to be protected by an R10K
14313    cache barrier.  */
14314
14315 static bool
14316 r10k_needs_protection_p (rtx insn)
14317 {
14318   if (CALL_P (insn))
14319     return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
14320
14321   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
14322     {
14323       note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
14324       return insn == NULL_RTX;
14325     }
14326
14327   return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
14328 }
14329
14330 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
14331    edge is unconditional.  */
14332
14333 static bool
14334 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
14335 {
14336   edge_iterator ei;
14337   edge e;
14338
14339   FOR_EACH_EDGE (e, ei, bb->preds)
14340     if (!single_succ_p (e->src)
14341         || !TEST_BIT (protected_bbs, e->src->index)
14342         || (e->flags & EDGE_COMPLEX) != 0)
14343       return false;
14344   return true;
14345 }
14346
14347 /* Implement -mr10k-cache-barrier= for the current function.  */
14348
14349 static void
14350 r10k_insert_cache_barriers (void)
14351 {
14352   int *rev_post_order;
14353   unsigned int i, n;
14354   basic_block bb;
14355   sbitmap protected_bbs;
14356   rtx insn, end, unprotected_region;
14357
14358   if (TARGET_MIPS16)
14359     {
14360       sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
14361       return;
14362     }
14363
14364   /* Calculate dominators.  */
14365   calculate_dominance_info (CDI_DOMINATORS);
14366
14367   /* Bit X of PROTECTED_BBS is set if the last operation in basic block
14368      X is protected by a cache barrier.  */
14369   protected_bbs = sbitmap_alloc (last_basic_block);
14370   sbitmap_zero (protected_bbs);
14371
14372   /* Iterate over the basic blocks in reverse post-order.  */
14373   rev_post_order = XNEWVEC (int, last_basic_block);
14374   n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
14375   for (i = 0; i < n; i++)
14376     {
14377       bb = BASIC_BLOCK (rev_post_order[i]);
14378
14379       /* If this block is only reached by unconditional edges, and if the
14380          source of every edge is protected, the beginning of the block is
14381          also protected.  */
14382       if (r10k_protected_bb_p (bb, protected_bbs))
14383         unprotected_region = NULL_RTX;
14384       else
14385         unprotected_region = pc_rtx;
14386       end = NEXT_INSN (BB_END (bb));
14387
14388       /* UNPROTECTED_REGION is:
14389
14390          - null if we are processing a protected region,
14391          - pc_rtx if we are processing an unprotected region but have
14392            not yet found the first instruction in it
14393          - the first instruction in an unprotected region otherwise.  */
14394       for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
14395         {
14396           if (unprotected_region && USEFUL_INSN_P (insn))
14397             {
14398               if (recog_memoized (insn) == CODE_FOR_mips_cache)
14399                 /* This CACHE instruction protects the following code.  */
14400                 unprotected_region = NULL_RTX;
14401               else
14402                 {
14403                   /* See if INSN is the first instruction in this
14404                      unprotected region.  */
14405                   if (unprotected_region == pc_rtx)
14406                     unprotected_region = insn;
14407
14408                   /* See if INSN needs to be protected.  If so,
14409                      we must insert a cache barrier somewhere between
14410                      PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
14411                      clear which position is better performance-wise,
14412                      but as a tie-breaker, we assume that it is better
14413                      to allow delay slots to be back-filled where
14414                      possible, and that it is better not to insert
14415                      barriers in the middle of already-scheduled code.
14416                      We therefore insert the barrier at the beginning
14417                      of the region.  */
14418                   if (r10k_needs_protection_p (insn))
14419                     {
14420                       emit_insn_before (gen_r10k_cache_barrier (),
14421                                         unprotected_region);
14422                       unprotected_region = NULL_RTX;
14423                     }
14424                 }
14425             }
14426
14427           if (CALL_P (insn))
14428             /* The called function is not required to protect the exit path.
14429                The code that follows a call is therefore unprotected.  */
14430             unprotected_region = pc_rtx;
14431         }
14432
14433       /* Record whether the end of this block is protected.  */
14434       if (unprotected_region == NULL_RTX)
14435         SET_BIT (protected_bbs, bb->index);
14436     }
14437   XDELETEVEC (rev_post_order);
14438
14439   sbitmap_free (protected_bbs);
14440
14441   free_dominance_info (CDI_DOMINATORS);
14442 }
14443 \f
14444 /* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
14445    otherwise.  If INSN has two call rtx, then store the second one in
14446    SECOND_CALL.  */
14447
14448 static rtx
14449 mips_call_expr_from_insn (rtx insn, rtx *second_call)
14450 {
14451   rtx x;
14452   rtx x2;
14453
14454   if (!CALL_P (insn))
14455     return NULL_RTX;
14456
14457   x = PATTERN (insn);
14458   if (GET_CODE (x) == PARALLEL)
14459     {
14460       /* Calls returning complex values have two CALL rtx.  Look for the second
14461          one here, and return it via the SECOND_CALL arg.  */
14462       x2 = XVECEXP (x, 0, 1);
14463       if (GET_CODE (x2) == SET)
14464         x2 = XEXP (x2, 1);
14465       if (GET_CODE (x2) == CALL)
14466         *second_call = x2;
14467
14468       x = XVECEXP (x, 0, 0);
14469     }
14470   if (GET_CODE (x) == SET)
14471     x = XEXP (x, 1);
14472   gcc_assert (GET_CODE (x) == CALL);
14473
14474   return x;
14475 }
14476
14477 /* REG is set in DEF.  See if the definition is one of the ways we load a
14478    register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
14479    If it is, return the symbol reference of the function, otherwise return
14480    NULL_RTX.
14481
14482    If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
14483    the values of source registers, otherwise treat such registers as
14484    having an unknown value.  */
14485
14486 static rtx
14487 mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
14488 {
14489   rtx def_insn, set;
14490
14491   if (DF_REF_IS_ARTIFICIAL (def))
14492     return NULL_RTX;
14493
14494   def_insn = DF_REF_INSN (def);
14495   set = single_set (def_insn);
14496   if (set && rtx_equal_p (SET_DEST (set), reg))
14497     {
14498       rtx note, src, symbol;
14499
14500       /* First, look at REG_EQUAL/EQUIV notes.  */
14501       note = find_reg_equal_equiv_note (def_insn);
14502       if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
14503         return XEXP (note, 0);
14504
14505       /* For %call16 references we don't have REG_EQUAL.  */
14506       src = SET_SRC (set);
14507       symbol = mips_strip_unspec_call (src);
14508       if (symbol)
14509         {
14510           gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14511           return symbol;
14512         }
14513
14514       /* Follow at most one simple register copy.  Such copies are
14515          interesting in cases like:
14516
14517              for (...)
14518                {
14519                  locally_binding_fn (...);
14520                }
14521
14522          and:
14523
14524              locally_binding_fn (...);
14525              ...
14526              locally_binding_fn (...);
14527
14528          where the load of locally_binding_fn can legitimately be
14529          hoisted or shared.  However, we do not expect to see complex
14530          chains of copies, so a full worklist solution to the problem
14531          would probably be overkill.  */
14532       if (recurse_p && REG_P (src))
14533         return mips_find_pic_call_symbol (def_insn, src, false);
14534     }
14535
14536   return NULL_RTX;
14537 }
14538
14539 /* Find the definition of the use of REG in INSN.  See if the definition
14540    is one of the ways we load a register with a symbol address for a
14541    mips_use_pic_fn_addr_reg_p call.  If it is return the symbol reference
14542    of the function, otherwise return NULL_RTX.  RECURSE_P is as for
14543    mips_pic_call_symbol_from_set.  */
14544
14545 static rtx
14546 mips_find_pic_call_symbol (rtx insn, rtx reg, bool recurse_p)
14547 {
14548   df_ref use;
14549   struct df_link *defs;
14550   rtx symbol;
14551
14552   use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
14553   if (!use)
14554     return NULL_RTX;
14555   defs = DF_REF_CHAIN (use);
14556   if (!defs)
14557     return NULL_RTX;
14558   symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
14559   if (!symbol)
14560     return NULL_RTX;
14561
14562   /* If we have more than one definition, they need to be identical.  */
14563   for (defs = defs->next; defs; defs = defs->next)
14564     {
14565       rtx other;
14566
14567       other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
14568       if (!rtx_equal_p (symbol, other))
14569         return NULL_RTX;
14570     }
14571
14572   return symbol;
14573 }
14574
14575 /* Replace the args_size operand of the call expression CALL with the
14576    call-attribute UNSPEC and fill in SYMBOL as the function symbol.  */
14577
14578 static void
14579 mips_annotate_pic_call_expr (rtx call, rtx symbol)
14580 {
14581   rtx args_size;
14582
14583   args_size = XEXP (call, 1);
14584   XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
14585                                    gen_rtvec (2, args_size, symbol),
14586                                    UNSPEC_CALL_ATTR);
14587 }
14588
14589 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression.  See
14590    if instead of the arg_size argument it contains the call attributes.  If
14591    yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
14592    symbol from the call attributes.  Also return false if ARGS_SIZE_OPNO is
14593    -1.  */
14594
14595 bool
14596 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
14597 {
14598   rtx args_size, symbol;
14599
14600   if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
14601     return false;
14602
14603   args_size = operands[args_size_opno];
14604   if (GET_CODE (args_size) != UNSPEC)
14605     return false;
14606   gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
14607
14608   symbol = XVECEXP (args_size, 0, 1);
14609   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14610
14611   operands[args_size_opno] = symbol;
14612   return true;
14613 }
14614
14615 /* Use DF to annotate PIC indirect calls with the function symbol they
14616    dispatch to.  */
14617
14618 static void
14619 mips_annotate_pic_calls (void)
14620 {
14621   basic_block bb;
14622   rtx insn;
14623
14624   FOR_EACH_BB (bb)
14625     FOR_BB_INSNS (bb, insn)
14626     {
14627       rtx call, reg, symbol, second_call;
14628
14629       second_call = 0;
14630       call = mips_call_expr_from_insn (insn, &second_call);
14631       if (!call)
14632         continue;
14633       gcc_assert (MEM_P (XEXP (call, 0)));
14634       reg = XEXP (XEXP (call, 0), 0);
14635       if (!REG_P (reg))
14636         continue;
14637
14638       symbol = mips_find_pic_call_symbol (insn, reg, true);
14639       if (symbol)
14640         {
14641           mips_annotate_pic_call_expr (call, symbol);
14642           if (second_call)
14643             mips_annotate_pic_call_expr (second_call, symbol);
14644         }
14645     }
14646 }
14647 \f
14648 /* A temporary variable used by for_each_rtx callbacks, etc.  */
14649 static rtx mips_sim_insn;
14650
14651 /* A structure representing the state of the processor pipeline.
14652    Used by the mips_sim_* family of functions.  */
14653 struct mips_sim {
14654   /* The maximum number of instructions that can be issued in a cycle.
14655      (Caches mips_issue_rate.)  */
14656   unsigned int issue_rate;
14657
14658   /* The current simulation time.  */
14659   unsigned int time;
14660
14661   /* How many more instructions can be issued in the current cycle.  */
14662   unsigned int insns_left;
14663
14664   /* LAST_SET[X].INSN is the last instruction to set register X.
14665      LAST_SET[X].TIME is the time at which that instruction was issued.
14666      INSN is null if no instruction has yet set register X.  */
14667   struct {
14668     rtx insn;
14669     unsigned int time;
14670   } last_set[FIRST_PSEUDO_REGISTER];
14671
14672   /* The pipeline's current DFA state.  */
14673   state_t dfa_state;
14674 };
14675
14676 /* Reset STATE to the initial simulation state.  */
14677
14678 static void
14679 mips_sim_reset (struct mips_sim *state)
14680 {
14681   state->time = 0;
14682   state->insns_left = state->issue_rate;
14683   memset (&state->last_set, 0, sizeof (state->last_set));
14684   state_reset (state->dfa_state);
14685 }
14686
14687 /* Initialize STATE before its first use.  DFA_STATE points to an
14688    allocated but uninitialized DFA state.  */
14689
14690 static void
14691 mips_sim_init (struct mips_sim *state, state_t dfa_state)
14692 {
14693   state->issue_rate = mips_issue_rate ();
14694   state->dfa_state = dfa_state;
14695   mips_sim_reset (state);
14696 }
14697
14698 /* Advance STATE by one clock cycle.  */
14699
14700 static void
14701 mips_sim_next_cycle (struct mips_sim *state)
14702 {
14703   state->time++;
14704   state->insns_left = state->issue_rate;
14705   state_transition (state->dfa_state, 0);
14706 }
14707
14708 /* Advance simulation state STATE until instruction INSN can read
14709    register REG.  */
14710
14711 static void
14712 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
14713 {
14714   unsigned int regno, end_regno;
14715
14716   end_regno = END_REGNO (reg);
14717   for (regno = REGNO (reg); regno < end_regno; regno++)
14718     if (state->last_set[regno].insn != 0)
14719       {
14720         unsigned int t;
14721
14722         t = (state->last_set[regno].time
14723              + insn_latency (state->last_set[regno].insn, insn));
14724         while (state->time < t)
14725           mips_sim_next_cycle (state);
14726     }
14727 }
14728
14729 /* A for_each_rtx callback.  If *X is a register, advance simulation state
14730    DATA until mips_sim_insn can read the register's value.  */
14731
14732 static int
14733 mips_sim_wait_regs_2 (rtx *x, void *data)
14734 {
14735   if (REG_P (*x))
14736     mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
14737   return 0;
14738 }
14739
14740 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
14741
14742 static void
14743 mips_sim_wait_regs_1 (rtx *x, void *data)
14744 {
14745   for_each_rtx (x, mips_sim_wait_regs_2, data);
14746 }
14747
14748 /* Advance simulation state STATE until all of INSN's register
14749    dependencies are satisfied.  */
14750
14751 static void
14752 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
14753 {
14754   mips_sim_insn = insn;
14755   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
14756 }
14757
14758 /* Advance simulation state STATE until the units required by
14759    instruction INSN are available.  */
14760
14761 static void
14762 mips_sim_wait_units (struct mips_sim *state, rtx insn)
14763 {
14764   state_t tmp_state;
14765
14766   tmp_state = alloca (state_size ());
14767   while (state->insns_left == 0
14768          || (memcpy (tmp_state, state->dfa_state, state_size ()),
14769              state_transition (tmp_state, insn) >= 0))
14770     mips_sim_next_cycle (state);
14771 }
14772
14773 /* Advance simulation state STATE until INSN is ready to issue.  */
14774
14775 static void
14776 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
14777 {
14778   mips_sim_wait_regs (state, insn);
14779   mips_sim_wait_units (state, insn);
14780 }
14781
14782 /* mips_sim_insn has just set X.  Update the LAST_SET array
14783    in simulation state DATA.  */
14784
14785 static void
14786 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
14787 {
14788   struct mips_sim *state;
14789
14790   state = (struct mips_sim *) data;
14791   if (REG_P (x))
14792     {
14793       unsigned int regno, end_regno;
14794
14795       end_regno = END_REGNO (x);
14796       for (regno = REGNO (x); regno < end_regno; regno++)
14797         {
14798           state->last_set[regno].insn = mips_sim_insn;
14799           state->last_set[regno].time = state->time;
14800         }
14801     }
14802 }
14803
14804 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
14805    can issue immediately (i.e., that mips_sim_wait_insn has already
14806    been called).  */
14807
14808 static void
14809 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
14810 {
14811   state_transition (state->dfa_state, insn);
14812   state->insns_left--;
14813
14814   mips_sim_insn = insn;
14815   note_stores (PATTERN (insn), mips_sim_record_set, state);
14816 }
14817
14818 /* Simulate issuing a NOP in state STATE.  */
14819
14820 static void
14821 mips_sim_issue_nop (struct mips_sim *state)
14822 {
14823   if (state->insns_left == 0)
14824     mips_sim_next_cycle (state);
14825   state->insns_left--;
14826 }
14827
14828 /* Update simulation state STATE so that it's ready to accept the instruction
14829    after INSN.  INSN should be part of the main rtl chain, not a member of a
14830    SEQUENCE.  */
14831
14832 static void
14833 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
14834 {
14835   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
14836   if (JUMP_P (insn))
14837     mips_sim_issue_nop (state);
14838
14839   switch (GET_CODE (SEQ_BEGIN (insn)))
14840     {
14841     case CODE_LABEL:
14842     case CALL_INSN:
14843       /* We can't predict the processor state after a call or label.  */
14844       mips_sim_reset (state);
14845       break;
14846
14847     case JUMP_INSN:
14848       /* The delay slots of branch likely instructions are only executed
14849          when the branch is taken.  Therefore, if the caller has simulated
14850          the delay slot instruction, STATE does not really reflect the state
14851          of the pipeline for the instruction after the delay slot.  Also,
14852          branch likely instructions tend to incur a penalty when not taken,
14853          so there will probably be an extra delay between the branch and
14854          the instruction after the delay slot.  */
14855       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
14856         mips_sim_reset (state);
14857       break;
14858
14859     default:
14860       break;
14861     }
14862 }
14863 \f
14864 /* The VR4130 pipeline issues aligned pairs of instructions together,
14865    but it stalls the second instruction if it depends on the first.
14866    In order to cut down the amount of logic required, this dependence
14867    check is not based on a full instruction decode.  Instead, any non-SPECIAL
14868    instruction is assumed to modify the register specified by bits 20-16
14869    (which is usually the "rt" field).
14870
14871    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
14872    input, so we can end up with a false dependence between the branch
14873    and its delay slot.  If this situation occurs in instruction INSN,
14874    try to avoid it by swapping rs and rt.  */
14875
14876 static void
14877 vr4130_avoid_branch_rt_conflict (rtx insn)
14878 {
14879   rtx first, second;
14880
14881   first = SEQ_BEGIN (insn);
14882   second = SEQ_END (insn);
14883   if (JUMP_P (first)
14884       && NONJUMP_INSN_P (second)
14885       && GET_CODE (PATTERN (first)) == SET
14886       && GET_CODE (SET_DEST (PATTERN (first))) == PC
14887       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
14888     {
14889       /* Check for the right kind of condition.  */
14890       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
14891       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
14892           && REG_P (XEXP (cond, 0))
14893           && REG_P (XEXP (cond, 1))
14894           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
14895           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
14896         {
14897           /* SECOND mentions the rt register but not the rs register.  */
14898           rtx tmp = XEXP (cond, 0);
14899           XEXP (cond, 0) = XEXP (cond, 1);
14900           XEXP (cond, 1) = tmp;
14901         }
14902     }
14903 }
14904
14905 /* Implement -mvr4130-align.  Go through each basic block and simulate the
14906    processor pipeline.  If we find that a pair of instructions could execute
14907    in parallel, and the first of those instructions is not 8-byte aligned,
14908    insert a nop to make it aligned.  */
14909
14910 static void
14911 vr4130_align_insns (void)
14912 {
14913   struct mips_sim state;
14914   rtx insn, subinsn, last, last2, next;
14915   bool aligned_p;
14916
14917   dfa_start ();
14918
14919   /* LAST is the last instruction before INSN to have a nonzero length.
14920      LAST2 is the last such instruction before LAST.  */
14921   last = 0;
14922   last2 = 0;
14923
14924   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
14925   aligned_p = true;
14926
14927   mips_sim_init (&state, alloca (state_size ()));
14928   for (insn = get_insns (); insn != 0; insn = next)
14929     {
14930       unsigned int length;
14931
14932       next = NEXT_INSN (insn);
14933
14934       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
14935          This isn't really related to the alignment pass, but we do it on
14936          the fly to avoid a separate instruction walk.  */
14937       vr4130_avoid_branch_rt_conflict (insn);
14938
14939       if (USEFUL_INSN_P (insn))
14940         FOR_EACH_SUBINSN (subinsn, insn)
14941           {
14942             mips_sim_wait_insn (&state, subinsn);
14943
14944             /* If we want this instruction to issue in parallel with the
14945                previous one, make sure that the previous instruction is
14946                aligned.  There are several reasons why this isn't worthwhile
14947                when the second instruction is a call:
14948
14949                   - Calls are less likely to be performance critical,
14950                   - There's a good chance that the delay slot can execute
14951                     in parallel with the call.
14952                   - The return address would then be unaligned.
14953
14954                In general, if we're going to insert a nop between instructions
14955                X and Y, it's better to insert it immediately after X.  That
14956                way, if the nop makes Y aligned, it will also align any labels
14957                between X and Y.  */
14958             if (state.insns_left != state.issue_rate
14959                 && !CALL_P (subinsn))
14960               {
14961                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
14962                   {
14963                     /* SUBINSN is the first instruction in INSN and INSN is
14964                        aligned.  We want to align the previous instruction
14965                        instead, so insert a nop between LAST2 and LAST.
14966
14967                        Note that LAST could be either a single instruction
14968                        or a branch with a delay slot.  In the latter case,
14969                        LAST, like INSN, is already aligned, but the delay
14970                        slot must have some extra delay that stops it from
14971                        issuing at the same time as the branch.  We therefore
14972                        insert a nop before the branch in order to align its
14973                        delay slot.  */
14974                     emit_insn_after (gen_nop (), last2);
14975                     aligned_p = false;
14976                   }
14977                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
14978                   {
14979                     /* SUBINSN is the delay slot of INSN, but INSN is
14980                        currently unaligned.  Insert a nop between
14981                        LAST and INSN to align it.  */
14982                     emit_insn_after (gen_nop (), last);
14983                     aligned_p = true;
14984                   }
14985               }
14986             mips_sim_issue_insn (&state, subinsn);
14987           }
14988       mips_sim_finish_insn (&state, insn);
14989
14990       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
14991       length = get_attr_length (insn);
14992       if (length > 0)
14993         {
14994           /* If the instruction is an asm statement or multi-instruction
14995              mips.md patern, the length is only an estimate.  Insert an
14996              8 byte alignment after it so that the following instructions
14997              can be handled correctly.  */
14998           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
14999               && (recog_memoized (insn) < 0 || length >= 8))
15000             {
15001               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
15002               next = NEXT_INSN (next);
15003               mips_sim_next_cycle (&state);
15004               aligned_p = true;
15005             }
15006           else if (length & 4)
15007             aligned_p = !aligned_p;
15008           last2 = last;
15009           last = insn;
15010         }
15011
15012       /* See whether INSN is an aligned label.  */
15013       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
15014         aligned_p = true;
15015     }
15016   dfa_finish ();
15017 }
15018 \f
15019 /* This structure records that the current function has a LO_SUM
15020    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
15021    the largest offset applied to BASE by all such LO_SUMs.  */
15022 struct mips_lo_sum_offset {
15023   rtx base;
15024   HOST_WIDE_INT offset;
15025 };
15026
15027 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
15028
15029 static hashval_t
15030 mips_hash_base (rtx base)
15031 {
15032   int do_not_record_p;
15033
15034   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
15035 }
15036
15037 /* Hash-table callbacks for mips_lo_sum_offsets.  */
15038
15039 static hashval_t
15040 mips_lo_sum_offset_hash (const void *entry)
15041 {
15042   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
15043 }
15044
15045 static int
15046 mips_lo_sum_offset_eq (const void *entry, const void *value)
15047 {
15048   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
15049                       (const_rtx) value);
15050 }
15051
15052 /* Look up symbolic constant X in HTAB, which is a hash table of
15053    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
15054    paired with a recorded LO_SUM, otherwise record X in the table.  */
15055
15056 static bool
15057 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
15058 {
15059   rtx base, offset;
15060   void **slot;
15061   struct mips_lo_sum_offset *entry;
15062
15063   /* Split X into a base and offset.  */
15064   split_const (x, &base, &offset);
15065   if (UNSPEC_ADDRESS_P (base))
15066     base = UNSPEC_ADDRESS (base);
15067
15068   /* Look up the base in the hash table.  */
15069   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
15070   if (slot == NULL)
15071     return false;
15072
15073   entry = (struct mips_lo_sum_offset *) *slot;
15074   if (option == INSERT)
15075     {
15076       if (entry == NULL)
15077         {
15078           entry = XNEW (struct mips_lo_sum_offset);
15079           entry->base = base;
15080           entry->offset = INTVAL (offset);
15081           *slot = entry;
15082         }
15083       else
15084         {
15085           if (INTVAL (offset) > entry->offset)
15086             entry->offset = INTVAL (offset);
15087         }
15088     }
15089   return INTVAL (offset) <= entry->offset;
15090 }
15091
15092 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
15093    Record every LO_SUM in *LOC.  */
15094
15095 static int
15096 mips_record_lo_sum (rtx *loc, void *data)
15097 {
15098   if (GET_CODE (*loc) == LO_SUM)
15099     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
15100   return 0;
15101 }
15102
15103 /* Return true if INSN is a SET of an orphaned high-part relocation.
15104    HTAB is a hash table of mips_lo_sum_offsets that describes all the
15105    LO_SUMs in the current function.  */
15106
15107 static bool
15108 mips_orphaned_high_part_p (htab_t htab, rtx insn)
15109 {
15110   enum mips_symbol_type type;
15111   rtx x, set;
15112
15113   set = single_set (insn);
15114   if (set)
15115     {
15116       /* Check for %his.  */
15117       x = SET_SRC (set);
15118       if (GET_CODE (x) == HIGH
15119           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
15120         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
15121
15122       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
15123       if (GET_CODE (x) == UNSPEC
15124           && XINT (x, 1) == UNSPEC_LOAD_GOT
15125           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
15126                                        SYMBOL_CONTEXT_LEA, &type)
15127           && type == SYMBOL_GOTOFF_PAGE)
15128         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
15129     }
15130   return false;
15131 }
15132
15133 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
15134    INSN and a previous instruction, avoid it by inserting nops after
15135    instruction AFTER.
15136
15137    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
15138    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
15139    before using the value of that register.  *HILO_DELAY counts the
15140    number of instructions since the last hilo hazard (that is,
15141    the number of instructions since the last MFLO or MFHI).
15142
15143    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
15144    for the next instruction.
15145
15146    LO_REG is an rtx for the LO register, used in dependence checking.  */
15147
15148 static void
15149 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
15150                    rtx *delayed_reg, rtx lo_reg)
15151 {
15152   rtx pattern, set;
15153   int nops, ninsns;
15154
15155   pattern = PATTERN (insn);
15156
15157   /* Do not put the whole function in .set noreorder if it contains
15158      an asm statement.  We don't know whether there will be hazards
15159      between the asm statement and the gcc-generated code.  */
15160   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
15161     cfun->machine->all_noreorder_p = false;
15162
15163   /* Ignore zero-length instructions (barriers and the like).  */
15164   ninsns = get_attr_length (insn) / 4;
15165   if (ninsns == 0)
15166     return;
15167
15168   /* Work out how many nops are needed.  Note that we only care about
15169      registers that are explicitly mentioned in the instruction's pattern.
15170      It doesn't matter that calls use the argument registers or that they
15171      clobber hi and lo.  */
15172   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
15173     nops = 2 - *hilo_delay;
15174   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
15175     nops = 1;
15176   else
15177     nops = 0;
15178
15179   /* Insert the nops between this instruction and the previous one.
15180      Each new nop takes us further from the last hilo hazard.  */
15181   *hilo_delay += nops;
15182   while (nops-- > 0)
15183     emit_insn_after (gen_hazard_nop (), after);
15184
15185   /* Set up the state for the next instruction.  */
15186   *hilo_delay += ninsns;
15187   *delayed_reg = 0;
15188   if (INSN_CODE (insn) >= 0)
15189     switch (get_attr_hazard (insn))
15190       {
15191       case HAZARD_NONE:
15192         break;
15193
15194       case HAZARD_HILO:
15195         *hilo_delay = 0;
15196         break;
15197
15198       case HAZARD_DELAY:
15199         set = single_set (insn);
15200         gcc_assert (set);
15201         *delayed_reg = SET_DEST (set);
15202         break;
15203       }
15204 }
15205
15206 /* Go through the instruction stream and insert nops where necessary.
15207    Also delete any high-part relocations whose partnering low parts
15208    are now all dead.  See if the whole function can then be put into
15209    .set noreorder and .set nomacro.  */
15210
15211 static void
15212 mips_reorg_process_insns (void)
15213 {
15214   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
15215   int hilo_delay;
15216   htab_t htab;
15217
15218   /* Force all instructions to be split into their final form.  */
15219   split_all_insns_noflow ();
15220
15221   /* Recalculate instruction lengths without taking nops into account.  */
15222   cfun->machine->ignore_hazard_length_p = true;
15223   shorten_branches (get_insns ());
15224
15225   cfun->machine->all_noreorder_p = true;
15226
15227   /* We don't track MIPS16 PC-relative offsets closely enough to make
15228      a good job of "set .noreorder" code in MIPS16 mode.  */
15229   if (TARGET_MIPS16)
15230     cfun->machine->all_noreorder_p = false;
15231
15232   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
15233   if (!TARGET_EXPLICIT_RELOCS)
15234     cfun->machine->all_noreorder_p = false;
15235
15236   /* Profiled functions can't be all noreorder because the profiler
15237      support uses assembler macros.  */
15238   if (crtl->profile)
15239     cfun->machine->all_noreorder_p = false;
15240
15241   /* Code compiled with -mfix-vr4120 or -mfix-24k can't be all noreorder
15242      because we rely on the assembler to work around some errata.  */
15243   if (TARGET_FIX_VR4120 || TARGET_FIX_24K)
15244     cfun->machine->all_noreorder_p = false;
15245
15246   /* The same is true for -mfix-vr4130 if we might generate MFLO or
15247      MFHI instructions.  Note that we avoid using MFLO and MFHI if
15248      the VR4130 MACC and DMACC instructions are available instead;
15249      see the *mfhilo_{si,di}_macc patterns.  */
15250   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
15251     cfun->machine->all_noreorder_p = false;
15252
15253   htab = htab_create (37, mips_lo_sum_offset_hash,
15254                       mips_lo_sum_offset_eq, free);
15255
15256   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
15257   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
15258     FOR_EACH_SUBINSN (subinsn, insn)
15259       if (USEFUL_INSN_P (subinsn))
15260         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
15261
15262   last_insn = 0;
15263   hilo_delay = 2;
15264   delayed_reg = 0;
15265   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
15266
15267   /* Make a second pass over the instructions.  Delete orphaned
15268      high-part relocations or turn them into NOPs.  Avoid hazards
15269      by inserting NOPs.  */
15270   for (insn = get_insns (); insn != 0; insn = next_insn)
15271     {
15272       next_insn = NEXT_INSN (insn);
15273       if (USEFUL_INSN_P (insn))
15274         {
15275           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
15276             {
15277               /* If we find an orphaned high-part relocation in a delay
15278                  slot, it's easier to turn that instruction into a NOP than
15279                  to delete it.  The delay slot will be a NOP either way.  */
15280               FOR_EACH_SUBINSN (subinsn, insn)
15281                 if (INSN_P (subinsn))
15282                   {
15283                     if (mips_orphaned_high_part_p (htab, subinsn))
15284                       {
15285                         PATTERN (subinsn) = gen_nop ();
15286                         INSN_CODE (subinsn) = CODE_FOR_nop;
15287                       }
15288                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
15289                                        &delayed_reg, lo_reg);
15290                   }
15291               last_insn = insn;
15292             }
15293           else
15294             {
15295               /* INSN is a single instruction.  Delete it if it's an
15296                  orphaned high-part relocation.  */
15297               if (mips_orphaned_high_part_p (htab, insn))
15298                 delete_insn (insn);
15299               /* Also delete cache barriers if the last instruction
15300                  was an annulled branch.  INSN will not be speculatively
15301                  executed.  */
15302               else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
15303                        && last_insn
15304                        && JUMP_P (SEQ_BEGIN (last_insn))
15305                        && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
15306                 delete_insn (insn);
15307               else
15308                 {
15309                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
15310                                      &delayed_reg, lo_reg);
15311                   last_insn = insn;
15312                 }
15313             }
15314         }
15315     }
15316
15317   htab_delete (htab);
15318 }
15319
15320 /* If we are using a GOT, but have not decided to use a global pointer yet,
15321    see whether we need one to implement long branches.  Convert the ghost
15322    global-pointer instructions into real ones if so.  */
15323
15324 static bool
15325 mips_expand_ghost_gp_insns (void)
15326 {
15327   rtx insn;
15328   int normal_length;
15329
15330   /* Quick exit if we already know that we will or won't need a
15331      global pointer.  */
15332   if (!TARGET_USE_GOT
15333       || cfun->machine->global_pointer == INVALID_REGNUM
15334       || mips_must_initialize_gp_p ())
15335     return false;
15336
15337   shorten_branches (get_insns ());
15338
15339   /* Look for a branch that is longer than normal.  The normal length for
15340      non-MIPS16 branches is 8, because the length includes the delay slot.
15341      It is 4 for MIPS16, because MIPS16 branches are extended instructions,
15342      but they have no delay slot.  */
15343   normal_length = (TARGET_MIPS16 ? 4 : 8);
15344   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15345     if (JUMP_P (insn)
15346         && USEFUL_INSN_P (insn)
15347         && get_attr_length (insn) > normal_length)
15348       break;
15349
15350   if (insn == NULL_RTX)
15351     return false;
15352
15353   /* We've now established that we need $gp.  */
15354   cfun->machine->must_initialize_gp_p = true;
15355   split_all_insns_noflow ();
15356
15357   return true;
15358 }
15359
15360 /* Subroutine of mips_reorg to manage passes that require DF.  */
15361
15362 static void
15363 mips_df_reorg (void)
15364 {
15365   /* Create def-use chains.  */
15366   df_set_flags (DF_EQ_NOTES);
15367   df_chain_add_problem (DF_UD_CHAIN);
15368   df_analyze ();
15369
15370   if (TARGET_RELAX_PIC_CALLS)
15371     mips_annotate_pic_calls ();
15372
15373   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
15374     r10k_insert_cache_barriers ();
15375
15376   df_finish_pass (false);
15377 }
15378
15379 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
15380
15381 static void
15382 mips_reorg (void)
15383 {
15384   /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  Also during
15385      insn splitting in mips16_lay_out_constants, DF insn info is only kept up
15386      to date if the CFG is available.  */
15387   if (mips_cfg_in_reorg ())
15388     compute_bb_for_insn ();
15389   mips16_lay_out_constants ();
15390   if (mips_cfg_in_reorg ())
15391     {
15392       mips_df_reorg ();
15393       free_bb_for_insn ();
15394     }
15395
15396   if (optimize > 0 && flag_delayed_branch)
15397     dbr_schedule (get_insns ());
15398   mips_reorg_process_insns ();
15399   if (!TARGET_MIPS16
15400       && TARGET_EXPLICIT_RELOCS
15401       && TUNE_MIPS4130
15402       && TARGET_VR4130_ALIGN)
15403     vr4130_align_insns ();
15404   if (mips_expand_ghost_gp_insns ())
15405     /* The expansion could invalidate some of the VR4130 alignment
15406        optimizations, but this should be an extremely rare case anyhow.  */
15407     mips_reorg_process_insns ();
15408 }
15409 \f
15410 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
15411    in order to avoid duplicating too much logic from elsewhere.  */
15412
15413 static void
15414 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
15415                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
15416                       tree function)
15417 {
15418   rtx this_rtx, temp1, temp2, insn, fnaddr;
15419   bool use_sibcall_p;
15420
15421   /* Pretend to be a post-reload pass while generating rtl.  */
15422   reload_completed = 1;
15423
15424   /* Mark the end of the (empty) prologue.  */
15425   emit_note (NOTE_INSN_PROLOGUE_END);
15426
15427   /* Determine if we can use a sibcall to call FUNCTION directly.  */
15428   fnaddr = XEXP (DECL_RTL (function), 0);
15429   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
15430                    && const_call_insn_operand (fnaddr, Pmode));
15431
15432   /* Determine if we need to load FNADDR from the GOT.  */
15433   if (!use_sibcall_p
15434       && (mips_got_symbol_type_p
15435           (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
15436     {
15437       /* Pick a global pointer.  Use a call-clobbered register if
15438          TARGET_CALL_SAVED_GP.  */
15439       cfun->machine->global_pointer
15440         = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
15441       cfun->machine->must_initialize_gp_p = true;
15442       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
15443
15444       /* Set up the global pointer for n32 or n64 abicalls.  */
15445       mips_emit_loadgp ();
15446     }
15447
15448   /* We need two temporary registers in some cases.  */
15449   temp1 = gen_rtx_REG (Pmode, 2);
15450   temp2 = gen_rtx_REG (Pmode, 3);
15451
15452   /* Find out which register contains the "this" pointer.  */
15453   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
15454     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
15455   else
15456     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
15457
15458   /* Add DELTA to THIS_RTX.  */
15459   if (delta != 0)
15460     {
15461       rtx offset = GEN_INT (delta);
15462       if (!SMALL_OPERAND (delta))
15463         {
15464           mips_emit_move (temp1, offset);
15465           offset = temp1;
15466         }
15467       emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
15468     }
15469
15470   /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
15471   if (vcall_offset != 0)
15472     {
15473       rtx addr;
15474
15475       /* Set TEMP1 to *THIS_RTX.  */
15476       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
15477
15478       /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
15479       addr = mips_add_offset (temp2, temp1, vcall_offset);
15480
15481       /* Load the offset and add it to THIS_RTX.  */
15482       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
15483       emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
15484     }
15485
15486   /* Jump to the target function.  Use a sibcall if direct jumps are
15487      allowed, otherwise load the address into a register first.  */
15488   if (use_sibcall_p)
15489     {
15490       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
15491       SIBLING_CALL_P (insn) = 1;
15492     }
15493   else
15494     {
15495       /* This is messy.  GAS treats "la $25,foo" as part of a call
15496          sequence and may allow a global "foo" to be lazily bound.
15497          The general move patterns therefore reject this combination.
15498
15499          In this context, lazy binding would actually be OK
15500          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
15501          TARGET_CALL_SAVED_GP; see mips_load_call_address.
15502          We must therefore load the address via a temporary
15503          register if mips_dangerous_for_la25_p.
15504
15505          If we jump to the temporary register rather than $25,
15506          the assembler can use the move insn to fill the jump's
15507          delay slot.
15508
15509          We can use the same technique for MIPS16 code, where $25
15510          is not a valid JR register.  */
15511       if (TARGET_USE_PIC_FN_ADDR_REG
15512           && !TARGET_MIPS16
15513           && !mips_dangerous_for_la25_p (fnaddr))
15514         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
15515       mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
15516
15517       if (TARGET_USE_PIC_FN_ADDR_REG
15518           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
15519         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
15520       emit_jump_insn (gen_indirect_jump (temp1));
15521     }
15522
15523   /* Run just enough of rest_of_compilation.  This sequence was
15524      "borrowed" from alpha.c.  */
15525   insn = get_insns ();
15526   insn_locators_alloc ();
15527   split_all_insns_noflow ();
15528   mips16_lay_out_constants ();
15529   shorten_branches (insn);
15530   final_start_function (insn, file, 1);
15531   final (insn, file, 1);
15532   final_end_function ();
15533
15534   /* Clean up the vars set above.  Note that final_end_function resets
15535      the global pointer for us.  */
15536   reload_completed = 0;
15537 }
15538 \f
15539 /* The last argument passed to mips_set_mips16_mode, or negative if the
15540    function hasn't been called yet.  */
15541 static int was_mips16_p = -1;
15542
15543 /* Set up the target-dependent global state so that it matches the
15544    current function's ISA mode.  */
15545
15546 static void
15547 mips_set_mips16_mode (int mips16_p)
15548 {
15549   if (mips16_p == was_mips16_p)
15550     return;
15551
15552   /* Restore base settings of various flags.  */
15553   target_flags = mips_base_target_flags;
15554   flag_schedule_insns = mips_base_schedule_insns;
15555   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
15556   flag_move_loop_invariants = mips_base_move_loop_invariants;
15557   align_loops = mips_base_align_loops;
15558   align_jumps = mips_base_align_jumps;
15559   align_functions = mips_base_align_functions;
15560
15561   if (mips16_p)
15562     {
15563       /* Switch to MIPS16 mode.  */
15564       target_flags |= MASK_MIPS16;
15565
15566       /* Don't run the scheduler before reload, since it tends to
15567          increase register pressure.  */
15568       flag_schedule_insns = 0;
15569
15570       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
15571          the whole function to be in a single section.  */
15572       flag_reorder_blocks_and_partition = 0;
15573
15574       /* Don't move loop invariants, because it tends to increase
15575          register pressure.  It also introduces an extra move in cases
15576          where the constant is the first operand in a two-operand binary
15577          instruction, or when it forms a register argument to a functon
15578          call.  */
15579       flag_move_loop_invariants = 0;
15580
15581       target_flags |= MASK_EXPLICIT_RELOCS;
15582
15583       /* Experiments suggest we get the best overall section-anchor
15584          results from using the range of an unextended LW or SW.  Code
15585          that makes heavy use of byte or short accesses can do better
15586          with ranges of 0...31 and 0...63 respectively, but most code is
15587          sensitive to the range of LW and SW instead.  */
15588       targetm.min_anchor_offset = 0;
15589       targetm.max_anchor_offset = 127;
15590
15591       targetm.const_anchor = 0;
15592
15593       /* MIPS16 has no BAL instruction.  */
15594       target_flags &= ~MASK_RELAX_PIC_CALLS;
15595
15596       /* The R4000 errata don't apply to any known MIPS16 cores.
15597          It's simpler to make the R4000 fixes and MIPS16 mode
15598          mutually exclusive.  */
15599       target_flags &= ~MASK_FIX_R4000;
15600
15601       if (flag_pic && !TARGET_OLDABI)
15602         sorry ("MIPS16 PIC for ABIs other than o32 and o64");
15603
15604       if (TARGET_XGOT)
15605         sorry ("MIPS16 -mxgot code");
15606
15607       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
15608         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
15609     }
15610   else
15611     {
15612       /* Switch to normal (non-MIPS16) mode.  */
15613       target_flags &= ~MASK_MIPS16;
15614
15615       /* Provide default values for align_* for 64-bit targets.  */
15616       if (TARGET_64BIT)
15617         {
15618           if (align_loops == 0)
15619             align_loops = 8;
15620           if (align_jumps == 0)
15621             align_jumps = 8;
15622           if (align_functions == 0)
15623             align_functions = 8;
15624         }
15625
15626       targetm.min_anchor_offset = -32768;
15627       targetm.max_anchor_offset = 32767;
15628
15629       targetm.const_anchor = 0x8000;
15630     }
15631
15632   /* (Re)initialize MIPS target internals for new ISA.  */
15633   mips_init_relocs ();
15634
15635   if (mips16_p)
15636     {
15637       if (!mips16_globals)
15638         mips16_globals = save_target_globals ();
15639       else
15640         restore_target_globals (mips16_globals);
15641     }
15642   else
15643     restore_target_globals (&default_target_globals);
15644
15645   was_mips16_p = mips16_p;
15646 }
15647
15648 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
15649    function should use the MIPS16 ISA and switch modes accordingly.  */
15650
15651 static void
15652 mips_set_current_function (tree fndecl)
15653 {
15654   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
15655 }
15656 \f
15657 /* Allocate a chunk of memory for per-function machine-dependent data.  */
15658
15659 static struct machine_function *
15660 mips_init_machine_status (void)
15661 {
15662   return ggc_alloc_cleared_machine_function ();
15663 }
15664
15665 /* Return the processor associated with the given ISA level, or null
15666    if the ISA isn't valid.  */
15667
15668 static const struct mips_cpu_info *
15669 mips_cpu_info_from_isa (int isa)
15670 {
15671   unsigned int i;
15672
15673   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15674     if (mips_cpu_info_table[i].isa == isa)
15675       return mips_cpu_info_table + i;
15676
15677   return NULL;
15678 }
15679
15680 /* Return a mips_cpu_info entry determined by an option valued
15681    OPT.  */
15682
15683 static const struct mips_cpu_info *
15684 mips_cpu_info_from_opt (int opt)
15685 {
15686   switch (opt)
15687     {
15688     case MIPS_ARCH_OPTION_FROM_ABI:
15689       /* 'from-abi' selects the most compatible architecture for the
15690          given ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit
15691          ABIs.  For the EABIs, we have to decide whether we're using
15692          the 32-bit or 64-bit version.  */
15693       return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
15694                                      : ABI_NEEDS_64BIT_REGS ? 3
15695                                      : (TARGET_64BIT ? 3 : 1));
15696
15697     case MIPS_ARCH_OPTION_NATIVE:
15698       gcc_unreachable ();
15699
15700     default:
15701       return &mips_cpu_info_table[opt];
15702     }
15703 }
15704
15705 /* Return a default mips_cpu_info entry, given that no -march= option
15706    was explicitly specified.  */
15707
15708 static const struct mips_cpu_info *
15709 mips_default_arch (void)
15710 {
15711 #if defined (MIPS_CPU_STRING_DEFAULT)
15712   unsigned int i;
15713   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15714     if (strcmp (mips_cpu_info_table[i].name, MIPS_CPU_STRING_DEFAULT) == 0)
15715       return mips_cpu_info_table + i;
15716   gcc_unreachable ();
15717 #elif defined (MIPS_ISA_DEFAULT)
15718   return mips_cpu_info_from_isa (MIPS_ISA_DEFAULT);
15719 #else
15720   /* 'from-abi' makes a good default: you get whatever the ABI
15721      requires.  */
15722   return mips_cpu_info_from_opt (MIPS_ARCH_OPTION_FROM_ABI);
15723 #endif
15724 }
15725
15726 /* Set up globals to generate code for the ISA or processor
15727    described by INFO.  */
15728
15729 static void
15730 mips_set_architecture (const struct mips_cpu_info *info)
15731 {
15732   if (info != 0)
15733     {
15734       mips_arch_info = info;
15735       mips_arch = info->cpu;
15736       mips_isa = info->isa;
15737     }
15738 }
15739
15740 /* Likewise for tuning.  */
15741
15742 static void
15743 mips_set_tune (const struct mips_cpu_info *info)
15744 {
15745   if (info != 0)
15746     {
15747       mips_tune_info = info;
15748       mips_tune = info->cpu;
15749     }
15750 }
15751
15752 /* Implement TARGET_OPTION_OVERRIDE.  */
15753
15754 static void
15755 mips_option_override (void)
15756 {
15757   int i, start, regno, mode;
15758
15759   if (global_options_set.x_mips_isa_option)
15760     mips_isa_option_info = &mips_cpu_info_table[mips_isa_option];
15761
15762   /* Process flags as though we were generating non-MIPS16 code.  */
15763   mips_base_mips16 = TARGET_MIPS16;
15764   target_flags &= ~MASK_MIPS16;
15765
15766 #ifdef SUBTARGET_OVERRIDE_OPTIONS
15767   SUBTARGET_OVERRIDE_OPTIONS;
15768 #endif
15769
15770   /* -mno-float overrides -mhard-float and -msoft-float.  */
15771   if (TARGET_NO_FLOAT)
15772     {
15773       target_flags |= MASK_SOFT_FLOAT_ABI;
15774       target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
15775     }
15776
15777   if (TARGET_FLIP_MIPS16)
15778     TARGET_INTERLINK_MIPS16 = 1;
15779
15780   /* Set the small data limit.  */
15781   mips_small_data_threshold = (global_options_set.x_g_switch_value
15782                                ? g_switch_value
15783                                : MIPS_DEFAULT_GVALUE);
15784
15785   /* The following code determines the architecture and register size.
15786      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
15787      The GAS and GCC code should be kept in sync as much as possible.  */
15788
15789   if (global_options_set.x_mips_arch_option)
15790     mips_set_architecture (mips_cpu_info_from_opt (mips_arch_option));
15791
15792   if (mips_isa_option_info != 0)
15793     {
15794       if (mips_arch_info == 0)
15795         mips_set_architecture (mips_isa_option_info);
15796       else if (mips_arch_info->isa != mips_isa_option_info->isa)
15797         error ("%<-%s%> conflicts with the other architecture options, "
15798                "which specify a %s processor",
15799                mips_isa_option_info->name,
15800                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
15801     }
15802
15803   if (mips_arch_info == 0)
15804     mips_set_architecture (mips_default_arch ());
15805
15806   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
15807     error ("%<-march=%s%> is not compatible with the selected ABI",
15808            mips_arch_info->name);
15809
15810   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
15811   if (global_options_set.x_mips_tune_option)
15812     mips_set_tune (mips_cpu_info_from_opt (mips_tune_option));
15813
15814   if (mips_tune_info == 0)
15815     mips_set_tune (mips_arch_info);
15816
15817   if ((target_flags_explicit & MASK_64BIT) != 0)
15818     {
15819       /* The user specified the size of the integer registers.  Make sure
15820          it agrees with the ABI and ISA.  */
15821       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
15822         error ("%<-mgp64%> used with a 32-bit processor");
15823       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
15824         error ("%<-mgp32%> used with a 64-bit ABI");
15825       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
15826         error ("%<-mgp64%> used with a 32-bit ABI");
15827     }
15828   else
15829     {
15830       /* Infer the integer register size from the ABI and processor.
15831          Restrict ourselves to 32-bit registers if that's all the
15832          processor has, or if the ABI cannot handle 64-bit registers.  */
15833       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
15834         target_flags &= ~MASK_64BIT;
15835       else
15836         target_flags |= MASK_64BIT;
15837     }
15838
15839   if ((target_flags_explicit & MASK_FLOAT64) != 0)
15840     {
15841       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
15842         error ("unsupported combination: %s", "-mfp64 -msingle-float");
15843       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
15844         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
15845       else if (!TARGET_64BIT && TARGET_FLOAT64)
15846         {
15847           if (!ISA_HAS_MXHC1)
15848             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
15849                    " the target supports the mfhc1 and mthc1 instructions");
15850           else if (mips_abi != ABI_32)
15851             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
15852                    " the o32 ABI");
15853         }
15854     }
15855   else
15856     {
15857       /* -msingle-float selects 32-bit float registers.  Otherwise the
15858          float registers should be the same size as the integer ones.  */
15859       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
15860         target_flags |= MASK_FLOAT64;
15861       else
15862         target_flags &= ~MASK_FLOAT64;
15863     }
15864
15865   /* End of code shared with GAS.  */
15866
15867   /* If a -mlong* option was given, check that it matches the ABI,
15868      otherwise infer the -mlong* setting from the other options.  */
15869   if ((target_flags_explicit & MASK_LONG64) != 0)
15870     {
15871       if (TARGET_LONG64)
15872         {
15873           if (mips_abi == ABI_N32)
15874             error ("%qs is incompatible with %qs", "-mabi=n32", "-mlong64");
15875           else if (mips_abi == ABI_32)
15876             error ("%qs is incompatible with %qs", "-mabi=32", "-mlong64");
15877           else if (mips_abi == ABI_O64 && TARGET_ABICALLS)
15878             /* We have traditionally allowed non-abicalls code to use
15879                an LP64 form of o64.  However, it would take a bit more
15880                effort to support the combination of 32-bit GOT entries
15881                and 64-bit pointers, so we treat the abicalls case as
15882                an error.  */
15883             error ("the combination of %qs and %qs is incompatible with %qs",
15884                    "-mabi=o64", "-mabicalls", "-mlong64");
15885         }
15886       else
15887         {
15888           if (mips_abi == ABI_64)
15889             error ("%qs is incompatible with %qs", "-mabi=64", "-mlong32");
15890         }
15891     }
15892   else
15893     {
15894       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
15895         target_flags |= MASK_LONG64;
15896       else
15897         target_flags &= ~MASK_LONG64;
15898     }
15899
15900   if (!TARGET_OLDABI)
15901     flag_pcc_struct_return = 0;
15902
15903   /* Decide which rtx_costs structure to use.  */
15904   if (optimize_size)
15905     mips_cost = &mips_rtx_cost_optimize_size;
15906   else
15907     mips_cost = &mips_rtx_cost_data[mips_tune];
15908
15909   /* If the user hasn't specified a branch cost, use the processor's
15910      default.  */
15911   if (mips_branch_cost == 0)
15912     mips_branch_cost = mips_cost->branch_cost;
15913
15914   /* If neither -mbranch-likely nor -mno-branch-likely was given
15915      on the command line, set MASK_BRANCHLIKELY based on the target
15916      architecture and tuning flags.  Annulled delay slots are a
15917      size win, so we only consider the processor-specific tuning
15918      for !optimize_size.  */
15919   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
15920     {
15921       if (ISA_HAS_BRANCHLIKELY
15922           && (optimize_size
15923               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
15924         target_flags |= MASK_BRANCHLIKELY;
15925       else
15926         target_flags &= ~MASK_BRANCHLIKELY;
15927     }
15928   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
15929     warning (0, "the %qs architecture does not support branch-likely"
15930              " instructions", mips_arch_info->name);
15931
15932   /* The effect of -mabicalls isn't defined for the EABI.  */
15933   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
15934     {
15935       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
15936       target_flags &= ~MASK_ABICALLS;
15937     }
15938
15939   if (TARGET_ABICALLS_PIC2)
15940     /* We need to set flag_pic for executables as well as DSOs
15941        because we may reference symbols that are not defined in
15942        the final executable.  (MIPS does not use things like
15943        copy relocs, for example.)
15944
15945        There is a body of code that uses __PIC__ to distinguish
15946        between -mabicalls and -mno-abicalls code.  The non-__PIC__
15947        variant is usually appropriate for TARGET_ABICALLS_PIC0, as
15948        long as any indirect jumps use $25.  */
15949     flag_pic = 1;
15950
15951   /* -mvr4130-align is a "speed over size" optimization: it usually produces
15952      faster code, but at the expense of more nops.  Enable it at -O3 and
15953      above.  */
15954   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
15955     target_flags |= MASK_VR4130_ALIGN;
15956
15957   /* Prefer a call to memcpy over inline code when optimizing for size,
15958      though see MOVE_RATIO in mips.h.  */
15959   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
15960     target_flags |= MASK_MEMCPY;
15961
15962   /* If we have a nonzero small-data limit, check that the -mgpopt
15963      setting is consistent with the other target flags.  */
15964   if (mips_small_data_threshold > 0)
15965     {
15966       if (!TARGET_GPOPT)
15967         {
15968           if (!TARGET_EXPLICIT_RELOCS)
15969             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
15970
15971           TARGET_LOCAL_SDATA = false;
15972           TARGET_EXTERN_SDATA = false;
15973         }
15974       else
15975         {
15976           if (TARGET_VXWORKS_RTP)
15977             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
15978
15979           if (TARGET_ABICALLS)
15980             warning (0, "cannot use small-data accesses for %qs",
15981                      "-mabicalls");
15982         }
15983     }
15984
15985 #ifdef MIPS_TFMODE_FORMAT
15986   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
15987 #endif
15988
15989   /* Make sure that the user didn't turn off paired single support when
15990      MIPS-3D support is requested.  */
15991   if (TARGET_MIPS3D
15992       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
15993       && !TARGET_PAIRED_SINGLE_FLOAT)
15994     error ("%<-mips3d%> requires %<-mpaired-single%>");
15995
15996   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
15997   if (TARGET_MIPS3D)
15998     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
15999
16000   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
16001      and TARGET_HARD_FLOAT_ABI are both true.  */
16002   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
16003     error ("%qs must be used with %qs",
16004            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
16005            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
16006
16007   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
16008      enabled.  */
16009   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
16010     warning (0, "the %qs architecture does not support paired-single"
16011              " instructions", mips_arch_info->name);
16012
16013   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
16014       && !TARGET_CACHE_BUILTIN)
16015     {
16016       error ("%qs requires a target that provides the %qs instruction",
16017              "-mr10k-cache-barrier", "cache");
16018       mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
16019     }
16020
16021   /* If TARGET_DSPR2, enable MASK_DSP.  */
16022   if (TARGET_DSPR2)
16023     target_flags |= MASK_DSP;
16024
16025   /* .eh_frame addresses should be the same width as a C pointer.
16026      Most MIPS ABIs support only one pointer size, so the assembler
16027      will usually know exactly how big an .eh_frame address is.
16028
16029      Unfortunately, this is not true of the 64-bit EABI.  The ABI was
16030      originally defined to use 64-bit pointers (i.e. it is LP64), and
16031      this is still the default mode.  However, we also support an n32-like
16032      ILP32 mode, which is selected by -mlong32.  The problem is that the
16033      assembler has traditionally not had an -mlong option, so it has
16034      traditionally not known whether we're using the ILP32 or LP64 form.
16035
16036      As it happens, gas versions up to and including 2.19 use _32-bit_
16037      addresses for EABI64 .cfi_* directives.  This is wrong for the
16038      default LP64 mode, so we can't use the directives by default.
16039      Moreover, since gas's current behavior is at odds with gcc's
16040      default behavior, it seems unwise to rely on future versions
16041      of gas behaving the same way.  We therefore avoid using .cfi
16042      directives for -mlong32 as well.  */
16043   if (mips_abi == ABI_EABI && TARGET_64BIT)
16044     flag_dwarf2_cfi_asm = 0;
16045
16046   /* .cfi_* directives generate a read-only section, so fall back on
16047      manual .eh_frame creation if we need the section to be writable.  */
16048   if (TARGET_WRITABLE_EH_FRAME)
16049     flag_dwarf2_cfi_asm = 0;
16050
16051   mips_init_print_operand_punct ();
16052
16053   /* Set up array to map GCC register number to debug register number.
16054      Ignore the special purpose register numbers.  */
16055
16056   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
16057     {
16058       mips_dbx_regno[i] = INVALID_REGNUM;
16059       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
16060         mips_dwarf_regno[i] = i;
16061       else
16062         mips_dwarf_regno[i] = INVALID_REGNUM;
16063     }
16064
16065   start = GP_DBX_FIRST - GP_REG_FIRST;
16066   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
16067     mips_dbx_regno[i] = i + start;
16068
16069   start = FP_DBX_FIRST - FP_REG_FIRST;
16070   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
16071     mips_dbx_regno[i] = i + start;
16072
16073   /* Accumulator debug registers use big-endian ordering.  */
16074   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
16075   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
16076   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
16077   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
16078   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
16079     {
16080       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
16081       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
16082     }
16083
16084   /* Set up mips_hard_regno_mode_ok.  */
16085   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
16086     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
16087       mips_hard_regno_mode_ok[mode][regno]
16088         = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
16089
16090   /* Function to allocate machine-dependent function status.  */
16091   init_machine_status = &mips_init_machine_status;
16092
16093   /* Default to working around R4000 errata only if the processor
16094      was selected explicitly.  */
16095   if ((target_flags_explicit & MASK_FIX_R4000) == 0
16096       && strcmp (mips_arch_info->name, "r4000") == 0)
16097     target_flags |= MASK_FIX_R4000;
16098
16099   /* Default to working around R4400 errata only if the processor
16100      was selected explicitly.  */
16101   if ((target_flags_explicit & MASK_FIX_R4400) == 0
16102       && strcmp (mips_arch_info->name, "r4400") == 0)
16103     target_flags |= MASK_FIX_R4400;
16104
16105   /* Default to working around R10000 errata only if the processor
16106      was selected explicitly.  */
16107   if ((target_flags_explicit & MASK_FIX_R10000) == 0
16108       && strcmp (mips_arch_info->name, "r10000") == 0)
16109     target_flags |= MASK_FIX_R10000;
16110
16111   /* Make sure that branch-likely instructions available when using
16112      -mfix-r10000.  The instructions are not available if either:
16113
16114         1. -mno-branch-likely was passed.
16115         2. The selected ISA does not support branch-likely and
16116            the command line does not include -mbranch-likely.  */
16117   if (TARGET_FIX_R10000
16118       && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
16119           ? !ISA_HAS_BRANCHLIKELY
16120           : !TARGET_BRANCHLIKELY))
16121     sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
16122
16123   if (TARGET_SYNCI && !ISA_HAS_SYNCI)
16124     {
16125       warning (0, "the %qs architecture does not support the synci "
16126                "instruction", mips_arch_info->name);
16127       target_flags &= ~MASK_SYNCI;
16128     }
16129
16130   /* Only optimize PIC indirect calls if they are actually required.  */
16131   if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
16132     target_flags &= ~MASK_RELAX_PIC_CALLS;
16133
16134   /* Save base state of options.  */
16135   mips_base_target_flags = target_flags;
16136   mips_base_schedule_insns = flag_schedule_insns;
16137   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
16138   mips_base_move_loop_invariants = flag_move_loop_invariants;
16139   mips_base_align_loops = align_loops;
16140   mips_base_align_jumps = align_jumps;
16141   mips_base_align_functions = align_functions;
16142
16143   /* Now select the ISA mode.
16144
16145      Do all CPP-sensitive stuff in non-MIPS16 mode; we'll switch to
16146      MIPS16 mode afterwards if need be.  */
16147   mips_set_mips16_mode (false);
16148 }
16149
16150 /* Swap the register information for registers I and I + 1, which
16151    currently have the wrong endianness.  Note that the registers'
16152    fixedness and call-clobberedness might have been set on the
16153    command line.  */
16154
16155 static void
16156 mips_swap_registers (unsigned int i)
16157 {
16158   int tmpi;
16159   const char *tmps;
16160
16161 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
16162 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
16163
16164   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
16165   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
16166   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
16167   SWAP_STRING (reg_names[i], reg_names[i + 1]);
16168
16169 #undef SWAP_STRING
16170 #undef SWAP_INT
16171 }
16172
16173 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE.  */
16174
16175 static void
16176 mips_conditional_register_usage (void)
16177 {
16178
16179   if (ISA_HAS_DSP)
16180     {
16181       /* These DSP control register fields are global.  */
16182       global_regs[CCDSP_PO_REGNUM] = 1;
16183       global_regs[CCDSP_SC_REGNUM] = 1;
16184     }
16185   else
16186     AND_COMPL_HARD_REG_SET (accessible_reg_set,
16187                             reg_class_contents[(int) DSP_ACC_REGS]);
16188
16189   if (!TARGET_HARD_FLOAT)
16190     {
16191       AND_COMPL_HARD_REG_SET (accessible_reg_set,
16192                               reg_class_contents[(int) FP_REGS]);
16193       AND_COMPL_HARD_REG_SET (accessible_reg_set,
16194                               reg_class_contents[(int) ST_REGS]);
16195     }
16196   else if (!ISA_HAS_8CC)
16197     {
16198       /* We only have a single condition-code register.  We implement
16199          this by fixing all the condition-code registers and generating
16200          RTL that refers directly to ST_REG_FIRST.  */
16201       AND_COMPL_HARD_REG_SET (accessible_reg_set,
16202                               reg_class_contents[(int) ST_REGS]);
16203       SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
16204       fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
16205     }
16206   if (TARGET_MIPS16)
16207     {
16208       /* In MIPS16 mode, we permit the $t temporary registers to be used
16209          for reload.  We prohibit the unused $s registers, since they
16210          are call-saved, and saving them via a MIPS16 register would
16211          probably waste more time than just reloading the value.  */
16212       fixed_regs[18] = call_used_regs[18] = 1;
16213       fixed_regs[19] = call_used_regs[19] = 1;
16214       fixed_regs[20] = call_used_regs[20] = 1;
16215       fixed_regs[21] = call_used_regs[21] = 1;
16216       fixed_regs[22] = call_used_regs[22] = 1;
16217       fixed_regs[23] = call_used_regs[23] = 1;
16218       fixed_regs[26] = call_used_regs[26] = 1;
16219       fixed_regs[27] = call_used_regs[27] = 1;
16220       fixed_regs[30] = call_used_regs[30] = 1;
16221
16222       /* Do not allow HI and LO to be treated as register operands.
16223          There are no MTHI or MTLO instructions (or any real need
16224          for them) and one-way registers cannot easily be reloaded.  */
16225       AND_COMPL_HARD_REG_SET (operand_reg_set,
16226                               reg_class_contents[(int) MD_REGS]);
16227     }
16228   /* $f20-$f23 are call-clobbered for n64.  */
16229   if (mips_abi == ABI_64)
16230     {
16231       int regno;
16232       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
16233         call_really_used_regs[regno] = call_used_regs[regno] = 1;
16234     }
16235   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
16236      for n32.  */
16237   if (mips_abi == ABI_N32)
16238     {
16239       int regno;
16240       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
16241         call_really_used_regs[regno] = call_used_regs[regno] = 1;
16242     }
16243   /* Make sure that double-register accumulator values are correctly
16244      ordered for the current endianness.  */
16245   if (TARGET_LITTLE_ENDIAN)
16246     {
16247       unsigned int regno;
16248
16249       mips_swap_registers (MD_REG_FIRST);
16250       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
16251         mips_swap_registers (regno);
16252     }
16253 }
16254
16255 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
16256    other registers for instructions for which it is possible.  This
16257    encourages the compiler to use CMP in cases where an XOR would
16258    require some register shuffling.  */
16259
16260 void
16261 mips_order_regs_for_local_alloc (void)
16262 {
16263   int i;
16264
16265   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
16266     reg_alloc_order[i] = i;
16267
16268   if (TARGET_MIPS16)
16269     {
16270       /* It really doesn't matter where we put register 0, since it is
16271          a fixed register anyhow.  */
16272       reg_alloc_order[0] = 24;
16273       reg_alloc_order[24] = 0;
16274     }
16275 }
16276
16277 /* Implement EH_USES.  */
16278
16279 bool
16280 mips_eh_uses (unsigned int regno)
16281 {
16282   if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
16283     {
16284       /* We need to force certain registers to be live in order to handle
16285          PIC long branches correctly.  See mips_must_initialize_gp_p for
16286          details.  */
16287       if (mips_cfun_has_cprestore_slot_p ())
16288         {
16289           if (regno == CPRESTORE_SLOT_REGNUM)
16290             return true;
16291         }
16292       else
16293         {
16294           if (cfun->machine->global_pointer == regno)
16295             return true;
16296         }
16297     }
16298
16299   return false;
16300 }
16301
16302 /* Implement EPILOGUE_USES.  */
16303
16304 bool
16305 mips_epilogue_uses (unsigned int regno)
16306 {
16307   /* Say that the epilogue uses the return address register.  Note that
16308      in the case of sibcalls, the values "used by the epilogue" are
16309      considered live at the start of the called function.  */
16310   if (regno == RETURN_ADDR_REGNUM)
16311     return true;
16312
16313   /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
16314      See the comment above load_call<mode> for details.  */
16315   if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
16316     return true;
16317
16318   /* An interrupt handler must preserve some registers that are
16319      ordinarily call-clobbered.  */
16320   if (cfun->machine->interrupt_handler_p
16321       && mips_interrupt_extra_call_saved_reg_p (regno))
16322     return true;
16323
16324   return false;
16325 }
16326
16327 /* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
16328
16329 static int
16330 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
16331 {
16332   return REG_P (*x) && REGNO (*x) == AT_REGNUM;
16333 }
16334
16335 /* Return true if INSN needs to be wrapped in ".set noat".
16336    INSN has NOPERANDS operands, stored in OPVEC.  */
16337
16338 static bool
16339 mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
16340 {
16341   int i;
16342
16343   if (recog_memoized (insn) >= 0)
16344     for (i = 0; i < noperands; i++)
16345       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
16346         return true;
16347   return false;
16348 }
16349
16350 /* Implement FINAL_PRESCAN_INSN.  */
16351
16352 void
16353 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
16354 {
16355   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
16356     mips_push_asm_switch (&mips_noat);
16357 }
16358
16359 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
16360
16361 static void
16362 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
16363                           rtx *opvec, int noperands)
16364 {
16365   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
16366     mips_pop_asm_switch (&mips_noat);
16367 }
16368
16369 /* Return the function that is used to expand the <u>mulsidi3 pattern.
16370    EXT_CODE is the code of the extension used.  Return NULL if widening
16371    multiplication shouldn't be used.  */
16372
16373 mulsidi3_gen_fn
16374 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
16375 {
16376   bool signed_p;
16377
16378   signed_p = ext_code == SIGN_EXTEND;
16379   if (TARGET_64BIT)
16380     {
16381       /* Don't use widening multiplication with MULT when we have DMUL.  Even
16382          with the extension of its input operands DMUL is faster.  Note that
16383          the extension is not needed for signed multiplication.  In order to
16384          ensure that we always remove the redundant sign-extension in this
16385          case we still expand mulsidi3 for DMUL.  */
16386       if (ISA_HAS_DMUL3)
16387         return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
16388       if (TARGET_MIPS16)
16389         return (signed_p
16390                 ? gen_mulsidi3_64bit_mips16
16391                 : gen_umulsidi3_64bit_mips16);
16392       if (TARGET_FIX_R4000)
16393         return NULL;
16394       return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
16395     }
16396   else
16397     {
16398       if (TARGET_MIPS16)
16399         return (signed_p
16400                 ? gen_mulsidi3_32bit_mips16
16401                 : gen_umulsidi3_32bit_mips16);
16402       if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
16403         return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
16404       return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
16405     }
16406 }
16407 \f
16408 /* Return the size in bytes of the trampoline code, padded to
16409    TRAMPOLINE_ALIGNMENT bits.  The static chain pointer and target
16410    function address immediately follow.  */
16411
16412 int
16413 mips_trampoline_code_size (void)
16414 {
16415   if (TARGET_USE_PIC_FN_ADDR_REG)
16416     return 4 * 4;
16417   else if (ptr_mode == DImode)
16418     return 8 * 4;
16419   else if (ISA_HAS_LOAD_DELAY)
16420     return 6 * 4;
16421   else
16422     return 4 * 4;
16423 }
16424
16425 /* Implement TARGET_TRAMPOLINE_INIT.  */
16426
16427 static void
16428 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
16429 {
16430   rtx addr, end_addr, high, low, opcode, mem;
16431   rtx trampoline[8];
16432   unsigned int i, j;
16433   HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
16434
16435   /* Work out the offsets of the pointers from the start of the
16436      trampoline code.  */
16437   end_addr_offset = mips_trampoline_code_size ();
16438   static_chain_offset = end_addr_offset;
16439   target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
16440
16441   /* Get pointers to the beginning and end of the code block.  */
16442   addr = force_reg (Pmode, XEXP (m_tramp, 0));
16443   end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
16444
16445 #define OP(X) gen_int_mode (X, SImode)
16446
16447   /* Build up the code in TRAMPOLINE.  */
16448   i = 0;
16449   if (TARGET_USE_PIC_FN_ADDR_REG)
16450     {
16451       /* $25 contains the address of the trampoline.  Emit code of the form:
16452
16453              l[wd]    $1, target_function_offset($25)
16454              l[wd]    $static_chain, static_chain_offset($25)
16455              jr       $1
16456              move     $25,$1.  */
16457       trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
16458                                            target_function_offset,
16459                                            PIC_FUNCTION_ADDR_REGNUM));
16460       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16461                                            static_chain_offset,
16462                                            PIC_FUNCTION_ADDR_REGNUM));
16463       trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
16464       trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
16465     }
16466   else if (ptr_mode == DImode)
16467     {
16468       /* It's too cumbersome to create the full 64-bit address, so let's
16469          instead use:
16470
16471              move    $1, $31
16472              bal     1f
16473              nop
16474          1:  l[wd]   $25, target_function_offset - 12($31)
16475              l[wd]   $static_chain, static_chain_offset - 12($31)
16476              jr      $25
16477              move    $31, $1
16478
16479         where 12 is the offset of "1:" from the start of the code block.  */
16480       trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
16481       trampoline[i++] = OP (MIPS_BAL (1));
16482       trampoline[i++] = OP (MIPS_NOP);
16483       trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16484                                            target_function_offset - 12,
16485                                            RETURN_ADDR_REGNUM));
16486       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16487                                            static_chain_offset - 12,
16488                                            RETURN_ADDR_REGNUM));
16489       trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16490       trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
16491     }
16492   else
16493     {
16494       /* If the target has load delays, emit:
16495
16496              lui     $1, %hi(end_addr)
16497              lw      $25, %lo(end_addr + ...)($1)
16498              lw      $static_chain, %lo(end_addr + ...)($1)
16499              jr      $25
16500              nop
16501
16502          Otherwise emit:
16503
16504              lui     $1, %hi(end_addr)
16505              lw      $25, %lo(end_addr + ...)($1)
16506              jr      $25
16507              lw      $static_chain, %lo(end_addr + ...)($1).  */
16508
16509       /* Split END_ADDR into %hi and %lo values.  Trampolines are aligned
16510          to 64 bits, so the %lo value will have the bottom 3 bits clear.  */
16511       high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
16512                                   NULL, false, OPTAB_WIDEN);
16513       high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
16514                                   NULL, false, OPTAB_WIDEN);
16515       low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
16516
16517       /* Emit the LUI.  */
16518       opcode = OP (MIPS_LUI (AT_REGNUM, 0));
16519       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
16520                                              NULL, false, OPTAB_WIDEN);
16521
16522       /* Emit the load of the target function.  */
16523       opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16524                                   target_function_offset - end_addr_offset,
16525                                   AT_REGNUM));
16526       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16527                                              NULL, false, OPTAB_WIDEN);
16528
16529       /* Emit the JR here, if we can.  */
16530       if (!ISA_HAS_LOAD_DELAY)
16531         trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16532
16533       /* Emit the load of the static chain register.  */
16534       opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16535                                   static_chain_offset - end_addr_offset,
16536                                   AT_REGNUM));
16537       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16538                                              NULL, false, OPTAB_WIDEN);
16539
16540       /* Emit the JR, if we couldn't above.  */
16541       if (ISA_HAS_LOAD_DELAY)
16542         {
16543           trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16544           trampoline[i++] = OP (MIPS_NOP);
16545         }
16546     }
16547
16548 #undef OP
16549
16550   /* Copy the trampoline code.  Leave any padding uninitialized.  */
16551   for (j = 0; j < i; j++)
16552     {
16553       mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
16554       mips_emit_move (mem, trampoline[j]);
16555     }
16556
16557   /* Set up the static chain pointer field.  */
16558   mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
16559   mips_emit_move (mem, chain_value);
16560
16561   /* Set up the target function field.  */
16562   mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
16563   mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
16564
16565   /* Flush the code part of the trampoline.  */
16566   emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
16567   emit_insn (gen_clear_cache (addr, end_addr));
16568 }
16569
16570 /* Implement FUNCTION_PROFILER.  */
16571
16572 void mips_function_profiler (FILE *file)
16573 {
16574   if (TARGET_MIPS16)
16575     sorry ("mips16 function profiling");
16576   if (TARGET_LONG_CALLS)
16577     {
16578       /* For TARGET_LONG_CALLS use $3 for the address of _mcount.  */
16579       if (Pmode == DImode)
16580         fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
16581       else
16582         fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
16583     }
16584   mips_push_asm_switch (&mips_noat);
16585   fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
16586            reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
16587   /* _mcount treats $2 as the static chain register.  */
16588   if (cfun->static_chain_decl != NULL)
16589     fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
16590              reg_names[STATIC_CHAIN_REGNUM]);
16591   if (TARGET_MCOUNT_RA_ADDRESS)
16592     {
16593       /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
16594          ra save location.  */
16595       if (cfun->machine->frame.ra_fp_offset == 0)
16596         /* ra not saved, pass zero.  */
16597         fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
16598       else
16599         fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
16600                  Pmode == DImode ? "dla" : "la", reg_names[12],
16601                  cfun->machine->frame.ra_fp_offset,
16602                  reg_names[STACK_POINTER_REGNUM]);
16603     }
16604   if (!TARGET_NEWABI)
16605     fprintf (file,
16606              "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from  stack\n",
16607              TARGET_64BIT ? "dsubu" : "subu",
16608              reg_names[STACK_POINTER_REGNUM],
16609              reg_names[STACK_POINTER_REGNUM],
16610              Pmode == DImode ? 16 : 8);
16611
16612   if (TARGET_LONG_CALLS)
16613     fprintf (file, "\tjalr\t%s\n", reg_names[3]);
16614   else
16615     fprintf (file, "\tjal\t_mcount\n");
16616   mips_pop_asm_switch (&mips_noat);
16617   /* _mcount treats $2 as the static chain register.  */
16618   if (cfun->static_chain_decl != NULL)
16619     fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
16620              reg_names[2]);
16621 }
16622
16623 /* Implement TARGET_SHIFT_TRUNCATION_MASK.  We want to keep the default
16624    behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
16625    when TARGET_LOONGSON_VECTORS is true.  */
16626
16627 static unsigned HOST_WIDE_INT
16628 mips_shift_truncation_mask (enum machine_mode mode)
16629 {
16630   if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
16631     return 0;
16632
16633   return GET_MODE_BITSIZE (mode) - 1;
16634 }
16635
16636 /* Implement TARGET_PREPARE_PCH_SAVE.  */
16637
16638 static void
16639 mips_prepare_pch_save (void)
16640 {
16641   /* We are called in a context where the current MIPS16 vs. non-MIPS16
16642      setting should be irrelevant.  The question then is: which setting
16643      makes most sense at load time?
16644
16645      The PCH is loaded before the first token is read.  We should never
16646      have switched into MIPS16 mode by that point, and thus should not
16647      have populated mips16_globals.  Nor can we load the entire contents
16648      of mips16_globals from the PCH file, because mips16_globals contains
16649      a combination of GGC and non-GGC data.
16650
16651      There is therefore no point in trying save the GGC part of
16652      mips16_globals to the PCH file, or to preserve MIPS16ness across
16653      the PCH save and load.  The loading compiler would not have access
16654      to the non-GGC parts of mips16_globals (either from the PCH file,
16655      or from a copy that the loading compiler generated itself) and would
16656      have to call target_reinit anyway.
16657
16658      It therefore seems best to switch back to non-MIPS16 mode at
16659      save time, and to ensure that mips16_globals remains null after
16660      a PCH load.  */
16661   mips_set_mips16_mode (false);
16662   mips16_globals = 0;
16663 }
16664 \f
16665 /* Generate or test for an insn that supports a constant permutation.  */
16666
16667 #define MAX_VECT_LEN 8
16668
16669 struct expand_vec_perm_d
16670 {
16671   rtx target, op0, op1;
16672   unsigned char perm[MAX_VECT_LEN];
16673   enum machine_mode vmode;
16674   unsigned char nelt;
16675   bool one_vector_p;
16676   bool testing_p;
16677 };
16678
16679 /* Construct (set target (vec_select op0 (parallel perm))) and
16680    return true if that's a valid instruction in the active ISA.  */
16681
16682 static bool
16683 mips_expand_vselect (rtx target, rtx op0,
16684                      const unsigned char *perm, unsigned nelt)
16685 {
16686   rtx rperm[MAX_VECT_LEN], x;
16687   unsigned i;
16688
16689   for (i = 0; i < nelt; ++i)
16690     rperm[i] = GEN_INT (perm[i]);
16691
16692   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
16693   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
16694   x = gen_rtx_SET (VOIDmode, target, x);
16695
16696   x = emit_insn (x);
16697   if (recog_memoized (x) < 0)
16698     {
16699       remove_insn (x);
16700       return false;
16701     }
16702   return true;
16703 }
16704
16705 /* Similar, but generate a vec_concat from op0 and op1 as well.  */
16706
16707 static bool
16708 mips_expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
16709                              const unsigned char *perm, unsigned nelt)
16710 {
16711   enum machine_mode v2mode;
16712   rtx x;
16713
16714   v2mode = GET_MODE_2XWIDER_MODE (GET_MODE (op0));
16715   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
16716   return mips_expand_vselect (target, x, perm, nelt);
16717 }
16718
16719 /* Recognize patterns for even-odd extraction.  */
16720
16721 static bool
16722 mips_expand_vpc_loongson_even_odd (struct expand_vec_perm_d *d)
16723 {
16724   unsigned i, odd, nelt = d->nelt;
16725   rtx t0, t1, t2, t3;
16726
16727   if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
16728     return false;
16729   /* Even-odd for V2SI/V2SFmode is matched by interleave directly.  */
16730   if (nelt < 4)
16731     return false;
16732
16733   odd = d->perm[0];
16734   if (odd > 1)
16735     return false;
16736   for (i = 1; i < nelt; ++i)
16737     if (d->perm[i] != i * 2 + odd)
16738       return false;
16739
16740   if (d->testing_p)
16741     return true;
16742
16743   /* We need 2*log2(N)-1 operations to achieve odd/even with interleave. */
16744   t0 = gen_reg_rtx (d->vmode);
16745   t1 = gen_reg_rtx (d->vmode);
16746   switch (d->vmode)
16747     {
16748     case V4HImode:
16749       emit_insn (gen_loongson_punpckhhw (t0, d->op0, d->op1));
16750       emit_insn (gen_loongson_punpcklhw (t1, d->op0, d->op1));
16751       if (odd)
16752         emit_insn (gen_loongson_punpckhhw (d->target, t1, t0));
16753       else
16754         emit_insn (gen_loongson_punpcklhw (d->target, t1, t0));
16755       break;
16756
16757     case V8QImode:
16758       t2 = gen_reg_rtx (d->vmode);
16759       t3 = gen_reg_rtx (d->vmode);
16760       emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op1));
16761       emit_insn (gen_loongson_punpcklbh (t1, d->op0, d->op1));
16762       emit_insn (gen_loongson_punpckhbh (t2, t1, t0));
16763       emit_insn (gen_loongson_punpcklbh (t3, t1, t0));
16764       if (odd)
16765         emit_insn (gen_loongson_punpckhbh (d->target, t3, t2));
16766       else
16767         emit_insn (gen_loongson_punpcklbh (d->target, t3, t2));
16768       break;
16769
16770     default:
16771       gcc_unreachable ();
16772     }
16773   return true;
16774 }
16775
16776 /* Recognize patterns for the Loongson PSHUFH instruction.  */
16777
16778 static bool
16779 mips_expand_vpc_loongson_pshufh (struct expand_vec_perm_d *d)
16780 {
16781   unsigned i, mask;
16782   rtx rmask;
16783
16784   if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
16785     return false;
16786   if (d->vmode != V4HImode)
16787     return false;
16788   if (d->testing_p)
16789     return true;
16790
16791   /* Convert the selector into the packed 8-bit form for pshufh.  */
16792   /* Recall that loongson is little-endian only.  No big-endian
16793      adjustment required.  */
16794   for (i = mask = 0; i < 4; i++)
16795     mask |= (d->perm[i] & 3) << (i * 2);
16796   rmask = force_reg (SImode, GEN_INT (mask));
16797
16798   if (d->one_vector_p)
16799     emit_insn (gen_loongson_pshufh (d->target, d->op0, rmask));
16800   else
16801     {
16802       rtx t0, t1, x, merge, rmerge[4];
16803
16804       t0 = gen_reg_rtx (V4HImode);
16805       t1 = gen_reg_rtx (V4HImode);
16806       emit_insn (gen_loongson_pshufh (t1, d->op1, rmask));
16807       emit_insn (gen_loongson_pshufh (t0, d->op0, rmask));
16808
16809       for (i = 0; i < 4; ++i)
16810         rmerge[i] = (d->perm[i] & 4 ? constm1_rtx : const0_rtx);
16811       merge = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmerge));
16812       merge = force_reg (V4HImode, merge);
16813
16814       x = gen_rtx_AND (V4HImode, merge, t1);
16815       emit_insn (gen_rtx_SET (VOIDmode, t1, x));
16816
16817       x = gen_rtx_NOT (V4HImode, merge);
16818       x = gen_rtx_AND (V4HImode, x, t0);
16819       emit_insn (gen_rtx_SET (VOIDmode, t0, x));
16820
16821       x = gen_rtx_IOR (V4HImode, t0, t1);
16822       emit_insn (gen_rtx_SET (VOIDmode, d->target, x));
16823     }
16824
16825   return true;
16826 }
16827
16828 /* Recognize broadcast patterns for the Loongson.  */
16829
16830 static bool
16831 mips_expand_vpc_loongson_bcast (struct expand_vec_perm_d *d)
16832 {
16833   unsigned i, elt;
16834   rtx t0, t1;
16835
16836   if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
16837     return false;
16838   /* Note that we've already matched V2SI via punpck and V4HI via pshufh.  */
16839   if (d->vmode != V8QImode)
16840     return false;
16841   if (!d->one_vector_p)
16842     return false;
16843
16844   elt = d->perm[0];
16845   for (i = 1; i < 8; ++i)
16846     if (d->perm[i] != elt)
16847       return false;
16848
16849   if (d->testing_p)
16850     return true;
16851
16852   /* With one interleave we put two of the desired element adjacent.  */
16853   t0 = gen_reg_rtx (V8QImode);
16854   if (elt < 4)
16855     emit_insn (gen_loongson_punpcklbh (t0, d->op0, d->op0));
16856   else
16857     emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op0));
16858
16859   /* Shuffle that one HImode element into all locations.  */
16860   elt &= 3;
16861   elt *= 0x55;
16862   t1 = gen_reg_rtx (V4HImode);
16863   emit_insn (gen_loongson_pshufh (t1, gen_lowpart (V4HImode, t0),
16864                                   force_reg (SImode, GEN_INT (elt))));
16865
16866   emit_move_insn (d->target, gen_lowpart (V8QImode, t1));
16867   return true;
16868 }
16869
16870 static bool
16871 mips_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
16872 {
16873   unsigned int i, nelt = d->nelt;
16874   unsigned char perm2[MAX_VECT_LEN];
16875
16876   if (d->one_vector_p)
16877     {
16878       /* Try interleave with alternating operands.  */
16879       memcpy (perm2, d->perm, sizeof(perm2));
16880       for (i = 1; i < nelt; i += 2)
16881         perm2[i] += nelt;
16882       if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1, perm2, nelt))
16883         return true;
16884     }
16885   else
16886     {
16887       if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1,
16888                                        d->perm, nelt))
16889         return true;
16890
16891       /* Try again with swapped operands.  */
16892       for (i = 0; i < nelt; ++i)
16893         perm2[i] = (d->perm[i] + nelt) & (2 * nelt - 1);
16894       if (mips_expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
16895         return true;
16896     }
16897
16898   if (mips_expand_vpc_loongson_even_odd (d))
16899     return true;
16900   if (mips_expand_vpc_loongson_pshufh (d))
16901     return true;
16902   if (mips_expand_vpc_loongson_bcast (d))
16903     return true;
16904   return false;
16905 }
16906
16907 /* Expand a vec_perm_const pattern.  */
16908
16909 bool
16910 mips_expand_vec_perm_const (rtx operands[4])
16911 {
16912   struct expand_vec_perm_d d;
16913   int i, nelt, which;
16914   unsigned char orig_perm[MAX_VECT_LEN];
16915   rtx sel;
16916   bool ok;
16917
16918   d.target = operands[0];
16919   d.op0 = operands[1];
16920   d.op1 = operands[2];
16921   sel = operands[3];
16922
16923   d.vmode = GET_MODE (d.target);
16924   gcc_assert (VECTOR_MODE_P (d.vmode));
16925   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
16926   d.testing_p = false;
16927
16928   for (i = which = 0; i < nelt; ++i)
16929     {
16930       rtx e = XVECEXP (sel, 0, i);
16931       int ei = INTVAL (e) & (2 * nelt - 1);
16932       which |= (ei < nelt ? 1 : 2);
16933       orig_perm[i] = ei;
16934     }
16935   memcpy (d.perm, orig_perm, MAX_VECT_LEN);
16936
16937   switch (which)
16938     {
16939     default:
16940       gcc_unreachable();
16941
16942     case 3:
16943       d.one_vector_p = false;
16944       if (!rtx_equal_p (d.op0, d.op1))
16945         break;
16946       /* FALLTHRU */
16947
16948     case 2:
16949       for (i = 0; i < nelt; ++i)
16950         d.perm[i] &= nelt - 1;
16951       d.op0 = d.op1;
16952       d.one_vector_p = true;
16953       break;
16954
16955     case 1:
16956       d.op1 = d.op0;
16957       d.one_vector_p = true;
16958       break;
16959     }
16960
16961   ok = mips_expand_vec_perm_const_1 (&d);
16962
16963   /* If we were given a two-vector permutation which just happened to
16964      have both input vectors equal, we folded this into a one-vector
16965      permutation.  There are several loongson patterns that are matched
16966      via direct vec_select+vec_concat expansion, but we do not have
16967      support in mips_expand_vec_perm_const_1 to guess the adjustment
16968      that should be made for a single operand.  Just try again with
16969      the original permutation.  */
16970   if (!ok && which == 3)
16971     {
16972       d.op0 = operands[1];
16973       d.op1 = operands[2];
16974       d.one_vector_p = false;
16975       memcpy (d.perm, orig_perm, MAX_VECT_LEN);
16976       ok = mips_expand_vec_perm_const_1 (&d);
16977     }
16978
16979   return ok;
16980 }
16981
16982 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST_OK.  */
16983
16984 static bool
16985 mips_vectorize_vec_perm_const_ok (enum machine_mode vmode,
16986                                   const unsigned char *sel)
16987 {
16988   struct expand_vec_perm_d d;
16989   unsigned int i, nelt, which;
16990   bool ret;
16991
16992   d.vmode = vmode;
16993   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
16994   d.testing_p = true;
16995   memcpy (d.perm, sel, nelt);
16996
16997   /* Categorize the set of elements in the selector.  */
16998   for (i = which = 0; i < nelt; ++i)
16999     {
17000       unsigned char e = d.perm[i];
17001       gcc_assert (e < 2 * nelt);
17002       which |= (e < nelt ? 1 : 2);
17003     }
17004
17005   /* For all elements from second vector, fold the elements to first.  */
17006   if (which == 2)
17007     for (i = 0; i < nelt; ++i)
17008       d.perm[i] -= nelt;
17009
17010   /* Check whether the mask can be applied to the vector type.  */
17011   d.one_vector_p = (which != 3);
17012
17013   d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
17014   d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
17015   if (!d.one_vector_p)
17016     d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
17017
17018   start_sequence ();
17019   ret = mips_expand_vec_perm_const_1 (&d);
17020   end_sequence ();
17021
17022   return ret;
17023 }
17024
17025 /* Expand an integral vector unpack operation.  */
17026
17027 void
17028 mips_expand_vec_unpack (rtx operands[2], bool unsigned_p, bool high_p)
17029 {
17030   enum machine_mode imode = GET_MODE (operands[1]);
17031   rtx (*unpack) (rtx, rtx, rtx);
17032   rtx (*cmpgt) (rtx, rtx, rtx);
17033   rtx tmp, dest, zero;
17034
17035   switch (imode)
17036     {
17037     case V8QImode:
17038       if (high_p)
17039         unpack = gen_loongson_punpckhbh;
17040       else
17041         unpack = gen_loongson_punpcklbh;
17042       cmpgt = gen_loongson_pcmpgtb;
17043       break;
17044     case V4HImode:
17045       if (high_p)
17046         unpack = gen_loongson_punpckhhw;
17047       else
17048         unpack = gen_loongson_punpcklhw;
17049       cmpgt = gen_loongson_pcmpgth;
17050       break;
17051     default:
17052       gcc_unreachable ();
17053     }
17054
17055   zero = force_reg (imode, CONST0_RTX (imode));
17056   if (unsigned_p)
17057     tmp = zero;
17058   else
17059     {
17060       tmp = gen_reg_rtx (imode);
17061       emit_insn (cmpgt (tmp, zero, operands[1]));
17062     }
17063
17064   dest = gen_reg_rtx (imode);
17065   emit_insn (unpack (dest, operands[1], tmp));
17066
17067   emit_move_insn (operands[0], gen_lowpart (GET_MODE (operands[0]), dest));
17068 }
17069
17070 /* A subroutine of mips_expand_vec_init, match constant vector elements.  */
17071
17072 static inline bool
17073 mips_constant_elt_p (rtx x)
17074 {
17075   return CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE;
17076 }
17077
17078 /* A subroutine of mips_expand_vec_init, expand via broadcast.  */
17079
17080 static void
17081 mips_expand_vi_broadcast (enum machine_mode vmode, rtx target, rtx elt)
17082 {
17083   struct expand_vec_perm_d d;
17084   rtx t1;
17085   bool ok;
17086
17087   if (elt != const0_rtx)
17088     elt = force_reg (GET_MODE_INNER (vmode), elt);
17089   if (REG_P (elt))
17090     elt = gen_lowpart (DImode, elt);
17091
17092   t1 = gen_reg_rtx (vmode);
17093   switch (vmode)
17094     {
17095     case V8QImode:
17096       emit_insn (gen_loongson_vec_init1_v8qi (t1, elt));
17097       break;
17098     case V4HImode:
17099       emit_insn (gen_loongson_vec_init1_v4hi (t1, elt));
17100       break;
17101     default:
17102       gcc_unreachable ();
17103     }
17104
17105   memset (&d, 0, sizeof (d));
17106   d.target = target;
17107   d.op0 = t1;
17108   d.op1 = t1;
17109   d.vmode = vmode;
17110   d.nelt = GET_MODE_NUNITS (vmode);
17111   d.one_vector_p = true;
17112
17113   ok = mips_expand_vec_perm_const_1 (&d);
17114   gcc_assert (ok);
17115 }
17116
17117 /* A subroutine of mips_expand_vec_init, replacing all of the non-constant
17118    elements of VALS with zeros, copy the constant vector to TARGET.  */
17119
17120 static void
17121 mips_expand_vi_constant (enum machine_mode vmode, unsigned nelt,
17122                          rtx target, rtx vals)
17123 {
17124   rtvec vec = shallow_copy_rtvec (XVEC (vals, 0));
17125   unsigned i;
17126
17127   for (i = 0; i < nelt; ++i)
17128     {
17129       if (!mips_constant_elt_p (RTVEC_ELT (vec, i)))
17130         RTVEC_ELT (vec, i) = const0_rtx;
17131     }
17132
17133   emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, vec));
17134 }
17135
17136
17137 /* A subroutine of mips_expand_vec_init, expand via pinsrh.  */
17138
17139 static void
17140 mips_expand_vi_loongson_one_pinsrh (rtx target, rtx vals, unsigned one_var)
17141 {
17142   mips_expand_vi_constant (V4HImode, 4, target, vals);
17143
17144   emit_insn (gen_vec_setv4hi (target, target, XVECEXP (vals, 0, one_var),
17145                               GEN_INT (one_var)));
17146 }
17147
17148 /* A subroutine of mips_expand_vec_init, expand anything via memory.  */
17149
17150 static void
17151 mips_expand_vi_general (enum machine_mode vmode, enum machine_mode imode,
17152                         unsigned nelt, unsigned nvar, rtx target, rtx vals)
17153 {
17154   rtx mem = assign_stack_temp (vmode, GET_MODE_SIZE (vmode), 0);
17155   unsigned int i, isize = GET_MODE_SIZE (imode);
17156
17157   if (nvar < nelt)
17158     mips_expand_vi_constant (vmode, nelt, mem, vals);
17159
17160   for (i = 0; i < nelt; ++i)
17161     {
17162       rtx x = XVECEXP (vals, 0, i);
17163       if (!mips_constant_elt_p (x))
17164         emit_move_insn (adjust_address (mem, imode, i * isize), x);
17165     }
17166
17167   emit_move_insn (target, mem);
17168 }
17169
17170 /* Expand a vector initialization.  */
17171
17172 void
17173 mips_expand_vector_init (rtx target, rtx vals)
17174 {
17175   enum machine_mode vmode = GET_MODE (target);
17176   enum machine_mode imode = GET_MODE_INNER (vmode);
17177   unsigned i, nelt = GET_MODE_NUNITS (vmode);
17178   unsigned nvar = 0, one_var = -1u;
17179   bool all_same = true;
17180   rtx x;
17181
17182   for (i = 0; i < nelt; ++i)
17183     {
17184       x = XVECEXP (vals, 0, i);
17185       if (!mips_constant_elt_p (x))
17186         nvar++, one_var = i;
17187       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
17188         all_same = false;
17189     }
17190
17191   /* Load constants from the pool, or whatever's handy.  */
17192   if (nvar == 0)
17193     {
17194       emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)));
17195       return;
17196     }
17197
17198   /* For two-part initialization, always use CONCAT.  */
17199   if (nelt == 2)
17200     {
17201       rtx op0 = force_reg (imode, XVECEXP (vals, 0, 0));
17202       rtx op1 = force_reg (imode, XVECEXP (vals, 0, 1));
17203       x = gen_rtx_VEC_CONCAT (vmode, op0, op1);
17204       emit_insn (gen_rtx_SET (VOIDmode, target, x));
17205       return;
17206     }
17207
17208   /* Loongson is the only cpu with vectors with more elements.  */
17209   gcc_assert (TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS);
17210
17211   /* If all values are identical, broadcast the value.  */
17212   if (all_same)
17213     {
17214       mips_expand_vi_broadcast (vmode, target, XVECEXP (vals, 0, 0));
17215       return;
17216     }
17217
17218   /* If we've only got one non-variable V4HImode, use PINSRH.  */
17219   if (nvar == 1 && vmode == V4HImode)
17220     {
17221       mips_expand_vi_loongson_one_pinsrh (target, vals, one_var);
17222       return;
17223     }
17224
17225   mips_expand_vi_general (vmode, imode, nelt, nvar, target, vals);
17226 }
17227
17228 /* Expand a vector reduction.  */
17229
17230 void
17231 mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
17232 {
17233   enum machine_mode vmode = GET_MODE (in);
17234   unsigned char perm2[2];
17235   rtx last, next, fold, x;
17236   bool ok;
17237
17238   last = in;
17239   fold = gen_reg_rtx (vmode);
17240   switch (vmode)
17241     {
17242     case V2SFmode:
17243       /* Use PUL/PLU to produce { L, H } op { H, L }.
17244          By reversing the pair order, rather than a pure interleave high,
17245          we avoid erroneous exceptional conditions that we might otherwise
17246          produce from the computation of H op H.  */
17247       perm2[0] = 1;
17248       perm2[1] = 2;
17249       ok = mips_expand_vselect_vconcat (fold, last, last, perm2, 2);
17250       gcc_assert (ok);
17251       break;
17252
17253     case V2SImode:
17254       /* Use interleave to produce { H, L } op { H, H }.  */
17255       emit_insn (gen_loongson_punpckhwd (fold, last, last));
17256       break;
17257
17258     case V4HImode:
17259       /* Perform the first reduction with interleave,
17260          and subsequent reductions with shifts.  */
17261       emit_insn (gen_loongson_punpckhwd_hi (fold, last, last));
17262
17263       next = gen_reg_rtx (vmode);
17264       emit_insn (gen (next, last, fold));
17265       last = next;
17266
17267       fold = gen_reg_rtx (vmode);
17268       x = force_reg (SImode, GEN_INT (16));
17269       emit_insn (gen_vec_shr_v4hi (fold, last, x));
17270       break;
17271
17272     case V8QImode:
17273       emit_insn (gen_loongson_punpckhwd_qi (fold, last, last));
17274
17275       next = gen_reg_rtx (vmode);
17276       emit_insn (gen (next, last, fold));
17277       last = next;
17278
17279       fold = gen_reg_rtx (vmode);
17280       x = force_reg (SImode, GEN_INT (16));
17281       emit_insn (gen_vec_shr_v8qi (fold, last, x));
17282
17283       next = gen_reg_rtx (vmode);
17284       emit_insn (gen (next, last, fold));
17285       last = next;
17286
17287       fold = gen_reg_rtx (vmode);
17288       x = force_reg (SImode, GEN_INT (8));
17289       emit_insn (gen_vec_shr_v8qi (fold, last, x));
17290       break;
17291
17292     default:
17293       gcc_unreachable ();
17294     }
17295
17296   emit_insn (gen (target, last, fold));
17297 }
17298
17299 /* Expand a vector minimum/maximum.  */
17300
17301 void
17302 mips_expand_vec_minmax (rtx target, rtx op0, rtx op1,
17303                         rtx (*cmp) (rtx, rtx, rtx), bool min_p)
17304 {
17305   enum machine_mode vmode = GET_MODE (target);
17306   rtx tc, t0, t1, x;
17307
17308   tc = gen_reg_rtx (vmode);
17309   t0 = gen_reg_rtx (vmode);
17310   t1 = gen_reg_rtx (vmode);
17311
17312   /* op0 > op1 */
17313   emit_insn (cmp (tc, op0, op1));
17314
17315   x = gen_rtx_AND (vmode, tc, (min_p ? op1 : op0));
17316   emit_insn (gen_rtx_SET (VOIDmode, t0, x));
17317
17318   x = gen_rtx_NOT (vmode, tc);
17319   x = gen_rtx_AND (vmode, x, (min_p ? op0 : op1));
17320   emit_insn (gen_rtx_SET (VOIDmode, t1, x));
17321
17322   x = gen_rtx_IOR (vmode, t0, t1);
17323   emit_insn (gen_rtx_SET (VOIDmode, target, x));
17324 }
17325 \f
17326 /* Initialize the GCC target structure.  */
17327 #undef TARGET_ASM_ALIGNED_HI_OP
17328 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
17329 #undef TARGET_ASM_ALIGNED_SI_OP
17330 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
17331 #undef TARGET_ASM_ALIGNED_DI_OP
17332 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
17333
17334 #undef TARGET_OPTION_OVERRIDE
17335 #define TARGET_OPTION_OVERRIDE mips_option_override
17336
17337 #undef TARGET_LEGITIMIZE_ADDRESS
17338 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
17339
17340 #undef TARGET_ASM_FUNCTION_PROLOGUE
17341 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
17342 #undef TARGET_ASM_FUNCTION_EPILOGUE
17343 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
17344 #undef TARGET_ASM_SELECT_RTX_SECTION
17345 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
17346 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
17347 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
17348
17349 #undef TARGET_SCHED_INIT
17350 #define TARGET_SCHED_INIT mips_sched_init
17351 #undef TARGET_SCHED_REORDER
17352 #define TARGET_SCHED_REORDER mips_sched_reorder
17353 #undef TARGET_SCHED_REORDER2
17354 #define TARGET_SCHED_REORDER2 mips_sched_reorder2
17355 #undef TARGET_SCHED_VARIABLE_ISSUE
17356 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
17357 #undef TARGET_SCHED_ADJUST_COST
17358 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
17359 #undef TARGET_SCHED_ISSUE_RATE
17360 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
17361 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
17362 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
17363 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
17364 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
17365 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
17366 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
17367   mips_multipass_dfa_lookahead
17368 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
17369 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
17370   mips_small_register_classes_for_mode_p
17371
17372 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
17373 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
17374
17375 #undef TARGET_INSERT_ATTRIBUTES
17376 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
17377 #undef TARGET_MERGE_DECL_ATTRIBUTES
17378 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
17379 #undef TARGET_SET_CURRENT_FUNCTION
17380 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
17381
17382 #undef TARGET_VALID_POINTER_MODE
17383 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
17384 #undef TARGET_REGISTER_MOVE_COST
17385 #define TARGET_REGISTER_MOVE_COST mips_register_move_cost
17386 #undef TARGET_MEMORY_MOVE_COST
17387 #define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
17388 #undef TARGET_RTX_COSTS
17389 #define TARGET_RTX_COSTS mips_rtx_costs
17390 #undef TARGET_ADDRESS_COST
17391 #define TARGET_ADDRESS_COST mips_address_cost
17392
17393 #undef TARGET_IN_SMALL_DATA_P
17394 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
17395
17396 #undef TARGET_MACHINE_DEPENDENT_REORG
17397 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
17398
17399 #undef  TARGET_PREFERRED_RELOAD_CLASS
17400 #define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
17401
17402 #undef TARGET_ASM_FILE_START
17403 #define TARGET_ASM_FILE_START mips_file_start
17404 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
17405 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
17406 #undef TARGET_ASM_CODE_END
17407 #define TARGET_ASM_CODE_END mips_code_end
17408
17409 #undef TARGET_INIT_LIBFUNCS
17410 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
17411
17412 #undef TARGET_BUILD_BUILTIN_VA_LIST
17413 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
17414 #undef TARGET_EXPAND_BUILTIN_VA_START
17415 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
17416 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
17417 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
17418
17419 #undef  TARGET_PROMOTE_FUNCTION_MODE
17420 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
17421 #undef TARGET_PROMOTE_PROTOTYPES
17422 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
17423
17424 #undef TARGET_FUNCTION_VALUE
17425 #define TARGET_FUNCTION_VALUE mips_function_value
17426 #undef TARGET_LIBCALL_VALUE
17427 #define TARGET_LIBCALL_VALUE mips_libcall_value
17428 #undef TARGET_FUNCTION_VALUE_REGNO_P
17429 #define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
17430 #undef TARGET_RETURN_IN_MEMORY
17431 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
17432 #undef TARGET_RETURN_IN_MSB
17433 #define TARGET_RETURN_IN_MSB mips_return_in_msb
17434
17435 #undef TARGET_ASM_OUTPUT_MI_THUNK
17436 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
17437 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
17438 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
17439
17440 #undef TARGET_PRINT_OPERAND
17441 #define TARGET_PRINT_OPERAND mips_print_operand
17442 #undef TARGET_PRINT_OPERAND_ADDRESS
17443 #define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
17444 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
17445 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
17446
17447 #undef TARGET_SETUP_INCOMING_VARARGS
17448 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
17449 #undef TARGET_STRICT_ARGUMENT_NAMING
17450 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
17451 #undef TARGET_MUST_PASS_IN_STACK
17452 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
17453 #undef TARGET_PASS_BY_REFERENCE
17454 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
17455 #undef TARGET_CALLEE_COPIES
17456 #define TARGET_CALLEE_COPIES mips_callee_copies
17457 #undef TARGET_ARG_PARTIAL_BYTES
17458 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
17459 #undef TARGET_FUNCTION_ARG
17460 #define TARGET_FUNCTION_ARG mips_function_arg
17461 #undef TARGET_FUNCTION_ARG_ADVANCE
17462 #define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
17463 #undef TARGET_FUNCTION_ARG_BOUNDARY
17464 #define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
17465
17466 #undef TARGET_MODE_REP_EXTENDED
17467 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
17468
17469 #undef TARGET_VECTOR_MODE_SUPPORTED_P
17470 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
17471
17472 #undef TARGET_SCALAR_MODE_SUPPORTED_P
17473 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
17474
17475 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
17476 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
17477
17478 #undef TARGET_INIT_BUILTINS
17479 #define TARGET_INIT_BUILTINS mips_init_builtins
17480 #undef TARGET_BUILTIN_DECL
17481 #define TARGET_BUILTIN_DECL mips_builtin_decl
17482 #undef TARGET_EXPAND_BUILTIN
17483 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
17484
17485 #undef TARGET_HAVE_TLS
17486 #define TARGET_HAVE_TLS HAVE_AS_TLS
17487
17488 #undef TARGET_CANNOT_FORCE_CONST_MEM
17489 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
17490
17491 #undef TARGET_LEGITIMATE_CONSTANT_P
17492 #define TARGET_LEGITIMATE_CONSTANT_P mips_legitimate_constant_p
17493
17494 #undef TARGET_ENCODE_SECTION_INFO
17495 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
17496
17497 #undef TARGET_ATTRIBUTE_TABLE
17498 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
17499 /* All our function attributes are related to how out-of-line copies should
17500    be compiled or called.  They don't in themselves prevent inlining.  */
17501 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
17502 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
17503
17504 #undef TARGET_EXTRA_LIVE_ON_ENTRY
17505 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
17506
17507 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
17508 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
17509 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
17510 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
17511
17512 #undef  TARGET_COMP_TYPE_ATTRIBUTES
17513 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
17514
17515 #ifdef HAVE_AS_DTPRELWORD
17516 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
17517 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
17518 #endif
17519 #undef TARGET_DWARF_REGISTER_SPAN
17520 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
17521
17522 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
17523 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
17524
17525 #undef TARGET_LEGITIMATE_ADDRESS_P
17526 #define TARGET_LEGITIMATE_ADDRESS_P     mips_legitimate_address_p
17527
17528 #undef TARGET_FRAME_POINTER_REQUIRED
17529 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
17530
17531 #undef TARGET_CAN_ELIMINATE
17532 #define TARGET_CAN_ELIMINATE mips_can_eliminate
17533
17534 #undef TARGET_CONDITIONAL_REGISTER_USAGE
17535 #define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
17536
17537 #undef TARGET_TRAMPOLINE_INIT
17538 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
17539
17540 #undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
17541 #define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
17542
17543 #undef TARGET_SHIFT_TRUNCATION_MASK
17544 #define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
17545
17546 #undef TARGET_PREPARE_PCH_SAVE
17547 #define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
17548
17549 #undef TARGET_VECTORIZE_VEC_PERM_CONST_OK
17550 #define TARGET_VECTORIZE_VEC_PERM_CONST_OK mips_vectorize_vec_perm_const_ok
17551
17552 struct gcc_target targetm = TARGET_INITIALIZER;
17553 \f
17554 #include "gt-mips.h"