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 (mode)
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 (mode)
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
3309           && ISA_HAS_FP4
3310           && flag_unsafe_math_optimizations
3311           && XEXP (x, 0) == CONST1_RTX (mode))
3312         {
3313           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
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           else
3318             *total = mips_fp_div_cost (mode) + rtx_cost (XEXP (x, 1), 0);
3319           return true;
3320         }
3321       /* Fall through.  */
3322
3323     case SQRT:
3324     case MOD:
3325       if (float_mode_p)
3326         {
3327           *total = mips_fp_div_cost (mode);
3328           return false;
3329         }
3330       /* Fall through.  */
3331
3332     case UDIV:
3333     case UMOD:
3334       if (optimize_size)
3335         {
3336           /* It is our responsibility to make division by a power of 2
3337              as cheap as 2 register additions if we want the division
3338              expanders to be used for such operations; see the setting
3339              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3340              should always produce shorter code than using
3341              expand_sdiv2_pow2.  */
3342           if (TARGET_MIPS16
3343               && CONST_INT_P (XEXP (x, 1))
3344               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3345             {
3346               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), 0);
3347               return true;
3348             }
3349           *total = COSTS_N_INSNS (mips_idiv_insns ());
3350         }
3351       else if (mode == DImode)
3352         *total = mips_cost->int_div_di;
3353       else
3354         *total = mips_cost->int_div_si;
3355       return false;
3356
3357     case SIGN_EXTEND:
3358       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3359       return false;
3360
3361     case ZERO_EXTEND:
3362       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3363       return false;
3364
3365     case FLOAT:
3366     case UNSIGNED_FLOAT:
3367     case FIX:
3368     case FLOAT_EXTEND:
3369     case FLOAT_TRUNCATE:
3370       *total = mips_cost->fp_add;
3371       return false;
3372
3373     default:
3374       return false;
3375     }
3376 }
3377
3378 /* Provide the costs of an addressing mode that contains ADDR.
3379    If ADDR is not a valid address, its cost is irrelevant.  */
3380
3381 static int
3382 mips_address_cost (rtx addr)
3383 {
3384   return mips_address_insns (addr, SImode, false);
3385 }
3386 \f
3387 /* Return one word of double-word value OP, taking into account the fixed
3388    endianness of certain registers.  HIGH_P is true to select the high part,
3389    false to select the low part.  */
3390
3391 rtx
3392 mips_subword (rtx op, int high_p)
3393 {
3394   unsigned int byte, offset;
3395   enum machine_mode mode;
3396
3397   mode = GET_MODE (op);
3398   if (mode == VOIDmode)
3399     mode = DImode;
3400
3401   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
3402     byte = UNITS_PER_WORD;
3403   else
3404     byte = 0;
3405
3406   if (FP_REG_RTX_P (op))
3407     {
3408       /* Paired FPRs are always ordered little-endian.  */
3409       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
3410       return gen_rtx_REG (word_mode, REGNO (op) + offset);
3411     }
3412
3413   if (MEM_P (op))
3414     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
3415
3416   return simplify_gen_subreg (word_mode, op, mode, byte);
3417 }
3418
3419
3420 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
3421
3422 bool
3423 mips_split_64bit_move_p (rtx dest, rtx src)
3424 {
3425   if (TARGET_64BIT)
3426     return false;
3427
3428   /* FP->FP moves can be done in a single instruction.  */
3429   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
3430     return false;
3431
3432   /* Check for floating-point loads and stores.  */
3433   if (ISA_HAS_LDC1_SDC1)
3434     {
3435       if (FP_REG_RTX_P (dest) && MEM_P (src))
3436         return false;
3437       if (FP_REG_RTX_P (src) && MEM_P (dest))
3438         return false;
3439     }
3440   return true;
3441 }
3442
3443
3444 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
3445    this function handles 64-bit moves for which mips_split_64bit_move_p
3446    holds.  For 64-bit targets, this function handles 128-bit moves.  */
3447
3448 void
3449 mips_split_doubleword_move (rtx dest, rtx src)
3450 {
3451   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
3452     {
3453       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
3454         emit_insn (gen_move_doubleword_fprdi (dest, src));
3455       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
3456         emit_insn (gen_move_doubleword_fprdf (dest, src));
3457       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
3458         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
3459       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
3460         emit_insn (gen_move_doubleword_fprtf (dest, src));
3461       else
3462         gcc_unreachable ();
3463     }
3464   else
3465     {
3466       /* The operation can be split into two normal moves.  Decide in
3467          which order to do them.  */
3468       rtx low_dest;
3469
3470       low_dest = mips_subword (dest, 0);
3471       if (REG_P (low_dest)
3472           && reg_overlap_mentioned_p (low_dest, src))
3473         {
3474           mips_emit_move (mips_subword (dest, 1), mips_subword (src, 1));
3475           mips_emit_move (low_dest, mips_subword (src, 0));
3476         }
3477       else
3478         {
3479           mips_emit_move (low_dest, mips_subword (src, 0));
3480           mips_emit_move (mips_subword (dest, 1), mips_subword (src, 1));
3481         }
3482     }
3483 }
3484 \f
3485 /* Return the appropriate instructions to move SRC into DEST.  Assume
3486    that SRC is operand 1 and DEST is operand 0.  */
3487
3488 const char *
3489 mips_output_move (rtx dest, rtx src)
3490 {
3491   enum rtx_code dest_code, src_code;
3492   enum mips_symbol_type symbol_type;
3493   bool dbl_p;
3494
3495   dest_code = GET_CODE (dest);
3496   src_code = GET_CODE (src);
3497   dbl_p = (GET_MODE_SIZE (GET_MODE (dest)) == 8);
3498
3499   if (dbl_p && mips_split_64bit_move_p (dest, src))
3500     return "#";
3501
3502   if ((src_code == REG && GP_REG_P (REGNO (src)))
3503       || (!TARGET_MIPS16 && src == CONST0_RTX (GET_MODE (dest))))
3504     {
3505       if (dest_code == REG)
3506         {
3507           if (GP_REG_P (REGNO (dest)))
3508             return "move\t%0,%z1";
3509
3510           if (MD_REG_P (REGNO (dest)))
3511             return "mt%0\t%z1";
3512
3513           if (DSP_ACC_REG_P (REGNO (dest)))
3514             {
3515               static char retval[] = "mt__\t%z1,%q0";
3516               retval[2] = reg_names[REGNO (dest)][4];
3517               retval[3] = reg_names[REGNO (dest)][5];
3518               return retval;
3519             }
3520
3521           if (FP_REG_P (REGNO (dest)))
3522             return (dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0");
3523
3524           if (ALL_COP_REG_P (REGNO (dest)))
3525             {
3526               static char retval[] = "dmtc_\t%z1,%0";
3527
3528               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3529               return (dbl_p ? retval : retval + 1);
3530             }
3531         }
3532       if (dest_code == MEM)
3533         return (dbl_p ? "sd\t%z1,%0" : "sw\t%z1,%0");
3534     }
3535   if (dest_code == REG && GP_REG_P (REGNO (dest)))
3536     {
3537       if (src_code == REG)
3538         {
3539           if (DSP_ACC_REG_P (REGNO (src)))
3540             {
3541               static char retval[] = "mf__\t%0,%q1";
3542               retval[2] = reg_names[REGNO (src)][4];
3543               retval[3] = reg_names[REGNO (src)][5];
3544               return retval;
3545             }
3546
3547           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
3548             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
3549
3550           if (FP_REG_P (REGNO (src)))
3551             return (dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1");
3552
3553           if (ALL_COP_REG_P (REGNO (src)))
3554             {
3555               static char retval[] = "dmfc_\t%0,%1";
3556
3557               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3558               return (dbl_p ? retval : retval + 1);
3559             }
3560         }
3561
3562       if (src_code == MEM)
3563         return (dbl_p ? "ld\t%0,%1" : "lw\t%0,%1");
3564
3565       if (src_code == CONST_INT)
3566         {
3567           /* Don't use the X format, because that will give out of
3568              range numbers for 64-bit hosts and 32-bit targets.  */
3569           if (!TARGET_MIPS16)
3570             return "li\t%0,%1\t\t\t# %X1";
3571
3572           if (INTVAL (src) >= 0 && INTVAL (src) <= 0xffff)
3573             return "li\t%0,%1";
3574
3575           if (INTVAL (src) < 0 && INTVAL (src) >= -0xffff)
3576             return "#";
3577         }
3578
3579       if (src_code == HIGH)
3580         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
3581
3582       if (CONST_GP_P (src))
3583         return "move\t%0,%1";
3584
3585       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
3586           && mips_lo_relocs[symbol_type] != 0)
3587         {
3588           /* A signed 16-bit constant formed by applying a relocation
3589              operator to a symbolic address.  */
3590           gcc_assert (!mips_split_p[symbol_type]);
3591           return "li\t%0,%R1";
3592         }
3593
3594       if (symbolic_operand (src, VOIDmode))
3595         {
3596           gcc_assert (TARGET_MIPS16
3597                       ? TARGET_MIPS16_TEXT_LOADS
3598                       : !TARGET_EXPLICIT_RELOCS);
3599           return (dbl_p ? "dla\t%0,%1" : "la\t%0,%1");
3600         }
3601     }
3602   if (src_code == REG && FP_REG_P (REGNO (src)))
3603     {
3604       if (dest_code == REG && FP_REG_P (REGNO (dest)))
3605         {
3606           if (GET_MODE (dest) == V2SFmode)
3607             return "mov.ps\t%0,%1";
3608           else
3609             return (dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1");
3610         }
3611
3612       if (dest_code == MEM)
3613         return (dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0");
3614     }
3615   if (dest_code == REG && FP_REG_P (REGNO (dest)))
3616     {
3617       if (src_code == MEM)
3618         return (dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1");
3619     }
3620   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
3621     {
3622       static char retval[] = "l_c_\t%0,%1";
3623
3624       retval[1] = (dbl_p ? 'd' : 'w');
3625       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3626       return retval;
3627     }
3628   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
3629     {
3630       static char retval[] = "s_c_\t%1,%0";
3631
3632       retval[1] = (dbl_p ? 'd' : 'w');
3633       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3634       return retval;
3635     }
3636   gcc_unreachable ();
3637 }
3638 \f
3639 /* Return true if CMP1 is a suitable second operand for relational
3640    operator CODE.  See also the *sCC patterns in mips.md.  */
3641
3642 static bool
3643 mips_relational_operand_ok_p (enum rtx_code code, rtx cmp1)
3644 {
3645   switch (code)
3646     {
3647     case GT:
3648     case GTU:
3649       return reg_or_0_operand (cmp1, VOIDmode);
3650
3651     case GE:
3652     case GEU:
3653       return !TARGET_MIPS16 && cmp1 == const1_rtx;
3654
3655     case LT:
3656     case LTU:
3657       return arith_operand (cmp1, VOIDmode);
3658
3659     case LE:
3660       return sle_operand (cmp1, VOIDmode);
3661
3662     case LEU:
3663       return sleu_operand (cmp1, VOIDmode);
3664
3665     default:
3666       gcc_unreachable ();
3667     }
3668 }
3669
3670 /* Canonicalize LE or LEU comparisons into LT comparisons when
3671    possible to avoid extra instructions or inverting the
3672    comparison.  */
3673
3674 static bool
3675 mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1,
3676                               enum machine_mode mode)
3677 {
3678   HOST_WIDE_INT plus_one;
3679
3680   if (mips_relational_operand_ok_p (*code, *cmp1))
3681     return true;
3682
3683   if (GET_CODE (*cmp1) == CONST_INT)
3684     switch (*code)
3685       {
3686       case LE:
3687         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
3688         if (INTVAL (*cmp1) < plus_one)
3689           {
3690             *code = LT;
3691             *cmp1 = force_reg (mode, GEN_INT (plus_one));
3692             return true;
3693           }
3694         break;
3695
3696       case LEU:
3697         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
3698         if (plus_one != 0)
3699           {
3700             *code = LTU;
3701             *cmp1 = force_reg (mode, GEN_INT (plus_one));
3702             return true;
3703           }
3704         break;
3705
3706       default:
3707         break;
3708       }
3709   return false;
3710 }
3711
3712 /* Compare CMP0 and CMP1 using relational operator CODE and store the
3713    result in TARGET.  CMP0 and TARGET are register_operands that have
3714    the same integer mode.  If INVERT_PTR is nonnull, it's OK to set
3715    TARGET to the inverse of the result and flip *INVERT_PTR instead.  */
3716
3717 static void
3718 mips_emit_int_relational (enum rtx_code code, bool *invert_ptr,
3719                           rtx target, rtx cmp0, rtx cmp1)
3720 {
3721   /* First see if there is a MIPS instruction that can do this operation.
3722      If not, try doing the same for the inverse operation.  If that also
3723      fails, force CMP1 into a register and try again.  */
3724   if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
3725     mips_emit_binary (code, target, cmp0, cmp1);
3726   else
3727     {
3728       enum rtx_code inv_code = reverse_condition (code);
3729       if (!mips_canonicalize_comparison (&inv_code, &cmp1, GET_MODE (target)))
3730         {
3731           cmp1 = force_reg (GET_MODE (cmp0), cmp1);
3732           mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1);
3733         }
3734       else if (invert_ptr == 0)
3735         {
3736           rtx inv_target = gen_reg_rtx (GET_MODE (target));
3737           mips_emit_binary (inv_code, inv_target, cmp0, cmp1);
3738           mips_emit_binary (XOR, target, inv_target, const1_rtx);
3739         }
3740       else
3741         {
3742           *invert_ptr = !*invert_ptr;
3743           mips_emit_binary (inv_code, target, cmp0, cmp1);
3744         }
3745     }
3746 }
3747
3748 /* Return a register that is zero iff CMP0 and CMP1 are equal.
3749    The register will have the same mode as CMP0.  */
3750
3751 static rtx
3752 mips_zero_if_equal (rtx cmp0, rtx cmp1)
3753 {
3754   if (cmp1 == const0_rtx)
3755     return cmp0;
3756
3757   if (uns_arith_operand (cmp1, VOIDmode))
3758     return expand_binop (GET_MODE (cmp0), xor_optab,
3759                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3760
3761   return expand_binop (GET_MODE (cmp0), sub_optab,
3762                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3763 }
3764
3765 /* Convert *CODE into a code that can be used in a floating-point
3766    scc instruction (c.<cond>.<fmt>).  Return true if the values of
3767    the condition code registers will be inverted, with 0 indicating
3768    that the condition holds.  */
3769
3770 static bool
3771 mips_reverse_fp_cond_p (enum rtx_code *code)
3772 {
3773   switch (*code)
3774     {
3775     case NE:
3776     case LTGT:
3777     case ORDERED:
3778       *code = reverse_condition_maybe_unordered (*code);
3779       return true;
3780
3781     default:
3782       return false;
3783     }
3784 }
3785
3786 /* Convert a comparison into something that can be used in a branch or
3787    conditional move.  cmp_operands[0] and cmp_operands[1] are the values
3788    being compared and *CODE is the code used to compare them.
3789
3790    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
3791    If NEED_EQ_NE_P, then only EQ/NE comparisons against zero are possible,
3792    otherwise any standard branch condition can be used.  The standard branch
3793    conditions are:
3794
3795       - EQ/NE between two registers.
3796       - any comparison between a register and zero.  */
3797
3798 static void
3799 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
3800 {
3801   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT)
3802     {
3803       if (!need_eq_ne_p && cmp_operands[1] == const0_rtx)
3804         {
3805           *op0 = cmp_operands[0];
3806           *op1 = cmp_operands[1];
3807         }
3808       else if (*code == EQ || *code == NE)
3809         {
3810           if (need_eq_ne_p)
3811             {
3812               *op0 = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3813               *op1 = const0_rtx;
3814             }
3815           else
3816             {
3817               *op0 = cmp_operands[0];
3818               *op1 = force_reg (GET_MODE (*op0), cmp_operands[1]);
3819             }
3820         }
3821       else
3822         {
3823           /* The comparison needs a separate scc instruction.  Store the
3824              result of the scc in *OP0 and compare it against zero.  */
3825           bool invert = false;
3826           *op0 = gen_reg_rtx (GET_MODE (cmp_operands[0]));
3827           *op1 = const0_rtx;
3828           mips_emit_int_relational (*code, &invert, *op0,
3829                                     cmp_operands[0], cmp_operands[1]);
3830           *code = (invert ? EQ : NE);
3831         }
3832     }
3833   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_operands[0])))
3834     {
3835       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
3836       mips_emit_binary (*code, *op0, cmp_operands[0], cmp_operands[1]);
3837       *code = NE;
3838       *op1 = const0_rtx;
3839     }
3840   else
3841     {
3842       enum rtx_code cmp_code;
3843
3844       /* Floating-point tests use a separate c.cond.fmt comparison to
3845          set a condition code register.  The branch or conditional move
3846          will then compare that register against zero.
3847
3848          Set CMP_CODE to the code of the comparison instruction and
3849          *CODE to the code that the branch or move should use.  */
3850       cmp_code = *code;
3851       *code = mips_reverse_fp_cond_p (&cmp_code) ? EQ : NE;
3852       *op0 = (ISA_HAS_8CC
3853               ? gen_reg_rtx (CCmode)
3854               : gen_rtx_REG (CCmode, FPSW_REGNUM));
3855       *op1 = const0_rtx;
3856       mips_emit_binary (cmp_code, *op0, cmp_operands[0], cmp_operands[1]);
3857     }
3858 }
3859 \f
3860 /* Try comparing cmp_operands[0] and cmp_operands[1] using rtl code CODE.
3861    Store the result in TARGET and return true if successful.
3862
3863    On 64-bit targets, TARGET may be wider than cmp_operands[0].  */
3864
3865 bool
3866 mips_emit_scc (enum rtx_code code, rtx target)
3867 {
3868   if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) != MODE_INT)
3869     return false;
3870
3871   target = gen_lowpart (GET_MODE (cmp_operands[0]), target);
3872   if (code == EQ || code == NE)
3873     {
3874       rtx zie = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3875       mips_emit_binary (code, target, zie, const0_rtx);
3876     }
3877   else
3878     mips_emit_int_relational (code, 0, target,
3879                               cmp_operands[0], cmp_operands[1]);
3880   return true;
3881 }
3882
3883 /* Emit the common code for doing conditional branches.
3884    operand[0] is the label to jump to.
3885    The comparison operands are saved away by cmp{si,di,sf,df}.  */
3886
3887 void
3888 gen_conditional_branch (rtx *operands, enum rtx_code code)
3889 {
3890   rtx op0, op1, condition;
3891
3892   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
3893   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
3894   emit_jump_insn (gen_condjump (condition, operands[0]));
3895 }
3896
3897 /* Implement:
3898
3899    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
3900    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
3901
3902 void
3903 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
3904                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
3905 {
3906   rtx cmp_result;
3907   bool reversed_p;
3908
3909   reversed_p = mips_reverse_fp_cond_p (&cond);
3910   cmp_result = gen_reg_rtx (CCV2mode);
3911   emit_insn (gen_scc_ps (cmp_result,
3912                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
3913   if (reversed_p)
3914     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
3915                                          cmp_result));
3916   else
3917     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
3918                                          cmp_result));
3919 }
3920
3921 /* Emit the common code for conditional moves.  OPERANDS is the array
3922    of operands passed to the conditional move define_expand.  */
3923
3924 void
3925 gen_conditional_move (rtx *operands)
3926 {
3927   enum rtx_code code;
3928   rtx op0, op1;
3929
3930   code = GET_CODE (operands[1]);
3931   mips_emit_compare (&code, &op0, &op1, true);
3932   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3933                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
3934                                                 gen_rtx_fmt_ee (code,
3935                                                                 GET_MODE (op0),
3936                                                                 op0, op1),
3937                                                 operands[2], operands[3])));
3938 }
3939
3940 /* Emit a conditional trap.  OPERANDS is the array of operands passed to
3941    the conditional_trap expander.  */
3942
3943 void
3944 mips_gen_conditional_trap (rtx *operands)
3945 {
3946   rtx op0, op1;
3947   enum rtx_code cmp_code = GET_CODE (operands[0]);
3948   enum machine_mode mode = GET_MODE (cmp_operands[0]);
3949
3950   /* MIPS conditional trap machine instructions don't have GT or LE
3951      flavors, so we must invert the comparison and convert to LT and
3952      GE, respectively.  */
3953   switch (cmp_code)
3954     {
3955     case GT: cmp_code = LT; break;
3956     case LE: cmp_code = GE; break;
3957     case GTU: cmp_code = LTU; break;
3958     case LEU: cmp_code = GEU; break;
3959     default: break;
3960     }
3961   if (cmp_code == GET_CODE (operands[0]))
3962     {
3963       op0 = cmp_operands[0];
3964       op1 = cmp_operands[1];
3965     }
3966   else
3967     {
3968       op0 = cmp_operands[1];
3969       op1 = cmp_operands[0];
3970     }
3971   op0 = force_reg (mode, op0);
3972   if (!arith_operand (op1, mode))
3973     op1 = force_reg (mode, op1);
3974
3975   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
3976                               gen_rtx_fmt_ee (cmp_code, mode, op0, op1),
3977                               operands[1]));
3978 }
3979 \f
3980 /* Argument support functions.  */
3981
3982 /* Initialize CUMULATIVE_ARGS for a function.  */
3983
3984 void
3985 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
3986                       rtx libname ATTRIBUTE_UNUSED)
3987 {
3988   static CUMULATIVE_ARGS zero_cum;
3989   tree param, next_param;
3990
3991   *cum = zero_cum;
3992   cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
3993
3994   /* Determine if this function has variable arguments.  This is
3995      indicated by the last argument being 'void_type_mode' if there
3996      are no variable arguments.  The standard MIPS calling sequence
3997      passes all arguments in the general purpose registers in this case.  */
3998
3999   for (param = fntype ? TYPE_ARG_TYPES (fntype) : 0;
4000        param != 0; param = next_param)
4001     {
4002       next_param = TREE_CHAIN (param);
4003       if (next_param == 0 && TREE_VALUE (param) != void_type_node)
4004         cum->gp_reg_found = 1;
4005     }
4006 }
4007
4008
4009 /* Fill INFO with information about a single argument.  CUM is the
4010    cumulative state for earlier arguments.  MODE is the mode of this
4011    argument and TYPE is its type (if known).  NAMED is true if this
4012    is a named (fixed) argument rather than a variable one.  */
4013
4014 static void
4015 mips_arg_info (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4016                tree type, int named, struct mips_arg_info *info)
4017 {
4018   bool doubleword_aligned_p;
4019   unsigned int num_bytes, num_words, max_regs;
4020
4021   /* Work out the size of the argument.  */
4022   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4023   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4024
4025   /* Decide whether it should go in a floating-point register, assuming
4026      one is free.  Later code checks for availability.
4027
4028      The checks against UNITS_PER_FPVALUE handle the soft-float and
4029      single-float cases.  */
4030   switch (mips_abi)
4031     {
4032     case ABI_EABI:
4033       /* The EABI conventions have traditionally been defined in terms
4034          of TYPE_MODE, regardless of the actual type.  */
4035       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4036                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4037                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4038       break;
4039
4040     case ABI_32:
4041     case ABI_O64:
4042       /* Only leading floating-point scalars are passed in
4043          floating-point registers.  We also handle vector floats the same
4044          say, which is OK because they are not covered by the standard ABI.  */
4045       info->fpr_p = (!cum->gp_reg_found
4046                      && cum->arg_number < 2
4047                      && (type == 0 || SCALAR_FLOAT_TYPE_P (type)
4048                          || VECTOR_FLOAT_TYPE_P (type))
4049                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4050                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4051                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4052       break;
4053
4054     case ABI_N32:
4055     case ABI_64:
4056       /* Scalar and complex floating-point types are passed in
4057          floating-point registers.  */
4058       info->fpr_p = (named
4059                      && (type == 0 || FLOAT_TYPE_P (type))
4060                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4061                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4062                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4063                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4064
4065       /* ??? According to the ABI documentation, the real and imaginary
4066          parts of complex floats should be passed in individual registers.
4067          The real and imaginary parts of stack arguments are supposed
4068          to be contiguous and there should be an extra word of padding
4069          at the end.
4070
4071          This has two problems.  First, it makes it impossible to use a
4072          single "void *" va_list type, since register and stack arguments
4073          are passed differently.  (At the time of writing, MIPSpro cannot
4074          handle complex float varargs correctly.)  Second, it's unclear
4075          what should happen when there is only one register free.
4076
4077          For now, we assume that named complex floats should go into FPRs
4078          if there are two FPRs free, otherwise they should be passed in the
4079          same way as a struct containing two floats.  */
4080       if (info->fpr_p
4081           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4082           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4083         {
4084           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4085             info->fpr_p = false;
4086           else
4087             num_words = 2;
4088         }
4089       break;
4090
4091     default:
4092       gcc_unreachable ();
4093     }
4094
4095   /* See whether the argument has doubleword alignment.  */
4096   doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4097
4098   /* Set REG_OFFSET to the register count we're interested in.
4099      The EABI allocates the floating-point registers separately,
4100      but the other ABIs allocate them like integer registers.  */
4101   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4102                       ? cum->num_fprs
4103                       : cum->num_gprs);
4104
4105   /* Advance to an even register if the argument is doubleword-aligned.  */
4106   if (doubleword_aligned_p)
4107     info->reg_offset += info->reg_offset & 1;
4108
4109   /* Work out the offset of a stack argument.  */
4110   info->stack_offset = cum->stack_words;
4111   if (doubleword_aligned_p)
4112     info->stack_offset += info->stack_offset & 1;
4113
4114   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4115
4116   /* Partition the argument between registers and stack.  */
4117   info->reg_words = MIN (num_words, max_regs);
4118   info->stack_words = num_words - info->reg_words;
4119 }
4120
4121 /* INFO describes an argument that is passed in a single-register value.
4122    Return the register it uses, assuming that FPRs are available if
4123    HARD_FLOAT_P.  */
4124
4125 static unsigned int
4126 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4127 {
4128   if (!info->fpr_p || !hard_float_p)
4129     return GP_ARG_FIRST + info->reg_offset;
4130   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4131     /* In o32, the second argument is always passed in $f14
4132        for TARGET_DOUBLE_FLOAT, regardless of whether the
4133        first argument was a word or doubleword.  */
4134     return FP_ARG_FIRST + 2;
4135   else
4136     return FP_ARG_FIRST + info->reg_offset;
4137 }
4138
4139 static bool
4140 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4141 {
4142   return !TARGET_OLDABI;
4143 }
4144
4145 /* Implement FUNCTION_ARG.  */
4146
4147 struct rtx_def *
4148 function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4149               tree type, int named)
4150 {
4151   struct mips_arg_info info;
4152
4153   /* We will be called with a mode of VOIDmode after the last argument
4154      has been seen.  Whatever we return will be passed to the call
4155      insn.  If we need a mips16 fp_code, return a REG with the code
4156      stored as the mode.  */
4157   if (mode == VOIDmode)
4158     {
4159       if (TARGET_MIPS16 && cum->fp_code != 0)
4160         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4161
4162       else
4163         return 0;
4164     }
4165
4166   mips_arg_info (cum, mode, type, named, &info);
4167
4168   /* Return straight away if the whole argument is passed on the stack.  */
4169   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4170     return 0;
4171
4172   if (type != 0
4173       && TREE_CODE (type) == RECORD_TYPE
4174       && TARGET_NEWABI
4175       && TYPE_SIZE_UNIT (type)
4176       && host_integerp (TYPE_SIZE_UNIT (type), 1)
4177       && named)
4178     {
4179       /* The Irix 6 n32/n64 ABIs say that if any 64-bit chunk of the
4180          structure contains a double in its entirety, then that 64-bit
4181          chunk is passed in a floating point register.  */
4182       tree field;
4183
4184       /* First check to see if there is any such field.  */
4185       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4186         if (TREE_CODE (field) == FIELD_DECL
4187             && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4188             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4189             && host_integerp (bit_position (field), 0)
4190             && int_bit_position (field) % BITS_PER_WORD == 0)
4191           break;
4192
4193       if (field != 0)
4194         {
4195           /* Now handle the special case by returning a PARALLEL
4196              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4197              chunks are passed in registers.  */
4198           unsigned int i;
4199           HOST_WIDE_INT bitpos;
4200           rtx ret;
4201
4202           /* assign_parms checks the mode of ENTRY_PARM, so we must
4203              use the actual mode here.  */
4204           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4205
4206           bitpos = 0;
4207           field = TYPE_FIELDS (type);
4208           for (i = 0; i < info.reg_words; i++)
4209             {
4210               rtx reg;
4211
4212               for (; field; field = TREE_CHAIN (field))
4213                 if (TREE_CODE (field) == FIELD_DECL
4214                     && int_bit_position (field) >= bitpos)
4215                   break;
4216
4217               if (field
4218                   && int_bit_position (field) == bitpos
4219                   && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4220                   && !TARGET_SOFT_FLOAT
4221                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4222                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4223               else
4224                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4225
4226               XVECEXP (ret, 0, i)
4227                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4228                                      GEN_INT (bitpos / BITS_PER_UNIT));
4229
4230               bitpos += BITS_PER_WORD;
4231             }
4232           return ret;
4233         }
4234     }
4235
4236   /* Handle the n32/n64 conventions for passing complex floating-point
4237      arguments in FPR pairs.  The real part goes in the lower register
4238      and the imaginary part goes in the upper register.  */
4239   if (TARGET_NEWABI
4240       && info.fpr_p
4241       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4242     {
4243       rtx real, imag;
4244       enum machine_mode inner;
4245       int reg;
4246
4247       inner = GET_MODE_INNER (mode);
4248       reg = FP_ARG_FIRST + info.reg_offset;
4249       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4250         {
4251           /* Real part in registers, imaginary part on stack.  */
4252           gcc_assert (info.stack_words == info.reg_words);
4253           return gen_rtx_REG (inner, reg);
4254         }
4255       else
4256         {
4257           gcc_assert (info.stack_words == 0);
4258           real = gen_rtx_EXPR_LIST (VOIDmode,
4259                                     gen_rtx_REG (inner, reg),
4260                                     const0_rtx);
4261           imag = gen_rtx_EXPR_LIST (VOIDmode,
4262                                     gen_rtx_REG (inner,
4263                                                  reg + info.reg_words / 2),
4264                                     GEN_INT (GET_MODE_SIZE (inner)));
4265           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4266         }
4267     }
4268
4269   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4270 }
4271
4272 /* Implement FUNCTION_ARG_ADVANCE.  */
4273
4274 void
4275 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4276                       tree type, int named)
4277 {
4278   struct mips_arg_info info;
4279
4280   mips_arg_info (cum, mode, type, named, &info);
4281
4282   if (!info.fpr_p)
4283     cum->gp_reg_found = true;
4284
4285   /* See the comment above the cumulative args structure in mips.h
4286      for an explanation of what this code does.  It assumes the O32
4287      ABI, which passes at most 2 arguments in float registers.  */
4288   if (cum->arg_number < 2 && info.fpr_p)
4289     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4290
4291   if (mips_abi != ABI_EABI || !info.fpr_p)
4292     cum->num_gprs = info.reg_offset + info.reg_words;
4293   else if (info.reg_words > 0)
4294     cum->num_fprs += MAX_FPRS_PER_FMT;
4295
4296   if (info.stack_words > 0)
4297     cum->stack_words = info.stack_offset + info.stack_words;
4298
4299   cum->arg_number++;
4300 }
4301
4302 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4303
4304 static int
4305 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4306                         enum machine_mode mode, tree type, bool named)
4307 {
4308   struct mips_arg_info info;
4309
4310   mips_arg_info (cum, mode, type, named, &info);
4311   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4312 }
4313
4314
4315 /* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
4316    PARM_BOUNDARY bits of alignment, but will be given anything up
4317    to STACK_BOUNDARY bits if the type requires it.  */
4318
4319 int
4320 function_arg_boundary (enum machine_mode mode, tree type)
4321 {
4322   unsigned int alignment;
4323
4324   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4325   if (alignment < PARM_BOUNDARY)
4326     alignment = PARM_BOUNDARY;
4327   if (alignment > STACK_BOUNDARY)
4328     alignment = STACK_BOUNDARY;
4329   return alignment;
4330 }
4331
4332 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
4333    upward rather than downward.  In other words, return true if the
4334    first byte of the stack slot has useful data, false if the last
4335    byte does.  */
4336
4337 bool
4338 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
4339 {
4340   /* On little-endian targets, the first byte of every stack argument
4341      is passed in the first byte of the stack slot.  */
4342   if (!BYTES_BIG_ENDIAN)
4343     return true;
4344
4345   /* Otherwise, integral types are padded downward: the last byte of a
4346      stack argument is passed in the last byte of the stack slot.  */
4347   if (type != 0
4348       ? (INTEGRAL_TYPE_P (type)
4349          || POINTER_TYPE_P (type)
4350          || FIXED_POINT_TYPE_P (type))
4351       : (GET_MODE_CLASS (mode) == MODE_INT
4352          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
4353     return false;
4354
4355   /* Big-endian o64 pads floating-point arguments downward.  */
4356   if (mips_abi == ABI_O64)
4357     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4358       return false;
4359
4360   /* Other types are padded upward for o32, o64, n32 and n64.  */
4361   if (mips_abi != ABI_EABI)
4362     return true;
4363
4364   /* Arguments smaller than a stack slot are padded downward.  */
4365   if (mode != BLKmode)
4366     return (GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY);
4367   else
4368     return (int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT));
4369 }
4370
4371
4372 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
4373    if the least significant byte of the register has useful data.  Return
4374    the opposite if the most significant byte does.  */
4375
4376 bool
4377 mips_pad_reg_upward (enum machine_mode mode, tree type)
4378 {
4379   /* No shifting is required for floating-point arguments.  */
4380   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4381     return !BYTES_BIG_ENDIAN;
4382
4383   /* Otherwise, apply the same padding to register arguments as we do
4384      to stack arguments.  */
4385   return mips_pad_arg_upward (mode, type);
4386 }
4387
4388
4389 /* Return nonzero when an argument must be passed by reference.  */
4390
4391 static bool
4392 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4393                         enum machine_mode mode, const_tree type,
4394                         bool named ATTRIBUTE_UNUSED)
4395 {
4396   if (mips_abi == ABI_EABI)
4397     {
4398       int size;
4399
4400       /* ??? How should SCmode be handled?  */
4401       if (mode == DImode || mode == DFmode
4402           || mode == DQmode || mode == UDQmode
4403           || mode == DAmode || mode == UDAmode)
4404         return 0;
4405
4406       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4407       return size == -1 || size > UNITS_PER_WORD;
4408     }
4409   else
4410     {
4411       /* If we have a variable-sized parameter, we have no choice.  */
4412       return targetm.calls.must_pass_in_stack (mode, type);
4413     }
4414 }
4415
4416 static bool
4417 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
4418                     enum machine_mode mode ATTRIBUTE_UNUSED,
4419                     const_tree type ATTRIBUTE_UNUSED, bool named)
4420 {
4421   return mips_abi == ABI_EABI && named;
4422 }
4423 \f
4424 /* See whether VALTYPE is a record whose fields should be returned in
4425    floating-point registers.  If so, return the number of fields and
4426    list them in FIELDS (which should have two elements).  Return 0
4427    otherwise.
4428
4429    For n32 & n64, a structure with one or two fields is returned in
4430    floating-point registers as long as every field has a floating-point
4431    type.  */
4432
4433 static int
4434 mips_fpr_return_fields (const_tree valtype, tree *fields)
4435 {
4436   tree field;
4437   int i;
4438
4439   if (!TARGET_NEWABI)
4440     return 0;
4441
4442   if (TREE_CODE (valtype) != RECORD_TYPE)
4443     return 0;
4444
4445   i = 0;
4446   for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
4447     {
4448       if (TREE_CODE (field) != FIELD_DECL)
4449         continue;
4450
4451       if (TREE_CODE (TREE_TYPE (field)) != REAL_TYPE)
4452         return 0;
4453
4454       if (i == 2)
4455         return 0;
4456
4457       fields[i++] = field;
4458     }
4459   return i;
4460 }
4461
4462
4463 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
4464    a value in the most significant part of $2/$3 if:
4465
4466       - the target is big-endian;
4467
4468       - the value has a structure or union type (we generalize this to
4469         cover aggregates from other languages too); and
4470
4471       - the structure is not returned in floating-point registers.  */
4472
4473 static bool
4474 mips_return_in_msb (const_tree valtype)
4475 {
4476   tree fields[2];
4477
4478   return (TARGET_NEWABI
4479           && TARGET_BIG_ENDIAN
4480           && AGGREGATE_TYPE_P (valtype)
4481           && mips_fpr_return_fields (valtype, fields) == 0);
4482 }
4483
4484
4485 /* Return true if the function return value MODE will get returned in a
4486    floating-point register.  */
4487
4488 static bool
4489 mips_return_mode_in_fpr_p (enum machine_mode mode)
4490 {
4491   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
4492            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
4493            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4494           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
4495 }
4496
4497 /* Return a composite value in a pair of floating-point registers.
4498    MODE1 and OFFSET1 are the mode and byte offset for the first value,
4499    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
4500    complete value.
4501
4502    For n32 & n64, $f0 always holds the first value and $f2 the second.
4503    Otherwise the values are packed together as closely as possible.  */
4504
4505 static rtx
4506 mips_return_fpr_pair (enum machine_mode mode,
4507                       enum machine_mode mode1, HOST_WIDE_INT offset1,
4508                       enum machine_mode mode2, HOST_WIDE_INT offset2)
4509 {
4510   int inc;
4511
4512   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
4513   return gen_rtx_PARALLEL
4514     (mode,
4515      gen_rtvec (2,
4516                 gen_rtx_EXPR_LIST (VOIDmode,
4517                                    gen_rtx_REG (mode1, FP_RETURN),
4518                                    GEN_INT (offset1)),
4519                 gen_rtx_EXPR_LIST (VOIDmode,
4520                                    gen_rtx_REG (mode2, FP_RETURN + inc),
4521                                    GEN_INT (offset2))));
4522
4523 }
4524
4525
4526 /* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
4527    VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
4528    VALTYPE is null and MODE is the mode of the return value.  */
4529
4530 rtx
4531 mips_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED,
4532                      enum machine_mode mode)
4533 {
4534   if (valtype)
4535     {
4536       tree fields[2];
4537       int unsignedp;
4538
4539       mode = TYPE_MODE (valtype);
4540       unsignedp = TYPE_UNSIGNED (valtype);
4541
4542       /* Since we define TARGET_PROMOTE_FUNCTION_RETURN that returns
4543          true, we must promote the mode just as PROMOTE_MODE does.  */
4544       mode = promote_mode (valtype, mode, &unsignedp, 1);
4545
4546       /* Handle structures whose fields are returned in $f0/$f2.  */
4547       switch (mips_fpr_return_fields (valtype, fields))
4548         {
4549         case 1:
4550           return gen_rtx_REG (mode, FP_RETURN);
4551
4552         case 2:
4553           return mips_return_fpr_pair (mode,
4554                                        TYPE_MODE (TREE_TYPE (fields[0])),
4555                                        int_byte_position (fields[0]),
4556                                        TYPE_MODE (TREE_TYPE (fields[1])),
4557                                        int_byte_position (fields[1]));
4558         }
4559
4560       /* If a value is passed in the most significant part of a register, see
4561          whether we have to round the mode up to a whole number of words.  */
4562       if (mips_return_in_msb (valtype))
4563         {
4564           HOST_WIDE_INT size = int_size_in_bytes (valtype);
4565           if (size % UNITS_PER_WORD != 0)
4566             {
4567               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
4568               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
4569             }
4570         }
4571
4572       /* For EABI, the class of return register depends entirely on MODE.
4573          For example, "struct { some_type x; }" and "union { some_type x; }"
4574          are returned in the same way as a bare "some_type" would be.
4575          Other ABIs only use FPRs for scalar, complex or vector types.  */
4576       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
4577         return gen_rtx_REG (mode, GP_RETURN);
4578     }
4579
4580   if (!TARGET_MIPS16)
4581     {
4582       /* Handle long doubles for n32 & n64.  */
4583       if (mode == TFmode)
4584         return mips_return_fpr_pair (mode,
4585                                      DImode, 0,
4586                                      DImode, GET_MODE_SIZE (mode) / 2);
4587
4588       if (mips_return_mode_in_fpr_p (mode))
4589         {
4590           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4591             return mips_return_fpr_pair (mode,
4592                                          GET_MODE_INNER (mode), 0,
4593                                          GET_MODE_INNER (mode),
4594                                          GET_MODE_SIZE (mode) / 2);
4595           else
4596             return gen_rtx_REG (mode, FP_RETURN);
4597         }
4598     }
4599
4600   return gen_rtx_REG (mode, GP_RETURN);
4601 }
4602
4603 /* Implement TARGET_RETURN_IN_MEMORY.  Under the old (i.e., 32 and O64 ABIs)
4604    all BLKmode objects are returned in memory.  Under the new (N32 and
4605    64-bit MIPS ABIs) small structures are returned in a register.
4606    Objects with varying size must still be returned in memory, of
4607    course.  */
4608
4609 static bool
4610 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
4611 {
4612   if (TARGET_OLDABI)
4613     return (TYPE_MODE (type) == BLKmode);
4614   else
4615     return ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
4616             || (int_size_in_bytes (type) == -1));
4617 }
4618 \f
4619 static void
4620 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4621                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
4622                              int no_rtl)
4623 {
4624   CUMULATIVE_ARGS local_cum;
4625   int gp_saved, fp_saved;
4626
4627   /* The caller has advanced CUM up to, but not beyond, the last named
4628      argument.  Advance a local copy of CUM past the last "real" named
4629      argument, to find out how many registers are left over.  */
4630
4631   local_cum = *cum;
4632   FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
4633
4634   /* Found out how many registers we need to save.  */
4635   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
4636   fp_saved = (EABI_FLOAT_VARARGS_P
4637               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
4638               : 0);
4639
4640   if (!no_rtl)
4641     {
4642       if (gp_saved > 0)
4643         {
4644           rtx ptr, mem;
4645
4646           ptr = plus_constant (virtual_incoming_args_rtx,
4647                                REG_PARM_STACK_SPACE (cfun->decl)
4648                                - gp_saved * UNITS_PER_WORD);
4649           mem = gen_frame_mem (BLKmode, ptr);
4650           set_mem_alias_set (mem, get_varargs_alias_set ());
4651
4652           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
4653                                mem, gp_saved);
4654         }
4655       if (fp_saved > 0)
4656         {
4657           /* We can't use move_block_from_reg, because it will use
4658              the wrong mode.  */
4659           enum machine_mode mode;
4660           int off, i;
4661
4662           /* Set OFF to the offset from virtual_incoming_args_rtx of
4663              the first float register.  The FP save area lies below
4664              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
4665           off = -gp_saved * UNITS_PER_WORD;
4666           off &= ~(UNITS_PER_FPVALUE - 1);
4667           off -= fp_saved * UNITS_PER_FPREG;
4668
4669           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
4670
4671           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
4672                i += MAX_FPRS_PER_FMT)
4673             {
4674               rtx ptr, mem;
4675
4676               ptr = plus_constant (virtual_incoming_args_rtx, off);
4677               mem = gen_frame_mem (mode, ptr);
4678               set_mem_alias_set (mem, get_varargs_alias_set ());
4679               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
4680               off += UNITS_PER_HWFPVALUE;
4681             }
4682         }
4683     }
4684   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
4685     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
4686                                    + fp_saved * UNITS_PER_FPREG);
4687 }
4688
4689 /* Create the va_list data type.
4690    We keep 3 pointers, and two offsets.
4691    Two pointers are to the overflow area, which starts at the CFA.
4692      One of these is constant, for addressing into the GPR save area below it.
4693      The other is advanced up the stack through the overflow region.
4694    The third pointer is to the GPR save area.  Since the FPR save area
4695      is just below it, we can address FPR slots off this pointer.
4696    We also keep two one-byte offsets, which are to be subtracted from the
4697      constant pointers to yield addresses in the GPR and FPR save areas.
4698      These are downcounted as float or non-float arguments are used,
4699      and when they get to zero, the argument must be obtained from the
4700      overflow region.
4701    If !EABI_FLOAT_VARARGS_P, then no FPR save area exists, and a single
4702      pointer is enough.  It's started at the GPR save area, and is
4703      advanced, period.
4704    Note that the GPR save area is not constant size, due to optimization
4705      in the prologue.  Hence, we can't use a design with two pointers
4706      and two offsets, although we could have designed this with two pointers
4707      and three offsets.  */
4708
4709 static tree
4710 mips_build_builtin_va_list (void)
4711 {
4712   if (EABI_FLOAT_VARARGS_P)
4713     {
4714       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
4715       tree array, index;
4716
4717       record = (*lang_hooks.types.make_type) (RECORD_TYPE);
4718
4719       f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
4720                           ptr_type_node);
4721       f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
4722                           ptr_type_node);
4723       f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
4724                           ptr_type_node);
4725       f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
4726                           unsigned_char_type_node);
4727       f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
4728                           unsigned_char_type_node);
4729       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
4730          warn on every user file.  */
4731       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
4732       array = build_array_type (unsigned_char_type_node,
4733                                 build_index_type (index));
4734       f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
4735
4736       DECL_FIELD_CONTEXT (f_ovfl) = record;
4737       DECL_FIELD_CONTEXT (f_gtop) = record;
4738       DECL_FIELD_CONTEXT (f_ftop) = record;
4739       DECL_FIELD_CONTEXT (f_goff) = record;
4740       DECL_FIELD_CONTEXT (f_foff) = record;
4741       DECL_FIELD_CONTEXT (f_res) = record;
4742
4743       TYPE_FIELDS (record) = f_ovfl;
4744       TREE_CHAIN (f_ovfl) = f_gtop;
4745       TREE_CHAIN (f_gtop) = f_ftop;
4746       TREE_CHAIN (f_ftop) = f_goff;
4747       TREE_CHAIN (f_goff) = f_foff;
4748       TREE_CHAIN (f_foff) = f_res;
4749
4750       layout_type (record);
4751       return record;
4752     }
4753   else if (TARGET_IRIX && TARGET_IRIX6)
4754     /* On IRIX 6, this type is 'char *'.  */
4755     return build_pointer_type (char_type_node);
4756   else
4757     /* Otherwise, we use 'void *'.  */
4758     return ptr_type_node;
4759 }
4760
4761 /* Implement va_start.  */
4762
4763 void
4764 mips_va_start (tree valist, rtx nextarg)
4765 {
4766   if (EABI_FLOAT_VARARGS_P)
4767     {
4768       const CUMULATIVE_ARGS *cum;
4769       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4770       tree ovfl, gtop, ftop, goff, foff;
4771       tree t;
4772       int gpr_save_area_size;
4773       int fpr_save_area_size;
4774       int fpr_offset;
4775
4776       cum = &current_function_args_info;
4777       gpr_save_area_size
4778         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
4779       fpr_save_area_size
4780         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
4781
4782       f_ovfl = TYPE_FIELDS (va_list_type_node);
4783       f_gtop = TREE_CHAIN (f_ovfl);
4784       f_ftop = TREE_CHAIN (f_gtop);
4785       f_goff = TREE_CHAIN (f_ftop);
4786       f_foff = TREE_CHAIN (f_goff);
4787
4788       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4789                      NULL_TREE);
4790       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4791                      NULL_TREE);
4792       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4793                      NULL_TREE);
4794       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4795                      NULL_TREE);
4796       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4797                      NULL_TREE);
4798
4799       /* Emit code to initialize OVFL, which points to the next varargs
4800          stack argument.  CUM->STACK_WORDS gives the number of stack
4801          words used by named arguments.  */
4802       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
4803       if (cum->stack_words > 0)
4804         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
4805                     size_int (cum->stack_words * UNITS_PER_WORD));
4806       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4807       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4808
4809       /* Emit code to initialize GTOP, the top of the GPR save area.  */
4810       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
4811       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (gtop), gtop, t);
4812       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4813
4814       /* Emit code to initialize FTOP, the top of the FPR save area.
4815          This address is gpr_save_area_bytes below GTOP, rounded
4816          down to the next fp-aligned boundary.  */
4817       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
4818       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
4819       fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
4820       if (fpr_offset)
4821         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
4822                     size_int (-fpr_offset));
4823       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ftop), ftop, t);
4824       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4825
4826       /* Emit code to initialize GOFF, the offset from GTOP of the
4827          next GPR argument.  */
4828       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (goff), goff,
4829                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
4830       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4831
4832       /* Likewise emit code to initialize FOFF, the offset from FTOP
4833          of the next FPR argument.  */
4834       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (foff), foff,
4835                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
4836       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4837     }
4838   else
4839     {
4840       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
4841       std_expand_builtin_va_start (valist, nextarg);
4842     }
4843 }
4844 \f
4845 /* Implement va_arg.  */
4846
4847 static tree
4848 mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
4849 {
4850   HOST_WIDE_INT size, rsize;
4851   tree addr;
4852   bool indirect;
4853
4854   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
4855
4856   if (indirect)
4857     type = build_pointer_type (type);
4858
4859   size = int_size_in_bytes (type);
4860   rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
4861
4862   if (mips_abi != ABI_EABI || !EABI_FLOAT_VARARGS_P)
4863     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4864   else
4865     {
4866       /* Not a simple merged stack.      */
4867
4868       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4869       tree ovfl, top, off, align;
4870       HOST_WIDE_INT osize;
4871       tree t, u;
4872
4873       f_ovfl = TYPE_FIELDS (va_list_type_node);
4874       f_gtop = TREE_CHAIN (f_ovfl);
4875       f_ftop = TREE_CHAIN (f_gtop);
4876       f_goff = TREE_CHAIN (f_ftop);
4877       f_foff = TREE_CHAIN (f_goff);
4878
4879       /* We maintain separate pointers and offsets for floating-point
4880          and integer arguments, but we need similar code in both cases.
4881          Let:
4882
4883          TOP be the top of the register save area;
4884          OFF be the offset from TOP of the next register;
4885          ADDR_RTX be the address of the argument;
4886          RSIZE be the number of bytes used to store the argument
4887          when it's in the register save area;
4888          OSIZE be the number of bytes used to store it when it's
4889          in the stack overflow area; and
4890          PADDING be (BYTES_BIG_ENDIAN ? OSIZE - RSIZE : 0)
4891
4892          The code we want is:
4893
4894          1: off &= -rsize;        // round down
4895          2: if (off != 0)
4896          3:   {
4897          4:      addr_rtx = top - off;
4898          5:      off -= rsize;
4899          6:   }
4900          7: else
4901          8:   {
4902          9:      ovfl += ((intptr_t) ovfl + osize - 1) & -osize;
4903          10:     addr_rtx = ovfl + PADDING;
4904          11:     ovfl += osize;
4905          14:   }
4906
4907          [1] and [9] can sometimes be optimized away.  */
4908
4909       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4910                      NULL_TREE);
4911
4912       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
4913           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
4914         {
4915           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4916                         NULL_TREE);
4917           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4918                         NULL_TREE);
4919
4920           /* When floating-point registers are saved to the stack,
4921              each one will take up UNITS_PER_HWFPVALUE bytes, regardless
4922              of the float's precision.  */
4923           rsize = UNITS_PER_HWFPVALUE;
4924
4925           /* Overflow arguments are padded to UNITS_PER_WORD bytes
4926              (= PARM_BOUNDARY bits).  This can be different from RSIZE
4927              in two cases:
4928
4929              (1) On 32-bit targets when TYPE is a structure such as:
4930
4931              struct s { float f; };
4932
4933              Such structures are passed in paired FPRs, so RSIZE
4934              will be 8 bytes.  However, the structure only takes
4935              up 4 bytes of memory, so OSIZE will only be 4.
4936
4937              (2) In combinations such as -mgp64 -msingle-float
4938              -fshort-double.  Doubles passed in registers
4939              will then take up 4 (UNITS_PER_HWFPVALUE) bytes,
4940              but those passed on the stack take up
4941              UNITS_PER_WORD bytes.  */
4942           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
4943         }
4944       else
4945         {
4946           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4947                         NULL_TREE);
4948           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4949                         NULL_TREE);
4950           if (rsize > UNITS_PER_WORD)
4951             {
4952               /* [1] Emit code for: off &= -rsize.      */
4953               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), off,
4954                           build_int_cst (NULL_TREE, -rsize));
4955               t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (off), off, t);
4956               gimplify_and_add (t, pre_p);
4957             }
4958           osize = rsize;
4959         }
4960
4961       /* [2] Emit code to branch if off == 0.  */
4962       t = build2 (NE_EXPR, boolean_type_node, off,
4963                   build_int_cst (TREE_TYPE (off), 0));
4964       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
4965
4966       /* [5] Emit code for: off -= rsize.  We do this as a form of
4967          post-increment not available to C.  Also widen for the
4968          coming pointer arithmetic.  */
4969       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
4970       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
4971       t = fold_convert (sizetype, t);
4972       t = fold_build1 (NEGATE_EXPR, sizetype, t);
4973
4974       /* [4] Emit code for: addr_rtx = top - off.  On big endian machines,
4975          the argument has RSIZE - SIZE bytes of leading padding.  */
4976       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
4977       if (BYTES_BIG_ENDIAN && rsize > size)
4978         {
4979           u = size_int (rsize - size);
4980           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
4981         }
4982       COND_EXPR_THEN (addr) = t;
4983
4984       if (osize > UNITS_PER_WORD)
4985         {
4986           /* [9] Emit: ovfl += ((intptr_t) ovfl + osize - 1) & -osize.  */
4987           u = size_int (osize - 1);
4988           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
4989           t = fold_convert (sizetype, t);
4990           u = size_int (-osize);
4991           t = build2 (BIT_AND_EXPR, sizetype, t, u);
4992           t = fold_convert (TREE_TYPE (ovfl), t);
4993           align = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4994         }
4995       else
4996         align = NULL;
4997
4998       /* [10, 11].      Emit code to store ovfl in addr_rtx, then
4999          post-increment ovfl by osize.  On big-endian machines,
5000          the argument has OSIZE - SIZE bytes of leading padding.  */
5001       u = fold_convert (TREE_TYPE (ovfl),
5002                         build_int_cst (NULL_TREE, osize));
5003       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5004       if (BYTES_BIG_ENDIAN && osize > size)
5005         {
5006           u = size_int (osize - size);
5007           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5008         }
5009
5010       /* String [9] and [10,11] together.  */
5011       if (align)
5012         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5013       COND_EXPR_ELSE (addr) = t;
5014
5015       addr = fold_convert (build_pointer_type (type), addr);
5016       addr = build_va_arg_indirect_ref (addr);
5017     }
5018
5019   if (indirect)
5020     addr = build_va_arg_indirect_ref (addr);
5021
5022   return addr;
5023 }
5024 \f
5025 /* We keep a list of functions for which we have already built stubs
5026    in build_mips16_call_stub.  */
5027
5028 struct mips16_stub
5029 {
5030   struct mips16_stub *next;
5031   char *name;
5032   int fpret;
5033 };
5034
5035 static struct mips16_stub *mips16_stubs;
5036
5037 /* Return a two-character string representing a function floating-point
5038    return mode, used to name MIPS16 function stubs.  */
5039
5040 static const char *
5041 mips16_call_stub_mode_suffix (enum machine_mode mode)
5042 {
5043   if (mode == SFmode)
5044     return "sf";
5045   else if (mode == DFmode)
5046     return "df";
5047   else if (mode == SCmode)
5048     return "sc";
5049   else if (mode == DCmode)
5050     return "dc";
5051   else if (mode == V2SFmode)
5052     return "df";
5053   else
5054     gcc_unreachable ();
5055 }
5056
5057 /* Write instructions to move a 32-bit value between general register
5058    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5059    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5060
5061 static void
5062 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5063 {
5064   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5065            reg_names[gpreg], reg_names[fpreg]);
5066 }
5067
5068 /* Likewise for 64-bit values.  */
5069
5070 static void
5071 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5072 {
5073   if (TARGET_64BIT)
5074     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5075              reg_names[gpreg], reg_names[fpreg]);
5076   else if (TARGET_FLOAT64)
5077     {
5078       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5079                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5080       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5081                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5082     }
5083   else
5084     {
5085       /* Move the least-significant word.  */
5086       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5087                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5088       /* ...then the most significant word.  */
5089       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5090                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
5091     }
5092 }
5093
5094 /* Write out code to move floating-point arguments into or out of
5095    general registers.  FP_CODE is the code describing which arguments
5096    are present (see the comment above the definition of CUMULATIVE_ARGS
5097    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
5098
5099 static void
5100 mips_output_args_xfer (int fp_code, char direction)
5101 {
5102   unsigned int gparg, fparg, f;
5103   CUMULATIVE_ARGS cum;
5104
5105   /* This code only works for the original 32-bit ABI and the O64 ABI.  */
5106   gcc_assert (TARGET_OLDABI);
5107
5108   init_cumulative_args (&cum, NULL, NULL);
5109
5110   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5111     {
5112       enum machine_mode mode;
5113       struct mips_arg_info info;
5114
5115       if ((f & 3) == 1)
5116         mode = SFmode;
5117       else if ((f & 3) == 2)
5118         mode = DFmode;
5119       else
5120         gcc_unreachable ();
5121
5122       mips_arg_info (&cum, mode, NULL, true, &info);
5123       gparg = mips_arg_regno (&info, false);
5124       fparg = mips_arg_regno (&info, true);
5125
5126       if (mode == SFmode)
5127         mips_output_32bit_xfer (direction, gparg, fparg);
5128       else
5129         mips_output_64bit_xfer (direction, gparg, fparg);
5130
5131       function_arg_advance (&cum, mode, NULL, true);
5132     }
5133 }
5134
5135 /* Build a mips16 function stub.  This is used for functions which
5136    take arguments in the floating point registers.  It is 32-bit code
5137    that moves the floating point args into the general registers, and
5138    then jumps to the 16-bit code.  */
5139
5140 static void
5141 build_mips16_function_stub (void)
5142 {
5143   const char *fnname;
5144   char *secname, *stubname;
5145   tree stubid, stubdecl;
5146   int need_comma;
5147   unsigned int f;
5148
5149   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
5150   fnname = targetm.strip_name_encoding (fnname);
5151   secname = (char *) alloca (strlen (fnname) + 20);
5152   sprintf (secname, ".mips16.fn.%s", fnname);
5153   stubname = (char *) alloca (strlen (fnname) + 20);
5154   sprintf (stubname, "__fn_stub_%s", fnname);
5155   stubid = get_identifier (stubname);
5156   stubdecl = build_decl (FUNCTION_DECL, stubid,
5157                          build_function_type (void_type_node, NULL_TREE));
5158   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5159   DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
5160
5161   fprintf (asm_out_file, "\t# Stub function for %s (",
5162            current_function_name ());
5163   need_comma = 0;
5164   for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
5165     {
5166       fprintf (asm_out_file, "%s%s",
5167                need_comma ? ", " : "",
5168                (f & 3) == 1 ? "float" : "double");
5169       need_comma = 1;
5170     }
5171   fprintf (asm_out_file, ")\n");
5172
5173   fprintf (asm_out_file, "\t.set\tnomips16\n");
5174   switch_to_section (function_section (stubdecl));
5175   ASM_OUTPUT_ALIGN (asm_out_file,
5176                     floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT));
5177
5178   /* ??? If FUNCTION_NAME_ALREADY_DECLARED is defined, then we are
5179      within a .ent, and we cannot emit another .ent.  */
5180   if (!FUNCTION_NAME_ALREADY_DECLARED)
5181     {
5182       fputs ("\t.ent\t", asm_out_file);
5183       assemble_name (asm_out_file, stubname);
5184       fputs ("\n", asm_out_file);
5185     }
5186
5187   assemble_name (asm_out_file, stubname);
5188   fputs (":\n", asm_out_file);
5189
5190   /* Load the address of the MIPS16 function into $at.  Do this first so
5191      that targets with coprocessor interlocks can use an MFC1 to fill the
5192      delay slot.  */
5193   fprintf (asm_out_file, "\t.set\tnoat\n");
5194   fprintf (asm_out_file, "\tla\t%s,", reg_names[GP_REG_FIRST + 1]);
5195   assemble_name (asm_out_file, fnname);
5196   fprintf (asm_out_file, "\n");
5197
5198   mips_output_args_xfer (current_function_args_info.fp_code, 'f');
5199
5200   fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
5201   fprintf (asm_out_file, "\t.set\tat\n");
5202
5203   if (!FUNCTION_NAME_ALREADY_DECLARED)
5204     {
5205       fputs ("\t.end\t", asm_out_file);
5206       assemble_name (asm_out_file, stubname);
5207       fputs ("\n", asm_out_file);
5208     }
5209
5210   switch_to_section (function_section (current_function_decl));
5211 }
5212
5213 /* The current function is a MIPS16 function that returns a value in an FPR.
5214    Copy the return value from its soft-float to its hard-float location.
5215    libgcc2 has special non-MIPS16 helper functions for each case.  */
5216
5217 static void
5218 mips16_copy_fpr_return_value (void)
5219 {
5220   rtx fn, insn, arg, call;
5221   tree id, return_type;
5222   enum machine_mode return_mode;
5223
5224   return_type = DECL_RESULT (current_function_decl);
5225   return_mode = DECL_MODE (return_type);
5226
5227   id = get_identifier (ACONCAT (("__mips16_ret_",
5228                                  mips16_call_stub_mode_suffix (return_mode),
5229                                  NULL)));
5230   fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
5231   arg = gen_rtx_REG (return_mode, GP_RETURN);
5232   call = gen_call_value_internal (arg, fn, const0_rtx);
5233   insn = emit_call_insn (call);
5234   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg);
5235 }
5236
5237 /* Build a call stub for a mips16 call.  A stub is needed if we are
5238    passing any floating point values which should go into the floating
5239    point registers.  If we are, and the call turns out to be to a
5240    32-bit function, the stub will be used to move the values into the
5241    floating point registers before calling the 32-bit function.  The
5242    linker will magically adjust the function call to either the 16-bit
5243    function or the 32-bit stub, depending upon where the function call
5244    is actually defined.
5245
5246    Similarly, we need a stub if the return value might come back in a
5247    floating point register.
5248
5249    RETVAL is the location of the return value, or null if this is
5250    a call rather than a call_value.  FN is the address of the
5251    function and ARG_SIZE is the size of the arguments.  FP_CODE
5252    is the code built by function_arg.  This function returns a nonzero
5253    value if it builds the call instruction itself.  */
5254
5255 int
5256 build_mips16_call_stub (rtx retval, rtx fn, rtx arg_size, int fp_code)
5257 {
5258   int fpret = 0;
5259   const char *fnname;
5260   char *secname, *stubname;
5261   struct mips16_stub *l;
5262   tree stubid, stubdecl;
5263   int need_comma;
5264   unsigned int f;
5265   rtx insn;
5266
5267   /* We don't need to do anything if we aren't in mips16 mode, or if
5268      we were invoked with the -msoft-float option.  */
5269   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
5270     return 0;
5271
5272   /* Figure out whether the value might come back in a floating point
5273      register.  */
5274   if (retval)
5275     fpret = mips_return_mode_in_fpr_p (GET_MODE (retval));
5276
5277   /* We don't need to do anything if there were no floating point
5278      arguments and the value will not be returned in a floating point
5279      register.  */
5280   if (fp_code == 0 && ! fpret)
5281     return 0;
5282
5283   /* We don't need to do anything if this is a call to a special
5284      mips16 support function.  */
5285   if (GET_CODE (fn) == SYMBOL_REF
5286       && strncmp (XSTR (fn, 0), "__mips16_", 9) == 0)
5287     return 0;
5288
5289   /* This code will only work for o32 and o64 abis.  The other ABI's
5290      require more sophisticated support.  */
5291   gcc_assert (TARGET_OLDABI);
5292
5293   /* If we're calling via a function pointer, then we must always call
5294      via a stub.  There are magic stubs provided in libgcc.a for each
5295      of the required cases.  Each of them expects the function address
5296      to arrive in register $2.  */
5297
5298   if (GET_CODE (fn) != SYMBOL_REF)
5299     {
5300       char buf[30];
5301       tree id;
5302       rtx stub_fn, insn;
5303
5304       /* ??? If this code is modified to support other ABI's, we need
5305          to handle PARALLEL return values here.  */
5306
5307       if (fpret)
5308         sprintf (buf, "__mips16_call_stub_%s_%d",
5309                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
5310                  fp_code);
5311       else
5312         sprintf (buf, "__mips16_call_stub_%d",
5313                  fp_code);
5314
5315       id = get_identifier (buf);
5316       stub_fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
5317
5318       mips_emit_move (gen_rtx_REG (Pmode, 2), fn);
5319
5320       if (retval == NULL_RTX)
5321         insn = gen_call_internal (stub_fn, arg_size);
5322       else
5323         insn = gen_call_value_internal (retval, stub_fn, arg_size);
5324       insn = emit_call_insn (insn);
5325
5326       /* Put the register usage information on the CALL.  */
5327       CALL_INSN_FUNCTION_USAGE (insn) =
5328         gen_rtx_EXPR_LIST (VOIDmode,
5329                            gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 2)),
5330                            CALL_INSN_FUNCTION_USAGE (insn));
5331
5332       /* If we are handling a floating point return value, we need to
5333          save $18 in the function prologue.  Putting a note on the
5334          call will mean that df_regs_ever_live_p ($18) will be true if the
5335          call is not eliminated, and we can check that in the prologue
5336          code.  */
5337       if (fpret)
5338         CALL_INSN_FUNCTION_USAGE (insn) =
5339           gen_rtx_EXPR_LIST (VOIDmode,
5340                              gen_rtx_USE (VOIDmode,
5341                                           gen_rtx_REG (word_mode, 18)),
5342                              CALL_INSN_FUNCTION_USAGE (insn));
5343
5344       /* Return 1 to tell the caller that we've generated the call
5345          insn.  */
5346       return 1;
5347     }
5348
5349   /* We know the function we are going to call.  If we have already
5350      built a stub, we don't need to do anything further.  */
5351
5352   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
5353   for (l = mips16_stubs; l != NULL; l = l->next)
5354     if (strcmp (l->name, fnname) == 0)
5355       break;
5356
5357   if (l == NULL)
5358     {
5359       /* Build a special purpose stub.  When the linker sees a
5360          function call in mips16 code, it will check where the target
5361          is defined.  If the target is a 32-bit call, the linker will
5362          search for the section defined here.  It can tell which
5363          symbol this section is associated with by looking at the
5364          relocation information (the name is unreliable, since this
5365          might be a static function).  If such a section is found, the
5366          linker will redirect the call to the start of the magic
5367          section.
5368
5369          If the function does not return a floating point value, the
5370          special stub section is named
5371              .mips16.call.FNNAME
5372
5373          If the function does return a floating point value, the stub
5374          section is named
5375              .mips16.call.fp.FNNAME
5376          */
5377
5378       secname = (char *) alloca (strlen (fnname) + 40);
5379       sprintf (secname, ".mips16.call.%s%s",
5380                fpret ? "fp." : "",
5381                fnname);
5382       stubname = (char *) alloca (strlen (fnname) + 20);
5383       sprintf (stubname, "__call_stub_%s%s",
5384                fpret ? "fp_" : "",
5385                fnname);
5386       stubid = get_identifier (stubname);
5387       stubdecl = build_decl (FUNCTION_DECL, stubid,
5388                              build_function_type (void_type_node, NULL_TREE));
5389       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5390       DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
5391
5392       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
5393                (fpret
5394                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
5395                 : ""),
5396                fnname);
5397       need_comma = 0;
5398       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5399         {
5400           fprintf (asm_out_file, "%s%s",
5401                    need_comma ? ", " : "",
5402                    (f & 3) == 1 ? "float" : "double");
5403           need_comma = 1;
5404         }
5405       fprintf (asm_out_file, ")\n");
5406
5407       fprintf (asm_out_file, "\t.set\tnomips16\n");
5408       assemble_start_function (stubdecl, stubname);
5409
5410       if (!FUNCTION_NAME_ALREADY_DECLARED)
5411         {
5412           fputs ("\t.ent\t", asm_out_file);
5413           assemble_name (asm_out_file, stubname);
5414           fputs ("\n", asm_out_file);
5415
5416           assemble_name (asm_out_file, stubname);
5417           fputs (":\n", asm_out_file);
5418         }
5419
5420       /* We build the stub code by hand.  That's the only way we can
5421          do it, since we can't generate 32-bit code during a 16-bit
5422          compilation.  */
5423
5424       if (! fpret)
5425         {
5426           /* Load the address of the MIPS16 function into $at.  Do this
5427              first so that targets with coprocessor interlocks can use
5428              an MFC1 to fill the delay slot.  */
5429           fprintf (asm_out_file, "\t.set\tnoat\n");
5430           fprintf (asm_out_file, "\tla\t%s,%s\n", reg_names[GP_REG_FIRST + 1],
5431                    fnname);
5432         }
5433
5434       mips_output_args_xfer (fp_code, 't');
5435
5436       if (! fpret)
5437         {
5438           /* Jump to the previously-loaded address.  */
5439           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
5440           fprintf (asm_out_file, "\t.set\tat\n");
5441         }
5442       else
5443         {
5444           fprintf (asm_out_file, "\tmove\t%s,%s\n",
5445                    reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
5446           fprintf (asm_out_file, "\tjal\t%s\n", fnname);
5447           switch (GET_MODE (retval))
5448             {
5449             case SCmode:
5450               mips_output_32bit_xfer ('f', GP_RETURN + 1,
5451                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
5452               /* Fall though.  */
5453             case SFmode:
5454               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
5455               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
5456                 {
5457                   /* On 64-bit targets, complex floats are returned in
5458                      a single GPR, such that "sd" on a suitably-aligned
5459                      target would store the value correctly.  */
5460                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
5461                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
5462                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
5463                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
5464                            reg_names[GP_RETURN],
5465                            reg_names[GP_RETURN],
5466                            reg_names[GP_RETURN + 1]);
5467                 }
5468               break;
5469
5470             case DCmode:
5471               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
5472                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
5473               /* Fall though.  */
5474             case DFmode:
5475             case V2SFmode:
5476               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
5477               break;
5478
5479             default:
5480               gcc_unreachable ();
5481             }
5482           fprintf (asm_out_file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 18]);
5483         }
5484
5485 #ifdef ASM_DECLARE_FUNCTION_SIZE
5486       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
5487 #endif
5488
5489       if (!FUNCTION_NAME_ALREADY_DECLARED)
5490         {
5491           fputs ("\t.end\t", asm_out_file);
5492           assemble_name (asm_out_file, stubname);
5493           fputs ("\n", asm_out_file);
5494         }
5495
5496       /* Record this stub.  */
5497       l = (struct mips16_stub *) xmalloc (sizeof *l);
5498       l->name = xstrdup (fnname);
5499       l->fpret = fpret;
5500       l->next = mips16_stubs;
5501       mips16_stubs = l;
5502     }
5503
5504   /* If we expect a floating point return value, but we've built a
5505      stub which does not expect one, then we're in trouble.  We can't
5506      use the existing stub, because it won't handle the floating point
5507      value.  We can't build a new stub, because the linker won't know
5508      which stub to use for the various calls in this object file.
5509      Fortunately, this case is illegal, since it means that a function
5510      was declared in two different ways in a single compilation.  */
5511   if (fpret && ! l->fpret)
5512     error ("cannot handle inconsistent calls to %qs", fnname);
5513
5514   if (retval == NULL_RTX)
5515     insn = gen_call_internal_direct (fn, arg_size);
5516   else
5517     insn = gen_call_value_internal_direct (retval, fn, arg_size);
5518   insn = emit_call_insn (insn);
5519
5520   /* If we are calling a stub which handles a floating point return
5521      value, we need to arrange to save $18 in the prologue.  We do
5522      this by marking the function call as using the register.  The
5523      prologue will later see that it is used, and emit code to save
5524      it.  */
5525   if (l->fpret)
5526     CALL_INSN_FUNCTION_USAGE (insn) =
5527       gen_rtx_EXPR_LIST (VOIDmode,
5528                          gen_rtx_USE (VOIDmode, gen_rtx_REG (word_mode, 18)),
5529                          CALL_INSN_FUNCTION_USAGE (insn));
5530
5531   /* Return 1 to tell the caller that we've generated the call
5532      insn.  */
5533   return 1;
5534 }
5535 \f
5536 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5537
5538 static bool
5539 mips_ok_for_lazy_binding_p (rtx x)
5540 {
5541   return (TARGET_USE_GOT
5542           && GET_CODE (x) == SYMBOL_REF
5543           && !mips_symbol_binds_local_p (x));
5544 }
5545
5546 /* Load function address ADDR into register DEST.  SIBCALL_P is true
5547    if the address is needed for a sibling call.  Return true if we
5548    used an explicit lazy-binding sequence.  */
5549
5550 static bool
5551 mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
5552 {
5553   /* If we're generating PIC, and this call is to a global function,
5554      try to allow its address to be resolved lazily.  This isn't
5555      possible if TARGET_CALL_SAVED_GP since the value of $gp on entry
5556      to the stub would be our caller's gp, not ours.  */
5557   if (TARGET_EXPLICIT_RELOCS
5558       && !(sibcall_p && TARGET_CALL_SAVED_GP)
5559       && mips_ok_for_lazy_binding_p (addr))
5560     {
5561       rtx high, lo_sum_symbol;
5562
5563       high = mips_unspec_offset_high (dest, pic_offset_table_rtx,
5564                                       addr, SYMBOL_GOTOFF_CALL);
5565       lo_sum_symbol = mips_unspec_address (addr, SYMBOL_GOTOFF_CALL);
5566       if (Pmode == SImode)
5567         emit_insn (gen_load_callsi (dest, high, lo_sum_symbol));
5568       else
5569         emit_insn (gen_load_calldi (dest, high, lo_sum_symbol));
5570       return true;
5571     }
5572   else
5573     {
5574       mips_emit_move (dest, addr);
5575       return false;
5576     }
5577 }
5578
5579
5580 /* Expand a call or call_value instruction.  RESULT is where the
5581    result will go (null for calls), ADDR is the address of the
5582    function, ARGS_SIZE is the size of the arguments and AUX is
5583    the value passed to us by mips_function_arg.  SIBCALL_P is true
5584    if we are expanding a sibling call, false if we're expanding
5585    a normal call.  */
5586
5587 void
5588 mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p)
5589 {
5590   rtx orig_addr, pattern, insn;
5591   bool lazy_p;
5592
5593   orig_addr = addr;
5594   lazy_p = false;
5595   if (!call_insn_operand (addr, VOIDmode))
5596     {
5597       addr = gen_reg_rtx (Pmode);
5598       lazy_p = mips_load_call_address (addr, orig_addr, sibcall_p);
5599     }
5600
5601   if (TARGET_MIPS16
5602       && TARGET_HARD_FLOAT_ABI
5603       && build_mips16_call_stub (result, addr, args_size,
5604                                  aux == 0 ? 0 : (int) GET_MODE (aux)))
5605     return;
5606
5607   if (result == 0)
5608     pattern = (sibcall_p
5609                ? gen_sibcall_internal (addr, args_size)
5610                : gen_call_internal (addr, args_size));
5611   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
5612     {
5613       rtx reg1, reg2;
5614
5615       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
5616       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
5617       pattern =
5618         (sibcall_p
5619          ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
5620          : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
5621     }
5622   else
5623     pattern = (sibcall_p
5624                ? gen_sibcall_value_internal (result, addr, args_size)
5625                : gen_call_value_internal (result, addr, args_size));
5626
5627   insn = emit_call_insn (pattern);
5628
5629   /* Lazy-binding stubs require $gp to be valid on entry.  We also pretend
5630      that they use FAKE_CALL_REGNO; see the load_call<mode> patterns for
5631      details.  */
5632   if (lazy_p)
5633     {
5634       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
5635       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
5636                gen_rtx_REG (Pmode, FAKE_CALL_REGNO));
5637     }
5638 }
5639
5640
5641 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
5642
5643 static bool
5644 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
5645 {
5646   if (!TARGET_SIBCALLS)
5647     return false;
5648
5649   /* We can't do a sibcall if the called function is a MIPS16 function
5650      because there is no direct "jx" instruction equivalent to "jalx" to
5651      switch the ISA mode.  We only care about cases where the sibling
5652      and normal calls would both be direct.  */
5653   if (mips_use_mips16_mode_p (decl)
5654       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
5655     return false;
5656
5657   /* When -minterlink-mips16 is in effect, assume that external
5658      functions could be MIPS16 ones unless an attribute explicitly
5659      tells us otherwise.  */
5660   if (TARGET_INTERLINK_MIPS16
5661       && decl
5662       && DECL_EXTERNAL (decl)
5663       && !mips_nomips16_decl_p (decl)
5664       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
5665     return false;
5666
5667   /* Otherwise OK.  */
5668   return true;
5669 }
5670 \f
5671 /* Emit code to move general operand SRC into condition-code
5672    register DEST.  SCRATCH is a scratch TFmode float register.
5673    The sequence is:
5674
5675         FP1 = SRC
5676         FP2 = 0.0f
5677         DEST = FP2 < FP1
5678
5679    where FP1 and FP2 are single-precision float registers
5680    taken from SCRATCH.  */
5681
5682 void
5683 mips_emit_fcc_reload (rtx dest, rtx src, rtx scratch)
5684 {
5685   rtx fp1, fp2;
5686
5687   /* Change the source to SFmode.  */
5688   if (MEM_P (src))
5689     src = adjust_address (src, SFmode, 0);
5690   else if (REG_P (src) || GET_CODE (src) == SUBREG)
5691     src = gen_rtx_REG (SFmode, true_regnum (src));
5692
5693   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
5694   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
5695
5696   mips_emit_move (copy_rtx (fp1), src);
5697   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
5698   emit_insn (gen_slt_sf (dest, fp2, fp1));
5699 }
5700 \f
5701 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
5702    Assume that the areas do not overlap.  */
5703
5704 static void
5705 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
5706 {
5707   HOST_WIDE_INT offset, delta;
5708   unsigned HOST_WIDE_INT bits;
5709   int i;
5710   enum machine_mode mode;
5711   rtx *regs;
5712
5713   /* Work out how many bits to move at a time.  If both operands have
5714      half-word alignment, it is usually better to move in half words.
5715      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
5716      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
5717      Otherwise move word-sized chunks.  */
5718   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
5719       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
5720     bits = BITS_PER_WORD / 2;
5721   else
5722     bits = BITS_PER_WORD;
5723
5724   mode = mode_for_size (bits, MODE_INT, 0);
5725   delta = bits / BITS_PER_UNIT;
5726
5727   /* Allocate a buffer for the temporary registers.  */
5728   regs = alloca (sizeof (rtx) * length / delta);
5729
5730   /* Load as many BITS-sized chunks as possible.  Use a normal load if
5731      the source has enough alignment, otherwise use left/right pairs.  */
5732   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
5733     {
5734       regs[i] = gen_reg_rtx (mode);
5735       if (MEM_ALIGN (src) >= bits)
5736         mips_emit_move (regs[i], adjust_address (src, mode, offset));
5737       else
5738         {
5739           rtx part = adjust_address (src, BLKmode, offset);
5740           if (!mips_expand_unaligned_load (regs[i], part, bits, 0))
5741             gcc_unreachable ();
5742         }
5743     }
5744
5745   /* Copy the chunks to the destination.  */
5746   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
5747     if (MEM_ALIGN (dest) >= bits)
5748       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
5749     else
5750       {
5751         rtx part = adjust_address (dest, BLKmode, offset);
5752         if (!mips_expand_unaligned_store (part, regs[i], bits, 0))
5753           gcc_unreachable ();
5754       }
5755
5756   /* Mop up any left-over bytes.  */
5757   if (offset < length)
5758     {
5759       src = adjust_address (src, BLKmode, offset);
5760       dest = adjust_address (dest, BLKmode, offset);
5761       move_by_pieces (dest, src, length - offset,
5762                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
5763     }
5764 }
5765 \f
5766 #define MAX_MOVE_REGS 4
5767 #define MAX_MOVE_BYTES (MAX_MOVE_REGS * UNITS_PER_WORD)
5768
5769
5770 /* Helper function for doing a loop-based block operation on memory
5771    reference MEM.  Each iteration of the loop will operate on LENGTH
5772    bytes of MEM.
5773
5774    Create a new base register for use within the loop and point it to
5775    the start of MEM.  Create a new memory reference that uses this
5776    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
5777
5778 static void
5779 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
5780                        rtx *loop_reg, rtx *loop_mem)
5781 {
5782   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
5783
5784   /* Although the new mem does not refer to a known location,
5785      it does keep up to LENGTH bytes of alignment.  */
5786   *loop_mem = change_address (mem, BLKmode, *loop_reg);
5787   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
5788 }
5789
5790
5791 /* Move LENGTH bytes from SRC to DEST using a loop that moves MAX_MOVE_BYTES
5792    per iteration.  LENGTH must be at least MAX_MOVE_BYTES.  Assume that the
5793    memory regions do not overlap.  */
5794
5795 static void
5796 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length)
5797 {
5798   rtx label, src_reg, dest_reg, final_src;
5799   HOST_WIDE_INT leftover;
5800
5801   leftover = length % MAX_MOVE_BYTES;
5802   length -= leftover;
5803
5804   /* Create registers and memory references for use within the loop.  */
5805   mips_adjust_block_mem (src, MAX_MOVE_BYTES, &src_reg, &src);
5806   mips_adjust_block_mem (dest, MAX_MOVE_BYTES, &dest_reg, &dest);
5807
5808   /* Calculate the value that SRC_REG should have after the last iteration
5809      of the loop.  */
5810   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
5811                                    0, 0, OPTAB_WIDEN);
5812
5813   /* Emit the start of the loop.  */
5814   label = gen_label_rtx ();
5815   emit_label (label);
5816
5817   /* Emit the loop body.  */
5818   mips_block_move_straight (dest, src, MAX_MOVE_BYTES);
5819
5820   /* Move on to the next block.  */
5821   mips_emit_move (src_reg, plus_constant (src_reg, MAX_MOVE_BYTES));
5822   mips_emit_move (dest_reg, plus_constant (dest_reg, MAX_MOVE_BYTES));
5823
5824   /* Emit the loop condition.  */
5825   if (Pmode == DImode)
5826     emit_insn (gen_cmpdi (src_reg, final_src));
5827   else
5828     emit_insn (gen_cmpsi (src_reg, final_src));
5829   emit_jump_insn (gen_bne (label));
5830
5831   /* Mop up any left-over bytes.  */
5832   if (leftover)
5833     mips_block_move_straight (dest, src, leftover);
5834 }
5835
5836 /* Expand a movmemsi instruction.  */
5837
5838 bool
5839 mips_expand_block_move (rtx dest, rtx src, rtx length)
5840 {
5841   if (GET_CODE (length) == CONST_INT)
5842     {
5843       if (INTVAL (length) <= 2 * MAX_MOVE_BYTES)
5844         {
5845           mips_block_move_straight (dest, src, INTVAL (length));
5846           return true;
5847         }
5848       else if (optimize)
5849         {
5850           mips_block_move_loop (dest, src, INTVAL (length));
5851           return true;
5852         }
5853     }
5854   return false;
5855 }
5856 \f
5857
5858 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
5859
5860 void
5861 mips_expand_synci_loop (rtx begin, rtx end)
5862 {
5863   rtx inc, label, cmp, cmp_result;
5864
5865   /* Load INC with the cache line size (rdhwr INC,$1). */
5866   inc = gen_reg_rtx (SImode);
5867   emit_insn (gen_rdhwr (inc, const1_rtx));
5868
5869   /* Loop back to here.  */
5870   label = gen_label_rtx ();
5871   emit_label (label);
5872
5873   emit_insn (gen_synci (begin));
5874
5875   cmp = gen_reg_rtx (Pmode);
5876   mips_emit_binary (GTU, cmp, begin, end);
5877
5878   mips_emit_binary (PLUS, begin, begin, inc);
5879
5880   cmp_result = gen_rtx_EQ (VOIDmode, cmp, const0_rtx);
5881   emit_jump_insn (gen_condjump (cmp_result, label));
5882 }
5883 \f
5884 /* Return true if it is possible to use left/right accesses for a
5885    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
5886    returning true, update *OP, *LEFT and *RIGHT as follows:
5887
5888    *OP is a BLKmode reference to the whole field.
5889
5890    *LEFT is a QImode reference to the first byte if big endian or
5891    the last byte if little endian.  This address can be used in the
5892    left-side instructions (lwl, swl, ldl, sdl).
5893
5894    *RIGHT is a QImode reference to the opposite end of the field and
5895    can be used in the patterning right-side instruction.  */
5896
5897 static bool
5898 mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
5899                         rtx *left, rtx *right)
5900 {
5901   rtx first, last;
5902
5903   /* Check that the operand really is a MEM.  Not all the extv and
5904      extzv predicates are checked.  */
5905   if (!MEM_P (*op))
5906     return false;
5907
5908   /* Check that the size is valid.  */
5909   if (width != 32 && (!TARGET_64BIT || width != 64))
5910     return false;
5911
5912   /* We can only access byte-aligned values.  Since we are always passed
5913      a reference to the first byte of the field, it is not necessary to
5914      do anything with BITPOS after this check.  */
5915   if (bitpos % BITS_PER_UNIT != 0)
5916     return false;
5917
5918   /* Reject aligned bitfields: we want to use a normal load or store
5919      instead of a left/right pair.  */
5920   if (MEM_ALIGN (*op) >= width)
5921     return false;
5922
5923   /* Adjust *OP to refer to the whole field.  This also has the effect
5924      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
5925   *op = adjust_address (*op, BLKmode, 0);
5926   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
5927
5928   /* Get references to both ends of the field.  We deliberately don't
5929      use the original QImode *OP for FIRST since the new BLKmode one
5930      might have a simpler address.  */
5931   first = adjust_address (*op, QImode, 0);
5932   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
5933
5934   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
5935      be the upper word and RIGHT the lower word.  */
5936   if (TARGET_BIG_ENDIAN)
5937     *left = first, *right = last;
5938   else
5939     *left = last, *right = first;
5940
5941   return true;
5942 }
5943
5944
5945 /* Try to emit the equivalent of (set DEST (zero_extract SRC WIDTH BITPOS)).
5946    Return true on success.  We only handle cases where zero_extract is
5947    equivalent to sign_extract.  */
5948
5949 bool
5950 mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
5951 {
5952   rtx left, right, temp;
5953
5954   /* If TARGET_64BIT, the destination of a 32-bit load will be a
5955      paradoxical word_mode subreg.  This is the only case in which
5956      we allow the destination to be larger than the source.  */
5957   if (GET_CODE (dest) == SUBREG
5958       && GET_MODE (dest) == DImode
5959       && SUBREG_BYTE (dest) == 0
5960       && GET_MODE (SUBREG_REG (dest)) == SImode)
5961     dest = SUBREG_REG (dest);
5962
5963   /* After the above adjustment, the destination must be the same
5964      width as the source.  */
5965   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
5966     return false;
5967
5968   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
5969     return false;
5970
5971   temp = gen_reg_rtx (GET_MODE (dest));
5972   if (GET_MODE (dest) == DImode)
5973     {
5974       emit_insn (gen_mov_ldl (temp, src, left));
5975       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
5976     }
5977   else
5978     {
5979       emit_insn (gen_mov_lwl (temp, src, left));
5980       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
5981     }
5982   return true;
5983 }
5984
5985
5986 /* Try to expand (set (zero_extract DEST WIDTH BITPOS) SRC).  Return
5987    true on success.  */
5988
5989 bool
5990 mips_expand_unaligned_store (rtx dest, rtx src, unsigned int width, int bitpos)
5991 {
5992   rtx left, right;
5993   enum machine_mode mode;
5994
5995   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
5996     return false;
5997
5998   mode = mode_for_size (width, MODE_INT, 0);
5999   src = gen_lowpart (mode, src);
6000
6001   if (mode == DImode)
6002     {
6003       emit_insn (gen_mov_sdl (dest, src, left));
6004       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
6005     }
6006   else
6007     {
6008       emit_insn (gen_mov_swl (dest, src, left));
6009       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
6010     }
6011   return true;
6012 }
6013
6014 /* Return true if X is a MEM with the same size as MODE.  */
6015
6016 bool
6017 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
6018 {
6019   rtx size;
6020
6021   if (!MEM_P (x))
6022     return false;
6023
6024   size = MEM_SIZE (x);
6025   return size && INTVAL (size) == GET_MODE_SIZE (mode);
6026 }
6027
6028 /* Return true if (zero_extract OP SIZE POSITION) can be used as the
6029    source of an "ext" instruction or the destination of an "ins"
6030    instruction.  OP must be a register operand and the following
6031    conditions must hold:
6032
6033      0 <= POSITION < GET_MODE_BITSIZE (GET_MODE (op))
6034      0 < SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
6035      0 < POSITION + SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
6036
6037    Also reject lengths equal to a word as they are better handled
6038    by the move patterns.  */
6039
6040 bool
6041 mips_use_ins_ext_p (rtx op, rtx size, rtx position)
6042 {
6043   HOST_WIDE_INT len, pos;
6044
6045   if (!ISA_HAS_EXT_INS
6046       || !register_operand (op, VOIDmode)
6047       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
6048     return false;
6049
6050   len = INTVAL (size);
6051   pos = INTVAL (position);
6052
6053   if (len <= 0 || len >= GET_MODE_BITSIZE (GET_MODE (op))
6054       || pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (op)))
6055     return false;
6056
6057   return true;
6058 }
6059 \f
6060 /* Initialize mips_split_addresses from the associated command-line
6061    settings.
6062
6063    mips_split_addresses is a half-way house between explicit
6064    relocations and the traditional assembler macros.  It can
6065    split absolute 32-bit symbolic constants into a high/lo_sum
6066    pair but uses macros for other sorts of access.
6067
6068    Like explicit relocation support for REL targets, it relies
6069    on GNU extensions in the assembler and the linker.
6070
6071    Although this code should work for -O0, it has traditionally
6072    been treated as an optimization.  */
6073
6074 static void
6075 mips_init_split_addresses (void)
6076 {
6077   if (!TARGET_MIPS16 && TARGET_SPLIT_ADDRESSES
6078       && optimize && !flag_pic
6079       && !ABI_HAS_64BIT_SYMBOLS)
6080     mips_split_addresses = 1;
6081   else
6082     mips_split_addresses = 0;
6083 }
6084
6085 /* (Re-)Initialize information about relocs.  */
6086
6087 static void
6088 mips_init_relocs (void)
6089 {
6090   memset (mips_split_p, '\0', sizeof (mips_split_p));
6091   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
6092   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
6093
6094   if (ABI_HAS_64BIT_SYMBOLS)
6095     {
6096       if (TARGET_EXPLICIT_RELOCS)
6097         {
6098           mips_split_p[SYMBOL_64_HIGH] = true;
6099           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
6100           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
6101
6102           mips_split_p[SYMBOL_64_MID] = true;
6103           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
6104           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
6105
6106           mips_split_p[SYMBOL_64_LOW] = true;
6107           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
6108           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
6109
6110           mips_split_p[SYMBOL_ABSOLUTE] = true;
6111           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6112         }
6113     }
6114   else
6115     {
6116       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses || TARGET_MIPS16)
6117         {
6118           mips_split_p[SYMBOL_ABSOLUTE] = true;
6119           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
6120           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
6121
6122           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
6123         }
6124     }
6125
6126   if (TARGET_MIPS16)
6127     {
6128       /* The high part is provided by a pseudo copy of $gp.  */
6129       mips_split_p[SYMBOL_GP_RELATIVE] = true;
6130       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
6131     }
6132
6133   if (TARGET_EXPLICIT_RELOCS)
6134     {
6135       /* Small data constants are kept whole until after reload,
6136          then lowered by mips_rewrite_small_data.  */
6137       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
6138
6139       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
6140       if (TARGET_NEWABI)
6141         {
6142           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
6143           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
6144         }
6145       else
6146         {
6147           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
6148           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
6149         }
6150
6151       if (TARGET_XGOT)
6152         {
6153           /* The HIGH and LO_SUM are matched by special .md patterns.  */
6154           mips_split_p[SYMBOL_GOT_DISP] = true;
6155
6156           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
6157           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
6158           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
6159
6160           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
6161           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
6162           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
6163         }
6164       else
6165         {
6166           if (TARGET_NEWABI)
6167             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
6168           else
6169             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
6170           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
6171         }
6172     }
6173
6174   if (TARGET_NEWABI)
6175     {
6176       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
6177       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
6178       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
6179     }
6180
6181   /* Thread-local relocation operators.  */
6182   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
6183   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
6184   mips_split_p[SYMBOL_DTPREL] = 1;
6185   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
6186   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
6187   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
6188   mips_split_p[SYMBOL_TPREL] = 1;
6189   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
6190   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
6191
6192   mips_lo_relocs[SYMBOL_HALF] = "%half(";
6193 }
6194
6195 /* If OP is an UNSPEC address, return the address to which it refers,
6196    otherwise return OP itself.  */
6197
6198 static rtx
6199 mips_strip_unspec_address (rtx op)
6200 {
6201   rtx base, offset;
6202
6203   split_const (op, &base, &offset);
6204   if (UNSPEC_ADDRESS_P (base))
6205     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
6206   return op;
6207 }
6208
6209 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
6210    in context CONTEXT.  RELOCS is the array of relocations to use.  */
6211
6212 static void
6213 print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
6214                      const char **relocs)
6215 {
6216   enum mips_symbol_type symbol_type;
6217   const char *p;
6218
6219   symbol_type = mips_classify_symbolic_expression (op, context);
6220   if (relocs[symbol_type] == 0)
6221     fatal_insn ("PRINT_OPERAND, invalid operand for relocation", op);
6222
6223   fputs (relocs[symbol_type], file);
6224   output_addr_const (file, mips_strip_unspec_address (op));
6225   for (p = relocs[symbol_type]; *p != 0; p++)
6226     if (*p == '(')
6227       fputc (')', file);
6228 }
6229
6230 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
6231    The punctuation characters are:
6232
6233    '('  Start a nested ".set noreorder" block.
6234    ')'  End a nested ".set noreorder" block.
6235    '['  Start a nested ".set noat" block.
6236    ']'  End a nested ".set noat" block.
6237    '<'  Start a nested ".set nomacro" block.
6238    '>'  End a nested ".set nomacro" block.
6239    '*'  Behave like %(%< if generating a delayed-branch sequence.
6240    '#'  Print a nop if in a ".set noreorder" block.
6241    '/'  Like '#', but do nothing within a delayed-branch sequence.
6242    '?'  Print "l" if mips_branch_likely is true
6243    '.'  Print the name of the register with a hard-wired zero (zero or $0).
6244    '@'  Print the name of the assembler temporary register (at or $1).
6245    '^'  Print the name of the pic call-through register (t9 or $25).
6246    '+'  Print the name of the gp register (usually gp or $28).
6247    '$'  Print the name of the stack pointer register (sp or $29).
6248    '|'  Print ".set push; .set mips2" if !ISA_HAS_LL_SC.
6249    '-'  Print ".set pop" under the same conditions for '|'.
6250
6251    See also mips_init_print_operand_pucnt.  */
6252
6253 static void
6254 mips_print_operand_punctuation (FILE *file, int ch)
6255 {
6256   switch (ch)
6257     {
6258     case '(':
6259       if (set_noreorder++ == 0)
6260         fputs (".set\tnoreorder\n\t", file);
6261       break;
6262
6263     case ')':
6264       gcc_assert (set_noreorder > 0);
6265       if (--set_noreorder == 0)
6266         fputs ("\n\t.set\treorder", file);
6267       break;
6268
6269     case '[':
6270       if (set_noat++ == 0)
6271         fputs (".set\tnoat\n\t", file);
6272       break;
6273
6274     case ']':
6275       gcc_assert (set_noat > 0);
6276       if (--set_noat == 0)
6277         fputs ("\n\t.set\tat", file);
6278       break;
6279
6280     case '<':
6281       if (set_nomacro++ == 0)
6282         fputs (".set\tnomacro\n\t", file);
6283       break;
6284
6285     case '>':
6286       gcc_assert (set_nomacro > 0);
6287       if (--set_nomacro == 0)
6288         fputs ("\n\t.set\tmacro", file);
6289       break;
6290
6291     case '*':
6292       if (final_sequence != 0)
6293         {
6294           mips_print_operand_punctuation (file, '(');
6295           mips_print_operand_punctuation (file, '<');
6296         }
6297       break;
6298
6299     case '#':
6300       if (set_noreorder != 0)
6301         fputs ("\n\tnop", file);
6302       break;
6303
6304     case '/':
6305       /* Print an extra newline so that the delayed insn is separated
6306          from the following ones.  This looks neater and is consistent
6307          with non-nop delayed sequences.  */
6308       if (set_noreorder != 0 && final_sequence == 0)
6309         fputs ("\n\tnop\n", file);
6310       break;
6311
6312     case '?':
6313       if (mips_branch_likely)
6314         putc ('l', file);
6315       break;
6316
6317     case '.':
6318       fputs (reg_names[GP_REG_FIRST + 0], file);
6319       break;
6320
6321     case '@':
6322       fputs (reg_names[GP_REG_FIRST + 1], file);
6323       break;
6324
6325     case '^':
6326       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
6327       break;
6328
6329     case '+':
6330       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
6331       break;
6332
6333     case '$':
6334       fputs (reg_names[STACK_POINTER_REGNUM], file);
6335       break;
6336
6337     case '|':
6338       if (!ISA_HAS_LL_SC)
6339         fputs (".set\tpush\n\t.set\tmips2\n\t", file);
6340       break;
6341
6342     case '-':
6343       if (!ISA_HAS_LL_SC)
6344         fputs ("\n\t.set\tpop", file);
6345       break;
6346
6347     default:
6348       gcc_unreachable ();
6349       break;
6350     }
6351 }
6352
6353 /* Initialize mips_print_operand_punct.  */
6354
6355 static void
6356 mips_init_print_operand_punct (void)
6357 {
6358   const char *p;
6359
6360   for (p = "()[]<>*#/?.@^+$|-"; *p; p++)
6361     mips_print_operand_punct[(unsigned char) *p] = true;
6362 }
6363
6364 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
6365    associated with condition CODE.  Print the condition part of the
6366    opcode to FILE.  */
6367
6368 static void
6369 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
6370 {
6371   switch (code)
6372     {
6373     case EQ:
6374     case NE:
6375     case GT:
6376     case GE:
6377     case LT:
6378     case LE:
6379     case GTU:
6380     case GEU:
6381     case LTU:
6382     case LEU:
6383       /* Conveniently, the MIPS names for these conditions are the same
6384          as their RTL equivalents.  */
6385       fputs (GET_RTX_NAME (code), file);
6386       break;
6387
6388     default:
6389       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
6390       break;
6391     }
6392 }
6393
6394 /* Likewise floating-point branches.  */
6395
6396 static void
6397 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
6398 {
6399   switch (code)
6400     {
6401     case EQ:
6402       fputs ("c1f", file);
6403       break;
6404
6405     case NE:
6406       fputs ("c1t", file);
6407       break;
6408
6409     default:
6410       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
6411       break;
6412     }
6413 }
6414
6415 /* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
6416
6417    'X'  Print CONST_INT OP in hexadecimal format.
6418    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
6419    'd'  Print CONST_INT OP in decimal.
6420    'h'  Print the high-part relocation associated with OP, after stripping
6421           any outermost HIGH.
6422    'R'  Print the low-part relocation associated with OP.
6423    'C'  Print the integer branch condition for comparison OP.
6424    'N'  Print the inverse of the integer branch condition for comparison OP.
6425    'F'  Print the FPU branch condition for comparison OP.
6426    'W'  Print the inverse of the FPU branch condition for comparison OP.
6427    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
6428               'z' for (eq:?I ...), 'n' for (ne:?I ...).
6429    't'  Like 'T', but with the EQ/NE cases reversed
6430    'Y'  Print mips_fp_conditions[INTVAL (OP)]
6431    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
6432    'q'  Print a DSP accumulator register.
6433    'D'  Print the second part of a double-word register or memory operand.
6434    'L'  Print the low-order register in a double-word register operand.
6435    'M'  Print high-order register in a double-word register operand.
6436    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
6437
6438 void
6439 print_operand (FILE *file, rtx op, int letter)
6440 {
6441   enum rtx_code code;
6442
6443   if (PRINT_OPERAND_PUNCT_VALID_P (letter))
6444     {
6445       mips_print_operand_punctuation (file, letter);
6446       return;
6447     }
6448
6449   gcc_assert (op);
6450   code = GET_CODE (op);
6451
6452   switch (letter)
6453     {
6454     case 'X':
6455       if (GET_CODE (op) == CONST_INT)
6456         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
6457       else
6458         output_operand_lossage ("invalid use of '%%%c'", letter);
6459       break;
6460
6461     case 'x':
6462       if (GET_CODE (op) == CONST_INT)
6463         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
6464       else
6465         output_operand_lossage ("invalid use of '%%%c'", letter);
6466       break;
6467
6468     case 'd':
6469       if (GET_CODE (op) == CONST_INT)
6470         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
6471       else
6472         output_operand_lossage ("invalid use of '%%%c'", letter);
6473       break;
6474
6475     case 'h':
6476       if (code == HIGH)
6477         op = XEXP (op, 0);
6478       print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
6479       break;
6480
6481     case 'R':
6482       print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
6483       break;
6484
6485     case 'C':
6486       mips_print_int_branch_condition (file, code, letter);
6487       break;
6488
6489     case 'N':
6490       mips_print_int_branch_condition (file, reverse_condition (code), letter);
6491       break;
6492
6493     case 'F':
6494       mips_print_float_branch_condition (file, code, letter);
6495       break;
6496
6497     case 'W':
6498       mips_print_float_branch_condition (file, reverse_condition (code),
6499                                          letter);
6500       break;
6501
6502     case 'T':
6503     case 't':
6504       {
6505         int truth = (code == NE) == (letter == 'T');
6506         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
6507       }
6508       break;
6509
6510     case 'Y':
6511       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
6512         fputs (mips_fp_conditions[UINTVAL (op)], file);
6513       else
6514         output_operand_lossage ("'%%%c' is not a valid operand prefix",
6515                                 letter);
6516       break;
6517
6518     case 'Z':
6519       if (ISA_HAS_8CC)
6520         {
6521           print_operand (file, op, 0);
6522           fputc (',', file);
6523         }
6524       break;
6525
6526     case 'q':
6527       if (code == REG && MD_REG_P (REGNO (op)))
6528         fprintf (file, "$ac0");
6529       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
6530         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
6531       else
6532         output_operand_lossage ("invalid use of '%%%c'", letter);
6533       break;
6534
6535     default:
6536       switch (code)
6537         {
6538         case REG:
6539           {
6540             unsigned int regno = REGNO (op);
6541             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
6542                 || (letter == 'L' && TARGET_BIG_ENDIAN)
6543                 || letter == 'D')
6544               regno++;
6545             fprintf (file, "%s", reg_names[regno]);
6546           }
6547           break;
6548
6549         case MEM:
6550           if (letter == 'D')
6551             output_address (plus_constant (XEXP (op, 0), 4));
6552           else
6553             output_address (XEXP (op, 0));
6554           break;
6555
6556         default:
6557           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
6558             fputs (reg_names[GP_REG_FIRST], file);
6559           else if (CONST_GP_P (op))
6560             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
6561           else
6562             output_addr_const (file, mips_strip_unspec_address (op));
6563           break;
6564         }
6565     }
6566 }
6567
6568 /* Output address operand X to FILE.  */
6569
6570 void
6571 print_operand_address (FILE *file, rtx x)
6572 {
6573   struct mips_address_info addr;
6574
6575   if (mips_classify_address (&addr, x, word_mode, true))
6576     switch (addr.type)
6577       {
6578       case ADDRESS_REG:
6579         print_operand (file, addr.offset, 0);
6580         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6581         return;
6582
6583       case ADDRESS_LO_SUM:
6584         print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
6585                              mips_lo_relocs);
6586         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6587         return;
6588
6589       case ADDRESS_CONST_INT:
6590         output_addr_const (file, x);
6591         fprintf (file, "(%s)", reg_names[0]);
6592         return;
6593
6594       case ADDRESS_SYMBOLIC:
6595         output_addr_const (file, mips_strip_unspec_address (x));
6596         return;
6597       }
6598   gcc_unreachable ();
6599 }
6600 \f
6601 /* Set SYMBOL_REF_FLAGS for the SYMBOL_REF inside RTL, which belongs to DECL.
6602    FIRST is true if this is the first time handling this decl.  */
6603
6604 static void
6605 mips_encode_section_info (tree decl, rtx rtl, int first)
6606 {
6607   default_encode_section_info (decl, rtl, first);
6608
6609   if (TREE_CODE (decl) == FUNCTION_DECL)
6610     {
6611       rtx symbol = XEXP (rtl, 0);
6612       tree type = TREE_TYPE (decl);
6613
6614       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
6615           || mips_far_type_p (type))
6616         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
6617     }
6618 }
6619
6620 /* Implement TARGET_SELECT_RTX_SECTION.  */
6621
6622 static section *
6623 mips_select_rtx_section (enum machine_mode mode, rtx x,
6624                          unsigned HOST_WIDE_INT align)
6625 {
6626   /* ??? Consider using mergeable small data sections.  */
6627   if (mips_rtx_constant_in_small_data_p (mode))
6628     return get_named_section (NULL, ".sdata", 0);
6629
6630   return default_elf_select_rtx_section (mode, x, align);
6631 }
6632
6633 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
6634
6635    The complication here is that, with the combination TARGET_ABICALLS
6636    && !TARGET_GPWORD, jump tables will use absolute addresses, and should
6637    therefore not be included in the read-only part of a DSO.  Handle such
6638    cases by selecting a normal data section instead of a read-only one.
6639    The logic apes that in default_function_rodata_section.  */
6640
6641 static section *
6642 mips_function_rodata_section (tree decl)
6643 {
6644   if (!TARGET_ABICALLS || TARGET_GPWORD)
6645     return default_function_rodata_section (decl);
6646
6647   if (decl && DECL_SECTION_NAME (decl))
6648     {
6649       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
6650       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
6651         {
6652           char *rname = ASTRDUP (name);
6653           rname[14] = 'd';
6654           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
6655         }
6656       else if (flag_function_sections && flag_data_sections
6657                && strncmp (name, ".text.", 6) == 0)
6658         {
6659           char *rname = ASTRDUP (name);
6660           memcpy (rname + 1, "data", 4);
6661           return get_section (rname, SECTION_WRITE, decl);
6662         }
6663     }
6664   return data_section;
6665 }
6666
6667 /* Implement TARGET_IN_SMALL_DATA_P.  This function controls whether
6668    locally-defined objects go in a small data section.  It also controls
6669    the setting of the SYMBOL_REF_SMALL_P flag, which in turn helps
6670    mips_classify_symbol decide when to use %gp_rel(...)($gp) accesses.  */
6671
6672 static bool
6673 mips_in_small_data_p (const_tree decl)
6674 {
6675   HOST_WIDE_INT size;
6676
6677   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
6678     return false;
6679
6680   /* We don't yet generate small-data references for -mabicalls or
6681      VxWorks RTP code.  See the related -G handling in override_options.  */
6682   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
6683     return false;
6684
6685   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
6686     {
6687       const char *name;
6688
6689       /* Reject anything that isn't in a known small-data section.  */
6690       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
6691       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
6692         return false;
6693
6694       /* If a symbol is defined externally, the assembler will use the
6695          usual -G rules when deciding how to implement macros.  */
6696       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
6697         return true;
6698     }
6699   else if (TARGET_EMBEDDED_DATA)
6700     {
6701       /* Don't put constants into the small data section: we want them
6702          to be in ROM rather than RAM.  */
6703       if (TREE_CODE (decl) != VAR_DECL)
6704         return false;
6705
6706       if (TREE_READONLY (decl)
6707           && !TREE_SIDE_EFFECTS (decl)
6708           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
6709         return false;
6710     }
6711
6712   /* Enforce -mlocal-sdata.  */
6713   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
6714     return false;
6715
6716   /* Enforce -mextern-sdata.  */
6717   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
6718     {
6719       if (DECL_EXTERNAL (decl))
6720         return false;
6721       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
6722         return false;
6723     }
6724
6725   size = int_size_in_bytes (TREE_TYPE (decl));
6726   return (size > 0 && size <= mips_section_threshold);
6727 }
6728
6729 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
6730    anchors for small data: the GP register acts as an anchor in that
6731    case.  We also don't want to use them for PC-relative accesses,
6732    where the PC acts as an anchor.  */
6733
6734 static bool
6735 mips_use_anchors_for_symbol_p (const_rtx symbol)
6736 {
6737   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
6738     {
6739     case SYMBOL_PC_RELATIVE:
6740     case SYMBOL_GP_RELATIVE:
6741       return false;
6742
6743     default:
6744       return default_use_anchors_for_symbol_p (symbol);
6745     }
6746 }
6747 \f
6748 /* The MIPS debug format wants all automatic variables and arguments
6749    to be in terms of the virtual frame pointer (stack pointer before
6750    any adjustment in the function), while the MIPS 3.0 linker wants
6751    the frame pointer to be the stack pointer after the initial
6752    adjustment.  So, we do the adjustment here.  The arg pointer (which
6753    is eliminated) points to the virtual frame pointer, while the frame
6754    pointer (which may be eliminated) points to the stack pointer after
6755    the initial adjustments.  */
6756
6757 HOST_WIDE_INT
6758 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
6759 {
6760   rtx offset2 = const0_rtx;
6761   rtx reg = eliminate_constant_term (addr, &offset2);
6762
6763   if (offset == 0)
6764     offset = INTVAL (offset2);
6765
6766   if (reg == stack_pointer_rtx || reg == frame_pointer_rtx
6767       || reg == hard_frame_pointer_rtx)
6768     {
6769       offset -= cfun->machine->frame.total_size;
6770       if (reg == hard_frame_pointer_rtx)
6771         offset += cfun->machine->frame.hard_frame_pointer_offset;
6772     }
6773
6774   /* sdbout_parms does not want this to crash for unrecognized cases.  */
6775 #if 0
6776   else if (reg != arg_pointer_rtx)
6777     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
6778                 addr);
6779 #endif
6780
6781   return offset;
6782 }
6783 \f
6784 /* When using assembler macros, keep track of all of small-data externs
6785    so that mips_file_end can emit the appropriate declarations for them.
6786
6787    In most cases it would be safe (though pointless) to emit .externs
6788    for other symbols too.  One exception is when an object is within
6789    the -G limit but declared by the user to be in a section other
6790    than .sbss or .sdata.  */
6791
6792 void
6793 mips_output_external (FILE *file, tree decl, const char *name)
6794 {
6795   default_elf_asm_output_external (file, decl, name);
6796
6797   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
6798      set in order to avoid putting out names that are never really
6799      used. */
6800   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
6801     {
6802       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
6803         {
6804           fputs ("\t.extern\t", file);
6805           assemble_name (file, name);
6806           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
6807                    int_size_in_bytes (TREE_TYPE (decl)));
6808         }
6809       else if (TARGET_IRIX
6810                && mips_abi == ABI_32
6811                && TREE_CODE (decl) == FUNCTION_DECL)
6812         {
6813           /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
6814              `.global name .text' directive for every used but
6815              undefined function.  If we don't, the linker may perform
6816              an optimization (skipping over the insns that set $gp)
6817              when it is unsafe.  */
6818           fputs ("\t.globl ", file);
6819           assemble_name (file, name);
6820           fputs (" .text\n", file);
6821         }
6822     }
6823 }
6824 \f
6825 /* Emit a new filename to a stream.  If we are smuggling stabs, try to
6826    put out a MIPS ECOFF file and a stab.  */
6827
6828 void
6829 mips_output_filename (FILE *stream, const char *name)
6830 {
6831
6832   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
6833      directives.  */
6834   if (write_symbols == DWARF2_DEBUG)
6835     return;
6836   else if (mips_output_filename_first_time)
6837     {
6838       mips_output_filename_first_time = 0;
6839       num_source_filenames += 1;
6840       current_function_file = name;
6841       fprintf (stream, "\t.file\t%d ", num_source_filenames);
6842       output_quoted_string (stream, name);
6843       putc ('\n', stream);
6844     }
6845
6846   /* If we are emitting stabs, let dbxout.c handle this (except for
6847      the mips_output_filename_first_time case).  */
6848   else if (write_symbols == DBX_DEBUG)
6849     return;
6850
6851   else if (name != current_function_file
6852            && strcmp (name, current_function_file) != 0)
6853     {
6854       num_source_filenames += 1;
6855       current_function_file = name;
6856       fprintf (stream, "\t.file\t%d ", num_source_filenames);
6857       output_quoted_string (stream, name);
6858       putc ('\n', stream);
6859     }
6860 }
6861
6862 /* MIPS implementation of TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
6863
6864 static void
6865 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
6866 {
6867   switch (size)
6868     {
6869     case 4:
6870       fputs ("\t.dtprelword\t", file);
6871       break;
6872
6873     case 8:
6874       fputs ("\t.dtpreldword\t", file);
6875       break;
6876
6877     default:
6878       gcc_unreachable ();
6879     }
6880   output_addr_const (file, x);
6881   fputs ("+0x8000", file);
6882 }
6883
6884 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
6885
6886 static rtx
6887 mips_dwarf_register_span (rtx reg)
6888 {
6889   rtx high, low;
6890   enum machine_mode mode;
6891
6892   /* By default, GCC maps increasing register numbers to increasing
6893      memory locations, but paired FPRs are always little-endian,
6894      regardless of the prevailing endianness.  */
6895   mode = GET_MODE (reg);
6896   if (FP_REG_P (REGNO (reg))
6897       && TARGET_BIG_ENDIAN
6898       && MAX_FPRS_PER_FMT > 1
6899       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
6900     {
6901       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
6902       high = mips_subword (reg, true);
6903       low = mips_subword (reg, false);
6904       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
6905     }
6906
6907   return NULL_RTX;
6908 }
6909 \f
6910 /* Output an ASCII string, in a space-saving way.  PREFIX is the string
6911    that should be written before the opening quote, such as "\t.ascii\t"
6912    for real string data or "\t# " for a comment.  */
6913
6914 void
6915 mips_output_ascii (FILE *stream, const char *string_param, size_t len,
6916                    const char *prefix)
6917 {
6918   size_t i;
6919   int cur_pos = 17;
6920   register const unsigned char *string =
6921     (const unsigned char *)string_param;
6922
6923   fprintf (stream, "%s\"", prefix);
6924   for (i = 0; i < len; i++)
6925     {
6926       register int c = string[i];
6927
6928       if (ISPRINT (c))
6929         {
6930           if (c == '\\' || c == '\"')
6931             {
6932               putc ('\\', stream);
6933               cur_pos++;
6934             }
6935           putc (c, stream);
6936           cur_pos++;
6937         }
6938       else
6939         {
6940           fprintf (stream, "\\%03o", c);
6941           cur_pos += 4;
6942         }
6943
6944       if (cur_pos > 72 && i+1 < len)
6945         {
6946           cur_pos = 17;
6947           fprintf (stream, "\"\n%s\"", prefix);
6948         }
6949     }
6950   fprintf (stream, "\"\n");
6951 }
6952
6953 #ifdef BSS_SECTION_ASM_OP
6954 /* Implement ASM_OUTPUT_ALIGNED_BSS.  This differs from the default only
6955    in the use of sbss.  */
6956
6957 void
6958 mips_output_aligned_bss (FILE *stream, tree decl, const char *name,
6959                          unsigned HOST_WIDE_INT size, int align)
6960 {
6961   extern tree last_assemble_variable_decl;
6962
6963   if (mips_in_small_data_p (decl))
6964     switch_to_section (get_named_section (NULL, ".sbss", 0));
6965   else
6966     switch_to_section (bss_section);
6967   ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
6968   last_assemble_variable_decl = decl;
6969   ASM_DECLARE_OBJECT_NAME (stream, name, decl);
6970   ASM_OUTPUT_SKIP (stream, size != 0 ? size : 1);
6971 }
6972 #endif
6973 \f
6974 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
6975    macros, mark the symbol as written so that mips_file_end won't emit an
6976    .extern for it.  STREAM is the output file, NAME is the name of the
6977    symbol, INIT_STRING is the string that should be written before the
6978    symbol and FINAL_STRING is the string that should be written after it.
6979    FINAL_STRING is a printf() format that consumes the remaining arguments.  */
6980
6981 void
6982 mips_declare_object (FILE *stream, const char *name, const char *init_string,
6983                      const char *final_string, ...)
6984 {
6985   va_list ap;
6986
6987   fputs (init_string, stream);
6988   assemble_name (stream, name);
6989   va_start (ap, final_string);
6990   vfprintf (stream, final_string, ap);
6991   va_end (ap);
6992
6993   if (!TARGET_EXPLICIT_RELOCS)
6994     {
6995       tree name_tree = get_identifier (name);
6996       TREE_ASM_WRITTEN (name_tree) = 1;
6997     }
6998 }
6999
7000 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
7001    NAME is the name of the object and ALIGN is the required alignment
7002    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
7003    alignment argument.  */
7004
7005 void
7006 mips_declare_common_object (FILE *stream, const char *name,
7007                             const char *init_string,
7008                             unsigned HOST_WIDE_INT size,
7009                             unsigned int align, bool takes_alignment_p)
7010 {
7011   if (!takes_alignment_p)
7012     {
7013       size += (align / BITS_PER_UNIT) - 1;
7014       size -= size % (align / BITS_PER_UNIT);
7015       mips_declare_object (stream, name, init_string,
7016                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
7017     }
7018   else
7019     mips_declare_object (stream, name, init_string,
7020                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
7021                          size, align / BITS_PER_UNIT);
7022 }
7023
7024 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
7025    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
7026
7027 void
7028 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
7029                                  unsigned HOST_WIDE_INT size,
7030                                  unsigned int align)
7031 {
7032   /* If the target wants uninitialized const declarations in
7033      .rdata then don't put them in .comm.  */
7034   if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA
7035       && TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)
7036       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
7037     {
7038       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
7039         targetm.asm_out.globalize_label (stream, name);
7040
7041       switch_to_section (readonly_data_section);
7042       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
7043       mips_declare_object (stream, name, "",
7044                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
7045                            size);
7046     }
7047   else
7048     mips_declare_common_object (stream, name, "\n\t.comm\t",
7049                                 size, align, true);
7050 }
7051
7052 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
7053 extern int size_directive_output;
7054
7055 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
7056    definitions except that it uses mips_declare_object() to emit the label.  */
7057
7058 void
7059 mips_declare_object_name (FILE *stream, const char *name,
7060                           tree decl ATTRIBUTE_UNUSED)
7061 {
7062 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
7063   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
7064 #endif
7065
7066   size_directive_output = 0;
7067   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
7068     {
7069       HOST_WIDE_INT size;
7070
7071       size_directive_output = 1;
7072       size = int_size_in_bytes (TREE_TYPE (decl));
7073       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7074     }
7075
7076   mips_declare_object (stream, name, "", ":\n");
7077 }
7078
7079 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
7080
7081 void
7082 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
7083 {
7084   const char *name;
7085
7086   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
7087   if (!flag_inhibit_size_directive
7088       && DECL_SIZE (decl) != 0
7089       && !at_end && top_level
7090       && DECL_INITIAL (decl) == error_mark_node
7091       && !size_directive_output)
7092     {
7093       HOST_WIDE_INT size;
7094
7095       size_directive_output = 1;
7096       size = int_size_in_bytes (TREE_TYPE (decl));
7097       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
7098     }
7099 }
7100 #endif
7101 \f
7102 /* Return the FOO in the name of the ".mdebug.FOO" section associated
7103    with the current ABI.  */
7104
7105 static const char *
7106 mips_mdebug_abi_name (void)
7107 {
7108   switch (mips_abi)
7109     {
7110     case ABI_32:
7111       return "abi32";
7112     case ABI_O64:
7113       return "abiO64";
7114     case ABI_N32:
7115       return "abiN32";
7116     case ABI_64:
7117       return "abiN64";
7118     case ABI_EABI:
7119       return TARGET_64BIT ? "eabi64" : "eabi32";
7120     default:
7121       gcc_unreachable ();
7122     }
7123 }
7124
7125 /* Implement TARGET_ASM_FILE_START.  */
7126
7127 static void
7128 mips_file_start (void)
7129 {
7130   default_file_start ();
7131
7132   if (!TARGET_IRIX)
7133     {
7134       /* Generate a special section to describe the ABI switches used to
7135          produce the resultant binary.  This used to be done by the assembler
7136          setting bits in the ELF header's flags field, but we have run out of
7137          bits.  GDB needs this information in order to be able to correctly
7138          debug these binaries.  See the function mips_gdbarch_init() in
7139          gdb/mips-tdep.c.  This is unnecessary for the IRIX 5/6 ABIs and
7140          causes unnecessary IRIX 6 ld warnings.  */
7141       /* Note - we use fprintf directly rather than calling switch_to_section
7142          because in this way we can avoid creating an allocated section.  We
7143          do not want this section to take up any space in the running
7144          executable.  */
7145       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
7146                mips_mdebug_abi_name ());
7147
7148       /* There is no ELF header flag to distinguish long32 forms of the
7149          EABI from long64 forms.  Emit a special section to help tools
7150          such as GDB.  Do the same for o64, which is sometimes used with
7151          -mlong64.  */
7152       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
7153         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
7154                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
7155
7156 #ifdef HAVE_AS_GNU_ATTRIBUTE
7157       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
7158                TARGET_HARD_FLOAT_ABI ? (TARGET_DOUBLE_FLOAT ? 1 : 2) : 3);
7159 #endif
7160     }
7161
7162   /* Generate the pseudo ops that System V.4 wants.  */
7163   if (TARGET_ABICALLS)
7164     fprintf (asm_out_file, "\t.abicalls\n");
7165
7166   if (flag_verbose_asm)
7167     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
7168              ASM_COMMENT_START,
7169              mips_section_threshold, mips_arch_info->name, mips_isa);
7170 }
7171 \f
7172 \f
7173 /* Make the last instruction frame related and note that it performs
7174    the operation described by FRAME_PATTERN.  */
7175
7176 static void
7177 mips_set_frame_expr (rtx frame_pattern)
7178 {
7179   rtx insn;
7180
7181   insn = get_last_insn ();
7182   RTX_FRAME_RELATED_P (insn) = 1;
7183   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
7184                                       frame_pattern,
7185                                       REG_NOTES (insn));
7186 }
7187
7188
7189 /* Return a frame-related rtx that stores REG at MEM.
7190    REG must be a single register.  */
7191
7192 static rtx
7193 mips_frame_set (rtx mem, rtx reg)
7194 {
7195   rtx set;
7196
7197   /* If we're saving the return address register and the dwarf return
7198      address column differs from the hard register number, adjust the
7199      note reg to refer to the former.  */
7200   if (REGNO (reg) == GP_REG_FIRST + 31
7201       && DWARF_FRAME_RETURN_COLUMN != GP_REG_FIRST + 31)
7202     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
7203
7204   set = gen_rtx_SET (VOIDmode, mem, reg);
7205   RTX_FRAME_RELATED_P (set) = 1;
7206
7207   return set;
7208 }
7209 \f
7210 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
7211    mips16e_s2_s8_regs[X], it must also save the registers in indexes
7212    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
7213 static const unsigned char mips16e_s2_s8_regs[] = {
7214   30, 23, 22, 21, 20, 19, 18
7215 };
7216 static const unsigned char mips16e_a0_a3_regs[] = {
7217   4, 5, 6, 7
7218 };
7219
7220 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
7221    ordered from the uppermost in memory to the lowest in memory.  */
7222 static const unsigned char mips16e_save_restore_regs[] = {
7223   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
7224 };
7225
7226 /* Return the index of the lowest X in the range [0, SIZE) for which
7227    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
7228
7229 static unsigned int
7230 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
7231                              unsigned int size)
7232 {
7233   unsigned int i;
7234
7235   for (i = 0; i < size; i++)
7236     if (BITSET_P (mask, regs[i]))
7237       break;
7238
7239   return i;
7240 }
7241
7242 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
7243    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
7244    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
7245    is true for all indexes (X, SIZE).  */
7246
7247 static void
7248 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
7249                         unsigned int size, unsigned int *num_regs_ptr)
7250 {
7251   unsigned int i;
7252
7253   i = mips16e_find_first_register (*mask_ptr, regs, size);
7254   for (i++; i < size; i++)
7255     if (!BITSET_P (*mask_ptr, regs[i]))
7256       {
7257         *num_regs_ptr += 1;
7258         *mask_ptr |= 1 << regs[i];
7259       }
7260 }
7261
7262 /* Return a simplified form of X using the register values in REG_VALUES.
7263    REG_VALUES[R] is the last value assigned to hard register R, or null
7264    if R has not been modified.
7265
7266    This function is rather limited, but is good enough for our purposes.  */
7267
7268 static rtx
7269 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
7270 {
7271   rtx x0, x1;
7272
7273   x = avoid_constant_pool_reference (x);
7274
7275   if (UNARY_P (x))
7276     {
7277       x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7278       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
7279                                  x0, GET_MODE (XEXP (x, 0)));
7280     }
7281
7282   if (ARITHMETIC_P (x))
7283     {
7284       x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7285       x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
7286       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
7287     }
7288
7289   if (REG_P (x)
7290       && reg_values[REGNO (x)]
7291       && !rtx_unstable_p (reg_values[REGNO (x)]))
7292     return reg_values[REGNO (x)];
7293
7294   return x;
7295 }
7296
7297 /* Return true if (set DEST SRC) stores an argument register into its
7298    caller-allocated save slot, storing the number of that argument
7299    register in *REGNO_PTR if so.  REG_VALUES is as for
7300    mips16e_collect_propagate_value.  */
7301
7302 static bool
7303 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
7304                                  unsigned int *regno_ptr)
7305 {
7306   unsigned int argno, regno;
7307   HOST_WIDE_INT offset, required_offset;
7308   rtx addr, base;
7309
7310   /* Check that this is a word-mode store.  */
7311   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
7312     return false;
7313
7314   /* Check that the register being saved is an unmodified argument
7315      register.  */
7316   regno = REGNO (src);
7317   if (regno < GP_ARG_FIRST || regno > GP_ARG_LAST || reg_values[regno])
7318     return false;
7319   argno = regno - GP_ARG_FIRST;
7320
7321   /* Check whether the address is an appropriate stack pointer or
7322      frame pointer access.  */
7323   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
7324   mips_split_plus (addr, &base, &offset);
7325   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
7326   if (base == hard_frame_pointer_rtx)
7327     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
7328   else if (base != stack_pointer_rtx)
7329     return false;
7330   if (offset != required_offset)
7331     return false;
7332
7333   *regno_ptr = regno;
7334   return true;
7335 }
7336
7337 /* A subroutine of mips_expand_prologue, called only when generating
7338    MIPS16e SAVE instructions.  Search the start of the function for any
7339    instructions that save argument registers into their caller-allocated
7340    save slots.  Delete such instructions and return a value N such that
7341    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
7342    instructions redundant.  */
7343
7344 static unsigned int
7345 mips16e_collect_argument_saves (void)
7346 {
7347   rtx reg_values[FIRST_PSEUDO_REGISTER];
7348   rtx insn, next, set, dest, src;
7349   unsigned int nargs, regno;
7350
7351   push_topmost_sequence ();
7352   nargs = 0;
7353   memset (reg_values, 0, sizeof (reg_values));
7354   for (insn = get_insns (); insn; insn = next)
7355     {
7356       next = NEXT_INSN (insn);
7357       if (NOTE_P (insn))
7358         continue;
7359
7360       if (!INSN_P (insn))
7361         break;
7362
7363       set = PATTERN (insn);
7364       if (GET_CODE (set) != SET)
7365         break;
7366
7367       dest = SET_DEST (set);
7368       src = SET_SRC (set);
7369       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
7370         {
7371           if (!BITSET_P (cfun->machine->frame.mask, regno))
7372             {
7373               delete_insn (insn);
7374               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
7375             }
7376         }
7377       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
7378         reg_values[REGNO (dest)]
7379           = mips16e_collect_propagate_value (src, reg_values);
7380       else
7381         break;
7382     }
7383   pop_topmost_sequence ();
7384
7385   return nargs;
7386 }
7387
7388 /* Return a move between register REGNO and memory location SP + OFFSET.
7389    Make the move a load if RESTORE_P, otherwise make it a frame-related
7390    store.  */
7391
7392 static rtx
7393 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
7394                           unsigned int regno)
7395 {
7396   rtx reg, mem;
7397
7398   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
7399   reg = gen_rtx_REG (SImode, regno);
7400   return (restore_p
7401           ? gen_rtx_SET (VOIDmode, reg, mem)
7402           : mips_frame_set (mem, reg));
7403 }
7404
7405 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
7406    The instruction must:
7407
7408      - Allocate or deallocate SIZE bytes in total; SIZE is known
7409        to be nonzero.
7410
7411      - Save or restore as many registers in *MASK_PTR as possible.
7412        The instruction saves the first registers at the top of the
7413        allocated area, with the other registers below it.
7414
7415      - Save NARGS argument registers above the allocated area.
7416
7417    (NARGS is always zero if RESTORE_P.)
7418
7419    The SAVE and RESTORE instructions cannot save and restore all general
7420    registers, so there may be some registers left over for the caller to
7421    handle.  Destructively modify *MASK_PTR so that it contains the registers
7422    that still need to be saved or restored.  The caller can save these
7423    registers in the memory immediately below *OFFSET_PTR, which is a
7424    byte offset from the bottom of the allocated stack area.  */
7425
7426 static rtx
7427 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
7428                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
7429                             HOST_WIDE_INT size)
7430 {
7431   rtx pattern, set;
7432   HOST_WIDE_INT offset, top_offset;
7433   unsigned int i, regno;
7434   int n;
7435
7436   gcc_assert (cfun->machine->frame.num_fp == 0);
7437
7438   /* Calculate the number of elements in the PARALLEL.  We need one element
7439      for the stack adjustment, one for each argument register save, and one
7440      for each additional register move.  */
7441   n = 1 + nargs;
7442   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7443     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
7444       n++;
7445
7446   /* Create the final PARALLEL.  */
7447   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
7448   n = 0;
7449
7450   /* Add the stack pointer adjustment.  */
7451   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7452                      plus_constant (stack_pointer_rtx,
7453                                     restore_p ? size : -size));
7454   RTX_FRAME_RELATED_P (set) = 1;
7455   XVECEXP (pattern, 0, n++) = set;
7456
7457   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
7458   top_offset = restore_p ? size : 0;
7459
7460   /* Save the arguments.  */
7461   for (i = 0; i < nargs; i++)
7462     {
7463       offset = top_offset + i * UNITS_PER_WORD;
7464       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
7465       XVECEXP (pattern, 0, n++) = set;
7466     }
7467
7468   /* Then fill in the other register moves.  */
7469   offset = top_offset;
7470   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7471     {
7472       regno = mips16e_save_restore_regs[i];
7473       if (BITSET_P (*mask_ptr, regno))
7474         {
7475           offset -= UNITS_PER_WORD;
7476           set = mips16e_save_restore_reg (restore_p, offset, regno);
7477           XVECEXP (pattern, 0, n++) = set;
7478           *mask_ptr &= ~(1 << regno);
7479         }
7480     }
7481
7482   /* Tell the caller what offset it should use for the remaining registers.  */
7483   *offset_ptr = size + (offset - top_offset);
7484
7485   gcc_assert (n == XVECLEN (pattern, 0));
7486
7487   return pattern;
7488 }
7489
7490 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
7491    pointer.  Return true if PATTERN matches the kind of instruction
7492    generated by mips16e_build_save_restore.  If INFO is nonnull,
7493    initialize it when returning true.  */
7494
7495 bool
7496 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
7497                                 struct mips16e_save_restore_info *info)
7498 {
7499   unsigned int i, nargs, mask, extra;
7500   HOST_WIDE_INT top_offset, save_offset, offset;
7501   rtx set, reg, mem, base;
7502   int n;
7503
7504   if (!GENERATE_MIPS16E_SAVE_RESTORE)
7505     return false;
7506
7507   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
7508   top_offset = adjust > 0 ? adjust : 0;
7509
7510   /* Interpret all other members of the PARALLEL.  */
7511   save_offset = top_offset - UNITS_PER_WORD;
7512   mask = 0;
7513   nargs = 0;
7514   i = 0;
7515   for (n = 1; n < XVECLEN (pattern, 0); n++)
7516     {
7517       /* Check that we have a SET.  */
7518       set = XVECEXP (pattern, 0, n);
7519       if (GET_CODE (set) != SET)
7520         return false;
7521
7522       /* Check that the SET is a load (if restoring) or a store
7523          (if saving).  */
7524       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
7525       if (!MEM_P (mem))
7526         return false;
7527
7528       /* Check that the address is the sum of the stack pointer and a
7529          possibly-zero constant offset.  */
7530       mips_split_plus (XEXP (mem, 0), &base, &offset);
7531       if (base != stack_pointer_rtx)
7532         return false;
7533
7534       /* Check that SET's other operand is a register.  */
7535       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
7536       if (!REG_P (reg))
7537         return false;
7538
7539       /* Check for argument saves.  */
7540       if (offset == top_offset + nargs * UNITS_PER_WORD
7541           && REGNO (reg) == GP_ARG_FIRST + nargs)
7542         nargs++;
7543       else if (offset == save_offset)
7544         {
7545           while (mips16e_save_restore_regs[i++] != REGNO (reg))
7546             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
7547               return false;
7548
7549           mask |= 1 << REGNO (reg);
7550           save_offset -= UNITS_PER_WORD;
7551         }
7552       else
7553         return false;
7554     }
7555
7556   /* Check that the restrictions on register ranges are met.  */
7557   extra = 0;
7558   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
7559                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
7560   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
7561                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
7562   if (extra != 0)
7563     return false;
7564
7565   /* Make sure that the topmost argument register is not saved twice.
7566      The checks above ensure that the same is then true for the other
7567      argument registers.  */
7568   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
7569     return false;
7570
7571   /* Pass back information, if requested.  */
7572   if (info)
7573     {
7574       info->nargs = nargs;
7575       info->mask = mask;
7576       info->size = (adjust > 0 ? adjust : -adjust);
7577     }
7578
7579   return true;
7580 }
7581
7582 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
7583    for the register range [MIN_REG, MAX_REG].  Return a pointer to
7584    the null terminator.  */
7585
7586 static char *
7587 mips16e_add_register_range (char *s, unsigned int min_reg,
7588                             unsigned int max_reg)
7589 {
7590   if (min_reg != max_reg)
7591     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
7592   else
7593     s += sprintf (s, ",%s", reg_names[min_reg]);
7594   return s;
7595 }
7596
7597 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
7598    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
7599
7600 const char *
7601 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
7602 {
7603   static char buffer[300];
7604
7605   struct mips16e_save_restore_info info;
7606   unsigned int i, end;
7607   char *s;
7608
7609   /* Parse the pattern.  */
7610   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
7611     gcc_unreachable ();
7612
7613   /* Add the mnemonic.  */
7614   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
7615   s += strlen (s);
7616
7617   /* Save the arguments.  */
7618   if (info.nargs > 1)
7619     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
7620                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
7621   else if (info.nargs == 1)
7622     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
7623
7624   /* Emit the amount of stack space to allocate or deallocate.  */
7625   s += sprintf (s, "%d", (int) info.size);
7626
7627   /* Save or restore $16.  */
7628   if (BITSET_P (info.mask, 16))
7629     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
7630
7631   /* Save or restore $17.  */
7632   if (BITSET_P (info.mask, 17))
7633     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
7634
7635   /* Save or restore registers in the range $s2...$s8, which
7636      mips16e_s2_s8_regs lists in decreasing order.  Note that this
7637      is a software register range; the hardware registers are not
7638      numbered consecutively.  */
7639   end = ARRAY_SIZE (mips16e_s2_s8_regs);
7640   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
7641   if (i < end)
7642     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
7643                                     mips16e_s2_s8_regs[i]);
7644
7645   /* Save or restore registers in the range $a0...$a3.  */
7646   end = ARRAY_SIZE (mips16e_a0_a3_regs);
7647   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
7648   if (i < end)
7649     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
7650                                     mips16e_a0_a3_regs[end - 1]);
7651
7652   /* Save or restore $31.  */
7653   if (BITSET_P (info.mask, 31))
7654     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 31]);
7655
7656   return buffer;
7657 }
7658 \f
7659 /* Return true if the current function has an insn that implicitly
7660    refers to $gp.  */
7661
7662 static bool
7663 mips_function_has_gp_insn (void)
7664 {
7665   /* Don't bother rechecking if we found one last time.  */
7666   if (!cfun->machine->has_gp_insn_p)
7667     {
7668       rtx insn;
7669
7670       push_topmost_sequence ();
7671       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
7672         if (INSN_P (insn)
7673             && GET_CODE (PATTERN (insn)) != USE
7674             && GET_CODE (PATTERN (insn)) != CLOBBER
7675             && (get_attr_got (insn) != GOT_UNSET
7676                 || small_data_pattern (PATTERN (insn), VOIDmode)))
7677           break;
7678       pop_topmost_sequence ();
7679
7680       cfun->machine->has_gp_insn_p = (insn != 0);
7681     }
7682   return cfun->machine->has_gp_insn_p;
7683 }
7684
7685
7686 /* Return the register that should be used as the global pointer
7687    within this function.  Return 0 if the function doesn't need
7688    a global pointer.  */
7689
7690 static unsigned int
7691 mips_global_pointer (void)
7692 {
7693   unsigned int regno;
7694
7695   /* $gp is always available unless we're using a GOT.  */
7696   if (!TARGET_USE_GOT)
7697     return GLOBAL_POINTER_REGNUM;
7698
7699   /* We must always provide $gp when it is used implicitly.  */
7700   if (!TARGET_EXPLICIT_RELOCS)
7701     return GLOBAL_POINTER_REGNUM;
7702
7703   /* FUNCTION_PROFILER includes a jal macro, so we need to give it
7704      a valid gp.  */
7705   if (current_function_profile)
7706     return GLOBAL_POINTER_REGNUM;
7707
7708   /* If the function has a nonlocal goto, $gp must hold the correct
7709      global pointer for the target function.  */
7710   if (current_function_has_nonlocal_goto)
7711     return GLOBAL_POINTER_REGNUM;
7712
7713   /* If the gp is never referenced, there's no need to initialize it.
7714      Note that reload can sometimes introduce constant pool references
7715      into a function that otherwise didn't need them.  For example,
7716      suppose we have an instruction like:
7717
7718           (set (reg:DF R1) (float:DF (reg:SI R2)))
7719
7720      If R2 turns out to be constant such as 1, the instruction may have a
7721      REG_EQUAL note saying that R1 == 1.0.  Reload then has the option of
7722      using this constant if R2 doesn't get allocated to a register.
7723
7724      In cases like these, reload will have added the constant to the pool
7725      but no instruction will yet refer to it.  */
7726   if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
7727       && !current_function_uses_const_pool
7728       && !mips_function_has_gp_insn ())
7729     return 0;
7730
7731   /* We need a global pointer, but perhaps we can use a call-clobbered
7732      register instead of $gp.  */
7733   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
7734     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
7735       if (!df_regs_ever_live_p (regno)
7736           && call_really_used_regs[regno]
7737           && !fixed_regs[regno]
7738           && regno != PIC_FUNCTION_ADDR_REGNUM)
7739         return regno;
7740
7741   return GLOBAL_POINTER_REGNUM;
7742 }
7743
7744 /* Return true if the current function returns its value in a floating-point
7745    register in MIPS16 mode.  */
7746
7747 static bool
7748 mips16_cfun_returns_in_fpr_p (void)
7749 {
7750   tree return_type = DECL_RESULT (current_function_decl);
7751   return (TARGET_MIPS16
7752           && TARGET_HARD_FLOAT_ABI
7753           && !aggregate_value_p (return_type, current_function_decl)
7754           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
7755 }
7756
7757
7758 /* Return true if the current function must save REGNO.  */
7759
7760 static bool
7761 mips_save_reg_p (unsigned int regno)
7762 {
7763   /* We only need to save $gp if TARGET_CALL_SAVED_GP and only then
7764      if we have not chosen a call-clobbered substitute.  */
7765   if (regno == GLOBAL_POINTER_REGNUM)
7766     return TARGET_CALL_SAVED_GP && cfun->machine->global_pointer == regno;
7767
7768   /* Check call-saved registers.  */
7769   if ((current_function_saves_all_registers || df_regs_ever_live_p (regno))
7770       && !call_really_used_regs[regno])
7771     return true;
7772
7773   /* Save both registers in an FPR pair if either one is used.  This is
7774      needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
7775      register to be used without the even register.  */
7776   if (FP_REG_P (regno)
7777       && MAX_FPRS_PER_FMT == 2
7778       && df_regs_ever_live_p (regno + 1)
7779       && !call_really_used_regs[regno + 1])
7780     return true;
7781
7782   /* We need to save the old frame pointer before setting up a new one.  */
7783   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
7784     return true;
7785
7786   /* Check for registers that must be saved for FUNCTION_PROFILER.  */
7787   if (current_function_profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
7788     return true;
7789
7790   /* We need to save the incoming return address if it is ever clobbered
7791      within the function, if __builtin_eh_return is being used to set a
7792      different return address, or if a stub is being used to return a
7793      value in FPRs.  */
7794   if (regno == GP_REG_FIRST + 31
7795       && (df_regs_ever_live_p (regno)
7796           || current_function_calls_eh_return
7797           || mips16_cfun_returns_in_fpr_p ()))
7798     return true;
7799
7800   return false;
7801 }
7802
7803 /* Populate the current function's mips_frame_info structure.
7804
7805    MIPS stack frames look like:
7806
7807         +-------------------------------+
7808         |                               |
7809         |  incoming stack arguments     |
7810         |                               |
7811         +-------------------------------+
7812         |                               |
7813         |  caller-allocated save area   |
7814       A |  for register arguments       |
7815         |                               |
7816         +-------------------------------+ <-- incoming stack pointer
7817         |                               |
7818         |  callee-allocated save area   |
7819       B |  for arguments that are       |
7820         |  split between registers and  |
7821         |  the stack                    |
7822         |                               |
7823         +-------------------------------+ <-- arg_pointer_rtx
7824         |                               |
7825       C |  callee-allocated save area   |
7826         |  for register varargs         |
7827         |                               |
7828         +-------------------------------+ <-- frame_pointer_rtx + fp_sp_offset
7829         |                               |       + UNITS_PER_HWFPVALUE
7830         |  FPR save area                |
7831         |                               |
7832         +-------------------------------+ <-- frame_pointer_rtx + gp_sp_offset
7833         |                               |       + UNITS_PER_WORD
7834         |  GPR save area                |
7835         |                               |
7836         +-------------------------------+
7837         |                               | \
7838         |  local variables              |  | var_size
7839         |                               | /
7840         +-------------------------------+
7841         |                               | \
7842         |  $gp save area                |  | cprestore_size
7843         |                               | /
7844       P +-------------------------------+ <-- hard_frame_pointer_rtx for
7845         |                               |       MIPS16 code
7846         |  outgoing stack arguments     |
7847         |                               |
7848         +-------------------------------+
7849         |                               |
7850         |  caller-allocated save area   |
7851         |  for register arguments       |
7852         |                               |
7853         +-------------------------------+ <-- stack_pointer_rtx
7854                                               frame_pointer_rtx
7855                                               hard_frame_pointer_rtx for
7856                                                 non-MIPS16 code.
7857
7858    At least two of A, B and C will be empty.
7859
7860    Dynamic stack allocations such as alloca insert data at point P.
7861    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
7862    hard_frame_pointer_rtx unchanged.  */
7863
7864 static void
7865 mips_compute_frame_info (void)
7866 {
7867   struct mips_frame_info *frame;
7868   HOST_WIDE_INT offset, size;
7869   unsigned int regno, i;
7870
7871   frame = &cfun->machine->frame;
7872   memset (frame, 0, sizeof (*frame));
7873   size = get_frame_size ();
7874
7875   cfun->machine->global_pointer = mips_global_pointer ();
7876
7877   /* The first STARTING_FRAME_OFFSET bytes contain the outgoing argument
7878      area and the $gp save slot.  This area isn't needed in leaf functions,
7879      but if the target-independent frame size is nonzero, we're committed
7880      to allocating it anyway.  */
7881   if (size == 0 && current_function_is_leaf)
7882     {
7883       /* The MIPS 3.0 linker does not like functions that dynamically
7884          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
7885          looks like we are trying to create a second frame pointer to the
7886          function, so allocate some stack space to make it happy.  */
7887       if (current_function_calls_alloca)
7888         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
7889       else
7890         frame->args_size = 0;
7891       frame->cprestore_size = 0;
7892     }
7893   else
7894     {
7895       frame->args_size = current_function_outgoing_args_size;
7896       frame->cprestore_size = STARTING_FRAME_OFFSET - frame->args_size;
7897     }
7898   offset = frame->args_size + frame->cprestore_size;
7899
7900   /* Move above the local variables.  */
7901   frame->var_size = MIPS_STACK_ALIGN (size);
7902   offset += frame->var_size;
7903
7904   /* Find out which GPRs we need to save.  */
7905   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
7906     if (mips_save_reg_p (regno))
7907       {
7908         frame->num_gp++;
7909         frame->mask |= 1 << (regno - GP_REG_FIRST);
7910       }
7911
7912   /* If this function calls eh_return, we must also save and restore the
7913      EH data registers.  */
7914   if (current_function_calls_eh_return)
7915     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
7916       {
7917         frame->num_gp++;
7918         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
7919       }
7920
7921   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
7922      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
7923      save all later registers too.  */
7924   if (GENERATE_MIPS16E_SAVE_RESTORE)
7925     {
7926       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
7927                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
7928       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
7929                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
7930     }
7931
7932   /* Move above the GPR save area.  */
7933   if (frame->num_gp > 0)
7934     {
7935       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
7936       frame->gp_sp_offset = offset - UNITS_PER_WORD;
7937     }
7938
7939   /* Find out which FPRs we need to save.  This loop must iterate over
7940      the same space as its companion in mips_for_each_saved_reg.  */
7941   if (TARGET_HARD_FLOAT)
7942     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
7943       if (mips_save_reg_p (regno))
7944         {
7945           frame->num_fp += MAX_FPRS_PER_FMT;
7946           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
7947         }
7948
7949   /* Move above the FPR save area.  */
7950   if (frame->num_fp > 0)
7951     {
7952       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
7953       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
7954     }
7955
7956   /* Move above the callee-allocated varargs save area.  */
7957   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
7958   frame->arg_pointer_offset = offset;
7959
7960   /* Move above the callee-allocated area for pretend stack arguments.  */
7961   offset += current_function_pretend_args_size;
7962   frame->total_size = offset;
7963
7964   /* Work out the offsets of the save areas from the top of the frame.  */
7965   if (frame->gp_sp_offset > 0)
7966     frame->gp_save_offset = frame->gp_sp_offset - offset;
7967   if (frame->fp_sp_offset > 0)
7968     frame->fp_save_offset = frame->fp_sp_offset - offset;
7969
7970   /* MIPS16 code offsets the frame pointer by the size of the outgoing
7971      arguments.  This tends to increase the chances of using unextended
7972      instructions for local variables and incoming arguments.  */
7973   if (TARGET_MIPS16)
7974     frame->hard_frame_pointer_offset = frame->args_size;
7975 }
7976
7977 /* Return the style of GP load sequence that is being used for the
7978    current function.  */
7979
7980 enum mips_loadgp_style
7981 mips_current_loadgp_style (void)
7982 {
7983   if (!TARGET_USE_GOT || cfun->machine->global_pointer == 0)
7984     return LOADGP_NONE;
7985
7986   if (TARGET_RTP_PIC)
7987     return LOADGP_RTP;
7988
7989   if (TARGET_ABSOLUTE_ABICALLS)
7990     return LOADGP_ABSOLUTE;
7991
7992   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
7993 }
7994 \f
7995 /* Implement FRAME_POINTER_REQUIRED.  */
7996
7997 bool
7998 mips_frame_pointer_required (void)
7999 {
8000   /* If the function contains dynamic stack allocations, we need to
8001      use the frame pointer to access the static parts of the frame.  */
8002   if (current_function_calls_alloca)
8003     return true;
8004
8005   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
8006      reload may be unable to compute the address of a local variable,
8007      since there is no way to add a large constant to the stack pointer
8008      without using a second temporary register.  */
8009   if (TARGET_MIPS16)
8010     {
8011       mips_compute_frame_info ();
8012       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
8013         return true;
8014     }
8015
8016   return false;
8017 }
8018
8019 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame
8020    pointer or argument pointer.  TO is either the stack pointer or
8021    hard frame pointer.  */
8022
8023 HOST_WIDE_INT
8024 mips_initial_elimination_offset (int from, int to)
8025 {
8026   HOST_WIDE_INT offset;
8027
8028   mips_compute_frame_info ();
8029
8030   /* Set OFFSET to the offset from the soft frame pointer, which is also
8031      the offset from the end-of-prologue stack pointer.  */
8032   switch (from)
8033     {
8034     case FRAME_POINTER_REGNUM:
8035       offset = 0;
8036       break;
8037
8038     case ARG_POINTER_REGNUM:
8039       offset = cfun->machine->frame.arg_pointer_offset;
8040       break;
8041
8042     default:
8043       gcc_unreachable ();
8044     }
8045
8046   if (to == HARD_FRAME_POINTER_REGNUM)
8047     offset -= cfun->machine->frame.hard_frame_pointer_offset;
8048
8049   return offset;
8050 }
8051 \f
8052 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  Some code models use the incoming
8053    value of PIC_FUNCTION_ADDR_REGNUM to set up the global pointer.  */
8054
8055 static void
8056 mips_extra_live_on_entry (bitmap regs)
8057 {
8058   if (TARGET_USE_GOT && !TARGET_ABSOLUTE_ABICALLS)
8059     bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
8060 }
8061
8062 /* Implement RETURN_ADDR_RTX.  Note, we do not support moving
8063    back to a previous frame.  */
8064
8065 rtx
8066 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
8067 {
8068   if (count != 0)
8069     return const0_rtx;
8070
8071   return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
8072 }
8073
8074 /* Emit code to change the current function's return address to
8075    ADDRESS.  SCRATCH is available as a scratch register, if needed.
8076    ADDRESS and SCRATCH are both word-mode GPRs.  */
8077
8078 void
8079 mips_set_return_address (rtx address, rtx scratch)
8080 {
8081   rtx slot_address;
8082
8083   gcc_assert ((cfun->machine->frame.mask >> 31) & 1);
8084   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
8085                                   cfun->machine->frame.gp_sp_offset);
8086
8087   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
8088 }
8089
8090 /* Restore $gp from its save slot.  Valid only when using o32 or
8091    o64 abicalls.  */
8092
8093 void
8094 mips_restore_gp (void)
8095 {
8096   rtx address;
8097
8098   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
8099
8100   address = mips_add_offset (pic_offset_table_rtx,
8101                              frame_pointer_needed
8102                              ? hard_frame_pointer_rtx
8103                              : stack_pointer_rtx,
8104                              current_function_outgoing_args_size);
8105
8106   mips_emit_move (pic_offset_table_rtx, gen_frame_mem (Pmode, address));
8107   if (!TARGET_EXPLICIT_RELOCS)
8108     emit_insn (gen_blockage ());
8109 }
8110 \f
8111 /* A function to save or store a register.  The first argument is the
8112    register and the second is the stack slot.  */
8113 typedef void (*mips_save_restore_fn) (rtx, rtx);
8114
8115 /* Use FN to save or restore register REGNO.  MODE is the register's
8116    mode and OFFSET is the offset of its save slot from the current
8117    stack pointer.  */
8118
8119 static void
8120 mips_save_restore_reg (enum machine_mode mode, int regno,
8121                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
8122 {
8123   rtx mem;
8124
8125   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
8126
8127   fn (gen_rtx_REG (mode, regno), mem);
8128 }
8129
8130
8131 /* Call FN for each register that is saved by the current function.
8132    SP_OFFSET is the offset of the current stack pointer from the start
8133    of the frame.  */
8134
8135 static void
8136 mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
8137 {
8138   enum machine_mode fpr_mode;
8139   HOST_WIDE_INT offset;
8140   int regno;
8141
8142   /* Save registers starting from high to low.  The debuggers prefer at least
8143      the return register be stored at func+4, and also it allows us not to
8144      need a nop in the epilogue if at least one register is reloaded in
8145      addition to return address.  */
8146   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
8147   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
8148     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
8149       {
8150         mips_save_restore_reg (word_mode, regno, offset, fn);
8151         offset -= UNITS_PER_WORD;
8152       }
8153
8154   /* This loop must iterate over the same space as its companion in
8155      mips_compute_frame_info.  */
8156   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
8157   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
8158   for (regno = (FP_REG_LAST - MAX_FPRS_PER_FMT + 1);
8159        regno >= FP_REG_FIRST;
8160        regno -= MAX_FPRS_PER_FMT)
8161     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
8162       {
8163         mips_save_restore_reg (fpr_mode, regno, offset, fn);
8164         offset -= GET_MODE_SIZE (fpr_mode);
8165       }
8166 }
8167 \f
8168 /* If we're generating n32 or n64 abicalls, and the current function
8169    does not use $28 as its global pointer, emit a cplocal directive.
8170    Use pic_offset_table_rtx as the argument to the directive.  */
8171
8172 static void
8173 mips_output_cplocal (void)
8174 {
8175   if (!TARGET_EXPLICIT_RELOCS
8176       && cfun->machine->global_pointer > 0
8177       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
8178     output_asm_insn (".cplocal %+", 0);
8179 }
8180
8181 /* Set up the stack and frame (if desired) for the function.  */
8182
8183 static void
8184 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8185 {
8186   const char *fnname;
8187   HOST_WIDE_INT tsize = cfun->machine->frame.total_size;
8188
8189 #ifdef SDB_DEBUGGING_INFO
8190   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
8191     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
8192 #endif
8193
8194   /* In mips16 mode, we may need to generate a 32 bit to handle
8195      floating point arguments.  The linker will arrange for any 32-bit
8196      functions to call this stub, which will then jump to the 16-bit
8197      function proper.  */
8198   if (TARGET_MIPS16
8199       && TARGET_HARD_FLOAT_ABI
8200       && current_function_args_info.fp_code != 0)
8201     build_mips16_function_stub ();
8202
8203   /* Select the mips16 mode for this function.  */
8204   if (TARGET_MIPS16)
8205     fprintf (file, "\t.set\tmips16\n");
8206   else
8207     fprintf (file, "\t.set\tnomips16\n");
8208
8209   if (!FUNCTION_NAME_ALREADY_DECLARED)
8210     {
8211       /* Get the function name the same way that toplev.c does before calling
8212          assemble_start_function.  This is needed so that the name used here
8213          exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
8214       fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
8215
8216       if (!flag_inhibit_size_directive)
8217         {
8218           fputs ("\t.ent\t", file);
8219           assemble_name (file, fnname);
8220           fputs ("\n", file);
8221         }
8222
8223       assemble_name (file, fnname);
8224       fputs (":\n", file);
8225     }
8226
8227   /* Stop mips_file_end from treating this function as external.  */
8228   if (TARGET_IRIX && mips_abi == ABI_32)
8229     TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
8230
8231   if (!flag_inhibit_size_directive)
8232     {
8233       /* .frame FRAMEREG, FRAMESIZE, RETREG */
8234       fprintf (file,
8235                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
8236                "# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
8237                ", args= " HOST_WIDE_INT_PRINT_DEC
8238                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
8239                (reg_names[(frame_pointer_needed)
8240                           ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
8241                (frame_pointer_needed
8242                 ? tsize - cfun->machine->frame.hard_frame_pointer_offset
8243                 : tsize),
8244                reg_names[GP_REG_FIRST + 31],
8245                cfun->machine->frame.var_size,
8246                cfun->machine->frame.num_gp,
8247                cfun->machine->frame.num_fp,
8248                cfun->machine->frame.args_size,
8249                cfun->machine->frame.cprestore_size);
8250
8251       /* .mask MASK, GPOFFSET; .fmask FPOFFSET */
8252       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
8253                cfun->machine->frame.mask,
8254                cfun->machine->frame.gp_save_offset);
8255       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
8256                cfun->machine->frame.fmask,
8257                cfun->machine->frame.fp_save_offset);
8258
8259       /* Require:
8260          OLD_SP == *FRAMEREG + FRAMESIZE => can find old_sp from nominated FP reg.
8261          HIGHEST_GP_SAVED == *FRAMEREG + FRAMESIZE + GPOFFSET => can find saved regs.  */
8262     }
8263
8264   if (mips_current_loadgp_style () == LOADGP_OLDABI)
8265     {
8266       /* Handle the initialization of $gp for SVR4 PIC.  */
8267       if (!cfun->machine->all_noreorder_p)
8268         output_asm_insn ("%(.cpload\t%^%)", 0);
8269       else
8270         output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
8271     }
8272   else if (cfun->machine->all_noreorder_p)
8273     output_asm_insn ("%(%<", 0);
8274
8275   /* Tell the assembler which register we're using as the global
8276      pointer.  This is needed for thunks, since they can use either
8277      explicit relocs or assembler macros.  */
8278   mips_output_cplocal ();
8279 }
8280
8281 /* Do any necessary cleanup after a function to restore stack, frame,
8282    and regs.  */
8283
8284 #define RA_MASK BITMASK_HIGH    /* 1 << 31 */
8285
8286 static void
8287 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8288                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8289 {
8290   /* Reinstate the normal $gp.  */
8291   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
8292   mips_output_cplocal ();
8293
8294   if (cfun->machine->all_noreorder_p)
8295     {
8296       /* Avoid using %>%) since it adds excess whitespace.  */
8297       output_asm_insn (".set\tmacro", 0);
8298       output_asm_insn (".set\treorder", 0);
8299       set_noreorder = set_nomacro = 0;
8300     }
8301
8302   if (!FUNCTION_NAME_ALREADY_DECLARED && !flag_inhibit_size_directive)
8303     {
8304       const char *fnname;
8305
8306       /* Get the function name the same way that toplev.c does before calling
8307          assemble_start_function.  This is needed so that the name used here
8308          exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
8309       fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
8310       fputs ("\t.end\t", file);
8311       assemble_name (file, fnname);
8312       fputs ("\n", file);
8313     }
8314 }
8315 \f
8316 /* Save register REG to MEM.  Make the instruction frame-related.  */
8317
8318 static void
8319 mips_save_reg (rtx reg, rtx mem)
8320 {
8321   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
8322     {
8323       rtx x1, x2;
8324
8325       if (mips_split_64bit_move_p (mem, reg))
8326         mips_split_doubleword_move (mem, reg);
8327       else
8328         mips_emit_move (mem, reg);
8329
8330       x1 = mips_frame_set (mips_subword (mem, 0), mips_subword (reg, 0));
8331       x2 = mips_frame_set (mips_subword (mem, 1), mips_subword (reg, 1));
8332       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
8333     }
8334   else
8335     {
8336       if (TARGET_MIPS16
8337           && REGNO (reg) != GP_REG_FIRST + 31
8338           && !M16_REG_P (REGNO (reg)))
8339         {
8340           /* Save a non-mips16 register by moving it through a temporary.
8341              We don't need to do this for $31 since there's a special
8342              instruction for it.  */
8343           mips_emit_move (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
8344           mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
8345         }
8346       else
8347         mips_emit_move (mem, reg);
8348
8349       mips_set_frame_expr (mips_frame_set (mem, reg));
8350     }
8351 }
8352
8353 /* The __gnu_local_gp symbol.  */
8354
8355 static GTY(()) rtx mips_gnu_local_gp;
8356
8357 /* If we're generating n32 or n64 abicalls, emit instructions
8358    to set up the global pointer.  */
8359
8360 static void
8361 mips_emit_loadgp (void)
8362 {
8363   rtx addr, offset, incoming_address, base, index;
8364
8365   switch (mips_current_loadgp_style ())
8366     {
8367     case LOADGP_ABSOLUTE:
8368       if (mips_gnu_local_gp == NULL)
8369         {
8370           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
8371           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
8372         }
8373       emit_insn (gen_loadgp_absolute (mips_gnu_local_gp));
8374       break;
8375
8376     case LOADGP_NEWABI:
8377       addr = XEXP (DECL_RTL (current_function_decl), 0);
8378       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
8379       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
8380       emit_insn (gen_loadgp_newabi (offset, incoming_address));
8381       if (!TARGET_EXPLICIT_RELOCS)
8382         emit_insn (gen_loadgp_blockage ());
8383       break;
8384
8385     case LOADGP_RTP:
8386       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
8387       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
8388       emit_insn (gen_loadgp_rtp (base, index));
8389       if (!TARGET_EXPLICIT_RELOCS)
8390         emit_insn (gen_loadgp_blockage ());
8391       break;
8392
8393     default:
8394       break;
8395     }
8396 }
8397
8398 /* Expand the prologue into a bunch of separate insns.  */
8399
8400 void
8401 mips_expand_prologue (void)
8402 {
8403   HOST_WIDE_INT size;
8404   unsigned int nargs;
8405   rtx insn;
8406
8407   if (cfun->machine->global_pointer > 0)
8408     SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
8409
8410   size = cfun->machine->frame.total_size;
8411
8412   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
8413      bytes beforehand; this is enough to cover the register save area
8414      without going out of range.  */
8415   if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
8416     {
8417       HOST_WIDE_INT step1;
8418
8419       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
8420
8421       if (GENERATE_MIPS16E_SAVE_RESTORE)
8422         {
8423           HOST_WIDE_INT offset;
8424           unsigned int mask, regno;
8425
8426           /* Try to merge argument stores into the save instruction.  */
8427           nargs = mips16e_collect_argument_saves ();
8428
8429           /* Build the save instruction.  */
8430           mask = cfun->machine->frame.mask;
8431           insn = mips16e_build_save_restore (false, &mask, &offset,
8432                                              nargs, step1);
8433           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8434           size -= step1;
8435
8436           /* Check if we need to save other registers.  */
8437           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
8438             if (BITSET_P (mask, regno - GP_REG_FIRST))
8439               {
8440                 offset -= UNITS_PER_WORD;
8441                 mips_save_restore_reg (word_mode, regno,
8442                                        offset, mips_save_reg);
8443               }
8444         }
8445       else
8446         {
8447           insn = gen_add3_insn (stack_pointer_rtx,
8448                                 stack_pointer_rtx,
8449                                 GEN_INT (-step1));
8450           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8451           size -= step1;
8452           mips_for_each_saved_reg (size, mips_save_reg);
8453         }
8454     }
8455
8456   /* Allocate the rest of the frame.  */
8457   if (size > 0)
8458     {
8459       if (SMALL_OPERAND (-size))
8460         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
8461                                                        stack_pointer_rtx,
8462                                                        GEN_INT (-size)))) = 1;
8463       else
8464         {
8465           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
8466           if (TARGET_MIPS16)
8467             {
8468               /* There are no instructions to add or subtract registers
8469                  from the stack pointer, so use the frame pointer as a
8470                  temporary.  We should always be using a frame pointer
8471                  in this case anyway.  */
8472               gcc_assert (frame_pointer_needed);
8473               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8474               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
8475                                         hard_frame_pointer_rtx,
8476                                         MIPS_PROLOGUE_TEMP (Pmode)));
8477               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
8478             }
8479           else
8480             emit_insn (gen_sub3_insn (stack_pointer_rtx,
8481                                       stack_pointer_rtx,
8482                                       MIPS_PROLOGUE_TEMP (Pmode)));
8483
8484           /* Describe the combined effect of the previous instructions.  */
8485           mips_set_frame_expr
8486             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8487                           plus_constant (stack_pointer_rtx, -size)));
8488         }
8489     }
8490
8491   /* Set up the frame pointer, if we're using one.  */
8492   if (frame_pointer_needed)
8493     {
8494       HOST_WIDE_INT offset;
8495
8496       offset = cfun->machine->frame.hard_frame_pointer_offset;
8497       if (offset == 0)
8498         {
8499           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8500           RTX_FRAME_RELATED_P (insn) = 1;
8501         }
8502       else if (SMALL_OPERAND (offset))
8503         {
8504           insn = gen_add3_insn (hard_frame_pointer_rtx,
8505                                 stack_pointer_rtx, GEN_INT (offset));
8506           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
8507         }
8508       else
8509         {
8510           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
8511           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
8512           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
8513                                     hard_frame_pointer_rtx,
8514                                     MIPS_PROLOGUE_TEMP (Pmode)));
8515           mips_set_frame_expr
8516             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
8517                           plus_constant (stack_pointer_rtx, offset)));
8518         }
8519     }
8520
8521   mips_emit_loadgp ();
8522
8523   /* If generating o32/o64 abicalls, save $gp on the stack.  */
8524   if (TARGET_ABICALLS && TARGET_OLDABI && !current_function_is_leaf)
8525     emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
8526
8527   /* If we are profiling, make sure no instructions are scheduled before
8528      the call to mcount.  */
8529
8530   if (current_function_profile)
8531     emit_insn (gen_blockage ());
8532 }
8533 \f
8534 /* Emit instructions to restore register REG from slot MEM.  */
8535
8536 static void
8537 mips_restore_reg (rtx reg, rtx mem)
8538 {
8539   /* There's no mips16 instruction to load $31 directly.  Load into
8540      $7 instead and adjust the return insn appropriately.  */
8541   if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
8542     reg = gen_rtx_REG (GET_MODE (reg), 7);
8543
8544   if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
8545     {
8546       /* Can't restore directly; move through a temporary.  */
8547       mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
8548       mips_emit_move (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
8549     }
8550   else
8551     mips_emit_move (reg, mem);
8552 }
8553
8554
8555 /* Expand the epilogue into a bunch of separate insns.  SIBCALL_P is true
8556    if this epilogue precedes a sibling call, false if it is for a normal
8557    "epilogue" pattern.  */
8558
8559 void
8560 mips_expand_epilogue (int sibcall_p)
8561 {
8562   HOST_WIDE_INT step1, step2;
8563   rtx base, target;
8564
8565   if (!sibcall_p && mips_can_use_return_insn ())
8566     {
8567       emit_jump_insn (gen_return ());
8568       return;
8569     }
8570
8571   /* In mips16 mode, if the return value should go into a floating-point
8572      register, we need to call a helper routine to copy it over.  */
8573   if (mips16_cfun_returns_in_fpr_p ())
8574     mips16_copy_fpr_return_value ();
8575
8576   /* Split the frame into two.  STEP1 is the amount of stack we should
8577      deallocate before restoring the registers.  STEP2 is the amount we
8578      should deallocate afterwards.
8579
8580      Start off by assuming that no registers need to be restored.  */
8581   step1 = cfun->machine->frame.total_size;
8582   step2 = 0;
8583
8584   /* Work out which register holds the frame address.  */
8585   if (!frame_pointer_needed)
8586     base = stack_pointer_rtx;
8587   else
8588     {
8589       base = hard_frame_pointer_rtx;
8590       step1 -= cfun->machine->frame.hard_frame_pointer_offset;
8591     }
8592
8593   /* If we need to restore registers, deallocate as much stack as
8594      possible in the second step without going out of range.  */
8595   if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
8596     {
8597       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
8598       step1 -= step2;
8599     }
8600
8601   /* Set TARGET to BASE + STEP1.  */
8602   target = base;
8603   if (step1 > 0)
8604     {
8605       rtx adjust;
8606
8607       /* Get an rtx for STEP1 that we can add to BASE.  */
8608       adjust = GEN_INT (step1);
8609       if (!SMALL_OPERAND (step1))
8610         {
8611           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
8612           adjust = MIPS_EPILOGUE_TEMP (Pmode);
8613         }
8614
8615       /* Normal mode code can copy the result straight into $sp.  */
8616       if (!TARGET_MIPS16)
8617         target = stack_pointer_rtx;
8618
8619       emit_insn (gen_add3_insn (target, base, adjust));
8620     }
8621
8622   /* Copy TARGET into the stack pointer.  */
8623   if (target != stack_pointer_rtx)
8624     mips_emit_move (stack_pointer_rtx, target);
8625
8626   /* If we're using addressing macros, $gp is implicitly used by all
8627      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
8628      from the stack.  */
8629   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
8630     emit_insn (gen_blockage ());
8631
8632   if (GENERATE_MIPS16E_SAVE_RESTORE && cfun->machine->frame.mask != 0)
8633     {
8634       unsigned int regno, mask;
8635       HOST_WIDE_INT offset;
8636       rtx restore;
8637
8638       /* Generate the restore instruction.  */
8639       mask = cfun->machine->frame.mask;
8640       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
8641
8642       /* Restore any other registers manually.  */
8643       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
8644         if (BITSET_P (mask, regno - GP_REG_FIRST))
8645           {
8646             offset -= UNITS_PER_WORD;
8647             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
8648           }
8649
8650       /* Restore the remaining registers and deallocate the final bit
8651          of the frame.  */
8652       emit_insn (restore);
8653     }
8654   else
8655     {
8656       /* Restore the registers.  */
8657       mips_for_each_saved_reg (cfun->machine->frame.total_size - step2,
8658                                mips_restore_reg);
8659
8660       /* Deallocate the final bit of the frame.  */
8661       if (step2 > 0)
8662         emit_insn (gen_add3_insn (stack_pointer_rtx,
8663                                   stack_pointer_rtx,
8664                                   GEN_INT (step2)));
8665     }
8666
8667   /* Add in the __builtin_eh_return stack adjustment.  We need to
8668      use a temporary in mips16 code.  */
8669   if (current_function_calls_eh_return)
8670     {
8671       if (TARGET_MIPS16)
8672         {
8673           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
8674           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
8675                                     MIPS_EPILOGUE_TEMP (Pmode),
8676                                     EH_RETURN_STACKADJ_RTX));
8677           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
8678         }
8679       else
8680         emit_insn (gen_add3_insn (stack_pointer_rtx,
8681                                   stack_pointer_rtx,
8682                                   EH_RETURN_STACKADJ_RTX));
8683     }
8684
8685   if (!sibcall_p)
8686     {
8687       /* When generating MIPS16 code, the normal mips_for_each_saved_reg
8688          path will restore the return address into $7 rather than $31.  */
8689       if (TARGET_MIPS16
8690           && !GENERATE_MIPS16E_SAVE_RESTORE
8691           && (cfun->machine->frame.mask & RA_MASK) != 0)
8692         emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
8693                                                           GP_REG_FIRST + 7)));
8694       else
8695         emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
8696                                                           GP_REG_FIRST + 31)));
8697     }
8698 }
8699 \f
8700 /* Return nonzero if this function is known to have a null epilogue.
8701    This allows the optimizer to omit jumps to jumps if no stack
8702    was created.  */
8703
8704 int
8705 mips_can_use_return_insn (void)
8706 {
8707   if (! reload_completed)
8708     return 0;
8709
8710   if (current_function_profile)
8711     return 0;
8712
8713   /* In mips16 mode, a function that returns a floating point value
8714      needs to arrange to copy the return value into the floating point
8715      registers.  */
8716   if (mips16_cfun_returns_in_fpr_p ())
8717     return 0;
8718
8719   return cfun->machine->frame.total_size == 0;
8720 }
8721 \f
8722 /* Return true if register REGNO can store a value of mode MODE.
8723    The result of this function is cached in mips_hard_regno_mode_ok.  */
8724
8725 static bool
8726 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
8727 {
8728   unsigned int size;
8729   enum mode_class class;
8730
8731   if (mode == CCV2mode)
8732     return (ISA_HAS_8CC
8733             && ST_REG_P (regno)
8734             && (regno - ST_REG_FIRST) % 2 == 0);
8735
8736   if (mode == CCV4mode)
8737     return (ISA_HAS_8CC
8738             && ST_REG_P (regno)
8739             && (regno - ST_REG_FIRST) % 4 == 0);
8740
8741   if (mode == CCmode)
8742     {
8743       if (!ISA_HAS_8CC)
8744         return regno == FPSW_REGNUM;
8745
8746       return (ST_REG_P (regno)
8747               || GP_REG_P (regno)
8748               || FP_REG_P (regno));
8749     }
8750
8751   size = GET_MODE_SIZE (mode);
8752   class = GET_MODE_CLASS (mode);
8753
8754   if (GP_REG_P (regno))
8755     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
8756
8757   if (FP_REG_P (regno)
8758       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
8759           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
8760     {
8761       /* Allow TFmode for CCmode reloads.  */
8762       if (mode == TFmode && ISA_HAS_8CC)
8763         return true;
8764
8765       if (class == MODE_FLOAT
8766           || class == MODE_COMPLEX_FLOAT
8767           || class == MODE_VECTOR_FLOAT)
8768         return size <= UNITS_PER_FPVALUE;
8769
8770       /* Allow integer modes that fit into a single register.  We need
8771          to put integers into FPRs when using instructions like CVT
8772          and TRUNC.  There's no point allowing sizes smaller than a word,
8773          because the FPU has no appropriate load/store instructions.  */
8774       if (class == MODE_INT)
8775         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
8776     }
8777
8778   if (ACC_REG_P (regno)
8779       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
8780     {
8781       if (size <= UNITS_PER_WORD)
8782         return true;
8783
8784       if (size <= UNITS_PER_WORD * 2)
8785         return (DSP_ACC_REG_P (regno)
8786                 ? ((regno - DSP_ACC_REG_FIRST) & 1) == 0
8787                 : regno == MD_REG_FIRST);
8788     }
8789
8790   if (ALL_COP_REG_P (regno))
8791     return class == MODE_INT && size <= UNITS_PER_WORD;
8792
8793   return false;
8794 }
8795
8796 /* Implement HARD_REGNO_NREGS.  */
8797
8798 unsigned int
8799 mips_hard_regno_nregs (int regno, enum machine_mode mode)
8800 {
8801   if (ST_REG_P (regno))
8802     /* The size of FP status registers is always 4, because they only hold
8803        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
8804     return (GET_MODE_SIZE (mode) + 3) / 4;
8805
8806   if (FP_REG_P (regno))
8807     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
8808
8809   /* All other registers are word-sized.  */
8810   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8811 }
8812
8813 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
8814    in mips_hard_regno_nregs.  */
8815
8816 int
8817 mips_class_max_nregs (enum reg_class class, enum machine_mode mode)
8818 {
8819   int size;
8820   HARD_REG_SET left;
8821
8822   size = 0x8000;
8823   COPY_HARD_REG_SET (left, reg_class_contents[(int) class]);
8824   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
8825     {
8826       size = MIN (size, 4);
8827       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
8828     }
8829   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
8830     {
8831       size = MIN (size, UNITS_PER_FPREG);
8832       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
8833     }
8834   if (!hard_reg_set_empty_p (left))
8835     size = MIN (size, UNITS_PER_WORD);
8836   return (GET_MODE_SIZE (mode) + size - 1) / size;
8837 }
8838
8839 /* Return true if registers of class CLASS cannot change from mode FROM
8840    to mode TO.  */
8841
8842 bool
8843 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
8844                                enum machine_mode to ATTRIBUTE_UNUSED,
8845                                enum reg_class class)
8846 {
8847   /* There are several problems with changing the modes of values
8848      in floating-point registers:
8849
8850      - When a multi-word value is stored in paired floating-point
8851        registers, the first register always holds the low word.
8852        We therefore can't allow FPRs to change between single-word
8853        and multi-word modes on big-endian targets.
8854
8855      - GCC assumes that each word of a multiword register can be accessed
8856        individually using SUBREGs.  This is not true for floating-point
8857        registers if they are bigger than a word.
8858
8859      - Loading a 32-bit value into a 64-bit floating-point register
8860        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
8861        We can't allow FPRs to change from SImode to to a wider mode on
8862        64-bit targets.
8863
8864      - If the FPU has already interpreted a value in one format, we must
8865        not ask it to treat the value as having a different format.
8866
8867      We therefore only allow changes between 4-byte and smaller integer
8868      values, all of which have the "W" format as far as the FPU is
8869      concerned.  */
8870   return (reg_classes_intersect_p (FP_REGS, class)
8871           && (GET_MODE_CLASS (from) != MODE_INT
8872               || GET_MODE_CLASS (to) != MODE_INT
8873               || GET_MODE_SIZE (from) > 4
8874               || GET_MODE_SIZE (to) > 4));
8875 }
8876
8877 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
8878
8879 static bool
8880 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
8881 {
8882   switch (mode)
8883     {
8884     case SFmode:
8885       return TARGET_HARD_FLOAT;
8886
8887     case DFmode:
8888       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
8889
8890     case V2SFmode:
8891       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
8892
8893     default:
8894       return false;
8895     }
8896 }
8897
8898 /* Implement MODES_TIEABLE_P.  */
8899
8900 bool
8901 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
8902 {
8903   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
8904      prefer to put one of them in FPRs.  */
8905   return (mode1 == mode2
8906           || (!mips_mode_ok_for_mov_fmt_p (mode1)
8907               && !mips_mode_ok_for_mov_fmt_p (mode2)));
8908 }
8909
8910 /* Implement PREFERRED_RELOAD_CLASS.  */
8911
8912 enum reg_class
8913 mips_preferred_reload_class (rtx x, enum reg_class class)
8914 {
8915   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
8916     return LEA_REGS;
8917
8918   if (reg_class_subset_p (FP_REGS, class)
8919       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
8920     return FP_REGS;
8921
8922   if (reg_class_subset_p (GR_REGS, class))
8923     class = GR_REGS;
8924
8925   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, class))
8926     class = M16_REGS;
8927
8928   return class;
8929 }
8930
8931 /* Return a number assessing the cost of moving a register in class
8932    FROM to class TO.  The classes are expressed using the enumeration
8933    values such as `GENERAL_REGS'.  A value of 2 is the default; other
8934    values are interpreted relative to that.
8935
8936    It is not required that the cost always equal 2 when FROM is the
8937    same as TO; on some machines it is expensive to move between
8938    registers if they are not general registers.
8939
8940    If reload sees an insn consisting of a single `set' between two
8941    hard registers, and if `REGISTER_MOVE_COST' applied to their
8942    classes returns a value of 2, reload does not check to ensure that
8943    the constraints of the insn are met.  Setting a cost of other than
8944    2 will allow reload to verify that the constraints are met.  You
8945    should do this if the `movM' pattern's constraints do not allow
8946    such copying.
8947
8948    ??? We make the cost of moving from HI/LO into general
8949    registers the same as for one of moving general registers to
8950    HI/LO for TARGET_MIPS16 in order to prevent allocating a
8951    pseudo to HI/LO.  This might hurt optimizations though, it
8952    isn't clear if it is wise.  And it might not work in all cases.  We
8953    could solve the DImode LO reg problem by using a multiply, just
8954    like reload_{in,out}si.  We could solve the SImode/HImode HI reg
8955    problem by using divide instructions.  divu puts the remainder in
8956    the HI reg, so doing a divide by -1 will move the value in the HI
8957    reg for all values except -1.  We could handle that case by using a
8958    signed divide, e.g.  -1 / 2 (or maybe 1 / -2?).  We'd have to emit
8959    a compare/branch to test the input value to see which instruction
8960    we need to use.  This gets pretty messy, but it is feasible.  */
8961
8962 int
8963 mips_register_move_cost (enum machine_mode mode,
8964                          enum reg_class to, enum reg_class from)
8965 {
8966   if (TARGET_MIPS16)
8967     {
8968       if (reg_class_subset_p (from, GENERAL_REGS)
8969           && reg_class_subset_p (to, GENERAL_REGS))
8970         {
8971           if (reg_class_subset_p (from, M16_REGS)
8972               || reg_class_subset_p (to, M16_REGS))
8973             return 2;
8974           /* Two MOVEs.  */
8975           return 4;
8976         }
8977     }
8978   else if (reg_class_subset_p (from, GENERAL_REGS))
8979     {
8980       if (reg_class_subset_p (to, GENERAL_REGS))
8981         return 2;
8982       if (reg_class_subset_p (to, FP_REGS))
8983         return 4;
8984       if (reg_class_subset_p (to, ALL_COP_AND_GR_REGS))
8985         return 5;
8986       if (reg_class_subset_p (to, ACC_REGS))
8987         return 6;
8988     }
8989   else if (reg_class_subset_p (to, GENERAL_REGS))
8990     {
8991       if (reg_class_subset_p (from, FP_REGS))
8992         return 4;
8993       if (reg_class_subset_p (from, ST_REGS))
8994         /* LUI followed by MOVF.  */
8995         return 4;
8996       if (reg_class_subset_p (from, ALL_COP_AND_GR_REGS))
8997         return 5;
8998       if (reg_class_subset_p (from, ACC_REGS))
8999         return 6;
9000     }
9001   else if (reg_class_subset_p (from, FP_REGS))
9002     {
9003       if (reg_class_subset_p (to, FP_REGS)
9004           && mips_mode_ok_for_mov_fmt_p (mode))
9005         return 4;
9006       if (reg_class_subset_p (to, ST_REGS))
9007         /* An expensive sequence.  */
9008         return 8;
9009     }
9010
9011   return 12;
9012 }
9013
9014 /* This function returns the register class required for a secondary
9015    register when copying between one of the registers in CLASS, and X,
9016    using MODE.  If IN_P is nonzero, the copy is going from X to the
9017    register, otherwise the register is the source.  A return value of
9018    NO_REGS means that no secondary register is required.  */
9019
9020 enum reg_class
9021 mips_secondary_reload_class (enum reg_class class,
9022                              enum machine_mode mode, rtx x, int in_p)
9023 {
9024   int regno;
9025
9026   /* If X is a constant that cannot be loaded into $25, it must be loaded
9027      into some other GPR.  No other register class allows a direct move.  */
9028   if (mips_dangerous_for_la25_p (x))
9029     return reg_class_subset_p (class, LEA_REGS) ? NO_REGS : LEA_REGS;
9030
9031   regno = true_regnum (x);
9032   if (TARGET_MIPS16)
9033     {
9034       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
9035       if (!reg_class_subset_p (class, M16_REGS) && !M16_REG_P (regno))
9036         return M16_REGS;
9037
9038       /* We can't really copy to HI or LO at all in MIPS16 mode.  */
9039       if (in_p ? reg_classes_intersect_p (class, ACC_REGS) : ACC_REG_P (regno))
9040         return M16_REGS;
9041
9042       return NO_REGS;
9043     }
9044
9045   /* Copying from accumulator registers to anywhere other than a general
9046      register requires a temporary general register.  */
9047   if (reg_class_subset_p (class, ACC_REGS))
9048     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
9049   if (ACC_REG_P (regno))
9050     return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
9051
9052   /* We can only copy a value to a condition code register from a
9053      floating point register, and even then we require a scratch
9054      floating point register.  We can only copy a value out of a
9055      condition code register into a general register.  */
9056   if (reg_class_subset_p (class, ST_REGS))
9057     {
9058       if (in_p)
9059         return FP_REGS;
9060       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
9061     }
9062   if (ST_REG_P (regno))
9063     {
9064       if (!in_p)
9065         return FP_REGS;
9066       return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
9067     }
9068
9069   if (reg_class_subset_p (class, FP_REGS))
9070     {
9071       if (MEM_P (x)
9072           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
9073         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
9074            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
9075         return NO_REGS;
9076
9077       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
9078         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
9079         return NO_REGS;
9080
9081       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
9082         /* We can force the constant to memory and use lwc1
9083            and ldc1.  As above, we will use pairs of lwc1s if
9084            ldc1 is not supported.  */
9085         return NO_REGS;
9086
9087       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
9088         /* In this case we can use mov.fmt.  */
9089         return NO_REGS;
9090
9091       /* Otherwise, we need to reload through an integer register.  */
9092       return GR_REGS;
9093     }
9094   if (FP_REG_P (regno))
9095     return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
9096
9097   return NO_REGS;
9098 }
9099
9100 /* SImode values are represented as sign-extended to DImode.  */
9101
9102 static int
9103 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
9104 {
9105   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
9106     return SIGN_EXTEND;
9107
9108   return UNKNOWN;
9109 }
9110
9111 static bool
9112 mips_valid_pointer_mode (enum machine_mode mode)
9113 {
9114   return (mode == SImode || (TARGET_64BIT && mode == DImode));
9115 }
9116
9117 /* Target hook for vector_mode_supported_p.  */
9118
9119 static bool
9120 mips_vector_mode_supported_p (enum machine_mode mode)
9121 {
9122   switch (mode)
9123     {
9124     case V2SFmode:
9125       return TARGET_PAIRED_SINGLE_FLOAT;
9126
9127     case V2HImode:
9128     case V4QImode:
9129     case V2HQmode:
9130     case V2UHQmode:
9131     case V2HAmode:
9132     case V2UHAmode:
9133     case V4QQmode:
9134     case V4UQQmode:
9135       return TARGET_DSP;
9136
9137     default:
9138       return false;
9139     }
9140 }
9141
9142 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
9143
9144 static bool
9145 mips_scalar_mode_supported_p (enum machine_mode mode)
9146 {
9147   if (ALL_FIXED_POINT_MODE_P (mode)
9148       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
9149     return true;
9150
9151   return default_scalar_mode_supported_p (mode);
9152 }
9153 /* This function does three things:
9154
9155    - Register the special divsi3 and modsi3 functions if -mfix-vr4120.
9156    - Register the mips16 hardware floating point stubs.
9157    - Register the gofast functions if selected using --enable-gofast.  */
9158
9159 #include "config/gofast.h"
9160
9161 static void
9162 mips_init_libfuncs (void)
9163 {
9164   if (TARGET_FIX_VR4120)
9165     {
9166       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
9167       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
9168     }
9169
9170   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
9171     {
9172       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
9173       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
9174       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
9175       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
9176
9177       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
9178       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
9179       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
9180       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
9181       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
9182       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
9183       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
9184
9185       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
9186       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
9187       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
9188
9189       if (TARGET_DOUBLE_FLOAT)
9190         {
9191           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
9192           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
9193           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
9194           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
9195
9196           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
9197           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
9198           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
9199           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
9200           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
9201           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
9202           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
9203
9204           set_conv_libfunc (sext_optab, DFmode, SFmode, "__mips16_extendsfdf2");
9205           set_conv_libfunc (trunc_optab, SFmode, DFmode, "__mips16_truncdfsf2");
9206
9207           set_conv_libfunc (sfix_optab, SImode, DFmode, "__mips16_fix_truncdfsi");
9208           set_conv_libfunc (sfloat_optab, DFmode, SImode, "__mips16_floatsidf");
9209           set_conv_libfunc (ufloat_optab, DFmode, SImode, "__mips16_floatunsidf");
9210         }
9211     }
9212   else
9213     gofast_maybe_init_libfuncs ();
9214 }
9215
9216 /* Return the length of INSN.  LENGTH is the initial length computed by
9217    attributes in the machine-description file.  */
9218
9219 int
9220 mips_adjust_insn_length (rtx insn, int length)
9221 {
9222   /* A unconditional jump has an unfilled delay slot if it is not part
9223      of a sequence.  A conditional jump normally has a delay slot, but
9224      does not on MIPS16.  */
9225   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
9226     length += 4;
9227
9228   /* See how many nops might be needed to avoid hardware hazards.  */
9229   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
9230     switch (get_attr_hazard (insn))
9231       {
9232       case HAZARD_NONE:
9233         break;
9234
9235       case HAZARD_DELAY:
9236         length += 4;
9237         break;
9238
9239       case HAZARD_HILO:
9240         length += 8;
9241         break;
9242       }
9243
9244   /* All MIPS16 instructions are a measly two bytes.  */
9245   if (TARGET_MIPS16)
9246     length /= 2;
9247
9248   return length;
9249 }
9250
9251
9252 /* Return an asm sequence to start a noat block and load the address
9253    of a label into $1.  */
9254
9255 const char *
9256 mips_output_load_label (void)
9257 {
9258   if (TARGET_EXPLICIT_RELOCS)
9259     switch (mips_abi)
9260       {
9261       case ABI_N32:
9262         return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
9263
9264       case ABI_64:
9265         return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
9266
9267       default:
9268         if (ISA_HAS_LOAD_DELAY)
9269           return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
9270         return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
9271       }
9272   else
9273     {
9274       if (Pmode == DImode)
9275         return "%[dla\t%@,%0";
9276       else
9277         return "%[la\t%@,%0";
9278     }
9279 }
9280
9281 /* Return the assembly code for INSN, which has the operands given by
9282    OPERANDS, and which branches to OPERANDS[1] if some condition is true.
9283    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[1]
9284    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
9285    version of BRANCH_IF_TRUE.  */
9286
9287 const char *
9288 mips_output_conditional_branch (rtx insn, rtx *operands,
9289                                 const char *branch_if_true,
9290                                 const char *branch_if_false)
9291 {
9292   unsigned int length;
9293   rtx taken, not_taken;
9294
9295   length = get_attr_length (insn);
9296   if (length <= 8)
9297     {
9298       /* Just a simple conditional branch.  */
9299       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
9300       return branch_if_true;
9301     }
9302
9303   /* Generate a reversed branch around a direct jump.  This fallback does
9304      not use branch-likely instructions.  */
9305   mips_branch_likely = false;
9306   not_taken = gen_label_rtx ();
9307   taken = operands[1];
9308
9309   /* Generate the reversed branch to NOT_TAKEN.  */
9310   operands[1] = not_taken;
9311   output_asm_insn (branch_if_false, operands);
9312
9313   /* If INSN has a delay slot, we must provide delay slots for both the
9314      branch to NOT_TAKEN and the conditional jump.  We must also ensure
9315      that INSN's delay slot is executed in the appropriate cases.  */
9316   if (final_sequence)
9317     {
9318       /* This first delay slot will always be executed, so use INSN's
9319          delay slot if is not annulled.  */
9320       if (!INSN_ANNULLED_BRANCH_P (insn))
9321         {
9322           final_scan_insn (XVECEXP (final_sequence, 0, 1),
9323                            asm_out_file, optimize, 1, NULL);
9324           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
9325         }
9326       else
9327         output_asm_insn ("nop", 0);
9328       fprintf (asm_out_file, "\n");
9329     }
9330
9331   /* Output the unconditional branch to TAKEN.  */
9332   if (length <= 16)
9333     output_asm_insn ("j\t%0%/", &taken);
9334   else
9335     {
9336       output_asm_insn (mips_output_load_label (), &taken);
9337       output_asm_insn ("jr\t%@%]%/", 0);
9338     }
9339
9340   /* Now deal with its delay slot; see above.  */
9341   if (final_sequence)
9342     {
9343       /* This delay slot will only be executed if the branch is taken.
9344          Use INSN's delay slot if is annulled.  */
9345       if (INSN_ANNULLED_BRANCH_P (insn))
9346         {
9347           final_scan_insn (XVECEXP (final_sequence, 0, 1),
9348                            asm_out_file, optimize, 1, NULL);
9349           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
9350         }
9351       else
9352         output_asm_insn ("nop", 0);
9353       fprintf (asm_out_file, "\n");
9354     }
9355
9356   /* Output NOT_TAKEN.  */
9357   (*targetm.asm_out.internal_label) (asm_out_file, "L",
9358                                      CODE_LABEL_NUMBER (not_taken));
9359   return "";
9360 }
9361
9362 /* Return the assembly code for INSN, which branches to OPERANDS[1]
9363    if some ordered condition is true.  The condition is given by
9364    OPERANDS[0] if !INVERTED_P, otherwise it is the inverse of
9365    OPERANDS[0].  OPERANDS[2] is the comparison's first operand;
9366    its second is always zero.  */
9367
9368 const char *
9369 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
9370 {
9371   const char *branch[2];
9372
9373   /* Make BRANCH[1] branch to OPERANDS[1] when the condition is true.
9374      Make BRANCH[0] branch on the inverse condition.  */
9375   switch (GET_CODE (operands[0]))
9376     {
9377       /* These cases are equivalent to comparisons against zero.  */
9378     case LEU:
9379       inverted_p = !inverted_p;
9380       /* Fall through.  */
9381     case GTU:
9382       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%1");
9383       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%1");
9384       break;
9385
9386       /* These cases are always true or always false.  */
9387     case LTU:
9388       inverted_p = !inverted_p;
9389       /* Fall through.  */
9390     case GEU:
9391       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%1");
9392       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%1");
9393       break;
9394
9395     default:
9396       branch[!inverted_p] = MIPS_BRANCH ("b%C0z", "%2,%1");
9397       branch[inverted_p] = MIPS_BRANCH ("b%N0z", "%2,%1");
9398       break;
9399     }
9400   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
9401 }
9402 \f
9403 /* Used to output div or ddiv instruction DIVISION, which has the operands
9404    given by OPERANDS.  Add in a divide-by-zero check if needed.
9405
9406    When working around R4000 and R4400 errata, we need to make sure that
9407    the division is not immediately followed by a shift[1][2].  We also
9408    need to stop the division from being put into a branch delay slot[3].
9409    The easiest way to avoid both problems is to add a nop after the
9410    division.  When a divide-by-zero check is needed, this nop can be
9411    used to fill the branch delay slot.
9412
9413    [1] If a double-word or a variable shift executes immediately
9414        after starting an integer division, the shift may give an
9415        incorrect result.  See quotations of errata #16 and #28 from
9416        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9417        in mips.md for details.
9418
9419    [2] A similar bug to [1] exists for all revisions of the
9420        R4000 and the R4400 when run in an MC configuration.
9421        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
9422
9423        "19. In this following sequence:
9424
9425                     ddiv                (or ddivu or div or divu)
9426                     dsll32              (or dsrl32, dsra32)
9427
9428             if an MPT stall occurs, while the divide is slipping the cpu
9429             pipeline, then the following double shift would end up with an
9430             incorrect result.
9431
9432             Workaround: The compiler needs to avoid generating any
9433             sequence with divide followed by extended double shift."
9434
9435        This erratum is also present in "MIPS R4400MC Errata, Processor
9436        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
9437        & 3.0" as errata #10 and #4, respectively.
9438
9439    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9440        (also valid for MIPS R4000MC processors):
9441
9442        "52. R4000SC: This bug does not apply for the R4000PC.
9443
9444             There are two flavors of this bug:
9445
9446             1) If the instruction just after divide takes an RF exception
9447                (tlb-refill, tlb-invalid) and gets an instruction cache
9448                miss (both primary and secondary) and the line which is
9449                currently in secondary cache at this index had the first
9450                data word, where the bits 5..2 are set, then R4000 would
9451                get a wrong result for the div.
9452
9453             ##1
9454                     nop
9455                     div r8, r9
9456                     -------------------         # end-of page. -tlb-refill
9457                     nop
9458             ##2
9459                     nop
9460                     div r8, r9
9461                     -------------------         # end-of page. -tlb-invalid
9462                     nop
9463
9464             2) If the divide is in the taken branch delay slot, where the
9465                target takes RF exception and gets an I-cache miss for the
9466                exception vector or where I-cache miss occurs for the
9467                target address, under the above mentioned scenarios, the
9468                div would get wrong results.
9469
9470             ##1
9471                     j   r2              # to next page mapped or unmapped
9472                     div r8,r9           # this bug would be there as long
9473                                         # as there is an ICache miss and
9474                     nop                 # the "data pattern" is present
9475
9476             ##2
9477                     beq r0, r0, NextPage        # to Next page
9478                     div r8,r9
9479                     nop
9480
9481             This bug is present for div, divu, ddiv, and ddivu
9482             instructions.
9483
9484             Workaround: For item 1), OS could make sure that the next page
9485             after the divide instruction is also mapped.  For item 2), the
9486             compiler could make sure that the divide instruction is not in
9487             the branch delay slot."
9488
9489        These processors have PRId values of 0x00004220 and 0x00004300 for
9490        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
9491
9492 const char *
9493 mips_output_division (const char *division, rtx *operands)
9494 {
9495   const char *s;
9496
9497   s = division;
9498   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
9499     {
9500       output_asm_insn (s, operands);
9501       s = "nop";
9502     }
9503   if (TARGET_CHECK_ZERO_DIV)
9504     {
9505       if (TARGET_MIPS16)
9506         {
9507           output_asm_insn (s, operands);
9508           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
9509         }
9510       else if (GENERATE_DIVIDE_TRAPS)
9511         {
9512           output_asm_insn (s, operands);
9513           s = "teq\t%2,%.,7";
9514         }
9515       else
9516         {
9517           output_asm_insn ("%(bne\t%2,%.,1f", operands);
9518           output_asm_insn (s, operands);
9519           s = "break\t7%)\n1:";
9520         }
9521     }
9522   return s;
9523 }
9524 \f
9525 /* Return true if INSN is a multiply-add or multiply-subtract
9526    instruction and PREV assigns to the accumulator operand.  */
9527
9528 bool
9529 mips_linked_madd_p (rtx prev, rtx insn)
9530 {
9531   rtx x;
9532
9533   x = single_set (insn);
9534   if (x == 0)
9535     return false;
9536
9537   x = SET_SRC (x);
9538
9539   if (GET_CODE (x) == PLUS
9540       && GET_CODE (XEXP (x, 0)) == MULT
9541       && reg_set_p (XEXP (x, 1), prev))
9542     return true;
9543
9544   if (GET_CODE (x) == MINUS
9545       && GET_CODE (XEXP (x, 1)) == MULT
9546       && reg_set_p (XEXP (x, 0), prev))
9547     return true;
9548
9549   return false;
9550 }
9551
9552 /* Implements a store data bypass check.  We need this because the cprestore
9553    pattern is type store, but defined using an UNSPEC.  This UNSPEC causes the
9554    default routine to abort.  We just return false for that case.  */
9555 /* ??? Should try to give a better result here than assuming false.  */
9556
9557 int
9558 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
9559 {
9560   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
9561     return false;
9562
9563   return ! store_data_bypass_p (out_insn, in_insn);
9564 }
9565 \f
9566 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
9567    dependencies have no cost, except on the 20Kc where output-dependence
9568    is treated like input-dependence.  */
9569
9570 static int
9571 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
9572                   rtx dep ATTRIBUTE_UNUSED, int cost)
9573 {
9574   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
9575       && TUNE_20KC)
9576     return cost;
9577   if (REG_NOTE_KIND (link) != 0)
9578     return 0;
9579   return cost;
9580 }
9581
9582 /* Return the number of instructions that can be issued per cycle.  */
9583
9584 static int
9585 mips_issue_rate (void)
9586 {
9587   switch (mips_tune)
9588     {
9589     case PROCESSOR_74KC:
9590     case PROCESSOR_74KF2_1:
9591     case PROCESSOR_74KF1_1:
9592     case PROCESSOR_74KF3_2:
9593       /* The 74k is not strictly quad-issue cpu, but can be seen as one
9594          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
9595          but in reality only a maximum of 3 insns can be issued as the
9596          floating point load/stores also require a slot in the AGEN pipe.  */
9597      return 4;
9598
9599     case PROCESSOR_20KC:
9600     case PROCESSOR_R4130:
9601     case PROCESSOR_R5400:
9602     case PROCESSOR_R5500:
9603     case PROCESSOR_R7000:
9604     case PROCESSOR_R9000:
9605       return 2;
9606
9607     case PROCESSOR_SB1:
9608     case PROCESSOR_SB1A:
9609       /* This is actually 4, but we get better performance if we claim 3.
9610          This is partly because of unwanted speculative code motion with the
9611          larger number, and partly because in most common cases we can't
9612          reach the theoretical max of 4.  */
9613       return 3;
9614
9615     default:
9616       return 1;
9617     }
9618 }
9619
9620 /* Implements TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
9621    be as wide as the scheduling freedom in the DFA.  */
9622
9623 static int
9624 mips_multipass_dfa_lookahead (void)
9625 {
9626   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
9627   if (TUNE_SB1)
9628     return 4;
9629
9630   return 0;
9631 }
9632 \f
9633 /* Remove the instruction at index LOWER from ready queue READY and
9634    reinsert it in front of the instruction at index HIGHER.  LOWER must
9635    be <= HIGHER.  */
9636
9637 static void
9638 mips_promote_ready (rtx *ready, int lower, int higher)
9639 {
9640   rtx new_head;
9641   int i;
9642
9643   new_head = ready[lower];
9644   for (i = lower; i < higher; i++)
9645     ready[i] = ready[i + 1];
9646   ready[i] = new_head;
9647 }
9648
9649 /* If the priority of the instruction at POS2 in the ready queue READY
9650    is within LIMIT units of that of the instruction at POS1, swap the
9651    instructions if POS2 is not already less than POS1.  */
9652
9653 static void
9654 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
9655 {
9656   if (pos1 < pos2
9657       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
9658     {
9659       rtx temp;
9660       temp = ready[pos1];
9661       ready[pos1] = ready[pos2];
9662       ready[pos2] = temp;
9663     }
9664 }
9665 \f
9666 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
9667    that may clobber hi or lo.  */
9668
9669 static rtx mips_macc_chains_last_hilo;
9670
9671 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
9672    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
9673
9674 static void
9675 mips_macc_chains_record (rtx insn)
9676 {
9677   if (get_attr_may_clobber_hilo (insn))
9678     mips_macc_chains_last_hilo = insn;
9679 }
9680
9681 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
9682    has NREADY elements, looking for a multiply-add or multiply-subtract
9683    instruction that is cumulative with mips_macc_chains_last_hilo.
9684    If there is one, promote it ahead of anything else that might
9685    clobber hi or lo.  */
9686
9687 static void
9688 mips_macc_chains_reorder (rtx *ready, int nready)
9689 {
9690   int i, j;
9691
9692   if (mips_macc_chains_last_hilo != 0)
9693     for (i = nready - 1; i >= 0; i--)
9694       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
9695         {
9696           for (j = nready - 1; j > i; j--)
9697             if (recog_memoized (ready[j]) >= 0
9698                 && get_attr_may_clobber_hilo (ready[j]))
9699               {
9700                 mips_promote_ready (ready, i, j);
9701                 break;
9702               }
9703           break;
9704         }
9705 }
9706 \f
9707 /* The last instruction to be scheduled.  */
9708
9709 static rtx vr4130_last_insn;
9710
9711 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
9712    points to an rtx that is initially an instruction.  Nullify the rtx
9713    if the instruction uses the value of register X.  */
9714
9715 static void
9716 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
9717 {
9718   rtx *insn_ptr = data;
9719   if (REG_P (x)
9720       && *insn_ptr != 0
9721       && reg_referenced_p (x, PATTERN (*insn_ptr)))
9722     *insn_ptr = 0;
9723 }
9724
9725 /* Return true if there is true register dependence between vr4130_last_insn
9726    and INSN.  */
9727
9728 static bool
9729 vr4130_true_reg_dependence_p (rtx insn)
9730 {
9731   note_stores (PATTERN (vr4130_last_insn),
9732                vr4130_true_reg_dependence_p_1, &insn);
9733   return insn == 0;
9734 }
9735
9736 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
9737    the ready queue and that INSN2 is the instruction after it, return
9738    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
9739    in which INSN1 and INSN2 can probably issue in parallel, but for
9740    which (INSN2, INSN1) should be less sensitive to instruction
9741    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
9742
9743 static bool
9744 vr4130_swap_insns_p (rtx insn1, rtx insn2)
9745 {
9746   sd_iterator_def sd_it;
9747   dep_t dep;
9748
9749   /* Check for the following case:
9750
9751      1) there is some other instruction X with an anti dependence on INSN1;
9752      2) X has a higher priority than INSN2; and
9753      3) X is an arithmetic instruction (and thus has no unit restrictions).
9754
9755      If INSN1 is the last instruction blocking X, it would better to
9756      choose (INSN1, X) over (INSN2, INSN1).  */
9757   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
9758     if (DEP_TYPE (dep) == REG_DEP_ANTI
9759         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
9760         && recog_memoized (DEP_CON (dep)) >= 0
9761         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
9762       return false;
9763
9764   if (vr4130_last_insn != 0
9765       && recog_memoized (insn1) >= 0
9766       && recog_memoized (insn2) >= 0)
9767     {
9768       /* See whether INSN1 and INSN2 use different execution units,
9769          or if they are both ALU-type instructions.  If so, they can
9770          probably execute in parallel.  */
9771       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
9772       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
9773       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
9774         {
9775           /* If only one of the instructions has a dependence on
9776              vr4130_last_insn, prefer to schedule the other one first.  */
9777           bool dep1 = vr4130_true_reg_dependence_p (insn1);
9778           bool dep2 = vr4130_true_reg_dependence_p (insn2);
9779           if (dep1 != dep2)
9780             return dep1;
9781
9782           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
9783              is not an ALU-type instruction and if INSN1 uses the same
9784              execution unit.  (Note that if this condition holds, we already
9785              know that INSN2 uses a different execution unit.)  */
9786           if (class1 != VR4130_CLASS_ALU
9787               && recog_memoized (vr4130_last_insn) >= 0
9788               && class1 == get_attr_vr4130_class (vr4130_last_insn))
9789             return true;
9790         }
9791     }
9792   return false;
9793 }
9794
9795 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
9796    queue with at least two instructions.  Swap the first two if
9797    vr4130_swap_insns_p says that it could be worthwhile.  */
9798
9799 static void
9800 vr4130_reorder (rtx *ready, int nready)
9801 {
9802   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
9803     mips_promote_ready (ready, nready - 2, nready - 1);
9804 }
9805 \f
9806 /* Record whether last 74k AGEN instruction was a load or store.  */
9807
9808 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
9809
9810 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
9811    resets to TYPE_UNKNOWN state.  */
9812
9813 static void
9814 mips_74k_agen_init (rtx insn)
9815 {
9816   if (!insn || !NONJUMP_INSN_P (insn))
9817     mips_last_74k_agen_insn = TYPE_UNKNOWN;
9818   else if (USEFUL_INSN_P (insn))
9819     {
9820       enum attr_type type = get_attr_type (insn);
9821       if (type == TYPE_LOAD || type == TYPE_STORE)
9822         mips_last_74k_agen_insn = type;
9823     }
9824 }
9825
9826 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
9827    loads to be grouped together, and multiple stores to be grouped
9828    together.  Swap things around in the ready queue to make this happen.  */
9829
9830 static void
9831 mips_74k_agen_reorder (rtx *ready, int nready)
9832 {
9833   int i;
9834   int store_pos, load_pos;
9835
9836   store_pos = -1;
9837   load_pos = -1;
9838
9839   for (i = nready - 1; i >= 0; i--)
9840     {
9841       rtx insn = ready[i];
9842       if (USEFUL_INSN_P (insn))
9843         switch (get_attr_type (insn))
9844           {
9845           case TYPE_STORE:
9846             if (store_pos == -1)
9847               store_pos = i;
9848             break;
9849
9850           case TYPE_LOAD:
9851             if (load_pos == -1)
9852               load_pos = i;
9853             break;
9854
9855           default:
9856             break;
9857           }
9858     }
9859
9860   if (load_pos == -1 || store_pos == -1)
9861     return;
9862
9863   switch (mips_last_74k_agen_insn)
9864     {
9865     case TYPE_UNKNOWN:
9866       /* Prefer to schedule loads since they have a higher latency.  */
9867     case TYPE_LOAD:
9868       /* Swap loads to the front of the queue.  */
9869       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
9870       break;
9871     case TYPE_STORE:
9872       /* Swap stores to the front of the queue.  */
9873       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
9874       break;
9875     default:
9876       break;
9877     }
9878 }
9879 \f
9880 /* Implement TARGET_SCHED_INIT.  */
9881
9882 static void
9883 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9884                  int max_ready ATTRIBUTE_UNUSED)
9885 {
9886   mips_macc_chains_last_hilo = 0;
9887   vr4130_last_insn = 0;
9888   mips_74k_agen_init (NULL_RTX);
9889 }
9890
9891 /* Implement TARGET_SCHED_REORDER and TARG_SCHED_REORDER2.  */
9892
9893 static int
9894 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9895                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
9896 {
9897   if (!reload_completed
9898       && TUNE_MACC_CHAINS
9899       && *nreadyp > 0)
9900     mips_macc_chains_reorder (ready, *nreadyp);
9901   if (reload_completed
9902       && TUNE_MIPS4130
9903       && !TARGET_VR4130_ALIGN
9904       && *nreadyp > 1)
9905     vr4130_reorder (ready, *nreadyp);
9906   if (TUNE_74K)
9907     mips_74k_agen_reorder (ready, *nreadyp);
9908   return mips_issue_rate ();
9909 }
9910
9911 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
9912
9913 static int
9914 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9915                      rtx insn, int more)
9916 {
9917   if (TUNE_74K)
9918     mips_74k_agen_init (insn);
9919   switch (GET_CODE (PATTERN (insn)))
9920     {
9921     case USE:
9922     case CLOBBER:
9923       /* Don't count USEs and CLOBBERs against the issue rate.  */
9924       break;
9925
9926     default:
9927       more--;
9928       if (!reload_completed && TUNE_MACC_CHAINS)
9929         mips_macc_chains_record (insn);
9930       vr4130_last_insn = insn;
9931       break;
9932     }
9933   return more;
9934 }
9935 \f
9936 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
9937    return the first operand of the associated "pref" or "prefx" insn.  */
9938
9939 rtx
9940 mips_prefetch_cookie (rtx write, rtx locality)
9941 {
9942   /* store_streamed / load_streamed.  */
9943   if (INTVAL (locality) <= 0)
9944     return GEN_INT (INTVAL (write) + 4);
9945
9946   /* store / load.  */
9947   if (INTVAL (locality) <= 2)
9948     return write;
9949
9950   /* store_retained / load_retained.  */
9951   return GEN_INT (INTVAL (write) + 6);
9952 }
9953 \f
9954 /* MIPS builtin function support. */
9955
9956 struct builtin_description
9957 {
9958   /* The code of the main .md file instruction.  See mips_builtin_type
9959      for more information.  */
9960   enum insn_code icode;
9961
9962   /* The floating-point comparison code to use with ICODE, if any.  */
9963   enum mips_fp_condition cond;
9964
9965   /* The name of the builtin function.  */
9966   const char *name;
9967
9968   /* Specifies how the function should be expanded.  */
9969   enum mips_builtin_type builtin_type;
9970
9971   /* The function's prototype.  */
9972   enum mips_function_type function_type;
9973
9974   /* The target flags required for this function.  */
9975   int target_flags;
9976 };
9977
9978 /* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_mips_<INSN>.
9979    FUNCTION_TYPE and TARGET_FLAGS are builtin_description fields.  */
9980 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)               \
9981   { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
9982     MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
9983
9984 /* Define __builtin_mips_<INSN>_<COND>_{s,d}, both of which require
9985    TARGET_FLAGS.  */
9986 #define CMP_SCALAR_BUILTINS(INSN, COND, TARGET_FLAGS)                   \
9987   { CODE_FOR_mips_ ## INSN ## _cond_s, MIPS_FP_COND_ ## COND,           \
9988     "__builtin_mips_" #INSN "_" #COND "_s",                             \
9989     MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, TARGET_FLAGS },      \
9990   { CODE_FOR_mips_ ## INSN ## _cond_d, MIPS_FP_COND_ ## COND,           \
9991     "__builtin_mips_" #INSN "_" #COND "_d",                             \
9992     MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, TARGET_FLAGS }
9993
9994 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
9995    The lower and upper forms require TARGET_FLAGS while the any and all
9996    forms require MASK_MIPS3D.  */
9997 #define CMP_PS_BUILTINS(INSN, COND, TARGET_FLAGS)                       \
9998   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9999     "__builtin_mips_any_" #INSN "_" #COND "_ps",                        \
10000     MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
10001   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
10002     "__builtin_mips_all_" #INSN "_" #COND "_ps",                        \
10003     MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
10004   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
10005     "__builtin_mips_lower_" #INSN "_" #COND "_ps",                      \
10006     MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS },   \
10007   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
10008     "__builtin_mips_upper_" #INSN "_" #COND "_ps",                      \
10009     MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS }
10010
10011 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
10012    require MASK_MIPS3D.  */
10013 #define CMP_4S_BUILTINS(INSN, COND)                                     \
10014   { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
10015     "__builtin_mips_any_" #INSN "_" #COND "_4s",                        \
10016     MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
10017     MASK_MIPS3D },                                                      \
10018   { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
10019     "__builtin_mips_all_" #INSN "_" #COND "_4s",                        \
10020     MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
10021     MASK_MIPS3D }
10022
10023 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
10024    instruction requires TARGET_FLAGS.  */
10025 #define MOVTF_BUILTINS(INSN, COND, TARGET_FLAGS)                        \
10026   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
10027     "__builtin_mips_movt_" #INSN "_" #COND "_ps",                       \
10028     MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
10029     TARGET_FLAGS },                                                     \
10030   { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
10031     "__builtin_mips_movf_" #INSN "_" #COND "_ps",                       \
10032     MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
10033     TARGET_FLAGS }
10034
10035 /* Define all the builtins related to c.cond.fmt condition COND.  */
10036 #define CMP_BUILTINS(COND)                                              \
10037   MOVTF_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                   \
10038   MOVTF_BUILTINS (cabs, COND, MASK_MIPS3D),                             \
10039   CMP_SCALAR_BUILTINS (cabs, COND, MASK_MIPS3D),                        \
10040   CMP_PS_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                  \
10041   CMP_PS_BUILTINS (cabs, COND, MASK_MIPS3D),                            \
10042   CMP_4S_BUILTINS (c, COND),                                            \
10043   CMP_4S_BUILTINS (cabs, COND)
10044
10045 static const struct builtin_description mips_bdesc[] =
10046 {
10047   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10048   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10049   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10050   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10051   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, MASK_PAIRED_SINGLE_FLOAT),
10052   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10053   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10054   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10055
10056   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
10057                   MASK_PAIRED_SINGLE_FLOAT),
10058   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10059   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10060   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10061   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10062
10063   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
10064   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
10065   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10066   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
10067   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
10068   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10069
10070   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
10071   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
10072   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10073   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
10074   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
10075   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10076
10077   MIPS_FP_CONDITIONS (CMP_BUILTINS)
10078 };
10079
10080 /* Builtin functions for the SB-1 processor.  */
10081
10082 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
10083
10084 static const struct builtin_description sb1_bdesc[] =
10085 {
10086   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT)
10087 };
10088
10089 /* Builtin functions for DSP ASE.  */
10090
10091 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
10092 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
10093 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
10094 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
10095 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
10096
10097 /* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction
10098    CODE_FOR_mips_<INSN>.  FUNCTION_TYPE and TARGET_FLAGS are
10099    builtin_description fields.  */
10100 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)     \
10101   { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
10102     MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS }
10103
10104 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
10105    branch instruction.  TARGET_FLAGS is a builtin_description field.  */
10106 #define BPOSGE_BUILTIN(VALUE, TARGET_FLAGS)                             \
10107   { CODE_FOR_mips_bposge, 0, "__builtin_mips_bposge" #VALUE,            \
10108     MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, TARGET_FLAGS }
10109
10110 static const struct builtin_description dsp_bdesc[] =
10111 {
10112   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10113   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10114   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10115   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10116   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10117   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10118   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10119   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10120   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10121   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10122   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10123   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10124   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10125   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, MASK_DSP),
10126   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, MASK_DSP),
10127   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, MASK_DSP),
10128   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10129   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10130   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10131   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10132   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10133   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10134   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10135   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10136   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10137   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10138   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10139   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10140   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10141   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10142   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10143   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10144   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10145   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10146   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10147   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10148   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10149   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10150   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10151   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10152   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10153   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10154   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10155   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, MASK_DSP),
10156   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10157   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, MASK_DSP),
10158   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, MASK_DSP),
10159   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10160   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10161   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10162   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10163   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10164   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10165   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10166   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10167   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10168   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10169   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10170   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10171   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, MASK_DSP),
10172   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, MASK_DSP),
10173   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10174   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10175   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, MASK_DSP),
10176   BPOSGE_BUILTIN (32, MASK_DSP),
10177
10178   /* The following are for the MIPS DSP ASE REV 2.  */
10179   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, MASK_DSPR2),
10180   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10181   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10182   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10183   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10184   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10185   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10186   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10187   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10188   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10189   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10190   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10191   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10192   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10193   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10194   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10195   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
10196   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
10197   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
10198   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
10199   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
10200   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSPR2),
10201   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10202   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10203   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10204   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
10205   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10206   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10207   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10208   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10209   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10210   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
10211   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
10212   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2)
10213 };
10214
10215 static const struct builtin_description dsp_32only_bdesc[] =
10216 {
10217   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10218   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10219   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10220   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10221   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10222   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10223   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10224   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10225   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10226   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10227   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10228   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10229   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10230   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10231   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10232   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10233   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10234   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10235   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10236   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10237   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10238
10239   /* The following are for the MIPS DSP ASE REV 2.  */
10240   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10241   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10242   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
10243   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
10244   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
10245   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
10246   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10247   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, MASK_DSPR2),
10248   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, MASK_DSPR2),
10249   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10250   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10251   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10252   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10253   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
10254   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2)
10255 };
10256
10257 /* This helps provide a mapping from builtin function codes to bdesc
10258    arrays.  */
10259
10260 struct bdesc_map
10261 {
10262   /* The builtin function table that this entry describes.  */
10263   const struct builtin_description *bdesc;
10264
10265   /* The number of entries in the builtin function table.  */
10266   unsigned int size;
10267
10268   /* The target processor that supports these builtin functions.
10269      PROCESSOR_MAX means we enable them for all processors.  */
10270   enum processor_type proc;
10271
10272   /* If the target has these flags, this builtin function table
10273      will not be supported.  */
10274   int unsupported_target_flags;
10275 };
10276
10277 static const struct bdesc_map bdesc_arrays[] =
10278 {
10279   { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX, 0 },
10280   { sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1, 0 },
10281   { dsp_bdesc, ARRAY_SIZE (dsp_bdesc), PROCESSOR_MAX, 0 },
10282   { dsp_32only_bdesc, ARRAY_SIZE (dsp_32only_bdesc), PROCESSOR_MAX,
10283     MASK_64BIT }
10284 };
10285
10286 /* MODE is a vector mode whose elements have type TYPE.  Return the type
10287    of the vector itself.  */
10288
10289 static tree
10290 mips_builtin_vector_type (tree type, enum machine_mode mode)
10291 {
10292   static tree types[(int) MAX_MACHINE_MODE];
10293
10294   if (types[(int) mode] == NULL_TREE)
10295     types[(int) mode] = build_vector_type_for_mode (type, mode);
10296   return types[(int) mode];
10297 }
10298
10299 /* Source-level argument types.  */
10300 #define MIPS_ATYPE_VOID void_type_node
10301 #define MIPS_ATYPE_INT integer_type_node
10302 #define MIPS_ATYPE_POINTER ptr_type_node
10303
10304 /* Standard mode-based argument types.  */
10305 #define MIPS_ATYPE_SI intSI_type_node
10306 #define MIPS_ATYPE_USI unsigned_intSI_type_node
10307 #define MIPS_ATYPE_DI intDI_type_node
10308 #define MIPS_ATYPE_SF float_type_node
10309 #define MIPS_ATYPE_DF double_type_node
10310
10311 /* Vector argument types.  */
10312 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
10313 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
10314 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
10315
10316 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
10317    their associated MIPS_ATYPEs.  */
10318 #define MIPS_FTYPE_ATYPES1(A, B) \
10319   MIPS_ATYPE_##A, MIPS_ATYPE_##B
10320
10321 #define MIPS_FTYPE_ATYPES2(A, B, C) \
10322   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
10323
10324 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
10325   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
10326
10327 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
10328   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
10329   MIPS_ATYPE_##E
10330
10331 /* Return the function type associated with function prototype TYPE.  */
10332
10333 static tree
10334 mips_build_function_type (enum mips_function_type type)
10335 {
10336   static tree types[(int) MIPS_MAX_FTYPE_MAX];
10337
10338   if (types[(int) type] == NULL_TREE)
10339     switch (type)
10340       {
10341 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
10342   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
10343     types[(int) type]                                                   \
10344       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
10345                                   NULL_TREE);                           \
10346     break;
10347 #include "config/mips/mips-ftypes.def"
10348 #undef DEF_MIPS_FTYPE
10349       default:
10350         gcc_unreachable ();
10351       }
10352
10353   return types[(int) type];
10354 }
10355
10356 /* Init builtin functions.  This is called from TARGET_INIT_BUILTIN.  */
10357
10358 static void
10359 mips_init_builtins (void)
10360 {
10361   const struct builtin_description *d;
10362   const struct bdesc_map *m;
10363   unsigned int offset;
10364
10365   /* Iterate through all of the bdesc arrays, initializing all of the
10366      builtin functions.  */
10367
10368   offset = 0;
10369   for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
10370     {
10371       if ((m->proc == PROCESSOR_MAX || (m->proc == mips_arch))
10372           && (m->unsupported_target_flags & target_flags) == 0)
10373         for (d = m->bdesc; d < &m->bdesc[m->size]; d++)
10374           if ((d->target_flags & target_flags) == d->target_flags)
10375             add_builtin_function (d->name,
10376                                   mips_build_function_type (d->function_type),
10377                                   d - m->bdesc + offset,
10378                                   BUILT_IN_MD, NULL, NULL);
10379       offset += m->size;
10380     }
10381 }
10382
10383 /* Take the argument ARGNUM of the arglist of EXP and convert it into a form
10384    suitable for input operand OP of instruction ICODE.  Return the value.  */
10385
10386 static rtx
10387 mips_prepare_builtin_arg (enum insn_code icode,
10388                           unsigned int op, tree exp, unsigned int argnum)
10389 {
10390   rtx value;
10391   enum machine_mode mode;
10392
10393   value = expand_normal (CALL_EXPR_ARG (exp, argnum));
10394   mode = insn_data[icode].operand[op].mode;
10395   if (!insn_data[icode].operand[op].predicate (value, mode))
10396     {
10397       value = copy_to_mode_reg (mode, value);
10398       /* Check the predicate again.  */
10399       if (!insn_data[icode].operand[op].predicate (value, mode))
10400         {
10401           error ("invalid argument to builtin function");
10402           return const0_rtx;
10403         }
10404     }
10405
10406   return value;
10407 }
10408
10409 /* Return an rtx suitable for output operand OP of instruction ICODE.
10410    If TARGET is non-null, try to use it where possible.  */
10411
10412 static rtx
10413 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
10414 {
10415   enum machine_mode mode;
10416
10417   mode = insn_data[icode].operand[op].mode;
10418   if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
10419     target = gen_reg_rtx (mode);
10420
10421   return target;
10422 }
10423
10424 /* Expand a MIPS_BUILTIN_DIRECT function.  ICODE is the code of the
10425    .md pattern and CALL is the function expr with arguments.  TARGET,
10426    if nonnull, suggests a good place to put the result.
10427    HAS_TARGET indicates the function must return something.  */
10428
10429 static rtx
10430 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
10431                             bool has_target)
10432 {
10433   rtx ops[MAX_RECOG_OPERANDS];
10434   int i = 0;
10435   int j = 0;
10436
10437   if (has_target)
10438     {
10439       /* We save target to ops[0].  */
10440       ops[0] = mips_prepare_builtin_target (icode, 0, target);
10441       i = 1;
10442     }
10443
10444   /* We need to test if the arglist is not zero.  Some instructions have extra
10445      clobber registers.  */
10446   for (; i < insn_data[icode].n_operands && i <= call_expr_nargs (exp); i++, j++)
10447     ops[i] = mips_prepare_builtin_arg (icode, i, exp, j);
10448
10449   switch (i)
10450     {
10451     case 2:
10452       emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
10453       break;
10454
10455     case 3:
10456       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
10457       break;
10458
10459     case 4:
10460       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
10461       break;
10462
10463     default:
10464       gcc_unreachable ();
10465     }
10466   return target;
10467 }
10468
10469 /* Expand a __builtin_mips_movt_*_ps() or __builtin_mips_movf_*_ps()
10470    function (TYPE says which).  EXP is the tree for the function
10471    function, ICODE is the instruction that should be used to compare
10472    the first two arguments, and COND is the condition it should test.
10473    TARGET, if nonnull, suggests a good place to put the result.  */
10474
10475 static rtx
10476 mips_expand_builtin_movtf (enum mips_builtin_type type,
10477                            enum insn_code icode, enum mips_fp_condition cond,
10478                            rtx target, tree exp)
10479 {
10480   rtx cmp_result, op0, op1;
10481
10482   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10483   op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
10484   op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
10485   emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
10486
10487   icode = CODE_FOR_mips_cond_move_tf_ps;
10488   target = mips_prepare_builtin_target (icode, 0, target);
10489   if (type == MIPS_BUILTIN_MOVT)
10490     {
10491       op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
10492       op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
10493     }
10494   else
10495     {
10496       op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
10497       op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
10498     }
10499   emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
10500   return target;
10501 }
10502
10503 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
10504    into TARGET otherwise.  Return TARGET.  */
10505
10506 static rtx
10507 mips_builtin_branch_and_move (rtx condition, rtx target,
10508                               rtx value_if_true, rtx value_if_false)
10509 {
10510   rtx true_label, done_label;
10511
10512   true_label = gen_label_rtx ();
10513   done_label = gen_label_rtx ();
10514
10515   /* First assume that CONDITION is false.  */
10516   mips_emit_move (target, value_if_false);
10517
10518   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
10519   emit_jump_insn (gen_condjump (condition, true_label));
10520   emit_jump_insn (gen_jump (done_label));
10521   emit_barrier ();
10522
10523   /* Fix TARGET if CONDITION is true.  */
10524   emit_label (true_label);
10525   mips_emit_move (target, value_if_true);
10526
10527   emit_label (done_label);
10528   return target;
10529 }
10530
10531 /* Expand a comparison builtin of type BUILTIN_TYPE.  ICODE is the code
10532    of the comparison instruction and COND is the condition it should test.
10533    EXP is the function call and arguments and TARGET, if nonnull,
10534    suggests a good place to put the boolean result.  */
10535
10536 static rtx
10537 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
10538                              enum insn_code icode, enum mips_fp_condition cond,
10539                              rtx target, tree exp)
10540 {
10541   rtx offset, condition, cmp_result, ops[MAX_RECOG_OPERANDS];
10542   int i;
10543   int j = 0;
10544
10545   if (target == 0 || GET_MODE (target) != SImode)
10546     target = gen_reg_rtx (SImode);
10547
10548   /* Prepare the operands to the comparison.  */
10549   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10550   for (i = 1; i < insn_data[icode].n_operands - 1; i++, j++)
10551     ops[i] = mips_prepare_builtin_arg (icode, i, exp, j);
10552
10553   switch (insn_data[icode].n_operands)
10554     {
10555     case 4:
10556       emit_insn (GEN_FCN (icode) (cmp_result, ops[1], ops[2], GEN_INT (cond)));
10557       break;
10558
10559     case 6:
10560       emit_insn (GEN_FCN (icode) (cmp_result, ops[1], ops[2],
10561                                   ops[3], ops[4], GEN_INT (cond)));
10562       break;
10563
10564     default:
10565       gcc_unreachable ();
10566     }
10567
10568   /* If the comparison sets more than one register, we define the result
10569      to be 0 if all registers are false and -1 if all registers are true.
10570      The value of the complete result is indeterminate otherwise.  */
10571   switch (builtin_type)
10572     {
10573     case MIPS_BUILTIN_CMP_ALL:
10574       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
10575       return mips_builtin_branch_and_move (condition, target,
10576                                            const0_rtx, const1_rtx);
10577
10578     case MIPS_BUILTIN_CMP_UPPER:
10579     case MIPS_BUILTIN_CMP_LOWER:
10580       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
10581       condition = gen_single_cc (cmp_result, offset);
10582       return mips_builtin_branch_and_move (condition, target,
10583                                            const1_rtx, const0_rtx);
10584
10585     default:
10586       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
10587       return mips_builtin_branch_and_move (condition, target,
10588                                            const1_rtx, const0_rtx);
10589     }
10590 }
10591
10592 /* Expand a bposge builtin of type BUILTIN_TYPE.  TARGET, if nonnull,
10593    suggests a good place to put the boolean result.  */
10594
10595 static rtx
10596 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
10597 {
10598   rtx condition, cmp_result;
10599   int cmp_value;
10600
10601   if (target == 0 || GET_MODE (target) != SImode)
10602     target = gen_reg_rtx (SImode);
10603
10604   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
10605
10606   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
10607     cmp_value = 32;
10608   else
10609     gcc_assert (0);
10610
10611   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
10612   return mips_builtin_branch_and_move (condition, target,
10613                                        const1_rtx, const0_rtx);
10614 }
10615
10616 /* EXP is a CALL_EXPR that calls the function described by BDESC.
10617    Expand the call and return an rtx for its return value.
10618    TARGET, if nonnull, suggests a good place to put this value.  */
10619
10620 static rtx
10621 mips_expand_builtin_1 (const struct builtin_description *bdesc,
10622                        tree exp, rtx target)
10623 {
10624   switch (bdesc->builtin_type)
10625     {
10626     case MIPS_BUILTIN_DIRECT:
10627       return mips_expand_builtin_direct (bdesc->icode, target, exp, true);
10628
10629     case MIPS_BUILTIN_DIRECT_NO_TARGET:
10630       return mips_expand_builtin_direct (bdesc->icode, target, exp, false);
10631
10632     case MIPS_BUILTIN_MOVT:
10633     case MIPS_BUILTIN_MOVF:
10634       return mips_expand_builtin_movtf (bdesc->builtin_type, bdesc->icode,
10635                                         bdesc->cond, target, exp);
10636
10637     case MIPS_BUILTIN_CMP_ANY:
10638     case MIPS_BUILTIN_CMP_ALL:
10639     case MIPS_BUILTIN_CMP_UPPER:
10640     case MIPS_BUILTIN_CMP_LOWER:
10641     case MIPS_BUILTIN_CMP_SINGLE:
10642       return mips_expand_builtin_compare (bdesc->builtin_type, bdesc->icode,
10643                                           bdesc->cond, target, exp);
10644
10645     case MIPS_BUILTIN_BPOSGE32:
10646       return mips_expand_builtin_bposge (bdesc->builtin_type, target);
10647     }
10648   gcc_unreachable ();
10649 }
10650
10651 /* Expand builtin functions.  This is called from TARGET_EXPAND_BUILTIN.  */
10652
10653 static rtx
10654 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
10655                      enum machine_mode mode ATTRIBUTE_UNUSED,
10656                      int ignore ATTRIBUTE_UNUSED)
10657 {
10658   tree fndecl;
10659   unsigned int fcode;
10660   const struct bdesc_map *m;
10661
10662   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10663   fcode = DECL_FUNCTION_CODE (fndecl);
10664
10665   if (TARGET_MIPS16)
10666     {
10667       error ("built-in function %qs not supported for MIPS16",
10668              IDENTIFIER_POINTER (DECL_NAME (fndecl)));
10669       return const0_rtx;
10670     }
10671
10672   for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
10673     {
10674       if (fcode < m->size)
10675         return mips_expand_builtin_1 (m->bdesc + fcode, exp, target);
10676       fcode -= m->size;
10677     }
10678   gcc_unreachable ();
10679 }
10680 \f
10681 /* An entry in the mips16 constant pool.  VALUE is the pool constant,
10682    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
10683
10684 struct mips16_constant {
10685   struct mips16_constant *next;
10686   rtx value;
10687   rtx label;
10688   enum machine_mode mode;
10689 };
10690
10691 /* Information about an incomplete mips16 constant pool.  FIRST is the
10692    first constant, HIGHEST_ADDRESS is the highest address that the first
10693    byte of the pool can have, and INSN_ADDRESS is the current instruction
10694    address.  */
10695
10696 struct mips16_constant_pool {
10697   struct mips16_constant *first;
10698   int highest_address;
10699   int insn_address;
10700 };
10701
10702 /* Add constant VALUE to POOL and return its label.  MODE is the
10703    value's mode (used for CONST_INTs, etc.).  */
10704
10705 static rtx
10706 add_constant (struct mips16_constant_pool *pool,
10707               rtx value, enum machine_mode mode)
10708 {
10709   struct mips16_constant **p, *c;
10710   bool first_of_size_p;
10711
10712   /* See whether the constant is already in the pool.  If so, return the
10713      existing label, otherwise leave P pointing to the place where the
10714      constant should be added.
10715
10716      Keep the pool sorted in increasing order of mode size so that we can
10717      reduce the number of alignments needed.  */
10718   first_of_size_p = true;
10719   for (p = &pool->first; *p != 0; p = &(*p)->next)
10720     {
10721       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
10722         return (*p)->label;
10723       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
10724         break;
10725       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
10726         first_of_size_p = false;
10727     }
10728
10729   /* In the worst case, the constant needed by the earliest instruction
10730      will end up at the end of the pool.  The entire pool must then be
10731      accessible from that instruction.
10732
10733      When adding the first constant, set the pool's highest address to
10734      the address of the first out-of-range byte.  Adjust this address
10735      downwards each time a new constant is added.  */
10736   if (pool->first == 0)
10737     /* For pc-relative lw, addiu and daddiu instructions, the base PC value
10738        is the address of the instruction with the lowest two bits clear.
10739        The base PC value for ld has the lowest three bits clear.  Assume
10740        the worst case here.  */
10741     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
10742   pool->highest_address -= GET_MODE_SIZE (mode);
10743   if (first_of_size_p)
10744     /* Take into account the worst possible padding due to alignment.  */
10745     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
10746
10747   /* Create a new entry.  */
10748   c = (struct mips16_constant *) xmalloc (sizeof *c);
10749   c->value = value;
10750   c->mode = mode;
10751   c->label = gen_label_rtx ();
10752   c->next = *p;
10753   *p = c;
10754
10755   return c->label;
10756 }
10757
10758 /* Output constant VALUE after instruction INSN and return the last
10759    instruction emitted.  MODE is the mode of the constant.  */
10760
10761 static rtx
10762 dump_constants_1 (enum machine_mode mode, rtx value, rtx insn)
10763 {
10764   if (SCALAR_INT_MODE_P (mode)
10765       || ALL_SCALAR_FRACT_MODE_P (mode)
10766       || ALL_SCALAR_ACCUM_MODE_P (mode))
10767     {
10768       rtx size = GEN_INT (GET_MODE_SIZE (mode));
10769       return emit_insn_after (gen_consttable_int (value, size), insn);
10770     }
10771
10772   if (SCALAR_FLOAT_MODE_P (mode))
10773     return emit_insn_after (gen_consttable_float (value), insn);
10774
10775   if (VECTOR_MODE_P (mode))
10776     {
10777       int i;
10778
10779       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
10780         insn = dump_constants_1 (GET_MODE_INNER (mode),
10781                                  CONST_VECTOR_ELT (value, i), insn);
10782       return insn;
10783     }
10784
10785   gcc_unreachable ();
10786 }
10787
10788
10789 /* Dump out the constants in CONSTANTS after INSN.  */
10790
10791 static void
10792 dump_constants (struct mips16_constant *constants, rtx insn)
10793 {
10794   struct mips16_constant *c, *next;
10795   int align;
10796
10797   align = 0;
10798   for (c = constants; c != NULL; c = next)
10799     {
10800       /* If necessary, increase the alignment of PC.  */
10801       if (align < GET_MODE_SIZE (c->mode))
10802         {
10803           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
10804           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
10805         }
10806       align = GET_MODE_SIZE (c->mode);
10807
10808       insn = emit_label_after (c->label, insn);
10809       insn = dump_constants_1 (c->mode, c->value, insn);
10810
10811       next = c->next;
10812       free (c);
10813     }
10814
10815   emit_barrier_after (insn);
10816 }
10817
10818 /* Return the length of instruction INSN.  */
10819
10820 static int
10821 mips16_insn_length (rtx insn)
10822 {
10823   if (JUMP_P (insn))
10824     {
10825       rtx body = PATTERN (insn);
10826       if (GET_CODE (body) == ADDR_VEC)
10827         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
10828       if (GET_CODE (body) == ADDR_DIFF_VEC)
10829         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
10830     }
10831   return get_attr_length (insn);
10832 }
10833
10834 /* If *X is a symbolic constant that refers to the constant pool, add
10835    the constant to POOL and rewrite *X to use the constant's label.  */
10836
10837 static void
10838 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
10839 {
10840   rtx base, offset, label;
10841
10842   split_const (*x, &base, &offset);
10843   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
10844     {
10845       label = add_constant (pool, get_pool_constant (base),
10846                             get_pool_mode (base));
10847       base = gen_rtx_LABEL_REF (Pmode, label);
10848       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
10849     }
10850 }
10851
10852 /* This structure is used to communicate with mips16_rewrite_pool_refs.
10853    INSN is the instruction we're rewriting and POOL points to the current
10854    constant pool.  */
10855 struct mips16_rewrite_pool_refs_info {
10856   rtx insn;
10857   struct mips16_constant_pool *pool;
10858 };
10859
10860 /* Rewrite *X so that constant pool references refer to the constant's
10861    label instead.  DATA points to a mips16_rewrite_pool_refs_info
10862    structure.  */
10863
10864 static int
10865 mips16_rewrite_pool_refs (rtx *x, void *data)
10866 {
10867   struct mips16_rewrite_pool_refs_info *info = data;
10868
10869   if (force_to_mem_operand (*x, Pmode))
10870     {
10871       rtx mem = force_const_mem (GET_MODE (*x), *x);
10872       validate_change (info->insn, x, mem, false);
10873     }
10874
10875   if (MEM_P (*x))
10876     {
10877       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
10878       return -1;
10879     }
10880
10881   if (TARGET_MIPS16_TEXT_LOADS)
10882     mips16_rewrite_pool_constant (info->pool, x);
10883
10884   return GET_CODE (*x) == CONST ? -1 : 0;
10885 }
10886
10887 /* Build MIPS16 constant pools.  */
10888
10889 static void
10890 mips16_lay_out_constants (void)
10891 {
10892   struct mips16_constant_pool pool;
10893   struct mips16_rewrite_pool_refs_info info;
10894   rtx insn, barrier;
10895
10896   if (!TARGET_MIPS16_PCREL_LOADS)
10897     return;
10898
10899   barrier = 0;
10900   memset (&pool, 0, sizeof (pool));
10901   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
10902     {
10903       /* Rewrite constant pool references in INSN.  */
10904       if (INSN_P (insn))
10905         {
10906           info.insn = insn;
10907           info.pool = &pool;
10908           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
10909         }
10910
10911       pool.insn_address += mips16_insn_length (insn);
10912
10913       if (pool.first != NULL)
10914         {
10915           /* If there are no natural barriers between the first user of
10916              the pool and the highest acceptable address, we'll need to
10917              create a new instruction to jump around the constant pool.
10918              In the worst case, this instruction will be 4 bytes long.
10919
10920              If it's too late to do this transformation after INSN,
10921              do it immediately before INSN.  */
10922           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
10923             {
10924               rtx label, jump;
10925
10926               label = gen_label_rtx ();
10927
10928               jump = emit_jump_insn_before (gen_jump (label), insn);
10929               JUMP_LABEL (jump) = label;
10930               LABEL_NUSES (label) = 1;
10931               barrier = emit_barrier_after (jump);
10932
10933               emit_label_after (label, barrier);
10934               pool.insn_address += 4;
10935             }
10936
10937           /* See whether the constant pool is now out of range of the first
10938              user.  If so, output the constants after the previous barrier.
10939              Note that any instructions between BARRIER and INSN (inclusive)
10940              will use negative offsets to refer to the pool.  */
10941           if (pool.insn_address > pool.highest_address)
10942             {
10943               dump_constants (pool.first, barrier);
10944               pool.first = NULL;
10945               barrier = 0;
10946             }
10947           else if (BARRIER_P (insn))
10948             barrier = insn;
10949         }
10950     }
10951   dump_constants (pool.first, get_last_insn ());
10952 }
10953 \f
10954 /* A temporary variable used by for_each_rtx callbacks, etc.  */
10955 static rtx mips_sim_insn;
10956
10957 /* A structure representing the state of the processor pipeline.
10958    Used by the mips_sim_* family of functions.  */
10959 struct mips_sim {
10960   /* The maximum number of instructions that can be issued in a cycle.
10961      (Caches mips_issue_rate.)  */
10962   unsigned int issue_rate;
10963
10964   /* The current simulation time.  */
10965   unsigned int time;
10966
10967   /* How many more instructions can be issued in the current cycle.  */
10968   unsigned int insns_left;
10969
10970   /* LAST_SET[X].INSN is the last instruction to set register X.
10971      LAST_SET[X].TIME is the time at which that instruction was issued.
10972      INSN is null if no instruction has yet set register X.  */
10973   struct {
10974     rtx insn;
10975     unsigned int time;
10976   } last_set[FIRST_PSEUDO_REGISTER];
10977
10978   /* The pipeline's current DFA state.  */
10979   state_t dfa_state;
10980 };
10981
10982 /* Reset STATE to the initial simulation state.  */
10983
10984 static void
10985 mips_sim_reset (struct mips_sim *state)
10986 {
10987   state->time = 0;
10988   state->insns_left = state->issue_rate;
10989   memset (&state->last_set, 0, sizeof (state->last_set));
10990   state_reset (state->dfa_state);
10991 }
10992
10993 /* Initialize STATE before its first use.  DFA_STATE points to an
10994    allocated but uninitialized DFA state.  */
10995
10996 static void
10997 mips_sim_init (struct mips_sim *state, state_t dfa_state)
10998 {
10999   state->issue_rate = mips_issue_rate ();
11000   state->dfa_state = dfa_state;
11001   mips_sim_reset (state);
11002 }
11003
11004 /* Advance STATE by one clock cycle.  */
11005
11006 static void
11007 mips_sim_next_cycle (struct mips_sim *state)
11008 {
11009   state->time++;
11010   state->insns_left = state->issue_rate;
11011   state_transition (state->dfa_state, 0);
11012 }
11013
11014 /* Advance simulation state STATE until instruction INSN can read
11015    register REG.  */
11016
11017 static void
11018 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
11019 {
11020   unsigned int i;
11021
11022   for (i = 0; i < HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); i++)
11023     if (state->last_set[REGNO (reg) + i].insn != 0)
11024       {
11025         unsigned int t;
11026
11027         t = state->last_set[REGNO (reg) + i].time;
11028         t += insn_latency (state->last_set[REGNO (reg) + i].insn, insn);
11029         while (state->time < t)
11030           mips_sim_next_cycle (state);
11031     }
11032 }
11033
11034 /* A for_each_rtx callback.  If *X is a register, advance simulation state
11035    DATA until mips_sim_insn can read the register's value.  */
11036
11037 static int
11038 mips_sim_wait_regs_2 (rtx *x, void *data)
11039 {
11040   if (REG_P (*x))
11041     mips_sim_wait_reg (data, mips_sim_insn, *x);
11042   return 0;
11043 }
11044
11045 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
11046
11047 static void
11048 mips_sim_wait_regs_1 (rtx *x, void *data)
11049 {
11050   for_each_rtx (x, mips_sim_wait_regs_2, data);
11051 }
11052
11053 /* Advance simulation state STATE until all of INSN's register
11054    dependencies are satisfied.  */
11055
11056 static void
11057 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
11058 {
11059   mips_sim_insn = insn;
11060   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
11061 }
11062
11063 /* Advance simulation state STATE until the units required by
11064    instruction INSN are available.  */
11065
11066 static void
11067 mips_sim_wait_units (struct mips_sim *state, rtx insn)
11068 {
11069   state_t tmp_state;
11070
11071   tmp_state = alloca (state_size ());
11072   while (state->insns_left == 0
11073          || (memcpy (tmp_state, state->dfa_state, state_size ()),
11074              state_transition (tmp_state, insn) >= 0))
11075     mips_sim_next_cycle (state);
11076 }
11077
11078 /* Advance simulation state STATE until INSN is ready to issue.  */
11079
11080 static void
11081 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
11082 {
11083   mips_sim_wait_regs (state, insn);
11084   mips_sim_wait_units (state, insn);
11085 }
11086
11087 /* mips_sim_insn has just set X.  Update the LAST_SET array
11088    in simulation state DATA.  */
11089
11090 static void
11091 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
11092 {
11093   struct mips_sim *state;
11094   unsigned int i;
11095
11096   state = data;
11097   if (REG_P (x))
11098     for (i = 0; i < HARD_REGNO_NREGS (REGNO (x), GET_MODE (x)); i++)
11099       {
11100         state->last_set[REGNO (x) + i].insn = mips_sim_insn;
11101         state->last_set[REGNO (x) + i].time = state->time;
11102       }
11103 }
11104
11105 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
11106    can issue immediately (i.e., that mips_sim_wait_insn has already
11107    been called).  */
11108
11109 static void
11110 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
11111 {
11112   state_transition (state->dfa_state, insn);
11113   state->insns_left--;
11114
11115   mips_sim_insn = insn;
11116   note_stores (PATTERN (insn), mips_sim_record_set, state);
11117 }
11118
11119 /* Simulate issuing a NOP in state STATE.  */
11120
11121 static void
11122 mips_sim_issue_nop (struct mips_sim *state)
11123 {
11124   if (state->insns_left == 0)
11125     mips_sim_next_cycle (state);
11126   state->insns_left--;
11127 }
11128
11129 /* Update simulation state STATE so that it's ready to accept the instruction
11130    after INSN.  INSN should be part of the main rtl chain, not a member of a
11131    SEQUENCE.  */
11132
11133 static void
11134 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
11135 {
11136   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
11137   if (JUMP_P (insn))
11138     mips_sim_issue_nop (state);
11139
11140   switch (GET_CODE (SEQ_BEGIN (insn)))
11141     {
11142     case CODE_LABEL:
11143     case CALL_INSN:
11144       /* We can't predict the processor state after a call or label.  */
11145       mips_sim_reset (state);
11146       break;
11147
11148     case JUMP_INSN:
11149       /* The delay slots of branch likely instructions are only executed
11150          when the branch is taken.  Therefore, if the caller has simulated
11151          the delay slot instruction, STATE does not really reflect the state
11152          of the pipeline for the instruction after the delay slot.  Also,
11153          branch likely instructions tend to incur a penalty when not taken,
11154          so there will probably be an extra delay between the branch and
11155          the instruction after the delay slot.  */
11156       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
11157         mips_sim_reset (state);
11158       break;
11159
11160     default:
11161       break;
11162     }
11163 }
11164 \f
11165 /* The VR4130 pipeline issues aligned pairs of instructions together,
11166    but it stalls the second instruction if it depends on the first.
11167    In order to cut down the amount of logic required, this dependence
11168    check is not based on a full instruction decode.  Instead, any non-SPECIAL
11169    instruction is assumed to modify the register specified by bits 20-16
11170    (which is usually the "rt" field).
11171
11172    In beq, beql, bne and bnel instructions, the rt field is actually an
11173    input, so we can end up with a false dependence between the branch
11174    and its delay slot.  If this situation occurs in instruction INSN,
11175    try to avoid it by swapping rs and rt.  */
11176
11177 static void
11178 vr4130_avoid_branch_rt_conflict (rtx insn)
11179 {
11180   rtx first, second;
11181
11182   first = SEQ_BEGIN (insn);
11183   second = SEQ_END (insn);
11184   if (JUMP_P (first)
11185       && NONJUMP_INSN_P (second)
11186       && GET_CODE (PATTERN (first)) == SET
11187       && GET_CODE (SET_DEST (PATTERN (first))) == PC
11188       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
11189     {
11190       /* Check for the right kind of condition.  */
11191       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
11192       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
11193           && REG_P (XEXP (cond, 0))
11194           && REG_P (XEXP (cond, 1))
11195           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
11196           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
11197         {
11198           /* SECOND mentions the rt register but not the rs register.  */
11199           rtx tmp = XEXP (cond, 0);
11200           XEXP (cond, 0) = XEXP (cond, 1);
11201           XEXP (cond, 1) = tmp;
11202         }
11203     }
11204 }
11205
11206 /* Implement -mvr4130-align.  Go through each basic block and simulate the
11207    processor pipeline.  If we find that a pair of instructions could execute
11208    in parallel, and the first of those instruction is not 8-byte aligned,
11209    insert a nop to make it aligned.  */
11210
11211 static void
11212 vr4130_align_insns (void)
11213 {
11214   struct mips_sim state;
11215   rtx insn, subinsn, last, last2, next;
11216   bool aligned_p;
11217
11218   dfa_start ();
11219
11220   /* LAST is the last instruction before INSN to have a nonzero length.
11221      LAST2 is the last such instruction before LAST.  */
11222   last = 0;
11223   last2 = 0;
11224
11225   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
11226   aligned_p = true;
11227
11228   mips_sim_init (&state, alloca (state_size ()));
11229   for (insn = get_insns (); insn != 0; insn = next)
11230     {
11231       unsigned int length;
11232
11233       next = NEXT_INSN (insn);
11234
11235       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
11236          This isn't really related to the alignment pass, but we do it on
11237          the fly to avoid a separate instruction walk.  */
11238       vr4130_avoid_branch_rt_conflict (insn);
11239
11240       if (USEFUL_INSN_P (insn))
11241         FOR_EACH_SUBINSN (subinsn, insn)
11242           {
11243             mips_sim_wait_insn (&state, subinsn);
11244
11245             /* If we want this instruction to issue in parallel with the
11246                previous one, make sure that the previous instruction is
11247                aligned.  There are several reasons why this isn't worthwhile
11248                when the second instruction is a call:
11249
11250                   - Calls are less likely to be performance critical,
11251                   - There's a good chance that the delay slot can execute
11252                     in parallel with the call.
11253                   - The return address would then be unaligned.
11254
11255                In general, if we're going to insert a nop between instructions
11256                X and Y, it's better to insert it immediately after X.  That
11257                way, if the nop makes Y aligned, it will also align any labels
11258                between X and Y.  */
11259             if (state.insns_left != state.issue_rate
11260                 && !CALL_P (subinsn))
11261               {
11262                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
11263                   {
11264                     /* SUBINSN is the first instruction in INSN and INSN is
11265                        aligned.  We want to align the previous instruction
11266                        instead, so insert a nop between LAST2 and LAST.
11267
11268                        Note that LAST could be either a single instruction
11269                        or a branch with a delay slot.  In the latter case,
11270                        LAST, like INSN, is already aligned, but the delay
11271                        slot must have some extra delay that stops it from
11272                        issuing at the same time as the branch.  We therefore
11273                        insert a nop before the branch in order to align its
11274                        delay slot.  */
11275                     emit_insn_after (gen_nop (), last2);
11276                     aligned_p = false;
11277                   }
11278                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
11279                   {
11280                     /* SUBINSN is the delay slot of INSN, but INSN is
11281                        currently unaligned.  Insert a nop between
11282                        LAST and INSN to align it.  */
11283                     emit_insn_after (gen_nop (), last);
11284                     aligned_p = true;
11285                   }
11286               }
11287             mips_sim_issue_insn (&state, subinsn);
11288           }
11289       mips_sim_finish_insn (&state, insn);
11290
11291       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
11292       length = get_attr_length (insn);
11293       if (length > 0)
11294         {
11295           /* If the instruction is an asm statement or multi-instruction
11296              mips.md patern, the length is only an estimate.  Insert an
11297              8 byte alignment after it so that the following instructions
11298              can be handled correctly.  */
11299           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
11300               && (recog_memoized (insn) < 0 || length >= 8))
11301             {
11302               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
11303               next = NEXT_INSN (next);
11304               mips_sim_next_cycle (&state);
11305               aligned_p = true;
11306             }
11307           else if (length & 4)
11308             aligned_p = !aligned_p;
11309           last2 = last;
11310           last = insn;
11311         }
11312
11313       /* See whether INSN is an aligned label.  */
11314       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
11315         aligned_p = true;
11316     }
11317   dfa_finish ();
11318 }
11319 \f
11320 /* Subroutine of mips_reorg.  If there is a hazard between INSN
11321    and a previous instruction, avoid it by inserting nops after
11322    instruction AFTER.
11323
11324    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
11325    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
11326    before using the value of that register.  *HILO_DELAY counts the
11327    number of instructions since the last hilo hazard (that is,
11328    the number of instructions since the last mflo or mfhi).
11329
11330    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
11331    for the next instruction.
11332
11333    LO_REG is an rtx for the LO register, used in dependence checking.  */
11334
11335 static void
11336 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
11337                    rtx *delayed_reg, rtx lo_reg)
11338 {
11339   rtx pattern, set;
11340   int nops, ninsns, hazard_set;
11341
11342   if (!INSN_P (insn))
11343     return;
11344
11345   pattern = PATTERN (insn);
11346
11347   /* Do not put the whole function in .set noreorder if it contains
11348      an asm statement.  We don't know whether there will be hazards
11349      between the asm statement and the gcc-generated code.  */
11350   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
11351     cfun->machine->all_noreorder_p = false;
11352
11353   /* Ignore zero-length instructions (barriers and the like).  */
11354   ninsns = get_attr_length (insn) / 4;
11355   if (ninsns == 0)
11356     return;
11357
11358   /* Work out how many nops are needed.  Note that we only care about
11359      registers that are explicitly mentioned in the instruction's pattern.
11360      It doesn't matter that calls use the argument registers or that they
11361      clobber hi and lo.  */
11362   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
11363     nops = 2 - *hilo_delay;
11364   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
11365     nops = 1;
11366   else
11367     nops = 0;
11368
11369   /* Insert the nops between this instruction and the previous one.
11370      Each new nop takes us further from the last hilo hazard.  */
11371   *hilo_delay += nops;
11372   while (nops-- > 0)
11373     emit_insn_after (gen_hazard_nop (), after);
11374
11375   /* Set up the state for the next instruction.  */
11376   *hilo_delay += ninsns;
11377   *delayed_reg = 0;
11378   if (INSN_CODE (insn) >= 0)
11379     switch (get_attr_hazard (insn))
11380       {
11381       case HAZARD_NONE:
11382         break;
11383
11384       case HAZARD_HILO:
11385         *hilo_delay = 0;
11386         break;
11387
11388       case HAZARD_DELAY:
11389         hazard_set = (int) get_attr_hazard_set (insn);
11390         if (hazard_set == 0)
11391           set = single_set (insn);
11392         else
11393           {
11394             gcc_assert (GET_CODE (PATTERN (insn)) == PARALLEL);
11395             set = XVECEXP (PATTERN (insn), 0, hazard_set - 1);
11396           }
11397         gcc_assert (set && GET_CODE (set) == SET);
11398         *delayed_reg = SET_DEST (set);
11399         break;
11400       }
11401 }
11402
11403
11404 /* Go through the instruction stream and insert nops where necessary.
11405    See if the whole function can then be put into .set noreorder &
11406    .set nomacro.  */
11407
11408 static void
11409 mips_avoid_hazards (void)
11410 {
11411   rtx insn, last_insn, lo_reg, delayed_reg;
11412   int hilo_delay, i;
11413
11414   /* Force all instructions to be split into their final form.  */
11415   split_all_insns_noflow ();
11416
11417   /* Recalculate instruction lengths without taking nops into account.  */
11418   cfun->machine->ignore_hazard_length_p = true;
11419   shorten_branches (get_insns ());
11420
11421   cfun->machine->all_noreorder_p = true;
11422
11423   /* Profiled functions can't be all noreorder because the profiler
11424      support uses assembler macros.  */
11425   if (current_function_profile)
11426     cfun->machine->all_noreorder_p = false;
11427
11428   /* Code compiled with -mfix-vr4120 can't be all noreorder because
11429      we rely on the assembler to work around some errata.  */
11430   if (TARGET_FIX_VR4120)
11431     cfun->machine->all_noreorder_p = false;
11432
11433   /* The same is true for -mfix-vr4130 if we might generate mflo or
11434      mfhi instructions.  Note that we avoid using mflo and mfhi if
11435      the VR4130 macc and dmacc instructions are available instead;
11436      see the *mfhilo_{si,di}_macc patterns.  */
11437   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
11438     cfun->machine->all_noreorder_p = false;
11439
11440   last_insn = 0;
11441   hilo_delay = 2;
11442   delayed_reg = 0;
11443   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
11444
11445   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
11446     if (INSN_P (insn))
11447       {
11448         if (GET_CODE (PATTERN (insn)) == SEQUENCE)
11449           for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
11450             mips_avoid_hazard (last_insn, XVECEXP (PATTERN (insn), 0, i),
11451                                &hilo_delay, &delayed_reg, lo_reg);
11452         else
11453           mips_avoid_hazard (last_insn, insn, &hilo_delay,
11454                              &delayed_reg, lo_reg);
11455
11456         last_insn = insn;
11457       }
11458 }
11459
11460
11461 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
11462
11463 static void
11464 mips_reorg (void)
11465 {
11466   mips16_lay_out_constants ();
11467   if (TARGET_EXPLICIT_RELOCS)
11468     {
11469       if (mips_flag_delayed_branch)
11470         dbr_schedule (get_insns ());
11471       mips_avoid_hazards ();
11472       if (TUNE_MIPS4130 && TARGET_VR4130_ALIGN)
11473         vr4130_align_insns ();
11474     }
11475 }
11476 \f
11477 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
11478    in order to avoid duplicating too much logic from elsewhere.  */
11479
11480 static void
11481 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
11482                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
11483                       tree function)
11484 {
11485   rtx this, temp1, temp2, insn, fnaddr;
11486   bool use_sibcall_p;
11487
11488   /* Pretend to be a post-reload pass while generating rtl.  */
11489   reload_completed = 1;
11490
11491   /* Mark the end of the (empty) prologue.  */
11492   emit_note (NOTE_INSN_PROLOGUE_END);
11493
11494   /* Determine if we can use a sibcall to call FUNCTION directly.  */
11495   fnaddr = XEXP (DECL_RTL (function), 0);
11496   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
11497                    && const_call_insn_operand (fnaddr, Pmode));
11498
11499   /* Determine if we need to load FNADDR from the GOT.  */
11500   if (!use_sibcall_p)
11501     switch (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))
11502       {
11503       case SYMBOL_GOT_PAGE_OFST:
11504       case SYMBOL_GOT_DISP:
11505         /* Pick a global pointer.  Use a call-clobbered register if
11506            TARGET_CALL_SAVED_GP.  */
11507         cfun->machine->global_pointer =
11508           TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
11509         SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
11510
11511         /* Set up the global pointer for n32 or n64 abicalls.  */
11512         mips_emit_loadgp ();
11513         break;
11514
11515       default:
11516         break;
11517       }
11518
11519   /* We need two temporary registers in some cases.  */
11520   temp1 = gen_rtx_REG (Pmode, 2);
11521   temp2 = gen_rtx_REG (Pmode, 3);
11522
11523   /* Find out which register contains the "this" pointer.  */
11524   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
11525     this = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
11526   else
11527     this = gen_rtx_REG (Pmode, GP_ARG_FIRST);
11528
11529   /* Add DELTA to THIS.  */
11530   if (delta != 0)
11531     {
11532       rtx offset = GEN_INT (delta);
11533       if (!SMALL_OPERAND (delta))
11534         {
11535           mips_emit_move (temp1, offset);
11536           offset = temp1;
11537         }
11538       emit_insn (gen_add3_insn (this, this, offset));
11539     }
11540
11541   /* If needed, add *(*THIS + VCALL_OFFSET) to THIS.  */
11542   if (vcall_offset != 0)
11543     {
11544       rtx addr;
11545
11546       /* Set TEMP1 to *THIS.  */
11547       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this));
11548
11549       /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET.  */
11550       addr = mips_add_offset (temp2, temp1, vcall_offset);
11551
11552       /* Load the offset and add it to THIS.  */
11553       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
11554       emit_insn (gen_add3_insn (this, this, temp1));
11555     }
11556
11557   /* Jump to the target function.  Use a sibcall if direct jumps are
11558      allowed, otherwise load the address into a register first.  */
11559   if (use_sibcall_p)
11560     {
11561       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
11562       SIBLING_CALL_P (insn) = 1;
11563     }
11564   else
11565     {
11566       /* This is messy.  gas treats "la $25,foo" as part of a call
11567          sequence and may allow a global "foo" to be lazily bound.
11568          The general move patterns therefore reject this combination.
11569
11570          In this context, lazy binding would actually be OK
11571          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
11572          TARGET_CALL_SAVED_GP; see mips_load_call_address.
11573          We must therefore load the address via a temporary
11574          register if mips_dangerous_for_la25_p.
11575
11576          If we jump to the temporary register rather than $25, the assembler
11577          can use the move insn to fill the jump's delay slot.  */
11578       if (TARGET_USE_PIC_FN_ADDR_REG
11579           && !mips_dangerous_for_la25_p (fnaddr))
11580         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
11581       mips_load_call_address (temp1, fnaddr, true);
11582
11583       if (TARGET_USE_PIC_FN_ADDR_REG
11584           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
11585         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
11586       emit_jump_insn (gen_indirect_jump (temp1));
11587     }
11588
11589   /* Run just enough of rest_of_compilation.  This sequence was
11590      "borrowed" from alpha.c.  */
11591   insn = get_insns ();
11592   insn_locators_alloc ();
11593   split_all_insns_noflow ();
11594   mips16_lay_out_constants ();
11595   shorten_branches (insn);
11596   final_start_function (insn, file, 1);
11597   final (insn, file, 1);
11598   final_end_function ();
11599
11600   /* Clean up the vars set above.  Note that final_end_function resets
11601      the global pointer for us.  */
11602   reload_completed = 0;
11603 }
11604 \f
11605 static GTY(()) int was_mips16_p = -1;
11606
11607 /* Set up the target-dependent global state so that it matches the
11608    current function's ISA mode.  */
11609
11610 static void
11611 mips_set_mips16_mode (int mips16_p)
11612 {
11613   if (mips16_p == was_mips16_p)
11614     return;
11615
11616   /* Restore base settings of various flags.  */
11617   target_flags = mips_base_target_flags;
11618   flag_delayed_branch = mips_flag_delayed_branch;
11619   flag_schedule_insns = mips_base_schedule_insns;
11620   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
11621   flag_move_loop_invariants = mips_base_move_loop_invariants;
11622   align_loops = mips_base_align_loops;
11623   align_jumps = mips_base_align_jumps;
11624   align_functions = mips_base_align_functions;
11625
11626   if (mips16_p)
11627     {
11628       /* Select mips16 instruction set.  */
11629       target_flags |= MASK_MIPS16;
11630
11631       /* Don't run the scheduler before reload, since it tends to
11632          increase register pressure.  */
11633       flag_schedule_insns = 0;
11634
11635       /* Don't do hot/cold partitioning.  The constant layout code expects
11636          the whole function to be in a single section.  */
11637       flag_reorder_blocks_and_partition = 0;
11638
11639       /* Don't move loop invariants, because it tends to increase
11640          register pressure.  It also introduces an extra move in cases
11641          where the constant is the first operand in a two-operand binary
11642          instruction, or when it forms a register argument to a functon
11643          call.  */
11644       flag_move_loop_invariants = 0;
11645
11646       /* Silently disable -mexplicit-relocs since it doesn't apply
11647          to mips16 code.  Even so, it would overly pedantic to warn
11648          about "-mips16 -mexplicit-relocs", especially given that
11649          we use a %gprel() operator.  */
11650       target_flags &= ~MASK_EXPLICIT_RELOCS;
11651
11652       /* Experiments suggest we get the best overall results from using
11653          the range of an unextended lw or sw.  Code that makes heavy use
11654          of byte or short accesses can do better with ranges of 0...31
11655          and 0...63 respectively, but most code is sensitive to the range
11656          of lw and sw instead.  */
11657       targetm.min_anchor_offset = 0;
11658       targetm.max_anchor_offset = 127;
11659
11660       if (flag_pic || TARGET_ABICALLS)
11661         sorry ("MIPS16 PIC");
11662     }
11663   else
11664     {
11665       /* Reset to select base non-mips16 ISA.  */
11666       target_flags &= ~MASK_MIPS16;
11667
11668       /* When using explicit relocs, we call dbr_schedule from within
11669          mips_reorg.  */
11670       if (TARGET_EXPLICIT_RELOCS)
11671         flag_delayed_branch = 0;
11672
11673       /* Provide default values for align_* for 64-bit targets.  */
11674       if (TARGET_64BIT)
11675         {
11676           if (align_loops == 0)
11677             align_loops = 8;
11678           if (align_jumps == 0)
11679             align_jumps = 8;
11680           if (align_functions == 0)
11681             align_functions = 8;
11682         }
11683
11684       targetm.min_anchor_offset = -32768;
11685       targetm.max_anchor_offset = 32767;
11686     }
11687
11688   /* (Re)initialize mips target internals for new ISA.  */
11689   mips_init_split_addresses ();
11690   mips_init_relocs ();
11691
11692   if (was_mips16_p >= 0)
11693     /* Reinitialize target-dependent state.  */
11694     target_reinit ();
11695
11696   was_mips16_p = TARGET_MIPS16;
11697 }
11698
11699 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
11700    function should use the MIPS16 ISA and switch modes accordingly.  */
11701
11702 static void
11703 mips_set_current_function (tree fndecl)
11704 {
11705   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
11706 }
11707 \f
11708 /* Allocate a chunk of memory for per-function machine-dependent data.  */
11709 static struct machine_function *
11710 mips_init_machine_status (void)
11711 {
11712   return ((struct machine_function *)
11713           ggc_alloc_cleared (sizeof (struct machine_function)));
11714 }
11715
11716 /* Return the processor associated with the given ISA level, or null
11717    if the ISA isn't valid.  */
11718
11719 static const struct mips_cpu_info *
11720 mips_cpu_info_from_isa (int isa)
11721 {
11722   unsigned int i;
11723
11724   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
11725     if (mips_cpu_info_table[i].isa == isa)
11726       return mips_cpu_info_table + i;
11727
11728   return 0;
11729 }
11730
11731 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
11732    with a final "000" replaced by "k".  Ignore case.
11733
11734    Note: this function is shared between GCC and GAS.  */
11735
11736 static bool
11737 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
11738 {
11739   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
11740     given++, canonical++;
11741
11742   return ((*given == 0 && *canonical == 0)
11743           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
11744 }
11745
11746
11747 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
11748    CPU name.  We've traditionally allowed a lot of variation here.
11749
11750    Note: this function is shared between GCC and GAS.  */
11751
11752 static bool
11753 mips_matching_cpu_name_p (const char *canonical, const char *given)
11754 {
11755   /* First see if the name matches exactly, or with a final "000"
11756      turned into "k".  */
11757   if (mips_strict_matching_cpu_name_p (canonical, given))
11758     return true;
11759
11760   /* If not, try comparing based on numerical designation alone.
11761      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
11762   if (TOLOWER (*given) == 'r')
11763     given++;
11764   if (!ISDIGIT (*given))
11765     return false;
11766
11767   /* Skip over some well-known prefixes in the canonical name,
11768      hoping to find a number there too.  */
11769   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
11770     canonical += 2;
11771   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
11772     canonical += 2;
11773   else if (TOLOWER (canonical[0]) == 'r')
11774     canonical += 1;
11775
11776   return mips_strict_matching_cpu_name_p (canonical, given);
11777 }
11778
11779
11780 /* Return the mips_cpu_info entry for the processor or ISA given
11781    by CPU_STRING.  Return null if the string isn't recognized.
11782
11783    A similar function exists in GAS.  */
11784
11785 static const struct mips_cpu_info *
11786 mips_parse_cpu (const char *cpu_string)
11787 {
11788   unsigned int i;
11789   const char *s;
11790
11791   /* In the past, we allowed upper-case CPU names, but it doesn't
11792      work well with the multilib machinery.  */
11793   for (s = cpu_string; *s != 0; s++)
11794     if (ISUPPER (*s))
11795       {
11796         warning (0, "the cpu name must be lower case");
11797         break;
11798       }
11799
11800   /* 'from-abi' selects the most compatible architecture for the given
11801      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
11802      EABIs, we have to decide whether we're using the 32-bit or 64-bit
11803      version.  Look first at the -mgp options, if given, otherwise base
11804      the choice on MASK_64BIT in TARGET_DEFAULT.  */
11805   if (strcasecmp (cpu_string, "from-abi") == 0)
11806     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
11807                                    : ABI_NEEDS_64BIT_REGS ? 3
11808                                    : (TARGET_64BIT ? 3 : 1));
11809
11810   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
11811   if (strcasecmp (cpu_string, "default") == 0)
11812     return 0;
11813
11814   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
11815     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
11816       return mips_cpu_info_table + i;
11817
11818   return 0;
11819 }
11820
11821
11822 /* Set up globals to generate code for the ISA or processor
11823    described by INFO.  */
11824
11825 static void
11826 mips_set_architecture (const struct mips_cpu_info *info)
11827 {
11828   if (info != 0)
11829     {
11830       mips_arch_info = info;
11831       mips_arch = info->cpu;
11832       mips_isa = info->isa;
11833     }
11834 }
11835
11836
11837 /* Likewise for tuning.  */
11838
11839 static void
11840 mips_set_tune (const struct mips_cpu_info *info)
11841 {
11842   if (info != 0)
11843     {
11844       mips_tune_info = info;
11845       mips_tune = info->cpu;
11846     }
11847 }
11848
11849 /* Implement TARGET_HANDLE_OPTION.  */
11850
11851 static bool
11852 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
11853 {
11854   switch (code)
11855     {
11856     case OPT_mabi_:
11857       if (strcmp (arg, "32") == 0)
11858         mips_abi = ABI_32;
11859       else if (strcmp (arg, "o64") == 0)
11860         mips_abi = ABI_O64;
11861       else if (strcmp (arg, "n32") == 0)
11862         mips_abi = ABI_N32;
11863       else if (strcmp (arg, "64") == 0)
11864         mips_abi = ABI_64;
11865       else if (strcmp (arg, "eabi") == 0)
11866         mips_abi = ABI_EABI;
11867       else
11868         return false;
11869       return true;
11870
11871     case OPT_march_:
11872     case OPT_mtune_:
11873       return mips_parse_cpu (arg) != 0;
11874
11875     case OPT_mips:
11876       mips_isa_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
11877       return mips_isa_info != 0;
11878
11879     case OPT_mno_flush_func:
11880       mips_cache_flush_func = NULL;
11881       return true;
11882
11883     case OPT_mcode_readable_:
11884       if (strcmp (arg, "yes") == 0)
11885         mips_code_readable = CODE_READABLE_YES;
11886       else if (strcmp (arg, "pcrel") == 0)
11887         mips_code_readable = CODE_READABLE_PCREL;
11888       else if (strcmp (arg, "no") == 0)
11889         mips_code_readable = CODE_READABLE_NO;
11890       else
11891         return false;
11892       return true;
11893
11894     default:
11895       return true;
11896     }
11897 }
11898
11899 /* Set up the threshold for data to go into the small data area, instead
11900    of the normal data area, and detect any conflicts in the switches.  */
11901
11902 void
11903 override_options (void)
11904 {
11905   int i, start, regno;
11906   enum machine_mode mode;
11907
11908 #ifdef SUBTARGET_OVERRIDE_OPTIONS
11909   SUBTARGET_OVERRIDE_OPTIONS;
11910 #endif
11911
11912   mips_section_threshold = g_switch_set ? g_switch_value : MIPS_DEFAULT_GVALUE;
11913
11914   /* The following code determines the architecture and register size.
11915      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
11916      The GAS and GCC code should be kept in sync as much as possible.  */
11917
11918   if (mips_arch_string != 0)
11919     mips_set_architecture (mips_parse_cpu (mips_arch_string));
11920
11921   if (mips_isa_info != 0)
11922     {
11923       if (mips_arch_info == 0)
11924         mips_set_architecture (mips_isa_info);
11925       else if (mips_arch_info->isa != mips_isa_info->isa)
11926         error ("-%s conflicts with the other architecture options, "
11927                "which specify a %s processor",
11928                mips_isa_info->name,
11929                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
11930     }
11931
11932   if (mips_arch_info == 0)
11933     {
11934 #ifdef MIPS_CPU_STRING_DEFAULT
11935       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
11936 #else
11937       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
11938 #endif
11939     }
11940
11941   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
11942     error ("-march=%s is not compatible with the selected ABI",
11943            mips_arch_info->name);
11944
11945   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
11946   if (mips_tune_string != 0)
11947     mips_set_tune (mips_parse_cpu (mips_tune_string));
11948
11949   if (mips_tune_info == 0)
11950     mips_set_tune (mips_arch_info);
11951
11952   /* Set cost structure for the processor.  */
11953   if (optimize_size)
11954     mips_cost = &mips_rtx_cost_optimize_size;
11955   else
11956     mips_cost = &mips_rtx_cost_data[mips_tune];
11957
11958   /* If the user hasn't specified a branch cost, use the processor's
11959      default.  */
11960   if (mips_branch_cost == 0)
11961     mips_branch_cost = mips_cost->branch_cost;
11962
11963   if ((target_flags_explicit & MASK_64BIT) != 0)
11964     {
11965       /* The user specified the size of the integer registers.  Make sure
11966          it agrees with the ABI and ISA.  */
11967       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
11968         error ("-mgp64 used with a 32-bit processor");
11969       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
11970         error ("-mgp32 used with a 64-bit ABI");
11971       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
11972         error ("-mgp64 used with a 32-bit ABI");
11973     }
11974   else
11975     {
11976       /* Infer the integer register size from the ABI and processor.
11977          Restrict ourselves to 32-bit registers if that's all the
11978          processor has, or if the ABI cannot handle 64-bit registers.  */
11979       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
11980         target_flags &= ~MASK_64BIT;
11981       else
11982         target_flags |= MASK_64BIT;
11983     }
11984
11985   if ((target_flags_explicit & MASK_FLOAT64) != 0)
11986     {
11987       /* Really, -mfp32 and -mfp64 are ornamental options.  There's
11988          only one right answer here.  */
11989       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
11990         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
11991       else if (!TARGET_64BIT && TARGET_FLOAT64
11992                && !(ISA_HAS_MXHC1 && mips_abi == ABI_32))
11993         error ("-mgp32 and -mfp64 can only be combined if the target"
11994                " supports the mfhc1 and mthc1 instructions");
11995       else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
11996         error ("unsupported combination: %s", "-mfp64 -msingle-float");
11997     }
11998   else
11999     {
12000       /* -msingle-float selects 32-bit float registers.  Otherwise the
12001          float registers should be the same size as the integer ones.  */
12002       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
12003         target_flags |= MASK_FLOAT64;
12004       else
12005         target_flags &= ~MASK_FLOAT64;
12006     }
12007
12008   /* End of code shared with GAS.  */
12009
12010   if ((target_flags_explicit & MASK_LONG64) == 0)
12011     {
12012       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
12013         target_flags |= MASK_LONG64;
12014       else
12015         target_flags &= ~MASK_LONG64;
12016     }
12017
12018   if (!TARGET_OLDABI)
12019     flag_pcc_struct_return = 0;
12020
12021   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
12022     {
12023       /* If neither -mbranch-likely nor -mno-branch-likely was given
12024          on the command line, set MASK_BRANCHLIKELY based on the target
12025          architecture and tuning flags.  Annulled delay slots are a
12026          size win, so we only consider the processor-specific tuning
12027          for !optimize_size.  */
12028       if (ISA_HAS_BRANCHLIKELY
12029           && (optimize_size
12030               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
12031         target_flags |= MASK_BRANCHLIKELY;
12032       else
12033         target_flags &= ~MASK_BRANCHLIKELY;
12034     }
12035   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
12036     warning (0, "the %qs architecture does not support branch-likely"
12037              " instructions", mips_arch_info->name);
12038
12039   /* The effect of -mabicalls isn't defined for the EABI.  */
12040   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
12041     {
12042       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
12043       target_flags &= ~MASK_ABICALLS;
12044     }
12045
12046   /* MIPS16 cannot generate PIC yet.  */
12047   if (TARGET_MIPS16 && (flag_pic || TARGET_ABICALLS))
12048     {
12049       sorry ("MIPS16 PIC");
12050       target_flags &= ~MASK_ABICALLS;
12051       flag_pic = flag_pie = flag_shlib = 0;
12052     }
12053
12054   if (TARGET_ABICALLS)
12055     /* We need to set flag_pic for executables as well as DSOs
12056        because we may reference symbols that are not defined in
12057        the final executable.  (MIPS does not use things like
12058        copy relocs, for example.)
12059
12060        Also, there is a body of code that uses __PIC__ to distinguish
12061        between -mabicalls and -mno-abicalls code.  */
12062     flag_pic = 1;
12063
12064   /* -mvr4130-align is a "speed over size" optimization: it usually produces
12065      faster code, but at the expense of more nops.  Enable it at -O3 and
12066      above.  */
12067   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
12068     target_flags |= MASK_VR4130_ALIGN;
12069
12070   /* Prefer a call to memcpy over inline code when optimizing for size,
12071      though see MOVE_RATIO in mips.h.  */
12072   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
12073     target_flags |= MASK_MEMCPY;
12074
12075   /* If we have a nonzero small-data limit, check that the -mgpopt
12076      setting is consistent with the other target flags.  */
12077   if (mips_section_threshold > 0)
12078     {
12079       if (!TARGET_GPOPT)
12080         {
12081           if (!TARGET_MIPS16 && !TARGET_EXPLICIT_RELOCS)
12082             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
12083
12084           TARGET_LOCAL_SDATA = false;
12085           TARGET_EXTERN_SDATA = false;
12086         }
12087       else
12088         {
12089           if (TARGET_VXWORKS_RTP)
12090             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
12091
12092           if (TARGET_ABICALLS)
12093             warning (0, "cannot use small-data accesses for %qs",
12094                      "-mabicalls");
12095         }
12096     }
12097
12098 #ifdef MIPS_TFMODE_FORMAT
12099   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
12100 #endif
12101
12102   /* Make sure that the user didn't turn off paired single support when
12103      MIPS-3D support is requested.  */
12104   if (TARGET_MIPS3D && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
12105       && !TARGET_PAIRED_SINGLE_FLOAT)
12106     error ("-mips3d requires -mpaired-single");
12107
12108   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
12109   if (TARGET_MIPS3D)
12110     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
12111
12112   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
12113      and TARGET_HARD_FLOAT_ABI are both true.  */
12114   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
12115     error ("-mips3d/-mpaired-single must be used with -mfp64 -mhard-float");
12116
12117   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
12118      enabled.  */
12119   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
12120     warning (0, "the %qs architecture does not support paired-single"
12121              " instructions", mips_arch_info->name);
12122
12123   /* If TARGET_DSPR2, enable MASK_DSP.  */
12124   if (TARGET_DSPR2)
12125     target_flags |= MASK_DSP;
12126
12127   mips_init_print_operand_punct ();
12128
12129   /* Set up array to map GCC register number to debug register number.
12130      Ignore the special purpose register numbers.  */
12131
12132   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
12133     {
12134       mips_dbx_regno[i] = INVALID_REGNUM;
12135       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
12136         mips_dwarf_regno[i] = i;
12137       else
12138         mips_dwarf_regno[i] = INVALID_REGNUM;
12139     }
12140
12141   start = GP_DBX_FIRST - GP_REG_FIRST;
12142   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
12143     mips_dbx_regno[i] = i + start;
12144
12145   start = FP_DBX_FIRST - FP_REG_FIRST;
12146   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
12147     mips_dbx_regno[i] = i + start;
12148
12149   /* HI and LO debug registers use big-endian ordering.  */
12150   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
12151   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
12152   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
12153   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
12154   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
12155     {
12156       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
12157       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
12158     }
12159
12160   /* Set up mips_hard_regno_mode_ok.  */
12161   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
12162     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
12163       mips_hard_regno_mode_ok[(int)mode][regno]
12164         = mips_hard_regno_mode_ok_p (regno, mode);
12165
12166   /* Function to allocate machine-dependent function status.  */
12167   init_machine_status = &mips_init_machine_status;
12168
12169   /* Default to working around R4000 errata only if the processor
12170      was selected explicitly.  */
12171   if ((target_flags_explicit & MASK_FIX_R4000) == 0
12172       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
12173     target_flags |= MASK_FIX_R4000;
12174
12175   /* Default to working around R4400 errata only if the processor
12176      was selected explicitly.  */
12177   if ((target_flags_explicit & MASK_FIX_R4400) == 0
12178       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
12179     target_flags |= MASK_FIX_R4400;
12180
12181   /* Save base state of options.  */
12182   mips_base_mips16 = TARGET_MIPS16;
12183   mips_base_target_flags = target_flags;
12184   mips_flag_delayed_branch = flag_delayed_branch;
12185   mips_base_schedule_insns = flag_schedule_insns;
12186   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
12187   mips_base_move_loop_invariants = flag_move_loop_invariants;
12188   mips_base_align_loops = align_loops;
12189   mips_base_align_jumps = align_jumps;
12190   mips_base_align_functions = align_functions;
12191
12192   /* Now select the mips16 or 32-bit instruction set, as requested.  */
12193   mips_set_mips16_mode (mips_base_mips16);
12194 }
12195
12196 /* Swap the register information for registers I and I + 1, which
12197    currently have the wrong endianness.  Note that the registers'
12198    fixedness and call-clobberedness might have been set on the
12199    command line.  */
12200
12201 static void
12202 mips_swap_registers (unsigned int i)
12203 {
12204   int tmpi;
12205   const char *tmps;
12206
12207 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
12208 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
12209
12210   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
12211   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
12212   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
12213   SWAP_STRING (reg_names[i], reg_names[i + 1]);
12214
12215 #undef SWAP_STRING
12216 #undef SWAP_INT
12217 }
12218
12219 /* Implement CONDITIONAL_REGISTER_USAGE.  */
12220
12221 void
12222 mips_conditional_register_usage (void)
12223 {
12224   if (!ISA_HAS_DSP)
12225     {
12226       int regno;
12227
12228       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
12229         fixed_regs[regno] = call_used_regs[regno] = 1;
12230     }
12231   if (!TARGET_HARD_FLOAT)
12232     {
12233       int regno;
12234
12235       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
12236         fixed_regs[regno] = call_used_regs[regno] = 1;
12237       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
12238         fixed_regs[regno] = call_used_regs[regno] = 1;
12239     }
12240   else if (! ISA_HAS_8CC)
12241     {
12242       int regno;
12243
12244       /* We only have a single condition code register.  We
12245          implement this by hiding all the condition code registers,
12246          and generating RTL that refers directly to ST_REG_FIRST.  */
12247       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
12248         fixed_regs[regno] = call_used_regs[regno] = 1;
12249     }
12250   /* In mips16 mode, we permit the $t temporary registers to be used
12251      for reload.  We prohibit the unused $s registers, since they
12252      are caller saved, and saving them via a mips16 register would
12253      probably waste more time than just reloading the value.  */
12254   if (TARGET_MIPS16)
12255     {
12256       fixed_regs[18] = call_used_regs[18] = 1;
12257       fixed_regs[19] = call_used_regs[19] = 1;
12258       fixed_regs[20] = call_used_regs[20] = 1;
12259       fixed_regs[21] = call_used_regs[21] = 1;
12260       fixed_regs[22] = call_used_regs[22] = 1;
12261       fixed_regs[23] = call_used_regs[23] = 1;
12262       fixed_regs[26] = call_used_regs[26] = 1;
12263       fixed_regs[27] = call_used_regs[27] = 1;
12264       fixed_regs[30] = call_used_regs[30] = 1;
12265     }
12266   /* fp20-23 are now caller saved.  */
12267   if (mips_abi == ABI_64)
12268     {
12269       int regno;
12270       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
12271         call_really_used_regs[regno] = call_used_regs[regno] = 1;
12272     }
12273   /* Odd registers from fp21 to fp31 are now caller saved.  */
12274   if (mips_abi == ABI_N32)
12275     {
12276       int regno;
12277       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
12278         call_really_used_regs[regno] = call_used_regs[regno] = 1;
12279     }
12280   /* Make sure that double-register accumulator values are correctly
12281      ordered for the current endianness.  */
12282   if (TARGET_LITTLE_ENDIAN)
12283     {
12284       int regno;
12285       mips_swap_registers (MD_REG_FIRST);
12286       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
12287         mips_swap_registers (regno);
12288     }
12289 }
12290
12291 /* On the mips16, we want to allocate $24 (T_REG) before other
12292    registers for instructions for which it is possible.  This helps
12293    avoid shuffling registers around in order to set up for an xor,
12294    encouraging the compiler to use a cmp instead.  */
12295
12296 void
12297 mips_order_regs_for_local_alloc (void)
12298 {
12299   register int i;
12300
12301   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
12302     reg_alloc_order[i] = i;
12303
12304   if (TARGET_MIPS16)
12305     {
12306       /* It really doesn't matter where we put register 0, since it is
12307          a fixed register anyhow.  */
12308       reg_alloc_order[0] = 24;
12309       reg_alloc_order[24] = 0;
12310     }
12311 }
12312 \f
12313 /* Initialize the GCC target structure.  */
12314 #undef TARGET_ASM_ALIGNED_HI_OP
12315 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
12316 #undef TARGET_ASM_ALIGNED_SI_OP
12317 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
12318 #undef TARGET_ASM_ALIGNED_DI_OP
12319 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
12320
12321 #undef TARGET_ASM_FUNCTION_PROLOGUE
12322 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
12323 #undef TARGET_ASM_FUNCTION_EPILOGUE
12324 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
12325 #undef TARGET_ASM_SELECT_RTX_SECTION
12326 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
12327 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
12328 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
12329
12330 #undef TARGET_SCHED_INIT
12331 #define TARGET_SCHED_INIT mips_sched_init
12332 #undef TARGET_SCHED_REORDER
12333 #define TARGET_SCHED_REORDER mips_sched_reorder
12334 #undef TARGET_SCHED_REORDER2
12335 #define TARGET_SCHED_REORDER2 mips_sched_reorder
12336 #undef TARGET_SCHED_VARIABLE_ISSUE
12337 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
12338 #undef TARGET_SCHED_ADJUST_COST
12339 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
12340 #undef TARGET_SCHED_ISSUE_RATE
12341 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
12342 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
12343 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
12344   mips_multipass_dfa_lookahead
12345
12346 #undef TARGET_DEFAULT_TARGET_FLAGS
12347 #define TARGET_DEFAULT_TARGET_FLAGS             \
12348   (TARGET_DEFAULT                               \
12349    | TARGET_CPU_DEFAULT                         \
12350    | TARGET_ENDIAN_DEFAULT                      \
12351    | TARGET_FP_EXCEPTIONS_DEFAULT               \
12352    | MASK_CHECK_ZERO_DIV                        \
12353    | MASK_FUSED_MADD)
12354 #undef TARGET_HANDLE_OPTION
12355 #define TARGET_HANDLE_OPTION mips_handle_option
12356
12357 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
12358 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
12359
12360 #undef TARGET_INSERT_ATTRIBUTES
12361 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
12362 #undef TARGET_MERGE_DECL_ATTRIBUTES
12363 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
12364 #undef TARGET_SET_CURRENT_FUNCTION
12365 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
12366
12367 #undef TARGET_VALID_POINTER_MODE
12368 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
12369 #undef TARGET_RTX_COSTS
12370 #define TARGET_RTX_COSTS mips_rtx_costs
12371 #undef TARGET_ADDRESS_COST
12372 #define TARGET_ADDRESS_COST mips_address_cost
12373
12374 #undef TARGET_IN_SMALL_DATA_P
12375 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
12376
12377 #undef TARGET_MACHINE_DEPENDENT_REORG
12378 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
12379
12380 #undef TARGET_ASM_FILE_START
12381 #define TARGET_ASM_FILE_START mips_file_start
12382 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
12383 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
12384
12385 #undef TARGET_INIT_LIBFUNCS
12386 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
12387
12388 #undef TARGET_BUILD_BUILTIN_VA_LIST
12389 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
12390 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
12391 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
12392
12393 #undef TARGET_PROMOTE_FUNCTION_ARGS
12394 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
12395 #undef TARGET_PROMOTE_FUNCTION_RETURN
12396 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
12397 #undef TARGET_PROMOTE_PROTOTYPES
12398 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
12399
12400 #undef TARGET_RETURN_IN_MEMORY
12401 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
12402 #undef TARGET_RETURN_IN_MSB
12403 #define TARGET_RETURN_IN_MSB mips_return_in_msb
12404
12405 #undef TARGET_ASM_OUTPUT_MI_THUNK
12406 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
12407 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
12408 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
12409
12410 #undef TARGET_SETUP_INCOMING_VARARGS
12411 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
12412 #undef TARGET_STRICT_ARGUMENT_NAMING
12413 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
12414 #undef TARGET_MUST_PASS_IN_STACK
12415 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
12416 #undef TARGET_PASS_BY_REFERENCE
12417 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
12418 #undef TARGET_CALLEE_COPIES
12419 #define TARGET_CALLEE_COPIES mips_callee_copies
12420 #undef TARGET_ARG_PARTIAL_BYTES
12421 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
12422
12423 #undef TARGET_MODE_REP_EXTENDED
12424 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
12425
12426 #undef TARGET_VECTOR_MODE_SUPPORTED_P
12427 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
12428
12429 #undef TARGET_SCALAR_MODE_SUPPORTED_P
12430 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
12431
12432 #undef TARGET_INIT_BUILTINS
12433 #define TARGET_INIT_BUILTINS mips_init_builtins
12434 #undef TARGET_EXPAND_BUILTIN
12435 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
12436
12437 #undef TARGET_HAVE_TLS
12438 #define TARGET_HAVE_TLS HAVE_AS_TLS
12439
12440 #undef TARGET_CANNOT_FORCE_CONST_MEM
12441 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
12442
12443 #undef TARGET_ENCODE_SECTION_INFO
12444 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
12445
12446 #undef TARGET_ATTRIBUTE_TABLE
12447 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
12448 /* All our function attributes are related to how out-of-line copies should
12449    be compiled or called.  They don't in themselves prevent inlining.  */
12450 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
12451 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
12452
12453 #undef TARGET_EXTRA_LIVE_ON_ENTRY
12454 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
12455
12456 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
12457 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
12458 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
12459 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
12460
12461 #undef  TARGET_COMP_TYPE_ATTRIBUTES
12462 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
12463
12464 #ifdef HAVE_AS_DTPRELWORD
12465 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
12466 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
12467 #endif
12468 #undef TARGET_DWARF_REGISTER_SPAN
12469 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
12470
12471 struct gcc_target targetm = TARGET_INITIALIZER;
12472 \f
12473 #include "gt-mips.h"