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