OSDN Git Service

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