OSDN Git Service

b40ba3ba5fe8d04ae0120d92c0109478220e7d9b
[pf3gnuchains/gcc-fork.git] / gcc / config / mips / mips.c
1 /* Subroutines used for MIPS code generation.
2    Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5    Contributed by A. Lichnewsky, lich@inria.inria.fr.
6    Changes by Michael Meissner, meissner@osf.org.
7    64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
8    Brendan Eich, brendan@microunity.com.
9
10 This file is part of GCC.
11
12 GCC is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16
17 GCC is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3.  If not see
24 <http://www.gnu.org/licenses/>.  */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include <signal.h>
31 #include "rtl.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "real.h"
35 #include "insn-config.h"
36 #include "conditions.h"
37 #include "insn-attr.h"
38 #include "recog.h"
39 #include "toplev.h"
40 #include "output.h"
41 #include "tree.h"
42 #include "function.h"
43 #include "expr.h"
44 #include "optabs.h"
45 #include "libfuncs.h"
46 #include "flags.h"
47 #include "reload.h"
48 #include "tm_p.h"
49 #include "ggc.h"
50 #include "gstab.h"
51 #include "hashtab.h"
52 #include "debug.h"
53 #include "target.h"
54 #include "target-def.h"
55 #include "integrate.h"
56 #include "langhooks.h"
57 #include "cfglayout.h"
58 #include "sched-int.h"
59 #include "gimple.h"
60 #include "bitmap.h"
61 #include "diagnostic.h"
62
63 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
64 #define UNSPEC_ADDRESS_P(X)                                     \
65   (GET_CODE (X) == UNSPEC                                       \
66    && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
67    && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
68
69 /* Extract the symbol or label from UNSPEC wrapper X.  */
70 #define UNSPEC_ADDRESS(X) \
71   XVECEXP (X, 0, 0)
72
73 /* Extract the symbol type from UNSPEC wrapper X.  */
74 #define UNSPEC_ADDRESS_TYPE(X) \
75   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
76
77 /* The maximum distance between the top of the stack frame and the
78    value $sp has when we save and restore registers.
79
80    The value for normal-mode code must be a SMALL_OPERAND and must
81    preserve the maximum stack alignment.  We therefore use a value
82    of 0x7ff0 in this case.
83
84    MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
85    up to 0x7f8 bytes and can usually save or restore all the registers
86    that we need to save or restore.  (Note that we can only use these
87    instructions for o32, for which the stack alignment is 8 bytes.)
88
89    We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
90    RESTORE are not available.  We can then use unextended instructions
91    to save and restore registers, and to allocate and deallocate the top
92    part of the frame.  */
93 #define MIPS_MAX_FIRST_STACK_STEP                                       \
94   (!TARGET_MIPS16 ? 0x7ff0                                              \
95    : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8                              \
96    : TARGET_64BIT ? 0x100 : 0x400)
97
98 /* True if INSN is a mips.md pattern or asm statement.  */
99 #define USEFUL_INSN_P(INSN)                                             \
100   (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 /* Classifies an address.
130
131    ADDRESS_REG
132        A natural register + offset address.  The register satisfies
133        mips_valid_base_register_p and the offset is a const_arith_operand.
134
135    ADDRESS_LO_SUM
136        A LO_SUM rtx.  The first operand is a valid base register and
137        the second operand is a symbolic address.
138
139    ADDRESS_CONST_INT
140        A signed 16-bit constant address.
141
142    ADDRESS_SYMBOLIC:
143        A constant symbolic address.  */
144 enum mips_address_type {
145   ADDRESS_REG,
146   ADDRESS_LO_SUM,
147   ADDRESS_CONST_INT,
148   ADDRESS_SYMBOLIC
149 };
150
151 /* Enumerates the setting of the -mr10k-cache-barrier option.  */
152 enum mips_r10k_cache_barrier_setting {
153   R10K_CACHE_BARRIER_NONE,
154   R10K_CACHE_BARRIER_STORE,
155   R10K_CACHE_BARRIER_LOAD_STORE
156 };
157
158 /* Macros to create an enumeration identifier for a function prototype.  */
159 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
160 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
161 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
162 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
163
164 /* Classifies the prototype of a built-in function.  */
165 enum mips_function_type {
166 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
167 #include "config/mips/mips-ftypes.def"
168 #undef DEF_MIPS_FTYPE
169   MIPS_MAX_FTYPE_MAX
170 };
171
172 /* Specifies how a built-in function should be converted into rtl.  */
173 enum mips_builtin_type {
174   /* The function corresponds directly to an .md pattern.  The return
175      value is mapped to operand 0 and the arguments are mapped to
176      operands 1 and above.  */
177   MIPS_BUILTIN_DIRECT,
178
179   /* The function corresponds directly to an .md pattern.  There is no return
180      value and the arguments are mapped to operands 0 and above.  */
181   MIPS_BUILTIN_DIRECT_NO_TARGET,
182
183   /* The function corresponds to a comparison instruction followed by
184      a mips_cond_move_tf_ps pattern.  The first two arguments are the
185      values to compare and the second two arguments are the vector
186      operands for the movt.ps or movf.ps instruction (in assembly order).  */
187   MIPS_BUILTIN_MOVF,
188   MIPS_BUILTIN_MOVT,
189
190   /* The function corresponds to a V2SF comparison instruction.  Operand 0
191      of this instruction is the result of the comparison, which has mode
192      CCV2 or CCV4.  The function arguments are mapped to operands 1 and
193      above.  The function's return value is an SImode boolean that is
194      true under the following conditions:
195
196      MIPS_BUILTIN_CMP_ANY: one of the registers is true
197      MIPS_BUILTIN_CMP_ALL: all of the registers are true
198      MIPS_BUILTIN_CMP_LOWER: the first register is true
199      MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
200   MIPS_BUILTIN_CMP_ANY,
201   MIPS_BUILTIN_CMP_ALL,
202   MIPS_BUILTIN_CMP_UPPER,
203   MIPS_BUILTIN_CMP_LOWER,
204
205   /* As above, but the instruction only sets a single $fcc register.  */
206   MIPS_BUILTIN_CMP_SINGLE,
207
208   /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
209   MIPS_BUILTIN_BPOSGE32
210 };
211
212 /* Invoke MACRO (COND) for each C.cond.fmt condition.  */
213 #define MIPS_FP_CONDITIONS(MACRO) \
214   MACRO (f),    \
215   MACRO (un),   \
216   MACRO (eq),   \
217   MACRO (ueq),  \
218   MACRO (olt),  \
219   MACRO (ult),  \
220   MACRO (ole),  \
221   MACRO (ule),  \
222   MACRO (sf),   \
223   MACRO (ngle), \
224   MACRO (seq),  \
225   MACRO (ngl),  \
226   MACRO (lt),   \
227   MACRO (nge),  \
228   MACRO (le),   \
229   MACRO (ngt)
230
231 /* Enumerates the codes above as MIPS_FP_COND_<X>.  */
232 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
233 enum mips_fp_condition {
234   MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
235 };
236
237 /* Index X provides the string representation of MIPS_FP_COND_<X>.  */
238 #define STRINGIFY(X) #X
239 static const char *const mips_fp_conditions[] = {
240   MIPS_FP_CONDITIONS (STRINGIFY)
241 };
242
243 /* Information about a function's frame layout.  */
244 struct GTY(())  mips_frame_info {
245   /* The size of the frame in bytes.  */
246   HOST_WIDE_INT total_size;
247
248   /* The number of bytes allocated to variables.  */
249   HOST_WIDE_INT var_size;
250
251   /* The number of bytes allocated to outgoing function arguments.  */
252   HOST_WIDE_INT args_size;
253
254   /* The number of bytes allocated to the .cprestore slot, or 0 if there
255      is no such slot.  */
256   HOST_WIDE_INT cprestore_size;
257
258   /* Bit X is set if the function saves or restores GPR X.  */
259   unsigned int mask;
260
261   /* Likewise FPR X.  */
262   unsigned int fmask;
263
264   /* Likewise doubleword accumulator X ($acX).  */
265   unsigned int acc_mask;
266
267   /* The number of GPRs, FPRs, doubleword accumulators and COP0
268      registers saved.  */
269   unsigned int num_gp;
270   unsigned int num_fp;
271   unsigned int num_acc;
272   unsigned int num_cop0_regs;
273
274   /* The offset of the topmost GPR, FPR, accumulator and COP0-register
275      save slots from the top of the frame, or zero if no such slots are
276      needed.  */
277   HOST_WIDE_INT gp_save_offset;
278   HOST_WIDE_INT fp_save_offset;
279   HOST_WIDE_INT acc_save_offset;
280   HOST_WIDE_INT cop0_save_offset;
281
282   /* Likewise, but giving offsets from the bottom of the frame.  */
283   HOST_WIDE_INT gp_sp_offset;
284   HOST_WIDE_INT fp_sp_offset;
285   HOST_WIDE_INT acc_sp_offset;
286   HOST_WIDE_INT cop0_sp_offset;
287
288   /* The offset of arg_pointer_rtx from the bottom of the frame.  */
289   HOST_WIDE_INT arg_pointer_offset;
290
291   /* The offset of hard_frame_pointer_rtx from the bottom of the frame.  */
292   HOST_WIDE_INT hard_frame_pointer_offset;
293 };
294
295 struct GTY(())  machine_function {
296   /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
297   rtx mips16_gp_pseudo_rtx;
298
299   /* The number of extra stack bytes taken up by register varargs.
300      This area is allocated by the callee at the very top of the frame.  */
301   int varargs_size;
302
303   /* The current frame information, calculated by mips_compute_frame_info.  */
304   struct mips_frame_info frame;
305
306   /* The register to use as the function's global pointer, or INVALID_REGNUM
307      if the function doesn't need one.  */
308   unsigned int global_pointer;
309
310   /* True if mips_adjust_insn_length should ignore an instruction's
311      hazard attribute.  */
312   bool ignore_hazard_length_p;
313
314   /* True if the whole function is suitable for .set noreorder and
315      .set nomacro.  */
316   bool all_noreorder_p;
317
318   /* True if the function is known to have an instruction that needs $gp.  */
319   bool has_gp_insn_p;
320
321   /* True if we have emitted an instruction to initialize
322      mips16_gp_pseudo_rtx.  */
323   bool initialized_mips16_gp_pseudo_p;
324
325   /* True if this is an interrupt handler.  */
326   bool interrupt_handler_p;
327
328   /* True if this is an interrupt handler that uses shadow registers.  */
329   bool use_shadow_register_set_p;
330
331   /* True if this is an interrupt handler that should keep interrupts
332      masked.  */
333   bool keep_interrupts_masked_p;
334
335   /* True if this is an interrupt handler that should use DERET
336      instead of ERET.  */
337   bool use_debug_exception_return_p;
338 };
339
340 /* Information about a single argument.  */
341 struct mips_arg_info {
342   /* True if the argument is passed in a floating-point register, or
343      would have been if we hadn't run out of registers.  */
344   bool fpr_p;
345
346   /* The number of words passed in registers, rounded up.  */
347   unsigned int reg_words;
348
349   /* For EABI, the offset of the first register from GP_ARG_FIRST or
350      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
351      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
352      comment for details).
353
354      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
355      on the stack.  */
356   unsigned int reg_offset;
357
358   /* The number of words that must be passed on the stack, rounded up.  */
359   unsigned int stack_words;
360
361   /* The offset from the start of the stack overflow area of the argument's
362      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
363   unsigned int stack_offset;
364 };
365
366 /* Information about an address described by mips_address_type.
367
368    ADDRESS_CONST_INT
369        No fields are used.
370
371    ADDRESS_REG
372        REG is the base register and OFFSET is the constant offset.
373
374    ADDRESS_LO_SUM
375        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
376        is the type of symbol it references.
377
378    ADDRESS_SYMBOLIC
379        SYMBOL_TYPE is the type of symbol that the address references.  */
380 struct mips_address_info {
381   enum mips_address_type type;
382   rtx reg;
383   rtx offset;
384   enum mips_symbol_type symbol_type;
385 };
386
387 /* One stage in a constant building sequence.  These sequences have
388    the form:
389
390         A = VALUE[0]
391         A = A CODE[1] VALUE[1]
392         A = A CODE[2] VALUE[2]
393         ...
394
395    where A is an accumulator, each CODE[i] is a binary rtl operation
396    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
397 struct mips_integer_op {
398   enum rtx_code code;
399   unsigned HOST_WIDE_INT value;
400 };
401
402 /* The largest number of operations needed to load an integer constant.
403    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
404    When the lowest bit is clear, we can try, but reject a sequence with
405    an extra SLL at the end.  */
406 #define MIPS_MAX_INTEGER_OPS 7
407
408 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
409 struct mips16e_save_restore_info {
410   /* The number of argument registers saved by a SAVE instruction.
411      0 for RESTORE instructions.  */
412   unsigned int nargs;
413
414   /* Bit X is set if the instruction saves or restores GPR X.  */
415   unsigned int mask;
416
417   /* The total number of bytes to allocate.  */
418   HOST_WIDE_INT size;
419 };
420
421 /* Global variables for machine-dependent things.  */
422
423 /* The -G setting, or the configuration's default small-data limit if
424    no -G option is given.  */
425 static unsigned int mips_small_data_threshold;
426
427 /* The number of file directives written by mips_output_filename.  */
428 int num_source_filenames;
429
430 /* The name that appeared in the last .file directive written by
431    mips_output_filename, or "" if mips_output_filename hasn't
432    written anything yet.  */
433 const char *current_function_file = "";
434
435 /* A label counter used by PUT_SDB_BLOCK_START and PUT_SDB_BLOCK_END.  */
436 int sdb_label_count;
437
438 /* Arrays that map GCC register numbers to debugger register numbers.  */
439 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
440 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
441
442 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
443 int set_noreorder;
444 int set_nomacro;
445 static int set_noat;
446
447 /* True if we're writing out a branch-likely instruction rather than a
448    normal branch.  */
449 static bool mips_branch_likely;
450
451 /* The operands passed to the last cmpMM expander.  */
452 rtx cmp_operands[2];
453
454 /* The current instruction-set architecture.  */
455 enum processor_type mips_arch;
456 const struct mips_cpu_info *mips_arch_info;
457
458 /* The processor that we should tune the code for.  */
459 enum processor_type mips_tune;
460 const struct mips_cpu_info *mips_tune_info;
461
462 /* The ISA level associated with mips_arch.  */
463 int mips_isa;
464
465 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
466 static const struct mips_cpu_info *mips_isa_option_info;
467
468 /* Which ABI to use.  */
469 int mips_abi = MIPS_ABI_DEFAULT;
470
471 /* Which cost information to use.  */
472 const struct mips_rtx_cost_data *mips_cost;
473
474 /* The ambient target flags, excluding MASK_MIPS16.  */
475 static int mips_base_target_flags;
476
477 /* True if MIPS16 is the default mode.  */
478 bool mips_base_mips16;
479
480 /* The ambient values of other global variables.  */
481 static int mips_base_schedule_insns; /* flag_schedule_insns */
482 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
483 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
484 static int mips_base_align_loops; /* align_loops */
485 static int mips_base_align_jumps; /* align_jumps */
486 static int mips_base_align_functions; /* align_functions */
487
488 /* The -mcode-readable setting.  */
489 enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES;
490
491 /* The -mr10k-cache-barrier setting.  */
492 static enum mips_r10k_cache_barrier_setting mips_r10k_cache_barrier;
493
494 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
495 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
496
497 /* Index C is true if character C is a valid PRINT_OPERAND punctation
498    character.  */
499 bool mips_print_operand_punct[256];
500
501 static GTY (()) int mips_output_filename_first_time = 1;
502
503 /* mips_split_p[X] is true if symbols of type X can be split by
504    mips_split_symbol.  */
505 bool mips_split_p[NUM_SYMBOL_TYPES];
506
507 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
508    can be split by mips_split_symbol.  */
509 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
510
511 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
512    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
513    if they are matched by a special .md file pattern.  */
514 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
515
516 /* Likewise for HIGHs.  */
517 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
518
519 /* Index R is the smallest register class that contains register R.  */
520 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
521   LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
522   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
523   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
524   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
525   M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
526   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
527   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
528   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
529   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
530   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
531   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
532   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
533   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
534   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
535   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
536   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
537   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
538   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
539   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
540   NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
541   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
542   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
543   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
544   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
545   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
546   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
547   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
548   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
549   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
550   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
551   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
552   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
553   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
554   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
555   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
556   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
557   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
558   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
559   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
560   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
561   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
562   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
563   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
564   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
565   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
566   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
567   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
568 };
569
570 /* The value of TARGET_ATTRIBUTE_TABLE.  */
571 const struct attribute_spec mips_attribute_table[] = {
572   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
573   { "long_call",   0, 0, false, true,  true,  NULL },
574   { "far",         0, 0, false, true,  true,  NULL },
575   { "near",        0, 0, false, true,  true,  NULL },
576   /* We would really like to treat "mips16" and "nomips16" as type
577      attributes, but GCC doesn't provide the hooks we need to support
578      the right conversion rules.  As declaration attributes, they affect
579      code generation but don't carry other semantics.  */
580   { "mips16",      0, 0, true,  false, false, NULL },
581   { "nomips16",    0, 0, true,  false, false, NULL },
582   /* Allow functions to be specified as interrupt handlers */
583   { "interrupt",   0, 0, false, true,  true, NULL },
584   { "use_shadow_register_set",  0, 0, false, true,  true, NULL },
585   { "keep_interrupts_masked",   0, 0, false, true,  true, NULL },
586   { "use_debug_exception_return", 0, 0, false, true,  true, NULL },
587   { NULL,          0, 0, false, false, false, NULL }
588 };
589 \f
590 /* A table describing all the processors GCC knows about.  Names are
591    matched in the order listed.  The first mention of an ISA level is
592    taken as the canonical name for that ISA.
593
594    To ease comparison, please keep this table in the same order
595    as GAS's mips_cpu_info_table.  Please also make sure that
596    MIPS_ISA_LEVEL_SPEC and MIPS_ARCH_FLOAT_SPEC handle all -march
597    options correctly.  */
598 static const struct mips_cpu_info mips_cpu_info_table[] = {
599   /* Entries for generic ISAs.  */
600   { "mips1", PROCESSOR_R3000, 1, 0 },
601   { "mips2", PROCESSOR_R6000, 2, 0 },
602   { "mips3", PROCESSOR_R4000, 3, 0 },
603   { "mips4", PROCESSOR_R8000, 4, 0 },
604   /* Prefer not to use branch-likely instructions for generic MIPS32rX
605      and MIPS64rX code.  The instructions were officially deprecated
606      in revisions 2 and earlier, but revision 3 is likely to downgrade
607      that to a recommendation to avoid the instructions in code that
608      isn't tuned to a specific processor.  */
609   { "mips32", PROCESSOR_4KC, 32, PTF_AVOID_BRANCHLIKELY },
610   { "mips32r2", PROCESSOR_M4K, 33, PTF_AVOID_BRANCHLIKELY },
611   { "mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY },
612   /* ??? For now just tune the generic MIPS64r2 for 5KC as well.   */
613   { "mips64r2", PROCESSOR_5KC, 65, PTF_AVOID_BRANCHLIKELY },
614
615   /* MIPS I processors.  */
616   { "r3000", PROCESSOR_R3000, 1, 0 },
617   { "r2000", PROCESSOR_R3000, 1, 0 },
618   { "r3900", PROCESSOR_R3900, 1, 0 },
619
620   /* MIPS II processors.  */
621   { "r6000", PROCESSOR_R6000, 2, 0 },
622
623   /* MIPS III processors.  */
624   { "r4000", PROCESSOR_R4000, 3, 0 },
625   { "vr4100", PROCESSOR_R4100, 3, 0 },
626   { "vr4111", PROCESSOR_R4111, 3, 0 },
627   { "vr4120", PROCESSOR_R4120, 3, 0 },
628   { "vr4130", PROCESSOR_R4130, 3, 0 },
629   { "vr4300", PROCESSOR_R4300, 3, 0 },
630   { "r4400", PROCESSOR_R4000, 3, 0 },
631   { "r4600", PROCESSOR_R4600, 3, 0 },
632   { "orion", PROCESSOR_R4600, 3, 0 },
633   { "r4650", PROCESSOR_R4650, 3, 0 },
634   /* ST Loongson 2E/2F processors.  */
635   { "loongson2e", PROCESSOR_LOONGSON_2E, 3, PTF_AVOID_BRANCHLIKELY },
636   { "loongson2f", PROCESSOR_LOONGSON_2F, 3, PTF_AVOID_BRANCHLIKELY },
637
638   /* MIPS IV processors. */
639   { "r8000", PROCESSOR_R8000, 4, 0 },
640   { "r10000", PROCESSOR_R10000, 4, 0 },
641   { "r12000", PROCESSOR_R10000, 4, 0 },
642   { "r14000", PROCESSOR_R10000, 4, 0 },
643   { "r16000", PROCESSOR_R10000, 4, 0 },
644   { "vr5000", PROCESSOR_R5000, 4, 0 },
645   { "vr5400", PROCESSOR_R5400, 4, 0 },
646   { "vr5500", PROCESSOR_R5500, 4, PTF_AVOID_BRANCHLIKELY },
647   { "rm7000", PROCESSOR_R7000, 4, 0 },
648   { "rm9000", PROCESSOR_R9000, 4, 0 },
649
650   /* MIPS32 processors.  */
651   { "4kc", PROCESSOR_4KC, 32, 0 },
652   { "4km", PROCESSOR_4KC, 32, 0 },
653   { "4kp", PROCESSOR_4KP, 32, 0 },
654   { "4ksc", PROCESSOR_4KC, 32, 0 },
655
656   /* MIPS32 Release 2 processors.  */
657   { "m4k", PROCESSOR_M4K, 33, 0 },
658   { "4kec", PROCESSOR_4KC, 33, 0 },
659   { "4kem", PROCESSOR_4KC, 33, 0 },
660   { "4kep", PROCESSOR_4KP, 33, 0 },
661   { "4ksd", PROCESSOR_4KC, 33, 0 },
662
663   { "24kc", PROCESSOR_24KC, 33, 0 },
664   { "24kf2_1", PROCESSOR_24KF2_1, 33, 0 },
665   { "24kf", PROCESSOR_24KF2_1, 33, 0 },
666   { "24kf1_1", PROCESSOR_24KF1_1, 33, 0 },
667   { "24kfx", PROCESSOR_24KF1_1, 33, 0 },
668   { "24kx", PROCESSOR_24KF1_1, 33, 0 },
669
670   { "24kec", PROCESSOR_24KC, 33, 0 }, /* 24K with DSP.  */
671   { "24kef2_1", PROCESSOR_24KF2_1, 33, 0 },
672   { "24kef", PROCESSOR_24KF2_1, 33, 0 },
673   { "24kef1_1", PROCESSOR_24KF1_1, 33, 0 },
674   { "24kefx", PROCESSOR_24KF1_1, 33, 0 },
675   { "24kex", PROCESSOR_24KF1_1, 33, 0 },
676
677   { "34kc", PROCESSOR_24KC, 33, 0 }, /* 34K with MT/DSP.  */
678   { "34kf2_1", PROCESSOR_24KF2_1, 33, 0 },
679   { "34kf", PROCESSOR_24KF2_1, 33, 0 },
680   { "34kf1_1", PROCESSOR_24KF1_1, 33, 0 },
681   { "34kfx", PROCESSOR_24KF1_1, 33, 0 },
682   { "34kx", PROCESSOR_24KF1_1, 33, 0 },
683
684   { "74kc", PROCESSOR_74KC, 33, 0 }, /* 74K with DSPr2.  */
685   { "74kf2_1", PROCESSOR_74KF2_1, 33, 0 },
686   { "74kf", PROCESSOR_74KF2_1, 33, 0 },
687   { "74kf1_1", PROCESSOR_74KF1_1, 33, 0 },
688   { "74kfx", PROCESSOR_74KF1_1, 33, 0 },
689   { "74kx", PROCESSOR_74KF1_1, 33, 0 },
690   { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
691
692   /* MIPS64 processors.  */
693   { "5kc", PROCESSOR_5KC, 64, 0 },
694   { "5kf", PROCESSOR_5KF, 64, 0 },
695   { "20kc", PROCESSOR_20KC, 64, PTF_AVOID_BRANCHLIKELY },
696   { "sb1", PROCESSOR_SB1, 64, PTF_AVOID_BRANCHLIKELY },
697   { "sb1a", PROCESSOR_SB1A, 64, PTF_AVOID_BRANCHLIKELY },
698   { "sr71000", PROCESSOR_SR71000, 64, PTF_AVOID_BRANCHLIKELY },
699   { "xlr", PROCESSOR_XLR, 64, 0 },
700
701   /* MIPS64 Release 2 processors.  */
702   { "octeon", PROCESSOR_OCTEON, 65, PTF_AVOID_BRANCHLIKELY }
703 };
704
705 /* Default costs.  If these are used for a processor we should look
706    up the actual costs.  */
707 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
708                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
709                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
710                       COSTS_N_INSNS (23), /* fp_div_sf */    \
711                       COSTS_N_INSNS (36), /* fp_div_df */    \
712                       COSTS_N_INSNS (10), /* int_mult_si */  \
713                       COSTS_N_INSNS (10), /* int_mult_di */  \
714                       COSTS_N_INSNS (69), /* int_div_si */   \
715                       COSTS_N_INSNS (69), /* int_div_di */   \
716                                        2, /* branch_cost */  \
717                                        4  /* memory_latency */
718
719 /* Floating-point costs for processors without an FPU.  Just assume that
720    all floating-point libcalls are very expensive.  */
721 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
722                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
723                       COSTS_N_INSNS (256), /* fp_mult_df */   \
724                       COSTS_N_INSNS (256), /* fp_div_sf */    \
725                       COSTS_N_INSNS (256)  /* fp_div_df */
726
727 /* Costs to use when optimizing for size.  */
728 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
729   COSTS_N_INSNS (1),            /* fp_add */
730   COSTS_N_INSNS (1),            /* fp_mult_sf */
731   COSTS_N_INSNS (1),            /* fp_mult_df */
732   COSTS_N_INSNS (1),            /* fp_div_sf */
733   COSTS_N_INSNS (1),            /* fp_div_df */
734   COSTS_N_INSNS (1),            /* int_mult_si */
735   COSTS_N_INSNS (1),            /* int_mult_di */
736   COSTS_N_INSNS (1),            /* int_div_si */
737   COSTS_N_INSNS (1),            /* int_div_di */
738                    2,           /* branch_cost */
739                    4            /* memory_latency */
740 };
741
742 /* Costs to use when optimizing for speed, indexed by processor.  */
743 static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX] = {
744   { /* R3000 */
745     COSTS_N_INSNS (2),            /* fp_add */
746     COSTS_N_INSNS (4),            /* fp_mult_sf */
747     COSTS_N_INSNS (5),            /* fp_mult_df */
748     COSTS_N_INSNS (12),           /* fp_div_sf */
749     COSTS_N_INSNS (19),           /* fp_div_df */
750     COSTS_N_INSNS (12),           /* int_mult_si */
751     COSTS_N_INSNS (12),           /* int_mult_di */
752     COSTS_N_INSNS (35),           /* int_div_si */
753     COSTS_N_INSNS (35),           /* int_div_di */
754                      1,           /* branch_cost */
755                      4            /* memory_latency */
756   },
757   { /* 4KC */
758     SOFT_FP_COSTS,
759     COSTS_N_INSNS (6),            /* int_mult_si */
760     COSTS_N_INSNS (6),            /* int_mult_di */
761     COSTS_N_INSNS (36),           /* int_div_si */
762     COSTS_N_INSNS (36),           /* int_div_di */
763                      1,           /* branch_cost */
764                      4            /* memory_latency */
765   },
766   { /* 4KP */
767     SOFT_FP_COSTS,
768     COSTS_N_INSNS (36),           /* int_mult_si */
769     COSTS_N_INSNS (36),           /* int_mult_di */
770     COSTS_N_INSNS (37),           /* int_div_si */
771     COSTS_N_INSNS (37),           /* int_div_di */
772                      1,           /* branch_cost */
773                      4            /* memory_latency */
774   },
775   { /* 5KC */
776     SOFT_FP_COSTS,
777     COSTS_N_INSNS (4),            /* int_mult_si */
778     COSTS_N_INSNS (11),           /* int_mult_di */
779     COSTS_N_INSNS (36),           /* int_div_si */
780     COSTS_N_INSNS (68),           /* int_div_di */
781                      1,           /* branch_cost */
782                      4            /* memory_latency */
783   },
784   { /* 5KF */
785     COSTS_N_INSNS (4),            /* fp_add */
786     COSTS_N_INSNS (4),            /* fp_mult_sf */
787     COSTS_N_INSNS (5),            /* fp_mult_df */
788     COSTS_N_INSNS (17),           /* fp_div_sf */
789     COSTS_N_INSNS (32),           /* fp_div_df */
790     COSTS_N_INSNS (4),            /* int_mult_si */
791     COSTS_N_INSNS (11),           /* int_mult_di */
792     COSTS_N_INSNS (36),           /* int_div_si */
793     COSTS_N_INSNS (68),           /* int_div_di */
794                      1,           /* branch_cost */
795                      4            /* memory_latency */
796   },
797   { /* 20KC */
798     COSTS_N_INSNS (4),            /* fp_add */
799     COSTS_N_INSNS (4),            /* fp_mult_sf */
800     COSTS_N_INSNS (5),            /* fp_mult_df */
801     COSTS_N_INSNS (17),           /* fp_div_sf */
802     COSTS_N_INSNS (32),           /* fp_div_df */
803     COSTS_N_INSNS (4),            /* int_mult_si */
804     COSTS_N_INSNS (7),            /* int_mult_di */
805     COSTS_N_INSNS (42),           /* int_div_si */
806     COSTS_N_INSNS (72),           /* int_div_di */
807                      1,           /* branch_cost */
808                      4            /* memory_latency */
809   },
810   { /* 24KC */
811     SOFT_FP_COSTS,
812     COSTS_N_INSNS (5),            /* int_mult_si */
813     COSTS_N_INSNS (5),            /* int_mult_di */
814     COSTS_N_INSNS (41),           /* int_div_si */
815     COSTS_N_INSNS (41),           /* int_div_di */
816                      1,           /* branch_cost */
817                      4            /* memory_latency */
818   },
819   { /* 24KF2_1 */
820     COSTS_N_INSNS (8),            /* fp_add */
821     COSTS_N_INSNS (8),            /* fp_mult_sf */
822     COSTS_N_INSNS (10),           /* fp_mult_df */
823     COSTS_N_INSNS (34),           /* fp_div_sf */
824     COSTS_N_INSNS (64),           /* fp_div_df */
825     COSTS_N_INSNS (5),            /* int_mult_si */
826     COSTS_N_INSNS (5),            /* int_mult_di */
827     COSTS_N_INSNS (41),           /* int_div_si */
828     COSTS_N_INSNS (41),           /* int_div_di */
829                      1,           /* branch_cost */
830                      4            /* memory_latency */
831   },
832   { /* 24KF1_1 */
833     COSTS_N_INSNS (4),            /* fp_add */
834     COSTS_N_INSNS (4),            /* fp_mult_sf */
835     COSTS_N_INSNS (5),            /* fp_mult_df */
836     COSTS_N_INSNS (17),           /* fp_div_sf */
837     COSTS_N_INSNS (32),           /* fp_div_df */
838     COSTS_N_INSNS (5),            /* int_mult_si */
839     COSTS_N_INSNS (5),            /* int_mult_di */
840     COSTS_N_INSNS (41),           /* int_div_si */
841     COSTS_N_INSNS (41),           /* int_div_di */
842                      1,           /* branch_cost */
843                      4            /* memory_latency */
844   },
845   { /* 74KC */
846     SOFT_FP_COSTS,
847     COSTS_N_INSNS (5),            /* int_mult_si */
848     COSTS_N_INSNS (5),            /* int_mult_di */
849     COSTS_N_INSNS (41),           /* int_div_si */
850     COSTS_N_INSNS (41),           /* int_div_di */
851                      1,           /* branch_cost */
852                      4            /* memory_latency */
853   },
854   { /* 74KF2_1 */
855     COSTS_N_INSNS (8),            /* fp_add */
856     COSTS_N_INSNS (8),            /* fp_mult_sf */
857     COSTS_N_INSNS (10),           /* fp_mult_df */
858     COSTS_N_INSNS (34),           /* fp_div_sf */
859     COSTS_N_INSNS (64),           /* fp_div_df */
860     COSTS_N_INSNS (5),            /* int_mult_si */
861     COSTS_N_INSNS (5),            /* int_mult_di */
862     COSTS_N_INSNS (41),           /* int_div_si */
863     COSTS_N_INSNS (41),           /* int_div_di */
864                      1,           /* branch_cost */
865                      4            /* memory_latency */
866   },
867   { /* 74KF1_1 */
868     COSTS_N_INSNS (4),            /* fp_add */
869     COSTS_N_INSNS (4),            /* fp_mult_sf */
870     COSTS_N_INSNS (5),            /* fp_mult_df */
871     COSTS_N_INSNS (17),           /* fp_div_sf */
872     COSTS_N_INSNS (32),           /* fp_div_df */
873     COSTS_N_INSNS (5),            /* int_mult_si */
874     COSTS_N_INSNS (5),            /* int_mult_di */
875     COSTS_N_INSNS (41),           /* int_div_si */
876     COSTS_N_INSNS (41),           /* int_div_di */
877                      1,           /* branch_cost */
878                      4            /* memory_latency */
879   },
880   { /* 74KF3_2 */
881     COSTS_N_INSNS (6),            /* fp_add */
882     COSTS_N_INSNS (6),            /* fp_mult_sf */
883     COSTS_N_INSNS (7),            /* fp_mult_df */
884     COSTS_N_INSNS (25),           /* fp_div_sf */
885     COSTS_N_INSNS (48),           /* fp_div_df */
886     COSTS_N_INSNS (5),            /* int_mult_si */
887     COSTS_N_INSNS (5),            /* int_mult_di */
888     COSTS_N_INSNS (41),           /* int_div_si */
889     COSTS_N_INSNS (41),           /* int_div_di */
890                      1,           /* branch_cost */
891                      4            /* memory_latency */
892   },
893   { /* Loongson-2E */
894     DEFAULT_COSTS
895   },
896   { /* Loongson-2F */
897     DEFAULT_COSTS
898   },
899   { /* M4k */
900     DEFAULT_COSTS
901   },
902     /* Octeon */
903   {
904     SOFT_FP_COSTS,
905     COSTS_N_INSNS (5),            /* int_mult_si */
906     COSTS_N_INSNS (5),            /* int_mult_di */
907     COSTS_N_INSNS (72),           /* int_div_si */
908     COSTS_N_INSNS (72),           /* int_div_di */
909                      1,           /* branch_cost */
910                      4            /* memory_latency */
911   },
912   { /* R3900 */
913     COSTS_N_INSNS (2),            /* fp_add */
914     COSTS_N_INSNS (4),            /* fp_mult_sf */
915     COSTS_N_INSNS (5),            /* fp_mult_df */
916     COSTS_N_INSNS (12),           /* fp_div_sf */
917     COSTS_N_INSNS (19),           /* fp_div_df */
918     COSTS_N_INSNS (2),            /* int_mult_si */
919     COSTS_N_INSNS (2),            /* int_mult_di */
920     COSTS_N_INSNS (35),           /* int_div_si */
921     COSTS_N_INSNS (35),           /* int_div_di */
922                      1,           /* branch_cost */
923                      4            /* memory_latency */
924   },
925   { /* R6000 */
926     COSTS_N_INSNS (3),            /* fp_add */
927     COSTS_N_INSNS (5),            /* fp_mult_sf */
928     COSTS_N_INSNS (6),            /* fp_mult_df */
929     COSTS_N_INSNS (15),           /* fp_div_sf */
930     COSTS_N_INSNS (16),           /* fp_div_df */
931     COSTS_N_INSNS (17),           /* int_mult_si */
932     COSTS_N_INSNS (17),           /* int_mult_di */
933     COSTS_N_INSNS (38),           /* int_div_si */
934     COSTS_N_INSNS (38),           /* int_div_di */
935                      2,           /* branch_cost */
936                      6            /* memory_latency */
937   },
938   { /* R4000 */
939      COSTS_N_INSNS (6),           /* fp_add */
940      COSTS_N_INSNS (7),           /* fp_mult_sf */
941      COSTS_N_INSNS (8),           /* fp_mult_df */
942      COSTS_N_INSNS (23),          /* fp_div_sf */
943      COSTS_N_INSNS (36),          /* fp_div_df */
944      COSTS_N_INSNS (10),          /* int_mult_si */
945      COSTS_N_INSNS (10),          /* int_mult_di */
946      COSTS_N_INSNS (69),          /* int_div_si */
947      COSTS_N_INSNS (69),          /* int_div_di */
948                       2,          /* branch_cost */
949                       6           /* memory_latency */
950   },
951   { /* R4100 */
952     DEFAULT_COSTS
953   },
954   { /* R4111 */
955     DEFAULT_COSTS
956   },
957   { /* R4120 */
958     DEFAULT_COSTS
959   },
960   { /* R4130 */
961     /* The only costs that appear to be updated here are
962        integer multiplication.  */
963     SOFT_FP_COSTS,
964     COSTS_N_INSNS (4),            /* int_mult_si */
965     COSTS_N_INSNS (6),            /* int_mult_di */
966     COSTS_N_INSNS (69),           /* int_div_si */
967     COSTS_N_INSNS (69),           /* int_div_di */
968                      1,           /* branch_cost */
969                      4            /* memory_latency */
970   },
971   { /* R4300 */
972     DEFAULT_COSTS
973   },
974   { /* R4600 */
975     DEFAULT_COSTS
976   },
977   { /* R4650 */
978     DEFAULT_COSTS
979   },
980   { /* R5000 */
981     COSTS_N_INSNS (6),            /* fp_add */
982     COSTS_N_INSNS (4),            /* fp_mult_sf */
983     COSTS_N_INSNS (5),            /* fp_mult_df */
984     COSTS_N_INSNS (23),           /* fp_div_sf */
985     COSTS_N_INSNS (36),           /* fp_div_df */
986     COSTS_N_INSNS (5),            /* int_mult_si */
987     COSTS_N_INSNS (5),            /* int_mult_di */
988     COSTS_N_INSNS (36),           /* int_div_si */
989     COSTS_N_INSNS (36),           /* int_div_di */
990                      1,           /* branch_cost */
991                      4            /* memory_latency */
992   },
993   { /* R5400 */
994     COSTS_N_INSNS (6),            /* fp_add */
995     COSTS_N_INSNS (5),            /* fp_mult_sf */
996     COSTS_N_INSNS (6),            /* fp_mult_df */
997     COSTS_N_INSNS (30),           /* fp_div_sf */
998     COSTS_N_INSNS (59),           /* fp_div_df */
999     COSTS_N_INSNS (3),            /* int_mult_si */
1000     COSTS_N_INSNS (4),            /* int_mult_di */
1001     COSTS_N_INSNS (42),           /* int_div_si */
1002     COSTS_N_INSNS (74),           /* int_div_di */
1003                      1,           /* branch_cost */
1004                      4            /* memory_latency */
1005   },
1006   { /* R5500 */
1007     COSTS_N_INSNS (6),            /* fp_add */
1008     COSTS_N_INSNS (5),            /* fp_mult_sf */
1009     COSTS_N_INSNS (6),            /* fp_mult_df */
1010     COSTS_N_INSNS (30),           /* fp_div_sf */
1011     COSTS_N_INSNS (59),           /* fp_div_df */
1012     COSTS_N_INSNS (5),            /* int_mult_si */
1013     COSTS_N_INSNS (9),            /* int_mult_di */
1014     COSTS_N_INSNS (42),           /* int_div_si */
1015     COSTS_N_INSNS (74),           /* int_div_di */
1016                      1,           /* branch_cost */
1017                      4            /* memory_latency */
1018   },
1019   { /* R7000 */
1020     /* The only costs that are changed here are
1021        integer multiplication.  */
1022     COSTS_N_INSNS (6),            /* fp_add */
1023     COSTS_N_INSNS (7),            /* fp_mult_sf */
1024     COSTS_N_INSNS (8),            /* fp_mult_df */
1025     COSTS_N_INSNS (23),           /* fp_div_sf */
1026     COSTS_N_INSNS (36),           /* fp_div_df */
1027     COSTS_N_INSNS (5),            /* int_mult_si */
1028     COSTS_N_INSNS (9),            /* int_mult_di */
1029     COSTS_N_INSNS (69),           /* int_div_si */
1030     COSTS_N_INSNS (69),           /* int_div_di */
1031                      1,           /* branch_cost */
1032                      4            /* memory_latency */
1033   },
1034   { /* R8000 */
1035     DEFAULT_COSTS
1036   },
1037   { /* R9000 */
1038     /* The only costs that are changed here are
1039        integer multiplication.  */
1040     COSTS_N_INSNS (6),            /* fp_add */
1041     COSTS_N_INSNS (7),            /* fp_mult_sf */
1042     COSTS_N_INSNS (8),            /* fp_mult_df */
1043     COSTS_N_INSNS (23),           /* fp_div_sf */
1044     COSTS_N_INSNS (36),           /* fp_div_df */
1045     COSTS_N_INSNS (3),            /* int_mult_si */
1046     COSTS_N_INSNS (8),            /* int_mult_di */
1047     COSTS_N_INSNS (69),           /* int_div_si */
1048     COSTS_N_INSNS (69),           /* int_div_di */
1049                      1,           /* branch_cost */
1050                      4            /* memory_latency */
1051   },
1052   { /* R1x000 */
1053     COSTS_N_INSNS (2),            /* fp_add */
1054     COSTS_N_INSNS (2),            /* fp_mult_sf */
1055     COSTS_N_INSNS (2),            /* fp_mult_df */
1056     COSTS_N_INSNS (12),           /* fp_div_sf */
1057     COSTS_N_INSNS (19),           /* fp_div_df */
1058     COSTS_N_INSNS (5),            /* int_mult_si */
1059     COSTS_N_INSNS (9),            /* int_mult_di */
1060     COSTS_N_INSNS (34),           /* int_div_si */
1061     COSTS_N_INSNS (66),           /* int_div_di */
1062                      1,           /* branch_cost */
1063                      4            /* memory_latency */
1064   },
1065   { /* SB1 */
1066     /* These costs are the same as the SB-1A below.  */
1067     COSTS_N_INSNS (4),            /* fp_add */
1068     COSTS_N_INSNS (4),            /* fp_mult_sf */
1069     COSTS_N_INSNS (4),            /* fp_mult_df */
1070     COSTS_N_INSNS (24),           /* fp_div_sf */
1071     COSTS_N_INSNS (32),           /* fp_div_df */
1072     COSTS_N_INSNS (3),            /* int_mult_si */
1073     COSTS_N_INSNS (4),            /* int_mult_di */
1074     COSTS_N_INSNS (36),           /* int_div_si */
1075     COSTS_N_INSNS (68),           /* int_div_di */
1076                      1,           /* branch_cost */
1077                      4            /* memory_latency */
1078   },
1079   { /* SB1-A */
1080     /* These costs are the same as the SB-1 above.  */
1081     COSTS_N_INSNS (4),            /* fp_add */
1082     COSTS_N_INSNS (4),            /* fp_mult_sf */
1083     COSTS_N_INSNS (4),            /* fp_mult_df */
1084     COSTS_N_INSNS (24),           /* fp_div_sf */
1085     COSTS_N_INSNS (32),           /* fp_div_df */
1086     COSTS_N_INSNS (3),            /* int_mult_si */
1087     COSTS_N_INSNS (4),            /* int_mult_di */
1088     COSTS_N_INSNS (36),           /* int_div_si */
1089     COSTS_N_INSNS (68),           /* int_div_di */
1090                      1,           /* branch_cost */
1091                      4            /* memory_latency */
1092   },
1093   { /* SR71000 */
1094     DEFAULT_COSTS
1095   },
1096   { /* XLR */
1097     SOFT_FP_COSTS,
1098     COSTS_N_INSNS (8),            /* int_mult_si */
1099     COSTS_N_INSNS (8),            /* int_mult_di */
1100     COSTS_N_INSNS (72),           /* int_div_si */
1101     COSTS_N_INSNS (72),           /* int_div_di */
1102                      1,           /* branch_cost */
1103                      4            /* memory_latency */
1104   }
1105 };
1106 \f
1107 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1108    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1109 struct GTY (())  mflip_mips16_entry {
1110   const char *name;
1111   bool mips16_p;
1112 };
1113 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1114
1115 /* Hash table callbacks for mflip_mips16_htab.  */
1116
1117 static hashval_t
1118 mflip_mips16_htab_hash (const void *entry)
1119 {
1120   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1121 }
1122
1123 static int
1124 mflip_mips16_htab_eq (const void *entry, const void *name)
1125 {
1126   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1127                  (const char *) name) == 0;
1128 }
1129
1130 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1131    mode, false if it should next add an attribute for the opposite mode.  */
1132 static GTY(()) bool mips16_flipper;
1133
1134 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1135    for -mflip-mips16.  Return true if it should use "mips16" and false if
1136    it should use "nomips16".  */
1137
1138 static bool
1139 mflip_mips16_use_mips16_p (tree decl)
1140 {
1141   struct mflip_mips16_entry *entry;
1142   const char *name;
1143   hashval_t hash;
1144   void **slot;
1145
1146   /* Use the opposite of the command-line setting for anonymous decls.  */
1147   if (!DECL_NAME (decl))
1148     return !mips_base_mips16;
1149
1150   if (!mflip_mips16_htab)
1151     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1152                                          mflip_mips16_htab_eq, NULL);
1153
1154   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1155   hash = htab_hash_string (name);
1156   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1157   entry = (struct mflip_mips16_entry *) *slot;
1158   if (!entry)
1159     {
1160       mips16_flipper = !mips16_flipper;
1161       entry = GGC_NEW (struct mflip_mips16_entry);
1162       entry->name = name;
1163       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1164       *slot = entry;
1165     }
1166   return entry->mips16_p;
1167 }
1168 \f
1169 /* Predicates to test for presence of "near" and "far"/"long_call"
1170    attributes on the given TYPE.  */
1171
1172 static bool
1173 mips_near_type_p (const_tree type)
1174 {
1175   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1176 }
1177
1178 static bool
1179 mips_far_type_p (const_tree type)
1180 {
1181   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1182           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1183 }
1184
1185 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1186
1187 static bool
1188 mips_mips16_decl_p (const_tree decl)
1189 {
1190   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1191 }
1192
1193 static bool
1194 mips_nomips16_decl_p (const_tree decl)
1195 {
1196   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1197 }
1198
1199 /* Check if the interrupt attribute is set for a function.  */
1200
1201 static bool
1202 mips_interrupt_type_p (tree type)
1203 {
1204   return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1205 }
1206
1207 /* Check if the attribute to use shadow register set is set for a function.  */
1208
1209 static bool
1210 mips_use_shadow_register_set_p (tree type)
1211 {
1212   return lookup_attribute ("use_shadow_register_set",
1213                            TYPE_ATTRIBUTES (type)) != NULL;
1214 }
1215
1216 /* Check if the attribute to keep interrupts masked is set for a function.  */
1217
1218 static bool
1219 mips_keep_interrupts_masked_p (tree type)
1220 {
1221   return lookup_attribute ("keep_interrupts_masked",
1222                            TYPE_ATTRIBUTES (type)) != NULL;
1223 }
1224
1225 /* Check if the attribute to use debug exception return is set for
1226    a function.  */
1227
1228 static bool
1229 mips_use_debug_exception_return_p (tree type)
1230 {
1231   return lookup_attribute ("use_debug_exception_return",
1232                            TYPE_ATTRIBUTES (type)) != NULL;
1233 }
1234
1235 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1236    setting if DECL is null.  */
1237
1238 static bool
1239 mips_use_mips16_mode_p (tree decl)
1240 {
1241   if (decl)
1242     {
1243       /* Nested functions must use the same frame pointer as their
1244          parent and must therefore use the same ISA mode.  */
1245       tree parent = decl_function_context (decl);
1246       if (parent)
1247         decl = parent;
1248       if (mips_mips16_decl_p (decl))
1249         return true;
1250       if (mips_nomips16_decl_p (decl))
1251         return false;
1252     }
1253   return mips_base_mips16;
1254 }
1255
1256 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1257
1258 static int
1259 mips_comp_type_attributes (const_tree type1, const_tree type2)
1260 {
1261   /* Disallow mixed near/far attributes.  */
1262   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1263     return 0;
1264   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1265     return 0;
1266   return 1;
1267 }
1268
1269 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1270
1271 static void
1272 mips_insert_attributes (tree decl, tree *attributes)
1273 {
1274   const char *name;
1275   bool mips16_p, nomips16_p;
1276
1277   /* Check for "mips16" and "nomips16" attributes.  */
1278   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1279   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1280   if (TREE_CODE (decl) != FUNCTION_DECL)
1281     {
1282       if (mips16_p)
1283         error ("%qs attribute only applies to functions", "mips16");
1284       if (nomips16_p)
1285         error ("%qs attribute only applies to functions", "nomips16");
1286     }
1287   else
1288     {
1289       mips16_p |= mips_mips16_decl_p (decl);
1290       nomips16_p |= mips_nomips16_decl_p (decl);
1291       if (mips16_p || nomips16_p)
1292         {
1293           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1294           if (mips16_p && nomips16_p)
1295             error ("%qs cannot have both %<mips16%> and "
1296                    "%<nomips16%> attributes",
1297                    IDENTIFIER_POINTER (DECL_NAME (decl)));
1298         }
1299       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1300         {
1301           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1302              "mips16" attribute, arbitrarily pick one.  We must pick the same
1303              setting for duplicate declarations of a function.  */
1304           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1305           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1306         }
1307     }
1308 }
1309
1310 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1311
1312 static tree
1313 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1314 {
1315   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1316   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1317     error ("%qs redeclared with conflicting %qs attributes",
1318            IDENTIFIER_POINTER (DECL_NAME (newdecl)), "mips16");
1319   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1320     error ("%qs redeclared with conflicting %qs attributes",
1321            IDENTIFIER_POINTER (DECL_NAME (newdecl)), "nomips16");
1322
1323   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1324                            DECL_ATTRIBUTES (newdecl));
1325 }
1326 \f
1327 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1328    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1329
1330 static void
1331 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1332 {
1333   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
1334     {
1335       *base_ptr = XEXP (x, 0);
1336       *offset_ptr = INTVAL (XEXP (x, 1));
1337     }
1338   else
1339     {
1340       *base_ptr = x;
1341       *offset_ptr = 0;
1342     }
1343 }
1344 \f
1345 static unsigned int mips_build_integer (struct mips_integer_op *,
1346                                         unsigned HOST_WIDE_INT);
1347
1348 /* A subroutine of mips_build_integer, with the same interface.
1349    Assume that the final action in the sequence should be a left shift.  */
1350
1351 static unsigned int
1352 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1353 {
1354   unsigned int i, shift;
1355
1356   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1357      since signed numbers are easier to load than unsigned ones.  */
1358   shift = 0;
1359   while ((value & 1) == 0)
1360     value /= 2, shift++;
1361
1362   i = mips_build_integer (codes, value);
1363   codes[i].code = ASHIFT;
1364   codes[i].value = shift;
1365   return i + 1;
1366 }
1367
1368 /* As for mips_build_shift, but assume that the final action will be
1369    an IOR or PLUS operation.  */
1370
1371 static unsigned int
1372 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1373 {
1374   unsigned HOST_WIDE_INT high;
1375   unsigned int i;
1376
1377   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1378   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1379     {
1380       /* The constant is too complex to load with a simple LUI/ORI pair,
1381          so we want to give the recursive call as many trailing zeros as
1382          possible.  In this case, we know bit 16 is set and that the
1383          low 16 bits form a negative number.  If we subtract that number
1384          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1385       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1386       codes[i].code = PLUS;
1387       codes[i].value = CONST_LOW_PART (value);
1388     }
1389   else
1390     {
1391       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1392          bits gives a value with at least 17 trailing zeros.  */
1393       i = mips_build_integer (codes, high);
1394       codes[i].code = IOR;
1395       codes[i].value = value & 0xffff;
1396     }
1397   return i + 1;
1398 }
1399
1400 /* Fill CODES with a sequence of rtl operations to load VALUE.
1401    Return the number of operations needed.  */
1402
1403 static unsigned int
1404 mips_build_integer (struct mips_integer_op *codes,
1405                     unsigned HOST_WIDE_INT value)
1406 {
1407   if (SMALL_OPERAND (value)
1408       || SMALL_OPERAND_UNSIGNED (value)
1409       || LUI_OPERAND (value))
1410     {
1411       /* The value can be loaded with a single instruction.  */
1412       codes[0].code = UNKNOWN;
1413       codes[0].value = value;
1414       return 1;
1415     }
1416   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1417     {
1418       /* Either the constant is a simple LUI/ORI combination or its
1419          lowest bit is set.  We don't want to shift in this case.  */
1420       return mips_build_lower (codes, value);
1421     }
1422   else if ((value & 0xffff) == 0)
1423     {
1424       /* The constant will need at least three actions.  The lowest
1425          16 bits are clear, so the final action will be a shift.  */
1426       return mips_build_shift (codes, value);
1427     }
1428   else
1429     {
1430       /* The final action could be a shift, add or inclusive OR.
1431          Rather than use a complex condition to select the best
1432          approach, try both mips_build_shift and mips_build_lower
1433          and pick the one that gives the shortest sequence.
1434          Note that this case is only used once per constant.  */
1435       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1436       unsigned int cost, alt_cost;
1437
1438       cost = mips_build_shift (codes, value);
1439       alt_cost = mips_build_lower (alt_codes, value);
1440       if (alt_cost < cost)
1441         {
1442           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1443           cost = alt_cost;
1444         }
1445       return cost;
1446     }
1447 }
1448 \f
1449 /* Return true if symbols of type TYPE require a GOT access.  */
1450
1451 static bool
1452 mips_got_symbol_type_p (enum mips_symbol_type type)
1453 {
1454   switch (type)
1455     {
1456     case SYMBOL_GOT_PAGE_OFST:
1457     case SYMBOL_GOT_DISP:
1458       return true;
1459
1460     default:
1461       return false;
1462     }
1463 }
1464
1465 /* Return true if X is a thread-local symbol.  */
1466
1467 static bool
1468 mips_tls_symbol_p (rtx x)
1469 {
1470   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1471 }
1472
1473 /* Return true if SYMBOL_REF X is associated with a global symbol
1474    (in the STB_GLOBAL sense).  */
1475
1476 static bool
1477 mips_global_symbol_p (const_rtx x)
1478 {
1479   const_tree decl = SYMBOL_REF_DECL (x);
1480
1481   if (!decl)
1482     return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1483
1484   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1485      or weak symbols.  Relocations in the object file will be against
1486      the target symbol, so it's that symbol's binding that matters here.  */
1487   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1488 }
1489
1490 /* Return true if function X is a libgcc MIPS16 stub function.  */
1491
1492 static bool
1493 mips16_stub_function_p (const_rtx x)
1494 {
1495   return (GET_CODE (x) == SYMBOL_REF
1496           && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1497 }
1498
1499 /* Return true if function X is a locally-defined and locally-binding
1500    MIPS16 function.  */
1501
1502 static bool
1503 mips16_local_function_p (const_rtx x)
1504 {
1505   return (GET_CODE (x) == SYMBOL_REF
1506           && SYMBOL_REF_LOCAL_P (x)
1507           && !SYMBOL_REF_EXTERNAL_P (x)
1508           && mips_use_mips16_mode_p (SYMBOL_REF_DECL (x)));
1509 }
1510
1511 /* Return true if SYMBOL_REF X binds locally.  */
1512
1513 static bool
1514 mips_symbol_binds_local_p (const_rtx x)
1515 {
1516   return (SYMBOL_REF_DECL (x)
1517           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1518           : SYMBOL_REF_LOCAL_P (x));
1519 }
1520
1521 /* Return true if rtx constants of mode MODE should be put into a small
1522    data section.  */
1523
1524 static bool
1525 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1526 {
1527   return (!TARGET_EMBEDDED_DATA
1528           && TARGET_LOCAL_SDATA
1529           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1530 }
1531
1532 /* Return true if X should not be moved directly into register $25.
1533    We need this because many versions of GAS will treat "la $25,foo" as
1534    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1535
1536 bool
1537 mips_dangerous_for_la25_p (rtx x)
1538 {
1539   return (!TARGET_EXPLICIT_RELOCS
1540           && TARGET_USE_GOT
1541           && GET_CODE (x) == SYMBOL_REF
1542           && mips_global_symbol_p (x));
1543 }
1544
1545 /* Return true if calls to X might need $25 to be valid on entry.  */
1546
1547 bool
1548 mips_use_pic_fn_addr_reg_p (const_rtx x)
1549 {
1550   if (!TARGET_USE_PIC_FN_ADDR_REG)
1551     return false;
1552
1553   /* MIPS16 stub functions are guaranteed not to use $25.  */
1554   if (mips16_stub_function_p (x))
1555     return false;
1556
1557   if (GET_CODE (x) == SYMBOL_REF)
1558     {
1559       /* If PLTs and copy relocations are available, the static linker
1560          will make sure that $25 is valid on entry to the target function.  */
1561       if (TARGET_ABICALLS_PIC0)
1562         return false;
1563
1564       /* Locally-defined functions use absolute accesses to set up
1565          the global pointer.  */
1566       if (TARGET_ABSOLUTE_ABICALLS
1567           && mips_symbol_binds_local_p (x)
1568           && !SYMBOL_REF_EXTERNAL_P (x))
1569         return false;
1570     }
1571
1572   return true;
1573 }
1574
1575 /* Return the method that should be used to access SYMBOL_REF or
1576    LABEL_REF X in context CONTEXT.  */
1577
1578 static enum mips_symbol_type
1579 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1580 {
1581   if (TARGET_RTP_PIC)
1582     return SYMBOL_GOT_DISP;
1583
1584   if (GET_CODE (x) == LABEL_REF)
1585     {
1586       /* LABEL_REFs are used for jump tables as well as text labels.
1587          Only return SYMBOL_PC_RELATIVE if we know the label is in
1588          the text section.  */
1589       if (TARGET_MIPS16_SHORT_JUMP_TABLES)
1590         return SYMBOL_PC_RELATIVE;
1591
1592       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1593         return SYMBOL_GOT_PAGE_OFST;
1594
1595       return SYMBOL_ABSOLUTE;
1596     }
1597
1598   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1599
1600   if (SYMBOL_REF_TLS_MODEL (x))
1601     return SYMBOL_TLS;
1602
1603   if (CONSTANT_POOL_ADDRESS_P (x))
1604     {
1605       if (TARGET_MIPS16_TEXT_LOADS)
1606         return SYMBOL_PC_RELATIVE;
1607
1608       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1609         return SYMBOL_PC_RELATIVE;
1610
1611       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1612         return SYMBOL_GP_RELATIVE;
1613     }
1614
1615   /* Do not use small-data accesses for weak symbols; they may end up
1616      being zero.  */
1617   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1618     return SYMBOL_GP_RELATIVE;
1619
1620   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1621      is in effect.  */
1622   if (TARGET_ABICALLS_PIC2
1623       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1624     {
1625       /* There are three cases to consider:
1626
1627             - o32 PIC (either with or without explicit relocs)
1628             - n32/n64 PIC without explicit relocs
1629             - n32/n64 PIC with explicit relocs
1630
1631          In the first case, both local and global accesses will use an
1632          R_MIPS_GOT16 relocation.  We must correctly predict which of
1633          the two semantics (local or global) the assembler and linker
1634          will apply.  The choice depends on the symbol's binding rather
1635          than its visibility.
1636
1637          In the second case, the assembler will not use R_MIPS_GOT16
1638          relocations, but it chooses between local and global accesses
1639          in the same way as for o32 PIC.
1640
1641          In the third case we have more freedom since both forms of
1642          access will work for any kind of symbol.  However, there seems
1643          little point in doing things differently.  */
1644       if (mips_global_symbol_p (x))
1645         return SYMBOL_GOT_DISP;
1646
1647       return SYMBOL_GOT_PAGE_OFST;
1648     }
1649
1650   if (TARGET_MIPS16_PCREL_LOADS && context != SYMBOL_CONTEXT_CALL)
1651     return SYMBOL_FORCE_TO_MEM;
1652
1653   return SYMBOL_ABSOLUTE;
1654 }
1655
1656 /* Classify the base of symbolic expression X, given that X appears in
1657    context CONTEXT.  */
1658
1659 static enum mips_symbol_type
1660 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1661 {
1662   rtx offset;
1663
1664   split_const (x, &x, &offset);
1665   if (UNSPEC_ADDRESS_P (x))
1666     return UNSPEC_ADDRESS_TYPE (x);
1667
1668   return mips_classify_symbol (x, context);
1669 }
1670
1671 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1672    is the alignment in bytes of SYMBOL_REF X.  */
1673
1674 static bool
1675 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1676 {
1677   HOST_WIDE_INT align;
1678
1679   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1680   return IN_RANGE (offset, 0, align - 1);
1681 }
1682
1683 /* Return true if X is a symbolic constant that can be used in context
1684    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1685
1686 bool
1687 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1688                           enum mips_symbol_type *symbol_type)
1689 {
1690   rtx offset;
1691
1692   split_const (x, &x, &offset);
1693   if (UNSPEC_ADDRESS_P (x))
1694     {
1695       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1696       x = UNSPEC_ADDRESS (x);
1697     }
1698   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1699     {
1700       *symbol_type = mips_classify_symbol (x, context);
1701       if (*symbol_type == SYMBOL_TLS)
1702         return false;
1703     }
1704   else
1705     return false;
1706
1707   if (offset == const0_rtx)
1708     return true;
1709
1710   /* Check whether a nonzero offset is valid for the underlying
1711      relocations.  */
1712   switch (*symbol_type)
1713     {
1714     case SYMBOL_ABSOLUTE:
1715     case SYMBOL_FORCE_TO_MEM:
1716     case SYMBOL_32_HIGH:
1717     case SYMBOL_64_HIGH:
1718     case SYMBOL_64_MID:
1719     case SYMBOL_64_LOW:
1720       /* If the target has 64-bit pointers and the object file only
1721          supports 32-bit symbols, the values of those symbols will be
1722          sign-extended.  In this case we can't allow an arbitrary offset
1723          in case the 32-bit value X + OFFSET has a different sign from X.  */
1724       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1725         return offset_within_block_p (x, INTVAL (offset));
1726
1727       /* In other cases the relocations can handle any offset.  */
1728       return true;
1729
1730     case SYMBOL_PC_RELATIVE:
1731       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1732          In this case, we no longer have access to the underlying constant,
1733          but the original symbol-based access was known to be valid.  */
1734       if (GET_CODE (x) == LABEL_REF)
1735         return true;
1736
1737       /* Fall through.  */
1738
1739     case SYMBOL_GP_RELATIVE:
1740       /* Make sure that the offset refers to something within the
1741          same object block.  This should guarantee that the final
1742          PC- or GP-relative offset is within the 16-bit limit.  */
1743       return offset_within_block_p (x, INTVAL (offset));
1744
1745     case SYMBOL_GOT_PAGE_OFST:
1746     case SYMBOL_GOTOFF_PAGE:
1747       /* If the symbol is global, the GOT entry will contain the symbol's
1748          address, and we will apply a 16-bit offset after loading it.
1749          If the symbol is local, the linker should provide enough local
1750          GOT entries for a 16-bit offset, but larger offsets may lead
1751          to GOT overflow.  */
1752       return SMALL_INT (offset);
1753
1754     case SYMBOL_TPREL:
1755     case SYMBOL_DTPREL:
1756       /* There is no carry between the HI and LO REL relocations, so the
1757          offset is only valid if we know it won't lead to such a carry.  */
1758       return mips_offset_within_alignment_p (x, INTVAL (offset));
1759
1760     case SYMBOL_GOT_DISP:
1761     case SYMBOL_GOTOFF_DISP:
1762     case SYMBOL_GOTOFF_CALL:
1763     case SYMBOL_GOTOFF_LOADGP:
1764     case SYMBOL_TLSGD:
1765     case SYMBOL_TLSLDM:
1766     case SYMBOL_GOTTPREL:
1767     case SYMBOL_TLS:
1768     case SYMBOL_HALF:
1769       return false;
1770     }
1771   gcc_unreachable ();
1772 }
1773 \f
1774 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1775    single instruction.  We rely on the fact that, in the worst case,
1776    all instructions involved in a MIPS16 address calculation are usually
1777    extended ones.  */
1778
1779 static int
1780 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1781 {
1782   switch (type)
1783     {
1784     case SYMBOL_ABSOLUTE:
1785       /* When using 64-bit symbols, we need 5 preparatory instructions,
1786          such as:
1787
1788              lui     $at,%highest(symbol)
1789              daddiu  $at,$at,%higher(symbol)
1790              dsll    $at,$at,16
1791              daddiu  $at,$at,%hi(symbol)
1792              dsll    $at,$at,16
1793
1794          The final address is then $at + %lo(symbol).  With 32-bit
1795          symbols we just need a preparatory LUI for normal mode and
1796          a preparatory LI and SLL for MIPS16.  */
1797       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1798
1799     case SYMBOL_GP_RELATIVE:
1800       /* Treat GP-relative accesses as taking a single instruction on
1801          MIPS16 too; the copy of $gp can often be shared.  */
1802       return 1;
1803
1804     case SYMBOL_PC_RELATIVE:
1805       /* PC-relative constants can be only be used with ADDIUPC,
1806          DADDIUPC, LWPC and LDPC.  */
1807       if (mode == MAX_MACHINE_MODE
1808           || GET_MODE_SIZE (mode) == 4
1809           || GET_MODE_SIZE (mode) == 8)
1810         return 1;
1811
1812       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1813       return 0;
1814
1815     case SYMBOL_FORCE_TO_MEM:
1816       /* LEAs will be converted into constant-pool references by
1817          mips_reorg.  */
1818       if (mode == MAX_MACHINE_MODE)
1819         return 1;
1820
1821       /* The constant must be loaded and then dereferenced.  */
1822       return 0;
1823
1824     case SYMBOL_GOT_DISP:
1825       /* The constant will have to be loaded from the GOT before it
1826          is used in an address.  */
1827       if (mode != MAX_MACHINE_MODE)
1828         return 0;
1829
1830       /* Fall through.  */
1831
1832     case SYMBOL_GOT_PAGE_OFST:
1833       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1834          local/global classification is accurate.  The worst cases are:
1835
1836          (1) For local symbols when generating o32 or o64 code.  The assembler
1837              will use:
1838
1839                  lw           $at,%got(symbol)
1840                  nop
1841
1842              ...and the final address will be $at + %lo(symbol).
1843
1844          (2) For global symbols when -mxgot.  The assembler will use:
1845
1846                  lui     $at,%got_hi(symbol)
1847                  (d)addu $at,$at,$gp
1848
1849              ...and the final address will be $at + %got_lo(symbol).  */
1850       return 3;
1851
1852     case SYMBOL_GOTOFF_PAGE:
1853     case SYMBOL_GOTOFF_DISP:
1854     case SYMBOL_GOTOFF_CALL:
1855     case SYMBOL_GOTOFF_LOADGP:
1856     case SYMBOL_32_HIGH:
1857     case SYMBOL_64_HIGH:
1858     case SYMBOL_64_MID:
1859     case SYMBOL_64_LOW:
1860     case SYMBOL_TLSGD:
1861     case SYMBOL_TLSLDM:
1862     case SYMBOL_DTPREL:
1863     case SYMBOL_GOTTPREL:
1864     case SYMBOL_TPREL:
1865     case SYMBOL_HALF:
1866       /* A 16-bit constant formed by a single relocation, or a 32-bit
1867          constant formed from a high 16-bit relocation and a low 16-bit
1868          relocation.  Use mips_split_p to determine which.  32-bit
1869          constants need an "lui; addiu" sequence for normal mode and
1870          an "li; sll; addiu" sequence for MIPS16 mode.  */
1871       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1872
1873     case SYMBOL_TLS:
1874       /* We don't treat a bare TLS symbol as a constant.  */
1875       return 0;
1876     }
1877   gcc_unreachable ();
1878 }
1879
1880 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1881    to load symbols of type TYPE into a register.  Return 0 if the given
1882    type of symbol cannot be used as an immediate operand.
1883
1884    Otherwise, return the number of instructions needed to load or store
1885    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1886    the given type of symbol is not valid in addresses.
1887
1888    In both cases, treat extended MIPS16 instructions as two instructions.  */
1889
1890 static int
1891 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1892 {
1893   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1894 }
1895 \f
1896 /* A for_each_rtx callback.  Stop the search if *X references a
1897    thread-local symbol.  */
1898
1899 static int
1900 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1901 {
1902   return mips_tls_symbol_p (*x);
1903 }
1904
1905 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1906
1907 static bool
1908 mips_cannot_force_const_mem (rtx x)
1909 {
1910   enum mips_symbol_type type;
1911   rtx base, offset;
1912
1913   /* There is no assembler syntax for expressing an address-sized
1914      high part.  */
1915   if (GET_CODE (x) == HIGH)
1916     return true;
1917
1918   /* As an optimization, reject constants that mips_legitimize_move
1919      can expand inline.
1920
1921      Suppose we have a multi-instruction sequence that loads constant C
1922      into register R.  If R does not get allocated a hard register, and
1923      R is used in an operand that allows both registers and memory
1924      references, reload will consider forcing C into memory and using
1925      one of the instruction's memory alternatives.  Returning false
1926      here will force it to use an input reload instead.  */
1927   if (GET_CODE (x) == CONST_INT && LEGITIMATE_CONSTANT_P (x))
1928     return true;
1929
1930   split_const (x, &base, &offset);
1931   if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type)
1932       && type != SYMBOL_FORCE_TO_MEM)
1933     {
1934       /* The same optimization as for CONST_INT.  */
1935       if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
1936         return true;
1937
1938       /* If MIPS16 constant pools live in the text section, they should
1939          not refer to anything that might need run-time relocation.  */
1940       if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
1941         return true;
1942     }
1943
1944   /* TLS symbols must be computed by mips_legitimize_move.  */
1945   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
1946     return true;
1947
1948   return false;
1949 }
1950
1951 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
1952    constants when we're using a per-function constant pool.  */
1953
1954 static bool
1955 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
1956                                 const_rtx x ATTRIBUTE_UNUSED)
1957 {
1958   return !TARGET_MIPS16_PCREL_LOADS;
1959 }
1960 \f
1961 /* Return true if register REGNO is a valid base register for mode MODE.
1962    STRICT_P is true if REG_OK_STRICT is in effect.  */
1963
1964 int
1965 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
1966                                bool strict_p)
1967 {
1968   if (!HARD_REGISTER_NUM_P (regno))
1969     {
1970       if (!strict_p)
1971         return true;
1972       regno = reg_renumber[regno];
1973     }
1974
1975   /* These fake registers will be eliminated to either the stack or
1976      hard frame pointer, both of which are usually valid base registers.
1977      Reload deals with the cases where the eliminated form isn't valid.  */
1978   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
1979     return true;
1980
1981   /* In MIPS16 mode, the stack pointer can only address word and doubleword
1982      values, nothing smaller.  There are two problems here:
1983
1984        (a) Instantiating virtual registers can introduce new uses of the
1985            stack pointer.  If these virtual registers are valid addresses,
1986            the stack pointer should be too.
1987
1988        (b) Most uses of the stack pointer are not made explicit until
1989            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
1990            We don't know until that stage whether we'll be eliminating to the
1991            stack pointer (which needs the restriction) or the hard frame
1992            pointer (which doesn't).
1993
1994      All in all, it seems more consistent to only enforce this restriction
1995      during and after reload.  */
1996   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
1997     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1998
1999   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2000 }
2001
2002 /* Return true if X is a valid base register for mode MODE.
2003    STRICT_P is true if REG_OK_STRICT is in effect.  */
2004
2005 static bool
2006 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2007 {
2008   if (!strict_p && GET_CODE (x) == SUBREG)
2009     x = SUBREG_REG (x);
2010
2011   return (REG_P (x)
2012           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2013 }
2014
2015 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2016    can address a value of mode MODE.  */
2017
2018 static bool
2019 mips_valid_offset_p (rtx x, enum machine_mode mode)
2020 {
2021   /* Check that X is a signed 16-bit number.  */
2022   if (!const_arith_operand (x, Pmode))
2023     return false;
2024
2025   /* We may need to split multiword moves, so make sure that every word
2026      is accessible.  */
2027   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2028       && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2029     return false;
2030
2031   return true;
2032 }
2033
2034 /* Return true if a LO_SUM can address a value of mode MODE when the
2035    LO_SUM symbol has type SYMBOL_TYPE.  */
2036
2037 static bool
2038 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2039 {
2040   /* Check that symbols of type SYMBOL_TYPE can be used to access values
2041      of mode MODE.  */
2042   if (mips_symbol_insns (symbol_type, mode) == 0)
2043     return false;
2044
2045   /* Check that there is a known low-part relocation.  */
2046   if (mips_lo_relocs[symbol_type] == NULL)
2047     return false;
2048
2049   /* We may need to split multiword moves, so make sure that each word
2050      can be accessed without inducing a carry.  This is mainly needed
2051      for o64, which has historically only guaranteed 64-bit alignment
2052      for 128-bit types.  */
2053   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2054       && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2055     return false;
2056
2057   return true;
2058 }
2059
2060 /* Return true if X is a valid address for machine mode MODE.  If it is,
2061    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2062    effect.  */
2063
2064 static bool
2065 mips_classify_address (struct mips_address_info *info, rtx x,
2066                        enum machine_mode mode, bool strict_p)
2067 {
2068   switch (GET_CODE (x))
2069     {
2070     case REG:
2071     case SUBREG:
2072       info->type = ADDRESS_REG;
2073       info->reg = x;
2074       info->offset = const0_rtx;
2075       return mips_valid_base_register_p (info->reg, mode, strict_p);
2076
2077     case PLUS:
2078       info->type = ADDRESS_REG;
2079       info->reg = XEXP (x, 0);
2080       info->offset = XEXP (x, 1);
2081       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2082               && mips_valid_offset_p (info->offset, mode));
2083
2084     case LO_SUM:
2085       info->type = ADDRESS_LO_SUM;
2086       info->reg = XEXP (x, 0);
2087       info->offset = XEXP (x, 1);
2088       /* We have to trust the creator of the LO_SUM to do something vaguely
2089          sane.  Target-independent code that creates a LO_SUM should also
2090          create and verify the matching HIGH.  Target-independent code that
2091          adds an offset to a LO_SUM must prove that the offset will not
2092          induce a carry.  Failure to do either of these things would be
2093          a bug, and we are not required to check for it here.  The MIPS
2094          backend itself should only create LO_SUMs for valid symbolic
2095          constants, with the high part being either a HIGH or a copy
2096          of _gp. */
2097       info->symbol_type
2098         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2099       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2100               && mips_valid_lo_sum_p (info->symbol_type, mode));
2101
2102     case CONST_INT:
2103       /* Small-integer addresses don't occur very often, but they
2104          are legitimate if $0 is a valid base register.  */
2105       info->type = ADDRESS_CONST_INT;
2106       return !TARGET_MIPS16 && SMALL_INT (x);
2107
2108     case CONST:
2109     case LABEL_REF:
2110     case SYMBOL_REF:
2111       info->type = ADDRESS_SYMBOLIC;
2112       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2113                                         &info->symbol_type)
2114               && mips_symbol_insns (info->symbol_type, mode) > 0
2115               && !mips_split_p[info->symbol_type]);
2116
2117     default:
2118       return false;
2119     }
2120 }
2121
2122 /* Return true if X is a legitimate address for a memory operand of mode
2123    MODE.  STRICT_P is true if REG_OK_STRICT is in effect.  */
2124
2125 bool
2126 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2127 {
2128   struct mips_address_info addr;
2129
2130   return mips_classify_address (&addr, x, mode, strict_p);
2131 }
2132
2133 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2134
2135 bool
2136 mips_stack_address_p (rtx x, enum machine_mode mode)
2137 {
2138   struct mips_address_info addr;
2139
2140   return (mips_classify_address (&addr, x, mode, false)
2141           && addr.type == ADDRESS_REG
2142           && addr.reg == stack_pointer_rtx);
2143 }
2144
2145 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2146    address instruction.  Note that such addresses are not considered
2147    legitimate in the GO_IF_LEGITIMATE_ADDRESS sense, because their use
2148    is so restricted.  */
2149
2150 static bool
2151 mips_lwxs_address_p (rtx addr)
2152 {
2153   if (ISA_HAS_LWXS
2154       && GET_CODE (addr) == PLUS
2155       && REG_P (XEXP (addr, 1)))
2156     {
2157       rtx offset = XEXP (addr, 0);
2158       if (GET_CODE (offset) == MULT
2159           && REG_P (XEXP (offset, 0))
2160           && GET_CODE (XEXP (offset, 1)) == CONST_INT
2161           && INTVAL (XEXP (offset, 1)) == 4)
2162         return true;
2163     }
2164   return false;
2165 }
2166 \f
2167 /* Return true if a value at OFFSET bytes from base register BASE can be
2168    accessed using an unextended MIPS16 instruction.  MODE is the mode of
2169    the value.
2170
2171    Usually the offset in an unextended instruction is a 5-bit field.
2172    The offset is unsigned and shifted left once for LH and SH, twice
2173    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2174    an 8-bit immediate field that's shifted left twice.  */
2175
2176 static bool
2177 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2178                                unsigned HOST_WIDE_INT offset)
2179 {
2180   if (offset % GET_MODE_SIZE (mode) == 0)
2181     {
2182       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2183         return offset < 256U * GET_MODE_SIZE (mode);
2184       return offset < 32U * GET_MODE_SIZE (mode);
2185     }
2186   return false;
2187 }
2188
2189 /* Return the number of instructions needed to load or store a value
2190    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
2191    Assume that multiword moves may need to be split into word moves
2192    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2193    enough.
2194
2195    For MIPS16 code, count extended instructions as two instructions.  */
2196
2197 int
2198 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2199 {
2200   struct mips_address_info addr;
2201   int factor;
2202
2203   /* BLKmode is used for single unaligned loads and stores and should
2204      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2205      meaningless, so we have to single it out as a special case one way
2206      or the other.)  */
2207   if (mode != BLKmode && might_split_p)
2208     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2209   else
2210     factor = 1;
2211
2212   if (mips_classify_address (&addr, x, mode, false))
2213     switch (addr.type)
2214       {
2215       case ADDRESS_REG:
2216         if (TARGET_MIPS16
2217             && !mips16_unextended_reference_p (mode, addr.reg,
2218                                                UINTVAL (addr.offset)))
2219           return factor * 2;
2220         return factor;
2221
2222       case ADDRESS_LO_SUM:
2223         return TARGET_MIPS16 ? factor * 2 : factor;
2224
2225       case ADDRESS_CONST_INT:
2226         return factor;
2227
2228       case ADDRESS_SYMBOLIC:
2229         return factor * mips_symbol_insns (addr.symbol_type, mode);
2230       }
2231   return 0;
2232 }
2233
2234 /* Return the number of instructions needed to load constant X.
2235    Return 0 if X isn't a valid constant.  */
2236
2237 int
2238 mips_const_insns (rtx x)
2239 {
2240   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2241   enum mips_symbol_type symbol_type;
2242   rtx offset;
2243
2244   switch (GET_CODE (x))
2245     {
2246     case HIGH:
2247       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2248                                      &symbol_type)
2249           || !mips_split_p[symbol_type])
2250         return 0;
2251
2252       /* This is simply an LUI for normal mode.  It is an extended
2253          LI followed by an extended SLL for MIPS16.  */
2254       return TARGET_MIPS16 ? 4 : 1;
2255
2256     case CONST_INT:
2257       if (TARGET_MIPS16)
2258         /* Unsigned 8-bit constants can be loaded using an unextended
2259            LI instruction.  Unsigned 16-bit constants can be loaded
2260            using an extended LI.  Negative constants must be loaded
2261            using LI and then negated.  */
2262         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2263                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2264                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2265                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2266                 : 0);
2267
2268       return mips_build_integer (codes, INTVAL (x));
2269
2270     case CONST_DOUBLE:
2271     case CONST_VECTOR:
2272       /* Allow zeros for normal mode, where we can use $0.  */
2273       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2274
2275     case CONST:
2276       if (CONST_GP_P (x))
2277         return 1;
2278
2279       /* See if we can refer to X directly.  */
2280       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2281         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2282
2283       /* Otherwise try splitting the constant into a base and offset.
2284          If the offset is a 16-bit value, we can load the base address
2285          into a register and then use (D)ADDIU to add in the offset.
2286          If the offset is larger, we can load the base and offset
2287          into separate registers and add them together with (D)ADDU.
2288          However, the latter is only possible before reload; during
2289          and after reload, we must have the option of forcing the
2290          constant into the pool instead.  */
2291       split_const (x, &x, &offset);
2292       if (offset != 0)
2293         {
2294           int n = mips_const_insns (x);
2295           if (n != 0)
2296             {
2297               if (SMALL_INT (offset))
2298                 return n + 1;
2299               else if (!targetm.cannot_force_const_mem (x))
2300                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2301             }
2302         }
2303       return 0;
2304
2305     case SYMBOL_REF:
2306     case LABEL_REF:
2307       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2308                                 MAX_MACHINE_MODE);
2309
2310     default:
2311       return 0;
2312     }
2313 }
2314
2315 /* X is a doubleword constant that can be handled by splitting it into
2316    two words and loading each word separately.  Return the number of
2317    instructions required to do this.  */
2318
2319 int
2320 mips_split_const_insns (rtx x)
2321 {
2322   unsigned int low, high;
2323
2324   low = mips_const_insns (mips_subword (x, false));
2325   high = mips_const_insns (mips_subword (x, true));
2326   gcc_assert (low > 0 && high > 0);
2327   return low + high;
2328 }
2329
2330 /* Return the number of instructions needed to implement INSN,
2331    given that it loads from or stores to MEM.  Count extended
2332    MIPS16 instructions as two instructions.  */
2333
2334 int
2335 mips_load_store_insns (rtx mem, rtx insn)
2336 {
2337   enum machine_mode mode;
2338   bool might_split_p;
2339   rtx set;
2340
2341   gcc_assert (MEM_P (mem));
2342   mode = GET_MODE (mem);
2343
2344   /* Try to prove that INSN does not need to be split.  */
2345   might_split_p = true;
2346   if (GET_MODE_BITSIZE (mode) == 64)
2347     {
2348       set = single_set (insn);
2349       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2350         might_split_p = false;
2351     }
2352
2353   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2354 }
2355
2356 /* Return the number of instructions needed for an integer division.  */
2357
2358 int
2359 mips_idiv_insns (void)
2360 {
2361   int count;
2362
2363   count = 1;
2364   if (TARGET_CHECK_ZERO_DIV)
2365     {
2366       if (GENERATE_DIVIDE_TRAPS)
2367         count++;
2368       else
2369         count += 2;
2370     }
2371
2372   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2373     count++;
2374   return count;
2375 }
2376 \f
2377 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2378    handle all moves if !can_create_pseudo_p ().  The distinction is
2379    important because, unlike emit_move_insn, the move expanders know
2380    how to force Pmode objects into the constant pool even when the
2381    constant pool address is not itself legitimate.  */
2382
2383 rtx
2384 mips_emit_move (rtx dest, rtx src)
2385 {
2386   return (can_create_pseudo_p ()
2387           ? emit_move_insn (dest, src)
2388           : emit_move_insn_1 (dest, src));
2389 }
2390
2391 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2392
2393 static void
2394 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2395 {
2396   emit_insn (gen_rtx_SET (VOIDmode, target,
2397                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2398 }
2399
2400 /* Compute (CODE OP0 OP1) and store the result in a new register
2401    of mode MODE.  Return that new register.  */
2402
2403 static rtx
2404 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2405 {
2406   rtx reg;
2407
2408   reg = gen_reg_rtx (mode);
2409   mips_emit_binary (code, reg, op0, op1);
2410   return reg;
2411 }
2412
2413 /* Copy VALUE to a register and return that register.  If new pseudos
2414    are allowed, copy it into a new register, otherwise use DEST.  */
2415
2416 static rtx
2417 mips_force_temporary (rtx dest, rtx value)
2418 {
2419   if (can_create_pseudo_p ())
2420     return force_reg (Pmode, value);
2421   else
2422     {
2423       mips_emit_move (dest, value);
2424       return dest;
2425     }
2426 }
2427
2428 /* Emit a call sequence with call pattern PATTERN and return the call
2429    instruction itself (which is not necessarily the last instruction
2430    emitted).  ORIG_ADDR is the original, unlegitimized address,
2431    ADDR is the legitimized form, and LAZY_P is true if the call
2432    address is lazily-bound.  */
2433
2434 static rtx
2435 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2436 {
2437   rtx insn, reg;
2438
2439   insn = emit_call_insn (pattern);
2440
2441   if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2442     {
2443       /* MIPS16 JALRs only take MIPS16 registers.  If the target
2444          function requires $25 to be valid on entry, we must copy it
2445          there separately.  The move instruction can be put in the
2446          call's delay slot.  */
2447       reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2448       emit_insn_before (gen_move_insn (reg, addr), insn);
2449       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2450     }
2451
2452   if (lazy_p)
2453     /* Lazy-binding stubs require $gp to be valid on entry.  */
2454     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2455
2456   if (TARGET_USE_GOT)
2457     {
2458       /* See the comment above load_call<mode> for details.  */
2459       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2460                gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2461       emit_insn (gen_update_got_version ());
2462     }
2463   return insn;
2464 }
2465 \f
2466 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2467    then add CONST_INT OFFSET to the result.  */
2468
2469 static rtx
2470 mips_unspec_address_offset (rtx base, rtx offset,
2471                             enum mips_symbol_type symbol_type)
2472 {
2473   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2474                          UNSPEC_ADDRESS_FIRST + symbol_type);
2475   if (offset != const0_rtx)
2476     base = gen_rtx_PLUS (Pmode, base, offset);
2477   return gen_rtx_CONST (Pmode, base);
2478 }
2479
2480 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2481    type SYMBOL_TYPE.  */
2482
2483 rtx
2484 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2485 {
2486   rtx base, offset;
2487
2488   split_const (address, &base, &offset);
2489   return mips_unspec_address_offset (base, offset, symbol_type);
2490 }
2491
2492 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2493    high part to BASE and return the result.  Just return BASE otherwise.
2494    TEMP is as for mips_force_temporary.
2495
2496    The returned expression can be used as the first operand to a LO_SUM.  */
2497
2498 static rtx
2499 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2500                          enum mips_symbol_type symbol_type)
2501 {
2502   if (mips_split_p[symbol_type])
2503     {
2504       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2505       addr = mips_force_temporary (temp, addr);
2506       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2507     }
2508   return base;
2509 }
2510 \f
2511 /* Return an instruction that copies $gp into register REG.  We want
2512    GCC to treat the register's value as constant, so that its value
2513    can be rematerialized on demand.  */
2514
2515 static rtx
2516 gen_load_const_gp (rtx reg)
2517 {
2518   return (Pmode == SImode
2519           ? gen_load_const_gp_si (reg)
2520           : gen_load_const_gp_di (reg));
2521 }
2522
2523 /* Return a pseudo register that contains the value of $gp throughout
2524    the current function.  Such registers are needed by MIPS16 functions,
2525    for which $gp itself is not a valid base register or addition operand.  */
2526
2527 static rtx
2528 mips16_gp_pseudo_reg (void)
2529 {
2530   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2531     cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2532
2533   /* Don't emit an instruction to initialize the pseudo register if
2534      we are being called from the tree optimizers' cost-calculation
2535      routines.  */
2536   if (!cfun->machine->initialized_mips16_gp_pseudo_p
2537       && (current_ir_type () != IR_GIMPLE || currently_expanding_to_rtl))
2538     {
2539       rtx insn, scan;
2540
2541       push_topmost_sequence ();
2542
2543       scan = get_insns ();
2544       while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2545         scan = NEXT_INSN (scan);
2546
2547       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2548       emit_insn_after (insn, scan);
2549
2550       pop_topmost_sequence ();
2551
2552       cfun->machine->initialized_mips16_gp_pseudo_p = true;
2553     }
2554
2555   return cfun->machine->mips16_gp_pseudo_rtx;
2556 }
2557
2558 /* Return a base register that holds pic_offset_table_rtx.
2559    TEMP, if nonnull, is a scratch Pmode base register.  */
2560
2561 rtx
2562 mips_pic_base_register (rtx temp)
2563 {
2564   if (!TARGET_MIPS16)
2565     return pic_offset_table_rtx;
2566
2567   if (can_create_pseudo_p ())
2568     return mips16_gp_pseudo_reg ();
2569
2570   if (TARGET_USE_GOT)
2571     /* The first post-reload split exposes all references to $gp
2572        (both uses and definitions).  All references must remain
2573        explicit after that point.
2574
2575        It is safe to introduce uses of $gp at any time, so for
2576        simplicity, we do that before the split too.  */
2577     mips_emit_move (temp, pic_offset_table_rtx);
2578   else
2579     emit_insn (gen_load_const_gp (temp));
2580   return temp;
2581 }
2582
2583 /* Create and return a GOT reference of type TYPE for address ADDR.
2584    TEMP, if nonnull, is a scratch Pmode base register.  */
2585
2586 rtx
2587 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2588 {
2589   rtx base, high, lo_sum_symbol;
2590
2591   base = mips_pic_base_register (temp);
2592
2593   /* If we used the temporary register to load $gp, we can't use
2594      it for the high part as well.  */
2595   if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2596     temp = NULL;
2597
2598   high = mips_unspec_offset_high (temp, base, addr, type);
2599   lo_sum_symbol = mips_unspec_address (addr, type);
2600
2601   if (type == SYMBOL_GOTOFF_CALL)
2602     return (Pmode == SImode
2603             ? gen_unspec_callsi (high, lo_sum_symbol)
2604             : gen_unspec_calldi (high, lo_sum_symbol));
2605   else
2606     return (Pmode == SImode
2607             ? gen_unspec_gotsi (high, lo_sum_symbol)
2608             : gen_unspec_gotdi (high, lo_sum_symbol));
2609 }
2610
2611 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2612    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2613    constant in that context and can be split into high and low parts.
2614    If so, and if LOW_OUT is nonnull, emit the high part and store the
2615    low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
2616
2617    TEMP is as for mips_force_temporary and is used to load the high
2618    part into a register.
2619
2620    When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2621    a legitimize SET_SRC for an .md pattern, otherwise the low part
2622    is guaranteed to be a legitimate address for mode MODE.  */
2623
2624 bool
2625 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2626 {
2627   enum mips_symbol_context context;
2628   enum mips_symbol_type symbol_type;
2629   rtx high;
2630
2631   context = (mode == MAX_MACHINE_MODE
2632              ? SYMBOL_CONTEXT_LEA
2633              : SYMBOL_CONTEXT_MEM);
2634   if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2635     {
2636       addr = XEXP (addr, 0);
2637       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2638           && mips_symbol_insns (symbol_type, mode) > 0
2639           && mips_split_hi_p[symbol_type])
2640         {
2641           if (low_out)
2642             switch (symbol_type)
2643               {
2644               case SYMBOL_GOT_PAGE_OFST:
2645                 /* The high part of a page/ofst pair is loaded from the GOT.  */
2646                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2647                 break;
2648
2649               default:
2650                 gcc_unreachable ();
2651               }
2652           return true;
2653         }
2654     }
2655   else
2656     {
2657       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2658           && mips_symbol_insns (symbol_type, mode) > 0
2659           && mips_split_p[symbol_type])
2660         {
2661           if (low_out)
2662             switch (symbol_type)
2663               {
2664               case SYMBOL_GOT_DISP:
2665                 /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
2666                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2667                 break;
2668
2669               case SYMBOL_GP_RELATIVE:
2670                 high = mips_pic_base_register (temp);
2671                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2672                 break;
2673
2674               default:
2675                 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2676                 high = mips_force_temporary (temp, high);
2677                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2678                 break;
2679               }
2680           return true;
2681         }
2682     }
2683   return false;
2684 }
2685
2686 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2687    mips_force_temporary; it is only needed when OFFSET is not a
2688    SMALL_OPERAND.  */
2689
2690 static rtx
2691 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2692 {
2693   if (!SMALL_OPERAND (offset))
2694     {
2695       rtx high;
2696
2697       if (TARGET_MIPS16)
2698         {
2699           /* Load the full offset into a register so that we can use
2700              an unextended instruction for the address itself.  */
2701           high = GEN_INT (offset);
2702           offset = 0;
2703         }
2704       else
2705         {
2706           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
2707              The addition inside the macro CONST_HIGH_PART may cause an
2708              overflow, so we need to force a sign-extension check.  */
2709           high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
2710           offset = CONST_LOW_PART (offset);
2711         }
2712       high = mips_force_temporary (temp, high);
2713       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2714     }
2715   return plus_constant (reg, offset);
2716 }
2717 \f
2718 /* The __tls_get_attr symbol.  */
2719 static GTY(()) rtx mips_tls_symbol;
2720
2721 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2722    the TLS symbol we are referencing and TYPE is the symbol type to use
2723    (either global dynamic or local dynamic).  V0 is an RTX for the
2724    return value location.  */
2725
2726 static rtx
2727 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2728 {
2729   rtx insn, loc, a0;
2730
2731   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2732
2733   if (!mips_tls_symbol)
2734     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2735
2736   loc = mips_unspec_address (sym, type);
2737
2738   start_sequence ();
2739
2740   emit_insn (gen_rtx_SET (Pmode, a0,
2741                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2742   insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
2743                            const0_rtx, NULL_RTX, false);
2744   RTL_CONST_CALL_P (insn) = 1;
2745   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2746   insn = get_insns ();
2747
2748   end_sequence ();
2749
2750   return insn;
2751 }
2752
2753 /* Return a pseudo register that contains the current thread pointer.  */
2754
2755 static rtx
2756 mips_get_tp (void)
2757 {
2758   rtx tp;
2759
2760   tp = gen_reg_rtx (Pmode);
2761   if (Pmode == DImode)
2762     emit_insn (gen_tls_get_tp_di (tp));
2763   else
2764     emit_insn (gen_tls_get_tp_si (tp));
2765   return tp;
2766 }
2767
2768 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2769    its address.  The return value will be both a valid address and a valid
2770    SET_SRC (either a REG or a LO_SUM).  */
2771
2772 static rtx
2773 mips_legitimize_tls_address (rtx loc)
2774 {
2775   rtx dest, insn, v0, tp, tmp1, tmp2, eqv;
2776   enum tls_model model;
2777
2778   if (TARGET_MIPS16)
2779     {
2780       sorry ("MIPS16 TLS");
2781       return gen_reg_rtx (Pmode);
2782     }
2783
2784   model = SYMBOL_REF_TLS_MODEL (loc);
2785   /* Only TARGET_ABICALLS code can have more than one module; other
2786      code must be be static and should not use a GOT.  All TLS models
2787      reduce to local exec in this situation.  */
2788   if (!TARGET_ABICALLS)
2789     model = TLS_MODEL_LOCAL_EXEC;
2790
2791   switch (model)
2792     {
2793     case TLS_MODEL_GLOBAL_DYNAMIC:
2794       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2795       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2796       dest = gen_reg_rtx (Pmode);
2797       emit_libcall_block (insn, dest, v0, loc);
2798       break;
2799
2800     case TLS_MODEL_LOCAL_DYNAMIC:
2801       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2802       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2803       tmp1 = gen_reg_rtx (Pmode);
2804
2805       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2806          share the LDM result with other LD model accesses.  */
2807       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2808                             UNSPEC_TLS_LDM);
2809       emit_libcall_block (insn, tmp1, v0, eqv);
2810
2811       tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2812       dest = gen_rtx_LO_SUM (Pmode, tmp2,
2813                              mips_unspec_address (loc, SYMBOL_DTPREL));
2814       break;
2815
2816     case TLS_MODEL_INITIAL_EXEC:
2817       tp = mips_get_tp ();
2818       tmp1 = gen_reg_rtx (Pmode);
2819       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2820       if (Pmode == DImode)
2821         emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2822       else
2823         emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2824       dest = gen_reg_rtx (Pmode);
2825       emit_insn (gen_add3_insn (dest, tmp1, tp));
2826       break;
2827
2828     case TLS_MODEL_LOCAL_EXEC:
2829       tp = mips_get_tp ();
2830       tmp1 = mips_unspec_offset_high (NULL, tp, loc, SYMBOL_TPREL);
2831       dest = gen_rtx_LO_SUM (Pmode, tmp1,
2832                              mips_unspec_address (loc, SYMBOL_TPREL));
2833       break;
2834
2835     default:
2836       gcc_unreachable ();
2837     }
2838   return dest;
2839 }
2840 \f
2841 /* If X is not a valid address for mode MODE, force it into a register.  */
2842
2843 static rtx
2844 mips_force_address (rtx x, enum machine_mode mode)
2845 {
2846   if (!mips_legitimate_address_p (mode, x, false))
2847     x = force_reg (Pmode, x);
2848   return x;
2849 }
2850
2851 /* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
2852    be legitimized in a way that the generic machinery might not expect,
2853    return a new address, otherwise return NULL.  MODE is the mode of
2854    the memory being accessed.  */
2855
2856 static rtx
2857 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2858                          enum machine_mode mode)
2859 {
2860   rtx base, addr;
2861   HOST_WIDE_INT offset;
2862
2863   if (mips_tls_symbol_p (x))
2864     return mips_legitimize_tls_address (x);
2865
2866   /* See if the address can split into a high part and a LO_SUM.  */
2867   if (mips_split_symbol (NULL, x, mode, &addr))
2868     return mips_force_address (addr, mode);
2869
2870   /* Handle BASE + OFFSET using mips_add_offset.  */
2871   mips_split_plus (x, &base, &offset);
2872   if (offset != 0)
2873     {
2874       if (!mips_valid_base_register_p (base, mode, false))
2875         base = copy_to_mode_reg (Pmode, base);
2876       addr = mips_add_offset (NULL, base, offset);
2877       return mips_force_address (addr, mode);
2878     }
2879
2880   return x;
2881 }
2882
2883 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
2884
2885 void
2886 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
2887 {
2888   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2889   enum machine_mode mode;
2890   unsigned int i, num_ops;
2891   rtx x;
2892
2893   mode = GET_MODE (dest);
2894   num_ops = mips_build_integer (codes, value);
2895
2896   /* Apply each binary operation to X.  Invariant: X is a legitimate
2897      source operand for a SET pattern.  */
2898   x = GEN_INT (codes[0].value);
2899   for (i = 1; i < num_ops; i++)
2900     {
2901       if (!can_create_pseudo_p ())
2902         {
2903           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
2904           x = temp;
2905         }
2906       else
2907         x = force_reg (mode, x);
2908       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
2909     }
2910
2911   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
2912 }
2913
2914 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
2915    DEST given that SRC satisfies immediate_operand but doesn't satisfy
2916    move_operand.  */
2917
2918 static void
2919 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
2920 {
2921   rtx base, offset;
2922
2923   /* Split moves of big integers into smaller pieces.  */
2924   if (splittable_const_int_operand (src, mode))
2925     {
2926       mips_move_integer (dest, dest, INTVAL (src));
2927       return;
2928     }
2929
2930   /* Split moves of symbolic constants into high/low pairs.  */
2931   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
2932     {
2933       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
2934       return;
2935     }
2936
2937   /* Generate the appropriate access sequences for TLS symbols.  */
2938   if (mips_tls_symbol_p (src))
2939     {
2940       mips_emit_move (dest, mips_legitimize_tls_address (src));
2941       return;
2942     }
2943
2944   /* If we have (const (plus symbol offset)), and that expression cannot
2945      be forced into memory, load the symbol first and add in the offset.
2946      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
2947      forced into memory, as it usually produces better code.  */
2948   split_const (src, &base, &offset);
2949   if (offset != const0_rtx
2950       && (targetm.cannot_force_const_mem (src)
2951           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
2952     {
2953       base = mips_force_temporary (dest, base);
2954       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
2955       return;
2956     }
2957
2958   src = force_const_mem (mode, src);
2959
2960   /* When using explicit relocs, constant pool references are sometimes
2961      not legitimate addresses.  */
2962   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
2963   mips_emit_move (dest, src);
2964 }
2965
2966 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
2967    sequence that is valid.  */
2968
2969 bool
2970 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
2971 {
2972   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
2973     {
2974       mips_emit_move (dest, force_reg (mode, src));
2975       return true;
2976     }
2977
2978   /* We need to deal with constants that would be legitimate
2979      immediate_operands but aren't legitimate move_operands.  */
2980   if (CONSTANT_P (src) && !move_operand (src, mode))
2981     {
2982       mips_legitimize_const_move (mode, dest, src);
2983       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
2984       return true;
2985     }
2986   return false;
2987 }
2988 \f
2989 /* Return true if value X in context CONTEXT is a small-data address
2990    that can be rewritten as a LO_SUM.  */
2991
2992 static bool
2993 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
2994 {
2995   enum mips_symbol_type symbol_type;
2996
2997   return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
2998           && !mips_split_p[SYMBOL_GP_RELATIVE]
2999           && mips_symbolic_constant_p (x, context, &symbol_type)
3000           && symbol_type == SYMBOL_GP_RELATIVE);
3001 }
3002
3003 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3004    containing MEM, or null if none.  */
3005
3006 static int
3007 mips_small_data_pattern_1 (rtx *loc, void *data)
3008 {
3009   enum mips_symbol_context context;
3010
3011   if (GET_CODE (*loc) == LO_SUM)
3012     return -1;
3013
3014   if (MEM_P (*loc))
3015     {
3016       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3017         return 1;
3018       return -1;
3019     }
3020
3021   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3022   return mips_rewrite_small_data_p (*loc, context);
3023 }
3024
3025 /* Return true if OP refers to small data symbols directly, not through
3026    a LO_SUM.  */
3027
3028 bool
3029 mips_small_data_pattern_p (rtx op)
3030 {
3031   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3032 }
3033
3034 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3035    DATA is the containing MEM, or null if none.  */
3036
3037 static int
3038 mips_rewrite_small_data_1 (rtx *loc, void *data)
3039 {
3040   enum mips_symbol_context context;
3041
3042   if (MEM_P (*loc))
3043     {
3044       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3045       return -1;
3046     }
3047
3048   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3049   if (mips_rewrite_small_data_p (*loc, context))
3050     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3051
3052   if (GET_CODE (*loc) == LO_SUM)
3053     return -1;
3054
3055   return 0;
3056 }
3057
3058 /* Rewrite instruction pattern PATTERN so that it refers to small data
3059    using explicit relocations.  */
3060
3061 rtx
3062 mips_rewrite_small_data (rtx pattern)
3063 {
3064   pattern = copy_insn (pattern);
3065   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3066   return pattern;
3067 }
3068 \f
3069 /* We need a lot of little routines to check the range of MIPS16 immediate
3070    operands.  */
3071
3072 static int
3073 m16_check_op (rtx op, int low, int high, int mask)
3074 {
3075   return (GET_CODE (op) == CONST_INT
3076           && IN_RANGE (INTVAL (op), low, high)
3077           && (INTVAL (op) & mask) == 0);
3078 }
3079
3080 int
3081 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3082 {
3083   return m16_check_op (op, 0x1, 0x8, 0);
3084 }
3085
3086 int
3087 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3088 {
3089   return m16_check_op (op, -0x8, 0x7, 0);
3090 }
3091
3092 int
3093 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3094 {
3095   return m16_check_op (op, -0x7, 0x8, 0);
3096 }
3097
3098 int
3099 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3100 {
3101   return m16_check_op (op, -0x10, 0xf, 0);
3102 }
3103
3104 int
3105 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3106 {
3107   return m16_check_op (op, -0xf, 0x10, 0);
3108 }
3109
3110 int
3111 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3112 {
3113   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
3114 }
3115
3116 int
3117 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3118 {
3119   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
3120 }
3121
3122 int
3123 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3124 {
3125   return m16_check_op (op, -0x80, 0x7f, 0);
3126 }
3127
3128 int
3129 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3130 {
3131   return m16_check_op (op, -0x7f, 0x80, 0);
3132 }
3133
3134 int
3135 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3136 {
3137   return m16_check_op (op, 0x0, 0xff, 0);
3138 }
3139
3140 int
3141 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3142 {
3143   return m16_check_op (op, -0xff, 0x0, 0);
3144 }
3145
3146 int
3147 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3148 {
3149   return m16_check_op (op, -0x1, 0xfe, 0);
3150 }
3151
3152 int
3153 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3154 {
3155   return m16_check_op (op, 0x0, 0xff << 2, 3);
3156 }
3157
3158 int
3159 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3160 {
3161   return m16_check_op (op, -0xff << 2, 0x0, 3);
3162 }
3163
3164 int
3165 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3166 {
3167   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
3168 }
3169
3170 int
3171 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3172 {
3173   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
3174 }
3175 \f
3176 /* The cost of loading values from the constant pool.  It should be
3177    larger than the cost of any constant we want to synthesize inline.  */
3178 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3179
3180 /* Return the cost of X when used as an operand to the MIPS16 instruction
3181    that implements CODE.  Return -1 if there is no such instruction, or if
3182    X is not a valid immediate operand for it.  */
3183
3184 static int
3185 mips16_constant_cost (int code, HOST_WIDE_INT x)
3186 {
3187   switch (code)
3188     {
3189     case ASHIFT:
3190     case ASHIFTRT:
3191     case LSHIFTRT:
3192       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3193          other shifts are extended.  The shift patterns truncate the shift
3194          count to the right size, so there are no out-of-range values.  */
3195       if (IN_RANGE (x, 1, 8))
3196         return 0;
3197       return COSTS_N_INSNS (1);
3198
3199     case PLUS:
3200       if (IN_RANGE (x, -128, 127))
3201         return 0;
3202       if (SMALL_OPERAND (x))
3203         return COSTS_N_INSNS (1);
3204       return -1;
3205
3206     case LEU:
3207       /* Like LE, but reject the always-true case.  */
3208       if (x == -1)
3209         return -1;
3210     case LE:
3211       /* We add 1 to the immediate and use SLT.  */
3212       x += 1;
3213     case XOR:
3214       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3215     case LT:
3216     case LTU:
3217       if (IN_RANGE (x, 0, 255))
3218         return 0;
3219       if (SMALL_OPERAND_UNSIGNED (x))
3220         return COSTS_N_INSNS (1);
3221       return -1;
3222
3223     case EQ:
3224     case NE:
3225       /* Equality comparisons with 0 are cheap.  */
3226       if (x == 0)
3227         return 0;
3228       return -1;
3229
3230     default:
3231       return -1;
3232     }
3233 }
3234
3235 /* Return true if there is a non-MIPS16 instruction that implements CODE
3236    and if that instruction accepts X as an immediate operand.  */
3237
3238 static int
3239 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3240 {
3241   switch (code)
3242     {
3243     case ASHIFT:
3244     case ASHIFTRT:
3245     case LSHIFTRT:
3246       /* All shift counts are truncated to a valid constant.  */
3247       return true;
3248
3249     case ROTATE:
3250     case ROTATERT:
3251       /* Likewise rotates, if the target supports rotates at all.  */
3252       return ISA_HAS_ROR;
3253
3254     case AND:
3255     case IOR:
3256     case XOR:
3257       /* These instructions take 16-bit unsigned immediates.  */
3258       return SMALL_OPERAND_UNSIGNED (x);
3259
3260     case PLUS:
3261     case LT:
3262     case LTU:
3263       /* These instructions take 16-bit signed immediates.  */
3264       return SMALL_OPERAND (x);
3265
3266     case EQ:
3267     case NE:
3268     case GT:
3269     case GTU:
3270       /* The "immediate" forms of these instructions are really
3271          implemented as comparisons with register 0.  */
3272       return x == 0;
3273
3274     case GE:
3275     case GEU:
3276       /* Likewise, meaning that the only valid immediate operand is 1.  */
3277       return x == 1;
3278
3279     case LE:
3280       /* We add 1 to the immediate and use SLT.  */
3281       return SMALL_OPERAND (x + 1);
3282
3283     case LEU:
3284       /* Likewise SLTU, but reject the always-true case.  */
3285       return SMALL_OPERAND (x + 1) && x + 1 != 0;
3286
3287     case SIGN_EXTRACT:
3288     case ZERO_EXTRACT:
3289       /* The bit position and size are immediate operands.  */
3290       return ISA_HAS_EXT_INS;
3291
3292     default:
3293       /* By default assume that $0 can be used for 0.  */
3294       return x == 0;
3295     }
3296 }
3297
3298 /* Return the cost of binary operation X, given that the instruction
3299    sequence for a word-sized or smaller operation has cost SINGLE_COST
3300    and that the sequence of a double-word operation has cost DOUBLE_COST.  */
3301
3302 static int
3303 mips_binary_cost (rtx x, int single_cost, int double_cost)
3304 {
3305   int cost;
3306
3307   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3308     cost = double_cost;
3309   else
3310     cost = single_cost;
3311   return (cost
3312           + rtx_cost (XEXP (x, 0), SET, !optimize_size)
3313           + rtx_cost (XEXP (x, 1), GET_CODE (x), !optimize_size));
3314 }
3315
3316 /* Return the cost of floating-point multiplications of mode MODE.  */
3317
3318 static int
3319 mips_fp_mult_cost (enum machine_mode mode)
3320 {
3321   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3322 }
3323
3324 /* Return the cost of floating-point divisions of mode MODE.  */
3325
3326 static int
3327 mips_fp_div_cost (enum machine_mode mode)
3328 {
3329   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3330 }
3331
3332 /* Return the cost of sign-extending OP to mode MODE, not including the
3333    cost of OP itself.  */
3334
3335 static int
3336 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3337 {
3338   if (MEM_P (op))
3339     /* Extended loads are as cheap as unextended ones.  */
3340     return 0;
3341
3342   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3343     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3344     return 0;
3345
3346   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3347     /* We can use SEB or SEH.  */
3348     return COSTS_N_INSNS (1);
3349
3350   /* We need to use a shift left and a shift right.  */
3351   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3352 }
3353
3354 /* Return the cost of zero-extending OP to mode MODE, not including the
3355    cost of OP itself.  */
3356
3357 static int
3358 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3359 {
3360   if (MEM_P (op))
3361     /* Extended loads are as cheap as unextended ones.  */
3362     return 0;
3363
3364   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3365     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3366     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3367
3368   if (GENERATE_MIPS16E)
3369     /* We can use ZEB or ZEH.  */
3370     return COSTS_N_INSNS (1);
3371
3372   if (TARGET_MIPS16)
3373     /* We need to load 0xff or 0xffff into a register and use AND.  */
3374     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3375
3376   /* We can use ANDI.  */
3377   return COSTS_N_INSNS (1);
3378 }
3379
3380 /* Implement TARGET_RTX_COSTS.  */
3381
3382 static bool
3383 mips_rtx_costs (rtx x, int code, int outer_code, int *total,
3384                 bool speed)
3385 {
3386   enum machine_mode mode = GET_MODE (x);
3387   bool float_mode_p = FLOAT_MODE_P (mode);
3388   int cost;
3389   rtx addr;
3390
3391   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3392      appear in the instruction stream, and the cost of a comparison is
3393      really the cost of the branch or scc condition.  At the time of
3394      writing, GCC only uses an explicit outer COMPARE code when optabs
3395      is testing whether a constant is expensive enough to force into a
3396      register.  We want optabs to pass such constants through the MIPS
3397      expanders instead, so make all constants very cheap here.  */
3398   if (outer_code == COMPARE)
3399     {
3400       gcc_assert (CONSTANT_P (x));
3401       *total = 0;
3402       return true;
3403     }
3404
3405   switch (code)
3406     {
3407     case CONST_INT:
3408       /* Treat *clear_upper32-style ANDs as having zero cost in the
3409          second operand.  The cost is entirely in the first operand.
3410
3411          ??? This is needed because we would otherwise try to CSE
3412          the constant operand.  Although that's the right thing for
3413          instructions that continue to be a register operation throughout
3414          compilation, it is disastrous for instructions that could
3415          later be converted into a memory operation.  */
3416       if (TARGET_64BIT
3417           && outer_code == AND
3418           && UINTVAL (x) == 0xffffffff)
3419         {
3420           *total = 0;
3421           return true;
3422         }
3423
3424       if (TARGET_MIPS16)
3425         {
3426           cost = mips16_constant_cost (outer_code, INTVAL (x));
3427           if (cost >= 0)
3428             {
3429               *total = cost;
3430               return true;
3431             }
3432         }
3433       else
3434         {
3435           /* When not optimizing for size, we care more about the cost
3436              of hot code, and hot code is often in a loop.  If a constant
3437              operand needs to be forced into a register, we will often be
3438              able to hoist the constant load out of the loop, so the load
3439              should not contribute to the cost.  */
3440           if (!optimize_size
3441               || mips_immediate_operand_p (outer_code, INTVAL (x)))
3442             {
3443               *total = 0;
3444               return true;
3445             }
3446         }
3447       /* Fall through.  */
3448
3449     case CONST:
3450     case SYMBOL_REF:
3451     case LABEL_REF:
3452     case CONST_DOUBLE:
3453       if (force_to_mem_operand (x, VOIDmode))
3454         {
3455           *total = COSTS_N_INSNS (1);
3456           return true;
3457         }
3458       cost = mips_const_insns (x);
3459       if (cost > 0)
3460         {
3461           /* If the constant is likely to be stored in a GPR, SETs of
3462              single-insn constants are as cheap as register sets; we
3463              never want to CSE them.
3464
3465              Don't reduce the cost of storing a floating-point zero in
3466              FPRs.  If we have a zero in an FPR for other reasons, we
3467              can get better cfg-cleanup and delayed-branch results by
3468              using it consistently, rather than using $0 sometimes and
3469              an FPR at other times.  Also, moves between floating-point
3470              registers are sometimes cheaper than (D)MTC1 $0.  */
3471           if (cost == 1
3472               && outer_code == SET
3473               && !(float_mode_p && TARGET_HARD_FLOAT))
3474             cost = 0;
3475           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3476              want to CSE the constant itself.  It is usually better to
3477              have N copies of the last operation in the sequence and one
3478              shared copy of the other operations.  (Note that this is
3479              not true for MIPS16 code, where the final operation in the
3480              sequence is often an extended instruction.)
3481
3482              Also, if we have a CONST_INT, we don't know whether it is
3483              for a word or doubleword operation, so we cannot rely on
3484              the result of mips_build_integer.  */
3485           else if (!TARGET_MIPS16
3486                    && (outer_code == SET || mode == VOIDmode))
3487             cost = 1;
3488           *total = COSTS_N_INSNS (cost);
3489           return true;
3490         }
3491       /* The value will need to be fetched from the constant pool.  */
3492       *total = CONSTANT_POOL_COST;
3493       return true;
3494
3495     case MEM:
3496       /* If the address is legitimate, return the number of
3497          instructions it needs.  */
3498       addr = XEXP (x, 0);
3499       cost = mips_address_insns (addr, mode, true);
3500       if (cost > 0)
3501         {
3502           *total = COSTS_N_INSNS (cost + 1);
3503           return true;
3504         }
3505       /* Check for a scaled indexed address.  */
3506       if (mips_lwxs_address_p (addr))
3507         {
3508           *total = COSTS_N_INSNS (2);
3509           return true;
3510         }
3511       /* Otherwise use the default handling.  */
3512       return false;
3513
3514     case FFS:
3515       *total = COSTS_N_INSNS (6);
3516       return false;
3517
3518     case NOT:
3519       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3520       return false;
3521
3522     case AND:
3523       /* Check for a *clear_upper32 pattern and treat it like a zero
3524          extension.  See the pattern's comment for details.  */
3525       if (TARGET_64BIT
3526           && mode == DImode
3527           && CONST_INT_P (XEXP (x, 1))
3528           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3529         {
3530           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3531                     + rtx_cost (XEXP (x, 0), SET, speed));
3532           return true;
3533         }
3534       /* Fall through.  */
3535
3536     case IOR:
3537     case XOR:
3538       /* Double-word operations use two single-word operations.  */
3539       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2));
3540       return true;
3541
3542     case ASHIFT:
3543     case ASHIFTRT:
3544     case LSHIFTRT:
3545     case ROTATE:
3546     case ROTATERT:
3547       if (CONSTANT_P (XEXP (x, 1)))
3548         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4));
3549       else
3550         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12));
3551       return true;
3552
3553     case ABS:
3554       if (float_mode_p)
3555         *total = mips_cost->fp_add;
3556       else
3557         *total = COSTS_N_INSNS (4);
3558       return false;
3559
3560     case LO_SUM:
3561       /* Low-part immediates need an extended MIPS16 instruction.  */
3562       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3563                 + rtx_cost (XEXP (x, 0), SET, speed));
3564       return true;
3565
3566     case LT:
3567     case LTU:
3568     case LE:
3569     case LEU:
3570     case GT:
3571     case GTU:
3572     case GE:
3573     case GEU:
3574     case EQ:
3575     case NE:
3576     case UNORDERED:
3577     case LTGT:
3578       /* Branch comparisons have VOIDmode, so use the first operand's
3579          mode instead.  */
3580       mode = GET_MODE (XEXP (x, 0));
3581       if (FLOAT_MODE_P (mode))
3582         {
3583           *total = mips_cost->fp_add;
3584           return false;
3585         }
3586       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4));
3587       return true;
3588
3589     case MINUS:
3590       if (float_mode_p
3591           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3592           && TARGET_FUSED_MADD
3593           && !HONOR_NANS (mode)
3594           && !HONOR_SIGNED_ZEROS (mode))
3595         {
3596           /* See if we can use NMADD or NMSUB.  See mips.md for the
3597              associated patterns.  */
3598           rtx op0 = XEXP (x, 0);
3599           rtx op1 = XEXP (x, 1);
3600           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3601             {
3602               *total = (mips_fp_mult_cost (mode)
3603                         + rtx_cost (XEXP (XEXP (op0, 0), 0), SET, speed)
3604                         + rtx_cost (XEXP (op0, 1), SET, speed)
3605                         + rtx_cost (op1, SET, speed));
3606               return true;
3607             }
3608           if (GET_CODE (op1) == MULT)
3609             {
3610               *total = (mips_fp_mult_cost (mode)
3611                         + rtx_cost (op0, SET, speed)
3612                         + rtx_cost (XEXP (op1, 0), SET, speed)
3613                         + rtx_cost (XEXP (op1, 1), SET, speed));
3614               return true;
3615             }
3616         }
3617       /* Fall through.  */
3618
3619     case PLUS:
3620       if (float_mode_p)
3621         {
3622           /* If this is part of a MADD or MSUB, treat the PLUS as
3623              being free.  */
3624           if (ISA_HAS_FP4
3625               && TARGET_FUSED_MADD
3626               && GET_CODE (XEXP (x, 0)) == MULT)
3627             *total = 0;
3628           else
3629             *total = mips_cost->fp_add;
3630           return false;
3631         }
3632
3633       /* Double-word operations require three single-word operations and
3634          an SLTU.  The MIPS16 version then needs to move the result of
3635          the SLTU from $24 to a MIPS16 register.  */
3636       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3637                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4));
3638       return true;
3639
3640     case NEG:
3641       if (float_mode_p
3642           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3643           && TARGET_FUSED_MADD
3644           && !HONOR_NANS (mode)
3645           && HONOR_SIGNED_ZEROS (mode))
3646         {
3647           /* See if we can use NMADD or NMSUB.  See mips.md for the
3648              associated patterns.  */
3649           rtx op = XEXP (x, 0);
3650           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3651               && GET_CODE (XEXP (op, 0)) == MULT)
3652             {
3653               *total = (mips_fp_mult_cost (mode)
3654                         + rtx_cost (XEXP (XEXP (op, 0), 0), SET, speed)
3655                         + rtx_cost (XEXP (XEXP (op, 0), 1), SET, speed)
3656                         + rtx_cost (XEXP (op, 1), SET, speed));
3657               return true;
3658             }
3659         }
3660
3661       if (float_mode_p)
3662         *total = mips_cost->fp_add;
3663       else
3664         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3665       return false;
3666
3667     case MULT:
3668       if (float_mode_p)
3669         *total = mips_fp_mult_cost (mode);
3670       else if (mode == DImode && !TARGET_64BIT)
3671         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3672            where the mulsidi3 always includes an MFHI and an MFLO.  */
3673         *total = (optimize_size
3674                   ? COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9)
3675                   : mips_cost->int_mult_si * 3 + 6);
3676       else if (optimize_size)
3677         *total = (ISA_HAS_MUL3 ? 1 : 2);
3678       else if (mode == DImode)
3679         *total = mips_cost->int_mult_di;
3680       else
3681         *total = mips_cost->int_mult_si;
3682       return false;
3683
3684     case DIV:
3685       /* Check for a reciprocal.  */
3686       if (float_mode_p
3687           && ISA_HAS_FP4
3688           && flag_unsafe_math_optimizations
3689           && XEXP (x, 0) == CONST1_RTX (mode))
3690         {
3691           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3692             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3693                division as being free.  */
3694             *total = rtx_cost (XEXP (x, 1), SET, speed);
3695           else
3696             *total = (mips_fp_div_cost (mode)
3697                       + rtx_cost (XEXP (x, 1), SET, speed));
3698           return true;
3699         }
3700       /* Fall through.  */
3701
3702     case SQRT:
3703     case MOD:
3704       if (float_mode_p)
3705         {
3706           *total = mips_fp_div_cost (mode);
3707           return false;
3708         }
3709       /* Fall through.  */
3710
3711     case UDIV:
3712     case UMOD:
3713       if (optimize_size)
3714         {
3715           /* It is our responsibility to make division by a power of 2
3716              as cheap as 2 register additions if we want the division
3717              expanders to be used for such operations; see the setting
3718              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3719              should always produce shorter code than using
3720              expand_sdiv2_pow2.  */
3721           if (TARGET_MIPS16
3722               && CONST_INT_P (XEXP (x, 1))
3723               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3724             {
3725               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), SET, speed);
3726               return true;
3727             }
3728           *total = COSTS_N_INSNS (mips_idiv_insns ());
3729         }
3730       else if (mode == DImode)
3731         *total = mips_cost->int_div_di;
3732       else
3733         *total = mips_cost->int_div_si;
3734       return false;
3735
3736     case SIGN_EXTEND:
3737       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3738       return false;
3739
3740     case ZERO_EXTEND:
3741       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3742       return false;
3743
3744     case FLOAT:
3745     case UNSIGNED_FLOAT:
3746     case FIX:
3747     case FLOAT_EXTEND:
3748     case FLOAT_TRUNCATE:
3749       *total = mips_cost->fp_add;
3750       return false;
3751
3752     default:
3753       return false;
3754     }
3755 }
3756
3757 /* Implement TARGET_ADDRESS_COST.  */
3758
3759 static int
3760 mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
3761 {
3762   return mips_address_insns (addr, SImode, false);
3763 }
3764 \f
3765 /* Return one word of double-word value OP, taking into account the fixed
3766    endianness of certain registers.  HIGH_P is true to select the high part,
3767    false to select the low part.  */
3768
3769 rtx
3770 mips_subword (rtx op, bool high_p)
3771 {
3772   unsigned int byte, offset;
3773   enum machine_mode mode;
3774
3775   mode = GET_MODE (op);
3776   if (mode == VOIDmode)
3777     mode = TARGET_64BIT ? TImode : DImode;
3778
3779   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
3780     byte = UNITS_PER_WORD;
3781   else
3782     byte = 0;
3783
3784   if (FP_REG_RTX_P (op))
3785     {
3786       /* Paired FPRs are always ordered little-endian.  */
3787       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
3788       return gen_rtx_REG (word_mode, REGNO (op) + offset);
3789     }
3790
3791   if (MEM_P (op))
3792     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
3793
3794   return simplify_gen_subreg (word_mode, op, mode, byte);
3795 }
3796
3797 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
3798
3799 bool
3800 mips_split_64bit_move_p (rtx dest, rtx src)
3801 {
3802   if (TARGET_64BIT)
3803     return false;
3804
3805   /* FPR-to-FPR moves can be done in a single instruction, if they're
3806      allowed at all.  */
3807   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
3808     return false;
3809
3810   /* Check for floating-point loads and stores.  */
3811   if (ISA_HAS_LDC1_SDC1)
3812     {
3813       if (FP_REG_RTX_P (dest) && MEM_P (src))
3814         return false;
3815       if (FP_REG_RTX_P (src) && MEM_P (dest))
3816         return false;
3817     }
3818   return true;
3819 }
3820
3821 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
3822    this function handles 64-bit moves for which mips_split_64bit_move_p
3823    holds.  For 64-bit targets, this function handles 128-bit moves.  */
3824
3825 void
3826 mips_split_doubleword_move (rtx dest, rtx src)
3827 {
3828   rtx low_dest;
3829
3830   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
3831     {
3832       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
3833         emit_insn (gen_move_doubleword_fprdi (dest, src));
3834       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
3835         emit_insn (gen_move_doubleword_fprdf (dest, src));
3836       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
3837         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
3838       else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
3839         emit_insn (gen_move_doubleword_fprv2si (dest, src));
3840       else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
3841         emit_insn (gen_move_doubleword_fprv4hi (dest, src));
3842       else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
3843         emit_insn (gen_move_doubleword_fprv8qi (dest, src));
3844       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
3845         emit_insn (gen_move_doubleword_fprtf (dest, src));
3846       else
3847         gcc_unreachable ();
3848     }
3849   else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
3850     {
3851       low_dest = mips_subword (dest, false);
3852       mips_emit_move (low_dest, mips_subword (src, false));
3853       if (TARGET_64BIT)
3854         emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
3855       else
3856         emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
3857     }
3858   else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
3859     {
3860       mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
3861       if (TARGET_64BIT)
3862         emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
3863       else
3864         emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
3865     }
3866   else
3867     {
3868       /* The operation can be split into two normal moves.  Decide in
3869          which order to do them.  */
3870       low_dest = mips_subword (dest, false);
3871       if (REG_P (low_dest)
3872           && reg_overlap_mentioned_p (low_dest, src))
3873         {
3874           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
3875           mips_emit_move (low_dest, mips_subword (src, false));
3876         }
3877       else
3878         {
3879           mips_emit_move (low_dest, mips_subword (src, false));
3880           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
3881         }
3882     }
3883 }
3884 \f
3885 /* Return the appropriate instructions to move SRC into DEST.  Assume
3886    that SRC is operand 1 and DEST is operand 0.  */
3887
3888 const char *
3889 mips_output_move (rtx dest, rtx src)
3890 {
3891   enum rtx_code dest_code, src_code;
3892   enum machine_mode mode;
3893   enum mips_symbol_type symbol_type;
3894   bool dbl_p;
3895
3896   dest_code = GET_CODE (dest);
3897   src_code = GET_CODE (src);
3898   mode = GET_MODE (dest);
3899   dbl_p = (GET_MODE_SIZE (mode) == 8);
3900
3901   if (dbl_p && mips_split_64bit_move_p (dest, src))
3902     return "#";
3903
3904   if ((src_code == REG && GP_REG_P (REGNO (src)))
3905       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
3906     {
3907       if (dest_code == REG)
3908         {
3909           if (GP_REG_P (REGNO (dest)))
3910             return "move\t%0,%z1";
3911
3912           /* Moves to HI are handled by special .md insns.  */
3913           if (REGNO (dest) == LO_REGNUM)
3914             return "mtlo\t%z1";
3915
3916           if (DSP_ACC_REG_P (REGNO (dest)))
3917             {
3918               static char retval[] = "mt__\t%z1,%q0";
3919
3920               retval[2] = reg_names[REGNO (dest)][4];
3921               retval[3] = reg_names[REGNO (dest)][5];
3922               return retval;
3923             }
3924
3925           if (FP_REG_P (REGNO (dest)))
3926             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
3927
3928           if (ALL_COP_REG_P (REGNO (dest)))
3929             {
3930               static char retval[] = "dmtc_\t%z1,%0";
3931
3932               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3933               return dbl_p ? retval : retval + 1;
3934             }
3935         }
3936       if (dest_code == MEM)
3937         switch (GET_MODE_SIZE (mode))
3938           {
3939           case 1: return "sb\t%z1,%0";
3940           case 2: return "sh\t%z1,%0";
3941           case 4: return "sw\t%z1,%0";
3942           case 8: return "sd\t%z1,%0";
3943           }
3944     }
3945   if (dest_code == REG && GP_REG_P (REGNO (dest)))
3946     {
3947       if (src_code == REG)
3948         {
3949           /* Moves from HI are handled by special .md insns.  */
3950           if (REGNO (src) == LO_REGNUM)
3951             {
3952               /* When generating VR4120 or VR4130 code, we use MACC and
3953                  DMACC instead of MFLO.  This avoids both the normal
3954                  MIPS III HI/LO hazards and the errata related to
3955                  -mfix-vr4130.  */
3956               if (ISA_HAS_MACCHI)
3957                 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
3958               return "mflo\t%0";
3959             }
3960
3961           if (DSP_ACC_REG_P (REGNO (src)))
3962             {
3963               static char retval[] = "mf__\t%0,%q1";
3964
3965               retval[2] = reg_names[REGNO (src)][4];
3966               retval[3] = reg_names[REGNO (src)][5];
3967               return retval;
3968             }
3969
3970           if (FP_REG_P (REGNO (src)))
3971             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
3972
3973           if (ALL_COP_REG_P (REGNO (src)))
3974             {
3975               static char retval[] = "dmfc_\t%0,%1";
3976
3977               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3978               return dbl_p ? retval : retval + 1;
3979             }
3980
3981           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
3982             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
3983         }
3984
3985       if (src_code == MEM)
3986         switch (GET_MODE_SIZE (mode))
3987           {
3988           case 1: return "lbu\t%0,%1";
3989           case 2: return "lhu\t%0,%1";
3990           case 4: return "lw\t%0,%1";
3991           case 8: return "ld\t%0,%1";
3992           }
3993
3994       if (src_code == CONST_INT)
3995         {
3996           /* Don't use the X format for the operand itself, because that
3997              will give out-of-range numbers for 64-bit hosts and 32-bit
3998              targets.  */
3999           if (!TARGET_MIPS16)
4000             return "li\t%0,%1\t\t\t# %X1";
4001
4002           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4003             return "li\t%0,%1";
4004
4005           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4006             return "#";
4007         }
4008
4009       if (src_code == HIGH)
4010         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4011
4012       if (CONST_GP_P (src))
4013         return "move\t%0,%1";
4014
4015       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4016           && mips_lo_relocs[symbol_type] != 0)
4017         {
4018           /* A signed 16-bit constant formed by applying a relocation
4019              operator to a symbolic address.  */
4020           gcc_assert (!mips_split_p[symbol_type]);
4021           return "li\t%0,%R1";
4022         }
4023
4024       if (symbolic_operand (src, VOIDmode))
4025         {
4026           gcc_assert (TARGET_MIPS16
4027                       ? TARGET_MIPS16_TEXT_LOADS
4028                       : !TARGET_EXPLICIT_RELOCS);
4029           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4030         }
4031     }
4032   if (src_code == REG && FP_REG_P (REGNO (src)))
4033     {
4034       if (dest_code == REG && FP_REG_P (REGNO (dest)))
4035         {
4036           if (GET_MODE (dest) == V2SFmode)
4037             return "mov.ps\t%0,%1";
4038           else
4039             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4040         }
4041
4042       if (dest_code == MEM)
4043         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4044     }
4045   if (dest_code == REG && FP_REG_P (REGNO (dest)))
4046     {
4047       if (src_code == MEM)
4048         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4049     }
4050   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4051     {
4052       static char retval[] = "l_c_\t%0,%1";
4053
4054       retval[1] = (dbl_p ? 'd' : 'w');
4055       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4056       return retval;
4057     }
4058   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4059     {
4060       static char retval[] = "s_c_\t%1,%0";
4061
4062       retval[1] = (dbl_p ? 'd' : 'w');
4063       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4064       return retval;
4065     }
4066   gcc_unreachable ();
4067 }
4068 \f
4069 /* Return true if CMP1 is a suitable second operand for integer ordering
4070    test CODE.  See also the *sCC patterns in mips.md.  */
4071
4072 static bool
4073 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4074 {
4075   switch (code)
4076     {
4077     case GT:
4078     case GTU:
4079       return reg_or_0_operand (cmp1, VOIDmode);
4080
4081     case GE:
4082     case GEU:
4083       return !TARGET_MIPS16 && cmp1 == const1_rtx;
4084
4085     case LT:
4086     case LTU:
4087       return arith_operand (cmp1, VOIDmode);
4088
4089     case LE:
4090       return sle_operand (cmp1, VOIDmode);
4091
4092     case LEU:
4093       return sleu_operand (cmp1, VOIDmode);
4094
4095     default:
4096       gcc_unreachable ();
4097     }
4098 }
4099
4100 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4101    integer ordering test *CODE, or if an equivalent combination can
4102    be formed by adjusting *CODE and *CMP1.  When returning true, update
4103    *CODE and *CMP1 with the chosen code and operand, otherwise leave
4104    them alone.  */
4105
4106 static bool
4107 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4108                                   enum machine_mode mode)
4109 {
4110   HOST_WIDE_INT plus_one;
4111
4112   if (mips_int_order_operand_ok_p (*code, *cmp1))
4113     return true;
4114
4115   if (GET_CODE (*cmp1) == CONST_INT)
4116     switch (*code)
4117       {
4118       case LE:
4119         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4120         if (INTVAL (*cmp1) < plus_one)
4121           {
4122             *code = LT;
4123             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4124             return true;
4125           }
4126         break;
4127
4128       case LEU:
4129         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4130         if (plus_one != 0)
4131           {
4132             *code = LTU;
4133             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4134             return true;
4135           }
4136         break;
4137
4138       default:
4139         break;
4140       }
4141   return false;
4142 }
4143
4144 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4145    in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4146    is nonnull, it's OK to set TARGET to the inverse of the result and
4147    flip *INVERT_PTR instead.  */
4148
4149 static void
4150 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4151                           rtx target, rtx cmp0, rtx cmp1)
4152 {
4153   enum machine_mode mode;
4154
4155   /* First see if there is a MIPS instruction that can do this operation.
4156      If not, try doing the same for the inverse operation.  If that also
4157      fails, force CMP1 into a register and try again.  */
4158   mode = GET_MODE (cmp0);
4159   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4160     mips_emit_binary (code, target, cmp0, cmp1);
4161   else
4162     {
4163       enum rtx_code inv_code = reverse_condition (code);
4164       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4165         {
4166           cmp1 = force_reg (mode, cmp1);
4167           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4168         }
4169       else if (invert_ptr == 0)
4170         {
4171           rtx inv_target;
4172
4173           inv_target = mips_force_binary (GET_MODE (target),
4174                                           inv_code, cmp0, cmp1);
4175           mips_emit_binary (XOR, target, inv_target, const1_rtx);
4176         }
4177       else
4178         {
4179           *invert_ptr = !*invert_ptr;
4180           mips_emit_binary (inv_code, target, cmp0, cmp1);
4181         }
4182     }
4183 }
4184
4185 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4186    The register will have the same mode as CMP0.  */
4187
4188 static rtx
4189 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4190 {
4191   if (cmp1 == const0_rtx)
4192     return cmp0;
4193
4194   if (uns_arith_operand (cmp1, VOIDmode))
4195     return expand_binop (GET_MODE (cmp0), xor_optab,
4196                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4197
4198   return expand_binop (GET_MODE (cmp0), sub_optab,
4199                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4200 }
4201
4202 /* Convert *CODE into a code that can be used in a floating-point
4203    scc instruction (C.cond.fmt).  Return true if the values of
4204    the condition code registers will be inverted, with 0 indicating
4205    that the condition holds.  */
4206
4207 static bool
4208 mips_reversed_fp_cond (enum rtx_code *code)
4209 {
4210   switch (*code)
4211     {
4212     case NE:
4213     case LTGT:
4214     case ORDERED:
4215       *code = reverse_condition_maybe_unordered (*code);
4216       return true;
4217
4218     default:
4219       return false;
4220     }
4221 }
4222
4223 /* Convert a comparison into something that can be used in a branch or
4224    conditional move.  cmp_operands[0] and cmp_operands[1] are the values
4225    being compared and *CODE is the code used to compare them.
4226
4227    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4228    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4229    otherwise any standard branch condition can be used.  The standard branch
4230    conditions are:
4231
4232       - EQ or NE between two registers.
4233       - any comparison between a register and zero.  */
4234
4235 static void
4236 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4237 {
4238   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT)
4239     {
4240       if (!need_eq_ne_p && cmp_operands[1] == const0_rtx)
4241         {
4242           *op0 = cmp_operands[0];
4243           *op1 = cmp_operands[1];
4244         }
4245       else if (*code == EQ || *code == NE)
4246         {
4247           if (need_eq_ne_p)
4248             {
4249               *op0 = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
4250               *op1 = const0_rtx;
4251             }
4252           else
4253             {
4254               *op0 = cmp_operands[0];
4255               *op1 = force_reg (GET_MODE (*op0), cmp_operands[1]);
4256             }
4257         }
4258       else
4259         {
4260           /* The comparison needs a separate scc instruction.  Store the
4261              result of the scc in *OP0 and compare it against zero.  */
4262           bool invert = false;
4263           *op0 = gen_reg_rtx (GET_MODE (cmp_operands[0]));
4264           mips_emit_int_order_test (*code, &invert, *op0,
4265                                     cmp_operands[0], cmp_operands[1]);
4266           *code = (invert ? EQ : NE);
4267           *op1 = const0_rtx;
4268         }
4269     }
4270   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_operands[0])))
4271     {
4272       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4273       mips_emit_binary (*code, *op0, cmp_operands[0], cmp_operands[1]);
4274       *code = NE;
4275       *op1 = const0_rtx;
4276     }
4277   else
4278     {
4279       enum rtx_code cmp_code;
4280
4281       /* Floating-point tests use a separate C.cond.fmt comparison to
4282          set a condition code register.  The branch or conditional move
4283          will then compare that register against zero.
4284
4285          Set CMP_CODE to the code of the comparison instruction and
4286          *CODE to the code that the branch or move should use.  */
4287       cmp_code = *code;
4288       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4289       *op0 = (ISA_HAS_8CC
4290               ? gen_reg_rtx (CCmode)
4291               : gen_rtx_REG (CCmode, FPSW_REGNUM));
4292       *op1 = const0_rtx;
4293       mips_emit_binary (cmp_code, *op0, cmp_operands[0], cmp_operands[1]);
4294     }
4295 }
4296 \f
4297 /* Try comparing cmp_operands[0] and cmp_operands[1] using rtl code CODE.
4298    Store the result in TARGET and return true if successful.
4299
4300    On 64-bit targets, TARGET may be narrower than cmp_operands[0].  */
4301
4302 bool
4303 mips_expand_scc (enum rtx_code code, rtx target)
4304 {
4305   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) != MODE_INT)
4306     return false;
4307
4308   if (code == EQ || code == NE)
4309     {
4310       if (ISA_HAS_SEQ_SNE
4311           && reg_imm10_operand (cmp_operands[1], GET_MODE (cmp_operands[1])))
4312         mips_emit_binary (code, target, cmp_operands[0], cmp_operands[1]);
4313       else
4314         {
4315           rtx zie = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
4316           mips_emit_binary (code, target, zie, const0_rtx);
4317         }
4318     }
4319   else
4320     mips_emit_int_order_test (code, 0, target,
4321                               cmp_operands[0], cmp_operands[1]);
4322   return true;
4323 }
4324
4325 /* Compare cmp_operands[0] with cmp_operands[1] using comparison code
4326    CODE and jump to OPERANDS[0] if the condition holds.  */
4327
4328 void
4329 mips_expand_conditional_branch (rtx *operands, enum rtx_code code)
4330 {
4331   rtx op0, op1, condition;
4332
4333   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4334   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4335   emit_jump_insn (gen_condjump (condition, operands[0]));
4336 }
4337
4338 /* Implement:
4339
4340    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4341    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
4342
4343 void
4344 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4345                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4346 {
4347   rtx cmp_result;
4348   bool reversed_p;
4349
4350   reversed_p = mips_reversed_fp_cond (&cond);
4351   cmp_result = gen_reg_rtx (CCV2mode);
4352   emit_insn (gen_scc_ps (cmp_result,
4353                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4354   if (reversed_p)
4355     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4356                                          cmp_result));
4357   else
4358     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4359                                          cmp_result));
4360 }
4361
4362 /* Compare cmp_operands[0] with cmp_operands[1] using the code of
4363    OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0] if the condition
4364    holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
4365
4366 void
4367 mips_expand_conditional_move (rtx *operands)
4368 {
4369   enum rtx_code code;
4370   rtx cond, op0, op1;
4371
4372   code = GET_CODE (operands[1]);
4373   mips_emit_compare (&code, &op0, &op1, true);
4374   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1),
4375   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4376                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4377                                                 operands[2], operands[3])));
4378 }
4379
4380 /* Compare cmp_operands[0] with cmp_operands[1] using rtl code CODE,
4381    then trap if the condition holds.  */
4382
4383 void
4384 mips_expand_conditional_trap (enum rtx_code code)
4385 {
4386   rtx op0, op1;
4387   enum machine_mode mode;
4388
4389   /* MIPS conditional trap instructions don't have GT or LE flavors,
4390      so we must swap the operands and convert to LT and GE respectively.  */
4391   switch (code)
4392     {
4393     case GT:
4394     case LE:
4395     case GTU:
4396     case LEU:
4397       code = swap_condition (code);
4398       op0 = cmp_operands[1];
4399       op1 = cmp_operands[0];
4400       break;
4401
4402     default:
4403       op0 = cmp_operands[0];
4404       op1 = cmp_operands[1];
4405       break;
4406     }
4407
4408   mode = GET_MODE (cmp_operands[0]);
4409   op0 = force_reg (mode, op0);
4410   if (!arith_operand (op1, mode))
4411     op1 = force_reg (mode, op1);
4412
4413   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4414                               gen_rtx_fmt_ee (code, mode, op0, op1),
4415                               const0_rtx));
4416 }
4417 \f
4418 /* Initialize *CUM for a call to a function of type FNTYPE.  */
4419
4420 void
4421 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4422 {
4423   memset (cum, 0, sizeof (*cum));
4424   cum->prototype = (fntype && prototype_p (fntype));
4425   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4426 }
4427
4428 /* Fill INFO with information about a single argument.  CUM is the
4429    cumulative state for earlier arguments.  MODE is the mode of this
4430    argument and TYPE is its type (if known).  NAMED is true if this
4431    is a named (fixed) argument rather than a variable one.  */
4432
4433 static void
4434 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4435                    enum machine_mode mode, tree type, int named)
4436 {
4437   bool doubleword_aligned_p;
4438   unsigned int num_bytes, num_words, max_regs;
4439
4440   /* Work out the size of the argument.  */
4441   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4442   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4443
4444   /* Decide whether it should go in a floating-point register, assuming
4445      one is free.  Later code checks for availability.
4446
4447      The checks against UNITS_PER_FPVALUE handle the soft-float and
4448      single-float cases.  */
4449   switch (mips_abi)
4450     {
4451     case ABI_EABI:
4452       /* The EABI conventions have traditionally been defined in terms
4453          of TYPE_MODE, regardless of the actual type.  */
4454       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4455                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4456                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4457       break;
4458
4459     case ABI_32:
4460     case ABI_O64:
4461       /* Only leading floating-point scalars are passed in
4462          floating-point registers.  We also handle vector floats the same
4463          say, which is OK because they are not covered by the standard ABI.  */
4464       info->fpr_p = (!cum->gp_reg_found
4465                      && cum->arg_number < 2
4466                      && (type == 0
4467                          || SCALAR_FLOAT_TYPE_P (type)
4468                          || VECTOR_FLOAT_TYPE_P (type))
4469                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4470                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4471                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4472       break;
4473
4474     case ABI_N32:
4475     case ABI_64:
4476       /* Scalar, complex and vector floating-point types are passed in
4477          floating-point registers, as long as this is a named rather
4478          than a variable argument.  */
4479       info->fpr_p = (named
4480                      && (type == 0 || FLOAT_TYPE_P (type))
4481                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4482                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4483                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4484                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4485
4486       /* ??? According to the ABI documentation, the real and imaginary
4487          parts of complex floats should be passed in individual registers.
4488          The real and imaginary parts of stack arguments are supposed
4489          to be contiguous and there should be an extra word of padding
4490          at the end.
4491
4492          This has two problems.  First, it makes it impossible to use a
4493          single "void *" va_list type, since register and stack arguments
4494          are passed differently.  (At the time of writing, MIPSpro cannot
4495          handle complex float varargs correctly.)  Second, it's unclear
4496          what should happen when there is only one register free.
4497
4498          For now, we assume that named complex floats should go into FPRs
4499          if there are two FPRs free, otherwise they should be passed in the
4500          same way as a struct containing two floats.  */
4501       if (info->fpr_p
4502           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4503           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4504         {
4505           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4506             info->fpr_p = false;
4507           else
4508             num_words = 2;
4509         }
4510       break;
4511
4512     default:
4513       gcc_unreachable ();
4514     }
4515
4516   /* See whether the argument has doubleword alignment.  */
4517   doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4518
4519   /* Set REG_OFFSET to the register count we're interested in.
4520      The EABI allocates the floating-point registers separately,
4521      but the other ABIs allocate them like integer registers.  */
4522   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4523                       ? cum->num_fprs
4524                       : cum->num_gprs);
4525
4526   /* Advance to an even register if the argument is doubleword-aligned.  */
4527   if (doubleword_aligned_p)
4528     info->reg_offset += info->reg_offset & 1;
4529
4530   /* Work out the offset of a stack argument.  */
4531   info->stack_offset = cum->stack_words;
4532   if (doubleword_aligned_p)
4533     info->stack_offset += info->stack_offset & 1;
4534
4535   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4536
4537   /* Partition the argument between registers and stack.  */
4538   info->reg_words = MIN (num_words, max_regs);
4539   info->stack_words = num_words - info->reg_words;
4540 }
4541
4542 /* INFO describes a register argument that has the normal format for the
4543    argument's mode.  Return the register it uses, assuming that FPRs are
4544    available if HARD_FLOAT_P.  */
4545
4546 static unsigned int
4547 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4548 {
4549   if (!info->fpr_p || !hard_float_p)
4550     return GP_ARG_FIRST + info->reg_offset;
4551   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4552     /* In o32, the second argument is always passed in $f14
4553        for TARGET_DOUBLE_FLOAT, regardless of whether the
4554        first argument was a word or doubleword.  */
4555     return FP_ARG_FIRST + 2;
4556   else
4557     return FP_ARG_FIRST + info->reg_offset;
4558 }
4559
4560 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4561
4562 static bool
4563 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4564 {
4565   return !TARGET_OLDABI;
4566 }
4567
4568 /* Implement FUNCTION_ARG.  */
4569
4570 rtx
4571 mips_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4572                    tree type, int named)
4573 {
4574   struct mips_arg_info info;
4575
4576   /* We will be called with a mode of VOIDmode after the last argument
4577      has been seen.  Whatever we return will be passed to the call expander.
4578      If we need a MIPS16 fp_code, return a REG with the code stored as
4579      the mode.  */
4580   if (mode == VOIDmode)
4581     {
4582       if (TARGET_MIPS16 && cum->fp_code != 0)
4583         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4584       else
4585         return NULL;
4586     }
4587
4588   mips_get_arg_info (&info, cum, mode, type, named);
4589
4590   /* Return straight away if the whole argument is passed on the stack.  */
4591   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4592     return NULL;
4593
4594   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4595      contains a double in its entirety, then that 64-bit chunk is passed
4596      in a floating-point register.  */
4597   if (TARGET_NEWABI
4598       && TARGET_HARD_FLOAT
4599       && named
4600       && type != 0
4601       && TREE_CODE (type) == RECORD_TYPE
4602       && TYPE_SIZE_UNIT (type)
4603       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4604     {
4605       tree field;
4606
4607       /* First check to see if there is any such field.  */
4608       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4609         if (TREE_CODE (field) == FIELD_DECL
4610             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4611             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4612             && host_integerp (bit_position (field), 0)
4613             && int_bit_position (field) % BITS_PER_WORD == 0)
4614           break;
4615
4616       if (field != 0)
4617         {
4618           /* Now handle the special case by returning a PARALLEL
4619              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4620              chunks are passed in registers.  */
4621           unsigned int i;
4622           HOST_WIDE_INT bitpos;
4623           rtx ret;
4624
4625           /* assign_parms checks the mode of ENTRY_PARM, so we must
4626              use the actual mode here.  */
4627           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4628
4629           bitpos = 0;
4630           field = TYPE_FIELDS (type);
4631           for (i = 0; i < info.reg_words; i++)
4632             {
4633               rtx reg;
4634
4635               for (; field; field = TREE_CHAIN (field))
4636                 if (TREE_CODE (field) == FIELD_DECL
4637                     && int_bit_position (field) >= bitpos)
4638                   break;
4639
4640               if (field
4641                   && int_bit_position (field) == bitpos
4642                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4643                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4644                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4645               else
4646                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4647
4648               XVECEXP (ret, 0, i)
4649                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4650                                      GEN_INT (bitpos / BITS_PER_UNIT));
4651
4652               bitpos += BITS_PER_WORD;
4653             }
4654           return ret;
4655         }
4656     }
4657
4658   /* Handle the n32/n64 conventions for passing complex floating-point
4659      arguments in FPR pairs.  The real part goes in the lower register
4660      and the imaginary part goes in the upper register.  */
4661   if (TARGET_NEWABI
4662       && info.fpr_p
4663       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4664     {
4665       rtx real, imag;
4666       enum machine_mode inner;
4667       unsigned int regno;
4668
4669       inner = GET_MODE_INNER (mode);
4670       regno = FP_ARG_FIRST + info.reg_offset;
4671       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4672         {
4673           /* Real part in registers, imaginary part on stack.  */
4674           gcc_assert (info.stack_words == info.reg_words);
4675           return gen_rtx_REG (inner, regno);
4676         }
4677       else
4678         {
4679           gcc_assert (info.stack_words == 0);
4680           real = gen_rtx_EXPR_LIST (VOIDmode,
4681                                     gen_rtx_REG (inner, regno),
4682                                     const0_rtx);
4683           imag = gen_rtx_EXPR_LIST (VOIDmode,
4684                                     gen_rtx_REG (inner,
4685                                                  regno + info.reg_words / 2),
4686                                     GEN_INT (GET_MODE_SIZE (inner)));
4687           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4688         }
4689     }
4690
4691   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4692 }
4693
4694 /* Implement FUNCTION_ARG_ADVANCE.  */
4695
4696 void
4697 mips_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4698                            tree type, int named)
4699 {
4700   struct mips_arg_info info;
4701
4702   mips_get_arg_info (&info, cum, mode, type, named);
4703
4704   if (!info.fpr_p)
4705     cum->gp_reg_found = true;
4706
4707   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4708      an explanation of what this code does.  It assumes that we're using
4709      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4710      in FPRs.  */
4711   if (cum->arg_number < 2 && info.fpr_p)
4712     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4713
4714   /* Advance the register count.  This has the effect of setting
4715      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4716      argument required us to skip the final GPR and pass the whole
4717      argument on the stack.  */
4718   if (mips_abi != ABI_EABI || !info.fpr_p)
4719     cum->num_gprs = info.reg_offset + info.reg_words;
4720   else if (info.reg_words > 0)
4721     cum->num_fprs += MAX_FPRS_PER_FMT;
4722
4723   /* Advance the stack word count.  */
4724   if (info.stack_words > 0)
4725     cum->stack_words = info.stack_offset + info.stack_words;
4726
4727   cum->arg_number++;
4728 }
4729
4730 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4731
4732 static int
4733 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4734                         enum machine_mode mode, tree type, bool named)
4735 {
4736   struct mips_arg_info info;
4737
4738   mips_get_arg_info (&info, cum, mode, type, named);
4739   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4740 }
4741
4742 /* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
4743    PARM_BOUNDARY bits of alignment, but will be given anything up
4744    to STACK_BOUNDARY bits if the type requires it.  */
4745
4746 int
4747 mips_function_arg_boundary (enum machine_mode mode, tree type)
4748 {
4749   unsigned int alignment;
4750
4751   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4752   if (alignment < PARM_BOUNDARY)
4753     alignment = PARM_BOUNDARY;
4754   if (alignment > STACK_BOUNDARY)
4755     alignment = STACK_BOUNDARY;
4756   return alignment;
4757 }
4758
4759 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
4760    upward rather than downward.  In other words, return true if the
4761    first byte of the stack slot has useful data, false if the last
4762    byte does.  */
4763
4764 bool
4765 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
4766 {
4767   /* On little-endian targets, the first byte of every stack argument
4768      is passed in the first byte of the stack slot.  */
4769   if (!BYTES_BIG_ENDIAN)
4770     return true;
4771
4772   /* Otherwise, integral types are padded downward: the last byte of a
4773      stack argument is passed in the last byte of the stack slot.  */
4774   if (type != 0
4775       ? (INTEGRAL_TYPE_P (type)
4776          || POINTER_TYPE_P (type)
4777          || FIXED_POINT_TYPE_P (type))
4778       : (SCALAR_INT_MODE_P (mode)
4779          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
4780     return false;
4781
4782   /* Big-endian o64 pads floating-point arguments downward.  */
4783   if (mips_abi == ABI_O64)
4784     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4785       return false;
4786
4787   /* Other types are padded upward for o32, o64, n32 and n64.  */
4788   if (mips_abi != ABI_EABI)
4789     return true;
4790
4791   /* Arguments smaller than a stack slot are padded downward.  */
4792   if (mode != BLKmode)
4793     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
4794   else
4795     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
4796 }
4797
4798 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
4799    if the least significant byte of the register has useful data.  Return
4800    the opposite if the most significant byte does.  */
4801
4802 bool
4803 mips_pad_reg_upward (enum machine_mode mode, tree type)
4804 {
4805   /* No shifting is required for floating-point arguments.  */
4806   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4807     return !BYTES_BIG_ENDIAN;
4808
4809   /* Otherwise, apply the same padding to register arguments as we do
4810      to stack arguments.  */
4811   return mips_pad_arg_upward (mode, type);
4812 }
4813
4814 /* Return nonzero when an argument must be passed by reference.  */
4815
4816 static bool
4817 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4818                         enum machine_mode mode, const_tree type,
4819                         bool named ATTRIBUTE_UNUSED)
4820 {
4821   if (mips_abi == ABI_EABI)
4822     {
4823       int size;
4824
4825       /* ??? How should SCmode be handled?  */
4826       if (mode == DImode || mode == DFmode
4827           || mode == DQmode || mode == UDQmode
4828           || mode == DAmode || mode == UDAmode)
4829         return 0;
4830
4831       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4832       return size == -1 || size > UNITS_PER_WORD;
4833     }
4834   else
4835     {
4836       /* If we have a variable-sized parameter, we have no choice.  */
4837       return targetm.calls.must_pass_in_stack (mode, type);
4838     }
4839 }
4840
4841 /* Implement TARGET_CALLEE_COPIES.  */
4842
4843 static bool
4844 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4845                     enum machine_mode mode ATTRIBUTE_UNUSED,
4846                     const_tree type ATTRIBUTE_UNUSED, bool named)
4847 {
4848   return mips_abi == ABI_EABI && named;
4849 }
4850 \f
4851 /* See whether VALTYPE is a record whose fields should be returned in
4852    floating-point registers.  If so, return the number of fields and
4853    list them in FIELDS (which should have two elements).  Return 0
4854    otherwise.
4855
4856    For n32 & n64, a structure with one or two fields is returned in
4857    floating-point registers as long as every field has a floating-point
4858    type.  */
4859
4860 static int
4861 mips_fpr_return_fields (const_tree valtype, tree *fields)
4862 {
4863   tree field;
4864   int i;
4865
4866   if (!TARGET_NEWABI)
4867     return 0;
4868
4869   if (TREE_CODE (valtype) != RECORD_TYPE)
4870     return 0;
4871
4872   i = 0;
4873   for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
4874     {
4875       if (TREE_CODE (field) != FIELD_DECL)
4876         continue;
4877
4878       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
4879         return 0;
4880
4881       if (i == 2)
4882         return 0;
4883
4884       fields[i++] = field;
4885     }
4886   return i;
4887 }
4888
4889 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
4890    a value in the most significant part of $2/$3 if:
4891
4892       - the target is big-endian;
4893
4894       - the value has a structure or union type (we generalize this to
4895         cover aggregates from other languages too); and
4896
4897       - the structure is not returned in floating-point registers.  */
4898
4899 static bool
4900 mips_return_in_msb (const_tree valtype)
4901 {
4902   tree fields[2];
4903
4904   return (TARGET_NEWABI
4905           && TARGET_BIG_ENDIAN
4906           && AGGREGATE_TYPE_P (valtype)
4907           && mips_fpr_return_fields (valtype, fields) == 0);
4908 }
4909
4910 /* Return true if the function return value MODE will get returned in a
4911    floating-point register.  */
4912
4913 static bool
4914 mips_return_mode_in_fpr_p (enum machine_mode mode)
4915 {
4916   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
4917            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
4918            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4919           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
4920 }
4921
4922 /* Return the representation of an FPR return register when the
4923    value being returned in FP_RETURN has mode VALUE_MODE and the
4924    return type itself has mode TYPE_MODE.  On NewABI targets,
4925    the two modes may be different for structures like:
4926
4927        struct __attribute__((packed)) foo { float f; }
4928
4929    where we return the SFmode value of "f" in FP_RETURN, but where
4930    the structure itself has mode BLKmode.  */
4931
4932 static rtx
4933 mips_return_fpr_single (enum machine_mode type_mode,
4934                         enum machine_mode value_mode)
4935 {
4936   rtx x;
4937
4938   x = gen_rtx_REG (value_mode, FP_RETURN);
4939   if (type_mode != value_mode)
4940     {
4941       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
4942       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
4943     }
4944   return x;
4945 }
4946
4947 /* Return a composite value in a pair of floating-point registers.
4948    MODE1 and OFFSET1 are the mode and byte offset for the first value,
4949    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
4950    complete value.
4951
4952    For n32 & n64, $f0 always holds the first value and $f2 the second.
4953    Otherwise the values are packed together as closely as possible.  */
4954
4955 static rtx
4956 mips_return_fpr_pair (enum machine_mode mode,
4957                       enum machine_mode mode1, HOST_WIDE_INT offset1,
4958                       enum machine_mode mode2, HOST_WIDE_INT offset2)
4959 {
4960   int inc;
4961
4962   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
4963   return gen_rtx_PARALLEL
4964     (mode,
4965      gen_rtvec (2,
4966                 gen_rtx_EXPR_LIST (VOIDmode,
4967                                    gen_rtx_REG (mode1, FP_RETURN),
4968                                    GEN_INT (offset1)),
4969                 gen_rtx_EXPR_LIST (VOIDmode,
4970                                    gen_rtx_REG (mode2, FP_RETURN + inc),
4971                                    GEN_INT (offset2))));
4972
4973 }
4974
4975 /* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
4976    VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
4977    VALTYPE is null and MODE is the mode of the return value.  */
4978
4979 rtx
4980 mips_function_value (const_tree valtype, enum machine_mode mode)
4981 {
4982   if (valtype)
4983     {
4984       tree fields[2];
4985       int unsigned_p;
4986
4987       mode = TYPE_MODE (valtype);
4988       unsigned_p = TYPE_UNSIGNED (valtype);
4989
4990       /* Since TARGET_PROMOTE_FUNCTION_RETURN unconditionally returns true,
4991          we must promote the mode just as PROMOTE_MODE does.  */
4992       mode = promote_mode (valtype, mode, &unsigned_p, 1);
4993
4994       /* Handle structures whose fields are returned in $f0/$f2.  */
4995       switch (mips_fpr_return_fields (valtype, fields))
4996         {
4997         case 1:
4998           return mips_return_fpr_single (mode,
4999                                          TYPE_MODE (TREE_TYPE (fields[0])));
5000
5001         case 2:
5002           return mips_return_fpr_pair (mode,
5003                                        TYPE_MODE (TREE_TYPE (fields[0])),
5004                                        int_byte_position (fields[0]),
5005                                        TYPE_MODE (TREE_TYPE (fields[1])),
5006                                        int_byte_position (fields[1]));
5007         }
5008
5009       /* If a value is passed in the most significant part of a register, see
5010          whether we have to round the mode up to a whole number of words.  */
5011       if (mips_return_in_msb (valtype))
5012         {
5013           HOST_WIDE_INT size = int_size_in_bytes (valtype);
5014           if (size % UNITS_PER_WORD != 0)
5015             {
5016               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5017               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5018             }
5019         }
5020
5021       /* For EABI, the class of return register depends entirely on MODE.
5022          For example, "struct { some_type x; }" and "union { some_type x; }"
5023          are returned in the same way as a bare "some_type" would be.
5024          Other ABIs only use FPRs for scalar, complex or vector types.  */
5025       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5026         return gen_rtx_REG (mode, GP_RETURN);
5027     }
5028
5029   if (!TARGET_MIPS16)
5030     {
5031       /* Handle long doubles for n32 & n64.  */
5032       if (mode == TFmode)
5033         return mips_return_fpr_pair (mode,
5034                                      DImode, 0,
5035                                      DImode, GET_MODE_SIZE (mode) / 2);
5036
5037       if (mips_return_mode_in_fpr_p (mode))
5038         {
5039           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5040             return mips_return_fpr_pair (mode,
5041                                          GET_MODE_INNER (mode), 0,
5042                                          GET_MODE_INNER (mode),
5043                                          GET_MODE_SIZE (mode) / 2);
5044           else
5045             return gen_rtx_REG (mode, FP_RETURN);
5046         }
5047     }
5048
5049   return gen_rtx_REG (mode, GP_RETURN);
5050 }
5051
5052 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5053    all BLKmode objects are returned in memory.  Under the n32, n64
5054    and embedded ABIs, small structures are returned in a register.
5055    Objects with varying size must still be returned in memory, of
5056    course.  */
5057
5058 static bool
5059 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5060 {
5061   return (TARGET_OLDABI
5062           ? TYPE_MODE (type) == BLKmode
5063           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5064 }
5065 \f
5066 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5067
5068 static void
5069 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5070                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
5071                              int no_rtl)
5072 {
5073   CUMULATIVE_ARGS local_cum;
5074   int gp_saved, fp_saved;
5075
5076   /* The caller has advanced CUM up to, but not beyond, the last named
5077      argument.  Advance a local copy of CUM past the last "real" named
5078      argument, to find out how many registers are left over.  */
5079   local_cum = *cum;
5080   FUNCTION_ARG_ADVANCE (local_cum, mode, type, true);
5081
5082   /* Found out how many registers we need to save.  */
5083   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5084   fp_saved = (EABI_FLOAT_VARARGS_P
5085               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5086               : 0);
5087
5088   if (!no_rtl)
5089     {
5090       if (gp_saved > 0)
5091         {
5092           rtx ptr, mem;
5093
5094           ptr = plus_constant (virtual_incoming_args_rtx,
5095                                REG_PARM_STACK_SPACE (cfun->decl)
5096                                - gp_saved * UNITS_PER_WORD);
5097           mem = gen_frame_mem (BLKmode, ptr);
5098           set_mem_alias_set (mem, get_varargs_alias_set ());
5099
5100           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5101                                mem, gp_saved);
5102         }
5103       if (fp_saved > 0)
5104         {
5105           /* We can't use move_block_from_reg, because it will use
5106              the wrong mode.  */
5107           enum machine_mode mode;
5108           int off, i;
5109
5110           /* Set OFF to the offset from virtual_incoming_args_rtx of
5111              the first float register.  The FP save area lies below
5112              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5113           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5114           off -= fp_saved * UNITS_PER_FPREG;
5115
5116           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5117
5118           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5119                i += MAX_FPRS_PER_FMT)
5120             {
5121               rtx ptr, mem;
5122
5123               ptr = plus_constant (virtual_incoming_args_rtx, off);
5124               mem = gen_frame_mem (mode, ptr);
5125               set_mem_alias_set (mem, get_varargs_alias_set ());
5126               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5127               off += UNITS_PER_HWFPVALUE;
5128             }
5129         }
5130     }
5131   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5132     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5133                                    + fp_saved * UNITS_PER_FPREG);
5134 }
5135
5136 /* Implement TARGET_BUILTIN_VA_LIST.  */
5137
5138 static tree
5139 mips_build_builtin_va_list (void)
5140 {
5141   if (EABI_FLOAT_VARARGS_P)
5142     {
5143       /* We keep 3 pointers, and two offsets.
5144
5145          Two pointers are to the overflow area, which starts at the CFA.
5146          One of these is constant, for addressing into the GPR save area
5147          below it.  The other is advanced up the stack through the
5148          overflow region.
5149
5150          The third pointer is to the bottom of the GPR save area.
5151          Since the FPR save area is just below it, we can address
5152          FPR slots off this pointer.
5153
5154          We also keep two one-byte offsets, which are to be subtracted
5155          from the constant pointers to yield addresses in the GPR and
5156          FPR save areas.  These are downcounted as float or non-float
5157          arguments are used, and when they get to zero, the argument
5158          must be obtained from the overflow region.  */
5159       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5160       tree array, index;
5161
5162       record = lang_hooks.types.make_type (RECORD_TYPE);
5163
5164       f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
5165                            ptr_type_node);
5166       f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
5167                            ptr_type_node);
5168       f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
5169                            ptr_type_node);
5170       f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
5171                            unsigned_char_type_node);
5172       f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
5173                            unsigned_char_type_node);
5174       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5175          warn on every user file.  */
5176       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5177       array = build_array_type (unsigned_char_type_node,
5178                                 build_index_type (index));
5179       f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
5180
5181       DECL_FIELD_CONTEXT (f_ovfl) = record;
5182       DECL_FIELD_CONTEXT (f_gtop) = record;
5183       DECL_FIELD_CONTEXT (f_ftop) = record;
5184       DECL_FIELD_CONTEXT (f_goff) = record;
5185       DECL_FIELD_CONTEXT (f_foff) = record;
5186       DECL_FIELD_CONTEXT (f_res) = record;
5187
5188       TYPE_FIELDS (record) = f_ovfl;
5189       TREE_CHAIN (f_ovfl) = f_gtop;
5190       TREE_CHAIN (f_gtop) = f_ftop;
5191       TREE_CHAIN (f_ftop) = f_goff;
5192       TREE_CHAIN (f_goff) = f_foff;
5193       TREE_CHAIN (f_foff) = f_res;
5194
5195       layout_type (record);
5196       return record;
5197     }
5198   else if (TARGET_IRIX && TARGET_IRIX6)
5199     /* On IRIX 6, this type is 'char *'.  */
5200     return build_pointer_type (char_type_node);
5201   else
5202     /* Otherwise, we use 'void *'.  */
5203     return ptr_type_node;
5204 }
5205
5206 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5207
5208 static void
5209 mips_va_start (tree valist, rtx nextarg)
5210 {
5211   if (EABI_FLOAT_VARARGS_P)
5212     {
5213       const CUMULATIVE_ARGS *cum;
5214       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5215       tree ovfl, gtop, ftop, goff, foff;
5216       tree t;
5217       int gpr_save_area_size;
5218       int fpr_save_area_size;
5219       int fpr_offset;
5220
5221       cum = &crtl->args.info;
5222       gpr_save_area_size
5223         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5224       fpr_save_area_size
5225         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5226
5227       f_ovfl = TYPE_FIELDS (va_list_type_node);
5228       f_gtop = TREE_CHAIN (f_ovfl);
5229       f_ftop = TREE_CHAIN (f_gtop);
5230       f_goff = TREE_CHAIN (f_ftop);
5231       f_foff = TREE_CHAIN (f_goff);
5232
5233       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5234                      NULL_TREE);
5235       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5236                      NULL_TREE);
5237       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5238                      NULL_TREE);
5239       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5240                      NULL_TREE);
5241       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5242                      NULL_TREE);
5243
5244       /* Emit code to initialize OVFL, which points to the next varargs
5245          stack argument.  CUM->STACK_WORDS gives the number of stack
5246          words used by named arguments.  */
5247       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5248       if (cum->stack_words > 0)
5249         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
5250                     size_int (cum->stack_words * UNITS_PER_WORD));
5251       t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5252       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5253
5254       /* Emit code to initialize GTOP, the top of the GPR save area.  */
5255       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5256       t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5257       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5258
5259       /* Emit code to initialize FTOP, the top of the FPR save area.
5260          This address is gpr_save_area_bytes below GTOP, rounded
5261          down to the next fp-aligned boundary.  */
5262       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5263       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5264       fpr_offset &= -UNITS_PER_FPVALUE;
5265       if (fpr_offset)
5266         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
5267                     size_int (-fpr_offset));
5268       t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5269       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5270
5271       /* Emit code to initialize GOFF, the offset from GTOP of the
5272          next GPR argument.  */
5273       t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5274                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5275       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5276
5277       /* Likewise emit code to initialize FOFF, the offset from FTOP
5278          of the next FPR argument.  */
5279       t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5280                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5281       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5282     }
5283   else
5284     {
5285       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
5286       std_expand_builtin_va_start (valist, nextarg);
5287     }
5288 }
5289
5290 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
5291
5292 static tree
5293 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5294                            gimple_seq *post_p)
5295 {
5296   tree addr;
5297   bool indirect_p;
5298
5299   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5300   if (indirect_p)
5301     type = build_pointer_type (type);
5302
5303   if (!EABI_FLOAT_VARARGS_P)
5304     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5305   else
5306     {
5307       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5308       tree ovfl, top, off, align;
5309       HOST_WIDE_INT size, rsize, osize;
5310       tree t, u;
5311
5312       f_ovfl = TYPE_FIELDS (va_list_type_node);
5313       f_gtop = TREE_CHAIN (f_ovfl);
5314       f_ftop = TREE_CHAIN (f_gtop);
5315       f_goff = TREE_CHAIN (f_ftop);
5316       f_foff = TREE_CHAIN (f_goff);
5317
5318       /* Let:
5319
5320          TOP be the top of the GPR or FPR save area;
5321          OFF be the offset from TOP of the next register;
5322          ADDR_RTX be the address of the argument;
5323          SIZE be the number of bytes in the argument type;
5324          RSIZE be the number of bytes used to store the argument
5325            when it's in the register save area; and
5326          OSIZE be the number of bytes used to store it when it's
5327            in the stack overflow area.
5328
5329          The code we want is:
5330
5331          1: off &= -rsize;        // round down
5332          2: if (off != 0)
5333          3:   {
5334          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
5335          5:     off -= rsize;
5336          6:   }
5337          7: else
5338          8:   {
5339          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
5340          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
5341          11:    ovfl += osize;
5342          14:  }
5343
5344          [1] and [9] can sometimes be optimized away.  */
5345
5346       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5347                      NULL_TREE);
5348       size = int_size_in_bytes (type);
5349
5350       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
5351           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
5352         {
5353           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
5354                         unshare_expr (valist), f_ftop, NULL_TREE);
5355           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
5356                         unshare_expr (valist), f_foff, NULL_TREE);
5357
5358           /* When va_start saves FPR arguments to the stack, each slot
5359              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
5360              argument's precision.  */
5361           rsize = UNITS_PER_HWFPVALUE;
5362
5363           /* Overflow arguments are padded to UNITS_PER_WORD bytes
5364              (= PARM_BOUNDARY bits).  This can be different from RSIZE
5365              in two cases:
5366
5367              (1) On 32-bit targets when TYPE is a structure such as:
5368
5369              struct s { float f; };
5370
5371              Such structures are passed in paired FPRs, so RSIZE
5372              will be 8 bytes.  However, the structure only takes
5373              up 4 bytes of memory, so OSIZE will only be 4.
5374
5375              (2) In combinations such as -mgp64 -msingle-float
5376              -fshort-double.  Doubles passed in registers will then take
5377              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
5378              stack take up UNITS_PER_WORD bytes.  */
5379           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
5380         }
5381       else
5382         {
5383           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
5384                         unshare_expr (valist), f_gtop, NULL_TREE);
5385           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
5386                         unshare_expr (valist), f_goff, NULL_TREE);
5387           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5388           if (rsize > UNITS_PER_WORD)
5389             {
5390               /* [1] Emit code for: off &= -rsize.      */
5391               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
5392                           build_int_cst (TREE_TYPE (off), -rsize));
5393               gimplify_assign (unshare_expr (off), t, pre_p);
5394             }
5395           osize = rsize;
5396         }
5397
5398       /* [2] Emit code to branch if off == 0.  */
5399       t = build2 (NE_EXPR, boolean_type_node, off,
5400                   build_int_cst (TREE_TYPE (off), 0));
5401       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
5402
5403       /* [5] Emit code for: off -= rsize.  We do this as a form of
5404          post-decrement not available to C.  */
5405       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
5406       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
5407
5408       /* [4] Emit code for:
5409          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
5410       t = fold_convert (sizetype, t);
5411       t = fold_build1 (NEGATE_EXPR, sizetype, t);
5412       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
5413       if (BYTES_BIG_ENDIAN && rsize > size)
5414         {
5415           u = size_int (rsize - size);
5416           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5417         }
5418       COND_EXPR_THEN (addr) = t;
5419
5420       if (osize > UNITS_PER_WORD)
5421         {
5422           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
5423           u = size_int (osize - 1);
5424           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
5425                       unshare_expr (ovfl), u);
5426           t = fold_convert (sizetype, t);
5427           u = size_int (-osize);
5428           t = build2 (BIT_AND_EXPR, sizetype, t, u);
5429           t = fold_convert (TREE_TYPE (ovfl), t);
5430           align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
5431                           unshare_expr (ovfl), t);
5432         }
5433       else
5434         align = NULL;
5435
5436       /* [10, 11] Emit code for:
5437          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
5438          ovfl += osize.  */
5439       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
5440       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5441       if (BYTES_BIG_ENDIAN && osize > size)
5442         {
5443           u = size_int (osize - size);
5444           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5445         }
5446
5447       /* String [9] and [10, 11] together.  */
5448       if (align)
5449         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5450       COND_EXPR_ELSE (addr) = t;
5451
5452       addr = fold_convert (build_pointer_type (type), addr);
5453       addr = build_va_arg_indirect_ref (addr);
5454     }
5455
5456   if (indirect_p)
5457     addr = build_va_arg_indirect_ref (addr);
5458
5459   return addr;
5460 }
5461 \f
5462 /* Start a definition of function NAME.  MIPS16_P indicates whether the
5463    function contains MIPS16 code.  */
5464
5465 static void
5466 mips_start_function_definition (const char *name, bool mips16_p)
5467 {
5468   if (mips16_p)
5469     fprintf (asm_out_file, "\t.set\tmips16\n");
5470   else
5471     fprintf (asm_out_file, "\t.set\tnomips16\n");
5472
5473   if (!flag_inhibit_size_directive)
5474     {
5475       fputs ("\t.ent\t", asm_out_file);
5476       assemble_name (asm_out_file, name);
5477       fputs ("\n", asm_out_file);
5478     }
5479
5480   ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
5481
5482   /* Start the definition proper.  */
5483   assemble_name (asm_out_file, name);
5484   fputs (":\n", asm_out_file);
5485 }
5486
5487 /* End a function definition started by mips_start_function_definition.  */
5488
5489 static void
5490 mips_end_function_definition (const char *name)
5491 {
5492   if (!flag_inhibit_size_directive)
5493     {
5494       fputs ("\t.end\t", asm_out_file);
5495       assemble_name (asm_out_file, name);
5496       fputs ("\n", asm_out_file);
5497     }
5498 }
5499 \f
5500 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5501
5502 static bool
5503 mips_ok_for_lazy_binding_p (rtx x)
5504 {
5505   return (TARGET_USE_GOT
5506           && GET_CODE (x) == SYMBOL_REF
5507           && !SYMBOL_REF_BIND_NOW_P (x)
5508           && !mips_symbol_binds_local_p (x));
5509 }
5510
5511 /* Load function address ADDR into register DEST.  TYPE is as for
5512    mips_expand_call.  Return true if we used an explicit lazy-binding
5513    sequence.  */
5514
5515 static bool
5516 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
5517 {
5518   /* If we're generating PIC, and this call is to a global function,
5519      try to allow its address to be resolved lazily.  This isn't
5520      possible for sibcalls when $gp is call-saved because the value
5521      of $gp on entry to the stub would be our caller's gp, not ours.  */
5522   if (TARGET_EXPLICIT_RELOCS
5523       && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
5524       && mips_ok_for_lazy_binding_p (addr))
5525     {
5526       addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
5527       emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
5528       return true;
5529     }
5530   else
5531     {
5532       mips_emit_move (dest, addr);
5533       return false;
5534     }
5535 }
5536 \f
5537 /* Each locally-defined hard-float MIPS16 function has a local symbol
5538    associated with it.  This hash table maps the function symbol (FUNC)
5539    to the local symbol (LOCAL). */
5540 struct GTY(()) mips16_local_alias {
5541   rtx func;
5542   rtx local;
5543 };
5544 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
5545
5546 /* Hash table callbacks for mips16_local_aliases.  */
5547
5548 static hashval_t
5549 mips16_local_aliases_hash (const void *entry)
5550 {
5551   const struct mips16_local_alias *alias;
5552
5553   alias = (const struct mips16_local_alias *) entry;
5554   return htab_hash_string (XSTR (alias->func, 0));
5555 }
5556
5557 static int
5558 mips16_local_aliases_eq (const void *entry1, const void *entry2)
5559 {
5560   const struct mips16_local_alias *alias1, *alias2;
5561
5562   alias1 = (const struct mips16_local_alias *) entry1;
5563   alias2 = (const struct mips16_local_alias *) entry2;
5564   return rtx_equal_p (alias1->func, alias2->func);
5565 }
5566
5567 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
5568    Return a local alias for it, creating a new one if necessary.  */
5569
5570 static rtx
5571 mips16_local_alias (rtx func)
5572 {
5573   struct mips16_local_alias *alias, tmp_alias;
5574   void **slot;
5575
5576   /* Create the hash table if this is the first call.  */
5577   if (mips16_local_aliases == NULL)
5578     mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
5579                                             mips16_local_aliases_eq, NULL);
5580
5581   /* Look up the function symbol, creating a new entry if need be.  */
5582   tmp_alias.func = func;
5583   slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
5584   gcc_assert (slot != NULL);
5585
5586   alias = (struct mips16_local_alias *) *slot;
5587   if (alias == NULL)
5588     {
5589       const char *func_name, *local_name;
5590       rtx local;
5591
5592       /* Create a new SYMBOL_REF for the local symbol.  The choice of
5593          __fn_local_* is based on the __fn_stub_* names that we've
5594          traditionally used for the non-MIPS16 stub.  */
5595       func_name = targetm.strip_name_encoding (XSTR (func, 0));
5596       local_name = ACONCAT (("__fn_local_", func_name, NULL));
5597       local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
5598       SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
5599
5600       /* Create a new structure to represent the mapping.  */
5601       alias = GGC_NEW (struct mips16_local_alias);
5602       alias->func = func;
5603       alias->local = local;
5604       *slot = alias;
5605     }
5606   return alias->local;
5607 }
5608 \f
5609 /* A chained list of functions for which mips16_build_call_stub has already
5610    generated a stub.  NAME is the name of the function and FP_RET_P is true
5611    if the function returns a value in floating-point registers.  */
5612 struct mips16_stub {
5613   struct mips16_stub *next;
5614   char *name;
5615   bool fp_ret_p;
5616 };
5617 static struct mips16_stub *mips16_stubs;
5618
5619 /* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
5620
5621 static rtx
5622 mips16_stub_function (const char *name)
5623 {
5624   rtx x;
5625
5626   x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
5627   SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
5628   return x;
5629 }
5630
5631 /* Return the two-character string that identifies floating-point
5632    return mode MODE in the name of a MIPS16 function stub.  */
5633
5634 static const char *
5635 mips16_call_stub_mode_suffix (enum machine_mode mode)
5636 {
5637   if (mode == SFmode)
5638     return "sf";
5639   else if (mode == DFmode)
5640     return "df";
5641   else if (mode == SCmode)
5642     return "sc";
5643   else if (mode == DCmode)
5644     return "dc";
5645   else if (mode == V2SFmode)
5646     return "df";
5647   else
5648     gcc_unreachable ();
5649 }
5650
5651 /* Write instructions to move a 32-bit value between general register
5652    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5653    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5654
5655 static void
5656 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5657 {
5658   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5659            reg_names[gpreg], reg_names[fpreg]);
5660 }
5661
5662 /* Likewise for 64-bit values.  */
5663
5664 static void
5665 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5666 {
5667   if (TARGET_64BIT)
5668     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5669              reg_names[gpreg], reg_names[fpreg]);
5670   else if (TARGET_FLOAT64)
5671     {
5672       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5673                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5674       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5675                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5676     }
5677   else
5678     {
5679       /* Move the least-significant word.  */
5680       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5681                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5682       /* ...then the most significant word.  */
5683       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5684                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
5685     }
5686 }
5687
5688 /* Write out code to move floating-point arguments into or out of
5689    general registers.  FP_CODE is the code describing which arguments
5690    are present (see the comment above the definition of CUMULATIVE_ARGS
5691    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
5692
5693 static void
5694 mips_output_args_xfer (int fp_code, char direction)
5695 {
5696   unsigned int gparg, fparg, f;
5697   CUMULATIVE_ARGS cum;
5698
5699   /* This code only works for o32 and o64.  */
5700   gcc_assert (TARGET_OLDABI);
5701
5702   mips_init_cumulative_args (&cum, NULL);
5703
5704   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5705     {
5706       enum machine_mode mode;
5707       struct mips_arg_info info;
5708
5709       if ((f & 3) == 1)
5710         mode = SFmode;
5711       else if ((f & 3) == 2)
5712         mode = DFmode;
5713       else
5714         gcc_unreachable ();
5715
5716       mips_get_arg_info (&info, &cum, mode, NULL, true);
5717       gparg = mips_arg_regno (&info, false);
5718       fparg = mips_arg_regno (&info, true);
5719
5720       if (mode == SFmode)
5721         mips_output_32bit_xfer (direction, gparg, fparg);
5722       else
5723         mips_output_64bit_xfer (direction, gparg, fparg);
5724
5725       mips_function_arg_advance (&cum, mode, NULL, true);
5726     }
5727 }
5728
5729 /* Write a MIPS16 stub for the current function.  This stub is used
5730    for functions which take arguments in the floating-point registers.
5731    It is normal-mode code that moves the floating-point arguments
5732    into the general registers and then jumps to the MIPS16 code.  */
5733
5734 static void
5735 mips16_build_function_stub (void)
5736 {
5737   const char *fnname, *alias_name, *separator;
5738   char *secname, *stubname;
5739   tree stubdecl;
5740   unsigned int f;
5741   rtx symbol, alias;
5742
5743   /* Create the name of the stub, and its unique section.  */
5744   symbol = XEXP (DECL_RTL (current_function_decl), 0);
5745   alias = mips16_local_alias (symbol);
5746
5747   fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
5748   alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
5749   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
5750   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
5751
5752   /* Build a decl for the stub.  */
5753   stubdecl = build_decl (FUNCTION_DECL, get_identifier (stubname),
5754                          build_function_type (void_type_node, NULL_TREE));
5755   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5756   DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
5757
5758   /* Output a comment.  */
5759   fprintf (asm_out_file, "\t# Stub function for %s (",
5760            current_function_name ());
5761   separator = "";
5762   for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
5763     {
5764       fprintf (asm_out_file, "%s%s", separator,
5765                (f & 3) == 1 ? "float" : "double");
5766       separator = ", ";
5767     }
5768   fprintf (asm_out_file, ")\n");
5769
5770   /* Start the function definition.  */
5771   assemble_start_function (stubdecl, stubname);
5772   mips_start_function_definition (stubname, false);
5773
5774   /* If generating pic2 code, either set up the global pointer or
5775      switch to pic0.  */
5776   if (TARGET_ABICALLS_PIC2)
5777     {
5778       if (TARGET_ABSOLUTE_ABICALLS)
5779         fprintf (asm_out_file, "\t.option\tpic0\n");
5780       else
5781         {
5782           output_asm_insn ("%(.cpload\t%^%)", NULL);
5783           /* Emit an R_MIPS_NONE relocation to tell the linker what the
5784              target function is.  Use a local GOT access when loading the
5785              symbol, to cut down on the number of unnecessary GOT entries
5786              for stubs that aren't needed.  */
5787           output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
5788           symbol = alias;
5789         }
5790     }
5791
5792   /* Load the address of the MIPS16 function into $25.  Do this first so
5793      that targets with coprocessor interlocks can use an MFC1 to fill the
5794      delay slot.  */
5795   output_asm_insn ("la\t%^,%0", &symbol);
5796
5797   /* Move the arguments from floating-point registers to general registers.  */
5798   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
5799
5800   /* Jump to the MIPS16 function.  */
5801   output_asm_insn ("jr\t%^", NULL);
5802
5803   if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
5804     fprintf (asm_out_file, "\t.option\tpic2\n");
5805
5806   mips_end_function_definition (stubname);
5807
5808   /* If the linker needs to create a dynamic symbol for the target
5809      function, it will associate the symbol with the stub (which,
5810      unlike the target function, follows the proper calling conventions).
5811      It is therefore useful to have a local alias for the target function,
5812      so that it can still be identified as MIPS16 code.  As an optimization,
5813      this symbol can also be used for indirect MIPS16 references from
5814      within this file.  */
5815   ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
5816
5817   switch_to_section (function_section (current_function_decl));
5818 }
5819
5820 /* The current function is a MIPS16 function that returns a value in an FPR.
5821    Copy the return value from its soft-float to its hard-float location.
5822    libgcc2 has special non-MIPS16 helper functions for each case.  */
5823
5824 static void
5825 mips16_copy_fpr_return_value (void)
5826 {
5827   rtx fn, insn, retval;
5828   tree return_type;
5829   enum machine_mode return_mode;
5830   const char *name;
5831
5832   return_type = DECL_RESULT (current_function_decl);
5833   return_mode = DECL_MODE (return_type);
5834
5835   name = ACONCAT (("__mips16_ret_",
5836                    mips16_call_stub_mode_suffix (return_mode),
5837                    NULL));
5838   fn = mips16_stub_function (name);
5839
5840   /* The function takes arguments in $2 (and possibly $3), so calls
5841      to it cannot be lazily bound.  */
5842   SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
5843
5844   /* Model the call as something that takes the GPR return value as
5845      argument and returns an "updated" value.  */
5846   retval = gen_rtx_REG (return_mode, GP_RETURN);
5847   insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
5848                            const0_rtx, NULL_RTX, false);
5849   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
5850 }
5851
5852 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
5853    RETVAL is the location of the return value, or null if this is
5854    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
5855    arguments and FP_CODE is the code built by mips_function_arg;
5856    see the comment above CUMULATIVE_ARGS for details.
5857
5858    There are three alternatives:
5859
5860    - If a stub was needed, emit the call and return the call insn itself.
5861
5862    - If we can avoid using a stub by redirecting the call, set *FN_PTR
5863      to the new target and return null.
5864
5865    - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
5866      unmodified.
5867
5868    A stub is needed for calls to functions that, in normal mode,
5869    receive arguments in FPRs or return values in FPRs.  The stub
5870    copies the arguments from their soft-float positions to their
5871    hard-float positions, calls the real function, then copies the
5872    return value from its hard-float position to its soft-float
5873    position.
5874
5875    We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
5876    If *FN_PTR turns out to be to a non-MIPS16 function, the linker
5877    automatically redirects the JAL to the stub, otherwise the JAL
5878    continues to call FN directly.  */
5879
5880 static rtx
5881 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
5882 {
5883   const char *fnname;
5884   bool fp_ret_p;
5885   struct mips16_stub *l;
5886   rtx insn, fn;
5887
5888   /* We don't need to do anything if we aren't in MIPS16 mode, or if
5889      we were invoked with the -msoft-float option.  */
5890   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
5891     return NULL_RTX;
5892
5893   /* Figure out whether the value might come back in a floating-point
5894      register.  */
5895   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
5896
5897   /* We don't need to do anything if there were no floating-point
5898      arguments and the value will not be returned in a floating-point
5899      register.  */
5900   if (fp_code == 0 && !fp_ret_p)
5901     return NULL_RTX;
5902
5903   /* We don't need to do anything if this is a call to a special
5904      MIPS16 support function.  */
5905   fn = *fn_ptr;
5906   if (mips16_stub_function_p (fn))
5907     return NULL_RTX;
5908
5909   /* This code will only work for o32 and o64 abis.  The other ABI's
5910      require more sophisticated support.  */
5911   gcc_assert (TARGET_OLDABI);
5912
5913   /* If we're calling via a function pointer, use one of the magic
5914      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
5915      Each stub expects the function address to arrive in register $2.  */
5916   if (GET_CODE (fn) != SYMBOL_REF
5917       || !call_insn_operand (fn, VOIDmode))
5918     {
5919       char buf[30];
5920       rtx stub_fn, insn, addr;
5921       bool lazy_p;
5922
5923       /* If this is a locally-defined and locally-binding function,
5924          avoid the stub by calling the local alias directly.  */
5925       if (mips16_local_function_p (fn))
5926         {
5927           *fn_ptr = mips16_local_alias (fn);
5928           return NULL_RTX;
5929         }
5930
5931       /* Create a SYMBOL_REF for the libgcc.a function.  */
5932       if (fp_ret_p)
5933         sprintf (buf, "__mips16_call_stub_%s_%d",
5934                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
5935                  fp_code);
5936       else
5937         sprintf (buf, "__mips16_call_stub_%d", fp_code);
5938       stub_fn = mips16_stub_function (buf);
5939
5940       /* The function uses $2 as an argument, so calls to it
5941          cannot be lazily bound.  */
5942       SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
5943
5944       /* Load the target function into $2.  */
5945       addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
5946       lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
5947
5948       /* Emit the call.  */
5949       insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
5950                                args_size, NULL_RTX, lazy_p);
5951
5952       /* Tell GCC that this call does indeed use the value of $2.  */
5953       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
5954
5955       /* If we are handling a floating-point return value, we need to
5956          save $18 in the function prologue.  Putting a note on the
5957          call will mean that df_regs_ever_live_p ($18) will be true if the
5958          call is not eliminated, and we can check that in the prologue
5959          code.  */
5960       if (fp_ret_p)
5961         CALL_INSN_FUNCTION_USAGE (insn) =
5962           gen_rtx_EXPR_LIST (VOIDmode,
5963                              gen_rtx_CLOBBER (VOIDmode,
5964                                               gen_rtx_REG (word_mode, 18)),
5965                              CALL_INSN_FUNCTION_USAGE (insn));
5966
5967       return insn;
5968     }
5969
5970   /* We know the function we are going to call.  If we have already
5971      built a stub, we don't need to do anything further.  */
5972   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
5973   for (l = mips16_stubs; l != NULL; l = l->next)
5974     if (strcmp (l->name, fnname) == 0)
5975       break;
5976
5977   if (l == NULL)
5978     {
5979       const char *separator;
5980       char *secname, *stubname;
5981       tree stubid, stubdecl;
5982       unsigned int f;
5983
5984       /* If the function does not return in FPRs, the special stub
5985          section is named
5986              .mips16.call.FNNAME
5987
5988          If the function does return in FPRs, the stub section is named
5989              .mips16.call.fp.FNNAME
5990
5991          Build a decl for the stub.  */
5992       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
5993                           fnname, NULL));
5994       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
5995                            fnname, NULL));
5996       stubid = get_identifier (stubname);
5997       stubdecl = build_decl (FUNCTION_DECL, stubid,
5998                              build_function_type (void_type_node, NULL_TREE));
5999       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6000       DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE,
6001                                            void_type_node);
6002
6003       /* Output a comment.  */
6004       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6005                (fp_ret_p
6006                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6007                 : ""),
6008                fnname);
6009       separator = "";
6010       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6011         {
6012           fprintf (asm_out_file, "%s%s", separator,
6013                    (f & 3) == 1 ? "float" : "double");
6014           separator = ", ";
6015         }
6016       fprintf (asm_out_file, ")\n");
6017
6018       /* Start the function definition.  */
6019       assemble_start_function (stubdecl, stubname);
6020       mips_start_function_definition (stubname, false);
6021
6022       if (!fp_ret_p)
6023         {
6024           /* Load the address of the MIPS16 function into $25.  Do this
6025              first so that targets with coprocessor interlocks can use
6026              an MFC1 to fill the delay slot.  */
6027           if (TARGET_EXPLICIT_RELOCS)
6028             {
6029               output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6030               output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6031             }
6032           else
6033             output_asm_insn ("la\t%^,%0", &fn);
6034         }
6035
6036       /* Move the arguments from general registers to floating-point
6037          registers.  */
6038       mips_output_args_xfer (fp_code, 't');
6039
6040       if (!fp_ret_p)
6041         {
6042           /* Jump to the previously-loaded address.  */
6043           output_asm_insn ("jr\t%^", NULL);
6044         }
6045       else
6046         {
6047           /* Save the return address in $18 and call the non-MIPS16 function.
6048              The stub's caller knows that $18 might be clobbered, even though
6049              $18 is usually a call-saved register.  */
6050           fprintf (asm_out_file, "\tmove\t%s,%s\n",
6051                    reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
6052           output_asm_insn (MIPS_CALL ("jal", &fn, 0), &fn);
6053
6054           /* Move the result from floating-point registers to
6055              general registers.  */
6056           switch (GET_MODE (retval))
6057             {
6058             case SCmode:
6059               mips_output_32bit_xfer ('f', GP_RETURN + 1,
6060                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6061               /* Fall though.  */
6062             case SFmode:
6063               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6064               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6065                 {
6066                   /* On 64-bit targets, complex floats are returned in
6067                      a single GPR, such that "sd" on a suitably-aligned
6068                      target would store the value correctly.  */
6069                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6070                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6071                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6072                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6073                            reg_names[GP_RETURN],
6074                            reg_names[GP_RETURN],
6075                            reg_names[GP_RETURN + 1]);
6076                 }
6077               break;
6078
6079             case DCmode:
6080               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6081                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6082               /* Fall though.  */
6083             case DFmode:
6084             case V2SFmode:
6085               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6086               break;
6087
6088             default:
6089               gcc_unreachable ();
6090             }
6091           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6092         }
6093
6094 #ifdef ASM_DECLARE_FUNCTION_SIZE
6095       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6096 #endif
6097
6098       mips_end_function_definition (stubname);
6099
6100       /* Record this stub.  */
6101       l = XNEW (struct mips16_stub);
6102       l->name = xstrdup (fnname);
6103       l->fp_ret_p = fp_ret_p;
6104       l->next = mips16_stubs;
6105       mips16_stubs = l;
6106     }
6107
6108   /* If we expect a floating-point return value, but we've built a
6109      stub which does not expect one, then we're in trouble.  We can't
6110      use the existing stub, because it won't handle the floating-point
6111      value.  We can't build a new stub, because the linker won't know
6112      which stub to use for the various calls in this object file.
6113      Fortunately, this case is illegal, since it means that a function
6114      was declared in two different ways in a single compilation.  */
6115   if (fp_ret_p && !l->fp_ret_p)
6116     error ("cannot handle inconsistent calls to %qs", fnname);
6117
6118   if (retval == NULL_RTX)
6119     insn = gen_call_internal_direct (fn, args_size);
6120   else
6121     insn = gen_call_value_internal_direct (retval, fn, args_size);
6122   insn = mips_emit_call_insn (insn, fn, fn, false);
6123
6124   /* If we are calling a stub which handles a floating-point return
6125      value, we need to arrange to save $18 in the prologue.  We do this
6126      by marking the function call as using the register.  The prologue
6127      will later see that it is used, and emit code to save it.  */
6128   if (fp_ret_p)
6129     CALL_INSN_FUNCTION_USAGE (insn) =
6130       gen_rtx_EXPR_LIST (VOIDmode,
6131                          gen_rtx_CLOBBER (VOIDmode,
6132                                           gen_rtx_REG (word_mode, 18)),
6133                          CALL_INSN_FUNCTION_USAGE (insn));
6134
6135   return insn;
6136 }
6137 \f
6138 /* Expand a call of type TYPE.  RESULT is where the result will go (null
6139    for "call"s and "sibcall"s), ADDR is the address of the function,
6140    ARGS_SIZE is the size of the arguments and AUX is the value passed
6141    to us by mips_function_arg.  LAZY_P is true if this call already
6142    involves a lazily-bound function address (such as when calling
6143    functions through a MIPS16 hard-float stub).
6144
6145    Return the call itself.  */
6146
6147 rtx
6148 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6149                   rtx args_size, rtx aux, bool lazy_p)
6150 {
6151   rtx orig_addr, pattern, insn;
6152   int fp_code;
6153
6154   fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6155   insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6156   if (insn)
6157     {
6158       gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6159       return insn;
6160     }
6161                                  ;
6162   orig_addr = addr;
6163   if (!call_insn_operand (addr, VOIDmode))
6164     {
6165       if (type == MIPS_CALL_EPILOGUE)
6166         addr = MIPS_EPILOGUE_TEMP (Pmode);
6167       else
6168         addr = gen_reg_rtx (Pmode);
6169       lazy_p |= mips_load_call_address (type, addr, orig_addr);
6170     }
6171
6172   if (result == 0)
6173     {
6174       rtx (*fn) (rtx, rtx);
6175
6176       if (type == MIPS_CALL_EPILOGUE && TARGET_SPLIT_CALLS)
6177         fn = gen_call_split;
6178       else if (type == MIPS_CALL_SIBCALL)
6179         fn = gen_sibcall_internal;
6180       else
6181         fn = gen_call_internal;
6182
6183       pattern = fn (addr, args_size);
6184     }
6185   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6186     {
6187       /* Handle return values created by mips_return_fpr_pair.  */
6188       rtx (*fn) (rtx, rtx, rtx, rtx);
6189       rtx reg1, reg2;
6190
6191       if (type == MIPS_CALL_EPILOGUE && TARGET_SPLIT_CALLS)
6192         fn = gen_call_value_multiple_split;
6193       else if (type == MIPS_CALL_SIBCALL)
6194         fn = gen_sibcall_value_multiple_internal;
6195       else
6196         fn = gen_call_value_multiple_internal;
6197
6198       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6199       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6200       pattern = fn (reg1, addr, args_size, reg2);
6201     }
6202   else
6203     {
6204       rtx (*fn) (rtx, rtx, rtx);
6205
6206       if (type == MIPS_CALL_EPILOGUE && TARGET_SPLIT_CALLS)
6207         fn = gen_call_value_split;
6208       else if (type == MIPS_CALL_SIBCALL)
6209         fn = gen_sibcall_value_internal;
6210       else
6211         fn = gen_call_value_internal;
6212
6213       /* Handle return values created by mips_return_fpr_single.  */
6214       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6215         result = XEXP (XVECEXP (result, 0, 0), 0);
6216       pattern = fn (result, addr, args_size);
6217     }
6218
6219   return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6220 }
6221
6222 /* Split call instruction INSN into a $gp-clobbering call and
6223    (where necessary) an instruction to restore $gp from its save slot.
6224    CALL_PATTERN is the pattern of the new call.  */
6225
6226 void
6227 mips_split_call (rtx insn, rtx call_pattern)
6228 {
6229   rtx new_insn;
6230
6231   new_insn = emit_call_insn (call_pattern);
6232   CALL_INSN_FUNCTION_USAGE (new_insn)
6233     = copy_rtx (CALL_INSN_FUNCTION_USAGE (insn));
6234   if (!find_reg_note (insn, REG_NORETURN, 0))
6235     /* Pick a temporary register that is suitable for both MIPS16 and
6236        non-MIPS16 code.  $4 and $5 are used for returning complex double
6237        values in soft-float code, so $6 is the first suitable candidate.  */
6238     mips_restore_gp (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6239 }
6240
6241 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
6242
6243 static bool
6244 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
6245 {
6246   if (!TARGET_SIBCALLS)
6247     return false;
6248
6249   /* Interrupt handlers need special epilogue code and therefore can't
6250      use sibcalls.  */
6251   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
6252     return false;
6253
6254   /* We can't do a sibcall if the called function is a MIPS16 function
6255      because there is no direct "jx" instruction equivalent to "jalx" to
6256      switch the ISA mode.  We only care about cases where the sibling
6257      and normal calls would both be direct.  */
6258   if (decl
6259       && mips_use_mips16_mode_p (decl)
6260       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6261     return false;
6262
6263   /* When -minterlink-mips16 is in effect, assume that non-locally-binding
6264      functions could be MIPS16 ones unless an attribute explicitly tells
6265      us otherwise.  */
6266   if (TARGET_INTERLINK_MIPS16
6267       && decl
6268       && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
6269       && !mips_nomips16_decl_p (decl)
6270       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6271     return false;
6272
6273   /* Otherwise OK.  */
6274   return true;
6275 }
6276 \f
6277 /* Emit code to move general operand SRC into condition-code
6278    register DEST given that SCRATCH is a scratch TFmode FPR.
6279    The sequence is:
6280
6281         FP1 = SRC
6282         FP2 = 0.0f
6283         DEST = FP2 < FP1
6284
6285    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
6286
6287 void
6288 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
6289 {
6290   rtx fp1, fp2;
6291
6292   /* Change the source to SFmode.  */
6293   if (MEM_P (src))
6294     src = adjust_address (src, SFmode, 0);
6295   else if (REG_P (src) || GET_CODE (src) == SUBREG)
6296     src = gen_rtx_REG (SFmode, true_regnum (src));
6297
6298   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
6299   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
6300
6301   mips_emit_move (copy_rtx (fp1), src);
6302   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
6303   emit_insn (gen_slt_sf (dest, fp2, fp1));
6304 }
6305 \f
6306 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
6307    Assume that the areas do not overlap.  */
6308
6309 static void
6310 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
6311 {
6312   HOST_WIDE_INT offset, delta;
6313   unsigned HOST_WIDE_INT bits;
6314   int i;
6315   enum machine_mode mode;
6316   rtx *regs;
6317
6318   /* Work out how many bits to move at a time.  If both operands have
6319      half-word alignment, it is usually better to move in half words.
6320      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
6321      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
6322      Otherwise move word-sized chunks.  */
6323   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
6324       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
6325     bits = BITS_PER_WORD / 2;
6326   else
6327     bits = BITS_PER_WORD;
6328
6329   mode = mode_for_size (bits, MODE_INT, 0);
6330   delta = bits / BITS_PER_UNIT;
6331
6332   /* Allocate a buffer for the temporary registers.  */
6333   regs = XALLOCAVEC (rtx, length / delta);
6334
6335   /* Load as many BITS-sized chunks as possible.  Use a normal load if
6336      the source has enough alignment, otherwise use left/right pairs.  */
6337   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6338     {
6339       regs[i] = gen_reg_rtx (mode);
6340       if (MEM_ALIGN (src) >= bits)
6341         mips_emit_move (regs[i], adjust_address (src, mode, offset));
6342       else
6343         {
6344           rtx part = adjust_address (src, BLKmode, offset);
6345           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
6346             gcc_unreachable ();
6347         }
6348     }
6349
6350   /* Copy the chunks to the destination.  */
6351   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6352     if (MEM_ALIGN (dest) >= bits)
6353       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
6354     else
6355       {
6356         rtx part = adjust_address (dest, BLKmode, offset);
6357         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
6358           gcc_unreachable ();
6359       }
6360
6361   /* Mop up any left-over bytes.  */
6362   if (offset < length)
6363     {
6364       src = adjust_address (src, BLKmode, offset);
6365       dest = adjust_address (dest, BLKmode, offset);
6366       move_by_pieces (dest, src, length - offset,
6367                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
6368     }
6369 }
6370
6371 /* Helper function for doing a loop-based block operation on memory
6372    reference MEM.  Each iteration of the loop will operate on LENGTH
6373    bytes of MEM.
6374
6375    Create a new base register for use within the loop and point it to
6376    the start of MEM.  Create a new memory reference that uses this
6377    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
6378
6379 static void
6380 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
6381                        rtx *loop_reg, rtx *loop_mem)
6382 {
6383   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
6384
6385   /* Although the new mem does not refer to a known location,
6386      it does keep up to LENGTH bytes of alignment.  */
6387   *loop_mem = change_address (mem, BLKmode, *loop_reg);
6388   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
6389 }
6390
6391 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
6392    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
6393    the memory regions do not overlap.  */
6394
6395 static void
6396 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
6397                       HOST_WIDE_INT bytes_per_iter)
6398 {
6399   rtx label, src_reg, dest_reg, final_src;
6400   HOST_WIDE_INT leftover;
6401
6402   leftover = length % bytes_per_iter;
6403   length -= leftover;
6404
6405   /* Create registers and memory references for use within the loop.  */
6406   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
6407   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
6408
6409   /* Calculate the value that SRC_REG should have after the last iteration
6410      of the loop.  */
6411   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
6412                                    0, 0, OPTAB_WIDEN);
6413
6414   /* Emit the start of the loop.  */
6415   label = gen_label_rtx ();
6416   emit_label (label);
6417
6418   /* Emit the loop body.  */
6419   mips_block_move_straight (dest, src, bytes_per_iter);
6420
6421   /* Move on to the next block.  */
6422   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
6423   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
6424
6425   /* Emit the loop condition.  */
6426   if (Pmode == DImode)
6427     emit_insn (gen_cmpdi (src_reg, final_src));
6428   else
6429     emit_insn (gen_cmpsi (src_reg, final_src));
6430   emit_jump_insn (gen_bne (label));
6431
6432   /* Mop up any left-over bytes.  */
6433   if (leftover)
6434     mips_block_move_straight (dest, src, leftover);
6435 }
6436
6437 /* Expand a movmemsi instruction, which copies LENGTH bytes from
6438    memory reference SRC to memory reference DEST.  */
6439
6440 bool
6441 mips_expand_block_move (rtx dest, rtx src, rtx length)
6442 {
6443   if (GET_CODE (length) == CONST_INT)
6444     {
6445       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
6446         {
6447           mips_block_move_straight (dest, src, INTVAL (length));
6448           return true;
6449         }
6450       else if (optimize)
6451         {
6452           mips_block_move_loop (dest, src, INTVAL (length),
6453                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
6454           return true;
6455         }
6456     }
6457   return false;
6458 }
6459 \f
6460 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
6461
6462 void
6463 mips_expand_synci_loop (rtx begin, rtx end)
6464 {
6465   rtx inc, label, cmp, cmp_result;
6466
6467   /* Load INC with the cache line size (rdhwr INC,$1).  */
6468   inc = gen_reg_rtx (Pmode);
6469   emit_insn (Pmode == SImode
6470              ? gen_rdhwr_synci_step_si (inc)
6471              : gen_rdhwr_synci_step_di (inc));
6472
6473   /* Loop back to here.  */
6474   label = gen_label_rtx ();
6475   emit_label (label);
6476
6477   emit_insn (gen_synci (begin));
6478
6479   cmp = mips_force_binary (Pmode, GTU, begin, end);
6480
6481   mips_emit_binary (PLUS, begin, begin, inc);
6482
6483   cmp_result = gen_rtx_EQ (VOIDmode, cmp, const0_rtx);
6484   emit_jump_insn (gen_condjump (cmp_result, label));
6485 }
6486 \f
6487 /* Expand a QI or HI mode atomic memory operation.
6488
6489    GENERATOR contains a pointer to the gen_* function that generates
6490    the SI mode underlying atomic operation using masks that we
6491    calculate.
6492
6493    RESULT is the return register for the operation.  Its value is NULL
6494    if unused.
6495
6496    MEM is the location of the atomic access.
6497
6498    OLDVAL is the first operand for the operation.
6499
6500    NEWVAL is the optional second operand for the operation.  Its value
6501    is NULL if unused.  */
6502
6503 void
6504 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
6505                          rtx result, rtx mem, rtx oldval, rtx newval)
6506 {
6507   rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
6508   rtx unshifted_mask_reg, mask, inverted_mask, si_op;
6509   rtx res = NULL;
6510   enum machine_mode mode;
6511
6512   mode = GET_MODE (mem);
6513
6514   /* Compute the address of the containing SImode value.  */
6515   orig_addr = force_reg (Pmode, XEXP (mem, 0));
6516   memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
6517                                   force_reg (Pmode, GEN_INT (-4)));
6518
6519   /* Create a memory reference for it.  */
6520   memsi = gen_rtx_MEM (SImode, memsi_addr);
6521   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
6522   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
6523
6524   /* Work out the byte offset of the QImode or HImode value,
6525      counting from the least significant byte.  */
6526   shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
6527   if (TARGET_BIG_ENDIAN)
6528     mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
6529
6530   /* Multiply by eight to convert the shift value from bytes to bits.  */
6531   mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
6532
6533   /* Make the final shift an SImode value, so that it can be used in
6534      SImode operations.  */
6535   shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
6536
6537   /* Set MASK to an inclusive mask of the QImode or HImode value.  */
6538   unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
6539   unshifted_mask_reg = force_reg (SImode, unshifted_mask);
6540   mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
6541
6542   /* Compute the equivalent exclusive mask.  */
6543   inverted_mask = gen_reg_rtx (SImode);
6544   emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
6545                           gen_rtx_NOT (SImode, mask)));
6546
6547   /* Shift the old value into place.  */
6548   if (oldval != const0_rtx)
6549     {
6550       oldval = convert_modes (SImode, mode, oldval, true);
6551       oldval = force_reg (SImode, oldval);
6552       oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
6553     }
6554
6555   /* Do the same for the new value.  */
6556   if (newval && newval != const0_rtx)
6557     {
6558       newval = convert_modes (SImode, mode, newval, true);
6559       newval = force_reg (SImode, newval);
6560       newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
6561     }
6562
6563   /* Do the SImode atomic access.  */
6564   if (result)
6565     res = gen_reg_rtx (SImode);
6566   if (newval)
6567     si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
6568   else if (result)
6569     si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
6570   else
6571     si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
6572
6573   emit_insn (si_op);
6574
6575   if (result)
6576     {
6577       /* Shift and convert the result.  */
6578       mips_emit_binary (AND, res, res, mask);
6579       mips_emit_binary (LSHIFTRT, res, res, shiftsi);
6580       mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
6581     }
6582 }
6583
6584 /* Return true if it is possible to use left/right accesses for a
6585    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
6586    returning true, update *OP, *LEFT and *RIGHT as follows:
6587
6588    *OP is a BLKmode reference to the whole field.
6589
6590    *LEFT is a QImode reference to the first byte if big endian or
6591    the last byte if little endian.  This address can be used in the
6592    left-side instructions (LWL, SWL, LDL, SDL).
6593
6594    *RIGHT is a QImode reference to the opposite end of the field and
6595    can be used in the patterning right-side instruction.  */
6596
6597 static bool
6598 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
6599                         rtx *left, rtx *right)
6600 {
6601   rtx first, last;
6602
6603   /* Check that the operand really is a MEM.  Not all the extv and
6604      extzv predicates are checked.  */
6605   if (!MEM_P (*op))
6606     return false;
6607
6608   /* Check that the size is valid.  */
6609   if (width != 32 && (!TARGET_64BIT || width != 64))
6610     return false;
6611
6612   /* We can only access byte-aligned values.  Since we are always passed
6613      a reference to the first byte of the field, it is not necessary to
6614      do anything with BITPOS after this check.  */
6615   if (bitpos % BITS_PER_UNIT != 0)
6616     return false;
6617
6618   /* Reject aligned bitfields: we want to use a normal load or store
6619      instead of a left/right pair.  */
6620   if (MEM_ALIGN (*op) >= width)
6621     return false;
6622
6623   /* Adjust *OP to refer to the whole field.  This also has the effect
6624      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
6625   *op = adjust_address (*op, BLKmode, 0);
6626   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
6627
6628   /* Get references to both ends of the field.  We deliberately don't
6629      use the original QImode *OP for FIRST since the new BLKmode one
6630      might have a simpler address.  */
6631   first = adjust_address (*op, QImode, 0);
6632   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
6633
6634   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
6635      correspond to the MSB and RIGHT to the LSB.  */
6636   if (TARGET_BIG_ENDIAN)
6637     *left = first, *right = last;
6638   else
6639     *left = last, *right = first;
6640
6641   return true;
6642 }
6643
6644 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
6645    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
6646    the operation is the equivalent of:
6647
6648       (set DEST (*_extract SRC WIDTH BITPOS))
6649
6650    Return true on success.  */
6651
6652 bool
6653 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
6654                                    HOST_WIDE_INT bitpos)
6655 {
6656   rtx left, right, temp;
6657
6658   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
6659      be a paradoxical word_mode subreg.  This is the only case in which
6660      we allow the destination to be larger than the source.  */
6661   if (GET_CODE (dest) == SUBREG
6662       && GET_MODE (dest) == DImode
6663       && GET_MODE (SUBREG_REG (dest)) == SImode)
6664     dest = SUBREG_REG (dest);
6665
6666   /* After the above adjustment, the destination must be the same
6667      width as the source.  */
6668   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
6669     return false;
6670
6671   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
6672     return false;
6673
6674   temp = gen_reg_rtx (GET_MODE (dest));
6675   if (GET_MODE (dest) == DImode)
6676     {
6677       emit_insn (gen_mov_ldl (temp, src, left));
6678       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
6679     }
6680   else
6681     {
6682       emit_insn (gen_mov_lwl (temp, src, left));
6683       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
6684     }
6685   return true;
6686 }
6687
6688 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
6689    BITPOS and SRC are the operands passed to the expander; the operation
6690    is the equivalent of:
6691
6692        (set (zero_extract DEST WIDTH BITPOS) SRC)
6693
6694    Return true on success.  */
6695
6696 bool
6697 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
6698                                     HOST_WIDE_INT bitpos)
6699 {
6700   rtx left, right;
6701   enum machine_mode mode;
6702
6703   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
6704     return false;
6705
6706   mode = mode_for_size (width, MODE_INT, 0);
6707   src = gen_lowpart (mode, src);
6708   if (mode == DImode)
6709     {
6710       emit_insn (gen_mov_sdl (dest, src, left));
6711       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
6712     }
6713   else
6714     {
6715       emit_insn (gen_mov_swl (dest, src, left));
6716       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
6717     }
6718   return true;
6719 }
6720
6721 /* Return true if X is a MEM with the same size as MODE.  */
6722
6723 bool
6724 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
6725 {
6726   rtx size;
6727
6728   if (!MEM_P (x))
6729     return false;
6730
6731   size = MEM_SIZE (x);
6732   return size && INTVAL (size) == GET_MODE_SIZE (mode);
6733 }
6734
6735 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
6736    source of an "ext" instruction or the destination of an "ins"
6737    instruction.  OP must be a register operand and the following
6738    conditions must hold:
6739
6740      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
6741      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
6742      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
6743
6744    Also reject lengths equal to a word as they are better handled
6745    by the move patterns.  */
6746
6747 bool
6748 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
6749 {
6750   if (!ISA_HAS_EXT_INS
6751       || !register_operand (op, VOIDmode)
6752       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
6753     return false;
6754
6755   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
6756     return false;
6757
6758   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
6759     return false;
6760
6761   return true;
6762 }
6763
6764 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
6765    operation if MAXLEN is the maxium length of consecutive bits that
6766    can make up MASK.  MODE is the mode of the operation.  See
6767    mask_low_and_shift_len for the actual definition.  */
6768
6769 bool
6770 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
6771 {
6772   return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
6773 }
6774
6775 /* The canonical form of a mask-low-and-shift-left operation is
6776    (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
6777    cleared.  Thus we need to shift MASK to the right before checking if it
6778    is a valid mask value.  MODE is the mode of the operation.  If true
6779    return the length of the mask, otherwise return -1.  */
6780
6781 int
6782 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
6783 {
6784   HOST_WIDE_INT shval;
6785
6786   shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
6787   return exact_log2 ((UINTVAL (mask) >> shval) + 1);
6788 }
6789 \f
6790 /* Return true if -msplit-addresses is selected and should be honored.
6791
6792    -msplit-addresses is a half-way house between explicit relocations
6793    and the traditional assembler macros.  It can split absolute 32-bit
6794    symbolic constants into a high/lo_sum pair but uses macros for other
6795    sorts of access.
6796
6797    Like explicit relocation support for REL targets, it relies
6798    on GNU extensions in the assembler and the linker.
6799
6800    Although this code should work for -O0, it has traditionally
6801    been treated as an optimization.  */
6802
6803 static bool
6804 mips_split_addresses_p (void)
6805 {
6806   return (TARGET_SPLIT_ADDRESSES
6807           && optimize
6808           && !TARGET_MIPS16
6809           && !flag_pic
6810           && !ABI_HAS_64BIT_SYMBOLS);
6811 }
6812
6813 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
6814
6815 static void
6816 mips_init_relocs (void)
6817 {
6818   memset (mips_split_p, '\0', sizeof (mips_split_p));
6819   memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
6820   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
6821   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
6822
6823   if (ABI_HAS_64BIT_SYMBOLS)
6824     {
6825       if (TARGET_EXPLICIT_RELOCS)
6826         {
6827           mips_split_p[SYMBOL_64_HIGH] = true;
6828           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
6829           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
6830
6831           mips_split_p[SYMBOL_64_MID] = true;
6832           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
6833           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
6834
6835           mips_split_p[SYMBOL_64_LOW] = true;
6836           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
6837           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
6838
6839           mips_split_p[SYMBOL_ABSOLUTE] = true;
6840           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6841         }
6842     }
6843   else
6844     {
6845       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses_p () || TARGET_MIPS16)
6846         {
6847           mips_split_p[SYMBOL_ABSOLUTE] = true;
6848           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
6849           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6850
6851           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
6852         }
6853     }
6854
6855   if (TARGET_MIPS16)
6856     {
6857       /* The high part is provided by a pseudo copy of $gp.  */
6858       mips_split_p[SYMBOL_GP_RELATIVE] = true;
6859       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
6860     }
6861   else if (TARGET_EXPLICIT_RELOCS)
6862     /* Small data constants are kept whole until after reload,
6863        then lowered by mips_rewrite_small_data.  */
6864     mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
6865
6866   if (TARGET_EXPLICIT_RELOCS)
6867     {
6868       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
6869       if (TARGET_NEWABI)
6870         {
6871           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
6872           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
6873         }
6874       else
6875         {
6876           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
6877           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
6878         }
6879       if (TARGET_MIPS16)
6880         /* Expose the use of $28 as soon as possible.  */
6881         mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
6882
6883       if (TARGET_XGOT)
6884         {
6885           /* The HIGH and LO_SUM are matched by special .md patterns.  */
6886           mips_split_p[SYMBOL_GOT_DISP] = true;
6887
6888           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
6889           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
6890           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
6891
6892           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
6893           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
6894           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
6895         }
6896       else
6897         {
6898           if (TARGET_NEWABI)
6899             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
6900           else
6901             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
6902           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
6903           if (TARGET_MIPS16)
6904             /* Expose the use of $28 as soon as possible.  */
6905             mips_split_p[SYMBOL_GOT_DISP] = true;
6906         }
6907     }
6908
6909   if (TARGET_NEWABI)
6910     {
6911       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
6912       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
6913       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
6914     }
6915
6916   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
6917   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
6918
6919   mips_split_p[SYMBOL_DTPREL] = true;
6920   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
6921   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
6922
6923   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
6924
6925   mips_split_p[SYMBOL_TPREL] = true;
6926   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
6927   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
6928
6929   mips_lo_relocs[SYMBOL_HALF] = "%half(";
6930 }
6931
6932 /* If OP is an UNSPEC address, return the address to which it refers,
6933    otherwise return OP itself.  */
6934
6935 static rtx
6936 mips_strip_unspec_address (rtx op)
6937 {
6938   rtx base, offset;
6939
6940   split_const (op, &base, &offset);
6941   if (UNSPEC_ADDRESS_P (base))
6942     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
6943   return op;
6944 }
6945
6946 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
6947    in context CONTEXT.  RELOCS is the array of relocations to use.  */
6948
6949 static void
6950 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
6951                           const char **relocs)
6952 {
6953   enum mips_symbol_type symbol_type;
6954   const char *p;
6955
6956   symbol_type = mips_classify_symbolic_expression (op, context);
6957   gcc_assert (relocs[symbol_type]);
6958
6959   fputs (relocs[symbol_type], file);
6960   output_addr_const (file, mips_strip_unspec_address (op));
6961   for (p = relocs[symbol_type]; *p != 0; p++)
6962     if (*p == '(')
6963       fputc (')', file);
6964 }
6965
6966 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
6967    The punctuation characters are:
6968
6969    '('  Start a nested ".set noreorder" block.
6970    ')'  End a nested ".set noreorder" block.
6971    '['  Start a nested ".set noat" block.
6972    ']'  End a nested ".set noat" block.
6973    '<'  Start a nested ".set nomacro" block.
6974    '>'  End a nested ".set nomacro" block.
6975    '*'  Behave like %(%< if generating a delayed-branch sequence.
6976    '#'  Print a nop if in a ".set noreorder" block.
6977    '/'  Like '#', but do nothing within a delayed-branch sequence.
6978    '?'  Print "l" if mips_branch_likely is true
6979    '~'  Print a nop if mips_branch_likely is true
6980    '.'  Print the name of the register with a hard-wired zero (zero or $0).
6981    '@'  Print the name of the assembler temporary register (at or $1).
6982    '^'  Print the name of the pic call-through register (t9 or $25).
6983    '+'  Print the name of the gp register (usually gp or $28).
6984    '$'  Print the name of the stack pointer register (sp or $29).
6985    '|'  Print ".set push; .set mips2" if !ISA_HAS_LL_SC.
6986    '-'  Print ".set pop" under the same conditions for '|'.
6987
6988    See also mips_init_print_operand_pucnt.  */
6989
6990 static void
6991 mips_print_operand_punctuation (FILE *file, int ch)
6992 {
6993   switch (ch)
6994     {
6995     case '(':
6996       if (set_noreorder++ == 0)
6997         fputs (".set\tnoreorder\n\t", file);
6998       break;
6999
7000     case ')':
7001       gcc_assert (set_noreorder > 0);
7002       if (--set_noreorder == 0)
7003         fputs ("\n\t.set\treorder", file);
7004       break;
7005
7006     case '[':
7007       if (set_noat++ == 0)
7008         fputs (".set\tnoat\n\t", file);
7009       break;
7010
7011     case ']':
7012       gcc_assert (set_noat > 0);
7013       if (--set_noat == 0)
7014         fputs ("\n\t.set\tat", file);
7015       break;
7016
7017     case '<':
7018       if (set_nomacro++ == 0)
7019         fputs (".set\tnomacro\n\t", file);
7020       break;
7021
7022     case '>':
7023       gcc_assert (set_nomacro > 0);
7024       if (--set_nomacro == 0)
7025         fputs ("\n\t.set\tmacro", file);
7026       break;
7027
7028     case '*':
7029       if (final_sequence != 0)
7030         {
7031           mips_print_operand_punctuation (file, '(');
7032           mips_print_operand_punctuation (file, '<');
7033         }
7034       break;
7035
7036     case '#':
7037       if (set_noreorder != 0)
7038         fputs ("\n\tnop", file);
7039       break;
7040
7041     case '/':
7042       /* Print an extra newline so that the delayed insn is separated
7043          from the following ones.  This looks neater and is consistent
7044          with non-nop delayed sequences.  */
7045       if (set_noreorder != 0 && final_sequence == 0)
7046         fputs ("\n\tnop\n", file);
7047       break;
7048
7049     case '?':
7050       if (mips_branch_likely)
7051         putc ('l', file);
7052       break;
7053
7054     case '~':
7055       if (mips_branch_likely)
7056         fputs ("\n\tnop", file);
7057       break;
7058
7059     case '.':
7060       fputs (reg_names[GP_REG_FIRST + 0], file);
7061       break;
7062
7063     case '@':
7064       fputs (reg_names[GP_REG_FIRST + 1], file);
7065       break;
7066
7067     case '^':
7068       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7069       break;
7070
7071     case '+':
7072       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7073       break;
7074
7075     case '$':
7076       fputs (reg_names[STACK_POINTER_REGNUM], file);
7077       break;
7078
7079     case '|':
7080       if (!ISA_HAS_LL_SC)
7081         fputs (".set\tpush\n\t.set\tmips2\n\t", file);
7082       break;
7083
7084     case '-':
7085       if (!ISA_HAS_LL_SC)
7086         fputs ("\n\t.set\tpop", file);
7087       break;
7088
7089     default:
7090       gcc_unreachable ();
7091       break;
7092     }
7093 }
7094
7095 /* Initialize mips_print_operand_punct.  */
7096
7097 static void
7098 mips_init_print_operand_punct (void)
7099 {
7100   const char *p;
7101
7102   for (p = "()[]<>*#/?~.@^+$|-"; *p; p++)
7103     mips_print_operand_punct[(unsigned char) *p] = true;
7104 }
7105
7106 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
7107    associated with condition CODE.  Print the condition part of the
7108    opcode to FILE.  */
7109
7110 static void
7111 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
7112 {
7113   switch (code)
7114     {
7115     case EQ:
7116     case NE:
7117     case GT:
7118     case GE:
7119     case LT:
7120     case LE:
7121     case GTU:
7122     case GEU:
7123     case LTU:
7124     case LEU:
7125       /* Conveniently, the MIPS names for these conditions are the same
7126          as their RTL equivalents.  */
7127       fputs (GET_RTX_NAME (code), file);
7128       break;
7129
7130     default:
7131       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7132       break;
7133     }
7134 }
7135
7136 /* Likewise floating-point branches.  */
7137
7138 static void
7139 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
7140 {
7141   switch (code)
7142     {
7143     case EQ:
7144       fputs ("c1f", file);
7145       break;
7146
7147     case NE:
7148       fputs ("c1t", file);
7149       break;
7150
7151     default:
7152       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7153       break;
7154     }
7155 }
7156
7157 /* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
7158
7159    'X'  Print CONST_INT OP in hexadecimal format.
7160    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
7161    'd'  Print CONST_INT OP in decimal.
7162    'm'  Print one less than CONST_INT OP in decimal.
7163    'h'  Print the high-part relocation associated with OP, after stripping
7164           any outermost HIGH.
7165    'R'  Print the low-part relocation associated with OP.
7166    'C'  Print the integer branch condition for comparison OP.
7167    'N'  Print the inverse of the integer branch condition for comparison OP.
7168    'F'  Print the FPU branch condition for comparison OP.
7169    'W'  Print the inverse of the FPU branch condition for comparison OP.
7170    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
7171               'z' for (eq:?I ...), 'n' for (ne:?I ...).
7172    't'  Like 'T', but with the EQ/NE cases reversed
7173    'Y'  Print mips_fp_conditions[INTVAL (OP)]
7174    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
7175    'q'  Print a DSP accumulator register.
7176    'D'  Print the second part of a double-word register or memory operand.
7177    'L'  Print the low-order register in a double-word register operand.
7178    'M'  Print high-order register in a double-word register operand.
7179    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
7180
7181 void
7182 mips_print_operand (FILE *file, rtx op, int letter)
7183 {
7184   enum rtx_code code;
7185
7186   if (PRINT_OPERAND_PUNCT_VALID_P (letter))
7187     {
7188       mips_print_operand_punctuation (file, letter);
7189       return;
7190     }
7191
7192   gcc_assert (op);
7193   code = GET_CODE (op);
7194
7195   switch (letter)
7196     {
7197     case 'X':
7198       if (GET_CODE (op) == CONST_INT)
7199         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
7200       else
7201         output_operand_lossage ("invalid use of '%%%c'", letter);
7202       break;
7203
7204     case 'x':
7205       if (GET_CODE (op) == CONST_INT)
7206         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
7207       else
7208         output_operand_lossage ("invalid use of '%%%c'", letter);
7209       break;
7210
7211     case 'd':
7212       if (GET_CODE (op) == CONST_INT)
7213         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
7214       else
7215         output_operand_lossage ("invalid use of '%%%c'", letter);
7216       break;
7217
7218     case 'm':
7219       if (GET_CODE (op) == CONST_INT)
7220         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
7221       else
7222         output_operand_lossage ("invalid use of '%%%c'", letter);
7223       break;
7224
7225     case 'h':
7226       if (code == HIGH)
7227         op = XEXP (op, 0);
7228       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
7229       break;
7230
7231     case 'R':
7232       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
7233       break;
7234
7235     case 'C':
7236       mips_print_int_branch_condition (file, code, letter);
7237       break;
7238
7239     case 'N':
7240       mips_print_int_branch_condition (file, reverse_condition (code), letter);
7241       break;
7242
7243     case 'F':
7244       mips_print_float_branch_condition (file, code, letter);
7245       break;
7246
7247     case 'W':
7248       mips_print_float_branch_condition (file, reverse_condition (code),
7249                                          letter);
7250       break;
7251
7252     case 'T':
7253     case 't':
7254       {
7255         int truth = (code == NE) == (letter == 'T');
7256         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
7257       }
7258       break;
7259
7260     case 'Y':
7261       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
7262         fputs (mips_fp_conditions[UINTVAL (op)], file);
7263       else
7264         output_operand_lossage ("'%%%c' is not a valid operand prefix",
7265                                 letter);
7266       break;
7267
7268     case 'Z':
7269       if (ISA_HAS_8CC)
7270         {
7271           mips_print_operand (file, op, 0);
7272           fputc (',', file);
7273         }
7274       break;
7275
7276     case 'q':
7277       if (code == REG && MD_REG_P (REGNO (op)))
7278         fprintf (file, "$ac0");
7279       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
7280         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
7281       else
7282         output_operand_lossage ("invalid use of '%%%c'", letter);
7283       break;
7284
7285     default:
7286       switch (code)
7287         {
7288         case REG:
7289           {
7290             unsigned int regno = REGNO (op);
7291             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
7292                 || (letter == 'L' && TARGET_BIG_ENDIAN)
7293                 || letter == 'D')
7294               regno++;
7295             /* We need to print $0 .. $31 for COP0 registers.  */
7296             if (COP0_REG_P (regno))
7297               fprintf (file, "$%s", &reg_names[regno][4]);
7298             else
7299               fprintf (file, "%s", reg_names[regno]);
7300           }
7301           break;
7302
7303         case MEM:
7304           if (letter == 'D')
7305             output_address (plus_constant (XEXP (op, 0), 4));
7306           else
7307             output_address (XEXP (op, 0));
7308           break;
7309
7310         default:
7311           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
7312             fputs (reg_names[GP_REG_FIRST], file);
7313           else if (CONST_GP_P (op))
7314             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
7315           else
7316             output_addr_const (file, mips_strip_unspec_address (op));
7317           break;
7318         }
7319     }
7320 }
7321
7322 /* Output address operand X to FILE.  */
7323
7324 void
7325 mips_print_operand_address (FILE *file, rtx x)
7326 {
7327   struct mips_address_info addr;
7328
7329   if (mips_classify_address (&addr, x, word_mode, true))
7330     switch (addr.type)
7331       {
7332       case ADDRESS_REG:
7333         mips_print_operand (file, addr.offset, 0);
7334         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7335         return;
7336
7337       case ADDRESS_LO_SUM:
7338         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
7339                                   mips_lo_relocs);
7340         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7341         return;
7342
7343       case ADDRESS_CONST_INT:
7344         output_addr_const (file, x);
7345         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
7346         return;
7347
7348       case ADDRESS_SYMBOLIC:
7349         output_addr_const (file, mips_strip_unspec_address (x));
7350         return;
7351       }
7352   gcc_unreachable ();
7353 }
7354 \f
7355 /* Implement TARGET_ENCODE_SECTION_INFO.  */
7356
7357 static void
7358 mips_encode_section_info (tree decl, rtx rtl, int first)
7359 {
7360   default_encode_section_info (decl, rtl, first);
7361
7362   if (TREE_CODE (decl) == FUNCTION_DECL)
7363     {
7364       rtx symbol = XEXP (rtl, 0);
7365       tree type = TREE_TYPE (decl);
7366
7367       /* Encode whether the symbol is short or long.  */
7368       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
7369           || mips_far_type_p (type))
7370         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
7371     }
7372 }
7373
7374 /* Implement TARGET_SELECT_RTX_SECTION.  */
7375
7376 static section *
7377 mips_select_rtx_section (enum machine_mode mode, rtx x,
7378                          unsigned HOST_WIDE_INT align)
7379 {
7380   /* ??? Consider using mergeable small data sections.  */
7381   if (mips_rtx_constant_in_small_data_p (mode))
7382     return get_named_section (NULL, ".sdata", 0);
7383
7384   return default_elf_select_rtx_section (mode, x, align);
7385 }
7386
7387 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7388
7389    The complication here is that, with the combination TARGET_ABICALLS
7390    && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
7391    absolute addresses, and should therefore not be included in the
7392    read-only part of a DSO.  Handle such cases by selecting a normal
7393    data section instead of a read-only one.  The logic apes that in
7394    default_function_rodata_section.  */
7395
7396 static section *
7397 mips_function_rodata_section (tree decl)
7398 {
7399   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
7400     return default_function_rodata_section (decl);
7401
7402   if (decl && DECL_SECTION_NAME (decl))
7403     {
7404       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7405       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7406         {
7407           char *rname = ASTRDUP (name);
7408           rname[14] = 'd';
7409           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7410         }
7411       else if (flag_function_sections
7412                && flag_data_sections
7413                && strncmp (name, ".text.", 6) == 0)
7414         {
7415           char *rname = ASTRDUP (name);
7416           memcpy (rname + 1, "data", 4);
7417           return get_section (rname, SECTION_WRITE, decl);
7418         }
7419     }
7420   return data_section;
7421 }
7422
7423 /* Implement TARGET_IN_SMALL_DATA_P.  */
7424
7425 static bool
7426 mips_in_small_data_p (const_tree decl)
7427 {
7428   unsigned HOST_WIDE_INT size;
7429
7430   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7431     return false;
7432
7433   /* We don't yet generate small-data references for -mabicalls
7434      or VxWorks RTP code.  See the related -G handling in
7435      mips_override_options.  */
7436   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
7437     return false;
7438
7439   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7440     {
7441       const char *name;
7442
7443       /* Reject anything that isn't in a known small-data section.  */
7444       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7445       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7446         return false;
7447
7448       /* If a symbol is defined externally, the assembler will use the
7449          usual -G rules when deciding how to implement macros.  */
7450       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
7451         return true;
7452     }
7453   else if (TARGET_EMBEDDED_DATA)
7454     {
7455       /* Don't put constants into the small data section: we want them
7456          to be in ROM rather than RAM.  */
7457       if (TREE_CODE (decl) != VAR_DECL)
7458         return false;
7459
7460       if (TREE_READONLY (decl)
7461           && !TREE_SIDE_EFFECTS (decl)
7462           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7463         return false;
7464     }
7465
7466   /* Enforce -mlocal-sdata.  */
7467   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
7468     return false;
7469
7470   /* Enforce -mextern-sdata.  */
7471   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
7472     {
7473       if (DECL_EXTERNAL (decl))
7474         return false;
7475       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
7476         return false;
7477     }
7478
7479   /* We have traditionally not treated zero-sized objects as small data,
7480      so this is now effectively part of the ABI.  */
7481   size = int_size_in_bytes (TREE_TYPE (decl));
7482   return size > 0 && size <= mips_small_data_threshold;
7483 }
7484
7485 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
7486    anchors for small data: the GP register acts as an anchor in that
7487    case.  We also don't want to use them for PC-relative accesses,
7488    where the PC acts as an anchor.  */
7489
7490 static bool
7491 mips_use_anchors_for_symbol_p (const_rtx symbol)
7492 {
7493   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
7494     {
7495     case SYMBOL_PC_RELATIVE:
7496     case SYMBOL_GP_RELATIVE:
7497       return false;
7498
7499     default:
7500       return default_use_anchors_for_symbol_p (symbol);
7501     }
7502 }
7503 \f
7504 /* The MIPS debug format wants all automatic variables and arguments
7505    to be in terms of the virtual frame pointer (stack pointer before
7506    any adjustment in the function), while the MIPS 3.0 linker wants
7507    the frame pointer to be the stack pointer after the initial
7508    adjustment.  So, we do the adjustment here.  The arg pointer (which
7509    is eliminated) points to the virtual frame pointer, while the frame
7510    pointer (which may be eliminated) points to the stack pointer after
7511    the initial adjustments.  */
7512
7513 HOST_WIDE_INT
7514 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
7515 {
7516   rtx offset2 = const0_rtx;
7517   rtx reg = eliminate_constant_term (addr, &offset2);
7518
7519   if (offset == 0)
7520     offset = INTVAL (offset2);
7521
7522   if (reg == stack_pointer_rtx
7523       || reg == frame_pointer_rtx
7524       || reg == hard_frame_pointer_rtx)
7525     {
7526       offset -= cfun->machine->frame.total_size;
7527       if (reg == hard_frame_pointer_rtx)
7528         offset += cfun->machine->frame.hard_frame_pointer_offset;
7529     }
7530
7531   /* sdbout_parms does not want this to crash for unrecognized cases.  */
7532 #if 0
7533   else if (reg != arg_pointer_rtx)
7534     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
7535                 addr);
7536 #endif
7537
7538   return offset;
7539 }
7540 \f
7541 /* Implement ASM_OUTPUT_EXTERNAL.  */
7542
7543 void
7544 mips_output_external (FILE *file, tree decl, const char *name)
7545 {
7546   default_elf_asm_output_external (file, decl, name);
7547
7548   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7549      set in order to avoid putting out names that are never really
7550      used. */
7551   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
7552     {
7553       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
7554         {
7555           /* When using assembler macros, emit .extern directives for
7556              all small-data externs so that the assembler knows how
7557              big they are.
7558
7559              In most cases it would be safe (though pointless) to emit
7560              .externs for other symbols too.  One exception is when an
7561              object is within the -G limit but declared by the user to
7562              be in a section other than .sbss or .sdata.  */
7563           fputs ("\t.extern\t", file);
7564           assemble_name (file, name);
7565           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
7566                    int_size_in_bytes (TREE_TYPE (decl)));
7567         }
7568       else if (TARGET_IRIX
7569                && mips_abi == ABI_32
7570                && TREE_CODE (decl) == FUNCTION_DECL)
7571         {
7572           /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
7573              `.global name .text' directive for every used but
7574              undefined function.  If we don't, the linker may perform
7575              an optimization (skipping over the insns that set $gp)
7576              when it is unsafe.  */
7577           fputs ("\t.globl ", file);
7578           assemble_name (file, name);
7579           fputs (" .text\n", file);
7580         }
7581     }
7582 }
7583
7584 /* Implement ASM_OUTPUT_SOURCE_FILENAME.  */
7585
7586 void
7587 mips_output_filename (FILE *stream, const char *name)
7588 {
7589   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
7590      directives.  */
7591   if (write_symbols == DWARF2_DEBUG)
7592     return;
7593   else if (mips_output_filename_first_time)
7594     {
7595       mips_output_filename_first_time = 0;
7596       num_source_filenames += 1;
7597       current_function_file = name;
7598       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7599       output_quoted_string (stream, name);
7600       putc ('\n', stream);
7601     }
7602   /* If we are emitting stabs, let dbxout.c handle this (except for
7603      the mips_output_filename_first_time case).  */
7604   else if (write_symbols == DBX_DEBUG)
7605     return;
7606   else if (name != current_function_file
7607            && strcmp (name, current_function_file) != 0)
7608     {
7609       num_source_filenames += 1;
7610       current_function_file = name;
7611       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7612       output_quoted_string (stream, name);
7613       putc ('\n', stream);
7614     }
7615 }
7616
7617 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
7618
7619 static void ATTRIBUTE_UNUSED
7620 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
7621 {
7622   switch (size)
7623     {
7624     case 4:
7625       fputs ("\t.dtprelword\t", file);
7626       break;
7627
7628     case 8:
7629       fputs ("\t.dtpreldword\t", file);
7630       break;
7631
7632     default:
7633       gcc_unreachable ();
7634     }
7635   output_addr_const (file, x);
7636   fputs ("+0x8000", file);
7637 }
7638
7639 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
7640
7641 static rtx
7642 mips_dwarf_register_span (rtx reg)
7643 {
7644   rtx high, low;
7645   enum machine_mode mode;
7646
7647   /* By default, GCC maps increasing register numbers to increasing
7648      memory locations, but paired FPRs are always little-endian,
7649      regardless of the prevailing endianness.  */
7650   mode = GET_MODE (reg);
7651   if (FP_REG_P (REGNO (reg))
7652       && TARGET_BIG_ENDIAN
7653       && MAX_FPRS_PER_FMT > 1
7654       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
7655     {
7656       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
7657       high = mips_subword (reg, true);
7658       low = mips_subword (reg, false);
7659       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
7660     }
7661
7662   return NULL_RTX;
7663 }
7664
7665 /* Implement ASM_OUTPUT_ASCII.  */
7666
7667 void
7668 mips_output_ascii (FILE *stream, const char *string, size_t len)
7669 {
7670   size_t i;
7671   int cur_pos;
7672
7673   cur_pos = 17;
7674   fprintf (stream, "\t.ascii\t\"");
7675   for (i = 0; i < len; i++)
7676     {
7677       int c;
7678
7679       c = (unsigned char) string[i];
7680       if (ISPRINT (c))
7681         {
7682           if (c == '\\' || c == '\"')
7683             {
7684               putc ('\\', stream);
7685               cur_pos++;
7686             }
7687           putc (c, stream);
7688           cur_pos++;
7689         }
7690       else
7691         {
7692           fprintf (stream, "\\%03o", c);
7693           cur_pos += 4;
7694         }
7695
7696       if (cur_pos > 72 && i+1 < len)
7697         {
7698           cur_pos = 17;
7699           fprintf (stream, "\"\n\t.ascii\t\"");
7700         }
7701     }
7702   fprintf (stream, "\"\n");
7703 }
7704
7705 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
7706    macros, mark the symbol as written so that mips_asm_output_external
7707    won't emit an .extern for it.  STREAM is the output file, NAME is the
7708    name of the symbol, INIT_STRING is the string that should be written
7709    before the symbol and FINAL_STRING is the string that should be
7710    written after it.  FINAL_STRING is a printf format that consumes the
7711    remaining arguments.  */
7712
7713 void
7714 mips_declare_object (FILE *stream, const char *name, const char *init_string,
7715                      const char *final_string, ...)
7716 {
7717   va_list ap;
7718
7719   fputs (init_string, stream);
7720   assemble_name (stream, name);
7721   va_start (ap, final_string);
7722   vfprintf (stream, final_string, ap);
7723   va_end (ap);
7724
7725   if (!TARGET_EXPLICIT_RELOCS)
7726     {
7727       tree name_tree = get_identifier (name);
7728       TREE_ASM_WRITTEN (name_tree) = 1;
7729     }
7730 }
7731
7732 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
7733    NAME is the name of the object and ALIGN is the required alignment
7734    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
7735    alignment argument.  */
7736
7737 void
7738 mips_declare_common_object (FILE *stream, const char *name,
7739                             const char *init_string,
7740                             unsigned HOST_WIDE_INT size,
7741                             unsigned int align, bool takes_alignment_p)
7742 {
7743   if (!takes_alignment_p)
7744     {
7745       size += (align / BITS_PER_UNIT) - 1;
7746       size -= size % (align / BITS_PER_UNIT);
7747       mips_declare_object (stream, name, init_string,
7748                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
7749     }
7750   else
7751     mips_declare_object (stream, name, init_string,
7752                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
7753                          size, align / BITS_PER_UNIT);
7754 }
7755
7756 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
7757    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
7758
7759 void
7760 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
7761                                  unsigned HOST_WIDE_INT size,
7762                                  unsigned int align)
7763 {
7764   /* If the target wants uninitialized const declarations in
7765      .rdata then don't put them in .comm.  */
7766   if (TARGET_EMBEDDED_DATA
7767       && TARGET_UNINIT_CONST_IN_RODATA
7768       && TREE_CODE (decl) == VAR_DECL
7769       && TREE_READONLY (decl)
7770       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
7771     {
7772       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
7773         targetm.asm_out.globalize_label (stream, name);
7774
7775       switch_to_section (readonly_data_section);
7776       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
7777       mips_declare_object (stream, name, "",
7778                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
7779                            size);
7780     }
7781   else
7782     mips_declare_common_object (stream, name, "\n\t.comm\t",
7783                                 size, align, true);
7784 }
7785
7786 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
7787 extern int size_directive_output;
7788
7789 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
7790    definitions except that it uses mips_declare_object to emit the label.  */
7791
7792 void
7793 mips_declare_object_name (FILE *stream, const char *name,
7794                           tree decl ATTRIBUTE_UNUSED)
7795 {
7796 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
7797   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
7798 #endif
7799
7800   size_directive_output = 0;
7801   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
7802     {
7803       HOST_WIDE_INT size;
7804
7805       size_directive_output = 1;
7806       size = int_size_in_bytes (TREE_TYPE (decl));
7807       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7808     }
7809
7810   mips_declare_object (stream, name, "", ":\n");
7811 }
7812
7813 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
7814
7815 void
7816 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
7817 {
7818   const char *name;
7819
7820   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
7821   if (!flag_inhibit_size_directive
7822       && DECL_SIZE (decl) != 0
7823       && !at_end
7824       && top_level
7825       && DECL_INITIAL (decl) == error_mark_node
7826       && !size_directive_output)
7827     {
7828       HOST_WIDE_INT size;
7829
7830       size_directive_output = 1;
7831       size = int_size_in_bytes (TREE_TYPE (decl));
7832       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7833     }
7834 }
7835 #endif
7836 \f
7837 /* Return the FOO in the name of the ".mdebug.FOO" section associated
7838    with the current ABI.  */
7839
7840 static const char *
7841 mips_mdebug_abi_name (void)
7842 {
7843   switch (mips_abi)
7844     {
7845     case ABI_32:
7846       return "abi32";
7847     case ABI_O64:
7848       return "abiO64";
7849     case ABI_N32:
7850       return "abiN32";
7851     case ABI_64:
7852       return "abi64";
7853     case ABI_EABI:
7854       return TARGET_64BIT ? "eabi64" : "eabi32";
7855     default:
7856       gcc_unreachable ();
7857     }
7858 }
7859
7860 /* Implement TARGET_ASM_FILE_START.  */
7861
7862 static void
7863 mips_file_start (void)
7864 {
7865   default_file_start ();
7866
7867   /* Generate a special section to describe the ABI switches used to
7868      produce the resultant binary.  This is unnecessary on IRIX and
7869      causes unwanted warnings from the native linker.  */
7870   if (!TARGET_IRIX)
7871     {
7872       /* Record the ABI itself.  Modern versions of binutils encode
7873          this information in the ELF header flags, but GDB needs the
7874          information in order to correctly debug binaries produced by
7875          older binutils.  See the function mips_gdbarch_init in
7876          gdb/mips-tdep.c.  */
7877       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
7878                mips_mdebug_abi_name ());
7879
7880       /* There is no ELF header flag to distinguish long32 forms of the
7881          EABI from long64 forms.  Emit a special section to help tools
7882          such as GDB.  Do the same for o64, which is sometimes used with
7883          -mlong64.  */
7884       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
7885         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
7886                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
7887
7888 #ifdef HAVE_AS_GNU_ATTRIBUTE
7889       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
7890                (TARGET_HARD_FLOAT_ABI
7891                 ? (TARGET_DOUBLE_FLOAT
7892                    ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
7893 #endif
7894     }
7895
7896   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
7897   if (TARGET_ABICALLS)
7898     {
7899       fprintf (asm_out_file, "\t.abicalls\n");
7900       if (TARGET_ABICALLS_PIC0)
7901         fprintf (asm_out_file, "\t.option\tpic0\n");
7902     }
7903
7904   if (flag_verbose_asm)
7905     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
7906              ASM_COMMENT_START,
7907              mips_small_data_threshold, mips_arch_info->name, mips_isa);
7908 }
7909 \f
7910 /* Make the last instruction frame-related and note that it performs
7911    the operation described by FRAME_PATTERN.  */
7912
7913 static void
7914 mips_set_frame_expr (rtx frame_pattern)
7915 {
7916   rtx insn;
7917
7918   insn = get_last_insn ();
7919   RTX_FRAME_RELATED_P (insn) = 1;
7920   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
7921                                       frame_pattern,
7922                                       REG_NOTES (insn));
7923 }
7924
7925 /* Return a frame-related rtx that stores REG at MEM.
7926    REG must be a single register.  */
7927
7928 static rtx
7929 mips_frame_set (rtx mem, rtx reg)
7930 {
7931   rtx set;
7932
7933   /* If we're saving the return address register and the DWARF return
7934      address column differs from the hard register number, adjust the
7935      note reg to refer to the former.  */
7936   if (REGNO (reg) == GP_REG_FIRST + 31
7937       && DWARF_FRAME_RETURN_COLUMN != GP_REG_FIRST + 31)
7938     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
7939
7940   set = gen_rtx_SET (VOIDmode, mem, reg);
7941   RTX_FRAME_RELATED_P (set) = 1;
7942
7943   return set;
7944 }
7945 \f
7946 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
7947    mips16e_s2_s8_regs[X], it must also save the registers in indexes
7948    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
7949 static const unsigned char mips16e_s2_s8_regs[] = {
7950   30, 23, 22, 21, 20, 19, 18
7951 };
7952 static const unsigned char mips16e_a0_a3_regs[] = {
7953   4, 5, 6, 7
7954 };
7955
7956 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
7957    ordered from the uppermost in memory to the lowest in memory.  */
7958 static const unsigned char mips16e_save_restore_regs[] = {
7959   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
7960 };
7961
7962 /* Return the index of the lowest X in the range [0, SIZE) for which
7963    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
7964
7965 static unsigned int
7966 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
7967                              unsigned int size)
7968 {
7969   unsigned int i;
7970
7971   for (i = 0; i < size; i++)
7972     if (BITSET_P (mask, regs[i]))
7973       break;
7974
7975   return i;
7976 }
7977
7978 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
7979    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
7980    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
7981    is true for all indexes (X, SIZE).  */
7982
7983 static void
7984 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
7985                         unsigned int size, unsigned int *num_regs_ptr)
7986 {
7987   unsigned int i;
7988
7989   i = mips16e_find_first_register (*mask_ptr, regs, size);
7990   for (i++; i < size; i++)
7991     if (!BITSET_P (*mask_ptr, regs[i]))
7992       {
7993         *num_regs_ptr += 1;
7994         *mask_ptr |= 1 << regs[i];
7995       }
7996 }
7997
7998 /* Return a simplified form of X using the register values in REG_VALUES.
7999    REG_VALUES[R] is the last value assigned to hard register R, or null
8000    if R has not been modified.
8001
8002    This function is rather limited, but is good enough for our purposes.  */
8003
8004 static rtx
8005 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
8006 {
8007   x = avoid_constant_pool_reference (x);
8008
8009   if (UNARY_P (x))
8010     {
8011       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8012       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
8013                                  x0, GET_MODE (XEXP (x, 0)));
8014     }
8015
8016   if (ARITHMETIC_P (x))
8017     {
8018       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8019       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
8020       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
8021     }
8022
8023   if (REG_P (x)
8024       && reg_values[REGNO (x)]
8025       && !rtx_unstable_p (reg_values[REGNO (x)]))
8026     return reg_values[REGNO (x)];
8027
8028   return x;
8029 }
8030
8031 /* Return true if (set DEST SRC) stores an argument register into its
8032    caller-allocated save slot, storing the number of that argument
8033    register in *REGNO_PTR if so.  REG_VALUES is as for
8034    mips16e_collect_propagate_value.  */
8035
8036 static bool
8037 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
8038                                  unsigned int *regno_ptr)
8039 {
8040   unsigned int argno, regno;
8041   HOST_WIDE_INT offset, required_offset;
8042   rtx addr, base;
8043
8044   /* Check that this is a word-mode store.  */
8045   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
8046     return false;
8047
8048   /* Check that the register being saved is an unmodified argument
8049      register.  */
8050   regno = REGNO (src);
8051   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
8052     return false;
8053   argno = regno - GP_ARG_FIRST;
8054
8055   /* Check whether the address is an appropriate stack-pointer or
8056      frame-pointer access.  */
8057   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
8058   mips_split_plus (addr, &base, &offset);
8059   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
8060   if (base == hard_frame_pointer_rtx)
8061     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
8062   else if (base != stack_pointer_rtx)
8063     return false;
8064   if (offset != required_offset)
8065     return false;
8066
8067   *regno_ptr = regno;
8068   return true;
8069 }
8070
8071 /* A subroutine of mips_expand_prologue, called only when generating
8072    MIPS16e SAVE instructions.  Search the start of the function for any
8073    instructions that save argument registers into their caller-allocated
8074    save slots.  Delete such instructions and return a value N such that
8075    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
8076    instructions redundant.  */
8077
8078 static unsigned int
8079 mips16e_collect_argument_saves (void)
8080 {
8081   rtx reg_values[FIRST_PSEUDO_REGISTER];
8082   rtx insn, next, set, dest, src;
8083   unsigned int nargs, regno;
8084
8085   push_topmost_sequence ();
8086   nargs = 0;
8087   memset (reg_values, 0, sizeof (reg_values));
8088   for (insn = get_insns (); insn; insn = next)
8089     {
8090       next = NEXT_INSN (insn);
8091       if (NOTE_P (insn))
8092         continue;
8093
8094       if (!INSN_P (insn))
8095         break;
8096
8097       set = PATTERN (insn);
8098       if (GET_CODE (set) != SET)
8099         break;
8100
8101       dest = SET_DEST (set);
8102       src = SET_SRC (set);
8103       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
8104         {
8105           if (!BITSET_P (cfun->machine->frame.mask, regno))
8106             {
8107               delete_insn (insn);
8108               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
8109             }
8110         }
8111       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
8112         reg_values[REGNO (dest)]
8113           = mips16e_collect_propagate_value (src, reg_values);
8114       else
8115         break;
8116     }
8117   pop_topmost_sequence ();
8118
8119   return nargs;
8120 }
8121
8122 /* Return a move between register REGNO and memory location SP + OFFSET.
8123    Make the move a load if RESTORE_P, otherwise make it a frame-related
8124    store.  */
8125
8126 static rtx
8127 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
8128                           unsigned int regno)
8129 {
8130   rtx reg, mem;
8131
8132   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
8133   reg = gen_rtx_REG (SImode, regno);
8134   return (restore_p
8135           ? gen_rtx_SET (VOIDmode, reg, mem)
8136           : mips_frame_set (mem, reg));
8137 }
8138
8139 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
8140    The instruction must:
8141
8142      - Allocate or deallocate SIZE bytes in total; SIZE is known
8143        to be nonzero.
8144
8145      - Save or restore as many registers in *MASK_PTR as possible.
8146        The instruction saves the first registers at the top of the
8147        allocated area, with the other registers below it.
8148
8149      - Save NARGS argument registers above the allocated area.
8150
8151    (NARGS is always zero if RESTORE_P.)
8152
8153    The SAVE and RESTORE instructions cannot save and restore all general
8154    registers, so there may be some registers left over for the caller to
8155    handle.  Destructively modify *MASK_PTR so that it contains the registers
8156    that still need to be saved or restored.  The caller can save these
8157    registers in the memory immediately below *OFFSET_PTR, which is a
8158    byte offset from the bottom of the allocated stack area.  */
8159
8160 static rtx
8161 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
8162                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
8163                             HOST_WIDE_INT size)
8164 {
8165   rtx pattern, set;
8166   HOST_WIDE_INT offset, top_offset;
8167   unsigned int i, regno;
8168   int n;
8169
8170   gcc_assert (cfun->machine->frame.num_fp == 0);
8171
8172   /* Calculate the number of elements in the PARALLEL.  We need one element
8173      for the stack adjustment, one for each argument register save, and one
8174      for each additional register move.  */
8175   n = 1 + nargs;
8176   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8177     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
8178       n++;
8179
8180   /* Create the final PARALLEL.  */
8181   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
8182   n = 0;
8183
8184   /* Add the stack pointer adjustment.  */
8185   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8186                      plus_constant (stack_pointer_rtx,
8187                                     restore_p ? size : -size));
8188   RTX_FRAME_RELATED_P (set) = 1;
8189   XVECEXP (pattern, 0, n++) = set;
8190
8191   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8192   top_offset = restore_p ? size : 0;
8193
8194   /* Save the arguments.  */
8195   for (i = 0; i < nargs; i++)
8196     {
8197       offset = top_offset + i * UNITS_PER_WORD;
8198       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
8199       XVECEXP (pattern, 0, n++) = set;
8200     }
8201
8202   /* Then fill in the other register moves.  */
8203   offset = top_offset;
8204   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8205     {
8206       regno = mips16e_save_restore_regs[i];
8207       if (BITSET_P (*mask_ptr, regno))
8208         {
8209           offset -= UNITS_PER_WORD;
8210           set = mips16e_save_restore_reg (restore_p, offset, regno);
8211           XVECEXP (pattern, 0, n++) = set;
8212           *mask_ptr &= ~(1 << regno);
8213         }
8214     }
8215
8216   /* Tell the caller what offset it should use for the remaining registers.  */
8217   *offset_ptr = size + (offset - top_offset);
8218
8219   gcc_assert (n == XVECLEN (pattern, 0));
8220
8221   return pattern;
8222 }
8223
8224 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
8225    pointer.  Return true if PATTERN matches the kind of instruction
8226    generated by mips16e_build_save_restore.  If INFO is nonnull,
8227    initialize it when returning true.  */
8228
8229 bool
8230 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
8231                                 struct mips16e_save_restore_info *info)
8232 {
8233   unsigned int i, nargs, mask, extra;
8234   HOST_WIDE_INT top_offset, save_offset, offset;
8235   rtx set, reg, mem, base;
8236   int n;
8237
8238   if (!GENERATE_MIPS16E_SAVE_RESTORE)
8239     return false;
8240
8241   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8242   top_offset = adjust > 0 ? adjust : 0;
8243
8244   /* Interpret all other members of the PARALLEL.  */
8245   save_offset = top_offset - UNITS_PER_WORD;
8246   mask = 0;
8247   nargs = 0;
8248   i = 0;
8249   for (n = 1; n < XVECLEN (pattern, 0); n++)
8250     {
8251       /* Check that we have a SET.  */
8252       set = XVECEXP (pattern, 0, n);
8253       if (GET_CODE (set) != SET)
8254         return false;
8255
8256       /* Check that the SET is a load (if restoring) or a store
8257          (if saving).  */
8258       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
8259       if (!MEM_P (mem))
8260         return false;
8261
8262       /* Check that the address is the sum of the stack pointer and a
8263          possibly-zero constant offset.  */
8264       mips_split_plus (XEXP (mem, 0), &base, &offset);
8265       if (base != stack_pointer_rtx)
8266         return false;
8267
8268       /* Check that SET's other operand is a register.  */
8269       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
8270       if (!REG_P (reg))
8271         return false;
8272
8273       /* Check for argument saves.  */
8274       if (offset == top_offset + nargs * UNITS_PER_WORD
8275           && REGNO (reg) == GP_ARG_FIRST + nargs)
8276         nargs++;
8277       else if (offset == save_offset)
8278         {
8279           while (mips16e_save_restore_regs[i++] != REGNO (reg))
8280             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
8281               return false;
8282
8283           mask |= 1 << REGNO (reg);
8284           save_offset -= UNITS_PER_WORD;
8285         }
8286       else
8287         return false;
8288     }
8289
8290   /* Check that the restrictions on register ranges are met.  */
8291   extra = 0;
8292   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
8293                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
8294   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
8295                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
8296   if (extra != 0)
8297     return false;
8298
8299   /* Make sure that the topmost argument register is not saved twice.
8300      The checks above ensure that the same is then true for the other
8301      argument registers.  */
8302   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
8303     return false;
8304
8305   /* Pass back information, if requested.  */
8306   if (info)
8307     {
8308       info->nargs = nargs;
8309       info->mask = mask;
8310       info->size = (adjust > 0 ? adjust : -adjust);
8311     }
8312
8313   return true;
8314 }
8315
8316 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
8317    for the register range [MIN_REG, MAX_REG].  Return a pointer to
8318    the null terminator.  */
8319
8320 static char *
8321 mips16e_add_register_range (char *s, unsigned int min_reg,
8322                             unsigned int max_reg)
8323 {
8324   if (min_reg != max_reg)
8325     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
8326   else
8327     s += sprintf (s, ",%s", reg_names[min_reg]);
8328   return s;
8329 }
8330
8331 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
8332    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
8333
8334 const char *
8335 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
8336 {
8337   static char buffer[300];
8338
8339   struct mips16e_save_restore_info info;
8340   unsigned int i, end;
8341   char *s;
8342
8343   /* Parse the pattern.  */
8344   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
8345     gcc_unreachable ();
8346
8347   /* Add the mnemonic.  */
8348   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
8349   s += strlen (s);
8350
8351   /* Save the arguments.  */
8352   if (info.nargs > 1)
8353     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
8354                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
8355   else if (info.nargs == 1)
8356     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
8357
8358   /* Emit the amount of stack space to allocate or deallocate.  */
8359   s += sprintf (s, "%d", (int) info.size);
8360
8361   /* Save or restore $16.  */
8362   if (BITSET_P (info.mask, 16))
8363     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
8364
8365   /* Save or restore $17.  */
8366   if (BITSET_P (info.mask, 17))
8367     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
8368
8369   /* Save or restore registers in the range $s2...$s8, which
8370      mips16e_s2_s8_regs lists in decreasing order.  Note that this
8371      is a software register range; the hardware registers are not
8372      numbered consecutively.  */
8373   end = ARRAY_SIZE (mips16e_s2_s8_regs);
8374   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
8375   if (i < end)
8376     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
8377                                     mips16e_s2_s8_regs[i]);
8378
8379   /* Save or restore registers in the range $a0...$a3.  */
8380   end = ARRAY_SIZE (mips16e_a0_a3_regs);
8381   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
8382   if (i < end)
8383     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
8384                                     mips16e_a0_a3_regs[end - 1]);
8385
8386   /* Save or restore $31.  */
8387   if (BITSET_P (info.mask, 31))
8388     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 31]);
8389
8390   return buffer;
8391 }
8392 \f
8393 /* Return true if the current function has an insn that implicitly
8394    refers to $gp.  */
8395
8396 static bool
8397 mips_function_has_gp_insn (void)
8398 {
8399   /* Don't bother rechecking if we found one last time.  */
8400   if (!cfun->machine->has_gp_insn_p)
8401     {
8402       rtx insn;
8403
8404       push_topmost_sequence ();
8405       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8406         if (USEFUL_INSN_P (insn)
8407             && (get_attr_got (insn) != GOT_UNSET
8408                 || mips_small_data_pattern_p (PATTERN (insn))))
8409           {
8410             cfun->machine->has_gp_insn_p = true;
8411             break;
8412           }
8413       pop_topmost_sequence ();
8414     }
8415   return cfun->machine->has_gp_insn_p;
8416 }
8417
8418 /* Return true if the current function returns its value in a floating-point
8419    register in MIPS16 mode.  */
8420
8421 static bool
8422 mips16_cfun_returns_in_fpr_p (void)
8423 {
8424   tree return_type = DECL_RESULT (current_function_decl);
8425   return (TARGET_MIPS16
8426           && TARGET_HARD_FLOAT_ABI
8427           && !aggregate_value_p (return_type, current_function_decl)
8428           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
8429 }
8430
8431 /* Return the register that should be used as the global pointer
8432    within this function.  Return INVALID_REGNUM if the function
8433    doesn't need a global pointer.  */
8434
8435 static unsigned int
8436 mips_global_pointer (void)
8437 {
8438   unsigned int regno;
8439
8440   /* $gp is always available unless we're using a GOT.  */
8441   if (!TARGET_USE_GOT)
8442     return GLOBAL_POINTER_REGNUM;
8443
8444   /* We must always provide $gp when it is used implicitly.  */
8445   if (!TARGET_EXPLICIT_RELOCS)
8446     return GLOBAL_POINTER_REGNUM;
8447
8448   /* FUNCTION_PROFILER includes a jal macro, so we need to give it
8449      a valid gp.  */
8450   if (crtl->profile)
8451     return GLOBAL_POINTER_REGNUM;
8452
8453   /* If the function has a nonlocal goto, $gp must hold the correct
8454      global pointer for the target function.  */
8455   if (crtl->has_nonlocal_goto)
8456     return GLOBAL_POINTER_REGNUM;
8457
8458   /* There's no need to initialize $gp if it isn't referenced now,
8459      and if we can be sure that no new references will be added during
8460      or after reload.  */
8461   if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
8462       && !mips_function_has_gp_insn ())
8463     {
8464       /* The function doesn't use $gp at the moment.  If we're generating
8465          -call_nonpic code, no new uses will be introduced during or after
8466          reload.  */
8467       if (TARGET_ABICALLS_PIC0)
8468         return INVALID_REGNUM;
8469
8470       /* We need to handle the following implicit gp references:
8471
8472          - Reload can sometimes introduce constant pool references
8473            into a function that otherwise didn't need them.  For example,
8474            suppose we have an instruction like:
8475
8476                (set (reg:DF R1) (float:DF (reg:SI R2)))
8477
8478            If R2 turns out to be constant such as 1, the instruction may
8479            have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
8480            the option of using this constant if R2 doesn't get allocated
8481            to a register.
8482
8483            In cases like these, reload will have added the constant to the
8484            pool but no instruction will yet refer to it.
8485
8486          - MIPS16 functions that return in FPRs need to call an
8487            external libgcc routine.  */
8488       if (!crtl->uses_const_pool
8489           && !mips16_cfun_returns_in_fpr_p ())
8490         return INVALID_REGNUM;
8491     }
8492
8493   /* We need a global pointer, but perhaps we can use a call-clobbered
8494      register instead of $gp.  */
8495   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
8496     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
8497       if (!df_regs_ever_live_p (regno)
8498           && call_really_used_regs[regno]
8499           && !fixed_regs[regno]
8500           && regno != PIC_FUNCTION_ADDR_REGNUM)
8501         return regno;
8502
8503   return GLOBAL_POINTER_REGNUM;
8504 }
8505
8506 /* Return true if REGNO is a register that is ordinarily call-clobbered
8507    but must nevertheless be preserved by an interrupt handler.  */
8508
8509 static bool
8510 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
8511 {
8512   if (MD_REG_P (regno))
8513     return true;
8514
8515   if (TARGET_DSP && DSP_ACC_REG_P (regno))
8516     return true;
8517
8518   if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
8519     {
8520       /* $0 is hard-wired.  */
8521       if (regno == GP_REG_FIRST)
8522         return false;
8523
8524       /* The interrupt handler can treat kernel registers as
8525          scratch registers.  */
8526       if (KERNEL_REG_P (regno))
8527         return false;
8528
8529       /* The function will return the stack pointer to its original value
8530          anyway.  */
8531       if (regno == STACK_POINTER_REGNUM)
8532         return false;
8533
8534       /* Otherwise, return true for registers that aren't ordinarily
8535          call-clobbered.  */
8536       return call_really_used_regs[regno];
8537     }
8538
8539   return false;
8540 }
8541
8542 /* Return true if the current function should treat register REGNO
8543    as call-saved.  */
8544
8545 static bool
8546 mips_cfun_call_saved_reg_p (unsigned int regno)
8547 {
8548   /* Interrupt handlers need to save extra registers.  */
8549   if (cfun->machine->interrupt_handler_p
8550       && mips_interrupt_extra_call_saved_reg_p (regno))
8551     return true;
8552
8553   /* call_insns preserve $28 unless they explicitly say otherwise,
8554      so call_really_used_regs[] treats $28 as call-saved.  However,
8555      we want the ABI property rather than the default call_insn
8556      property here.  */
8557   return (regno == GLOBAL_POINTER_REGNUM
8558           ? TARGET_CALL_SAVED_GP
8559           : !call_really_used_regs[regno]);
8560 }
8561
8562 /* Return true if the function body might clobber register REGNO.
8563    We know that REGNO is call-saved.  */
8564
8565 static bool
8566 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
8567 {
8568   /* Some functions should be treated as clobbering all call-saved
8569      registers.  */
8570   if (crtl->saves_all_registers)
8571     return true;
8572
8573   /* DF handles cases where a register is explicitly referenced in
8574      the rtl.  Incoming values are passed in call-clobbered registers,
8575      so we can assume that any live call-saved register is set within
8576      the function.  */
8577   if (df_regs_ever_live_p (regno))
8578     return true;
8579
8580   /* Check for registers that are clobbered by FUNCTION_PROFILER.
8581      These clobbers are not explicit in the rtl.  */
8582   if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
8583     return true;
8584
8585   /* If we're using a call-saved global pointer, the function's
8586      prologue will need to set it up.  */
8587   if (cfun->machine->global_pointer == regno)
8588     return true;
8589
8590   /* The function's prologue will need to set the frame pointer if
8591      frame_pointer_needed.  */
8592   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
8593     return true;
8594
8595   /* If a MIPS16 function returns a value in FPRs, its epilogue
8596      will need to call an external libgcc routine.  This yet-to-be
8597      generated call_insn will clobber $31.  */
8598   if (regno == GP_REG_FIRST + 31 && mips16_cfun_returns_in_fpr_p ())
8599     return true;
8600
8601   /* If REGNO is ordinarily call-clobbered, we must assume that any
8602      called function could modify it.  */
8603   if (cfun->machine->interrupt_handler_p
8604       && !current_function_is_leaf
8605       && mips_interrupt_extra_call_saved_reg_p (regno))
8606     return true;
8607
8608   return false;
8609 }
8610
8611 /* Return true if the current function must save register REGNO.  */
8612
8613 static bool
8614 mips_save_reg_p (unsigned int regno)
8615 {
8616   if (mips_cfun_call_saved_reg_p (regno))
8617     {
8618       if (mips_cfun_might_clobber_call_saved_reg_p (regno))
8619         return true;
8620
8621       /* Save both registers in an FPR pair if either one is used.  This is
8622          needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
8623          register to be used without the even register.  */
8624       if (FP_REG_P (regno)
8625           && MAX_FPRS_PER_FMT == 2
8626           && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
8627         return true;
8628     }
8629
8630   /* We need to save the incoming return address if __builtin_eh_return
8631      is being used to set a different return address.  */
8632   if (regno == GP_REG_FIRST + 31 && crtl->calls_eh_return)
8633     return true;
8634
8635   return false;
8636 }
8637
8638 /* Populate the current function's mips_frame_info structure.
8639
8640    MIPS stack frames look like:
8641
8642         +-------------------------------+
8643         |                               |
8644         |  incoming stack arguments     |
8645         |                               |
8646         +-------------------------------+
8647         |                               |
8648         |  caller-allocated save area   |
8649       A |  for register arguments       |
8650         |                               |
8651         +-------------------------------+ <-- incoming stack pointer
8652         |                               |
8653         |  callee-allocated save area   |
8654       B |  for arguments that are       |
8655         |  split between registers and  |
8656         |  the stack                    |
8657         |                               |
8658         +-------------------------------+ <-- arg_pointer_rtx
8659         |                               |
8660       C |  callee-allocated save area   |
8661         |  for register varargs         |
8662         |                               |
8663         +-------------------------------+ <-- frame_pointer_rtx
8664         |                               |       + cop0_sp_offset
8665         |  COP0 reg save area           |       + UNITS_PER_WORD
8666         |                               |
8667         +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
8668         |                               |       + UNITS_PER_WORD
8669         |  accumulator save area        |
8670         |                               |
8671         +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
8672         |                               |       + UNITS_PER_HWFPVALUE
8673         |  FPR save area                |
8674         |                               |
8675         +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
8676         |                               |       + UNITS_PER_WORD
8677         |  GPR save area                |
8678         |                               |
8679         +-------------------------------+ <-- frame_pointer_rtx with
8680         |                               | \     -fstack-protector
8681         |  local variables              |  | var_size
8682         |                               | /
8683         +-------------------------------+
8684         |                               | \
8685         |  $gp save area                |  | cprestore_size
8686         |                               | /
8687       P +-------------------------------+ <-- hard_frame_pointer_rtx for
8688         |                               | \     MIPS16 code
8689         |  outgoing stack arguments     |  |
8690         |                               |  |
8691         +-------------------------------+  | args_size
8692         |                               |  |
8693         |  caller-allocated save area   |  |
8694         |  for register arguments       |  |
8695         |                               | /
8696         +-------------------------------+ <-- stack_pointer_rtx
8697                                               frame_pointer_rtx without
8698                                                 -fstack-protector
8699                                               hard_frame_pointer_rtx for
8700                                                 non-MIPS16 code.
8701
8702    At least two of A, B and C will be empty.
8703
8704    Dynamic stack allocations such as alloca insert data at point P.
8705    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
8706    hard_frame_pointer_rtx unchanged.  */
8707
8708 static void
8709 mips_compute_frame_info (void)
8710 {
8711   struct mips_frame_info *frame;
8712   HOST_WIDE_INT offset, size;
8713   unsigned int regno, i;
8714
8715   /* Set this function's interrupt properties.  */
8716   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
8717     {
8718       if (!ISA_MIPS32R2)
8719         error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
8720       else if (TARGET_HARD_FLOAT)
8721         error ("the %<interrupt%> attribute requires %<-msoft-float%>");
8722       else if (TARGET_MIPS16)
8723         error ("interrupt handlers cannot be MIPS16 functions");
8724       else
8725         {
8726           cfun->machine->interrupt_handler_p = true;
8727           cfun->machine->use_shadow_register_set_p =
8728             mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
8729           cfun->machine->keep_interrupts_masked_p =
8730             mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
8731           cfun->machine->use_debug_exception_return_p =
8732             mips_use_debug_exception_return_p (TREE_TYPE
8733                                                (current_function_decl));
8734         }
8735     }
8736
8737   frame = &cfun->machine->frame;
8738   memset (frame, 0, sizeof (*frame));
8739   size = get_frame_size ();
8740
8741   cfun->machine->global_pointer = mips_global_pointer ();
8742
8743   /* The first two blocks contain the outgoing argument area and the $gp save
8744      slot.  This area isn't needed in leaf functions, but if the
8745      target-independent frame size is nonzero, we have already committed to
8746      allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
8747   if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf)
8748     {
8749       /* The MIPS 3.0 linker does not like functions that dynamically
8750          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
8751          looks like we are trying to create a second frame pointer to the
8752          function, so allocate some stack space to make it happy.  */
8753       if (cfun->calls_alloca)
8754         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
8755       else
8756         frame->args_size = 0;
8757       frame->cprestore_size = 0;
8758     }
8759   else
8760     {
8761       frame->args_size = crtl->outgoing_args_size;
8762       frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
8763     }
8764   offset = frame->args_size + frame->cprestore_size;
8765
8766   /* Move above the local variables.  */
8767   frame->var_size = MIPS_STACK_ALIGN (size);
8768   offset += frame->var_size;
8769
8770   /* Find out which GPRs we need to save.  */
8771   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
8772     if (mips_save_reg_p (regno))
8773       {
8774         frame->num_gp++;
8775         frame->mask |= 1 << (regno - GP_REG_FIRST);
8776       }
8777
8778   /* If this function calls eh_return, we must also save and restore the
8779      EH data registers.  */
8780   if (crtl->calls_eh_return)
8781     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
8782       {
8783         frame->num_gp++;
8784         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
8785       }
8786
8787   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
8788      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
8789      save all later registers too.  */
8790   if (GENERATE_MIPS16E_SAVE_RESTORE)
8791     {
8792       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
8793                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
8794       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
8795                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
8796     }
8797
8798   /* Move above the GPR save area.  */
8799   if (frame->num_gp > 0)
8800     {
8801       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
8802       frame->gp_sp_offset = offset - UNITS_PER_WORD;
8803     }
8804
8805   /* Find out which FPRs we need to save.  This loop must iterate over
8806      the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
8807   if (TARGET_HARD_FLOAT)
8808     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
8809       if (mips_save_reg_p (regno))
8810         {
8811           frame->num_fp += MAX_FPRS_PER_FMT;
8812           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
8813         }
8814
8815   /* Move above the FPR save area.  */
8816   if (frame->num_fp > 0)
8817     {
8818       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
8819       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
8820     }
8821
8822   /* Add in space for the interrupt context information.  */
8823   if (cfun->machine->interrupt_handler_p)
8824     {
8825       /* Check HI/LO.  */
8826       if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
8827         {
8828           frame->num_acc++;
8829           frame->acc_mask |= (1 << 0);
8830         }
8831
8832       /* Check accumulators 1, 2, 3.  */
8833       for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
8834         if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
8835           {
8836             frame->num_acc++;
8837             frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
8838           }
8839
8840       /* All interrupt context functions need space to preserve STATUS.  */
8841       frame->num_cop0_regs++;
8842
8843       /* If we don't keep interrupts masked, we need to save EPC.  */
8844       if (!cfun->machine->keep_interrupts_masked_p)
8845         frame->num_cop0_regs++;
8846     }
8847
8848   /* Move above the accumulator save area.  */
8849   if (frame->num_acc > 0)
8850     {
8851       /* Each accumulator needs 2 words.  */
8852       offset += frame->num_acc * 2 * UNITS_PER_WORD;
8853       frame->acc_sp_offset = offset - UNITS_PER_WORD;
8854     }
8855
8856   /* Move above the COP0 register save area.  */
8857   if (frame->num_cop0_regs > 0)
8858     {
8859       offset += frame->num_cop0_regs * UNITS_PER_WORD;
8860       frame->cop0_sp_offset = offset - UNITS_PER_WORD;
8861     }
8862
8863   /* Move above the callee-allocated varargs save area.  */
8864   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
8865   frame->arg_pointer_offset = offset;
8866
8867   /* Move above the callee-allocated area for pretend stack arguments.  */
8868   offset += crtl->args.pretend_args_size;
8869   frame->total_size = offset;
8870
8871   /* Work out the offsets of the save areas from the top of the frame.  */
8872   if (frame->gp_sp_offset > 0)
8873     frame->gp_save_offset = frame->gp_sp_offset - offset;
8874   if (frame->fp_sp_offset > 0)
8875     frame->fp_save_offset = frame->fp_sp_offset - offset;
8876   if (frame->acc_sp_offset > 0)
8877     frame->acc_save_offset = frame->acc_sp_offset - offset;
8878   if (frame->num_cop0_regs > 0)
8879     frame->cop0_save_offset = frame->cop0_sp_offset - offset;
8880
8881   /* MIPS16 code offsets the frame pointer by the size of the outgoing
8882      arguments.  This tends to increase the chances of using unextended
8883      instructions for local variables and incoming arguments.  */
8884   if (TARGET_MIPS16)
8885     frame->hard_frame_pointer_offset = frame->args_size;
8886 }
8887
8888 /* Return the style of GP load sequence that is being used for the
8889    current function.  */
8890
8891 enum mips_loadgp_style
8892 mips_current_loadgp_style (void)
8893 {
8894   if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
8895     return LOADGP_NONE;
8896
8897   if (TARGET_RTP_PIC)
8898     return LOADGP_RTP;
8899
8900   if (TARGET_ABSOLUTE_ABICALLS)
8901     return LOADGP_ABSOLUTE;
8902
8903   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
8904 }
8905
8906 /* Implement FRAME_POINTER_REQUIRED.  */
8907
8908 bool
8909 mips_frame_pointer_required (void)
8910 {
8911   /* If the function contains dynamic stack allocations, we need to
8912      use the frame pointer to access the static parts of the frame.  */
8913   if (cfun->calls_alloca)
8914     return true;
8915
8916   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
8917      reload may be unable to compute the address of a local variable,
8918      since there is no way to add a large constant to the stack pointer
8919      without using a second temporary register.  */
8920   if (TARGET_MIPS16)
8921     {
8922       mips_compute_frame_info ();
8923       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
8924         return true;
8925     }
8926
8927   return false;
8928 }
8929
8930 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
8931    or argument pointer.  TO is either the stack pointer or hard frame
8932    pointer.  */
8933
8934 HOST_WIDE_INT
8935 mips_initial_elimination_offset (int from, int to)
8936 {
8937   HOST_WIDE_INT offset;
8938
8939   mips_compute_frame_info ();
8940
8941   /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
8942   switch (from)
8943     {
8944     case FRAME_POINTER_REGNUM:
8945       if (FRAME_GROWS_DOWNWARD)
8946         offset = (cfun->machine->frame.args_size
8947                   + cfun->machine->frame.cprestore_size
8948                   + cfun->machine->frame.var_size);
8949       else
8950         offset = 0;
8951       break;
8952
8953     case ARG_POINTER_REGNUM:
8954       offset = cfun->machine->frame.arg_pointer_offset;
8955       break;
8956
8957     default:
8958       gcc_unreachable ();
8959     }
8960
8961   if (to == HARD_FRAME_POINTER_REGNUM)
8962     offset -= cfun->machine->frame.hard_frame_pointer_offset;
8963
8964   return offset;
8965 }
8966 \f
8967 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
8968
8969 static void
8970 mips_extra_live_on_entry (bitmap regs)
8971 {
8972   if (TARGET_USE_GOT)
8973     {
8974       /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
8975          the global pointer.   */
8976       if (!TARGET_ABSOLUTE_ABICALLS)
8977         bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
8978
8979       /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
8980          the global pointer.  */
8981       if (TARGET_MIPS16)
8982         bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
8983
8984       /* See the comment above load_call<mode> for details.  */
8985       bitmap_set_bit (regs, GOT_VERSION_REGNUM);
8986     }
8987 }
8988
8989 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
8990    previous frame.  */
8991
8992 rtx
8993 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
8994 {
8995   if (count != 0)
8996     return const0_rtx;
8997
8998   return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
8999 }
9000
9001 /* Emit code to change the current function's return address to
9002    ADDRESS.  SCRATCH is available as a scratch register, if needed.
9003    ADDRESS and SCRATCH are both word-mode GPRs.  */
9004
9005 void
9006 mips_set_return_address (rtx address, rtx scratch)
9007 {
9008   rtx slot_address;
9009
9010   gcc_assert (BITSET_P (cfun->machine->frame.mask, 31));
9011   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
9012                                   cfun->machine->frame.gp_sp_offset);
9013   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
9014 }
9015
9016 /* Return a MEM rtx for the cprestore slot, using TEMP as a temporary base
9017    register if need be.  */
9018
9019 static rtx
9020 mips_cprestore_slot (rtx temp)
9021 {
9022   const struct mips_frame_info *frame;
9023   rtx base;
9024   HOST_WIDE_INT offset;
9025
9026   frame = &cfun->machine->frame;
9027   if (frame_pointer_needed)
9028     {
9029       base = hard_frame_pointer_rtx;
9030       offset = frame->args_size - frame->hard_frame_pointer_offset;
9031     }
9032   else
9033     {
9034       base = stack_pointer_rtx;
9035       offset = frame->args_size;
9036     }
9037   return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
9038 }
9039
9040 /* Restore $gp from its save slot, using TEMP as a temporary base register
9041    if need be.  This function is for o32 and o64 abicalls only.  */
9042
9043 void
9044 mips_restore_gp (rtx temp)
9045 {
9046   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
9047
9048   if (cfun->machine->global_pointer == INVALID_REGNUM)
9049     return;
9050
9051   if (TARGET_MIPS16)
9052     {
9053       mips_emit_move (temp, mips_cprestore_slot (temp));
9054       mips_emit_move (pic_offset_table_rtx, temp);
9055     }
9056   else
9057     mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp));
9058   if (!TARGET_EXPLICIT_RELOCS)
9059     emit_insn (gen_blockage ());
9060 }
9061 \f
9062 /* A function to save or store a register.  The first argument is the
9063    register and the second is the stack slot.  */
9064 typedef void (*mips_save_restore_fn) (rtx, rtx);
9065
9066 /* Use FN to save or restore register REGNO.  MODE is the register's
9067    mode and OFFSET is the offset of its save slot from the current
9068    stack pointer.  */
9069
9070 static void
9071 mips_save_restore_reg (enum machine_mode mode, int regno,
9072                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
9073 {
9074   rtx mem;
9075
9076   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
9077   fn (gen_rtx_REG (mode, regno), mem);
9078 }
9079
9080 /* Call FN for each accumlator that is saved by the current function.
9081    SP_OFFSET is the offset of the current stack pointer from the start
9082    of the frame.  */
9083
9084 static void
9085 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
9086 {
9087   HOST_WIDE_INT offset;
9088   int regno;
9089
9090   offset = cfun->machine->frame.acc_sp_offset - sp_offset;
9091   if (BITSET_P (cfun->machine->frame.acc_mask, 0))
9092     {
9093       mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
9094       offset -= UNITS_PER_WORD;
9095       mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
9096       offset -= UNITS_PER_WORD;
9097     }
9098
9099   for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
9100     if (BITSET_P (cfun->machine->frame.acc_mask,
9101                   ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
9102       {
9103         mips_save_restore_reg (word_mode, regno, offset, fn);
9104         offset -= UNITS_PER_WORD;
9105       }
9106 }
9107
9108 /* Call FN for each register that is saved by the current function.
9109    SP_OFFSET is the offset of the current stack pointer from the start
9110    of the frame.  */
9111
9112 static void
9113 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
9114                                  mips_save_restore_fn fn)
9115 {
9116   enum machine_mode fpr_mode;
9117   HOST_WIDE_INT offset;
9118   int regno;
9119
9120   /* Save registers starting from high to low.  The debuggers prefer at least
9121      the return register be stored at func+4, and also it allows us not to
9122      need a nop in the epilogue if at least one register is reloaded in
9123      addition to return address.  */
9124   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
9125   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
9126     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
9127       {
9128         mips_save_restore_reg (word_mode, regno, offset, fn);
9129         offset -= UNITS_PER_WORD;
9130       }
9131
9132   /* This loop must iterate over the same space as its companion in
9133      mips_compute_frame_info.  */
9134   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
9135   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
9136   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
9137        regno >= FP_REG_FIRST;
9138        regno -= MAX_FPRS_PER_FMT)
9139     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
9140       {
9141         mips_save_restore_reg (fpr_mode, regno, offset, fn);
9142         offset -= GET_MODE_SIZE (fpr_mode);
9143       }
9144 }
9145 \f
9146 /* If we're generating n32 or n64 abicalls, and the current function
9147    does not use $28 as its global pointer, emit a cplocal directive.
9148    Use pic_offset_table_rtx as the argument to the directive.  */
9149
9150 static void
9151 mips_output_cplocal (void)
9152 {
9153   if (!TARGET_EXPLICIT_RELOCS
9154       && cfun->machine->global_pointer != INVALID_REGNUM
9155       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
9156     output_asm_insn (".cplocal %+", 0);
9157 }
9158
9159 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
9160
9161 static void
9162 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9163 {
9164   const char *fnname;
9165
9166 #ifdef SDB_DEBUGGING_INFO
9167   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
9168     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
9169 #endif
9170
9171   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
9172      floating-point arguments.  */
9173   if (TARGET_MIPS16
9174       && TARGET_HARD_FLOAT_ABI
9175       && crtl->args.info.fp_code != 0)
9176     mips16_build_function_stub ();
9177
9178   /* Get the function name the same way that toplev.c does before calling
9179      assemble_start_function.  This is needed so that the name used here
9180      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9181   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9182   mips_start_function_definition (fnname, TARGET_MIPS16);
9183
9184   /* Stop mips_file_end from treating this function as external.  */
9185   if (TARGET_IRIX && mips_abi == ABI_32)
9186     TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
9187
9188   /* Output MIPS-specific frame information.  */
9189   if (!flag_inhibit_size_directive)
9190     {
9191       const struct mips_frame_info *frame;
9192
9193       frame = &cfun->machine->frame;
9194
9195       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
9196       fprintf (file,
9197                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
9198                "# vars= " HOST_WIDE_INT_PRINT_DEC
9199                ", regs= %d/%d"
9200                ", args= " HOST_WIDE_INT_PRINT_DEC
9201                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
9202                reg_names[frame_pointer_needed
9203                          ? HARD_FRAME_POINTER_REGNUM
9204                          : STACK_POINTER_REGNUM],
9205                (frame_pointer_needed
9206                 ? frame->total_size - frame->hard_frame_pointer_offset
9207                 : frame->total_size),
9208                reg_names[GP_REG_FIRST + 31],
9209                frame->var_size,
9210                frame->num_gp, frame->num_fp,
9211                frame->args_size,
9212                frame->cprestore_size);
9213
9214       /* .mask MASK, OFFSET.  */
9215       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9216                frame->mask, frame->gp_save_offset);
9217
9218       /* .fmask MASK, OFFSET.  */
9219       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9220                frame->fmask, frame->fp_save_offset);
9221     }
9222
9223   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
9224      Also emit the ".set noreorder; .set nomacro" sequence for functions
9225      that need it.  */
9226   if (mips_current_loadgp_style () == LOADGP_OLDABI)
9227     {
9228       if (TARGET_MIPS16)
9229         {
9230           /* This is a fixed-form sequence.  The position of the
9231              first two instructions is important because of the
9232              way _gp_disp is defined.  */
9233           output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
9234           output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
9235           output_asm_insn ("sll\t$2,16", 0);
9236           output_asm_insn ("addu\t$2,$3", 0);
9237         }
9238       /* .cpload must be in a .set noreorder but not a .set nomacro block.  */
9239       else if (!cfun->machine->all_noreorder_p)
9240         output_asm_insn ("%(.cpload\t%^%)", 0);
9241       else
9242         output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
9243     }
9244   else if (cfun->machine->all_noreorder_p)
9245     output_asm_insn ("%(%<", 0);
9246
9247   /* Tell the assembler which register we're using as the global
9248      pointer.  This is needed for thunks, since they can use either
9249      explicit relocs or assembler macros.  */
9250   mips_output_cplocal ();
9251 }
9252
9253 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
9254
9255 static void
9256 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9257                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9258 {
9259   const char *fnname;
9260
9261   /* Reinstate the normal $gp.  */
9262   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
9263   mips_output_cplocal ();
9264
9265   if (cfun->machine->all_noreorder_p)
9266     {
9267       /* Avoid using %>%) since it adds excess whitespace.  */
9268       output_asm_insn (".set\tmacro", 0);
9269       output_asm_insn (".set\treorder", 0);
9270       set_noreorder = set_nomacro = 0;
9271     }
9272
9273   /* Get the function name the same way that toplev.c does before calling
9274      assemble_start_function.  This is needed so that the name used here
9275      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9276   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9277   mips_end_function_definition (fnname);
9278 }
9279 \f
9280 /* Save register REG to MEM.  Make the instruction frame-related.  */
9281
9282 static void
9283 mips_save_reg (rtx reg, rtx mem)
9284 {
9285   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
9286     {
9287       rtx x1, x2;
9288
9289       if (mips_split_64bit_move_p (mem, reg))
9290         mips_split_doubleword_move (mem, reg);
9291       else
9292         mips_emit_move (mem, reg);
9293
9294       x1 = mips_frame_set (mips_subword (mem, false),
9295                            mips_subword (reg, false));
9296       x2 = mips_frame_set (mips_subword (mem, true),
9297                            mips_subword (reg, true));
9298       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
9299     }
9300   else
9301     {
9302       if (REGNO (reg) == HI_REGNUM)
9303         {
9304           if (TARGET_64BIT)
9305             emit_insn (gen_mfhidi_ti (MIPS_PROLOGUE_TEMP (DImode),
9306                                       gen_rtx_REG (TImode, MD_REG_FIRST)));
9307           else
9308             emit_insn (gen_mfhisi_di (MIPS_PROLOGUE_TEMP (SImode),
9309                                       gen_rtx_REG (DImode, MD_REG_FIRST)));
9310           mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
9311         }
9312       else if ((TARGET_MIPS16
9313                 && REGNO (reg) != GP_REG_FIRST + 31
9314                 && !M16_REG_P (REGNO (reg)))
9315                || ACC_REG_P (REGNO (reg)))
9316         {
9317           /* If the register has no direct store instruction, move it
9318              through a temporary.  Note that there's a special MIPS16
9319              instruction to save $31.  */
9320           mips_emit_move (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
9321           mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
9322         }
9323       else
9324         mips_emit_move (mem, reg);
9325
9326       mips_set_frame_expr (mips_frame_set (mem, reg));
9327     }
9328 }
9329
9330 /* The __gnu_local_gp symbol.  */
9331
9332 static GTY(()) rtx mips_gnu_local_gp;
9333
9334 /* If we're generating n32 or n64 abicalls, emit instructions
9335    to set up the global pointer.  */
9336
9337 static void
9338 mips_emit_loadgp (void)
9339 {
9340   rtx addr, offset, incoming_address, base, index, pic_reg;
9341
9342   pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
9343   switch (mips_current_loadgp_style ())
9344     {
9345     case LOADGP_ABSOLUTE:
9346       if (mips_gnu_local_gp == NULL)
9347         {
9348           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
9349           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
9350         }
9351       emit_insn (Pmode == SImode
9352                  ? gen_loadgp_absolute_si (pic_reg, mips_gnu_local_gp)
9353                  : gen_loadgp_absolute_di (pic_reg, mips_gnu_local_gp));
9354       break;
9355
9356     case LOADGP_OLDABI:
9357       /* Added by mips_output_function_prologue.  */
9358       break;
9359
9360     case LOADGP_NEWABI:
9361       addr = XEXP (DECL_RTL (current_function_decl), 0);
9362       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
9363       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
9364       emit_insn (Pmode == SImode
9365                  ? gen_loadgp_newabi_si (pic_reg, offset, incoming_address)
9366                  : gen_loadgp_newabi_di (pic_reg, offset, incoming_address));
9367       break;
9368
9369     case LOADGP_RTP:
9370       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
9371       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
9372       emit_insn (Pmode == SImode
9373                  ? gen_loadgp_rtp_si (pic_reg, base, index)
9374                  : gen_loadgp_rtp_di (pic_reg, base, index));
9375       break;
9376
9377     default:
9378       return;
9379     }
9380
9381   if (TARGET_MIPS16)
9382     emit_insn (gen_copygp_mips16 (pic_offset_table_rtx, pic_reg));
9383
9384   /* Emit a blockage if there are implicit uses of the GP register.
9385      This includes profiled functions, because FUNCTION_PROFILE uses
9386      a jal macro.  */
9387   if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
9388     emit_insn (gen_loadgp_blockage ());
9389 }
9390
9391 /* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
9392
9393 static int
9394 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
9395 {
9396   return GET_CODE (*x) == REG && KERNEL_REG_P (REGNO (*x));
9397 }
9398
9399 /* Expand the "prologue" pattern.  */
9400
9401 void
9402 mips_expand_prologue (void)
9403 {
9404   const struct mips_frame_info *frame;
9405   HOST_WIDE_INT size;
9406   unsigned int nargs;
9407   rtx insn;
9408
9409   if (cfun->machine->global_pointer != INVALID_REGNUM)
9410     SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
9411
9412   frame = &cfun->machine->frame;
9413   size = frame->total_size;
9414
9415   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
9416      bytes beforehand; this is enough to cover the register save area
9417      without going out of range.  */
9418   if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
9419       || frame->num_cop0_regs > 0)
9420     {
9421       HOST_WIDE_INT step1;
9422
9423       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
9424       if (GENERATE_MIPS16E_SAVE_RESTORE)
9425         {
9426           HOST_WIDE_INT offset;
9427           unsigned int mask, regno;
9428
9429           /* Try to merge argument stores into the save instruction.  */
9430           nargs = mips16e_collect_argument_saves ();
9431
9432           /* Build the save instruction.  */
9433           mask = frame->mask;
9434           insn = mips16e_build_save_restore (false, &mask, &offset,
9435                                              nargs, step1);
9436           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
9437           size -= step1;
9438
9439           /* Check if we need to save other registers.  */
9440           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
9441             if (BITSET_P (mask, regno - GP_REG_FIRST))
9442               {
9443                 offset -= UNITS_PER_WORD;
9444                 mips_save_restore_reg (word_mode, regno,
9445                                        offset, mips_save_reg);
9446               }
9447         }
9448       else
9449         {
9450           if (cfun->machine->interrupt_handler_p)
9451             {
9452               HOST_WIDE_INT offset;
9453               rtx mem;
9454
9455               /* If this interrupt is using a shadow register set, we need to
9456                  get the stack pointer from the previous register set.  */
9457               if (cfun->machine->use_shadow_register_set_p)
9458                 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
9459                                             stack_pointer_rtx));
9460
9461               if (!cfun->machine->keep_interrupts_masked_p)
9462                 {
9463                   /* Move from COP0 Cause to K0.  */
9464                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
9465                                             gen_rtx_REG (SImode,
9466                                                          COP0_CAUSE_REG_NUM)));
9467                   /* Move from COP0 EPC to K1.  */
9468                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
9469                                             gen_rtx_REG (SImode,
9470                                                          COP0_EPC_REG_NUM)));
9471                 }
9472
9473               /* Allocate the first part of the frame.  */
9474               insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
9475                                     GEN_INT (-step1));
9476               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
9477               size -= step1;
9478
9479               /* Start at the uppermost location for saving.  */
9480               offset = frame->cop0_sp_offset - size;
9481               if (!cfun->machine->keep_interrupts_masked_p)
9482                 {
9483                   /* Push EPC into its stack slot.  */
9484                   mem = gen_frame_mem (word_mode,
9485                                        plus_constant (stack_pointer_rtx,
9486                                                       offset));
9487                   mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
9488                   offset -= UNITS_PER_WORD;
9489                 }
9490
9491               /* Move from COP0 Status to K1.  */
9492               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
9493                                         gen_rtx_REG (SImode,
9494                                                      COP0_STATUS_REG_NUM)));
9495
9496               /* Right justify the RIPL in k0.  */
9497               if (!cfun->machine->keep_interrupts_masked_p)
9498                 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
9499                                         gen_rtx_REG (SImode, K0_REG_NUM),
9500                                         GEN_INT (CAUSE_IPL)));
9501
9502               /* Push Status into its stack slot.  */
9503               mem = gen_frame_mem (word_mode,
9504                                    plus_constant (stack_pointer_rtx, offset));
9505               mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
9506               offset -= UNITS_PER_WORD;
9507
9508               /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
9509               if (!cfun->machine->keep_interrupts_masked_p)
9510                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
9511                                        GEN_INT (6),
9512                                        GEN_INT (SR_IPL),
9513                                        gen_rtx_REG (SImode, K0_REG_NUM)));
9514
9515               if (!cfun->machine->keep_interrupts_masked_p)
9516                 /* Enable interrupts by clearing the KSU ERL and EXL bits.
9517                    IE is already the correct value, so we don't have to do
9518                    anything explicit.  */
9519                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
9520                                        GEN_INT (4),
9521                                        GEN_INT (SR_EXL),
9522                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
9523               else
9524                 /* Disable interrupts by clearing the KSU, ERL, EXL,
9525                    and IE bits.  */
9526                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
9527                                        GEN_INT (5),
9528                                        GEN_INT (SR_IE),
9529                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
9530             }
9531           else
9532             {
9533               insn = gen_add3_insn (stack_pointer_rtx,
9534                                     stack_pointer_rtx,
9535                                     GEN_INT (-step1));
9536               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
9537               size -= step1;
9538             }
9539           mips_for_each_saved_acc (size, mips_save_reg);
9540           mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
9541         }
9542     }
9543
9544   /* Allocate the rest of the frame.  */
9545   if (size > 0)
9546     {
9547       if (SMALL_OPERAND (-size))
9548         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
9549                                                        stack_pointer_rtx,
9550                                                        GEN_INT (-size)))) = 1;
9551       else
9552         {
9553           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
9554           if (TARGET_MIPS16)
9555             {
9556               /* There are no instructions to add or subtract registers
9557                  from the stack pointer, so use the frame pointer as a
9558                  temporary.  We should always be using a frame pointer
9559                  in this case anyway.  */
9560               gcc_assert (frame_pointer_needed);
9561               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
9562               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
9563                                         hard_frame_pointer_rtx,
9564                                         MIPS_PROLOGUE_TEMP (Pmode)));
9565               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
9566             }
9567           else
9568             emit_insn (gen_sub3_insn (stack_pointer_rtx,
9569                                       stack_pointer_rtx,
9570                                       MIPS_PROLOGUE_TEMP (Pmode)));
9571
9572           /* Describe the combined effect of the previous instructions.  */
9573           mips_set_frame_expr
9574             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9575                           plus_constant (stack_pointer_rtx, -size)));
9576         }
9577     }
9578
9579   /* Set up the frame pointer, if we're using one.  */
9580   if (frame_pointer_needed)
9581     {
9582       HOST_WIDE_INT offset;
9583
9584       offset = frame->hard_frame_pointer_offset;
9585       if (offset == 0)
9586         {
9587           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
9588           RTX_FRAME_RELATED_P (insn) = 1;
9589         }
9590       else if (SMALL_OPERAND (offset))
9591         {
9592           insn = gen_add3_insn (hard_frame_pointer_rtx,
9593                                 stack_pointer_rtx, GEN_INT (offset));
9594           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
9595         }
9596       else
9597         {
9598           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
9599           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
9600           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
9601                                     hard_frame_pointer_rtx,
9602                                     MIPS_PROLOGUE_TEMP (Pmode)));
9603           mips_set_frame_expr
9604             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
9605                           plus_constant (stack_pointer_rtx, offset)));
9606         }
9607     }
9608
9609   mips_emit_loadgp ();
9610
9611   /* Initialize the $gp save slot.  */
9612   if (frame->cprestore_size > 0
9613       && cfun->machine->global_pointer != INVALID_REGNUM)
9614     {
9615       if (TARGET_MIPS16)
9616         mips_emit_move (mips_cprestore_slot (MIPS_PROLOGUE_TEMP (Pmode)),
9617                         MIPS16_PIC_TEMP);
9618       else if (TARGET_ABICALLS_PIC2)
9619         emit_insn (gen_cprestore (GEN_INT (frame->args_size)));
9620       else
9621         emit_move_insn (mips_cprestore_slot (MIPS_PROLOGUE_TEMP (Pmode)),
9622                         pic_offset_table_rtx);
9623     }
9624
9625   /* We need to search back to the last use of K0 or K1.  */
9626   if (cfun->machine->interrupt_handler_p)
9627     {
9628       for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
9629         if (INSN_P (insn)
9630             && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
9631           break;
9632       /* Emit a move from K1 to COP0 Status after insn.  */
9633       gcc_assert (insn != NULL_RTX);
9634       emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
9635                                       gen_rtx_REG (SImode, K1_REG_NUM)),
9636                        insn);
9637     }
9638
9639   /* If we are profiling, make sure no instructions are scheduled before
9640      the call to mcount.  */
9641   if (crtl->profile)
9642     emit_insn (gen_blockage ());
9643 }
9644 \f
9645 /* Emit instructions to restore register REG from slot MEM.  */
9646
9647 static void
9648 mips_restore_reg (rtx reg, rtx mem)
9649 {
9650   /* There's no MIPS16 instruction to load $31 directly.  Load into
9651      $7 instead and adjust the return insn appropriately.  */
9652   if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
9653     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
9654
9655   if (REGNO (reg) == HI_REGNUM)
9656     {
9657       mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
9658       if (TARGET_64BIT)
9659         emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
9660                                   MIPS_EPILOGUE_TEMP (DImode),
9661                                   gen_rtx_REG (DImode, LO_REGNUM)));
9662       else
9663         emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
9664                                   MIPS_EPILOGUE_TEMP (SImode),
9665                                   gen_rtx_REG (SImode, LO_REGNUM)));
9666     }
9667   else if ((TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
9668            || ACC_REG_P (REGNO (reg)))
9669     {
9670       /* Can't restore directly; move through a temporary.  */
9671       mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
9672       mips_emit_move (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
9673     }
9674   else
9675     mips_emit_move (reg, mem);
9676 }
9677
9678 /* Emit any instructions needed before a return.  */
9679
9680 void
9681 mips_expand_before_return (void)
9682 {
9683   /* When using a call-clobbered gp, we start out with unified call
9684      insns that include instructions to restore the gp.  We then split
9685      these unified calls after reload.  These split calls explicitly
9686      clobber gp, so there is no need to define
9687      PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
9688
9689      For consistency, we should also insert an explicit clobber of $28
9690      before return insns, so that the post-reload optimizers know that
9691      the register is not live on exit.  */
9692   if (TARGET_CALL_CLOBBERED_GP)
9693     emit_clobber (pic_offset_table_rtx);
9694 }
9695
9696 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
9697    says which.  */
9698
9699 void
9700 mips_expand_epilogue (bool sibcall_p)
9701 {
9702   const struct mips_frame_info *frame;
9703   HOST_WIDE_INT step1, step2;
9704   rtx base, target, insn;
9705
9706   if (!sibcall_p && mips_can_use_return_insn ())
9707     {
9708       emit_jump_insn (gen_return ());
9709       return;
9710     }
9711
9712   /* In MIPS16 mode, if the return value should go into a floating-point
9713      register, we need to call a helper routine to copy it over.  */
9714   if (mips16_cfun_returns_in_fpr_p ())
9715     mips16_copy_fpr_return_value ();
9716
9717   /* Split the frame into two.  STEP1 is the amount of stack we should
9718      deallocate before restoring the registers.  STEP2 is the amount we
9719      should deallocate afterwards.
9720
9721      Start off by assuming that no registers need to be restored.  */
9722   frame = &cfun->machine->frame;
9723   step1 = frame->total_size;
9724   step2 = 0;
9725
9726   /* Work out which register holds the frame address.  */
9727   if (!frame_pointer_needed)
9728     base = stack_pointer_rtx;
9729   else
9730     {
9731       base = hard_frame_pointer_rtx;
9732       step1 -= frame->hard_frame_pointer_offset;
9733     }
9734
9735   /* If we need to restore registers, deallocate as much stack as
9736      possible in the second step without going out of range.  */
9737   if ((frame->mask | frame->fmask | frame->acc_mask) != 0
9738       || frame->num_cop0_regs > 0)
9739     {
9740       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
9741       step1 -= step2;
9742     }
9743
9744   /* Set TARGET to BASE + STEP1.  */
9745   target = base;
9746   if (step1 > 0)
9747     {
9748       rtx adjust;
9749
9750       /* Get an rtx for STEP1 that we can add to BASE.  */
9751       adjust = GEN_INT (step1);
9752       if (!SMALL_OPERAND (step1))
9753         {
9754           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
9755           adjust = MIPS_EPILOGUE_TEMP (Pmode);
9756         }
9757
9758       /* Normal mode code can copy the result straight into $sp.  */
9759       if (!TARGET_MIPS16)
9760         target = stack_pointer_rtx;
9761
9762       emit_insn (gen_add3_insn (target, base, adjust));
9763     }
9764
9765   /* Copy TARGET into the stack pointer.  */
9766   if (target != stack_pointer_rtx)
9767     mips_emit_move (stack_pointer_rtx, target);
9768
9769   /* If we're using addressing macros, $gp is implicitly used by all
9770      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
9771      from the stack.  */
9772   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
9773     emit_insn (gen_blockage ());
9774
9775   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
9776     {
9777       unsigned int regno, mask;
9778       HOST_WIDE_INT offset;
9779       rtx restore;
9780
9781       /* Generate the restore instruction.  */
9782       mask = frame->mask;
9783       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
9784
9785       /* Restore any other registers manually.  */
9786       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
9787         if (BITSET_P (mask, regno - GP_REG_FIRST))
9788           {
9789             offset -= UNITS_PER_WORD;
9790             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
9791           }
9792
9793       /* Restore the remaining registers and deallocate the final bit
9794          of the frame.  */
9795       emit_insn (restore);
9796     }
9797   else
9798     {
9799       /* Restore the registers.  */
9800       mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
9801       mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
9802                                        mips_restore_reg);
9803
9804       if (cfun->machine->interrupt_handler_p)
9805         {
9806           HOST_WIDE_INT offset;
9807           rtx mem;
9808
9809           offset = frame->cop0_sp_offset - (frame->total_size - step2);
9810           if (!cfun->machine->keep_interrupts_masked_p)
9811             {
9812               /* Restore the original EPC.  */
9813               mem = gen_frame_mem (word_mode,
9814                                    plus_constant (stack_pointer_rtx, offset));
9815               mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
9816               offset -= UNITS_PER_WORD;
9817
9818               /* Move to COP0 EPC.  */
9819               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
9820                                         gen_rtx_REG (SImode, K0_REG_NUM)));
9821             }
9822
9823           /* Restore the original Status.  */
9824           mem = gen_frame_mem (word_mode,
9825                                plus_constant (stack_pointer_rtx, offset));
9826           mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
9827           offset -= UNITS_PER_WORD;
9828
9829           /* If we don't use shoadow register set, we need to update SP.  */
9830           if (!cfun->machine->use_shadow_register_set_p && step2 > 0)
9831             emit_insn (gen_add3_insn (stack_pointer_rtx,
9832                                       stack_pointer_rtx,
9833                                       GEN_INT (step2)));
9834
9835           /* Move to COP0 Status.  */
9836           emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
9837                                     gen_rtx_REG (SImode, K0_REG_NUM)));
9838         }
9839       else
9840         {
9841           /* Deallocate the final bit of the frame.  */
9842           if (step2 > 0)
9843             emit_insn (gen_add3_insn (stack_pointer_rtx,
9844                                       stack_pointer_rtx,
9845                                       GEN_INT (step2)));
9846         }
9847     }
9848
9849   /* Add in the __builtin_eh_return stack adjustment.  We need to
9850      use a temporary in MIPS16 code.  */
9851   if (crtl->calls_eh_return)
9852     {
9853       if (TARGET_MIPS16)
9854         {
9855           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
9856           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
9857                                     MIPS_EPILOGUE_TEMP (Pmode),
9858                                     EH_RETURN_STACKADJ_RTX));
9859           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
9860         }
9861       else
9862         emit_insn (gen_add3_insn (stack_pointer_rtx,
9863                                   stack_pointer_rtx,
9864                                   EH_RETURN_STACKADJ_RTX));
9865     }
9866
9867   if (!sibcall_p)
9868     {
9869       mips_expand_before_return ();
9870       if (cfun->machine->interrupt_handler_p)
9871         {
9872           /* Interrupt handlers generate eret or deret.  */
9873           if (cfun->machine->use_debug_exception_return_p)
9874             emit_jump_insn (gen_mips_deret ());
9875           else
9876             emit_jump_insn (gen_mips_eret ());
9877         }
9878       else
9879         {
9880           unsigned int regno;
9881
9882           /* When generating MIPS16 code, the normal
9883              mips_for_each_saved_gpr_and_fpr path will restore the return
9884              address into $7 rather than $31.  */
9885           if (TARGET_MIPS16
9886               && !GENERATE_MIPS16E_SAVE_RESTORE
9887               && BITSET_P (frame->mask, 31))
9888             regno = GP_REG_FIRST + 7;
9889           else
9890             regno = GP_REG_FIRST + 31;
9891           emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
9892         }
9893     }
9894
9895   /* Search from the beginning to the first use of K0 or K1.  */
9896   if (cfun->machine->interrupt_handler_p
9897       && !cfun->machine->keep_interrupts_masked_p)
9898     {
9899       for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
9900         if (INSN_P (insn)
9901             && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
9902           break;
9903       gcc_assert (insn != NULL_RTX);
9904       /* Insert disable interrupts before the first use of K0 or K1.  */
9905       emit_insn_before (gen_mips_di (), insn);
9906       emit_insn_before (gen_mips_ehb (), insn);
9907     }
9908 }
9909 \f
9910 /* Return nonzero if this function is known to have a null epilogue.
9911    This allows the optimizer to omit jumps to jumps if no stack
9912    was created.  */
9913
9914 bool
9915 mips_can_use_return_insn (void)
9916 {
9917   /* Interrupt handlers need to go through the epilogue.  */
9918   if (cfun->machine->interrupt_handler_p)
9919     return false;
9920
9921   if (!reload_completed)
9922     return false;
9923
9924   if (crtl->profile)
9925     return false;
9926
9927   /* In MIPS16 mode, a function that returns a floating-point value
9928      needs to arrange to copy the return value into the floating-point
9929      registers.  */
9930   if (mips16_cfun_returns_in_fpr_p ())
9931     return false;
9932
9933   return cfun->machine->frame.total_size == 0;
9934 }
9935 \f
9936 /* Return true if register REGNO can store a value of mode MODE.
9937    The result of this function is cached in mips_hard_regno_mode_ok.  */
9938
9939 static bool
9940 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
9941 {
9942   unsigned int size;
9943   enum mode_class mclass;
9944
9945   if (mode == CCV2mode)
9946     return (ISA_HAS_8CC
9947             && ST_REG_P (regno)
9948             && (regno - ST_REG_FIRST) % 2 == 0);
9949
9950   if (mode == CCV4mode)
9951     return (ISA_HAS_8CC
9952             && ST_REG_P (regno)
9953             && (regno - ST_REG_FIRST) % 4 == 0);
9954
9955   if (mode == CCmode)
9956     {
9957       if (!ISA_HAS_8CC)
9958         return regno == FPSW_REGNUM;
9959
9960       return (ST_REG_P (regno)
9961               || GP_REG_P (regno)
9962               || FP_REG_P (regno));
9963     }
9964
9965   size = GET_MODE_SIZE (mode);
9966   mclass = GET_MODE_CLASS (mode);
9967
9968   if (GP_REG_P (regno))
9969     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
9970
9971   if (FP_REG_P (regno)
9972       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
9973           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
9974     {
9975       /* Allow TFmode for CCmode reloads.  */
9976       if (mode == TFmode && ISA_HAS_8CC)
9977         return true;
9978
9979       /* Allow 64-bit vector modes for Loongson-2E/2F.  */
9980       if (TARGET_LOONGSON_VECTORS
9981           && (mode == V2SImode
9982               || mode == V4HImode
9983               || mode == V8QImode
9984               || mode == DImode))
9985         return true;
9986
9987       if (mclass == MODE_FLOAT
9988           || mclass == MODE_COMPLEX_FLOAT
9989           || mclass == MODE_VECTOR_FLOAT)
9990         return size <= UNITS_PER_FPVALUE;
9991
9992       /* Allow integer modes that fit into a single register.  We need
9993          to put integers into FPRs when using instructions like CVT
9994          and TRUNC.  There's no point allowing sizes smaller than a word,
9995          because the FPU has no appropriate load/store instructions.  */
9996       if (mclass == MODE_INT)
9997         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
9998     }
9999
10000   if (ACC_REG_P (regno)
10001       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
10002     {
10003       if (MD_REG_P (regno))
10004         {
10005           /* After a multiplication or division, clobbering HI makes
10006              the value of LO unpredictable, and vice versa.  This means
10007              that, for all interesting cases, HI and LO are effectively
10008              a single register.
10009
10010              We model this by requiring that any value that uses HI
10011              also uses LO.  */
10012           if (size <= UNITS_PER_WORD * 2)
10013             return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
10014         }
10015       else
10016         {
10017           /* DSP accumulators do not have the same restrictions as
10018              HI and LO, so we can treat them as normal doubleword
10019              registers.  */
10020           if (size <= UNITS_PER_WORD)
10021             return true;
10022
10023           if (size <= UNITS_PER_WORD * 2
10024               && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
10025             return true;
10026         }
10027     }
10028
10029   if (ALL_COP_REG_P (regno))
10030     return mclass == MODE_INT && size <= UNITS_PER_WORD;
10031
10032   if (regno == GOT_VERSION_REGNUM)
10033     return mode == SImode;
10034
10035   return false;
10036 }
10037
10038 /* Implement HARD_REGNO_NREGS.  */
10039
10040 unsigned int
10041 mips_hard_regno_nregs (int regno, enum machine_mode mode)
10042 {
10043   if (ST_REG_P (regno))
10044     /* The size of FP status registers is always 4, because they only hold
10045        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
10046     return (GET_MODE_SIZE (mode) + 3) / 4;
10047
10048   if (FP_REG_P (regno))
10049     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
10050
10051   /* All other registers are word-sized.  */
10052   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
10053 }
10054
10055 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
10056    in mips_hard_regno_nregs.  */
10057
10058 int
10059 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
10060 {
10061   int size;
10062   HARD_REG_SET left;
10063
10064   size = 0x8000;
10065   COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
10066   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
10067     {
10068       size = MIN (size, 4);
10069       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
10070     }
10071   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
10072     {
10073       size = MIN (size, UNITS_PER_FPREG);
10074       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
10075     }
10076   if (!hard_reg_set_empty_p (left))
10077     size = MIN (size, UNITS_PER_WORD);
10078   return (GET_MODE_SIZE (mode) + size - 1) / size;
10079 }
10080
10081 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
10082
10083 bool
10084 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
10085                                enum machine_mode to ATTRIBUTE_UNUSED,
10086                                enum reg_class rclass)
10087 {
10088   /* There are several problems with changing the modes of values
10089      in floating-point registers:
10090
10091      - When a multi-word value is stored in paired floating-point
10092        registers, the first register always holds the low word.
10093        We therefore can't allow FPRs to change between single-word
10094        and multi-word modes on big-endian targets.
10095
10096      - GCC assumes that each word of a multiword register can be accessed
10097        individually using SUBREGs.  This is not true for floating-point
10098        registers if they are bigger than a word.
10099
10100      - Loading a 32-bit value into a 64-bit floating-point register
10101        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
10102        We can't allow FPRs to change from SImode to to a wider mode on
10103        64-bit targets.
10104
10105      - If the FPU has already interpreted a value in one format, we must
10106        not ask it to treat the value as having a different format.
10107
10108      We therefore disallow all mode changes involving FPRs.  */
10109   return reg_classes_intersect_p (FP_REGS, rclass);
10110 }
10111
10112 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
10113
10114 static bool
10115 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
10116 {
10117   switch (mode)
10118     {
10119     case SFmode:
10120       return TARGET_HARD_FLOAT;
10121
10122     case DFmode:
10123       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
10124
10125     case V2SFmode:
10126       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
10127
10128     default:
10129       return false;
10130     }
10131 }
10132
10133 /* Implement MODES_TIEABLE_P.  */
10134
10135 bool
10136 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
10137 {
10138   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
10139      prefer to put one of them in FPRs.  */
10140   return (mode1 == mode2
10141           || (!mips_mode_ok_for_mov_fmt_p (mode1)
10142               && !mips_mode_ok_for_mov_fmt_p (mode2)));
10143 }
10144
10145 /* Implement PREFERRED_RELOAD_CLASS.  */
10146
10147 enum reg_class
10148 mips_preferred_reload_class (rtx x, enum reg_class rclass)
10149 {
10150   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
10151     return LEA_REGS;
10152
10153   if (reg_class_subset_p (FP_REGS, rclass)
10154       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
10155     return FP_REGS;
10156
10157   if (reg_class_subset_p (GR_REGS, rclass))
10158     rclass = GR_REGS;
10159
10160   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
10161     rclass = M16_REGS;
10162
10163   return rclass;
10164 }
10165
10166 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
10167    Return a "canonical" class to represent it in later calculations.  */
10168
10169 static enum reg_class
10170 mips_canonicalize_move_class (enum reg_class rclass)
10171 {
10172   /* All moves involving accumulator registers have the same cost.  */
10173   if (reg_class_subset_p (rclass, ACC_REGS))
10174     rclass = ACC_REGS;
10175
10176   /* Likewise promote subclasses of general registers to the most
10177      interesting containing class.  */
10178   if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
10179     rclass = M16_REGS;
10180   else if (reg_class_subset_p (rclass, GENERAL_REGS))
10181     rclass = GENERAL_REGS;
10182
10183   return rclass;
10184 }
10185
10186 /* Return the cost of moving a value of mode MODE from a register of
10187    class FROM to a GPR.  Return 0 for classes that are unions of other
10188    classes handled by this function.  */
10189
10190 static int
10191 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10192                        enum reg_class from)
10193 {
10194   switch (from)
10195     {
10196     case GENERAL_REGS:
10197       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10198       return 2;
10199
10200     case ACC_REGS:
10201       /* MFLO and MFHI.  */
10202       return 6;
10203
10204     case FP_REGS:
10205       /* MFC1, etc.  */
10206       return 4;
10207
10208     case ST_REGS:
10209       /* LUI followed by MOVF.  */
10210       return 4;
10211
10212     case COP0_REGS:
10213     case COP2_REGS:
10214     case COP3_REGS:
10215       /* This choice of value is historical.  */
10216       return 5;
10217
10218     default:
10219       return 0;
10220     }
10221 }
10222
10223 /* Return the cost of moving a value of mode MODE from a GPR to a
10224    register of class TO.  Return 0 for classes that are unions of
10225    other classes handled by this function.  */
10226
10227 static int
10228 mips_move_from_gpr_cost (enum machine_mode mode, enum reg_class to)
10229 {
10230   switch (to)
10231     {
10232     case GENERAL_REGS:
10233       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10234       return 2;
10235
10236     case ACC_REGS:
10237       /* MTLO and MTHI.  */
10238       return 6;
10239
10240     case FP_REGS:
10241       /* MTC1, etc.  */
10242       return 4;
10243
10244     case ST_REGS:
10245       /* A secondary reload through an FPR scratch.  */
10246       return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
10247               + mips_register_move_cost (mode, FP_REGS, ST_REGS));
10248
10249     case COP0_REGS:
10250     case COP2_REGS:
10251     case COP3_REGS:
10252       /* This choice of value is historical.  */
10253       return 5;
10254
10255     default:
10256       return 0;
10257     }
10258 }
10259
10260 /* Implement REGISTER_MOVE_COST.  Return 0 for classes that are the
10261    maximum of the move costs for subclasses; regclass will work out
10262    the maximum for us.  */
10263
10264 int
10265 mips_register_move_cost (enum machine_mode mode,
10266                          enum reg_class from, enum reg_class to)
10267 {
10268   enum reg_class dregs;
10269   int cost1, cost2;
10270
10271   from = mips_canonicalize_move_class (from);
10272   to = mips_canonicalize_move_class (to);
10273
10274   /* Handle moves that can be done without using general-purpose registers.  */
10275   if (from == FP_REGS)
10276     {
10277       if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
10278         /* MOV.FMT.  */
10279         return 4;
10280       if (to == ST_REGS)
10281         /* The sequence generated by mips_expand_fcc_reload.  */
10282         return 8;
10283     }
10284
10285   /* Handle cases in which only one class deviates from the ideal.  */
10286   dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
10287   if (from == dregs)
10288     return mips_move_from_gpr_cost (mode, to);
10289   if (to == dregs)
10290     return mips_move_to_gpr_cost (mode, from);
10291
10292   /* Handles cases that require a GPR temporary.  */
10293   cost1 = mips_move_to_gpr_cost (mode, from);
10294   if (cost1 != 0)
10295     {
10296       cost2 = mips_move_from_gpr_cost (mode, to);
10297       if (cost2 != 0)
10298         return cost1 + cost2;
10299     }
10300
10301   return 0;
10302 }
10303
10304 /* Implement TARGET_IRA_COVER_CLASSES.  */
10305
10306 static const enum reg_class *
10307 mips_ira_cover_classes (void)
10308 {
10309   static const enum reg_class acc_classes[] = {
10310     GR_AND_ACC_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10311     ST_REGS, LIM_REG_CLASSES
10312   };
10313   static const enum reg_class no_acc_classes[] = {
10314     GR_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10315     ST_REGS, LIM_REG_CLASSES
10316   };
10317
10318   /* Don't allow the register allocators to use LO and HI in MIPS16 mode,
10319      which has no MTLO or MTHI instructions.  Also, using GR_AND_ACC_REGS
10320      as a cover class only works well when we keep per-register costs.
10321      Using it when not optimizing can cause us to think accumulators
10322      have the same cost as GPRs in cases where GPRs are actually much
10323      cheaper.  */
10324   return TARGET_MIPS16 || !optimize ? no_acc_classes : acc_classes;
10325 }
10326
10327 /* Return the register class required for a secondary register when
10328    copying between one of the registers in RCLASS and value X, which
10329    has mode MODE.  X is the source of the move if IN_P, otherwise it
10330    is the destination.  Return NO_REGS if no secondary register is
10331    needed.  */
10332
10333 enum reg_class
10334 mips_secondary_reload_class (enum reg_class rclass,
10335                              enum machine_mode mode, rtx x, bool in_p)
10336 {
10337   int regno;
10338
10339   /* If X is a constant that cannot be loaded into $25, it must be loaded
10340      into some other GPR.  No other register class allows a direct move.  */
10341   if (mips_dangerous_for_la25_p (x))
10342     return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
10343
10344   regno = true_regnum (x);
10345   if (TARGET_MIPS16)
10346     {
10347       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
10348       if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
10349         return M16_REGS;
10350
10351       return NO_REGS;
10352     }
10353
10354   /* Copying from accumulator registers to anywhere other than a general
10355      register requires a temporary general register.  */
10356   if (reg_class_subset_p (rclass, ACC_REGS))
10357     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10358   if (ACC_REG_P (regno))
10359     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10360
10361   /* We can only copy a value to a condition code register from a
10362      floating-point register, and even then we require a scratch
10363      floating-point register.  We can only copy a value out of a
10364      condition-code register into a general register.  */
10365   if (reg_class_subset_p (rclass, ST_REGS))
10366     {
10367       if (in_p)
10368         return FP_REGS;
10369       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10370     }
10371   if (ST_REG_P (regno))
10372     {
10373       if (!in_p)
10374         return FP_REGS;
10375       return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10376     }
10377
10378   if (reg_class_subset_p (rclass, FP_REGS))
10379     {
10380       if (MEM_P (x)
10381           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
10382         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
10383            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
10384         return NO_REGS;
10385
10386       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
10387         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
10388         return NO_REGS;
10389
10390       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
10391         /* We can force the constant to memory and use lwc1
10392            and ldc1.  As above, we will use pairs of lwc1s if
10393            ldc1 is not supported.  */
10394         return NO_REGS;
10395
10396       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
10397         /* In this case we can use mov.fmt.  */
10398         return NO_REGS;
10399
10400       /* Otherwise, we need to reload through an integer register.  */
10401       return GR_REGS;
10402     }
10403   if (FP_REG_P (regno))
10404     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10405
10406   return NO_REGS;
10407 }
10408
10409 /* Implement TARGET_MODE_REP_EXTENDED.  */
10410
10411 static int
10412 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
10413 {
10414   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
10415   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
10416     return SIGN_EXTEND;
10417
10418   return UNKNOWN;
10419 }
10420 \f
10421 /* Implement TARGET_VALID_POINTER_MODE.  */
10422
10423 static bool
10424 mips_valid_pointer_mode (enum machine_mode mode)
10425 {
10426   return mode == SImode || (TARGET_64BIT && mode == DImode);
10427 }
10428
10429 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
10430
10431 static bool
10432 mips_vector_mode_supported_p (enum machine_mode mode)
10433 {
10434   switch (mode)
10435     {
10436     case V2SFmode:
10437       return TARGET_PAIRED_SINGLE_FLOAT;
10438
10439     case V2HImode:
10440     case V4QImode:
10441     case V2HQmode:
10442     case V2UHQmode:
10443     case V2HAmode:
10444     case V2UHAmode:
10445     case V4QQmode:
10446     case V4UQQmode:
10447       return TARGET_DSP;
10448
10449     case V2SImode:
10450     case V4HImode:
10451     case V8QImode:
10452       return TARGET_LOONGSON_VECTORS;
10453
10454     default:
10455       return false;
10456     }
10457 }
10458
10459 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
10460
10461 static bool
10462 mips_scalar_mode_supported_p (enum machine_mode mode)
10463 {
10464   if (ALL_FIXED_POINT_MODE_P (mode)
10465       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
10466     return true;
10467
10468   return default_scalar_mode_supported_p (mode);
10469 }
10470 \f
10471 /* Implement TARGET_INIT_LIBFUNCS.  */
10472
10473 #include "config/gofast.h"
10474
10475 static void
10476 mips_init_libfuncs (void)
10477 {
10478   if (TARGET_FIX_VR4120)
10479     {
10480       /* Register the special divsi3 and modsi3 functions needed to work
10481          around VR4120 division errata.  */
10482       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
10483       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
10484     }
10485
10486   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
10487     {
10488       /* Register the MIPS16 -mhard-float stubs.  */
10489       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
10490       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
10491       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
10492       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
10493
10494       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
10495       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
10496       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
10497       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
10498       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
10499       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
10500       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
10501
10502       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
10503       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
10504       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
10505
10506       if (TARGET_DOUBLE_FLOAT)
10507         {
10508           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
10509           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
10510           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
10511           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
10512
10513           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
10514           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
10515           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
10516           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
10517           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
10518           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
10519           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
10520
10521           set_conv_libfunc (sext_optab, DFmode, SFmode,
10522                             "__mips16_extendsfdf2");
10523           set_conv_libfunc (trunc_optab, SFmode, DFmode,
10524                             "__mips16_truncdfsf2");
10525           set_conv_libfunc (sfix_optab, SImode, DFmode,
10526                             "__mips16_fix_truncdfsi");
10527           set_conv_libfunc (sfloat_optab, DFmode, SImode,
10528                             "__mips16_floatsidf");
10529           set_conv_libfunc (ufloat_optab, DFmode, SImode,
10530                             "__mips16_floatunsidf");
10531         }
10532     }
10533   else
10534     /* Register the gofast functions if selected using --enable-gofast.  */
10535     gofast_maybe_init_libfuncs ();
10536
10537   /* The MIPS16 ISA does not have an encoding for "sync", so we rely
10538      on an external non-MIPS16 routine to implement __sync_synchronize.  */
10539   if (TARGET_MIPS16)
10540     synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
10541 }
10542
10543 /* Return the length of INSN.  LENGTH is the initial length computed by
10544    attributes in the machine-description file.  */
10545
10546 int
10547 mips_adjust_insn_length (rtx insn, int length)
10548 {
10549   /* A unconditional jump has an unfilled delay slot if it is not part
10550      of a sequence.  A conditional jump normally has a delay slot, but
10551      does not on MIPS16.  */
10552   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
10553     length += 4;
10554
10555   /* See how many nops might be needed to avoid hardware hazards.  */
10556   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
10557     switch (get_attr_hazard (insn))
10558       {
10559       case HAZARD_NONE:
10560         break;
10561
10562       case HAZARD_DELAY:
10563         length += 4;
10564         break;
10565
10566       case HAZARD_HILO:
10567         length += 8;
10568         break;
10569       }
10570
10571   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
10572      the .md file length attributes are 4-based for both modes.
10573      Adjust the MIPS16 ones here.  */
10574   if (TARGET_MIPS16)
10575     length /= 2;
10576
10577   return length;
10578 }
10579
10580 /* Return an asm sequence to start a noat block and load the address
10581    of a label into $1.  */
10582
10583 const char *
10584 mips_output_load_label (void)
10585 {
10586   if (TARGET_EXPLICIT_RELOCS)
10587     switch (mips_abi)
10588       {
10589       case ABI_N32:
10590         return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
10591
10592       case ABI_64:
10593         return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
10594
10595       default:
10596         if (ISA_HAS_LOAD_DELAY)
10597           return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
10598         return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
10599       }
10600   else
10601     {
10602       if (Pmode == DImode)
10603         return "%[dla\t%@,%0";
10604       else
10605         return "%[la\t%@,%0";
10606     }
10607 }
10608
10609 /* Return the assembly code for INSN, which has the operands given by
10610    OPERANDS, and which branches to OPERANDS[1] if some condition is true.
10611    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[1]
10612    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
10613    version of BRANCH_IF_TRUE.  */
10614
10615 const char *
10616 mips_output_conditional_branch (rtx insn, rtx *operands,
10617                                 const char *branch_if_true,
10618                                 const char *branch_if_false)
10619 {
10620   unsigned int length;
10621   rtx taken, not_taken;
10622
10623   gcc_assert (LABEL_P (operands[1]));  
10624
10625   length = get_attr_length (insn);
10626   if (length <= 8)
10627     {
10628       /* Just a simple conditional branch.  */
10629       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
10630       return branch_if_true;
10631     }
10632
10633   /* Generate a reversed branch around a direct jump.  This fallback does
10634      not use branch-likely instructions.  */
10635   mips_branch_likely = false;
10636   not_taken = gen_label_rtx ();
10637   taken = operands[1];
10638
10639   /* Generate the reversed branch to NOT_TAKEN.  */
10640   operands[1] = not_taken;
10641   output_asm_insn (branch_if_false, operands);
10642
10643   /* If INSN has a delay slot, we must provide delay slots for both the
10644      branch to NOT_TAKEN and the conditional jump.  We must also ensure
10645      that INSN's delay slot is executed in the appropriate cases.  */
10646   if (final_sequence)
10647     {
10648       /* This first delay slot will always be executed, so use INSN's
10649          delay slot if is not annulled.  */
10650       if (!INSN_ANNULLED_BRANCH_P (insn))
10651         {
10652           final_scan_insn (XVECEXP (final_sequence, 0, 1),
10653                            asm_out_file, optimize, 1, NULL);
10654           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
10655         }
10656       else
10657         output_asm_insn ("nop", 0);
10658       fprintf (asm_out_file, "\n");
10659     }
10660
10661   /* Output the unconditional branch to TAKEN.  */
10662   if (length <= 16)
10663     output_asm_insn ("j\t%0%/", &taken);
10664   else
10665     {
10666       output_asm_insn (mips_output_load_label (), &taken);
10667       output_asm_insn ("jr\t%@%]%/", 0);
10668     }
10669
10670   /* Now deal with its delay slot; see above.  */
10671   if (final_sequence)
10672     {
10673       /* This delay slot will only be executed if the branch is taken.
10674          Use INSN's delay slot if is annulled.  */
10675       if (INSN_ANNULLED_BRANCH_P (insn))
10676         {
10677           final_scan_insn (XVECEXP (final_sequence, 0, 1),
10678                            asm_out_file, optimize, 1, NULL);
10679           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
10680         }
10681       else
10682         output_asm_insn ("nop", 0);
10683       fprintf (asm_out_file, "\n");
10684     }
10685
10686   /* Output NOT_TAKEN.  */
10687   targetm.asm_out.internal_label (asm_out_file, "L",
10688                                   CODE_LABEL_NUMBER (not_taken));
10689   return "";
10690 }
10691
10692 /* Return the assembly code for INSN, which branches to OPERANDS[1]
10693    if some ordering condition is true.  The condition is given by
10694    OPERANDS[0] if !INVERTED_P, otherwise it is the inverse of
10695    OPERANDS[0].  OPERANDS[2] is the comparison's first operand;
10696    its second is always zero.  */
10697
10698 const char *
10699 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
10700 {
10701   const char *branch[2];
10702
10703   /* Make BRANCH[1] branch to OPERANDS[1] when the condition is true.
10704      Make BRANCH[0] branch on the inverse condition.  */
10705   switch (GET_CODE (operands[0]))
10706     {
10707       /* These cases are equivalent to comparisons against zero.  */
10708     case LEU:
10709       inverted_p = !inverted_p;
10710       /* Fall through.  */
10711     case GTU:
10712       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%1");
10713       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%1");
10714       break;
10715
10716       /* These cases are always true or always false.  */
10717     case LTU:
10718       inverted_p = !inverted_p;
10719       /* Fall through.  */
10720     case GEU:
10721       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%1");
10722       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%1");
10723       break;
10724
10725     default:
10726       branch[!inverted_p] = MIPS_BRANCH ("b%C0z", "%2,%1");
10727       branch[inverted_p] = MIPS_BRANCH ("b%N0z", "%2,%1");
10728       break;
10729     }
10730   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
10731 }
10732 \f
10733 /* Return the assembly code for __sync_*() loop LOOP.  The loop should support
10734    both normal and likely branches, using %? and %~ where appropriate.  */
10735
10736 const char *
10737 mips_output_sync_loop (const char *loop)
10738 {
10739   /* Use branch-likely instructions to work around the LL/SC R10000 errata.  */
10740   mips_branch_likely = TARGET_FIX_R10000;
10741   return loop;
10742 }
10743 \f
10744 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
10745    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
10746
10747    When working around R4000 and R4400 errata, we need to make sure that
10748    the division is not immediately followed by a shift[1][2].  We also
10749    need to stop the division from being put into a branch delay slot[3].
10750    The easiest way to avoid both problems is to add a nop after the
10751    division.  When a divide-by-zero check is needed, this nop can be
10752    used to fill the branch delay slot.
10753
10754    [1] If a double-word or a variable shift executes immediately
10755        after starting an integer division, the shift may give an
10756        incorrect result.  See quotations of errata #16 and #28 from
10757        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
10758        in mips.md for details.
10759
10760    [2] A similar bug to [1] exists for all revisions of the
10761        R4000 and the R4400 when run in an MC configuration.
10762        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
10763
10764        "19. In this following sequence:
10765
10766                     ddiv                (or ddivu or div or divu)
10767                     dsll32              (or dsrl32, dsra32)
10768
10769             if an MPT stall occurs, while the divide is slipping the cpu
10770             pipeline, then the following double shift would end up with an
10771             incorrect result.
10772
10773             Workaround: The compiler needs to avoid generating any
10774             sequence with divide followed by extended double shift."
10775
10776        This erratum is also present in "MIPS R4400MC Errata, Processor
10777        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
10778        & 3.0" as errata #10 and #4, respectively.
10779
10780    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
10781        (also valid for MIPS R4000MC processors):
10782
10783        "52. R4000SC: This bug does not apply for the R4000PC.
10784
10785             There are two flavors of this bug:
10786
10787             1) If the instruction just after divide takes an RF exception
10788                (tlb-refill, tlb-invalid) and gets an instruction cache
10789                miss (both primary and secondary) and the line which is
10790                currently in secondary cache at this index had the first
10791                data word, where the bits 5..2 are set, then R4000 would
10792                get a wrong result for the div.
10793
10794             ##1
10795                     nop
10796                     div r8, r9
10797                     -------------------         # end-of page. -tlb-refill
10798                     nop
10799             ##2
10800                     nop
10801                     div r8, r9
10802                     -------------------         # end-of page. -tlb-invalid
10803                     nop
10804
10805             2) If the divide is in the taken branch delay slot, where the
10806                target takes RF exception and gets an I-cache miss for the
10807                exception vector or where I-cache miss occurs for the
10808                target address, under the above mentioned scenarios, the
10809                div would get wrong results.
10810
10811             ##1
10812                     j   r2              # to next page mapped or unmapped
10813                     div r8,r9           # this bug would be there as long
10814                                         # as there is an ICache miss and
10815                     nop                 # the "data pattern" is present
10816
10817             ##2
10818                     beq r0, r0, NextPage        # to Next page
10819                     div r8,r9
10820                     nop
10821
10822             This bug is present for div, divu, ddiv, and ddivu
10823             instructions.
10824
10825             Workaround: For item 1), OS could make sure that the next page
10826             after the divide instruction is also mapped.  For item 2), the
10827             compiler could make sure that the divide instruction is not in
10828             the branch delay slot."
10829
10830        These processors have PRId values of 0x00004220 and 0x00004300 for
10831        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
10832
10833 const char *
10834 mips_output_division (const char *division, rtx *operands)
10835 {
10836   const char *s;
10837
10838   s = division;
10839   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
10840     {
10841       output_asm_insn (s, operands);
10842       s = "nop";
10843     }
10844   if (TARGET_CHECK_ZERO_DIV)
10845     {
10846       if (TARGET_MIPS16)
10847         {
10848           output_asm_insn (s, operands);
10849           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
10850         }
10851       else if (GENERATE_DIVIDE_TRAPS)
10852         {
10853           output_asm_insn (s, operands);
10854           s = "teq\t%2,%.,7";
10855         }
10856       else
10857         {
10858           output_asm_insn ("%(bne\t%2,%.,1f", operands);
10859           output_asm_insn (s, operands);
10860           s = "break\t7%)\n1:";
10861         }
10862     }
10863   return s;
10864 }
10865 \f
10866 /* Return true if IN_INSN is a multiply-add or multiply-subtract
10867    instruction and if OUT_INSN assigns to the accumulator operand.  */
10868
10869 bool
10870 mips_linked_madd_p (rtx out_insn, rtx in_insn)
10871 {
10872   rtx x;
10873
10874   x = single_set (in_insn);
10875   if (x == 0)
10876     return false;
10877
10878   x = SET_SRC (x);
10879
10880   if (GET_CODE (x) == PLUS
10881       && GET_CODE (XEXP (x, 0)) == MULT
10882       && reg_set_p (XEXP (x, 1), out_insn))
10883     return true;
10884
10885   if (GET_CODE (x) == MINUS
10886       && GET_CODE (XEXP (x, 1)) == MULT
10887       && reg_set_p (XEXP (x, 0), out_insn))
10888     return true;
10889
10890   return false;
10891 }
10892
10893 /* True if the dependency between OUT_INSN and IN_INSN is on the store
10894    data rather than the address.  We need this because the cprestore
10895    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
10896    which causes the default routine to abort.  We just return false
10897    for that case.  */
10898
10899 bool
10900 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
10901 {
10902   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
10903     return false;
10904
10905   return !store_data_bypass_p (out_insn, in_insn);
10906 }
10907 \f
10908
10909 /* Variables and flags used in scheduler hooks when tuning for
10910    Loongson 2E/2F.  */
10911 static struct
10912 {
10913   /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
10914      strategy.  */
10915
10916   /* If true, then next ALU1/2 instruction will go to ALU1.  */
10917   bool alu1_turn_p;
10918
10919   /* If true, then next FALU1/2 unstruction will go to FALU1.  */
10920   bool falu1_turn_p;
10921
10922   /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
10923   int alu1_core_unit_code;
10924   int alu2_core_unit_code;
10925   int falu1_core_unit_code;
10926   int falu2_core_unit_code;
10927
10928   /* True if current cycle has a multi instruction.
10929      This flag is used in mips_ls2_dfa_post_advance_cycle.  */
10930   bool cycle_has_multi_p;
10931
10932   /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
10933      These are used in mips_ls2_dfa_post_advance_cycle to initialize
10934      DFA state.
10935      E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
10936      instruction to go ALU1.  */
10937   rtx alu1_turn_enabled_insn;
10938   rtx alu2_turn_enabled_insn;
10939   rtx falu1_turn_enabled_insn;
10940   rtx falu2_turn_enabled_insn;
10941 } mips_ls2;
10942
10943 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
10944    dependencies have no cost, except on the 20Kc where output-dependence
10945    is treated like input-dependence.  */
10946
10947 static int
10948 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
10949                   rtx dep ATTRIBUTE_UNUSED, int cost)
10950 {
10951   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
10952       && TUNE_20KC)
10953     return cost;
10954   if (REG_NOTE_KIND (link) != 0)
10955     return 0;
10956   return cost;
10957 }
10958
10959 /* Return the number of instructions that can be issued per cycle.  */
10960
10961 static int
10962 mips_issue_rate (void)
10963 {
10964   switch (mips_tune)
10965     {
10966     case PROCESSOR_74KC:
10967     case PROCESSOR_74KF2_1:
10968     case PROCESSOR_74KF1_1:
10969     case PROCESSOR_74KF3_2:
10970       /* The 74k is not strictly quad-issue cpu, but can be seen as one
10971          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
10972          but in reality only a maximum of 3 insns can be issued as
10973          floating-point loads and stores also require a slot in the
10974          AGEN pipe.  */
10975     case PROCESSOR_R10000:
10976       /* All R10K Processors are quad-issue (being the first MIPS
10977          processors to support this feature). */
10978       return 4;
10979
10980     case PROCESSOR_20KC:
10981     case PROCESSOR_R4130:
10982     case PROCESSOR_R5400:
10983     case PROCESSOR_R5500:
10984     case PROCESSOR_R7000:
10985     case PROCESSOR_R9000:
10986     case PROCESSOR_OCTEON:
10987       return 2;
10988
10989     case PROCESSOR_SB1:
10990     case PROCESSOR_SB1A:
10991       /* This is actually 4, but we get better performance if we claim 3.
10992          This is partly because of unwanted speculative code motion with the
10993          larger number, and partly because in most common cases we can't
10994          reach the theoretical max of 4.  */
10995       return 3;
10996
10997     case PROCESSOR_LOONGSON_2E:
10998     case PROCESSOR_LOONGSON_2F:
10999       return 4;
11000
11001     default:
11002       return 1;
11003     }
11004 }
11005
11006 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
11007
11008 static void
11009 mips_ls2_init_dfa_post_cycle_insn (void)
11010 {
11011   start_sequence ();
11012   emit_insn (gen_ls2_alu1_turn_enabled_insn ());
11013   mips_ls2.alu1_turn_enabled_insn = get_insns ();
11014   end_sequence ();
11015
11016   start_sequence ();
11017   emit_insn (gen_ls2_alu2_turn_enabled_insn ());
11018   mips_ls2.alu2_turn_enabled_insn = get_insns ();
11019   end_sequence ();
11020
11021   start_sequence ();
11022   emit_insn (gen_ls2_falu1_turn_enabled_insn ());
11023   mips_ls2.falu1_turn_enabled_insn = get_insns ();
11024   end_sequence ();
11025
11026   start_sequence ();
11027   emit_insn (gen_ls2_falu2_turn_enabled_insn ());
11028   mips_ls2.falu2_turn_enabled_insn = get_insns ();
11029   end_sequence ();
11030
11031   mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
11032   mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
11033   mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
11034   mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
11035 }
11036
11037 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
11038    Init data used in mips_dfa_post_advance_cycle.  */
11039
11040 static void
11041 mips_init_dfa_post_cycle_insn (void)
11042 {
11043   if (TUNE_LOONGSON_2EF)
11044     mips_ls2_init_dfa_post_cycle_insn ();
11045 }
11046
11047 /* Initialize STATE when scheduling for Loongson 2E/2F.
11048    Support round-robin dispatch scheme by enabling only one of
11049    ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
11050    respectively.  */
11051
11052 static void
11053 mips_ls2_dfa_post_advance_cycle (state_t state)
11054 {
11055   if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
11056     {
11057       /* Though there are no non-pipelined ALU1 insns,
11058          we can get an instruction of type 'multi' before reload.  */
11059       gcc_assert (mips_ls2.cycle_has_multi_p);
11060       mips_ls2.alu1_turn_p = false;
11061     }
11062
11063   mips_ls2.cycle_has_multi_p = false;
11064
11065   if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
11066     /* We have a non-pipelined alu instruction in the core,
11067        adjust round-robin counter.  */
11068     mips_ls2.alu1_turn_p = true;
11069
11070   if (mips_ls2.alu1_turn_p)
11071     {
11072       if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
11073         gcc_unreachable ();
11074     }
11075   else
11076     {
11077       if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
11078         gcc_unreachable ();
11079     }
11080
11081   if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
11082     {
11083       /* There are no non-pipelined FALU1 insns.  */
11084       gcc_unreachable ();
11085       mips_ls2.falu1_turn_p = false;
11086     }
11087
11088   if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
11089     /* We have a non-pipelined falu instruction in the core,
11090        adjust round-robin counter.  */
11091     mips_ls2.falu1_turn_p = true;
11092
11093   if (mips_ls2.falu1_turn_p)
11094     {
11095       if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
11096         gcc_unreachable ();
11097     }
11098   else
11099     {
11100       if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
11101         gcc_unreachable ();
11102     }
11103 }
11104
11105 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
11106    This hook is being called at the start of each cycle.  */
11107
11108 static void
11109 mips_dfa_post_advance_cycle (void)
11110 {
11111   if (TUNE_LOONGSON_2EF)
11112     mips_ls2_dfa_post_advance_cycle (curr_state);
11113 }
11114
11115 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
11116    be as wide as the scheduling freedom in the DFA.  */
11117
11118 static int
11119 mips_multipass_dfa_lookahead (void)
11120 {
11121   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
11122   if (TUNE_SB1)
11123     return 4;
11124
11125   if (TUNE_LOONGSON_2EF)
11126     return 4;
11127
11128   if (TUNE_OCTEON)
11129     return 2;
11130
11131   return 0;
11132 }
11133 \f
11134 /* Remove the instruction at index LOWER from ready queue READY and
11135    reinsert it in front of the instruction at index HIGHER.  LOWER must
11136    be <= HIGHER.  */
11137
11138 static void
11139 mips_promote_ready (rtx *ready, int lower, int higher)
11140 {
11141   rtx new_head;
11142   int i;
11143
11144   new_head = ready[lower];
11145   for (i = lower; i < higher; i++)
11146     ready[i] = ready[i + 1];
11147   ready[i] = new_head;
11148 }
11149
11150 /* If the priority of the instruction at POS2 in the ready queue READY
11151    is within LIMIT units of that of the instruction at POS1, swap the
11152    instructions if POS2 is not already less than POS1.  */
11153
11154 static void
11155 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
11156 {
11157   if (pos1 < pos2
11158       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
11159     {
11160       rtx temp;
11161
11162       temp = ready[pos1];
11163       ready[pos1] = ready[pos2];
11164       ready[pos2] = temp;
11165     }
11166 }
11167 \f
11168 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
11169    that may clobber hi or lo.  */
11170 static rtx mips_macc_chains_last_hilo;
11171
11172 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
11173    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
11174
11175 static void
11176 mips_macc_chains_record (rtx insn)
11177 {
11178   if (get_attr_may_clobber_hilo (insn))
11179     mips_macc_chains_last_hilo = insn;
11180 }
11181
11182 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
11183    has NREADY elements, looking for a multiply-add or multiply-subtract
11184    instruction that is cumulative with mips_macc_chains_last_hilo.
11185    If there is one, promote it ahead of anything else that might
11186    clobber hi or lo.  */
11187
11188 static void
11189 mips_macc_chains_reorder (rtx *ready, int nready)
11190 {
11191   int i, j;
11192
11193   if (mips_macc_chains_last_hilo != 0)
11194     for (i = nready - 1; i >= 0; i--)
11195       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
11196         {
11197           for (j = nready - 1; j > i; j--)
11198             if (recog_memoized (ready[j]) >= 0
11199                 && get_attr_may_clobber_hilo (ready[j]))
11200               {
11201                 mips_promote_ready (ready, i, j);
11202                 break;
11203               }
11204           break;
11205         }
11206 }
11207 \f
11208 /* The last instruction to be scheduled.  */
11209 static rtx vr4130_last_insn;
11210
11211 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
11212    points to an rtx that is initially an instruction.  Nullify the rtx
11213    if the instruction uses the value of register X.  */
11214
11215 static void
11216 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
11217                                 void *data)
11218 {
11219   rtx *insn_ptr;
11220
11221   insn_ptr = (rtx *) data;
11222   if (REG_P (x)
11223       && *insn_ptr != 0
11224       && reg_referenced_p (x, PATTERN (*insn_ptr)))
11225     *insn_ptr = 0;
11226 }
11227
11228 /* Return true if there is true register dependence between vr4130_last_insn
11229    and INSN.  */
11230
11231 static bool
11232 vr4130_true_reg_dependence_p (rtx insn)
11233 {
11234   note_stores (PATTERN (vr4130_last_insn),
11235                vr4130_true_reg_dependence_p_1, &insn);
11236   return insn == 0;
11237 }
11238
11239 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
11240    the ready queue and that INSN2 is the instruction after it, return
11241    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
11242    in which INSN1 and INSN2 can probably issue in parallel, but for
11243    which (INSN2, INSN1) should be less sensitive to instruction
11244    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
11245
11246 static bool
11247 vr4130_swap_insns_p (rtx insn1, rtx insn2)
11248 {
11249   sd_iterator_def sd_it;
11250   dep_t dep;
11251
11252   /* Check for the following case:
11253
11254      1) there is some other instruction X with an anti dependence on INSN1;
11255      2) X has a higher priority than INSN2; and
11256      3) X is an arithmetic instruction (and thus has no unit restrictions).
11257
11258      If INSN1 is the last instruction blocking X, it would better to
11259      choose (INSN1, X) over (INSN2, INSN1).  */
11260   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
11261     if (DEP_TYPE (dep) == REG_DEP_ANTI
11262         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
11263         && recog_memoized (DEP_CON (dep)) >= 0
11264         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
11265       return false;
11266
11267   if (vr4130_last_insn != 0
11268       && recog_memoized (insn1) >= 0
11269       && recog_memoized (insn2) >= 0)
11270     {
11271       /* See whether INSN1 and INSN2 use different execution units,
11272          or if they are both ALU-type instructions.  If so, they can
11273          probably execute in parallel.  */
11274       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
11275       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
11276       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
11277         {
11278           /* If only one of the instructions has a dependence on
11279              vr4130_last_insn, prefer to schedule the other one first.  */
11280           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
11281           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
11282           if (dep1_p != dep2_p)
11283             return dep1_p;
11284
11285           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
11286              is not an ALU-type instruction and if INSN1 uses the same
11287              execution unit.  (Note that if this condition holds, we already
11288              know that INSN2 uses a different execution unit.)  */
11289           if (class1 != VR4130_CLASS_ALU
11290               && recog_memoized (vr4130_last_insn) >= 0
11291               && class1 == get_attr_vr4130_class (vr4130_last_insn))
11292             return true;
11293         }
11294     }
11295   return false;
11296 }
11297
11298 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
11299    queue with at least two instructions.  Swap the first two if
11300    vr4130_swap_insns_p says that it could be worthwhile.  */
11301
11302 static void
11303 vr4130_reorder (rtx *ready, int nready)
11304 {
11305   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
11306     mips_promote_ready (ready, nready - 2, nready - 1);
11307 }
11308 \f
11309 /* Record whether last 74k AGEN instruction was a load or store.  */
11310 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
11311
11312 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
11313    resets to TYPE_UNKNOWN state.  */
11314
11315 static void
11316 mips_74k_agen_init (rtx insn)
11317 {
11318   if (!insn || !NONJUMP_INSN_P (insn))
11319     mips_last_74k_agen_insn = TYPE_UNKNOWN;
11320   else
11321     {
11322       enum attr_type type = get_attr_type (insn);
11323       if (type == TYPE_LOAD || type == TYPE_STORE)
11324         mips_last_74k_agen_insn = type;
11325     }
11326 }
11327
11328 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
11329    loads to be grouped together, and multiple stores to be grouped
11330    together.  Swap things around in the ready queue to make this happen.  */
11331
11332 static void
11333 mips_74k_agen_reorder (rtx *ready, int nready)
11334 {
11335   int i;
11336   int store_pos, load_pos;
11337
11338   store_pos = -1;
11339   load_pos = -1;
11340
11341   for (i = nready - 1; i >= 0; i--)
11342     {
11343       rtx insn = ready[i];
11344       if (USEFUL_INSN_P (insn))
11345         switch (get_attr_type (insn))
11346           {
11347           case TYPE_STORE:
11348             if (store_pos == -1)
11349               store_pos = i;
11350             break;
11351
11352           case TYPE_LOAD:
11353             if (load_pos == -1)
11354               load_pos = i;
11355             break;
11356
11357           default:
11358             break;
11359           }
11360     }
11361
11362   if (load_pos == -1 || store_pos == -1)
11363     return;
11364
11365   switch (mips_last_74k_agen_insn)
11366     {
11367     case TYPE_UNKNOWN:
11368       /* Prefer to schedule loads since they have a higher latency.  */
11369     case TYPE_LOAD:
11370       /* Swap loads to the front of the queue.  */
11371       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
11372       break;
11373     case TYPE_STORE:
11374       /* Swap stores to the front of the queue.  */
11375       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
11376       break;
11377     default:
11378       break;
11379     }
11380 }
11381 \f
11382 /* Implement TARGET_SCHED_INIT.  */
11383
11384 static void
11385 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
11386                  int max_ready ATTRIBUTE_UNUSED)
11387 {
11388   mips_macc_chains_last_hilo = 0;
11389   vr4130_last_insn = 0;
11390   mips_74k_agen_init (NULL_RTX);
11391
11392   /* When scheduling for Loongson2, branch instructions go to ALU1,
11393      therefore basic block is most likely to start with round-robin counter
11394      pointed to ALU2.  */
11395   mips_ls2.alu1_turn_p = false;
11396   mips_ls2.falu1_turn_p = true;
11397 }
11398
11399 /* Implement TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
11400
11401 static int
11402 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
11403                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
11404 {
11405   if (!reload_completed
11406       && TUNE_MACC_CHAINS
11407       && *nreadyp > 0)
11408     mips_macc_chains_reorder (ready, *nreadyp);
11409
11410   if (reload_completed
11411       && TUNE_MIPS4130
11412       && !TARGET_VR4130_ALIGN
11413       && *nreadyp > 1)
11414     vr4130_reorder (ready, *nreadyp);
11415
11416   if (TUNE_74K)
11417     mips_74k_agen_reorder (ready, *nreadyp);
11418
11419   return mips_issue_rate ();
11420 }
11421
11422 /* Update round-robin counters for ALU1/2 and FALU1/2.  */
11423
11424 static void
11425 mips_ls2_variable_issue (rtx insn)
11426 {
11427   if (mips_ls2.alu1_turn_p)
11428     {
11429       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
11430         mips_ls2.alu1_turn_p = false;
11431     }
11432   else
11433     {
11434       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
11435         mips_ls2.alu1_turn_p = true;
11436     }
11437
11438   if (mips_ls2.falu1_turn_p)
11439     {
11440       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
11441         mips_ls2.falu1_turn_p = false;
11442     }
11443   else
11444     {
11445       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
11446         mips_ls2.falu1_turn_p = true;
11447     }
11448
11449   if (recog_memoized (insn) >= 0)
11450     mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
11451 }
11452
11453 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
11454
11455 static int
11456 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
11457                      rtx insn, int more)
11458 {
11459   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
11460   if (USEFUL_INSN_P (insn))
11461     {
11462       more--;
11463       if (!reload_completed && TUNE_MACC_CHAINS)
11464         mips_macc_chains_record (insn);
11465       vr4130_last_insn = insn;
11466       if (TUNE_74K)
11467         mips_74k_agen_init (insn);
11468       else if (TUNE_LOONGSON_2EF)
11469         mips_ls2_variable_issue (insn);
11470     }
11471
11472   /* Instructions of type 'multi' should all be split before
11473      the second scheduling pass.  */
11474   gcc_assert (!reload_completed
11475               || recog_memoized (insn) < 0
11476               || get_attr_type (insn) != TYPE_MULTI);
11477
11478   return more;
11479 }
11480 \f
11481 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
11482    return the first operand of the associated PREF or PREFX insn.  */
11483
11484 rtx
11485 mips_prefetch_cookie (rtx write, rtx locality)
11486 {
11487   /* store_streamed / load_streamed.  */
11488   if (INTVAL (locality) <= 0)
11489     return GEN_INT (INTVAL (write) + 4);
11490
11491   /* store / load.  */
11492   if (INTVAL (locality) <= 2)
11493     return write;
11494
11495   /* store_retained / load_retained.  */
11496   return GEN_INT (INTVAL (write) + 6);
11497 }
11498 \f
11499 /* Flags that indicate when a built-in function is available.
11500
11501    BUILTIN_AVAIL_NON_MIPS16
11502         The function is available on the current target, but only
11503         in non-MIPS16 mode.  */
11504 #define BUILTIN_AVAIL_NON_MIPS16 1
11505
11506 /* Declare an availability predicate for built-in functions that
11507    require non-MIPS16 mode and also require COND to be true.
11508    NAME is the main part of the predicate's name.  */
11509 #define AVAIL_NON_MIPS16(NAME, COND)                                    \
11510  static unsigned int                                                    \
11511  mips_builtin_avail_##NAME (void)                                       \
11512  {                                                                      \
11513    return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                        \
11514  }
11515
11516 /* This structure describes a single built-in function.  */
11517 struct mips_builtin_description {
11518   /* The code of the main .md file instruction.  See mips_builtin_type
11519      for more information.  */
11520   enum insn_code icode;
11521
11522   /* The floating-point comparison code to use with ICODE, if any.  */
11523   enum mips_fp_condition cond;
11524
11525   /* The name of the built-in function.  */
11526   const char *name;
11527
11528   /* Specifies how the function should be expanded.  */
11529   enum mips_builtin_type builtin_type;
11530
11531   /* The function's prototype.  */
11532   enum mips_function_type function_type;
11533
11534   /* Whether the function is available.  */
11535   unsigned int (*avail) (void);
11536 };
11537
11538 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
11539 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
11540 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
11541 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
11542 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
11543 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
11544 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
11545 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
11546 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
11547
11548 /* Construct a mips_builtin_description from the given arguments.
11549
11550    INSN is the name of the associated instruction pattern, without the
11551    leading CODE_FOR_mips_.
11552
11553    CODE is the floating-point condition code associated with the
11554    function.  It can be 'f' if the field is not applicable.
11555
11556    NAME is the name of the function itself, without the leading
11557    "__builtin_mips_".
11558
11559    BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
11560
11561    AVAIL is the name of the availability predicate, without the leading
11562    mips_builtin_avail_.  */
11563 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
11564                      FUNCTION_TYPE, AVAIL)                              \
11565   { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
11566     "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
11567     mips_builtin_avail_ ## AVAIL }
11568
11569 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
11570    mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
11571    are as for MIPS_BUILTIN.  */
11572 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
11573   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
11574
11575 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
11576    are subject to mips_builtin_avail_<AVAIL>.  */
11577 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
11578   MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
11579                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
11580   MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
11581                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
11582
11583 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
11584    The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
11585    while the any and all forms are subject to mips_builtin_avail_mips3d.  */
11586 #define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
11587   MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
11588                 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
11589                 mips3d),                                                \
11590   MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
11591                 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
11592                 mips3d),                                                \
11593   MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
11594                 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
11595                 AVAIL),                                                 \
11596   MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
11597                 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
11598                 AVAIL)
11599
11600 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
11601    are subject to mips_builtin_avail_mips3d.  */
11602 #define CMP_4S_BUILTINS(INSN, COND)                                     \
11603   MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
11604                 MIPS_BUILTIN_CMP_ANY,                                   \
11605                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
11606   MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
11607                 MIPS_BUILTIN_CMP_ALL,                                   \
11608                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
11609
11610 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
11611    instruction requires mips_builtin_avail_<AVAIL>.  */
11612 #define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
11613   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
11614                 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11615                 AVAIL),                                                 \
11616   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
11617                 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11618                 AVAIL)
11619
11620 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
11621 #define CMP_BUILTINS(COND)                                              \
11622   MOVTF_BUILTINS (c, COND, paired_single),                              \
11623   MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
11624   CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
11625   CMP_PS_BUILTINS (c, COND, paired_single),                             \
11626   CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
11627   CMP_4S_BUILTINS (c, COND),                                            \
11628   CMP_4S_BUILTINS (cabs, COND)
11629
11630 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
11631    function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
11632    and AVAIL are as for MIPS_BUILTIN.  */
11633 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
11634   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
11635                 FUNCTION_TYPE, AVAIL)
11636
11637 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
11638    branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
11639 #define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
11640   MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
11641                 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
11642
11643 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
11644    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
11645    builtin_description field.  */
11646 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
11647   { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
11648     "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
11649     FUNCTION_TYPE, mips_builtin_avail_loongson }
11650
11651 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
11652    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
11653    builtin_description field.  */
11654 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
11655   LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
11656
11657 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
11658    We use functions of this form when the same insn can be usefully applied
11659    to more than one datatype.  */
11660 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
11661   LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
11662
11663 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
11664 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
11665 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
11666 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
11667 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
11668 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
11669
11670 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
11671 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
11672 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
11673 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
11674 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
11675 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
11676 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
11677 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
11678 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
11679 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
11680 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
11681 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
11682 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
11683 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
11684 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
11685 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
11686 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
11687 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
11688 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
11689 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
11690 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
11691 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
11692 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
11693 #define CODE_FOR_loongson_punpckhbh CODE_FOR_vec_interleave_highv8qi
11694 #define CODE_FOR_loongson_punpckhhw CODE_FOR_vec_interleave_highv4hi
11695 #define CODE_FOR_loongson_punpckhwd CODE_FOR_vec_interleave_highv2si
11696 #define CODE_FOR_loongson_punpcklbh CODE_FOR_vec_interleave_lowv8qi
11697 #define CODE_FOR_loongson_punpcklhw CODE_FOR_vec_interleave_lowv4hi
11698 #define CODE_FOR_loongson_punpcklwd CODE_FOR_vec_interleave_lowv2si
11699
11700 static const struct mips_builtin_description mips_builtins[] = {
11701   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
11702   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
11703   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
11704   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
11705   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
11706   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
11707   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
11708   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
11709
11710   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
11711   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
11712   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
11713   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
11714   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
11715
11716   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
11717   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
11718   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
11719   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
11720   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
11721   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
11722
11723   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
11724   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
11725   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
11726   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
11727   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
11728   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
11729
11730   MIPS_FP_CONDITIONS (CMP_BUILTINS),
11731
11732   /* Built-in functions for the SB-1 processor.  */
11733   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
11734
11735   /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
11736   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11737   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11738   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
11739   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
11740   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
11741   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11742   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11743   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
11744   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
11745   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
11746   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
11747   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
11748   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
11749   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
11750   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
11751   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
11752   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
11753   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
11754   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
11755   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
11756   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
11757   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
11758   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
11759   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
11760   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
11761   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
11762   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
11763   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
11764   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
11765   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
11766   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
11767   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
11768   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
11769   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
11770   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
11771   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
11772   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
11773   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
11774   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
11775   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
11776   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11777   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
11778   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
11779   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
11780   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
11781   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
11782   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
11783   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
11784   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
11785   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
11786   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
11787   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
11788   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
11789   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
11790   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
11791   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
11792   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
11793   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11794   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
11795   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
11796   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
11797   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
11798   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
11799   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
11800   BPOSGE_BUILTIN (32, dsp),
11801
11802   /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
11803   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
11804   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11805   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11806   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
11807   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
11808   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
11809   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
11810   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
11811   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
11812   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
11813   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11814   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11815   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11816   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11817   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11818   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
11819   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
11820   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
11821   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
11822   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
11823   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
11824   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
11825   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11826   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11827   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
11828   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
11829   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11830   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11831   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11832   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11833   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11834   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
11835   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11836   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
11837
11838   /* Built-in functions for the DSP ASE (32-bit only).  */
11839   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
11840   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
11841   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
11842   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
11843   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11844   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11845   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11846   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
11847   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
11848   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11849   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11850   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11851   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
11852   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
11853   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
11854   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
11855   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
11856   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
11857   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
11858   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
11859   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
11860
11861   /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
11862   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11863   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11864   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
11865   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
11866   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
11867   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
11868   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11869   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dspr2_32),
11870   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dspr2_32),
11871   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11872   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11873   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11874   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11875   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11876   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
11877
11878   /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
11879   LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
11880   LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
11881   LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
11882   LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11883   LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11884   LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11885   LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11886   LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11887   LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11888   LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
11889   LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
11890   LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11891   LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
11892   LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11893   LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11894   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
11895   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11896   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11897   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11898   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
11899   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
11900   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11901   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
11902   LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11903   LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11904   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11905   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11906   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11907   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11908   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11909   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11910   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11911   LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11912   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11913   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11914   LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11915   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11916   LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
11917   LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
11918   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11919   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11920   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11921   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11922   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11923   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11924   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11925   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11926   LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
11927   LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11928   LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11929   LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11930   LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11931   LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
11932   LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
11933   LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11934   LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11935   LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11936   LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
11937   LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11938   LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
11939   LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
11940   LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI_UQI),
11941   LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_V4HI_UQI),
11942   LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
11943   LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
11944   LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
11945   LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
11946   LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
11947   LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
11948   LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
11949   LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
11950   LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
11951   LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
11952   LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
11953   LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
11954   LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11955   LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11956   LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11957   LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11958   LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11959   LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11960   LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
11961   LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
11962   LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
11963   LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
11964   LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11965   LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11966   LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11967   LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11968   LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11969   LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11970   LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11971   LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11972   LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
11973   LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
11974   LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
11975   LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
11976   LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
11977   LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
11978
11979   /* Sundry other built-in functions.  */
11980   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
11981 };
11982
11983 /* MODE is a vector mode whose elements have type TYPE.  Return the type
11984    of the vector itself.  */
11985
11986 static tree
11987 mips_builtin_vector_type (tree type, enum machine_mode mode)
11988 {
11989   static tree types[2 * (int) MAX_MACHINE_MODE];
11990   int mode_index;
11991
11992   mode_index = (int) mode;
11993
11994   if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
11995     mode_index += MAX_MACHINE_MODE;
11996
11997   if (types[mode_index] == NULL_TREE)
11998     types[mode_index] = build_vector_type_for_mode (type, mode);
11999   return types[mode_index];
12000 }
12001
12002 /* Return a type for 'const volatile void *'.  */
12003
12004 static tree
12005 mips_build_cvpointer_type (void)
12006 {
12007   static tree cache;
12008
12009   if (cache == NULL_TREE)
12010     cache = build_pointer_type (build_qualified_type
12011                                 (void_type_node,
12012                                  TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
12013   return cache;
12014 }
12015
12016 /* Source-level argument types.  */
12017 #define MIPS_ATYPE_VOID void_type_node
12018 #define MIPS_ATYPE_INT integer_type_node
12019 #define MIPS_ATYPE_POINTER ptr_type_node
12020 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
12021
12022 /* Standard mode-based argument types.  */
12023 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
12024 #define MIPS_ATYPE_SI intSI_type_node
12025 #define MIPS_ATYPE_USI unsigned_intSI_type_node
12026 #define MIPS_ATYPE_DI intDI_type_node
12027 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
12028 #define MIPS_ATYPE_SF float_type_node
12029 #define MIPS_ATYPE_DF double_type_node
12030
12031 /* Vector argument types.  */
12032 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
12033 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
12034 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
12035 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
12036 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
12037 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
12038 #define MIPS_ATYPE_UV2SI                                        \
12039   mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
12040 #define MIPS_ATYPE_UV4HI                                        \
12041   mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
12042 #define MIPS_ATYPE_UV8QI                                        \
12043   mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
12044
12045 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
12046    their associated MIPS_ATYPEs.  */
12047 #define MIPS_FTYPE_ATYPES1(A, B) \
12048   MIPS_ATYPE_##A, MIPS_ATYPE_##B
12049
12050 #define MIPS_FTYPE_ATYPES2(A, B, C) \
12051   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
12052
12053 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
12054   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
12055
12056 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
12057   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
12058   MIPS_ATYPE_##E
12059
12060 /* Return the function type associated with function prototype TYPE.  */
12061
12062 static tree
12063 mips_build_function_type (enum mips_function_type type)
12064 {
12065   static tree types[(int) MIPS_MAX_FTYPE_MAX];
12066
12067   if (types[(int) type] == NULL_TREE)
12068     switch (type)
12069       {
12070 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
12071   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
12072     types[(int) type]                                                   \
12073       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
12074                                   NULL_TREE);                           \
12075     break;
12076 #include "config/mips/mips-ftypes.def"
12077 #undef DEF_MIPS_FTYPE
12078       default:
12079         gcc_unreachable ();
12080       }
12081
12082   return types[(int) type];
12083 }
12084
12085 /* Implement TARGET_INIT_BUILTINS.  */
12086
12087 static void
12088 mips_init_builtins (void)
12089 {
12090   const struct mips_builtin_description *d;
12091   unsigned int i;
12092
12093   /* Iterate through all of the bdesc arrays, initializing all of the
12094      builtin functions.  */
12095   for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
12096     {
12097       d = &mips_builtins[i];
12098       if (d->avail ())
12099         add_builtin_function (d->name,
12100                               mips_build_function_type (d->function_type),
12101                               i, BUILT_IN_MD, NULL, NULL);
12102     }
12103 }
12104
12105 /* Take argument ARGNO from EXP's argument list and convert it into a
12106    form suitable for input operand OPNO of instruction ICODE.  Return the
12107    value.  */
12108
12109 static rtx
12110 mips_prepare_builtin_arg (enum insn_code icode,
12111                           unsigned int opno, tree exp, unsigned int argno)
12112 {
12113   tree arg;
12114   rtx value;
12115   enum machine_mode mode;
12116
12117   arg = CALL_EXPR_ARG (exp, argno);
12118   value = expand_normal (arg);
12119   mode = insn_data[icode].operand[opno].mode;
12120   if (!insn_data[icode].operand[opno].predicate (value, mode))
12121     {
12122       /* We need to get the mode from ARG for two reasons:
12123
12124            - to cope with address operands, where MODE is the mode of the
12125              memory, rather than of VALUE itself.
12126
12127            - to cope with special predicates like pmode_register_operand,
12128              where MODE is VOIDmode.  */
12129       value = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (arg)), value);
12130
12131       /* Check the predicate again.  */
12132       if (!insn_data[icode].operand[opno].predicate (value, mode))
12133         {
12134           error ("invalid argument to built-in function");
12135           return const0_rtx;
12136         }
12137     }
12138
12139   return value;
12140 }
12141
12142 /* Return an rtx suitable for output operand OP of instruction ICODE.
12143    If TARGET is non-null, try to use it where possible.  */
12144
12145 static rtx
12146 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
12147 {
12148   enum machine_mode mode;
12149
12150   mode = insn_data[icode].operand[op].mode;
12151   if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
12152     target = gen_reg_rtx (mode);
12153
12154   return target;
12155 }
12156
12157 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
12158    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
12159    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
12160    suggests a good place to put the result.  */
12161
12162 static rtx
12163 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
12164                             bool has_target_p)
12165 {
12166   rtx ops[MAX_RECOG_OPERANDS];
12167   int opno, argno;
12168
12169   /* Map any target to operand 0.  */
12170   opno = 0;
12171   if (has_target_p)
12172     {
12173       target = mips_prepare_builtin_target (icode, opno, target);
12174       ops[opno] = target;
12175       opno++;
12176     }
12177
12178   /* Map the arguments to the other operands.  The n_operands value
12179      for an expander includes match_dups and match_scratches as well as
12180      match_operands, so n_operands is only an upper bound on the number
12181      of arguments to the expander function.  */
12182   gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands);
12183   for (argno = 0; argno < call_expr_nargs (exp); argno++, opno++)
12184     ops[opno] = mips_prepare_builtin_arg (icode, opno, exp, argno);
12185
12186   switch (opno)
12187     {
12188     case 2:
12189       emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
12190       break;
12191
12192     case 3:
12193       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
12194       break;
12195
12196     case 4:
12197       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
12198       break;
12199
12200     default:
12201       gcc_unreachable ();
12202     }
12203   return target;
12204 }
12205
12206 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
12207    function; TYPE says which.  EXP is the CALL_EXPR that calls the
12208    function, ICODE is the instruction that should be used to compare
12209    the first two arguments, and COND is the condition it should test.
12210    TARGET, if nonnull, suggests a good place to put the result.  */
12211
12212 static rtx
12213 mips_expand_builtin_movtf (enum mips_builtin_type type,
12214                            enum insn_code icode, enum mips_fp_condition cond,
12215                            rtx target, tree exp)
12216 {
12217   rtx cmp_result, op0, op1;
12218
12219   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
12220   op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
12221   op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
12222   emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
12223
12224   icode = CODE_FOR_mips_cond_move_tf_ps;
12225   target = mips_prepare_builtin_target (icode, 0, target);
12226   if (type == MIPS_BUILTIN_MOVT)
12227     {
12228       op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
12229       op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
12230     }
12231   else
12232     {
12233       op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
12234       op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
12235     }
12236   emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
12237   return target;
12238 }
12239
12240 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
12241    into TARGET otherwise.  Return TARGET.  */
12242
12243 static rtx
12244 mips_builtin_branch_and_move (rtx condition, rtx target,
12245                               rtx value_if_true, rtx value_if_false)
12246 {
12247   rtx true_label, done_label;
12248
12249   true_label = gen_label_rtx ();
12250   done_label = gen_label_rtx ();
12251
12252   /* First assume that CONDITION is false.  */
12253   mips_emit_move (target, value_if_false);
12254
12255   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
12256   emit_jump_insn (gen_condjump (condition, true_label));
12257   emit_jump_insn (gen_jump (done_label));
12258   emit_barrier ();
12259
12260   /* Fix TARGET if CONDITION is true.  */
12261   emit_label (true_label);
12262   mips_emit_move (target, value_if_true);
12263
12264   emit_label (done_label);
12265   return target;
12266 }
12267
12268 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
12269    the CALL_EXPR that calls the function, ICODE is the code of the
12270    comparison instruction, and COND is the condition it should test.
12271    TARGET, if nonnull, suggests a good place to put the boolean result.  */
12272
12273 static rtx
12274 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
12275                              enum insn_code icode, enum mips_fp_condition cond,
12276                              rtx target, tree exp)
12277 {
12278   rtx offset, condition, cmp_result, args[MAX_RECOG_OPERANDS];
12279   int argno;
12280
12281   if (target == 0 || GET_MODE (target) != SImode)
12282     target = gen_reg_rtx (SImode);
12283
12284   /* The instruction should have a target operand, an operand for each
12285      argument, and an operand for COND.  */
12286   gcc_assert (call_expr_nargs (exp) + 2 == insn_data[icode].n_operands);
12287
12288   /* Prepare the operands to the comparison.  */
12289   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
12290   for (argno = 0; argno < call_expr_nargs (exp); argno++)
12291     args[argno] = mips_prepare_builtin_arg (icode, argno + 1, exp, argno);
12292
12293   switch (insn_data[icode].n_operands)
12294     {
12295     case 4:
12296       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
12297                                   GEN_INT (cond)));
12298       break;
12299
12300     case 6:
12301       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
12302                                   args[2], args[3], GEN_INT (cond)));
12303       break;
12304
12305     default:
12306       gcc_unreachable ();
12307     }
12308
12309   /* If the comparison sets more than one register, we define the result
12310      to be 0 if all registers are false and -1 if all registers are true.
12311      The value of the complete result is indeterminate otherwise.  */
12312   switch (builtin_type)
12313     {
12314     case MIPS_BUILTIN_CMP_ALL:
12315       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
12316       return mips_builtin_branch_and_move (condition, target,
12317                                            const0_rtx, const1_rtx);
12318
12319     case MIPS_BUILTIN_CMP_UPPER:
12320     case MIPS_BUILTIN_CMP_LOWER:
12321       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
12322       condition = gen_single_cc (cmp_result, offset);
12323       return mips_builtin_branch_and_move (condition, target,
12324                                            const1_rtx, const0_rtx);
12325
12326     default:
12327       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
12328       return mips_builtin_branch_and_move (condition, target,
12329                                            const1_rtx, const0_rtx);
12330     }
12331 }
12332
12333 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
12334    if nonnull, suggests a good place to put the boolean result.  */
12335
12336 static rtx
12337 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
12338 {
12339   rtx condition, cmp_result;
12340   int cmp_value;
12341
12342   if (target == 0 || GET_MODE (target) != SImode)
12343     target = gen_reg_rtx (SImode);
12344
12345   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
12346
12347   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
12348     cmp_value = 32;
12349   else
12350     gcc_assert (0);
12351
12352   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
12353   return mips_builtin_branch_and_move (condition, target,
12354                                        const1_rtx, const0_rtx);
12355 }
12356
12357 /* Implement TARGET_EXPAND_BUILTIN.  */
12358
12359 static rtx
12360 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
12361                      enum machine_mode mode, int ignore)
12362 {
12363   tree fndecl;
12364   unsigned int fcode, avail;
12365   const struct mips_builtin_description *d;
12366
12367   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
12368   fcode = DECL_FUNCTION_CODE (fndecl);
12369   gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
12370   d = &mips_builtins[fcode];
12371   avail = d->avail ();
12372   gcc_assert (avail != 0);
12373   if (TARGET_MIPS16)
12374     {
12375       error ("built-in function %qs not supported for MIPS16",
12376              IDENTIFIER_POINTER (DECL_NAME (fndecl)));
12377       return ignore ? const0_rtx : CONST0_RTX (mode);
12378     }
12379   switch (d->builtin_type)
12380     {
12381     case MIPS_BUILTIN_DIRECT:
12382       return mips_expand_builtin_direct (d->icode, target, exp, true);
12383
12384     case MIPS_BUILTIN_DIRECT_NO_TARGET:
12385       return mips_expand_builtin_direct (d->icode, target, exp, false);
12386
12387     case MIPS_BUILTIN_MOVT:
12388     case MIPS_BUILTIN_MOVF:
12389       return mips_expand_builtin_movtf (d->builtin_type, d->icode,
12390                                         d->cond, target, exp);
12391
12392     case MIPS_BUILTIN_CMP_ANY:
12393     case MIPS_BUILTIN_CMP_ALL:
12394     case MIPS_BUILTIN_CMP_UPPER:
12395     case MIPS_BUILTIN_CMP_LOWER:
12396     case MIPS_BUILTIN_CMP_SINGLE:
12397       return mips_expand_builtin_compare (d->builtin_type, d->icode,
12398                                           d->cond, target, exp);
12399
12400     case MIPS_BUILTIN_BPOSGE32:
12401       return mips_expand_builtin_bposge (d->builtin_type, target);
12402     }
12403   gcc_unreachable ();
12404 }
12405 \f
12406 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
12407    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
12408 struct mips16_constant {
12409   struct mips16_constant *next;
12410   rtx value;
12411   rtx label;
12412   enum machine_mode mode;
12413 };
12414
12415 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
12416    first constant, HIGHEST_ADDRESS is the highest address that the first
12417    byte of the pool can have, and INSN_ADDRESS is the current instruction
12418    address.  */
12419 struct mips16_constant_pool {
12420   struct mips16_constant *first;
12421   int highest_address;
12422   int insn_address;
12423 };
12424
12425 /* Add constant VALUE to POOL and return its label.  MODE is the
12426    value's mode (used for CONST_INTs, etc.).  */
12427
12428 static rtx
12429 mips16_add_constant (struct mips16_constant_pool *pool,
12430                      rtx value, enum machine_mode mode)
12431 {
12432   struct mips16_constant **p, *c;
12433   bool first_of_size_p;
12434
12435   /* See whether the constant is already in the pool.  If so, return the
12436      existing label, otherwise leave P pointing to the place where the
12437      constant should be added.
12438
12439      Keep the pool sorted in increasing order of mode size so that we can
12440      reduce the number of alignments needed.  */
12441   first_of_size_p = true;
12442   for (p = &pool->first; *p != 0; p = &(*p)->next)
12443     {
12444       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
12445         return (*p)->label;
12446       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
12447         break;
12448       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
12449         first_of_size_p = false;
12450     }
12451
12452   /* In the worst case, the constant needed by the earliest instruction
12453      will end up at the end of the pool.  The entire pool must then be
12454      accessible from that instruction.
12455
12456      When adding the first constant, set the pool's highest address to
12457      the address of the first out-of-range byte.  Adjust this address
12458      downwards each time a new constant is added.  */
12459   if (pool->first == 0)
12460     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
12461        of the instruction with the lowest two bits clear.  The base PC
12462        value for LDPC has the lowest three bits clear.  Assume the worst
12463        case here; namely that the PC-relative instruction occupies the
12464        last 2 bytes in an aligned word.  */
12465     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
12466   pool->highest_address -= GET_MODE_SIZE (mode);
12467   if (first_of_size_p)
12468     /* Take into account the worst possible padding due to alignment.  */
12469     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
12470
12471   /* Create a new entry.  */
12472   c = XNEW (struct mips16_constant);
12473   c->value = value;
12474   c->mode = mode;
12475   c->label = gen_label_rtx ();
12476   c->next = *p;
12477   *p = c;
12478
12479   return c->label;
12480 }
12481
12482 /* Output constant VALUE after instruction INSN and return the last
12483    instruction emitted.  MODE is the mode of the constant.  */
12484
12485 static rtx
12486 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
12487 {
12488   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
12489     {
12490       rtx size = GEN_INT (GET_MODE_SIZE (mode));
12491       return emit_insn_after (gen_consttable_int (value, size), insn);
12492     }
12493
12494   if (SCALAR_FLOAT_MODE_P (mode))
12495     return emit_insn_after (gen_consttable_float (value), insn);
12496
12497   if (VECTOR_MODE_P (mode))
12498     {
12499       int i;
12500
12501       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
12502         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
12503                                         CONST_VECTOR_ELT (value, i), insn);
12504       return insn;
12505     }
12506
12507   gcc_unreachable ();
12508 }
12509
12510 /* Dump out the constants in CONSTANTS after INSN.  */
12511
12512 static void
12513 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
12514 {
12515   struct mips16_constant *c, *next;
12516   int align;
12517
12518   align = 0;
12519   for (c = constants; c != NULL; c = next)
12520     {
12521       /* If necessary, increase the alignment of PC.  */
12522       if (align < GET_MODE_SIZE (c->mode))
12523         {
12524           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
12525           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
12526         }
12527       align = GET_MODE_SIZE (c->mode);
12528
12529       insn = emit_label_after (c->label, insn);
12530       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
12531
12532       next = c->next;
12533       free (c);
12534     }
12535
12536   emit_barrier_after (insn);
12537 }
12538
12539 /* Return the length of instruction INSN.  */
12540
12541 static int
12542 mips16_insn_length (rtx insn)
12543 {
12544   if (JUMP_P (insn))
12545     {
12546       rtx body = PATTERN (insn);
12547       if (GET_CODE (body) == ADDR_VEC)
12548         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
12549       if (GET_CODE (body) == ADDR_DIFF_VEC)
12550         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
12551     }
12552   return get_attr_length (insn);
12553 }
12554
12555 /* If *X is a symbolic constant that refers to the constant pool, add
12556    the constant to POOL and rewrite *X to use the constant's label.  */
12557
12558 static void
12559 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
12560 {
12561   rtx base, offset, label;
12562
12563   split_const (*x, &base, &offset);
12564   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
12565     {
12566       label = mips16_add_constant (pool, get_pool_constant (base),
12567                                    get_pool_mode (base));
12568       base = gen_rtx_LABEL_REF (Pmode, label);
12569       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
12570     }
12571 }
12572
12573 /* This structure is used to communicate with mips16_rewrite_pool_refs.
12574    INSN is the instruction we're rewriting and POOL points to the current
12575    constant pool.  */
12576 struct mips16_rewrite_pool_refs_info {
12577   rtx insn;
12578   struct mips16_constant_pool *pool;
12579 };
12580
12581 /* Rewrite *X so that constant pool references refer to the constant's
12582    label instead.  DATA points to a mips16_rewrite_pool_refs_info
12583    structure.  */
12584
12585 static int
12586 mips16_rewrite_pool_refs (rtx *x, void *data)
12587 {
12588   struct mips16_rewrite_pool_refs_info *info =
12589     (struct mips16_rewrite_pool_refs_info *) data;
12590
12591   if (force_to_mem_operand (*x, Pmode))
12592     {
12593       rtx mem = force_const_mem (GET_MODE (*x), *x);
12594       validate_change (info->insn, x, mem, false);
12595     }
12596
12597   if (MEM_P (*x))
12598     {
12599       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
12600       return -1;
12601     }
12602
12603   if (TARGET_MIPS16_TEXT_LOADS)
12604     mips16_rewrite_pool_constant (info->pool, x);
12605
12606   return GET_CODE (*x) == CONST ? -1 : 0;
12607 }
12608
12609 /* Build MIPS16 constant pools.  */
12610
12611 static void
12612 mips16_lay_out_constants (void)
12613 {
12614   struct mips16_constant_pool pool;
12615   struct mips16_rewrite_pool_refs_info info;
12616   rtx insn, barrier;
12617
12618   if (!TARGET_MIPS16_PCREL_LOADS)
12619     return;
12620
12621   split_all_insns_noflow ();
12622   barrier = 0;
12623   memset (&pool, 0, sizeof (pool));
12624   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
12625     {
12626       /* Rewrite constant pool references in INSN.  */
12627       if (INSN_P (insn))
12628         {
12629           info.insn = insn;
12630           info.pool = &pool;
12631           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
12632         }
12633
12634       pool.insn_address += mips16_insn_length (insn);
12635
12636       if (pool.first != NULL)
12637         {
12638           /* If there are no natural barriers between the first user of
12639              the pool and the highest acceptable address, we'll need to
12640              create a new instruction to jump around the constant pool.
12641              In the worst case, this instruction will be 4 bytes long.
12642
12643              If it's too late to do this transformation after INSN,
12644              do it immediately before INSN.  */
12645           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
12646             {
12647               rtx label, jump;
12648
12649               label = gen_label_rtx ();
12650
12651               jump = emit_jump_insn_before (gen_jump (label), insn);
12652               JUMP_LABEL (jump) = label;
12653               LABEL_NUSES (label) = 1;
12654               barrier = emit_barrier_after (jump);
12655
12656               emit_label_after (label, barrier);
12657               pool.insn_address += 4;
12658             }
12659
12660           /* See whether the constant pool is now out of range of the first
12661              user.  If so, output the constants after the previous barrier.
12662              Note that any instructions between BARRIER and INSN (inclusive)
12663              will use negative offsets to refer to the pool.  */
12664           if (pool.insn_address > pool.highest_address)
12665             {
12666               mips16_emit_constants (pool.first, barrier);
12667               pool.first = NULL;
12668               barrier = 0;
12669             }
12670           else if (BARRIER_P (insn))
12671             barrier = insn;
12672         }
12673     }
12674   mips16_emit_constants (pool.first, get_last_insn ());
12675 }
12676 \f
12677 /* Return true if it is worth r10k_simplify_address's while replacing
12678    an address with X.  We are looking for constants, and for addresses
12679    at a known offset from the incoming stack pointer.  */
12680
12681 static bool
12682 r10k_simplified_address_p (rtx x)
12683 {
12684   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
12685     x = XEXP (x, 0);
12686   return x == virtual_incoming_args_rtx || CONSTANT_P (x);
12687 }
12688
12689 /* X is an expression that appears in INSN.  Try to use the UD chains
12690    to simplify it, returning the simplified form on success and the
12691    original form otherwise.  Replace the incoming value of $sp with
12692    virtual_incoming_args_rtx (which should never occur in X otherwise).  */
12693
12694 static rtx
12695 r10k_simplify_address (rtx x, rtx insn)
12696 {
12697   rtx newx, op0, op1, set, def_insn, note;
12698   df_ref use, def;
12699   struct df_link *defs;
12700
12701   newx = NULL_RTX;
12702   if (UNARY_P (x))
12703     {
12704       op0 = r10k_simplify_address (XEXP (x, 0), insn);
12705       if (op0 != XEXP (x, 0))
12706         newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
12707                                    op0, GET_MODE (XEXP (x, 0)));
12708     }
12709   else if (BINARY_P (x))
12710     {
12711       op0 = r10k_simplify_address (XEXP (x, 0), insn);
12712       op1 = r10k_simplify_address (XEXP (x, 1), insn);
12713       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
12714         newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
12715     }
12716   else if (GET_CODE (x) == LO_SUM)
12717     {
12718       /* LO_SUMs can be offset from HIGHs, if we know they won't
12719          overflow.  See mips_classify_address for the rationale behind
12720          the lax check.  */
12721       op0 = r10k_simplify_address (XEXP (x, 0), insn);
12722       if (GET_CODE (op0) == HIGH)
12723         newx = XEXP (x, 1);
12724     }
12725   else if (REG_P (x))
12726     {
12727       /* Uses are recorded by regno_reg_rtx, not X itself.  */
12728       use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
12729       gcc_assert (use);
12730       defs = DF_REF_CHAIN (use);
12731
12732       /* Require a single definition.  */
12733       if (defs && defs->next == NULL)
12734         {
12735           def = defs->ref;
12736           if (DF_REF_IS_ARTIFICIAL (def))
12737             {
12738               /* Replace the incoming value of $sp with
12739                  virtual_incoming_args_rtx.  */
12740               if (x == stack_pointer_rtx
12741                   && DF_REF_BB (def) == ENTRY_BLOCK_PTR)
12742                 newx = virtual_incoming_args_rtx;
12743             }
12744           else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
12745                                    DF_REF_BB (def)))
12746             {
12747               /* Make sure that DEF_INSN is a single set of REG.  */
12748               def_insn = DF_REF_INSN (def);
12749               if (NONJUMP_INSN_P (def_insn))
12750                 {
12751                   set = single_set (def_insn);
12752                   if (set && rtx_equal_p (SET_DEST (set), x))
12753                     {
12754                       /* Prefer to use notes, since the def-use chains
12755                          are often shorter.  */
12756                       note = find_reg_equal_equiv_note (def_insn);
12757                       if (note)
12758                         newx = XEXP (note, 0);
12759                       else
12760                         newx = SET_SRC (set);
12761                       newx = r10k_simplify_address (newx, def_insn);
12762                     }
12763                 }
12764             }
12765         }
12766     }
12767   if (newx && r10k_simplified_address_p (newx))
12768     return newx;
12769   return x;
12770 }
12771
12772 /* Return true if ADDRESS is known to be an uncached address
12773    on R10K systems.  */
12774
12775 static bool
12776 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
12777 {
12778   unsigned HOST_WIDE_INT upper;
12779
12780   /* Check for KSEG1.  */
12781   if (address + 0x60000000 < 0x20000000)
12782     return true;
12783
12784   /* Check for uncached XKPHYS addresses.  */
12785   if (Pmode == DImode)
12786     {
12787       upper = (address >> 40) & 0xf9ffff;
12788       if (upper == 0x900000 || upper == 0xb80000)
12789         return true;
12790     }
12791   return false;
12792 }
12793
12794 /* Return true if we can prove that an access to address X in instruction
12795    INSN would be safe from R10K speculation.  This X is a general
12796    expression; it might not be a legitimate address.  */
12797
12798 static bool
12799 r10k_safe_address_p (rtx x, rtx insn)
12800 {
12801   rtx base, offset;
12802   HOST_WIDE_INT offset_val;
12803
12804   x = r10k_simplify_address (x, insn);
12805
12806   /* Check for references to the stack frame.  It doesn't really matter
12807      how much of the frame has been allocated at INSN; -mr10k-cache-barrier
12808      allows us to assume that accesses to any part of the eventual frame
12809      is safe from speculation at any point in the function.  */
12810   mips_split_plus (x, &base, &offset_val);
12811   if (base == virtual_incoming_args_rtx
12812       && offset_val >= -cfun->machine->frame.total_size
12813       && offset_val < cfun->machine->frame.args_size)
12814     return true;
12815
12816   /* Check for uncached addresses.  */
12817   if (CONST_INT_P (x))
12818     return r10k_uncached_address_p (INTVAL (x));
12819
12820   /* Check for accesses to a static object.  */
12821   split_const (x, &base, &offset);
12822   return offset_within_block_p (base, INTVAL (offset));
12823 }
12824
12825 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
12826    an in-range access to an automatic variable, or to an object with
12827    a link-time-constant address.  */
12828
12829 static bool
12830 r10k_safe_mem_expr_p (tree expr, rtx offset)
12831 {
12832   if (expr == NULL_TREE
12833       || offset == NULL_RTX
12834       || !CONST_INT_P (offset)
12835       || INTVAL (offset) < 0
12836       || INTVAL (offset) >= int_size_in_bytes (TREE_TYPE (expr)))
12837     return false;
12838
12839   while (TREE_CODE (expr) == COMPONENT_REF)
12840     {
12841       expr = TREE_OPERAND (expr, 0);
12842       if (expr == NULL_TREE)
12843         return false;
12844     }
12845
12846   return DECL_P (expr);
12847 }
12848
12849 /* A for_each_rtx callback for which DATA points to the instruction
12850    containing *X.  Stop the search if we find a MEM that is not safe
12851    from R10K speculation.  */
12852
12853 static int
12854 r10k_needs_protection_p_1 (rtx *loc, void *data)
12855 {
12856   rtx mem;
12857
12858   mem = *loc;
12859   if (!MEM_P (mem))
12860     return 0;
12861
12862   if (r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
12863     return -1;
12864
12865   if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
12866     return -1;
12867
12868   return 1;
12869 }
12870
12871 /* A note_stores callback for which DATA points to an instruction pointer.
12872    If *DATA is nonnull, make it null if it X contains a MEM that is not
12873    safe from R10K speculation.  */
12874
12875 static void
12876 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
12877                                void *data)
12878 {
12879   rtx *insn_ptr;
12880
12881   insn_ptr = (rtx *) data;
12882   if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
12883     *insn_ptr = NULL_RTX;
12884 }
12885
12886 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
12887    Return nonzero if the call is not to a declared function.  */
12888
12889 static int
12890 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
12891 {
12892   rtx x;
12893
12894   x = *loc;
12895   if (!MEM_P (x))
12896     return 0;
12897
12898   x = XEXP (x, 0);
12899   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
12900     return -1;
12901
12902   return 1;
12903 }
12904
12905 /* Return true if instruction INSN needs to be protected by an R10K
12906    cache barrier.  */
12907
12908 static bool
12909 r10k_needs_protection_p (rtx insn)
12910 {
12911   if (CALL_P (insn))
12912     return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
12913
12914   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
12915     {
12916       note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
12917       return insn == NULL_RTX;
12918     }
12919
12920   return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
12921 }
12922
12923 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
12924    edge is unconditional.  */
12925
12926 static bool
12927 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
12928 {
12929   edge_iterator ei;
12930   edge e;
12931
12932   FOR_EACH_EDGE (e, ei, bb->preds)
12933     if (!single_succ_p (e->src)
12934         || !TEST_BIT (protected_bbs, e->src->index)
12935         || (e->flags & EDGE_COMPLEX) != 0)
12936       return false;
12937   return true;
12938 }
12939
12940 /* Implement -mr10k-cache-barrier= for the current function.  */
12941
12942 static void
12943 r10k_insert_cache_barriers (void)
12944 {
12945   int *rev_post_order;
12946   unsigned int i, n;
12947   basic_block bb;
12948   sbitmap protected_bbs;
12949   rtx insn, end, unprotected_region;
12950
12951   if (TARGET_MIPS16)
12952     {
12953       sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
12954       return;
12955     }
12956
12957   /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  */
12958   compute_bb_for_insn ();
12959
12960   /* Create def-use chains.  */
12961   df_set_flags (DF_EQ_NOTES);
12962   df_chain_add_problem (DF_UD_CHAIN);
12963   df_analyze ();
12964
12965   /* Calculate dominators.  */
12966   calculate_dominance_info (CDI_DOMINATORS);
12967
12968   /* Bit X of PROTECTED_BBS is set if the last operation in basic block
12969      X is protected by a cache barrier.  */
12970   protected_bbs = sbitmap_alloc (last_basic_block);
12971   sbitmap_zero (protected_bbs);
12972
12973   /* Iterate over the basic blocks in reverse post-order.  */
12974   rev_post_order = XNEWVEC (int, last_basic_block);
12975   n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
12976   for (i = 0; i < n; i++)
12977     {
12978       bb = BASIC_BLOCK (rev_post_order[i]);
12979
12980       /* If this block is only reached by unconditional edges, and if the
12981          source of every edge is protected, the beginning of the block is
12982          also protected.  */
12983       if (r10k_protected_bb_p (bb, protected_bbs))
12984         unprotected_region = NULL_RTX;
12985       else
12986         unprotected_region = pc_rtx;
12987       end = NEXT_INSN (BB_END (bb));
12988
12989       /* UNPROTECTED_REGION is:
12990
12991          - null if we are processing a protected region,
12992          - pc_rtx if we are processing an unprotected region but have
12993            not yet found the first instruction in it
12994          - the first instruction in an unprotected region otherwise.  */
12995       for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
12996         {
12997           if (unprotected_region && INSN_P (insn))
12998             {
12999               if (recog_memoized (insn) == CODE_FOR_mips_cache)
13000                 /* This CACHE instruction protects the following code.  */
13001                 unprotected_region = NULL_RTX;
13002               else
13003                 {
13004                   /* See if INSN is the first instruction in this
13005                      unprotected region.  */
13006                   if (unprotected_region == pc_rtx)
13007                     unprotected_region = insn;
13008
13009                   /* See if INSN needs to be protected.  If so,
13010                      we must insert a cache barrier somewhere between
13011                      PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
13012                      clear which position is better performance-wise,
13013                      but as a tie-breaker, we assume that it is better
13014                      to allow delay slots to be back-filled where
13015                      possible, and that it is better not to insert
13016                      barriers in the middle of already-scheduled code.
13017                      We therefore insert the barrier at the beginning
13018                      of the region.  */
13019                   if (r10k_needs_protection_p (insn))
13020                     {
13021                       emit_insn_before (gen_r10k_cache_barrier (),
13022                                         unprotected_region);
13023                       unprotected_region = NULL_RTX;
13024                     }
13025                 }
13026             }
13027
13028           if (CALL_P (insn))
13029             /* The called function is not required to protect the exit path.
13030                The code that follows a call is therefore unprotected.  */
13031             unprotected_region = pc_rtx;
13032         }
13033
13034       /* Record whether the end of this block is protected.  */
13035       if (unprotected_region == NULL_RTX)
13036         SET_BIT (protected_bbs, bb->index);
13037     }
13038   XDELETEVEC (rev_post_order);
13039
13040   sbitmap_free (protected_bbs);
13041
13042   free_dominance_info (CDI_DOMINATORS);
13043
13044   df_finish_pass (false);
13045
13046   free_bb_for_insn ();
13047 }
13048 \f
13049 /* A temporary variable used by for_each_rtx callbacks, etc.  */
13050 static rtx mips_sim_insn;
13051
13052 /* A structure representing the state of the processor pipeline.
13053    Used by the mips_sim_* family of functions.  */
13054 struct mips_sim {
13055   /* The maximum number of instructions that can be issued in a cycle.
13056      (Caches mips_issue_rate.)  */
13057   unsigned int issue_rate;
13058
13059   /* The current simulation time.  */
13060   unsigned int time;
13061
13062   /* How many more instructions can be issued in the current cycle.  */
13063   unsigned int insns_left;
13064
13065   /* LAST_SET[X].INSN is the last instruction to set register X.
13066      LAST_SET[X].TIME is the time at which that instruction was issued.
13067      INSN is null if no instruction has yet set register X.  */
13068   struct {
13069     rtx insn;
13070     unsigned int time;
13071   } last_set[FIRST_PSEUDO_REGISTER];
13072
13073   /* The pipeline's current DFA state.  */
13074   state_t dfa_state;
13075 };
13076
13077 /* Reset STATE to the initial simulation state.  */
13078
13079 static void
13080 mips_sim_reset (struct mips_sim *state)
13081 {
13082   state->time = 0;
13083   state->insns_left = state->issue_rate;
13084   memset (&state->last_set, 0, sizeof (state->last_set));
13085   state_reset (state->dfa_state);
13086 }
13087
13088 /* Initialize STATE before its first use.  DFA_STATE points to an
13089    allocated but uninitialized DFA state.  */
13090
13091 static void
13092 mips_sim_init (struct mips_sim *state, state_t dfa_state)
13093 {
13094   state->issue_rate = mips_issue_rate ();
13095   state->dfa_state = dfa_state;
13096   mips_sim_reset (state);
13097 }
13098
13099 /* Advance STATE by one clock cycle.  */
13100
13101 static void
13102 mips_sim_next_cycle (struct mips_sim *state)
13103 {
13104   state->time++;
13105   state->insns_left = state->issue_rate;
13106   state_transition (state->dfa_state, 0);
13107 }
13108
13109 /* Advance simulation state STATE until instruction INSN can read
13110    register REG.  */
13111
13112 static void
13113 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
13114 {
13115   unsigned int regno, end_regno;
13116
13117   end_regno = END_REGNO (reg);
13118   for (regno = REGNO (reg); regno < end_regno; regno++)
13119     if (state->last_set[regno].insn != 0)
13120       {
13121         unsigned int t;
13122
13123         t = (state->last_set[regno].time
13124              + insn_latency (state->last_set[regno].insn, insn));
13125         while (state->time < t)
13126           mips_sim_next_cycle (state);
13127     }
13128 }
13129
13130 /* A for_each_rtx callback.  If *X is a register, advance simulation state
13131    DATA until mips_sim_insn can read the register's value.  */
13132
13133 static int
13134 mips_sim_wait_regs_2 (rtx *x, void *data)
13135 {
13136   if (REG_P (*x))
13137     mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
13138   return 0;
13139 }
13140
13141 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
13142
13143 static void
13144 mips_sim_wait_regs_1 (rtx *x, void *data)
13145 {
13146   for_each_rtx (x, mips_sim_wait_regs_2, data);
13147 }
13148
13149 /* Advance simulation state STATE until all of INSN's register
13150    dependencies are satisfied.  */
13151
13152 static void
13153 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
13154 {
13155   mips_sim_insn = insn;
13156   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
13157 }
13158
13159 /* Advance simulation state STATE until the units required by
13160    instruction INSN are available.  */
13161
13162 static void
13163 mips_sim_wait_units (struct mips_sim *state, rtx insn)
13164 {
13165   state_t tmp_state;
13166
13167   tmp_state = alloca (state_size ());
13168   while (state->insns_left == 0
13169          || (memcpy (tmp_state, state->dfa_state, state_size ()),
13170              state_transition (tmp_state, insn) >= 0))
13171     mips_sim_next_cycle (state);
13172 }
13173
13174 /* Advance simulation state STATE until INSN is ready to issue.  */
13175
13176 static void
13177 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
13178 {
13179   mips_sim_wait_regs (state, insn);
13180   mips_sim_wait_units (state, insn);
13181 }
13182
13183 /* mips_sim_insn has just set X.  Update the LAST_SET array
13184    in simulation state DATA.  */
13185
13186 static void
13187 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
13188 {
13189   struct mips_sim *state;
13190
13191   state = (struct mips_sim *) data;
13192   if (REG_P (x))
13193     {
13194       unsigned int regno, end_regno;
13195
13196       end_regno = END_REGNO (x);
13197       for (regno = REGNO (x); regno < end_regno; regno++)
13198         {
13199           state->last_set[regno].insn = mips_sim_insn;
13200           state->last_set[regno].time = state->time;
13201         }
13202     }
13203 }
13204
13205 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
13206    can issue immediately (i.e., that mips_sim_wait_insn has already
13207    been called).  */
13208
13209 static void
13210 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
13211 {
13212   state_transition (state->dfa_state, insn);
13213   state->insns_left--;
13214
13215   mips_sim_insn = insn;
13216   note_stores (PATTERN (insn), mips_sim_record_set, state);
13217 }
13218
13219 /* Simulate issuing a NOP in state STATE.  */
13220
13221 static void
13222 mips_sim_issue_nop (struct mips_sim *state)
13223 {
13224   if (state->insns_left == 0)
13225     mips_sim_next_cycle (state);
13226   state->insns_left--;
13227 }
13228
13229 /* Update simulation state STATE so that it's ready to accept the instruction
13230    after INSN.  INSN should be part of the main rtl chain, not a member of a
13231    SEQUENCE.  */
13232
13233 static void
13234 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
13235 {
13236   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
13237   if (JUMP_P (insn))
13238     mips_sim_issue_nop (state);
13239
13240   switch (GET_CODE (SEQ_BEGIN (insn)))
13241     {
13242     case CODE_LABEL:
13243     case CALL_INSN:
13244       /* We can't predict the processor state after a call or label.  */
13245       mips_sim_reset (state);
13246       break;
13247
13248     case JUMP_INSN:
13249       /* The delay slots of branch likely instructions are only executed
13250          when the branch is taken.  Therefore, if the caller has simulated
13251          the delay slot instruction, STATE does not really reflect the state
13252          of the pipeline for the instruction after the delay slot.  Also,
13253          branch likely instructions tend to incur a penalty when not taken,
13254          so there will probably be an extra delay between the branch and
13255          the instruction after the delay slot.  */
13256       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
13257         mips_sim_reset (state);
13258       break;
13259
13260     default:
13261       break;
13262     }
13263 }
13264 \f
13265 /* The VR4130 pipeline issues aligned pairs of instructions together,
13266    but it stalls the second instruction if it depends on the first.
13267    In order to cut down the amount of logic required, this dependence
13268    check is not based on a full instruction decode.  Instead, any non-SPECIAL
13269    instruction is assumed to modify the register specified by bits 20-16
13270    (which is usually the "rt" field).
13271
13272    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
13273    input, so we can end up with a false dependence between the branch
13274    and its delay slot.  If this situation occurs in instruction INSN,
13275    try to avoid it by swapping rs and rt.  */
13276
13277 static void
13278 vr4130_avoid_branch_rt_conflict (rtx insn)
13279 {
13280   rtx first, second;
13281
13282   first = SEQ_BEGIN (insn);
13283   second = SEQ_END (insn);
13284   if (JUMP_P (first)
13285       && NONJUMP_INSN_P (second)
13286       && GET_CODE (PATTERN (first)) == SET
13287       && GET_CODE (SET_DEST (PATTERN (first))) == PC
13288       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
13289     {
13290       /* Check for the right kind of condition.  */
13291       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
13292       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
13293           && REG_P (XEXP (cond, 0))
13294           && REG_P (XEXP (cond, 1))
13295           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
13296           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
13297         {
13298           /* SECOND mentions the rt register but not the rs register.  */
13299           rtx tmp = XEXP (cond, 0);
13300           XEXP (cond, 0) = XEXP (cond, 1);
13301           XEXP (cond, 1) = tmp;
13302         }
13303     }
13304 }
13305
13306 /* Implement -mvr4130-align.  Go through each basic block and simulate the
13307    processor pipeline.  If we find that a pair of instructions could execute
13308    in parallel, and the first of those instructions is not 8-byte aligned,
13309    insert a nop to make it aligned.  */
13310
13311 static void
13312 vr4130_align_insns (void)
13313 {
13314   struct mips_sim state;
13315   rtx insn, subinsn, last, last2, next;
13316   bool aligned_p;
13317
13318   dfa_start ();
13319
13320   /* LAST is the last instruction before INSN to have a nonzero length.
13321      LAST2 is the last such instruction before LAST.  */
13322   last = 0;
13323   last2 = 0;
13324
13325   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
13326   aligned_p = true;
13327
13328   mips_sim_init (&state, alloca (state_size ()));
13329   for (insn = get_insns (); insn != 0; insn = next)
13330     {
13331       unsigned int length;
13332
13333       next = NEXT_INSN (insn);
13334
13335       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
13336          This isn't really related to the alignment pass, but we do it on
13337          the fly to avoid a separate instruction walk.  */
13338       vr4130_avoid_branch_rt_conflict (insn);
13339
13340       if (USEFUL_INSN_P (insn))
13341         FOR_EACH_SUBINSN (subinsn, insn)
13342           {
13343             mips_sim_wait_insn (&state, subinsn);
13344
13345             /* If we want this instruction to issue in parallel with the
13346                previous one, make sure that the previous instruction is
13347                aligned.  There are several reasons why this isn't worthwhile
13348                when the second instruction is a call:
13349
13350                   - Calls are less likely to be performance critical,
13351                   - There's a good chance that the delay slot can execute
13352                     in parallel with the call.
13353                   - The return address would then be unaligned.
13354
13355                In general, if we're going to insert a nop between instructions
13356                X and Y, it's better to insert it immediately after X.  That
13357                way, if the nop makes Y aligned, it will also align any labels
13358                between X and Y.  */
13359             if (state.insns_left != state.issue_rate
13360                 && !CALL_P (subinsn))
13361               {
13362                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
13363                   {
13364                     /* SUBINSN is the first instruction in INSN and INSN is
13365                        aligned.  We want to align the previous instruction
13366                        instead, so insert a nop between LAST2 and LAST.
13367
13368                        Note that LAST could be either a single instruction
13369                        or a branch with a delay slot.  In the latter case,
13370                        LAST, like INSN, is already aligned, but the delay
13371                        slot must have some extra delay that stops it from
13372                        issuing at the same time as the branch.  We therefore
13373                        insert a nop before the branch in order to align its
13374                        delay slot.  */
13375                     emit_insn_after (gen_nop (), last2);
13376                     aligned_p = false;
13377                   }
13378                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
13379                   {
13380                     /* SUBINSN is the delay slot of INSN, but INSN is
13381                        currently unaligned.  Insert a nop between
13382                        LAST and INSN to align it.  */
13383                     emit_insn_after (gen_nop (), last);
13384                     aligned_p = true;
13385                   }
13386               }
13387             mips_sim_issue_insn (&state, subinsn);
13388           }
13389       mips_sim_finish_insn (&state, insn);
13390
13391       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
13392       length = get_attr_length (insn);
13393       if (length > 0)
13394         {
13395           /* If the instruction is an asm statement or multi-instruction
13396              mips.md patern, the length is only an estimate.  Insert an
13397              8 byte alignment after it so that the following instructions
13398              can be handled correctly.  */
13399           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
13400               && (recog_memoized (insn) < 0 || length >= 8))
13401             {
13402               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
13403               next = NEXT_INSN (next);
13404               mips_sim_next_cycle (&state);
13405               aligned_p = true;
13406             }
13407           else if (length & 4)
13408             aligned_p = !aligned_p;
13409           last2 = last;
13410           last = insn;
13411         }
13412
13413       /* See whether INSN is an aligned label.  */
13414       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
13415         aligned_p = true;
13416     }
13417   dfa_finish ();
13418 }
13419 \f
13420 /* This structure records that the current function has a LO_SUM
13421    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
13422    the largest offset applied to BASE by all such LO_SUMs.  */
13423 struct mips_lo_sum_offset {
13424   rtx base;
13425   HOST_WIDE_INT offset;
13426 };
13427
13428 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
13429
13430 static hashval_t
13431 mips_hash_base (rtx base)
13432 {
13433   int do_not_record_p;
13434
13435   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
13436 }
13437
13438 /* Hash-table callbacks for mips_lo_sum_offsets.  */
13439
13440 static hashval_t
13441 mips_lo_sum_offset_hash (const void *entry)
13442 {
13443   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
13444 }
13445
13446 static int
13447 mips_lo_sum_offset_eq (const void *entry, const void *value)
13448 {
13449   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
13450                       (const_rtx) value);
13451 }
13452
13453 /* Look up symbolic constant X in HTAB, which is a hash table of
13454    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
13455    paired with a recorded LO_SUM, otherwise record X in the table.  */
13456
13457 static bool
13458 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
13459 {
13460   rtx base, offset;
13461   void **slot;
13462   struct mips_lo_sum_offset *entry;
13463
13464   /* Split X into a base and offset.  */
13465   split_const (x, &base, &offset);
13466   if (UNSPEC_ADDRESS_P (base))
13467     base = UNSPEC_ADDRESS (base);
13468
13469   /* Look up the base in the hash table.  */
13470   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
13471   if (slot == NULL)
13472     return false;
13473
13474   entry = (struct mips_lo_sum_offset *) *slot;
13475   if (option == INSERT)
13476     {
13477       if (entry == NULL)
13478         {
13479           entry = XNEW (struct mips_lo_sum_offset);
13480           entry->base = base;
13481           entry->offset = INTVAL (offset);
13482           *slot = entry;
13483         }
13484       else
13485         {
13486           if (INTVAL (offset) > entry->offset)
13487             entry->offset = INTVAL (offset);
13488         }
13489     }
13490   return INTVAL (offset) <= entry->offset;
13491 }
13492
13493 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
13494    Record every LO_SUM in *LOC.  */
13495
13496 static int
13497 mips_record_lo_sum (rtx *loc, void *data)
13498 {
13499   if (GET_CODE (*loc) == LO_SUM)
13500     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
13501   return 0;
13502 }
13503
13504 /* Return true if INSN is a SET of an orphaned high-part relocation.
13505    HTAB is a hash table of mips_lo_sum_offsets that describes all the
13506    LO_SUMs in the current function.  */
13507
13508 static bool
13509 mips_orphaned_high_part_p (htab_t htab, rtx insn)
13510 {
13511   enum mips_symbol_type type;
13512   rtx x, set;
13513
13514   set = single_set (insn);
13515   if (set)
13516     {
13517       /* Check for %his.  */
13518       x = SET_SRC (set);
13519       if (GET_CODE (x) == HIGH
13520           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
13521         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
13522
13523       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
13524       if (GET_CODE (x) == UNSPEC
13525           && XINT (x, 1) == UNSPEC_LOAD_GOT
13526           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
13527                                        SYMBOL_CONTEXT_LEA, &type)
13528           && type == SYMBOL_GOTOFF_PAGE)
13529         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
13530     }
13531   return false;
13532 }
13533
13534 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
13535    INSN and a previous instruction, avoid it by inserting nops after
13536    instruction AFTER.
13537
13538    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
13539    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
13540    before using the value of that register.  *HILO_DELAY counts the
13541    number of instructions since the last hilo hazard (that is,
13542    the number of instructions since the last MFLO or MFHI).
13543
13544    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
13545    for the next instruction.
13546
13547    LO_REG is an rtx for the LO register, used in dependence checking.  */
13548
13549 static void
13550 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
13551                    rtx *delayed_reg, rtx lo_reg)
13552 {
13553   rtx pattern, set;
13554   int nops, ninsns;
13555
13556   pattern = PATTERN (insn);
13557
13558   /* Do not put the whole function in .set noreorder if it contains
13559      an asm statement.  We don't know whether there will be hazards
13560      between the asm statement and the gcc-generated code.  */
13561   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
13562     cfun->machine->all_noreorder_p = false;
13563
13564   /* Ignore zero-length instructions (barriers and the like).  */
13565   ninsns = get_attr_length (insn) / 4;
13566   if (ninsns == 0)
13567     return;
13568
13569   /* Work out how many nops are needed.  Note that we only care about
13570      registers that are explicitly mentioned in the instruction's pattern.
13571      It doesn't matter that calls use the argument registers or that they
13572      clobber hi and lo.  */
13573   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
13574     nops = 2 - *hilo_delay;
13575   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
13576     nops = 1;
13577   else
13578     nops = 0;
13579
13580   /* Insert the nops between this instruction and the previous one.
13581      Each new nop takes us further from the last hilo hazard.  */
13582   *hilo_delay += nops;
13583   while (nops-- > 0)
13584     emit_insn_after (gen_hazard_nop (), after);
13585
13586   /* Set up the state for the next instruction.  */
13587   *hilo_delay += ninsns;
13588   *delayed_reg = 0;
13589   if (INSN_CODE (insn) >= 0)
13590     switch (get_attr_hazard (insn))
13591       {
13592       case HAZARD_NONE:
13593         break;
13594
13595       case HAZARD_HILO:
13596         *hilo_delay = 0;
13597         break;
13598
13599       case HAZARD_DELAY:
13600         set = single_set (insn);
13601         gcc_assert (set);
13602         *delayed_reg = SET_DEST (set);
13603         break;
13604       }
13605 }
13606
13607 /* Go through the instruction stream and insert nops where necessary.
13608    Also delete any high-part relocations whose partnering low parts
13609    are now all dead.  See if the whole function can then be put into
13610    .set noreorder and .set nomacro.  */
13611
13612 static void
13613 mips_reorg_process_insns (void)
13614 {
13615   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
13616   int hilo_delay;
13617   htab_t htab;
13618
13619   /* Force all instructions to be split into their final form.  */
13620   split_all_insns_noflow ();
13621
13622   /* Recalculate instruction lengths without taking nops into account.  */
13623   cfun->machine->ignore_hazard_length_p = true;
13624   shorten_branches (get_insns ());
13625
13626   cfun->machine->all_noreorder_p = true;
13627
13628   /* We don't track MIPS16 PC-relative offsets closely enough to make
13629      a good job of "set .noreorder" code in MIPS16 mode.  */
13630   if (TARGET_MIPS16)
13631     cfun->machine->all_noreorder_p = false;
13632
13633   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
13634   if (!TARGET_EXPLICIT_RELOCS)
13635     cfun->machine->all_noreorder_p = false;
13636
13637   /* Profiled functions can't be all noreorder because the profiler
13638      support uses assembler macros.  */
13639   if (crtl->profile)
13640     cfun->machine->all_noreorder_p = false;
13641
13642   /* Code compiled with -mfix-vr4120 can't be all noreorder because
13643      we rely on the assembler to work around some errata.  */
13644   if (TARGET_FIX_VR4120)
13645     cfun->machine->all_noreorder_p = false;
13646
13647   /* The same is true for -mfix-vr4130 if we might generate MFLO or
13648      MFHI instructions.  Note that we avoid using MFLO and MFHI if
13649      the VR4130 MACC and DMACC instructions are available instead;
13650      see the *mfhilo_{si,di}_macc patterns.  */
13651   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
13652     cfun->machine->all_noreorder_p = false;
13653
13654   htab = htab_create (37, mips_lo_sum_offset_hash,
13655                       mips_lo_sum_offset_eq, free);
13656
13657   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
13658   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
13659     FOR_EACH_SUBINSN (subinsn, insn)
13660       if (INSN_P (subinsn))
13661         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
13662
13663   last_insn = 0;
13664   hilo_delay = 2;
13665   delayed_reg = 0;
13666   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
13667
13668   /* Make a second pass over the instructions.  Delete orphaned
13669      high-part relocations or turn them into NOPs.  Avoid hazards
13670      by inserting NOPs.  */
13671   for (insn = get_insns (); insn != 0; insn = next_insn)
13672     {
13673       next_insn = NEXT_INSN (insn);
13674       if (INSN_P (insn))
13675         {
13676           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
13677             {
13678               /* If we find an orphaned high-part relocation in a delay
13679                  slot, it's easier to turn that instruction into a NOP than
13680                  to delete it.  The delay slot will be a NOP either way.  */
13681               FOR_EACH_SUBINSN (subinsn, insn)
13682                 if (INSN_P (subinsn))
13683                   {
13684                     if (mips_orphaned_high_part_p (htab, subinsn))
13685                       {
13686                         PATTERN (subinsn) = gen_nop ();
13687                         INSN_CODE (subinsn) = CODE_FOR_nop;
13688                       }
13689                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
13690                                        &delayed_reg, lo_reg);
13691                   }
13692               last_insn = insn;
13693             }
13694           else
13695             {
13696               /* INSN is a single instruction.  Delete it if it's an
13697                  orphaned high-part relocation.  */
13698               if (mips_orphaned_high_part_p (htab, insn))
13699                 delete_insn (insn);
13700               /* Also delete cache barriers if the last instruction
13701                  was an annulled branch.  INSN will not be speculatively
13702                  executed.  */
13703               else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
13704                        && last_insn
13705                        && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
13706                 delete_insn (insn);
13707               else
13708                 {
13709                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
13710                                      &delayed_reg, lo_reg);
13711                   last_insn = insn;
13712                 }
13713             }
13714         }
13715     }
13716
13717   htab_delete (htab);
13718 }
13719
13720 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
13721
13722 static void
13723 mips_reorg (void)
13724 {
13725   mips16_lay_out_constants ();
13726   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
13727     r10k_insert_cache_barriers ();
13728   if (optimize > 0 && flag_delayed_branch)
13729     dbr_schedule (get_insns ());
13730   mips_reorg_process_insns ();
13731   if (!TARGET_MIPS16
13732       && TARGET_EXPLICIT_RELOCS
13733       && TUNE_MIPS4130
13734       && TARGET_VR4130_ALIGN)
13735     vr4130_align_insns ();
13736 }
13737 \f
13738 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
13739    in order to avoid duplicating too much logic from elsewhere.  */
13740
13741 static void
13742 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
13743                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
13744                       tree function)
13745 {
13746   rtx this_rtx, temp1, temp2, insn, fnaddr;
13747   bool use_sibcall_p;
13748
13749   /* Pretend to be a post-reload pass while generating rtl.  */
13750   reload_completed = 1;
13751
13752   /* Mark the end of the (empty) prologue.  */
13753   emit_note (NOTE_INSN_PROLOGUE_END);
13754
13755   /* Determine if we can use a sibcall to call FUNCTION directly.  */
13756   fnaddr = XEXP (DECL_RTL (function), 0);
13757   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
13758                    && const_call_insn_operand (fnaddr, Pmode));
13759
13760   /* Determine if we need to load FNADDR from the GOT.  */
13761   if (!use_sibcall_p
13762       && (mips_got_symbol_type_p
13763           (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
13764     {
13765       /* Pick a global pointer.  Use a call-clobbered register if
13766          TARGET_CALL_SAVED_GP.  */
13767       cfun->machine->global_pointer
13768         = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
13769       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
13770
13771       /* Set up the global pointer for n32 or n64 abicalls.  */
13772       mips_emit_loadgp ();
13773     }
13774
13775   /* We need two temporary registers in some cases.  */
13776   temp1 = gen_rtx_REG (Pmode, 2);
13777   temp2 = gen_rtx_REG (Pmode, 3);
13778
13779   /* Find out which register contains the "this" pointer.  */
13780   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
13781     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
13782   else
13783     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
13784
13785   /* Add DELTA to THIS_RTX.  */
13786   if (delta != 0)
13787     {
13788       rtx offset = GEN_INT (delta);
13789       if (!SMALL_OPERAND (delta))
13790         {
13791           mips_emit_move (temp1, offset);
13792           offset = temp1;
13793         }
13794       emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
13795     }
13796
13797   /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
13798   if (vcall_offset != 0)
13799     {
13800       rtx addr;
13801
13802       /* Set TEMP1 to *THIS_RTX.  */
13803       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
13804
13805       /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
13806       addr = mips_add_offset (temp2, temp1, vcall_offset);
13807
13808       /* Load the offset and add it to THIS_RTX.  */
13809       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
13810       emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
13811     }
13812
13813   /* Jump to the target function.  Use a sibcall if direct jumps are
13814      allowed, otherwise load the address into a register first.  */
13815   if (use_sibcall_p)
13816     {
13817       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
13818       SIBLING_CALL_P (insn) = 1;
13819     }
13820   else
13821     {
13822       /* This is messy.  GAS treats "la $25,foo" as part of a call
13823          sequence and may allow a global "foo" to be lazily bound.
13824          The general move patterns therefore reject this combination.
13825
13826          In this context, lazy binding would actually be OK
13827          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
13828          TARGET_CALL_SAVED_GP; see mips_load_call_address.
13829          We must therefore load the address via a temporary
13830          register if mips_dangerous_for_la25_p.
13831
13832          If we jump to the temporary register rather than $25,
13833          the assembler can use the move insn to fill the jump's
13834          delay slot.
13835
13836          We can use the same technique for MIPS16 code, where $25
13837          is not a valid JR register.  */
13838       if (TARGET_USE_PIC_FN_ADDR_REG
13839           && !TARGET_MIPS16
13840           && !mips_dangerous_for_la25_p (fnaddr))
13841         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
13842       mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
13843
13844       if (TARGET_USE_PIC_FN_ADDR_REG
13845           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
13846         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
13847       emit_jump_insn (gen_indirect_jump (temp1));
13848     }
13849
13850   /* Run just enough of rest_of_compilation.  This sequence was
13851      "borrowed" from alpha.c.  */
13852   insn = get_insns ();
13853   insn_locators_alloc ();
13854   split_all_insns_noflow ();
13855   mips16_lay_out_constants ();
13856   shorten_branches (insn);
13857   final_start_function (insn, file, 1);
13858   final (insn, file, 1);
13859   final_end_function ();
13860   free_after_compilation (cfun);
13861
13862   /* Clean up the vars set above.  Note that final_end_function resets
13863      the global pointer for us.  */
13864   reload_completed = 0;
13865 }
13866 \f
13867 /* The last argument passed to mips_set_mips16_mode, or negative if the
13868    function hasn't been called yet.
13869
13870    There are two copies of this information.  One is saved and restored
13871    by the PCH process while the other is specific to this compiler
13872    invocation.  The information calculated by mips_set_mips16_mode
13873    is invalid unless the two variables are the same.  */
13874 static int was_mips16_p = -1;
13875 static GTY(()) int was_mips16_pch_p = -1;
13876
13877 /* Set up the target-dependent global state so that it matches the
13878    current function's ISA mode.  */
13879
13880 static void
13881 mips_set_mips16_mode (int mips16_p)
13882 {
13883   if (mips16_p == was_mips16_p
13884       && mips16_p == was_mips16_pch_p)
13885     return;
13886
13887   /* Restore base settings of various flags.  */
13888   target_flags = mips_base_target_flags;
13889   flag_schedule_insns = mips_base_schedule_insns;
13890   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
13891   flag_move_loop_invariants = mips_base_move_loop_invariants;
13892   align_loops = mips_base_align_loops;
13893   align_jumps = mips_base_align_jumps;
13894   align_functions = mips_base_align_functions;
13895
13896   if (mips16_p)
13897     {
13898       /* Switch to MIPS16 mode.  */
13899       target_flags |= MASK_MIPS16;
13900
13901       /* Don't run the scheduler before reload, since it tends to
13902          increase register pressure.  */
13903       flag_schedule_insns = 0;
13904
13905       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
13906          the whole function to be in a single section.  */
13907       flag_reorder_blocks_and_partition = 0;
13908
13909       /* Don't move loop invariants, because it tends to increase
13910          register pressure.  It also introduces an extra move in cases
13911          where the constant is the first operand in a two-operand binary
13912          instruction, or when it forms a register argument to a functon
13913          call.  */
13914       flag_move_loop_invariants = 0;
13915
13916       target_flags |= MASK_EXPLICIT_RELOCS;
13917
13918       /* Experiments suggest we get the best overall section-anchor
13919          results from using the range of an unextended LW or SW.  Code
13920          that makes heavy use of byte or short accesses can do better
13921          with ranges of 0...31 and 0...63 respectively, but most code is
13922          sensitive to the range of LW and SW instead.  */
13923       targetm.min_anchor_offset = 0;
13924       targetm.max_anchor_offset = 127;
13925
13926       if (flag_pic && !TARGET_OLDABI)
13927         sorry ("MIPS16 PIC for ABIs other than o32 and o64");
13928
13929       if (TARGET_XGOT)
13930         sorry ("MIPS16 -mxgot code");
13931
13932       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
13933         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
13934     }
13935   else
13936     {
13937       /* Switch to normal (non-MIPS16) mode.  */
13938       target_flags &= ~MASK_MIPS16;
13939
13940       /* Provide default values for align_* for 64-bit targets.  */
13941       if (TARGET_64BIT)
13942         {
13943           if (align_loops == 0)
13944             align_loops = 8;
13945           if (align_jumps == 0)
13946             align_jumps = 8;
13947           if (align_functions == 0)
13948             align_functions = 8;
13949         }
13950
13951       targetm.min_anchor_offset = -32768;
13952       targetm.max_anchor_offset = 32767;
13953     }
13954
13955   /* (Re)initialize MIPS target internals for new ISA.  */
13956   mips_init_relocs ();
13957
13958   if (was_mips16_p >= 0 || was_mips16_pch_p >= 0)
13959     /* Reinitialize target-dependent state.  */
13960     target_reinit ();
13961
13962   was_mips16_p = mips16_p;
13963   was_mips16_pch_p = mips16_p;
13964 }
13965
13966 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
13967    function should use the MIPS16 ISA and switch modes accordingly.  */
13968
13969 static void
13970 mips_set_current_function (tree fndecl)
13971 {
13972   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
13973 }
13974 \f
13975 /* Allocate a chunk of memory for per-function machine-dependent data.  */
13976
13977 static struct machine_function *
13978 mips_init_machine_status (void)
13979 {
13980   return ((struct machine_function *)
13981           ggc_alloc_cleared (sizeof (struct machine_function)));
13982 }
13983
13984 /* Return the processor associated with the given ISA level, or null
13985    if the ISA isn't valid.  */
13986
13987 static const struct mips_cpu_info *
13988 mips_cpu_info_from_isa (int isa)
13989 {
13990   unsigned int i;
13991
13992   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
13993     if (mips_cpu_info_table[i].isa == isa)
13994       return mips_cpu_info_table + i;
13995
13996   return NULL;
13997 }
13998
13999 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14000    with a final "000" replaced by "k".  Ignore case.
14001
14002    Note: this function is shared between GCC and GAS.  */
14003
14004 static bool
14005 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14006 {
14007   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14008     given++, canonical++;
14009
14010   return ((*given == 0 && *canonical == 0)
14011           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14012 }
14013
14014 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14015    CPU name.  We've traditionally allowed a lot of variation here.
14016
14017    Note: this function is shared between GCC and GAS.  */
14018
14019 static bool
14020 mips_matching_cpu_name_p (const char *canonical, const char *given)
14021 {
14022   /* First see if the name matches exactly, or with a final "000"
14023      turned into "k".  */
14024   if (mips_strict_matching_cpu_name_p (canonical, given))
14025     return true;
14026
14027   /* If not, try comparing based on numerical designation alone.
14028      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14029   if (TOLOWER (*given) == 'r')
14030     given++;
14031   if (!ISDIGIT (*given))
14032     return false;
14033
14034   /* Skip over some well-known prefixes in the canonical name,
14035      hoping to find a number there too.  */
14036   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14037     canonical += 2;
14038   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14039     canonical += 2;
14040   else if (TOLOWER (canonical[0]) == 'r')
14041     canonical += 1;
14042
14043   return mips_strict_matching_cpu_name_p (canonical, given);
14044 }
14045
14046 /* Return the mips_cpu_info entry for the processor or ISA given
14047    by CPU_STRING.  Return null if the string isn't recognized.
14048
14049    A similar function exists in GAS.  */
14050
14051 static const struct mips_cpu_info *
14052 mips_parse_cpu (const char *cpu_string)
14053 {
14054   unsigned int i;
14055   const char *s;
14056
14057   /* In the past, we allowed upper-case CPU names, but it doesn't
14058      work well with the multilib machinery.  */
14059   for (s = cpu_string; *s != 0; s++)
14060     if (ISUPPER (*s))
14061       {
14062         warning (0, "CPU names must be lower case");
14063         break;
14064       }
14065
14066   /* 'from-abi' selects the most compatible architecture for the given
14067      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14068      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14069      version.  */
14070   if (strcasecmp (cpu_string, "from-abi") == 0)
14071     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
14072                                    : ABI_NEEDS_64BIT_REGS ? 3
14073                                    : (TARGET_64BIT ? 3 : 1));
14074
14075   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14076   if (strcasecmp (cpu_string, "default") == 0)
14077     return NULL;
14078
14079   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
14080     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
14081       return mips_cpu_info_table + i;
14082
14083   return NULL;
14084 }
14085
14086 /* Set up globals to generate code for the ISA or processor
14087    described by INFO.  */
14088
14089 static void
14090 mips_set_architecture (const struct mips_cpu_info *info)
14091 {
14092   if (info != 0)
14093     {
14094       mips_arch_info = info;
14095       mips_arch = info->cpu;
14096       mips_isa = info->isa;
14097     }
14098 }
14099
14100 /* Likewise for tuning.  */
14101
14102 static void
14103 mips_set_tune (const struct mips_cpu_info *info)
14104 {
14105   if (info != 0)
14106     {
14107       mips_tune_info = info;
14108       mips_tune = info->cpu;
14109     }
14110 }
14111
14112 /* Implement TARGET_HANDLE_OPTION.  */
14113
14114 static bool
14115 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
14116 {
14117   switch (code)
14118     {
14119     case OPT_mabi_:
14120       if (strcmp (arg, "32") == 0)
14121         mips_abi = ABI_32;
14122       else if (strcmp (arg, "o64") == 0)
14123         mips_abi = ABI_O64;
14124       else if (strcmp (arg, "n32") == 0)
14125         mips_abi = ABI_N32;
14126       else if (strcmp (arg, "64") == 0)
14127         mips_abi = ABI_64;
14128       else if (strcmp (arg, "eabi") == 0)
14129         mips_abi = ABI_EABI;
14130       else
14131         return false;
14132       return true;
14133
14134     case OPT_march_:
14135     case OPT_mtune_:
14136       return mips_parse_cpu (arg) != 0;
14137
14138     case OPT_mips:
14139       mips_isa_option_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
14140       return mips_isa_option_info != 0;
14141
14142     case OPT_mno_flush_func:
14143       mips_cache_flush_func = NULL;
14144       return true;
14145
14146     case OPT_mcode_readable_:
14147       if (strcmp (arg, "yes") == 0)
14148         mips_code_readable = CODE_READABLE_YES;
14149       else if (strcmp (arg, "pcrel") == 0)
14150         mips_code_readable = CODE_READABLE_PCREL;
14151       else if (strcmp (arg, "no") == 0)
14152         mips_code_readable = CODE_READABLE_NO;
14153       else
14154         return false;
14155       return true;
14156
14157     case OPT_mr10k_cache_barrier_:
14158       if (strcmp (arg, "load-store") == 0)
14159         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_LOAD_STORE;
14160       else if (strcmp (arg, "store") == 0)
14161         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_STORE;
14162       else if (strcmp (arg, "none") == 0)
14163         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
14164       else
14165         return false;
14166       return true;
14167
14168     default:
14169       return true;
14170     }
14171 }
14172
14173 /* Implement OVERRIDE_OPTIONS.  */
14174
14175 void
14176 mips_override_options (void)
14177 {
14178   int i, start, regno, mode;
14179
14180   /* Process flags as though we were generating non-MIPS16 code.  */
14181   mips_base_mips16 = TARGET_MIPS16;
14182   target_flags &= ~MASK_MIPS16;
14183
14184 #ifdef SUBTARGET_OVERRIDE_OPTIONS
14185   SUBTARGET_OVERRIDE_OPTIONS;
14186 #endif
14187
14188   /* Set the small data limit.  */
14189   mips_small_data_threshold = (g_switch_set
14190                                ? g_switch_value
14191                                : MIPS_DEFAULT_GVALUE);
14192
14193   /* The following code determines the architecture and register size.
14194      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
14195      The GAS and GCC code should be kept in sync as much as possible.  */
14196
14197   if (mips_arch_string != 0)
14198     mips_set_architecture (mips_parse_cpu (mips_arch_string));
14199
14200   if (mips_isa_option_info != 0)
14201     {
14202       if (mips_arch_info == 0)
14203         mips_set_architecture (mips_isa_option_info);
14204       else if (mips_arch_info->isa != mips_isa_option_info->isa)
14205         error ("%<-%s%> conflicts with the other architecture options, "
14206                "which specify a %s processor",
14207                mips_isa_option_info->name,
14208                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
14209     }
14210
14211   if (mips_arch_info == 0)
14212     {
14213 #ifdef MIPS_CPU_STRING_DEFAULT
14214       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
14215 #else
14216       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
14217 #endif
14218     }
14219
14220   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
14221     error ("%<-march=%s%> is not compatible with the selected ABI",
14222            mips_arch_info->name);
14223
14224   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
14225   if (mips_tune_string != 0)
14226     mips_set_tune (mips_parse_cpu (mips_tune_string));
14227
14228   if (mips_tune_info == 0)
14229     mips_set_tune (mips_arch_info);
14230
14231   if ((target_flags_explicit & MASK_64BIT) != 0)
14232     {
14233       /* The user specified the size of the integer registers.  Make sure
14234          it agrees with the ABI and ISA.  */
14235       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
14236         error ("%<-mgp64%> used with a 32-bit processor");
14237       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
14238         error ("%<-mgp32%> used with a 64-bit ABI");
14239       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
14240         error ("%<-mgp64%> used with a 32-bit ABI");
14241     }
14242   else
14243     {
14244       /* Infer the integer register size from the ABI and processor.
14245          Restrict ourselves to 32-bit registers if that's all the
14246          processor has, or if the ABI cannot handle 64-bit registers.  */
14247       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
14248         target_flags &= ~MASK_64BIT;
14249       else
14250         target_flags |= MASK_64BIT;
14251     }
14252
14253   if ((target_flags_explicit & MASK_FLOAT64) != 0)
14254     {
14255       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
14256         error ("unsupported combination: %s", "-mfp64 -msingle-float");
14257       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
14258         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
14259       else if (!TARGET_64BIT && TARGET_FLOAT64)
14260         {
14261           if (!ISA_HAS_MXHC1)
14262             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
14263                    " the target supports the mfhc1 and mthc1 instructions");
14264           else if (mips_abi != ABI_32)
14265             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
14266                    " the o32 ABI");
14267         }
14268     }
14269   else
14270     {
14271       /* -msingle-float selects 32-bit float registers.  Otherwise the
14272          float registers should be the same size as the integer ones.  */
14273       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
14274         target_flags |= MASK_FLOAT64;
14275       else
14276         target_flags &= ~MASK_FLOAT64;
14277     }
14278
14279   /* End of code shared with GAS.  */
14280
14281   /* If no -mlong* option was given, infer it from the other options.  */
14282   if ((target_flags_explicit & MASK_LONG64) == 0)
14283     {
14284       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
14285         target_flags |= MASK_LONG64;
14286       else
14287         target_flags &= ~MASK_LONG64;
14288     }
14289
14290   if (!TARGET_OLDABI)
14291     flag_pcc_struct_return = 0;
14292
14293   /* Decide which rtx_costs structure to use.  */
14294   if (optimize_size)
14295     mips_cost = &mips_rtx_cost_optimize_size;
14296   else
14297     mips_cost = &mips_rtx_cost_data[mips_tune];
14298
14299   /* If the user hasn't specified a branch cost, use the processor's
14300      default.  */
14301   if (mips_branch_cost == 0)
14302     mips_branch_cost = mips_cost->branch_cost;
14303
14304   /* If neither -mbranch-likely nor -mno-branch-likely was given
14305      on the command line, set MASK_BRANCHLIKELY based on the target
14306      architecture and tuning flags.  Annulled delay slots are a
14307      size win, so we only consider the processor-specific tuning
14308      for !optimize_size.  */
14309   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
14310     {
14311       if (ISA_HAS_BRANCHLIKELY
14312           && (optimize_size
14313               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
14314         target_flags |= MASK_BRANCHLIKELY;
14315       else
14316         target_flags &= ~MASK_BRANCHLIKELY;
14317     }
14318   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
14319     warning (0, "the %qs architecture does not support branch-likely"
14320              " instructions", mips_arch_info->name);
14321
14322   /* The effect of -mabicalls isn't defined for the EABI.  */
14323   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
14324     {
14325       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
14326       target_flags &= ~MASK_ABICALLS;
14327     }
14328
14329   if (TARGET_ABICALLS_PIC2)
14330     /* We need to set flag_pic for executables as well as DSOs
14331        because we may reference symbols that are not defined in
14332        the final executable.  (MIPS does not use things like
14333        copy relocs, for example.)
14334
14335        There is a body of code that uses __PIC__ to distinguish
14336        between -mabicalls and -mno-abicalls code.  The non-__PIC__
14337        variant is usually appropriate for TARGET_ABICALLS_PIC0, as
14338        long as any indirect jumps use $25.  */
14339     flag_pic = 1;
14340
14341   /* -mvr4130-align is a "speed over size" optimization: it usually produces
14342      faster code, but at the expense of more nops.  Enable it at -O3 and
14343      above.  */
14344   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
14345     target_flags |= MASK_VR4130_ALIGN;
14346
14347   /* Prefer a call to memcpy over inline code when optimizing for size,
14348      though see MOVE_RATIO in mips.h.  */
14349   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
14350     target_flags |= MASK_MEMCPY;
14351
14352   /* If we have a nonzero small-data limit, check that the -mgpopt
14353      setting is consistent with the other target flags.  */
14354   if (mips_small_data_threshold > 0)
14355     {
14356       if (!TARGET_GPOPT)
14357         {
14358           if (!TARGET_EXPLICIT_RELOCS)
14359             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
14360
14361           TARGET_LOCAL_SDATA = false;
14362           TARGET_EXTERN_SDATA = false;
14363         }
14364       else
14365         {
14366           if (TARGET_VXWORKS_RTP)
14367             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
14368
14369           if (TARGET_ABICALLS)
14370             warning (0, "cannot use small-data accesses for %qs",
14371                      "-mabicalls");
14372         }
14373     }
14374
14375 #ifdef MIPS_TFMODE_FORMAT
14376   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
14377 #endif
14378
14379   /* Make sure that the user didn't turn off paired single support when
14380      MIPS-3D support is requested.  */
14381   if (TARGET_MIPS3D
14382       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
14383       && !TARGET_PAIRED_SINGLE_FLOAT)
14384     error ("%<-mips3d%> requires %<-mpaired-single%>");
14385
14386   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
14387   if (TARGET_MIPS3D)
14388     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
14389
14390   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
14391      and TARGET_HARD_FLOAT_ABI are both true.  */
14392   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
14393     error ("%qs must be used with %qs",
14394            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
14395            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
14396
14397   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
14398      enabled.  */
14399   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
14400     warning (0, "the %qs architecture does not support paired-single"
14401              " instructions", mips_arch_info->name);
14402
14403   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
14404       && !TARGET_CACHE_BUILTIN)
14405     {
14406       error ("%qs requires a target that provides the %qs instruction",
14407              "-mr10k-cache-barrier", "cache");
14408       mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
14409     }
14410
14411   /* If TARGET_DSPR2, enable MASK_DSP.  */
14412   if (TARGET_DSPR2)
14413     target_flags |= MASK_DSP;
14414
14415   /* .eh_frame addresses should be the same width as a C pointer.
14416      Most MIPS ABIs support only one pointer size, so the assembler
14417      will usually know exactly how big an .eh_frame address is.
14418
14419      Unfortunately, this is not true of the 64-bit EABI.  The ABI was
14420      originally defined to use 64-bit pointers (i.e. it is LP64), and
14421      this is still the default mode.  However, we also support an n32-like
14422      ILP32 mode, which is selected by -mlong32.  The problem is that the
14423      assembler has traditionally not had an -mlong option, so it has
14424      traditionally not known whether we're using the ILP32 or LP64 form.
14425
14426      As it happens, gas versions up to and including 2.19 use _32-bit_
14427      addresses for EABI64 .cfi_* directives.  This is wrong for the
14428      default LP64 mode, so we can't use the directives by default.
14429      Moreover, since gas's current behavior is at odds with gcc's
14430      default behavior, it seems unwise to rely on future versions
14431      of gas behaving the same way.  We therefore avoid using .cfi
14432      directives for -mlong32 as well.  */
14433   if (mips_abi == ABI_EABI && TARGET_64BIT)
14434     flag_dwarf2_cfi_asm = 0;
14435
14436   mips_init_print_operand_punct ();
14437
14438   /* Set up array to map GCC register number to debug register number.
14439      Ignore the special purpose register numbers.  */
14440
14441   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14442     {
14443       mips_dbx_regno[i] = INVALID_REGNUM;
14444       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
14445         mips_dwarf_regno[i] = i;
14446       else
14447         mips_dwarf_regno[i] = INVALID_REGNUM;
14448     }
14449
14450   start = GP_DBX_FIRST - GP_REG_FIRST;
14451   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
14452     mips_dbx_regno[i] = i + start;
14453
14454   start = FP_DBX_FIRST - FP_REG_FIRST;
14455   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
14456     mips_dbx_regno[i] = i + start;
14457
14458   /* Accumulator debug registers use big-endian ordering.  */
14459   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
14460   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
14461   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
14462   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
14463   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
14464     {
14465       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
14466       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
14467     }
14468
14469   /* Set up mips_hard_regno_mode_ok.  */
14470   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
14471     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
14472       mips_hard_regno_mode_ok[mode][regno]
14473         = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
14474
14475   /* Function to allocate machine-dependent function status.  */
14476   init_machine_status = &mips_init_machine_status;
14477
14478   /* Default to working around R4000 errata only if the processor
14479      was selected explicitly.  */
14480   if ((target_flags_explicit & MASK_FIX_R4000) == 0
14481       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
14482     target_flags |= MASK_FIX_R4000;
14483
14484   /* Default to working around R4400 errata only if the processor
14485      was selected explicitly.  */
14486   if ((target_flags_explicit & MASK_FIX_R4400) == 0
14487       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
14488     target_flags |= MASK_FIX_R4400;
14489
14490   /* Default to working around R10000 errata only if the processor
14491      was selected explicitly.  */
14492   if ((target_flags_explicit & MASK_FIX_R10000) == 0
14493       && mips_matching_cpu_name_p (mips_arch_info->name, "r10000"))
14494     target_flags |= MASK_FIX_R10000;
14495
14496   /* Make sure that branch-likely instructions available when using
14497      -mfix-r10000.  The instructions are not available if either:
14498
14499         1. -mno-branch-likely was passed.
14500         2. The selected ISA does not support branch-likely and
14501            the command line does not include -mbranch-likely.  */
14502   if (TARGET_FIX_R10000
14503       && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
14504           ? !ISA_HAS_BRANCHLIKELY
14505           : !TARGET_BRANCHLIKELY))
14506     sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
14507
14508   /* Save base state of options.  */
14509   mips_base_target_flags = target_flags;
14510   mips_base_schedule_insns = flag_schedule_insns;
14511   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
14512   mips_base_move_loop_invariants = flag_move_loop_invariants;
14513   mips_base_align_loops = align_loops;
14514   mips_base_align_jumps = align_jumps;
14515   mips_base_align_functions = align_functions;
14516
14517   /* Now select the ISA mode.
14518
14519      Do all CPP-sensitive stuff in non-MIPS16 mode; we'll switch to
14520      MIPS16 mode afterwards if need be.  */
14521   mips_set_mips16_mode (false);
14522 }
14523
14524 /* Swap the register information for registers I and I + 1, which
14525    currently have the wrong endianness.  Note that the registers'
14526    fixedness and call-clobberedness might have been set on the
14527    command line.  */
14528
14529 static void
14530 mips_swap_registers (unsigned int i)
14531 {
14532   int tmpi;
14533   const char *tmps;
14534
14535 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
14536 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
14537
14538   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
14539   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
14540   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
14541   SWAP_STRING (reg_names[i], reg_names[i + 1]);
14542
14543 #undef SWAP_STRING
14544 #undef SWAP_INT
14545 }
14546
14547 /* Implement CONDITIONAL_REGISTER_USAGE.  */
14548
14549 void
14550 mips_conditional_register_usage (void)
14551 {
14552
14553   if (ISA_HAS_DSP)
14554     {
14555       /* These DSP control register fields are global.  */
14556       global_regs[CCDSP_PO_REGNUM] = 1;
14557       global_regs[CCDSP_SC_REGNUM] = 1;
14558     }
14559   else 
14560     {
14561       int regno;
14562
14563       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
14564         fixed_regs[regno] = call_used_regs[regno] = 1;
14565     }
14566   if (!TARGET_HARD_FLOAT)
14567     {
14568       int regno;
14569
14570       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
14571         fixed_regs[regno] = call_used_regs[regno] = 1;
14572       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
14573         fixed_regs[regno] = call_used_regs[regno] = 1;
14574     }
14575   else if (! ISA_HAS_8CC)
14576     {
14577       int regno;
14578
14579       /* We only have a single condition-code register.  We implement
14580          this by fixing all the condition-code registers and generating
14581          RTL that refers directly to ST_REG_FIRST.  */
14582       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
14583         fixed_regs[regno] = call_used_regs[regno] = 1;
14584     }
14585   /* In MIPS16 mode, we permit the $t temporary registers to be used
14586      for reload.  We prohibit the unused $s registers, since they
14587      are call-saved, and saving them via a MIPS16 register would
14588      probably waste more time than just reloading the value.  */
14589   if (TARGET_MIPS16)
14590     {
14591       fixed_regs[18] = call_used_regs[18] = 1;
14592       fixed_regs[19] = call_used_regs[19] = 1;
14593       fixed_regs[20] = call_used_regs[20] = 1;
14594       fixed_regs[21] = call_used_regs[21] = 1;
14595       fixed_regs[22] = call_used_regs[22] = 1;
14596       fixed_regs[23] = call_used_regs[23] = 1;
14597       fixed_regs[26] = call_used_regs[26] = 1;
14598       fixed_regs[27] = call_used_regs[27] = 1;
14599       fixed_regs[30] = call_used_regs[30] = 1;
14600     }
14601   /* $f20-$f23 are call-clobbered for n64.  */
14602   if (mips_abi == ABI_64)
14603     {
14604       int regno;
14605       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
14606         call_really_used_regs[regno] = call_used_regs[regno] = 1;
14607     }
14608   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
14609      for n32.  */
14610   if (mips_abi == ABI_N32)
14611     {
14612       int regno;
14613       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
14614         call_really_used_regs[regno] = call_used_regs[regno] = 1;
14615     }
14616   /* Make sure that double-register accumulator values are correctly
14617      ordered for the current endianness.  */
14618   if (TARGET_LITTLE_ENDIAN)
14619     {
14620       unsigned int regno;
14621
14622       mips_swap_registers (MD_REG_FIRST);
14623       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
14624         mips_swap_registers (regno);
14625     }
14626 }
14627
14628 /* Initialize vector TARGET to VALS.  */
14629
14630 void
14631 mips_expand_vector_init (rtx target, rtx vals)
14632 {
14633   enum machine_mode mode;
14634   enum machine_mode inner;
14635   unsigned int i, n_elts;
14636   rtx mem;
14637
14638   mode = GET_MODE (target);
14639   inner = GET_MODE_INNER (mode);
14640   n_elts = GET_MODE_NUNITS (mode);
14641
14642   gcc_assert (VECTOR_MODE_P (mode));
14643
14644   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
14645   for (i = 0; i < n_elts; i++)
14646     emit_move_insn (adjust_address_nv (mem, inner, i * GET_MODE_SIZE (inner)),
14647                     XVECEXP (vals, 0, i));
14648
14649   emit_move_insn (target, mem);
14650 }
14651
14652 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
14653    other registers for instructions for which it is possible.  This
14654    encourages the compiler to use CMP in cases where an XOR would
14655    require some register shuffling.  */
14656
14657 void
14658 mips_order_regs_for_local_alloc (void)
14659 {
14660   int i;
14661
14662   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
14663     reg_alloc_order[i] = i;
14664
14665   if (TARGET_MIPS16)
14666     {
14667       /* It really doesn't matter where we put register 0, since it is
14668          a fixed register anyhow.  */
14669       reg_alloc_order[0] = 24;
14670       reg_alloc_order[24] = 0;
14671     }
14672 }
14673
14674 /* Implement EPILOGUE_USES.  */
14675
14676 bool
14677 mips_epilogue_uses (unsigned int regno)
14678 {
14679   /* Say that the epilogue uses the return address register.  Note that
14680      in the case of sibcalls, the values "used by the epilogue" are
14681      considered live at the start of the called function.  */
14682   if (regno == 31)
14683     return true;
14684
14685   /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
14686      See the comment above load_call<mode> for details.  */
14687   if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
14688     return true;
14689
14690   /* An interrupt handler must preserve some registers that are
14691      ordinarily call-clobbered.  */
14692   if (cfun->machine->interrupt_handler_p
14693       && mips_interrupt_extra_call_saved_reg_p (regno))
14694     return true;
14695
14696   return false;
14697 }
14698
14699 /* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
14700
14701 static int
14702 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
14703 {
14704   return GET_CODE (*x) == REG && REGNO (*x) == AT_REGNUM;
14705 }
14706
14707
14708 /* Implement FINAL_PRESCAN_INSN.  */
14709
14710 void
14711 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
14712 {
14713   int i;
14714
14715   /* We need to emit ".set noat" before an instruction that accesses
14716      $1 (AT).  */
14717   if (recog_memoized (insn) >= 0)
14718     for (i = 0; i < noperands; i++)
14719       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
14720         if (set_noat++ == 0)
14721           fprintf (asm_out_file, "\t.set\tnoat\n");
14722 }
14723
14724 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
14725
14726 static void
14727 mips_final_postscan_insn (FILE *file, rtx insn, rtx *opvec, int noperands)
14728 {
14729   int i;
14730
14731   /* Close any ".set noat" block opened by mips_final_prescan_insn.  */
14732   if (recog_memoized (insn) >= 0)
14733     for (i = 0; i < noperands; i++)
14734       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
14735         if (--set_noat == 0)
14736           fprintf (file, "\t.set\tat\n");
14737 }
14738 \f
14739 /* Initialize the GCC target structure.  */
14740 #undef TARGET_ASM_ALIGNED_HI_OP
14741 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
14742 #undef TARGET_ASM_ALIGNED_SI_OP
14743 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
14744 #undef TARGET_ASM_ALIGNED_DI_OP
14745 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
14746
14747 #undef TARGET_LEGITIMIZE_ADDRESS
14748 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
14749
14750 #undef TARGET_ASM_FUNCTION_PROLOGUE
14751 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
14752 #undef TARGET_ASM_FUNCTION_EPILOGUE
14753 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
14754 #undef TARGET_ASM_SELECT_RTX_SECTION
14755 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
14756 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
14757 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
14758
14759 #undef TARGET_SCHED_INIT
14760 #define TARGET_SCHED_INIT mips_sched_init
14761 #undef TARGET_SCHED_REORDER
14762 #define TARGET_SCHED_REORDER mips_sched_reorder
14763 #undef TARGET_SCHED_REORDER2
14764 #define TARGET_SCHED_REORDER2 mips_sched_reorder
14765 #undef TARGET_SCHED_VARIABLE_ISSUE
14766 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
14767 #undef TARGET_SCHED_ADJUST_COST
14768 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
14769 #undef TARGET_SCHED_ISSUE_RATE
14770 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
14771 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
14772 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
14773 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
14774 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
14775 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
14776 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
14777   mips_multipass_dfa_lookahead
14778
14779 #undef TARGET_DEFAULT_TARGET_FLAGS
14780 #define TARGET_DEFAULT_TARGET_FLAGS             \
14781   (TARGET_DEFAULT                               \
14782    | TARGET_CPU_DEFAULT                         \
14783    | TARGET_ENDIAN_DEFAULT                      \
14784    | TARGET_FP_EXCEPTIONS_DEFAULT               \
14785    | MASK_CHECK_ZERO_DIV                        \
14786    | MASK_FUSED_MADD)
14787 #undef TARGET_HANDLE_OPTION
14788 #define TARGET_HANDLE_OPTION mips_handle_option
14789
14790 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
14791 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
14792
14793 #undef TARGET_INSERT_ATTRIBUTES
14794 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
14795 #undef TARGET_MERGE_DECL_ATTRIBUTES
14796 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
14797 #undef TARGET_SET_CURRENT_FUNCTION
14798 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
14799
14800 #undef TARGET_VALID_POINTER_MODE
14801 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
14802 #undef TARGET_RTX_COSTS
14803 #define TARGET_RTX_COSTS mips_rtx_costs
14804 #undef TARGET_ADDRESS_COST
14805 #define TARGET_ADDRESS_COST mips_address_cost
14806
14807 #undef TARGET_IN_SMALL_DATA_P
14808 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
14809
14810 #undef TARGET_MACHINE_DEPENDENT_REORG
14811 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
14812
14813 #undef TARGET_ASM_FILE_START
14814 #define TARGET_ASM_FILE_START mips_file_start
14815 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
14816 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
14817
14818 #undef TARGET_INIT_LIBFUNCS
14819 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
14820
14821 #undef TARGET_BUILD_BUILTIN_VA_LIST
14822 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
14823 #undef TARGET_EXPAND_BUILTIN_VA_START
14824 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
14825 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
14826 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
14827
14828 #undef TARGET_PROMOTE_FUNCTION_ARGS
14829 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
14830 #undef TARGET_PROMOTE_FUNCTION_RETURN
14831 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
14832 #undef TARGET_PROMOTE_PROTOTYPES
14833 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
14834
14835 #undef TARGET_RETURN_IN_MEMORY
14836 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
14837 #undef TARGET_RETURN_IN_MSB
14838 #define TARGET_RETURN_IN_MSB mips_return_in_msb
14839
14840 #undef TARGET_ASM_OUTPUT_MI_THUNK
14841 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
14842 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
14843 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
14844
14845 #undef TARGET_SETUP_INCOMING_VARARGS
14846 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
14847 #undef TARGET_STRICT_ARGUMENT_NAMING
14848 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
14849 #undef TARGET_MUST_PASS_IN_STACK
14850 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
14851 #undef TARGET_PASS_BY_REFERENCE
14852 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
14853 #undef TARGET_CALLEE_COPIES
14854 #define TARGET_CALLEE_COPIES mips_callee_copies
14855 #undef TARGET_ARG_PARTIAL_BYTES
14856 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
14857
14858 #undef TARGET_MODE_REP_EXTENDED
14859 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
14860
14861 #undef TARGET_VECTOR_MODE_SUPPORTED_P
14862 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
14863
14864 #undef TARGET_SCALAR_MODE_SUPPORTED_P
14865 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
14866
14867 #undef TARGET_INIT_BUILTINS
14868 #define TARGET_INIT_BUILTINS mips_init_builtins
14869 #undef TARGET_EXPAND_BUILTIN
14870 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
14871
14872 #undef TARGET_HAVE_TLS
14873 #define TARGET_HAVE_TLS HAVE_AS_TLS
14874
14875 #undef TARGET_CANNOT_FORCE_CONST_MEM
14876 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
14877
14878 #undef TARGET_ENCODE_SECTION_INFO
14879 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
14880
14881 #undef TARGET_ATTRIBUTE_TABLE
14882 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
14883 /* All our function attributes are related to how out-of-line copies should
14884    be compiled or called.  They don't in themselves prevent inlining.  */
14885 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
14886 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
14887
14888 #undef TARGET_EXTRA_LIVE_ON_ENTRY
14889 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
14890
14891 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
14892 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
14893 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
14894 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
14895
14896 #undef  TARGET_COMP_TYPE_ATTRIBUTES
14897 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
14898
14899 #ifdef HAVE_AS_DTPRELWORD
14900 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
14901 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
14902 #endif
14903 #undef TARGET_DWARF_REGISTER_SPAN
14904 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
14905
14906 #undef TARGET_IRA_COVER_CLASSES
14907 #define TARGET_IRA_COVER_CLASSES mips_ira_cover_classes
14908
14909 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
14910 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
14911
14912 struct gcc_target targetm = TARGET_INITIALIZER;
14913 \f
14914 #include "gt-mips.h"