* target.h (struct gcc_target): Add calls.pass_by_reference.
[official-gcc.git] / gcc / config / mips / mips.c
blob02231f39171d6237d420f955235c6a55eb324549
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 Free Software Foundation, Inc.
4 Contributed by A. Lichnewsky, lich@inria.inria.fr.
5 Changes by Michael Meissner, meissner@osf.org.
6 64 bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
7 Brendan Eich, brendan@microunity.com.
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
16 GCC is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING. If not, write to
23 the Free Software Foundation, 59 Temple Place - Suite 330,
24 Boston, MA 02111-1307, USA. */
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"
60 /* Enumeration for all of the relational tests, so that we can build
61 arrays indexed by the test type, and not worry about the order
62 of EQ, NE, etc. */
64 enum internal_test {
65 ITEST_EQ,
66 ITEST_NE,
67 ITEST_GT,
68 ITEST_GE,
69 ITEST_LT,
70 ITEST_LE,
71 ITEST_GTU,
72 ITEST_GEU,
73 ITEST_LTU,
74 ITEST_LEU,
75 ITEST_MAX
78 /* True if X is an unspec wrapper around a SYMBOL_REF or LABEL_REF. */
79 #define UNSPEC_ADDRESS_P(X) \
80 (GET_CODE (X) == UNSPEC \
81 && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
82 && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
84 /* Extract the symbol or label from UNSPEC wrapper X. */
85 #define UNSPEC_ADDRESS(X) \
86 XVECEXP (X, 0, 0)
88 /* Extract the symbol type from UNSPEC wrapper X. */
89 #define UNSPEC_ADDRESS_TYPE(X) \
90 ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
92 /* True if X is (const (unspec [(const_int 0)] UNSPEC_GP)). This is used
93 to initialize the mips16 gp pseudo register. */
94 #define CONST_GP_P(X) \
95 (GET_CODE (X) == CONST \
96 && GET_CODE (XEXP (X, 0)) == UNSPEC \
97 && XINT (XEXP (X, 0), 1) == UNSPEC_GP)
99 /* The maximum distance between the top of the stack frame and the
100 value $sp has when we save & restore registers.
102 Use a maximum gap of 0x100 in the mips16 case. We can then use
103 unextended instructions to save and restore registers, and to
104 allocate and deallocate the top part of the frame.
106 The value in the !mips16 case must be a SMALL_OPERAND and must
107 preserve the maximum stack alignment. It could really be 0x7ff0,
108 but SGI's assemblers implement daddiu $sp,$sp,-0x7ff0 as a
109 multi-instruction addu sequence. Use 0x7fe0 to work around this. */
110 #define MIPS_MAX_FIRST_STACK_STEP (TARGET_MIPS16 ? 0x100 : 0x7fe0)
112 /* True if INSN is a mips.md pattern or asm statement. */
113 #define USEFUL_INSN_P(INSN) \
114 (INSN_P (INSN) \
115 && GET_CODE (PATTERN (INSN)) != USE \
116 && GET_CODE (PATTERN (INSN)) != CLOBBER \
117 && GET_CODE (PATTERN (INSN)) != ADDR_VEC \
118 && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
120 /* If INSN is a delayed branch sequence, return the first instruction
121 in the sequence, otherwise return INSN itself. */
122 #define SEQ_BEGIN(INSN) \
123 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
124 ? XVECEXP (PATTERN (INSN), 0, 0) \
125 : (INSN))
127 /* Likewise for the last instruction in a delayed branch sequence. */
128 #define SEQ_END(INSN) \
129 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
130 ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1) \
131 : (INSN))
133 /* Execute the following loop body with SUBINSN set to each instruction
134 between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive. */
135 #define FOR_EACH_SUBINSN(SUBINSN, INSN) \
136 for ((SUBINSN) = SEQ_BEGIN (INSN); \
137 (SUBINSN) != NEXT_INSN (SEQ_END (INSN)); \
138 (SUBINSN) = NEXT_INSN (SUBINSN))
140 /* Classifies an address.
142 ADDRESS_REG
143 A natural register + offset address. The register satisfies
144 mips_valid_base_register_p and the offset is a const_arith_operand.
146 ADDRESS_LO_SUM
147 A LO_SUM rtx. The first operand is a valid base register and
148 the second operand is a symbolic address.
150 ADDRESS_CONST_INT
151 A signed 16-bit constant address.
153 ADDRESS_SYMBOLIC:
154 A constant symbolic address (equivalent to CONSTANT_SYMBOLIC). */
155 enum mips_address_type {
156 ADDRESS_REG,
157 ADDRESS_LO_SUM,
158 ADDRESS_CONST_INT,
159 ADDRESS_SYMBOLIC
162 /* A function to save or store a register. The first argument is the
163 register and the second is the stack slot. */
164 typedef void (*mips_save_restore_fn) (rtx, rtx);
166 struct mips16_constant;
167 struct mips_arg_info;
168 struct mips_address_info;
169 struct mips_integer_op;
170 struct mips_sim;
172 static enum mips_symbol_type mips_classify_symbol (rtx);
173 static void mips_split_const (rtx, rtx *, HOST_WIDE_INT *);
174 static bool mips_offset_within_object_p (rtx, HOST_WIDE_INT);
175 static bool mips_symbolic_constant_p (rtx, enum mips_symbol_type *);
176 static bool mips_valid_base_register_p (rtx, enum machine_mode, int);
177 static bool mips_symbolic_address_p (enum mips_symbol_type, enum machine_mode);
178 static bool mips_classify_address (struct mips_address_info *, rtx,
179 enum machine_mode, int);
180 static int mips_symbol_insns (enum mips_symbol_type);
181 static bool mips16_unextended_reference_p (enum machine_mode mode, rtx, rtx);
182 static rtx mips_force_temporary (rtx, rtx);
183 static rtx mips_split_symbol (rtx, rtx);
184 static rtx mips_unspec_offset_high (rtx, rtx, rtx, enum mips_symbol_type);
185 static rtx mips_add_offset (rtx, HOST_WIDE_INT);
186 static unsigned int mips_build_shift (struct mips_integer_op *, HOST_WIDE_INT);
187 static unsigned int mips_build_lower (struct mips_integer_op *,
188 unsigned HOST_WIDE_INT);
189 static unsigned int mips_build_integer (struct mips_integer_op *,
190 unsigned HOST_WIDE_INT);
191 static void mips_move_integer (rtx, unsigned HOST_WIDE_INT);
192 static void mips_legitimize_const_move (enum machine_mode, rtx, rtx);
193 static int m16_check_op (rtx, int, int, int);
194 static bool mips_rtx_costs (rtx, int, int, int *);
195 static int mips_address_cost (rtx);
196 static enum internal_test map_test_to_internal_test (enum rtx_code);
197 static void get_float_compare_codes (enum rtx_code, enum rtx_code *,
198 enum rtx_code *);
199 static void mips_load_call_address (rtx, rtx, int);
200 static bool mips_function_ok_for_sibcall (tree, tree);
201 static void mips_block_move_straight (rtx, rtx, HOST_WIDE_INT);
202 static void mips_adjust_block_mem (rtx, HOST_WIDE_INT, rtx *, rtx *);
203 static void mips_block_move_loop (rtx, rtx, HOST_WIDE_INT);
204 static void mips_arg_info (const CUMULATIVE_ARGS *, enum machine_mode,
205 tree, int, struct mips_arg_info *);
206 static bool mips_get_unaligned_mem (rtx *, unsigned int, int, rtx *, rtx *);
207 static void mips_set_architecture (const struct mips_cpu_info *);
208 static void mips_set_tune (const struct mips_cpu_info *);
209 static struct machine_function *mips_init_machine_status (void);
210 static void print_operand_reloc (FILE *, rtx, const char **);
211 static bool mips_assemble_integer (rtx, unsigned int, int);
212 static void mips_file_start (void);
213 static void mips_file_end (void);
214 static bool mips_rewrite_small_data_p (rtx);
215 static int small_data_pattern_1 (rtx *, void *);
216 static int mips_rewrite_small_data_1 (rtx *, void *);
217 static bool mips_function_has_gp_insn (void);
218 static unsigned int mips_global_pointer (void);
219 static bool mips_save_reg_p (unsigned int);
220 static void mips_save_restore_reg (enum machine_mode, int, HOST_WIDE_INT,
221 mips_save_restore_fn);
222 static void mips_for_each_saved_reg (HOST_WIDE_INT, mips_save_restore_fn);
223 static void mips_output_cplocal (void);
224 static void mips_emit_loadgp (void);
225 static void mips_output_function_prologue (FILE *, HOST_WIDE_INT);
226 static void mips_set_frame_expr (rtx);
227 static rtx mips_frame_set (rtx, rtx);
228 static void mips_save_reg (rtx, rtx);
229 static void mips_output_function_epilogue (FILE *, HOST_WIDE_INT);
230 static void mips_restore_reg (rtx, rtx);
231 static void mips_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
232 HOST_WIDE_INT, tree);
233 static int symbolic_expression_p (rtx);
234 static void mips_select_rtx_section (enum machine_mode, rtx,
235 unsigned HOST_WIDE_INT);
236 static void mips_select_section (tree, int, unsigned HOST_WIDE_INT)
237 ATTRIBUTE_UNUSED;
238 static bool mips_in_small_data_p (tree);
239 static int mips_fpr_return_fields (tree, tree *);
240 static bool mips_return_in_msb (tree);
241 static rtx mips_return_fpr_pair (enum machine_mode mode,
242 enum machine_mode mode1, HOST_WIDE_INT,
243 enum machine_mode mode2, HOST_WIDE_INT);
244 static rtx mips16_gp_pseudo_reg (void);
245 static void mips16_fp_args (FILE *, int, int);
246 static void build_mips16_function_stub (FILE *);
247 static rtx dump_constants_1 (enum machine_mode, rtx, rtx);
248 static void dump_constants (struct mips16_constant *, rtx);
249 static int mips16_insn_length (rtx);
250 static int mips16_rewrite_pool_refs (rtx *, void *);
251 static void mips16_lay_out_constants (void);
252 static void mips_sim_reset (struct mips_sim *);
253 static void mips_sim_init (struct mips_sim *, state_t);
254 static void mips_sim_next_cycle (struct mips_sim *);
255 static void mips_sim_wait_reg (struct mips_sim *, rtx, rtx);
256 static int mips_sim_wait_regs_2 (rtx *, void *);
257 static void mips_sim_wait_regs_1 (rtx *, void *);
258 static void mips_sim_wait_regs (struct mips_sim *, rtx);
259 static void mips_sim_wait_units (struct mips_sim *, rtx);
260 static void mips_sim_wait_insn (struct mips_sim *, rtx);
261 static void mips_sim_record_set (rtx, rtx, void *);
262 static void mips_sim_issue_insn (struct mips_sim *, rtx);
263 static void mips_sim_issue_nop (struct mips_sim *);
264 static void mips_sim_finish_insn (struct mips_sim *, rtx);
265 static void vr4130_avoid_branch_rt_conflict (rtx);
266 static void vr4130_align_insns (void);
267 static void mips_avoid_hazard (rtx, rtx, int *, rtx *, rtx);
268 static void mips_avoid_hazards (void);
269 static void mips_reorg (void);
270 static bool mips_strict_matching_cpu_name_p (const char *, const char *);
271 static bool mips_matching_cpu_name_p (const char *, const char *);
272 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
273 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
274 static bool mips_return_in_memory (tree, tree);
275 static bool mips_strict_argument_naming (CUMULATIVE_ARGS *);
276 static void mips_macc_chains_record (rtx);
277 static void mips_macc_chains_reorder (rtx *, int);
278 static void vr4130_true_reg_dependence_p_1 (rtx, rtx, void *);
279 static bool vr4130_true_reg_dependence_p (rtx);
280 static bool vr4130_swap_insns_p (rtx, rtx);
281 static void vr4130_reorder (rtx *, int);
282 static void mips_promote_ready (rtx *, int, int);
283 static int mips_sched_reorder (FILE *, int, rtx *, int *, int);
284 static int mips_variable_issue (FILE *, int, rtx, int);
285 static int mips_adjust_cost (rtx, rtx, rtx, int);
286 static int mips_issue_rate (void);
287 static int mips_multipass_dfa_lookahead (void);
288 static void mips_init_libfuncs (void);
289 static void mips_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
290 tree, int *, int);
291 static tree mips_build_builtin_va_list (void);
292 static tree mips_gimplify_va_arg_expr (tree, tree, tree *, tree *);
293 static bool mips_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode mode,
294 tree, bool);
296 #if TARGET_IRIX
297 static void irix_asm_named_section_1 (const char *, unsigned int,
298 unsigned int);
299 static void irix_asm_named_section (const char *, unsigned int);
300 static int irix_section_align_entry_eq (const void *, const void *);
301 static hashval_t irix_section_align_entry_hash (const void *);
302 static void irix_file_start (void);
303 static int irix_section_align_1 (void **, void *);
304 static void copy_file_data (FILE *, FILE *);
305 static void irix_file_end (void);
306 static unsigned int irix_section_type_flags (tree, const char *, int);
307 #endif
309 /* Structure to be filled in by compute_frame_size with register
310 save masks, and offsets for the current function. */
312 struct mips_frame_info GTY(())
314 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
315 HOST_WIDE_INT var_size; /* # bytes that variables take up */
316 HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
317 HOST_WIDE_INT cprestore_size; /* # bytes that the .cprestore slot takes up */
318 HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
319 HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
320 unsigned int mask; /* mask of saved gp registers */
321 unsigned int fmask; /* mask of saved fp registers */
322 HOST_WIDE_INT gp_save_offset; /* offset from vfp to store gp registers */
323 HOST_WIDE_INT fp_save_offset; /* offset from vfp to store fp registers */
324 HOST_WIDE_INT gp_sp_offset; /* offset from new sp to store gp registers */
325 HOST_WIDE_INT fp_sp_offset; /* offset from new sp to store fp registers */
326 bool initialized; /* true if frame size already calculated */
327 int num_gp; /* number of gp registers saved */
328 int num_fp; /* number of fp registers saved */
331 struct machine_function GTY(()) {
332 /* Pseudo-reg holding the value of $28 in a mips16 function which
333 refers to GP relative global variables. */
334 rtx mips16_gp_pseudo_rtx;
336 /* Current frame information, calculated by compute_frame_size. */
337 struct mips_frame_info frame;
339 /* The register to use as the global pointer within this function. */
340 unsigned int global_pointer;
342 /* True if mips_adjust_insn_length should ignore an instruction's
343 hazard attribute. */
344 bool ignore_hazard_length_p;
346 /* True if the whole function is suitable for .set noreorder and
347 .set nomacro. */
348 bool all_noreorder_p;
350 /* True if the function is known to have an instruction that needs $gp. */
351 bool has_gp_insn_p;
354 /* Information about a single argument. */
355 struct mips_arg_info
357 /* True if the argument is passed in a floating-point register, or
358 would have been if we hadn't run out of registers. */
359 bool fpr_p;
361 /* The argument's size, in bytes. */
362 unsigned int num_bytes;
364 /* The number of words passed in registers, rounded up. */
365 unsigned int reg_words;
367 /* The offset of the first register from GP_ARG_FIRST or FP_ARG_FIRST,
368 or MAX_ARGS_IN_REGISTERS if the argument is passed entirely
369 on the stack. */
370 unsigned int reg_offset;
372 /* The number of words that must be passed on the stack, rounded up. */
373 unsigned int stack_words;
375 /* The offset from the start of the stack overflow area of the argument's
376 first stack word. Only meaningful when STACK_WORDS is nonzero. */
377 unsigned int stack_offset;
381 /* Information about an address described by mips_address_type.
383 ADDRESS_CONST_INT
384 No fields are used.
386 ADDRESS_REG
387 REG is the base register and OFFSET is the constant offset.
389 ADDRESS_LO_SUM
390 REG is the register that contains the high part of the address,
391 OFFSET is the symbolic address being referenced and SYMBOL_TYPE
392 is the type of OFFSET's symbol.
394 ADDRESS_SYMBOLIC
395 SYMBOL_TYPE is the type of symbol being referenced. */
397 struct mips_address_info
399 enum mips_address_type type;
400 rtx reg;
401 rtx offset;
402 enum mips_symbol_type symbol_type;
406 /* One stage in a constant building sequence. These sequences have
407 the form:
409 A = VALUE[0]
410 A = A CODE[1] VALUE[1]
411 A = A CODE[2] VALUE[2]
414 where A is an accumulator, each CODE[i] is a binary rtl operation
415 and each VALUE[i] is a constant integer. */
416 struct mips_integer_op {
417 enum rtx_code code;
418 unsigned HOST_WIDE_INT value;
422 /* The largest number of operations needed to load an integer constant.
423 The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
424 When the lowest bit is clear, we can try, but reject a sequence with
425 an extra SLL at the end. */
426 #define MIPS_MAX_INTEGER_OPS 7
429 /* Global variables for machine-dependent things. */
431 /* Threshold for data being put into the small data/bss area, instead
432 of the normal data area. */
433 int mips_section_threshold = -1;
435 /* Count the number of .file directives, so that .loc is up to date. */
436 int num_source_filenames = 0;
438 /* Count the number of sdb related labels are generated (to find block
439 start and end boundaries). */
440 int sdb_label_count = 0;
442 /* Next label # for each statement for Silicon Graphics IRIS systems. */
443 int sym_lineno = 0;
445 /* Linked list of all externals that are to be emitted when optimizing
446 for the global pointer if they haven't been declared by the end of
447 the program with an appropriate .comm or initialization. */
449 struct extern_list GTY (())
451 struct extern_list *next; /* next external */
452 const char *name; /* name of the external */
453 int size; /* size in bytes */
456 static GTY (()) struct extern_list *extern_head = 0;
458 /* Name of the file containing the current function. */
459 const char *current_function_file = "";
461 /* Number of nested .set noreorder, noat, nomacro, and volatile requests. */
462 int set_noreorder;
463 int set_noat;
464 int set_nomacro;
465 int set_volatile;
467 /* The next branch instruction is a branch likely, not branch normal. */
468 int mips_branch_likely;
470 /* Cached operands, and operator to compare for use in set/branch/trap
471 on condition codes. */
472 rtx branch_cmp[2];
474 /* what type of branch to use */
475 enum cmp_type branch_type;
477 /* The target cpu for code generation. */
478 enum processor_type mips_arch;
479 const struct mips_cpu_info *mips_arch_info;
481 /* The target cpu for optimization and scheduling. */
482 enum processor_type mips_tune;
483 const struct mips_cpu_info *mips_tune_info;
485 /* Which instruction set architecture to use. */
486 int mips_isa;
488 /* Which ABI to use. */
489 int mips_abi;
491 /* Strings to hold which cpu and instruction set architecture to use. */
492 const char *mips_arch_string; /* for -march=<xxx> */
493 const char *mips_tune_string; /* for -mtune=<xxx> */
494 const char *mips_isa_string; /* for -mips{1,2,3,4} */
495 const char *mips_abi_string; /* for -mabi={32,n32,64,eabi} */
497 /* Whether we are generating mips16 hard float code. In mips16 mode
498 we always set TARGET_SOFT_FLOAT; this variable is nonzero if
499 -msoft-float was not specified by the user, which means that we
500 should arrange to call mips32 hard floating point code. */
501 int mips16_hard_float;
503 const char *mips_cache_flush_func = CACHE_FLUSH_FUNC;
505 /* If TRUE, we split addresses into their high and low parts in the RTL. */
506 int mips_split_addresses;
508 /* Mode used for saving/restoring general purpose registers. */
509 static enum machine_mode gpr_mode;
511 /* Array giving truth value on whether or not a given hard register
512 can support a given mode. */
513 char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
515 /* List of all MIPS punctuation characters used by print_operand. */
516 char mips_print_operand_punct[256];
518 /* Map GCC register number to debugger register number. */
519 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
521 /* A copy of the original flag_delayed_branch: see override_options. */
522 static int mips_flag_delayed_branch;
524 static GTY (()) int mips_output_filename_first_time = 1;
526 /* mips_split_p[X] is true if symbols of type X can be split by
527 mips_split_symbol(). */
528 static bool mips_split_p[NUM_SYMBOL_TYPES];
530 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
531 appears in a LO_SUM. It can be null if such LO_SUMs aren't valid or
532 if they are matched by a special .md file pattern. */
533 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
535 /* Likewise for HIGHs. */
536 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
538 /* Map hard register number to register class */
539 const enum reg_class mips_regno_to_class[] =
541 LEA_REGS, LEA_REGS, M16_NA_REGS, M16_NA_REGS,
542 M16_REGS, M16_REGS, M16_REGS, M16_REGS,
543 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
544 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
545 M16_NA_REGS, M16_NA_REGS, LEA_REGS, LEA_REGS,
546 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
547 T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS,
548 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
549 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
550 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
551 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
552 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
553 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
554 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
555 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
556 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
557 HI_REG, LO_REG, NO_REGS, ST_REGS,
558 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
559 ST_REGS, ST_REGS, ST_REGS, NO_REGS,
560 NO_REGS, ALL_REGS, ALL_REGS, NO_REGS,
561 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
562 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
563 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
564 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
565 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
566 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
567 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
568 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
569 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
570 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
571 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
572 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
573 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
574 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
575 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
576 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
577 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
578 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
579 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
580 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
581 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
582 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
583 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
584 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS
587 /* Map register constraint character to register class. */
588 enum reg_class mips_char_to_class[256];
590 /* A table describing all the processors gcc knows about. Names are
591 matched in the order listed. The first mention of an ISA level is
592 taken as the canonical name for that ISA.
594 To ease comparison, please keep this table in the same order as
595 gas's mips_cpu_info_table[]. */
596 const struct mips_cpu_info mips_cpu_info_table[] = {
597 /* Entries for generic ISAs */
598 { "mips1", PROCESSOR_R3000, 1 },
599 { "mips2", PROCESSOR_R6000, 2 },
600 { "mips3", PROCESSOR_R4000, 3 },
601 { "mips4", PROCESSOR_R8000, 4 },
602 { "mips32", PROCESSOR_4KC, 32 },
603 { "mips32r2", PROCESSOR_M4K, 33 },
604 { "mips64", PROCESSOR_5KC, 64 },
606 /* MIPS I */
607 { "r3000", PROCESSOR_R3000, 1 },
608 { "r2000", PROCESSOR_R3000, 1 }, /* = r3000 */
609 { "r3900", PROCESSOR_R3900, 1 },
611 /* MIPS II */
612 { "r6000", PROCESSOR_R6000, 2 },
614 /* MIPS III */
615 { "r4000", PROCESSOR_R4000, 3 },
616 { "vr4100", PROCESSOR_R4100, 3 },
617 { "vr4111", PROCESSOR_R4111, 3 },
618 { "vr4120", PROCESSOR_R4120, 3 },
619 { "vr4130", PROCESSOR_R4130, 3 },
620 { "vr4300", PROCESSOR_R4300, 3 },
621 { "r4400", PROCESSOR_R4000, 3 }, /* = r4000 */
622 { "r4600", PROCESSOR_R4600, 3 },
623 { "orion", PROCESSOR_R4600, 3 }, /* = r4600 */
624 { "r4650", PROCESSOR_R4650, 3 },
626 /* MIPS IV */
627 { "r8000", PROCESSOR_R8000, 4 },
628 { "vr5000", PROCESSOR_R5000, 4 },
629 { "vr5400", PROCESSOR_R5400, 4 },
630 { "vr5500", PROCESSOR_R5500, 4 },
631 { "rm7000", PROCESSOR_R7000, 4 },
632 { "rm9000", PROCESSOR_R9000, 4 },
634 /* MIPS32 */
635 { "4kc", PROCESSOR_4KC, 32 },
636 { "4kp", PROCESSOR_4KC, 32 }, /* = 4kc */
638 /* MIPS32 Release 2 */
639 { "m4k", PROCESSOR_M4K, 33 },
641 /* MIPS64 */
642 { "5kc", PROCESSOR_5KC, 64 },
643 { "20kc", PROCESSOR_20KC, 64 },
644 { "sb1", PROCESSOR_SB1, 64 },
645 { "sr71000", PROCESSOR_SR71000, 64 },
647 /* End marker */
648 { 0, 0, 0 }
651 /* Nonzero if -march should decide the default value of MASK_SOFT_FLOAT. */
652 #ifndef MIPS_MARCH_CONTROLS_SOFT_FLOAT
653 #define MIPS_MARCH_CONTROLS_SOFT_FLOAT 0
654 #endif
656 /* Initialize the GCC target structure. */
657 #undef TARGET_ASM_ALIGNED_HI_OP
658 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
659 #undef TARGET_ASM_ALIGNED_SI_OP
660 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
661 #undef TARGET_ASM_INTEGER
662 #define TARGET_ASM_INTEGER mips_assemble_integer
664 #undef TARGET_ASM_FUNCTION_PROLOGUE
665 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
666 #undef TARGET_ASM_FUNCTION_EPILOGUE
667 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
668 #undef TARGET_ASM_SELECT_RTX_SECTION
669 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
671 #undef TARGET_SCHED_REORDER
672 #define TARGET_SCHED_REORDER mips_sched_reorder
673 #undef TARGET_SCHED_VARIABLE_ISSUE
674 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
675 #undef TARGET_SCHED_ADJUST_COST
676 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
677 #undef TARGET_SCHED_ISSUE_RATE
678 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
679 #undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
680 #define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE hook_int_void_1
681 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
682 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
683 mips_multipass_dfa_lookahead
685 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
686 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
688 #undef TARGET_VALID_POINTER_MODE
689 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
690 #undef TARGET_RTX_COSTS
691 #define TARGET_RTX_COSTS mips_rtx_costs
692 #undef TARGET_ADDRESS_COST
693 #define TARGET_ADDRESS_COST mips_address_cost
695 #undef TARGET_IN_SMALL_DATA_P
696 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
698 #undef TARGET_MACHINE_DEPENDENT_REORG
699 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
701 #undef TARGET_ASM_FILE_START
702 #undef TARGET_ASM_FILE_END
703 #if TARGET_IRIX
704 #define TARGET_ASM_FILE_START irix_file_start
705 #define TARGET_ASM_FILE_END irix_file_end
706 #else
707 #define TARGET_ASM_FILE_START mips_file_start
708 #define TARGET_ASM_FILE_END mips_file_end
709 #endif
710 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
711 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
713 #if TARGET_IRIX
714 #undef TARGET_SECTION_TYPE_FLAGS
715 #define TARGET_SECTION_TYPE_FLAGS irix_section_type_flags
716 #endif
718 #undef TARGET_INIT_LIBFUNCS
719 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
721 #undef TARGET_BUILD_BUILTIN_VA_LIST
722 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
723 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
724 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
726 #undef TARGET_PROMOTE_FUNCTION_ARGS
727 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
728 #undef TARGET_PROMOTE_FUNCTION_RETURN
729 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
730 #undef TARGET_PROMOTE_PROTOTYPES
731 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
733 #undef TARGET_RETURN_IN_MEMORY
734 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
735 #undef TARGET_RETURN_IN_MSB
736 #define TARGET_RETURN_IN_MSB mips_return_in_msb
738 #undef TARGET_ASM_OUTPUT_MI_THUNK
739 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
740 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
741 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
743 #undef TARGET_SETUP_INCOMING_VARARGS
744 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
745 #undef TARGET_STRICT_ARGUMENT_NAMING
746 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
747 #undef TARGET_MUST_PASS_IN_STACK
748 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
749 #undef TARGET_PASS_BY_REFERENCE
750 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
752 struct gcc_target targetm = TARGET_INITIALIZER;
754 /* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF. */
756 static enum mips_symbol_type
757 mips_classify_symbol (rtx x)
759 if (GET_CODE (x) == LABEL_REF)
761 if (TARGET_MIPS16)
762 return SYMBOL_CONSTANT_POOL;
763 if (TARGET_ABICALLS)
764 return SYMBOL_GOT_LOCAL;
765 return SYMBOL_GENERAL;
768 if (GET_CODE (x) != SYMBOL_REF)
769 abort ();
771 if (CONSTANT_POOL_ADDRESS_P (x))
773 if (TARGET_MIPS16)
774 return SYMBOL_CONSTANT_POOL;
776 if (TARGET_ABICALLS)
777 return SYMBOL_GOT_LOCAL;
779 if (GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold)
780 return SYMBOL_SMALL_DATA;
782 return SYMBOL_GENERAL;
785 if (SYMBOL_REF_SMALL_P (x))
786 return SYMBOL_SMALL_DATA;
788 if (TARGET_ABICALLS)
790 if (SYMBOL_REF_DECL (x) == 0)
791 return SYMBOL_REF_LOCAL_P (x) ? SYMBOL_GOT_LOCAL : SYMBOL_GOT_GLOBAL;
793 /* There are three cases to consider:
795 - o32 PIC (either with or without explicit relocs)
796 - n32/n64 PIC without explicit relocs
797 - n32/n64 PIC with explicit relocs
799 In the first case, both local and global accesses will use an
800 R_MIPS_GOT16 relocation. We must correctly predict which of
801 the two semantics (local or global) the assembler and linker
802 will apply. The choice doesn't depend on the symbol's
803 visibility, so we deliberately ignore decl_visibility and
804 binds_local_p here.
806 In the second case, the assembler will not use R_MIPS_GOT16
807 relocations, but it chooses between local and global accesses
808 in the same way as for o32 PIC.
810 In the third case we have more freedom since both forms of
811 access will work for any kind of symbol. However, there seems
812 little point in doing things differently. */
813 if (DECL_P (SYMBOL_REF_DECL (x)) && TREE_PUBLIC (SYMBOL_REF_DECL (x)))
814 return SYMBOL_GOT_GLOBAL;
816 return SYMBOL_GOT_LOCAL;
819 return SYMBOL_GENERAL;
823 /* Split X into a base and a constant offset, storing them in *BASE
824 and *OFFSET respectively. */
826 static void
827 mips_split_const (rtx x, rtx *base, HOST_WIDE_INT *offset)
829 *offset = 0;
831 if (GET_CODE (x) == CONST)
832 x = XEXP (x, 0);
834 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
836 *offset += INTVAL (XEXP (x, 1));
837 x = XEXP (x, 0);
839 *base = x;
843 /* Return true if SYMBOL is a SYMBOL_REF and OFFSET + SYMBOL points
844 to the same object as SYMBOL. */
846 static bool
847 mips_offset_within_object_p (rtx symbol, HOST_WIDE_INT offset)
849 if (GET_CODE (symbol) != SYMBOL_REF)
850 return false;
852 if (CONSTANT_POOL_ADDRESS_P (symbol)
853 && offset >= 0
854 && offset < (int) GET_MODE_SIZE (get_pool_mode (symbol)))
855 return true;
857 if (SYMBOL_REF_DECL (symbol) != 0
858 && offset >= 0
859 && offset < int_size_in_bytes (TREE_TYPE (SYMBOL_REF_DECL (symbol))))
860 return true;
862 return false;
866 /* Return true if X is a symbolic constant that can be calculated in
867 the same way as a bare symbol. If it is, store the type of the
868 symbol in *SYMBOL_TYPE. */
870 static bool
871 mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
873 HOST_WIDE_INT offset;
875 mips_split_const (x, &x, &offset);
876 if (UNSPEC_ADDRESS_P (x))
877 *symbol_type = UNSPEC_ADDRESS_TYPE (x);
878 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
879 *symbol_type = mips_classify_symbol (x);
880 else
881 return false;
883 if (offset == 0)
884 return true;
886 /* Check whether a nonzero offset is valid for the underlying
887 relocations. */
888 switch (*symbol_type)
890 case SYMBOL_GENERAL:
891 case SYMBOL_64_HIGH:
892 case SYMBOL_64_MID:
893 case SYMBOL_64_LOW:
894 /* If the target has 64-bit pointers and the object file only
895 supports 32-bit symbols, the values of those symbols will be
896 sign-extended. In this case we can't allow an arbitrary offset
897 in case the 32-bit value X + OFFSET has a different sign from X. */
898 if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
899 return mips_offset_within_object_p (x, offset);
901 /* In other cases the relocations can handle any offset. */
902 return true;
904 case SYMBOL_CONSTANT_POOL:
905 /* Allow constant pool references to be converted to LABEL+CONSTANT.
906 In this case, we no longer have access to the underlying constant,
907 but the original symbol-based access was known to be valid. */
908 if (GET_CODE (x) == LABEL_REF)
909 return true;
911 /* Fall through. */
913 case SYMBOL_SMALL_DATA:
914 /* Make sure that the offset refers to something within the
915 underlying object. This should guarantee that the final
916 PC- or GP-relative offset is within the 16-bit limit. */
917 return mips_offset_within_object_p (x, offset);
919 case SYMBOL_GOT_LOCAL:
920 case SYMBOL_GOTOFF_PAGE:
921 /* The linker should provide enough local GOT entries for a
922 16-bit offset. Larger offsets may lead to GOT overflow. */
923 return SMALL_OPERAND (offset);
925 case SYMBOL_GOT_GLOBAL:
926 case SYMBOL_GOTOFF_GLOBAL:
927 case SYMBOL_GOTOFF_CALL:
928 case SYMBOL_GOTOFF_LOADGP:
929 return false;
931 abort ();
935 /* This function is used to implement REG_MODE_OK_FOR_BASE_P. */
938 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode, int strict)
940 if (regno >= FIRST_PSEUDO_REGISTER)
942 if (!strict)
943 return true;
944 regno = reg_renumber[regno];
947 /* These fake registers will be eliminated to either the stack or
948 hard frame pointer, both of which are usually valid base registers.
949 Reload deals with the cases where the eliminated form isn't valid. */
950 if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
951 return true;
953 /* In mips16 mode, the stack pointer can only address word and doubleword
954 values, nothing smaller. There are two problems here:
956 (a) Instantiating virtual registers can introduce new uses of the
957 stack pointer. If these virtual registers are valid addresses,
958 the stack pointer should be too.
960 (b) Most uses of the stack pointer are not made explicit until
961 FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
962 We don't know until that stage whether we'll be eliminating to the
963 stack pointer (which needs the restriction) or the hard frame
964 pointer (which doesn't).
966 All in all, it seems more consistent to only enforce this restriction
967 during and after reload. */
968 if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
969 return !strict || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
971 return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
975 /* Return true if X is a valid base register for the given mode.
976 Allow only hard registers if STRICT. */
978 static bool
979 mips_valid_base_register_p (rtx x, enum machine_mode mode, int strict)
981 if (!strict && GET_CODE (x) == SUBREG)
982 x = SUBREG_REG (x);
984 return (GET_CODE (x) == REG
985 && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict));
989 /* Return true if symbols of type SYMBOL_TYPE can directly address a value
990 with mode MODE. This is used for both symbolic and LO_SUM addresses. */
992 static bool
993 mips_symbolic_address_p (enum mips_symbol_type symbol_type,
994 enum machine_mode mode)
996 switch (symbol_type)
998 case SYMBOL_GENERAL:
999 return !TARGET_MIPS16;
1001 case SYMBOL_SMALL_DATA:
1002 return true;
1004 case SYMBOL_CONSTANT_POOL:
1005 /* PC-relative addressing is only available for lw and ld. */
1006 return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1008 case SYMBOL_GOT_LOCAL:
1009 return true;
1011 case SYMBOL_GOT_GLOBAL:
1012 /* The address will have to be loaded from the GOT first. */
1013 return false;
1015 case SYMBOL_GOTOFF_PAGE:
1016 case SYMBOL_GOTOFF_GLOBAL:
1017 case SYMBOL_GOTOFF_CALL:
1018 case SYMBOL_GOTOFF_LOADGP:
1019 case SYMBOL_64_HIGH:
1020 case SYMBOL_64_MID:
1021 case SYMBOL_64_LOW:
1022 return true;
1024 abort ();
1028 /* Return true if X is a valid address for machine mode MODE. If it is,
1029 fill in INFO appropriately. STRICT is true if we should only accept
1030 hard base registers. */
1032 static bool
1033 mips_classify_address (struct mips_address_info *info, rtx x,
1034 enum machine_mode mode, int strict)
1036 switch (GET_CODE (x))
1038 case REG:
1039 case SUBREG:
1040 info->type = ADDRESS_REG;
1041 info->reg = x;
1042 info->offset = const0_rtx;
1043 return mips_valid_base_register_p (info->reg, mode, strict);
1045 case PLUS:
1046 info->type = ADDRESS_REG;
1047 info->reg = XEXP (x, 0);
1048 info->offset = XEXP (x, 1);
1049 return (mips_valid_base_register_p (info->reg, mode, strict)
1050 && const_arith_operand (info->offset, VOIDmode));
1052 case LO_SUM:
1053 info->type = ADDRESS_LO_SUM;
1054 info->reg = XEXP (x, 0);
1055 info->offset = XEXP (x, 1);
1056 return (mips_valid_base_register_p (info->reg, mode, strict)
1057 && mips_symbolic_constant_p (info->offset, &info->symbol_type)
1058 && mips_symbolic_address_p (info->symbol_type, mode)
1059 && mips_lo_relocs[info->symbol_type] != 0);
1061 case CONST_INT:
1062 /* Small-integer addresses don't occur very often, but they
1063 are legitimate if $0 is a valid base register. */
1064 info->type = ADDRESS_CONST_INT;
1065 return !TARGET_MIPS16 && SMALL_INT (x);
1067 case CONST:
1068 case LABEL_REF:
1069 case SYMBOL_REF:
1070 info->type = ADDRESS_SYMBOLIC;
1071 return (mips_symbolic_constant_p (x, &info->symbol_type)
1072 && mips_symbolic_address_p (info->symbol_type, mode)
1073 && !mips_split_p[info->symbol_type]);
1075 default:
1076 return false;
1080 /* Return the number of instructions needed to load a symbol of the
1081 given type into a register. If valid in an address, the same number
1082 of instructions are needed for loads and stores. Treat extended
1083 mips16 instructions as two instructions. */
1085 static int
1086 mips_symbol_insns (enum mips_symbol_type type)
1088 switch (type)
1090 case SYMBOL_GENERAL:
1091 /* In mips16 code, general symbols must be fetched from the
1092 constant pool. */
1093 if (TARGET_MIPS16)
1094 return 0;
1096 /* When using 64-bit symbols, we need 5 preparatory instructions,
1097 such as:
1099 lui $at,%highest(symbol)
1100 daddiu $at,$at,%higher(symbol)
1101 dsll $at,$at,16
1102 daddiu $at,$at,%hi(symbol)
1103 dsll $at,$at,16
1105 The final address is then $at + %lo(symbol). With 32-bit
1106 symbols we just need a preparatory lui. */
1107 return (ABI_HAS_64BIT_SYMBOLS ? 6 : 2);
1109 case SYMBOL_SMALL_DATA:
1110 return 1;
1112 case SYMBOL_CONSTANT_POOL:
1113 /* This case is for mips16 only. Assume we'll need an
1114 extended instruction. */
1115 return 2;
1117 case SYMBOL_GOT_LOCAL:
1118 case SYMBOL_GOT_GLOBAL:
1119 /* Unless -funit-at-a-time is in effect, we can't be sure whether
1120 the local/global classification is accurate. See override_options
1121 for details.
1123 The worst cases are:
1125 (1) For local symbols when generating o32 or o64 code. The assembler
1126 will use:
1128 lw $at,%got(symbol)
1131 ...and the final address will be $at + %lo(symbol).
1133 (2) For global symbols when -mxgot. The assembler will use:
1135 lui $at,%got_hi(symbol)
1136 (d)addu $at,$at,$gp
1138 ...and the final address will be $at + %got_lo(symbol). */
1139 return 3;
1141 case SYMBOL_GOTOFF_PAGE:
1142 case SYMBOL_GOTOFF_GLOBAL:
1143 case SYMBOL_GOTOFF_CALL:
1144 case SYMBOL_GOTOFF_LOADGP:
1145 case SYMBOL_64_HIGH:
1146 case SYMBOL_64_MID:
1147 case SYMBOL_64_LOW:
1148 /* Check whether the offset is a 16- or 32-bit value. */
1149 return mips_split_p[type] ? 2 : 1;
1151 abort ();
1155 /* Return true if a value at OFFSET bytes from BASE can be accessed
1156 using an unextended mips16 instruction. MODE is the mode of the
1157 value.
1159 Usually the offset in an unextended instruction is a 5-bit field.
1160 The offset is unsigned and shifted left once for HIs, twice
1161 for SIs, and so on. An exception is SImode accesses off the
1162 stack pointer, which have an 8-bit immediate field. */
1164 static bool
1165 mips16_unextended_reference_p (enum machine_mode mode, rtx base, rtx offset)
1167 if (TARGET_MIPS16
1168 && GET_CODE (offset) == CONST_INT
1169 && INTVAL (offset) >= 0
1170 && (INTVAL (offset) & (GET_MODE_SIZE (mode) - 1)) == 0)
1172 if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
1173 return INTVAL (offset) < 256 * GET_MODE_SIZE (mode);
1174 return INTVAL (offset) < 32 * GET_MODE_SIZE (mode);
1176 return false;
1180 /* Return the number of instructions needed to load or store a value
1181 of mode MODE at X. Return 0 if X isn't valid for MODE.
1183 For mips16 code, count extended instructions as two instructions. */
1186 mips_address_insns (rtx x, enum machine_mode mode)
1188 struct mips_address_info addr;
1189 int factor;
1191 if (mode == BLKmode)
1192 /* BLKmode is used for single unaligned loads and stores. */
1193 factor = 1;
1194 else
1195 /* Each word of a multi-word value will be accessed individually. */
1196 factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1198 if (mips_classify_address (&addr, x, mode, false))
1199 switch (addr.type)
1201 case ADDRESS_REG:
1202 if (TARGET_MIPS16
1203 && !mips16_unextended_reference_p (mode, addr.reg, addr.offset))
1204 return factor * 2;
1205 return factor;
1207 case ADDRESS_LO_SUM:
1208 return (TARGET_MIPS16 ? factor * 2 : factor);
1210 case ADDRESS_CONST_INT:
1211 return factor;
1213 case ADDRESS_SYMBOLIC:
1214 return factor * mips_symbol_insns (addr.symbol_type);
1216 return 0;
1220 /* Likewise for constant X. */
1223 mips_const_insns (rtx x)
1225 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
1226 enum mips_symbol_type symbol_type;
1227 HOST_WIDE_INT offset;
1229 switch (GET_CODE (x))
1231 case HIGH:
1232 if (TARGET_MIPS16
1233 || !mips_symbolic_constant_p (XEXP (x, 0), &symbol_type)
1234 || !mips_split_p[symbol_type])
1235 return 0;
1237 return 1;
1239 case CONST_INT:
1240 if (TARGET_MIPS16)
1241 /* Unsigned 8-bit constants can be loaded using an unextended
1242 LI instruction. Unsigned 16-bit constants can be loaded
1243 using an extended LI. Negative constants must be loaded
1244 using LI and then negated. */
1245 return (INTVAL (x) >= 0 && INTVAL (x) < 256 ? 1
1246 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
1247 : INTVAL (x) > -256 && INTVAL (x) < 0 ? 2
1248 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
1249 : 0);
1251 return mips_build_integer (codes, INTVAL (x));
1253 case CONST_DOUBLE:
1254 return (!TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0);
1256 case CONST:
1257 if (CONST_GP_P (x))
1258 return 1;
1260 /* See if we can refer to X directly. */
1261 if (mips_symbolic_constant_p (x, &symbol_type))
1262 return mips_symbol_insns (symbol_type);
1264 /* Otherwise try splitting the constant into a base and offset.
1265 16-bit offsets can be added using an extra addiu. Larger offsets
1266 must be calculated separately and then added to the base. */
1267 mips_split_const (x, &x, &offset);
1268 if (offset != 0)
1270 int n = mips_const_insns (x);
1271 if (n != 0)
1273 if (SMALL_OPERAND (offset))
1274 return n + 1;
1275 else
1276 return n + 1 + mips_build_integer (codes, offset);
1279 return 0;
1281 case SYMBOL_REF:
1282 case LABEL_REF:
1283 return mips_symbol_insns (mips_classify_symbol (x));
1285 default:
1286 return 0;
1291 /* Return the number of instructions needed for memory reference X.
1292 Count extended mips16 instructions as two instructions. */
1295 mips_fetch_insns (rtx x)
1297 if (GET_CODE (x) != MEM)
1298 abort ();
1300 return mips_address_insns (XEXP (x, 0), GET_MODE (x));
1304 /* Return the number of instructions needed for an integer division. */
1307 mips_idiv_insns (void)
1309 int count;
1311 count = 1;
1312 if (TARGET_CHECK_ZERO_DIV)
1313 count += 2;
1314 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
1315 count++;
1316 return count;
1320 /* Return truth value of whether OP can be used as an operands
1321 where a register or 16 bit unsigned integer is needed. */
1324 uns_arith_operand (rtx op, enum machine_mode mode)
1326 if (GET_CODE (op) == CONST_INT && SMALL_INT_UNSIGNED (op))
1327 return 1;
1329 return register_operand (op, mode);
1333 /* True if OP can be treated as a signed 16-bit constant. */
1336 const_arith_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1338 return GET_CODE (op) == CONST_INT && SMALL_INT (op);
1342 /* Return true if OP is a register operand or a signed 16-bit constant. */
1345 arith_operand (rtx op, enum machine_mode mode)
1347 return const_arith_operand (op, mode) || register_operand (op, mode);
1350 /* Return truth value of whether OP is an integer which fits in 16 bits. */
1353 small_int (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1355 return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
1358 /* Return truth value of whether OP is a register or the constant 0.
1359 Do not accept 0 in mips16 mode since $0 is not one of the core 8
1360 registers. */
1363 reg_or_0_operand (rtx op, enum machine_mode mode)
1365 switch (GET_CODE (op))
1367 case CONST_INT:
1368 if (TARGET_MIPS16)
1369 return 0;
1370 return INTVAL (op) == 0;
1372 case CONST_DOUBLE:
1373 if (TARGET_MIPS16)
1374 return 0;
1375 return op == CONST0_RTX (mode);
1377 default:
1378 return register_operand (op, mode);
1382 /* Accept a register or the floating point constant 1 in the
1383 appropriate mode. */
1386 reg_or_const_float_1_operand (rtx op, enum machine_mode mode)
1388 return const_float_1_operand (op, mode) || register_operand (op, mode);
1391 /* Accept the floating point constant 1 in the appropriate mode. */
1394 const_float_1_operand (rtx op, enum machine_mode mode)
1396 REAL_VALUE_TYPE d;
1398 if (GET_CODE (op) != CONST_DOUBLE
1399 || mode != GET_MODE (op)
1400 || (mode != DFmode && mode != SFmode))
1401 return 0;
1403 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
1405 return REAL_VALUES_EQUAL (d, dconst1);
1408 /* Return true if OP is either the HI or LO register. */
1411 hilo_operand (rtx op, enum machine_mode mode)
1413 return ((mode == VOIDmode || mode == GET_MODE (op))
1414 && REG_P (op) && MD_REG_P (REGNO (op)));
1417 /* Return true if OP is an extension operator. */
1420 extend_operator (rtx op, enum machine_mode mode)
1422 return ((mode == VOIDmode || mode == GET_MODE (op))
1423 && (GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND));
1426 /* Return true if X is the right hand side of a "macc" or "msac" instruction.
1427 This predicate is intended for use in peephole optimizations. */
1430 macc_msac_operand (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
1432 if (ISA_HAS_MACC && GET_CODE (x) == PLUS && REG_P (XEXP (x, 1)))
1433 x = XEXP (x, 0);
1434 else if (ISA_HAS_MSAC && GET_CODE (x) == MINUS && REG_P (XEXP (x, 0)))
1435 x = XEXP (x, 1);
1436 else
1437 return false;
1439 return GET_CODE (x) == MULT && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1));
1442 /* Return nonzero if the code of this rtx pattern is EQ or NE. */
1445 equality_op (rtx op, enum machine_mode mode)
1447 if (mode != GET_MODE (op))
1448 return 0;
1450 return GET_CODE (op) == EQ || GET_CODE (op) == NE;
1453 /* Return nonzero if the code is a relational operations (EQ, LE, etc.) */
1456 cmp_op (rtx op, enum machine_mode mode)
1458 if (mode != GET_MODE (op))
1459 return 0;
1461 return COMPARISON_P (op);
1464 /* Return nonzero if the code is a relational operation suitable for a
1465 conditional trap instruction (only EQ, NE, LT, LTU, GE, GEU).
1466 We need this in the insn that expands `trap_if' in order to prevent
1467 combine from erroneously altering the condition. */
1470 trap_cmp_op (rtx op, enum machine_mode mode)
1472 if (mode != GET_MODE (op))
1473 return 0;
1475 switch (GET_CODE (op))
1477 case EQ:
1478 case NE:
1479 case LT:
1480 case LTU:
1481 case GE:
1482 case GEU:
1483 return 1;
1485 default:
1486 return 0;
1490 /* Return nonzero if the operand is either the PC or a label_ref. */
1493 pc_or_label_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1495 if (op == pc_rtx)
1496 return 1;
1498 if (GET_CODE (op) == LABEL_REF)
1499 return 1;
1501 return 0;
1504 /* Test for a valid call address. */
1507 call_insn_operand (rtx op, enum machine_mode mode)
1509 enum mips_symbol_type symbol_type;
1511 if (mips_symbolic_constant_p (op, &symbol_type))
1512 switch (symbol_type)
1514 case SYMBOL_GENERAL:
1515 /* If -mlong-calls, force all calls to use register addressing. */
1516 return !TARGET_LONG_CALLS;
1518 case SYMBOL_GOT_GLOBAL:
1519 /* Without explicit relocs, there is no special syntax for
1520 loading the address of a call destination into a register.
1521 Using "la $25,foo; jal $25" would prevent the lazy binding
1522 of "foo", so keep the address of global symbols with the
1523 jal macro. */
1524 return !TARGET_EXPLICIT_RELOCS;
1526 default:
1527 return false;
1529 return register_operand (op, mode);
1533 /* Return nonzero if OP is valid as a source operand for a move
1534 instruction. */
1537 move_operand (rtx op, enum machine_mode mode)
1539 enum mips_symbol_type symbol_type;
1541 if (!general_operand (op, mode))
1542 return false;
1544 switch (GET_CODE (op))
1546 case CONST_INT:
1547 /* When generating mips16 code, LEGITIMATE_CONSTANT_P rejects
1548 CONST_INTs that can't be loaded using simple insns. */
1549 if (TARGET_MIPS16)
1550 return true;
1552 /* When generating 32-bit code, allow DImode move_operands to
1553 match arbitrary constants. We split them after reload. */
1554 if (!TARGET_64BIT && mode == DImode)
1555 return true;
1557 /* Otherwise check whether the constant can be loaded in a single
1558 instruction. */
1559 return LUI_INT (op) || SMALL_INT (op) || SMALL_INT_UNSIGNED (op);
1561 case CONST:
1562 case SYMBOL_REF:
1563 case LABEL_REF:
1564 if (CONST_GP_P (op))
1565 return true;
1567 return (mips_symbolic_constant_p (op, &symbol_type)
1568 && !mips_split_p[symbol_type]);
1570 default:
1571 return true;
1576 /* Accept any operand that can appear in a mips16 constant table
1577 instruction. We can't use any of the standard operand functions
1578 because for these instructions we accept values that are not
1579 accepted by LEGITIMATE_CONSTANT, such as arbitrary SYMBOL_REFs. */
1582 consttable_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1584 return CONSTANT_P (op);
1587 /* Return 1 if OP is a symbolic operand, i.e. a symbol_ref or a label_ref,
1588 possibly with an offset. */
1591 symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1593 enum mips_symbol_type symbol_type;
1595 return mips_symbolic_constant_p (op, &symbol_type);
1599 /* Return true if OP is a symbolic constant of type SYMBOL_GENERAL. */
1602 general_symbolic_operand (rtx op, enum machine_mode mode)
1604 enum mips_symbol_type symbol_type;
1606 return ((mode == VOIDmode || mode == GET_MODE (op))
1607 && mips_symbolic_constant_p (op, &symbol_type)
1608 && symbol_type == SYMBOL_GENERAL);
1612 /* Return true if we're generating PIC and OP is a global symbol. */
1615 global_got_operand (rtx op, enum machine_mode mode)
1617 enum mips_symbol_type symbol_type;
1619 return ((mode == VOIDmode || mode == GET_MODE (op))
1620 && mips_symbolic_constant_p (op, &symbol_type)
1621 && symbol_type == SYMBOL_GOT_GLOBAL);
1625 /* Likewise for local symbols. */
1628 local_got_operand (rtx op, enum machine_mode mode)
1630 enum mips_symbol_type symbol_type;
1632 return ((mode == VOIDmode || mode == GET_MODE (op))
1633 && mips_symbolic_constant_p (op, &symbol_type)
1634 && symbol_type == SYMBOL_GOT_LOCAL);
1638 /* Return true if OP is a memory reference that uses the stack pointer
1639 as a base register. */
1642 stack_operand (rtx op, enum machine_mode mode)
1644 struct mips_address_info addr;
1646 return ((mode == VOIDmode || mode == GET_MODE (op))
1647 && GET_CODE (op) == MEM
1648 && mips_classify_address (&addr, XEXP (op, 0), GET_MODE (op), false)
1649 && addr.type == ADDRESS_REG
1650 && addr.reg == stack_pointer_rtx);
1653 /* Helper function for DFA schedulers. Return true if OP is a floating
1654 point register. */
1657 fp_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1659 return REG_P (op) && FP_REG_P (REGNO (op));
1662 /* Helper function for DFA schedulers. Return true if OP is a LO reg. */
1665 lo_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1667 return REG_P (op) && REGNO (op) == LO_REGNUM;
1671 /* This function is used to implement GO_IF_LEGITIMATE_ADDRESS. It
1672 returns a nonzero value if X is a legitimate address for a memory
1673 operand of the indicated MODE. STRICT is nonzero if this function
1674 is called during reload. */
1676 bool
1677 mips_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
1679 struct mips_address_info addr;
1681 return mips_classify_address (&addr, x, mode, strict);
1685 /* Copy VALUE to a register and return that register. If new psuedos
1686 are allowed, copy it into a new register, otherwise use DEST. */
1688 static rtx
1689 mips_force_temporary (rtx dest, rtx value)
1691 if (!no_new_pseudos)
1692 return force_reg (Pmode, value);
1693 else
1695 emit_move_insn (copy_rtx (dest), value);
1696 return dest;
1701 /* Return a LO_SUM expression for ADDR. TEMP is as for mips_force_temporary
1702 and is used to load the high part into a register. */
1704 static rtx
1705 mips_split_symbol (rtx temp, rtx addr)
1707 rtx high;
1709 if (TARGET_MIPS16)
1710 high = mips16_gp_pseudo_reg ();
1711 else
1712 high = mips_force_temporary (temp, gen_rtx_HIGH (Pmode, copy_rtx (addr)));
1713 return gen_rtx_LO_SUM (Pmode, high, addr);
1717 /* Return an UNSPEC address with underlying address ADDRESS and symbol
1718 type SYMBOL_TYPE. */
1721 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
1723 rtx base;
1724 HOST_WIDE_INT offset;
1726 mips_split_const (address, &base, &offset);
1727 base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
1728 UNSPEC_ADDRESS_FIRST + symbol_type);
1729 return plus_constant (gen_rtx_CONST (Pmode, base), offset);
1733 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
1734 high part to BASE and return the result. Just return BASE otherwise.
1735 TEMP is available as a temporary register if needed.
1737 The returned expression can be used as the first operand to a LO_SUM. */
1739 static rtx
1740 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
1741 enum mips_symbol_type symbol_type)
1743 if (mips_split_p[symbol_type])
1745 addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
1746 addr = mips_force_temporary (temp, addr);
1747 return mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
1749 return base;
1753 /* Return a legitimate address for REG + OFFSET. This function will
1754 create a temporary register if OFFSET is not a SMALL_OPERAND. */
1756 static rtx
1757 mips_add_offset (rtx reg, HOST_WIDE_INT offset)
1759 if (!SMALL_OPERAND (offset))
1760 reg = expand_simple_binop (GET_MODE (reg), PLUS,
1761 GEN_INT (CONST_HIGH_PART (offset)),
1762 reg, NULL, 0, OPTAB_WIDEN);
1764 return plus_constant (reg, CONST_LOW_PART (offset));
1768 /* This function is used to implement LEGITIMIZE_ADDRESS. If *XLOC can
1769 be legitimized in a way that the generic machinery might not expect,
1770 put the new address in *XLOC and return true. MODE is the mode of
1771 the memory being accessed. */
1773 bool
1774 mips_legitimize_address (rtx *xloc, enum machine_mode mode)
1776 enum mips_symbol_type symbol_type;
1778 /* See if the address can split into a high part and a LO_SUM. */
1779 if (mips_symbolic_constant_p (*xloc, &symbol_type)
1780 && mips_symbolic_address_p (symbol_type, mode)
1781 && mips_split_p[symbol_type])
1783 *xloc = mips_split_symbol (0, *xloc);
1784 return true;
1787 if (GET_CODE (*xloc) == PLUS && GET_CODE (XEXP (*xloc, 1)) == CONST_INT)
1789 /* Handle REG + CONSTANT using mips_add_offset. */
1790 rtx reg;
1792 reg = XEXP (*xloc, 0);
1793 if (!mips_valid_base_register_p (reg, mode, 0))
1794 reg = copy_to_mode_reg (Pmode, reg);
1795 *xloc = mips_add_offset (reg, INTVAL (XEXP (*xloc, 1)));
1796 return true;
1799 return false;
1803 /* Subroutine of mips_build_integer (with the same interface).
1804 Assume that the final action in the sequence should be a left shift. */
1806 static unsigned int
1807 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1809 unsigned int i, shift;
1811 /* Shift VALUE right until its lowest bit is set. Shift arithmetically
1812 since signed numbers are easier to load than unsigned ones. */
1813 shift = 0;
1814 while ((value & 1) == 0)
1815 value /= 2, shift++;
1817 i = mips_build_integer (codes, value);
1818 codes[i].code = ASHIFT;
1819 codes[i].value = shift;
1820 return i + 1;
1824 /* As for mips_build_shift, but assume that the final action will be
1825 an IOR or PLUS operation. */
1827 static unsigned int
1828 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1830 unsigned HOST_WIDE_INT high;
1831 unsigned int i;
1833 high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1834 if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1836 /* The constant is too complex to load with a simple lui/ori pair
1837 so our goal is to clear as many trailing zeros as possible.
1838 In this case, we know bit 16 is set and that the low 16 bits
1839 form a negative number. If we subtract that number from VALUE,
1840 we will clear at least the lowest 17 bits, maybe more. */
1841 i = mips_build_integer (codes, CONST_HIGH_PART (value));
1842 codes[i].code = PLUS;
1843 codes[i].value = CONST_LOW_PART (value);
1845 else
1847 i = mips_build_integer (codes, high);
1848 codes[i].code = IOR;
1849 codes[i].value = value & 0xffff;
1851 return i + 1;
1855 /* Fill CODES with a sequence of rtl operations to load VALUE.
1856 Return the number of operations needed. */
1858 static unsigned int
1859 mips_build_integer (struct mips_integer_op *codes,
1860 unsigned HOST_WIDE_INT value)
1862 if (SMALL_OPERAND (value)
1863 || SMALL_OPERAND_UNSIGNED (value)
1864 || LUI_OPERAND (value))
1866 /* The value can be loaded with a single instruction. */
1867 codes[0].code = NIL;
1868 codes[0].value = value;
1869 return 1;
1871 else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1873 /* Either the constant is a simple LUI/ORI combination or its
1874 lowest bit is set. We don't want to shift in this case. */
1875 return mips_build_lower (codes, value);
1877 else if ((value & 0xffff) == 0)
1879 /* The constant will need at least three actions. The lowest
1880 16 bits are clear, so the final action will be a shift. */
1881 return mips_build_shift (codes, value);
1883 else
1885 /* The final action could be a shift, add or inclusive OR.
1886 Rather than use a complex condition to select the best
1887 approach, try both mips_build_shift and mips_build_lower
1888 and pick the one that gives the shortest sequence.
1889 Note that this case is only used once per constant. */
1890 struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1891 unsigned int cost, alt_cost;
1893 cost = mips_build_shift (codes, value);
1894 alt_cost = mips_build_lower (alt_codes, value);
1895 if (alt_cost < cost)
1897 memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1898 cost = alt_cost;
1900 return cost;
1905 /* Move VALUE into register DEST. */
1907 static void
1908 mips_move_integer (rtx dest, unsigned HOST_WIDE_INT value)
1910 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
1911 enum machine_mode mode;
1912 unsigned int i, cost;
1913 rtx x;
1915 mode = GET_MODE (dest);
1916 cost = mips_build_integer (codes, value);
1918 /* Apply each binary operation to X. Invariant: X is a legitimate
1919 source operand for a SET pattern. */
1920 x = GEN_INT (codes[0].value);
1921 for (i = 1; i < cost; i++)
1923 if (no_new_pseudos)
1924 emit_move_insn (dest, x), x = dest;
1925 else
1926 x = force_reg (mode, x);
1927 x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
1930 emit_insn (gen_rtx_SET (VOIDmode, dest, x));
1934 /* Subroutine of mips_legitimize_move. Move constant SRC into register
1935 DEST given that SRC satisfies immediate_operand but doesn't satisfy
1936 move_operand. */
1938 static void
1939 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
1941 rtx base;
1942 HOST_WIDE_INT offset;
1943 enum mips_symbol_type symbol_type;
1945 /* Split moves of big integers into smaller pieces. In mips16 code,
1946 it's better to force the constant into memory instead. */
1947 if (GET_CODE (src) == CONST_INT && !TARGET_MIPS16)
1949 mips_move_integer (dest, INTVAL (src));
1950 return;
1953 /* See if the symbol can be split. For mips16, this is often worse than
1954 forcing it in the constant pool since it needs the single-register form
1955 of addiu or daddiu. */
1956 if (!TARGET_MIPS16
1957 && mips_symbolic_constant_p (src, &symbol_type)
1958 && mips_split_p[symbol_type])
1960 emit_move_insn (dest, mips_split_symbol (dest, src));
1961 return;
1964 /* If we have (const (plus symbol offset)), load the symbol first
1965 and then add in the offset. This is usually better than forcing
1966 the constant into memory, at least in non-mips16 code. */
1967 mips_split_const (src, &base, &offset);
1968 if (!TARGET_MIPS16
1969 && offset != 0
1970 && (!no_new_pseudos || SMALL_OPERAND (offset)))
1972 base = mips_force_temporary (dest, base);
1973 emit_move_insn (dest, mips_add_offset (base, offset));
1974 return;
1977 src = force_const_mem (mode, src);
1979 /* When using explicit relocs, constant pool references are sometimes
1980 not legitimate addresses. */
1981 if (!memory_operand (src, VOIDmode))
1982 src = replace_equiv_address (src, mips_split_symbol (dest, XEXP (src, 0)));
1983 emit_move_insn (dest, src);
1987 /* If (set DEST SRC) is not a valid instruction, emit an equivalent
1988 sequence that is valid. */
1990 bool
1991 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
1993 if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
1995 emit_move_insn (dest, force_reg (mode, src));
1996 return true;
1999 /* Check for individual, fully-reloaded mflo and mfhi instructions. */
2000 if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
2001 && REG_P (src) && MD_REG_P (REGNO (src))
2002 && REG_P (dest) && GP_REG_P (REGNO (dest)))
2004 int other_regno = REGNO (src) == HI_REGNUM ? LO_REGNUM : HI_REGNUM;
2005 if (GET_MODE_SIZE (mode) <= 4)
2006 emit_insn (gen_mfhilo_si (gen_rtx_REG (SImode, REGNO (dest)),
2007 gen_rtx_REG (SImode, REGNO (src)),
2008 gen_rtx_REG (SImode, other_regno)));
2009 else
2010 emit_insn (gen_mfhilo_di (gen_rtx_REG (DImode, REGNO (dest)),
2011 gen_rtx_REG (DImode, REGNO (src)),
2012 gen_rtx_REG (DImode, other_regno)));
2013 return true;
2016 /* We need to deal with constants that would be legitimate
2017 immediate_operands but not legitimate move_operands. */
2018 if (CONSTANT_P (src) && !move_operand (src, mode))
2020 mips_legitimize_const_move (mode, dest, src);
2021 set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
2022 return true;
2024 return false;
2027 /* We need a lot of little routines to check constant values on the
2028 mips16. These are used to figure out how long the instruction will
2029 be. It would be much better to do this using constraints, but
2030 there aren't nearly enough letters available. */
2032 static int
2033 m16_check_op (rtx op, int low, int high, int mask)
2035 return (GET_CODE (op) == CONST_INT
2036 && INTVAL (op) >= low
2037 && INTVAL (op) <= high
2038 && (INTVAL (op) & mask) == 0);
2042 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2044 return m16_check_op (op, 0x1, 0x8, 0);
2048 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2050 return m16_check_op (op, - 0x8, 0x7, 0);
2054 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2056 return m16_check_op (op, - 0x7, 0x8, 0);
2060 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2062 return m16_check_op (op, - 0x10, 0xf, 0);
2066 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2068 return m16_check_op (op, - 0xf, 0x10, 0);
2072 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2074 return m16_check_op (op, (- 0x10) << 2, 0xf << 2, 3);
2078 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2080 return m16_check_op (op, (- 0xf) << 2, 0x10 << 2, 3);
2084 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2086 return m16_check_op (op, - 0x80, 0x7f, 0);
2090 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2092 return m16_check_op (op, - 0x7f, 0x80, 0);
2096 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2098 return m16_check_op (op, 0x0, 0xff, 0);
2102 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2104 return m16_check_op (op, - 0xff, 0x0, 0);
2108 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2110 return m16_check_op (op, - 0x1, 0xfe, 0);
2114 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2116 return m16_check_op (op, 0x0, 0xff << 2, 3);
2120 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2122 return m16_check_op (op, (- 0xff) << 2, 0x0, 3);
2126 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2128 return m16_check_op (op, (- 0x80) << 3, 0x7f << 3, 7);
2132 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2134 return m16_check_op (op, (- 0x7f) << 3, 0x80 << 3, 7);
2137 static bool
2138 mips_rtx_costs (rtx x, int code, int outer_code, int *total)
2140 enum machine_mode mode = GET_MODE (x);
2142 switch (code)
2144 case CONST_INT:
2145 if (!TARGET_MIPS16)
2147 /* Always return 0, since we don't have different sized
2148 instructions, hence different costs according to Richard
2149 Kenner */
2150 *total = 0;
2151 return true;
2154 /* A number between 1 and 8 inclusive is efficient for a shift.
2155 Otherwise, we will need an extended instruction. */
2156 if ((outer_code) == ASHIFT || (outer_code) == ASHIFTRT
2157 || (outer_code) == LSHIFTRT)
2159 if (INTVAL (x) >= 1 && INTVAL (x) <= 8)
2160 *total = 0;
2161 else
2162 *total = COSTS_N_INSNS (1);
2163 return true;
2166 /* We can use cmpi for an xor with an unsigned 16 bit value. */
2167 if ((outer_code) == XOR
2168 && INTVAL (x) >= 0 && INTVAL (x) < 0x10000)
2170 *total = 0;
2171 return true;
2174 /* We may be able to use slt or sltu for a comparison with a
2175 signed 16 bit value. (The boundary conditions aren't quite
2176 right, but this is just a heuristic anyhow.) */
2177 if (((outer_code) == LT || (outer_code) == LE
2178 || (outer_code) == GE || (outer_code) == GT
2179 || (outer_code) == LTU || (outer_code) == LEU
2180 || (outer_code) == GEU || (outer_code) == GTU)
2181 && INTVAL (x) >= -0x8000 && INTVAL (x) < 0x8000)
2183 *total = 0;
2184 return true;
2187 /* Equality comparisons with 0 are cheap. */
2188 if (((outer_code) == EQ || (outer_code) == NE)
2189 && INTVAL (x) == 0)
2191 *total = 0;
2192 return true;
2195 /* Otherwise fall through to the handling below. */
2197 case CONST:
2198 case SYMBOL_REF:
2199 case LABEL_REF:
2200 case CONST_DOUBLE:
2201 if (LEGITIMATE_CONSTANT_P (x))
2203 *total = COSTS_N_INSNS (1);
2204 return true;
2206 else
2208 /* The value will need to be fetched from the constant pool. */
2209 *total = CONSTANT_POOL_COST;
2210 return true;
2213 case MEM:
2215 /* If the address is legitimate, return the number of
2216 instructions it needs, otherwise use the default handling. */
2217 int n = mips_address_insns (XEXP (x, 0), GET_MODE (x));
2218 if (n > 0)
2220 *total = COSTS_N_INSNS (1 + n);
2221 return true;
2223 return false;
2226 case FFS:
2227 *total = COSTS_N_INSNS (6);
2228 return true;
2230 case NOT:
2231 *total = COSTS_N_INSNS ((mode == DImode && !TARGET_64BIT) ? 2 : 1);
2232 return true;
2234 case AND:
2235 case IOR:
2236 case XOR:
2237 if (mode == DImode && !TARGET_64BIT)
2239 *total = COSTS_N_INSNS (2);
2240 return true;
2242 return false;
2244 case ASHIFT:
2245 case ASHIFTRT:
2246 case LSHIFTRT:
2247 if (mode == DImode && !TARGET_64BIT)
2249 *total = COSTS_N_INSNS ((GET_CODE (XEXP (x, 1)) == CONST_INT)
2250 ? 4 : 12);
2251 return true;
2253 return false;
2255 case ABS:
2256 if (mode == SFmode || mode == DFmode)
2257 *total = COSTS_N_INSNS (1);
2258 else
2259 *total = COSTS_N_INSNS (4);
2260 return true;
2262 case LO_SUM:
2263 *total = COSTS_N_INSNS (1);
2264 return true;
2266 case PLUS:
2267 case MINUS:
2268 if (mode == SFmode || mode == DFmode)
2270 if (TUNE_MIPS3000 || TUNE_MIPS3900)
2271 *total = COSTS_N_INSNS (2);
2272 else if (TUNE_MIPS6000)
2273 *total = COSTS_N_INSNS (3);
2274 else if (TUNE_SB1)
2275 *total = COSTS_N_INSNS (4);
2276 else
2277 *total = COSTS_N_INSNS (6);
2278 return true;
2280 if (mode == DImode && !TARGET_64BIT)
2282 *total = COSTS_N_INSNS (4);
2283 return true;
2285 return false;
2287 case NEG:
2288 if (mode == DImode && !TARGET_64BIT)
2290 *total = 4;
2291 return true;
2293 return false;
2295 case MULT:
2296 if (mode == SFmode)
2298 if (TUNE_MIPS3000
2299 || TUNE_MIPS3900
2300 || TUNE_MIPS5000
2301 || TUNE_SB1)
2302 *total = COSTS_N_INSNS (4);
2303 else if (TUNE_MIPS6000
2304 || TUNE_MIPS5400
2305 || TUNE_MIPS5500)
2306 *total = COSTS_N_INSNS (5);
2307 else
2308 *total = COSTS_N_INSNS (7);
2309 return true;
2312 if (mode == DFmode)
2314 if (TUNE_SB1)
2315 *total = COSTS_N_INSNS (4);
2316 else if (TUNE_MIPS3000
2317 || TUNE_MIPS3900
2318 || TUNE_MIPS5000)
2319 *total = COSTS_N_INSNS (5);
2320 else if (TUNE_MIPS6000
2321 || TUNE_MIPS5400
2322 || TUNE_MIPS5500)
2323 *total = COSTS_N_INSNS (6);
2324 else
2325 *total = COSTS_N_INSNS (8);
2326 return true;
2329 if (TUNE_MIPS3000)
2330 *total = COSTS_N_INSNS (12);
2331 else if (TUNE_MIPS3900)
2332 *total = COSTS_N_INSNS (2);
2333 else if (TUNE_MIPS4130)
2334 *total = COSTS_N_INSNS (mode == DImode ? 6 : 4);
2335 else if (TUNE_MIPS5400 || TUNE_SB1)
2336 *total = COSTS_N_INSNS (mode == DImode ? 4 : 3);
2337 else if (TUNE_MIPS5500 || TUNE_MIPS7000)
2338 *total = COSTS_N_INSNS (mode == DImode ? 9 : 5);
2339 else if (TUNE_MIPS9000)
2340 *total = COSTS_N_INSNS (mode == DImode ? 8 : 3);
2341 else if (TUNE_MIPS6000)
2342 *total = COSTS_N_INSNS (17);
2343 else if (TUNE_MIPS5000)
2344 *total = COSTS_N_INSNS (5);
2345 else
2346 *total = COSTS_N_INSNS (10);
2347 return true;
2349 case DIV:
2350 case MOD:
2351 if (mode == SFmode)
2353 if (TUNE_MIPS3000
2354 || TUNE_MIPS3900)
2355 *total = COSTS_N_INSNS (12);
2356 else if (TUNE_MIPS6000)
2357 *total = COSTS_N_INSNS (15);
2358 else if (TUNE_SB1)
2359 *total = COSTS_N_INSNS (24);
2360 else if (TUNE_MIPS5400 || TUNE_MIPS5500)
2361 *total = COSTS_N_INSNS (30);
2362 else
2363 *total = COSTS_N_INSNS (23);
2364 return true;
2367 if (mode == DFmode)
2369 if (TUNE_MIPS3000
2370 || TUNE_MIPS3900)
2371 *total = COSTS_N_INSNS (19);
2372 else if (TUNE_MIPS5400 || TUNE_MIPS5500)
2373 *total = COSTS_N_INSNS (59);
2374 else if (TUNE_MIPS6000)
2375 *total = COSTS_N_INSNS (16);
2376 else if (TUNE_SB1)
2377 *total = COSTS_N_INSNS (32);
2378 else
2379 *total = COSTS_N_INSNS (36);
2380 return true;
2382 /* Fall through. */
2384 case UDIV:
2385 case UMOD:
2386 if (TUNE_MIPS3000
2387 || TUNE_MIPS3900)
2388 *total = COSTS_N_INSNS (35);
2389 else if (TUNE_MIPS6000)
2390 *total = COSTS_N_INSNS (38);
2391 else if (TUNE_MIPS5000)
2392 *total = COSTS_N_INSNS (36);
2393 else if (TUNE_SB1)
2394 *total = COSTS_N_INSNS ((mode == SImode) ? 36 : 68);
2395 else if (TUNE_MIPS5400 || TUNE_MIPS5500)
2396 *total = COSTS_N_INSNS ((mode == SImode) ? 42 : 74);
2397 else
2398 *total = COSTS_N_INSNS (69);
2399 return true;
2401 case SIGN_EXTEND:
2402 /* A sign extend from SImode to DImode in 64 bit mode is often
2403 zero instructions, because the result can often be used
2404 directly by another instruction; we'll call it one. */
2405 if (TARGET_64BIT && mode == DImode
2406 && GET_MODE (XEXP (x, 0)) == SImode)
2407 *total = COSTS_N_INSNS (1);
2408 else
2409 *total = COSTS_N_INSNS (2);
2410 return true;
2412 case ZERO_EXTEND:
2413 if (TARGET_64BIT && mode == DImode
2414 && GET_MODE (XEXP (x, 0)) == SImode)
2415 *total = COSTS_N_INSNS (2);
2416 else
2417 *total = COSTS_N_INSNS (1);
2418 return true;
2420 default:
2421 return false;
2425 /* Provide the costs of an addressing mode that contains ADDR.
2426 If ADDR is not a valid address, its cost is irrelevant. */
2428 static int
2429 mips_address_cost (rtx addr)
2431 return mips_address_insns (addr, SImode);
2434 /* Return one word of double-word value OP, taking into account the fixed
2435 endianness of certain registers. HIGH_P is true to select the high part,
2436 false to select the low part. */
2439 mips_subword (rtx op, int high_p)
2441 unsigned int byte;
2442 enum machine_mode mode;
2444 mode = GET_MODE (op);
2445 if (mode == VOIDmode)
2446 mode = DImode;
2448 if (TARGET_BIG_ENDIAN ? !high_p : high_p)
2449 byte = UNITS_PER_WORD;
2450 else
2451 byte = 0;
2453 if (GET_CODE (op) == REG)
2455 if (FP_REG_P (REGNO (op)))
2456 return gen_rtx_REG (word_mode, high_p ? REGNO (op) + 1 : REGNO (op));
2457 if (REGNO (op) == HI_REGNUM)
2458 return gen_rtx_REG (word_mode, high_p ? HI_REGNUM : LO_REGNUM);
2461 if (GET_CODE (op) == MEM)
2462 return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
2464 return simplify_gen_subreg (word_mode, op, mode, byte);
2468 /* Return true if a 64-bit move from SRC to DEST should be split into two. */
2470 bool
2471 mips_split_64bit_move_p (rtx dest, rtx src)
2473 if (TARGET_64BIT)
2474 return false;
2476 /* FP->FP moves can be done in a single instruction. */
2477 if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
2478 return false;
2480 /* Check for floating-point loads and stores. They can be done using
2481 ldc1 and sdc1 on MIPS II and above. */
2482 if (mips_isa > 1)
2484 if (FP_REG_RTX_P (dest) && GET_CODE (src) == MEM)
2485 return false;
2486 if (FP_REG_RTX_P (src) && GET_CODE (dest) == MEM)
2487 return false;
2489 return true;
2493 /* Split a 64-bit move from SRC to DEST assuming that
2494 mips_split_64bit_move_p holds.
2496 Moves into and out of FPRs cause some difficulty here. Such moves
2497 will always be DFmode, since paired FPRs are not allowed to store
2498 DImode values. The most natural representation would be two separate
2499 32-bit moves, such as:
2501 (set (reg:SI $f0) (mem:SI ...))
2502 (set (reg:SI $f1) (mem:SI ...))
2504 However, the second insn is invalid because odd-numbered FPRs are
2505 not allowed to store independent values. Use the patterns load_df_low,
2506 load_df_high and store_df_high instead. */
2508 void
2509 mips_split_64bit_move (rtx dest, rtx src)
2511 if (FP_REG_RTX_P (dest))
2513 /* Loading an FPR from memory or from GPRs. */
2514 emit_insn (gen_load_df_low (copy_rtx (dest), mips_subword (src, 0)));
2515 emit_insn (gen_load_df_high (dest, mips_subword (src, 1),
2516 copy_rtx (dest)));
2518 else if (FP_REG_RTX_P (src))
2520 /* Storing an FPR into memory or GPRs. */
2521 emit_move_insn (mips_subword (dest, 0), mips_subword (src, 0));
2522 emit_insn (gen_store_df_high (mips_subword (dest, 1), src));
2524 else
2526 /* The operation can be split into two normal moves. Decide in
2527 which order to do them. */
2528 rtx low_dest;
2530 low_dest = mips_subword (dest, 0);
2531 if (GET_CODE (low_dest) == REG
2532 && reg_overlap_mentioned_p (low_dest, src))
2534 emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
2535 emit_move_insn (low_dest, mips_subword (src, 0));
2537 else
2539 emit_move_insn (low_dest, mips_subword (src, 0));
2540 emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
2545 /* Return the appropriate instructions to move SRC into DEST. Assume
2546 that SRC is operand 1 and DEST is operand 0. */
2548 const char *
2549 mips_output_move (rtx dest, rtx src)
2551 enum rtx_code dest_code, src_code;
2552 bool dbl_p;
2554 dest_code = GET_CODE (dest);
2555 src_code = GET_CODE (src);
2556 dbl_p = (GET_MODE_SIZE (GET_MODE (dest)) == 8);
2558 if (dbl_p && mips_split_64bit_move_p (dest, src))
2559 return "#";
2561 if ((src_code == REG && GP_REG_P (REGNO (src)))
2562 || (!TARGET_MIPS16 && src == CONST0_RTX (GET_MODE (dest))))
2564 if (dest_code == REG)
2566 if (GP_REG_P (REGNO (dest)))
2567 return "move\t%0,%z1";
2569 if (MD_REG_P (REGNO (dest)))
2570 return "mt%0\t%z1";
2572 if (FP_REG_P (REGNO (dest)))
2573 return (dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0");
2575 if (ALL_COP_REG_P (REGNO (dest)))
2577 static char retval[] = "dmtc_\t%z1,%0";
2579 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
2580 return (dbl_p ? retval : retval + 1);
2583 if (dest_code == MEM)
2584 return (dbl_p ? "sd\t%z1,%0" : "sw\t%z1,%0");
2586 if (dest_code == REG && GP_REG_P (REGNO (dest)))
2588 if (src_code == REG)
2590 if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
2591 return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
2593 if (FP_REG_P (REGNO (src)))
2594 return (dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1");
2596 if (ALL_COP_REG_P (REGNO (src)))
2598 static char retval[] = "dmfc_\t%0,%1";
2600 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
2601 return (dbl_p ? retval : retval + 1);
2605 if (src_code == MEM)
2606 return (dbl_p ? "ld\t%0,%1" : "lw\t%0,%1");
2608 if (src_code == CONST_INT)
2610 /* Don't use the X format, because that will give out of
2611 range numbers for 64 bit hosts and 32 bit targets. */
2612 if (!TARGET_MIPS16)
2613 return "li\t%0,%1\t\t\t# %X1";
2615 if (INTVAL (src) >= 0 && INTVAL (src) <= 0xffff)
2616 return "li\t%0,%1";
2618 if (INTVAL (src) < 0 && INTVAL (src) >= -0xffff)
2619 return "li\t%0,%n1\n\tneg\t%0";
2622 if (src_code == HIGH)
2623 return "lui\t%0,%h1";
2625 if (CONST_GP_P (src))
2626 return "move\t%0,%1";
2628 if (symbolic_operand (src, VOIDmode))
2629 return (dbl_p ? "dla\t%0,%1" : "la\t%0,%1");
2631 if (src_code == REG && FP_REG_P (REGNO (src)))
2633 if (dest_code == REG && FP_REG_P (REGNO (dest)))
2634 return (dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1");
2636 if (dest_code == MEM)
2637 return (dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0");
2639 if (dest_code == REG && FP_REG_P (REGNO (dest)))
2641 if (src_code == MEM)
2642 return (dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1");
2644 if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
2646 static char retval[] = "l_c_\t%0,%1";
2648 retval[1] = (dbl_p ? 'd' : 'w');
2649 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
2650 return retval;
2652 if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
2654 static char retval[] = "s_c_\t%1,%0";
2656 retval[1] = (dbl_p ? 'd' : 'w');
2657 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
2658 return retval;
2660 abort ();
2663 /* Return an rtx for the gp save slot. Valid only when using o32 or
2664 o64 abicalls. */
2667 mips_gp_save_slot (void)
2669 rtx loc;
2671 if (!TARGET_ABICALLS || TARGET_NEWABI)
2672 abort ();
2674 if (frame_pointer_needed)
2675 loc = hard_frame_pointer_rtx;
2676 else
2677 loc = stack_pointer_rtx;
2678 loc = plus_constant (loc, current_function_outgoing_args_size);
2679 loc = gen_rtx_MEM (Pmode, loc);
2680 RTX_UNCHANGING_P (loc) = 1;
2681 return loc;
2684 /* Make normal rtx_code into something we can index from an array */
2686 static enum internal_test
2687 map_test_to_internal_test (enum rtx_code test_code)
2689 enum internal_test test = ITEST_MAX;
2691 switch (test_code)
2693 case EQ: test = ITEST_EQ; break;
2694 case NE: test = ITEST_NE; break;
2695 case GT: test = ITEST_GT; break;
2696 case GE: test = ITEST_GE; break;
2697 case LT: test = ITEST_LT; break;
2698 case LE: test = ITEST_LE; break;
2699 case GTU: test = ITEST_GTU; break;
2700 case GEU: test = ITEST_GEU; break;
2701 case LTU: test = ITEST_LTU; break;
2702 case LEU: test = ITEST_LEU; break;
2703 default: break;
2706 return test;
2710 /* Generate the code to compare two integer values. The return value is:
2711 (reg:SI xx) The pseudo register the comparison is in
2712 0 No register, generate a simple branch.
2714 ??? This is called with result nonzero by the Scond patterns in
2715 mips.md. These patterns are called with a target in the mode of
2716 the Scond instruction pattern. Since this must be a constant, we
2717 must use SImode. This means that if RESULT is nonzero, it will
2718 always be an SImode register, even if TARGET_64BIT is true. We
2719 cope with this by calling convert_move rather than emit_move_insn.
2720 This will sometimes lead to an unnecessary extension of the result;
2721 for example:
2723 long long
2724 foo (long long i)
2726 return i < 5;
2729 TEST_CODE is the rtx code for the comparison.
2730 CMP0 and CMP1 are the two operands to compare.
2731 RESULT is the register in which the result should be stored (null for
2732 branches).
2733 For branches, P_INVERT points to an integer that is nonzero on return
2734 if the branch should be inverted. */
2737 gen_int_relational (enum rtx_code test_code, rtx result, rtx cmp0,
2738 rtx cmp1, int *p_invert)
2740 struct cmp_info
2742 enum rtx_code test_code; /* code to use in instruction (LT vs. LTU) */
2743 int const_low; /* low bound of constant we can accept */
2744 int const_high; /* high bound of constant we can accept */
2745 int const_add; /* constant to add (convert LE -> LT) */
2746 int reverse_regs; /* reverse registers in test */
2747 int invert_const; /* != 0 if invert value if cmp1 is constant */
2748 int invert_reg; /* != 0 if invert value if cmp1 is register */
2749 int unsignedp; /* != 0 for unsigned comparisons. */
2752 static const struct cmp_info info[ (int)ITEST_MAX ] = {
2754 { XOR, 0, 65535, 0, 0, 0, 0, 0 }, /* EQ */
2755 { XOR, 0, 65535, 0, 0, 1, 1, 0 }, /* NE */
2756 { LT, -32769, 32766, 1, 1, 1, 0, 0 }, /* GT */
2757 { LT, -32768, 32767, 0, 0, 1, 1, 0 }, /* GE */
2758 { LT, -32768, 32767, 0, 0, 0, 0, 0 }, /* LT */
2759 { LT, -32769, 32766, 1, 1, 0, 1, 0 }, /* LE */
2760 { LTU, -32769, 32766, 1, 1, 1, 0, 1 }, /* GTU */
2761 { LTU, -32768, 32767, 0, 0, 1, 1, 1 }, /* GEU */
2762 { LTU, -32768, 32767, 0, 0, 0, 0, 1 }, /* LTU */
2763 { LTU, -32769, 32766, 1, 1, 0, 1, 1 }, /* LEU */
2766 enum internal_test test;
2767 enum machine_mode mode;
2768 const struct cmp_info *p_info;
2769 int branch_p;
2770 int eqne_p;
2771 int invert;
2772 rtx reg;
2773 rtx reg2;
2775 test = map_test_to_internal_test (test_code);
2776 if (test == ITEST_MAX)
2777 abort ();
2779 p_info = &info[(int) test];
2780 eqne_p = (p_info->test_code == XOR);
2782 mode = GET_MODE (cmp0);
2783 if (mode == VOIDmode)
2784 mode = GET_MODE (cmp1);
2786 /* Eliminate simple branches. */
2787 branch_p = (result == 0);
2788 if (branch_p)
2790 if (GET_CODE (cmp0) == REG || GET_CODE (cmp0) == SUBREG)
2792 /* Comparisons against zero are simple branches. */
2793 if (GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) == 0
2794 && (! TARGET_MIPS16 || eqne_p))
2795 return 0;
2797 /* Test for beq/bne. */
2798 if (eqne_p && ! TARGET_MIPS16)
2799 return 0;
2802 /* Allocate a pseudo to calculate the value in. */
2803 result = gen_reg_rtx (mode);
2806 /* Make sure we can handle any constants given to us. */
2807 if (GET_CODE (cmp0) == CONST_INT)
2808 cmp0 = force_reg (mode, cmp0);
2810 if (GET_CODE (cmp1) == CONST_INT)
2812 HOST_WIDE_INT value = INTVAL (cmp1);
2814 if (value < p_info->const_low
2815 || value > p_info->const_high
2816 /* ??? Why? And why wasn't the similar code below modified too? */
2817 || (TARGET_64BIT
2818 && HOST_BITS_PER_WIDE_INT < 64
2819 && p_info->const_add != 0
2820 && ((p_info->unsignedp
2821 ? ((unsigned HOST_WIDE_INT) (value + p_info->const_add)
2822 > (unsigned HOST_WIDE_INT) INTVAL (cmp1))
2823 : (value + p_info->const_add) > INTVAL (cmp1))
2824 != (p_info->const_add > 0))))
2825 cmp1 = force_reg (mode, cmp1);
2828 /* See if we need to invert the result. */
2829 invert = (GET_CODE (cmp1) == CONST_INT
2830 ? p_info->invert_const : p_info->invert_reg);
2832 if (p_invert != (int *)0)
2834 *p_invert = invert;
2835 invert = 0;
2838 /* Comparison to constants, may involve adding 1 to change a LT into LE.
2839 Comparison between two registers, may involve switching operands. */
2840 if (GET_CODE (cmp1) == CONST_INT)
2842 if (p_info->const_add != 0)
2844 HOST_WIDE_INT new = INTVAL (cmp1) + p_info->const_add;
2846 /* If modification of cmp1 caused overflow,
2847 we would get the wrong answer if we follow the usual path;
2848 thus, x > 0xffffffffU would turn into x > 0U. */
2849 if ((p_info->unsignedp
2850 ? (unsigned HOST_WIDE_INT) new >
2851 (unsigned HOST_WIDE_INT) INTVAL (cmp1)
2852 : new > INTVAL (cmp1))
2853 != (p_info->const_add > 0))
2855 /* This test is always true, but if INVERT is true then
2856 the result of the test needs to be inverted so 0 should
2857 be returned instead. */
2858 emit_move_insn (result, invert ? const0_rtx : const_true_rtx);
2859 return result;
2861 else
2862 cmp1 = GEN_INT (new);
2866 else if (p_info->reverse_regs)
2868 rtx temp = cmp0;
2869 cmp0 = cmp1;
2870 cmp1 = temp;
2873 if (test == ITEST_NE && GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) == 0)
2874 reg = cmp0;
2875 else
2877 reg = (invert || eqne_p) ? gen_reg_rtx (mode) : result;
2878 convert_move (reg, gen_rtx_fmt_ee (p_info->test_code,
2879 mode, cmp0, cmp1), 0);
2882 if (test == ITEST_NE)
2884 if (! TARGET_MIPS16)
2886 convert_move (result, gen_rtx_GTU (mode, reg, const0_rtx), 0);
2887 if (p_invert != NULL)
2888 *p_invert = 0;
2889 invert = 0;
2891 else
2893 reg2 = invert ? gen_reg_rtx (mode) : result;
2894 convert_move (reg2, gen_rtx_LTU (mode, reg, const1_rtx), 0);
2895 reg = reg2;
2899 else if (test == ITEST_EQ)
2901 reg2 = invert ? gen_reg_rtx (mode) : result;
2902 convert_move (reg2, gen_rtx_LTU (mode, reg, const1_rtx), 0);
2903 reg = reg2;
2906 if (invert)
2908 rtx one;
2910 if (! TARGET_MIPS16)
2911 one = const1_rtx;
2912 else
2914 /* The value is in $24. Copy it to another register, so
2915 that reload doesn't think it needs to store the $24 and
2916 the input to the XOR in the same location. */
2917 reg2 = gen_reg_rtx (mode);
2918 emit_move_insn (reg2, reg);
2919 reg = reg2;
2920 one = force_reg (mode, const1_rtx);
2922 convert_move (result, gen_rtx_XOR (mode, reg, one), 0);
2925 return result;
2928 /* Work out how to check a floating-point condition. We need a
2929 separate comparison instruction (C.cond.fmt), followed by a
2930 branch or conditional move. Given that IN_CODE is the
2931 required condition, set *CMP_CODE to the C.cond.fmt code
2932 and *action_code to the branch or move code. */
2934 static void
2935 get_float_compare_codes (enum rtx_code in_code, enum rtx_code *cmp_code,
2936 enum rtx_code *action_code)
2938 switch (in_code)
2940 case NE:
2941 case UNGE:
2942 case UNGT:
2943 case LTGT:
2944 case ORDERED:
2945 *cmp_code = reverse_condition_maybe_unordered (in_code);
2946 *action_code = EQ;
2947 break;
2949 default:
2950 *cmp_code = in_code;
2951 *action_code = NE;
2952 break;
2956 /* Emit the common code for doing conditional branches.
2957 operand[0] is the label to jump to.
2958 The comparison operands are saved away by cmp{si,di,sf,df}. */
2960 void
2961 gen_conditional_branch (rtx *operands, enum rtx_code test_code)
2963 enum cmp_type type = branch_type;
2964 rtx cmp0 = branch_cmp[0];
2965 rtx cmp1 = branch_cmp[1];
2966 enum machine_mode mode;
2967 enum rtx_code cmp_code;
2968 rtx reg;
2969 int invert;
2970 rtx label1, label2;
2972 switch (type)
2974 case CMP_SI:
2975 case CMP_DI:
2976 mode = type == CMP_SI ? SImode : DImode;
2977 invert = 0;
2978 reg = gen_int_relational (test_code, NULL_RTX, cmp0, cmp1, &invert);
2980 if (reg)
2982 cmp0 = reg;
2983 cmp1 = const0_rtx;
2984 test_code = NE;
2986 else if (GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) != 0)
2987 /* We don't want to build a comparison against a nonzero
2988 constant. */
2989 cmp1 = force_reg (mode, cmp1);
2991 break;
2993 case CMP_SF:
2994 case CMP_DF:
2995 if (! ISA_HAS_8CC)
2996 reg = gen_rtx_REG (CCmode, FPSW_REGNUM);
2997 else
2998 reg = gen_reg_rtx (CCmode);
3000 get_float_compare_codes (test_code, &cmp_code, &test_code);
3001 emit_insn (gen_rtx_SET (VOIDmode, reg,
3002 gen_rtx_fmt_ee (cmp_code, CCmode, cmp0, cmp1)));
3004 mode = CCmode;
3005 cmp0 = reg;
3006 cmp1 = const0_rtx;
3007 invert = 0;
3008 break;
3010 default:
3011 fatal_insn ("bad test",
3012 gen_rtx_fmt_ee (test_code, VOIDmode, cmp0, cmp1));
3015 /* Generate the branch. */
3017 label1 = gen_rtx_LABEL_REF (VOIDmode, operands[0]);
3018 label2 = pc_rtx;
3020 if (invert)
3022 label2 = label1;
3023 label1 = pc_rtx;
3026 emit_jump_insn
3027 (gen_rtx_SET (VOIDmode, pc_rtx,
3028 gen_rtx_IF_THEN_ELSE (VOIDmode,
3029 gen_rtx_fmt_ee (test_code, mode,
3030 cmp0, cmp1),
3031 label1, label2)));
3034 /* Emit the common code for conditional moves. OPERANDS is the array
3035 of operands passed to the conditional move define_expand. */
3037 void
3038 gen_conditional_move (rtx *operands)
3040 rtx op0 = branch_cmp[0];
3041 rtx op1 = branch_cmp[1];
3042 enum machine_mode mode = GET_MODE (branch_cmp[0]);
3043 enum rtx_code cmp_code = GET_CODE (operands[1]);
3044 enum rtx_code move_code = NE;
3045 enum machine_mode op_mode = GET_MODE (operands[0]);
3046 enum machine_mode cmp_mode;
3047 rtx cmp_reg;
3049 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
3051 switch (cmp_code)
3053 case EQ:
3054 cmp_code = XOR;
3055 move_code = EQ;
3056 break;
3057 case NE:
3058 cmp_code = XOR;
3059 break;
3060 case LT:
3061 break;
3062 case GE:
3063 cmp_code = LT;
3064 move_code = EQ;
3065 break;
3066 case GT:
3067 cmp_code = LT;
3068 op0 = force_reg (mode, branch_cmp[1]);
3069 op1 = branch_cmp[0];
3070 break;
3071 case LE:
3072 cmp_code = LT;
3073 op0 = force_reg (mode, branch_cmp[1]);
3074 op1 = branch_cmp[0];
3075 move_code = EQ;
3076 break;
3077 case LTU:
3078 break;
3079 case GEU:
3080 cmp_code = LTU;
3081 move_code = EQ;
3082 break;
3083 case GTU:
3084 cmp_code = LTU;
3085 op0 = force_reg (mode, branch_cmp[1]);
3086 op1 = branch_cmp[0];
3087 break;
3088 case LEU:
3089 cmp_code = LTU;
3090 op0 = force_reg (mode, branch_cmp[1]);
3091 op1 = branch_cmp[0];
3092 move_code = EQ;
3093 break;
3094 default:
3095 abort ();
3098 else
3099 get_float_compare_codes (cmp_code, &cmp_code, &move_code);
3101 if (mode == SImode || mode == DImode)
3102 cmp_mode = mode;
3103 else if (mode == SFmode || mode == DFmode)
3104 cmp_mode = CCmode;
3105 else
3106 abort ();
3108 cmp_reg = gen_reg_rtx (cmp_mode);
3109 emit_insn (gen_rtx_SET (cmp_mode, cmp_reg,
3110 gen_rtx_fmt_ee (cmp_code, cmp_mode, op0, op1)));
3112 emit_insn (gen_rtx_SET (op_mode, operands[0],
3113 gen_rtx_IF_THEN_ELSE (op_mode,
3114 gen_rtx_fmt_ee (move_code,
3115 VOIDmode,
3116 cmp_reg,
3117 const0_rtx),
3118 operands[2], operands[3])));
3121 /* Emit a conditional trap. OPERANDS is the array of operands passed to
3122 the conditional_trap expander. */
3124 void
3125 mips_gen_conditional_trap (rtx *operands)
3127 rtx op0, op1;
3128 enum rtx_code cmp_code = GET_CODE (operands[0]);
3129 enum machine_mode mode = GET_MODE (branch_cmp[0]);
3131 /* MIPS conditional trap machine instructions don't have GT or LE
3132 flavors, so we must invert the comparison and convert to LT and
3133 GE, respectively. */
3134 switch (cmp_code)
3136 case GT: cmp_code = LT; break;
3137 case LE: cmp_code = GE; break;
3138 case GTU: cmp_code = LTU; break;
3139 case LEU: cmp_code = GEU; break;
3140 default: break;
3142 if (cmp_code == GET_CODE (operands[0]))
3144 op0 = force_reg (mode, branch_cmp[0]);
3145 op1 = branch_cmp[1];
3147 else
3149 op0 = force_reg (mode, branch_cmp[1]);
3150 op1 = branch_cmp[0];
3152 if (GET_CODE (op1) == CONST_INT && ! SMALL_INT (op1))
3153 op1 = force_reg (mode, op1);
3155 emit_insn (gen_rtx_TRAP_IF (VOIDmode,
3156 gen_rtx_fmt_ee (cmp_code, GET_MODE (operands[0]),
3157 op0, op1),
3158 operands[1]));
3161 /* Load function address ADDR into register DEST. SIBCALL_P is true
3162 if the address is needed for a sibling call. */
3164 static void
3165 mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
3167 /* If we're generating PIC, and this call is to a global function,
3168 try to allow its address to be resolved lazily. This isn't
3169 possible for NewABI sibcalls since the value of $gp on entry
3170 to the stub would be our caller's gp, not ours. */
3171 if (TARGET_EXPLICIT_RELOCS
3172 && !(sibcall_p && TARGET_NEWABI)
3173 && global_got_operand (addr, VOIDmode))
3175 rtx high, lo_sum_symbol;
3177 high = mips_unspec_offset_high (dest, pic_offset_table_rtx,
3178 addr, SYMBOL_GOTOFF_CALL);
3179 lo_sum_symbol = mips_unspec_address (addr, SYMBOL_GOTOFF_CALL);
3180 if (Pmode == SImode)
3181 emit_insn (gen_load_callsi (dest, high, lo_sum_symbol));
3182 else
3183 emit_insn (gen_load_calldi (dest, high, lo_sum_symbol));
3185 else
3186 emit_move_insn (dest, addr);
3190 /* Expand a call or call_value instruction. RESULT is where the
3191 result will go (null for calls), ADDR is the address of the
3192 function, ARGS_SIZE is the size of the arguments and AUX is
3193 the value passed to us by mips_function_arg. SIBCALL_P is true
3194 if we are expanding a sibling call, false if we're expanding
3195 a normal call. */
3197 void
3198 mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p)
3200 rtx orig_addr, pattern, insn;
3202 orig_addr = addr;
3203 if (!call_insn_operand (addr, VOIDmode))
3205 addr = gen_reg_rtx (Pmode);
3206 mips_load_call_address (addr, orig_addr, sibcall_p);
3209 if (TARGET_MIPS16
3210 && mips16_hard_float
3211 && build_mips16_call_stub (result, addr, args_size,
3212 aux == 0 ? 0 : (int) GET_MODE (aux)))
3213 return;
3215 if (result == 0)
3216 pattern = (sibcall_p
3217 ? gen_sibcall_internal (addr, args_size)
3218 : gen_call_internal (addr, args_size));
3219 else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
3221 rtx reg1, reg2;
3223 reg1 = XEXP (XVECEXP (result, 0, 0), 0);
3224 reg2 = XEXP (XVECEXP (result, 0, 1), 0);
3225 pattern =
3226 (sibcall_p
3227 ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
3228 : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
3230 else
3231 pattern = (sibcall_p
3232 ? gen_sibcall_value_internal (result, addr, args_size)
3233 : gen_call_value_internal (result, addr, args_size));
3235 insn = emit_call_insn (pattern);
3237 /* Lazy-binding stubs require $gp to be valid on entry. */
3238 if (global_got_operand (orig_addr, VOIDmode))
3239 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
3243 /* We can handle any sibcall when TARGET_SIBCALLS is true. */
3245 static bool
3246 mips_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
3247 tree exp ATTRIBUTE_UNUSED)
3249 return TARGET_SIBCALLS;
3252 /* Return true if operand OP is a condition code register.
3253 Only for use during or after reload. */
3256 fcc_register_operand (rtx op, enum machine_mode mode)
3258 return ((mode == VOIDmode || mode == GET_MODE (op))
3259 && (reload_in_progress || reload_completed)
3260 && (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
3261 && ST_REG_P (true_regnum (op)));
3264 /* Emit code to move general operand SRC into condition-code
3265 register DEST. SCRATCH is a scratch TFmode float register.
3266 The sequence is:
3268 FP1 = SRC
3269 FP2 = 0.0f
3270 DEST = FP2 < FP1
3272 where FP1 and FP2 are single-precision float registers
3273 taken from SCRATCH. */
3275 void
3276 mips_emit_fcc_reload (rtx dest, rtx src, rtx scratch)
3278 rtx fp1, fp2;
3280 /* Change the source to SFmode. */
3281 if (GET_CODE (src) == MEM)
3282 src = adjust_address (src, SFmode, 0);
3283 else if (GET_CODE (src) == REG || GET_CODE (src) == SUBREG)
3284 src = gen_rtx_REG (SFmode, true_regnum (src));
3286 fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
3287 fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + FP_INC);
3289 emit_move_insn (copy_rtx (fp1), src);
3290 emit_move_insn (copy_rtx (fp2), CONST0_RTX (SFmode));
3291 emit_insn (gen_slt_sf (dest, fp2, fp1));
3294 /* Emit code to change the current function's return address to
3295 ADDRESS. SCRATCH is available as a scratch register, if needed.
3296 ADDRESS and SCRATCH are both word-mode GPRs. */
3298 void
3299 mips_set_return_address (rtx address, rtx scratch)
3301 HOST_WIDE_INT gp_offset;
3303 compute_frame_size (get_frame_size ());
3304 if (((cfun->machine->frame.mask >> 31) & 1) == 0)
3305 abort ();
3306 gp_offset = cfun->machine->frame.gp_sp_offset;
3308 /* Reduce SP + GP_OFSET to a legitimate address and put it in SCRATCH. */
3309 if (gp_offset < 32768)
3310 scratch = plus_constant (stack_pointer_rtx, gp_offset);
3311 else
3313 emit_move_insn (scratch, GEN_INT (gp_offset));
3314 if (Pmode == DImode)
3315 emit_insn (gen_adddi3 (scratch, scratch, stack_pointer_rtx));
3316 else
3317 emit_insn (gen_addsi3 (scratch, scratch, stack_pointer_rtx));
3320 emit_move_insn (gen_rtx_MEM (GET_MODE (address), scratch), address);
3323 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
3324 Assume that the areas do not overlap. */
3326 static void
3327 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
3329 HOST_WIDE_INT offset, delta;
3330 unsigned HOST_WIDE_INT bits;
3331 int i;
3332 enum machine_mode mode;
3333 rtx *regs;
3335 /* Work out how many bits to move at a time. If both operands have
3336 half-word alignment, it is usually better to move in half words.
3337 For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
3338 and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
3339 Otherwise move word-sized chunks. */
3340 if (MEM_ALIGN (src) == BITS_PER_WORD / 2
3341 && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
3342 bits = BITS_PER_WORD / 2;
3343 else
3344 bits = BITS_PER_WORD;
3346 mode = mode_for_size (bits, MODE_INT, 0);
3347 delta = bits / BITS_PER_UNIT;
3349 /* Allocate a buffer for the temporary registers. */
3350 regs = alloca (sizeof (rtx) * length / delta);
3352 /* Load as many BITS-sized chunks as possible. Use a normal load if
3353 the source has enough alignment, otherwise use left/right pairs. */
3354 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3356 regs[i] = gen_reg_rtx (mode);
3357 if (MEM_ALIGN (src) >= bits)
3358 emit_move_insn (regs[i], adjust_address (src, mode, offset));
3359 else
3361 rtx part = adjust_address (src, BLKmode, offset);
3362 if (!mips_expand_unaligned_load (regs[i], part, bits, 0))
3363 abort ();
3367 /* Copy the chunks to the destination. */
3368 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3369 if (MEM_ALIGN (dest) >= bits)
3370 emit_move_insn (adjust_address (dest, mode, offset), regs[i]);
3371 else
3373 rtx part = adjust_address (dest, BLKmode, offset);
3374 if (!mips_expand_unaligned_store (part, regs[i], bits, 0))
3375 abort ();
3378 /* Mop up any left-over bytes. */
3379 if (offset < length)
3381 src = adjust_address (src, BLKmode, offset);
3382 dest = adjust_address (dest, BLKmode, offset);
3383 move_by_pieces (dest, src, length - offset,
3384 MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
3388 #define MAX_MOVE_REGS 4
3389 #define MAX_MOVE_BYTES (MAX_MOVE_REGS * UNITS_PER_WORD)
3392 /* Helper function for doing a loop-based block operation on memory
3393 reference MEM. Each iteration of the loop will operate on LENGTH
3394 bytes of MEM.
3396 Create a new base register for use within the loop and point it to
3397 the start of MEM. Create a new memory reference that uses this
3398 register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
3400 static void
3401 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
3402 rtx *loop_reg, rtx *loop_mem)
3404 *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
3406 /* Although the new mem does not refer to a known location,
3407 it does keep up to LENGTH bytes of alignment. */
3408 *loop_mem = change_address (mem, BLKmode, *loop_reg);
3409 set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
3413 /* Move LENGTH bytes from SRC to DEST using a loop that moves MAX_MOVE_BYTES
3414 per iteration. LENGTH must be at least MAX_MOVE_BYTES. Assume that the
3415 memory regions do not overlap. */
3417 static void
3418 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length)
3420 rtx label, src_reg, dest_reg, final_src;
3421 HOST_WIDE_INT leftover;
3423 leftover = length % MAX_MOVE_BYTES;
3424 length -= leftover;
3426 /* Create registers and memory references for use within the loop. */
3427 mips_adjust_block_mem (src, MAX_MOVE_BYTES, &src_reg, &src);
3428 mips_adjust_block_mem (dest, MAX_MOVE_BYTES, &dest_reg, &dest);
3430 /* Calculate the value that SRC_REG should have after the last iteration
3431 of the loop. */
3432 final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
3433 0, 0, OPTAB_WIDEN);
3435 /* Emit the start of the loop. */
3436 label = gen_label_rtx ();
3437 emit_label (label);
3439 /* Emit the loop body. */
3440 mips_block_move_straight (dest, src, MAX_MOVE_BYTES);
3442 /* Move on to the next block. */
3443 emit_move_insn (src_reg, plus_constant (src_reg, MAX_MOVE_BYTES));
3444 emit_move_insn (dest_reg, plus_constant (dest_reg, MAX_MOVE_BYTES));
3446 /* Emit the loop condition. */
3447 if (Pmode == DImode)
3448 emit_insn (gen_cmpdi (src_reg, final_src));
3449 else
3450 emit_insn (gen_cmpsi (src_reg, final_src));
3451 emit_jump_insn (gen_bne (label));
3453 /* Mop up any left-over bytes. */
3454 if (leftover)
3455 mips_block_move_straight (dest, src, leftover);
3458 /* Expand a movmemsi instruction. */
3460 bool
3461 mips_expand_block_move (rtx dest, rtx src, rtx length)
3463 if (GET_CODE (length) == CONST_INT)
3465 if (INTVAL (length) <= 2 * MAX_MOVE_BYTES)
3467 mips_block_move_straight (dest, src, INTVAL (length));
3468 return true;
3470 else if (optimize)
3472 mips_block_move_loop (dest, src, INTVAL (length));
3473 return true;
3476 return false;
3479 /* Argument support functions. */
3481 /* Initialize CUMULATIVE_ARGS for a function. */
3483 void
3484 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
3485 rtx libname ATTRIBUTE_UNUSED)
3487 static CUMULATIVE_ARGS zero_cum;
3488 tree param, next_param;
3490 *cum = zero_cum;
3491 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
3493 /* Determine if this function has variable arguments. This is
3494 indicated by the last argument being 'void_type_mode' if there
3495 are no variable arguments. The standard MIPS calling sequence
3496 passes all arguments in the general purpose registers in this case. */
3498 for (param = fntype ? TYPE_ARG_TYPES (fntype) : 0;
3499 param != 0; param = next_param)
3501 next_param = TREE_CHAIN (param);
3502 if (next_param == 0 && TREE_VALUE (param) != void_type_node)
3503 cum->gp_reg_found = 1;
3508 /* Fill INFO with information about a single argument. CUM is the
3509 cumulative state for earlier arguments. MODE is the mode of this
3510 argument and TYPE is its type (if known). NAMED is true if this
3511 is a named (fixed) argument rather than a variable one. */
3513 static void
3514 mips_arg_info (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
3515 tree type, int named, struct mips_arg_info *info)
3517 bool even_reg_p;
3518 unsigned int num_words, max_regs;
3520 /* Decide whether this argument should go in a floating-point register,
3521 assuming one is free. Later code checks for availability. */
3523 info->fpr_p = (GET_MODE_CLASS (mode) == MODE_FLOAT
3524 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
3526 if (info->fpr_p)
3527 switch (mips_abi)
3529 case ABI_32:
3530 case ABI_O64:
3531 info->fpr_p = (!cum->gp_reg_found
3532 && cum->arg_number < 2
3533 && (type == 0 || FLOAT_TYPE_P (type)));
3534 break;
3536 case ABI_N32:
3537 case ABI_64:
3538 info->fpr_p = (named && (type == 0 || FLOAT_TYPE_P (type)));
3539 break;
3542 /* Now decide whether the argument must go in an even-numbered register. */
3544 even_reg_p = false;
3545 if (info->fpr_p)
3547 /* Under the O64 ABI, the second float argument goes in $f13 if it
3548 is a double, but $f14 if it is a single. Otherwise, on a
3549 32-bit double-float machine, each FP argument must start in a
3550 new register pair. */
3551 even_reg_p = (GET_MODE_SIZE (mode) > UNITS_PER_HWFPVALUE
3552 || (mips_abi == ABI_O64 && mode == SFmode)
3553 || FP_INC > 1);
3555 else if (!TARGET_64BIT || LONG_DOUBLE_TYPE_SIZE == 128)
3557 if (GET_MODE_CLASS (mode) == MODE_INT
3558 || GET_MODE_CLASS (mode) == MODE_FLOAT)
3559 even_reg_p = (GET_MODE_SIZE (mode) > UNITS_PER_WORD);
3561 else if (type != NULL_TREE && TYPE_ALIGN (type) > BITS_PER_WORD)
3562 even_reg_p = true;
3565 /* Set REG_OFFSET to the register count we're interested in.
3566 The EABI allocates the floating-point registers separately,
3567 but the other ABIs allocate them like integer registers. */
3568 info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
3569 ? cum->num_fprs
3570 : cum->num_gprs);
3572 if (even_reg_p)
3573 info->reg_offset += info->reg_offset & 1;
3575 /* The alignment applied to registers is also applied to stack arguments. */
3576 info->stack_offset = cum->stack_words;
3577 if (even_reg_p)
3578 info->stack_offset += info->stack_offset & 1;
3580 if (mode == BLKmode)
3581 info->num_bytes = int_size_in_bytes (type);
3582 else
3583 info->num_bytes = GET_MODE_SIZE (mode);
3585 num_words = (info->num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3586 max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
3588 /* Partition the argument between registers and stack. */
3589 info->reg_words = MIN (num_words, max_regs);
3590 info->stack_words = num_words - info->reg_words;
3594 /* Implement FUNCTION_ARG_ADVANCE. */
3596 void
3597 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3598 tree type, int named)
3600 struct mips_arg_info info;
3602 mips_arg_info (cum, mode, type, named, &info);
3604 if (!info.fpr_p)
3605 cum->gp_reg_found = true;
3607 /* See the comment above the cumulative args structure in mips.h
3608 for an explanation of what this code does. It assumes the O32
3609 ABI, which passes at most 2 arguments in float registers. */
3610 if (cum->arg_number < 2 && info.fpr_p)
3611 cum->fp_code += (mode == SFmode ? 1 : 2) << ((cum->arg_number - 1) * 2);
3613 if (mips_abi != ABI_EABI || !info.fpr_p)
3614 cum->num_gprs = info.reg_offset + info.reg_words;
3615 else if (info.reg_words > 0)
3616 cum->num_fprs += FP_INC;
3618 if (info.stack_words > 0)
3619 cum->stack_words = info.stack_offset + info.stack_words;
3621 cum->arg_number++;
3624 /* Implement FUNCTION_ARG. */
3626 struct rtx_def *
3627 function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
3628 tree type, int named)
3630 struct mips_arg_info info;
3632 /* We will be called with a mode of VOIDmode after the last argument
3633 has been seen. Whatever we return will be passed to the call
3634 insn. If we need a mips16 fp_code, return a REG with the code
3635 stored as the mode. */
3636 if (mode == VOIDmode)
3638 if (TARGET_MIPS16 && cum->fp_code != 0)
3639 return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
3641 else
3642 return 0;
3645 mips_arg_info (cum, mode, type, named, &info);
3647 /* Return straight away if the whole argument is passed on the stack. */
3648 if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
3649 return 0;
3651 if (type != 0
3652 && TREE_CODE (type) == RECORD_TYPE
3653 && TARGET_NEWABI
3654 && TYPE_SIZE_UNIT (type)
3655 && host_integerp (TYPE_SIZE_UNIT (type), 1)
3656 && named)
3658 /* The Irix 6 n32/n64 ABIs say that if any 64 bit chunk of the
3659 structure contains a double in its entirety, then that 64 bit
3660 chunk is passed in a floating point register. */
3661 tree field;
3663 /* First check to see if there is any such field. */
3664 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
3665 if (TREE_CODE (field) == FIELD_DECL
3666 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3667 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
3668 && host_integerp (bit_position (field), 0)
3669 && int_bit_position (field) % BITS_PER_WORD == 0)
3670 break;
3672 if (field != 0)
3674 /* Now handle the special case by returning a PARALLEL
3675 indicating where each 64 bit chunk goes. INFO.REG_WORDS
3676 chunks are passed in registers. */
3677 unsigned int i;
3678 HOST_WIDE_INT bitpos;
3679 rtx ret;
3681 /* assign_parms checks the mode of ENTRY_PARM, so we must
3682 use the actual mode here. */
3683 ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
3685 bitpos = 0;
3686 field = TYPE_FIELDS (type);
3687 for (i = 0; i < info.reg_words; i++)
3689 rtx reg;
3691 for (; field; field = TREE_CHAIN (field))
3692 if (TREE_CODE (field) == FIELD_DECL
3693 && int_bit_position (field) >= bitpos)
3694 break;
3696 if (field
3697 && int_bit_position (field) == bitpos
3698 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3699 && !TARGET_SOFT_FLOAT
3700 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
3701 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
3702 else
3703 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
3705 XVECEXP (ret, 0, i)
3706 = gen_rtx_EXPR_LIST (VOIDmode, reg,
3707 GEN_INT (bitpos / BITS_PER_UNIT));
3709 bitpos += BITS_PER_WORD;
3711 return ret;
3715 if (info.fpr_p)
3716 return gen_rtx_REG (mode, FP_ARG_FIRST + info.reg_offset);
3717 else
3718 return gen_rtx_REG (mode, GP_ARG_FIRST + info.reg_offset);
3722 /* Implement FUNCTION_ARG_PARTIAL_NREGS. */
3725 function_arg_partial_nregs (const CUMULATIVE_ARGS *cum,
3726 enum machine_mode mode, tree type, int named)
3728 struct mips_arg_info info;
3730 mips_arg_info (cum, mode, type, named, &info);
3731 return info.stack_words > 0 ? info.reg_words : 0;
3735 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
3736 upward rather than downward. In other words, return true if the
3737 first byte of the stack slot has useful data, false if the last
3738 byte does. */
3740 bool
3741 mips_pad_arg_upward (enum machine_mode mode, tree type)
3743 /* On little-endian targets, the first byte of every stack argument
3744 is passed in the first byte of the stack slot. */
3745 if (!BYTES_BIG_ENDIAN)
3746 return true;
3748 /* Otherwise, integral types are padded downward: the last byte of a
3749 stack argument is passed in the last byte of the stack slot. */
3750 if (type != 0
3751 ? INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)
3752 : GET_MODE_CLASS (mode) == MODE_INT)
3753 return false;
3755 /* Big-endian o64 pads floating-point arguments downward. */
3756 if (mips_abi == ABI_O64)
3757 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
3758 return false;
3760 /* Other types are padded upward for o32, o64, n32 and n64. */
3761 if (mips_abi != ABI_EABI)
3762 return true;
3764 /* Arguments smaller than a stack slot are padded downward. */
3765 if (mode != BLKmode)
3766 return (GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY);
3767 else
3768 return (int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT));
3772 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...). Return !BYTES_BIG_ENDIAN
3773 if the least significant byte of the register has useful data. Return
3774 the opposite if the most significant byte does. */
3776 bool
3777 mips_pad_reg_upward (enum machine_mode mode, tree type)
3779 /* No shifting is required for floating-point arguments. */
3780 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
3781 return !BYTES_BIG_ENDIAN;
3783 /* Otherwise, apply the same padding to register arguments as we do
3784 to stack arguments. */
3785 return mips_pad_arg_upward (mode, type);
3788 static void
3789 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3790 tree type, int *pretend_size, int no_rtl)
3792 CUMULATIVE_ARGS local_cum;
3793 int gp_saved, fp_saved;
3795 /* The caller has advanced CUM up to, but not beyond, the last named
3796 argument. Advance a local copy of CUM past the last "real" named
3797 argument, to find out how many registers are left over. */
3799 local_cum = *cum;
3800 FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
3802 /* Found out how many registers we need to save. */
3803 gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
3804 fp_saved = (EABI_FLOAT_VARARGS_P
3805 ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
3806 : 0);
3808 if (!no_rtl)
3810 if (gp_saved > 0)
3812 rtx ptr, mem;
3814 ptr = virtual_incoming_args_rtx;
3815 switch (mips_abi)
3817 case ABI_32:
3818 case ABI_O64:
3819 ptr = plus_constant (ptr, local_cum.num_gprs * UNITS_PER_WORD);
3820 break;
3822 case ABI_EABI:
3823 ptr = plus_constant (ptr, -gp_saved * UNITS_PER_WORD);
3824 break;
3826 mem = gen_rtx_MEM (BLKmode, ptr);
3827 set_mem_alias_set (mem, get_varargs_alias_set ());
3829 move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
3830 mem, gp_saved);
3832 if (fp_saved > 0)
3834 /* We can't use move_block_from_reg, because it will use
3835 the wrong mode. */
3836 enum machine_mode mode;
3837 int off, i;
3839 /* Set OFF to the offset from virtual_incoming_args_rtx of
3840 the first float register. The FP save area lies below
3841 the integer one, and is aligned to UNITS_PER_FPVALUE bytes. */
3842 off = -gp_saved * UNITS_PER_WORD;
3843 off &= ~(UNITS_PER_FPVALUE - 1);
3844 off -= fp_saved * UNITS_PER_FPREG;
3846 mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
3848 for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS; i += FP_INC)
3850 rtx ptr, mem;
3852 ptr = plus_constant (virtual_incoming_args_rtx, off);
3853 mem = gen_rtx_MEM (mode, ptr);
3854 set_mem_alias_set (mem, get_varargs_alias_set ());
3855 emit_move_insn (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
3856 off += UNITS_PER_HWFPVALUE;
3860 if (TARGET_OLDABI)
3862 /* No need for pretend arguments: the register parameter area was
3863 allocated by the caller. */
3864 *pretend_size = 0;
3865 return;
3867 *pretend_size = (gp_saved * UNITS_PER_WORD) + (fp_saved * UNITS_PER_FPREG);
3870 /* Create the va_list data type.
3871 We keep 3 pointers, and two offsets.
3872 Two pointers are to the overflow area, which starts at the CFA.
3873 One of these is constant, for addressing into the GPR save area below it.
3874 The other is advanced up the stack through the overflow region.
3875 The third pointer is to the GPR save area. Since the FPR save area
3876 is just below it, we can address FPR slots off this pointer.
3877 We also keep two one-byte offsets, which are to be subtracted from the
3878 constant pointers to yield addresses in the GPR and FPR save areas.
3879 These are downcounted as float or non-float arguments are used,
3880 and when they get to zero, the argument must be obtained from the
3881 overflow region.
3882 If !EABI_FLOAT_VARARGS_P, then no FPR save area exists, and a single
3883 pointer is enough. It's started at the GPR save area, and is
3884 advanced, period.
3885 Note that the GPR save area is not constant size, due to optimization
3886 in the prologue. Hence, we can't use a design with two pointers
3887 and two offsets, although we could have designed this with two pointers
3888 and three offsets. */
3890 static tree
3891 mips_build_builtin_va_list (void)
3893 if (EABI_FLOAT_VARARGS_P)
3895 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
3896 tree array, index;
3898 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
3900 f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
3901 ptr_type_node);
3902 f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
3903 ptr_type_node);
3904 f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
3905 ptr_type_node);
3906 f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
3907 unsigned_char_type_node);
3908 f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
3909 unsigned_char_type_node);
3910 /* Explicitly pad to the size of a pointer, so that -Wpadded won't
3911 warn on every user file. */
3912 index = build_int_2 (GET_MODE_SIZE (ptr_mode) - 2 - 1, 0);
3913 array = build_array_type (unsigned_char_type_node,
3914 build_index_type (index));
3915 f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
3917 DECL_FIELD_CONTEXT (f_ovfl) = record;
3918 DECL_FIELD_CONTEXT (f_gtop) = record;
3919 DECL_FIELD_CONTEXT (f_ftop) = record;
3920 DECL_FIELD_CONTEXT (f_goff) = record;
3921 DECL_FIELD_CONTEXT (f_foff) = record;
3922 DECL_FIELD_CONTEXT (f_res) = record;
3924 TYPE_FIELDS (record) = f_ovfl;
3925 TREE_CHAIN (f_ovfl) = f_gtop;
3926 TREE_CHAIN (f_gtop) = f_ftop;
3927 TREE_CHAIN (f_ftop) = f_goff;
3928 TREE_CHAIN (f_goff) = f_foff;
3929 TREE_CHAIN (f_foff) = f_res;
3931 layout_type (record);
3932 return record;
3934 else if (TARGET_IRIX && !TARGET_IRIX5)
3935 /* On IRIX 6, this type is 'char *'. */
3936 return build_pointer_type (char_type_node);
3937 else
3938 /* Otherwise, we use 'void *'. */
3939 return ptr_type_node;
3942 /* Implement va_start. */
3944 void
3945 mips_va_start (tree valist, rtx nextarg)
3947 const CUMULATIVE_ARGS *cum = &current_function_args_info;
3949 /* ARG_POINTER_REGNUM is initialized to STACK_POINTER_BOUNDARY, but
3950 since the stack is aligned for a pair of argument-passing slots,
3951 and the beginning of a variable argument list may be an odd slot,
3952 we have to decrease its alignment. */
3953 if (cfun && cfun->emit->regno_pointer_align)
3954 while (((current_function_pretend_args_size * BITS_PER_UNIT)
3955 & (REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) - 1)) != 0)
3956 REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) /= 2;
3958 if (mips_abi == ABI_EABI)
3960 int gpr_save_area_size;
3962 gpr_save_area_size
3963 = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
3965 if (EABI_FLOAT_VARARGS_P)
3967 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
3968 tree ovfl, gtop, ftop, goff, foff;
3969 tree t;
3970 int fpr_offset;
3971 int fpr_save_area_size;
3973 f_ovfl = TYPE_FIELDS (va_list_type_node);
3974 f_gtop = TREE_CHAIN (f_ovfl);
3975 f_ftop = TREE_CHAIN (f_gtop);
3976 f_goff = TREE_CHAIN (f_ftop);
3977 f_foff = TREE_CHAIN (f_goff);
3979 ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
3980 NULL_TREE);
3981 gtop = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
3982 NULL_TREE);
3983 ftop = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
3984 NULL_TREE);
3985 goff = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
3986 NULL_TREE);
3987 foff = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
3988 NULL_TREE);
3990 /* Emit code to initialize OVFL, which points to the next varargs
3991 stack argument. CUM->STACK_WORDS gives the number of stack
3992 words used by named arguments. */
3993 t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
3994 if (cum->stack_words > 0)
3995 t = build (PLUS_EXPR, TREE_TYPE (ovfl), t,
3996 build_int_2 (cum->stack_words * UNITS_PER_WORD, 0));
3997 t = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
3998 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4000 /* Emit code to initialize GTOP, the top of the GPR save area. */
4001 t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
4002 t = build (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
4003 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4005 /* Emit code to initialize FTOP, the top of the FPR save area.
4006 This address is gpr_save_area_bytes below GTOP, rounded
4007 down to the next fp-aligned boundary. */
4008 t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
4009 fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
4010 fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
4011 if (fpr_offset)
4012 t = build (PLUS_EXPR, TREE_TYPE (ftop), t,
4013 build_int_2 (-fpr_offset, -1));
4014 t = build (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
4015 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4017 /* Emit code to initialize GOFF, the offset from GTOP of the
4018 next GPR argument. */
4019 t = build (MODIFY_EXPR, TREE_TYPE (goff), goff,
4020 build_int_2 (gpr_save_area_size, 0));
4021 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4023 /* Likewise emit code to initialize FOFF, the offset from FTOP
4024 of the next FPR argument. */
4025 fpr_save_area_size
4026 = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
4027 t = build (MODIFY_EXPR, TREE_TYPE (foff), foff,
4028 build_int_2 (fpr_save_area_size, 0));
4029 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4031 else
4033 /* Everything is in the GPR save area, or in the overflow
4034 area which is contiguous with it. */
4035 nextarg = plus_constant (nextarg, -gpr_save_area_size);
4036 std_expand_builtin_va_start (valist, nextarg);
4039 else
4040 std_expand_builtin_va_start (valist, nextarg);
4043 /* Implement va_arg. */
4045 static tree
4046 mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
4048 HOST_WIDE_INT size, rsize;
4049 tree addr;
4050 bool indirect;
4052 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
4054 if (indirect)
4055 type = build_pointer_type (type);
4057 size = int_size_in_bytes (type);
4058 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
4060 if (mips_abi != ABI_EABI || !EABI_FLOAT_VARARGS_P)
4061 addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4062 else
4064 /* Not a simple merged stack. */
4066 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4067 tree ovfl, top, off, align;
4068 HOST_WIDE_INT osize;
4069 tree t, u;
4071 f_ovfl = TYPE_FIELDS (va_list_type_node);
4072 f_gtop = TREE_CHAIN (f_ovfl);
4073 f_ftop = TREE_CHAIN (f_gtop);
4074 f_goff = TREE_CHAIN (f_ftop);
4075 f_foff = TREE_CHAIN (f_goff);
4077 /* We maintain separate pointers and offsets for floating-point
4078 and integer arguments, but we need similar code in both cases.
4079 Let:
4081 TOP be the top of the register save area;
4082 OFF be the offset from TOP of the next register;
4083 ADDR_RTX be the address of the argument;
4084 RSIZE be the number of bytes used to store the argument
4085 when it's in the register save area;
4086 OSIZE be the number of bytes used to store it when it's
4087 in the stack overflow area; and
4088 PADDING be (BYTES_BIG_ENDIAN ? OSIZE - RSIZE : 0)
4090 The code we want is:
4092 1: off &= -rsize; // round down
4093 2: if (off != 0)
4094 3: {
4095 4: addr_rtx = top - off;
4096 5: off -= rsize;
4097 6: }
4098 7: else
4099 8: {
4100 9: ovfl += ((intptr_t) ovfl + osize - 1) & -osize;
4101 10: addr_rtx = ovfl + PADDING;
4102 11: ovfl += osize;
4103 14: }
4105 [1] and [9] can sometimes be optimized away. */
4107 ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4108 NULL_TREE);
4110 if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
4111 && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
4113 top = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4114 NULL_TREE);
4115 off = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4116 NULL_TREE);
4118 /* When floating-point registers are saved to the stack,
4119 each one will take up UNITS_PER_HWFPVALUE bytes, regardless
4120 of the float's precision. */
4121 rsize = UNITS_PER_HWFPVALUE;
4123 /* Overflow arguments are padded to UNITS_PER_WORD bytes
4124 (= PARM_BOUNDARY bits). This can be different from RSIZE
4125 in two cases:
4127 (1) On 32-bit targets when TYPE is a structure such as:
4129 struct s { float f; };
4131 Such structures are passed in paired FPRs, so RSIZE
4132 will be 8 bytes. However, the structure only takes
4133 up 4 bytes of memory, so OSIZE will only be 4.
4135 (2) In combinations such as -mgp64 -msingle-float
4136 -fshort-double. Doubles passed in registers
4137 will then take up 4 (UNITS_PER_HWFPVALUE) bytes,
4138 but those passed on the stack take up
4139 UNITS_PER_WORD bytes. */
4140 osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
4142 else
4144 top = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4145 NULL_TREE);
4146 off = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4147 NULL_TREE);
4148 if (rsize > UNITS_PER_WORD)
4150 /* [1] Emit code for: off &= -rsize. */
4151 t = build (BIT_AND_EXPR, TREE_TYPE (off), off,
4152 build_int_2 (-rsize, -1));
4153 t = build (MODIFY_EXPR, TREE_TYPE (off), off, t);
4154 gimplify_and_add (t, pre_p);
4156 osize = rsize;
4159 /* [2] Emit code to branch if off == 0. */
4160 t = lang_hooks.truthvalue_conversion (off);
4161 addr = build (COND_EXPR, ptr_type_node, t, NULL, NULL);
4163 /* [5] Emit code for: off -= rsize. We do this as a form of
4164 post-increment not available to C. Also widen for the
4165 coming pointer arithmetic. */
4166 t = fold_convert (TREE_TYPE (off), build_int_2 (rsize, 0));
4167 t = build (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
4168 t = fold_convert (sizetype, t);
4169 t = fold_convert (TREE_TYPE (top), t);
4171 /* [4] Emit code for: addr_rtx = top - off. On big endian machines,
4172 the argument has RSIZE - SIZE bytes of leading padding. */
4173 t = build (MINUS_EXPR, TREE_TYPE (top), top, t);
4174 if (BYTES_BIG_ENDIAN && rsize > size)
4176 u = fold_convert (TREE_TYPE (t), build_int_2 (rsize - size, 0));
4177 t = build (PLUS_EXPR, TREE_TYPE (t), t, u);
4179 COND_EXPR_THEN (addr) = t;
4181 if (osize > UNITS_PER_WORD)
4183 /* [9] Emit: ovfl += ((intptr_t) ovfl + osize - 1) & -osize. */
4184 u = fold_convert (TREE_TYPE (ovfl), build_int_2 (osize - 1, 0));
4185 t = build (PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
4186 u = fold_convert (TREE_TYPE (ovfl), build_int_2 (-osize, -1));
4187 t = build (BIT_AND_EXPR, TREE_TYPE (ovfl), t, u);
4188 align = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
4190 else
4191 align = NULL;
4193 /* [10, 11]. Emit code to store ovfl in addr_rtx, then
4194 post-increment ovfl by osize. On big-endian machines,
4195 the argument has OSIZE - SIZE bytes of leading padding. */
4196 u = fold_convert (TREE_TYPE (ovfl), build_int_2 (osize, 0));
4197 t = build (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
4198 if (BYTES_BIG_ENDIAN && osize > size)
4200 u = fold_convert (TREE_TYPE (t), build_int_2 (osize - size, 0));
4201 t = build (PLUS_EXPR, TREE_TYPE (t), t, u);
4204 /* String [9] and [10,11] together. */
4205 if (align)
4206 t = build (COMPOUND_EXPR, TREE_TYPE (t), align, t);
4207 COND_EXPR_ELSE (addr) = t;
4209 addr = fold_convert (build_pointer_type (type), addr);
4210 addr = build_fold_indirect_ref (addr);
4213 if (indirect)
4214 addr = build_fold_indirect_ref (addr);
4216 return addr;
4219 /* Return true if it is possible to use left/right accesses for a
4220 bitfield of WIDTH bits starting BITPOS bits into *OP. When
4221 returning true, update *OP, *LEFT and *RIGHT as follows:
4223 *OP is a BLKmode reference to the whole field.
4225 *LEFT is a QImode reference to the first byte if big endian or
4226 the last byte if little endian. This address can be used in the
4227 left-side instructions (lwl, swl, ldl, sdl).
4229 *RIGHT is a QImode reference to the opposite end of the field and
4230 can be used in the parterning right-side instruction. */
4232 static bool
4233 mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
4234 rtx *left, rtx *right)
4236 rtx first, last;
4238 /* Check that the operand really is a MEM. Not all the extv and
4239 extzv predicates are checked. */
4240 if (GET_CODE (*op) != MEM)
4241 return false;
4243 /* Check that the size is valid. */
4244 if (width != 32 && (!TARGET_64BIT || width != 64))
4245 return false;
4247 /* We can only access byte-aligned values. Since we are always passed
4248 a reference to the first byte of the field, it is not necessary to
4249 do anything with BITPOS after this check. */
4250 if (bitpos % BITS_PER_UNIT != 0)
4251 return false;
4253 /* Reject aligned bitfields: we want to use a normal load or store
4254 instead of a left/right pair. */
4255 if (MEM_ALIGN (*op) >= width)
4256 return false;
4258 /* Adjust *OP to refer to the whole field. This also has the effect
4259 of legitimizing *OP's address for BLKmode, possibly simplifying it. */
4260 *op = adjust_address (*op, BLKmode, 0);
4261 set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
4263 /* Get references to both ends of the field. We deliberately don't
4264 use the original QImode *OP for FIRST since the new BLKmode one
4265 might have a simpler address. */
4266 first = adjust_address (*op, QImode, 0);
4267 last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
4269 /* Allocate to LEFT and RIGHT according to endianness. LEFT should
4270 be the upper word and RIGHT the lower word. */
4271 if (TARGET_BIG_ENDIAN)
4272 *left = first, *right = last;
4273 else
4274 *left = last, *right = first;
4276 return true;
4280 /* Try to emit the equivalent of (set DEST (zero_extract SRC WIDTH BITPOS)).
4281 Return true on success. We only handle cases where zero_extract is
4282 equivalent to sign_extract. */
4284 bool
4285 mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
4287 rtx left, right, temp;
4289 /* If TARGET_64BIT, the destination of a 32-bit load will be a
4290 paradoxical word_mode subreg. This is the only case in which
4291 we allow the destination to be larger than the source. */
4292 if (GET_CODE (dest) == SUBREG
4293 && GET_MODE (dest) == DImode
4294 && SUBREG_BYTE (dest) == 0
4295 && GET_MODE (SUBREG_REG (dest)) == SImode)
4296 dest = SUBREG_REG (dest);
4298 /* After the above adjustment, the destination must be the same
4299 width as the source. */
4300 if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
4301 return false;
4303 if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
4304 return false;
4306 temp = gen_reg_rtx (GET_MODE (dest));
4307 if (GET_MODE (dest) == DImode)
4309 emit_insn (gen_mov_ldl (temp, src, left));
4310 emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
4312 else
4314 emit_insn (gen_mov_lwl (temp, src, left));
4315 emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
4317 return true;
4321 /* Try to expand (set (zero_extract DEST WIDTH BITPOS) SRC). Return
4322 true on success. */
4324 bool
4325 mips_expand_unaligned_store (rtx dest, rtx src, unsigned int width, int bitpos)
4327 rtx left, right;
4329 if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
4330 return false;
4332 src = gen_lowpart (mode_for_size (width, MODE_INT, 0), src);
4334 if (GET_MODE (src) == DImode)
4336 emit_insn (gen_mov_sdl (dest, src, left));
4337 emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
4339 else
4341 emit_insn (gen_mov_swl (dest, src, left));
4342 emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
4344 return true;
4347 /* Set up globals to generate code for the ISA or processor
4348 described by INFO. */
4350 static void
4351 mips_set_architecture (const struct mips_cpu_info *info)
4353 if (info != 0)
4355 mips_arch_info = info;
4356 mips_arch = info->cpu;
4357 mips_isa = info->isa;
4362 /* Likewise for tuning. */
4364 static void
4365 mips_set_tune (const struct mips_cpu_info *info)
4367 if (info != 0)
4369 mips_tune_info = info;
4370 mips_tune = info->cpu;
4375 /* Set up the threshold for data to go into the small data area, instead
4376 of the normal data area, and detect any conflicts in the switches. */
4378 void
4379 override_options (void)
4381 int i, start, regno;
4382 enum machine_mode mode;
4384 mips_section_threshold = g_switch_set ? g_switch_value : MIPS_DEFAULT_GVALUE;
4386 /* Interpret -mabi. */
4387 mips_abi = MIPS_ABI_DEFAULT;
4388 if (mips_abi_string != 0)
4390 if (strcmp (mips_abi_string, "32") == 0)
4391 mips_abi = ABI_32;
4392 else if (strcmp (mips_abi_string, "o64") == 0)
4393 mips_abi = ABI_O64;
4394 else if (strcmp (mips_abi_string, "n32") == 0)
4395 mips_abi = ABI_N32;
4396 else if (strcmp (mips_abi_string, "64") == 0)
4397 mips_abi = ABI_64;
4398 else if (strcmp (mips_abi_string, "eabi") == 0)
4399 mips_abi = ABI_EABI;
4400 else
4401 fatal_error ("bad value (%s) for -mabi= switch", mips_abi_string);
4404 /* The following code determines the architecture and register size.
4405 Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
4406 The GAS and GCC code should be kept in sync as much as possible. */
4408 if (mips_arch_string != 0)
4409 mips_set_architecture (mips_parse_cpu ("-march", mips_arch_string));
4411 if (mips_isa_string != 0)
4413 /* Handle -mipsN. */
4414 char *whole_isa_str = concat ("mips", mips_isa_string, NULL);
4415 const struct mips_cpu_info *isa_info;
4417 isa_info = mips_parse_cpu ("-mips option", whole_isa_str);
4418 free (whole_isa_str);
4420 /* -march takes precedence over -mipsN, since it is more descriptive.
4421 There's no harm in specifying both as long as the ISA levels
4422 are the same. */
4423 if (mips_arch_info != 0 && mips_isa != isa_info->isa)
4424 error ("-mips%s conflicts with the other architecture options, "
4425 "which specify a MIPS%d processor",
4426 mips_isa_string, mips_isa);
4428 /* Set architecture based on the given option. */
4429 mips_set_architecture (isa_info);
4432 if (mips_arch_info == 0)
4434 #ifdef MIPS_CPU_STRING_DEFAULT
4435 mips_set_architecture (mips_parse_cpu ("default CPU",
4436 MIPS_CPU_STRING_DEFAULT));
4437 #else
4438 mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
4439 #endif
4442 if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
4443 error ("-march=%s is not compatible with the selected ABI",
4444 mips_arch_info->name);
4446 /* Optimize for mips_arch, unless -mtune selects a different processor. */
4447 if (mips_tune_string != 0)
4448 mips_set_tune (mips_parse_cpu ("-mtune", mips_tune_string));
4450 if (mips_tune_info == 0)
4451 mips_set_tune (mips_arch_info);
4453 if ((target_flags_explicit & MASK_64BIT) != 0)
4455 /* The user specified the size of the integer registers. Make sure
4456 it agrees with the ABI and ISA. */
4457 if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
4458 error ("-mgp64 used with a 32-bit processor");
4459 else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
4460 error ("-mgp32 used with a 64-bit ABI");
4461 else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
4462 error ("-mgp64 used with a 32-bit ABI");
4464 else
4466 /* Infer the integer register size from the ABI and processor.
4467 Restrict ourselves to 32-bit registers if that's all the
4468 processor has, or if the ABI cannot handle 64-bit registers. */
4469 if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
4470 target_flags &= ~MASK_64BIT;
4471 else
4472 target_flags |= MASK_64BIT;
4475 if ((target_flags_explicit & MASK_FLOAT64) != 0)
4477 /* Really, -mfp32 and -mfp64 are ornamental options. There's
4478 only one right answer here. */
4479 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
4480 error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
4481 else if (!TARGET_64BIT && TARGET_FLOAT64)
4482 error ("unsupported combination: %s", "-mgp32 -mfp64");
4483 else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
4484 error ("unsupported combination: %s", "-mfp64 -msingle-float");
4486 else
4488 /* -msingle-float selects 32-bit float registers. Otherwise the
4489 float registers should be the same size as the integer ones. */
4490 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
4491 target_flags |= MASK_FLOAT64;
4492 else
4493 target_flags &= ~MASK_FLOAT64;
4496 /* End of code shared with GAS. */
4498 if ((target_flags_explicit & MASK_LONG64) == 0)
4500 /* If no type size setting options (-mlong64,-mint64,-mlong32)
4501 were used, then set the type sizes. In the EABI in 64 bit mode,
4502 longs and pointers are 64 bits. Likewise for the SGI Irix6 N64
4503 ABI. */
4504 if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
4505 target_flags |= MASK_LONG64;
4506 else
4507 target_flags &= ~MASK_LONG64;
4510 if (MIPS_MARCH_CONTROLS_SOFT_FLOAT
4511 && (target_flags_explicit & MASK_SOFT_FLOAT) == 0)
4513 /* For some configurations, it is useful to have -march control
4514 the default setting of MASK_SOFT_FLOAT. */
4515 switch ((int) mips_arch)
4517 case PROCESSOR_R4100:
4518 case PROCESSOR_R4111:
4519 case PROCESSOR_R4120:
4520 case PROCESSOR_R4130:
4521 target_flags |= MASK_SOFT_FLOAT;
4522 break;
4524 default:
4525 target_flags &= ~MASK_SOFT_FLOAT;
4526 break;
4530 if (!TARGET_OLDABI)
4531 flag_pcc_struct_return = 0;
4533 #if defined(USE_COLLECT2)
4534 /* For IRIX 5 or IRIX 6 with integrated O32 ABI support, USE_COLLECT2 is
4535 always defined when GNU as is not in use, but collect2 is only used
4536 for the O32 ABI, so override the toplev.c and target-def.h defaults
4537 for flag_gnu_linker, TARGET_ASM_{CONSTRUCTOR, DESTRUCTOR} and
4538 TARGET_HAVE_CTORS_DTORS.
4540 Since the IRIX 5 and IRIX 6 O32 assemblers cannot handle named
4541 sections, constructor/destructor handling depends on the ABI in use.
4543 Since USE_COLLECT2 is defined, we only need to restore the non-collect2
4544 defaults for the N32/N64 ABIs. */
4545 if (TARGET_IRIX && !TARGET_SGI_O32_AS)
4547 targetm.have_ctors_dtors = true;
4548 targetm.asm_out.constructor = default_named_section_asm_out_constructor;
4549 targetm.asm_out.destructor = default_named_section_asm_out_destructor;
4551 #endif
4553 /* Handle some quirks of the IRIX 5 and IRIX 6 O32 assemblers. */
4555 if (TARGET_SGI_O32_AS)
4557 /* They don't recognize `.[248]byte'. */
4558 targetm.asm_out.unaligned_op.hi = "\t.align 0\n\t.half\t";
4559 targetm.asm_out.unaligned_op.si = "\t.align 0\n\t.word\t";
4560 /* The IRIX 6 O32 assembler gives an error for `align 0; .dword',
4561 contrary to the documentation, so disable it. */
4562 targetm.asm_out.unaligned_op.di = NULL;
4564 /* They cannot handle named sections. */
4565 targetm.have_named_sections = false;
4566 /* Therefore, EH_FRAME_SECTION_NAME isn't defined and we must use
4567 collect2. */
4568 targetm.terminate_dw2_eh_frame_info = true;
4569 targetm.asm_out.eh_frame_section = collect2_eh_frame_section;
4571 /* They cannot handle debug information. */
4572 if (write_symbols != NO_DEBUG)
4574 /* Adapt wording to IRIX version: IRIX 5 only had a single ABI,
4575 so -mabi=32 isn't usually specified. */
4576 if (TARGET_IRIX5)
4577 inform ("-g is only supported using GNU as,");
4578 else
4579 inform ("-g is only supported using GNU as with -mabi=32,");
4580 inform ("-g option disabled");
4581 write_symbols = NO_DEBUG;
4585 if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
4587 /* If neither -mbranch-likely nor -mno-branch-likely was given
4588 on the command line, set MASK_BRANCHLIKELY based on the target
4589 architecture.
4591 By default, we enable use of Branch Likely instructions on
4592 all architectures which support them with the following
4593 exceptions: when creating MIPS32 or MIPS64 code, and when
4594 tuning for architectures where their use tends to hurt
4595 performance.
4597 The MIPS32 and MIPS64 architecture specifications say "Software
4598 is strongly encouraged to avoid use of Branch Likely
4599 instructions, as they will be removed from a future revision
4600 of the [MIPS32 and MIPS64] architecture." Therefore, we do not
4601 issue those instructions unless instructed to do so by
4602 -mbranch-likely. */
4603 if (ISA_HAS_BRANCHLIKELY
4604 && !(ISA_MIPS32 || ISA_MIPS32R2 || ISA_MIPS64)
4605 && !(TUNE_MIPS5500 || TUNE_SB1))
4606 target_flags |= MASK_BRANCHLIKELY;
4607 else
4608 target_flags &= ~MASK_BRANCHLIKELY;
4610 if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
4611 warning ("generation of Branch Likely instructions enabled, but not supported by architecture");
4613 /* The effect of -mabicalls isn't defined for the EABI. */
4614 if (mips_abi == ABI_EABI && TARGET_ABICALLS)
4616 error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
4617 target_flags &= ~MASK_ABICALLS;
4620 /* -fpic (-KPIC) is the default when TARGET_ABICALLS is defined. We need
4621 to set flag_pic so that the LEGITIMATE_PIC_OPERAND_P macro will work. */
4622 /* ??? -non_shared turns off pic code generation, but this is not
4623 implemented. */
4624 if (TARGET_ABICALLS)
4626 flag_pic = 1;
4627 if (mips_section_threshold > 0)
4628 warning ("-G is incompatible with PIC code which is the default");
4631 /* The MIPS and SGI o32 assemblers expect small-data variables to
4632 be declared before they are used. Although we once had code to
4633 do this, it was very invasive and fragile. It no longer seems
4634 worth the effort. */
4635 if (!TARGET_EXPLICIT_RELOCS && !TARGET_GAS)
4636 mips_section_threshold = 0;
4638 /* We switch to small data sections using ".section", which the native
4639 o32 irix assemblers don't understand. Disable -G accordingly.
4640 We must do this regardless of command-line options since otherwise
4641 the compiler would abort. */
4642 if (!targetm.have_named_sections)
4643 mips_section_threshold = 0;
4645 /* mips_split_addresses is a half-way house between explicit
4646 relocations and the traditional assembler macros. It can
4647 split absolute 32-bit symbolic constants into a high/lo_sum
4648 pair but uses macros for other sorts of access.
4650 Like explicit relocation support for REL targets, it relies
4651 on GNU extensions in the assembler and the linker.
4653 Although this code should work for -O0, it has traditionally
4654 been treated as an optimization. */
4655 if (TARGET_GAS && !TARGET_MIPS16 && TARGET_SPLIT_ADDRESSES
4656 && optimize && !flag_pic
4657 && !ABI_HAS_64BIT_SYMBOLS)
4658 mips_split_addresses = 1;
4659 else
4660 mips_split_addresses = 0;
4662 /* Explicit relocations for "old" ABIs are a GNU extension. Unless
4663 the user has said otherwise, assume that they are not available
4664 with assemblers other than gas. */
4665 if (!TARGET_NEWABI && !TARGET_GAS
4666 && (target_flags_explicit & MASK_EXPLICIT_RELOCS) == 0)
4667 target_flags &= ~MASK_EXPLICIT_RELOCS;
4669 /* Make -mabicalls -fno-unit-at-a-time imply -mno-explicit-relocs
4670 unless the user says otherwise.
4672 There are two problems here:
4674 (1) The value of an R_MIPS_GOT16 relocation depends on whether
4675 the symbol is local or global. We therefore need to know
4676 a symbol's binding before referring to it using %got().
4678 (2) R_MIPS_CALL16 can only be applied to global symbols.
4680 When not using -funit-at-a-time, a symbol's binding may change
4681 after it has been used. For example, the C++ front-end will
4682 initially assume that the typeinfo for an incomplete type will be
4683 comdat, on the basis that the type could be completed later in the
4684 file. But if the type never is completed, the typeinfo will become
4685 local instead. */
4686 if (!flag_unit_at_a_time
4687 && TARGET_ABICALLS
4688 && (target_flags_explicit & MASK_EXPLICIT_RELOCS) == 0)
4689 target_flags &= ~MASK_EXPLICIT_RELOCS;
4691 /* -mvr4130-align is a "speed over size" optimization: it usually produces
4692 faster code, but at the expense of more nops. Enable it at -O3 and
4693 above. */
4694 if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
4695 target_flags |= MASK_VR4130_ALIGN;
4697 /* When compiling for the mips16, we can not use floating point. We
4698 record the original hard float value in mips16_hard_float. */
4699 if (TARGET_MIPS16)
4701 if (TARGET_SOFT_FLOAT)
4702 mips16_hard_float = 0;
4703 else
4704 mips16_hard_float = 1;
4705 target_flags |= MASK_SOFT_FLOAT;
4707 /* Don't run the scheduler before reload, since it tends to
4708 increase register pressure. */
4709 flag_schedule_insns = 0;
4711 /* Silently disable -mexplicit-relocs since it doesn't apply
4712 to mips16 code. Even so, it would overly pedantic to warn
4713 about "-mips16 -mexplicit-relocs", especially given that
4714 we use a %gprel() operator. */
4715 target_flags &= ~MASK_EXPLICIT_RELOCS;
4718 /* When using explicit relocs, we call dbr_schedule from within
4719 mips_reorg. */
4720 if (TARGET_EXPLICIT_RELOCS)
4722 mips_flag_delayed_branch = flag_delayed_branch;
4723 flag_delayed_branch = 0;
4726 #ifdef MIPS_TFMODE_FORMAT
4727 REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
4728 #endif
4730 mips_print_operand_punct['?'] = 1;
4731 mips_print_operand_punct['#'] = 1;
4732 mips_print_operand_punct['/'] = 1;
4733 mips_print_operand_punct['&'] = 1;
4734 mips_print_operand_punct['!'] = 1;
4735 mips_print_operand_punct['*'] = 1;
4736 mips_print_operand_punct['@'] = 1;
4737 mips_print_operand_punct['.'] = 1;
4738 mips_print_operand_punct['('] = 1;
4739 mips_print_operand_punct[')'] = 1;
4740 mips_print_operand_punct['['] = 1;
4741 mips_print_operand_punct[']'] = 1;
4742 mips_print_operand_punct['<'] = 1;
4743 mips_print_operand_punct['>'] = 1;
4744 mips_print_operand_punct['{'] = 1;
4745 mips_print_operand_punct['}'] = 1;
4746 mips_print_operand_punct['^'] = 1;
4747 mips_print_operand_punct['$'] = 1;
4748 mips_print_operand_punct['+'] = 1;
4749 mips_print_operand_punct['~'] = 1;
4751 mips_char_to_class['d'] = TARGET_MIPS16 ? M16_REGS : GR_REGS;
4752 mips_char_to_class['t'] = T_REG;
4753 mips_char_to_class['f'] = (TARGET_HARD_FLOAT ? FP_REGS : NO_REGS);
4754 mips_char_to_class['h'] = HI_REG;
4755 mips_char_to_class['l'] = LO_REG;
4756 mips_char_to_class['x'] = MD_REGS;
4757 mips_char_to_class['b'] = ALL_REGS;
4758 mips_char_to_class['c'] = (TARGET_ABICALLS ? PIC_FN_ADDR_REG :
4759 TARGET_MIPS16 ? M16_NA_REGS :
4760 GR_REGS);
4761 mips_char_to_class['e'] = LEA_REGS;
4762 mips_char_to_class['j'] = PIC_FN_ADDR_REG;
4763 mips_char_to_class['y'] = GR_REGS;
4764 mips_char_to_class['z'] = ST_REGS;
4765 mips_char_to_class['B'] = COP0_REGS;
4766 mips_char_to_class['C'] = COP2_REGS;
4767 mips_char_to_class['D'] = COP3_REGS;
4769 /* Set up array to map GCC register number to debug register number.
4770 Ignore the special purpose register numbers. */
4772 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4773 mips_dbx_regno[i] = -1;
4775 start = GP_DBX_FIRST - GP_REG_FIRST;
4776 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
4777 mips_dbx_regno[i] = i + start;
4779 start = FP_DBX_FIRST - FP_REG_FIRST;
4780 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
4781 mips_dbx_regno[i] = i + start;
4783 mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
4784 mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
4786 /* Set up array giving whether a given register can hold a given mode. */
4788 for (mode = VOIDmode;
4789 mode != MAX_MACHINE_MODE;
4790 mode = (enum machine_mode) ((int)mode + 1))
4792 register int size = GET_MODE_SIZE (mode);
4793 register enum mode_class class = GET_MODE_CLASS (mode);
4795 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4797 register int temp;
4799 if (mode == CCmode)
4801 if (! ISA_HAS_8CC)
4802 temp = (regno == FPSW_REGNUM);
4803 else
4804 temp = (ST_REG_P (regno) || GP_REG_P (regno)
4805 || FP_REG_P (regno));
4808 else if (GP_REG_P (regno))
4809 temp = ((regno & 1) == 0 || size <= UNITS_PER_WORD);
4811 else if (FP_REG_P (regno))
4812 temp = ((regno % FP_INC) == 0)
4813 && (((class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT)
4814 && size <= UNITS_PER_FPVALUE)
4815 /* Allow integer modes that fit into a single
4816 register. We need to put integers into FPRs
4817 when using instructions like cvt and trunc. */
4818 || (class == MODE_INT && size <= UNITS_PER_FPREG)
4819 /* Allow TFmode for CCmode reloads. */
4820 || (ISA_HAS_8CC && mode == TFmode));
4822 else if (MD_REG_P (regno))
4823 temp = (INTEGRAL_MODE_P (mode)
4824 && (size <= UNITS_PER_WORD
4825 || (regno == MD_REG_FIRST
4826 && size == 2 * UNITS_PER_WORD)));
4828 else if (ALL_COP_REG_P (regno))
4829 temp = (class == MODE_INT && size <= UNITS_PER_WORD);
4830 else
4831 temp = 0;
4833 mips_hard_regno_mode_ok[(int)mode][regno] = temp;
4837 /* Save GPR registers in word_mode sized hunks. word_mode hasn't been
4838 initialized yet, so we can't use that here. */
4839 gpr_mode = TARGET_64BIT ? DImode : SImode;
4841 /* Provide default values for align_* for 64-bit targets. */
4842 if (TARGET_64BIT && !TARGET_MIPS16)
4844 if (align_loops == 0)
4845 align_loops = 8;
4846 if (align_jumps == 0)
4847 align_jumps = 8;
4848 if (align_functions == 0)
4849 align_functions = 8;
4852 /* Function to allocate machine-dependent function status. */
4853 init_machine_status = &mips_init_machine_status;
4855 if (ABI_HAS_64BIT_SYMBOLS)
4857 if (TARGET_EXPLICIT_RELOCS)
4859 mips_split_p[SYMBOL_64_HIGH] = true;
4860 mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
4861 mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
4863 mips_split_p[SYMBOL_64_MID] = true;
4864 mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
4865 mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
4867 mips_split_p[SYMBOL_64_LOW] = true;
4868 mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
4869 mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
4871 mips_split_p[SYMBOL_GENERAL] = true;
4872 mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
4875 else
4877 if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
4879 mips_split_p[SYMBOL_GENERAL] = true;
4880 mips_hi_relocs[SYMBOL_GENERAL] = "%hi(";
4881 mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
4885 if (TARGET_MIPS16)
4887 /* The high part is provided by a pseudo copy of $gp. */
4888 mips_split_p[SYMBOL_SMALL_DATA] = true;
4889 mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gprel(";
4892 if (TARGET_EXPLICIT_RELOCS)
4894 /* Small data constants are kept whole until after reload,
4895 then lowered by mips_rewrite_small_data. */
4896 mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gp_rel(";
4898 mips_split_p[SYMBOL_GOT_LOCAL] = true;
4899 if (TARGET_NEWABI)
4901 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
4902 mips_lo_relocs[SYMBOL_GOT_LOCAL] = "%got_ofst(";
4904 else
4906 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
4907 mips_lo_relocs[SYMBOL_GOT_LOCAL] = "%lo(";
4910 if (TARGET_XGOT)
4912 /* The HIGH and LO_SUM are matched by special .md patterns. */
4913 mips_split_p[SYMBOL_GOT_GLOBAL] = true;
4915 mips_split_p[SYMBOL_GOTOFF_GLOBAL] = true;
4916 mips_hi_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_hi(";
4917 mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_lo(";
4919 mips_split_p[SYMBOL_GOTOFF_CALL] = true;
4920 mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
4921 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
4923 else
4925 if (TARGET_NEWABI)
4926 mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_disp(";
4927 else
4928 mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got(";
4929 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
4933 if (TARGET_NEWABI)
4935 mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
4936 mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
4937 mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
4940 /* Default to working around R4000 errata only if the processor
4941 was selected explicitly. */
4942 if ((target_flags_explicit & MASK_FIX_R4000) == 0
4943 && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
4944 target_flags |= MASK_FIX_R4000;
4946 /* Default to working around R4400 errata only if the processor
4947 was selected explicitly. */
4948 if ((target_flags_explicit & MASK_FIX_R4400) == 0
4949 && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
4950 target_flags |= MASK_FIX_R4400;
4953 /* Implement CONDITIONAL_REGISTER_USAGE. */
4955 void
4956 mips_conditional_register_usage (void)
4958 if (!TARGET_HARD_FLOAT)
4960 int regno;
4962 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
4963 fixed_regs[regno] = call_used_regs[regno] = 1;
4964 for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
4965 fixed_regs[regno] = call_used_regs[regno] = 1;
4967 else if (! ISA_HAS_8CC)
4969 int regno;
4971 /* We only have a single condition code register. We
4972 implement this by hiding all the condition code registers,
4973 and generating RTL that refers directly to ST_REG_FIRST. */
4974 for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
4975 fixed_regs[regno] = call_used_regs[regno] = 1;
4977 /* In mips16 mode, we permit the $t temporary registers to be used
4978 for reload. We prohibit the unused $s registers, since they
4979 are caller saved, and saving them via a mips16 register would
4980 probably waste more time than just reloading the value. */
4981 if (TARGET_MIPS16)
4983 fixed_regs[18] = call_used_regs[18] = 1;
4984 fixed_regs[19] = call_used_regs[19] = 1;
4985 fixed_regs[20] = call_used_regs[20] = 1;
4986 fixed_regs[21] = call_used_regs[21] = 1;
4987 fixed_regs[22] = call_used_regs[22] = 1;
4988 fixed_regs[23] = call_used_regs[23] = 1;
4989 fixed_regs[26] = call_used_regs[26] = 1;
4990 fixed_regs[27] = call_used_regs[27] = 1;
4991 fixed_regs[30] = call_used_regs[30] = 1;
4993 /* fp20-23 are now caller saved. */
4994 if (mips_abi == ABI_64)
4996 int regno;
4997 for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
4998 call_really_used_regs[regno] = call_used_regs[regno] = 1;
5000 /* Odd registers from fp21 to fp31 are now caller saved. */
5001 if (mips_abi == ABI_N32)
5003 int regno;
5004 for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
5005 call_really_used_regs[regno] = call_used_regs[regno] = 1;
5009 /* Allocate a chunk of memory for per-function machine-dependent data. */
5010 static struct machine_function *
5011 mips_init_machine_status (void)
5013 return ((struct machine_function *)
5014 ggc_alloc_cleared (sizeof (struct machine_function)));
5017 /* On the mips16, we want to allocate $24 (T_REG) before other
5018 registers for instructions for which it is possible. This helps
5019 avoid shuffling registers around in order to set up for an xor,
5020 encouraging the compiler to use a cmp instead. */
5022 void
5023 mips_order_regs_for_local_alloc (void)
5025 register int i;
5027 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5028 reg_alloc_order[i] = i;
5030 if (TARGET_MIPS16)
5032 /* It really doesn't matter where we put register 0, since it is
5033 a fixed register anyhow. */
5034 reg_alloc_order[0] = 24;
5035 reg_alloc_order[24] = 0;
5040 /* The MIPS debug format wants all automatic variables and arguments
5041 to be in terms of the virtual frame pointer (stack pointer before
5042 any adjustment in the function), while the MIPS 3.0 linker wants
5043 the frame pointer to be the stack pointer after the initial
5044 adjustment. So, we do the adjustment here. The arg pointer (which
5045 is eliminated) points to the virtual frame pointer, while the frame
5046 pointer (which may be eliminated) points to the stack pointer after
5047 the initial adjustments. */
5049 HOST_WIDE_INT
5050 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
5052 rtx offset2 = const0_rtx;
5053 rtx reg = eliminate_constant_term (addr, &offset2);
5055 if (offset == 0)
5056 offset = INTVAL (offset2);
5058 if (reg == stack_pointer_rtx || reg == frame_pointer_rtx
5059 || reg == hard_frame_pointer_rtx)
5061 HOST_WIDE_INT frame_size = (!cfun->machine->frame.initialized)
5062 ? compute_frame_size (get_frame_size ())
5063 : cfun->machine->frame.total_size;
5065 /* MIPS16 frame is smaller */
5066 if (frame_pointer_needed && TARGET_MIPS16)
5067 frame_size -= cfun->machine->frame.args_size;
5069 offset = offset - frame_size;
5072 /* sdbout_parms does not want this to crash for unrecognized cases. */
5073 #if 0
5074 else if (reg != arg_pointer_rtx)
5075 fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
5076 addr);
5077 #endif
5079 return offset;
5082 /* Implement the PRINT_OPERAND macro. The MIPS-specific operand codes are:
5084 'X' OP is CONST_INT, prints 32 bits in hexadecimal format = "0x%08x",
5085 'x' OP is CONST_INT, prints 16 bits in hexadecimal format = "0x%04x",
5086 'h' OP is HIGH, prints %hi(X),
5087 'd' output integer constant in decimal,
5088 'z' if the operand is 0, use $0 instead of normal operand.
5089 'D' print second part of double-word register or memory operand.
5090 'L' print low-order register of double-word register operand.
5091 'M' print high-order register of double-word register operand.
5092 'C' print part of opcode for a branch condition.
5093 'F' print part of opcode for a floating-point branch condition.
5094 'N' print part of opcode for a branch condition, inverted.
5095 'W' print part of opcode for a floating-point branch condition, inverted.
5096 'B' print 'z' for EQ, 'n' for NE
5097 'b' print 'n' for EQ, 'z' for NE
5098 'T' print 'f' for EQ, 't' for NE
5099 't' print 't' for EQ, 'f' for NE
5100 'Z' print register and a comma, but print nothing for $fcc0
5101 'R' print the reloc associated with LO_SUM
5103 The punctuation characters are:
5105 '(' Turn on .set noreorder
5106 ')' Turn on .set reorder
5107 '[' Turn on .set noat
5108 ']' Turn on .set at
5109 '<' Turn on .set nomacro
5110 '>' Turn on .set macro
5111 '{' Turn on .set volatile (not GAS)
5112 '}' Turn on .set novolatile (not GAS)
5113 '&' Turn on .set noreorder if filling delay slots
5114 '*' Turn on both .set noreorder and .set nomacro if filling delay slots
5115 '!' Turn on .set nomacro if filling delay slots
5116 '#' Print nop if in a .set noreorder section.
5117 '/' Like '#', but does nothing within a delayed branch sequence
5118 '?' Print 'l' if we are to use a branch likely instead of normal branch.
5119 '@' Print the name of the assembler temporary register (at or $1).
5120 '.' Print the name of the register with a hard-wired zero (zero or $0).
5121 '^' Print the name of the pic call-through register (t9 or $25).
5122 '$' Print the name of the stack pointer register (sp or $29).
5123 '+' Print the name of the gp register (usually gp or $28).
5124 '~' Output a branch alignment to LABEL_ALIGN(NULL). */
5126 void
5127 print_operand (FILE *file, rtx op, int letter)
5129 register enum rtx_code code;
5131 if (PRINT_OPERAND_PUNCT_VALID_P (letter))
5133 switch (letter)
5135 case '?':
5136 if (mips_branch_likely)
5137 putc ('l', file);
5138 break;
5140 case '@':
5141 fputs (reg_names [GP_REG_FIRST + 1], file);
5142 break;
5144 case '^':
5145 fputs (reg_names [PIC_FUNCTION_ADDR_REGNUM], file);
5146 break;
5148 case '.':
5149 fputs (reg_names [GP_REG_FIRST + 0], file);
5150 break;
5152 case '$':
5153 fputs (reg_names[STACK_POINTER_REGNUM], file);
5154 break;
5156 case '+':
5157 fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
5158 break;
5160 case '&':
5161 if (final_sequence != 0 && set_noreorder++ == 0)
5162 fputs (".set\tnoreorder\n\t", file);
5163 break;
5165 case '*':
5166 if (final_sequence != 0)
5168 if (set_noreorder++ == 0)
5169 fputs (".set\tnoreorder\n\t", file);
5171 if (set_nomacro++ == 0)
5172 fputs (".set\tnomacro\n\t", file);
5174 break;
5176 case '!':
5177 if (final_sequence != 0 && set_nomacro++ == 0)
5178 fputs ("\n\t.set\tnomacro", file);
5179 break;
5181 case '#':
5182 if (set_noreorder != 0)
5183 fputs ("\n\tnop", file);
5184 break;
5186 case '/':
5187 /* Print an extra newline so that the delayed insn is separated
5188 from the following ones. This looks neater and is consistent
5189 with non-nop delayed sequences. */
5190 if (set_noreorder != 0 && final_sequence == 0)
5191 fputs ("\n\tnop\n", file);
5192 break;
5194 case '(':
5195 if (set_noreorder++ == 0)
5196 fputs (".set\tnoreorder\n\t", file);
5197 break;
5199 case ')':
5200 if (set_noreorder == 0)
5201 error ("internal error: %%) found without a %%( in assembler pattern");
5203 else if (--set_noreorder == 0)
5204 fputs ("\n\t.set\treorder", file);
5206 break;
5208 case '[':
5209 if (set_noat++ == 0)
5210 fputs (".set\tnoat\n\t", file);
5211 break;
5213 case ']':
5214 if (set_noat == 0)
5215 error ("internal error: %%] found without a %%[ in assembler pattern");
5216 else if (--set_noat == 0)
5217 fputs ("\n\t.set\tat", file);
5219 break;
5221 case '<':
5222 if (set_nomacro++ == 0)
5223 fputs (".set\tnomacro\n\t", file);
5224 break;
5226 case '>':
5227 if (set_nomacro == 0)
5228 error ("internal error: %%> found without a %%< in assembler pattern");
5229 else if (--set_nomacro == 0)
5230 fputs ("\n\t.set\tmacro", file);
5232 break;
5234 case '{':
5235 if (set_volatile++ == 0)
5236 fprintf (file, "%s.set\tvolatile\n\t", TARGET_MIPS_AS ? "" : "#");
5237 break;
5239 case '}':
5240 if (set_volatile == 0)
5241 error ("internal error: %%} found without a %%{ in assembler pattern");
5242 else if (--set_volatile == 0)
5243 fprintf (file, "\n\t%s.set\tnovolatile", (TARGET_MIPS_AS) ? "" : "#");
5245 break;
5247 case '~':
5249 if (align_labels_log > 0)
5250 ASM_OUTPUT_ALIGN (file, align_labels_log);
5252 break;
5254 default:
5255 error ("PRINT_OPERAND: unknown punctuation '%c'", letter);
5256 break;
5259 return;
5262 if (! op)
5264 error ("PRINT_OPERAND null pointer");
5265 return;
5268 code = GET_CODE (op);
5270 if (letter == 'C')
5271 switch (code)
5273 case EQ: fputs ("eq", file); break;
5274 case NE: fputs ("ne", file); break;
5275 case GT: fputs ("gt", file); break;
5276 case GE: fputs ("ge", file); break;
5277 case LT: fputs ("lt", file); break;
5278 case LE: fputs ("le", file); break;
5279 case GTU: fputs ("gtu", file); break;
5280 case GEU: fputs ("geu", file); break;
5281 case LTU: fputs ("ltu", file); break;
5282 case LEU: fputs ("leu", file); break;
5283 default:
5284 fatal_insn ("PRINT_OPERAND, invalid insn for %%C", op);
5287 else if (letter == 'N')
5288 switch (code)
5290 case EQ: fputs ("ne", file); break;
5291 case NE: fputs ("eq", file); break;
5292 case GT: fputs ("le", file); break;
5293 case GE: fputs ("lt", file); break;
5294 case LT: fputs ("ge", file); break;
5295 case LE: fputs ("gt", file); break;
5296 case GTU: fputs ("leu", file); break;
5297 case GEU: fputs ("ltu", file); break;
5298 case LTU: fputs ("geu", file); break;
5299 case LEU: fputs ("gtu", file); break;
5300 default:
5301 fatal_insn ("PRINT_OPERAND, invalid insn for %%N", op);
5304 else if (letter == 'F')
5305 switch (code)
5307 case EQ: fputs ("c1f", file); break;
5308 case NE: fputs ("c1t", file); break;
5309 default:
5310 fatal_insn ("PRINT_OPERAND, invalid insn for %%F", op);
5313 else if (letter == 'W')
5314 switch (code)
5316 case EQ: fputs ("c1t", file); break;
5317 case NE: fputs ("c1f", file); break;
5318 default:
5319 fatal_insn ("PRINT_OPERAND, invalid insn for %%W", op);
5322 else if (letter == 'h')
5324 if (GET_CODE (op) == HIGH)
5325 op = XEXP (op, 0);
5327 print_operand_reloc (file, op, mips_hi_relocs);
5330 else if (letter == 'R')
5331 print_operand_reloc (file, op, mips_lo_relocs);
5333 else if (letter == 'Z')
5335 register int regnum;
5337 if (code != REG)
5338 abort ();
5340 regnum = REGNO (op);
5341 if (! ST_REG_P (regnum))
5342 abort ();
5344 if (regnum != ST_REG_FIRST)
5345 fprintf (file, "%s,", reg_names[regnum]);
5348 else if (code == REG || code == SUBREG)
5350 register int regnum;
5352 if (code == REG)
5353 regnum = REGNO (op);
5354 else
5355 regnum = true_regnum (op);
5357 if ((letter == 'M' && ! WORDS_BIG_ENDIAN)
5358 || (letter == 'L' && WORDS_BIG_ENDIAN)
5359 || letter == 'D')
5360 regnum++;
5362 fprintf (file, "%s", reg_names[regnum]);
5365 else if (code == MEM)
5367 if (letter == 'D')
5368 output_address (plus_constant (XEXP (op, 0), 4));
5369 else
5370 output_address (XEXP (op, 0));
5373 else if (letter == 'x' && GET_CODE (op) == CONST_INT)
5374 fprintf (file, HOST_WIDE_INT_PRINT_HEX, 0xffff & INTVAL(op));
5376 else if (letter == 'X' && GET_CODE(op) == CONST_INT)
5377 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
5379 else if (letter == 'd' && GET_CODE(op) == CONST_INT)
5380 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (INTVAL(op)));
5382 else if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
5383 fputs (reg_names[GP_REG_FIRST], file);
5385 else if (letter == 'd' || letter == 'x' || letter == 'X')
5386 output_operand_lossage ("invalid use of %%d, %%x, or %%X");
5388 else if (letter == 'B')
5389 fputs (code == EQ ? "z" : "n", file);
5390 else if (letter == 'b')
5391 fputs (code == EQ ? "n" : "z", file);
5392 else if (letter == 'T')
5393 fputs (code == EQ ? "f" : "t", file);
5394 else if (letter == 't')
5395 fputs (code == EQ ? "t" : "f", file);
5397 else if (CONST_GP_P (op))
5398 fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
5400 else
5401 output_addr_const (file, op);
5405 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM.
5406 RELOCS is the array of relocations to use. */
5408 static void
5409 print_operand_reloc (FILE *file, rtx op, const char **relocs)
5411 enum mips_symbol_type symbol_type;
5412 const char *p;
5413 rtx base;
5414 HOST_WIDE_INT offset;
5416 if (!mips_symbolic_constant_p (op, &symbol_type) || relocs[symbol_type] == 0)
5417 fatal_insn ("PRINT_OPERAND, invalid operand for relocation", op);
5419 /* If OP uses an UNSPEC address, we want to print the inner symbol. */
5420 mips_split_const (op, &base, &offset);
5421 if (UNSPEC_ADDRESS_P (base))
5422 op = plus_constant (UNSPEC_ADDRESS (base), offset);
5424 fputs (relocs[symbol_type], file);
5425 output_addr_const (file, op);
5426 for (p = relocs[symbol_type]; *p != 0; p++)
5427 if (*p == '(')
5428 fputc (')', file);
5431 /* Output address operand X to FILE. */
5433 void
5434 print_operand_address (FILE *file, rtx x)
5436 struct mips_address_info addr;
5438 if (mips_classify_address (&addr, x, word_mode, true))
5439 switch (addr.type)
5441 case ADDRESS_REG:
5442 print_operand (file, addr.offset, 0);
5443 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
5444 return;
5446 case ADDRESS_LO_SUM:
5447 print_operand (file, addr.offset, 'R');
5448 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
5449 return;
5451 case ADDRESS_CONST_INT:
5452 case ADDRESS_SYMBOLIC:
5453 output_addr_const (file, x);
5454 return;
5456 abort ();
5459 /* Target hook for assembling integer objects. It appears that the Irix
5460 6 assembler can't handle 64-bit decimal integers, so avoid printing
5461 such an integer here. */
5463 static bool
5464 mips_assemble_integer (rtx x, unsigned int size, int aligned_p)
5466 if ((TARGET_64BIT || TARGET_GAS) && size == 8 && aligned_p)
5468 fputs ("\t.dword\t", asm_out_file);
5469 if (HOST_BITS_PER_WIDE_INT < 64 || GET_CODE (x) != CONST_INT)
5470 output_addr_const (asm_out_file, x);
5471 else
5472 print_operand (asm_out_file, x, 'X');
5473 fputc ('\n', asm_out_file);
5474 return true;
5476 return default_assemble_integer (x, size, aligned_p);
5479 /* When using assembler macros, keep track of all of small-data externs
5480 so that mips_file_end can emit the appropriate declarations for them.
5482 In most cases it would be safe (though pointless) to emit .externs
5483 for other symbols too. One exception is when an object is within
5484 the -G limit but declared by the user to be in a section other
5485 than .sbss or .sdata. */
5488 mips_output_external (FILE *file ATTRIBUTE_UNUSED, tree decl, const char *name)
5490 register struct extern_list *p;
5492 if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
5494 p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5495 p->next = extern_head;
5496 p->name = name;
5497 p->size = int_size_in_bytes (TREE_TYPE (decl));
5498 extern_head = p;
5501 if (TARGET_IRIX && mips_abi == ABI_32 && TREE_CODE (decl) == FUNCTION_DECL)
5503 p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5504 p->next = extern_head;
5505 p->name = name;
5506 p->size = -1;
5507 extern_head = p;
5510 return 0;
5513 #if TARGET_IRIX
5514 void
5515 irix_output_external_libcall (rtx fun)
5517 register struct extern_list *p;
5519 if (mips_abi == ABI_32)
5521 p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5522 p->next = extern_head;
5523 p->name = XSTR (fun, 0);
5524 p->size = -1;
5525 extern_head = p;
5528 #endif
5530 /* Emit a new filename to a stream. If we are smuggling stabs, try to
5531 put out a MIPS ECOFF file and a stab. */
5533 void
5534 mips_output_filename (FILE *stream, const char *name)
5536 char ltext_label_name[100];
5538 /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
5539 directives. */
5540 if (write_symbols == DWARF2_DEBUG)
5541 return;
5542 else if (mips_output_filename_first_time)
5544 mips_output_filename_first_time = 0;
5545 SET_FILE_NUMBER ();
5546 current_function_file = name;
5547 ASM_OUTPUT_FILENAME (stream, num_source_filenames, name);
5548 /* This tells mips-tfile that stabs will follow. */
5549 if (!TARGET_GAS && write_symbols == DBX_DEBUG)
5550 fprintf (stream, "\t#@stabs\n");
5553 else if (write_symbols == DBX_DEBUG)
5555 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
5556 fprintf (stream, "%s", ASM_STABS_OP);
5557 output_quoted_string (stream, name);
5558 fprintf (stream, ",%d,0,0,%s\n", N_SOL, &ltext_label_name[1]);
5561 else if (name != current_function_file
5562 && strcmp (name, current_function_file) != 0)
5564 SET_FILE_NUMBER ();
5565 current_function_file = name;
5566 ASM_OUTPUT_FILENAME (stream, num_source_filenames, name);
5570 /* Emit a linenumber. For encapsulated stabs, we need to put out a stab
5571 as well as a .loc, since it is possible that MIPS ECOFF might not be
5572 able to represent the location for inlines that come from a different
5573 file. */
5575 void
5576 mips_output_lineno (FILE *stream, int line)
5578 if (write_symbols == DBX_DEBUG)
5580 ++sym_lineno;
5581 fprintf (stream, "%sLM%d:\n%s%d,0,%d,%sLM%d\n",
5582 LOCAL_LABEL_PREFIX, sym_lineno, ASM_STABN_OP, N_SLINE, line,
5583 LOCAL_LABEL_PREFIX, sym_lineno);
5585 else
5587 fprintf (stream, "\n\t.loc\t%d %d\n", num_source_filenames, line);
5588 LABEL_AFTER_LOC (stream);
5592 /* Output an ASCII string, in a space-saving way. PREFIX is the string
5593 that should be written before the opening quote, such as "\t.ascii\t"
5594 for real string data or "\t# " for a comment. */
5596 void
5597 mips_output_ascii (FILE *stream, const char *string_param, size_t len,
5598 const char *prefix)
5600 size_t i;
5601 int cur_pos = 17;
5602 register const unsigned char *string =
5603 (const unsigned char *)string_param;
5605 fprintf (stream, "%s\"", prefix);
5606 for (i = 0; i < len; i++)
5608 register int c = string[i];
5610 switch (c)
5612 case '\"':
5613 case '\\':
5614 putc ('\\', stream);
5615 putc (c, stream);
5616 cur_pos += 2;
5617 break;
5619 case TARGET_NEWLINE:
5620 fputs ("\\n", stream);
5621 if (i+1 < len
5622 && (((c = string[i+1]) >= '\040' && c <= '~')
5623 || c == TARGET_TAB))
5624 cur_pos = 32767; /* break right here */
5625 else
5626 cur_pos += 2;
5627 break;
5629 case TARGET_TAB:
5630 fputs ("\\t", stream);
5631 cur_pos += 2;
5632 break;
5634 case TARGET_FF:
5635 fputs ("\\f", stream);
5636 cur_pos += 2;
5637 break;
5639 case TARGET_BS:
5640 fputs ("\\b", stream);
5641 cur_pos += 2;
5642 break;
5644 case TARGET_CR:
5645 fputs ("\\r", stream);
5646 cur_pos += 2;
5647 break;
5649 default:
5650 if (c >= ' ' && c < 0177)
5652 putc (c, stream);
5653 cur_pos++;
5655 else
5657 fprintf (stream, "\\%03o", c);
5658 cur_pos += 4;
5662 if (cur_pos > 72 && i+1 < len)
5664 cur_pos = 17;
5665 fprintf (stream, "\"\n%s\"", prefix);
5668 fprintf (stream, "\"\n");
5671 /* Implement TARGET_ASM_FILE_START. */
5673 static void
5674 mips_file_start (void)
5676 default_file_start ();
5678 /* Versions of the MIPS assembler before 2.20 generate errors if a branch
5679 inside of a .set noreorder section jumps to a label outside of the .set
5680 noreorder section. Revision 2.20 just set nobopt silently rather than
5681 fixing the bug. */
5683 if (TARGET_MIPS_AS && optimize && flag_delayed_branch)
5684 fprintf (asm_out_file, "\t.set\tnobopt\n");
5686 if (TARGET_GAS)
5688 #if defined(OBJECT_FORMAT_ELF) && !TARGET_IRIX
5689 /* Generate a special section to describe the ABI switches used to
5690 produce the resultant binary. This used to be done by the assembler
5691 setting bits in the ELF header's flags field, but we have run out of
5692 bits. GDB needs this information in order to be able to correctly
5693 debug these binaries. See the function mips_gdbarch_init() in
5694 gdb/mips-tdep.c. This is unnecessary for the IRIX 5/6 ABIs and
5695 causes unnecessary IRIX 6 ld warnings. */
5696 const char * abi_string = NULL;
5698 switch (mips_abi)
5700 case ABI_32: abi_string = "abi32"; break;
5701 case ABI_N32: abi_string = "abiN32"; break;
5702 case ABI_64: abi_string = "abi64"; break;
5703 case ABI_O64: abi_string = "abiO64"; break;
5704 case ABI_EABI: abi_string = TARGET_64BIT ? "eabi64" : "eabi32"; break;
5705 default:
5706 abort ();
5708 /* Note - we use fprintf directly rather than called named_section()
5709 because in this way we can avoid creating an allocated section. We
5710 do not want this section to take up any space in the running
5711 executable. */
5712 fprintf (asm_out_file, "\t.section .mdebug.%s\n", abi_string);
5714 /* There is no ELF header flag to distinguish long32 forms of the
5715 EABI from long64 forms. Emit a special section to help tools
5716 such as GDB. */
5717 if (mips_abi == ABI_EABI)
5718 fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n",
5719 TARGET_LONG64 ? 64 : 32);
5721 /* Restore the default section. */
5722 fprintf (asm_out_file, "\t.previous\n");
5723 #endif
5726 /* Generate the pseudo ops that System V.4 wants. */
5727 #ifndef ABICALLS_ASM_OP
5728 #define ABICALLS_ASM_OP "\t.abicalls"
5729 #endif
5730 if (TARGET_ABICALLS)
5731 /* ??? but do not want this (or want pic0) if -non-shared? */
5732 fprintf (asm_out_file, "%s\n", ABICALLS_ASM_OP);
5734 if (TARGET_MIPS16)
5735 fprintf (asm_out_file, "\t.set\tmips16\n");
5737 if (flag_verbose_asm)
5738 fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
5739 ASM_COMMENT_START,
5740 mips_section_threshold, mips_arch_info->name, mips_isa);
5743 #ifdef BSS_SECTION_ASM_OP
5744 /* Implement ASM_OUTPUT_ALIGNED_BSS. This differs from the default only
5745 in the use of sbss. */
5747 void
5748 mips_output_aligned_bss (FILE *stream, tree decl, const char *name,
5749 unsigned HOST_WIDE_INT size, int align)
5751 extern tree last_assemble_variable_decl;
5753 if (mips_in_small_data_p (decl))
5754 named_section (0, ".sbss", 0);
5755 else
5756 bss_section ();
5757 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
5758 last_assemble_variable_decl = decl;
5759 ASM_DECLARE_OBJECT_NAME (stream, name, decl);
5760 ASM_OUTPUT_SKIP (stream, size != 0 ? size : 1);
5762 #endif
5764 /* Implement TARGET_ASM_FILE_END. When using assembler macros, emit
5765 .externs for any small-data variables that turned out to be external. */
5767 static void
5768 mips_file_end (void)
5770 tree name_tree;
5771 struct extern_list *p;
5773 if (extern_head)
5775 fputs ("\n", asm_out_file);
5777 for (p = extern_head; p != 0; p = p->next)
5779 name_tree = get_identifier (p->name);
5781 /* Positively ensure only one .extern for any given symbol. */
5782 if (!TREE_ASM_WRITTEN (name_tree)
5783 && TREE_SYMBOL_REFERENCED (name_tree))
5785 TREE_ASM_WRITTEN (name_tree) = 1;
5786 /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
5787 `.global name .text' directive for every used but
5788 undefined function. If we don't, the linker may perform
5789 an optimization (skipping over the insns that set $gp)
5790 when it is unsafe. */
5791 if (TARGET_IRIX && mips_abi == ABI_32 && p->size == -1)
5793 fputs ("\t.globl ", asm_out_file);
5794 assemble_name (asm_out_file, p->name);
5795 fputs (" .text\n", asm_out_file);
5797 else
5799 fputs ("\t.extern\t", asm_out_file);
5800 assemble_name (asm_out_file, p->name);
5801 fprintf (asm_out_file, ", %d\n", p->size);
5808 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This is usually the same as
5809 the elfos.h version, but we also need to handle -muninit-const-in-rodata
5810 and the limitations of the SGI o32 assembler. */
5812 void
5813 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
5814 unsigned HOST_WIDE_INT size,
5815 unsigned int align)
5817 /* If the target wants uninitialized const declarations in
5818 .rdata then don't put them in .comm. */
5819 if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA
5820 && TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)
5821 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5823 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
5824 targetm.asm_out.globalize_label (stream, name);
5826 readonly_data_section ();
5827 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
5828 mips_declare_object (stream, name, "",
5829 ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
5830 size);
5832 else
5833 /* The SGI o32 assembler doesn't accept an alignment. */
5834 mips_declare_common_object (stream, name, "\n\t.comm\t",
5835 size, align, !TARGET_SGI_O32_AS);
5838 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
5839 NAME is the name of the object and ALIGN is the required alignment
5840 in bytes. TAKES_ALIGNMENT_P is true if the directive takes a third
5841 alignment argument. */
5843 void
5844 mips_declare_common_object (FILE *stream, const char *name,
5845 const char *init_string,
5846 unsigned HOST_WIDE_INT size,
5847 unsigned int align, bool takes_alignment_p)
5849 if (!takes_alignment_p)
5851 size += (align / BITS_PER_UNIT) - 1;
5852 size -= size % (align / BITS_PER_UNIT);
5853 mips_declare_object (stream, name, init_string,
5854 "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
5856 else
5857 mips_declare_object (stream, name, init_string,
5858 "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
5859 size, align / BITS_PER_UNIT);
5862 /* Emit either a label, .comm, or .lcomm directive. When using assembler
5863 macros, mark the symbol as written so that mips_file_end won't emit an
5864 .extern for it. STREAM is the output file, NAME is the name of the
5865 symbol, INIT_STRING is the string that should be written before the
5866 symbol and FINAL_STRING is the string that should be written after it.
5867 FINAL_STRING is a printf() format that consumes the remaining arguments. */
5869 void
5870 mips_declare_object (FILE *stream, const char *name, const char *init_string,
5871 const char *final_string, ...)
5873 va_list ap;
5875 fputs (init_string, stream);
5876 assemble_name (stream, name);
5877 va_start (ap, final_string);
5878 vfprintf (stream, final_string, ap);
5879 va_end (ap);
5881 if (!TARGET_EXPLICIT_RELOCS)
5883 tree name_tree = get_identifier (name);
5884 TREE_ASM_WRITTEN (name_tree) = 1;
5888 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
5889 extern int size_directive_output;
5891 /* Implement ASM_DECLARE_OBJECT_NAME. This is like most of the standard ELF
5892 definitions except that it uses mips_declare_object() to emit the label. */
5894 void
5895 mips_declare_object_name (FILE *stream, const char *name,
5896 tree decl ATTRIBUTE_UNUSED)
5898 if (!TARGET_SGI_O32_AS)
5900 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
5901 ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
5902 #endif
5904 size_directive_output = 0;
5905 if (!flag_inhibit_size_directive && DECL_SIZE (decl))
5907 HOST_WIDE_INT size;
5909 size_directive_output = 1;
5910 size = int_size_in_bytes (TREE_TYPE (decl));
5911 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
5915 mips_declare_object (stream, name, "", ":\n", 0);
5918 /* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
5920 void
5921 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
5923 const char *name;
5925 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
5926 if (!TARGET_SGI_O32_AS
5927 && !flag_inhibit_size_directive
5928 && DECL_SIZE (decl) != 0
5929 && !at_end && top_level
5930 && DECL_INITIAL (decl) == error_mark_node
5931 && !size_directive_output)
5933 HOST_WIDE_INT size;
5935 size_directive_output = 1;
5936 size = int_size_in_bytes (TREE_TYPE (decl));
5937 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
5940 #endif
5942 /* Return true if X is a small data address that can be rewritten
5943 as a LO_SUM. */
5945 static bool
5946 mips_rewrite_small_data_p (rtx x)
5948 enum mips_symbol_type symbol_type;
5950 return (TARGET_EXPLICIT_RELOCS
5951 && mips_symbolic_constant_p (x, &symbol_type)
5952 && symbol_type == SYMBOL_SMALL_DATA);
5956 /* A for_each_rtx callback for small_data_pattern. */
5958 static int
5959 small_data_pattern_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
5961 if (GET_CODE (*loc) == LO_SUM)
5962 return -1;
5964 return mips_rewrite_small_data_p (*loc);
5967 /* Return true if OP refers to small data symbols directly, not through
5968 a LO_SUM. */
5971 small_data_pattern (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
5973 return (GET_CODE (op) != SEQUENCE
5974 && for_each_rtx (&op, small_data_pattern_1, 0));
5977 /* A for_each_rtx callback, used by mips_rewrite_small_data. */
5979 static int
5980 mips_rewrite_small_data_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
5982 if (mips_rewrite_small_data_p (*loc))
5983 *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
5985 if (GET_CODE (*loc) == LO_SUM)
5986 return -1;
5988 return 0;
5991 /* If possible, rewrite OP so that it refers to small data using
5992 explicit relocations. */
5995 mips_rewrite_small_data (rtx op)
5997 op = copy_insn (op);
5998 for_each_rtx (&op, mips_rewrite_small_data_1, 0);
5999 return op;
6002 /* Return true if the current function has an insn that implicitly
6003 refers to $gp. */
6005 static bool
6006 mips_function_has_gp_insn (void)
6008 /* Don't bother rechecking if we found one last time. */
6009 if (!cfun->machine->has_gp_insn_p)
6011 rtx insn;
6013 push_topmost_sequence ();
6014 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6015 if (INSN_P (insn)
6016 && GET_CODE (PATTERN (insn)) != USE
6017 && GET_CODE (PATTERN (insn)) != CLOBBER
6018 && (get_attr_got (insn) != GOT_UNSET
6019 || small_data_pattern (PATTERN (insn), VOIDmode)))
6020 break;
6021 pop_topmost_sequence ();
6023 cfun->machine->has_gp_insn_p = (insn != 0);
6025 return cfun->machine->has_gp_insn_p;
6029 /* Return the register that should be used as the global pointer
6030 within this function. Return 0 if the function doesn't need
6031 a global pointer. */
6033 static unsigned int
6034 mips_global_pointer (void)
6036 unsigned int regno;
6038 /* $gp is always available in non-abicalls code. */
6039 if (!TARGET_ABICALLS)
6040 return GLOBAL_POINTER_REGNUM;
6042 /* We must always provide $gp when it is used implicitly. */
6043 if (!TARGET_EXPLICIT_RELOCS)
6044 return GLOBAL_POINTER_REGNUM;
6046 /* FUNCTION_PROFILER includes a jal macro, so we need to give it
6047 a valid gp. */
6048 if (current_function_profile)
6049 return GLOBAL_POINTER_REGNUM;
6051 /* If the function has a nonlocal goto, $gp must hold the correct
6052 global pointer for the target function. */
6053 if (current_function_has_nonlocal_goto)
6054 return GLOBAL_POINTER_REGNUM;
6056 /* If the gp is never referenced, there's no need to initialize it.
6057 Note that reload can sometimes introduce constant pool references
6058 into a function that otherwise didn't need them. For example,
6059 suppose we have an instruction like:
6061 (set (reg:DF R1) (float:DF (reg:SI R2)))
6063 If R2 turns out to be constant such as 1, the instruction may have a
6064 REG_EQUAL note saying that R1 == 1.0. Reload then has the option of
6065 using this constant if R2 doesn't get allocated to a register.
6067 In cases like these, reload will have added the constant to the pool
6068 but no instruction will yet refer to it. */
6069 if (!regs_ever_live[GLOBAL_POINTER_REGNUM]
6070 && !current_function_uses_const_pool
6071 && !mips_function_has_gp_insn ())
6072 return 0;
6074 /* We need a global pointer, but perhaps we can use a call-clobbered
6075 register instead of $gp. */
6076 if (TARGET_NEWABI && current_function_is_leaf)
6077 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6078 if (!regs_ever_live[regno]
6079 && call_used_regs[regno]
6080 && !fixed_regs[regno]
6081 && regno != PIC_FUNCTION_ADDR_REGNUM)
6082 return regno;
6084 return GLOBAL_POINTER_REGNUM;
6088 /* Return true if the current function must save REGNO. */
6090 static bool
6091 mips_save_reg_p (unsigned int regno)
6093 /* We only need to save $gp for NewABI PIC. */
6094 if (regno == GLOBAL_POINTER_REGNUM)
6095 return (TARGET_ABICALLS && TARGET_NEWABI
6096 && cfun->machine->global_pointer == regno);
6098 /* Check call-saved registers. */
6099 if (regs_ever_live[regno] && !call_used_regs[regno])
6100 return true;
6102 /* We need to save the old frame pointer before setting up a new one. */
6103 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
6104 return true;
6106 /* We need to save the incoming return address if it is ever clobbered
6107 within the function. */
6108 if (regno == GP_REG_FIRST + 31 && regs_ever_live[regno])
6109 return true;
6111 if (TARGET_MIPS16)
6113 tree return_type;
6115 return_type = DECL_RESULT (current_function_decl);
6117 /* $18 is a special case in mips16 code. It may be used to call
6118 a function which returns a floating point value, but it is
6119 marked in call_used_regs. */
6120 if (regno == GP_REG_FIRST + 18 && regs_ever_live[regno])
6121 return true;
6123 /* $31 is also a special case. It will be used to copy a return
6124 value into the floating point registers if the return value is
6125 floating point. */
6126 if (regno == GP_REG_FIRST + 31
6127 && mips16_hard_float
6128 && !aggregate_value_p (return_type, current_function_decl)
6129 && GET_MODE_CLASS (DECL_MODE (return_type)) == MODE_FLOAT
6130 && GET_MODE_SIZE (DECL_MODE (return_type)) <= UNITS_PER_FPVALUE)
6131 return true;
6134 return false;
6138 /* Return the bytes needed to compute the frame pointer from the current
6139 stack pointer. SIZE is the size (in bytes) of the local variables.
6141 Mips stack frames look like:
6143 Before call After call
6144 +-----------------------+ +-----------------------+
6145 high | | | |
6146 mem. | | | |
6147 | caller's temps. | | caller's temps. |
6148 | | | |
6149 +-----------------------+ +-----------------------+
6150 | | | |
6151 | arguments on stack. | | arguments on stack. |
6152 | | | |
6153 +-----------------------+ +-----------------------+
6154 | 4 words to save | | 4 words to save |
6155 | arguments passed | | arguments passed |
6156 | in registers, even | | in registers, even |
6157 SP->| if not passed. | VFP->| if not passed. |
6158 +-----------------------+ +-----------------------+
6160 | fp register save |
6162 +-----------------------+
6164 | gp register save |
6166 +-----------------------+
6168 | local variables |
6170 +-----------------------+
6172 | alloca allocations |
6174 +-----------------------+
6176 | GP save for V.4 abi |
6178 +-----------------------+
6180 | arguments on stack |
6182 +-----------------------+
6183 | 4 words to save |
6184 | arguments passed |
6185 | in registers, even |
6186 low SP->| if not passed. |
6187 memory +-----------------------+
6191 HOST_WIDE_INT
6192 compute_frame_size (HOST_WIDE_INT size)
6194 unsigned int regno;
6195 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
6196 HOST_WIDE_INT var_size; /* # bytes that variables take up */
6197 HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
6198 HOST_WIDE_INT cprestore_size; /* # bytes that the cprestore slot takes up */
6199 HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */
6200 HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
6201 HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
6202 unsigned int mask; /* mask of saved gp registers */
6203 unsigned int fmask; /* mask of saved fp registers */
6205 cfun->machine->global_pointer = mips_global_pointer ();
6207 gp_reg_size = 0;
6208 fp_reg_size = 0;
6209 mask = 0;
6210 fmask = 0;
6211 var_size = MIPS_STACK_ALIGN (size);
6212 args_size = current_function_outgoing_args_size;
6213 cprestore_size = MIPS_STACK_ALIGN (STARTING_FRAME_OFFSET) - args_size;
6215 /* The space set aside by STARTING_FRAME_OFFSET isn't needed in leaf
6216 functions. If the function has local variables, we're committed
6217 to allocating it anyway. Otherwise reclaim it here. */
6218 if (var_size == 0 && current_function_is_leaf)
6219 cprestore_size = args_size = 0;
6221 /* The MIPS 3.0 linker does not like functions that dynamically
6222 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
6223 looks like we are trying to create a second frame pointer to the
6224 function, so allocate some stack space to make it happy. */
6226 if (args_size == 0 && current_function_calls_alloca)
6227 args_size = 4 * UNITS_PER_WORD;
6229 total_size = var_size + args_size + cprestore_size;
6231 /* Calculate space needed for gp registers. */
6232 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6233 if (mips_save_reg_p (regno))
6235 gp_reg_size += GET_MODE_SIZE (gpr_mode);
6236 mask |= 1 << (regno - GP_REG_FIRST);
6239 /* We need to restore these for the handler. */
6240 if (current_function_calls_eh_return)
6242 unsigned int i;
6243 for (i = 0; ; ++i)
6245 regno = EH_RETURN_DATA_REGNO (i);
6246 if (regno == INVALID_REGNUM)
6247 break;
6248 gp_reg_size += GET_MODE_SIZE (gpr_mode);
6249 mask |= 1 << (regno - GP_REG_FIRST);
6253 /* This loop must iterate over the same space as its companion in
6254 save_restore_insns. */
6255 for (regno = (FP_REG_LAST - FP_INC + 1);
6256 regno >= FP_REG_FIRST;
6257 regno -= FP_INC)
6259 if (mips_save_reg_p (regno))
6261 fp_reg_size += FP_INC * UNITS_PER_FPREG;
6262 fmask |= ((1 << FP_INC) - 1) << (regno - FP_REG_FIRST);
6266 gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
6267 total_size += gp_reg_rounded + MIPS_STACK_ALIGN (fp_reg_size);
6269 /* Add in space reserved on the stack by the callee for storing arguments
6270 passed in registers. */
6271 if (!TARGET_OLDABI)
6272 total_size += MIPS_STACK_ALIGN (current_function_pretend_args_size);
6274 /* Save other computed information. */
6275 cfun->machine->frame.total_size = total_size;
6276 cfun->machine->frame.var_size = var_size;
6277 cfun->machine->frame.args_size = args_size;
6278 cfun->machine->frame.cprestore_size = cprestore_size;
6279 cfun->machine->frame.gp_reg_size = gp_reg_size;
6280 cfun->machine->frame.fp_reg_size = fp_reg_size;
6281 cfun->machine->frame.mask = mask;
6282 cfun->machine->frame.fmask = fmask;
6283 cfun->machine->frame.initialized = reload_completed;
6284 cfun->machine->frame.num_gp = gp_reg_size / UNITS_PER_WORD;
6285 cfun->machine->frame.num_fp = fp_reg_size / (FP_INC * UNITS_PER_FPREG);
6287 if (mask)
6289 HOST_WIDE_INT offset;
6291 offset = (args_size + cprestore_size + var_size
6292 + gp_reg_size - GET_MODE_SIZE (gpr_mode));
6293 cfun->machine->frame.gp_sp_offset = offset;
6294 cfun->machine->frame.gp_save_offset = offset - total_size;
6296 else
6298 cfun->machine->frame.gp_sp_offset = 0;
6299 cfun->machine->frame.gp_save_offset = 0;
6302 if (fmask)
6304 HOST_WIDE_INT offset;
6306 offset = (args_size + cprestore_size + var_size
6307 + gp_reg_rounded + fp_reg_size
6308 - FP_INC * UNITS_PER_FPREG);
6309 cfun->machine->frame.fp_sp_offset = offset;
6310 cfun->machine->frame.fp_save_offset = offset - total_size;
6312 else
6314 cfun->machine->frame.fp_sp_offset = 0;
6315 cfun->machine->frame.fp_save_offset = 0;
6318 /* Ok, we're done. */
6319 return total_size;
6322 /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame
6323 pointer or argument pointer. TO is either the stack pointer or
6324 hard frame pointer. */
6326 HOST_WIDE_INT
6327 mips_initial_elimination_offset (int from, int to)
6329 HOST_WIDE_INT offset;
6331 compute_frame_size (get_frame_size ());
6333 /* Set OFFSET to the offset from the stack pointer. */
6334 switch (from)
6336 case FRAME_POINTER_REGNUM:
6337 offset = 0;
6338 break;
6340 case ARG_POINTER_REGNUM:
6341 offset = cfun->machine->frame.total_size;
6342 if (TARGET_NEWABI)
6343 offset -= current_function_pretend_args_size;
6344 break;
6346 default:
6347 abort ();
6350 if (TARGET_MIPS16 && to == HARD_FRAME_POINTER_REGNUM)
6351 offset -= cfun->machine->frame.args_size;
6353 return offset;
6356 /* Implement RETURN_ADDR_RTX. Note, we do not support moving
6357 back to a previous frame. */
6359 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
6361 if (count != 0)
6362 return const0_rtx;
6364 return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
6367 /* Use FN to save or restore register REGNO. MODE is the register's
6368 mode and OFFSET is the offset of its save slot from the current
6369 stack pointer. */
6371 static void
6372 mips_save_restore_reg (enum machine_mode mode, int regno,
6373 HOST_WIDE_INT offset, mips_save_restore_fn fn)
6375 rtx mem;
6377 mem = gen_rtx_MEM (mode, plus_constant (stack_pointer_rtx, offset));
6378 if (!current_function_calls_eh_return)
6379 RTX_UNCHANGING_P (mem) = 1;
6381 fn (gen_rtx_REG (mode, regno), mem);
6385 /* Call FN for each register that is saved by the current function.
6386 SP_OFFSET is the offset of the current stack pointer from the start
6387 of the frame. */
6389 static void
6390 mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
6392 #define BITSET_P(VALUE, BIT) (((VALUE) & (1L << (BIT))) != 0)
6394 enum machine_mode fpr_mode;
6395 HOST_WIDE_INT offset;
6396 int regno;
6398 /* Save registers starting from high to low. The debuggers prefer at least
6399 the return register be stored at func+4, and also it allows us not to
6400 need a nop in the epilog if at least one register is reloaded in
6401 addition to return address. */
6402 offset = cfun->machine->frame.gp_sp_offset - sp_offset;
6403 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
6404 if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
6406 mips_save_restore_reg (gpr_mode, regno, offset, fn);
6407 offset -= GET_MODE_SIZE (gpr_mode);
6410 /* This loop must iterate over the same space as its companion in
6411 compute_frame_size. */
6412 offset = cfun->machine->frame.fp_sp_offset - sp_offset;
6413 fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
6414 for (regno = (FP_REG_LAST - FP_INC + 1);
6415 regno >= FP_REG_FIRST;
6416 regno -= FP_INC)
6417 if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
6419 mips_save_restore_reg (fpr_mode, regno, offset, fn);
6420 offset -= GET_MODE_SIZE (fpr_mode);
6422 #undef BITSET_P
6425 /* If we're generating n32 or n64 abicalls, and the current function
6426 does not use $28 as its global pointer, emit a cplocal directive.
6427 Use pic_offset_table_rtx as the argument to the directive. */
6429 static void
6430 mips_output_cplocal (void)
6432 if (!TARGET_EXPLICIT_RELOCS
6433 && cfun->machine->global_pointer > 0
6434 && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
6435 output_asm_insn (".cplocal %+", 0);
6438 /* If we're generating n32 or n64 abicalls, emit instructions
6439 to set up the global pointer. */
6441 static void
6442 mips_emit_loadgp (void)
6444 if (TARGET_ABICALLS && TARGET_NEWABI && cfun->machine->global_pointer > 0)
6446 rtx addr, offset, incoming_address;
6448 addr = XEXP (DECL_RTL (current_function_decl), 0);
6449 offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
6450 incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
6451 emit_insn (gen_loadgp (offset, incoming_address));
6452 if (!TARGET_EXPLICIT_RELOCS)
6453 emit_insn (gen_loadgp_blockage ());
6457 /* Set up the stack and frame (if desired) for the function. */
6459 static void
6460 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
6462 const char *fnname;
6463 HOST_WIDE_INT tsize = cfun->machine->frame.total_size;
6465 /* ??? When is this really needed? At least the GNU assembler does not
6466 need the source filename more than once in the file, beyond what is
6467 emitted by the debug information. */
6468 if (!TARGET_GAS)
6469 ASM_OUTPUT_SOURCE_FILENAME (file, DECL_SOURCE_FILE (current_function_decl));
6471 #ifdef SDB_DEBUGGING_INFO
6472 if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
6473 ASM_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl), 0);
6474 #endif
6476 /* In mips16 mode, we may need to generate a 32 bit to handle
6477 floating point arguments. The linker will arrange for any 32 bit
6478 functions to call this stub, which will then jump to the 16 bit
6479 function proper. */
6480 if (TARGET_MIPS16 && !TARGET_SOFT_FLOAT
6481 && current_function_args_info.fp_code != 0)
6482 build_mips16_function_stub (file);
6484 if (!FUNCTION_NAME_ALREADY_DECLARED)
6486 /* Get the function name the same way that toplev.c does before calling
6487 assemble_start_function. This is needed so that the name used here
6488 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
6489 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
6491 if (!flag_inhibit_size_directive)
6493 fputs ("\t.ent\t", file);
6494 assemble_name (file, fnname);
6495 fputs ("\n", file);
6498 assemble_name (file, fnname);
6499 fputs (":\n", file);
6502 if (!flag_inhibit_size_directive)
6504 /* .frame FRAMEREG, FRAMESIZE, RETREG */
6505 fprintf (file,
6506 "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
6507 "# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
6508 ", args= " HOST_WIDE_INT_PRINT_DEC
6509 ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
6510 (reg_names[(frame_pointer_needed)
6511 ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
6512 ((frame_pointer_needed && TARGET_MIPS16)
6513 ? tsize - cfun->machine->frame.args_size
6514 : tsize),
6515 reg_names[GP_REG_FIRST + 31],
6516 cfun->machine->frame.var_size,
6517 cfun->machine->frame.num_gp,
6518 cfun->machine->frame.num_fp,
6519 cfun->machine->frame.args_size,
6520 cfun->machine->frame.cprestore_size);
6522 /* .mask MASK, GPOFFSET; .fmask FPOFFSET */
6523 fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
6524 cfun->machine->frame.mask,
6525 cfun->machine->frame.gp_save_offset);
6526 fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
6527 cfun->machine->frame.fmask,
6528 cfun->machine->frame.fp_save_offset);
6530 /* Require:
6531 OLD_SP == *FRAMEREG + FRAMESIZE => can find old_sp from nominated FP reg.
6532 HIGHEST_GP_SAVED == *FRAMEREG + FRAMESIZE + GPOFFSET => can find saved regs. */
6535 if (TARGET_ABICALLS && !TARGET_NEWABI && cfun->machine->global_pointer > 0)
6537 /* Handle the initialization of $gp for SVR4 PIC. */
6538 if (!cfun->machine->all_noreorder_p)
6539 output_asm_insn ("%(.cpload\t%^%)", 0);
6540 else
6541 output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
6543 else if (cfun->machine->all_noreorder_p)
6544 output_asm_insn ("%(%<", 0);
6546 /* Tell the assembler which register we're using as the global
6547 pointer. This is needed for thunks, since they can use either
6548 explicit relocs or assembler macros. */
6549 mips_output_cplocal ();
6552 /* Make the last instruction frame related and note that it performs
6553 the operation described by FRAME_PATTERN. */
6555 static void
6556 mips_set_frame_expr (rtx frame_pattern)
6558 rtx insn;
6560 insn = get_last_insn ();
6561 RTX_FRAME_RELATED_P (insn) = 1;
6562 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
6563 frame_pattern,
6564 REG_NOTES (insn));
6568 /* Return a frame-related rtx that stores REG at MEM.
6569 REG must be a single register. */
6571 static rtx
6572 mips_frame_set (rtx mem, rtx reg)
6574 rtx set = gen_rtx_SET (VOIDmode, mem, reg);
6575 RTX_FRAME_RELATED_P (set) = 1;
6576 return set;
6580 /* Save register REG to MEM. Make the instruction frame-related. */
6582 static void
6583 mips_save_reg (rtx reg, rtx mem)
6585 if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
6587 rtx x1, x2;
6589 if (mips_split_64bit_move_p (mem, reg))
6590 mips_split_64bit_move (mem, reg);
6591 else
6592 emit_move_insn (mem, reg);
6594 x1 = mips_frame_set (mips_subword (mem, 0), mips_subword (reg, 0));
6595 x2 = mips_frame_set (mips_subword (mem, 1), mips_subword (reg, 1));
6596 mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
6598 else
6600 if (TARGET_MIPS16
6601 && REGNO (reg) != GP_REG_FIRST + 31
6602 && !M16_REG_P (REGNO (reg)))
6604 /* Save a non-mips16 register by moving it through a temporary.
6605 We don't need to do this for $31 since there's a special
6606 instruction for it. */
6607 emit_move_insn (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
6608 emit_move_insn (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
6610 else
6611 emit_move_insn (mem, reg);
6613 mips_set_frame_expr (mips_frame_set (mem, reg));
6618 /* Expand the prologue into a bunch of separate insns. */
6620 void
6621 mips_expand_prologue (void)
6623 HOST_WIDE_INT size;
6625 if (cfun->machine->global_pointer > 0)
6626 REGNO (pic_offset_table_rtx) = cfun->machine->global_pointer;
6628 size = compute_frame_size (get_frame_size ());
6630 /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
6631 bytes beforehand; this is enough to cover the register save area
6632 without going out of range. */
6633 if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
6635 HOST_WIDE_INT step1;
6637 step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
6638 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
6639 stack_pointer_rtx,
6640 GEN_INT (-step1)))) = 1;
6641 size -= step1;
6642 mips_for_each_saved_reg (size, mips_save_reg);
6645 /* Allocate the rest of the frame. */
6646 if (size > 0)
6648 if (SMALL_OPERAND (-size))
6649 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
6650 stack_pointer_rtx,
6651 GEN_INT (-size)))) = 1;
6652 else
6654 emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
6655 if (TARGET_MIPS16)
6657 /* There are no instructions to add or subtract registers
6658 from the stack pointer, so use the frame pointer as a
6659 temporary. We should always be using a frame pointer
6660 in this case anyway. */
6661 if (!frame_pointer_needed)
6662 abort ();
6664 emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
6665 emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
6666 hard_frame_pointer_rtx,
6667 MIPS_PROLOGUE_TEMP (Pmode)));
6668 emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
6670 else
6671 emit_insn (gen_sub3_insn (stack_pointer_rtx,
6672 stack_pointer_rtx,
6673 MIPS_PROLOGUE_TEMP (Pmode)));
6675 /* Describe the combined effect of the previous instructions. */
6676 mips_set_frame_expr
6677 (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
6678 plus_constant (stack_pointer_rtx, -size)));
6682 /* Set up the frame pointer, if we're using one. In mips16 code,
6683 we point the frame pointer ahead of the outgoing argument area.
6684 This should allow more variables & incoming arguments to be
6685 accessed with unextended instructions. */
6686 if (frame_pointer_needed)
6688 if (TARGET_MIPS16 && cfun->machine->frame.args_size != 0)
6690 rtx offset = GEN_INT (cfun->machine->frame.args_size);
6691 RTX_FRAME_RELATED_P
6692 (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
6693 stack_pointer_rtx,
6694 offset))) = 1;
6696 else
6697 RTX_FRAME_RELATED_P (emit_move_insn (hard_frame_pointer_rtx,
6698 stack_pointer_rtx)) = 1;
6701 /* If generating o32/o64 abicalls, save $gp on the stack. */
6702 if (TARGET_ABICALLS && !TARGET_NEWABI && !current_function_is_leaf)
6703 emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
6705 mips_emit_loadgp ();
6707 /* If we are profiling, make sure no instructions are scheduled before
6708 the call to mcount. */
6710 if (current_function_profile)
6711 emit_insn (gen_blockage ());
6714 /* Do any necessary cleanup after a function to restore stack, frame,
6715 and regs. */
6717 #define RA_MASK BITMASK_HIGH /* 1 << 31 */
6719 static void
6720 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
6721 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
6723 /* Reinstate the normal $gp. */
6724 REGNO (pic_offset_table_rtx) = GLOBAL_POINTER_REGNUM;
6725 mips_output_cplocal ();
6727 if (cfun->machine->all_noreorder_p)
6729 /* Avoid using %>%) since it adds excess whitespace. */
6730 output_asm_insn (".set\tmacro", 0);
6731 output_asm_insn (".set\treorder", 0);
6732 set_noreorder = set_nomacro = 0;
6735 if (!FUNCTION_NAME_ALREADY_DECLARED && !flag_inhibit_size_directive)
6737 const char *fnname;
6739 /* Get the function name the same way that toplev.c does before calling
6740 assemble_start_function. This is needed so that the name used here
6741 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
6742 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
6743 fputs ("\t.end\t", file);
6744 assemble_name (file, fnname);
6745 fputs ("\n", file);
6749 /* Emit instructions to restore register REG from slot MEM. */
6751 static void
6752 mips_restore_reg (rtx reg, rtx mem)
6754 /* There's no mips16 instruction to load $31 directly. Load into
6755 $7 instead and adjust the return insn appropriately. */
6756 if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
6757 reg = gen_rtx_REG (GET_MODE (reg), 7);
6759 if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
6761 /* Can't restore directly; move through a temporary. */
6762 emit_move_insn (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
6763 emit_move_insn (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
6765 else
6766 emit_move_insn (reg, mem);
6770 /* Expand the epilogue into a bunch of separate insns. SIBCALL_P is true
6771 if this epilogue precedes a sibling call, false if it is for a normal
6772 "epilogue" pattern. */
6774 void
6775 mips_expand_epilogue (int sibcall_p)
6777 HOST_WIDE_INT step1, step2;
6778 rtx base, target;
6780 if (!sibcall_p && mips_can_use_return_insn ())
6782 emit_jump_insn (gen_return ());
6783 return;
6786 /* Split the frame into two. STEP1 is the amount of stack we should
6787 deallocate before restoring the registers. STEP2 is the amount we
6788 should deallocate afterwards.
6790 Start off by assuming that no registers need to be restored. */
6791 step1 = cfun->machine->frame.total_size;
6792 step2 = 0;
6794 /* Work out which register holds the frame address. Account for the
6795 frame pointer offset used by mips16 code. */
6796 if (!frame_pointer_needed)
6797 base = stack_pointer_rtx;
6798 else
6800 base = hard_frame_pointer_rtx;
6801 if (TARGET_MIPS16)
6802 step1 -= cfun->machine->frame.args_size;
6805 /* If we need to restore registers, deallocate as much stack as
6806 possible in the second step without going out of range. */
6807 if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
6809 step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
6810 step1 -= step2;
6813 /* Set TARGET to BASE + STEP1. */
6814 target = base;
6815 if (step1 > 0)
6817 rtx adjust;
6819 /* Get an rtx for STEP1 that we can add to BASE. */
6820 adjust = GEN_INT (step1);
6821 if (!SMALL_OPERAND (step1))
6823 emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), adjust);
6824 adjust = MIPS_EPILOGUE_TEMP (Pmode);
6827 /* Normal mode code can copy the result straight into $sp. */
6828 if (!TARGET_MIPS16)
6829 target = stack_pointer_rtx;
6831 emit_insn (gen_add3_insn (target, base, adjust));
6834 /* Copy TARGET into the stack pointer. */
6835 if (target != stack_pointer_rtx)
6836 emit_move_insn (stack_pointer_rtx, target);
6838 /* If we're using addressing macros for n32/n64 abicalls, $gp is
6839 implicitly used by all SYMBOL_REFs. We must emit a blockage
6840 insn before restoring it. */
6841 if (TARGET_ABICALLS && TARGET_NEWABI && !TARGET_EXPLICIT_RELOCS)
6842 emit_insn (gen_blockage ());
6844 /* Restore the registers. */
6845 mips_for_each_saved_reg (cfun->machine->frame.total_size - step2,
6846 mips_restore_reg);
6848 /* Deallocate the final bit of the frame. */
6849 if (step2 > 0)
6850 emit_insn (gen_add3_insn (stack_pointer_rtx,
6851 stack_pointer_rtx,
6852 GEN_INT (step2)));
6854 /* Add in the __builtin_eh_return stack adjustment. We need to
6855 use a temporary in mips16 code. */
6856 if (current_function_calls_eh_return)
6858 if (TARGET_MIPS16)
6860 emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
6861 emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
6862 MIPS_EPILOGUE_TEMP (Pmode),
6863 EH_RETURN_STACKADJ_RTX));
6864 emit_move_insn (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
6866 else
6867 emit_insn (gen_add3_insn (stack_pointer_rtx,
6868 stack_pointer_rtx,
6869 EH_RETURN_STACKADJ_RTX));
6872 if (!sibcall_p)
6874 /* The mips16 loads the return address into $7, not $31. */
6875 if (TARGET_MIPS16 && (cfun->machine->frame.mask & RA_MASK) != 0)
6876 emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
6877 GP_REG_FIRST + 7)));
6878 else
6879 emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
6880 GP_REG_FIRST + 31)));
6884 /* Return nonzero if this function is known to have a null epilogue.
6885 This allows the optimizer to omit jumps to jumps if no stack
6886 was created. */
6889 mips_can_use_return_insn (void)
6891 tree return_type;
6893 if (! reload_completed)
6894 return 0;
6896 if (regs_ever_live[31] || current_function_profile)
6897 return 0;
6899 return_type = DECL_RESULT (current_function_decl);
6901 /* In mips16 mode, a function which returns a floating point value
6902 needs to arrange to copy the return value into the floating point
6903 registers. */
6904 if (TARGET_MIPS16
6905 && mips16_hard_float
6906 && ! aggregate_value_p (return_type, current_function_decl)
6907 && GET_MODE_CLASS (DECL_MODE (return_type)) == MODE_FLOAT
6908 && GET_MODE_SIZE (DECL_MODE (return_type)) <= UNITS_PER_FPVALUE)
6909 return 0;
6911 if (cfun->machine->frame.initialized)
6912 return cfun->machine->frame.total_size == 0;
6914 return compute_frame_size (get_frame_size ()) == 0;
6917 /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
6918 in order to avoid duplicating too much logic from elsewhere. */
6920 static void
6921 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
6922 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
6923 tree function)
6925 rtx this, temp1, temp2, insn, fnaddr;
6927 /* Pretend to be a post-reload pass while generating rtl. */
6928 no_new_pseudos = 1;
6929 reload_completed = 1;
6930 reset_block_changes ();
6932 /* Pick a global pointer for -mabicalls. Use $15 rather than $28
6933 for TARGET_NEWABI since the latter is a call-saved register. */
6934 if (TARGET_ABICALLS)
6935 cfun->machine->global_pointer
6936 = REGNO (pic_offset_table_rtx)
6937 = TARGET_NEWABI ? 15 : GLOBAL_POINTER_REGNUM;
6939 /* Set up the global pointer for n32 or n64 abicalls. */
6940 mips_emit_loadgp ();
6942 /* We need two temporary registers in some cases. */
6943 temp1 = gen_rtx_REG (Pmode, 2);
6944 temp2 = gen_rtx_REG (Pmode, 3);
6946 /* Find out which register contains the "this" pointer. */
6947 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
6948 this = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
6949 else
6950 this = gen_rtx_REG (Pmode, GP_ARG_FIRST);
6952 /* Add DELTA to THIS. */
6953 if (delta != 0)
6955 rtx offset = GEN_INT (delta);
6956 if (!SMALL_OPERAND (delta))
6958 emit_move_insn (temp1, offset);
6959 offset = temp1;
6961 emit_insn (gen_add3_insn (this, this, offset));
6964 /* If needed, add *(*THIS + VCALL_OFFSET) to THIS. */
6965 if (vcall_offset != 0)
6967 rtx addr;
6969 /* Set TEMP1 to *THIS. */
6970 emit_move_insn (temp1, gen_rtx_MEM (Pmode, this));
6972 /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET. */
6973 if (SMALL_OPERAND (vcall_offset))
6974 addr = gen_rtx_PLUS (Pmode, temp1, GEN_INT (vcall_offset));
6975 else if (TARGET_MIPS16)
6977 /* Load the full offset into a register so that we can use
6978 an unextended instruction for the load itself. */
6979 emit_move_insn (temp2, GEN_INT (vcall_offset));
6980 emit_insn (gen_add3_insn (temp1, temp1, temp2));
6981 addr = temp1;
6983 else
6985 /* Load the high part of the offset into a register and
6986 leave the low part for the address. */
6987 emit_move_insn (temp2, GEN_INT (CONST_HIGH_PART (vcall_offset)));
6988 emit_insn (gen_add3_insn (temp1, temp1, temp2));
6989 addr = gen_rtx_PLUS (Pmode, temp1,
6990 GEN_INT (CONST_LOW_PART (vcall_offset)));
6993 /* Load the offset and add it to THIS. */
6994 emit_move_insn (temp1, gen_rtx_MEM (Pmode, addr));
6995 emit_insn (gen_add3_insn (this, this, temp1));
6998 /* Jump to the target function. Use a sibcall if direct jumps are
6999 allowed, otherwise load the address into a register first. */
7000 fnaddr = XEXP (DECL_RTL (function), 0);
7001 if (TARGET_MIPS16 || TARGET_ABICALLS || TARGET_LONG_CALLS)
7003 /* This is messy. gas treats "la $25,foo" as part of a call
7004 sequence and may allow a global "foo" to be lazily bound.
7005 The general move patterns therefore reject this combination.
7007 In this context, lazy binding would actually be OK for o32 and o64,
7008 but it's still wrong for n32 and n64; see mips_load_call_address.
7009 We must therefore load the address via a temporary register if
7010 mips_dangerous_for_la25_p.
7012 If we jump to the temporary register rather than $25, the assembler
7013 can use the move insn to fill the jump's delay slot. */
7014 if (TARGET_ABICALLS && !mips_dangerous_for_la25_p (fnaddr))
7015 temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
7016 mips_load_call_address (temp1, fnaddr, true);
7018 if (TARGET_ABICALLS && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
7019 emit_move_insn (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
7020 emit_jump_insn (gen_indirect_jump (temp1));
7022 else
7024 insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
7025 SIBLING_CALL_P (insn) = 1;
7028 /* Run just enough of rest_of_compilation. This sequence was
7029 "borrowed" from alpha.c. */
7030 insn = get_insns ();
7031 insn_locators_initialize ();
7032 split_all_insns_noflow ();
7033 if (TARGET_MIPS16)
7034 mips16_lay_out_constants ();
7035 shorten_branches (insn);
7036 final_start_function (insn, file, 1);
7037 final (insn, file, 1, 0);
7038 final_end_function ();
7040 /* Clean up the vars set above. Note that final_end_function resets
7041 the global pointer for us. */
7042 reload_completed = 0;
7043 no_new_pseudos = 0;
7046 /* Returns nonzero if X contains a SYMBOL_REF. */
7048 static int
7049 symbolic_expression_p (rtx x)
7051 if (GET_CODE (x) == SYMBOL_REF)
7052 return 1;
7054 if (GET_CODE (x) == CONST)
7055 return symbolic_expression_p (XEXP (x, 0));
7057 if (UNARY_P (x))
7058 return symbolic_expression_p (XEXP (x, 0));
7060 if (ARITHMETIC_P (x))
7061 return (symbolic_expression_p (XEXP (x, 0))
7062 || symbolic_expression_p (XEXP (x, 1)));
7064 return 0;
7067 /* Choose the section to use for the constant rtx expression X that has
7068 mode MODE. */
7070 static void
7071 mips_select_rtx_section (enum machine_mode mode, rtx x,
7072 unsigned HOST_WIDE_INT align)
7074 if (TARGET_MIPS16)
7076 /* In mips16 mode, the constant table always goes in the same section
7077 as the function, so that constants can be loaded using PC relative
7078 addressing. */
7079 function_section (current_function_decl);
7081 else if (TARGET_EMBEDDED_DATA)
7083 /* For embedded applications, always put constants in read-only data,
7084 in order to reduce RAM usage. */
7085 mergeable_constant_section (mode, align, 0);
7087 else
7089 /* For hosted applications, always put constants in small data if
7090 possible, as this gives the best performance. */
7091 /* ??? Consider using mergeable small data sections. */
7093 if (GET_MODE_SIZE (mode) <= (unsigned) mips_section_threshold
7094 && mips_section_threshold > 0)
7095 named_section (0, ".sdata", 0);
7096 else if (flag_pic && symbolic_expression_p (x))
7098 if (targetm.have_named_sections)
7099 named_section (0, ".data.rel.ro", 3);
7100 else
7101 data_section ();
7103 else
7104 mergeable_constant_section (mode, align, 0);
7108 /* Choose the section to use for DECL. RELOC is true if its value contains
7109 any relocatable expression. */
7111 static void
7112 mips_select_section (tree decl, int reloc,
7113 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
7115 if (targetm.have_named_sections)
7116 default_elf_select_section (decl, reloc, align);
7117 else
7118 /* The native irix o32 assembler doesn't support named sections. */
7119 default_select_section (decl, reloc, align);
7123 /* Implement TARGET_IN_SMALL_DATA_P. Return true if it would be safe to
7124 access DECL using %gp_rel(...)($gp). */
7126 static bool
7127 mips_in_small_data_p (tree decl)
7129 HOST_WIDE_INT size;
7131 if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7132 return false;
7134 /* We don't yet generate small-data references for -mabicalls. See related
7135 -G handling in override_options. */
7136 if (TARGET_ABICALLS)
7137 return false;
7139 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7141 const char *name;
7143 /* Reject anything that isn't in a known small-data section. */
7144 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7145 if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7146 return false;
7148 /* If a symbol is defined externally, the assembler will use the
7149 usual -G rules when deciding how to implement macros. */
7150 if (TARGET_EXPLICIT_RELOCS || !DECL_EXTERNAL (decl))
7151 return true;
7153 else if (TARGET_EMBEDDED_DATA)
7155 /* Don't put constants into the small data section: we want them
7156 to be in ROM rather than RAM. */
7157 if (TREE_CODE (decl) != VAR_DECL)
7158 return false;
7160 if (TREE_READONLY (decl)
7161 && !TREE_SIDE_EFFECTS (decl)
7162 && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7163 return false;
7166 size = int_size_in_bytes (TREE_TYPE (decl));
7167 return (size > 0 && size <= mips_section_threshold);
7170 /* See whether VALTYPE is a record whose fields should be returned in
7171 floating-point registers. If so, return the number of fields and
7172 list them in FIELDS (which should have two elements). Return 0
7173 otherwise.
7175 For n32 & n64, a structure with one or two fields is returned in
7176 floating-point registers as long as every field has a floating-point
7177 type. */
7179 static int
7180 mips_fpr_return_fields (tree valtype, tree *fields)
7182 tree field;
7183 int i;
7185 if (!TARGET_NEWABI)
7186 return 0;
7188 if (TREE_CODE (valtype) != RECORD_TYPE)
7189 return 0;
7191 i = 0;
7192 for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
7194 if (TREE_CODE (field) != FIELD_DECL)
7195 continue;
7197 if (TREE_CODE (TREE_TYPE (field)) != REAL_TYPE)
7198 return 0;
7200 if (i == 2)
7201 return 0;
7203 fields[i++] = field;
7205 return i;
7209 /* Implement TARGET_RETURN_IN_MSB. For n32 & n64, we should return
7210 a value in the most significant part of $2/$3 if:
7212 - the target is big-endian;
7214 - the value has a structure or union type (we generalize this to
7215 cover aggregates from other languages too); and
7217 - the structure is not returned in floating-point registers. */
7219 static bool
7220 mips_return_in_msb (tree valtype)
7222 tree fields[2];
7224 return (TARGET_NEWABI
7225 && TARGET_BIG_ENDIAN
7226 && AGGREGATE_TYPE_P (valtype)
7227 && mips_fpr_return_fields (valtype, fields) == 0);
7231 /* Return a composite value in a pair of floating-point registers.
7232 MODE1 and OFFSET1 are the mode and byte offset for the first value,
7233 likewise MODE2 and OFFSET2 for the second. MODE is the mode of the
7234 complete value.
7236 For n32 & n64, $f0 always holds the first value and $f2 the second.
7237 Otherwise the values are packed together as closely as possible. */
7239 static rtx
7240 mips_return_fpr_pair (enum machine_mode mode,
7241 enum machine_mode mode1, HOST_WIDE_INT offset1,
7242 enum machine_mode mode2, HOST_WIDE_INT offset2)
7244 int inc;
7246 inc = (TARGET_NEWABI ? 2 : FP_INC);
7247 return gen_rtx_PARALLEL
7248 (mode,
7249 gen_rtvec (2,
7250 gen_rtx_EXPR_LIST (VOIDmode,
7251 gen_rtx_REG (mode1, FP_RETURN),
7252 GEN_INT (offset1)),
7253 gen_rtx_EXPR_LIST (VOIDmode,
7254 gen_rtx_REG (mode2, FP_RETURN + inc),
7255 GEN_INT (offset2))));
7260 /* Implement FUNCTION_VALUE and LIBCALL_VALUE. For normal calls,
7261 VALTYPE is the return type and MODE is VOIDmode. For libcalls,
7262 VALTYPE is null and MODE is the mode of the return value. */
7265 mips_function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
7266 enum machine_mode mode)
7268 if (valtype)
7270 tree fields[2];
7271 int unsignedp;
7273 mode = TYPE_MODE (valtype);
7274 unsignedp = TYPE_UNSIGNED (valtype);
7276 /* Since we define TARGET_PROMOTE_FUNCTION_RETURN that returns
7277 true, we must promote the mode just as PROMOTE_MODE does. */
7278 mode = promote_mode (valtype, mode, &unsignedp, 1);
7280 /* Handle structures whose fields are returned in $f0/$f2. */
7281 switch (mips_fpr_return_fields (valtype, fields))
7283 case 1:
7284 return gen_rtx_REG (mode, FP_RETURN);
7286 case 2:
7287 return mips_return_fpr_pair (mode,
7288 TYPE_MODE (TREE_TYPE (fields[0])),
7289 int_byte_position (fields[0]),
7290 TYPE_MODE (TREE_TYPE (fields[1])),
7291 int_byte_position (fields[1]));
7294 /* If a value is passed in the most significant part of a register, see
7295 whether we have to round the mode up to a whole number of words. */
7296 if (mips_return_in_msb (valtype))
7298 HOST_WIDE_INT size = int_size_in_bytes (valtype);
7299 if (size % UNITS_PER_WORD != 0)
7301 size += UNITS_PER_WORD - size % UNITS_PER_WORD;
7302 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
7307 if (GET_MODE_CLASS (mode) == MODE_FLOAT
7308 && GET_MODE_SIZE (mode) <= UNITS_PER_HWFPVALUE)
7309 return gen_rtx_REG (mode, FP_RETURN);
7311 /* Handle long doubles for n32 & n64. */
7312 if (mode == TFmode)
7313 return mips_return_fpr_pair (mode,
7314 DImode, 0,
7315 DImode, GET_MODE_SIZE (mode) / 2);
7317 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
7318 && GET_MODE_SIZE (mode) <= UNITS_PER_HWFPVALUE * 2)
7319 return mips_return_fpr_pair (mode,
7320 GET_MODE_INNER (mode), 0,
7321 GET_MODE_INNER (mode),
7322 GET_MODE_SIZE (mode) / 2);
7324 return gen_rtx_REG (mode, GP_RETURN);
7327 /* Return nonzero when an argument must be passed by reference. */
7329 static bool
7330 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7331 enum machine_mode mode, tree type,
7332 bool named ATTRIBUTE_UNUSED)
7334 if (mips_abi == ABI_EABI)
7336 int size;
7338 /* ??? How should SCmode be handled? */
7339 if (type == NULL_TREE || mode == DImode || mode == DFmode)
7340 return 0;
7342 if (type)
7343 size = int_size_in_bytes (type);
7344 else
7345 size = GET_MODE_SIZE (mode);
7347 return size == -1 || size > UNITS_PER_WORD;
7349 else
7351 /* If we have a variable-sized parameter, we have no choice. */
7352 return targetm.calls.must_pass_in_stack (mode, type);
7356 /* Return the class of registers for which a mode change from FROM to TO
7357 is invalid.
7359 In little-endian mode, the hi-lo registers are numbered backwards,
7360 so (subreg:SI (reg:DI hi) 0) gets the high word instead of the low
7361 word as intended.
7363 Similarly, when using paired floating-point registers, the first
7364 register holds the low word, regardless of endianness. So in big
7365 endian mode, (subreg:SI (reg:DF $f0) 0) does not get the high word
7366 as intended.
7368 Also, loading a 32-bit value into a 64-bit floating-point register
7369 will not sign-extend the value, despite what LOAD_EXTEND_OP says.
7370 We can't allow 64-bit float registers to change from a 32-bit
7371 mode to a 64-bit mode. */
7373 bool
7374 mips_cannot_change_mode_class (enum machine_mode from,
7375 enum machine_mode to, enum reg_class class)
7377 if (GET_MODE_SIZE (from) != GET_MODE_SIZE (to))
7379 if (TARGET_BIG_ENDIAN)
7380 return reg_classes_intersect_p (FP_REGS, class);
7381 if (TARGET_FLOAT64)
7382 return reg_classes_intersect_p (HI_AND_FP_REGS, class);
7383 return reg_classes_intersect_p (HI_REG, class);
7385 return false;
7388 /* Return true if X should not be moved directly into register $25.
7389 We need this because many versions of GAS will treat "la $25,foo" as
7390 part of a call sequence and so allow a global "foo" to be lazily bound. */
7392 bool
7393 mips_dangerous_for_la25_p (rtx x)
7395 HOST_WIDE_INT offset;
7397 if (TARGET_EXPLICIT_RELOCS)
7398 return false;
7400 mips_split_const (x, &x, &offset);
7401 return global_got_operand (x, VOIDmode);
7404 /* Implement PREFERRED_RELOAD_CLASS. */
7406 enum reg_class
7407 mips_preferred_reload_class (rtx x, enum reg_class class)
7409 if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
7410 return LEA_REGS;
7412 if (TARGET_HARD_FLOAT
7413 && FLOAT_MODE_P (GET_MODE (x))
7414 && reg_class_subset_p (FP_REGS, class))
7415 return FP_REGS;
7417 if (reg_class_subset_p (GR_REGS, class))
7418 class = GR_REGS;
7420 if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, class))
7421 class = M16_REGS;
7423 return class;
7426 /* This function returns the register class required for a secondary
7427 register when copying between one of the registers in CLASS, and X,
7428 using MODE. If IN_P is nonzero, the copy is going from X to the
7429 register, otherwise the register is the source. A return value of
7430 NO_REGS means that no secondary register is required. */
7432 enum reg_class
7433 mips_secondary_reload_class (enum reg_class class,
7434 enum machine_mode mode, rtx x, int in_p)
7436 enum reg_class gr_regs = TARGET_MIPS16 ? M16_REGS : GR_REGS;
7437 int regno = -1;
7438 int gp_reg_p;
7440 if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
7441 regno = true_regnum (x);
7443 gp_reg_p = TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
7445 if (mips_dangerous_for_la25_p (x))
7447 gr_regs = LEA_REGS;
7448 if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], 25))
7449 return gr_regs;
7452 /* Copying from HI or LO to anywhere other than a general register
7453 requires a general register. */
7454 if (class == HI_REG || class == LO_REG || class == MD_REGS)
7456 if (TARGET_MIPS16 && in_p)
7458 /* We can't really copy to HI or LO at all in mips16 mode. */
7459 return M16_REGS;
7461 return gp_reg_p ? NO_REGS : gr_regs;
7463 if (MD_REG_P (regno))
7465 if (TARGET_MIPS16 && ! in_p)
7467 /* We can't really copy to HI or LO at all in mips16 mode. */
7468 return M16_REGS;
7470 return class == gr_regs ? NO_REGS : gr_regs;
7473 /* We can only copy a value to a condition code register from a
7474 floating point register, and even then we require a scratch
7475 floating point register. We can only copy a value out of a
7476 condition code register into a general register. */
7477 if (class == ST_REGS)
7479 if (in_p)
7480 return FP_REGS;
7481 return gp_reg_p ? NO_REGS : gr_regs;
7483 if (ST_REG_P (regno))
7485 if (! in_p)
7486 return FP_REGS;
7487 return class == gr_regs ? NO_REGS : gr_regs;
7490 if (class == FP_REGS)
7492 if (GET_CODE (x) == MEM)
7494 /* In this case we can use lwc1, swc1, ldc1 or sdc1. */
7495 return NO_REGS;
7497 else if (CONSTANT_P (x) && GET_MODE_CLASS (mode) == MODE_FLOAT)
7499 /* We can use the l.s and l.d macros to load floating-point
7500 constants. ??? For l.s, we could probably get better
7501 code by returning GR_REGS here. */
7502 return NO_REGS;
7504 else if (gp_reg_p || x == CONST0_RTX (mode))
7506 /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
7507 return NO_REGS;
7509 else if (FP_REG_P (regno))
7511 /* In this case we can use mov.s or mov.d. */
7512 return NO_REGS;
7514 else
7516 /* Otherwise, we need to reload through an integer register. */
7517 return gr_regs;
7521 /* In mips16 mode, going between memory and anything but M16_REGS
7522 requires an M16_REG. */
7523 if (TARGET_MIPS16)
7525 if (class != M16_REGS && class != M16_NA_REGS)
7527 if (gp_reg_p)
7528 return NO_REGS;
7529 return M16_REGS;
7531 if (! gp_reg_p)
7533 if (class == M16_REGS || class == M16_NA_REGS)
7534 return NO_REGS;
7535 return M16_REGS;
7539 return NO_REGS;
7542 /* Implement CLASS_MAX_NREGS.
7544 Usually all registers are word-sized. The only supported exception
7545 is -mgp64 -msingle-float, which has 64-bit words but 32-bit float
7546 registers. A word-based calculation is correct even in that case,
7547 since -msingle-float disallows multi-FPR values. */
7550 mips_class_max_nregs (enum reg_class class ATTRIBUTE_UNUSED,
7551 enum machine_mode mode)
7553 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7556 bool
7557 mips_valid_pointer_mode (enum machine_mode mode)
7559 return (mode == SImode || (TARGET_64BIT && mode == DImode));
7563 /* If we can access small data directly (using gp-relative relocation
7564 operators) return the small data pointer, otherwise return null.
7566 For each mips16 function which refers to GP relative symbols, we
7567 use a pseudo register, initialized at the start of the function, to
7568 hold the $gp value. */
7570 static rtx
7571 mips16_gp_pseudo_reg (void)
7573 if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
7575 rtx unspec;
7576 rtx insn, scan;
7578 cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
7579 RTX_UNCHANGING_P (cfun->machine->mips16_gp_pseudo_rtx) = 1;
7581 /* We want to initialize this to a value which gcc will believe
7582 is constant. */
7583 start_sequence ();
7584 unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx), UNSPEC_GP);
7585 emit_move_insn (cfun->machine->mips16_gp_pseudo_rtx,
7586 gen_rtx_CONST (Pmode, unspec));
7587 insn = get_insns ();
7588 end_sequence ();
7590 push_topmost_sequence ();
7591 /* We need to emit the initialization after the FUNCTION_BEG
7592 note, so that it will be integrated. */
7593 for (scan = get_insns (); scan != NULL_RTX; scan = NEXT_INSN (scan))
7594 if (GET_CODE (scan) == NOTE
7595 && NOTE_LINE_NUMBER (scan) == NOTE_INSN_FUNCTION_BEG)
7596 break;
7597 if (scan == NULL_RTX)
7598 scan = get_insns ();
7599 insn = emit_insn_after (insn, scan);
7600 pop_topmost_sequence ();
7603 return cfun->machine->mips16_gp_pseudo_rtx;
7606 /* Write out code to move floating point arguments in or out of
7607 general registers. Output the instructions to FILE. FP_CODE is
7608 the code describing which arguments are present (see the comment at
7609 the definition of CUMULATIVE_ARGS in mips.h). FROM_FP_P is nonzero if
7610 we are copying from the floating point registers. */
7612 static void
7613 mips16_fp_args (FILE *file, int fp_code, int from_fp_p)
7615 const char *s;
7616 int gparg, fparg;
7617 unsigned int f;
7619 /* This code only works for the original 32 bit ABI and the O64 ABI. */
7620 if (!TARGET_OLDABI)
7621 abort ();
7623 if (from_fp_p)
7624 s = "mfc1";
7625 else
7626 s = "mtc1";
7627 gparg = GP_ARG_FIRST;
7628 fparg = FP_ARG_FIRST;
7629 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
7631 if ((f & 3) == 1)
7633 if ((fparg & 1) != 0)
7634 ++fparg;
7635 fprintf (file, "\t%s\t%s,%s\n", s,
7636 reg_names[gparg], reg_names[fparg]);
7638 else if ((f & 3) == 2)
7640 if (TARGET_64BIT)
7641 fprintf (file, "\td%s\t%s,%s\n", s,
7642 reg_names[gparg], reg_names[fparg]);
7643 else
7645 if ((fparg & 1) != 0)
7646 ++fparg;
7647 if (TARGET_BIG_ENDIAN)
7648 fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
7649 reg_names[gparg], reg_names[fparg + 1], s,
7650 reg_names[gparg + 1], reg_names[fparg]);
7651 else
7652 fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
7653 reg_names[gparg], reg_names[fparg], s,
7654 reg_names[gparg + 1], reg_names[fparg + 1]);
7655 ++gparg;
7656 ++fparg;
7659 else
7660 abort ();
7662 ++gparg;
7663 ++fparg;
7667 /* Build a mips16 function stub. This is used for functions which
7668 take arguments in the floating point registers. It is 32 bit code
7669 that moves the floating point args into the general registers, and
7670 then jumps to the 16 bit code. */
7672 static void
7673 build_mips16_function_stub (FILE *file)
7675 const char *fnname;
7676 char *secname, *stubname;
7677 tree stubid, stubdecl;
7678 int need_comma;
7679 unsigned int f;
7681 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
7682 secname = (char *) alloca (strlen (fnname) + 20);
7683 sprintf (secname, ".mips16.fn.%s", fnname);
7684 stubname = (char *) alloca (strlen (fnname) + 20);
7685 sprintf (stubname, "__fn_stub_%s", fnname);
7686 stubid = get_identifier (stubname);
7687 stubdecl = build_decl (FUNCTION_DECL, stubid,
7688 build_function_type (void_type_node, NULL_TREE));
7689 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
7691 fprintf (file, "\t# Stub function for %s (", current_function_name ());
7692 need_comma = 0;
7693 for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
7695 fprintf (file, "%s%s",
7696 need_comma ? ", " : "",
7697 (f & 3) == 1 ? "float" : "double");
7698 need_comma = 1;
7700 fprintf (file, ")\n");
7702 fprintf (file, "\t.set\tnomips16\n");
7703 function_section (stubdecl);
7704 ASM_OUTPUT_ALIGN (file, floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT));
7706 /* ??? If FUNCTION_NAME_ALREADY_DECLARED is defined, then we are
7707 within a .ent, and we can not emit another .ent. */
7708 if (!FUNCTION_NAME_ALREADY_DECLARED)
7710 fputs ("\t.ent\t", file);
7711 assemble_name (file, stubname);
7712 fputs ("\n", file);
7715 assemble_name (file, stubname);
7716 fputs (":\n", file);
7718 /* We don't want the assembler to insert any nops here. */
7719 fprintf (file, "\t.set\tnoreorder\n");
7721 mips16_fp_args (file, current_function_args_info.fp_code, 1);
7723 fprintf (asm_out_file, "\t.set\tnoat\n");
7724 fprintf (asm_out_file, "\tla\t%s,", reg_names[GP_REG_FIRST + 1]);
7725 assemble_name (file, fnname);
7726 fprintf (file, "\n");
7727 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
7728 fprintf (asm_out_file, "\t.set\tat\n");
7730 /* Unfortunately, we can't fill the jump delay slot. We can't fill
7731 with one of the mfc1 instructions, because the result is not
7732 available for one instruction, so if the very first instruction
7733 in the function refers to the register, it will see the wrong
7734 value. */
7735 fprintf (file, "\tnop\n");
7737 fprintf (file, "\t.set\treorder\n");
7739 if (!FUNCTION_NAME_ALREADY_DECLARED)
7741 fputs ("\t.end\t", file);
7742 assemble_name (file, stubname);
7743 fputs ("\n", file);
7746 fprintf (file, "\t.set\tmips16\n");
7748 function_section (current_function_decl);
7751 /* We keep a list of functions for which we have already built stubs
7752 in build_mips16_call_stub. */
7754 struct mips16_stub
7756 struct mips16_stub *next;
7757 char *name;
7758 int fpret;
7761 static struct mips16_stub *mips16_stubs;
7763 /* Build a call stub for a mips16 call. A stub is needed if we are
7764 passing any floating point values which should go into the floating
7765 point registers. If we are, and the call turns out to be to a 32
7766 bit function, the stub will be used to move the values into the
7767 floating point registers before calling the 32 bit function. The
7768 linker will magically adjust the function call to either the 16 bit
7769 function or the 32 bit stub, depending upon where the function call
7770 is actually defined.
7772 Similarly, we need a stub if the return value might come back in a
7773 floating point register.
7775 RETVAL is the location of the return value, or null if this is
7776 a call rather than a call_value. FN is the address of the
7777 function and ARG_SIZE is the size of the arguments. FP_CODE
7778 is the code built by function_arg. This function returns a nonzero
7779 value if it builds the call instruction itself. */
7782 build_mips16_call_stub (rtx retval, rtx fn, rtx arg_size, int fp_code)
7784 int fpret;
7785 const char *fnname;
7786 char *secname, *stubname;
7787 struct mips16_stub *l;
7788 tree stubid, stubdecl;
7789 int need_comma;
7790 unsigned int f;
7792 /* We don't need to do anything if we aren't in mips16 mode, or if
7793 we were invoked with the -msoft-float option. */
7794 if (! TARGET_MIPS16 || ! mips16_hard_float)
7795 return 0;
7797 /* Figure out whether the value might come back in a floating point
7798 register. */
7799 fpret = (retval != 0
7800 && GET_MODE_CLASS (GET_MODE (retval)) == MODE_FLOAT
7801 && GET_MODE_SIZE (GET_MODE (retval)) <= UNITS_PER_FPVALUE);
7803 /* We don't need to do anything if there were no floating point
7804 arguments and the value will not be returned in a floating point
7805 register. */
7806 if (fp_code == 0 && ! fpret)
7807 return 0;
7809 /* We don't need to do anything if this is a call to a special
7810 mips16 support function. */
7811 if (GET_CODE (fn) == SYMBOL_REF
7812 && strncmp (XSTR (fn, 0), "__mips16_", 9) == 0)
7813 return 0;
7815 /* This code will only work for o32 and o64 abis. The other ABI's
7816 require more sophisticated support. */
7817 if (!TARGET_OLDABI)
7818 abort ();
7820 /* We can only handle SFmode and DFmode floating point return
7821 values. */
7822 if (fpret && GET_MODE (retval) != SFmode && GET_MODE (retval) != DFmode)
7823 abort ();
7825 /* If we're calling via a function pointer, then we must always call
7826 via a stub. There are magic stubs provided in libgcc.a for each
7827 of the required cases. Each of them expects the function address
7828 to arrive in register $2. */
7830 if (GET_CODE (fn) != SYMBOL_REF)
7832 char buf[30];
7833 tree id;
7834 rtx stub_fn, insn;
7836 /* ??? If this code is modified to support other ABI's, we need
7837 to handle PARALLEL return values here. */
7839 sprintf (buf, "__mips16_call_stub_%s%d",
7840 (fpret
7841 ? (GET_MODE (retval) == SFmode ? "sf_" : "df_")
7842 : ""),
7843 fp_code);
7844 id = get_identifier (buf);
7845 stub_fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
7847 emit_move_insn (gen_rtx_REG (Pmode, 2), fn);
7849 if (retval == NULL_RTX)
7850 insn = gen_call_internal (stub_fn, arg_size);
7851 else
7852 insn = gen_call_value_internal (retval, stub_fn, arg_size);
7853 insn = emit_call_insn (insn);
7855 /* Put the register usage information on the CALL. */
7856 if (GET_CODE (insn) != CALL_INSN)
7857 abort ();
7858 CALL_INSN_FUNCTION_USAGE (insn) =
7859 gen_rtx_EXPR_LIST (VOIDmode,
7860 gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 2)),
7861 CALL_INSN_FUNCTION_USAGE (insn));
7863 /* If we are handling a floating point return value, we need to
7864 save $18 in the function prologue. Putting a note on the
7865 call will mean that regs_ever_live[$18] will be true if the
7866 call is not eliminated, and we can check that in the prologue
7867 code. */
7868 if (fpret)
7869 CALL_INSN_FUNCTION_USAGE (insn) =
7870 gen_rtx_EXPR_LIST (VOIDmode,
7871 gen_rtx_USE (VOIDmode,
7872 gen_rtx_REG (word_mode, 18)),
7873 CALL_INSN_FUNCTION_USAGE (insn));
7875 /* Return 1 to tell the caller that we've generated the call
7876 insn. */
7877 return 1;
7880 /* We know the function we are going to call. If we have already
7881 built a stub, we don't need to do anything further. */
7883 fnname = XSTR (fn, 0);
7884 for (l = mips16_stubs; l != NULL; l = l->next)
7885 if (strcmp (l->name, fnname) == 0)
7886 break;
7888 if (l == NULL)
7890 /* Build a special purpose stub. When the linker sees a
7891 function call in mips16 code, it will check where the target
7892 is defined. If the target is a 32 bit call, the linker will
7893 search for the section defined here. It can tell which
7894 symbol this section is associated with by looking at the
7895 relocation information (the name is unreliable, since this
7896 might be a static function). If such a section is found, the
7897 linker will redirect the call to the start of the magic
7898 section.
7900 If the function does not return a floating point value, the
7901 special stub section is named
7902 .mips16.call.FNNAME
7904 If the function does return a floating point value, the stub
7905 section is named
7906 .mips16.call.fp.FNNAME
7909 secname = (char *) alloca (strlen (fnname) + 40);
7910 sprintf (secname, ".mips16.call.%s%s",
7911 fpret ? "fp." : "",
7912 fnname);
7913 stubname = (char *) alloca (strlen (fnname) + 20);
7914 sprintf (stubname, "__call_stub_%s%s",
7915 fpret ? "fp_" : "",
7916 fnname);
7917 stubid = get_identifier (stubname);
7918 stubdecl = build_decl (FUNCTION_DECL, stubid,
7919 build_function_type (void_type_node, NULL_TREE));
7920 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
7922 fprintf (asm_out_file, "\t# Stub function to call %s%s (",
7923 (fpret
7924 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
7925 : ""),
7926 fnname);
7927 need_comma = 0;
7928 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
7930 fprintf (asm_out_file, "%s%s",
7931 need_comma ? ", " : "",
7932 (f & 3) == 1 ? "float" : "double");
7933 need_comma = 1;
7935 fprintf (asm_out_file, ")\n");
7937 fprintf (asm_out_file, "\t.set\tnomips16\n");
7938 assemble_start_function (stubdecl, stubname);
7940 if (!FUNCTION_NAME_ALREADY_DECLARED)
7942 fputs ("\t.ent\t", asm_out_file);
7943 assemble_name (asm_out_file, stubname);
7944 fputs ("\n", asm_out_file);
7946 assemble_name (asm_out_file, stubname);
7947 fputs (":\n", asm_out_file);
7950 /* We build the stub code by hand. That's the only way we can
7951 do it, since we can't generate 32 bit code during a 16 bit
7952 compilation. */
7954 /* We don't want the assembler to insert any nops here. */
7955 fprintf (asm_out_file, "\t.set\tnoreorder\n");
7957 mips16_fp_args (asm_out_file, fp_code, 0);
7959 if (! fpret)
7961 fprintf (asm_out_file, "\t.set\tnoat\n");
7962 fprintf (asm_out_file, "\tla\t%s,%s\n", reg_names[GP_REG_FIRST + 1],
7963 fnname);
7964 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
7965 fprintf (asm_out_file, "\t.set\tat\n");
7966 /* Unfortunately, we can't fill the jump delay slot. We
7967 can't fill with one of the mtc1 instructions, because the
7968 result is not available for one instruction, so if the
7969 very first instruction in the function refers to the
7970 register, it will see the wrong value. */
7971 fprintf (asm_out_file, "\tnop\n");
7973 else
7975 fprintf (asm_out_file, "\tmove\t%s,%s\n",
7976 reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
7977 fprintf (asm_out_file, "\tjal\t%s\n", fnname);
7978 /* As above, we can't fill the delay slot. */
7979 fprintf (asm_out_file, "\tnop\n");
7980 if (GET_MODE (retval) == SFmode)
7981 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
7982 reg_names[GP_REG_FIRST + 2], reg_names[FP_REG_FIRST + 0]);
7983 else
7985 if (TARGET_BIG_ENDIAN)
7987 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
7988 reg_names[GP_REG_FIRST + 2],
7989 reg_names[FP_REG_FIRST + 1]);
7990 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
7991 reg_names[GP_REG_FIRST + 3],
7992 reg_names[FP_REG_FIRST + 0]);
7994 else
7996 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
7997 reg_names[GP_REG_FIRST + 2],
7998 reg_names[FP_REG_FIRST + 0]);
7999 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8000 reg_names[GP_REG_FIRST + 3],
8001 reg_names[FP_REG_FIRST + 1]);
8004 fprintf (asm_out_file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 18]);
8005 /* As above, we can't fill the delay slot. */
8006 fprintf (asm_out_file, "\tnop\n");
8009 fprintf (asm_out_file, "\t.set\treorder\n");
8011 #ifdef ASM_DECLARE_FUNCTION_SIZE
8012 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
8013 #endif
8015 if (!FUNCTION_NAME_ALREADY_DECLARED)
8017 fputs ("\t.end\t", asm_out_file);
8018 assemble_name (asm_out_file, stubname);
8019 fputs ("\n", asm_out_file);
8022 fprintf (asm_out_file, "\t.set\tmips16\n");
8024 /* Record this stub. */
8025 l = (struct mips16_stub *) xmalloc (sizeof *l);
8026 l->name = xstrdup (fnname);
8027 l->fpret = fpret;
8028 l->next = mips16_stubs;
8029 mips16_stubs = l;
8032 /* If we expect a floating point return value, but we've built a
8033 stub which does not expect one, then we're in trouble. We can't
8034 use the existing stub, because it won't handle the floating point
8035 value. We can't build a new stub, because the linker won't know
8036 which stub to use for the various calls in this object file.
8037 Fortunately, this case is illegal, since it means that a function
8038 was declared in two different ways in a single compilation. */
8039 if (fpret && ! l->fpret)
8040 error ("can not handle inconsistent calls to `%s'", fnname);
8042 /* If we are calling a stub which handles a floating point return
8043 value, we need to arrange to save $18 in the prologue. We do
8044 this by marking the function call as using the register. The
8045 prologue will later see that it is used, and emit code to save
8046 it. */
8048 if (l->fpret)
8050 rtx insn;
8052 if (retval == NULL_RTX)
8053 insn = gen_call_internal (fn, arg_size);
8054 else
8055 insn = gen_call_value_internal (retval, fn, arg_size);
8056 insn = emit_call_insn (insn);
8058 if (GET_CODE (insn) != CALL_INSN)
8059 abort ();
8061 CALL_INSN_FUNCTION_USAGE (insn) =
8062 gen_rtx_EXPR_LIST (VOIDmode,
8063 gen_rtx_USE (VOIDmode, gen_rtx_REG (word_mode, 18)),
8064 CALL_INSN_FUNCTION_USAGE (insn));
8066 /* Return 1 to tell the caller that we've generated the call
8067 insn. */
8068 return 1;
8071 /* Return 0 to let the caller generate the call insn. */
8072 return 0;
8075 /* An entry in the mips16 constant pool. VALUE is the pool constant,
8076 MODE is its mode, and LABEL is the CODE_LABEL associated with it. */
8078 struct mips16_constant {
8079 struct mips16_constant *next;
8080 rtx value;
8081 rtx label;
8082 enum machine_mode mode;
8085 /* Information about an incomplete mips16 constant pool. FIRST is the
8086 first constant, HIGHEST_ADDRESS is the highest address that the first
8087 byte of the pool can have, and INSN_ADDRESS is the current instruction
8088 address. */
8090 struct mips16_constant_pool {
8091 struct mips16_constant *first;
8092 int highest_address;
8093 int insn_address;
8096 /* Add constant VALUE to POOL and return its label. MODE is the
8097 value's mode (used for CONST_INTs, etc.). */
8099 static rtx
8100 add_constant (struct mips16_constant_pool *pool,
8101 rtx value, enum machine_mode mode)
8103 struct mips16_constant **p, *c;
8104 bool first_of_size_p;
8106 /* See whether the constant is already in the pool. If so, return the
8107 existing label, otherwise leave P pointing to the place where the
8108 constant should be added.
8110 Keep the pool sorted in increasing order of mode size so that we can
8111 reduce the number of alignments needed. */
8112 first_of_size_p = true;
8113 for (p = &pool->first; *p != 0; p = &(*p)->next)
8115 if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
8116 return (*p)->label;
8117 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
8118 break;
8119 if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
8120 first_of_size_p = false;
8123 /* In the worst case, the constant needed by the earliest instruction
8124 will end up at the end of the pool. The entire pool must then be
8125 accessible from that instruction.
8127 When adding the first constant, set the pool's highest address to
8128 the address of the first out-of-range byte. Adjust this address
8129 downwards each time a new constant is added. */
8130 if (pool->first == 0)
8131 /* For pc-relative lw, addiu and daddiu instructions, the base PC value
8132 is the address of the instruction with the lowest two bits clear.
8133 The base PC value for ld has the lowest three bits clear. Assume
8134 the worst case here. */
8135 pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
8136 pool->highest_address -= GET_MODE_SIZE (mode);
8137 if (first_of_size_p)
8138 /* Take into account the worst possible padding due to alignment. */
8139 pool->highest_address -= GET_MODE_SIZE (mode) - 1;
8141 /* Create a new entry. */
8142 c = (struct mips16_constant *) xmalloc (sizeof *c);
8143 c->value = value;
8144 c->mode = mode;
8145 c->label = gen_label_rtx ();
8146 c->next = *p;
8147 *p = c;
8149 return c->label;
8152 /* Output constant VALUE after instruction INSN and return the last
8153 instruction emitted. MODE is the mode of the constant. */
8155 static rtx
8156 dump_constants_1 (enum machine_mode mode, rtx value, rtx insn)
8158 switch (GET_MODE_CLASS (mode))
8160 case MODE_INT:
8162 rtx size = GEN_INT (GET_MODE_SIZE (mode));
8163 return emit_insn_after (gen_consttable_int (value, size), insn);
8166 case MODE_FLOAT:
8167 return emit_insn_after (gen_consttable_float (value), insn);
8169 case MODE_VECTOR_FLOAT:
8170 case MODE_VECTOR_INT:
8172 int i;
8173 for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
8174 insn = dump_constants_1 (GET_MODE_INNER (mode),
8175 CONST_VECTOR_ELT (value, i), insn);
8176 return insn;
8179 default:
8180 abort ();
8185 /* Dump out the constants in CONSTANTS after INSN. */
8187 static void
8188 dump_constants (struct mips16_constant *constants, rtx insn)
8190 struct mips16_constant *c, *next;
8191 int align;
8193 align = 0;
8194 for (c = constants; c != NULL; c = next)
8196 /* If necessary, increase the alignment of PC. */
8197 if (align < GET_MODE_SIZE (c->mode))
8199 int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
8200 insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
8202 align = GET_MODE_SIZE (c->mode);
8204 insn = emit_label_after (c->label, insn);
8205 insn = dump_constants_1 (c->mode, c->value, insn);
8207 next = c->next;
8208 free (c);
8211 emit_barrier_after (insn);
8214 /* Return the length of instruction INSN.
8216 ??? MIPS16 switch tables go in .text, but we don't define
8217 JUMP_TABLES_IN_TEXT_SECTION, so get_attr_length will not
8218 compute their lengths correctly. */
8220 static int
8221 mips16_insn_length (rtx insn)
8223 if (GET_CODE (insn) == JUMP_INSN)
8225 rtx body = PATTERN (insn);
8226 if (GET_CODE (body) == ADDR_VEC)
8227 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
8228 if (GET_CODE (body) == ADDR_DIFF_VEC)
8229 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
8231 return get_attr_length (insn);
8234 /* Rewrite *X so that constant pool references refer to the constant's
8235 label instead. DATA points to the constant pool structure. */
8237 static int
8238 mips16_rewrite_pool_refs (rtx *x, void *data)
8240 struct mips16_constant_pool *pool = data;
8241 if (GET_CODE (*x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (*x))
8242 *x = gen_rtx_LABEL_REF (Pmode, add_constant (pool,
8243 get_pool_constant (*x),
8244 get_pool_mode (*x)));
8245 return 0;
8248 /* Build MIPS16 constant pools. */
8250 static void
8251 mips16_lay_out_constants (void)
8253 struct mips16_constant_pool pool;
8254 rtx insn, barrier;
8256 barrier = 0;
8257 memset (&pool, 0, sizeof (pool));
8258 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8260 /* Rewrite constant pool references in INSN. */
8261 if (INSN_P (insn))
8262 for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &pool);
8264 pool.insn_address += mips16_insn_length (insn);
8266 if (pool.first != NULL)
8268 /* If there are no natural barriers between the first user of
8269 the pool and the highest acceptable address, we'll need to
8270 create a new instruction to jump around the constant pool.
8271 In the worst case, this instruction will be 4 bytes long.
8273 If it's too late to do this transformation after INSN,
8274 do it immediately before INSN. */
8275 if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
8277 rtx label, jump;
8279 label = gen_label_rtx ();
8281 jump = emit_jump_insn_before (gen_jump (label), insn);
8282 JUMP_LABEL (jump) = label;
8283 LABEL_NUSES (label) = 1;
8284 barrier = emit_barrier_after (jump);
8286 emit_label_after (label, barrier);
8287 pool.insn_address += 4;
8290 /* See whether the constant pool is now out of range of the first
8291 user. If so, output the constants after the previous barrier.
8292 Note that any instructions between BARRIER and INSN (inclusive)
8293 will use negative offsets to refer to the pool. */
8294 if (pool.insn_address > pool.highest_address)
8296 dump_constants (pool.first, barrier);
8297 pool.first = NULL;
8298 barrier = 0;
8300 else if (BARRIER_P (insn))
8301 barrier = insn;
8304 dump_constants (pool.first, get_last_insn ());
8307 /* A temporary variable used by for_each_rtx callbacks, etc. */
8308 static rtx mips_sim_insn;
8310 /* A structure representing the state of the processor pipeline.
8311 Used by the mips_sim_* family of functions. */
8312 struct mips_sim {
8313 /* The maximum number of instructions that can be issued in a cycle.
8314 (Caches mips_issue_rate.) */
8315 unsigned int issue_rate;
8317 /* The current simulation time. */
8318 unsigned int time;
8320 /* How many more instructions can be issued in the current cycle. */
8321 unsigned int insns_left;
8323 /* LAST_SET[X].INSN is the last instruction to set register X.
8324 LAST_SET[X].TIME is the time at which that instruction was issued.
8325 INSN is null if no instruction has yet set register X. */
8326 struct {
8327 rtx insn;
8328 unsigned int time;
8329 } last_set[FIRST_PSEUDO_REGISTER];
8331 /* The pipeline's current DFA state. */
8332 state_t dfa_state;
8335 /* Reset STATE to the initial simulation state. */
8337 static void
8338 mips_sim_reset (struct mips_sim *state)
8340 state->time = 0;
8341 state->insns_left = state->issue_rate;
8342 memset (&state->last_set, 0, sizeof (state->last_set));
8343 state_reset (state->dfa_state);
8346 /* Initialize STATE before its first use. DFA_STATE points to an
8347 allocated but uninitialized DFA state. */
8349 static void
8350 mips_sim_init (struct mips_sim *state, state_t dfa_state)
8352 state->issue_rate = mips_issue_rate ();
8353 state->dfa_state = dfa_state;
8354 mips_sim_reset (state);
8357 /* Advance STATE by one clock cycle. */
8359 static void
8360 mips_sim_next_cycle (struct mips_sim *state)
8362 state->time++;
8363 state->insns_left = state->issue_rate;
8364 state_transition (state->dfa_state, 0);
8367 /* Advance simulation state STATE until instruction INSN can read
8368 register REG. */
8370 static void
8371 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
8373 unsigned int i;
8375 for (i = 0; i < HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); i++)
8376 if (state->last_set[REGNO (reg) + i].insn != 0)
8378 unsigned int t;
8380 t = state->last_set[REGNO (reg) + i].time;
8381 t += insn_latency (state->last_set[REGNO (reg) + i].insn, insn);
8382 while (state->time < t)
8383 mips_sim_next_cycle (state);
8387 /* A for_each_rtx callback. If *X is a register, advance simulation state
8388 DATA until mips_sim_insn can read the register's value. */
8390 static int
8391 mips_sim_wait_regs_2 (rtx *x, void *data)
8393 if (REG_P (*x))
8394 mips_sim_wait_reg (data, mips_sim_insn, *x);
8395 return 0;
8398 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X. */
8400 static void
8401 mips_sim_wait_regs_1 (rtx *x, void *data)
8403 for_each_rtx (x, mips_sim_wait_regs_2, data);
8406 /* Advance simulation state STATE until all of INSN's register
8407 dependencies are satisfied. */
8409 static void
8410 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
8412 mips_sim_insn = insn;
8413 note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
8416 /* Advance simulation state STATE until the units required by
8417 instruction INSN are available. */
8419 static void
8420 mips_sim_wait_units (struct mips_sim *state, rtx insn)
8422 state_t tmp_state;
8424 tmp_state = alloca (state_size ());
8425 while (state->insns_left == 0
8426 || (memcpy (tmp_state, state->dfa_state, state_size ()),
8427 state_transition (tmp_state, insn) >= 0))
8428 mips_sim_next_cycle (state);
8431 /* Advance simulation state STATE until INSN is ready to issue. */
8433 static void
8434 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
8436 mips_sim_wait_regs (state, insn);
8437 mips_sim_wait_units (state, insn);
8440 /* mips_sim_insn has just set X. Update the LAST_SET array
8441 in simulation state DATA. */
8443 static void
8444 mips_sim_record_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
8446 struct mips_sim *state;
8447 unsigned int i;
8449 state = data;
8450 if (REG_P (x))
8451 for (i = 0; i < HARD_REGNO_NREGS (REGNO (x), GET_MODE (x)); i++)
8453 state->last_set[REGNO (x) + i].insn = mips_sim_insn;
8454 state->last_set[REGNO (x) + i].time = state->time;
8458 /* Issue instruction INSN in scheduler state STATE. Assume that INSN
8459 can issue immediately (i.e., that mips_sim_wait_insn has already
8460 been called). */
8462 static void
8463 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
8465 state_transition (state->dfa_state, insn);
8466 state->insns_left--;
8468 mips_sim_insn = insn;
8469 note_stores (PATTERN (insn), mips_sim_record_set, state);
8472 /* Simulate issuing a NOP in state STATE. */
8474 static void
8475 mips_sim_issue_nop (struct mips_sim *state)
8477 if (state->insns_left == 0)
8478 mips_sim_next_cycle (state);
8479 state->insns_left--;
8482 /* Update simulation state STATE so that it's ready to accept the instruction
8483 after INSN. INSN should be part of the main rtl chain, not a member of a
8484 SEQUENCE. */
8486 static void
8487 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
8489 /* If INSN is a jump with an implicit delay slot, simulate a nop. */
8490 if (JUMP_P (insn))
8491 mips_sim_issue_nop (state);
8493 switch (GET_CODE (SEQ_BEGIN (insn)))
8495 case CODE_LABEL:
8496 case CALL_INSN:
8497 /* We can't predict the processor state after a call or label. */
8498 mips_sim_reset (state);
8499 break;
8501 case JUMP_INSN:
8502 /* The delay slots of branch likely instructions are only executed
8503 when the branch is taken. Therefore, if the caller has simulated
8504 the delay slot instruction, STATE does not really reflect the state
8505 of the pipeline for the instruction after the delay slot. Also,
8506 branch likely instructions tend to incur a penalty when not taken,
8507 so there will probably be an extra delay between the branch and
8508 the instruction after the delay slot. */
8509 if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
8510 mips_sim_reset (state);
8511 break;
8513 default:
8514 break;
8518 /* The VR4130 pipeline issues aligned pairs of instructions together,
8519 but it stalls the second instruction if it depends on the first.
8520 In order to cut down the amount of logic required, this dependence
8521 check is not based on a full instruction decode. Instead, any non-SPECIAL
8522 instruction is assumed to modify the register specified by bits 20-16
8523 (which is usually the "rt" field).
8525 In beq, beql, bne and bnel instructions, the rt field is actually an
8526 input, so we can end up with a false dependence between the branch
8527 and its delay slot. If this situation occurs in instruction INSN,
8528 try to avoid it by swapping rs and rt. */
8530 static void
8531 vr4130_avoid_branch_rt_conflict (rtx insn)
8533 rtx first, second;
8535 first = SEQ_BEGIN (insn);
8536 second = SEQ_END (insn);
8537 if (GET_CODE (first) == JUMP_INSN
8538 && GET_CODE (second) == INSN
8539 && GET_CODE (PATTERN (first)) == SET
8540 && GET_CODE (SET_DEST (PATTERN (first))) == PC
8541 && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
8543 /* Check for the right kind of condition. */
8544 rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
8545 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
8546 && REG_P (XEXP (cond, 0))
8547 && REG_P (XEXP (cond, 1))
8548 && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
8549 && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
8551 /* SECOND mentions the rt register but not the rs register. */
8552 rtx tmp = XEXP (cond, 0);
8553 XEXP (cond, 0) = XEXP (cond, 1);
8554 XEXP (cond, 1) = tmp;
8559 /* Implement -mvr4130-align. Go through each basic block and simulate the
8560 processor pipeline. If we find that a pair of instructions could execute
8561 in parallel, and the first of those instruction is not 8-byte aligned,
8562 insert a nop to make it aligned. */
8564 static void
8565 vr4130_align_insns (void)
8567 struct mips_sim state;
8568 rtx insn, subinsn, last, last2, next;
8569 bool aligned_p;
8571 dfa_start ();
8573 /* LAST is the last instruction before INSN to have a nonzero length.
8574 LAST2 is the last such instruction before LAST. */
8575 last = 0;
8576 last2 = 0;
8578 /* ALIGNED_P is true if INSN is known to be at an aligned address. */
8579 aligned_p = true;
8581 mips_sim_init (&state, alloca (state_size ()));
8582 for (insn = get_insns (); insn != 0; insn = next)
8584 unsigned int length;
8586 next = NEXT_INSN (insn);
8588 /* See the comment above vr4130_avoid_branch_rt_conflict for details.
8589 This isn't really related to the alignment pass, but we do it on
8590 the fly to avoid a separate instruction walk. */
8591 vr4130_avoid_branch_rt_conflict (insn);
8593 if (USEFUL_INSN_P (insn))
8594 FOR_EACH_SUBINSN (subinsn, insn)
8596 mips_sim_wait_insn (&state, subinsn);
8598 /* If we want this instruction to issue in parallel with the
8599 previous one, make sure that the previous instruction is
8600 aligned. There are several reasons why this isn't worthwhile
8601 when the second instruction is a call:
8603 - Calls are less likely to be performance critical,
8604 - There's a good chance that the delay slot can execute
8605 in parallel with the call.
8606 - The return address would then be unaligned.
8608 In general, if we're going to insert a nop between instructions
8609 X and Y, it's better to insert it immediately after X. That
8610 way, if the nop makes Y aligned, it will also align any labels
8611 between X and Y. */
8612 if (state.insns_left != state.issue_rate
8613 && GET_CODE (subinsn) != CALL_INSN)
8615 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
8617 /* SUBINSN is the first instruction in INSN and INSN is
8618 aligned. We want to align the previous instruction
8619 instead, so insert a nop between LAST2 and LAST.
8621 Note that LAST could be either a single instruction
8622 or a branch with a delay slot. In the latter case,
8623 LAST, like INSN, is already aligned, but the delay
8624 slot must have some extra delay that stops it from
8625 issuing at the same time as the branch. We therefore
8626 insert a nop before the branch in order to align its
8627 delay slot. */
8628 emit_insn_after (gen_nop (), last2);
8629 aligned_p = false;
8631 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
8633 /* SUBINSN is the delay slot of INSN, but INSN is
8634 currently unaligned. Insert a nop between
8635 LAST and INSN to align it. */
8636 emit_insn_after (gen_nop (), last);
8637 aligned_p = true;
8640 mips_sim_issue_insn (&state, subinsn);
8642 mips_sim_finish_insn (&state, insn);
8644 /* Update LAST, LAST2 and ALIGNED_P for the next instruction. */
8645 length = get_attr_length (insn);
8646 if (length > 0)
8648 /* If the instruction is an asm statement or multi-instruction
8649 mips.md patern, the length is only an estimate. Insert an
8650 8 byte alignment after it so that the following instructions
8651 can be handled correctly. */
8652 if (GET_CODE (SEQ_BEGIN (insn)) == INSN
8653 && (recog_memoized (insn) < 0 || length >= 8))
8655 next = emit_insn_after (gen_align (GEN_INT (3)), insn);
8656 next = NEXT_INSN (next);
8657 mips_sim_next_cycle (&state);
8658 aligned_p = true;
8660 else if (length & 4)
8661 aligned_p = !aligned_p;
8662 last2 = last;
8663 last = insn;
8666 /* See whether INSN is an aligned label. */
8667 if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
8668 aligned_p = true;
8670 dfa_finish ();
8673 /* Subroutine of mips_reorg. If there is a hazard between INSN
8674 and a previous instruction, avoid it by inserting nops after
8675 instruction AFTER.
8677 *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
8678 this point. If *DELAYED_REG is non-null, INSN must wait a cycle
8679 before using the value of that register. *HILO_DELAY counts the
8680 number of instructions since the last hilo hazard (that is,
8681 the number of instructions since the last mflo or mfhi).
8683 After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
8684 for the next instruction.
8686 LO_REG is an rtx for the LO register, used in dependence checking. */
8688 static void
8689 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
8690 rtx *delayed_reg, rtx lo_reg)
8692 rtx pattern, set;
8693 int nops, ninsns;
8695 if (!INSN_P (insn))
8696 return;
8698 pattern = PATTERN (insn);
8700 /* Do not put the whole function in .set noreorder if it contains
8701 an asm statement. We don't know whether there will be hazards
8702 between the asm statement and the gcc-generated code. */
8703 if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
8704 cfun->machine->all_noreorder_p = false;
8706 /* Ignore zero-length instructions (barriers and the like). */
8707 ninsns = get_attr_length (insn) / 4;
8708 if (ninsns == 0)
8709 return;
8711 /* Work out how many nops are needed. Note that we only care about
8712 registers that are explicitly mentioned in the instruction's pattern.
8713 It doesn't matter that calls use the argument registers or that they
8714 clobber hi and lo. */
8715 if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
8716 nops = 2 - *hilo_delay;
8717 else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
8718 nops = 1;
8719 else
8720 nops = 0;
8722 /* Insert the nops between this instruction and the previous one.
8723 Each new nop takes us further from the last hilo hazard. */
8724 *hilo_delay += nops;
8725 while (nops-- > 0)
8726 emit_insn_after (gen_hazard_nop (), after);
8728 /* Set up the state for the next instruction. */
8729 *hilo_delay += ninsns;
8730 *delayed_reg = 0;
8731 if (INSN_CODE (insn) >= 0)
8732 switch (get_attr_hazard (insn))
8734 case HAZARD_NONE:
8735 break;
8737 case HAZARD_HILO:
8738 *hilo_delay = 0;
8739 break;
8741 case HAZARD_DELAY:
8742 set = single_set (insn);
8743 if (set == 0)
8744 abort ();
8745 *delayed_reg = SET_DEST (set);
8746 break;
8751 /* Go through the instruction stream and insert nops where necessary.
8752 See if the whole function can then be put into .set noreorder &
8753 .set nomacro. */
8755 static void
8756 mips_avoid_hazards (void)
8758 rtx insn, last_insn, lo_reg, delayed_reg;
8759 int hilo_delay, i;
8761 /* Force all instructions to be split into their final form. */
8762 split_all_insns_noflow ();
8764 /* Recalculate instruction lengths without taking nops into account. */
8765 cfun->machine->ignore_hazard_length_p = true;
8766 shorten_branches (get_insns ());
8768 /* The profiler code uses assembler macros. -mfix-vr4120 relies on
8769 assembler nop insertion. */
8770 cfun->machine->all_noreorder_p = (!current_function_profile
8771 && !TARGET_FIX_VR4120);
8773 last_insn = 0;
8774 hilo_delay = 2;
8775 delayed_reg = 0;
8776 lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
8778 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
8779 if (INSN_P (insn))
8781 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
8782 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
8783 mips_avoid_hazard (last_insn, XVECEXP (PATTERN (insn), 0, i),
8784 &hilo_delay, &delayed_reg, lo_reg);
8785 else
8786 mips_avoid_hazard (last_insn, insn, &hilo_delay,
8787 &delayed_reg, lo_reg);
8789 last_insn = insn;
8794 /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
8796 static void
8797 mips_reorg (void)
8799 if (TARGET_MIPS16)
8800 mips16_lay_out_constants ();
8801 else if (TARGET_EXPLICIT_RELOCS)
8803 if (mips_flag_delayed_branch)
8804 dbr_schedule (get_insns (), dump_file);
8805 mips_avoid_hazards ();
8806 if (TUNE_MIPS4130 && TARGET_VR4130_ALIGN)
8807 vr4130_align_insns ();
8811 /* This function does three things:
8813 - Register the special divsi3 and modsi3 functions if -mfix-vr4120.
8814 - Register the mips16 hardware floating point stubs.
8815 - Register the gofast functions if selected using --enable-gofast. */
8817 #include "config/gofast.h"
8819 static void
8820 mips_init_libfuncs (void)
8822 if (TARGET_FIX_VR4120)
8824 set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
8825 set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
8828 if (TARGET_MIPS16 && mips16_hard_float)
8830 set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
8831 set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
8832 set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
8833 set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
8835 set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
8836 set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
8837 set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
8838 set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
8839 set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
8840 set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
8842 set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
8843 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
8845 if (TARGET_DOUBLE_FLOAT)
8847 set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
8848 set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
8849 set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
8850 set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
8852 set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
8853 set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
8854 set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
8855 set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
8856 set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
8857 set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
8859 set_conv_libfunc (sext_optab, DFmode, SFmode, "__mips16_extendsfdf2");
8860 set_conv_libfunc (trunc_optab, SFmode, DFmode, "__mips16_truncdfsf2");
8862 set_conv_libfunc (sfix_optab, SImode, DFmode, "__mips16_fix_truncdfsi");
8863 set_conv_libfunc (sfloat_optab, DFmode, SImode, "__mips16_floatsidf");
8866 else
8867 gofast_maybe_init_libfuncs ();
8870 /* Return a number assessing the cost of moving a register in class
8871 FROM to class TO. The classes are expressed using the enumeration
8872 values such as `GENERAL_REGS'. A value of 2 is the default; other
8873 values are interpreted relative to that.
8875 It is not required that the cost always equal 2 when FROM is the
8876 same as TO; on some machines it is expensive to move between
8877 registers if they are not general registers.
8879 If reload sees an insn consisting of a single `set' between two
8880 hard registers, and if `REGISTER_MOVE_COST' applied to their
8881 classes returns a value of 2, reload does not check to ensure that
8882 the constraints of the insn are met. Setting a cost of other than
8883 2 will allow reload to verify that the constraints are met. You
8884 should do this if the `movM' pattern's constraints do not allow
8885 such copying.
8887 ??? We make the cost of moving from HI/LO into general
8888 registers the same as for one of moving general registers to
8889 HI/LO for TARGET_MIPS16 in order to prevent allocating a
8890 pseudo to HI/LO. This might hurt optimizations though, it
8891 isn't clear if it is wise. And it might not work in all cases. We
8892 could solve the DImode LO reg problem by using a multiply, just
8893 like reload_{in,out}si. We could solve the SImode/HImode HI reg
8894 problem by using divide instructions. divu puts the remainder in
8895 the HI reg, so doing a divide by -1 will move the value in the HI
8896 reg for all values except -1. We could handle that case by using a
8897 signed divide, e.g. -1 / 2 (or maybe 1 / -2?). We'd have to emit
8898 a compare/branch to test the input value to see which instruction
8899 we need to use. This gets pretty messy, but it is feasible. */
8902 mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
8903 enum reg_class to, enum reg_class from)
8905 if (from == M16_REGS && GR_REG_CLASS_P (to))
8906 return 2;
8907 else if (from == M16_NA_REGS && GR_REG_CLASS_P (to))
8908 return 2;
8909 else if (GR_REG_CLASS_P (from))
8911 if (to == M16_REGS)
8912 return 2;
8913 else if (to == M16_NA_REGS)
8914 return 2;
8915 else if (GR_REG_CLASS_P (to))
8917 if (TARGET_MIPS16)
8918 return 4;
8919 else
8920 return 2;
8922 else if (to == FP_REGS)
8923 return 4;
8924 else if (to == HI_REG || to == LO_REG || to == MD_REGS)
8926 if (TARGET_MIPS16)
8927 return 12;
8928 else
8929 return 6;
8931 else if (COP_REG_CLASS_P (to))
8933 return 5;
8935 } /* GR_REG_CLASS_P (from) */
8936 else if (from == FP_REGS)
8938 if (GR_REG_CLASS_P (to))
8939 return 4;
8940 else if (to == FP_REGS)
8941 return 2;
8942 else if (to == ST_REGS)
8943 return 8;
8944 } /* from == FP_REGS */
8945 else if (from == HI_REG || from == LO_REG || from == MD_REGS)
8947 if (GR_REG_CLASS_P (to))
8949 if (TARGET_MIPS16)
8950 return 12;
8951 else
8952 return 6;
8954 } /* from == HI_REG, etc. */
8955 else if (from == ST_REGS && GR_REG_CLASS_P (to))
8956 return 4;
8957 else if (COP_REG_CLASS_P (from))
8959 return 5;
8960 } /* COP_REG_CLASS_P (from) */
8962 /* Fall through. */
8964 return 12;
8967 /* Return the length of INSN. LENGTH is the initial length computed by
8968 attributes in the machine-description file. */
8971 mips_adjust_insn_length (rtx insn, int length)
8973 /* A unconditional jump has an unfilled delay slot if it is not part
8974 of a sequence. A conditional jump normally has a delay slot, but
8975 does not on MIPS16. */
8976 if (simplejump_p (insn)
8977 || (!TARGET_MIPS16 && (GET_CODE (insn) == JUMP_INSN
8978 || GET_CODE (insn) == CALL_INSN)))
8979 length += 4;
8981 /* See how many nops might be needed to avoid hardware hazards. */
8982 if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
8983 switch (get_attr_hazard (insn))
8985 case HAZARD_NONE:
8986 break;
8988 case HAZARD_DELAY:
8989 length += 4;
8990 break;
8992 case HAZARD_HILO:
8993 length += 8;
8994 break;
8997 /* All MIPS16 instructions are a measly two bytes. */
8998 if (TARGET_MIPS16)
8999 length /= 2;
9001 return length;
9005 /* Return an asm sequence to start a noat block and load the address
9006 of a label into $1. */
9008 const char *
9009 mips_output_load_label (void)
9011 if (TARGET_EXPLICIT_RELOCS)
9012 switch (mips_abi)
9014 case ABI_N32:
9015 return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
9017 case ABI_64:
9018 return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
9020 default:
9021 if (ISA_HAS_LOAD_DELAY)
9022 return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
9023 return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
9025 else
9027 if (Pmode == DImode)
9028 return "%[dla\t%@,%0";
9029 else
9030 return "%[la\t%@,%0";
9035 /* Output assembly instructions to peform a conditional branch.
9037 INSN is the branch instruction. OPERANDS[0] is the condition.
9038 OPERANDS[1] is the target of the branch. OPERANDS[2] is the target
9039 of the first operand to the condition. If TWO_OPERANDS_P is
9040 nonzero the comparison takes two operands; OPERANDS[3] will be the
9041 second operand.
9043 If INVERTED_P is nonzero we are to branch if the condition does
9044 not hold. If FLOAT_P is nonzero this is a floating-point comparison.
9046 LENGTH is the length (in bytes) of the sequence we are to generate.
9047 That tells us whether to generate a simple conditional branch, or a
9048 reversed conditional branch around a `jr' instruction. */
9049 const char *
9050 mips_output_conditional_branch (rtx insn, rtx *operands, int two_operands_p,
9051 int float_p, int inverted_p, int length)
9053 static char buffer[200];
9054 /* The kind of comparison we are doing. */
9055 enum rtx_code code = GET_CODE (operands[0]);
9056 /* Nonzero if the opcode for the comparison needs a `z' indicating
9057 that it is a comparison against zero. */
9058 int need_z_p;
9059 /* A string to use in the assembly output to represent the first
9060 operand. */
9061 const char *op1 = "%z2";
9062 /* A string to use in the assembly output to represent the second
9063 operand. Use the hard-wired zero register if there's no second
9064 operand. */
9065 const char *op2 = (two_operands_p ? ",%z3" : ",%.");
9066 /* The operand-printing string for the comparison. */
9067 const char *const comp = (float_p ? "%F0" : "%C0");
9068 /* The operand-printing string for the inverted comparison. */
9069 const char *const inverted_comp = (float_p ? "%W0" : "%N0");
9071 /* The MIPS processors (for levels of the ISA at least two), have
9072 "likely" variants of each branch instruction. These instructions
9073 annul the instruction in the delay slot if the branch is not
9074 taken. */
9075 mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
9077 if (!two_operands_p)
9079 /* To compute whether than A > B, for example, we normally
9080 subtract B from A and then look at the sign bit. But, if we
9081 are doing an unsigned comparison, and B is zero, we don't
9082 have to do the subtraction. Instead, we can just check to
9083 see if A is nonzero. Thus, we change the CODE here to
9084 reflect the simpler comparison operation. */
9085 switch (code)
9087 case GTU:
9088 code = NE;
9089 break;
9091 case LEU:
9092 code = EQ;
9093 break;
9095 case GEU:
9096 /* A condition which will always be true. */
9097 code = EQ;
9098 op1 = "%.";
9099 break;
9101 case LTU:
9102 /* A condition which will always be false. */
9103 code = NE;
9104 op1 = "%.";
9105 break;
9107 default:
9108 /* Not a special case. */
9109 break;
9113 /* Relative comparisons are always done against zero. But
9114 equality comparisons are done between two operands, and therefore
9115 do not require a `z' in the assembly language output. */
9116 need_z_p = (!float_p && code != EQ && code != NE);
9117 /* For comparisons against zero, the zero is not provided
9118 explicitly. */
9119 if (need_z_p)
9120 op2 = "";
9122 /* Begin by terminating the buffer. That way we can always use
9123 strcat to add to it. */
9124 buffer[0] = '\0';
9126 switch (length)
9128 case 4:
9129 case 8:
9130 /* Just a simple conditional branch. */
9131 if (float_p)
9132 sprintf (buffer, "%%*b%s%%?\t%%Z2%%1%%/",
9133 inverted_p ? inverted_comp : comp);
9134 else
9135 sprintf (buffer, "%%*b%s%s%%?\t%s%s,%%1%%/",
9136 inverted_p ? inverted_comp : comp,
9137 need_z_p ? "z" : "",
9138 op1,
9139 op2);
9140 return buffer;
9142 case 12:
9143 case 16:
9144 case 24:
9145 case 28:
9147 /* Generate a reversed conditional branch around ` j'
9148 instruction:
9150 .set noreorder
9151 .set nomacro
9152 bc l
9153 delay_slot or #nop
9154 j target
9155 #nop
9157 .set macro
9158 .set reorder
9160 If the original branch was a likely branch, the delay slot
9161 must be executed only if the branch is taken, so generate:
9163 .set noreorder
9164 .set nomacro
9165 bc l
9166 #nop
9167 j target
9168 delay slot or #nop
9170 .set macro
9171 .set reorder
9173 When generating PIC, instead of:
9175 j target
9177 we emit:
9179 .set noat
9180 la $at, target
9181 jr $at
9182 .set at
9185 rtx orig_target;
9186 rtx target = gen_label_rtx ();
9188 orig_target = operands[1];
9189 operands[1] = target;
9190 /* Generate the reversed comparison. This takes four
9191 bytes. */
9192 if (float_p)
9193 sprintf (buffer, "%%*b%s\t%%Z2%%1",
9194 inverted_p ? comp : inverted_comp);
9195 else
9196 sprintf (buffer, "%%*b%s%s\t%s%s,%%1",
9197 inverted_p ? comp : inverted_comp,
9198 need_z_p ? "z" : "",
9199 op1,
9200 op2);
9201 output_asm_insn (buffer, operands);
9203 if (length != 16 && length != 28 && ! mips_branch_likely)
9205 /* Output delay slot instruction. */
9206 rtx insn = final_sequence;
9207 final_scan_insn (XVECEXP (insn, 0, 1), asm_out_file,
9208 optimize, 0, 1, NULL);
9209 INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
9211 else
9212 output_asm_insn ("%#", 0);
9214 if (length <= 16)
9215 output_asm_insn ("j\t%0", &orig_target);
9216 else
9218 output_asm_insn (mips_output_load_label (), &orig_target);
9219 output_asm_insn ("jr\t%@%]", 0);
9222 if (length != 16 && length != 28 && mips_branch_likely)
9224 /* Output delay slot instruction. */
9225 rtx insn = final_sequence;
9226 final_scan_insn (XVECEXP (insn, 0, 1), asm_out_file,
9227 optimize, 0, 1, NULL);
9228 INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
9230 else
9231 output_asm_insn ("%#", 0);
9233 (*targetm.asm_out.internal_label) (asm_out_file, "L",
9234 CODE_LABEL_NUMBER (target));
9236 return "";
9239 default:
9240 abort ();
9243 /* NOTREACHED */
9244 return 0;
9247 /* Used to output div or ddiv instruction DIVISION, which has the operands
9248 given by OPERANDS. Add in a divide-by-zero check if needed.
9250 When working around R4000 and R4400 errata, we need to make sure that
9251 the division is not immediately followed by a shift[1][2]. We also
9252 need to stop the division from being put into a branch delay slot[3].
9253 The easiest way to avoid both problems is to add a nop after the
9254 division. When a divide-by-zero check is needed, this nop can be
9255 used to fill the branch delay slot.
9257 [1] If a double-word or a variable shift executes immediately
9258 after starting an integer division, the shift may give an
9259 incorrect result. See quotations of errata #16 and #28 from
9260 "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9261 in mips.md for details.
9263 [2] A similar bug to [1] exists for all revisions of the
9264 R4000 and the R4400 when run in an MC configuration.
9265 From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
9267 "19. In this following sequence:
9269 ddiv (or ddivu or div or divu)
9270 dsll32 (or dsrl32, dsra32)
9272 if an MPT stall occurs, while the divide is slipping the cpu
9273 pipeline, then the following double shift would end up with an
9274 incorrect result.
9276 Workaround: The compiler needs to avoid generating any
9277 sequence with divide followed by extended double shift."
9279 This erratum is also present in "MIPS R4400MC Errata, Processor
9280 Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
9281 & 3.0" as errata #10 and #4, respectively.
9283 [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9284 (also valid for MIPS R4000MC processors):
9286 "52. R4000SC: This bug does not apply for the R4000PC.
9288 There are two flavors of this bug:
9290 1) If the instruction just after divide takes an RF exception
9291 (tlb-refill, tlb-invalid) and gets an instruction cache
9292 miss (both primary and secondary) and the line which is
9293 currently in secondary cache at this index had the first
9294 data word, where the bits 5..2 are set, then R4000 would
9295 get a wrong result for the div.
9299 div r8, r9
9300 ------------------- # end-of page. -tlb-refill
9304 div r8, r9
9305 ------------------- # end-of page. -tlb-invalid
9308 2) If the divide is in the taken branch delay slot, where the
9309 target takes RF exception and gets an I-cache miss for the
9310 exception vector or where I-cache miss occurs for the
9311 target address, under the above mentioned scenarios, the
9312 div would get wrong results.
9315 j r2 # to next page mapped or unmapped
9316 div r8,r9 # this bug would be there as long
9317 # as there is an ICache miss and
9318 nop # the "data pattern" is present
9321 beq r0, r0, NextPage # to Next page
9322 div r8,r9
9325 This bug is present for div, divu, ddiv, and ddivu
9326 instructions.
9328 Workaround: For item 1), OS could make sure that the next page
9329 after the divide instruction is also mapped. For item 2), the
9330 compiler could make sure that the divide instruction is not in
9331 the branch delay slot."
9333 These processors have PRId values of 0x00004220 and 0x00004300 for
9334 the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400. */
9336 const char *
9337 mips_output_division (const char *division, rtx *operands)
9339 const char *s;
9341 s = division;
9342 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
9344 output_asm_insn (s, operands);
9345 s = "nop";
9347 if (TARGET_CHECK_ZERO_DIV)
9349 if (TARGET_MIPS16)
9351 output_asm_insn (s, operands);
9352 s = "bnez\t%2,1f\n\tbreak\t7\n1:";
9354 else
9356 output_asm_insn ("%(bne\t%2,%.,1f", operands);
9357 output_asm_insn (s, operands);
9358 s = "break\t7%)\n1:";
9361 return s;
9364 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
9365 with a final "000" replaced by "k". Ignore case.
9367 Note: this function is shared between GCC and GAS. */
9369 static bool
9370 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
9372 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
9373 given++, canonical++;
9375 return ((*given == 0 && *canonical == 0)
9376 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
9380 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
9381 CPU name. We've traditionally allowed a lot of variation here.
9383 Note: this function is shared between GCC and GAS. */
9385 static bool
9386 mips_matching_cpu_name_p (const char *canonical, const char *given)
9388 /* First see if the name matches exactly, or with a final "000"
9389 turned into "k". */
9390 if (mips_strict_matching_cpu_name_p (canonical, given))
9391 return true;
9393 /* If not, try comparing based on numerical designation alone.
9394 See if GIVEN is an unadorned number, or 'r' followed by a number. */
9395 if (TOLOWER (*given) == 'r')
9396 given++;
9397 if (!ISDIGIT (*given))
9398 return false;
9400 /* Skip over some well-known prefixes in the canonical name,
9401 hoping to find a number there too. */
9402 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
9403 canonical += 2;
9404 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
9405 canonical += 2;
9406 else if (TOLOWER (canonical[0]) == 'r')
9407 canonical += 1;
9409 return mips_strict_matching_cpu_name_p (canonical, given);
9413 /* Parse an option that takes the name of a processor as its argument.
9414 OPTION is the name of the option and CPU_STRING is the argument.
9415 Return the corresponding processor enumeration if the CPU_STRING is
9416 recognized, otherwise report an error and return null.
9418 A similar function exists in GAS. */
9420 static const struct mips_cpu_info *
9421 mips_parse_cpu (const char *option, const char *cpu_string)
9423 const struct mips_cpu_info *p;
9424 const char *s;
9426 /* In the past, we allowed upper-case CPU names, but it doesn't
9427 work well with the multilib machinery. */
9428 for (s = cpu_string; *s != 0; s++)
9429 if (ISUPPER (*s))
9431 warning ("the cpu name must be lower case");
9432 break;
9435 /* 'from-abi' selects the most compatible architecture for the given
9436 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
9437 EABIs, we have to decide whether we're using the 32-bit or 64-bit
9438 version. Look first at the -mgp options, if given, otherwise base
9439 the choice on MASK_64BIT in TARGET_DEFAULT. */
9440 if (strcasecmp (cpu_string, "from-abi") == 0)
9441 return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
9442 : ABI_NEEDS_64BIT_REGS ? 3
9443 : (TARGET_64BIT ? 3 : 1));
9445 /* 'default' has traditionally been a no-op. Probably not very useful. */
9446 if (strcasecmp (cpu_string, "default") == 0)
9447 return 0;
9449 for (p = mips_cpu_info_table; p->name != 0; p++)
9450 if (mips_matching_cpu_name_p (p->name, cpu_string))
9451 return p;
9453 error ("bad value (%s) for %s", cpu_string, option);
9454 return 0;
9458 /* Return the processor associated with the given ISA level, or null
9459 if the ISA isn't valid. */
9461 static const struct mips_cpu_info *
9462 mips_cpu_info_from_isa (int isa)
9464 const struct mips_cpu_info *p;
9466 for (p = mips_cpu_info_table; p->name != 0; p++)
9467 if (p->isa == isa)
9468 return p;
9470 return 0;
9473 /* Implement HARD_REGNO_NREGS. The size of FP registers are controlled
9474 by UNITS_PER_FPREG. All other registers are word sized. */
9476 unsigned int
9477 mips_hard_regno_nregs (int regno, enum machine_mode mode)
9479 if (! FP_REG_P (regno))
9480 return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
9481 else
9482 return ((GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG);
9485 /* Implement TARGET_RETURN_IN_MEMORY. Under the old (i.e., 32 and O64 ABIs)
9486 all BLKmode objects are returned in memory. Under the new (N32 and
9487 64-bit MIPS ABIs) small structures are returned in a register.
9488 Objects with varying size must still be returned in memory, of
9489 course. */
9491 static bool
9492 mips_return_in_memory (tree type, tree fndecl ATTRIBUTE_UNUSED)
9494 if (TARGET_OLDABI)
9495 return (TYPE_MODE (type) == BLKmode);
9496 else
9497 return ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
9498 || (int_size_in_bytes (type) == -1));
9501 static bool
9502 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
9504 return !TARGET_OLDABI;
9507 /* Return true if INSN is a multiply-add or multiply-subtract
9508 instruction and PREV assigns to the accumulator operand. */
9510 bool
9511 mips_linked_madd_p (rtx prev, rtx insn)
9513 rtx x;
9515 x = single_set (insn);
9516 if (x == 0)
9517 return false;
9519 x = SET_SRC (x);
9521 if (GET_CODE (x) == PLUS
9522 && GET_CODE (XEXP (x, 0)) == MULT
9523 && reg_set_p (XEXP (x, 1), prev))
9524 return true;
9526 if (GET_CODE (x) == MINUS
9527 && GET_CODE (XEXP (x, 1)) == MULT
9528 && reg_set_p (XEXP (x, 0), prev))
9529 return true;
9531 return false;
9534 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
9535 that may clobber hi or lo. */
9537 static rtx mips_macc_chains_last_hilo;
9539 /* A TUNE_MACC_CHAINS helper function. Record that instruction INSN has
9540 been scheduled, updating mips_macc_chains_last_hilo appropriately. */
9542 static void
9543 mips_macc_chains_record (rtx insn)
9545 if (get_attr_may_clobber_hilo (insn))
9546 mips_macc_chains_last_hilo = insn;
9549 /* A TUNE_MACC_CHAINS helper function. Search ready queue READY, which
9550 has NREADY elements, looking for a multiply-add or multiply-subtract
9551 instruction that is cumulative with mips_macc_chains_last_hilo.
9552 If there is one, promote it ahead of anything else that might
9553 clobber hi or lo. */
9555 static void
9556 mips_macc_chains_reorder (rtx *ready, int nready)
9558 int i, j;
9560 if (mips_macc_chains_last_hilo != 0)
9561 for (i = nready - 1; i >= 0; i--)
9562 if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
9564 for (j = nready - 1; j > i; j--)
9565 if (recog_memoized (ready[j]) >= 0
9566 && get_attr_may_clobber_hilo (ready[j]))
9568 mips_promote_ready (ready, i, j);
9569 break;
9571 break;
9575 /* The last instruction to be scheduled. */
9577 static rtx vr4130_last_insn;
9579 /* A note_stores callback used by vr4130_true_reg_dependence_p. DATA
9580 points to an rtx that is initially an instruction. Nullify the rtx
9581 if the instruction uses the value of register X. */
9583 static void
9584 vr4130_true_reg_dependence_p_1 (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
9586 rtx *insn_ptr = data;
9587 if (REG_P (x)
9588 && *insn_ptr != 0
9589 && reg_referenced_p (x, PATTERN (*insn_ptr)))
9590 *insn_ptr = 0;
9593 /* Return true if there is true register dependence between vr4130_last_insn
9594 and INSN. */
9596 static bool
9597 vr4130_true_reg_dependence_p (rtx insn)
9599 note_stores (PATTERN (vr4130_last_insn),
9600 vr4130_true_reg_dependence_p_1, &insn);
9601 return insn == 0;
9604 /* A TUNE_MIPS4130 helper function. Given that INSN1 is at the head of
9605 the ready queue and that INSN2 is the instruction after it, return
9606 true if it is worth promoting INSN2 ahead of INSN1. Look for cases
9607 in which INSN1 and INSN2 can probably issue in parallel, but for
9608 which (INSN2, INSN1) should be less sensitive to instruction
9609 alignment than (INSN1, INSN2). See 4130.md for more details. */
9611 static bool
9612 vr4130_swap_insns_p (rtx insn1, rtx insn2)
9614 rtx dep;
9616 /* Check for the following case:
9618 1) there is some other instruction X with an anti dependence on INSN1;
9619 2) X has a higher priority than INSN2; and
9620 3) X is an arithmetic instruction (and thus has no unit restrictions).
9622 If INSN1 is the last instruction blocking X, it would better to
9623 choose (INSN1, X) over (INSN2, INSN1). */
9624 for (dep = INSN_DEPEND (insn1); dep != 0; dep = XEXP (dep, 1))
9625 if (REG_NOTE_KIND (dep) == REG_DEP_ANTI
9626 && INSN_PRIORITY (XEXP (dep, 0)) > INSN_PRIORITY (insn2)
9627 && recog_memoized (XEXP (dep, 0)) >= 0
9628 && get_attr_vr4130_class (XEXP (dep, 0)) == VR4130_CLASS_ALU)
9629 return false;
9631 if (vr4130_last_insn != 0
9632 && recog_memoized (insn1) >= 0
9633 && recog_memoized (insn2) >= 0)
9635 /* See whether INSN1 and INSN2 use different execution units,
9636 or if they are both ALU-type instructions. If so, they can
9637 probably execute in parallel. */
9638 enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
9639 enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
9640 if (class1 != class2 || class1 == VR4130_CLASS_ALU)
9642 /* If only one of the instructions has a dependence on
9643 vr4130_last_insn, prefer to schedule the other one first. */
9644 bool dep1 = vr4130_true_reg_dependence_p (insn1);
9645 bool dep2 = vr4130_true_reg_dependence_p (insn2);
9646 if (dep1 != dep2)
9647 return dep1;
9649 /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
9650 is not an ALU-type instruction and if INSN1 uses the same
9651 execution unit. (Note that if this condition holds, we already
9652 know that INSN2 uses a different execution unit.) */
9653 if (class1 != VR4130_CLASS_ALU
9654 && recog_memoized (vr4130_last_insn) >= 0
9655 && class1 == get_attr_vr4130_class (vr4130_last_insn))
9656 return true;
9659 return false;
9662 /* A TUNE_MIPS4130 helper function. (READY, NREADY) describes a ready
9663 queue with at least two instructions. Swap the first two if
9664 vr4130_swap_insns_p says that it could be worthwhile. */
9666 static void
9667 vr4130_reorder (rtx *ready, int nready)
9669 if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
9670 mips_promote_ready (ready, nready - 2, nready - 1);
9673 /* Remove the instruction at index LOWER from ready queue READY and
9674 reinsert it in front of the instruction at index HIGHER. LOWER must
9675 be <= HIGHER. */
9677 static void
9678 mips_promote_ready (rtx *ready, int lower, int higher)
9680 rtx new_head;
9681 int i;
9683 new_head = ready[lower];
9684 for (i = lower; i < higher; i++)
9685 ready[i] = ready[i + 1];
9686 ready[i] = new_head;
9689 /* Implement TARGET_SCHED_REORDER. */
9691 static int
9692 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9693 rtx *ready, int *nreadyp, int cycle)
9695 if (!reload_completed && TUNE_MACC_CHAINS)
9697 if (cycle == 0)
9698 mips_macc_chains_last_hilo = 0;
9699 if (*nreadyp > 0)
9700 mips_macc_chains_reorder (ready, *nreadyp);
9702 if (reload_completed && TUNE_MIPS4130 && !TARGET_VR4130_ALIGN)
9704 if (cycle == 0)
9705 vr4130_last_insn = 0;
9706 if (*nreadyp > 1)
9707 vr4130_reorder (ready, *nreadyp);
9709 return mips_issue_rate ();
9712 /* Implement TARGET_SCHED_VARIABLE_ISSUE. */
9714 static int
9715 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9716 rtx insn, int more)
9718 switch (GET_CODE (PATTERN (insn)))
9720 case USE:
9721 case CLOBBER:
9722 /* Don't count USEs and CLOBBERs against the issue rate. */
9723 break;
9725 default:
9726 more--;
9727 if (!reload_completed && TUNE_MACC_CHAINS)
9728 mips_macc_chains_record (insn);
9729 vr4130_last_insn = insn;
9730 break;
9732 return more;
9735 /* Implement TARGET_SCHED_ADJUST_COST. We assume that anti and output
9736 dependencies have no cost. */
9738 static int
9739 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
9740 rtx dep ATTRIBUTE_UNUSED, int cost)
9742 if (REG_NOTE_KIND (link) != 0)
9743 return 0;
9744 return cost;
9747 /* Return the number of instructions that can be issued per cycle. */
9749 static int
9750 mips_issue_rate (void)
9752 switch (mips_tune)
9754 case PROCESSOR_R4130:
9755 case PROCESSOR_R5400:
9756 case PROCESSOR_R5500:
9757 case PROCESSOR_R7000:
9758 case PROCESSOR_R9000:
9759 return 2;
9761 case PROCESSOR_SB1:
9762 /* This is actually 4, but we get better performance if we claim 3.
9763 This is partly because of unwanted speculative code motion with the
9764 larger number, and partly because in most common cases we can't
9765 reach the theoretical max of 4. */
9766 return 3;
9768 default:
9769 return 1;
9772 abort ();
9776 /* Implements TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD. This should
9777 be as wide as the scheduling freedom in the DFA. */
9779 static int
9780 mips_multipass_dfa_lookahead (void)
9782 /* Can schedule up to 4 of the 6 function units in any one cycle. */
9783 if (mips_tune == PROCESSOR_SB1)
9784 return 4;
9786 return 0;
9790 const char *
9791 mips_emit_prefetch (rtx *operands)
9793 int write = INTVAL (operands[1]);
9794 int locality = INTVAL (operands[2]);
9795 int indexed = GET_CODE (operands[3]) == REG;
9796 int code;
9797 char buffer[30];
9799 if (locality <= 0)
9800 code = (write ? 5 : 4); /* store_streamed / load_streamed. */
9801 else if (locality <= 2)
9802 code = (write ? 1 : 0); /* store / load. */
9803 else
9804 code = (write ? 7 : 6); /* store_retained / load_retained. */
9806 sprintf (buffer, "%s\t%d,%%3(%%0)", indexed ? "prefx" : "pref", code);
9807 output_asm_insn (buffer, operands);
9808 return "";
9813 #if TARGET_IRIX
9814 /* Output assembly to switch to section NAME with attribute FLAGS. */
9816 static void
9817 irix_asm_named_section_1 (const char *name, unsigned int flags,
9818 unsigned int align)
9820 unsigned int sh_type, sh_flags, sh_entsize;
9822 sh_flags = 0;
9823 if (!(flags & SECTION_DEBUG))
9824 sh_flags |= 2; /* SHF_ALLOC */
9825 if (flags & SECTION_WRITE)
9826 sh_flags |= 1; /* SHF_WRITE */
9827 if (flags & SECTION_CODE)
9828 sh_flags |= 4; /* SHF_EXECINSTR */
9829 if (flags & SECTION_SMALL)
9830 sh_flags |= 0x10000000; /* SHF_MIPS_GPREL */
9831 if (strcmp (name, ".debug_frame") == 0)
9832 sh_flags |= 0x08000000; /* SHF_MIPS_NOSTRIP */
9833 if (flags & SECTION_DEBUG)
9834 sh_type = 0x7000001e; /* SHT_MIPS_DWARF */
9835 else if (flags & SECTION_BSS)
9836 sh_type = 8; /* SHT_NOBITS */
9837 else
9838 sh_type = 1; /* SHT_PROGBITS */
9840 if (flags & SECTION_CODE)
9841 sh_entsize = 4;
9842 else
9843 sh_entsize = 0;
9845 fprintf (asm_out_file, "\t.section %s,%#x,%#x,%u,%u\n",
9846 name, sh_type, sh_flags, sh_entsize, align);
9849 static void
9850 irix_asm_named_section (const char *name, unsigned int flags)
9852 if (TARGET_SGI_O32_AS)
9853 default_no_named_section (name, flags);
9854 else if (mips_abi == ABI_32 && TARGET_GAS)
9855 default_elf_asm_named_section (name, flags);
9856 else
9857 irix_asm_named_section_1 (name, flags, 0);
9860 /* In addition to emitting a .align directive, record the maximum
9861 alignment requested for the current section. */
9863 struct irix_section_align_entry GTY (())
9865 const char *name;
9866 unsigned int log;
9867 unsigned int flags;
9870 static htab_t irix_section_align_htab;
9871 static FILE *irix_orig_asm_out_file;
9873 static int
9874 irix_section_align_entry_eq (const void *p1, const void *p2)
9876 const struct irix_section_align_entry *old = p1;
9877 const char *new = p2;
9879 return strcmp (old->name, new) == 0;
9882 static hashval_t
9883 irix_section_align_entry_hash (const void *p)
9885 const struct irix_section_align_entry *old = p;
9886 return htab_hash_string (old->name);
9889 void
9890 irix_asm_output_align (FILE *file, unsigned int log)
9892 const char *section = current_section_name ();
9893 struct irix_section_align_entry **slot, *entry;
9895 if (mips_abi != ABI_32)
9897 if (! section)
9898 abort ();
9900 slot = (struct irix_section_align_entry **)
9901 htab_find_slot_with_hash (irix_section_align_htab, section,
9902 htab_hash_string (section), INSERT);
9903 entry = *slot;
9904 if (! entry)
9906 entry = (struct irix_section_align_entry *)
9907 xmalloc (sizeof (struct irix_section_align_entry));
9908 *slot = entry;
9909 entry->name = section;
9910 entry->log = log;
9911 entry->flags = current_section_flags ();
9913 else if (entry->log < log)
9914 entry->log = log;
9917 fprintf (file, "\t.align\t%u\n", log);
9920 /* The IRIX assembler does not record alignment from .align directives,
9921 but takes it from the first .section directive seen. Play file
9922 switching games so that we can emit a .section directive at the
9923 beginning of the file with the proper alignment attached. */
9925 static void
9926 irix_file_start (void)
9928 mips_file_start ();
9930 if (mips_abi == ABI_32)
9931 return;
9933 irix_orig_asm_out_file = asm_out_file;
9934 asm_out_file = tmpfile ();
9936 irix_section_align_htab = htab_create (31, irix_section_align_entry_hash,
9937 irix_section_align_entry_eq, NULL);
9940 static int
9941 irix_section_align_1 (void **slot, void *data ATTRIBUTE_UNUSED)
9943 const struct irix_section_align_entry *entry
9944 = *(const struct irix_section_align_entry **) slot;
9946 irix_asm_named_section_1 (entry->name, entry->flags, 1 << entry->log);
9947 return 1;
9950 static void
9951 copy_file_data (FILE *to, FILE *from)
9953 char buffer[8192];
9954 size_t len;
9955 rewind (from);
9956 if (ferror (from))
9957 fatal_error ("can't rewind temp file: %m");
9959 while ((len = fread (buffer, 1, sizeof (buffer), from)) > 0)
9960 if (fwrite (buffer, 1, len, to) != len)
9961 fatal_error ("can't write to output file: %m");
9963 if (ferror (from))
9964 fatal_error ("can't read from temp file: %m");
9966 if (fclose (from))
9967 fatal_error ("can't close temp file: %m");
9970 static void
9971 irix_file_end (void)
9973 if (mips_abi != ABI_32)
9975 /* Emit section directives with the proper alignment at the top of the
9976 real output file. */
9977 FILE *temp = asm_out_file;
9978 asm_out_file = irix_orig_asm_out_file;
9979 htab_traverse (irix_section_align_htab, irix_section_align_1, NULL);
9981 /* Copy the data emitted to the temp file to the real output file. */
9982 copy_file_data (asm_out_file, temp);
9985 mips_file_end ();
9989 /* Implement TARGET_SECTION_TYPE_FLAGS. Make sure that .sdata and
9990 .sbss sections get the SECTION_SMALL flag: this isn't set by the
9991 default code. */
9993 static unsigned int
9994 irix_section_type_flags (tree decl, const char *section, int relocs_p)
9996 unsigned int flags;
9998 flags = default_section_type_flags (decl, section, relocs_p);
10000 if (strcmp (section, ".sdata") == 0
10001 || strcmp (section, ".sbss") == 0
10002 || strncmp (section, ".gnu.linkonce.s.", 16) == 0
10003 || strncmp (section, ".gnu.linkonce.sb.", 17) == 0)
10004 flags |= SECTION_SMALL;
10006 return flags;
10009 #endif /* TARGET_IRIX */
10011 #include "gt-mips.h"