OSDN Git Service

PR middle-end/20983
[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
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 "flags.h"
46 #include "reload.h"
47 #include "tm_p.h"
48 #include "ggc.h"
49 #include "gstab.h"
50 #include "hashtab.h"
51 #include "debug.h"
52 #include "target.h"
53 #include "target-def.h"
54 #include "integrate.h"
55 #include "langhooks.h"
56 #include "cfglayout.h"
57 #include "sched-int.h"
58 #include "tree-gimple.h"
59 #include "bitmap.h"
60 #include "diagnostic.h"
61
62 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
63 #define UNSPEC_ADDRESS_P(X)                                     \
64   (GET_CODE (X) == UNSPEC                                       \
65    && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
66    && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
67
68 /* Extract the symbol or label from UNSPEC wrapper X.  */
69 #define UNSPEC_ADDRESS(X) \
70   XVECEXP (X, 0, 0)
71
72 /* Extract the symbol type from UNSPEC wrapper X.  */
73 #define UNSPEC_ADDRESS_TYPE(X) \
74   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
75
76 /* The maximum distance between the top of the stack frame and the
77    value $sp has when we save and restore registers.
78
79    The value for normal-mode code must be a SMALL_OPERAND and must
80    preserve the maximum stack alignment.  We therefore use a value
81    of 0x7ff0 in this case.
82
83    MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
84    up to 0x7f8 bytes and can usually save or restore all the registers
85    that we need to save or restore.  (Note that we can only use these
86    instructions for o32, for which the stack alignment is 8 bytes.)
87
88    We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
89    RESTORE are not available.  We can then use unextended instructions
90    to save and restore registers, and to allocate and deallocate the top
91    part of the frame.  */
92 #define MIPS_MAX_FIRST_STACK_STEP                                       \
93   (!TARGET_MIPS16 ? 0x7ff0                                              \
94    : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8                              \
95    : TARGET_64BIT ? 0x100 : 0x400)
96
97 /* True if INSN is a mips.md pattern or asm statement.  */
98 #define USEFUL_INSN_P(INSN)                                             \
99   (INSN_P (INSN)                                                        \
100    && GET_CODE (PATTERN (INSN)) != USE                                  \
101    && GET_CODE (PATTERN (INSN)) != CLOBBER                              \
102    && GET_CODE (PATTERN (INSN)) != ADDR_VEC                             \
103    && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
104
105 /* If INSN is a delayed branch sequence, return the first instruction
106    in the sequence, otherwise return INSN itself.  */
107 #define SEQ_BEGIN(INSN)                                                 \
108   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
109    ? XVECEXP (PATTERN (INSN), 0, 0)                                     \
110    : (INSN))
111
112 /* Likewise for the last instruction in a delayed branch sequence.  */
113 #define SEQ_END(INSN)                                                   \
114   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
115    ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1)       \
116    : (INSN))
117
118 /* Execute the following loop body with SUBINSN set to each instruction
119    between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive.  */
120 #define FOR_EACH_SUBINSN(SUBINSN, INSN)                                 \
121   for ((SUBINSN) = SEQ_BEGIN (INSN);                                    \
122        (SUBINSN) != NEXT_INSN (SEQ_END (INSN));                         \
123        (SUBINSN) = NEXT_INSN (SUBINSN))
124
125 /* True if bit BIT is set in VALUE.  */
126 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
127
128 /* Classifies an address.
129
130    ADDRESS_REG
131        A natural register + offset address.  The register satisfies
132        mips_valid_base_register_p and the offset is a const_arith_operand.
133
134    ADDRESS_LO_SUM
135        A LO_SUM rtx.  The first operand is a valid base register and
136        the second operand is a symbolic address.
137
138    ADDRESS_CONST_INT
139        A signed 16-bit constant address.
140
141    ADDRESS_SYMBOLIC:
142        A constant symbolic address.  */
143 enum mips_address_type {
144   ADDRESS_REG,
145   ADDRESS_LO_SUM,
146   ADDRESS_CONST_INT,
147   ADDRESS_SYMBOLIC
148 };
149
150 /* Macros to create an enumeration identifier for a function prototype.  */
151 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
152 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
153 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
154 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
155
156 /* Classifies the prototype of a built-in function.  */
157 enum mips_function_type {
158 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
159 #include "config/mips/mips-ftypes.def"
160 #undef DEF_MIPS_FTYPE
161   MIPS_MAX_FTYPE_MAX
162 };
163
164 /* Specifies how a built-in function should be converted into rtl.  */
165 enum mips_builtin_type {
166   /* The function corresponds directly to an .md pattern.  The return
167      value is mapped to operand 0 and the arguments are mapped to
168      operands 1 and above.  */
169   MIPS_BUILTIN_DIRECT,
170
171   /* The function corresponds directly to an .md pattern.  There is no return
172      value and the arguments are mapped to operands 0 and above.  */
173   MIPS_BUILTIN_DIRECT_NO_TARGET,
174
175   /* The function corresponds to a comparison instruction followed by
176      a mips_cond_move_tf_ps pattern.  The first two arguments are the
177      values to compare and the second two arguments are the vector
178      operands for the movt.ps or movf.ps instruction (in assembly order).  */
179   MIPS_BUILTIN_MOVF,
180   MIPS_BUILTIN_MOVT,
181
182   /* The function corresponds to a V2SF comparison instruction.  Operand 0
183      of this instruction is the result of the comparison, which has mode
184      CCV2 or CCV4.  The function arguments are mapped to operands 1 and
185      above.  The function's return value is an SImode boolean that is
186      true under the following conditions:
187
188      MIPS_BUILTIN_CMP_ANY: one of the registers is true
189      MIPS_BUILTIN_CMP_ALL: all of the registers are true
190      MIPS_BUILTIN_CMP_LOWER: the first register is true
191      MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
192   MIPS_BUILTIN_CMP_ANY,
193   MIPS_BUILTIN_CMP_ALL,
194   MIPS_BUILTIN_CMP_UPPER,
195   MIPS_BUILTIN_CMP_LOWER,
196
197   /* As above, but the instruction only sets a single $fcc register.  */
198   MIPS_BUILTIN_CMP_SINGLE,
199
200   /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
201   MIPS_BUILTIN_BPOSGE32
202 };
203
204 /* Invoke MACRO (COND) for each C.cond.fmt condition.  */
205 #define MIPS_FP_CONDITIONS(MACRO) \
206   MACRO (f),    \
207   MACRO (un),   \
208   MACRO (eq),   \
209   MACRO (ueq),  \
210   MACRO (olt),  \
211   MACRO (ult),  \
212   MACRO (ole),  \
213   MACRO (ule),  \
214   MACRO (sf),   \
215   MACRO (ngle), \
216   MACRO (seq),  \
217   MACRO (ngl),  \
218   MACRO (lt),   \
219   MACRO (nge),  \
220   MACRO (le),   \
221   MACRO (ngt)
222
223 /* Enumerates the codes above as MIPS_FP_COND_<X>.  */
224 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
225 enum mips_fp_condition {
226   MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
227 };
228
229 /* Index X provides the string representation of MIPS_FP_COND_<X>.  */
230 #define STRINGIFY(X) #X
231 static const char *const mips_fp_conditions[] = {
232   MIPS_FP_CONDITIONS (STRINGIFY)
233 };
234
235 /* Information about a function's frame layout.  */
236 struct mips_frame_info GTY(()) {
237   /* The size of the frame in bytes.  */
238   HOST_WIDE_INT total_size;
239
240   /* The number of bytes allocated to variables.  */
241   HOST_WIDE_INT var_size;
242
243   /* The number of bytes allocated to outgoing function arguments.  */
244   HOST_WIDE_INT args_size;
245
246   /* The number of bytes allocated to the .cprestore slot, or 0 if there
247      is no such slot.  */
248   HOST_WIDE_INT cprestore_size;
249
250   /* Bit X is set if the function saves or restores GPR X.  */
251   unsigned int mask;
252
253   /* Likewise FPR X.  */
254   unsigned int fmask;
255
256   /* The number of GPRs and FPRs saved.  */
257   unsigned int num_gp;
258   unsigned int num_fp;
259
260   /* The offset of the topmost GPR and FPR save slots from the top of
261      the frame, or zero if no such slots are needed.  */
262   HOST_WIDE_INT gp_save_offset;
263   HOST_WIDE_INT fp_save_offset;
264
265   /* Likewise, but giving offsets from the bottom of the frame.  */
266   HOST_WIDE_INT gp_sp_offset;
267   HOST_WIDE_INT fp_sp_offset;
268
269   /* The offset of arg_pointer_rtx from frame_pointer_rtx.  */
270   HOST_WIDE_INT arg_pointer_offset;
271
272   /* The offset of hard_frame_pointer_rtx from frame_pointer_rtx.  */
273   HOST_WIDE_INT hard_frame_pointer_offset;
274 };
275
276 struct machine_function GTY(()) {
277   /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
278   rtx mips16_gp_pseudo_rtx;
279
280   /* The number of extra stack bytes taken up by register varargs.
281      This area is allocated by the callee at the very top of the frame.  */
282   int varargs_size;
283
284   /* The current frame information, calculated by mips_compute_frame_info.  */
285   struct mips_frame_info frame;
286
287   /* The register to use as the function's global pointer.  */
288   unsigned int global_pointer;
289
290   /* True if mips_adjust_insn_length should ignore an instruction's
291      hazard attribute.  */
292   bool ignore_hazard_length_p;
293
294   /* True if the whole function is suitable for .set noreorder and
295      .set nomacro.  */
296   bool all_noreorder_p;
297
298   /* True if the function is known to have an instruction that needs $gp.  */
299   bool has_gp_insn_p;
300
301   /* True if we have emitted an instruction to initialize
302      mips16_gp_pseudo_rtx.  */
303   bool initialized_mips16_gp_pseudo_p;
304 };
305
306 /* Information about a single argument.  */
307 struct mips_arg_info {
308   /* True if the argument is passed in a floating-point register, or
309      would have been if we hadn't run out of registers.  */
310   bool fpr_p;
311
312   /* The number of words passed in registers, rounded up.  */
313   unsigned int reg_words;
314
315   /* For EABI, the offset of the first register from GP_ARG_FIRST or
316      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
317      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
318      comment for details).
319
320      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
321      on the stack.  */
322   unsigned int reg_offset;
323
324   /* The number of words that must be passed on the stack, rounded up.  */
325   unsigned int stack_words;
326
327   /* The offset from the start of the stack overflow area of the argument's
328      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
329   unsigned int stack_offset;
330 };
331
332 /* Information about an address described by mips_address_type.
333
334    ADDRESS_CONST_INT
335        No fields are used.
336
337    ADDRESS_REG
338        REG is the base register and OFFSET is the constant offset.
339
340    ADDRESS_LO_SUM
341        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
342        is the type of symbol it references.
343
344    ADDRESS_SYMBOLIC
345        SYMBOL_TYPE is the type of symbol that the address references.  */
346 struct mips_address_info {
347   enum mips_address_type type;
348   rtx reg;
349   rtx offset;
350   enum mips_symbol_type symbol_type;
351 };
352
353 /* One stage in a constant building sequence.  These sequences have
354    the form:
355
356         A = VALUE[0]
357         A = A CODE[1] VALUE[1]
358         A = A CODE[2] VALUE[2]
359         ...
360
361    where A is an accumulator, each CODE[i] is a binary rtl operation
362    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
363 struct mips_integer_op {
364   enum rtx_code code;
365   unsigned HOST_WIDE_INT value;
366 };
367
368 /* The largest number of operations needed to load an integer constant.
369    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
370    When the lowest bit is clear, we can try, but reject a sequence with
371    an extra SLL at the end.  */
372 #define MIPS_MAX_INTEGER_OPS 7
373
374 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
375 struct mips16e_save_restore_info {
376   /* The number of argument registers saved by a SAVE instruction.
377      0 for RESTORE instructions.  */
378   unsigned int nargs;
379
380   /* Bit X is set if the instruction saves or restores GPR X.  */
381   unsigned int mask;
382
383   /* The total number of bytes to allocate.  */
384   HOST_WIDE_INT size;
385 };
386
387 /* Global variables for machine-dependent things.  */
388
389 /* The -G setting, or the configuration's default small-data limit if
390    no -G option is given.  */
391 static unsigned int mips_small_data_threshold;
392
393 /* The number of file directives written by mips_output_filename.  */
394 int num_source_filenames;
395
396 /* The name that appeared in the last .file directive written by
397    mips_output_filename, or "" if mips_output_filename hasn't
398    written anything yet.  */
399 const char *current_function_file = "";
400
401 /* A label counter used by PUT_SDB_BLOCK_START and PUT_SDB_BLOCK_END.  */
402 int sdb_label_count;
403
404 /* Arrays that map GCC register numbers to debugger register numbers.  */
405 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
406 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
407
408 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
409 int set_noreorder;
410 int set_nomacro;
411 static int set_noat;
412
413 /* True if we're writing out a branch-likely instruction rather than a
414    normal branch.  */
415 static bool mips_branch_likely;
416
417 /* The operands passed to the last cmpMM expander.  */
418 rtx cmp_operands[2];
419
420 /* The current instruction-set architecture.  */
421 enum processor_type mips_arch;
422 const struct mips_cpu_info *mips_arch_info;
423
424 /* The processor that we should tune the code for.  */
425 enum processor_type mips_tune;
426 const struct mips_cpu_info *mips_tune_info;
427
428 /* The ISA level associated with mips_arch.  */
429 int mips_isa;
430
431 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
432 static const struct mips_cpu_info *mips_isa_option_info;
433
434 /* Which ABI to use.  */
435 int mips_abi = MIPS_ABI_DEFAULT;
436
437 /* Which cost information to use.  */
438 const struct mips_rtx_cost_data *mips_cost;
439
440 /* The ambient target flags, excluding MASK_MIPS16.  */
441 static int mips_base_target_flags;
442
443 /* True if MIPS16 is the default mode.  */
444 static bool mips_base_mips16;
445
446 /* The ambient values of other global variables.  */
447 static int mips_base_delayed_branch; /* flag_delayed_branch */
448 static int mips_base_schedule_insns; /* flag_schedule_insns */
449 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
450 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
451 static int mips_base_align_loops; /* align_loops */
452 static int mips_base_align_jumps; /* align_jumps */
453 static int mips_base_align_functions; /* align_functions */
454
455 /* The -mcode-readable setting.  */
456 enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES;
457
458 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
459 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
460
461 /* Index C is true if character C is a valid PRINT_OPERAND punctation
462    character.  */
463 bool mips_print_operand_punct[256];
464
465 static GTY (()) int mips_output_filename_first_time = 1;
466
467 /* mips_split_p[X] is true if symbols of type X can be split by
468    mips_split_symbol.  */
469 bool mips_split_p[NUM_SYMBOL_TYPES];
470
471 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
472    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
473    if they are matched by a special .md file pattern.  */
474 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
475
476 /* Likewise for HIGHs.  */
477 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
478
479 /* Index R is the smallest register class that contains register R.  */
480 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
481   LEA_REGS,     LEA_REGS,       M16_NA_REGS,    V1_REG,
482   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
483   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
484   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
485   M16_NA_REGS,  M16_NA_REGS,    LEA_REGS,       LEA_REGS,
486   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
487   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
488   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
489   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
490   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
491   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
492   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
493   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
494   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
495   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
496   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
497   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
498   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
499   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
500   NO_REGS,      ALL_REGS,       ALL_REGS,       NO_REGS,
501   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
502   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
503   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
504   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
505   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
506   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
507   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
508   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
509   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
510   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
511   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
512   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
513   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
514   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
515   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
516   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
517   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
518   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
519   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
520   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
521   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
522   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
523   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
524   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
525   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
526   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
527   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
528 };
529
530 /* The value of TARGET_ATTRIBUTE_TABLE.  */
531 const struct attribute_spec mips_attribute_table[] = {
532   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
533   { "long_call",   0, 0, false, true,  true,  NULL },
534   { "far",         0, 0, false, true,  true,  NULL },
535   { "near",        0, 0, false, true,  true,  NULL },
536   /* We would really like to treat "mips16" and "nomips16" as type
537      attributes, but GCC doesn't provide the hooks we need to support
538      the right conversion rules.  As declaration attributes, they affect
539      code generation but don't carry other semantics.  */
540   { "mips16",      0, 0, true,  false, false, NULL },
541   { "nomips16",    0, 0, true,  false, false, NULL },
542   { NULL,          0, 0, false, false, false, NULL }
543 };
544 \f
545 /* A table describing all the processors GCC knows about.  Names are
546    matched in the order listed.  The first mention of an ISA level is
547    taken as the canonical name for that ISA.
548
549    To ease comparison, please keep this table in the same order
550    as GAS's mips_cpu_info_table.  Please also make sure that
551    MIPS_ISA_LEVEL_SPEC and MIPS_ARCH_FLOAT_SPEC handle all -march
552    options correctly.  */
553 static const struct mips_cpu_info mips_cpu_info_table[] = {
554   /* Entries for generic ISAs.  */
555   { "mips1", PROCESSOR_R3000, 1, 0 },
556   { "mips2", PROCESSOR_R6000, 2, 0 },
557   { "mips3", PROCESSOR_R4000, 3, 0 },
558   { "mips4", PROCESSOR_R8000, 4, 0 },
559   /* Prefer not to use branch-likely instructions for generic MIPS32rX
560      and MIPS64rX code.  The instructions were officially deprecated
561      in revisions 2 and earlier, but revision 3 is likely to downgrade
562      that to a recommendation to avoid the instructions in code that
563      isn't tuned to a specific processor.  */
564   { "mips32", PROCESSOR_4KC, 32, PTF_AVOID_BRANCHLIKELY },
565   { "mips32r2", PROCESSOR_M4K, 33, PTF_AVOID_BRANCHLIKELY },
566   { "mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY },
567
568   /* MIPS I processors.  */
569   { "r3000", PROCESSOR_R3000, 1, 0 },
570   { "r2000", PROCESSOR_R3000, 1, 0 },
571   { "r3900", PROCESSOR_R3900, 1, 0 },
572
573   /* MIPS II processors.  */
574   { "r6000", PROCESSOR_R6000, 2, 0 },
575
576   /* MIPS III processors.  */
577   { "r4000", PROCESSOR_R4000, 3, 0 },
578   { "vr4100", PROCESSOR_R4100, 3, 0 },
579   { "vr4111", PROCESSOR_R4111, 3, 0 },
580   { "vr4120", PROCESSOR_R4120, 3, 0 },
581   { "vr4130", PROCESSOR_R4130, 3, 0 },
582   { "vr4300", PROCESSOR_R4300, 3, 0 },
583   { "r4400", PROCESSOR_R4000, 3, 0 },
584   { "r4600", PROCESSOR_R4600, 3, 0 },
585   { "orion", PROCESSOR_R4600, 3, 0 },
586   { "r4650", PROCESSOR_R4650, 3, 0 },
587
588   /* MIPS IV processors. */
589   { "r8000", PROCESSOR_R8000, 4, 0 },
590   { "vr5000", PROCESSOR_R5000, 4, 0 },
591   { "vr5400", PROCESSOR_R5400, 4, 0 },
592   { "vr5500", PROCESSOR_R5500, 4, PTF_AVOID_BRANCHLIKELY },
593   { "rm7000", PROCESSOR_R7000, 4, 0 },
594   { "rm9000", PROCESSOR_R9000, 4, 0 },
595
596   /* MIPS32 processors.  */
597   { "4kc", PROCESSOR_4KC, 32, 0 },
598   { "4km", PROCESSOR_4KC, 32, 0 },
599   { "4kp", PROCESSOR_4KP, 32, 0 },
600   { "4ksc", PROCESSOR_4KC, 32, 0 },
601
602   /* MIPS32 Release 2 processors.  */
603   { "m4k", PROCESSOR_M4K, 33, 0 },
604   { "4kec", PROCESSOR_4KC, 33, 0 },
605   { "4kem", PROCESSOR_4KC, 33, 0 },
606   { "4kep", PROCESSOR_4KP, 33, 0 },
607   { "4ksd", PROCESSOR_4KC, 33, 0 },
608
609   { "24kc", PROCESSOR_24KC, 33, 0 },
610   { "24kf2_1", PROCESSOR_24KF2_1, 33, 0 },
611   { "24kf", PROCESSOR_24KF2_1, 33, 0 },
612   { "24kf1_1", PROCESSOR_24KF1_1, 33, 0 },
613   { "24kfx", PROCESSOR_24KF1_1, 33, 0 },
614   { "24kx", PROCESSOR_24KF1_1, 33, 0 },
615
616   { "24kec", PROCESSOR_24KC, 33, 0 }, /* 24K with DSP.  */
617   { "24kef2_1", PROCESSOR_24KF2_1, 33, 0 },
618   { "24kef", PROCESSOR_24KF2_1, 33, 0 },
619   { "24kef1_1", PROCESSOR_24KF1_1, 33, 0 },
620   { "24kefx", PROCESSOR_24KF1_1, 33, 0 },
621   { "24kex", PROCESSOR_24KF1_1, 33, 0 },
622
623   { "34kc", PROCESSOR_24KC, 33, 0 }, /* 34K with MT/DSP.  */
624   { "34kf2_1", PROCESSOR_24KF2_1, 33, 0 },
625   { "34kf", PROCESSOR_24KF2_1, 33, 0 },
626   { "34kf1_1", PROCESSOR_24KF1_1, 33, 0 },
627   { "34kfx", PROCESSOR_24KF1_1, 33, 0 },
628   { "34kx", PROCESSOR_24KF1_1, 33, 0 },
629
630   { "74kc", PROCESSOR_74KC, 33, 0 }, /* 74K with DSPr2.  */
631   { "74kf2_1", PROCESSOR_74KF2_1, 33, 0 },
632   { "74kf", PROCESSOR_74KF2_1, 33, 0 },
633   { "74kf1_1", PROCESSOR_74KF1_1, 33, 0 },
634   { "74kfx", PROCESSOR_74KF1_1, 33, 0 },
635   { "74kx", PROCESSOR_74KF1_1, 33, 0 },
636   { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
637
638   /* MIPS64 processors.  */
639   { "5kc", PROCESSOR_5KC, 64, 0 },
640   { "5kf", PROCESSOR_5KF, 64, 0 },
641   { "20kc", PROCESSOR_20KC, 64, PTF_AVOID_BRANCHLIKELY },
642   { "sb1", PROCESSOR_SB1, 64, PTF_AVOID_BRANCHLIKELY },
643   { "sb1a", PROCESSOR_SB1A, 64, PTF_AVOID_BRANCHLIKELY },
644   { "sr71000", PROCESSOR_SR71000, 64, PTF_AVOID_BRANCHLIKELY },
645 };
646
647 /* Default costs.  If these are used for a processor we should look
648    up the actual costs.  */
649 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
650                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
651                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
652                       COSTS_N_INSNS (23), /* fp_div_sf */    \
653                       COSTS_N_INSNS (36), /* fp_div_df */    \
654                       COSTS_N_INSNS (10), /* int_mult_si */  \
655                       COSTS_N_INSNS (10), /* int_mult_di */  \
656                       COSTS_N_INSNS (69), /* int_div_si */   \
657                       COSTS_N_INSNS (69), /* int_div_di */   \
658                                        2, /* branch_cost */  \
659                                        4  /* memory_latency */
660
661 /* Floating-point costs for processors without an FPU.  Just assume that
662    all floating-point libcalls are very expensive.  */
663 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
664                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
665                       COSTS_N_INSNS (256), /* fp_mult_df */   \
666                       COSTS_N_INSNS (256), /* fp_div_sf */    \
667                       COSTS_N_INSNS (256)  /* fp_div_df */
668
669 /* Costs to use when optimizing for size.  */
670 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
671   COSTS_N_INSNS (1),            /* fp_add */
672   COSTS_N_INSNS (1),            /* fp_mult_sf */
673   COSTS_N_INSNS (1),            /* fp_mult_df */
674   COSTS_N_INSNS (1),            /* fp_div_sf */
675   COSTS_N_INSNS (1),            /* fp_div_df */
676   COSTS_N_INSNS (1),            /* int_mult_si */
677   COSTS_N_INSNS (1),            /* int_mult_di */
678   COSTS_N_INSNS (1),            /* int_div_si */
679   COSTS_N_INSNS (1),            /* int_div_di */
680                    2,           /* branch_cost */
681                    4            /* memory_latency */
682 };
683
684 /* Costs to use when optimizing for speed, indexed by processor.  */
685 static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX] = {
686   { /* R3000 */
687     COSTS_N_INSNS (2),            /* fp_add */
688     COSTS_N_INSNS (4),            /* fp_mult_sf */
689     COSTS_N_INSNS (5),            /* fp_mult_df */
690     COSTS_N_INSNS (12),           /* fp_div_sf */
691     COSTS_N_INSNS (19),           /* fp_div_df */
692     COSTS_N_INSNS (12),           /* int_mult_si */
693     COSTS_N_INSNS (12),           /* int_mult_di */
694     COSTS_N_INSNS (35),           /* int_div_si */
695     COSTS_N_INSNS (35),           /* int_div_di */
696                      1,           /* branch_cost */
697                      4            /* memory_latency */
698   },
699   { /* 4KC */
700     SOFT_FP_COSTS,
701     COSTS_N_INSNS (6),            /* int_mult_si */
702     COSTS_N_INSNS (6),            /* int_mult_di */
703     COSTS_N_INSNS (36),           /* int_div_si */
704     COSTS_N_INSNS (36),           /* int_div_di */
705                      1,           /* branch_cost */
706                      4            /* memory_latency */
707   },
708   { /* 4KP */
709     SOFT_FP_COSTS,
710     COSTS_N_INSNS (36),           /* int_mult_si */
711     COSTS_N_INSNS (36),           /* int_mult_di */
712     COSTS_N_INSNS (37),           /* int_div_si */
713     COSTS_N_INSNS (37),           /* int_div_di */
714                      1,           /* branch_cost */
715                      4            /* memory_latency */
716   },
717   { /* 5KC */
718     SOFT_FP_COSTS,
719     COSTS_N_INSNS (4),            /* int_mult_si */
720     COSTS_N_INSNS (11),           /* int_mult_di */
721     COSTS_N_INSNS (36),           /* int_div_si */
722     COSTS_N_INSNS (68),           /* int_div_di */
723                      1,           /* branch_cost */
724                      4            /* memory_latency */
725   },
726   { /* 5KF */
727     COSTS_N_INSNS (4),            /* fp_add */
728     COSTS_N_INSNS (4),            /* fp_mult_sf */
729     COSTS_N_INSNS (5),            /* fp_mult_df */
730     COSTS_N_INSNS (17),           /* fp_div_sf */
731     COSTS_N_INSNS (32),           /* fp_div_df */
732     COSTS_N_INSNS (4),            /* int_mult_si */
733     COSTS_N_INSNS (11),           /* int_mult_di */
734     COSTS_N_INSNS (36),           /* int_div_si */
735     COSTS_N_INSNS (68),           /* int_div_di */
736                      1,           /* branch_cost */
737                      4            /* memory_latency */
738   },
739   { /* 20KC */
740     COSTS_N_INSNS (4),            /* fp_add */
741     COSTS_N_INSNS (4),            /* fp_mult_sf */
742     COSTS_N_INSNS (5),            /* fp_mult_df */
743     COSTS_N_INSNS (17),           /* fp_div_sf */
744     COSTS_N_INSNS (32),           /* fp_div_df */
745     COSTS_N_INSNS (4),            /* int_mult_si */
746     COSTS_N_INSNS (7),            /* int_mult_di */
747     COSTS_N_INSNS (42),           /* int_div_si */
748     COSTS_N_INSNS (72),           /* int_div_di */
749                      1,           /* branch_cost */
750                      4            /* memory_latency */
751   },
752   { /* 24KC */
753     SOFT_FP_COSTS,
754     COSTS_N_INSNS (5),            /* int_mult_si */
755     COSTS_N_INSNS (5),            /* int_mult_di */
756     COSTS_N_INSNS (41),           /* int_div_si */
757     COSTS_N_INSNS (41),           /* int_div_di */
758                      1,           /* branch_cost */
759                      4            /* memory_latency */
760   },
761   { /* 24KF2_1 */
762     COSTS_N_INSNS (8),            /* fp_add */
763     COSTS_N_INSNS (8),            /* fp_mult_sf */
764     COSTS_N_INSNS (10),           /* fp_mult_df */
765     COSTS_N_INSNS (34),           /* fp_div_sf */
766     COSTS_N_INSNS (64),           /* fp_div_df */
767     COSTS_N_INSNS (5),            /* int_mult_si */
768     COSTS_N_INSNS (5),            /* int_mult_di */
769     COSTS_N_INSNS (41),           /* int_div_si */
770     COSTS_N_INSNS (41),           /* int_div_di */
771                      1,           /* branch_cost */
772                      4            /* memory_latency */
773   },
774   { /* 24KF1_1 */
775     COSTS_N_INSNS (4),            /* fp_add */
776     COSTS_N_INSNS (4),            /* fp_mult_sf */
777     COSTS_N_INSNS (5),            /* fp_mult_df */
778     COSTS_N_INSNS (17),           /* fp_div_sf */
779     COSTS_N_INSNS (32),           /* fp_div_df */
780     COSTS_N_INSNS (5),            /* int_mult_si */
781     COSTS_N_INSNS (5),            /* int_mult_di */
782     COSTS_N_INSNS (41),           /* int_div_si */
783     COSTS_N_INSNS (41),           /* int_div_di */
784                      1,           /* branch_cost */
785                      4            /* memory_latency */
786   },
787   { /* 74KC */
788     SOFT_FP_COSTS,
789     COSTS_N_INSNS (5),            /* int_mult_si */
790     COSTS_N_INSNS (5),            /* int_mult_di */
791     COSTS_N_INSNS (41),           /* int_div_si */
792     COSTS_N_INSNS (41),           /* int_div_di */
793                      1,           /* branch_cost */
794                      4            /* memory_latency */
795   },
796   { /* 74KF2_1 */
797     COSTS_N_INSNS (8),            /* fp_add */
798     COSTS_N_INSNS (8),            /* fp_mult_sf */
799     COSTS_N_INSNS (10),           /* fp_mult_df */
800     COSTS_N_INSNS (34),           /* fp_div_sf */
801     COSTS_N_INSNS (64),           /* fp_div_df */
802     COSTS_N_INSNS (5),            /* int_mult_si */
803     COSTS_N_INSNS (5),            /* int_mult_di */
804     COSTS_N_INSNS (41),           /* int_div_si */
805     COSTS_N_INSNS (41),           /* int_div_di */
806                      1,           /* branch_cost */
807                      4            /* memory_latency */
808   },
809   { /* 74KF1_1 */
810     COSTS_N_INSNS (4),            /* fp_add */
811     COSTS_N_INSNS (4),            /* fp_mult_sf */
812     COSTS_N_INSNS (5),            /* fp_mult_df */
813     COSTS_N_INSNS (17),           /* fp_div_sf */
814     COSTS_N_INSNS (32),           /* fp_div_df */
815     COSTS_N_INSNS (5),            /* int_mult_si */
816     COSTS_N_INSNS (5),            /* int_mult_di */
817     COSTS_N_INSNS (41),           /* int_div_si */
818     COSTS_N_INSNS (41),           /* int_div_di */
819                      1,           /* branch_cost */
820                      4            /* memory_latency */
821   },
822   { /* 74KF3_2 */
823     COSTS_N_INSNS (6),            /* fp_add */
824     COSTS_N_INSNS (6),            /* fp_mult_sf */
825     COSTS_N_INSNS (7),            /* fp_mult_df */
826     COSTS_N_INSNS (25),           /* fp_div_sf */
827     COSTS_N_INSNS (48),           /* fp_div_df */
828     COSTS_N_INSNS (5),            /* int_mult_si */
829     COSTS_N_INSNS (5),            /* int_mult_di */
830     COSTS_N_INSNS (41),           /* int_div_si */
831     COSTS_N_INSNS (41),           /* int_div_di */
832                      1,           /* branch_cost */
833                      4            /* memory_latency */
834   },
835   { /* M4k */
836     DEFAULT_COSTS
837   },
838   { /* R3900 */
839     COSTS_N_INSNS (2),            /* fp_add */
840     COSTS_N_INSNS (4),            /* fp_mult_sf */
841     COSTS_N_INSNS (5),            /* fp_mult_df */
842     COSTS_N_INSNS (12),           /* fp_div_sf */
843     COSTS_N_INSNS (19),           /* fp_div_df */
844     COSTS_N_INSNS (2),            /* int_mult_si */
845     COSTS_N_INSNS (2),            /* int_mult_di */
846     COSTS_N_INSNS (35),           /* int_div_si */
847     COSTS_N_INSNS (35),           /* int_div_di */
848                      1,           /* branch_cost */
849                      4            /* memory_latency */
850   },
851   { /* R6000 */
852     COSTS_N_INSNS (3),            /* fp_add */
853     COSTS_N_INSNS (5),            /* fp_mult_sf */
854     COSTS_N_INSNS (6),            /* fp_mult_df */
855     COSTS_N_INSNS (15),           /* fp_div_sf */
856     COSTS_N_INSNS (16),           /* fp_div_df */
857     COSTS_N_INSNS (17),           /* int_mult_si */
858     COSTS_N_INSNS (17),           /* int_mult_di */
859     COSTS_N_INSNS (38),           /* int_div_si */
860     COSTS_N_INSNS (38),           /* int_div_di */
861                      2,           /* branch_cost */
862                      6            /* memory_latency */
863   },
864   { /* R4000 */
865      COSTS_N_INSNS (6),           /* fp_add */
866      COSTS_N_INSNS (7),           /* fp_mult_sf */
867      COSTS_N_INSNS (8),           /* fp_mult_df */
868      COSTS_N_INSNS (23),          /* fp_div_sf */
869      COSTS_N_INSNS (36),          /* fp_div_df */
870      COSTS_N_INSNS (10),          /* int_mult_si */
871      COSTS_N_INSNS (10),          /* int_mult_di */
872      COSTS_N_INSNS (69),          /* int_div_si */
873      COSTS_N_INSNS (69),          /* int_div_di */
874                       2,          /* branch_cost */
875                       6           /* memory_latency */
876   },
877   { /* R4100 */
878     DEFAULT_COSTS
879   },
880   { /* R4111 */
881     DEFAULT_COSTS
882   },
883   { /* R4120 */
884     DEFAULT_COSTS
885   },
886   { /* R4130 */
887     /* The only costs that appear to be updated here are
888        integer multiplication.  */
889     SOFT_FP_COSTS,
890     COSTS_N_INSNS (4),            /* int_mult_si */
891     COSTS_N_INSNS (6),            /* int_mult_di */
892     COSTS_N_INSNS (69),           /* int_div_si */
893     COSTS_N_INSNS (69),           /* int_div_di */
894                      1,           /* branch_cost */
895                      4            /* memory_latency */
896   },
897   { /* R4300 */
898     DEFAULT_COSTS
899   },
900   { /* R4600 */
901     DEFAULT_COSTS
902   },
903   { /* R4650 */
904     DEFAULT_COSTS
905   },
906   { /* R5000 */
907     COSTS_N_INSNS (6),            /* fp_add */
908     COSTS_N_INSNS (4),            /* fp_mult_sf */
909     COSTS_N_INSNS (5),            /* fp_mult_df */
910     COSTS_N_INSNS (23),           /* fp_div_sf */
911     COSTS_N_INSNS (36),           /* fp_div_df */
912     COSTS_N_INSNS (5),            /* int_mult_si */
913     COSTS_N_INSNS (5),            /* int_mult_di */
914     COSTS_N_INSNS (36),           /* int_div_si */
915     COSTS_N_INSNS (36),           /* int_div_di */
916                      1,           /* branch_cost */
917                      4            /* memory_latency */
918   },
919   { /* R5400 */
920     COSTS_N_INSNS (6),            /* fp_add */
921     COSTS_N_INSNS (5),            /* fp_mult_sf */
922     COSTS_N_INSNS (6),            /* fp_mult_df */
923     COSTS_N_INSNS (30),           /* fp_div_sf */
924     COSTS_N_INSNS (59),           /* fp_div_df */
925     COSTS_N_INSNS (3),            /* int_mult_si */
926     COSTS_N_INSNS (4),            /* int_mult_di */
927     COSTS_N_INSNS (42),           /* int_div_si */
928     COSTS_N_INSNS (74),           /* int_div_di */
929                      1,           /* branch_cost */
930                      4            /* memory_latency */
931   },
932   { /* R5500 */
933     COSTS_N_INSNS (6),            /* fp_add */
934     COSTS_N_INSNS (5),            /* fp_mult_sf */
935     COSTS_N_INSNS (6),            /* fp_mult_df */
936     COSTS_N_INSNS (30),           /* fp_div_sf */
937     COSTS_N_INSNS (59),           /* fp_div_df */
938     COSTS_N_INSNS (5),            /* int_mult_si */
939     COSTS_N_INSNS (9),            /* int_mult_di */
940     COSTS_N_INSNS (42),           /* int_div_si */
941     COSTS_N_INSNS (74),           /* int_div_di */
942                      1,           /* branch_cost */
943                      4            /* memory_latency */
944   },
945   { /* R7000 */
946     /* The only costs that are changed here are
947        integer multiplication.  */
948     COSTS_N_INSNS (6),            /* fp_add */
949     COSTS_N_INSNS (7),            /* fp_mult_sf */
950     COSTS_N_INSNS (8),            /* fp_mult_df */
951     COSTS_N_INSNS (23),           /* fp_div_sf */
952     COSTS_N_INSNS (36),           /* fp_div_df */
953     COSTS_N_INSNS (5),            /* int_mult_si */
954     COSTS_N_INSNS (9),            /* int_mult_di */
955     COSTS_N_INSNS (69),           /* int_div_si */
956     COSTS_N_INSNS (69),           /* int_div_di */
957                      1,           /* branch_cost */
958                      4            /* memory_latency */
959   },
960   { /* R8000 */
961     DEFAULT_COSTS
962   },
963   { /* R9000 */
964     /* The only costs that are changed here are
965        integer multiplication.  */
966     COSTS_N_INSNS (6),            /* fp_add */
967     COSTS_N_INSNS (7),            /* fp_mult_sf */
968     COSTS_N_INSNS (8),            /* fp_mult_df */
969     COSTS_N_INSNS (23),           /* fp_div_sf */
970     COSTS_N_INSNS (36),           /* fp_div_df */
971     COSTS_N_INSNS (3),            /* int_mult_si */
972     COSTS_N_INSNS (8),            /* int_mult_di */
973     COSTS_N_INSNS (69),           /* int_div_si */
974     COSTS_N_INSNS (69),           /* int_div_di */
975                      1,           /* branch_cost */
976                      4            /* memory_latency */
977   },
978   { /* SB1 */
979     /* These costs are the same as the SB-1A below.  */
980     COSTS_N_INSNS (4),            /* fp_add */
981     COSTS_N_INSNS (4),            /* fp_mult_sf */
982     COSTS_N_INSNS (4),            /* fp_mult_df */
983     COSTS_N_INSNS (24),           /* fp_div_sf */
984     COSTS_N_INSNS (32),           /* fp_div_df */
985     COSTS_N_INSNS (3),            /* int_mult_si */
986     COSTS_N_INSNS (4),            /* int_mult_di */
987     COSTS_N_INSNS (36),           /* int_div_si */
988     COSTS_N_INSNS (68),           /* int_div_di */
989                      1,           /* branch_cost */
990                      4            /* memory_latency */
991   },
992   { /* SB1-A */
993     /* These costs are the same as the SB-1 above.  */
994     COSTS_N_INSNS (4),            /* fp_add */
995     COSTS_N_INSNS (4),            /* fp_mult_sf */
996     COSTS_N_INSNS (4),            /* fp_mult_df */
997     COSTS_N_INSNS (24),           /* fp_div_sf */
998     COSTS_N_INSNS (32),           /* fp_div_df */
999     COSTS_N_INSNS (3),            /* int_mult_si */
1000     COSTS_N_INSNS (4),            /* int_mult_di */
1001     COSTS_N_INSNS (36),           /* int_div_si */
1002     COSTS_N_INSNS (68),           /* int_div_di */
1003                      1,           /* branch_cost */
1004                      4            /* memory_latency */
1005   },
1006   { /* SR71000 */
1007     DEFAULT_COSTS
1008   },
1009 };
1010 \f
1011 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1012    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1013 struct mflip_mips16_entry GTY (()) {
1014   const char *name;
1015   bool mips16_p;
1016 };
1017 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1018
1019 /* Hash table callbacks for mflip_mips16_htab.  */
1020
1021 static hashval_t
1022 mflip_mips16_htab_hash (const void *entry)
1023 {
1024   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1025 }
1026
1027 static int
1028 mflip_mips16_htab_eq (const void *entry, const void *name)
1029 {
1030   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1031                  (const char *) name) == 0;
1032 }
1033
1034 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1035    mode, false if it should next add an attribute for the opposite mode.  */
1036 static GTY(()) bool mips16_flipper;
1037
1038 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1039    for -mflip-mips16.  Return true if it should use "mips16" and false if
1040    it should use "nomips16".  */
1041
1042 static bool
1043 mflip_mips16_use_mips16_p (tree decl)
1044 {
1045   struct mflip_mips16_entry *entry;
1046   const char *name;
1047   hashval_t hash;
1048   void **slot;
1049
1050   /* Use the opposite of the command-line setting for anonymous decls.  */
1051   if (!DECL_NAME (decl))
1052     return !mips_base_mips16;
1053
1054   if (!mflip_mips16_htab)
1055     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1056                                          mflip_mips16_htab_eq, NULL);
1057
1058   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1059   hash = htab_hash_string (name);
1060   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1061   entry = (struct mflip_mips16_entry *) *slot;
1062   if (!entry)
1063     {
1064       mips16_flipper = !mips16_flipper;
1065       entry = GGC_NEW (struct mflip_mips16_entry);
1066       entry->name = name;
1067       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1068       *slot = entry;
1069     }
1070   return entry->mips16_p;
1071 }
1072 \f
1073 /* Predicates to test for presence of "near" and "far"/"long_call"
1074    attributes on the given TYPE.  */
1075
1076 static bool
1077 mips_near_type_p (const_tree type)
1078 {
1079   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1080 }
1081
1082 static bool
1083 mips_far_type_p (const_tree type)
1084 {
1085   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1086           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1087 }
1088
1089 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1090
1091 static bool
1092 mips_mips16_decl_p (const_tree decl)
1093 {
1094   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1095 }
1096
1097 static bool
1098 mips_nomips16_decl_p (const_tree decl)
1099 {
1100   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1101 }
1102
1103 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1104    setting if DECL is null.  */
1105
1106 static bool
1107 mips_use_mips16_mode_p (tree decl)
1108 {
1109   if (decl)
1110     {
1111       /* Nested functions must use the same frame pointer as their
1112          parent and must therefore use the same ISA mode.  */
1113       tree parent = decl_function_context (decl);
1114       if (parent)
1115         decl = parent;
1116       if (mips_mips16_decl_p (decl))
1117         return true;
1118       if (mips_nomips16_decl_p (decl))
1119         return false;
1120     }
1121   return mips_base_mips16;
1122 }
1123
1124 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1125
1126 static int
1127 mips_comp_type_attributes (const_tree type1, const_tree type2)
1128 {
1129   /* Disallow mixed near/far attributes.  */
1130   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1131     return 0;
1132   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1133     return 0;
1134   return 1;
1135 }
1136
1137 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1138
1139 static void
1140 mips_insert_attributes (tree decl, tree *attributes)
1141 {
1142   const char *name;
1143   bool mips16_p, nomips16_p;
1144
1145   /* Check for "mips16" and "nomips16" attributes.  */
1146   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1147   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1148   if (TREE_CODE (decl) != FUNCTION_DECL)
1149     {
1150       if (mips16_p)
1151         error ("%qs attribute only applies to functions", "mips16");
1152       if (nomips16_p)
1153         error ("%qs attribute only applies to functions", "nomips16");
1154     }
1155   else
1156     {
1157       mips16_p |= mips_mips16_decl_p (decl);
1158       nomips16_p |= mips_nomips16_decl_p (decl);
1159       if (mips16_p || nomips16_p)
1160         {
1161           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1162           if (mips16_p && nomips16_p)
1163             error ("%qs cannot have both %<mips16%> and "
1164                    "%<nomips16%> attributes",
1165                    IDENTIFIER_POINTER (DECL_NAME (decl)));
1166         }
1167       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1168         {
1169           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1170              "mips16" attribute, arbitrarily pick one.  We must pick the same
1171              setting for duplicate declarations of a function.  */
1172           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1173           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1174         }
1175     }
1176 }
1177
1178 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1179
1180 static tree
1181 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1182 {
1183   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1184   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1185     error ("%qs redeclared with conflicting %qs attributes",
1186            IDENTIFIER_POINTER (DECL_NAME (newdecl)), "mips16");
1187   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1188     error ("%qs redeclared with conflicting %qs attributes",
1189            IDENTIFIER_POINTER (DECL_NAME (newdecl)), "nomips16");
1190
1191   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1192                            DECL_ATTRIBUTES (newdecl));
1193 }
1194 \f
1195 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1196    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1197
1198 static void
1199 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1200 {
1201   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
1202     {
1203       *base_ptr = XEXP (x, 0);
1204       *offset_ptr = INTVAL (XEXP (x, 1));
1205     }
1206   else
1207     {
1208       *base_ptr = x;
1209       *offset_ptr = 0;
1210     }
1211 }
1212 \f
1213 static unsigned int mips_build_integer (struct mips_integer_op *,
1214                                         unsigned HOST_WIDE_INT);
1215
1216 /* A subroutine of mips_build_integer, with the same interface.
1217    Assume that the final action in the sequence should be a left shift.  */
1218
1219 static unsigned int
1220 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1221 {
1222   unsigned int i, shift;
1223
1224   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1225      since signed numbers are easier to load than unsigned ones.  */
1226   shift = 0;
1227   while ((value & 1) == 0)
1228     value /= 2, shift++;
1229
1230   i = mips_build_integer (codes, value);
1231   codes[i].code = ASHIFT;
1232   codes[i].value = shift;
1233   return i + 1;
1234 }
1235
1236 /* As for mips_build_shift, but assume that the final action will be
1237    an IOR or PLUS operation.  */
1238
1239 static unsigned int
1240 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1241 {
1242   unsigned HOST_WIDE_INT high;
1243   unsigned int i;
1244
1245   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1246   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1247     {
1248       /* The constant is too complex to load with a simple LUI/ORI pair,
1249          so we want to give the recursive call as many trailing zeros as
1250          possible.  In this case, we know bit 16 is set and that the
1251          low 16 bits form a negative number.  If we subtract that number
1252          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1253       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1254       codes[i].code = PLUS;
1255       codes[i].value = CONST_LOW_PART (value);
1256     }
1257   else
1258     {
1259       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1260          bits gives a value with at least 17 trailing zeros.  */
1261       i = mips_build_integer (codes, high);
1262       codes[i].code = IOR;
1263       codes[i].value = value & 0xffff;
1264     }
1265   return i + 1;
1266 }
1267
1268 /* Fill CODES with a sequence of rtl operations to load VALUE.
1269    Return the number of operations needed.  */
1270
1271 static unsigned int
1272 mips_build_integer (struct mips_integer_op *codes,
1273                     unsigned HOST_WIDE_INT value)
1274 {
1275   if (SMALL_OPERAND (value)
1276       || SMALL_OPERAND_UNSIGNED (value)
1277       || LUI_OPERAND (value))
1278     {
1279       /* The value can be loaded with a single instruction.  */
1280       codes[0].code = UNKNOWN;
1281       codes[0].value = value;
1282       return 1;
1283     }
1284   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1285     {
1286       /* Either the constant is a simple LUI/ORI combination or its
1287          lowest bit is set.  We don't want to shift in this case.  */
1288       return mips_build_lower (codes, value);
1289     }
1290   else if ((value & 0xffff) == 0)
1291     {
1292       /* The constant will need at least three actions.  The lowest
1293          16 bits are clear, so the final action will be a shift.  */
1294       return mips_build_shift (codes, value);
1295     }
1296   else
1297     {
1298       /* The final action could be a shift, add or inclusive OR.
1299          Rather than use a complex condition to select the best
1300          approach, try both mips_build_shift and mips_build_lower
1301          and pick the one that gives the shortest sequence.
1302          Note that this case is only used once per constant.  */
1303       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1304       unsigned int cost, alt_cost;
1305
1306       cost = mips_build_shift (codes, value);
1307       alt_cost = mips_build_lower (alt_codes, value);
1308       if (alt_cost < cost)
1309         {
1310           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1311           cost = alt_cost;
1312         }
1313       return cost;
1314     }
1315 }
1316 \f
1317 /* Return true if X is a thread-local symbol.  */
1318
1319 static bool
1320 mips_tls_symbol_p (rtx x)
1321 {
1322   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1323 }
1324
1325 /* Return true if SYMBOL_REF X is associated with a global symbol
1326    (in the STB_GLOBAL sense).  */
1327
1328 static bool
1329 mips_global_symbol_p (const_rtx x)
1330 {
1331   const_tree decl = SYMBOL_REF_DECL (x);
1332
1333   if (!decl)
1334     return !SYMBOL_REF_LOCAL_P (x);
1335
1336   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1337      or weak symbols.  Relocations in the object file will be against
1338      the target symbol, so it's that symbol's binding that matters here.  */
1339   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1340 }
1341
1342 /* Return true if SYMBOL_REF X binds locally.  */
1343
1344 static bool
1345 mips_symbol_binds_local_p (const_rtx x)
1346 {
1347   return (SYMBOL_REF_DECL (x)
1348           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1349           : SYMBOL_REF_LOCAL_P (x));
1350 }
1351
1352 /* Return true if rtx constants of mode MODE should be put into a small
1353    data section.  */
1354
1355 static bool
1356 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1357 {
1358   return (!TARGET_EMBEDDED_DATA
1359           && TARGET_LOCAL_SDATA
1360           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1361 }
1362
1363 /* Return true if X should not be moved directly into register $25.
1364    We need this because many versions of GAS will treat "la $25,foo" as
1365    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1366
1367 bool
1368 mips_dangerous_for_la25_p (rtx x)
1369 {
1370   return (!TARGET_EXPLICIT_RELOCS
1371           && TARGET_USE_GOT
1372           && GET_CODE (x) == SYMBOL_REF
1373           && mips_global_symbol_p (x));
1374 }
1375
1376 /* Return the method that should be used to access SYMBOL_REF or
1377    LABEL_REF X in context CONTEXT.  */
1378
1379 static enum mips_symbol_type
1380 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1381 {
1382   if (TARGET_RTP_PIC)
1383     return SYMBOL_GOT_DISP;
1384
1385   if (GET_CODE (x) == LABEL_REF)
1386     {
1387       /* LABEL_REFs are used for jump tables as well as text labels.
1388          Only return SYMBOL_PC_RELATIVE if we know the label is in
1389          the text section.  */
1390       if (TARGET_MIPS16_SHORT_JUMP_TABLES)
1391         return SYMBOL_PC_RELATIVE;
1392
1393       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1394         return SYMBOL_GOT_PAGE_OFST;
1395
1396       return SYMBOL_ABSOLUTE;
1397     }
1398
1399   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1400
1401   if (SYMBOL_REF_TLS_MODEL (x))
1402     return SYMBOL_TLS;
1403
1404   if (CONSTANT_POOL_ADDRESS_P (x))
1405     {
1406       if (TARGET_MIPS16_TEXT_LOADS)
1407         return SYMBOL_PC_RELATIVE;
1408
1409       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1410         return SYMBOL_PC_RELATIVE;
1411
1412       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1413         return SYMBOL_GP_RELATIVE;
1414     }
1415
1416   /* Do not use small-data accesses for weak symbols; they may end up
1417      being zero.  */
1418   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1419     return SYMBOL_GP_RELATIVE;
1420
1421   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1422      is in effect.  */
1423   if (TARGET_ABICALLS
1424       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1425     {
1426       /* There are three cases to consider:
1427
1428             - o32 PIC (either with or without explicit relocs)
1429             - n32/n64 PIC without explicit relocs
1430             - n32/n64 PIC with explicit relocs
1431
1432          In the first case, both local and global accesses will use an
1433          R_MIPS_GOT16 relocation.  We must correctly predict which of
1434          the two semantics (local or global) the assembler and linker
1435          will apply.  The choice depends on the symbol's binding rather
1436          than its visibility.
1437
1438          In the second case, the assembler will not use R_MIPS_GOT16
1439          relocations, but it chooses between local and global accesses
1440          in the same way as for o32 PIC.
1441
1442          In the third case we have more freedom since both forms of
1443          access will work for any kind of symbol.  However, there seems
1444          little point in doing things differently.  */
1445       if (mips_global_symbol_p (x))
1446         return SYMBOL_GOT_DISP;
1447
1448       return SYMBOL_GOT_PAGE_OFST;
1449     }
1450
1451   if (TARGET_MIPS16_PCREL_LOADS && context != SYMBOL_CONTEXT_CALL)
1452     return SYMBOL_FORCE_TO_MEM;
1453
1454   return SYMBOL_ABSOLUTE;
1455 }
1456
1457 /* Classify the base of symbolic expression X, given that X appears in
1458    context CONTEXT.  */
1459
1460 static enum mips_symbol_type
1461 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1462 {
1463   rtx offset;
1464
1465   split_const (x, &x, &offset);
1466   if (UNSPEC_ADDRESS_P (x))
1467     return UNSPEC_ADDRESS_TYPE (x);
1468
1469   return mips_classify_symbol (x, context);
1470 }
1471
1472 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1473    is the alignment in bytes of SYMBOL_REF X.  */
1474
1475 static bool
1476 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1477 {
1478   HOST_WIDE_INT align;
1479
1480   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1481   return IN_RANGE (offset, 0, align - 1);
1482 }
1483
1484 /* Return true if X is a symbolic constant that can be used in context
1485    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1486
1487 bool
1488 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1489                           enum mips_symbol_type *symbol_type)
1490 {
1491   rtx offset;
1492
1493   split_const (x, &x, &offset);
1494   if (UNSPEC_ADDRESS_P (x))
1495     {
1496       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1497       x = UNSPEC_ADDRESS (x);
1498     }
1499   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1500     {
1501       *symbol_type = mips_classify_symbol (x, context);
1502       if (*symbol_type == SYMBOL_TLS)
1503         return false;
1504     }
1505   else
1506     return false;
1507
1508   if (offset == const0_rtx)
1509     return true;
1510
1511   /* Check whether a nonzero offset is valid for the underlying
1512      relocations.  */
1513   switch (*symbol_type)
1514     {
1515     case SYMBOL_ABSOLUTE:
1516     case SYMBOL_FORCE_TO_MEM:
1517     case SYMBOL_32_HIGH:
1518     case SYMBOL_64_HIGH:
1519     case SYMBOL_64_MID:
1520     case SYMBOL_64_LOW:
1521       /* If the target has 64-bit pointers and the object file only
1522          supports 32-bit symbols, the values of those symbols will be
1523          sign-extended.  In this case we can't allow an arbitrary offset
1524          in case the 32-bit value X + OFFSET has a different sign from X.  */
1525       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1526         return offset_within_block_p (x, INTVAL (offset));
1527
1528       /* In other cases the relocations can handle any offset.  */
1529       return true;
1530
1531     case SYMBOL_PC_RELATIVE:
1532       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1533          In this case, we no longer have access to the underlying constant,
1534          but the original symbol-based access was known to be valid.  */
1535       if (GET_CODE (x) == LABEL_REF)
1536         return true;
1537
1538       /* Fall through.  */
1539
1540     case SYMBOL_GP_RELATIVE:
1541       /* Make sure that the offset refers to something within the
1542          same object block.  This should guarantee that the final
1543          PC- or GP-relative offset is within the 16-bit limit.  */
1544       return offset_within_block_p (x, INTVAL (offset));
1545
1546     case SYMBOL_GOT_PAGE_OFST:
1547     case SYMBOL_GOTOFF_PAGE:
1548       /* If the symbol is global, the GOT entry will contain the symbol's
1549          address, and we will apply a 16-bit offset after loading it.
1550          If the symbol is local, the linker should provide enough local
1551          GOT entries for a 16-bit offset, but larger offsets may lead
1552          to GOT overflow.  */
1553       return SMALL_INT (offset);
1554
1555     case SYMBOL_TPREL:
1556     case SYMBOL_DTPREL:
1557       /* There is no carry between the HI and LO REL relocations, so the
1558          offset is only valid if we know it won't lead to such a carry.  */
1559       return mips_offset_within_alignment_p (x, INTVAL (offset));
1560
1561     case SYMBOL_GOT_DISP:
1562     case SYMBOL_GOTOFF_DISP:
1563     case SYMBOL_GOTOFF_CALL:
1564     case SYMBOL_GOTOFF_LOADGP:
1565     case SYMBOL_TLSGD:
1566     case SYMBOL_TLSLDM:
1567     case SYMBOL_GOTTPREL:
1568     case SYMBOL_TLS:
1569     case SYMBOL_HALF:
1570       return false;
1571     }
1572   gcc_unreachable ();
1573 }
1574 \f
1575 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1576    single instruction.  We rely on the fact that, in the worst case,
1577    all instructions involved in a MIPS16 address calculation are usually
1578    extended ones.  */
1579
1580 static int
1581 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1582 {
1583   switch (type)
1584     {
1585     case SYMBOL_ABSOLUTE:
1586       /* When using 64-bit symbols, we need 5 preparatory instructions,
1587          such as:
1588
1589              lui     $at,%highest(symbol)
1590              daddiu  $at,$at,%higher(symbol)
1591              dsll    $at,$at,16
1592              daddiu  $at,$at,%hi(symbol)
1593              dsll    $at,$at,16
1594
1595          The final address is then $at + %lo(symbol).  With 32-bit
1596          symbols we just need a preparatory LUI for normal mode and
1597          a preparatory LI and SLL for MIPS16.  */
1598       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1599
1600     case SYMBOL_GP_RELATIVE:
1601       /* Treat GP-relative accesses as taking a single instruction on
1602          MIPS16 too; the copy of $gp can often be shared.  */
1603       return 1;
1604
1605     case SYMBOL_PC_RELATIVE:
1606       /* PC-relative constants can be only be used with ADDIUPC,
1607          DADDIUPC, LWPC and LDPC.  */
1608       if (mode == MAX_MACHINE_MODE
1609           || GET_MODE_SIZE (mode) == 4
1610           || GET_MODE_SIZE (mode) == 8)
1611         return 1;
1612
1613       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1614       return 0;
1615
1616     case SYMBOL_FORCE_TO_MEM:
1617       /* LEAs will be converted into constant-pool references by
1618          mips_reorg.  */
1619       if (mode == MAX_MACHINE_MODE)
1620         return 1;
1621
1622       /* The constant must be loaded and then dereferenced.  */
1623       return 0;
1624
1625     case SYMBOL_GOT_DISP:
1626       /* The constant will have to be loaded from the GOT before it
1627          is used in an address.  */
1628       if (mode != MAX_MACHINE_MODE)
1629         return 0;
1630
1631       /* Fall through.  */
1632
1633     case SYMBOL_GOT_PAGE_OFST:
1634       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1635          local/global classification is accurate.  The worst cases are:
1636
1637          (1) For local symbols when generating o32 or o64 code.  The assembler
1638              will use:
1639
1640                  lw           $at,%got(symbol)
1641                  nop
1642
1643              ...and the final address will be $at + %lo(symbol).
1644
1645          (2) For global symbols when -mxgot.  The assembler will use:
1646
1647                  lui     $at,%got_hi(symbol)
1648                  (d)addu $at,$at,$gp
1649
1650              ...and the final address will be $at + %got_lo(symbol).  */
1651       return 3;
1652
1653     case SYMBOL_GOTOFF_PAGE:
1654     case SYMBOL_GOTOFF_DISP:
1655     case SYMBOL_GOTOFF_CALL:
1656     case SYMBOL_GOTOFF_LOADGP:
1657     case SYMBOL_32_HIGH:
1658     case SYMBOL_64_HIGH:
1659     case SYMBOL_64_MID:
1660     case SYMBOL_64_LOW:
1661     case SYMBOL_TLSGD:
1662     case SYMBOL_TLSLDM:
1663     case SYMBOL_DTPREL:
1664     case SYMBOL_GOTTPREL:
1665     case SYMBOL_TPREL:
1666     case SYMBOL_HALF:
1667       /* A 16-bit constant formed by a single relocation, or a 32-bit
1668          constant formed from a high 16-bit relocation and a low 16-bit
1669          relocation.  Use mips_split_p to determine which.  32-bit
1670          constants need an "lui; addiu" sequence for normal mode and
1671          an "li; sll; addiu" sequence for MIPS16 mode.  */
1672       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1673
1674     case SYMBOL_TLS:
1675       /* We don't treat a bare TLS symbol as a constant.  */
1676       return 0;
1677     }
1678   gcc_unreachable ();
1679 }
1680
1681 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1682    to load symbols of type TYPE into a register.  Return 0 if the given
1683    type of symbol cannot be used as an immediate operand.
1684
1685    Otherwise, return the number of instructions needed to load or store
1686    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1687    the given type of symbol is not valid in addresses.
1688
1689    In both cases, treat extended MIPS16 instructions as two instructions.  */
1690
1691 static int
1692 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1693 {
1694   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1695 }
1696 \f
1697 /* A for_each_rtx callback.  Stop the search if *X references a
1698    thread-local symbol.  */
1699
1700 static int
1701 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1702 {
1703   return mips_tls_symbol_p (*x);
1704 }
1705
1706 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1707
1708 static bool
1709 mips_cannot_force_const_mem (rtx x)
1710 {
1711   rtx base, offset;
1712
1713   if (!TARGET_MIPS16)
1714     {
1715       /* As an optimization, reject constants that mips_legitimize_move
1716          can expand inline.
1717
1718          Suppose we have a multi-instruction sequence that loads constant C
1719          into register R.  If R does not get allocated a hard register, and
1720          R is used in an operand that allows both registers and memory
1721          references, reload will consider forcing C into memory and using
1722          one of the instruction's memory alternatives.  Returning false
1723          here will force it to use an input reload instead.  */
1724       if (GET_CODE (x) == CONST_INT)
1725         return true;
1726
1727       split_const (x, &base, &offset);
1728       if (symbolic_operand (base, VOIDmode) && SMALL_INT (offset))
1729         return true;
1730     }
1731
1732   /* TLS symbols must be computed by mips_legitimize_move.  */
1733   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
1734     return true;
1735
1736   return false;
1737 }
1738
1739 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
1740    constants when we're using a per-function constant pool.  */
1741
1742 static bool
1743 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
1744                                 const_rtx x ATTRIBUTE_UNUSED)
1745 {
1746   return !TARGET_MIPS16_PCREL_LOADS;
1747 }
1748 \f
1749 /* Return true if register REGNO is a valid base register for mode MODE.
1750    STRICT_P is true if REG_OK_STRICT is in effect.  */
1751
1752 int
1753 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
1754                                bool strict_p)
1755 {
1756   if (!HARD_REGISTER_NUM_P (regno))
1757     {
1758       if (!strict_p)
1759         return true;
1760       regno = reg_renumber[regno];
1761     }
1762
1763   /* These fake registers will be eliminated to either the stack or
1764      hard frame pointer, both of which are usually valid base registers.
1765      Reload deals with the cases where the eliminated form isn't valid.  */
1766   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
1767     return true;
1768
1769   /* In MIPS16 mode, the stack pointer can only address word and doubleword
1770      values, nothing smaller.  There are two problems here:
1771
1772        (a) Instantiating virtual registers can introduce new uses of the
1773            stack pointer.  If these virtual registers are valid addresses,
1774            the stack pointer should be too.
1775
1776        (b) Most uses of the stack pointer are not made explicit until
1777            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
1778            We don't know until that stage whether we'll be eliminating to the
1779            stack pointer (which needs the restriction) or the hard frame
1780            pointer (which doesn't).
1781
1782      All in all, it seems more consistent to only enforce this restriction
1783      during and after reload.  */
1784   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
1785     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1786
1787   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
1788 }
1789
1790 /* Return true if X is a valid base register for mode MODE.
1791    STRICT_P is true if REG_OK_STRICT is in effect.  */
1792
1793 static bool
1794 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
1795 {
1796   if (!strict_p && GET_CODE (x) == SUBREG)
1797     x = SUBREG_REG (x);
1798
1799   return (REG_P (x)
1800           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
1801 }
1802
1803 /* Return true if X is a valid address for machine mode MODE.  If it is,
1804    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
1805    effect.  */
1806
1807 static bool
1808 mips_classify_address (struct mips_address_info *info, rtx x,
1809                        enum machine_mode mode, bool strict_p)
1810 {
1811   switch (GET_CODE (x))
1812     {
1813     case REG:
1814     case SUBREG:
1815       info->type = ADDRESS_REG;
1816       info->reg = x;
1817       info->offset = const0_rtx;
1818       return mips_valid_base_register_p (info->reg, mode, strict_p);
1819
1820     case PLUS:
1821       info->type = ADDRESS_REG;
1822       info->reg = XEXP (x, 0);
1823       info->offset = XEXP (x, 1);
1824       return (mips_valid_base_register_p (info->reg, mode, strict_p)
1825               && const_arith_operand (info->offset, VOIDmode));
1826
1827     case LO_SUM:
1828       info->type = ADDRESS_LO_SUM;
1829       info->reg = XEXP (x, 0);
1830       info->offset = XEXP (x, 1);
1831       /* We have to trust the creator of the LO_SUM to do something vaguely
1832          sane.  Target-independent code that creates a LO_SUM should also
1833          create and verify the matching HIGH.  Target-independent code that
1834          adds an offset to a LO_SUM must prove that the offset will not
1835          induce a carry.  Failure to do either of these things would be
1836          a bug, and we are not required to check for it here.  The MIPS
1837          backend itself should only create LO_SUMs for valid symbolic
1838          constants, with the high part being either a HIGH or a copy
1839          of _gp. */
1840       info->symbol_type
1841         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
1842       return (mips_valid_base_register_p (info->reg, mode, strict_p)
1843               && mips_symbol_insns (info->symbol_type, mode) > 0
1844               && mips_lo_relocs[info->symbol_type] != 0);
1845
1846     case CONST_INT:
1847       /* Small-integer addresses don't occur very often, but they
1848          are legitimate if $0 is a valid base register.  */
1849       info->type = ADDRESS_CONST_INT;
1850       return !TARGET_MIPS16 && SMALL_INT (x);
1851
1852     case CONST:
1853     case LABEL_REF:
1854     case SYMBOL_REF:
1855       info->type = ADDRESS_SYMBOLIC;
1856       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
1857                                         &info->symbol_type)
1858               && mips_symbol_insns (info->symbol_type, mode) > 0
1859               && !mips_split_p[info->symbol_type]);
1860
1861     default:
1862       return false;
1863     }
1864 }
1865
1866 /* Return true if X is a legitimate address for a memory operand of mode
1867    MODE.  STRICT_P is true if REG_OK_STRICT is in effect.  */
1868
1869 bool
1870 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
1871 {
1872   struct mips_address_info addr;
1873
1874   return mips_classify_address (&addr, x, mode, strict_p);
1875 }
1876
1877 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
1878
1879 bool
1880 mips_stack_address_p (rtx x, enum machine_mode mode)
1881 {
1882   struct mips_address_info addr;
1883
1884   return (mips_classify_address (&addr, x, mode, false)
1885           && addr.type == ADDRESS_REG
1886           && addr.reg == stack_pointer_rtx);
1887 }
1888
1889 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
1890    address instruction.  Note that such addresses are not considered
1891    legitimate in the GO_IF_LEGITIMATE_ADDRESS sense, because their use
1892    is so restricted.  */
1893
1894 static bool
1895 mips_lwxs_address_p (rtx addr)
1896 {
1897   if (ISA_HAS_LWXS
1898       && GET_CODE (addr) == PLUS
1899       && REG_P (XEXP (addr, 1)))
1900     {
1901       rtx offset = XEXP (addr, 0);
1902       if (GET_CODE (offset) == MULT
1903           && REG_P (XEXP (offset, 0))
1904           && GET_CODE (XEXP (offset, 1)) == CONST_INT
1905           && INTVAL (XEXP (offset, 1)) == 4)
1906         return true;
1907     }
1908   return false;
1909 }
1910 \f
1911 /* Return true if a value at OFFSET bytes from base register BASE can be
1912    accessed using an unextended MIPS16 instruction.  MODE is the mode of
1913    the value.
1914
1915    Usually the offset in an unextended instruction is a 5-bit field.
1916    The offset is unsigned and shifted left once for LH and SH, twice
1917    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
1918    an 8-bit immediate field that's shifted left twice.  */
1919
1920 static bool
1921 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
1922                                unsigned HOST_WIDE_INT offset)
1923 {
1924   if (offset % GET_MODE_SIZE (mode) == 0)
1925     {
1926       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
1927         return offset < 256U * GET_MODE_SIZE (mode);
1928       return offset < 32U * GET_MODE_SIZE (mode);
1929     }
1930   return false;
1931 }
1932
1933 /* Return the number of instructions needed to load or store a value
1934    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
1935    Assume that multiword moves may need to be split into word moves
1936    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
1937    enough.
1938
1939    For MIPS16 code, count extended instructions as two instructions.  */
1940
1941 int
1942 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
1943 {
1944   struct mips_address_info addr;
1945   int factor;
1946
1947   /* BLKmode is used for single unaligned loads and stores and should
1948      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
1949      meaningless, so we have to single it out as a special case one way
1950      or the other.)  */
1951   if (mode != BLKmode && might_split_p)
1952     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1953   else
1954     factor = 1;
1955
1956   if (mips_classify_address (&addr, x, mode, false))
1957     switch (addr.type)
1958       {
1959       case ADDRESS_REG:
1960         if (TARGET_MIPS16
1961             && !mips16_unextended_reference_p (mode, addr.reg,
1962                                                UINTVAL (addr.offset)))
1963           return factor * 2;
1964         return factor;
1965
1966       case ADDRESS_LO_SUM:
1967         return TARGET_MIPS16 ? factor * 2 : factor;
1968
1969       case ADDRESS_CONST_INT:
1970         return factor;
1971
1972       case ADDRESS_SYMBOLIC:
1973         return factor * mips_symbol_insns (addr.symbol_type, mode);
1974       }
1975   return 0;
1976 }
1977
1978 /* Return the number of instructions needed to load constant X.
1979    Return 0 if X isn't a valid constant.  */
1980
1981 int
1982 mips_const_insns (rtx x)
1983 {
1984   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
1985   enum mips_symbol_type symbol_type;
1986   rtx offset;
1987
1988   switch (GET_CODE (x))
1989     {
1990     case HIGH:
1991       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
1992                                      &symbol_type)
1993           || !mips_split_p[symbol_type])
1994         return 0;
1995
1996       /* This is simply an LUI for normal mode.  It is an extended
1997          LI followed by an extended SLL for MIPS16.  */
1998       return TARGET_MIPS16 ? 4 : 1;
1999
2000     case CONST_INT:
2001       if (TARGET_MIPS16)
2002         /* Unsigned 8-bit constants can be loaded using an unextended
2003            LI instruction.  Unsigned 16-bit constants can be loaded
2004            using an extended LI.  Negative constants must be loaded
2005            using LI and then negated.  */
2006         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2007                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2008                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2009                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2010                 : 0);
2011
2012       return mips_build_integer (codes, INTVAL (x));
2013
2014     case CONST_DOUBLE:
2015     case CONST_VECTOR:
2016       /* Allow zeros for normal mode, where we can use $0.  */
2017       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2018
2019     case CONST:
2020       if (CONST_GP_P (x))
2021         return 1;
2022
2023       /* See if we can refer to X directly.  */
2024       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2025         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2026
2027       /* Otherwise try splitting the constant into a base and offset.
2028          16-bit offsets can be added using an extra ADDIU.  Larger offsets
2029          must be calculated separately and then added to the base.  */
2030       split_const (x, &x, &offset);
2031       if (offset != 0)
2032         {
2033           int n = mips_const_insns (x);
2034           if (n != 0)
2035             {
2036               if (SMALL_INT (offset))
2037                 return n + 1;
2038               else
2039                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2040             }
2041         }
2042       return 0;
2043
2044     case SYMBOL_REF:
2045     case LABEL_REF:
2046       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2047                                 MAX_MACHINE_MODE);
2048
2049     default:
2050       return 0;
2051     }
2052 }
2053
2054 /* Return the number of instructions needed to implement INSN,
2055    given that it loads from or stores to MEM.  Count extended
2056    MIPS16 instructions as two instructions.  */
2057
2058 int
2059 mips_load_store_insns (rtx mem, rtx insn)
2060 {
2061   enum machine_mode mode;
2062   bool might_split_p;
2063   rtx set;
2064
2065   gcc_assert (MEM_P (mem));
2066   mode = GET_MODE (mem);
2067
2068   /* Try to prove that INSN does not need to be split.  */
2069   might_split_p = true;
2070   if (GET_MODE_BITSIZE (mode) == 64)
2071     {
2072       set = single_set (insn);
2073       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2074         might_split_p = false;
2075     }
2076
2077   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2078 }
2079
2080 /* Return the number of instructions needed for an integer division.  */
2081
2082 int
2083 mips_idiv_insns (void)
2084 {
2085   int count;
2086
2087   count = 1;
2088   if (TARGET_CHECK_ZERO_DIV)
2089     {
2090       if (GENERATE_DIVIDE_TRAPS)
2091         count++;
2092       else
2093         count += 2;
2094     }
2095
2096   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2097     count++;
2098   return count;
2099 }
2100 \f
2101 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2102    handle all moves if !can_create_pseudo_p ().  The distinction is
2103    important because, unlike emit_move_insn, the move expanders know
2104    how to force Pmode objects into the constant pool even when the
2105    constant pool address is not itself legitimate.  */
2106
2107 rtx
2108 mips_emit_move (rtx dest, rtx src)
2109 {
2110   return (can_create_pseudo_p ()
2111           ? emit_move_insn (dest, src)
2112           : emit_move_insn_1 (dest, src));
2113 }
2114
2115 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2116
2117 static void
2118 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2119 {
2120   emit_insn (gen_rtx_SET (VOIDmode, target,
2121                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2122 }
2123
2124 /* Copy VALUE to a register and return that register.  If new pseudos
2125    are allowed, copy it into a new register, otherwise use DEST.  */
2126
2127 static rtx
2128 mips_force_temporary (rtx dest, rtx value)
2129 {
2130   if (can_create_pseudo_p ())
2131     return force_reg (Pmode, value);
2132   else
2133     {
2134       mips_emit_move (dest, value);
2135       return dest;
2136     }
2137 }
2138 \f
2139 /* Return a pseudo register that contains the value of $gp throughout
2140    the current function.  Such registers are needed by MIPS16 functions,
2141    for which $gp itself is not a valid base register or addition operand.  */
2142
2143 static rtx
2144 mips16_gp_pseudo_reg (void)
2145 {
2146   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2147     cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2148
2149   /* Don't emit an instruction to initialize the pseudo register if
2150      we are being called from the tree optimizers' cost-calculation
2151      routines.  */
2152   if (!cfun->machine->initialized_mips16_gp_pseudo_p
2153       && (current_ir_type () != IR_GIMPLE || currently_expanding_to_rtl))
2154     {
2155       rtx insn, scan, after;
2156
2157       /* We want GCC to treat the register's value as constant, so that
2158          it can be rematerialized on demand.  */
2159       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2160
2161       push_topmost_sequence ();
2162       /* We need to emit the initialization after the FUNCTION_BEG
2163          note, so that it will be integrated.  */
2164       after = get_insns ();
2165       for (scan = after; scan != NULL_RTX; scan = NEXT_INSN (scan))
2166         if (NOTE_P (scan) && NOTE_KIND (scan) == NOTE_INSN_FUNCTION_BEG)
2167           {
2168             after = scan;
2169             break;
2170           }
2171       insn = emit_insn_after (insn, after);
2172       pop_topmost_sequence ();
2173
2174       cfun->machine->initialized_mips16_gp_pseudo_p = true;
2175     }
2176
2177   return cfun->machine->mips16_gp_pseudo_rtx;
2178 }
2179
2180 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2181    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2182    constant in that context and can be split into a high part and a LO_SUM.
2183    If so, and if LO_SUM_OUT is nonnull, emit the high part and return
2184    the LO_SUM in *LO_SUM_OUT.  Leave *LO_SUM_OUT unchanged otherwise.
2185
2186    TEMP is as for mips_force_temporary and is used to load the high
2187    part into a register.  */
2188
2189 bool
2190 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *lo_sum_out)
2191 {
2192   enum mips_symbol_context context;
2193   enum mips_symbol_type symbol_type;
2194   rtx high;
2195
2196   context = (mode == MAX_MACHINE_MODE
2197              ? SYMBOL_CONTEXT_LEA
2198              : SYMBOL_CONTEXT_MEM);
2199   if (!mips_symbolic_constant_p (addr, context, &symbol_type)
2200       || mips_symbol_insns (symbol_type, mode) == 0
2201       || !mips_split_p[symbol_type])
2202     return false;
2203
2204   if (lo_sum_out)
2205     {
2206       if (symbol_type == SYMBOL_GP_RELATIVE)
2207         {
2208           if (!can_create_pseudo_p ())
2209             {
2210               emit_insn (gen_load_const_gp (temp));
2211               high = temp;
2212             }
2213           else
2214             high = mips16_gp_pseudo_reg ();
2215         }
2216       else
2217         {
2218           high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2219           high = mips_force_temporary (temp, high);
2220         }
2221       *lo_sum_out = gen_rtx_LO_SUM (Pmode, high, addr);
2222     }
2223   return true;
2224 }
2225
2226 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2227    then add CONST_INT OFFSET to the result.  */
2228
2229 static rtx
2230 mips_unspec_address_offset (rtx base, rtx offset,
2231                             enum mips_symbol_type symbol_type)
2232 {
2233   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2234                          UNSPEC_ADDRESS_FIRST + symbol_type);
2235   if (offset != const0_rtx)
2236     base = gen_rtx_PLUS (Pmode, base, offset);
2237   return gen_rtx_CONST (Pmode, base);
2238 }
2239
2240 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2241    type SYMBOL_TYPE.  */
2242
2243 rtx
2244 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2245 {
2246   rtx base, offset;
2247
2248   split_const (address, &base, &offset);
2249   return mips_unspec_address_offset (base, offset, symbol_type);
2250 }
2251
2252 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2253    high part to BASE and return the result.  Just return BASE otherwise.
2254    TEMP is as for mips_force_temporary.
2255
2256    The returned expression can be used as the first operand to a LO_SUM.  */
2257
2258 static rtx
2259 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2260                          enum mips_symbol_type symbol_type)
2261 {
2262   if (mips_split_p[symbol_type])
2263     {
2264       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2265       addr = mips_force_temporary (temp, addr);
2266       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2267     }
2268   return base;
2269 }
2270
2271 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2272    mips_force_temporary; it is only needed when OFFSET is not a
2273    SMALL_OPERAND.  */
2274
2275 static rtx
2276 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2277 {
2278   if (!SMALL_OPERAND (offset))
2279     {
2280       rtx high;
2281
2282       if (TARGET_MIPS16)
2283         {
2284           /* Load the full offset into a register so that we can use
2285              an unextended instruction for the address itself.  */
2286           high = GEN_INT (offset);
2287           offset = 0;
2288         }
2289       else
2290         {
2291           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.  */
2292           high = GEN_INT (CONST_HIGH_PART (offset));
2293           offset = CONST_LOW_PART (offset);
2294         }
2295       high = mips_force_temporary (temp, high);
2296       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2297     }
2298   return plus_constant (reg, offset);
2299 }
2300 \f
2301 /* The __tls_get_attr symbol.  */
2302 static GTY(()) rtx mips_tls_symbol;
2303
2304 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2305    the TLS symbol we are referencing and TYPE is the symbol type to use
2306    (either global dynamic or local dynamic).  V0 is an RTX for the
2307    return value location.  */
2308
2309 static rtx
2310 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2311 {
2312   rtx insn, loc, tga, a0;
2313
2314   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2315
2316   if (!mips_tls_symbol)
2317     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2318
2319   loc = mips_unspec_address (sym, type);
2320
2321   start_sequence ();
2322
2323   emit_insn (gen_rtx_SET (Pmode, a0,
2324                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2325   tga = gen_const_mem (Pmode, mips_tls_symbol);
2326   insn = emit_call_insn (gen_call_value (v0, tga, const0_rtx, const0_rtx));
2327   CONST_OR_PURE_CALL_P (insn) = 1;
2328   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2329   insn = get_insns ();
2330
2331   end_sequence ();
2332
2333   return insn;
2334 }
2335
2336 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2337    its address.  The return value will be both a valid address and a valid
2338    SET_SRC (either a REG or a LO_SUM).  */
2339
2340 static rtx
2341 mips_legitimize_tls_address (rtx loc)
2342 {
2343   rtx dest, insn, v0, v1, tmp1, tmp2, eqv;
2344   enum tls_model model;
2345
2346   if (TARGET_MIPS16)
2347     {
2348       sorry ("MIPS16 TLS");
2349       return gen_reg_rtx (Pmode);
2350     }
2351
2352   model = SYMBOL_REF_TLS_MODEL (loc);
2353   /* Only TARGET_ABICALLS code can have more than one module; other
2354      code must be be static and should not use a GOT.  All TLS models
2355      reduce to local exec in this situation.  */
2356   if (!TARGET_ABICALLS)
2357     model = TLS_MODEL_LOCAL_EXEC;
2358
2359   switch (model)
2360     {
2361     case TLS_MODEL_GLOBAL_DYNAMIC:
2362       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2363       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2364       dest = gen_reg_rtx (Pmode);
2365       emit_libcall_block (insn, dest, v0, loc);
2366       break;
2367
2368     case TLS_MODEL_LOCAL_DYNAMIC:
2369       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2370       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2371       tmp1 = gen_reg_rtx (Pmode);
2372
2373       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2374          share the LDM result with other LD model accesses.  */
2375       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2376                             UNSPEC_TLS_LDM);
2377       emit_libcall_block (insn, tmp1, v0, eqv);
2378
2379       tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2380       dest = gen_rtx_LO_SUM (Pmode, tmp2,
2381                              mips_unspec_address (loc, SYMBOL_DTPREL));
2382       break;
2383
2384     case TLS_MODEL_INITIAL_EXEC:
2385       v1 = gen_rtx_REG (Pmode, GP_RETURN + 1);
2386       tmp1 = gen_reg_rtx (Pmode);
2387       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2388       if (Pmode == DImode)
2389         {
2390           emit_insn (gen_tls_get_tp_di (v1));
2391           emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2392         }
2393       else
2394         {
2395           emit_insn (gen_tls_get_tp_si (v1));
2396           emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2397         }
2398       dest = gen_reg_rtx (Pmode);
2399       emit_insn (gen_add3_insn (dest, tmp1, v1));
2400       break;
2401
2402     case TLS_MODEL_LOCAL_EXEC:
2403       v1 = gen_rtx_REG (Pmode, GP_RETURN + 1);
2404       if (Pmode == DImode)
2405         emit_insn (gen_tls_get_tp_di (v1));
2406       else
2407         emit_insn (gen_tls_get_tp_si (v1));
2408
2409       tmp1 = mips_unspec_offset_high (NULL, v1, loc, SYMBOL_TPREL);
2410       dest = gen_rtx_LO_SUM (Pmode, tmp1,
2411                              mips_unspec_address (loc, SYMBOL_TPREL));
2412       break;
2413
2414     default:
2415       gcc_unreachable ();
2416     }
2417   return dest;
2418 }
2419 \f
2420 /* This function is used to implement LEGITIMIZE_ADDRESS.  If *XLOC can
2421    be legitimized in a way that the generic machinery might not expect,
2422    put the new address in *XLOC and return true.  MODE is the mode of
2423    the memory being accessed.  */
2424
2425 bool
2426 mips_legitimize_address (rtx *xloc, enum machine_mode mode)
2427 {
2428   rtx base;
2429   HOST_WIDE_INT offset;
2430
2431   if (mips_tls_symbol_p (*xloc))
2432     {
2433       *xloc = mips_legitimize_tls_address (*xloc);
2434       return true;
2435     }
2436
2437   /* See if the address can split into a high part and a LO_SUM.  */
2438   if (mips_split_symbol (NULL, *xloc, mode, xloc))
2439     return true;
2440
2441   /* Handle BASE + OFFSET using mips_add_offset.  */
2442   mips_split_plus (*xloc, &base, &offset);
2443   if (offset != 0)
2444     {
2445       if (!mips_valid_base_register_p (base, mode, false))
2446         base = copy_to_mode_reg (Pmode, base);
2447       *xloc = mips_add_offset (NULL, base, offset);
2448       return true;
2449     }
2450   return false;
2451 }
2452
2453 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
2454
2455 void
2456 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
2457 {
2458   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2459   enum machine_mode mode;
2460   unsigned int i, num_ops;
2461   rtx x;
2462
2463   mode = GET_MODE (dest);
2464   num_ops = mips_build_integer (codes, value);
2465
2466   /* Apply each binary operation to X.  Invariant: X is a legitimate
2467      source operand for a SET pattern.  */
2468   x = GEN_INT (codes[0].value);
2469   for (i = 1; i < num_ops; i++)
2470     {
2471       if (!can_create_pseudo_p ())
2472         {
2473           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
2474           x = temp;
2475         }
2476       else
2477         x = force_reg (mode, x);
2478       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
2479     }
2480
2481   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
2482 }
2483
2484 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
2485    DEST given that SRC satisfies immediate_operand but doesn't satisfy
2486    move_operand.  */
2487
2488 static void
2489 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
2490 {
2491   rtx base, offset;
2492
2493   /* Split moves of big integers into smaller pieces.  */
2494   if (splittable_const_int_operand (src, mode))
2495     {
2496       mips_move_integer (dest, dest, INTVAL (src));
2497       return;
2498     }
2499
2500   /* Split moves of symbolic constants into high/low pairs.  */
2501   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
2502     {
2503       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
2504       return;
2505     }
2506
2507   /* Generate the appropriate access sequences for TLS symbols.  */
2508   if (mips_tls_symbol_p (src))
2509     {
2510       mips_emit_move (dest, mips_legitimize_tls_address (src));
2511       return;
2512     }
2513
2514   /* If we have (const (plus symbol offset)), and that expression cannot
2515      be forced into memory, load the symbol first and add in the offset.
2516      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
2517      forced into memory, as it usually produces better code.  */
2518   split_const (src, &base, &offset);
2519   if (offset != const0_rtx
2520       && (targetm.cannot_force_const_mem (src)
2521           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
2522     {
2523       base = mips_force_temporary (dest, base);
2524       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
2525       return;
2526     }
2527
2528   src = force_const_mem (mode, src);
2529
2530   /* When using explicit relocs, constant pool references are sometimes
2531      not legitimate addresses.  */
2532   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
2533   mips_emit_move (dest, src);
2534 }
2535
2536 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
2537    sequence that is valid.  */
2538
2539 bool
2540 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
2541 {
2542   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
2543     {
2544       mips_emit_move (dest, force_reg (mode, src));
2545       return true;
2546     }
2547
2548   /* Check for individual, fully-reloaded mflo and mfhi instructions.  */
2549   if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
2550       && REG_P (src) && MD_REG_P (REGNO (src))
2551       && REG_P (dest) && GP_REG_P (REGNO (dest)))
2552     {
2553       int other_regno = REGNO (src) == HI_REGNUM ? LO_REGNUM : HI_REGNUM;
2554       if (GET_MODE_SIZE (mode) <= 4)
2555         emit_insn (gen_mfhilo_si (gen_lowpart (SImode, dest),
2556                                   gen_lowpart (SImode, src),
2557                                   gen_rtx_REG (SImode, other_regno)));
2558       else
2559         emit_insn (gen_mfhilo_di (gen_lowpart (DImode, dest),
2560                                   gen_lowpart (DImode, src),
2561                                   gen_rtx_REG (DImode, other_regno)));
2562       return true;
2563     }
2564
2565   /* We need to deal with constants that would be legitimate
2566      immediate_operands but aren't legitimate move_operands.  */
2567   if (CONSTANT_P (src) && !move_operand (src, mode))
2568     {
2569       mips_legitimize_const_move (mode, dest, src);
2570       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
2571       return true;
2572     }
2573   return false;
2574 }
2575 \f
2576 /* Return true if value X in context CONTEXT is a small-data address
2577    that can be rewritten as a LO_SUM.  */
2578
2579 static bool
2580 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
2581 {
2582   enum mips_symbol_type symbol_type;
2583
2584   return (TARGET_EXPLICIT_RELOCS
2585           && mips_symbolic_constant_p (x, context, &symbol_type)
2586           && symbol_type == SYMBOL_GP_RELATIVE);
2587 }
2588
2589 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
2590    containing MEM, or null if none.  */
2591
2592 static int
2593 mips_small_data_pattern_1 (rtx *loc, void *data)
2594 {
2595   enum mips_symbol_context context;
2596
2597   if (GET_CODE (*loc) == LO_SUM)
2598     return -1;
2599
2600   if (MEM_P (*loc))
2601     {
2602       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
2603         return 1;
2604       return -1;
2605     }
2606
2607   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
2608   return mips_rewrite_small_data_p (*loc, context);
2609 }
2610
2611 /* Return true if OP refers to small data symbols directly, not through
2612    a LO_SUM.  */
2613
2614 bool
2615 mips_small_data_pattern_p (rtx op)
2616 {
2617   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
2618 }
2619
2620 /* A for_each_rtx callback, used by mips_rewrite_small_data.
2621    DATA is the containing MEM, or null if none.  */
2622
2623 static int
2624 mips_rewrite_small_data_1 (rtx *loc, void *data)
2625 {
2626   enum mips_symbol_context context;
2627
2628   if (MEM_P (*loc))
2629     {
2630       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
2631       return -1;
2632     }
2633
2634   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
2635   if (mips_rewrite_small_data_p (*loc, context))
2636     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
2637
2638   if (GET_CODE (*loc) == LO_SUM)
2639     return -1;
2640
2641   return 0;
2642 }
2643
2644 /* Rewrite instruction pattern PATTERN so that it refers to small data
2645    using explicit relocations.  */
2646
2647 rtx
2648 mips_rewrite_small_data (rtx pattern)
2649 {
2650   pattern = copy_insn (pattern);
2651   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
2652   return pattern;
2653 }
2654 \f
2655 /* We need a lot of little routines to check the range of MIPS16 immediate
2656    operands.  */
2657
2658 static int
2659 m16_check_op (rtx op, int low, int high, int mask)
2660 {
2661   return (GET_CODE (op) == CONST_INT
2662           && IN_RANGE (INTVAL (op), low, high)
2663           && (INTVAL (op) & mask) == 0);
2664 }
2665
2666 int
2667 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2668 {
2669   return m16_check_op (op, 0x1, 0x8, 0);
2670 }
2671
2672 int
2673 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2674 {
2675   return m16_check_op (op, -0x8, 0x7, 0);
2676 }
2677
2678 int
2679 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2680 {
2681   return m16_check_op (op, -0x7, 0x8, 0);
2682 }
2683
2684 int
2685 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2686 {
2687   return m16_check_op (op, -0x10, 0xf, 0);
2688 }
2689
2690 int
2691 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2692 {
2693   return m16_check_op (op, -0xf, 0x10, 0);
2694 }
2695
2696 int
2697 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2698 {
2699   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
2700 }
2701
2702 int
2703 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2704 {
2705   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
2706 }
2707
2708 int
2709 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2710 {
2711   return m16_check_op (op, -0x80, 0x7f, 0);
2712 }
2713
2714 int
2715 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2716 {
2717   return m16_check_op (op, -0x7f, 0x80, 0);
2718 }
2719
2720 int
2721 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2722 {
2723   return m16_check_op (op, 0x0, 0xff, 0);
2724 }
2725
2726 int
2727 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2728 {
2729   return m16_check_op (op, -0xff, 0x0, 0);
2730 }
2731
2732 int
2733 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2734 {
2735   return m16_check_op (op, -0x1, 0xfe, 0);
2736 }
2737
2738 int
2739 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2740 {
2741   return m16_check_op (op, 0x0, 0xff << 2, 3);
2742 }
2743
2744 int
2745 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2746 {
2747   return m16_check_op (op, -0xff << 2, 0x0, 3);
2748 }
2749
2750 int
2751 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2752 {
2753   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
2754 }
2755
2756 int
2757 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2758 {
2759   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
2760 }
2761 \f
2762 /* The cost of loading values from the constant pool.  It should be
2763    larger than the cost of any constant we want to synthesize inline.  */
2764 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
2765
2766 /* Return the cost of X when used as an operand to the MIPS16 instruction
2767    that implements CODE.  Return -1 if there is no such instruction, or if
2768    X is not a valid immediate operand for it.  */
2769
2770 static int
2771 mips16_constant_cost (int code, HOST_WIDE_INT x)
2772 {
2773   switch (code)
2774     {
2775     case ASHIFT:
2776     case ASHIFTRT:
2777     case LSHIFTRT:
2778       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
2779          other shifts are extended.  The shift patterns truncate the shift
2780          count to the right size, so there are no out-of-range values.  */
2781       if (IN_RANGE (x, 1, 8))
2782         return 0;
2783       return COSTS_N_INSNS (1);
2784
2785     case PLUS:
2786       if (IN_RANGE (x, -128, 127))
2787         return 0;
2788       if (SMALL_OPERAND (x))
2789         return COSTS_N_INSNS (1);
2790       return -1;
2791
2792     case LEU:
2793       /* Like LE, but reject the always-true case.  */
2794       if (x == -1)
2795         return -1;
2796     case LE:
2797       /* We add 1 to the immediate and use SLT.  */
2798       x += 1;
2799     case XOR:
2800       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
2801     case LT:
2802     case LTU:
2803       if (IN_RANGE (x, 0, 255))
2804         return 0;
2805       if (SMALL_OPERAND_UNSIGNED (x))
2806         return COSTS_N_INSNS (1);
2807       return -1;
2808
2809     case EQ:
2810     case NE:
2811       /* Equality comparisons with 0 are cheap.  */
2812       if (x == 0)
2813         return 0;
2814       return -1;
2815
2816     default:
2817       return -1;
2818     }
2819 }
2820
2821 /* Return true if there is a non-MIPS16 instruction that implements CODE
2822    and if that instruction accepts X as an immediate operand.  */
2823
2824 static int
2825 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
2826 {
2827   switch (code)
2828     {
2829     case ASHIFT:
2830     case ASHIFTRT:
2831     case LSHIFTRT:
2832       /* All shift counts are truncated to a valid constant.  */
2833       return true;
2834
2835     case ROTATE:
2836     case ROTATERT:
2837       /* Likewise rotates, if the target supports rotates at all.  */
2838       return ISA_HAS_ROR;
2839
2840     case AND:
2841     case IOR:
2842     case XOR:
2843       /* These instructions take 16-bit unsigned immediates.  */
2844       return SMALL_OPERAND_UNSIGNED (x);
2845
2846     case PLUS:
2847     case LT:
2848     case LTU:
2849       /* These instructions take 16-bit signed immediates.  */
2850       return SMALL_OPERAND (x);
2851
2852     case EQ:
2853     case NE:
2854     case GT:
2855     case GTU:
2856       /* The "immediate" forms of these instructions are really
2857          implemented as comparisons with register 0.  */
2858       return x == 0;
2859
2860     case GE:
2861     case GEU:
2862       /* Likewise, meaning that the only valid immediate operand is 1.  */
2863       return x == 1;
2864
2865     case LE:
2866       /* We add 1 to the immediate and use SLT.  */
2867       return SMALL_OPERAND (x + 1);
2868
2869     case LEU:
2870       /* Likewise SLTU, but reject the always-true case.  */
2871       return SMALL_OPERAND (x + 1) && x + 1 != 0;
2872
2873     case SIGN_EXTRACT:
2874     case ZERO_EXTRACT:
2875       /* The bit position and size are immediate operands.  */
2876       return ISA_HAS_EXT_INS;
2877
2878     default:
2879       /* By default assume that $0 can be used for 0.  */
2880       return x == 0;
2881     }
2882 }
2883
2884 /* Return the cost of binary operation X, given that the instruction
2885    sequence for a word-sized or smaller operation has cost SINGLE_COST
2886    and that the sequence of a double-word operation has cost DOUBLE_COST.  */
2887
2888 static int
2889 mips_binary_cost (rtx x, int single_cost, int double_cost)
2890 {
2891   int cost;
2892
2893   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
2894     cost = double_cost;
2895   else
2896     cost = single_cost;
2897   return (cost
2898           + rtx_cost (XEXP (x, 0), 0)
2899           + rtx_cost (XEXP (x, 1), GET_CODE (x)));
2900 }
2901
2902 /* Return the cost of floating-point multiplications of mode MODE.  */
2903
2904 static int
2905 mips_fp_mult_cost (enum machine_mode mode)
2906 {
2907   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
2908 }
2909
2910 /* Return the cost of floating-point divisions of mode MODE.  */
2911
2912 static int
2913 mips_fp_div_cost (enum machine_mode mode)
2914 {
2915   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
2916 }
2917
2918 /* Return the cost of sign-extending OP to mode MODE, not including the
2919    cost of OP itself.  */
2920
2921 static int
2922 mips_sign_extend_cost (enum machine_mode mode, rtx op)
2923 {
2924   if (MEM_P (op))
2925     /* Extended loads are as cheap as unextended ones.  */
2926     return 0;
2927
2928   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
2929     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
2930     return 0;
2931
2932   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
2933     /* We can use SEB or SEH.  */
2934     return COSTS_N_INSNS (1);
2935
2936   /* We need to use a shift left and a shift right.  */
2937   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
2938 }
2939
2940 /* Return the cost of zero-extending OP to mode MODE, not including the
2941    cost of OP itself.  */
2942
2943 static int
2944 mips_zero_extend_cost (enum machine_mode mode, rtx op)
2945 {
2946   if (MEM_P (op))
2947     /* Extended loads are as cheap as unextended ones.  */
2948     return 0;
2949
2950   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
2951     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
2952     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
2953
2954   if (GENERATE_MIPS16E)
2955     /* We can use ZEB or ZEH.  */
2956     return COSTS_N_INSNS (1);
2957
2958   if (TARGET_MIPS16)
2959     /* We need to load 0xff or 0xffff into a register and use AND.  */
2960     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
2961
2962   /* We can use ANDI.  */
2963   return COSTS_N_INSNS (1);
2964 }
2965
2966 /* Implement TARGET_RTX_COSTS.  */
2967
2968 static bool
2969 mips_rtx_costs (rtx x, int code, int outer_code, int *total)
2970 {
2971   enum machine_mode mode = GET_MODE (x);
2972   bool float_mode_p = FLOAT_MODE_P (mode);
2973   int cost;
2974   rtx addr;
2975
2976   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
2977      appear in the instruction stream, and the cost of a comparison is
2978      really the cost of the branch or scc condition.  At the time of
2979      writing, GCC only uses an explicit outer COMPARE code when optabs
2980      is testing whether a constant is expensive enough to force into a
2981      register.  We want optabs to pass such constants through the MIPS
2982      expanders instead, so make all constants very cheap here.  */
2983   if (outer_code == COMPARE)
2984     {
2985       gcc_assert (CONSTANT_P (x));
2986       *total = 0;
2987       return true;
2988     }
2989
2990   switch (code)
2991     {
2992     case CONST_INT:
2993       /* Treat *clear_upper32-style ANDs as having zero cost in the
2994          second operand.  The cost is entirely in the first operand.
2995
2996          ??? This is needed because we would otherwise try to CSE
2997          the constant operand.  Although that's the right thing for
2998          instructions that continue to be a register operation throughout
2999          compilation, it is disastrous for instructions that could
3000          later be converted into a memory operation.  */
3001       if (TARGET_64BIT
3002           && outer_code == AND
3003           && UINTVAL (x) == 0xffffffff)
3004         {
3005           *total = 0;
3006           return true;
3007         }
3008
3009       if (TARGET_MIPS16)
3010         {
3011           cost = mips16_constant_cost (outer_code, INTVAL (x));
3012           if (cost >= 0)
3013             {
3014               *total = cost;
3015               return true;
3016             }
3017         }
3018       else
3019         {
3020           /* When not optimizing for size, we care more about the cost
3021              of hot code, and hot code is often in a loop.  If a constant
3022              operand needs to be forced into a register, we will often be
3023              able to hoist the constant load out of the loop, so the load
3024              should not contribute to the cost.  */
3025           if (!optimize_size
3026               || mips_immediate_operand_p (outer_code, INTVAL (x)))
3027             {
3028               *total = 0;
3029               return true;
3030             }
3031         }
3032       /* Fall through.  */
3033
3034     case CONST:
3035     case SYMBOL_REF:
3036     case LABEL_REF:
3037     case CONST_DOUBLE:
3038       if (force_to_mem_operand (x, VOIDmode))
3039         {
3040           *total = COSTS_N_INSNS (1);
3041           return true;
3042         }
3043       cost = mips_const_insns (x);
3044       if (cost > 0)
3045         {
3046           /* If the constant is likely to be stored in a GPR, SETs of
3047              single-insn constants are as cheap as register sets; we
3048              never want to CSE them.
3049
3050              Don't reduce the cost of storing a floating-point zero in
3051              FPRs.  If we have a zero in an FPR for other reasons, we
3052              can get better cfg-cleanup and delayed-branch results by
3053              using it consistently, rather than using $0 sometimes and
3054              an FPR at other times.  Also, moves between floating-point
3055              registers are sometimes cheaper than (D)MTC1 $0.  */
3056           if (cost == 1
3057               && outer_code == SET
3058               && !(float_mode_p && TARGET_HARD_FLOAT))
3059             cost = 0;
3060           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3061              want to CSE the constant itself.  It is usually better to
3062              have N copies of the last operation in the sequence and one
3063              shared copy of the other operations.  (Note that this is
3064              not true for MIPS16 code, where the final operation in the
3065              sequence is often an extended instruction.)
3066
3067              Also, if we have a CONST_INT, we don't know whether it is
3068              for a word or doubleword operation, so we cannot rely on
3069              the result of mips_build_integer.  */
3070           else if (!TARGET_MIPS16
3071                    && (outer_code == SET || mode == VOIDmode))
3072             cost = 1;
3073           *total = COSTS_N_INSNS (cost);
3074           return true;
3075         }
3076       /* The value will need to be fetched from the constant pool.  */
3077       *total = CONSTANT_POOL_COST;
3078       return true;
3079
3080     case MEM:
3081       /* If the address is legitimate, return the number of
3082          instructions it needs.  */
3083       addr = XEXP (x, 0);
3084       cost = mips_address_insns (addr, mode, true);
3085       if (cost > 0)
3086         {
3087           *total = COSTS_N_INSNS (cost + 1);
3088           return true;
3089         }
3090       /* Check for a scaled indexed address.  */
3091       if (mips_lwxs_address_p (addr))
3092         {
3093           *total = COSTS_N_INSNS (2);
3094           return true;
3095         }
3096       /* Otherwise use the default handling.  */
3097       return false;
3098
3099     case FFS:
3100       *total = COSTS_N_INSNS (6);
3101       return false;
3102
3103     case NOT:
3104       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3105       return false;
3106
3107     case AND:
3108       /* Check for a *clear_upper32 pattern and treat it like a zero
3109          extension.  See the pattern's comment for details.  */
3110       if (TARGET_64BIT
3111           && mode == DImode
3112           && CONST_INT_P (XEXP (x, 1))
3113           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3114         {
3115           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3116                     + rtx_cost (XEXP (x, 0), 0));
3117           return true;
3118         }
3119       /* Fall through.  */
3120
3121     case IOR:
3122     case XOR:
3123       /* Double-word operations use two single-word operations.  */
3124       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2));
3125       return true;
3126
3127     case ASHIFT:
3128     case ASHIFTRT:
3129     case LSHIFTRT:
3130     case ROTATE:
3131     case ROTATERT:
3132       if (CONSTANT_P (XEXP (x, 1)))
3133         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4));
3134       else
3135         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12));
3136       return true;
3137
3138     case ABS:
3139       if (float_mode_p)
3140         *total = mips_cost->fp_add;
3141       else
3142         *total = COSTS_N_INSNS (4);
3143       return false;
3144
3145     case LO_SUM:
3146       /* Low-part immediates need an extended MIPS16 instruction.  */
3147       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3148                 + rtx_cost (XEXP (x, 0), 0));
3149       return true;
3150
3151     case LT:
3152     case LTU:
3153     case LE:
3154     case LEU:
3155     case GT:
3156     case GTU:
3157     case GE:
3158     case GEU:
3159     case EQ:
3160     case NE:
3161     case UNORDERED:
3162     case LTGT:
3163       /* Branch comparisons have VOIDmode, so use the first operand's
3164          mode instead.  */
3165       mode = GET_MODE (XEXP (x, 0));
3166       if (FLOAT_MODE_P (mode))
3167         {
3168           *total = mips_cost->fp_add;
3169           return false;
3170         }
3171       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4));
3172       return true;
3173
3174     case MINUS:
3175       if (float_mode_p
3176           && ISA_HAS_NMADD_NMSUB (mode)
3177           && TARGET_FUSED_MADD
3178           && !HONOR_NANS (mode)
3179           && !HONOR_SIGNED_ZEROS (mode))
3180         {
3181           /* See if we can use NMADD or NMSUB.  See mips.md for the
3182              associated patterns.  */
3183           rtx op0 = XEXP (x, 0);
3184           rtx op1 = XEXP (x, 1);
3185           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3186             {
3187               *total = (mips_fp_mult_cost (mode)
3188                         + rtx_cost (XEXP (XEXP (op0, 0), 0), 0)
3189                         + rtx_cost (XEXP (op0, 1), 0)
3190                         + rtx_cost (op1, 0));
3191               return true;
3192             }
3193           if (GET_CODE (op1) == MULT)
3194             {
3195               *total = (mips_fp_mult_cost (mode)
3196                         + rtx_cost (op0, 0)
3197                         + rtx_cost (XEXP (op1, 0), 0)
3198                         + rtx_cost (XEXP (op1, 1), 0));
3199               return true;
3200             }
3201         }
3202       /* Fall through.  */
3203
3204     case PLUS:
3205       if (float_mode_p)
3206         {
3207           /* If this is part of a MADD or MSUB, treat the PLUS as
3208              being free.  */
3209           if (ISA_HAS_FP4
3210               && TARGET_FUSED_MADD
3211               && GET_CODE (XEXP (x, 0)) == MULT)
3212             *total = 0;
3213           else
3214             *total = mips_cost->fp_add;
3215           return false;
3216         }
3217
3218       /* Double-word operations require three single-word operations and
3219          an SLTU.  The MIPS16 version then needs to move the result of
3220          the SLTU from $24 to a MIPS16 register.  */
3221       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3222                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4));
3223       return true;
3224
3225     case NEG:
3226       if (float_mode_p
3227           && ISA_HAS_NMADD_NMSUB (mode)
3228           && TARGET_FUSED_MADD
3229           && !HONOR_NANS (mode)
3230           && HONOR_SIGNED_ZEROS (mode))
3231         {
3232           /* See if we can use NMADD or NMSUB.  See mips.md for the
3233              associated patterns.  */
3234           rtx op = XEXP (x, 0);
3235           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3236               && GET_CODE (XEXP (op, 0)) == MULT)
3237             {
3238               *total = (mips_fp_mult_cost (mode)
3239                         + rtx_cost (XEXP (XEXP (op, 0), 0), 0)
3240                         + rtx_cost (XEXP (XEXP (op, 0), 1), 0)
3241                         + rtx_cost (XEXP (op, 1), 0));
3242               return true;
3243             }
3244         }
3245
3246       if (float_mode_p)
3247         *total = mips_cost->fp_add;
3248       else
3249         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3250       return false;
3251
3252     case MULT:
3253       if (float_mode_p)
3254         *total = mips_fp_mult_cost (mode);
3255       else if (mode == DImode && !TARGET_64BIT)
3256         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3257            where the mulsidi3 always includes an MFHI and an MFLO.  */
3258         *total = (optimize_size
3259                   ? COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9)
3260                   : mips_cost->int_mult_si * 3 + 6);
3261       else if (optimize_size)
3262         *total = (ISA_HAS_MUL3 ? 1 : 2);
3263       else if (mode == DImode)
3264         *total = mips_cost->int_mult_di;
3265       else
3266         *total = mips_cost->int_mult_si;
3267       return false;
3268
3269     case DIV:
3270       /* Check for a reciprocal.  */
3271       if (float_mode_p
3272           && ISA_HAS_FP4
3273           && flag_unsafe_math_optimizations
3274           && XEXP (x, 0) == CONST1_RTX (mode))
3275         {
3276           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3277             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3278                division as being free.  */
3279             *total = rtx_cost (XEXP (x, 1), 0);
3280           else
3281             *total = mips_fp_div_cost (mode) + rtx_cost (XEXP (x, 1), 0);
3282           return true;
3283         }
3284       /* Fall through.  */
3285
3286     case SQRT:
3287     case MOD:
3288       if (float_mode_p)
3289         {
3290           *total = mips_fp_div_cost (mode);
3291           return false;
3292         }
3293       /* Fall through.  */
3294
3295     case UDIV:
3296     case UMOD:
3297       if (optimize_size)
3298         {
3299           /* It is our responsibility to make division by a power of 2
3300              as cheap as 2 register additions if we want the division
3301              expanders to be used for such operations; see the setting
3302              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3303              should always produce shorter code than using
3304              expand_sdiv2_pow2.  */
3305           if (TARGET_MIPS16
3306               && CONST_INT_P (XEXP (x, 1))
3307               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3308             {
3309               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), 0);
3310               return true;
3311             }
3312           *total = COSTS_N_INSNS (mips_idiv_insns ());
3313         }
3314       else if (mode == DImode)
3315         *total = mips_cost->int_div_di;
3316       else
3317         *total = mips_cost->int_div_si;
3318       return false;
3319
3320     case SIGN_EXTEND:
3321       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3322       return false;
3323
3324     case ZERO_EXTEND:
3325       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3326       return false;
3327
3328     case FLOAT:
3329     case UNSIGNED_FLOAT:
3330     case FIX:
3331     case FLOAT_EXTEND:
3332     case FLOAT_TRUNCATE:
3333       *total = mips_cost->fp_add;
3334       return false;
3335
3336     default:
3337       return false;
3338     }
3339 }
3340
3341 /* Implement TARGET_ADDRESS_COST.  */
3342
3343 static int
3344 mips_address_cost (rtx addr)
3345 {
3346   return mips_address_insns (addr, SImode, false);
3347 }
3348 \f
3349 /* Return one word of double-word value OP, taking into account the fixed
3350    endianness of certain registers.  HIGH_P is true to select the high part,
3351    false to select the low part.  */
3352
3353 rtx
3354 mips_subword (rtx op, bool high_p)
3355 {
3356   unsigned int byte, offset;
3357   enum machine_mode mode;
3358
3359   mode = GET_MODE (op);
3360   if (mode == VOIDmode)
3361     mode = DImode;
3362
3363   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
3364     byte = UNITS_PER_WORD;
3365   else
3366     byte = 0;
3367
3368   if (FP_REG_RTX_P (op))
3369     {
3370       /* Paired FPRs are always ordered little-endian.  */
3371       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
3372       return gen_rtx_REG (word_mode, REGNO (op) + offset);
3373     }
3374
3375   if (MEM_P (op))
3376     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
3377
3378   return simplify_gen_subreg (word_mode, op, mode, byte);
3379 }
3380
3381 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
3382
3383 bool
3384 mips_split_64bit_move_p (rtx dest, rtx src)
3385 {
3386   if (TARGET_64BIT)
3387     return false;
3388
3389   /* FPR-to-FPR moves can be done in a single instruction, if they're
3390      allowed at all.  */
3391   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
3392     return false;
3393
3394   /* Check for floating-point loads and stores.  */
3395   if (ISA_HAS_LDC1_SDC1)
3396     {
3397       if (FP_REG_RTX_P (dest) && MEM_P (src))
3398         return false;
3399       if (FP_REG_RTX_P (src) && MEM_P (dest))
3400         return false;
3401     }
3402   return true;
3403 }
3404
3405 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
3406    this function handles 64-bit moves for which mips_split_64bit_move_p
3407    holds.  For 64-bit targets, this function handles 128-bit moves.  */
3408
3409 void
3410 mips_split_doubleword_move (rtx dest, rtx src)
3411 {
3412   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
3413     {
3414       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
3415         emit_insn (gen_move_doubleword_fprdi (dest, src));
3416       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
3417         emit_insn (gen_move_doubleword_fprdf (dest, src));
3418       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
3419         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
3420       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
3421         emit_insn (gen_move_doubleword_fprtf (dest, src));
3422       else
3423         gcc_unreachable ();
3424     }
3425   else
3426     {
3427       /* The operation can be split into two normal moves.  Decide in
3428          which order to do them.  */
3429       rtx low_dest;
3430
3431       low_dest = mips_subword (dest, false);
3432       if (REG_P (low_dest)
3433           && reg_overlap_mentioned_p (low_dest, src))
3434         {
3435           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
3436           mips_emit_move (low_dest, mips_subword (src, false));
3437         }
3438       else
3439         {
3440           mips_emit_move (low_dest, mips_subword (src, false));
3441           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
3442         }
3443     }
3444 }
3445 \f
3446 /* Return the appropriate instructions to move SRC into DEST.  Assume
3447    that SRC is operand 1 and DEST is operand 0.  */
3448
3449 const char *
3450 mips_output_move (rtx dest, rtx src)
3451 {
3452   enum rtx_code dest_code, src_code;
3453   enum machine_mode mode;
3454   enum mips_symbol_type symbol_type;
3455   bool dbl_p;
3456
3457   dest_code = GET_CODE (dest);
3458   src_code = GET_CODE (src);
3459   mode = GET_MODE (dest);
3460   dbl_p = (GET_MODE_SIZE (mode) == 8);
3461
3462   if (dbl_p && mips_split_64bit_move_p (dest, src))
3463     return "#";
3464
3465   if ((src_code == REG && GP_REG_P (REGNO (src)))
3466       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
3467     {
3468       if (dest_code == REG)
3469         {
3470           if (GP_REG_P (REGNO (dest)))
3471             return "move\t%0,%z1";
3472
3473           if (MD_REG_P (REGNO (dest)))
3474             return "mt%0\t%z1";
3475
3476           if (DSP_ACC_REG_P (REGNO (dest)))
3477             {
3478               static char retval[] = "mt__\t%z1,%q0";
3479
3480               retval[2] = reg_names[REGNO (dest)][4];
3481               retval[3] = reg_names[REGNO (dest)][5];
3482               return retval;
3483             }
3484
3485           if (FP_REG_P (REGNO (dest)))
3486             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
3487
3488           if (ALL_COP_REG_P (REGNO (dest)))
3489             {
3490               static char retval[] = "dmtc_\t%z1,%0";
3491
3492               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3493               return dbl_p ? retval : retval + 1;
3494             }
3495         }
3496       if (dest_code == MEM)
3497         return dbl_p ? "sd\t%z1,%0" : "sw\t%z1,%0";
3498     }
3499   if (dest_code == REG && GP_REG_P (REGNO (dest)))
3500     {
3501       if (src_code == REG)
3502         {
3503           /* Handled by separate patterns.  */
3504           gcc_assert (!MD_REG_P (REGNO (src)));
3505
3506           if (DSP_ACC_REG_P (REGNO (src)))
3507             {
3508               static char retval[] = "mf__\t%0,%q1";
3509
3510               retval[2] = reg_names[REGNO (src)][4];
3511               retval[3] = reg_names[REGNO (src)][5];
3512               return retval;
3513             }
3514
3515           if (FP_REG_P (REGNO (src)))
3516             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
3517
3518           if (ALL_COP_REG_P (REGNO (src)))
3519             {
3520               static char retval[] = "dmfc_\t%0,%1";
3521
3522               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3523               return dbl_p ? retval : retval + 1;
3524             }
3525
3526           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
3527             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
3528         }
3529
3530       if (src_code == MEM)
3531         return dbl_p ? "ld\t%0,%1" : "lw\t%0,%1";
3532
3533       if (src_code == CONST_INT)
3534         {
3535           /* Don't use the X format for the operand itself, because that
3536              will give out-of-range numbers for 64-bit hosts and 32-bit
3537              targets.  */
3538           if (!TARGET_MIPS16)
3539             return "li\t%0,%1\t\t\t# %X1";
3540
3541           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
3542             return "li\t%0,%1";
3543
3544           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
3545             return "#";
3546         }
3547
3548       if (src_code == HIGH)
3549         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
3550
3551       if (CONST_GP_P (src))
3552         return "move\t%0,%1";
3553
3554       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
3555           && mips_lo_relocs[symbol_type] != 0)
3556         {
3557           /* A signed 16-bit constant formed by applying a relocation
3558              operator to a symbolic address.  */
3559           gcc_assert (!mips_split_p[symbol_type]);
3560           return "li\t%0,%R1";
3561         }
3562
3563       if (symbolic_operand (src, VOIDmode))
3564         {
3565           gcc_assert (TARGET_MIPS16
3566                       ? TARGET_MIPS16_TEXT_LOADS
3567                       : !TARGET_EXPLICIT_RELOCS);
3568           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
3569         }
3570     }
3571   if (src_code == REG && FP_REG_P (REGNO (src)))
3572     {
3573       if (dest_code == REG && FP_REG_P (REGNO (dest)))
3574         {
3575           if (GET_MODE (dest) == V2SFmode)
3576             return "mov.ps\t%0,%1";
3577           else
3578             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
3579         }
3580
3581       if (dest_code == MEM)
3582         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
3583     }
3584   if (dest_code == REG && FP_REG_P (REGNO (dest)))
3585     {
3586       if (src_code == MEM)
3587         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
3588     }
3589   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
3590     {
3591       static char retval[] = "l_c_\t%0,%1";
3592
3593       retval[1] = (dbl_p ? 'd' : 'w');
3594       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3595       return retval;
3596     }
3597   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
3598     {
3599       static char retval[] = "s_c_\t%1,%0";
3600
3601       retval[1] = (dbl_p ? 'd' : 'w');
3602       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3603       return retval;
3604     }
3605   gcc_unreachable ();
3606 }
3607 \f
3608 /* Return true if CMP1 is a suitable second operand for integer ordering
3609    test CODE.  See also the *sCC patterns in mips.md.  */
3610
3611 static bool
3612 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
3613 {
3614   switch (code)
3615     {
3616     case GT:
3617     case GTU:
3618       return reg_or_0_operand (cmp1, VOIDmode);
3619
3620     case GE:
3621     case GEU:
3622       return !TARGET_MIPS16 && cmp1 == const1_rtx;
3623
3624     case LT:
3625     case LTU:
3626       return arith_operand (cmp1, VOIDmode);
3627
3628     case LE:
3629       return sle_operand (cmp1, VOIDmode);
3630
3631     case LEU:
3632       return sleu_operand (cmp1, VOIDmode);
3633
3634     default:
3635       gcc_unreachable ();
3636     }
3637 }
3638
3639 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
3640    integer ordering test *CODE, or if an equivalent combination can
3641    be formed by adjusting *CODE and *CMP1.  When returning true, update
3642    *CODE and *CMP1 with the chosen code and operand, otherwise leave
3643    them alone.  */
3644
3645 static bool
3646 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
3647                                   enum machine_mode mode)
3648 {
3649   HOST_WIDE_INT plus_one;
3650
3651   if (mips_int_order_operand_ok_p (*code, *cmp1))
3652     return true;
3653
3654   if (GET_CODE (*cmp1) == CONST_INT)
3655     switch (*code)
3656       {
3657       case LE:
3658         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
3659         if (INTVAL (*cmp1) < plus_one)
3660           {
3661             *code = LT;
3662             *cmp1 = force_reg (mode, GEN_INT (plus_one));
3663             return true;
3664           }
3665         break;
3666
3667       case LEU:
3668         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
3669         if (plus_one != 0)
3670           {
3671             *code = LTU;
3672             *cmp1 = force_reg (mode, GEN_INT (plus_one));
3673             return true;
3674           }
3675         break;
3676
3677       default:
3678         break;
3679       }
3680   return false;
3681 }
3682
3683 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
3684    in TARGET.  CMP0 and TARGET are register_operands that have the same
3685    integer mode.  If INVERT_PTR is nonnull, it's OK to set TARGET to the
3686    inverse of the result and flip *INVERT_PTR instead.  */
3687
3688 static void
3689 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
3690                           rtx target, rtx cmp0, rtx cmp1)
3691 {
3692   enum machine_mode mode;
3693
3694   /* First see if there is a MIPS instruction that can do this operation.
3695      If not, try doing the same for the inverse operation.  If that also
3696      fails, force CMP1 into a register and try again.  */
3697   mode = GET_MODE (target);
3698   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
3699     mips_emit_binary (code, target, cmp0, cmp1);
3700   else
3701     {
3702       enum rtx_code inv_code = reverse_condition (code);
3703       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
3704         {
3705           cmp1 = force_reg (mode, cmp1);
3706           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
3707         }
3708       else if (invert_ptr == 0)
3709         {
3710           rtx inv_target = gen_reg_rtx (mode);
3711           mips_emit_binary (inv_code, inv_target, cmp0, cmp1);
3712           mips_emit_binary (XOR, target, inv_target, const1_rtx);
3713         }
3714       else
3715         {
3716           *invert_ptr = !*invert_ptr;
3717           mips_emit_binary (inv_code, target, cmp0, cmp1);
3718         }
3719     }
3720 }
3721
3722 /* Return a register that is zero iff CMP0 and CMP1 are equal.
3723    The register will have the same mode as CMP0.  */
3724
3725 static rtx
3726 mips_zero_if_equal (rtx cmp0, rtx cmp1)
3727 {
3728   if (cmp1 == const0_rtx)
3729     return cmp0;
3730
3731   if (uns_arith_operand (cmp1, VOIDmode))
3732     return expand_binop (GET_MODE (cmp0), xor_optab,
3733                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3734
3735   return expand_binop (GET_MODE (cmp0), sub_optab,
3736                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3737 }
3738
3739 /* Convert *CODE into a code that can be used in a floating-point
3740    scc instruction (C.cond.fmt).  Return true if the values of
3741    the condition code registers will be inverted, with 0 indicating
3742    that the condition holds.  */
3743
3744 static bool
3745 mips_reversed_fp_cond (enum rtx_code *code)
3746 {
3747   switch (*code)
3748     {
3749     case NE:
3750     case LTGT:
3751     case ORDERED:
3752       *code = reverse_condition_maybe_unordered (*code);
3753       return true;
3754
3755     default:
3756       return false;
3757     }
3758 }
3759
3760 /* Convert a comparison into something that can be used in a branch or
3761    conditional move.  cmp_operands[0] and cmp_operands[1] are the values
3762    being compared and *CODE is the code used to compare them.
3763
3764    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
3765    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
3766    otherwise any standard branch condition can be used.  The standard branch
3767    conditions are:
3768
3769       - EQ or NE between two registers.
3770       - any comparison between a register and zero.  */
3771
3772 static void
3773 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
3774 {
3775   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT)
3776     {
3777       if (!need_eq_ne_p && cmp_operands[1] == const0_rtx)
3778         {
3779           *op0 = cmp_operands[0];
3780           *op1 = cmp_operands[1];
3781         }
3782       else if (*code == EQ || *code == NE)
3783         {
3784           if (need_eq_ne_p)
3785             {
3786               *op0 = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3787               *op1 = const0_rtx;
3788             }
3789           else
3790             {
3791               *op0 = cmp_operands[0];
3792               *op1 = force_reg (GET_MODE (*op0), cmp_operands[1]);
3793             }
3794         }
3795       else
3796         {
3797           /* The comparison needs a separate scc instruction.  Store the
3798              result of the scc in *OP0 and compare it against zero.  */
3799           bool invert = false;
3800           *op0 = gen_reg_rtx (GET_MODE (cmp_operands[0]));
3801           mips_emit_int_order_test (*code, &invert, *op0,
3802                                     cmp_operands[0], cmp_operands[1]);
3803           *code = (invert ? EQ : NE);
3804           *op1 = const0_rtx;
3805         }
3806     }
3807   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_operands[0])))
3808     {
3809       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
3810       mips_emit_binary (*code, *op0, cmp_operands[0], cmp_operands[1]);
3811       *code = NE;
3812       *op1 = const0_rtx;
3813     }
3814   else
3815     {
3816       enum rtx_code cmp_code;
3817
3818       /* Floating-point tests use a separate C.cond.fmt comparison to
3819          set a condition code register.  The branch or conditional move
3820          will then compare that register against zero.
3821
3822          Set CMP_CODE to the code of the comparison instruction and
3823          *CODE to the code that the branch or move should use.  */
3824       cmp_code = *code;
3825       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
3826       *op0 = (ISA_HAS_8CC
3827               ? gen_reg_rtx (CCmode)
3828               : gen_rtx_REG (CCmode, FPSW_REGNUM));
3829       *op1 = const0_rtx;
3830       mips_emit_binary (cmp_code, *op0, cmp_operands[0], cmp_operands[1]);
3831     }
3832 }
3833 \f
3834 /* Try comparing cmp_operands[0] and cmp_operands[1] using rtl code CODE.
3835    Store the result in TARGET and return true if successful.
3836
3837    On 64-bit targets, TARGET may be wider than cmp_operands[0].  */
3838
3839 bool
3840 mips_expand_scc (enum rtx_code code, rtx target)
3841 {
3842   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) != MODE_INT)
3843     return false;
3844
3845   target = gen_lowpart (GET_MODE (cmp_operands[0]), target);
3846   if (code == EQ || code == NE)
3847     {
3848       rtx zie = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3849       mips_emit_binary (code, target, zie, const0_rtx);
3850     }
3851   else
3852     mips_emit_int_order_test (code, 0, target,
3853                               cmp_operands[0], cmp_operands[1]);
3854   return true;
3855 }
3856
3857 /* Compare cmp_operands[0] with cmp_operands[1] using comparison code
3858    CODE and jump to OPERANDS[0] if the condition holds.  */
3859
3860 void
3861 mips_expand_conditional_branch (rtx *operands, enum rtx_code code)
3862 {
3863   rtx op0, op1, condition;
3864
3865   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
3866   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
3867   emit_jump_insn (gen_condjump (condition, operands[0]));
3868 }
3869
3870 /* Implement:
3871
3872    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
3873    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
3874
3875 void
3876 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
3877                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
3878 {
3879   rtx cmp_result;
3880   bool reversed_p;
3881
3882   reversed_p = mips_reversed_fp_cond (&cond);
3883   cmp_result = gen_reg_rtx (CCV2mode);
3884   emit_insn (gen_scc_ps (cmp_result,
3885                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
3886   if (reversed_p)
3887     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
3888                                          cmp_result));
3889   else
3890     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
3891                                          cmp_result));
3892 }
3893
3894 /* Compare cmp_operands[0] with cmp_operands[1] using the code of
3895    OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0] if the condition
3896    holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
3897
3898 void
3899 mips_expand_conditional_move (rtx *operands)
3900 {
3901   enum rtx_code code;
3902   rtx cond, op0, op1;
3903
3904   code = GET_CODE (operands[1]);
3905   mips_emit_compare (&code, &op0, &op1, true);
3906   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1),
3907   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3908                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
3909                                                 operands[2], operands[3])));
3910 }
3911
3912 /* Compare cmp_operands[0] with cmp_operands[1] using rtl code CODE,
3913    then trap if the condition holds.  */
3914
3915 void
3916 mips_expand_conditional_trap (enum rtx_code code)
3917 {
3918   rtx op0, op1;
3919   enum machine_mode mode;
3920
3921   /* MIPS conditional trap instructions don't have GT or LE flavors,
3922      so we must swap the operands and convert to LT and GE respectively.  */
3923   switch (code)
3924     {
3925     case GT:
3926     case LE:
3927     case GTU:
3928     case LEU:
3929       code = swap_condition (code);
3930       op0 = cmp_operands[1];
3931       op1 = cmp_operands[0];
3932       break;
3933
3934     default:
3935       op0 = cmp_operands[0];
3936       op1 = cmp_operands[1];
3937       break;
3938     }
3939
3940   mode = GET_MODE (cmp_operands[0]);
3941   op0 = force_reg (mode, op0);
3942   if (!arith_operand (op1, mode))
3943     op1 = force_reg (mode, op1);
3944
3945   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
3946                               gen_rtx_fmt_ee (code, mode, op0, op1),
3947                               const0_rtx));
3948 }
3949 \f
3950 /* Initialize *CUM for a call to a function of type FNTYPE.  */
3951
3952 void
3953 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
3954 {
3955   memset (cum, 0, sizeof (*cum));
3956   cum->prototype = (fntype && prototype_p (fntype));
3957   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
3958 }
3959
3960 /* Fill INFO with information about a single argument.  CUM is the
3961    cumulative state for earlier arguments.  MODE is the mode of this
3962    argument and TYPE is its type (if known).  NAMED is true if this
3963    is a named (fixed) argument rather than a variable one.  */
3964
3965 static void
3966 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
3967                    enum machine_mode mode, tree type, int named)
3968 {
3969   bool doubleword_aligned_p;
3970   unsigned int num_bytes, num_words, max_regs;
3971
3972   /* Work out the size of the argument.  */
3973   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
3974   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3975
3976   /* Decide whether it should go in a floating-point register, assuming
3977      one is free.  Later code checks for availability.
3978
3979      The checks against UNITS_PER_FPVALUE handle the soft-float and
3980      single-float cases.  */
3981   switch (mips_abi)
3982     {
3983     case ABI_EABI:
3984       /* The EABI conventions have traditionally been defined in terms
3985          of TYPE_MODE, regardless of the actual type.  */
3986       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
3987                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
3988                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
3989       break;
3990
3991     case ABI_32:
3992     case ABI_O64:
3993       /* Only leading floating-point scalars are passed in
3994          floating-point registers.  We also handle vector floats the same
3995          say, which is OK because they are not covered by the standard ABI.  */
3996       info->fpr_p = (!cum->gp_reg_found
3997                      && cum->arg_number < 2
3998                      && (type == 0
3999                          || SCALAR_FLOAT_TYPE_P (type)
4000                          || VECTOR_FLOAT_TYPE_P (type))
4001                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4002                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4003                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4004       break;
4005
4006     case ABI_N32:
4007     case ABI_64:
4008       /* Scalar, complex and vector floating-point types are passed in
4009          floating-point registers, as long as this is a named rather
4010          than a variable argument.  */
4011       info->fpr_p = (named
4012                      && (type == 0 || FLOAT_TYPE_P (type))
4013                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4014                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4015                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4016                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4017
4018       /* ??? According to the ABI documentation, the real and imaginary
4019          parts of complex floats should be passed in individual registers.
4020          The real and imaginary parts of stack arguments are supposed
4021          to be contiguous and there should be an extra word of padding
4022          at the end.
4023
4024          This has two problems.  First, it makes it impossible to use a
4025          single "void *" va_list type, since register and stack arguments
4026          are passed differently.  (At the time of writing, MIPSpro cannot
4027          handle complex float varargs correctly.)  Second, it's unclear
4028          what should happen when there is only one register free.
4029
4030          For now, we assume that named complex floats should go into FPRs
4031          if there are two FPRs free, otherwise they should be passed in the
4032          same way as a struct containing two floats.  */
4033       if (info->fpr_p
4034           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4035           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4036         {
4037           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4038             info->fpr_p = false;
4039           else
4040             num_words = 2;
4041         }
4042       break;
4043
4044     default:
4045       gcc_unreachable ();
4046     }
4047
4048   /* See whether the argument has doubleword alignment.  */
4049   doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4050
4051   /* Set REG_OFFSET to the register count we're interested in.
4052      The EABI allocates the floating-point registers separately,
4053      but the other ABIs allocate them like integer registers.  */
4054   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4055                       ? cum->num_fprs
4056                       : cum->num_gprs);
4057
4058   /* Advance to an even register if the argument is doubleword-aligned.  */
4059   if (doubleword_aligned_p)
4060     info->reg_offset += info->reg_offset & 1;
4061
4062   /* Work out the offset of a stack argument.  */
4063   info->stack_offset = cum->stack_words;
4064   if (doubleword_aligned_p)
4065     info->stack_offset += info->stack_offset & 1;
4066
4067   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4068
4069   /* Partition the argument between registers and stack.  */
4070   info->reg_words = MIN (num_words, max_regs);
4071   info->stack_words = num_words - info->reg_words;
4072 }
4073
4074 /* INFO describes a register argument that has the normal format for the
4075    argument's mode.  Return the register it uses, assuming that FPRs are
4076    available if HARD_FLOAT_P.  */
4077
4078 static unsigned int
4079 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4080 {
4081   if (!info->fpr_p || !hard_float_p)
4082     return GP_ARG_FIRST + info->reg_offset;
4083   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4084     /* In o32, the second argument is always passed in $f14
4085        for TARGET_DOUBLE_FLOAT, regardless of whether the
4086        first argument was a word or doubleword.  */
4087     return FP_ARG_FIRST + 2;
4088   else
4089     return FP_ARG_FIRST + info->reg_offset;
4090 }
4091
4092 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4093
4094 static bool
4095 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4096 {
4097   return !TARGET_OLDABI;
4098 }
4099
4100 /* Implement FUNCTION_ARG.  */
4101
4102 rtx
4103 mips_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4104                    tree type, int named)
4105 {
4106   struct mips_arg_info info;
4107
4108   /* We will be called with a mode of VOIDmode after the last argument
4109      has been seen.  Whatever we return will be passed to the call expander.
4110      If we need a MIPS16 fp_code, return a REG with the code stored as
4111      the mode.  */
4112   if (mode == VOIDmode)
4113     {
4114       if (TARGET_MIPS16 && cum->fp_code != 0)
4115         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4116       else
4117         return NULL;
4118     }
4119
4120   mips_get_arg_info (&info, cum, mode, type, named);
4121
4122   /* Return straight away if the whole argument is passed on the stack.  */
4123   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4124     return NULL;
4125
4126   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4127      contains a double in its entirety, then that 64-bit chunk is passed
4128      in a floating-point register.  */
4129   if (TARGET_NEWABI
4130       && TARGET_HARD_FLOAT
4131       && named
4132       && type != 0
4133       && TREE_CODE (type) == RECORD_TYPE
4134       && TYPE_SIZE_UNIT (type)
4135       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4136     {
4137       tree field;
4138
4139       /* First check to see if there is any such field.  */
4140       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4141         if (TREE_CODE (field) == FIELD_DECL
4142             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4143             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4144             && host_integerp (bit_position (field), 0)
4145             && int_bit_position (field) % BITS_PER_WORD == 0)
4146           break;
4147
4148       if (field != 0)
4149         {
4150           /* Now handle the special case by returning a PARALLEL
4151              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4152              chunks are passed in registers.  */
4153           unsigned int i;
4154           HOST_WIDE_INT bitpos;
4155           rtx ret;
4156
4157           /* assign_parms checks the mode of ENTRY_PARM, so we must
4158              use the actual mode here.  */
4159           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4160
4161           bitpos = 0;
4162           field = TYPE_FIELDS (type);
4163           for (i = 0; i < info.reg_words; i++)
4164             {
4165               rtx reg;
4166
4167               for (; field; field = TREE_CHAIN (field))
4168                 if (TREE_CODE (field) == FIELD_DECL
4169                     && int_bit_position (field) >= bitpos)
4170                   break;
4171
4172               if (field
4173                   && int_bit_position (field) == bitpos
4174                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4175                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4176                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4177               else
4178                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4179
4180               XVECEXP (ret, 0, i)
4181                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4182                                      GEN_INT (bitpos / BITS_PER_UNIT));
4183
4184               bitpos += BITS_PER_WORD;
4185             }
4186           return ret;
4187         }
4188     }
4189
4190   /* Handle the n32/n64 conventions for passing complex floating-point
4191      arguments in FPR pairs.  The real part goes in the lower register
4192      and the imaginary part goes in the upper register.  */
4193   if (TARGET_NEWABI
4194       && info.fpr_p
4195       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4196     {
4197       rtx real, imag;
4198       enum machine_mode inner;
4199       unsigned int regno;
4200
4201       inner = GET_MODE_INNER (mode);
4202       regno = FP_ARG_FIRST + info.reg_offset;
4203       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4204         {
4205           /* Real part in registers, imaginary part on stack.  */
4206           gcc_assert (info.stack_words == info.reg_words);
4207           return gen_rtx_REG (inner, regno);
4208         }
4209       else
4210         {
4211           gcc_assert (info.stack_words == 0);
4212           real = gen_rtx_EXPR_LIST (VOIDmode,
4213                                     gen_rtx_REG (inner, regno),
4214                                     const0_rtx);
4215           imag = gen_rtx_EXPR_LIST (VOIDmode,
4216                                     gen_rtx_REG (inner,
4217                                                  regno + info.reg_words / 2),
4218                                     GEN_INT (GET_MODE_SIZE (inner)));
4219           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4220         }
4221     }
4222
4223   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4224 }
4225
4226 /* Implement FUNCTION_ARG_ADVANCE.  */
4227
4228 void
4229 mips_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4230                            tree type, int named)
4231 {
4232   struct mips_arg_info info;
4233
4234   mips_get_arg_info (&info, cum, mode, type, named);
4235
4236   if (!info.fpr_p)
4237     cum->gp_reg_found = true;
4238
4239   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4240      an explanation of what this code does.  It assumes that we're using
4241      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4242      in FPRs.  */
4243   if (cum->arg_number < 2 && info.fpr_p)
4244     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4245
4246   /* Advance the register count.  This has the effect of setting
4247      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4248      argument required us to skip the final GPR and pass the whole
4249      argument on the stack.  */
4250   if (mips_abi != ABI_EABI || !info.fpr_p)
4251     cum->num_gprs = info.reg_offset + info.reg_words;
4252   else if (info.reg_words > 0)
4253     cum->num_fprs += MAX_FPRS_PER_FMT;
4254
4255   /* Advance the stack word count.  */
4256   if (info.stack_words > 0)
4257     cum->stack_words = info.stack_offset + info.stack_words;
4258
4259   cum->arg_number++;
4260 }
4261
4262 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4263
4264 static int
4265 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4266                         enum machine_mode mode, tree type, bool named)
4267 {
4268   struct mips_arg_info info;
4269
4270   mips_get_arg_info (&info, cum, mode, type, named);
4271   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4272 }
4273
4274 /* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
4275    PARM_BOUNDARY bits of alignment, but will be given anything up
4276    to STACK_BOUNDARY bits if the type requires it.  */
4277
4278 int
4279 mips_function_arg_boundary (enum machine_mode mode, tree type)
4280 {
4281   unsigned int alignment;
4282
4283   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4284   if (alignment < PARM_BOUNDARY)
4285     alignment = PARM_BOUNDARY;
4286   if (alignment > STACK_BOUNDARY)
4287     alignment = STACK_BOUNDARY;
4288   return alignment;
4289 }
4290
4291 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
4292    upward rather than downward.  In other words, return true if the
4293    first byte of the stack slot has useful data, false if the last
4294    byte does.  */
4295
4296 bool
4297 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
4298 {
4299   /* On little-endian targets, the first byte of every stack argument
4300      is passed in the first byte of the stack slot.  */
4301   if (!BYTES_BIG_ENDIAN)
4302     return true;
4303
4304   /* Otherwise, integral types are padded downward: the last byte of a
4305      stack argument is passed in the last byte of the stack slot.  */
4306   if (type != 0
4307       ? (INTEGRAL_TYPE_P (type)
4308          || POINTER_TYPE_P (type)
4309          || FIXED_POINT_TYPE_P (type))
4310       : (SCALAR_INT_MODE_P (mode)
4311          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
4312     return false;
4313
4314   /* Big-endian o64 pads floating-point arguments downward.  */
4315   if (mips_abi == ABI_O64)
4316     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4317       return false;
4318
4319   /* Other types are padded upward for o32, o64, n32 and n64.  */
4320   if (mips_abi != ABI_EABI)
4321     return true;
4322
4323   /* Arguments smaller than a stack slot are padded downward.  */
4324   if (mode != BLKmode)
4325     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
4326   else
4327     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
4328 }
4329
4330 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
4331    if the least significant byte of the register has useful data.  Return
4332    the opposite if the most significant byte does.  */
4333
4334 bool
4335 mips_pad_reg_upward (enum machine_mode mode, tree type)
4336 {
4337   /* No shifting is required for floating-point arguments.  */
4338   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4339     return !BYTES_BIG_ENDIAN;
4340
4341   /* Otherwise, apply the same padding to register arguments as we do
4342      to stack arguments.  */
4343   return mips_pad_arg_upward (mode, type);
4344 }
4345
4346 /* Return nonzero when an argument must be passed by reference.  */
4347
4348 static bool
4349 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4350                         enum machine_mode mode, const_tree type,
4351                         bool named ATTRIBUTE_UNUSED)
4352 {
4353   if (mips_abi == ABI_EABI)
4354     {
4355       int size;
4356
4357       /* ??? How should SCmode be handled?  */
4358       if (mode == DImode || mode == DFmode
4359           || mode == DQmode || mode == UDQmode
4360           || mode == DAmode || mode == UDAmode)
4361         return 0;
4362
4363       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4364       return size == -1 || size > UNITS_PER_WORD;
4365     }
4366   else
4367     {
4368       /* If we have a variable-sized parameter, we have no choice.  */
4369       return targetm.calls.must_pass_in_stack (mode, type);
4370     }
4371 }
4372
4373 /* Implement TARGET_CALLEE_COPIES.  */
4374
4375 static bool
4376 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4377                     enum machine_mode mode ATTRIBUTE_UNUSED,
4378                     const_tree type ATTRIBUTE_UNUSED, bool named)
4379 {
4380   return mips_abi == ABI_EABI && named;
4381 }
4382 \f
4383 /* See whether VALTYPE is a record whose fields should be returned in
4384    floating-point registers.  If so, return the number of fields and
4385    list them in FIELDS (which should have two elements).  Return 0
4386    otherwise.
4387
4388    For n32 & n64, a structure with one or two fields is returned in
4389    floating-point registers as long as every field has a floating-point
4390    type.  */
4391
4392 static int
4393 mips_fpr_return_fields (const_tree valtype, tree *fields)
4394 {
4395   tree field;
4396   int i;
4397
4398   if (!TARGET_NEWABI)
4399     return 0;
4400
4401   if (TREE_CODE (valtype) != RECORD_TYPE)
4402     return 0;
4403
4404   i = 0;
4405   for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
4406     {
4407       if (TREE_CODE (field) != FIELD_DECL)
4408         continue;
4409
4410       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
4411         return 0;
4412
4413       if (i == 2)
4414         return 0;
4415
4416       fields[i++] = field;
4417     }
4418   return i;
4419 }
4420
4421 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
4422    a value in the most significant part of $2/$3 if:
4423
4424       - the target is big-endian;
4425
4426       - the value has a structure or union type (we generalize this to
4427         cover aggregates from other languages too); and
4428
4429       - the structure is not returned in floating-point registers.  */
4430
4431 static bool
4432 mips_return_in_msb (const_tree valtype)
4433 {
4434   tree fields[2];
4435
4436   return (TARGET_NEWABI
4437           && TARGET_BIG_ENDIAN
4438           && AGGREGATE_TYPE_P (valtype)
4439           && mips_fpr_return_fields (valtype, fields) == 0);
4440 }
4441
4442 /* Return true if the function return value MODE will get returned in a
4443    floating-point register.  */
4444
4445 static bool
4446 mips_return_mode_in_fpr_p (enum machine_mode mode)
4447 {
4448   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
4449            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
4450            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4451           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
4452 }
4453
4454 /* Return the representation of an FPR return register when the
4455    value being returned in FP_RETURN has mode VALUE_MODE and the
4456    return type itself has mode TYPE_MODE.  On NewABI targets,
4457    the two modes may be different for structures like:
4458
4459        struct __attribute__((packed)) foo { float f; }
4460
4461    where we return the SFmode value of "f" in FP_RETURN, but where
4462    the structure itself has mode BLKmode.  */
4463
4464 static rtx
4465 mips_return_fpr_single (enum machine_mode type_mode,
4466                         enum machine_mode value_mode)
4467 {
4468   rtx x;
4469
4470   x = gen_rtx_REG (value_mode, FP_RETURN);
4471   if (type_mode != value_mode)
4472     {
4473       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
4474       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
4475     }
4476   return x;
4477 }
4478
4479 /* Return a composite value in a pair of floating-point registers.
4480    MODE1 and OFFSET1 are the mode and byte offset for the first value,
4481    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
4482    complete value.
4483
4484    For n32 & n64, $f0 always holds the first value and $f2 the second.
4485    Otherwise the values are packed together as closely as possible.  */
4486
4487 static rtx
4488 mips_return_fpr_pair (enum machine_mode mode,
4489                       enum machine_mode mode1, HOST_WIDE_INT offset1,
4490                       enum machine_mode mode2, HOST_WIDE_INT offset2)
4491 {
4492   int inc;
4493
4494   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
4495   return gen_rtx_PARALLEL
4496     (mode,
4497      gen_rtvec (2,
4498                 gen_rtx_EXPR_LIST (VOIDmode,
4499                                    gen_rtx_REG (mode1, FP_RETURN),
4500                                    GEN_INT (offset1)),
4501                 gen_rtx_EXPR_LIST (VOIDmode,
4502                                    gen_rtx_REG (mode2, FP_RETURN + inc),
4503                                    GEN_INT (offset2))));
4504
4505 }
4506
4507 /* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
4508    VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
4509    VALTYPE is null and MODE is the mode of the return value.  */
4510
4511 rtx
4512 mips_function_value (const_tree valtype, enum machine_mode mode)
4513 {
4514   if (valtype)
4515     {
4516       tree fields[2];
4517       int unsigned_p;
4518
4519       mode = TYPE_MODE (valtype);
4520       unsigned_p = TYPE_UNSIGNED (valtype);
4521
4522       /* Since TARGET_PROMOTE_FUNCTION_RETURN unconditionally returns true,
4523          we must promote the mode just as PROMOTE_MODE does.  */
4524       mode = promote_mode (valtype, mode, &unsigned_p, 1);
4525
4526       /* Handle structures whose fields are returned in $f0/$f2.  */
4527       switch (mips_fpr_return_fields (valtype, fields))
4528         {
4529         case 1:
4530           return mips_return_fpr_single (mode,
4531                                          TYPE_MODE (TREE_TYPE (fields[0])));
4532
4533         case 2:
4534           return mips_return_fpr_pair (mode,
4535                                        TYPE_MODE (TREE_TYPE (fields[0])),
4536                                        int_byte_position (fields[0]),
4537                                        TYPE_MODE (TREE_TYPE (fields[1])),
4538                                        int_byte_position (fields[1]));
4539         }
4540
4541       /* If a value is passed in the most significant part of a register, see
4542          whether we have to round the mode up to a whole number of words.  */
4543       if (mips_return_in_msb (valtype))
4544         {
4545           HOST_WIDE_INT size = int_size_in_bytes (valtype);
4546           if (size % UNITS_PER_WORD != 0)
4547             {
4548               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
4549               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
4550             }
4551         }
4552
4553       /* For EABI, the class of return register depends entirely on MODE.
4554          For example, "struct { some_type x; }" and "union { some_type x; }"
4555          are returned in the same way as a bare "some_type" would be.
4556          Other ABIs only use FPRs for scalar, complex or vector types.  */
4557       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
4558         return gen_rtx_REG (mode, GP_RETURN);
4559     }
4560
4561   if (!TARGET_MIPS16)
4562     {
4563       /* Handle long doubles for n32 & n64.  */
4564       if (mode == TFmode)
4565         return mips_return_fpr_pair (mode,
4566                                      DImode, 0,
4567                                      DImode, GET_MODE_SIZE (mode) / 2);
4568
4569       if (mips_return_mode_in_fpr_p (mode))
4570         {
4571           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4572             return mips_return_fpr_pair (mode,
4573                                          GET_MODE_INNER (mode), 0,
4574                                          GET_MODE_INNER (mode),
4575                                          GET_MODE_SIZE (mode) / 2);
4576           else
4577             return gen_rtx_REG (mode, FP_RETURN);
4578         }
4579     }
4580
4581   return gen_rtx_REG (mode, GP_RETURN);
4582 }
4583
4584 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
4585    all BLKmode objects are returned in memory.  Under the n32, n64
4586    and embedded ABIs, small structures are returned in a register.
4587    Objects with varying size must still be returned in memory, of
4588    course.  */
4589
4590 static bool
4591 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
4592 {
4593   return (TARGET_OLDABI
4594           ? TYPE_MODE (type) == BLKmode
4595           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
4596 }
4597 \f
4598 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
4599
4600 static void
4601 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4602                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
4603                              int no_rtl)
4604 {
4605   CUMULATIVE_ARGS local_cum;
4606   int gp_saved, fp_saved;
4607
4608   /* The caller has advanced CUM up to, but not beyond, the last named
4609      argument.  Advance a local copy of CUM past the last "real" named
4610      argument, to find out how many registers are left over.  */
4611   local_cum = *cum;
4612   FUNCTION_ARG_ADVANCE (local_cum, mode, type, true);
4613
4614   /* Found out how many registers we need to save.  */
4615   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
4616   fp_saved = (EABI_FLOAT_VARARGS_P
4617               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
4618               : 0);
4619
4620   if (!no_rtl)
4621     {
4622       if (gp_saved > 0)
4623         {
4624           rtx ptr, mem;
4625
4626           ptr = plus_constant (virtual_incoming_args_rtx,
4627                                REG_PARM_STACK_SPACE (cfun->decl)
4628                                - gp_saved * UNITS_PER_WORD);
4629           mem = gen_frame_mem (BLKmode, ptr);
4630           set_mem_alias_set (mem, get_varargs_alias_set ());
4631
4632           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
4633                                mem, gp_saved);
4634         }
4635       if (fp_saved > 0)
4636         {
4637           /* We can't use move_block_from_reg, because it will use
4638              the wrong mode.  */
4639           enum machine_mode mode;
4640           int off, i;
4641
4642           /* Set OFF to the offset from virtual_incoming_args_rtx of
4643              the first float register.  The FP save area lies below
4644              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
4645           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
4646           off -= fp_saved * UNITS_PER_FPREG;
4647
4648           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
4649
4650           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
4651                i += MAX_FPRS_PER_FMT)
4652             {
4653               rtx ptr, mem;
4654
4655               ptr = plus_constant (virtual_incoming_args_rtx, off);
4656               mem = gen_frame_mem (mode, ptr);
4657               set_mem_alias_set (mem, get_varargs_alias_set ());
4658               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
4659               off += UNITS_PER_HWFPVALUE;
4660             }
4661         }
4662     }
4663   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
4664     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
4665                                    + fp_saved * UNITS_PER_FPREG);
4666 }
4667
4668 /* Implement TARGET_BUILTIN_VA_LIST.  */
4669
4670 static tree
4671 mips_build_builtin_va_list (void)
4672 {
4673   if (EABI_FLOAT_VARARGS_P)
4674     {
4675       /* We keep 3 pointers, and two offsets.
4676
4677          Two pointers are to the overflow area, which starts at the CFA.
4678          One of these is constant, for addressing into the GPR save area
4679          below it.  The other is advanced up the stack through the
4680          overflow region.
4681
4682          The third pointer is to the bottom of the GPR save area.
4683          Since the FPR save area is just below it, we can address
4684          FPR slots off this pointer.
4685
4686          We also keep two one-byte offsets, which are to be subtracted
4687          from the constant pointers to yield addresses in the GPR and
4688          FPR save areas.  These are downcounted as float or non-float
4689          arguments are used, and when they get to zero, the argument
4690          must be obtained from the overflow region.  */
4691       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
4692       tree array, index;
4693
4694       record = lang_hooks.types.make_type (RECORD_TYPE);
4695
4696       f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
4697                            ptr_type_node);
4698       f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
4699                            ptr_type_node);
4700       f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
4701                            ptr_type_node);
4702       f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
4703                            unsigned_char_type_node);
4704       f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
4705                            unsigned_char_type_node);
4706       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
4707          warn on every user file.  */
4708       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
4709       array = build_array_type (unsigned_char_type_node,
4710                                 build_index_type (index));
4711       f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
4712
4713       DECL_FIELD_CONTEXT (f_ovfl) = record;
4714       DECL_FIELD_CONTEXT (f_gtop) = record;
4715       DECL_FIELD_CONTEXT (f_ftop) = record;
4716       DECL_FIELD_CONTEXT (f_goff) = record;
4717       DECL_FIELD_CONTEXT (f_foff) = record;
4718       DECL_FIELD_CONTEXT (f_res) = record;
4719
4720       TYPE_FIELDS (record) = f_ovfl;
4721       TREE_CHAIN (f_ovfl) = f_gtop;
4722       TREE_CHAIN (f_gtop) = f_ftop;
4723       TREE_CHAIN (f_ftop) = f_goff;
4724       TREE_CHAIN (f_goff) = f_foff;
4725       TREE_CHAIN (f_foff) = f_res;
4726
4727       layout_type (record);
4728       return record;
4729     }
4730   else if (TARGET_IRIX && TARGET_IRIX6)
4731     /* On IRIX 6, this type is 'char *'.  */
4732     return build_pointer_type (char_type_node);
4733   else
4734     /* Otherwise, we use 'void *'.  */
4735     return ptr_type_node;
4736 }
4737
4738 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
4739
4740 static void
4741 mips_va_start (tree valist, rtx nextarg)
4742 {
4743   if (EABI_FLOAT_VARARGS_P)
4744     {
4745       const CUMULATIVE_ARGS *cum;
4746       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4747       tree ovfl, gtop, ftop, goff, foff;
4748       tree t;
4749       int gpr_save_area_size;
4750       int fpr_save_area_size;
4751       int fpr_offset;
4752
4753       cum = &current_function_args_info;
4754       gpr_save_area_size
4755         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
4756       fpr_save_area_size
4757         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
4758
4759       f_ovfl = TYPE_FIELDS (va_list_type_node);
4760       f_gtop = TREE_CHAIN (f_ovfl);
4761       f_ftop = TREE_CHAIN (f_gtop);
4762       f_goff = TREE_CHAIN (f_ftop);
4763       f_foff = TREE_CHAIN (f_goff);
4764
4765       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4766                      NULL_TREE);
4767       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4768                      NULL_TREE);
4769       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4770                      NULL_TREE);
4771       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4772                      NULL_TREE);
4773       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4774                      NULL_TREE);
4775
4776       /* Emit code to initialize OVFL, which points to the next varargs
4777          stack argument.  CUM->STACK_WORDS gives the number of stack
4778          words used by named arguments.  */
4779       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
4780       if (cum->stack_words > 0)
4781         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
4782                     size_int (cum->stack_words * UNITS_PER_WORD));
4783       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4784       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4785
4786       /* Emit code to initialize GTOP, the top of the GPR save area.  */
4787       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
4788       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (gtop), gtop, t);
4789       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4790
4791       /* Emit code to initialize FTOP, the top of the FPR save area.
4792          This address is gpr_save_area_bytes below GTOP, rounded
4793          down to the next fp-aligned boundary.  */
4794       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
4795       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
4796       fpr_offset &= -UNITS_PER_FPVALUE;
4797       if (fpr_offset)
4798         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
4799                     size_int (-fpr_offset));
4800       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ftop), ftop, t);
4801       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4802
4803       /* Emit code to initialize GOFF, the offset from GTOP of the
4804          next GPR argument.  */
4805       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (goff), goff,
4806                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
4807       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4808
4809       /* Likewise emit code to initialize FOFF, the offset from FTOP
4810          of the next FPR argument.  */
4811       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (foff), foff,
4812                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
4813       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4814     }
4815   else
4816     {
4817       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
4818       std_expand_builtin_va_start (valist, nextarg);
4819     }
4820 }
4821
4822 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
4823
4824 static tree
4825 mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
4826 {
4827   tree addr;
4828   bool indirect_p;
4829
4830   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
4831   if (indirect_p)
4832     type = build_pointer_type (type);
4833
4834   if (!EABI_FLOAT_VARARGS_P)
4835     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4836   else
4837     {
4838       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4839       tree ovfl, top, off, align;
4840       HOST_WIDE_INT size, rsize, osize;
4841       tree t, u;
4842
4843       f_ovfl = TYPE_FIELDS (va_list_type_node);
4844       f_gtop = TREE_CHAIN (f_ovfl);
4845       f_ftop = TREE_CHAIN (f_gtop);
4846       f_goff = TREE_CHAIN (f_ftop);
4847       f_foff = TREE_CHAIN (f_goff);
4848
4849       /* Let:
4850
4851          TOP be the top of the GPR or FPR save area;
4852          OFF be the offset from TOP of the next register;
4853          ADDR_RTX be the address of the argument;
4854          SIZE be the number of bytes in the argument type;
4855          RSIZE be the number of bytes used to store the argument
4856            when it's in the register save area; and
4857          OSIZE be the number of bytes used to store it when it's
4858            in the stack overflow area.
4859
4860          The code we want is:
4861
4862          1: off &= -rsize;        // round down
4863          2: if (off != 0)
4864          3:   {
4865          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
4866          5:     off -= rsize;
4867          6:   }
4868          7: else
4869          8:   {
4870          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
4871          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
4872          11:    ovfl += osize;
4873          14:  }
4874
4875          [1] and [9] can sometimes be optimized away.  */
4876
4877       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4878                      NULL_TREE);
4879       size = int_size_in_bytes (type);
4880
4881       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
4882           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
4883         {
4884           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4885                         NULL_TREE);
4886           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4887                         NULL_TREE);
4888
4889           /* When va_start saves FPR arguments to the stack, each slot
4890              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
4891              argument's precision.  */
4892           rsize = UNITS_PER_HWFPVALUE;
4893
4894           /* Overflow arguments are padded to UNITS_PER_WORD bytes
4895              (= PARM_BOUNDARY bits).  This can be different from RSIZE
4896              in two cases:
4897
4898              (1) On 32-bit targets when TYPE is a structure such as:
4899
4900              struct s { float f; };
4901
4902              Such structures are passed in paired FPRs, so RSIZE
4903              will be 8 bytes.  However, the structure only takes
4904              up 4 bytes of memory, so OSIZE will only be 4.
4905
4906              (2) In combinations such as -mgp64 -msingle-float
4907              -fshort-double.  Doubles passed in registers will then take
4908              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
4909              stack take up UNITS_PER_WORD bytes.  */
4910           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
4911         }
4912       else
4913         {
4914           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4915                         NULL_TREE);
4916           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4917                         NULL_TREE);
4918           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
4919           if (rsize > UNITS_PER_WORD)
4920             {
4921               /* [1] Emit code for: off &= -rsize.      */
4922               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), off,
4923                           build_int_cst (NULL_TREE, -rsize));
4924               t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (off), off, t);
4925               gimplify_and_add (t, pre_p);
4926             }
4927           osize = rsize;
4928         }
4929
4930       /* [2] Emit code to branch if off == 0.  */
4931       t = build2 (NE_EXPR, boolean_type_node, off,
4932                   build_int_cst (TREE_TYPE (off), 0));
4933       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
4934
4935       /* [5] Emit code for: off -= rsize.  We do this as a form of
4936          post-decrement not available to C.  */
4937       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
4938       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
4939
4940       /* [4] Emit code for:
4941          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
4942       t = fold_convert (sizetype, t);
4943       t = fold_build1 (NEGATE_EXPR, sizetype, t);
4944       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
4945       if (BYTES_BIG_ENDIAN && rsize > size)
4946         {
4947           u = size_int (rsize - size);
4948           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
4949         }
4950       COND_EXPR_THEN (addr) = t;
4951
4952       if (osize > UNITS_PER_WORD)
4953         {
4954           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
4955           u = size_int (osize - 1);
4956           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
4957           t = fold_convert (sizetype, t);
4958           u = size_int (-osize);
4959           t = build2 (BIT_AND_EXPR, sizetype, t, u);
4960           t = fold_convert (TREE_TYPE (ovfl), t);
4961           align = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4962         }
4963       else
4964         align = NULL;
4965
4966       /* [10, 11] Emit code for:
4967          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
4968          ovfl += osize.  */
4969       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
4970       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
4971       if (BYTES_BIG_ENDIAN && osize > size)
4972         {
4973           u = size_int (osize - size);
4974           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
4975         }
4976
4977       /* String [9] and [10, 11] together.  */
4978       if (align)
4979         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
4980       COND_EXPR_ELSE (addr) = t;
4981
4982       addr = fold_convert (build_pointer_type (type), addr);
4983       addr = build_va_arg_indirect_ref (addr);
4984     }
4985
4986   if (indirect_p)
4987     addr = build_va_arg_indirect_ref (addr);
4988
4989   return addr;
4990 }
4991 \f
4992 /* A chained list of functions for which mips16_build_call_stub has already
4993    generated a stub.  NAME is the name of the function and FP_RET_P is true
4994    if the function returns a value in floating-point registers.  */
4995 struct mips16_stub {
4996   struct mips16_stub *next;
4997   char *name;
4998   bool fp_ret_p;
4999 };
5000 static struct mips16_stub *mips16_stubs;
5001
5002 /* Return the two-character string that identifies floating-point
5003    return mode MODE in the name of a MIPS16 function stub.  */
5004
5005 static const char *
5006 mips16_call_stub_mode_suffix (enum machine_mode mode)
5007 {
5008   if (mode == SFmode)
5009     return "sf";
5010   else if (mode == DFmode)
5011     return "df";
5012   else if (mode == SCmode)
5013     return "sc";
5014   else if (mode == DCmode)
5015     return "dc";
5016   else if (mode == V2SFmode)
5017     return "df";
5018   else
5019     gcc_unreachable ();
5020 }
5021
5022 /* Write instructions to move a 32-bit value between general register
5023    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5024    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5025
5026 static void
5027 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5028 {
5029   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5030            reg_names[gpreg], reg_names[fpreg]);
5031 }
5032
5033 /* Likewise for 64-bit values.  */
5034
5035 static void
5036 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5037 {
5038   if (TARGET_64BIT)
5039     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5040              reg_names[gpreg], reg_names[fpreg]);
5041   else if (TARGET_FLOAT64)
5042     {
5043       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5044                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5045       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5046                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5047     }
5048   else
5049     {
5050       /* Move the least-significant word.  */
5051       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5052                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5053       /* ...then the most significant word.  */
5054       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5055                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
5056     }
5057 }
5058
5059 /* Write out code to move floating-point arguments into or out of
5060    general registers.  FP_CODE is the code describing which arguments
5061    are present (see the comment above the definition of CUMULATIVE_ARGS
5062    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
5063
5064 static void
5065 mips_output_args_xfer (int fp_code, char direction)
5066 {
5067   unsigned int gparg, fparg, f;
5068   CUMULATIVE_ARGS cum;
5069
5070   /* This code only works for o32 and o64.  */
5071   gcc_assert (TARGET_OLDABI);
5072
5073   mips_init_cumulative_args (&cum, NULL);
5074
5075   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5076     {
5077       enum machine_mode mode;
5078       struct mips_arg_info info;
5079
5080       if ((f & 3) == 1)
5081         mode = SFmode;
5082       else if ((f & 3) == 2)
5083         mode = DFmode;
5084       else
5085         gcc_unreachable ();
5086
5087       mips_get_arg_info (&info, &cum, mode, NULL, true);
5088       gparg = mips_arg_regno (&info, false);
5089       fparg = mips_arg_regno (&info, true);
5090
5091       if (mode == SFmode)
5092         mips_output_32bit_xfer (direction, gparg, fparg);
5093       else
5094         mips_output_64bit_xfer (direction, gparg, fparg);
5095
5096       mips_function_arg_advance (&cum, mode, NULL, true);
5097     }
5098 }
5099
5100 /* Write a MIPS16 stub for the current function.  This stub is used
5101    for functions which take arguments in the floating-point registers.
5102    It is normal-mode code that moves the floating-point arguments
5103    into the general registers and then jumps to the MIPS16 code.  */
5104
5105 static void
5106 mips16_build_function_stub (void)
5107 {
5108   const char *fnname, *separator;
5109   char *secname, *stubname;
5110   tree stubdecl;
5111   unsigned int f;
5112
5113   /* Create the name of the stub, and its unique section.  */
5114   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
5115   fnname = targetm.strip_name_encoding (fnname);
5116   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
5117   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
5118
5119   /* Build a decl for the stub.  */
5120   stubdecl = build_decl (FUNCTION_DECL, get_identifier (stubname),
5121                          build_function_type (void_type_node, NULL_TREE));
5122   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5123   DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
5124
5125   /* Output a comment.  */
5126   fprintf (asm_out_file, "\t# Stub function for %s (",
5127            current_function_name ());
5128   separator = "";
5129   for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
5130     {
5131       fprintf (asm_out_file, "%s%s", separator,
5132                (f & 3) == 1 ? "float" : "double");
5133       separator = ", ";
5134     }
5135   fprintf (asm_out_file, ")\n");
5136
5137   /* Write the preamble leading up to the function declaration.  */
5138   fprintf (asm_out_file, "\t.set\tnomips16\n");
5139   switch_to_section (function_section (stubdecl));
5140   ASM_OUTPUT_ALIGN (asm_out_file,
5141                     floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT));
5142
5143   /* ??? If FUNCTION_NAME_ALREADY_DECLARED is defined, then we are
5144      within a .ent, and we cannot emit another .ent.  */
5145   if (!FUNCTION_NAME_ALREADY_DECLARED)
5146     {
5147       fputs ("\t.ent\t", asm_out_file);
5148       assemble_name (asm_out_file, stubname);
5149       fputs ("\n", asm_out_file);
5150     }
5151
5152   /* Start the definition proper.  */
5153   assemble_name (asm_out_file, stubname);
5154   fputs (":\n", asm_out_file);
5155
5156   /* Load the address of the MIPS16 function into $at.  Do this first so
5157      that targets with coprocessor interlocks can use an MFC1 to fill the
5158      delay slot.  */
5159   fprintf (asm_out_file, "\t.set\tnoat\n");
5160   fprintf (asm_out_file, "\tla\t%s,", reg_names[GP_REG_FIRST + 1]);
5161   assemble_name (asm_out_file, fnname);
5162   fprintf (asm_out_file, "\n");
5163
5164   /* Move the arguments from floating-point registers to general registers.  */
5165   mips_output_args_xfer (current_function_args_info.fp_code, 'f');
5166
5167   /* Jump to the MIPS16 function.  */
5168   fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
5169   fprintf (asm_out_file, "\t.set\tat\n");
5170
5171   if (!FUNCTION_NAME_ALREADY_DECLARED)
5172     {
5173       fputs ("\t.end\t", asm_out_file);
5174       assemble_name (asm_out_file, stubname);
5175       fputs ("\n", asm_out_file);
5176     }
5177
5178   switch_to_section (function_section (current_function_decl));
5179 }
5180
5181 /* The current function is a MIPS16 function that returns a value in an FPR.
5182    Copy the return value from its soft-float to its hard-float location.
5183    libgcc2 has special non-MIPS16 helper functions for each case.  */
5184
5185 static void
5186 mips16_copy_fpr_return_value (void)
5187 {
5188   rtx fn, insn, arg, call;
5189   tree id, return_type;
5190   enum machine_mode return_mode;
5191
5192   return_type = DECL_RESULT (current_function_decl);
5193   return_mode = DECL_MODE (return_type);
5194
5195   id = get_identifier (ACONCAT (("__mips16_ret_",
5196                                  mips16_call_stub_mode_suffix (return_mode),
5197                                  NULL)));
5198   fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
5199   arg = gen_rtx_REG (return_mode, GP_RETURN);
5200   call = gen_call_value_internal (arg, fn, const0_rtx);
5201   insn = emit_call_insn (call);
5202   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg);
5203 }
5204
5205 /* Consider building a stub for a MIPS16 call to function FN.
5206    RETVAL is the location of the return value, or null if this is
5207    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
5208    arguments and FP_CODE is the code built by mips_function_arg;
5209    see the comment above CUMULATIVE_ARGS for details.
5210
5211    Return true if a stub was needed, and emit the call if so.
5212
5213    A stub is needed for calls to functions that, in normal mode,
5214    receive arguments in FPRs or return values in FPRs.  The stub
5215    copies the arguments from their soft-float positions to their
5216    hard-float positions, calls the real function, then copies the
5217    return value from its hard-float position to its soft-float
5218    position.
5219
5220    We emit a JAL to FN even when FN might need a stub.  If FN turns out
5221    to be to a non-MIPS16 function, the linker automatically redirects
5222    the JAL to the stub, otherwise the JAL continues to call FN directly.  */
5223
5224 static bool
5225 mips16_build_call_stub (rtx retval, rtx fn, rtx args_size, int fp_code)
5226 {
5227   const char *fnname;
5228   bool fp_ret_p;
5229   struct mips16_stub *l;
5230   rtx insn;
5231
5232   /* We don't need to do anything if we aren't in MIPS16 mode, or if
5233      we were invoked with the -msoft-float option.  */
5234   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
5235     return false;
5236
5237   /* Figure out whether the value might come back in a floating-point
5238      register.  */
5239   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
5240
5241   /* We don't need to do anything if there were no floating-point
5242      arguments and the value will not be returned in a floating-point
5243      register.  */
5244   if (fp_code == 0 && !fp_ret_p)
5245     return false;
5246
5247   /* We don't need to do anything if this is a call to a special
5248      MIPS16 support function.  */
5249   if (GET_CODE (fn) == SYMBOL_REF
5250       && strncmp (XSTR (fn, 0), "__mips16_", 9) == 0)
5251     return false;
5252
5253   /* This code will only work for o32 and o64 abis.  The other ABI's
5254      require more sophisticated support.  */
5255   gcc_assert (TARGET_OLDABI);
5256
5257   /* If we're calling via a function pointer, use one of the magic
5258      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
5259      Each stub expects the function address to arrive in register $2.  */
5260   if (GET_CODE (fn) != SYMBOL_REF)
5261     {
5262       char buf[30];
5263       tree id;
5264       rtx stub_fn, insn;
5265
5266       /* Create a SYMBOL_REF for the libgcc.a function.  */
5267       if (fp_ret_p)
5268         sprintf (buf, "__mips16_call_stub_%s_%d",
5269                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
5270                  fp_code);
5271       else
5272         sprintf (buf, "__mips16_call_stub_%d", fp_code);
5273       id = get_identifier (buf);
5274       stub_fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
5275
5276       /* Load the target function into $2.  */
5277       mips_emit_move (gen_rtx_REG (Pmode, 2), fn);
5278
5279       /* Emit the call.  */
5280       if (retval == NULL_RTX)
5281         insn = gen_call_internal (stub_fn, args_size);
5282       else
5283         insn = gen_call_value_internal (retval, stub_fn, args_size);
5284       insn = emit_call_insn (insn);
5285
5286       /* Tell GCC that this call does indeed use the value of $2.  */
5287       CALL_INSN_FUNCTION_USAGE (insn) =
5288         gen_rtx_EXPR_LIST (VOIDmode,
5289                            gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 2)),
5290                            CALL_INSN_FUNCTION_USAGE (insn));
5291
5292       /* If we are handling a floating-point return value, we need to
5293          save $18 in the function prologue.  Putting a note on the
5294          call will mean that df_regs_ever_live_p ($18) will be true if the
5295          call is not eliminated, and we can check that in the prologue
5296          code.  */
5297       if (fp_ret_p)
5298         CALL_INSN_FUNCTION_USAGE (insn) =
5299           gen_rtx_EXPR_LIST (VOIDmode,
5300                              gen_rtx_USE (VOIDmode,
5301                                           gen_rtx_REG (word_mode, 18)),
5302                              CALL_INSN_FUNCTION_USAGE (insn));
5303
5304       return true;
5305     }
5306
5307   /* We know the function we are going to call.  If we have already
5308      built a stub, we don't need to do anything further.  */
5309   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
5310   for (l = mips16_stubs; l != NULL; l = l->next)
5311     if (strcmp (l->name, fnname) == 0)
5312       break;
5313
5314   if (l == NULL)
5315     {
5316       const char *separator;
5317       char *secname, *stubname;
5318       tree stubid, stubdecl;
5319       unsigned int f;
5320
5321       /* If the function does not return in FPRs, the special stub
5322          section is named
5323              .mips16.call.FNNAME
5324
5325          If the function does return in FPRs, the stub section is named
5326              .mips16.call.fp.FNNAME
5327
5328          Build a decl for the stub.  */
5329       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
5330                           fnname, NULL));
5331       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
5332                            fnname, NULL));
5333       stubid = get_identifier (stubname);
5334       stubdecl = build_decl (FUNCTION_DECL, stubid,
5335                              build_function_type (void_type_node, NULL_TREE));
5336       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5337       DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE,
5338                                            void_type_node);
5339
5340       /* Output a comment.  */
5341       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
5342                (fp_ret_p
5343                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
5344                 : ""),
5345                fnname);
5346       separator = "";
5347       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5348         {
5349           fprintf (asm_out_file, "%s%s", separator,
5350                    (f & 3) == 1 ? "float" : "double");
5351           separator = ", ";
5352         }
5353       fprintf (asm_out_file, ")\n");
5354
5355       /* Write the preamble leading up to the function declaration.  */
5356       fprintf (asm_out_file, "\t.set\tnomips16\n");
5357       assemble_start_function (stubdecl, stubname);
5358
5359       if (!FUNCTION_NAME_ALREADY_DECLARED)
5360         {
5361           fputs ("\t.ent\t", asm_out_file);
5362           assemble_name (asm_out_file, stubname);
5363           fputs ("\n", asm_out_file);
5364
5365           assemble_name (asm_out_file, stubname);
5366           fputs (":\n", asm_out_file);
5367         }
5368
5369       if (!fp_ret_p)
5370         {
5371           /* Load the address of the MIPS16 function into $at.  Do this
5372              first so that targets with coprocessor interlocks can use
5373              an MFC1 to fill the delay slot.  */
5374           fprintf (asm_out_file, "\t.set\tnoat\n");
5375           fprintf (asm_out_file, "\tla\t%s,%s\n", reg_names[GP_REG_FIRST + 1],
5376                    fnname);
5377         }
5378
5379       /* Move the arguments from general registers to floating-point
5380          registers.  */
5381       mips_output_args_xfer (fp_code, 't');
5382
5383       if (!fp_ret_p)
5384         {
5385           /* Jump to the previously-loaded address.  */
5386           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
5387           fprintf (asm_out_file, "\t.set\tat\n");
5388         }
5389       else
5390         {
5391           /* Save the return address in $18 and call the non-MIPS16 function.
5392              The stub's caller knows that $18 might be clobbered, even though
5393              $18 is usually a call-saved register.  */
5394           fprintf (asm_out_file, "\tmove\t%s,%s\n",
5395                    reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
5396           fprintf (asm_out_file, "\tjal\t%s\n", fnname);
5397
5398           /* Move the result from floating-point registers to
5399              general registers.  */
5400           switch (GET_MODE (retval))
5401             {
5402             case SCmode:
5403               mips_output_32bit_xfer ('f', GP_RETURN + 1,
5404                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
5405               /* Fall though.  */
5406             case SFmode:
5407               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
5408               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
5409                 {
5410                   /* On 64-bit targets, complex floats are returned in
5411                      a single GPR, such that "sd" on a suitably-aligned
5412                      target would store the value correctly.  */
5413                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
5414                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
5415                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
5416                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
5417                            reg_names[GP_RETURN],
5418                            reg_names[GP_RETURN],
5419                            reg_names[GP_RETURN + 1]);
5420                 }
5421               break;
5422
5423             case DCmode:
5424               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
5425                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
5426               /* Fall though.  */
5427             case DFmode:
5428             case V2SFmode:
5429               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
5430               break;
5431
5432             default:
5433               gcc_unreachable ();
5434             }
5435           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
5436         }
5437
5438 #ifdef ASM_DECLARE_FUNCTION_SIZE
5439       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
5440 #endif
5441
5442       if (!FUNCTION_NAME_ALREADY_DECLARED)
5443         {
5444           fputs ("\t.end\t", asm_out_file);
5445           assemble_name (asm_out_file, stubname);
5446           fputs ("\n", asm_out_file);
5447         }
5448
5449       /* Record this stub.  */
5450       l = XNEW (struct mips16_stub);
5451       l->name = xstrdup (fnname);
5452       l->fp_ret_p = fp_ret_p;
5453       l->next = mips16_stubs;
5454       mips16_stubs = l;
5455     }
5456
5457   /* If we expect a floating-point return value, but we've built a
5458      stub which does not expect one, then we're in trouble.  We can't
5459      use the existing stub, because it won't handle the floating-point
5460      value.  We can't build a new stub, because the linker won't know
5461      which stub to use for the various calls in this object file.
5462      Fortunately, this case is illegal, since it means that a function
5463      was declared in two different ways in a single compilation.  */
5464   if (fp_ret_p && !l->fp_ret_p)
5465     error ("cannot handle inconsistent calls to %qs", fnname);
5466
5467   if (retval == NULL_RTX)
5468     insn = gen_call_internal_direct (fn, args_size);
5469   else
5470     insn = gen_call_value_internal_direct (retval, fn, args_size);
5471   insn = emit_call_insn (insn);
5472
5473   /* If we are calling a stub which handles a floating-point return
5474      value, we need to arrange to save $18 in the prologue.  We do this
5475      by marking the function call as using the register.  The prologue
5476      will later see that it is used, and emit code to save it.  */
5477   if (fp_ret_p)
5478     CALL_INSN_FUNCTION_USAGE (insn) =
5479       gen_rtx_EXPR_LIST (VOIDmode,
5480                          gen_rtx_USE (VOIDmode, gen_rtx_REG (word_mode, 18)),
5481                          CALL_INSN_FUNCTION_USAGE (insn));
5482
5483   return true;
5484 }
5485 \f
5486 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5487
5488 static bool
5489 mips_ok_for_lazy_binding_p (rtx x)
5490 {
5491   return (TARGET_USE_GOT
5492           && GET_CODE (x) == SYMBOL_REF
5493           && !mips_symbol_binds_local_p (x));
5494 }
5495
5496 /* Load function address ADDR into register DEST.  SIBCALL_P is true
5497    if the address is needed for a sibling call.  Return true if we
5498    used an explicit lazy-binding sequence.  */
5499
5500 static bool
5501 mips_load_call_address (rtx dest, rtx addr, bool sibcall_p)
5502 {
5503   /* If we're generating PIC, and this call is to a global function,
5504      try to allow its address to be resolved lazily.  This isn't
5505      possible for sibcalls when $gp is call-saved because the value
5506      of $gp on entry to the stub would be our caller's gp, not ours.  */
5507   if (TARGET_EXPLICIT_RELOCS
5508       && !(sibcall_p && TARGET_CALL_SAVED_GP)
5509       && mips_ok_for_lazy_binding_p (addr))
5510     {
5511       rtx high, lo_sum_symbol;
5512
5513       high = mips_unspec_offset_high (dest, pic_offset_table_rtx,
5514                                       addr, SYMBOL_GOTOFF_CALL);
5515       lo_sum_symbol = mips_unspec_address (addr, SYMBOL_GOTOFF_CALL);
5516       if (Pmode == SImode)
5517         emit_insn (gen_load_callsi (dest, high, lo_sum_symbol));
5518       else
5519         emit_insn (gen_load_calldi (dest, high, lo_sum_symbol));
5520       return true;
5521     }
5522   else
5523     {
5524       mips_emit_move (dest, addr);
5525       return false;
5526     }
5527 }
5528
5529 /* Expand a "call", "sibcall", "call_value" or "sibcall_value" instruction.
5530    RESULT is where the result will go (null for "call"s and "sibcall"s),
5531    ADDR is the address of the function, ARGS_SIZE is the size of the
5532    arguments and AUX is the value passed to us by mips_function_arg.
5533    SIBCALL_P is true if we are expanding a sibling call, false if we're
5534    expanding a normal call.  */
5535
5536 void
5537 mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, bool sibcall_p)
5538 {
5539   rtx orig_addr, pattern, insn;
5540   bool lazy_p;
5541
5542   orig_addr = addr;
5543   lazy_p = false;
5544   if (!call_insn_operand (addr, VOIDmode))
5545     {
5546       addr = gen_reg_rtx (Pmode);
5547       lazy_p = mips_load_call_address (addr, orig_addr, sibcall_p);
5548     }
5549
5550   if (TARGET_MIPS16
5551       && TARGET_HARD_FLOAT_ABI
5552       && mips16_build_call_stub (result, addr, args_size,
5553                                  aux == 0 ? 0 : (int) GET_MODE (aux)))
5554     {
5555       gcc_assert (!sibcall_p);
5556       return;
5557     }
5558
5559   if (result == 0)
5560     pattern = (sibcall_p
5561                ? gen_sibcall_internal (addr, args_size)
5562                : gen_call_internal (addr, args_size));
5563   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
5564     {
5565       /* Handle return values created by mips_return_fpr_pair.  */
5566       rtx reg1, reg2;
5567
5568       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
5569       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
5570       pattern =
5571         (sibcall_p
5572          ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
5573          : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
5574     }
5575   else
5576     {
5577       /* Handle return values created by mips_return_fpr_single.  */
5578       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
5579         result = XEXP (XVECEXP (result, 0, 0), 0);
5580       pattern = (sibcall_p
5581                  ? gen_sibcall_value_internal (result, addr, args_size)
5582                  : gen_call_value_internal (result, addr, args_size));
5583     }
5584
5585   insn = emit_call_insn (pattern);
5586
5587   /* Lazy-binding stubs require $gp to be valid on entry.  We also pretend
5588      that they use FAKE_CALL_REGNO; see the load_call<mode> patterns for
5589      details.  */
5590   if (lazy_p)
5591     {
5592       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
5593       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
5594                gen_rtx_REG (Pmode, FAKE_CALL_REGNO));
5595     }
5596 }
5597
5598 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
5599
5600 static bool
5601 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
5602 {
5603   if (!TARGET_SIBCALLS)
5604     return false;
5605
5606   /* We can't do a sibcall if the called function is a MIPS16 function
5607      because there is no direct "jx" instruction equivalent to "jalx" to
5608      switch the ISA mode.  We only care about cases where the sibling
5609      and normal calls would both be direct.  */
5610   if (mips_use_mips16_mode_p (decl)
5611       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
5612     return false;
5613
5614   /* When -minterlink-mips16 is in effect, assume that external
5615      functions could be MIPS16 ones unless an attribute explicitly
5616      tells us otherwise.  */
5617   if (TARGET_INTERLINK_MIPS16
5618       && decl
5619       && DECL_EXTERNAL (decl)
5620       && !mips_nomips16_decl_p (decl)
5621       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
5622     return false;
5623
5624   /* Otherwise OK.  */
5625   return true;
5626 }
5627 \f
5628 /* Emit code to move general operand SRC into condition-code
5629    register DEST given that SCRATCH is a scratch TFmode FPR.
5630    The sequence is:
5631
5632         FP1 = SRC
5633         FP2 = 0.0f
5634         DEST = FP2 < FP1
5635
5636    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
5637
5638 void
5639 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
5640 {
5641   rtx fp1, fp2;
5642
5643   /* Change the source to SFmode.  */
5644   if (MEM_P (src))
5645     src = adjust_address (src, SFmode, 0);
5646   else if (REG_P (src) || GET_CODE (src) == SUBREG)
5647     src = gen_rtx_REG (SFmode, true_regnum (src));
5648
5649   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
5650   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
5651
5652   mips_emit_move (copy_rtx (fp1), src);
5653   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
5654   emit_insn (gen_slt_sf (dest, fp2, fp1));
5655 }
5656 \f
5657 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
5658    Assume that the areas do not overlap.  */
5659
5660 static void
5661 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
5662 {
5663   HOST_WIDE_INT offset, delta;
5664   unsigned HOST_WIDE_INT bits;
5665   int i;
5666   enum machine_mode mode;
5667   rtx *regs;
5668
5669   /* Work out how many bits to move at a time.  If both operands have
5670      half-word alignment, it is usually better to move in half words.
5671      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
5672      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
5673      Otherwise move word-sized chunks.  */
5674   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
5675       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
5676     bits = BITS_PER_WORD / 2;
5677   else
5678     bits = BITS_PER_WORD;
5679
5680   mode = mode_for_size (bits, MODE_INT, 0);
5681   delta = bits / BITS_PER_UNIT;
5682
5683   /* Allocate a buffer for the temporary registers.  */
5684   regs = alloca (sizeof (rtx) * length / delta);
5685
5686   /* Load as many BITS-sized chunks as possible.  Use a normal load if
5687      the source has enough alignment, otherwise use left/right pairs.  */
5688   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
5689     {
5690       regs[i] = gen_reg_rtx (mode);
5691       if (MEM_ALIGN (src) >= bits)
5692         mips_emit_move (regs[i], adjust_address (src, mode, offset));
5693       else
5694         {
5695           rtx part = adjust_address (src, BLKmode, offset);
5696           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
5697             gcc_unreachable ();
5698         }
5699     }
5700
5701   /* Copy the chunks to the destination.  */
5702   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
5703     if (MEM_ALIGN (dest) >= bits)
5704       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
5705     else
5706       {
5707         rtx part = adjust_address (dest, BLKmode, offset);
5708         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
5709           gcc_unreachable ();
5710       }
5711
5712   /* Mop up any left-over bytes.  */
5713   if (offset < length)
5714     {
5715       src = adjust_address (src, BLKmode, offset);
5716       dest = adjust_address (dest, BLKmode, offset);
5717       move_by_pieces (dest, src, length - offset,
5718                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
5719     }
5720 }
5721
5722 /* Helper function for doing a loop-based block operation on memory
5723    reference MEM.  Each iteration of the loop will operate on LENGTH
5724    bytes of MEM.
5725
5726    Create a new base register for use within the loop and point it to
5727    the start of MEM.  Create a new memory reference that uses this
5728    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
5729
5730 static void
5731 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
5732                        rtx *loop_reg, rtx *loop_mem)
5733 {
5734   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
5735
5736   /* Although the new mem does not refer to a known location,
5737      it does keep up to LENGTH bytes of alignment.  */
5738   *loop_mem = change_address (mem, BLKmode, *loop_reg);
5739   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
5740 }
5741
5742 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
5743    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
5744    the memory regions do not overlap.  */
5745
5746 static void
5747 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
5748                       HOST_WIDE_INT bytes_per_iter)
5749 {
5750   rtx label, src_reg, dest_reg, final_src;
5751   HOST_WIDE_INT leftover;
5752
5753   leftover = length % bytes_per_iter;
5754   length -= leftover;
5755
5756   /* Create registers and memory references for use within the loop.  */
5757   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
5758   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
5759
5760   /* Calculate the value that SRC_REG should have after the last iteration
5761      of the loop.  */
5762   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
5763                                    0, 0, OPTAB_WIDEN);
5764
5765   /* Emit the start of the loop.  */
5766   label = gen_label_rtx ();
5767   emit_label (label);
5768
5769   /* Emit the loop body.  */
5770   mips_block_move_straight (dest, src, bytes_per_iter);
5771
5772   /* Move on to the next block.  */
5773   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
5774   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
5775
5776   /* Emit the loop condition.  */
5777   if (Pmode == DImode)
5778     emit_insn (gen_cmpdi (src_reg, final_src));
5779   else
5780     emit_insn (gen_cmpsi (src_reg, final_src));
5781   emit_jump_insn (gen_bne (label));
5782
5783   /* Mop up any left-over bytes.  */
5784   if (leftover)
5785     mips_block_move_straight (dest, src, leftover);
5786 }
5787
5788 /* Expand a movmemsi instruction, which copies LENGTH bytes from
5789    memory reference SRC to memory reference DEST.  */
5790
5791 bool
5792 mips_expand_block_move (rtx dest, rtx src, rtx length)
5793 {
5794   if (GET_CODE (length) == CONST_INT)
5795     {
5796       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
5797         {
5798           mips_block_move_straight (dest, src, INTVAL (length));
5799           return true;
5800         }
5801       else if (optimize)
5802         {
5803           mips_block_move_loop (dest, src, INTVAL (length),
5804                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
5805           return true;
5806         }
5807     }
5808   return false;
5809 }
5810 \f
5811 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
5812
5813 void
5814 mips_expand_synci_loop (rtx begin, rtx end)
5815 {
5816   rtx inc, label, cmp, cmp_result;
5817
5818   /* Load INC with the cache line size (rdhwr INC,$1).  */
5819   inc = gen_reg_rtx (SImode);
5820   emit_insn (gen_rdhwr (inc, const1_rtx));
5821
5822   /* Loop back to here.  */
5823   label = gen_label_rtx ();
5824   emit_label (label);
5825
5826   emit_insn (gen_synci (begin));
5827
5828   cmp = gen_reg_rtx (Pmode);
5829   mips_emit_binary (GTU, cmp, begin, end);
5830
5831   mips_emit_binary (PLUS, begin, begin, inc);
5832
5833   cmp_result = gen_rtx_EQ (VOIDmode, cmp, const0_rtx);
5834   emit_jump_insn (gen_condjump (cmp_result, label));
5835 }
5836 \f
5837 /* Return true if it is possible to use left/right accesses for a
5838    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
5839    returning true, update *OP, *LEFT and *RIGHT as follows:
5840
5841    *OP is a BLKmode reference to the whole field.
5842
5843    *LEFT is a QImode reference to the first byte if big endian or
5844    the last byte if little endian.  This address can be used in the
5845    left-side instructions (LWL, SWL, LDL, SDL).
5846
5847    *RIGHT is a QImode reference to the opposite end of the field and
5848    can be used in the patterning right-side instruction.  */
5849
5850 static bool
5851 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
5852                         rtx *left, rtx *right)
5853 {
5854   rtx first, last;
5855
5856   /* Check that the operand really is a MEM.  Not all the extv and
5857      extzv predicates are checked.  */
5858   if (!MEM_P (*op))
5859     return false;
5860
5861   /* Check that the size is valid.  */
5862   if (width != 32 && (!TARGET_64BIT || width != 64))
5863     return false;
5864
5865   /* We can only access byte-aligned values.  Since we are always passed
5866      a reference to the first byte of the field, it is not necessary to
5867      do anything with BITPOS after this check.  */
5868   if (bitpos % BITS_PER_UNIT != 0)
5869     return false;
5870
5871   /* Reject aligned bitfields: we want to use a normal load or store
5872      instead of a left/right pair.  */
5873   if (MEM_ALIGN (*op) >= width)
5874     return false;
5875
5876   /* Adjust *OP to refer to the whole field.  This also has the effect
5877      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
5878   *op = adjust_address (*op, BLKmode, 0);
5879   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
5880
5881   /* Get references to both ends of the field.  We deliberately don't
5882      use the original QImode *OP for FIRST since the new BLKmode one
5883      might have a simpler address.  */
5884   first = adjust_address (*op, QImode, 0);
5885   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
5886
5887   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
5888      correspond to the MSB and RIGHT to the LSB.  */
5889   if (TARGET_BIG_ENDIAN)
5890     *left = first, *right = last;
5891   else
5892     *left = last, *right = first;
5893
5894   return true;
5895 }
5896
5897 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
5898    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
5899    the operation is the equivalent of:
5900
5901       (set DEST (*_extract SRC WIDTH BITPOS))
5902
5903    Return true on success.  */
5904
5905 bool
5906 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
5907                                    HOST_WIDE_INT bitpos)
5908 {
5909   rtx left, right, temp;
5910
5911   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
5912      be a paradoxical word_mode subreg.  This is the only case in which
5913      we allow the destination to be larger than the source.  */
5914   if (GET_CODE (dest) == SUBREG
5915       && GET_MODE (dest) == DImode
5916       && GET_MODE (SUBREG_REG (dest)) == SImode)
5917     dest = SUBREG_REG (dest);
5918
5919   /* After the above adjustment, the destination must be the same
5920      width as the source.  */
5921   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
5922     return false;
5923
5924   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
5925     return false;
5926
5927   temp = gen_reg_rtx (GET_MODE (dest));
5928   if (GET_MODE (dest) == DImode)
5929     {
5930       emit_insn (gen_mov_ldl (temp, src, left));
5931       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
5932     }
5933   else
5934     {
5935       emit_insn (gen_mov_lwl (temp, src, left));
5936       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
5937     }
5938   return true;
5939 }
5940
5941 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
5942    BITPOS and SRC are the operands passed to the expander; the operation
5943    is the equivalent of:
5944
5945        (set (zero_extract DEST WIDTH BITPOS) SRC)
5946
5947    Return true on success.  */
5948
5949 bool
5950 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
5951                                     HOST_WIDE_INT bitpos)
5952 {
5953   rtx left, right;
5954   enum machine_mode mode;
5955
5956   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
5957     return false;
5958
5959   mode = mode_for_size (width, MODE_INT, 0);
5960   src = gen_lowpart (mode, src);
5961   if (mode == DImode)
5962     {
5963       emit_insn (gen_mov_sdl (dest, src, left));
5964       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
5965     }
5966   else
5967     {
5968       emit_insn (gen_mov_swl (dest, src, left));
5969       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
5970     }
5971   return true;
5972 }
5973
5974 /* Return true if X is a MEM with the same size as MODE.  */
5975
5976 bool
5977 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
5978 {
5979   rtx size;
5980
5981   if (!MEM_P (x))
5982     return false;
5983
5984   size = MEM_SIZE (x);
5985   return size && INTVAL (size) == GET_MODE_SIZE (mode);
5986 }
5987
5988 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
5989    source of an "ext" instruction or the destination of an "ins"
5990    instruction.  OP must be a register operand and the following
5991    conditions must hold:
5992
5993      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
5994      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
5995      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
5996
5997    Also reject lengths equal to a word as they are better handled
5998    by the move patterns.  */
5999
6000 bool
6001 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
6002 {
6003   if (!ISA_HAS_EXT_INS
6004       || !register_operand (op, VOIDmode)
6005       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
6006     return false;
6007
6008   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
6009     return false;
6010
6011   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
6012     return false;
6013
6014   return true;
6015 }
6016 \f
6017 /* Return true if -msplit-addresses is selected and should be honored.
6018
6019    -msplit-addresses is a half-way house between explicit relocations
6020    and the traditional assembler macros.  It can split absolute 32-bit
6021    symbolic constants into a high/lo_sum pair but uses macros for other
6022    sorts of access.
6023
6024    Like explicit relocation support for REL targets, it relies
6025    on GNU extensions in the assembler and the linker.
6026
6027    Although this code should work for -O0, it has traditionally
6028    been treated as an optimization.  */
6029
6030 static bool
6031 mips_split_addresses_p (void)
6032 {
6033   return (TARGET_SPLIT_ADDRESSES
6034           && optimize
6035           && !TARGET_MIPS16
6036           && !flag_pic
6037           && !ABI_HAS_64BIT_SYMBOLS);
6038 }
6039
6040 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
6041
6042 static void
6043 mips_init_relocs (void)
6044 {
6045   memset (mips_split_p, '\0', sizeof (mips_split_p));
6046   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
6047   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
6048
6049   if (ABI_HAS_64BIT_SYMBOLS)
6050     {
6051       if (TARGET_EXPLICIT_RELOCS)
6052         {
6053           mips_split_p[SYMBOL_64_HIGH] = true;
6054           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
6055           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
6056
6057           mips_split_p[SYMBOL_64_MID] = true;
6058           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
6059           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
6060
6061           mips_split_p[SYMBOL_64_LOW] = true;
6062           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
6063           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
6064
6065           mips_split_p[SYMBOL_ABSOLUTE] = true;
6066           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6067         }
6068     }
6069   else
6070     {
6071       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses_p () || TARGET_MIPS16)
6072         {
6073           mips_split_p[SYMBOL_ABSOLUTE] = true;
6074           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
6075           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6076
6077           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
6078         }
6079     }
6080
6081   if (TARGET_MIPS16)
6082     {
6083       /* The high part is provided by a pseudo copy of $gp.  */
6084       mips_split_p[SYMBOL_GP_RELATIVE] = true;
6085       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
6086     }
6087
6088   if (TARGET_EXPLICIT_RELOCS)
6089     {
6090       /* Small data constants are kept whole until after reload,
6091          then lowered by mips_rewrite_small_data.  */
6092       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
6093
6094       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
6095       if (TARGET_NEWABI)
6096         {
6097           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
6098           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
6099         }
6100       else
6101         {
6102           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
6103           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
6104         }
6105
6106       if (TARGET_XGOT)
6107         {
6108           /* The HIGH and LO_SUM are matched by special .md patterns.  */
6109           mips_split_p[SYMBOL_GOT_DISP] = true;
6110
6111           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
6112           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
6113           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
6114
6115           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
6116           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
6117           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
6118         }
6119       else
6120         {
6121           if (TARGET_NEWABI)
6122             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
6123           else
6124             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
6125           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
6126         }
6127     }
6128
6129   if (TARGET_NEWABI)
6130     {
6131       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
6132       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
6133       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
6134     }
6135
6136   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
6137   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
6138
6139   mips_split_p[SYMBOL_DTPREL] = true;
6140   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
6141   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
6142
6143   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
6144
6145   mips_split_p[SYMBOL_TPREL] = true;
6146   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
6147   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
6148
6149   mips_lo_relocs[SYMBOL_HALF] = "%half(";
6150 }
6151
6152 /* If OP is an UNSPEC address, return the address to which it refers,
6153    otherwise return OP itself.  */
6154
6155 static rtx
6156 mips_strip_unspec_address (rtx op)
6157 {
6158   rtx base, offset;
6159
6160   split_const (op, &base, &offset);
6161   if (UNSPEC_ADDRESS_P (base))
6162     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
6163   return op;
6164 }
6165
6166 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
6167    in context CONTEXT.  RELOCS is the array of relocations to use.  */
6168
6169 static void
6170 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
6171                           const char **relocs)
6172 {
6173   enum mips_symbol_type symbol_type;
6174   const char *p;
6175
6176   symbol_type = mips_classify_symbolic_expression (op, context);
6177   gcc_assert (relocs[symbol_type]);
6178
6179   fputs (relocs[symbol_type], file);
6180   output_addr_const (file, mips_strip_unspec_address (op));
6181   for (p = relocs[symbol_type]; *p != 0; p++)
6182     if (*p == '(')
6183       fputc (')', file);
6184 }
6185
6186 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
6187    The punctuation characters are:
6188
6189    '('  Start a nested ".set noreorder" block.
6190    ')'  End a nested ".set noreorder" block.
6191    '['  Start a nested ".set noat" block.
6192    ']'  End a nested ".set noat" block.
6193    '<'  Start a nested ".set nomacro" block.
6194    '>'  End a nested ".set nomacro" block.
6195    '*'  Behave like %(%< if generating a delayed-branch sequence.
6196    '#'  Print a nop if in a ".set noreorder" block.
6197    '/'  Like '#', but do nothing within a delayed-branch sequence.
6198    '?'  Print "l" if mips_branch_likely is true
6199    '.'  Print the name of the register with a hard-wired zero (zero or $0).
6200    '@'  Print the name of the assembler temporary register (at or $1).
6201    '^'  Print the name of the pic call-through register (t9 or $25).
6202    '+'  Print the name of the gp register (usually gp or $28).
6203    '$'  Print the name of the stack pointer register (sp or $29).
6204    '|'  Print ".set push; .set mips2" if !ISA_HAS_LL_SC.
6205    '-'  Print ".set pop" under the same conditions for '|'.
6206
6207    See also mips_init_print_operand_pucnt.  */
6208
6209 static void
6210 mips_print_operand_punctuation (FILE *file, int ch)
6211 {
6212   switch (ch)
6213     {
6214     case '(':
6215       if (set_noreorder++ == 0)
6216         fputs (".set\tnoreorder\n\t", file);
6217       break;
6218
6219     case ')':
6220       gcc_assert (set_noreorder > 0);
6221       if (--set_noreorder == 0)
6222         fputs ("\n\t.set\treorder", file);
6223       break;
6224
6225     case '[':
6226       if (set_noat++ == 0)
6227         fputs (".set\tnoat\n\t", file);
6228       break;
6229
6230     case ']':
6231       gcc_assert (set_noat > 0);
6232       if (--set_noat == 0)
6233         fputs ("\n\t.set\tat", file);
6234       break;
6235
6236     case '<':
6237       if (set_nomacro++ == 0)
6238         fputs (".set\tnomacro\n\t", file);
6239       break;
6240
6241     case '>':
6242       gcc_assert (set_nomacro > 0);
6243       if (--set_nomacro == 0)
6244         fputs ("\n\t.set\tmacro", file);
6245       break;
6246
6247     case '*':
6248       if (final_sequence != 0)
6249         {
6250           mips_print_operand_punctuation (file, '(');
6251           mips_print_operand_punctuation (file, '<');
6252         }
6253       break;
6254
6255     case '#':
6256       if (set_noreorder != 0)
6257         fputs ("\n\tnop", file);
6258       break;
6259
6260     case '/':
6261       /* Print an extra newline so that the delayed insn is separated
6262          from the following ones.  This looks neater and is consistent
6263          with non-nop delayed sequences.  */
6264       if (set_noreorder != 0 && final_sequence == 0)
6265         fputs ("\n\tnop\n", file);
6266       break;
6267
6268     case '?':
6269       if (mips_branch_likely)
6270         putc ('l', file);
6271       break;
6272
6273     case '.':
6274       fputs (reg_names[GP_REG_FIRST + 0], file);
6275       break;
6276
6277     case '@':
6278       fputs (reg_names[GP_REG_FIRST + 1], file);
6279       break;
6280
6281     case '^':
6282       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
6283       break;
6284
6285     case '+':
6286       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
6287       break;
6288
6289     case '$':
6290       fputs (reg_names[STACK_POINTER_REGNUM], file);
6291       break;
6292
6293     case '|':
6294       if (!ISA_HAS_LL_SC)
6295         fputs (".set\tpush\n\t.set\tmips2\n\t", file);
6296       break;
6297
6298     case '-':
6299       if (!ISA_HAS_LL_SC)
6300         fputs ("\n\t.set\tpop", file);
6301       break;
6302
6303     default:
6304       gcc_unreachable ();
6305       break;
6306     }
6307 }
6308
6309 /* Initialize mips_print_operand_punct.  */
6310
6311 static void
6312 mips_init_print_operand_punct (void)
6313 {
6314   const char *p;
6315
6316   for (p = "()[]<>*#/?.@^+$|-"; *p; p++)
6317     mips_print_operand_punct[(unsigned char) *p] = true;
6318 }
6319
6320 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
6321    associated with condition CODE.  Print the condition part of the
6322    opcode to FILE.  */
6323
6324 static void
6325 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
6326 {
6327   switch (code)
6328     {
6329     case EQ:
6330     case NE:
6331     case GT:
6332     case GE:
6333     case LT:
6334     case LE:
6335     case GTU:
6336     case GEU:
6337     case LTU:
6338     case LEU:
6339       /* Conveniently, the MIPS names for these conditions are the same
6340          as their RTL equivalents.  */
6341       fputs (GET_RTX_NAME (code), file);
6342       break;
6343
6344     default:
6345       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
6346       break;
6347     }
6348 }
6349
6350 /* Likewise floating-point branches.  */
6351
6352 static void
6353 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
6354 {
6355   switch (code)
6356     {
6357     case EQ:
6358       fputs ("c1f", file);
6359       break;
6360
6361     case NE:
6362       fputs ("c1t", file);
6363       break;
6364
6365     default:
6366       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
6367       break;
6368     }
6369 }
6370
6371 /* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
6372
6373    'X'  Print CONST_INT OP in hexadecimal format.
6374    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
6375    'd'  Print CONST_INT OP in decimal.
6376    'h'  Print the high-part relocation associated with OP, after stripping
6377           any outermost HIGH.
6378    'R'  Print the low-part relocation associated with OP.
6379    'C'  Print the integer branch condition for comparison OP.
6380    'N'  Print the inverse of the integer branch condition for comparison OP.
6381    'F'  Print the FPU branch condition for comparison OP.
6382    'W'  Print the inverse of the FPU branch condition for comparison OP.
6383    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
6384               'z' for (eq:?I ...), 'n' for (ne:?I ...).
6385    't'  Like 'T', but with the EQ/NE cases reversed
6386    'Y'  Print mips_fp_conditions[INTVAL (OP)]
6387    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
6388    'q'  Print a DSP accumulator register.
6389    'D'  Print the second part of a double-word register or memory operand.
6390    'L'  Print the low-order register in a double-word register operand.
6391    'M'  Print high-order register in a double-word register operand.
6392    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
6393
6394 void
6395 mips_print_operand (FILE *file, rtx op, int letter)
6396 {
6397   enum rtx_code code;
6398
6399   if (PRINT_OPERAND_PUNCT_VALID_P (letter))
6400     {
6401       mips_print_operand_punctuation (file, letter);
6402       return;
6403     }
6404
6405   gcc_assert (op);
6406   code = GET_CODE (op);
6407
6408   switch (letter)
6409     {
6410     case 'X':
6411       if (GET_CODE (op) == CONST_INT)
6412         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
6413       else
6414         output_operand_lossage ("invalid use of '%%%c'", letter);
6415       break;
6416
6417     case 'x':
6418       if (GET_CODE (op) == CONST_INT)
6419         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
6420       else
6421         output_operand_lossage ("invalid use of '%%%c'", letter);
6422       break;
6423
6424     case 'd':
6425       if (GET_CODE (op) == CONST_INT)
6426         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
6427       else
6428         output_operand_lossage ("invalid use of '%%%c'", letter);
6429       break;
6430
6431     case 'h':
6432       if (code == HIGH)
6433         op = XEXP (op, 0);
6434       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
6435       break;
6436
6437     case 'R':
6438       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
6439       break;
6440
6441     case 'C':
6442       mips_print_int_branch_condition (file, code, letter);
6443       break;
6444
6445     case 'N':
6446       mips_print_int_branch_condition (file, reverse_condition (code), letter);
6447       break;
6448
6449     case 'F':
6450       mips_print_float_branch_condition (file, code, letter);
6451       break;
6452
6453     case 'W':
6454       mips_print_float_branch_condition (file, reverse_condition (code),
6455                                          letter);
6456       break;
6457
6458     case 'T':
6459     case 't':
6460       {
6461         int truth = (code == NE) == (letter == 'T');
6462         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
6463       }
6464       break;
6465
6466     case 'Y':
6467       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
6468         fputs (mips_fp_conditions[UINTVAL (op)], file);
6469       else
6470         output_operand_lossage ("'%%%c' is not a valid operand prefix",
6471                                 letter);
6472       break;
6473
6474     case 'Z':
6475       if (ISA_HAS_8CC)
6476         {
6477           mips_print_operand (file, op, 0);
6478           fputc (',', file);
6479         }
6480       break;
6481
6482     case 'q':
6483       if (code == REG && MD_REG_P (REGNO (op)))
6484         fprintf (file, "$ac0");
6485       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
6486         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
6487       else
6488         output_operand_lossage ("invalid use of '%%%c'", letter);
6489       break;
6490
6491     default:
6492       switch (code)
6493         {
6494         case REG:
6495           {
6496             unsigned int regno = REGNO (op);
6497             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
6498                 || (letter == 'L' && TARGET_BIG_ENDIAN)
6499                 || letter == 'D')
6500               regno++;
6501             fprintf (file, "%s", reg_names[regno]);
6502           }
6503           break;
6504
6505         case MEM:
6506           if (letter == 'D')
6507             output_address (plus_constant (XEXP (op, 0), 4));
6508           else
6509             output_address (XEXP (op, 0));
6510           break;
6511
6512         default:
6513           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
6514             fputs (reg_names[GP_REG_FIRST], file);
6515           else if (CONST_GP_P (op))
6516             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
6517           else
6518             output_addr_const (file, mips_strip_unspec_address (op));
6519           break;
6520         }
6521     }
6522 }
6523
6524 /* Output address operand X to FILE.  */
6525
6526 void
6527 mips_print_operand_address (FILE *file, rtx x)
6528 {
6529   struct mips_address_info addr;
6530
6531   if (mips_classify_address (&addr, x, word_mode, true))
6532     switch (addr.type)
6533       {
6534       case ADDRESS_REG:
6535         mips_print_operand (file, addr.offset, 0);
6536         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6537         return;
6538
6539       case ADDRESS_LO_SUM:
6540         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
6541                                   mips_lo_relocs);
6542         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6543         return;
6544
6545       case ADDRESS_CONST_INT:
6546         output_addr_const (file, x);
6547         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
6548         return;
6549
6550       case ADDRESS_SYMBOLIC:
6551         output_addr_const (file, mips_strip_unspec_address (x));
6552         return;
6553       }
6554   gcc_unreachable ();
6555 }
6556 \f
6557 /* Implement TARGET_ENCODE_SECTION_INFO.  */
6558
6559 static void
6560 mips_encode_section_info (tree decl, rtx rtl, int first)
6561 {
6562   default_encode_section_info (decl, rtl, first);
6563
6564   if (TREE_CODE (decl) == FUNCTION_DECL)
6565     {
6566       rtx symbol = XEXP (rtl, 0);
6567       tree type = TREE_TYPE (decl);
6568
6569       /* Encode whether the symbol is short or long.  */
6570       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
6571           || mips_far_type_p (type))
6572         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
6573     }
6574 }
6575
6576 /* Implement TARGET_SELECT_RTX_SECTION.  */
6577
6578 static section *
6579 mips_select_rtx_section (enum machine_mode mode, rtx x,
6580                          unsigned HOST_WIDE_INT align)
6581 {
6582   /* ??? Consider using mergeable small data sections.  */
6583   if (mips_rtx_constant_in_small_data_p (mode))
6584     return get_named_section (NULL, ".sdata", 0);
6585
6586   return default_elf_select_rtx_section (mode, x, align);
6587 }
6588
6589 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
6590
6591    The complication here is that, with the combination TARGET_ABICALLS
6592    && !TARGET_GPWORD, jump tables will use absolute addresses, and should
6593    therefore not be included in the read-only part of a DSO.  Handle such
6594    cases by selecting a normal data section instead of a read-only one.
6595    The logic apes that in default_function_rodata_section.  */
6596
6597 static section *
6598 mips_function_rodata_section (tree decl)
6599 {
6600   if (!TARGET_ABICALLS || TARGET_GPWORD)
6601     return default_function_rodata_section (decl);
6602
6603   if (decl && DECL_SECTION_NAME (decl))
6604     {
6605       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
6606       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
6607         {
6608           char *rname = ASTRDUP (name);
6609           rname[14] = 'd';
6610           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
6611         }
6612       else if (flag_function_sections
6613                && flag_data_sections
6614                && strncmp (name, ".text.", 6) == 0)
6615         {
6616           char *rname = ASTRDUP (name);
6617           memcpy (rname + 1, "data", 4);
6618           return get_section (rname, SECTION_WRITE, decl);
6619         }
6620     }
6621   return data_section;
6622 }
6623
6624 /* Implement TARGET_IN_SMALL_DATA_P.  */
6625
6626 static bool
6627 mips_in_small_data_p (const_tree decl)
6628 {
6629   unsigned HOST_WIDE_INT size;
6630
6631   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
6632     return false;
6633
6634   /* We don't yet generate small-data references for -mabicalls
6635      or VxWorks RTP code.  See the related -G handling in
6636      mips_override_options.  */
6637   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
6638     return false;
6639
6640   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
6641     {
6642       const char *name;
6643
6644       /* Reject anything that isn't in a known small-data section.  */
6645       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
6646       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
6647         return false;
6648
6649       /* If a symbol is defined externally, the assembler will use the
6650          usual -G rules when deciding how to implement macros.  */
6651       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
6652         return true;
6653     }
6654   else if (TARGET_EMBEDDED_DATA)
6655     {
6656       /* Don't put constants into the small data section: we want them
6657          to be in ROM rather than RAM.  */
6658       if (TREE_CODE (decl) != VAR_DECL)
6659         return false;
6660
6661       if (TREE_READONLY (decl)
6662           && !TREE_SIDE_EFFECTS (decl)
6663           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
6664         return false;
6665     }
6666
6667   /* Enforce -mlocal-sdata.  */
6668   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
6669     return false;
6670
6671   /* Enforce -mextern-sdata.  */
6672   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
6673     {
6674       if (DECL_EXTERNAL (decl))
6675         return false;
6676       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
6677         return false;
6678     }
6679
6680   size = int_size_in_bytes (TREE_TYPE (decl));
6681   return size <= mips_small_data_threshold;
6682 }
6683
6684 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
6685    anchors for small data: the GP register acts as an anchor in that
6686    case.  We also don't want to use them for PC-relative accesses,
6687    where the PC acts as an anchor.  */
6688
6689 static bool
6690 mips_use_anchors_for_symbol_p (const_rtx symbol)
6691 {
6692   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
6693     {
6694     case SYMBOL_PC_RELATIVE:
6695     case SYMBOL_GP_RELATIVE:
6696       return false;
6697
6698     default:
6699       return default_use_anchors_for_symbol_p (symbol);
6700     }
6701 }
6702 \f
6703 /* The MIPS debug format wants all automatic variables and arguments
6704    to be in terms of the virtual frame pointer (stack pointer before
6705    any adjustment in the function), while the MIPS 3.0 linker wants
6706    the frame pointer to be the stack pointer after the initial
6707    adjustment.  So, we do the adjustment here.  The arg pointer (which
6708    is eliminated) points to the virtual frame pointer, while the frame
6709    pointer (which may be eliminated) points to the stack pointer after
6710    the initial adjustments.  */
6711
6712 HOST_WIDE_INT
6713 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
6714 {
6715   rtx offset2 = const0_rtx;
6716   rtx reg = eliminate_constant_term (addr, &offset2);
6717
6718   if (offset == 0)
6719     offset = INTVAL (offset2);
6720
6721   if (reg == stack_pointer_rtx
6722       || reg == frame_pointer_rtx
6723       || reg == hard_frame_pointer_rtx)
6724     {
6725       offset -= cfun->machine->frame.total_size;
6726       if (reg == hard_frame_pointer_rtx)
6727         offset += cfun->machine->frame.hard_frame_pointer_offset;
6728     }
6729
6730   /* sdbout_parms does not want this to crash for unrecognized cases.  */
6731 #if 0
6732   else if (reg != arg_pointer_rtx)
6733     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
6734                 addr);
6735 #endif
6736
6737   return offset;
6738 }
6739 \f
6740 /* Implement ASM_OUTPUT_EXTERNAL.  */
6741
6742 void
6743 mips_output_external (FILE *file, tree decl, const char *name)
6744 {
6745   default_elf_asm_output_external (file, decl, name);
6746
6747   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
6748      set in order to avoid putting out names that are never really
6749      used. */
6750   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
6751     {
6752       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
6753         {
6754           /* When using assembler macros, emit .extern directives for
6755              all small-data externs so that the assembler knows how
6756              big they are.
6757
6758              In most cases it would be safe (though pointless) to emit
6759              .externs for other symbols too.  One exception is when an
6760              object is within the -G limit but declared by the user to
6761              be in a section other than .sbss or .sdata.  */
6762           fputs ("\t.extern\t", file);
6763           assemble_name (file, name);
6764           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
6765                    int_size_in_bytes (TREE_TYPE (decl)));
6766         }
6767       else if (TARGET_IRIX
6768                && mips_abi == ABI_32
6769                && TREE_CODE (decl) == FUNCTION_DECL)
6770         {
6771           /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
6772              `.global name .text' directive for every used but
6773              undefined function.  If we don't, the linker may perform
6774              an optimization (skipping over the insns that set $gp)
6775              when it is unsafe.  */
6776           fputs ("\t.globl ", file);
6777           assemble_name (file, name);
6778           fputs (" .text\n", file);
6779         }
6780     }
6781 }
6782
6783 /* Implement ASM_OUTPUT_SOURCE_FILENAME.  */
6784
6785 void
6786 mips_output_filename (FILE *stream, const char *name)
6787 {
6788   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
6789      directives.  */
6790   if (write_symbols == DWARF2_DEBUG)
6791     return;
6792   else if (mips_output_filename_first_time)
6793     {
6794       mips_output_filename_first_time = 0;
6795       num_source_filenames += 1;
6796       current_function_file = name;
6797       fprintf (stream, "\t.file\t%d ", num_source_filenames);
6798       output_quoted_string (stream, name);
6799       putc ('\n', stream);
6800     }
6801   /* If we are emitting stabs, let dbxout.c handle this (except for
6802      the mips_output_filename_first_time case).  */
6803   else if (write_symbols == DBX_DEBUG)
6804     return;
6805   else if (name != current_function_file
6806            && strcmp (name, current_function_file) != 0)
6807     {
6808       num_source_filenames += 1;
6809       current_function_file = name;
6810       fprintf (stream, "\t.file\t%d ", num_source_filenames);
6811       output_quoted_string (stream, name);
6812       putc ('\n', stream);
6813     }
6814 }
6815
6816 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
6817
6818 static void ATTRIBUTE_UNUSED
6819 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
6820 {
6821   switch (size)
6822     {
6823     case 4:
6824       fputs ("\t.dtprelword\t", file);
6825       break;
6826
6827     case 8:
6828       fputs ("\t.dtpreldword\t", file);
6829       break;
6830
6831     default:
6832       gcc_unreachable ();
6833     }
6834   output_addr_const (file, x);
6835   fputs ("+0x8000", file);
6836 }
6837
6838 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
6839
6840 static rtx
6841 mips_dwarf_register_span (rtx reg)
6842 {
6843   rtx high, low;
6844   enum machine_mode mode;
6845
6846   /* By default, GCC maps increasing register numbers to increasing
6847      memory locations, but paired FPRs are always little-endian,
6848      regardless of the prevailing endianness.  */
6849   mode = GET_MODE (reg);
6850   if (FP_REG_P (REGNO (reg))
6851       && TARGET_BIG_ENDIAN
6852       && MAX_FPRS_PER_FMT > 1
6853       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
6854     {
6855       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
6856       high = mips_subword (reg, true);
6857       low = mips_subword (reg, false);
6858       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
6859     }
6860
6861   return NULL_RTX;
6862 }
6863
6864 /* Implement ASM_OUTPUT_ASCII.  */
6865
6866 void
6867 mips_output_ascii (FILE *stream, const char *string, size_t len)
6868 {
6869   size_t i;
6870   int cur_pos;
6871
6872   cur_pos = 17;
6873   fprintf (stream, "\t.ascii\t\"");
6874   for (i = 0; i < len; i++)
6875     {
6876       int c;
6877
6878       c = (unsigned char) string[i];
6879       if (ISPRINT (c))
6880         {
6881           if (c == '\\' || c == '\"')
6882             {
6883               putc ('\\', stream);
6884               cur_pos++;
6885             }
6886           putc (c, stream);
6887           cur_pos++;
6888         }
6889       else
6890         {
6891           fprintf (stream, "\\%03o", c);
6892           cur_pos += 4;
6893         }
6894
6895       if (cur_pos > 72 && i+1 < len)
6896         {
6897           cur_pos = 17;
6898           fprintf (stream, "\"\n\t.ascii\t\"");
6899         }
6900     }
6901   fprintf (stream, "\"\n");
6902 }
6903
6904 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
6905    macros, mark the symbol as written so that mips_asm_output_external
6906    won't emit an .extern for it.  STREAM is the output file, NAME is the
6907    name of the symbol, INIT_STRING is the string that should be written
6908    before the symbol and FINAL_STRING is the string that should be
6909    written after it.  FINAL_STRING is a printf format that consumes the
6910    remaining arguments.  */
6911
6912 void
6913 mips_declare_object (FILE *stream, const char *name, const char *init_string,
6914                      const char *final_string, ...)
6915 {
6916   va_list ap;
6917
6918   fputs (init_string, stream);
6919   assemble_name (stream, name);
6920   va_start (ap, final_string);
6921   vfprintf (stream, final_string, ap);
6922   va_end (ap);
6923
6924   if (!TARGET_EXPLICIT_RELOCS)
6925     {
6926       tree name_tree = get_identifier (name);
6927       TREE_ASM_WRITTEN (name_tree) = 1;
6928     }
6929 }
6930
6931 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
6932    NAME is the name of the object and ALIGN is the required alignment
6933    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
6934    alignment argument.  */
6935
6936 void
6937 mips_declare_common_object (FILE *stream, const char *name,
6938                             const char *init_string,
6939                             unsigned HOST_WIDE_INT size,
6940                             unsigned int align, bool takes_alignment_p)
6941 {
6942   if (!takes_alignment_p)
6943     {
6944       size += (align / BITS_PER_UNIT) - 1;
6945       size -= size % (align / BITS_PER_UNIT);
6946       mips_declare_object (stream, name, init_string,
6947                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
6948     }
6949   else
6950     mips_declare_object (stream, name, init_string,
6951                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
6952                          size, align / BITS_PER_UNIT);
6953 }
6954
6955 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
6956    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
6957
6958 void
6959 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
6960                                  unsigned HOST_WIDE_INT size,
6961                                  unsigned int align)
6962 {
6963   /* If the target wants uninitialized const declarations in
6964      .rdata then don't put them in .comm.  */
6965   if (TARGET_EMBEDDED_DATA
6966       && TARGET_UNINIT_CONST_IN_RODATA
6967       && TREE_CODE (decl) == VAR_DECL
6968       && TREE_READONLY (decl)
6969       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
6970     {
6971       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
6972         targetm.asm_out.globalize_label (stream, name);
6973
6974       switch_to_section (readonly_data_section);
6975       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
6976       mips_declare_object (stream, name, "",
6977                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
6978                            size);
6979     }
6980   else
6981     mips_declare_common_object (stream, name, "\n\t.comm\t",
6982                                 size, align, true);
6983 }
6984
6985 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
6986 extern int size_directive_output;
6987
6988 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
6989    definitions except that it uses mips_declare_object to emit the label.  */
6990
6991 void
6992 mips_declare_object_name (FILE *stream, const char *name,
6993                           tree decl ATTRIBUTE_UNUSED)
6994 {
6995 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
6996   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
6997 #endif
6998
6999   size_directive_output = 0;
7000   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
7001     {
7002       HOST_WIDE_INT size;
7003
7004       size_directive_output = 1;
7005       size = int_size_in_bytes (TREE_TYPE (decl));
7006       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7007     }
7008
7009   mips_declare_object (stream, name, "", ":\n");
7010 }
7011
7012 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
7013
7014 void
7015 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
7016 {
7017   const char *name;
7018
7019   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
7020   if (!flag_inhibit_size_directive
7021       && DECL_SIZE (decl) != 0
7022       && !at_end
7023       && top_level
7024       && DECL_INITIAL (decl) == error_mark_node
7025       && !size_directive_output)
7026     {
7027       HOST_WIDE_INT size;
7028
7029       size_directive_output = 1;
7030       size = int_size_in_bytes (TREE_TYPE (decl));
7031       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7032     }
7033 }
7034 #endif
7035 \f
7036 /* Return the FOO in the name of the ".mdebug.FOO" section associated
7037    with the current ABI.  */
7038
7039 static const char *
7040 mips_mdebug_abi_name (void)
7041 {
7042   switch (mips_abi)
7043     {
7044     case ABI_32:
7045       return "abi32";
7046     case ABI_O64:
7047       return "abiO64";
7048     case ABI_N32:
7049       return "abiN32";
7050     case ABI_64:
7051       return "abiN64";
7052     case ABI_EABI:
7053       return TARGET_64BIT ? "eabi64" : "eabi32";
7054     default:
7055       gcc_unreachable ();
7056     }
7057 }
7058
7059 /* Implement TARGET_ASM_FILE_START.  */
7060
7061 static void
7062 mips_file_start (void)
7063 {
7064   default_file_start ();
7065
7066   /* Generate a special section to describe the ABI switches used to
7067      produce the resultant binary.  This is unnecessary on IRIX and
7068      causes unwanted warnings from the native linker.  */
7069   if (!TARGET_IRIX)
7070     {
7071       /* Record the ABI itself.  Modern versions of binutils encode
7072          this information in the ELF header flags, but GDB needs the
7073          information in order to correctly debug binaries produced by
7074          older binutils.  See the function mips_gdbarch_init in
7075          gdb/mips-tdep.c.  */
7076       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
7077                mips_mdebug_abi_name ());
7078
7079       /* There is no ELF header flag to distinguish long32 forms of the
7080          EABI from long64 forms.  Emit a special section to help tools
7081          such as GDB.  Do the same for o64, which is sometimes used with
7082          -mlong64.  */
7083       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
7084         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
7085                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
7086
7087 #ifdef HAVE_AS_GNU_ATTRIBUTE
7088       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
7089                (TARGET_HARD_FLOAT_ABI
7090                 ? (TARGET_DOUBLE_FLOAT
7091                    ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
7092 #endif
7093     }
7094
7095   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
7096   if (TARGET_ABICALLS)
7097     fprintf (asm_out_file, "\t.abicalls\n");
7098
7099   if (flag_verbose_asm)
7100     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
7101              ASM_COMMENT_START,
7102              mips_small_data_threshold, mips_arch_info->name, mips_isa);
7103 }
7104 \f
7105 /* Make the last instruction frame-related and note that it performs
7106    the operation described by FRAME_PATTERN.  */
7107
7108 static void
7109 mips_set_frame_expr (rtx frame_pattern)
7110 {
7111   rtx insn;
7112
7113   insn = get_last_insn ();
7114   RTX_FRAME_RELATED_P (insn) = 1;
7115   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
7116                                       frame_pattern,
7117                                       REG_NOTES (insn));
7118 }
7119
7120 /* Return a frame-related rtx that stores REG at MEM.
7121    REG must be a single register.  */
7122
7123 static rtx
7124 mips_frame_set (rtx mem, rtx reg)
7125 {
7126   rtx set;
7127
7128   /* If we're saving the return address register and the DWARF return
7129      address column differs from the hard register number, adjust the
7130      note reg to refer to the former.  */
7131   if (REGNO (reg) == GP_REG_FIRST + 31
7132       && DWARF_FRAME_RETURN_COLUMN != GP_REG_FIRST + 31)
7133     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
7134
7135   set = gen_rtx_SET (VOIDmode, mem, reg);
7136   RTX_FRAME_RELATED_P (set) = 1;
7137
7138   return set;
7139 }
7140 \f
7141 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
7142    mips16e_s2_s8_regs[X], it must also save the registers in indexes
7143    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
7144 static const unsigned char mips16e_s2_s8_regs[] = {
7145   30, 23, 22, 21, 20, 19, 18
7146 };
7147 static const unsigned char mips16e_a0_a3_regs[] = {
7148   4, 5, 6, 7
7149 };
7150
7151 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
7152    ordered from the uppermost in memory to the lowest in memory.  */
7153 static const unsigned char mips16e_save_restore_regs[] = {
7154   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
7155 };
7156
7157 /* Return the index of the lowest X in the range [0, SIZE) for which
7158    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
7159
7160 static unsigned int
7161 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
7162                              unsigned int size)
7163 {
7164   unsigned int i;
7165
7166   for (i = 0; i < size; i++)
7167     if (BITSET_P (mask, regs[i]))
7168       break;
7169
7170   return i;
7171 }
7172
7173 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
7174    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
7175    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
7176    is true for all indexes (X, SIZE).  */
7177
7178 static void
7179 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
7180                         unsigned int size, unsigned int *num_regs_ptr)
7181 {
7182   unsigned int i;
7183
7184   i = mips16e_find_first_register (*mask_ptr, regs, size);
7185   for (i++; i < size; i++)
7186     if (!BITSET_P (*mask_ptr, regs[i]))
7187       {
7188         *num_regs_ptr += 1;
7189         *mask_ptr |= 1 << regs[i];
7190       }
7191 }
7192
7193 /* Return a simplified form of X using the register values in REG_VALUES.
7194    REG_VALUES[R] is the last value assigned to hard register R, or null
7195    if R has not been modified.
7196
7197    This function is rather limited, but is good enough for our purposes.  */
7198
7199 static rtx
7200 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
7201 {
7202   x = avoid_constant_pool_reference (x);
7203
7204   if (UNARY_P (x))
7205     {
7206       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7207       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
7208                                  x0, GET_MODE (XEXP (x, 0)));
7209     }
7210
7211   if (ARITHMETIC_P (x))
7212     {
7213       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7214       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
7215       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
7216     }
7217
7218   if (REG_P (x)
7219       && reg_values[REGNO (x)]
7220       && !rtx_unstable_p (reg_values[REGNO (x)]))
7221     return reg_values[REGNO (x)];
7222
7223   return x;
7224 }
7225
7226 /* Return true if (set DEST SRC) stores an argument register into its
7227    caller-allocated save slot, storing the number of that argument
7228    register in *REGNO_PTR if so.  REG_VALUES is as for
7229    mips16e_collect_propagate_value.  */
7230
7231 static bool
7232 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
7233                                  unsigned int *regno_ptr)
7234 {
7235   unsigned int argno, regno;
7236   HOST_WIDE_INT offset, required_offset;
7237   rtx addr, base;
7238
7239   /* Check that this is a word-mode store.  */
7240   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
7241     return false;
7242
7243   /* Check that the register being saved is an unmodified argument
7244      register.  */
7245   regno = REGNO (src);
7246   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
7247     return false;
7248   argno = regno - GP_ARG_FIRST;
7249
7250   /* Check whether the address is an appropriate stack-pointer or
7251      frame-pointer access.  */
7252   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
7253   mips_split_plus (addr, &base, &offset);
7254   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
7255   if (base == hard_frame_pointer_rtx)
7256     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
7257   else if (base != stack_pointer_rtx)
7258     return false;
7259   if (offset != required_offset)
7260     return false;
7261
7262   *regno_ptr = regno;
7263   return true;
7264 }
7265
7266 /* A subroutine of mips_expand_prologue, called only when generating
7267    MIPS16e SAVE instructions.  Search the start of the function for any
7268    instructions that save argument registers into their caller-allocated
7269    save slots.  Delete such instructions and return a value N such that
7270    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
7271    instructions redundant.  */
7272
7273 static unsigned int
7274 mips16e_collect_argument_saves (void)
7275 {
7276   rtx reg_values[FIRST_PSEUDO_REGISTER];
7277   rtx insn, next, set, dest, src;
7278   unsigned int nargs, regno;
7279
7280   push_topmost_sequence ();
7281   nargs = 0;
7282   memset (reg_values, 0, sizeof (reg_values));
7283   for (insn = get_insns (); insn; insn = next)
7284     {
7285       next = NEXT_INSN (insn);
7286       if (NOTE_P (insn))
7287         continue;
7288
7289       if (!INSN_P (insn))
7290         break;
7291
7292       set = PATTERN (insn);
7293       if (GET_CODE (set) != SET)
7294         break;
7295
7296       dest = SET_DEST (set);
7297       src = SET_SRC (set);
7298       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
7299         {
7300           if (!BITSET_P (cfun->machine->frame.mask, regno))
7301             {
7302               delete_insn (insn);
7303               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
7304             }
7305         }
7306       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
7307         reg_values[REGNO (dest)]
7308           = mips16e_collect_propagate_value (src, reg_values);
7309       else
7310         break;
7311     }
7312   pop_topmost_sequence ();
7313
7314   return nargs;
7315 }
7316
7317 /* Return a move between register REGNO and memory location SP + OFFSET.
7318    Make the move a load if RESTORE_P, otherwise make it a frame-related
7319    store.  */
7320
7321 static rtx
7322 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
7323                           unsigned int regno)
7324 {
7325   rtx reg, mem;
7326
7327   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
7328   reg = gen_rtx_REG (SImode, regno);
7329   return (restore_p
7330           ? gen_rtx_SET (VOIDmode, reg, mem)
7331           : mips_frame_set (mem, reg));
7332 }
7333
7334 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
7335    The instruction must:
7336
7337      - Allocate or deallocate SIZE bytes in total; SIZE is known
7338        to be nonzero.
7339
7340      - Save or restore as many registers in *MASK_PTR as possible.
7341        The instruction saves the first registers at the top of the
7342        allocated area, with the other registers below it.
7343
7344      - Save NARGS argument registers above the allocated area.
7345
7346    (NARGS is always zero if RESTORE_P.)
7347
7348    The SAVE and RESTORE instructions cannot save and restore all general
7349    registers, so there may be some registers left over for the caller to
7350    handle.  Destructively modify *MASK_PTR so that it contains the registers
7351    that still need to be saved or restored.  The caller can save these
7352    registers in the memory immediately below *OFFSET_PTR, which is a
7353    byte offset from the bottom of the allocated stack area.  */
7354
7355 static rtx
7356 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
7357                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
7358                             HOST_WIDE_INT size)
7359 {
7360   rtx pattern, set;
7361   HOST_WIDE_INT offset, top_offset;
7362   unsigned int i, regno;
7363   int n;
7364
7365   gcc_assert (cfun->machine->frame.num_fp == 0);
7366
7367   /* Calculate the number of elements in the PARALLEL.  We need one element
7368      for the stack adjustment, one for each argument register save, and one
7369      for each additional register move.  */
7370   n = 1 + nargs;
7371   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7372     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
7373       n++;
7374
7375   /* Create the final PARALLEL.  */
7376   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
7377   n = 0;
7378
7379   /* Add the stack pointer adjustment.  */
7380   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7381                      plus_constant (stack_pointer_rtx,
7382                                     restore_p ? size : -size));
7383   RTX_FRAME_RELATED_P (set) = 1;
7384   XVECEXP (pattern, 0, n++) = set;
7385
7386   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
7387   top_offset = restore_p ? size : 0;
7388
7389   /* Save the arguments.  */
7390   for (i = 0; i < nargs; i++)
7391     {
7392       offset = top_offset + i * UNITS_PER_WORD;
7393       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
7394       XVECEXP (pattern, 0, n++) = set;
7395     }
7396
7397   /* Then fill in the other register moves.  */
7398   offset = top_offset;
7399   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7400     {
7401       regno = mips16e_save_restore_regs[i];
7402       if (BITSET_P (*mask_ptr, regno))
7403         {
7404           offset -= UNITS_PER_WORD;
7405           set = mips16e_save_restore_reg (restore_p, offset, regno);
7406           XVECEXP (pattern, 0, n++) = set;
7407           *mask_ptr &= ~(1 << regno);
7408         }
7409     }
7410
7411   /* Tell the caller what offset it should use for the remaining registers.  */
7412   *offset_ptr = size + (offset - top_offset);
7413
7414   gcc_assert (n == XVECLEN (pattern, 0));
7415
7416   return pattern;
7417 }
7418
7419 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
7420    pointer.  Return true if PATTERN matches the kind of instruction
7421    generated by mips16e_build_save_restore.  If INFO is nonnull,
7422    initialize it when returning true.  */
7423
7424 bool
7425 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
7426                                 struct mips16e_save_restore_info *info)
7427 {
7428   unsigned int i, nargs, mask, extra;
7429   HOST_WIDE_INT top_offset, save_offset, offset;
7430   rtx set, reg, mem, base;
7431   int n;
7432
7433   if (!GENERATE_MIPS16E_SAVE_RESTORE)
7434     return false;
7435
7436   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
7437   top_offset = adjust > 0 ? adjust : 0;
7438
7439   /* Interpret all other members of the PARALLEL.  */
7440   save_offset = top_offset - UNITS_PER_WORD;
7441   mask = 0;
7442   nargs = 0;
7443   i = 0;
7444   for (n = 1; n < XVECLEN (pattern, 0); n++)
7445     {
7446       /* Check that we have a SET.  */
7447       set = XVECEXP (pattern, 0, n);
7448       if (GET_CODE (set) != SET)
7449         return false;
7450
7451       /* Check that the SET is a load (if restoring) or a store
7452          (if saving).  */
7453       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
7454       if (!MEM_P (mem))
7455         return false;
7456
7457       /* Check that the address is the sum of the stack pointer and a
7458          possibly-zero constant offset.  */
7459       mips_split_plus (XEXP (mem, 0), &base, &offset);
7460       if (base != stack_pointer_rtx)
7461         return false;
7462
7463       /* Check that SET's other operand is a register.  */
7464       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
7465       if (!REG_P (reg))
7466         return false;
7467
7468       /* Check for argument saves.  */
7469       if (offset == top_offset + nargs * UNITS_PER_WORD
7470           && REGNO (reg) == GP_ARG_FIRST + nargs)
7471         nargs++;
7472       else if (offset == save_offset)
7473         {
7474           while (mips16e_save_restore_regs[i++] != REGNO (reg))
7475             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
7476               return false;
7477
7478           mask |= 1 << REGNO (reg);
7479           save_offset -= UNITS_PER_WORD;
7480         }
7481       else
7482         return false;
7483     }
7484
7485   /* Check that the restrictions on register ranges are met.  */
7486   extra = 0;
7487   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
7488                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
7489   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
7490                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
7491   if (extra != 0)
7492     return false;
7493
7494   /* Make sure that the topmost argument register is not saved twice.
7495      The checks above ensure that the same is then true for the other
7496      argument registers.  */
7497   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
7498     return false;
7499
7500   /* Pass back information, if requested.  */
7501   if (info)
7502     {
7503       info->nargs = nargs;
7504       info->mask = mask;
7505       info->size = (adjust > 0 ? adjust : -adjust);
7506     }
7507
7508   return true;
7509 }
7510
7511 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
7512    for the register range [MIN_REG, MAX_REG].  Return a pointer to
7513    the null terminator.  */
7514
7515 static char *
7516 mips16e_add_register_range (char *s, unsigned int min_reg,
7517                             unsigned int max_reg)
7518 {
7519   if (min_reg != max_reg)
7520     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
7521   else
7522     s += sprintf (s, ",%s", reg_names[min_reg]);
7523   return s;
7524 }
7525
7526 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
7527    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
7528
7529 const char *
7530 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
7531 {
7532   static char buffer[300];
7533
7534   struct mips16e_save_restore_info info;
7535   unsigned int i, end;
7536   char *s;
7537
7538   /* Parse the pattern.  */
7539   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
7540     gcc_unreachable ();
7541
7542   /* Add the mnemonic.  */
7543   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
7544   s += strlen (s);
7545
7546   /* Save the arguments.  */
7547   if (info.nargs > 1)
7548     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
7549                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
7550   else if (info.nargs == 1)
7551     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
7552
7553   /* Emit the amount of stack space to allocate or deallocate.  */
7554   s += sprintf (s, "%d", (int) info.size);
7555
7556   /* Save or restore $16.  */
7557   if (BITSET_P (info.mask, 16))
7558     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
7559
7560   /* Save or restore $17.  */
7561   if (BITSET_P (info.mask, 17))
7562     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
7563
7564   /* Save or restore registers in the range $s2...$s8, which
7565      mips16e_s2_s8_regs lists in decreasing order.  Note that this
7566      is a software register range; the hardware registers are not
7567      numbered consecutively.  */
7568   end = ARRAY_SIZE (mips16e_s2_s8_regs);
7569   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
7570   if (i < end)
7571     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
7572                                     mips16e_s2_s8_regs[i]);
7573
7574   /* Save or restore registers in the range $a0...$a3.  */
7575   end = ARRAY_SIZE (mips16e_a0_a3_regs);
7576   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
7577   if (i < end)
7578     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
7579                                     mips16e_a0_a3_regs[end - 1]);
7580
7581   /* Save or restore $31.  */
7582   if (BITSET_P (info.mask, 31))
7583     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 31]);
7584
7585   return buffer;
7586 }
7587 \f
7588 /* Return true if the current function has an insn that implicitly
7589    refers to $gp.  */
7590
7591 static bool
7592 mips_function_has_gp_insn (void)
7593 {
7594   /* Don't bother rechecking if we found one last time.  */
7595   if (!cfun->machine->has_gp_insn_p)
7596     {
7597       rtx insn;
7598
7599       push_topmost_sequence ();
7600       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
7601         if (USEFUL_INSN_P (insn)
7602             && (get_attr_got (insn) != GOT_UNSET
7603                 || mips_small_data_pattern_p (PATTERN (insn))))
7604           {
7605             cfun->machine->has_gp_insn_p = true;
7606             break;
7607           }
7608       pop_topmost_sequence ();
7609     }
7610   return cfun->machine->has_gp_insn_p;
7611 }
7612
7613 /* Return the register that should be used as the global pointer
7614    within this function.  Return 0 if the function doesn't need
7615    a global pointer.  */
7616
7617 static unsigned int
7618 mips_global_pointer (void)
7619 {
7620   unsigned int regno;
7621
7622   /* $gp is always available unless we're using a GOT.  */
7623   if (!TARGET_USE_GOT)
7624     return GLOBAL_POINTER_REGNUM;
7625
7626   /* We must always provide $gp when it is used implicitly.  */
7627   if (!TARGET_EXPLICIT_RELOCS)
7628     return GLOBAL_POINTER_REGNUM;
7629
7630   /* FUNCTION_PROFILER includes a jal macro, so we need to give it
7631      a valid gp.  */
7632   if (current_function_profile)
7633     return GLOBAL_POINTER_REGNUM;
7634
7635   /* If the function has a nonlocal goto, $gp must hold the correct
7636      global pointer for the target function.  */
7637   if (current_function_has_nonlocal_goto)
7638     return GLOBAL_POINTER_REGNUM;
7639
7640   /* If the gp is never referenced, there's no need to initialize it.
7641      Note that reload can sometimes introduce constant pool references
7642      into a function that otherwise didn't need them.  For example,
7643      suppose we have an instruction like:
7644
7645           (set (reg:DF R1) (float:DF (reg:SI R2)))
7646
7647      If R2 turns out to be constant such as 1, the instruction may have a
7648      REG_EQUAL note saying that R1 == 1.0.  Reload then has the option of
7649      using this constant if R2 doesn't get allocated to a register.
7650
7651      In cases like these, reload will have added the constant to the pool
7652      but no instruction will yet refer to it.  */
7653   if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
7654       && !current_function_uses_const_pool
7655       && !mips_function_has_gp_insn ())
7656     return 0;
7657
7658   /* We need a global pointer, but perhaps we can use a call-clobbered
7659      register instead of $gp.  */
7660   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
7661     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
7662       if (!df_regs_ever_live_p (regno)
7663           && call_really_used_regs[regno]
7664           && !fixed_regs[regno]
7665           && regno != PIC_FUNCTION_ADDR_REGNUM)
7666         return regno;
7667
7668   return GLOBAL_POINTER_REGNUM;
7669 }
7670
7671 /* Return true if the current function returns its value in a floating-point
7672    register in MIPS16 mode.  */
7673
7674 static bool
7675 mips16_cfun_returns_in_fpr_p (void)
7676 {
7677   tree return_type = DECL_RESULT (current_function_decl);
7678   return (TARGET_MIPS16
7679           && TARGET_HARD_FLOAT_ABI
7680           && !aggregate_value_p (return_type, current_function_decl)
7681           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
7682 }
7683
7684 /* Return true if the current function must save register REGNO.  */
7685
7686 static bool
7687 mips_save_reg_p (unsigned int regno)
7688 {
7689   /* We only need to save $gp if TARGET_CALL_SAVED_GP and only then
7690      if we have not chosen a call-clobbered substitute.  */
7691   if (regno == GLOBAL_POINTER_REGNUM)
7692     return TARGET_CALL_SAVED_GP && cfun->machine->global_pointer == regno;
7693
7694   /* Check call-saved registers.  */
7695   if ((current_function_saves_all_registers || df_regs_ever_live_p (regno))
7696       && !call_really_used_regs[regno])
7697     return true;
7698
7699   /* Save both registers in an FPR pair if either one is used.  This is
7700      needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
7701      register to be used without the even register.  */
7702   if (FP_REG_P (regno)
7703       && MAX_FPRS_PER_FMT == 2
7704       && df_regs_ever_live_p (regno + 1)
7705       && !call_really_used_regs[regno + 1])
7706     return true;
7707
7708   /* We need to save the old frame pointer before setting up a new one.  */
7709   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
7710     return true;
7711
7712   /* Check for registers that must be saved for FUNCTION_PROFILER.  */
7713   if (current_function_profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
7714     return true;
7715
7716   /* We need to save the incoming return address if it is ever clobbered
7717      within the function, if __builtin_eh_return is being used to set a
7718      different return address, or if a stub is being used to return a
7719      value in FPRs.  */
7720   if (regno == GP_REG_FIRST + 31
7721       && (df_regs_ever_live_p (regno)
7722           || current_function_calls_eh_return
7723           || mips16_cfun_returns_in_fpr_p ()))
7724     return true;
7725
7726   return false;
7727 }
7728
7729 /* Populate the current function's mips_frame_info structure.
7730
7731    MIPS stack frames look like:
7732
7733         +-------------------------------+
7734         |                               |
7735         |  incoming stack arguments     |
7736         |                               |
7737         +-------------------------------+
7738         |                               |
7739         |  caller-allocated save area   |
7740       A |  for register arguments       |
7741         |                               |
7742         +-------------------------------+ <-- incoming stack pointer
7743         |                               |
7744         |  callee-allocated save area   |
7745       B |  for arguments that are       |
7746         |  split between registers and  |
7747         |  the stack                    |
7748         |                               |
7749         +-------------------------------+ <-- arg_pointer_rtx
7750         |                               |
7751       C |  callee-allocated save area   |
7752         |  for register varargs         |
7753         |                               |
7754         +-------------------------------+ <-- frame_pointer_rtx + fp_sp_offset
7755         |                               |       + UNITS_PER_HWFPVALUE
7756         |  FPR save area                |
7757         |                               |
7758         +-------------------------------+ <-- frame_pointer_rtx + gp_sp_offset
7759         |                               |       + UNITS_PER_WORD
7760         |  GPR save area                |
7761         |                               |
7762         +-------------------------------+
7763         |                               | \
7764         |  local variables              |  | var_size
7765         |                               | /
7766         +-------------------------------+
7767         |                               | \
7768         |  $gp save area                |  | cprestore_size
7769         |                               | /
7770       P +-------------------------------+ <-- hard_frame_pointer_rtx for
7771         |                               |       MIPS16 code
7772         |  outgoing stack arguments     |
7773         |                               |
7774         +-------------------------------+
7775         |                               |
7776         |  caller-allocated save area   |
7777         |  for register arguments       |
7778         |                               |
7779         +-------------------------------+ <-- stack_pointer_rtx
7780                                               frame_pointer_rtx
7781                                               hard_frame_pointer_rtx for
7782                                                 non-MIPS16 code.
7783
7784    At least two of A, B and C will be empty.
7785
7786    Dynamic stack allocations such as alloca insert data at point P.
7787    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
7788    hard_frame_pointer_rtx unchanged.  */
7789
7790 static void
7791 mips_compute_frame_info (void)
7792 {
7793   struct mips_frame_info *frame;
7794   HOST_WIDE_INT offset, size;
7795   unsigned int regno, i;
7796
7797   frame = &cfun->machine->frame;
7798   memset (frame, 0, sizeof (*frame));
7799   size = get_frame_size ();
7800
7801   cfun->machine->global_pointer = mips_global_pointer ();
7802
7803   /* The first STARTING_FRAME_OFFSET bytes contain the outgoing argument
7804      area and the $gp save slot.  This area isn't needed in leaf functions,
7805      but if the target-independent frame size is nonzero, we're committed
7806      to allocating it anyway.  */
7807   if (size == 0 && current_function_is_leaf)
7808     {
7809       /* The MIPS 3.0 linker does not like functions that dynamically
7810          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
7811          looks like we are trying to create a second frame pointer to the
7812          function, so allocate some stack space to make it happy.  */
7813       if (current_function_calls_alloca)
7814         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
7815       else
7816         frame->args_size = 0;
7817       frame->cprestore_size = 0;
7818     }
7819   else
7820     {
7821       frame->args_size = current_function_outgoing_args_size;
7822       frame->cprestore_size = STARTING_FRAME_OFFSET - frame->args_size;
7823     }
7824   offset = frame->args_size + frame->cprestore_size;
7825
7826   /* Move above the local variables.  */
7827   frame->var_size = MIPS_STACK_ALIGN (size);
7828   offset += frame->var_size;
7829
7830   /* Find out which GPRs we need to save.  */
7831   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
7832     if (mips_save_reg_p (regno))
7833       {
7834         frame->num_gp++;
7835         frame->mask |= 1 << (regno - GP_REG_FIRST);
7836       }
7837
7838   /* If this function calls eh_return, we must also save and restore the
7839      EH data registers.  */
7840   if (current_function_calls_eh_return)
7841     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
7842       {
7843         frame->num_gp++;
7844         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
7845       }
7846
7847   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
7848      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
7849      save all later registers too.  */
7850   if (GENERATE_MIPS16E_SAVE_RESTORE)
7851     {
7852       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
7853                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
7854       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
7855                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
7856     }
7857
7858   /* Move above the GPR save area.  */
7859   if (frame->num_gp > 0)
7860     {
7861       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
7862       frame->gp_sp_offset = offset - UNITS_PER_WORD;
7863     }
7864
7865   /* Find out which FPRs we need to save.  This loop must iterate over
7866      the same space as its companion in mips_for_each_saved_reg.  */
7867   if (TARGET_HARD_FLOAT)
7868     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
7869       if (mips_save_reg_p (regno))
7870         {
7871           frame->num_fp += MAX_FPRS_PER_FMT;
7872           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
7873         }
7874
7875   /* Move above the FPR save area.  */
7876   if (frame->num_fp > 0)
7877     {
7878       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
7879       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
7880     }
7881
7882   /* Move above the callee-allocated varargs save area.  */
7883   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
7884   frame->arg_pointer_offset = offset;
7885
7886   /* Move above the callee-allocated area for pretend stack arguments.  */
7887   offset += current_function_pretend_args_size;
7888   frame->total_size = offset;
7889
7890   /* Work out the offsets of the save areas from the top of the frame.  */
7891   if (frame->gp_sp_offset > 0)
7892     frame->gp_save_offset = frame->gp_sp_offset - offset;
7893   if (frame->fp_sp_offset > 0)
7894     frame->fp_save_offset = frame->fp_sp_offset - offset;
7895
7896   /* MIPS16 code offsets the frame pointer by the size of the outgoing
7897      arguments.  This tends to increase the chances of using unextended
7898      instructions for local variables and incoming arguments.  */
7899   if (TARGET_MIPS16)
7900     frame->hard_frame_pointer_offset = frame->args_size;
7901 }
7902
7903 /* Return the style of GP load sequence that is being used for the
7904    current function.  */
7905
7906 enum mips_loadgp_style
7907 mips_current_loadgp_style (void)
7908 {
7909   if (!TARGET_USE_GOT || cfun->machine->global_pointer == 0)
7910     return LOADGP_NONE;
7911
7912   if (TARGET_RTP_PIC)
7913     return LOADGP_RTP;
7914
7915   if (TARGET_ABSOLUTE_ABICALLS)
7916     return LOADGP_ABSOLUTE;
7917
7918   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
7919 }
7920
7921 /* Implement FRAME_POINTER_REQUIRED.  */
7922
7923 bool
7924 mips_frame_pointer_required (void)
7925 {
7926   /* If the function contains dynamic stack allocations, we need to
7927      use the frame pointer to access the static parts of the frame.  */
7928   if (current_function_calls_alloca)
7929     return true;
7930
7931   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
7932      reload may be unable to compute the address of a local variable,
7933      since there is no way to add a large constant to the stack pointer
7934      without using a second temporary register.  */
7935   if (TARGET_MIPS16)
7936     {
7937       mips_compute_frame_info ();
7938       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
7939         return true;
7940     }
7941
7942   return false;
7943 }
7944
7945 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
7946    or argument pointer.  TO is either the stack pointer or hard frame
7947    pointer.  */
7948
7949 HOST_WIDE_INT
7950 mips_initial_elimination_offset (int from, int to)
7951 {
7952   HOST_WIDE_INT offset;
7953
7954   mips_compute_frame_info ();
7955
7956   /* Set OFFSET to the offset from the soft frame pointer, which is also
7957      the offset from the end-of-prologue stack pointer.  */
7958   switch (from)
7959     {
7960     case FRAME_POINTER_REGNUM:
7961       offset = 0;
7962       break;
7963
7964     case ARG_POINTER_REGNUM:
7965       offset = cfun->machine->frame.arg_pointer_offset;
7966       break;
7967
7968     default:
7969       gcc_unreachable ();
7970     }
7971
7972   if (to == HARD_FRAME_POINTER_REGNUM)
7973     offset -= cfun->machine->frame.hard_frame_pointer_offset;
7974
7975   return offset;
7976 }
7977 \f
7978 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  Some code models use the incoming
7979    value of PIC_FUNCTION_ADDR_REGNUM to set up the global pointer.  */
7980
7981 static void
7982 mips_extra_live_on_entry (bitmap regs)
7983 {
7984   if (TARGET_USE_GOT && !TARGET_ABSOLUTE_ABICALLS)
7985     bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
7986 }
7987
7988 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
7989    previous frame.  */
7990
7991 rtx
7992 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
7993 {
7994   if (count != 0)
7995     return const0_rtx;
7996
7997   return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
7998 }
7999
8000 /* Emit code to change the current function's return address to
8001    ADDRESS.  SCRATCH is available as a scratch register, if needed.
8002    ADDRESS and SCRATCH are both word-mode GPRs.  */
8003
8004 void
8005 mips_set_return_address (rtx address, rtx scratch)
8006 {
8007   rtx slot_address;
8008
8009   gcc_assert (BITSET_P (cfun->machine->frame.mask, 31));
8010   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
8011                                   cfun->machine->frame.gp_sp_offset);
8012   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
8013 }
8014
8015 /* Restore $gp from its save slot.  Valid only when using o32 or
8016    o64 abicalls.  */
8017
8018 void
8019 mips_restore_gp (void)
8020 {
8021   rtx base, address;
8022
8023   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
8024
8025   base = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
8026   address = mips_add_offset (pic_offset_table_rtx, base,
8027                              current_function_outgoing_args_size);
8028   mips_emit_move (pic_offset_table_rtx, gen_frame_mem (Pmode, address));
8029   if (!TARGET_EXPLICIT_RELOCS)
8030     emit_insn (gen_blockage ());
8031 }
8032 \f
8033 /* A function to save or store a register.  The first argument is the
8034    register and the second is the stack slot.  */
8035 typedef void (*mips_save_restore_fn) (rtx, rtx);
8036
8037 /* Use FN to save or restore register REGNO.  MODE is the register's
8038    mode and OFFSET is the offset of its save slot from the current
8039    stack pointer.  */
8040
8041 static void
8042 mips_save_restore_reg (enum machine_mode mode, int regno,
8043                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
8044 {
8045   rtx mem;
8046
8047   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
8048   fn (gen_rtx_REG (mode, regno), mem);
8049 }
8050
8051 /* Call FN for each register that is saved by the current function.
8052    SP_OFFSET is the offset of the current stack pointer from the start
8053    of the frame.  */
8054
8055 static void
8056 mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
8057 {
8058   enum machine_mode fpr_mode;
8059   HOST_WIDE_INT offset;
8060   int regno;
8061
8062   /* Save registers starting from high to low.  The debuggers prefer at least
8063      the return register be stored at func+4, and also it allows us not to
8064      need a nop in the epilogue if at least one register is reloaded in
8065      addition to return address.  */
8066   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
8067   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
8068     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
8069       {
8070         mips_save_restore_reg (word_mode, regno, offset, fn);
8071         offset -= UNITS_PER_WORD;
8072       }
8073
8074   /* This loop must iterate over the same space as its companion in
8075      mips_compute_frame_info.  */
8076   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
8077   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
8078   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
8079        regno >= FP_REG_FIRST;
8080        regno -= MAX_FPRS_PER_FMT)
8081     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
8082       {
8083         mips_save_restore_reg (fpr_mode, regno, offset, fn);
8084         offset -= GET_MODE_SIZE (fpr_mode);
8085       }
8086 }
8087 \f
8088 /* If we're generating n32 or n64 abicalls, and the current function
8089    does not use $28 as its global pointer, emit a cplocal directive.
8090    Use pic_offset_table_rtx as the argument to the directive.  */
8091
8092 static void
8093 mips_output_cplocal (void)
8094 {
8095   if (!TARGET_EXPLICIT_RELOCS
8096       && cfun->machine->global_pointer > 0
8097       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
8098     output_asm_insn (".cplocal %+", 0);
8099 }
8100
8101 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
8102
8103 static void
8104 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8105 {
8106   const char *fnname;
8107
8108 #ifdef SDB_DEBUGGING_INFO
8109   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
8110     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
8111 #endif
8112
8113   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
8114      floating-point arguments.  */
8115   if (TARGET_MIPS16
8116       && TARGET_HARD_FLOAT_ABI
8117       && current_function_args_info.fp_code != 0)
8118     mips16_build_function_stub ();
8119
8120   /* Select the MIPS16 mode for this function.  */
8121   if (TARGET_MIPS16)
8122     fprintf (file, "\t.set\tmips16\n");
8123   else
8124     fprintf (file, "\t.set\tnomips16\n");
8125
8126   if (!FUNCTION_NAME_ALREADY_DECLARED)
8127     {
8128       /* Get the function name the same way that toplev.c does before calling
8129          assemble_start_function.  This is needed so that the name used here
8130          exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
8131       fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
8132
8133       if (!flag_inhibit_size_directive)
8134         {
8135           fputs ("\t.ent\t", file);
8136           assemble_name (file, fnname);
8137           fputs ("\n", file);
8138         }
8139
8140       assemble_name (file, fnname);
8141       fputs (":\n", file);
8142     }
8143
8144   /* Stop mips_file_end from treating this function as external.  */
8145   if (TARGET_IRIX && mips_abi == ABI_32)
8146     TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
8147
8148   /* Output MIPS-specific frame information.  */
8149   if (!flag_inhibit_size_directive)
8150     {
8151       const struct mips_frame_info *frame;
8152
8153       frame = &cfun->machine->frame;
8154
8155       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
8156       fprintf (file,
8157                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
8158                "# vars= " HOST_WIDE_INT_PRINT_DEC
8159                ", regs= %d/%d"
8160                ", args= " HOST_WIDE_INT_PRINT_DEC
8161                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
8162                reg_names[frame_pointer_needed
8163                          ? HARD_FRAME_POINTER_REGNUM
8164                          : STACK_POINTER_REGNUM],
8165                (frame_pointer_needed
8166                 ? frame->total_size - frame->hard_frame_pointer_offset
8167                 : frame->total_size),
8168                reg_names[GP_REG_FIRST + 31],
8169                frame->var_size,
8170                frame->num_gp, frame->num_fp,
8171                frame->args_size,
8172                frame->cprestore_size);
8173
8174       /* .mask MASK, OFFSET.  */
8175       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
8176                frame->mask, frame->gp_save_offset);
8177
8178       /* .fmask MASK, OFFSET.  */
8179       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
8180                frame->fmask, frame->fp_save_offset);
8181     }
8182
8183   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
8184      Also emit the ".set noreorder; .set nomacro" sequence for functions
8185      that need it.  */
8186   if (mips_current_loadgp_style () == LOADGP_OLDABI)
8187     {
8188       /* .cpload must be in a .set noreorder but not a .set nomacro block.  */
8189       if (!cfun->machine->all_noreorder_p)
8190         output_asm_insn ("%(.cpload\t%^%)", 0);
8191       else
8192         output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
8193     }
8194   else if (cfun->machine->all_noreorder_p)
8195     output_asm_insn ("%(%<", 0);
8196
8197   /* Tell the assembler which register we're using as the global
8198      pointer.  This is needed for thunks, since they can use either
8199      explicit relocs or assembler macros.  */
8200   mips_output_cplocal ();
8201 }
8202
8203 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
8204
8205 static void
8206 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8207                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8208 {
8209   /* Reinstate the normal $gp.  */
8210   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
8211   mips_output_cplocal ();
8212
8213   if (cfun->machine->all_noreorder_p)
8214     {
8215       /* Avoid using %>%) since it adds excess whitespace.  */
8216       output_asm_insn (".set\tmacro", 0);
8217       output_asm_insn (".set\treorder", 0);
8218       set_noreorder = set_nomacro = 0;
8219     }
8220
8221   if (!FUNCTION_NAME_ALREADY_DECLARED && !flag_inhibit_size_directive)
8222     {
8223       const char *fnname;
8224
8225       /* Get the function name the same way that toplev.c does before calling
8226          assemble_start_function.  This is needed so that the name used here
8227          exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
8228       fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
8229       fputs ("\t.end\t", file);
8230       assemble_name (file, fnname);
8231       fputs ("\n", file);
8232     }
8233 }
8234 \f
8235 /* Save register REG to MEM.  Make the instruction frame-related.  */
8236
8237 static void
8238 mips_save_reg (rtx reg, rtx mem)
8239 {
8240   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
8241     {
8242       rtx x1, x2;
8243
8244       if (mips_split_64bit_move_p (mem, reg))
8245         mips_split_doubleword_move (mem, reg);
8246       else
8247         mips_emit_move (mem, reg);
8248
8249       x1 = mips_frame_set (mips_subword (mem, false),
8250                            mips_subword (reg, false));
8251       x2 = mips_frame_set (mips_subword (mem, true),
8252                            mips_subword (reg, true));
8253       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
8254     }
8255   else
8256     {
8257       if (TARGET_MIPS16
8258           && REGNO (reg) != GP_REG_FIRST + 31
8259           && !M16_REG_P (REGNO (reg)))
8260         {
8261           /* Save a non-MIPS16 register by moving it through a temporary.
8262              We don't need to do this for $31 since there's a special
8263              instruction for it.  */
8264           mips_emit_move (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
8265           mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
8266         }
8267       else
8268         mips_emit_move (mem, reg);
8269
8270       mips_set_frame_expr (mips_frame_set (mem, reg));
8271     }
8272 }
8273
8274 /* The __gnu_local_gp symbol.  */
8275
8276 static GTY(()) rtx mips_gnu_local_gp;
8277
8278 /* If we're generating n32 or n64 abicalls, emit instructions
8279    to set up the global pointer.  */
8280
8281 static void
8282 mips_emit_loadgp (void)
8283 {
8284   rtx addr, offset, incoming_address, base, index;
8285
8286   switch (mips_current_loadgp_style ())
8287     {
8288     case LOADGP_ABSOLUTE:
8289       if (mips_gnu_local_gp == NULL)
8290         {
8291           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
8292           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
8293         }
8294       emit_insn (gen_loadgp_absolute (mips_gnu_local_gp));
8295       break;
8296
8297     case LOADGP_NEWABI:
8298       addr = XEXP (DECL_RTL (current_function_decl), 0);
8299       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
8300       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
8301       emit_insn (gen_loadgp_newabi (offset, incoming_address));
8302       if (!TARGET_EXPLICIT_RELOCS)
8303         emit_insn (gen_loadgp_blockage ());
8304       break;
8305
8306     case LOADGP_RTP:
8307       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
8308       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
8309       emit_insn (gen_loadgp_rtp (base, index));
8310       if (!TARGET_EXPLICIT_RELOCS)
8311         emit_insn (gen_loadgp_blockage ());
8312       break;
8313
8314     default:
8315       break;
8316     }
8317 }
8318
8319 /* Expand the "prologue" pattern.  */
8320
8321 void
8322 mips_expand_prologue (void)
8323 {
8324   const struct mips_frame_info *frame;
8325   HOST_WIDE_INT size;
8326   unsigned int nargs;
8327   rtx insn;
8328
8329   if (cfun->machine->global_pointer > 0)
8330     SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
8331
8332   frame = &cfun->machine->frame;
8333   size = frame->total_size;
8334
8335   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
8336      bytes beforehand; this is enough to cover the register save area
8337      without going out of range.  */
8338   if ((frame->mask | frame->fmask) != 0)
8339     {
8340       HOST_WIDE_INT step1;
8341
8342       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
8343       if (GENERATE_MIPS16E_SAVE_RESTORE)
8344         {
8345           HOST_WIDE_INT offset;
8346           unsigned int mask, regno;
8347
8348           /* Try to merge argument stores into the save instruction.  */
8349           nargs = mips16e_collect_argument_saves ();
8350
8351           /* Build the save instruction.  */
8352           mask = frame->mask;
8353           insn = mips16e_build_save_restore (false, &mask, &offset,
8354                                              nargs, step1);
8355           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8356           size -= step1;
8357
8358           /* Check if we need to save other registers.  */
8359           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
8360             if (BITSET_P (mask, regno - GP_REG_FIRST))
8361               {
8362                 offset -= UNITS_PER_WORD;
8363                 mips_save_restore_reg (word_mode, regno,
8364                                        offset, mips_save_reg);
8365               }
8366         }
8367       else
8368         {
8369           insn = gen_add3_insn (stack_pointer_rtx,
8370                                 stack_pointer_rtx,
8371                                 GEN_INT (-step1));
8372           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8373           size -= step1;
8374           mips_for_each_saved_reg (size, mips_save_reg);
8375         }
8376     }
8377
8378   /* Allocate the rest of the frame.  */
8379   if (size > 0)
8380     {
8381       if (SMALL_OPERAND (-size))
8382         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
8383                                                        stack_pointer_rtx,
8384                                                        GEN_INT (-size)))) = 1;
8385       else
8386         {
8387           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
8388           if (TARGET_MIPS16)
8389             {
8390               /* There are no instructions to add or subtract registers
8391                  from the stack pointer, so use the frame pointer as a
8392                  temporary.  We should always be using a frame pointer
8393                  in this case anyway.  */
8394               gcc_assert (frame_pointer_needed);
8395               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8396               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
8397                                         hard_frame_pointer_rtx,
8398                                         MIPS_PROLOGUE_TEMP (Pmode)));
8399               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
8400             }
8401           else
8402             emit_insn (gen_sub3_insn (stack_pointer_rtx,
8403                                       stack_pointer_rtx,
8404                                       MIPS_PROLOGUE_TEMP (Pmode)));
8405
8406           /* Describe the combined effect of the previous instructions.  */
8407           mips_set_frame_expr
8408             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8409                           plus_constant (stack_pointer_rtx, -size)));
8410         }
8411     }
8412
8413   /* Set up the frame pointer, if we're using one.  */
8414   if (frame_pointer_needed)
8415     {
8416       HOST_WIDE_INT offset;
8417
8418       offset = frame->hard_frame_pointer_offset;
8419       if (offset == 0)
8420         {
8421           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8422           RTX_FRAME_RELATED_P (insn) = 1;
8423         }
8424       else if (SMALL_OPERAND (offset))
8425         {
8426           insn = gen_add3_insn (hard_frame_pointer_rtx,
8427                                 stack_pointer_rtx, GEN_INT (offset));
8428           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8429         }
8430       else
8431         {
8432           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
8433           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8434           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
8435                                     hard_frame_pointer_rtx,
8436                                     MIPS_PROLOGUE_TEMP (Pmode)));
8437           mips_set_frame_expr
8438             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
8439                           plus_constant (stack_pointer_rtx, offset)));
8440         }
8441     }
8442
8443   mips_emit_loadgp ();
8444
8445   /* Initialize the $gp save slot.  */
8446   if (frame->cprestore_size > 0)
8447     emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
8448
8449   /* If we are profiling, make sure no instructions are scheduled before
8450      the call to mcount.  */
8451   if (current_function_profile)
8452     emit_insn (gen_blockage ());
8453 }
8454 \f
8455 /* Emit instructions to restore register REG from slot MEM.  */
8456
8457 static void
8458 mips_restore_reg (rtx reg, rtx mem)
8459 {
8460   /* There's no MIPS16 instruction to load $31 directly.  Load into
8461      $7 instead and adjust the return insn appropriately.  */
8462   if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
8463     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
8464
8465   if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
8466     {
8467       /* Can't restore directly; move through a temporary.  */
8468       mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
8469       mips_emit_move (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
8470     }
8471   else
8472     mips_emit_move (reg, mem);
8473 }
8474
8475 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
8476    says which.  */
8477
8478 void
8479 mips_expand_epilogue (bool sibcall_p)
8480 {
8481   const struct mips_frame_info *frame;
8482   HOST_WIDE_INT step1, step2;
8483   rtx base, target;
8484
8485   if (!sibcall_p && mips_can_use_return_insn ())
8486     {
8487       emit_jump_insn (gen_return ());
8488       return;
8489     }
8490
8491   /* In MIPS16 mode, if the return value should go into a floating-point
8492      register, we need to call a helper routine to copy it over.  */
8493   if (mips16_cfun_returns_in_fpr_p ())
8494     mips16_copy_fpr_return_value ();
8495
8496   /* Split the frame into two.  STEP1 is the amount of stack we should
8497      deallocate before restoring the registers.  STEP2 is the amount we
8498      should deallocate afterwards.
8499
8500      Start off by assuming that no registers need to be restored.  */
8501   frame = &cfun->machine->frame;
8502   step1 = frame->total_size;
8503   step2 = 0;
8504
8505   /* Work out which register holds the frame address.  */
8506   if (!frame_pointer_needed)
8507     base = stack_pointer_rtx;
8508   else
8509     {
8510       base = hard_frame_pointer_rtx;
8511       step1 -= frame->hard_frame_pointer_offset;
8512     }
8513
8514   /* If we need to restore registers, deallocate as much stack as
8515      possible in the second step without going out of range.  */
8516   if ((frame->mask | frame->fmask) != 0)
8517     {
8518       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
8519       step1 -= step2;
8520     }
8521
8522   /* Set TARGET to BASE + STEP1.  */
8523   target = base;
8524   if (step1 > 0)
8525     {
8526       rtx adjust;
8527
8528       /* Get an rtx for STEP1 that we can add to BASE.  */
8529       adjust = GEN_INT (step1);
8530       if (!SMALL_OPERAND (step1))
8531         {
8532           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
8533           adjust = MIPS_EPILOGUE_TEMP (Pmode);
8534         }
8535
8536       /* Normal mode code can copy the result straight into $sp.  */
8537       if (!TARGET_MIPS16)
8538         target = stack_pointer_rtx;
8539
8540       emit_insn (gen_add3_insn (target, base, adjust));
8541     }
8542
8543   /* Copy TARGET into the stack pointer.  */
8544   if (target != stack_pointer_rtx)
8545     mips_emit_move (stack_pointer_rtx, target);
8546
8547   /* If we're using addressing macros, $gp is implicitly used by all
8548      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
8549      from the stack.  */
8550   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
8551     emit_insn (gen_blockage ());
8552
8553   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
8554     {
8555       unsigned int regno, mask;
8556       HOST_WIDE_INT offset;
8557       rtx restore;
8558
8559       /* Generate the restore instruction.  */
8560       mask = frame->mask;
8561       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
8562
8563       /* Restore any other registers manually.  */
8564       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
8565         if (BITSET_P (mask, regno - GP_REG_FIRST))
8566           {
8567             offset -= UNITS_PER_WORD;
8568             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
8569           }
8570
8571       /* Restore the remaining registers and deallocate the final bit
8572          of the frame.  */
8573       emit_insn (restore);
8574     }
8575   else
8576     {
8577       /* Restore the registers.  */
8578       mips_for_each_saved_reg (frame->total_size - step2, mips_restore_reg);
8579
8580       /* Deallocate the final bit of the frame.  */
8581       if (step2 > 0)
8582         emit_insn (gen_add3_insn (stack_pointer_rtx,
8583                                   stack_pointer_rtx,
8584                                   GEN_INT (step2)));
8585     }
8586
8587   /* Add in the __builtin_eh_return stack adjustment.  We need to
8588      use a temporary in MIPS16 code.  */
8589   if (current_function_calls_eh_return)
8590     {
8591       if (TARGET_MIPS16)
8592         {
8593           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
8594           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
8595                                     MIPS_EPILOGUE_TEMP (Pmode),
8596                                     EH_RETURN_STACKADJ_RTX));
8597           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
8598         }
8599       else
8600         emit_insn (gen_add3_insn (stack_pointer_rtx,
8601                                   stack_pointer_rtx,
8602                                   EH_RETURN_STACKADJ_RTX));
8603     }
8604
8605   if (!sibcall_p)
8606     {
8607       unsigned int regno;
8608
8609       /* When generating MIPS16 code, the normal mips_for_each_saved_reg
8610          path will restore the return address into $7 rather than $31.  */
8611       if (TARGET_MIPS16
8612           && !GENERATE_MIPS16E_SAVE_RESTORE
8613           && BITSET_P (frame->mask, 31))
8614         regno = GP_REG_FIRST + 7;
8615       else
8616         regno = GP_REG_FIRST + 31;
8617       emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
8618     }
8619 }
8620 \f
8621 /* Return nonzero if this function is known to have a null epilogue.
8622    This allows the optimizer to omit jumps to jumps if no stack
8623    was created.  */
8624
8625 bool
8626 mips_can_use_return_insn (void)
8627 {
8628   if (!reload_completed)
8629     return false;
8630
8631   if (current_function_profile)
8632     return false;
8633
8634   /* In MIPS16 mode, a function that returns a floating-point value
8635      needs to arrange to copy the return value into the floating-point
8636      registers.  */
8637   if (mips16_cfun_returns_in_fpr_p ())
8638     return false;
8639
8640   return cfun->machine->frame.total_size == 0;
8641 }
8642 \f
8643 /* Return true if register REGNO can store a value of mode MODE.
8644    The result of this function is cached in mips_hard_regno_mode_ok.  */
8645
8646 static bool
8647 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
8648 {
8649   unsigned int size;
8650   enum mode_class class;
8651
8652   if (mode == CCV2mode)
8653     return (ISA_HAS_8CC
8654             && ST_REG_P (regno)
8655             && (regno - ST_REG_FIRST) % 2 == 0);
8656
8657   if (mode == CCV4mode)
8658     return (ISA_HAS_8CC
8659             && ST_REG_P (regno)
8660             && (regno - ST_REG_FIRST) % 4 == 0);
8661
8662   if (mode == CCmode)
8663     {
8664       if (!ISA_HAS_8CC)
8665         return regno == FPSW_REGNUM;
8666
8667       return (ST_REG_P (regno)
8668               || GP_REG_P (regno)
8669               || FP_REG_P (regno));
8670     }
8671
8672   size = GET_MODE_SIZE (mode);
8673   class = GET_MODE_CLASS (mode);
8674
8675   if (GP_REG_P (regno))
8676     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
8677
8678   if (FP_REG_P (regno)
8679       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
8680           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
8681     {
8682       /* Allow TFmode for CCmode reloads.  */
8683       if (mode == TFmode && ISA_HAS_8CC)
8684         return true;
8685
8686       if (class == MODE_FLOAT
8687           || class == MODE_COMPLEX_FLOAT
8688           || class == MODE_VECTOR_FLOAT)
8689         return size <= UNITS_PER_FPVALUE;
8690
8691       /* Allow integer modes that fit into a single register.  We need
8692          to put integers into FPRs when using instructions like CVT
8693          and TRUNC.  There's no point allowing sizes smaller than a word,
8694          because the FPU has no appropriate load/store instructions.  */
8695       if (class == MODE_INT)
8696         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
8697     }
8698
8699   if (ACC_REG_P (regno)
8700       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
8701     {
8702       if (size <= UNITS_PER_WORD)
8703         return true;
8704
8705       if (size <= UNITS_PER_WORD * 2)
8706         return (DSP_ACC_REG_P (regno)
8707                 ? ((regno - DSP_ACC_REG_FIRST) & 1) == 0
8708                 : regno == MD_REG_FIRST);
8709     }
8710
8711   if (ALL_COP_REG_P (regno))
8712     return class == MODE_INT && size <= UNITS_PER_WORD;
8713
8714   return false;
8715 }
8716
8717 /* Implement HARD_REGNO_NREGS.  */
8718
8719 unsigned int
8720 mips_hard_regno_nregs (int regno, enum machine_mode mode)
8721 {
8722   if (ST_REG_P (regno))
8723     /* The size of FP status registers is always 4, because they only hold
8724        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
8725     return (GET_MODE_SIZE (mode) + 3) / 4;
8726
8727   if (FP_REG_P (regno))
8728     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
8729
8730   /* All other registers are word-sized.  */
8731   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8732 }
8733
8734 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
8735    in mips_hard_regno_nregs.  */
8736
8737 int
8738 mips_class_max_nregs (enum reg_class class, enum machine_mode mode)
8739 {
8740   int size;
8741   HARD_REG_SET left;
8742
8743   size = 0x8000;
8744   COPY_HARD_REG_SET (left, reg_class_contents[(int) class]);
8745   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
8746     {
8747       size = MIN (size, 4);
8748       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
8749     }
8750   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
8751     {
8752       size = MIN (size, UNITS_PER_FPREG);
8753       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
8754     }
8755   if (!hard_reg_set_empty_p (left))
8756     size = MIN (size, UNITS_PER_WORD);
8757   return (GET_MODE_SIZE (mode) + size - 1) / size;
8758 }
8759
8760 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
8761
8762 bool
8763 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
8764                                enum machine_mode to ATTRIBUTE_UNUSED,
8765                                enum reg_class class)
8766 {
8767   /* There are several problems with changing the modes of values
8768      in floating-point registers:
8769
8770      - When a multi-word value is stored in paired floating-point
8771        registers, the first register always holds the low word.
8772        We therefore can't allow FPRs to change between single-word
8773        and multi-word modes on big-endian targets.
8774
8775      - GCC assumes that each word of a multiword register can be accessed
8776        individually using SUBREGs.  This is not true for floating-point
8777        registers if they are bigger than a word.
8778
8779      - Loading a 32-bit value into a 64-bit floating-point register
8780        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
8781        We can't allow FPRs to change from SImode to to a wider mode on
8782        64-bit targets.
8783
8784      - If the FPU has already interpreted a value in one format, we must
8785        not ask it to treat the value as having a different format.
8786
8787      We therefore disallow all mode changes involving FPRs.  */
8788   return reg_classes_intersect_p (FP_REGS, class);
8789 }
8790
8791 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
8792
8793 static bool
8794 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
8795 {
8796   switch (mode)
8797     {
8798     case SFmode:
8799       return TARGET_HARD_FLOAT;
8800
8801     case DFmode:
8802       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
8803
8804     case V2SFmode:
8805       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
8806
8807     default:
8808       return false;
8809     }
8810 }
8811
8812 /* Implement MODES_TIEABLE_P.  */
8813
8814 bool
8815 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
8816 {
8817   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
8818      prefer to put one of them in FPRs.  */
8819   return (mode1 == mode2
8820           || (!mips_mode_ok_for_mov_fmt_p (mode1)
8821               && !mips_mode_ok_for_mov_fmt_p (mode2)));
8822 }
8823
8824 /* Implement PREFERRED_RELOAD_CLASS.  */
8825
8826 enum reg_class
8827 mips_preferred_reload_class (rtx x, enum reg_class class)
8828 {
8829   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
8830     return LEA_REGS;
8831
8832   if (reg_class_subset_p (FP_REGS, class)
8833       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
8834     return FP_REGS;
8835
8836   if (reg_class_subset_p (GR_REGS, class))
8837     class = GR_REGS;
8838
8839   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, class))
8840     class = M16_REGS;
8841
8842   return class;
8843 }
8844
8845 /* Implement REGISTER_MOVE_COST.  */
8846
8847 int
8848 mips_register_move_cost (enum machine_mode mode,
8849                          enum reg_class to, enum reg_class from)
8850 {
8851   if (TARGET_MIPS16)
8852     {
8853       /* ??? We cannot move general registers into HI and LO because
8854          MIPS16 has no MTHI and MTLO instructions.  Make the cost of
8855          moves in the opposite direction just as high, which stops the
8856          register allocators from using HI and LO for pseudos.  */
8857       if (reg_class_subset_p (from, GENERAL_REGS)
8858           && reg_class_subset_p (to, GENERAL_REGS))
8859         {
8860           if (reg_class_subset_p (from, M16_REGS)
8861               || reg_class_subset_p (to, M16_REGS))
8862             return 2;
8863           /* Two MOVEs.  */
8864           return 4;
8865         }
8866     }
8867   else if (reg_class_subset_p (from, GENERAL_REGS))
8868     {
8869       if (reg_class_subset_p (to, GENERAL_REGS))
8870         return 2;
8871       if (reg_class_subset_p (to, FP_REGS))
8872         return 4;
8873       if (reg_class_subset_p (to, ALL_COP_AND_GR_REGS))
8874         return 5;
8875       if (reg_class_subset_p (to, ACC_REGS))
8876         return 6;
8877     }
8878   else if (reg_class_subset_p (to, GENERAL_REGS))
8879     {
8880       if (reg_class_subset_p (from, FP_REGS))
8881         return 4;
8882       if (reg_class_subset_p (from, ST_REGS))
8883         /* LUI followed by MOVF.  */
8884         return 4;
8885       if (reg_class_subset_p (from, ALL_COP_AND_GR_REGS))
8886         return 5;
8887       if (reg_class_subset_p (from, ACC_REGS))
8888         return 6;
8889     }
8890   else if (reg_class_subset_p (from, FP_REGS))
8891     {
8892       if (reg_class_subset_p (to, FP_REGS)
8893           && mips_mode_ok_for_mov_fmt_p (mode))
8894         return 4;
8895       if (reg_class_subset_p (to, ST_REGS))
8896         /* An expensive sequence.  */
8897         return 8;
8898     }
8899
8900   return 12;
8901 }
8902
8903 /* Return the register class required for a secondary register when
8904    copying between one of the registers in CLASS and value X, which
8905    has mode MODE.  X is the source of the move if IN_P, otherwise it
8906    is the destination.  Return NO_REGS if no secondary register is
8907    needed.  */
8908
8909 enum reg_class
8910 mips_secondary_reload_class (enum reg_class class,
8911                              enum machine_mode mode, rtx x, bool in_p)
8912 {
8913   int regno;
8914
8915   /* If X is a constant that cannot be loaded into $25, it must be loaded
8916      into some other GPR.  No other register class allows a direct move.  */
8917   if (mips_dangerous_for_la25_p (x))
8918     return reg_class_subset_p (class, LEA_REGS) ? NO_REGS : LEA_REGS;
8919
8920   regno = true_regnum (x);
8921   if (TARGET_MIPS16)
8922     {
8923       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
8924       if (!reg_class_subset_p (class, M16_REGS) && !M16_REG_P (regno))
8925         return M16_REGS;
8926
8927       /* We can't really copy to HI or LO at all in MIPS16 mode.  */
8928       if (in_p ? reg_classes_intersect_p (class, ACC_REGS) : ACC_REG_P (regno))
8929         return M16_REGS;
8930
8931       return NO_REGS;
8932     }
8933
8934   /* Copying from accumulator registers to anywhere other than a general
8935      register requires a temporary general register.  */
8936   if (reg_class_subset_p (class, ACC_REGS))
8937     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
8938   if (ACC_REG_P (regno))
8939     return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
8940
8941   /* We can only copy a value to a condition code register from a
8942      floating-point register, and even then we require a scratch
8943      floating-point register.  We can only copy a value out of a
8944      condition-code register into a general register.  */
8945   if (reg_class_subset_p (class, ST_REGS))
8946     {
8947       if (in_p)
8948         return FP_REGS;
8949       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
8950     }
8951   if (ST_REG_P (regno))
8952     {
8953       if (!in_p)
8954         return FP_REGS;
8955       return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
8956     }
8957
8958   if (reg_class_subset_p (class, FP_REGS))
8959     {
8960       if (MEM_P (x)
8961           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
8962         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
8963            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
8964         return NO_REGS;
8965
8966       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
8967         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
8968         return NO_REGS;
8969
8970       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
8971         /* We can force the constant to memory and use lwc1
8972            and ldc1.  As above, we will use pairs of lwc1s if
8973            ldc1 is not supported.  */
8974         return NO_REGS;
8975
8976       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
8977         /* In this case we can use mov.fmt.  */
8978         return NO_REGS;
8979
8980       /* Otherwise, we need to reload through an integer register.  */
8981       return GR_REGS;
8982     }
8983   if (FP_REG_P (regno))
8984     return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
8985
8986   return NO_REGS;
8987 }
8988
8989 /* Implement TARGET_MODE_REP_EXTENDED.  */
8990
8991 static int
8992 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
8993 {
8994   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
8995   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
8996     return SIGN_EXTEND;
8997
8998   return UNKNOWN;
8999 }
9000 \f
9001 /* Implement TARGET_VALID_POINTER_MODE.  */
9002
9003 static bool
9004 mips_valid_pointer_mode (enum machine_mode mode)
9005 {
9006   return mode == SImode || (TARGET_64BIT && mode == DImode);
9007 }
9008
9009 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
9010
9011 static bool
9012 mips_vector_mode_supported_p (enum machine_mode mode)
9013 {
9014   switch (mode)
9015     {
9016     case V2SFmode:
9017       return TARGET_PAIRED_SINGLE_FLOAT;
9018
9019     case V2HImode:
9020     case V4QImode:
9021     case V2HQmode:
9022     case V2UHQmode:
9023     case V2HAmode:
9024     case V2UHAmode:
9025     case V4QQmode:
9026     case V4UQQmode:
9027       return TARGET_DSP;
9028
9029     default:
9030       return false;
9031     }
9032 }
9033
9034 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
9035
9036 static bool
9037 mips_scalar_mode_supported_p (enum machine_mode mode)
9038 {
9039   if (ALL_FIXED_POINT_MODE_P (mode)
9040       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
9041     return true;
9042
9043   return default_scalar_mode_supported_p (mode);
9044 }
9045 \f
9046 /* Implement TARGET_INIT_LIBFUNCS.  */
9047
9048 #include "config/gofast.h"
9049
9050 static void
9051 mips_init_libfuncs (void)
9052 {
9053   if (TARGET_FIX_VR4120)
9054     {
9055       /* Register the special divsi3 and modsi3 functions needed to work
9056          around VR4120 division errata.  */
9057       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
9058       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
9059     }
9060
9061   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
9062     {
9063       /* Register the MIPS16 -mhard-float stubs.  */
9064       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
9065       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
9066       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
9067       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
9068
9069       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
9070       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
9071       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
9072       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
9073       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
9074       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
9075       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
9076
9077       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
9078       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
9079       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
9080
9081       if (TARGET_DOUBLE_FLOAT)
9082         {
9083           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
9084           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
9085           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
9086           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
9087
9088           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
9089           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
9090           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
9091           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
9092           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
9093           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
9094           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
9095
9096           set_conv_libfunc (sext_optab, DFmode, SFmode,
9097                             "__mips16_extendsfdf2");
9098           set_conv_libfunc (trunc_optab, SFmode, DFmode,
9099                             "__mips16_truncdfsf2");
9100           set_conv_libfunc (sfix_optab, SImode, DFmode,
9101                             "__mips16_fix_truncdfsi");
9102           set_conv_libfunc (sfloat_optab, DFmode, SImode,
9103                             "__mips16_floatsidf");
9104           set_conv_libfunc (ufloat_optab, DFmode, SImode,
9105                             "__mips16_floatunsidf");
9106         }
9107     }
9108   else
9109     /* Register the gofast functions if selected using --enable-gofast.  */
9110     gofast_maybe_init_libfuncs ();
9111 }
9112
9113 /* Return the length of INSN.  LENGTH is the initial length computed by
9114    attributes in the machine-description file.  */
9115
9116 int
9117 mips_adjust_insn_length (rtx insn, int length)
9118 {
9119   /* A unconditional jump has an unfilled delay slot if it is not part
9120      of a sequence.  A conditional jump normally has a delay slot, but
9121      does not on MIPS16.  */
9122   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
9123     length += 4;
9124
9125   /* See how many nops might be needed to avoid hardware hazards.  */
9126   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
9127     switch (get_attr_hazard (insn))
9128       {
9129       case HAZARD_NONE:
9130         break;
9131
9132       case HAZARD_DELAY:
9133         length += 4;
9134         break;
9135
9136       case HAZARD_HILO:
9137         length += 8;
9138         break;
9139       }
9140
9141   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
9142      the .md file length attributes are 4-based for both modes.
9143      Adjust the MIPS16 ones here.  */
9144   if (TARGET_MIPS16)
9145     length /= 2;
9146
9147   return length;
9148 }
9149
9150 /* Return an asm sequence to start a noat block and load the address
9151    of a label into $1.  */
9152
9153 const char *
9154 mips_output_load_label (void)
9155 {
9156   if (TARGET_EXPLICIT_RELOCS)
9157     switch (mips_abi)
9158       {
9159       case ABI_N32:
9160         return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
9161
9162       case ABI_64:
9163         return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
9164
9165       default:
9166         if (ISA_HAS_LOAD_DELAY)
9167           return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
9168         return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
9169       }
9170   else
9171     {
9172       if (Pmode == DImode)
9173         return "%[dla\t%@,%0";
9174       else
9175         return "%[la\t%@,%0";
9176     }
9177 }
9178
9179 /* Return the assembly code for INSN, which has the operands given by
9180    OPERANDS, and which branches to OPERANDS[1] if some condition is true.
9181    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[1]
9182    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
9183    version of BRANCH_IF_TRUE.  */
9184
9185 const char *
9186 mips_output_conditional_branch (rtx insn, rtx *operands,
9187                                 const char *branch_if_true,
9188                                 const char *branch_if_false)
9189 {
9190   unsigned int length;
9191   rtx taken, not_taken;
9192
9193   length = get_attr_length (insn);
9194   if (length <= 8)
9195     {
9196       /* Just a simple conditional branch.  */
9197       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
9198       return branch_if_true;
9199     }
9200
9201   /* Generate a reversed branch around a direct jump.  This fallback does
9202      not use branch-likely instructions.  */
9203   mips_branch_likely = false;
9204   not_taken = gen_label_rtx ();
9205   taken = operands[1];
9206
9207   /* Generate the reversed branch to NOT_TAKEN.  */
9208   operands[1] = not_taken;
9209   output_asm_insn (branch_if_false, operands);
9210
9211   /* If INSN has a delay slot, we must provide delay slots for both the
9212      branch to NOT_TAKEN and the conditional jump.  We must also ensure
9213      that INSN's delay slot is executed in the appropriate cases.  */
9214   if (final_sequence)
9215     {
9216       /* This first delay slot will always be executed, so use INSN's
9217          delay slot if is not annulled.  */
9218       if (!INSN_ANNULLED_BRANCH_P (insn))
9219         {
9220           final_scan_insn (XVECEXP (final_sequence, 0, 1),
9221                            asm_out_file, optimize, 1, NULL);
9222           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
9223         }
9224       else
9225         output_asm_insn ("nop", 0);
9226       fprintf (asm_out_file, "\n");
9227     }
9228
9229   /* Output the unconditional branch to TAKEN.  */
9230   if (length <= 16)
9231     output_asm_insn ("j\t%0%/", &taken);
9232   else
9233     {
9234       output_asm_insn (mips_output_load_label (), &taken);
9235       output_asm_insn ("jr\t%@%]%/", 0);
9236     }
9237
9238   /* Now deal with its delay slot; see above.  */
9239   if (final_sequence)
9240     {
9241       /* This delay slot will only be executed if the branch is taken.
9242          Use INSN's delay slot if is annulled.  */
9243       if (INSN_ANNULLED_BRANCH_P (insn))
9244         {
9245           final_scan_insn (XVECEXP (final_sequence, 0, 1),
9246                            asm_out_file, optimize, 1, NULL);
9247           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
9248         }
9249       else
9250         output_asm_insn ("nop", 0);
9251       fprintf (asm_out_file, "\n");
9252     }
9253
9254   /* Output NOT_TAKEN.  */
9255   targetm.asm_out.internal_label (asm_out_file, "L",
9256                                   CODE_LABEL_NUMBER (not_taken));
9257   return "";
9258 }
9259
9260 /* Return the assembly code for INSN, which branches to OPERANDS[1]
9261    if some ordering condition is true.  The condition is given by
9262    OPERANDS[0] if !INVERTED_P, otherwise it is the inverse of
9263    OPERANDS[0].  OPERANDS[2] is the comparison's first operand;
9264    its second is always zero.  */
9265
9266 const char *
9267 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
9268 {
9269   const char *branch[2];
9270
9271   /* Make BRANCH[1] branch to OPERANDS[1] when the condition is true.
9272      Make BRANCH[0] branch on the inverse condition.  */
9273   switch (GET_CODE (operands[0]))
9274     {
9275       /* These cases are equivalent to comparisons against zero.  */
9276     case LEU:
9277       inverted_p = !inverted_p;
9278       /* Fall through.  */
9279     case GTU:
9280       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%1");
9281       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%1");
9282       break;
9283
9284       /* These cases are always true or always false.  */
9285     case LTU:
9286       inverted_p = !inverted_p;
9287       /* Fall through.  */
9288     case GEU:
9289       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%1");
9290       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%1");
9291       break;
9292
9293     default:
9294       branch[!inverted_p] = MIPS_BRANCH ("b%C0z", "%2,%1");
9295       branch[inverted_p] = MIPS_BRANCH ("b%N0z", "%2,%1");
9296       break;
9297     }
9298   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
9299 }
9300 \f
9301 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
9302    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
9303
9304    When working around R4000 and R4400 errata, we need to make sure that
9305    the division is not immediately followed by a shift[1][2].  We also
9306    need to stop the division from being put into a branch delay slot[3].
9307    The easiest way to avoid both problems is to add a nop after the
9308    division.  When a divide-by-zero check is needed, this nop can be
9309    used to fill the branch delay slot.
9310
9311    [1] If a double-word or a variable shift executes immediately
9312        after starting an integer division, the shift may give an
9313        incorrect result.  See quotations of errata #16 and #28 from
9314        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9315        in mips.md for details.
9316
9317    [2] A similar bug to [1] exists for all revisions of the
9318        R4000 and the R4400 when run in an MC configuration.
9319        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
9320
9321        "19. In this following sequence:
9322
9323                     ddiv                (or ddivu or div or divu)
9324                     dsll32              (or dsrl32, dsra32)
9325
9326             if an MPT stall occurs, while the divide is slipping the cpu
9327             pipeline, then the following double shift would end up with an
9328             incorrect result.
9329
9330             Workaround: The compiler needs to avoid generating any
9331             sequence with divide followed by extended double shift."
9332
9333        This erratum is also present in "MIPS R4400MC Errata, Processor
9334        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
9335        & 3.0" as errata #10 and #4, respectively.
9336
9337    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9338        (also valid for MIPS R4000MC processors):
9339
9340        "52. R4000SC: This bug does not apply for the R4000PC.
9341
9342             There are two flavors of this bug:
9343
9344             1) If the instruction just after divide takes an RF exception
9345                (tlb-refill, tlb-invalid) and gets an instruction cache
9346                miss (both primary and secondary) and the line which is
9347                currently in secondary cache at this index had the first
9348                data word, where the bits 5..2 are set, then R4000 would
9349                get a wrong result for the div.
9350
9351             ##1
9352                     nop
9353                     div r8, r9
9354                     -------------------         # end-of page. -tlb-refill
9355                     nop
9356             ##2
9357                     nop
9358                     div r8, r9
9359                     -------------------         # end-of page. -tlb-invalid
9360                     nop
9361
9362             2) If the divide is in the taken branch delay slot, where the
9363                target takes RF exception and gets an I-cache miss for the
9364                exception vector or where I-cache miss occurs for the
9365                target address, under the above mentioned scenarios, the
9366                div would get wrong results.
9367
9368             ##1
9369                     j   r2              # to next page mapped or unmapped
9370                     div r8,r9           # this bug would be there as long
9371                                         # as there is an ICache miss and
9372                     nop                 # the "data pattern" is present
9373
9374             ##2
9375                     beq r0, r0, NextPage        # to Next page
9376                     div r8,r9
9377                     nop
9378
9379             This bug is present for div, divu, ddiv, and ddivu
9380             instructions.
9381
9382             Workaround: For item 1), OS could make sure that the next page
9383             after the divide instruction is also mapped.  For item 2), the
9384             compiler could make sure that the divide instruction is not in
9385             the branch delay slot."
9386
9387        These processors have PRId values of 0x00004220 and 0x00004300 for
9388        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
9389
9390 const char *
9391 mips_output_division (const char *division, rtx *operands)
9392 {
9393   const char *s;
9394
9395   s = division;
9396   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
9397     {
9398       output_asm_insn (s, operands);
9399       s = "nop";
9400     }
9401   if (TARGET_CHECK_ZERO_DIV)
9402     {
9403       if (TARGET_MIPS16)
9404         {
9405           output_asm_insn (s, operands);
9406           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
9407         }
9408       else if (GENERATE_DIVIDE_TRAPS)
9409         {
9410           output_asm_insn (s, operands);
9411           s = "teq\t%2,%.,7";
9412         }
9413       else
9414         {
9415           output_asm_insn ("%(bne\t%2,%.,1f", operands);
9416           output_asm_insn (s, operands);
9417           s = "break\t7%)\n1:";
9418         }
9419     }
9420   return s;
9421 }
9422 \f
9423 /* Return true if IN_INSN is a multiply-add or multiply-subtract
9424    instruction and if OUT_INSN assigns to the accumulator operand.  */
9425
9426 bool
9427 mips_linked_madd_p (rtx out_insn, rtx in_insn)
9428 {
9429   rtx x;
9430
9431   x = single_set (in_insn);
9432   if (x == 0)
9433     return false;
9434
9435   x = SET_SRC (x);
9436
9437   if (GET_CODE (x) == PLUS
9438       && GET_CODE (XEXP (x, 0)) == MULT
9439       && reg_set_p (XEXP (x, 1), out_insn))
9440     return true;
9441
9442   if (GET_CODE (x) == MINUS
9443       && GET_CODE (XEXP (x, 1)) == MULT
9444       && reg_set_p (XEXP (x, 0), out_insn))
9445     return true;
9446
9447   return false;
9448 }
9449
9450 /* True if the dependency between OUT_INSN and IN_INSN is on the store
9451    data rather than the address.  We need this because the cprestore
9452    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
9453    which causes the default routine to abort.  We just return false
9454    for that case.  */
9455
9456 bool
9457 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
9458 {
9459   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
9460     return false;
9461
9462   return !store_data_bypass_p (out_insn, in_insn);
9463 }
9464 \f
9465 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
9466    dependencies have no cost, except on the 20Kc where output-dependence
9467    is treated like input-dependence.  */
9468
9469 static int
9470 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
9471                   rtx dep ATTRIBUTE_UNUSED, int cost)
9472 {
9473   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
9474       && TUNE_20KC)
9475     return cost;
9476   if (REG_NOTE_KIND (link) != 0)
9477     return 0;
9478   return cost;
9479 }
9480
9481 /* Return the number of instructions that can be issued per cycle.  */
9482
9483 static int
9484 mips_issue_rate (void)
9485 {
9486   switch (mips_tune)
9487     {
9488     case PROCESSOR_74KC:
9489     case PROCESSOR_74KF2_1:
9490     case PROCESSOR_74KF1_1:
9491     case PROCESSOR_74KF3_2:
9492       /* The 74k is not strictly quad-issue cpu, but can be seen as one
9493          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
9494          but in reality only a maximum of 3 insns can be issued as
9495          floating-point loads and stores also require a slot in the
9496          AGEN pipe.  */
9497      return 4;
9498
9499     case PROCESSOR_20KC:
9500     case PROCESSOR_R4130:
9501     case PROCESSOR_R5400:
9502     case PROCESSOR_R5500:
9503     case PROCESSOR_R7000:
9504     case PROCESSOR_R9000:
9505       return 2;
9506
9507     case PROCESSOR_SB1:
9508     case PROCESSOR_SB1A:
9509       /* This is actually 4, but we get better performance if we claim 3.
9510          This is partly because of unwanted speculative code motion with the
9511          larger number, and partly because in most common cases we can't
9512          reach the theoretical max of 4.  */
9513       return 3;
9514
9515     default:
9516       return 1;
9517     }
9518 }
9519
9520 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
9521    be as wide as the scheduling freedom in the DFA.  */
9522
9523 static int
9524 mips_multipass_dfa_lookahead (void)
9525 {
9526   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
9527   if (TUNE_SB1)
9528     return 4;
9529
9530   return 0;
9531 }
9532 \f
9533 /* Remove the instruction at index LOWER from ready queue READY and
9534    reinsert it in front of the instruction at index HIGHER.  LOWER must
9535    be <= HIGHER.  */
9536
9537 static void
9538 mips_promote_ready (rtx *ready, int lower, int higher)
9539 {
9540   rtx new_head;
9541   int i;
9542
9543   new_head = ready[lower];
9544   for (i = lower; i < higher; i++)
9545     ready[i] = ready[i + 1];
9546   ready[i] = new_head;
9547 }
9548
9549 /* If the priority of the instruction at POS2 in the ready queue READY
9550    is within LIMIT units of that of the instruction at POS1, swap the
9551    instructions if POS2 is not already less than POS1.  */
9552
9553 static void
9554 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
9555 {
9556   if (pos1 < pos2
9557       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
9558     {
9559       rtx temp;
9560
9561       temp = ready[pos1];
9562       ready[pos1] = ready[pos2];
9563       ready[pos2] = temp;
9564     }
9565 }
9566 \f
9567 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
9568    that may clobber hi or lo.  */
9569 static rtx mips_macc_chains_last_hilo;
9570
9571 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
9572    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
9573
9574 static void
9575 mips_macc_chains_record (rtx insn)
9576 {
9577   if (get_attr_may_clobber_hilo (insn))
9578     mips_macc_chains_last_hilo = insn;
9579 }
9580
9581 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
9582    has NREADY elements, looking for a multiply-add or multiply-subtract
9583    instruction that is cumulative with mips_macc_chains_last_hilo.
9584    If there is one, promote it ahead of anything else that might
9585    clobber hi or lo.  */
9586
9587 static void
9588 mips_macc_chains_reorder (rtx *ready, int nready)
9589 {
9590   int i, j;
9591
9592   if (mips_macc_chains_last_hilo != 0)
9593     for (i = nready - 1; i >= 0; i--)
9594       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
9595         {
9596           for (j = nready - 1; j > i; j--)
9597             if (recog_memoized (ready[j]) >= 0
9598                 && get_attr_may_clobber_hilo (ready[j]))
9599               {
9600                 mips_promote_ready (ready, i, j);
9601                 break;
9602               }
9603           break;
9604         }
9605 }
9606 \f
9607 /* The last instruction to be scheduled.  */
9608 static rtx vr4130_last_insn;
9609
9610 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
9611    points to an rtx that is initially an instruction.  Nullify the rtx
9612    if the instruction uses the value of register X.  */
9613
9614 static void
9615 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
9616                                 void *data)
9617 {
9618   rtx *insn_ptr;
9619
9620   insn_ptr = (rtx *) data;
9621   if (REG_P (x)
9622       && *insn_ptr != 0
9623       && reg_referenced_p (x, PATTERN (*insn_ptr)))
9624     *insn_ptr = 0;
9625 }
9626
9627 /* Return true if there is true register dependence between vr4130_last_insn
9628    and INSN.  */
9629
9630 static bool
9631 vr4130_true_reg_dependence_p (rtx insn)
9632 {
9633   note_stores (PATTERN (vr4130_last_insn),
9634                vr4130_true_reg_dependence_p_1, &insn);
9635   return insn == 0;
9636 }
9637
9638 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
9639    the ready queue and that INSN2 is the instruction after it, return
9640    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
9641    in which INSN1 and INSN2 can probably issue in parallel, but for
9642    which (INSN2, INSN1) should be less sensitive to instruction
9643    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
9644
9645 static bool
9646 vr4130_swap_insns_p (rtx insn1, rtx insn2)
9647 {
9648   sd_iterator_def sd_it;
9649   dep_t dep;
9650
9651   /* Check for the following case:
9652
9653      1) there is some other instruction X with an anti dependence on INSN1;
9654      2) X has a higher priority than INSN2; and
9655      3) X is an arithmetic instruction (and thus has no unit restrictions).
9656
9657      If INSN1 is the last instruction blocking X, it would better to
9658      choose (INSN1, X) over (INSN2, INSN1).  */
9659   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
9660     if (DEP_TYPE (dep) == REG_DEP_ANTI
9661         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
9662         && recog_memoized (DEP_CON (dep)) >= 0
9663         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
9664       return false;
9665
9666   if (vr4130_last_insn != 0
9667       && recog_memoized (insn1) >= 0
9668       && recog_memoized (insn2) >= 0)
9669     {
9670       /* See whether INSN1 and INSN2 use different execution units,
9671          or if they are both ALU-type instructions.  If so, they can
9672          probably execute in parallel.  */
9673       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
9674       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
9675       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
9676         {
9677           /* If only one of the instructions has a dependence on
9678              vr4130_last_insn, prefer to schedule the other one first.  */
9679           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
9680           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
9681           if (dep1_p != dep2_p)
9682             return dep1_p;
9683
9684           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
9685              is not an ALU-type instruction and if INSN1 uses the same
9686              execution unit.  (Note that if this condition holds, we already
9687              know that INSN2 uses a different execution unit.)  */
9688           if (class1 != VR4130_CLASS_ALU
9689               && recog_memoized (vr4130_last_insn) >= 0
9690               && class1 == get_attr_vr4130_class (vr4130_last_insn))
9691             return true;
9692         }
9693     }
9694   return false;
9695 }
9696
9697 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
9698    queue with at least two instructions.  Swap the first two if
9699    vr4130_swap_insns_p says that it could be worthwhile.  */
9700
9701 static void
9702 vr4130_reorder (rtx *ready, int nready)
9703 {
9704   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
9705     mips_promote_ready (ready, nready - 2, nready - 1);
9706 }
9707 \f
9708 /* Record whether last 74k AGEN instruction was a load or store.  */
9709 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
9710
9711 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
9712    resets to TYPE_UNKNOWN state.  */
9713
9714 static void
9715 mips_74k_agen_init (rtx insn)
9716 {
9717   if (!insn || !NONJUMP_INSN_P (insn))
9718     mips_last_74k_agen_insn = TYPE_UNKNOWN;
9719   else
9720     {
9721       enum attr_type type = get_attr_type (insn);
9722       if (type == TYPE_LOAD || type == TYPE_STORE)
9723         mips_last_74k_agen_insn = type;
9724     }
9725 }
9726
9727 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
9728    loads to be grouped together, and multiple stores to be grouped
9729    together.  Swap things around in the ready queue to make this happen.  */
9730
9731 static void
9732 mips_74k_agen_reorder (rtx *ready, int nready)
9733 {
9734   int i;
9735   int store_pos, load_pos;
9736
9737   store_pos = -1;
9738   load_pos = -1;
9739
9740   for (i = nready - 1; i >= 0; i--)
9741     {
9742       rtx insn = ready[i];
9743       if (USEFUL_INSN_P (insn))
9744         switch (get_attr_type (insn))
9745           {
9746           case TYPE_STORE:
9747             if (store_pos == -1)
9748               store_pos = i;
9749             break;
9750
9751           case TYPE_LOAD:
9752             if (load_pos == -1)
9753               load_pos = i;
9754             break;
9755
9756           default:
9757             break;
9758           }
9759     }
9760
9761   if (load_pos == -1 || store_pos == -1)
9762     return;
9763
9764   switch (mips_last_74k_agen_insn)
9765     {
9766     case TYPE_UNKNOWN:
9767       /* Prefer to schedule loads since they have a higher latency.  */
9768     case TYPE_LOAD:
9769       /* Swap loads to the front of the queue.  */
9770       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
9771       break;
9772     case TYPE_STORE:
9773       /* Swap stores to the front of the queue.  */
9774       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
9775       break;
9776     default:
9777       break;
9778     }
9779 }
9780 \f
9781 /* Implement TARGET_SCHED_INIT.  */
9782
9783 static void
9784 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9785                  int max_ready ATTRIBUTE_UNUSED)
9786 {
9787   mips_macc_chains_last_hilo = 0;
9788   vr4130_last_insn = 0;
9789   mips_74k_agen_init (NULL_RTX);
9790 }
9791
9792 /* Implement TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
9793
9794 static int
9795 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9796                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
9797 {
9798   if (!reload_completed
9799       && TUNE_MACC_CHAINS
9800       && *nreadyp > 0)
9801     mips_macc_chains_reorder (ready, *nreadyp);
9802
9803   if (reload_completed
9804       && TUNE_MIPS4130
9805       && !TARGET_VR4130_ALIGN
9806       && *nreadyp > 1)
9807     vr4130_reorder (ready, *nreadyp);
9808
9809   if (TUNE_74K)
9810     mips_74k_agen_reorder (ready, *nreadyp);
9811
9812   return mips_issue_rate ();
9813 }
9814
9815 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
9816
9817 static int
9818 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9819                      rtx insn, int more)
9820 {
9821   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
9822   if (USEFUL_INSN_P (insn))
9823     {
9824       more--;
9825       if (!reload_completed && TUNE_MACC_CHAINS)
9826         mips_macc_chains_record (insn);
9827       vr4130_last_insn = insn;
9828       if (TUNE_74K)
9829         mips_74k_agen_init (insn);
9830     }
9831   return more;
9832 }
9833 \f
9834 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
9835    return the first operand of the associated PREF or PREFX insn.  */
9836
9837 rtx
9838 mips_prefetch_cookie (rtx write, rtx locality)
9839 {
9840   /* store_streamed / load_streamed.  */
9841   if (INTVAL (locality) <= 0)
9842     return GEN_INT (INTVAL (write) + 4);
9843
9844   /* store / load.  */
9845   if (INTVAL (locality) <= 2)
9846     return write;
9847
9848   /* store_retained / load_retained.  */
9849   return GEN_INT (INTVAL (write) + 6);
9850 }
9851 \f
9852 /* This structure describes a single built-in function.  */
9853 struct mips_builtin_description {
9854   /* The code of the main .md file instruction.  See mips_builtin_type
9855      for more information.  */
9856   enum insn_code icode;
9857
9858   /* The floating-point comparison code to use with ICODE, if any.  */
9859   enum mips_fp_condition cond;
9860
9861   /* The name of the built-in function.  */
9862   const char *name;
9863
9864   /* Specifies how the function should be expanded.  */
9865   enum mips_builtin_type builtin_type;
9866
9867   /* The function's prototype.  */
9868   enum mips_function_type function_type;
9869
9870   /* The target flags required for this function.  */
9871   int target_flags;
9872 };
9873
9874 /* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_mips_<INSN>.
9875    FUNCTION_TYPE and TARGET_FLAGS are mips_builtin_description fields.  */
9876 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)               \
9877   { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
9878     MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
9879
9880 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
9881    require TARGET_FLAGS.  */
9882 #define CMP_SCALAR_BUILTINS(INSN, COND, TARGET_FLAGS)                   \
9883   { CODE_FOR_mips_ ## INSN ## _cond_s, MIPS_FP_COND_ ## COND,           \
9884     "__builtin_mips_" #INSN "_" #COND "_s",                             \
9885     MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, TARGET_FLAGS },      \
9886   { CODE_FOR_mips_ ## INSN ## _cond_d, MIPS_FP_COND_ ## COND,           \
9887     "__builtin_mips_" #INSN "_" #COND "_d",                             \
9888     MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, TARGET_FLAGS }
9889
9890 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
9891    The lower and upper forms require TARGET_FLAGS while the any and all
9892    forms require MASK_MIPS3D.  */
9893 #define CMP_PS_BUILTINS(INSN, COND, TARGET_FLAGS)                       \
9894   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9895     "__builtin_mips_any_" #INSN "_" #COND "_ps",                        \
9896     MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
9897   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9898     "__builtin_mips_all_" #INSN "_" #COND "_ps",                        \
9899     MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
9900   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9901     "__builtin_mips_lower_" #INSN "_" #COND "_ps",                      \
9902     MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS },   \
9903   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9904     "__builtin_mips_upper_" #INSN "_" #COND "_ps",                      \
9905     MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS }
9906
9907 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
9908    require MASK_MIPS3D.  */
9909 #define CMP_4S_BUILTINS(INSN, COND)                                     \
9910   { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
9911     "__builtin_mips_any_" #INSN "_" #COND "_4s",                        \
9912     MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
9913     MASK_MIPS3D },                                                      \
9914   { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
9915     "__builtin_mips_all_" #INSN "_" #COND "_4s",                        \
9916     MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
9917     MASK_MIPS3D }
9918
9919 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
9920    instruction requires TARGET_FLAGS.  */
9921 #define MOVTF_BUILTINS(INSN, COND, TARGET_FLAGS)                        \
9922   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9923     "__builtin_mips_movt_" #INSN "_" #COND "_ps",                       \
9924     MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
9925     TARGET_FLAGS },                                                     \
9926   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9927     "__builtin_mips_movf_" #INSN "_" #COND "_ps",                       \
9928     MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
9929     TARGET_FLAGS }
9930
9931 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
9932 #define CMP_BUILTINS(COND)                                              \
9933   MOVTF_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                   \
9934   MOVTF_BUILTINS (cabs, COND, MASK_MIPS3D),                             \
9935   CMP_SCALAR_BUILTINS (cabs, COND, MASK_MIPS3D),                        \
9936   CMP_PS_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                  \
9937   CMP_PS_BUILTINS (cabs, COND, MASK_MIPS3D),                            \
9938   CMP_4S_BUILTINS (c, COND),                                            \
9939   CMP_4S_BUILTINS (cabs, COND)
9940
9941 static const struct mips_builtin_description mips_ps_bdesc[] = {
9942   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9943   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9944   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9945   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9946   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, MASK_PAIRED_SINGLE_FLOAT),
9947   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9948   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9949   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
9950
9951   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
9952                   MASK_PAIRED_SINGLE_FLOAT),
9953   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
9954   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
9955   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
9956   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
9957
9958   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
9959   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
9960   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
9961   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
9962   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
9963   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
9964
9965   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
9966   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
9967   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
9968   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
9969   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
9970   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
9971
9972   MIPS_FP_CONDITIONS (CMP_BUILTINS)
9973 };
9974
9975 /* Built-in functions for the SB-1 processor.  */
9976
9977 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
9978
9979 static const struct mips_builtin_description mips_sb1_bdesc[] = {
9980   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT)
9981 };
9982
9983 /* Built-in functions for the DSP ASE.  */
9984
9985 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
9986 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
9987 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
9988 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
9989 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
9990
9991 /* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction
9992    CODE_FOR_mips_<INSN>.  FUNCTION_TYPE and TARGET_FLAGS are
9993    mips_builtin_description fields.  */
9994 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)     \
9995   { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
9996     MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS }
9997
9998 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
9999    branch instruction.  TARGET_FLAGS is a mips_builtin_description field.  */
10000 #define BPOSGE_BUILTIN(VALUE, TARGET_FLAGS)                             \
10001   { CODE_FOR_mips_bposge, 0, "__builtin_mips_bposge" #VALUE,            \
10002     MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, TARGET_FLAGS }
10003
10004 static const struct mips_builtin_description mips_dsp_bdesc[] = {
10005   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10006   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10007   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10008   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10009   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10010   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10011   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10012   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10013   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10014   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10015   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10016   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10017   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10018   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, MASK_DSP),
10019   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, MASK_DSP),
10020   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, MASK_DSP),
10021   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10022   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10023   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10024   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10025   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10026   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10027   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10028   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10029   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10030   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10031   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10032   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10033   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10034   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10035   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10036   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10037   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10038   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10039   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10040   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10041   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10042   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10043   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10044   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10045   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10046   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10047   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10048   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, MASK_DSP),
10049   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10050   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, MASK_DSP),
10051   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, MASK_DSP),
10052   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10053   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10054   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10055   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10056   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10057   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10058   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10059   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10060   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10061   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10062   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10063   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10064   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, MASK_DSP),
10065   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, MASK_DSP),
10066   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10067   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10068   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10069   BPOSGE_BUILTIN (32, MASK_DSP),
10070
10071   /* The following are for the MIPS DSP ASE REV 2.  */
10072   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, MASK_DSPR2),
10073   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10074   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10075   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10076   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10077   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10078   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10079   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10080   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10081   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10082   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10083   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10084   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10085   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10086   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10087   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10088   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
10089   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
10090   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10091   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
10092   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
10093   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSPR2),
10094   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10095   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10096   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10097   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10098   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10099   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10100   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10101   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10102   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10103   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10104   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10105   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2)
10106 };
10107
10108 static const struct mips_builtin_description mips_dsp_32only_bdesc[] = {
10109   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10110   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10111   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10112   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10113   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10114   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10115   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10116   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10117   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10118   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10119   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10120   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10121   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10122   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10123   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10124   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10125   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10126   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10127   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10128   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10129   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10130
10131   /* The following are for the MIPS DSP ASE REV 2.  */
10132   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10133   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10134   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
10135   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
10136   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
10137   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
10138   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10139   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, MASK_DSPR2),
10140   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, MASK_DSPR2),
10141   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10142   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10143   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10144   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10145   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10146   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2)
10147 };
10148
10149 /* This structure describes an array of mips_builtin_description entries.  */
10150 struct mips_bdesc_map {
10151   /* The array that this entry describes.  */
10152   const struct mips_builtin_description *bdesc;
10153
10154   /* The number of entries in BDESC.  */
10155   unsigned int size;
10156
10157   /* The target processor that supports the functions in BDESC.
10158      PROCESSOR_MAX means we enable them for all processors.  */
10159   enum processor_type proc;
10160
10161   /* The functions in BDESC are not supported if any of these
10162      target flags are set.  */
10163   int unsupported_target_flags;
10164 };
10165
10166 /* All MIPS-specific built-in functions.  */
10167 static const struct mips_bdesc_map mips_bdesc_arrays[] = {
10168   { mips_ps_bdesc, ARRAY_SIZE (mips_ps_bdesc), PROCESSOR_MAX, 0 },
10169   { mips_sb1_bdesc, ARRAY_SIZE (mips_sb1_bdesc), PROCESSOR_SB1, 0 },
10170   { mips_dsp_bdesc, ARRAY_SIZE (mips_dsp_bdesc), PROCESSOR_MAX, 0 },
10171   { mips_dsp_32only_bdesc, ARRAY_SIZE (mips_dsp_32only_bdesc),
10172     PROCESSOR_MAX, MASK_64BIT }
10173 };
10174
10175 /* MODE is a vector mode whose elements have type TYPE.  Return the type
10176    of the vector itself.  */
10177
10178 static tree
10179 mips_builtin_vector_type (tree type, enum machine_mode mode)
10180 {
10181   static tree types[(int) MAX_MACHINE_MODE];
10182
10183   if (types[(int) mode] == NULL_TREE)
10184     types[(int) mode] = build_vector_type_for_mode (type, mode);
10185   return types[(int) mode];
10186 }
10187
10188 /* Source-level argument types.  */
10189 #define MIPS_ATYPE_VOID void_type_node
10190 #define MIPS_ATYPE_INT integer_type_node
10191 #define MIPS_ATYPE_POINTER ptr_type_node
10192
10193 /* Standard mode-based argument types.  */
10194 #define MIPS_ATYPE_SI intSI_type_node
10195 #define MIPS_ATYPE_USI unsigned_intSI_type_node
10196 #define MIPS_ATYPE_DI intDI_type_node
10197 #define MIPS_ATYPE_SF float_type_node
10198 #define MIPS_ATYPE_DF double_type_node
10199
10200 /* Vector argument types.  */
10201 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
10202 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
10203 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
10204
10205 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
10206    their associated MIPS_ATYPEs.  */
10207 #define MIPS_FTYPE_ATYPES1(A, B) \
10208   MIPS_ATYPE_##A, MIPS_ATYPE_##B
10209
10210 #define MIPS_FTYPE_ATYPES2(A, B, C) \
10211   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
10212
10213 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
10214   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
10215
10216 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
10217   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
10218   MIPS_ATYPE_##E
10219
10220 /* Return the function type associated with function prototype TYPE.  */
10221
10222 static tree
10223 mips_build_function_type (enum mips_function_type type)
10224 {
10225   static tree types[(int) MIPS_MAX_FTYPE_MAX];
10226
10227   if (types[(int) type] == NULL_TREE)
10228     switch (type)
10229       {
10230 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
10231   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
10232     types[(int) type]                                                   \
10233       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
10234                                   NULL_TREE);                           \
10235     break;
10236 #include "config/mips/mips-ftypes.def"
10237 #undef DEF_MIPS_FTYPE
10238       default:
10239         gcc_unreachable ();
10240       }
10241
10242   return types[(int) type];
10243 }
10244
10245 /* Implement TARGET_INIT_BUILTINS.  */
10246
10247 static void
10248 mips_init_builtins (void)
10249 {
10250   const struct mips_builtin_description *d;
10251   const struct mips_bdesc_map *m;
10252   unsigned int offset;
10253
10254   /* Iterate through all of the bdesc arrays, initializing all of the
10255      builtin functions.  */
10256   offset = 0;
10257   for (m = mips_bdesc_arrays;
10258        m < &mips_bdesc_arrays[ARRAY_SIZE (mips_bdesc_arrays)];
10259        m++)
10260     {
10261       if ((m->proc == PROCESSOR_MAX || m->proc == mips_arch)
10262           && (m->unsupported_target_flags & target_flags) == 0)
10263         for (d = m->bdesc; d < &m->bdesc[m->size]; d++)
10264           if ((d->target_flags & target_flags) == d->target_flags)
10265             add_builtin_function (d->name,
10266                                   mips_build_function_type (d->function_type),
10267                                   d - m->bdesc + offset,
10268                                   BUILT_IN_MD, NULL, NULL);
10269       offset += m->size;
10270     }
10271 }
10272
10273 /* Take argument ARGNO from EXP's argument list and convert it into a
10274    form suitable for input operand OPNO of instruction ICODE.  Return the
10275    value.  */
10276
10277 static rtx
10278 mips_prepare_builtin_arg (enum insn_code icode,
10279                           unsigned int opno, tree exp, unsigned int argno)
10280 {
10281   rtx value;
10282   enum machine_mode mode;
10283
10284   value = expand_normal (CALL_EXPR_ARG (exp, argno));
10285   mode = insn_data[icode].operand[opno].mode;
10286   if (!insn_data[icode].operand[opno].predicate (value, mode))
10287     {
10288       value = copy_to_mode_reg (mode, value);
10289       /* Check the predicate again.  */
10290       if (!insn_data[icode].operand[opno].predicate (value, mode))
10291         {
10292           error ("invalid argument to built-in function");
10293           return const0_rtx;
10294         }
10295     }
10296
10297   return value;
10298 }
10299
10300 /* Return an rtx suitable for output operand OP of instruction ICODE.
10301    If TARGET is non-null, try to use it where possible.  */
10302
10303 static rtx
10304 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
10305 {
10306   enum machine_mode mode;
10307
10308   mode = insn_data[icode].operand[op].mode;
10309   if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
10310     target = gen_reg_rtx (mode);
10311
10312   return target;
10313 }
10314
10315 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
10316    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
10317    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
10318    suggests a good place to put the result.  */
10319
10320 static rtx
10321 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
10322                             bool has_target_p)
10323 {
10324   rtx ops[MAX_RECOG_OPERANDS];
10325   int opno, argno;
10326
10327   /* Map any target to operand 0.  */
10328   opno = 0;
10329   if (has_target_p)
10330     {
10331       ops[opno] = mips_prepare_builtin_target (icode, opno, target);
10332       opno++;
10333     }
10334
10335   /* Map the arguments to the other operands.  The n_operands value
10336      for an expander includes match_dups and match_scratches as well as
10337      match_operands, so n_operands is only an upper bound on the number
10338      of arguments to the expander function.  */
10339   gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands);
10340   for (argno = 0; argno < call_expr_nargs (exp); argno++, opno++)
10341     ops[opno] = mips_prepare_builtin_arg (icode, opno, exp, argno);
10342
10343   switch (opno)
10344     {
10345     case 2:
10346       emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
10347       break;
10348
10349     case 3:
10350       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
10351       break;
10352
10353     case 4:
10354       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
10355       break;
10356
10357     default:
10358       gcc_unreachable ();
10359     }
10360   return target;
10361 }
10362
10363 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
10364    function; TYPE says which.  EXP is the CALL_EXPR that calls the
10365    function, ICODE is the instruction that should be used to compare
10366    the first two arguments, and COND is the condition it should test.
10367    TARGET, if nonnull, suggests a good place to put the result.  */
10368
10369 static rtx
10370 mips_expand_builtin_movtf (enum mips_builtin_type type,
10371                            enum insn_code icode, enum mips_fp_condition cond,
10372                            rtx target, tree exp)
10373 {
10374   rtx cmp_result, op0, op1;
10375
10376   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10377   op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
10378   op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
10379   emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
10380
10381   icode = CODE_FOR_mips_cond_move_tf_ps;
10382   target = mips_prepare_builtin_target (icode, 0, target);
10383   if (type == MIPS_BUILTIN_MOVT)
10384     {
10385       op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
10386       op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
10387     }
10388   else
10389     {
10390       op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
10391       op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
10392     }
10393   emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
10394   return target;
10395 }
10396
10397 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
10398    into TARGET otherwise.  Return TARGET.  */
10399
10400 static rtx
10401 mips_builtin_branch_and_move (rtx condition, rtx target,
10402                               rtx value_if_true, rtx value_if_false)
10403 {
10404   rtx true_label, done_label;
10405
10406   true_label = gen_label_rtx ();
10407   done_label = gen_label_rtx ();
10408
10409   /* First assume that CONDITION is false.  */
10410   mips_emit_move (target, value_if_false);
10411
10412   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
10413   emit_jump_insn (gen_condjump (condition, true_label));
10414   emit_jump_insn (gen_jump (done_label));
10415   emit_barrier ();
10416
10417   /* Fix TARGET if CONDITION is true.  */
10418   emit_label (true_label);
10419   mips_emit_move (target, value_if_true);
10420
10421   emit_label (done_label);
10422   return target;
10423 }
10424
10425 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
10426    the CALL_EXPR that calls the function, ICODE is the code of the
10427    comparison instruction, and COND is the condition it should test.
10428    TARGET, if nonnull, suggests a good place to put the boolean result.  */
10429
10430 static rtx
10431 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
10432                              enum insn_code icode, enum mips_fp_condition cond,
10433                              rtx target, tree exp)
10434 {
10435   rtx offset, condition, cmp_result, args[MAX_RECOG_OPERANDS];
10436   int argno;
10437
10438   if (target == 0 || GET_MODE (target) != SImode)
10439     target = gen_reg_rtx (SImode);
10440
10441   /* The instruction should have a target operand, an operand for each
10442      argument, and an operand for COND.  */
10443   gcc_assert (call_expr_nargs (exp) + 2 == insn_data[icode].n_operands);
10444
10445   /* Prepare the operands to the comparison.  */
10446   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10447   for (argno = 0; argno < call_expr_nargs (exp); argno++)
10448     args[argno] = mips_prepare_builtin_arg (icode, argno + 1, exp, argno);
10449
10450   switch (insn_data[icode].n_operands)
10451     {
10452     case 4:
10453       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
10454                                   GEN_INT (cond)));
10455       break;
10456
10457     case 6:
10458       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
10459                                   args[2], args[3], GEN_INT (cond)));
10460       break;
10461
10462     default:
10463       gcc_unreachable ();
10464     }
10465
10466   /* If the comparison sets more than one register, we define the result
10467      to be 0 if all registers are false and -1 if all registers are true.
10468      The value of the complete result is indeterminate otherwise.  */
10469   switch (builtin_type)
10470     {
10471     case MIPS_BUILTIN_CMP_ALL:
10472       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
10473       return mips_builtin_branch_and_move (condition, target,
10474                                            const0_rtx, const1_rtx);
10475
10476     case MIPS_BUILTIN_CMP_UPPER:
10477     case MIPS_BUILTIN_CMP_LOWER:
10478       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
10479       condition = gen_single_cc (cmp_result, offset);
10480       return mips_builtin_branch_and_move (condition, target,
10481                                            const1_rtx, const0_rtx);
10482
10483     default:
10484       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
10485       return mips_builtin_branch_and_move (condition, target,
10486                                            const1_rtx, const0_rtx);
10487     }
10488 }
10489
10490 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
10491    if nonnull, suggests a good place to put the boolean result.  */
10492
10493 static rtx
10494 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
10495 {
10496   rtx condition, cmp_result;
10497   int cmp_value;
10498
10499   if (target == 0 || GET_MODE (target) != SImode)
10500     target = gen_reg_rtx (SImode);
10501
10502   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
10503
10504   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
10505     cmp_value = 32;
10506   else
10507     gcc_assert (0);
10508
10509   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
10510   return mips_builtin_branch_and_move (condition, target,
10511                                        const1_rtx, const0_rtx);
10512 }
10513
10514 /* EXP is a CALL_EXPR that calls the function described by BDESC.
10515    Expand the call and return an rtx for its return value.
10516    TARGET, if nonnull, suggests a good place to put this value.  */
10517
10518 static rtx
10519 mips_expand_builtin_1 (const struct mips_builtin_description *bdesc,
10520                        tree exp, rtx target)
10521 {
10522   switch (bdesc->builtin_type)
10523     {
10524     case MIPS_BUILTIN_DIRECT:
10525       return mips_expand_builtin_direct (bdesc->icode, target, exp, true);
10526
10527     case MIPS_BUILTIN_DIRECT_NO_TARGET:
10528       return mips_expand_builtin_direct (bdesc->icode, target, exp, false);
10529
10530     case MIPS_BUILTIN_MOVT:
10531     case MIPS_BUILTIN_MOVF:
10532       return mips_expand_builtin_movtf (bdesc->builtin_type, bdesc->icode,
10533                                         bdesc->cond, target, exp);
10534
10535     case MIPS_BUILTIN_CMP_ANY:
10536     case MIPS_BUILTIN_CMP_ALL:
10537     case MIPS_BUILTIN_CMP_UPPER:
10538     case MIPS_BUILTIN_CMP_LOWER:
10539     case MIPS_BUILTIN_CMP_SINGLE:
10540       return mips_expand_builtin_compare (bdesc->builtin_type, bdesc->icode,
10541                                           bdesc->cond, target, exp);
10542
10543     case MIPS_BUILTIN_BPOSGE32:
10544       return mips_expand_builtin_bposge (bdesc->builtin_type, target);
10545     }
10546   gcc_unreachable ();
10547 }
10548
10549 /* Implement TARGET_EXPAND_BUILTIN.  */
10550
10551 static rtx
10552 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
10553                      enum machine_mode mode ATTRIBUTE_UNUSED,
10554                      int ignore ATTRIBUTE_UNUSED)
10555 {
10556   tree fndecl;
10557   unsigned int fcode;
10558   const struct mips_bdesc_map *m;
10559
10560   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10561   fcode = DECL_FUNCTION_CODE (fndecl);
10562   if (TARGET_MIPS16)
10563     {
10564       error ("built-in function %qs not supported for MIPS16",
10565              IDENTIFIER_POINTER (DECL_NAME (fndecl)));
10566       return const0_rtx;
10567     }
10568
10569   for (m = mips_bdesc_arrays;
10570        m < &mips_bdesc_arrays[ARRAY_SIZE (mips_bdesc_arrays)];
10571        m++)
10572     {
10573       if (fcode < m->size)
10574         return mips_expand_builtin_1 (m->bdesc + fcode, exp, target);
10575       fcode -= m->size;
10576     }
10577   gcc_unreachable ();
10578 }
10579 \f
10580 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
10581    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
10582 struct mips16_constant {
10583   struct mips16_constant *next;
10584   rtx value;
10585   rtx label;
10586   enum machine_mode mode;
10587 };
10588
10589 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
10590    first constant, HIGHEST_ADDRESS is the highest address that the first
10591    byte of the pool can have, and INSN_ADDRESS is the current instruction
10592    address.  */
10593 struct mips16_constant_pool {
10594   struct mips16_constant *first;
10595   int highest_address;
10596   int insn_address;
10597 };
10598
10599 /* Add constant VALUE to POOL and return its label.  MODE is the
10600    value's mode (used for CONST_INTs, etc.).  */
10601
10602 static rtx
10603 mips16_add_constant (struct mips16_constant_pool *pool,
10604                      rtx value, enum machine_mode mode)
10605 {
10606   struct mips16_constant **p, *c;
10607   bool first_of_size_p;
10608
10609   /* See whether the constant is already in the pool.  If so, return the
10610      existing label, otherwise leave P pointing to the place where the
10611      constant should be added.
10612
10613      Keep the pool sorted in increasing order of mode size so that we can
10614      reduce the number of alignments needed.  */
10615   first_of_size_p = true;
10616   for (p = &pool->first; *p != 0; p = &(*p)->next)
10617     {
10618       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
10619         return (*p)->label;
10620       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
10621         break;
10622       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
10623         first_of_size_p = false;
10624     }
10625
10626   /* In the worst case, the constant needed by the earliest instruction
10627      will end up at the end of the pool.  The entire pool must then be
10628      accessible from that instruction.
10629
10630      When adding the first constant, set the pool's highest address to
10631      the address of the first out-of-range byte.  Adjust this address
10632      downwards each time a new constant is added.  */
10633   if (pool->first == 0)
10634     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
10635        of the instruction with the lowest two bits clear.  The base PC
10636        value for LDPC has the lowest three bits clear.  Assume the worst
10637        case here; namely that the PC-relative instruction occupies the
10638        last 2 bytes in an aligned word.  */
10639     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
10640   pool->highest_address -= GET_MODE_SIZE (mode);
10641   if (first_of_size_p)
10642     /* Take into account the worst possible padding due to alignment.  */
10643     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
10644
10645   /* Create a new entry.  */
10646   c = XNEW (struct mips16_constant);
10647   c->value = value;
10648   c->mode = mode;
10649   c->label = gen_label_rtx ();
10650   c->next = *p;
10651   *p = c;
10652
10653   return c->label;
10654 }
10655
10656 /* Output constant VALUE after instruction INSN and return the last
10657    instruction emitted.  MODE is the mode of the constant.  */
10658
10659 static rtx
10660 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
10661 {
10662   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
10663     {
10664       rtx size = GEN_INT (GET_MODE_SIZE (mode));
10665       return emit_insn_after (gen_consttable_int (value, size), insn);
10666     }
10667
10668   if (SCALAR_FLOAT_MODE_P (mode))
10669     return emit_insn_after (gen_consttable_float (value), insn);
10670
10671   if (VECTOR_MODE_P (mode))
10672     {
10673       int i;
10674
10675       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
10676         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
10677                                         CONST_VECTOR_ELT (value, i), insn);
10678       return insn;
10679     }
10680
10681   gcc_unreachable ();
10682 }
10683
10684 /* Dump out the constants in CONSTANTS after INSN.  */
10685
10686 static void
10687 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
10688 {
10689   struct mips16_constant *c, *next;
10690   int align;
10691
10692   align = 0;
10693   for (c = constants; c != NULL; c = next)
10694     {
10695       /* If necessary, increase the alignment of PC.  */
10696       if (align < GET_MODE_SIZE (c->mode))
10697         {
10698           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
10699           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
10700         }
10701       align = GET_MODE_SIZE (c->mode);
10702
10703       insn = emit_label_after (c->label, insn);
10704       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
10705
10706       next = c->next;
10707       free (c);
10708     }
10709
10710   emit_barrier_after (insn);
10711 }
10712
10713 /* Return the length of instruction INSN.  */
10714
10715 static int
10716 mips16_insn_length (rtx insn)
10717 {
10718   if (JUMP_P (insn))
10719     {
10720       rtx body = PATTERN (insn);
10721       if (GET_CODE (body) == ADDR_VEC)
10722         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
10723       if (GET_CODE (body) == ADDR_DIFF_VEC)
10724         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
10725     }
10726   return get_attr_length (insn);
10727 }
10728
10729 /* If *X is a symbolic constant that refers to the constant pool, add
10730    the constant to POOL and rewrite *X to use the constant's label.  */
10731
10732 static void
10733 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
10734 {
10735   rtx base, offset, label;
10736
10737   split_const (*x, &base, &offset);
10738   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
10739     {
10740       label = mips16_add_constant (pool, get_pool_constant (base),
10741                                    get_pool_mode (base));
10742       base = gen_rtx_LABEL_REF (Pmode, label);
10743       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
10744     }
10745 }
10746
10747 /* This structure is used to communicate with mips16_rewrite_pool_refs.
10748    INSN is the instruction we're rewriting and POOL points to the current
10749    constant pool.  */
10750 struct mips16_rewrite_pool_refs_info {
10751   rtx insn;
10752   struct mips16_constant_pool *pool;
10753 };
10754
10755 /* Rewrite *X so that constant pool references refer to the constant's
10756    label instead.  DATA points to a mips16_rewrite_pool_refs_info
10757    structure.  */
10758
10759 static int
10760 mips16_rewrite_pool_refs (rtx *x, void *data)
10761 {
10762   struct mips16_rewrite_pool_refs_info *info = data;
10763
10764   if (force_to_mem_operand (*x, Pmode))
10765     {
10766       rtx mem = force_const_mem (GET_MODE (*x), *x);
10767       validate_change (info->insn, x, mem, false);
10768     }
10769
10770   if (MEM_P (*x))
10771     {
10772       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
10773       return -1;
10774     }
10775
10776   if (TARGET_MIPS16_TEXT_LOADS)
10777     mips16_rewrite_pool_constant (info->pool, x);
10778
10779   return GET_CODE (*x) == CONST ? -1 : 0;
10780 }
10781
10782 /* Build MIPS16 constant pools.  */
10783
10784 static void
10785 mips16_lay_out_constants (void)
10786 {
10787   struct mips16_constant_pool pool;
10788   struct mips16_rewrite_pool_refs_info info;
10789   rtx insn, barrier;
10790
10791   if (!TARGET_MIPS16_PCREL_LOADS)
10792     return;
10793
10794   barrier = 0;
10795   memset (&pool, 0, sizeof (pool));
10796   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
10797     {
10798       /* Rewrite constant pool references in INSN.  */
10799       if (INSN_P (insn))
10800         {
10801           info.insn = insn;
10802           info.pool = &pool;
10803           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
10804         }
10805
10806       pool.insn_address += mips16_insn_length (insn);
10807
10808       if (pool.first != NULL)
10809         {
10810           /* If there are no natural barriers between the first user of
10811              the pool and the highest acceptable address, we'll need to
10812              create a new instruction to jump around the constant pool.
10813              In the worst case, this instruction will be 4 bytes long.
10814
10815              If it's too late to do this transformation after INSN,
10816              do it immediately before INSN.  */
10817           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
10818             {
10819               rtx label, jump;
10820
10821               label = gen_label_rtx ();
10822
10823               jump = emit_jump_insn_before (gen_jump (label), insn);
10824               JUMP_LABEL (jump) = label;
10825               LABEL_NUSES (label) = 1;
10826               barrier = emit_barrier_after (jump);
10827
10828               emit_label_after (label, barrier);
10829               pool.insn_address += 4;
10830             }
10831
10832           /* See whether the constant pool is now out of range of the first
10833              user.  If so, output the constants after the previous barrier.
10834              Note that any instructions between BARRIER and INSN (inclusive)
10835              will use negative offsets to refer to the pool.  */
10836           if (pool.insn_address > pool.highest_address)
10837             {
10838               mips16_emit_constants (pool.first, barrier);
10839               pool.first = NULL;
10840               barrier = 0;
10841             }
10842           else if (BARRIER_P (insn))
10843             barrier = insn;
10844         }
10845     }
10846   mips16_emit_constants (pool.first, get_last_insn ());
10847 }
10848 \f
10849 /* A temporary variable used by for_each_rtx callbacks, etc.  */
10850 static rtx mips_sim_insn;
10851
10852 /* A structure representing the state of the processor pipeline.
10853    Used by the mips_sim_* family of functions.  */
10854 struct mips_sim {
10855   /* The maximum number of instructions that can be issued in a cycle.
10856      (Caches mips_issue_rate.)  */
10857   unsigned int issue_rate;
10858
10859   /* The current simulation time.  */
10860   unsigned int time;
10861
10862   /* How many more instructions can be issued in the current cycle.  */
10863   unsigned int insns_left;
10864
10865   /* LAST_SET[X].INSN is the last instruction to set register X.
10866      LAST_SET[X].TIME is the time at which that instruction was issued.
10867      INSN is null if no instruction has yet set register X.  */
10868   struct {
10869     rtx insn;
10870     unsigned int time;
10871   } last_set[FIRST_PSEUDO_REGISTER];
10872
10873   /* The pipeline's current DFA state.  */
10874   state_t dfa_state;
10875 };
10876
10877 /* Reset STATE to the initial simulation state.  */
10878
10879 static void
10880 mips_sim_reset (struct mips_sim *state)
10881 {
10882   state->time = 0;
10883   state->insns_left = state->issue_rate;
10884   memset (&state->last_set, 0, sizeof (state->last_set));
10885   state_reset (state->dfa_state);
10886 }
10887
10888 /* Initialize STATE before its first use.  DFA_STATE points to an
10889    allocated but uninitialized DFA state.  */
10890
10891 static void
10892 mips_sim_init (struct mips_sim *state, state_t dfa_state)
10893 {
10894   state->issue_rate = mips_issue_rate ();
10895   state->dfa_state = dfa_state;
10896   mips_sim_reset (state);
10897 }
10898
10899 /* Advance STATE by one clock cycle.  */
10900
10901 static void
10902 mips_sim_next_cycle (struct mips_sim *state)
10903 {
10904   state->time++;
10905   state->insns_left = state->issue_rate;
10906   state_transition (state->dfa_state, 0);
10907 }
10908
10909 /* Advance simulation state STATE until instruction INSN can read
10910    register REG.  */
10911
10912 static void
10913 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
10914 {
10915   unsigned int regno, end_regno;
10916
10917   end_regno = END_REGNO (reg);
10918   for (regno = REGNO (reg); regno < end_regno; regno++)
10919     if (state->last_set[regno].insn != 0)
10920       {
10921         unsigned int t;
10922
10923         t = (state->last_set[regno].time
10924              + insn_latency (state->last_set[regno].insn, insn));
10925         while (state->time < t)
10926           mips_sim_next_cycle (state);
10927     }
10928 }
10929
10930 /* A for_each_rtx callback.  If *X is a register, advance simulation state
10931    DATA until mips_sim_insn can read the register's value.  */
10932
10933 static int
10934 mips_sim_wait_regs_2 (rtx *x, void *data)
10935 {
10936   if (REG_P (*x))
10937     mips_sim_wait_reg (data, mips_sim_insn, *x);
10938   return 0;
10939 }
10940
10941 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
10942
10943 static void
10944 mips_sim_wait_regs_1 (rtx *x, void *data)
10945 {
10946   for_each_rtx (x, mips_sim_wait_regs_2, data);
10947 }
10948
10949 /* Advance simulation state STATE until all of INSN's register
10950    dependencies are satisfied.  */
10951
10952 static void
10953 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
10954 {
10955   mips_sim_insn = insn;
10956   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
10957 }
10958
10959 /* Advance simulation state STATE until the units required by
10960    instruction INSN are available.  */
10961
10962 static void
10963 mips_sim_wait_units (struct mips_sim *state, rtx insn)
10964 {
10965   state_t tmp_state;
10966
10967   tmp_state = alloca (state_size ());
10968   while (state->insns_left == 0
10969          || (memcpy (tmp_state, state->dfa_state, state_size ()),
10970              state_transition (tmp_state, insn) >= 0))
10971     mips_sim_next_cycle (state);
10972 }
10973
10974 /* Advance simulation state STATE until INSN is ready to issue.  */
10975
10976 static void
10977 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
10978 {
10979   mips_sim_wait_regs (state, insn);
10980   mips_sim_wait_units (state, insn);
10981 }
10982
10983 /* mips_sim_insn has just set X.  Update the LAST_SET array
10984    in simulation state DATA.  */
10985
10986 static void
10987 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
10988 {
10989   struct mips_sim *state;
10990
10991   state = data;
10992   if (REG_P (x))
10993     {
10994       unsigned int regno, end_regno;
10995
10996       end_regno = END_REGNO (x);
10997       for (regno = REGNO (x); regno < end_regno; regno++)
10998         {
10999           state->last_set[regno].insn = mips_sim_insn;
11000           state->last_set[regno].time = state->time;
11001         }
11002     }
11003 }
11004
11005 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
11006    can issue immediately (i.e., that mips_sim_wait_insn has already
11007    been called).  */
11008
11009 static void
11010 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
11011 {
11012   state_transition (state->dfa_state, insn);
11013   state->insns_left--;
11014
11015   mips_sim_insn = insn;
11016   note_stores (PATTERN (insn), mips_sim_record_set, state);
11017 }
11018
11019 /* Simulate issuing a NOP in state STATE.  */
11020
11021 static void
11022 mips_sim_issue_nop (struct mips_sim *state)
11023 {
11024   if (state->insns_left == 0)
11025     mips_sim_next_cycle (state);
11026   state->insns_left--;
11027 }
11028
11029 /* Update simulation state STATE so that it's ready to accept the instruction
11030    after INSN.  INSN should be part of the main rtl chain, not a member of a
11031    SEQUENCE.  */
11032
11033 static void
11034 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
11035 {
11036   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
11037   if (JUMP_P (insn))
11038     mips_sim_issue_nop (state);
11039
11040   switch (GET_CODE (SEQ_BEGIN (insn)))
11041     {
11042     case CODE_LABEL:
11043     case CALL_INSN:
11044       /* We can't predict the processor state after a call or label.  */
11045       mips_sim_reset (state);
11046       break;
11047
11048     case JUMP_INSN:
11049       /* The delay slots of branch likely instructions are only executed
11050          when the branch is taken.  Therefore, if the caller has simulated
11051          the delay slot instruction, STATE does not really reflect the state
11052          of the pipeline for the instruction after the delay slot.  Also,
11053          branch likely instructions tend to incur a penalty when not taken,
11054          so there will probably be an extra delay between the branch and
11055          the instruction after the delay slot.  */
11056       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
11057         mips_sim_reset (state);
11058       break;
11059
11060     default:
11061       break;
11062     }
11063 }
11064 \f
11065 /* The VR4130 pipeline issues aligned pairs of instructions together,
11066    but it stalls the second instruction if it depends on the first.
11067    In order to cut down the amount of logic required, this dependence
11068    check is not based on a full instruction decode.  Instead, any non-SPECIAL
11069    instruction is assumed to modify the register specified by bits 20-16
11070    (which is usually the "rt" field).
11071
11072    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
11073    input, so we can end up with a false dependence between the branch
11074    and its delay slot.  If this situation occurs in instruction INSN,
11075    try to avoid it by swapping rs and rt.  */
11076
11077 static void
11078 vr4130_avoid_branch_rt_conflict (rtx insn)
11079 {
11080   rtx first, second;
11081
11082   first = SEQ_BEGIN (insn);
11083   second = SEQ_END (insn);
11084   if (JUMP_P (first)
11085       && NONJUMP_INSN_P (second)
11086       && GET_CODE (PATTERN (first)) == SET
11087       && GET_CODE (SET_DEST (PATTERN (first))) == PC
11088       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
11089     {
11090       /* Check for the right kind of condition.  */
11091       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
11092       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
11093           && REG_P (XEXP (cond, 0))
11094           && REG_P (XEXP (cond, 1))
11095           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
11096           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
11097         {
11098           /* SECOND mentions the rt register but not the rs register.  */
11099           rtx tmp = XEXP (cond, 0);
11100           XEXP (cond, 0) = XEXP (cond, 1);
11101           XEXP (cond, 1) = tmp;
11102         }
11103     }
11104 }
11105
11106 /* Implement -mvr4130-align.  Go through each basic block and simulate the
11107    processor pipeline.  If we find that a pair of instructions could execute
11108    in parallel, and the first of those instructions is not 8-byte aligned,
11109    insert a nop to make it aligned.  */
11110
11111 static void
11112 vr4130_align_insns (void)
11113 {
11114   struct mips_sim state;
11115   rtx insn, subinsn, last, last2, next;
11116   bool aligned_p;
11117
11118   dfa_start ();
11119
11120   /* LAST is the last instruction before INSN to have a nonzero length.
11121      LAST2 is the last such instruction before LAST.  */
11122   last = 0;
11123   last2 = 0;
11124
11125   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
11126   aligned_p = true;
11127
11128   mips_sim_init (&state, alloca (state_size ()));
11129   for (insn = get_insns (); insn != 0; insn = next)
11130     {
11131       unsigned int length;
11132
11133       next = NEXT_INSN (insn);
11134
11135       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
11136          This isn't really related to the alignment pass, but we do it on
11137          the fly to avoid a separate instruction walk.  */
11138       vr4130_avoid_branch_rt_conflict (insn);
11139
11140       if (USEFUL_INSN_P (insn))
11141         FOR_EACH_SUBINSN (subinsn, insn)
11142           {
11143             mips_sim_wait_insn (&state, subinsn);
11144
11145             /* If we want this instruction to issue in parallel with the
11146                previous one, make sure that the previous instruction is
11147                aligned.  There are several reasons why this isn't worthwhile
11148                when the second instruction is a call:
11149
11150                   - Calls are less likely to be performance critical,
11151                   - There's a good chance that the delay slot can execute
11152                     in parallel with the call.
11153                   - The return address would then be unaligned.
11154
11155                In general, if we're going to insert a nop between instructions
11156                X and Y, it's better to insert it immediately after X.  That
11157                way, if the nop makes Y aligned, it will also align any labels
11158                between X and Y.  */
11159             if (state.insns_left != state.issue_rate
11160                 && !CALL_P (subinsn))
11161               {
11162                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
11163                   {
11164                     /* SUBINSN is the first instruction in INSN and INSN is
11165                        aligned.  We want to align the previous instruction
11166                        instead, so insert a nop between LAST2 and LAST.
11167
11168                        Note that LAST could be either a single instruction
11169                        or a branch with a delay slot.  In the latter case,
11170                        LAST, like INSN, is already aligned, but the delay
11171                        slot must have some extra delay that stops it from
11172                        issuing at the same time as the branch.  We therefore
11173                        insert a nop before the branch in order to align its
11174                        delay slot.  */
11175                     emit_insn_after (gen_nop (), last2);
11176                     aligned_p = false;
11177                   }
11178                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
11179                   {
11180                     /* SUBINSN is the delay slot of INSN, but INSN is
11181                        currently unaligned.  Insert a nop between
11182                        LAST and INSN to align it.  */
11183                     emit_insn_after (gen_nop (), last);
11184                     aligned_p = true;
11185                   }
11186               }
11187             mips_sim_issue_insn (&state, subinsn);
11188           }
11189       mips_sim_finish_insn (&state, insn);
11190
11191       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
11192       length = get_attr_length (insn);
11193       if (length > 0)
11194         {
11195           /* If the instruction is an asm statement or multi-instruction
11196              mips.md patern, the length is only an estimate.  Insert an
11197              8 byte alignment after it so that the following instructions
11198              can be handled correctly.  */
11199           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
11200               && (recog_memoized (insn) < 0 || length >= 8))
11201             {
11202               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
11203               next = NEXT_INSN (next);
11204               mips_sim_next_cycle (&state);
11205               aligned_p = true;
11206             }
11207           else if (length & 4)
11208             aligned_p = !aligned_p;
11209           last2 = last;
11210           last = insn;
11211         }
11212
11213       /* See whether INSN is an aligned label.  */
11214       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
11215         aligned_p = true;
11216     }
11217   dfa_finish ();
11218 }
11219 \f
11220 /* This structure records that the current function has a LO_SUM
11221    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
11222    the largest offset applied to BASE by all such LO_SUMs.  */
11223 struct mips_lo_sum_offset {
11224   rtx base;
11225   HOST_WIDE_INT offset;
11226 };
11227
11228 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
11229
11230 static hashval_t
11231 mips_hash_base (rtx base)
11232 {
11233   int do_not_record_p;
11234
11235   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
11236 }
11237
11238 /* Hash-table callbacks for mips_lo_sum_offsets.  */
11239
11240 static hashval_t
11241 mips_lo_sum_offset_hash (const void *entry)
11242 {
11243   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
11244 }
11245
11246 static int
11247 mips_lo_sum_offset_eq (const void *entry, const void *value)
11248 {
11249   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
11250                       (const_rtx) value);
11251 }
11252
11253 /* Look up symbolic constant X in HTAB, which is a hash table of
11254    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
11255    paired with a recorded LO_SUM, otherwise record X in the table.  */
11256
11257 static bool
11258 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
11259 {
11260   rtx base, offset;
11261   void **slot;
11262   struct mips_lo_sum_offset *entry;
11263
11264   /* Split X into a base and offset.  */
11265   split_const (x, &base, &offset);
11266   if (UNSPEC_ADDRESS_P (base))
11267     base = UNSPEC_ADDRESS (base);
11268
11269   /* Look up the base in the hash table.  */
11270   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
11271   if (slot == NULL)
11272     return false;
11273
11274   entry = (struct mips_lo_sum_offset *) *slot;
11275   if (option == INSERT)
11276     {
11277       if (entry == NULL)
11278         {
11279           entry = XNEW (struct mips_lo_sum_offset);
11280           entry->base = base;
11281           entry->offset = INTVAL (offset);
11282           *slot = entry;
11283         }
11284       else
11285         {
11286           if (INTVAL (offset) > entry->offset)
11287             entry->offset = INTVAL (offset);
11288         }
11289     }
11290   return INTVAL (offset) <= entry->offset;
11291 }
11292
11293 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
11294    Record every LO_SUM in *LOC.  */
11295
11296 static int
11297 mips_record_lo_sum (rtx *loc, void *data)
11298 {
11299   if (GET_CODE (*loc) == LO_SUM)
11300     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
11301   return 0;
11302 }
11303
11304 /* Return true if INSN is a SET of an orphaned high-part relocation.
11305    HTAB is a hash table of mips_lo_sum_offsets that describes all the
11306    LO_SUMs in the current function.  */
11307
11308 static bool
11309 mips_orphaned_high_part_p (htab_t htab, rtx insn)
11310 {
11311   enum mips_symbol_type type;
11312   rtx x, set;
11313
11314   set = single_set (insn);
11315   if (set)
11316     {
11317       /* Check for %his.  */
11318       x = SET_SRC (set);
11319       if (GET_CODE (x) == HIGH
11320           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
11321         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
11322
11323       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
11324       if (GET_CODE (x) == UNSPEC
11325           && XINT (x, 1) == UNSPEC_LOAD_GOT
11326           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
11327                                        SYMBOL_CONTEXT_LEA, &type)
11328           && type == SYMBOL_GOTOFF_PAGE)
11329         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
11330     }
11331   return false;
11332 }
11333
11334 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
11335    INSN and a previous instruction, avoid it by inserting nops after
11336    instruction AFTER.
11337
11338    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
11339    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
11340    before using the value of that register.  *HILO_DELAY counts the
11341    number of instructions since the last hilo hazard (that is,
11342    the number of instructions since the last MFLO or MFHI).
11343
11344    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
11345    for the next instruction.
11346
11347    LO_REG is an rtx for the LO register, used in dependence checking.  */
11348
11349 static void
11350 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
11351                    rtx *delayed_reg, rtx lo_reg)
11352 {
11353   rtx pattern, set;
11354   int nops, ninsns, hazard_set;
11355
11356   pattern = PATTERN (insn);
11357
11358   /* Do not put the whole function in .set noreorder if it contains
11359      an asm statement.  We don't know whether there will be hazards
11360      between the asm statement and the gcc-generated code.  */
11361   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
11362     cfun->machine->all_noreorder_p = false;
11363
11364   /* Ignore zero-length instructions (barriers and the like).  */
11365   ninsns = get_attr_length (insn) / 4;
11366   if (ninsns == 0)
11367     return;
11368
11369   /* Work out how many nops are needed.  Note that we only care about
11370      registers that are explicitly mentioned in the instruction's pattern.
11371      It doesn't matter that calls use the argument registers or that they
11372      clobber hi and lo.  */
11373   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
11374     nops = 2 - *hilo_delay;
11375   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
11376     nops = 1;
11377   else
11378     nops = 0;
11379
11380   /* Insert the nops between this instruction and the previous one.
11381      Each new nop takes us further from the last hilo hazard.  */
11382   *hilo_delay += nops;
11383   while (nops-- > 0)
11384     emit_insn_after (gen_hazard_nop (), after);
11385
11386   /* Set up the state for the next instruction.  */
11387   *hilo_delay += ninsns;
11388   *delayed_reg = 0;
11389   if (INSN_CODE (insn) >= 0)
11390     switch (get_attr_hazard (insn))
11391       {
11392       case HAZARD_NONE:
11393         break;
11394
11395       case HAZARD_HILO:
11396         *hilo_delay = 0;
11397         break;
11398
11399       case HAZARD_DELAY:
11400         hazard_set = (int) get_attr_hazard_set (insn);
11401         if (hazard_set == 0)
11402           set = single_set (insn);
11403         else
11404           {
11405             gcc_assert (GET_CODE (PATTERN (insn)) == PARALLEL);
11406             set = XVECEXP (PATTERN (insn), 0, hazard_set - 1);
11407           }
11408         gcc_assert (set && GET_CODE (set) == SET);
11409         *delayed_reg = SET_DEST (set);
11410         break;
11411       }
11412 }
11413
11414 /* Go through the instruction stream and insert nops where necessary.
11415    Also delete any high-part relocations whose partnering low parts
11416    are now all dead.  See if the whole function can then be put into
11417    .set noreorder and .set nomacro.  */
11418
11419 static void
11420 mips_reorg_process_insns (void)
11421 {
11422   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
11423   int hilo_delay;
11424   htab_t htab;
11425
11426   /* Force all instructions to be split into their final form.  */
11427   split_all_insns_noflow ();
11428
11429   /* Recalculate instruction lengths without taking nops into account.  */
11430   cfun->machine->ignore_hazard_length_p = true;
11431   shorten_branches (get_insns ());
11432
11433   cfun->machine->all_noreorder_p = true;
11434
11435   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
11436   if (!TARGET_EXPLICIT_RELOCS)
11437     cfun->machine->all_noreorder_p = false;
11438
11439   /* Profiled functions can't be all noreorder because the profiler
11440      support uses assembler macros.  */
11441   if (current_function_profile)
11442     cfun->machine->all_noreorder_p = false;
11443
11444   /* Code compiled with -mfix-vr4120 can't be all noreorder because
11445      we rely on the assembler to work around some errata.  */
11446   if (TARGET_FIX_VR4120)
11447     cfun->machine->all_noreorder_p = false;
11448
11449   /* The same is true for -mfix-vr4130 if we might generate MFLO or
11450      MFHI instructions.  Note that we avoid using MFLO and MFHI if
11451      the VR4130 MACC and DMACC instructions are available instead;
11452      see the *mfhilo_{si,di}_macc patterns.  */
11453   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
11454     cfun->machine->all_noreorder_p = false;
11455
11456   htab = htab_create (37, mips_lo_sum_offset_hash,
11457                       mips_lo_sum_offset_eq, free);
11458
11459   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
11460   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
11461     FOR_EACH_SUBINSN (subinsn, insn)
11462       if (INSN_P (subinsn))
11463         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
11464
11465   last_insn = 0;
11466   hilo_delay = 2;
11467   delayed_reg = 0;
11468   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
11469
11470   /* Make a second pass over the instructions.  Delete orphaned
11471      high-part relocations or turn them into NOPs.  Avoid hazards
11472      by inserting NOPs.  */
11473   for (insn = get_insns (); insn != 0; insn = next_insn)
11474     {
11475       next_insn = NEXT_INSN (insn);
11476       if (INSN_P (insn))
11477         {
11478           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
11479             {
11480               /* If we find an orphaned high-part relocation in a delay
11481                  slot, it's easier to turn that instruction into a NOP than
11482                  to delete it.  The delay slot will be a NOP either way.  */
11483               FOR_EACH_SUBINSN (subinsn, insn)
11484                 if (INSN_P (subinsn))
11485                   {
11486                     if (mips_orphaned_high_part_p (htab, subinsn))
11487                       {
11488                         PATTERN (subinsn) = gen_nop ();
11489                         INSN_CODE (subinsn) = CODE_FOR_nop;
11490                       }
11491                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
11492                                        &delayed_reg, lo_reg);
11493                   }
11494               last_insn = insn;
11495             }
11496           else
11497             {
11498               /* INSN is a single instruction.  Delete it if it's an
11499                  orphaned high-part relocation.  */
11500               if (mips_orphaned_high_part_p (htab, insn))
11501                 delete_insn (insn);
11502               else
11503                 {
11504                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
11505                                      &delayed_reg, lo_reg);
11506                   last_insn = insn;
11507                 }
11508             }
11509         }
11510     }
11511
11512   htab_delete (htab);
11513 }
11514
11515 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
11516
11517 static void
11518 mips_reorg (void)
11519 {
11520   mips16_lay_out_constants ();
11521   if (mips_base_delayed_branch)
11522     dbr_schedule (get_insns ());
11523   mips_reorg_process_insns ();
11524   if (TARGET_EXPLICIT_RELOCS && TUNE_MIPS4130 && TARGET_VR4130_ALIGN)
11525     vr4130_align_insns ();
11526 }
11527 \f
11528 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
11529    in order to avoid duplicating too much logic from elsewhere.  */
11530
11531 static void
11532 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
11533                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
11534                       tree function)
11535 {
11536   rtx this, temp1, temp2, insn, fnaddr;
11537   bool use_sibcall_p;
11538
11539   /* Pretend to be a post-reload pass while generating rtl.  */
11540   reload_completed = 1;
11541
11542   /* Mark the end of the (empty) prologue.  */
11543   emit_note (NOTE_INSN_PROLOGUE_END);
11544
11545   /* Determine if we can use a sibcall to call FUNCTION directly.  */
11546   fnaddr = XEXP (DECL_RTL (function), 0);
11547   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
11548                    && const_call_insn_operand (fnaddr, Pmode));
11549
11550   /* Determine if we need to load FNADDR from the GOT.  */
11551   if (!use_sibcall_p)
11552     switch (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))
11553       {
11554       case SYMBOL_GOT_PAGE_OFST:
11555       case SYMBOL_GOT_DISP:
11556         /* Pick a global pointer.  Use a call-clobbered register if
11557            TARGET_CALL_SAVED_GP.  */
11558         cfun->machine->global_pointer =
11559           TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
11560         SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
11561
11562         /* Set up the global pointer for n32 or n64 abicalls.  */
11563         mips_emit_loadgp ();
11564         break;
11565
11566       default:
11567         break;
11568       }
11569
11570   /* We need two temporary registers in some cases.  */
11571   temp1 = gen_rtx_REG (Pmode, 2);
11572   temp2 = gen_rtx_REG (Pmode, 3);
11573
11574   /* Find out which register contains the "this" pointer.  */
11575   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
11576     this = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
11577   else
11578     this = gen_rtx_REG (Pmode, GP_ARG_FIRST);
11579
11580   /* Add DELTA to THIS.  */
11581   if (delta != 0)
11582     {
11583       rtx offset = GEN_INT (delta);
11584       if (!SMALL_OPERAND (delta))
11585         {
11586           mips_emit_move (temp1, offset);
11587           offset = temp1;
11588         }
11589       emit_insn (gen_add3_insn (this, this, offset));
11590     }
11591
11592   /* If needed, add *(*THIS + VCALL_OFFSET) to THIS.  */
11593   if (vcall_offset != 0)
11594     {
11595       rtx addr;
11596
11597       /* Set TEMP1 to *THIS.  */
11598       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this));
11599
11600       /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET.  */
11601       addr = mips_add_offset (temp2, temp1, vcall_offset);
11602
11603       /* Load the offset and add it to THIS.  */
11604       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
11605       emit_insn (gen_add3_insn (this, this, temp1));
11606     }
11607
11608   /* Jump to the target function.  Use a sibcall if direct jumps are
11609      allowed, otherwise load the address into a register first.  */
11610   if (use_sibcall_p)
11611     {
11612       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
11613       SIBLING_CALL_P (insn) = 1;
11614     }
11615   else
11616     {
11617       /* This is messy.  GAS treats "la $25,foo" as part of a call
11618          sequence and may allow a global "foo" to be lazily bound.
11619          The general move patterns therefore reject this combination.
11620
11621          In this context, lazy binding would actually be OK
11622          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
11623          TARGET_CALL_SAVED_GP; see mips_load_call_address.
11624          We must therefore load the address via a temporary
11625          register if mips_dangerous_for_la25_p.
11626
11627          If we jump to the temporary register rather than $25, the assembler
11628          can use the move insn to fill the jump's delay slot.  */
11629       if (TARGET_USE_PIC_FN_ADDR_REG
11630           && !mips_dangerous_for_la25_p (fnaddr))
11631         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
11632       mips_load_call_address (temp1, fnaddr, true);
11633
11634       if (TARGET_USE_PIC_FN_ADDR_REG
11635           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
11636         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
11637       emit_jump_insn (gen_indirect_jump (temp1));
11638     }
11639
11640   /* Run just enough of rest_of_compilation.  This sequence was
11641      "borrowed" from alpha.c.  */
11642   insn = get_insns ();
11643   insn_locators_alloc ();
11644   split_all_insns_noflow ();
11645   mips16_lay_out_constants ();
11646   shorten_branches (insn);
11647   final_start_function (insn, file, 1);
11648   final (insn, file, 1);
11649   final_end_function ();
11650
11651   /* Clean up the vars set above.  Note that final_end_function resets
11652      the global pointer for us.  */
11653   reload_completed = 0;
11654 }
11655 \f
11656 /* The last argument passed to mips_set_mips16_mode, or negative if the
11657    function hasn't been called yet.  */
11658 static GTY(()) int was_mips16_p = -1;
11659
11660 /* Set up the target-dependent global state so that it matches the
11661    current function's ISA mode.  */
11662
11663 static void
11664 mips_set_mips16_mode (int mips16_p)
11665 {
11666   if (mips16_p == was_mips16_p)
11667     return;
11668
11669   /* Restore base settings of various flags.  */
11670   target_flags = mips_base_target_flags;
11671   flag_schedule_insns = mips_base_schedule_insns;
11672   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
11673   flag_move_loop_invariants = mips_base_move_loop_invariants;
11674   align_loops = mips_base_align_loops;
11675   align_jumps = mips_base_align_jumps;
11676   align_functions = mips_base_align_functions;
11677
11678   if (mips16_p)
11679     {
11680       /* Switch to MIPS16 mode.  */
11681       target_flags |= MASK_MIPS16;
11682
11683       /* Don't run the scheduler before reload, since it tends to
11684          increase register pressure.  */
11685       flag_schedule_insns = 0;
11686
11687       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
11688          the whole function to be in a single section.  */
11689       flag_reorder_blocks_and_partition = 0;
11690
11691       /* Don't move loop invariants, because it tends to increase
11692          register pressure.  It also introduces an extra move in cases
11693          where the constant is the first operand in a two-operand binary
11694          instruction, or when it forms a register argument to a functon
11695          call.  */
11696       flag_move_loop_invariants = 0;
11697
11698       /* Silently disable -mexplicit-relocs since it doesn't apply
11699          to MIPS16 code.  Even so, it would overly pedantic to warn
11700          about "-mips16 -mexplicit-relocs", especially given that
11701          we use a %gprel() operator.  */
11702       target_flags &= ~MASK_EXPLICIT_RELOCS;
11703
11704       /* Experiments suggest we get the best overall section-anchor
11705          results from using the range of an unextended LW or SW.  Code
11706          that makes heavy use of byte or short accesses can do better
11707          with ranges of 0...31 and 0...63 respectively, but most code is
11708          sensitive to the range of LW and SW instead.  */
11709       targetm.min_anchor_offset = 0;
11710       targetm.max_anchor_offset = 127;
11711
11712       if (flag_pic || TARGET_ABICALLS)
11713         sorry ("MIPS16 PIC");
11714
11715       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
11716         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
11717     }
11718   else
11719     {
11720       /* Switch to normal (non-MIPS16) mode.  */
11721       target_flags &= ~MASK_MIPS16;
11722
11723       /* Provide default values for align_* for 64-bit targets.  */
11724       if (TARGET_64BIT)
11725         {
11726           if (align_loops == 0)
11727             align_loops = 8;
11728           if (align_jumps == 0)
11729             align_jumps = 8;
11730           if (align_functions == 0)
11731             align_functions = 8;
11732         }
11733
11734       targetm.min_anchor_offset = -32768;
11735       targetm.max_anchor_offset = 32767;
11736     }
11737
11738   /* (Re)initialize MIPS target internals for new ISA.  */
11739   mips_init_relocs ();
11740
11741   if (was_mips16_p >= 0)
11742     /* Reinitialize target-dependent state.  */
11743     target_reinit ();
11744
11745   was_mips16_p = mips16_p;
11746 }
11747
11748 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
11749    function should use the MIPS16 ISA and switch modes accordingly.  */
11750
11751 static void
11752 mips_set_current_function (tree fndecl)
11753 {
11754   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
11755 }
11756 \f
11757 /* Allocate a chunk of memory for per-function machine-dependent data.  */
11758
11759 static struct machine_function *
11760 mips_init_machine_status (void)
11761 {
11762   return ((struct machine_function *)
11763           ggc_alloc_cleared (sizeof (struct machine_function)));
11764 }
11765
11766 /* Return the processor associated with the given ISA level, or null
11767    if the ISA isn't valid.  */
11768
11769 static const struct mips_cpu_info *
11770 mips_cpu_info_from_isa (int isa)
11771 {
11772   unsigned int i;
11773
11774   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
11775     if (mips_cpu_info_table[i].isa == isa)
11776       return mips_cpu_info_table + i;
11777
11778   return NULL;
11779 }
11780
11781 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
11782    with a final "000" replaced by "k".  Ignore case.
11783
11784    Note: this function is shared between GCC and GAS.  */
11785
11786 static bool
11787 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
11788 {
11789   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
11790     given++, canonical++;
11791
11792   return ((*given == 0 && *canonical == 0)
11793           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
11794 }
11795
11796 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
11797    CPU name.  We've traditionally allowed a lot of variation here.
11798
11799    Note: this function is shared between GCC and GAS.  */
11800
11801 static bool
11802 mips_matching_cpu_name_p (const char *canonical, const char *given)
11803 {
11804   /* First see if the name matches exactly, or with a final "000"
11805      turned into "k".  */
11806   if (mips_strict_matching_cpu_name_p (canonical, given))
11807     return true;
11808
11809   /* If not, try comparing based on numerical designation alone.
11810      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
11811   if (TOLOWER (*given) == 'r')
11812     given++;
11813   if (!ISDIGIT (*given))
11814     return false;
11815
11816   /* Skip over some well-known prefixes in the canonical name,
11817      hoping to find a number there too.  */
11818   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
11819     canonical += 2;
11820   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
11821     canonical += 2;
11822   else if (TOLOWER (canonical[0]) == 'r')
11823     canonical += 1;
11824
11825   return mips_strict_matching_cpu_name_p (canonical, given);
11826 }
11827
11828 /* Return the mips_cpu_info entry for the processor or ISA given
11829    by CPU_STRING.  Return null if the string isn't recognized.
11830
11831    A similar function exists in GAS.  */
11832
11833 static const struct mips_cpu_info *
11834 mips_parse_cpu (const char *cpu_string)
11835 {
11836   unsigned int i;
11837   const char *s;
11838
11839   /* In the past, we allowed upper-case CPU names, but it doesn't
11840      work well with the multilib machinery.  */
11841   for (s = cpu_string; *s != 0; s++)
11842     if (ISUPPER (*s))
11843       {
11844         warning (0, "CPU names must be lower case");
11845         break;
11846       }
11847
11848   /* 'from-abi' selects the most compatible architecture for the given
11849      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
11850      EABIs, we have to decide whether we're using the 32-bit or 64-bit
11851      version.  */
11852   if (strcasecmp (cpu_string, "from-abi") == 0)
11853     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
11854                                    : ABI_NEEDS_64BIT_REGS ? 3
11855                                    : (TARGET_64BIT ? 3 : 1));
11856
11857   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
11858   if (strcasecmp (cpu_string, "default") == 0)
11859     return NULL;
11860
11861   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
11862     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
11863       return mips_cpu_info_table + i;
11864
11865   return NULL;
11866 }
11867
11868 /* Set up globals to generate code for the ISA or processor
11869    described by INFO.  */
11870
11871 static void
11872 mips_set_architecture (const struct mips_cpu_info *info)
11873 {
11874   if (info != 0)
11875     {
11876       mips_arch_info = info;
11877       mips_arch = info->cpu;
11878       mips_isa = info->isa;
11879     }
11880 }
11881
11882 /* Likewise for tuning.  */
11883
11884 static void
11885 mips_set_tune (const struct mips_cpu_info *info)
11886 {
11887   if (info != 0)
11888     {
11889       mips_tune_info = info;
11890       mips_tune = info->cpu;
11891     }
11892 }
11893
11894 /* Implement TARGET_HANDLE_OPTION.  */
11895
11896 static bool
11897 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
11898 {
11899   switch (code)
11900     {
11901     case OPT_mabi_:
11902       if (strcmp (arg, "32") == 0)
11903         mips_abi = ABI_32;
11904       else if (strcmp (arg, "o64") == 0)
11905         mips_abi = ABI_O64;
11906       else if (strcmp (arg, "n32") == 0)
11907         mips_abi = ABI_N32;
11908       else if (strcmp (arg, "64") == 0)
11909         mips_abi = ABI_64;
11910       else if (strcmp (arg, "eabi") == 0)
11911         mips_abi = ABI_EABI;
11912       else
11913         return false;
11914       return true;
11915
11916     case OPT_march_:
11917     case OPT_mtune_:
11918       return mips_parse_cpu (arg) != 0;
11919
11920     case OPT_mips:
11921       mips_isa_option_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
11922       return mips_isa_option_info != 0;
11923
11924     case OPT_mno_flush_func:
11925       mips_cache_flush_func = NULL;
11926       return true;
11927
11928     case OPT_mcode_readable_:
11929       if (strcmp (arg, "yes") == 0)
11930         mips_code_readable = CODE_READABLE_YES;
11931       else if (strcmp (arg, "pcrel") == 0)
11932         mips_code_readable = CODE_READABLE_PCREL;
11933       else if (strcmp (arg, "no") == 0)
11934         mips_code_readable = CODE_READABLE_NO;
11935       else
11936         return false;
11937       return true;
11938
11939     default:
11940       return true;
11941     }
11942 }
11943
11944 /* Implement OVERRIDE_OPTIONS.  */
11945
11946 void
11947 mips_override_options (void)
11948 {
11949   int i, start, regno, mode;
11950
11951 #ifdef SUBTARGET_OVERRIDE_OPTIONS
11952   SUBTARGET_OVERRIDE_OPTIONS;
11953 #endif
11954
11955   /* Set the small data limit.  */
11956   mips_small_data_threshold = (g_switch_set
11957                                ? g_switch_value
11958                                : MIPS_DEFAULT_GVALUE);
11959
11960   /* The following code determines the architecture and register size.
11961      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
11962      The GAS and GCC code should be kept in sync as much as possible.  */
11963
11964   if (mips_arch_string != 0)
11965     mips_set_architecture (mips_parse_cpu (mips_arch_string));
11966
11967   if (mips_isa_option_info != 0)
11968     {
11969       if (mips_arch_info == 0)
11970         mips_set_architecture (mips_isa_option_info);
11971       else if (mips_arch_info->isa != mips_isa_option_info->isa)
11972         error ("%<-%s%> conflicts with the other architecture options, "
11973                "which specify a %s processor",
11974                mips_isa_option_info->name,
11975                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
11976     }
11977
11978   if (mips_arch_info == 0)
11979     {
11980 #ifdef MIPS_CPU_STRING_DEFAULT
11981       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
11982 #else
11983       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
11984 #endif
11985     }
11986
11987   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
11988     error ("%<-march=%s%> is not compatible with the selected ABI",
11989            mips_arch_info->name);
11990
11991   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
11992   if (mips_tune_string != 0)
11993     mips_set_tune (mips_parse_cpu (mips_tune_string));
11994
11995   if (mips_tune_info == 0)
11996     mips_set_tune (mips_arch_info);
11997
11998   if ((target_flags_explicit & MASK_64BIT) != 0)
11999     {
12000       /* The user specified the size of the integer registers.  Make sure
12001          it agrees with the ABI and ISA.  */
12002       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
12003         error ("%<-mgp64%> used with a 32-bit processor");
12004       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
12005         error ("%<-mgp32%> used with a 64-bit ABI");
12006       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
12007         error ("%<-mgp64%> used with a 32-bit ABI");
12008     }
12009   else
12010     {
12011       /* Infer the integer register size from the ABI and processor.
12012          Restrict ourselves to 32-bit registers if that's all the
12013          processor has, or if the ABI cannot handle 64-bit registers.  */
12014       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
12015         target_flags &= ~MASK_64BIT;
12016       else
12017         target_flags |= MASK_64BIT;
12018     }
12019
12020   if ((target_flags_explicit & MASK_FLOAT64) != 0)
12021     {
12022       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
12023         error ("unsupported combination: %s", "-mfp64 -msingle-float");
12024       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
12025         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
12026       else if (!TARGET_64BIT && TARGET_FLOAT64)
12027         {
12028           if (!ISA_HAS_MXHC1)
12029             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
12030                    " the target supports the mfhc1 and mthc1 instructions");
12031           else if (mips_abi != ABI_32)
12032             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
12033                    " the o32 ABI");
12034         }
12035     }
12036   else
12037     {
12038       /* -msingle-float selects 32-bit float registers.  Otherwise the
12039          float registers should be the same size as the integer ones.  */
12040       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
12041         target_flags |= MASK_FLOAT64;
12042       else
12043         target_flags &= ~MASK_FLOAT64;
12044     }
12045
12046   /* End of code shared with GAS.  */
12047
12048   /* If no -mlong* option was given, infer it from the other options.  */
12049   if ((target_flags_explicit & MASK_LONG64) == 0)
12050     {
12051       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
12052         target_flags |= MASK_LONG64;
12053       else
12054         target_flags &= ~MASK_LONG64;
12055     }
12056
12057   if (!TARGET_OLDABI)
12058     flag_pcc_struct_return = 0;
12059
12060   /* Decide which rtx_costs structure to use.  */
12061   if (optimize_size)
12062     mips_cost = &mips_rtx_cost_optimize_size;
12063   else
12064     mips_cost = &mips_rtx_cost_data[mips_tune];
12065
12066   /* If the user hasn't specified a branch cost, use the processor's
12067      default.  */
12068   if (mips_branch_cost == 0)
12069     mips_branch_cost = mips_cost->branch_cost;
12070
12071   /* If neither -mbranch-likely nor -mno-branch-likely was given
12072      on the command line, set MASK_BRANCHLIKELY based on the target
12073      architecture and tuning flags.  Annulled delay slots are a
12074      size win, so we only consider the processor-specific tuning
12075      for !optimize_size.  */
12076   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
12077     {
12078       if (ISA_HAS_BRANCHLIKELY
12079           && (optimize_size
12080               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
12081         target_flags |= MASK_BRANCHLIKELY;
12082       else
12083         target_flags &= ~MASK_BRANCHLIKELY;
12084     }
12085   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
12086     warning (0, "the %qs architecture does not support branch-likely"
12087              " instructions", mips_arch_info->name);
12088
12089   /* The effect of -mabicalls isn't defined for the EABI.  */
12090   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
12091     {
12092       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
12093       target_flags &= ~MASK_ABICALLS;
12094     }
12095
12096   /* MIPS16 cannot generate PIC yet.  */
12097   if (TARGET_MIPS16 && (flag_pic || TARGET_ABICALLS))
12098     {
12099       sorry ("MIPS16 PIC");
12100       target_flags &= ~MASK_ABICALLS;
12101       flag_pic = flag_pie = flag_shlib = 0;
12102     }
12103
12104   if (TARGET_ABICALLS)
12105     /* We need to set flag_pic for executables as well as DSOs
12106        because we may reference symbols that are not defined in
12107        the final executable.  (MIPS does not use things like
12108        copy relocs, for example.)
12109
12110        Also, there is a body of code that uses __PIC__ to distinguish
12111        between -mabicalls and -mno-abicalls code.  */
12112     flag_pic = 1;
12113
12114   /* -mvr4130-align is a "speed over size" optimization: it usually produces
12115      faster code, but at the expense of more nops.  Enable it at -O3 and
12116      above.  */
12117   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
12118     target_flags |= MASK_VR4130_ALIGN;
12119
12120   /* Prefer a call to memcpy over inline code when optimizing for size,
12121      though see MOVE_RATIO in mips.h.  */
12122   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
12123     target_flags |= MASK_MEMCPY;
12124
12125   /* If we have a nonzero small-data limit, check that the -mgpopt
12126      setting is consistent with the other target flags.  */
12127   if (mips_small_data_threshold > 0)
12128     {
12129       if (!TARGET_GPOPT)
12130         {
12131           if (!TARGET_MIPS16 && !TARGET_EXPLICIT_RELOCS)
12132             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
12133
12134           TARGET_LOCAL_SDATA = false;
12135           TARGET_EXTERN_SDATA = false;
12136         }
12137       else
12138         {
12139           if (TARGET_VXWORKS_RTP)
12140             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
12141
12142           if (TARGET_ABICALLS)
12143             warning (0, "cannot use small-data accesses for %qs",
12144                      "-mabicalls");
12145         }
12146     }
12147
12148 #ifdef MIPS_TFMODE_FORMAT
12149   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
12150 #endif
12151
12152   /* Make sure that the user didn't turn off paired single support when
12153      MIPS-3D support is requested.  */
12154   if (TARGET_MIPS3D
12155       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
12156       && !TARGET_PAIRED_SINGLE_FLOAT)
12157     error ("%<-mips3d%> requires %<-mpaired-single%>");
12158
12159   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
12160   if (TARGET_MIPS3D)
12161     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
12162
12163   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
12164      and TARGET_HARD_FLOAT_ABI are both true.  */
12165   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
12166     error ("%qs must be used with %qs",
12167            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
12168            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
12169
12170   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
12171      enabled.  */
12172   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
12173     warning (0, "the %qs architecture does not support paired-single"
12174              " instructions", mips_arch_info->name);
12175
12176   /* If TARGET_DSPR2, enable MASK_DSP.  */
12177   if (TARGET_DSPR2)
12178     target_flags |= MASK_DSP;
12179
12180   mips_init_print_operand_punct ();
12181
12182   /* Set up array to map GCC register number to debug register number.
12183      Ignore the special purpose register numbers.  */
12184
12185   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
12186     {
12187       mips_dbx_regno[i] = INVALID_REGNUM;
12188       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
12189         mips_dwarf_regno[i] = i;
12190       else
12191         mips_dwarf_regno[i] = INVALID_REGNUM;
12192     }
12193
12194   start = GP_DBX_FIRST - GP_REG_FIRST;
12195   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
12196     mips_dbx_regno[i] = i + start;
12197
12198   start = FP_DBX_FIRST - FP_REG_FIRST;
12199   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
12200     mips_dbx_regno[i] = i + start;
12201
12202   /* Accumulator debug registers use big-endian ordering.  */
12203   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
12204   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
12205   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
12206   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
12207   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
12208     {
12209       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
12210       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
12211     }
12212
12213   /* Set up mips_hard_regno_mode_ok.  */
12214   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
12215     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
12216       mips_hard_regno_mode_ok[(int)mode][regno]
12217         = mips_hard_regno_mode_ok_p (regno, mode);
12218
12219   /* Function to allocate machine-dependent function status.  */
12220   init_machine_status = &mips_init_machine_status;
12221
12222   /* Default to working around R4000 errata only if the processor
12223      was selected explicitly.  */
12224   if ((target_flags_explicit & MASK_FIX_R4000) == 0
12225       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
12226     target_flags |= MASK_FIX_R4000;
12227
12228   /* Default to working around R4400 errata only if the processor
12229      was selected explicitly.  */
12230   if ((target_flags_explicit & MASK_FIX_R4400) == 0
12231       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
12232     target_flags |= MASK_FIX_R4400;
12233
12234   /* Save base state of options.  */
12235   mips_base_mips16 = TARGET_MIPS16;
12236   mips_base_target_flags = target_flags;
12237   mips_base_delayed_branch = flag_delayed_branch;
12238   mips_base_schedule_insns = flag_schedule_insns;
12239   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
12240   mips_base_move_loop_invariants = flag_move_loop_invariants;
12241   mips_base_align_loops = align_loops;
12242   mips_base_align_jumps = align_jumps;
12243   mips_base_align_functions = align_functions;
12244
12245   /* Now select the ISA mode.  */
12246   mips_set_mips16_mode (mips_base_mips16);
12247
12248   /* We call dbr_schedule from within mips_reorg.  */
12249   flag_delayed_branch = 0;
12250 }
12251
12252 /* Swap the register information for registers I and I + 1, which
12253    currently have the wrong endianness.  Note that the registers'
12254    fixedness and call-clobberedness might have been set on the
12255    command line.  */
12256
12257 static void
12258 mips_swap_registers (unsigned int i)
12259 {
12260   int tmpi;
12261   const char *tmps;
12262
12263 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
12264 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
12265
12266   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
12267   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
12268   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
12269   SWAP_STRING (reg_names[i], reg_names[i + 1]);
12270
12271 #undef SWAP_STRING
12272 #undef SWAP_INT
12273 }
12274
12275 /* Implement CONDITIONAL_REGISTER_USAGE.  */
12276
12277 void
12278 mips_conditional_register_usage (void)
12279 {
12280   if (!ISA_HAS_DSP)
12281     {
12282       int regno;
12283
12284       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
12285         fixed_regs[regno] = call_used_regs[regno] = 1;
12286     }
12287   if (!TARGET_HARD_FLOAT)
12288     {
12289       int regno;
12290
12291       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
12292         fixed_regs[regno] = call_used_regs[regno] = 1;
12293       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
12294         fixed_regs[regno] = call_used_regs[regno] = 1;
12295     }
12296   else if (! ISA_HAS_8CC)
12297     {
12298       int regno;
12299
12300       /* We only have a single condition-code register.  We implement
12301          this by fixing all the condition-code registers and generating
12302          RTL that refers directly to ST_REG_FIRST.  */
12303       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
12304         fixed_regs[regno] = call_used_regs[regno] = 1;
12305     }
12306   /* In MIPS16 mode, we permit the $t temporary registers to be used
12307      for reload.  We prohibit the unused $s registers, since they
12308      are call-saved, and saving them via a MIPS16 register would
12309      probably waste more time than just reloading the value.  */
12310   if (TARGET_MIPS16)
12311     {
12312       fixed_regs[18] = call_used_regs[18] = 1;
12313       fixed_regs[19] = call_used_regs[19] = 1;
12314       fixed_regs[20] = call_used_regs[20] = 1;
12315       fixed_regs[21] = call_used_regs[21] = 1;
12316       fixed_regs[22] = call_used_regs[22] = 1;
12317       fixed_regs[23] = call_used_regs[23] = 1;
12318       fixed_regs[26] = call_used_regs[26] = 1;
12319       fixed_regs[27] = call_used_regs[27] = 1;
12320       fixed_regs[30] = call_used_regs[30] = 1;
12321     }
12322   /* $f20-$f23 are call-clobbered for n64.  */
12323   if (mips_abi == ABI_64)
12324     {
12325       int regno;
12326       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
12327         call_really_used_regs[regno] = call_used_regs[regno] = 1;
12328     }
12329   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
12330      for n32.  */
12331   if (mips_abi == ABI_N32)
12332     {
12333       int regno;
12334       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
12335         call_really_used_regs[regno] = call_used_regs[regno] = 1;
12336     }
12337   /* Make sure that double-register accumulator values are correctly
12338      ordered for the current endianness.  */
12339   if (TARGET_LITTLE_ENDIAN)
12340     {
12341       unsigned int regno;
12342
12343       mips_swap_registers (MD_REG_FIRST);
12344       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
12345         mips_swap_registers (regno);
12346     }
12347 }
12348
12349 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
12350    other registers for instructions for which it is possible.  This
12351    encourages the compiler to use CMP in cases where an XOR would
12352    require some register shuffling.  */
12353
12354 void
12355 mips_order_regs_for_local_alloc (void)
12356 {
12357   int i;
12358
12359   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
12360     reg_alloc_order[i] = i;
12361
12362   if (TARGET_MIPS16)
12363     {
12364       /* It really doesn't matter where we put register 0, since it is
12365          a fixed register anyhow.  */
12366       reg_alloc_order[0] = 24;
12367       reg_alloc_order[24] = 0;
12368     }
12369 }
12370 \f
12371 /* Initialize the GCC target structure.  */
12372 #undef TARGET_ASM_ALIGNED_HI_OP
12373 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
12374 #undef TARGET_ASM_ALIGNED_SI_OP
12375 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
12376 #undef TARGET_ASM_ALIGNED_DI_OP
12377 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
12378
12379 #undef TARGET_ASM_FUNCTION_PROLOGUE
12380 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
12381 #undef TARGET_ASM_FUNCTION_EPILOGUE
12382 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
12383 #undef TARGET_ASM_SELECT_RTX_SECTION
12384 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
12385 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
12386 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
12387
12388 #undef TARGET_SCHED_INIT
12389 #define TARGET_SCHED_INIT mips_sched_init
12390 #undef TARGET_SCHED_REORDER
12391 #define TARGET_SCHED_REORDER mips_sched_reorder
12392 #undef TARGET_SCHED_REORDER2
12393 #define TARGET_SCHED_REORDER2 mips_sched_reorder
12394 #undef TARGET_SCHED_VARIABLE_ISSUE
12395 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
12396 #undef TARGET_SCHED_ADJUST_COST
12397 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
12398 #undef TARGET_SCHED_ISSUE_RATE
12399 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
12400 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
12401 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
12402   mips_multipass_dfa_lookahead
12403
12404 #undef TARGET_DEFAULT_TARGET_FLAGS
12405 #define TARGET_DEFAULT_TARGET_FLAGS             \
12406   (TARGET_DEFAULT                               \
12407    | TARGET_CPU_DEFAULT                         \
12408    | TARGET_ENDIAN_DEFAULT                      \
12409    | TARGET_FP_EXCEPTIONS_DEFAULT               \
12410    | MASK_CHECK_ZERO_DIV                        \
12411    | MASK_FUSED_MADD)
12412 #undef TARGET_HANDLE_OPTION
12413 #define TARGET_HANDLE_OPTION mips_handle_option
12414
12415 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
12416 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
12417
12418 #undef TARGET_INSERT_ATTRIBUTES
12419 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
12420 #undef TARGET_MERGE_DECL_ATTRIBUTES
12421 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
12422 #undef TARGET_SET_CURRENT_FUNCTION
12423 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
12424
12425 #undef TARGET_VALID_POINTER_MODE
12426 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
12427 #undef TARGET_RTX_COSTS
12428 #define TARGET_RTX_COSTS mips_rtx_costs
12429 #undef TARGET_ADDRESS_COST
12430 #define TARGET_ADDRESS_COST mips_address_cost
12431
12432 #undef TARGET_IN_SMALL_DATA_P
12433 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
12434
12435 #undef TARGET_MACHINE_DEPENDENT_REORG
12436 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
12437
12438 #undef TARGET_ASM_FILE_START
12439 #define TARGET_ASM_FILE_START mips_file_start
12440 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
12441 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
12442
12443 #undef TARGET_INIT_LIBFUNCS
12444 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
12445
12446 #undef TARGET_BUILD_BUILTIN_VA_LIST
12447 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
12448 #undef TARGET_EXPAND_BUILTIN_VA_START
12449 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
12450 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
12451 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
12452
12453 #undef TARGET_PROMOTE_FUNCTION_ARGS
12454 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
12455 #undef TARGET_PROMOTE_FUNCTION_RETURN
12456 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
12457 #undef TARGET_PROMOTE_PROTOTYPES
12458 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
12459
12460 #undef TARGET_RETURN_IN_MEMORY
12461 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
12462 #undef TARGET_RETURN_IN_MSB
12463 #define TARGET_RETURN_IN_MSB mips_return_in_msb
12464
12465 #undef TARGET_ASM_OUTPUT_MI_THUNK
12466 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
12467 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
12468 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
12469
12470 #undef TARGET_SETUP_INCOMING_VARARGS
12471 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
12472 #undef TARGET_STRICT_ARGUMENT_NAMING
12473 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
12474 #undef TARGET_MUST_PASS_IN_STACK
12475 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
12476 #undef TARGET_PASS_BY_REFERENCE
12477 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
12478 #undef TARGET_CALLEE_COPIES
12479 #define TARGET_CALLEE_COPIES mips_callee_copies
12480 #undef TARGET_ARG_PARTIAL_BYTES
12481 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
12482
12483 #undef TARGET_MODE_REP_EXTENDED
12484 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
12485
12486 #undef TARGET_VECTOR_MODE_SUPPORTED_P
12487 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
12488
12489 #undef TARGET_SCALAR_MODE_SUPPORTED_P
12490 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
12491
12492 #undef TARGET_INIT_BUILTINS
12493 #define TARGET_INIT_BUILTINS mips_init_builtins
12494 #undef TARGET_EXPAND_BUILTIN
12495 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
12496
12497 #undef TARGET_HAVE_TLS
12498 #define TARGET_HAVE_TLS HAVE_AS_TLS
12499
12500 #undef TARGET_CANNOT_FORCE_CONST_MEM
12501 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
12502
12503 #undef TARGET_ENCODE_SECTION_INFO
12504 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
12505
12506 #undef TARGET_ATTRIBUTE_TABLE
12507 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
12508 /* All our function attributes are related to how out-of-line copies should
12509    be compiled or called.  They don't in themselves prevent inlining.  */
12510 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
12511 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
12512
12513 #undef TARGET_EXTRA_LIVE_ON_ENTRY
12514 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
12515
12516 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
12517 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
12518 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
12519 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
12520
12521 #undef  TARGET_COMP_TYPE_ATTRIBUTES
12522 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
12523
12524 #ifdef HAVE_AS_DTPRELWORD
12525 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
12526 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
12527 #endif
12528 #undef TARGET_DWARF_REGISTER_SPAN
12529 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
12530
12531 struct gcc_target targetm = TARGET_INITIALIZER;
12532 \f
12533 #include "gt-mips.h"