mips.h (GR_REG_CLASS_P, [...]): Delete.
[official-gcc.git] / gcc / config / mips / mips.c
bloba7adf170cbc0f4c6bf3e15335e012922c5dd4b24
1 /* Subroutines used for MIPS code generation.
2 Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
5 Contributed by A. Lichnewsky, lich@inria.inria.fr.
6 Changes by Michael Meissner, meissner@osf.org.
7 64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
8 Brendan Eich, brendan@microunity.com.
10 This file is part of GCC.
12 GCC is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2, or (at your option)
15 any later version.
17 GCC is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING. If not, write to
24 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
25 Boston, MA 02110-1301, USA. */
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include <signal.h>
32 #include "rtl.h"
33 #include "regs.h"
34 #include "hard-reg-set.h"
35 #include "real.h"
36 #include "insn-config.h"
37 #include "conditions.h"
38 #include "insn-attr.h"
39 #include "recog.h"
40 #include "toplev.h"
41 #include "output.h"
42 #include "tree.h"
43 #include "function.h"
44 #include "expr.h"
45 #include "optabs.h"
46 #include "flags.h"
47 #include "reload.h"
48 #include "tm_p.h"
49 #include "ggc.h"
50 #include "gstab.h"
51 #include "hashtab.h"
52 #include "debug.h"
53 #include "target.h"
54 #include "target-def.h"
55 #include "integrate.h"
56 #include "langhooks.h"
57 #include "cfglayout.h"
58 #include "sched-int.h"
59 #include "tree-gimple.h"
60 #include "bitmap.h"
62 /* True if X is an unspec wrapper around a SYMBOL_REF or LABEL_REF. */
63 #define UNSPEC_ADDRESS_P(X) \
64 (GET_CODE (X) == UNSPEC \
65 && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
66 && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
68 /* Extract the symbol or label from UNSPEC wrapper X. */
69 #define UNSPEC_ADDRESS(X) \
70 XVECEXP (X, 0, 0)
72 /* Extract the symbol type from UNSPEC wrapper X. */
73 #define UNSPEC_ADDRESS_TYPE(X) \
74 ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
76 /* The maximum distance between the top of the stack frame and the
77 value $sp has when we save and restore registers.
79 The value for normal-mode code must be a SMALL_OPERAND and must
80 preserve the maximum stack alignment. We therefore use a value
81 of 0x7ff0 in this case.
83 MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
84 up to 0x7f8 bytes and can usually save or restore all the registers
85 that we need to save or restore. (Note that we can only use these
86 instructions for o32, for which the stack alignment is 8 bytes.)
88 We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
89 RESTORE are not available. We can then use unextended instructions
90 to save and restore registers, and to allocate and deallocate the top
91 part of the frame. */
92 #define MIPS_MAX_FIRST_STACK_STEP \
93 (!TARGET_MIPS16 ? 0x7ff0 \
94 : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8 \
95 : TARGET_64BIT ? 0x100 : 0x400)
97 /* True if INSN is a mips.md pattern or asm statement. */
98 #define USEFUL_INSN_P(INSN) \
99 (INSN_P (INSN) \
100 && GET_CODE (PATTERN (INSN)) != USE \
101 && GET_CODE (PATTERN (INSN)) != CLOBBER \
102 && GET_CODE (PATTERN (INSN)) != ADDR_VEC \
103 && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
105 /* If INSN is a delayed branch sequence, return the first instruction
106 in the sequence, otherwise return INSN itself. */
107 #define SEQ_BEGIN(INSN) \
108 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
109 ? XVECEXP (PATTERN (INSN), 0, 0) \
110 : (INSN))
112 /* Likewise for the last instruction in a delayed branch sequence. */
113 #define SEQ_END(INSN) \
114 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
115 ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1) \
116 : (INSN))
118 /* Execute the following loop body with SUBINSN set to each instruction
119 between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive. */
120 #define FOR_EACH_SUBINSN(SUBINSN, INSN) \
121 for ((SUBINSN) = SEQ_BEGIN (INSN); \
122 (SUBINSN) != NEXT_INSN (SEQ_END (INSN)); \
123 (SUBINSN) = NEXT_INSN (SUBINSN))
125 /* True if bit BIT is set in VALUE. */
126 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
128 /* Classifies an address.
130 ADDRESS_REG
131 A natural register + offset address. The register satisfies
132 mips_valid_base_register_p and the offset is a const_arith_operand.
134 ADDRESS_LO_SUM
135 A LO_SUM rtx. The first operand is a valid base register and
136 the second operand is a symbolic address.
138 ADDRESS_CONST_INT
139 A signed 16-bit constant address.
141 ADDRESS_SYMBOLIC:
142 A constant symbolic address (equivalent to CONSTANT_SYMBOLIC). */
143 enum mips_address_type {
144 ADDRESS_REG,
145 ADDRESS_LO_SUM,
146 ADDRESS_CONST_INT,
147 ADDRESS_SYMBOLIC
150 /* Classifies the prototype of a builtin function. */
151 enum mips_function_type
153 MIPS_V2SF_FTYPE_V2SF,
154 MIPS_V2SF_FTYPE_V2SF_V2SF,
155 MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
156 MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,
157 MIPS_V2SF_FTYPE_SF_SF,
158 MIPS_INT_FTYPE_V2SF_V2SF,
159 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,
160 MIPS_INT_FTYPE_SF_SF,
161 MIPS_INT_FTYPE_DF_DF,
162 MIPS_SF_FTYPE_V2SF,
163 MIPS_SF_FTYPE_SF,
164 MIPS_SF_FTYPE_SF_SF,
165 MIPS_DF_FTYPE_DF,
166 MIPS_DF_FTYPE_DF_DF,
168 /* For MIPS DSP ASE */
169 MIPS_DI_FTYPE_DI_SI,
170 MIPS_DI_FTYPE_DI_SI_SI,
171 MIPS_DI_FTYPE_DI_V2HI_V2HI,
172 MIPS_DI_FTYPE_DI_V4QI_V4QI,
173 MIPS_SI_FTYPE_DI_SI,
174 MIPS_SI_FTYPE_PTR_SI,
175 MIPS_SI_FTYPE_SI,
176 MIPS_SI_FTYPE_SI_SI,
177 MIPS_SI_FTYPE_V2HI,
178 MIPS_SI_FTYPE_V2HI_V2HI,
179 MIPS_SI_FTYPE_V4QI,
180 MIPS_SI_FTYPE_V4QI_V4QI,
181 MIPS_SI_FTYPE_VOID,
182 MIPS_V2HI_FTYPE_SI,
183 MIPS_V2HI_FTYPE_SI_SI,
184 MIPS_V2HI_FTYPE_V2HI,
185 MIPS_V2HI_FTYPE_V2HI_SI,
186 MIPS_V2HI_FTYPE_V2HI_V2HI,
187 MIPS_V2HI_FTYPE_V4QI,
188 MIPS_V2HI_FTYPE_V4QI_V2HI,
189 MIPS_V4QI_FTYPE_SI,
190 MIPS_V4QI_FTYPE_V2HI_V2HI,
191 MIPS_V4QI_FTYPE_V4QI_SI,
192 MIPS_V4QI_FTYPE_V4QI_V4QI,
193 MIPS_VOID_FTYPE_SI_SI,
194 MIPS_VOID_FTYPE_V2HI_V2HI,
195 MIPS_VOID_FTYPE_V4QI_V4QI,
197 /* For MIPS DSP REV 2 ASE. */
198 MIPS_V4QI_FTYPE_V4QI,
199 MIPS_SI_FTYPE_SI_SI_SI,
200 MIPS_DI_FTYPE_DI_USI_USI,
201 MIPS_DI_FTYPE_SI_SI,
202 MIPS_DI_FTYPE_USI_USI,
203 MIPS_V2HI_FTYPE_SI_SI_SI,
205 /* The last type. */
206 MIPS_MAX_FTYPE_MAX
209 /* Specifies how a builtin function should be converted into rtl. */
210 enum mips_builtin_type
212 /* The builtin corresponds directly to an .md pattern. The return
213 value is mapped to operand 0 and the arguments are mapped to
214 operands 1 and above. */
215 MIPS_BUILTIN_DIRECT,
217 /* The builtin corresponds directly to an .md pattern. There is no return
218 value and the arguments are mapped to operands 0 and above. */
219 MIPS_BUILTIN_DIRECT_NO_TARGET,
221 /* The builtin corresponds to a comparison instruction followed by
222 a mips_cond_move_tf_ps pattern. The first two arguments are the
223 values to compare and the second two arguments are the vector
224 operands for the movt.ps or movf.ps instruction (in assembly order). */
225 MIPS_BUILTIN_MOVF,
226 MIPS_BUILTIN_MOVT,
228 /* The builtin corresponds to a V2SF comparison instruction. Operand 0
229 of this instruction is the result of the comparison, which has mode
230 CCV2 or CCV4. The function arguments are mapped to operands 1 and
231 above. The function's return value is an SImode boolean that is
232 true under the following conditions:
234 MIPS_BUILTIN_CMP_ANY: one of the registers is true
235 MIPS_BUILTIN_CMP_ALL: all of the registers are true
236 MIPS_BUILTIN_CMP_LOWER: the first register is true
237 MIPS_BUILTIN_CMP_UPPER: the second register is true. */
238 MIPS_BUILTIN_CMP_ANY,
239 MIPS_BUILTIN_CMP_ALL,
240 MIPS_BUILTIN_CMP_UPPER,
241 MIPS_BUILTIN_CMP_LOWER,
243 /* As above, but the instruction only sets a single $fcc register. */
244 MIPS_BUILTIN_CMP_SINGLE,
246 /* For generating bposge32 branch instructions in MIPS32 DSP ASE. */
247 MIPS_BUILTIN_BPOSGE32
250 /* Invokes MACRO (COND) for each c.cond.fmt condition. */
251 #define MIPS_FP_CONDITIONS(MACRO) \
252 MACRO (f), \
253 MACRO (un), \
254 MACRO (eq), \
255 MACRO (ueq), \
256 MACRO (olt), \
257 MACRO (ult), \
258 MACRO (ole), \
259 MACRO (ule), \
260 MACRO (sf), \
261 MACRO (ngle), \
262 MACRO (seq), \
263 MACRO (ngl), \
264 MACRO (lt), \
265 MACRO (nge), \
266 MACRO (le), \
267 MACRO (ngt)
269 /* Enumerates the codes above as MIPS_FP_COND_<X>. */
270 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
271 enum mips_fp_condition {
272 MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
275 /* Index X provides the string representation of MIPS_FP_COND_<X>. */
276 #define STRINGIFY(X) #X
277 static const char *const mips_fp_conditions[] = {
278 MIPS_FP_CONDITIONS (STRINGIFY)
281 /* A function to save or store a register. The first argument is the
282 register and the second is the stack slot. */
283 typedef void (*mips_save_restore_fn) (rtx, rtx);
285 struct mips16_constant;
286 struct mips_arg_info;
287 struct mips_address_info;
288 struct mips_integer_op;
289 struct mips_sim;
291 static enum mips_symbol_type mips_classify_symbol (rtx);
292 static bool mips_valid_base_register_p (rtx, enum machine_mode, int);
293 static bool mips_symbolic_address_p (enum mips_symbol_type, enum machine_mode);
294 static bool mips_classify_address (struct mips_address_info *, rtx,
295 enum machine_mode, int);
296 static bool mips_cannot_force_const_mem (rtx);
297 static bool mips_use_blocks_for_constant_p (enum machine_mode, rtx);
298 static int mips_symbol_insns (enum mips_symbol_type);
299 static bool mips16_unextended_reference_p (enum machine_mode mode, rtx, rtx);
300 static rtx mips_force_temporary (rtx, rtx);
301 static rtx mips_unspec_offset_high (rtx, rtx, rtx, enum mips_symbol_type);
302 static rtx mips_add_offset (rtx, rtx, HOST_WIDE_INT);
303 static unsigned int mips_build_shift (struct mips_integer_op *, HOST_WIDE_INT);
304 static unsigned int mips_build_lower (struct mips_integer_op *,
305 unsigned HOST_WIDE_INT);
306 static unsigned int mips_build_integer (struct mips_integer_op *,
307 unsigned HOST_WIDE_INT);
308 static void mips_legitimize_const_move (enum machine_mode, rtx, rtx);
309 static int m16_check_op (rtx, int, int, int);
310 static bool mips_rtx_costs (rtx, int, int, int *);
311 static int mips_address_cost (rtx);
312 static void mips_emit_compare (enum rtx_code *, rtx *, rtx *, bool);
313 static void mips_load_call_address (rtx, rtx, int);
314 static bool mips_function_ok_for_sibcall (tree, tree);
315 static void mips_block_move_straight (rtx, rtx, HOST_WIDE_INT);
316 static void mips_adjust_block_mem (rtx, HOST_WIDE_INT, rtx *, rtx *);
317 static void mips_block_move_loop (rtx, rtx, HOST_WIDE_INT);
318 static void mips_arg_info (const CUMULATIVE_ARGS *, enum machine_mode,
319 tree, int, struct mips_arg_info *);
320 static bool mips_get_unaligned_mem (rtx *, unsigned int, int, rtx *, rtx *);
321 static void mips_set_architecture (const struct mips_cpu_info *);
322 static void mips_set_tune (const struct mips_cpu_info *);
323 static bool mips_handle_option (size_t, const char *, int);
324 static struct machine_function *mips_init_machine_status (void);
325 static void print_operand_reloc (FILE *, rtx, const char **);
326 static void mips_file_start (void);
327 static bool mips_rewrite_small_data_p (rtx);
328 static int mips_small_data_pattern_1 (rtx *, void *);
329 static int mips_rewrite_small_data_1 (rtx *, void *);
330 static bool mips_function_has_gp_insn (void);
331 static unsigned int mips_global_pointer (void);
332 static bool mips_save_reg_p (unsigned int);
333 static void mips_save_restore_reg (enum machine_mode, int, HOST_WIDE_INT,
334 mips_save_restore_fn);
335 static void mips_for_each_saved_reg (HOST_WIDE_INT, mips_save_restore_fn);
336 static void mips_output_cplocal (void);
337 static void mips_emit_loadgp (void);
338 static void mips_output_function_prologue (FILE *, HOST_WIDE_INT);
339 static void mips_set_frame_expr (rtx);
340 static rtx mips_frame_set (rtx, rtx);
341 static void mips_save_reg (rtx, rtx);
342 static void mips_output_function_epilogue (FILE *, HOST_WIDE_INT);
343 static void mips_restore_reg (rtx, rtx);
344 static void mips_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
345 HOST_WIDE_INT, tree);
346 static int symbolic_expression_p (rtx);
347 static section *mips_select_rtx_section (enum machine_mode, rtx,
348 unsigned HOST_WIDE_INT);
349 static section *mips_function_rodata_section (tree);
350 static bool mips_in_small_data_p (tree);
351 static bool mips_use_anchors_for_symbol_p (rtx);
352 static int mips_fpr_return_fields (tree, tree *);
353 static bool mips_return_in_msb (tree);
354 static rtx mips_return_fpr_pair (enum machine_mode mode,
355 enum machine_mode mode1, HOST_WIDE_INT,
356 enum machine_mode mode2, HOST_WIDE_INT);
357 static rtx mips16_gp_pseudo_reg (void);
358 static void mips16_fp_args (FILE *, int, int);
359 static void build_mips16_function_stub (FILE *);
360 static rtx dump_constants_1 (enum machine_mode, rtx, rtx);
361 static void dump_constants (struct mips16_constant *, rtx);
362 static int mips16_insn_length (rtx);
363 static int mips16_rewrite_pool_refs (rtx *, void *);
364 static void mips16_lay_out_constants (void);
365 static void mips_sim_reset (struct mips_sim *);
366 static void mips_sim_init (struct mips_sim *, state_t);
367 static void mips_sim_next_cycle (struct mips_sim *);
368 static void mips_sim_wait_reg (struct mips_sim *, rtx, rtx);
369 static int mips_sim_wait_regs_2 (rtx *, void *);
370 static void mips_sim_wait_regs_1 (rtx *, void *);
371 static void mips_sim_wait_regs (struct mips_sim *, rtx);
372 static void mips_sim_wait_units (struct mips_sim *, rtx);
373 static void mips_sim_wait_insn (struct mips_sim *, rtx);
374 static void mips_sim_record_set (rtx, rtx, void *);
375 static void mips_sim_issue_insn (struct mips_sim *, rtx);
376 static void mips_sim_issue_nop (struct mips_sim *);
377 static void mips_sim_finish_insn (struct mips_sim *, rtx);
378 static void vr4130_avoid_branch_rt_conflict (rtx);
379 static void vr4130_align_insns (void);
380 static void mips_avoid_hazard (rtx, rtx, int *, rtx *, rtx);
381 static void mips_avoid_hazards (void);
382 static void mips_reorg (void);
383 static bool mips_strict_matching_cpu_name_p (const char *, const char *);
384 static bool mips_matching_cpu_name_p (const char *, const char *);
385 static const struct mips_cpu_info *mips_parse_cpu (const char *);
386 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
387 static bool mips_return_in_memory (tree, tree);
388 static bool mips_strict_argument_naming (CUMULATIVE_ARGS *);
389 static void mips_macc_chains_record (rtx);
390 static void mips_macc_chains_reorder (rtx *, int);
391 static void vr4130_true_reg_dependence_p_1 (rtx, rtx, void *);
392 static bool vr4130_true_reg_dependence_p (rtx);
393 static bool vr4130_swap_insns_p (rtx, rtx);
394 static void vr4130_reorder (rtx *, int);
395 static void mips_promote_ready (rtx *, int, int);
396 static int mips_sched_reorder (FILE *, int, rtx *, int *, int);
397 static int mips_variable_issue (FILE *, int, rtx, int);
398 static int mips_adjust_cost (rtx, rtx, rtx, int);
399 static int mips_issue_rate (void);
400 static int mips_multipass_dfa_lookahead (void);
401 static void mips_init_libfuncs (void);
402 static void mips_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
403 tree, int *, int);
404 static tree mips_build_builtin_va_list (void);
405 static tree mips_gimplify_va_arg_expr (tree, tree, tree *, tree *);
406 static bool mips_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode mode,
407 tree, bool);
408 static bool mips_callee_copies (CUMULATIVE_ARGS *, enum machine_mode mode,
409 tree, bool);
410 static int mips_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode mode,
411 tree, bool);
412 static bool mips_valid_pointer_mode (enum machine_mode);
413 static bool mips_vector_mode_supported_p (enum machine_mode);
414 static rtx mips_prepare_builtin_arg (enum insn_code, unsigned int, tree, unsigned int);
415 static rtx mips_prepare_builtin_target (enum insn_code, unsigned int, rtx);
416 static rtx mips_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
417 static void mips_init_builtins (void);
418 static rtx mips_expand_builtin_direct (enum insn_code, rtx, tree, bool);
419 static rtx mips_expand_builtin_movtf (enum mips_builtin_type,
420 enum insn_code, enum mips_fp_condition,
421 rtx, tree);
422 static rtx mips_expand_builtin_compare (enum mips_builtin_type,
423 enum insn_code, enum mips_fp_condition,
424 rtx, tree);
425 static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx);
426 static void mips_encode_section_info (tree, rtx, int);
427 static void mips_extra_live_on_entry (bitmap);
428 static int mips_comp_type_attributes (tree, tree);
429 static int mips_mode_rep_extended (enum machine_mode, enum machine_mode);
430 static bool mips_offset_within_alignment_p (rtx, HOST_WIDE_INT);
431 static void mips_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
433 /* Structure to be filled in by compute_frame_size with register
434 save masks, and offsets for the current function. */
436 struct mips_frame_info GTY(())
438 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
439 HOST_WIDE_INT var_size; /* # bytes that variables take up */
440 HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
441 HOST_WIDE_INT cprestore_size; /* # bytes that the .cprestore slot takes up */
442 HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
443 HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
444 unsigned int mask; /* mask of saved gp registers */
445 unsigned int fmask; /* mask of saved fp registers */
446 HOST_WIDE_INT gp_save_offset; /* offset from vfp to store gp registers */
447 HOST_WIDE_INT fp_save_offset; /* offset from vfp to store fp registers */
448 HOST_WIDE_INT gp_sp_offset; /* offset from new sp to store gp registers */
449 HOST_WIDE_INT fp_sp_offset; /* offset from new sp to store fp registers */
450 bool initialized; /* true if frame size already calculated */
451 int num_gp; /* number of gp registers saved */
452 int num_fp; /* number of fp registers saved */
455 struct machine_function GTY(()) {
456 /* Pseudo-reg holding the value of $28 in a mips16 function which
457 refers to GP relative global variables. */
458 rtx mips16_gp_pseudo_rtx;
460 /* The number of extra stack bytes taken up by register varargs.
461 This area is allocated by the callee at the very top of the frame. */
462 int varargs_size;
464 /* Current frame information, calculated by compute_frame_size. */
465 struct mips_frame_info frame;
467 /* The register to use as the global pointer within this function. */
468 unsigned int global_pointer;
470 /* True if mips_adjust_insn_length should ignore an instruction's
471 hazard attribute. */
472 bool ignore_hazard_length_p;
474 /* True if the whole function is suitable for .set noreorder and
475 .set nomacro. */
476 bool all_noreorder_p;
478 /* True if the function is known to have an instruction that needs $gp. */
479 bool has_gp_insn_p;
482 /* Information about a single argument. */
483 struct mips_arg_info
485 /* True if the argument is passed in a floating-point register, or
486 would have been if we hadn't run out of registers. */
487 bool fpr_p;
489 /* The number of words passed in registers, rounded up. */
490 unsigned int reg_words;
492 /* For EABI, the offset of the first register from GP_ARG_FIRST or
493 FP_ARG_FIRST. For other ABIs, the offset of the first register from
494 the start of the ABI's argument structure (see the CUMULATIVE_ARGS
495 comment for details).
497 The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
498 on the stack. */
499 unsigned int reg_offset;
501 /* The number of words that must be passed on the stack, rounded up. */
502 unsigned int stack_words;
504 /* The offset from the start of the stack overflow area of the argument's
505 first stack word. Only meaningful when STACK_WORDS is nonzero. */
506 unsigned int stack_offset;
510 /* Information about an address described by mips_address_type.
512 ADDRESS_CONST_INT
513 No fields are used.
515 ADDRESS_REG
516 REG is the base register and OFFSET is the constant offset.
518 ADDRESS_LO_SUM
519 REG is the register that contains the high part of the address,
520 OFFSET is the symbolic address being referenced and SYMBOL_TYPE
521 is the type of OFFSET's symbol.
523 ADDRESS_SYMBOLIC
524 SYMBOL_TYPE is the type of symbol being referenced. */
526 struct mips_address_info
528 enum mips_address_type type;
529 rtx reg;
530 rtx offset;
531 enum mips_symbol_type symbol_type;
535 /* One stage in a constant building sequence. These sequences have
536 the form:
538 A = VALUE[0]
539 A = A CODE[1] VALUE[1]
540 A = A CODE[2] VALUE[2]
543 where A is an accumulator, each CODE[i] is a binary rtl operation
544 and each VALUE[i] is a constant integer. */
545 struct mips_integer_op {
546 enum rtx_code code;
547 unsigned HOST_WIDE_INT value;
551 /* The largest number of operations needed to load an integer constant.
552 The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
553 When the lowest bit is clear, we can try, but reject a sequence with
554 an extra SLL at the end. */
555 #define MIPS_MAX_INTEGER_OPS 7
557 /* Information about a MIPS16e SAVE or RESTORE instruction. */
558 struct mips16e_save_restore_info {
559 /* The number of argument registers saved by a SAVE instruction.
560 0 for RESTORE instructions. */
561 unsigned int nargs;
563 /* Bit X is set if the instruction saves or restores GPR X. */
564 unsigned int mask;
566 /* The total number of bytes to allocate. */
567 HOST_WIDE_INT size;
570 /* Global variables for machine-dependent things. */
572 /* Threshold for data being put into the small data/bss area, instead
573 of the normal data area. */
574 int mips_section_threshold = -1;
576 /* Count the number of .file directives, so that .loc is up to date. */
577 int num_source_filenames = 0;
579 /* Count the number of sdb related labels are generated (to find block
580 start and end boundaries). */
581 int sdb_label_count = 0;
583 /* Next label # for each statement for Silicon Graphics IRIS systems. */
584 int sym_lineno = 0;
586 /* Name of the file containing the current function. */
587 const char *current_function_file = "";
589 /* Number of nested .set noreorder, noat, nomacro, and volatile requests. */
590 int set_noreorder;
591 int set_noat;
592 int set_nomacro;
593 int set_volatile;
595 /* The next branch instruction is a branch likely, not branch normal. */
596 int mips_branch_likely;
598 /* The operands passed to the last cmpMM expander. */
599 rtx cmp_operands[2];
601 /* The target cpu for code generation. */
602 enum processor_type mips_arch;
603 const struct mips_cpu_info *mips_arch_info;
605 /* The target cpu for optimization and scheduling. */
606 enum processor_type mips_tune;
607 const struct mips_cpu_info *mips_tune_info;
609 /* Which instruction set architecture to use. */
610 int mips_isa;
612 /* Which ABI to use. */
613 int mips_abi = MIPS_ABI_DEFAULT;
615 /* Cost information to use. */
616 const struct mips_rtx_cost_data *mips_cost;
618 /* Whether we are generating mips16 hard float code. In mips16 mode
619 we always set TARGET_SOFT_FLOAT; this variable is nonzero if
620 -msoft-float was not specified by the user, which means that we
621 should arrange to call mips32 hard floating point code. */
622 int mips16_hard_float;
624 /* The architecture selected by -mipsN. */
625 static const struct mips_cpu_info *mips_isa_info;
627 /* If TRUE, we split addresses into their high and low parts in the RTL. */
628 int mips_split_addresses;
630 /* Mode used for saving/restoring general purpose registers. */
631 static enum machine_mode gpr_mode;
633 /* Array giving truth value on whether or not a given hard register
634 can support a given mode. */
635 char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
637 /* List of all MIPS punctuation characters used by print_operand. */
638 char mips_print_operand_punct[256];
640 /* Map GCC register number to debugger register number. */
641 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
642 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
644 /* A copy of the original flag_delayed_branch: see override_options. */
645 static int mips_flag_delayed_branch;
647 static GTY (()) int mips_output_filename_first_time = 1;
649 /* mips_split_p[X] is true if symbols of type X can be split by
650 mips_split_symbol(). */
651 bool mips_split_p[NUM_SYMBOL_TYPES];
653 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
654 appears in a LO_SUM. It can be null if such LO_SUMs aren't valid or
655 if they are matched by a special .md file pattern. */
656 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
658 /* Likewise for HIGHs. */
659 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
661 /* Map hard register number to register class */
662 const enum reg_class mips_regno_to_class[] =
664 LEA_REGS, LEA_REGS, M16_NA_REGS, V1_REG,
665 M16_REGS, M16_REGS, M16_REGS, M16_REGS,
666 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
667 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
668 M16_NA_REGS, M16_NA_REGS, LEA_REGS, LEA_REGS,
669 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
670 T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS,
671 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
672 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
673 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
674 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
675 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
676 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
677 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
678 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
679 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
680 MD0_REG, MD1_REG, NO_REGS, ST_REGS,
681 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
682 ST_REGS, ST_REGS, ST_REGS, NO_REGS,
683 NO_REGS, ALL_REGS, ALL_REGS, NO_REGS,
684 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
685 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
686 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
687 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
688 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
689 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
690 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
691 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
692 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
693 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
694 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
695 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
696 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
697 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
698 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
699 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
700 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
701 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
702 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
703 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
704 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
705 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
706 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
707 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
708 DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS,
709 DSP_ACC_REGS, DSP_ACC_REGS, ALL_REGS, ALL_REGS,
710 ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS
713 /* Table of machine dependent attributes. */
714 const struct attribute_spec mips_attribute_table[] =
716 { "long_call", 0, 0, false, true, true, NULL },
717 { "far", 0, 0, false, true, true, NULL },
718 { "near", 0, 0, false, true, true, NULL },
719 { NULL, 0, 0, false, false, false, NULL }
722 /* A table describing all the processors gcc knows about. Names are
723 matched in the order listed. The first mention of an ISA level is
724 taken as the canonical name for that ISA.
726 To ease comparison, please keep this table in the same order as
727 gas's mips_cpu_info_table[]. Please also make sure that
728 MIPS_ISA_LEVEL_SPEC handles all -march options correctly. */
729 const struct mips_cpu_info mips_cpu_info_table[] = {
730 /* Entries for generic ISAs */
731 { "mips1", PROCESSOR_R3000, 1 },
732 { "mips2", PROCESSOR_R6000, 2 },
733 { "mips3", PROCESSOR_R4000, 3 },
734 { "mips4", PROCESSOR_R8000, 4 },
735 { "mips32", PROCESSOR_4KC, 32 },
736 { "mips32r2", PROCESSOR_M4K, 33 },
737 { "mips64", PROCESSOR_5KC, 64 },
739 /* MIPS I */
740 { "r3000", PROCESSOR_R3000, 1 },
741 { "r2000", PROCESSOR_R3000, 1 }, /* = r3000 */
742 { "r3900", PROCESSOR_R3900, 1 },
744 /* MIPS II */
745 { "r6000", PROCESSOR_R6000, 2 },
747 /* MIPS III */
748 { "r4000", PROCESSOR_R4000, 3 },
749 { "vr4100", PROCESSOR_R4100, 3 },
750 { "vr4111", PROCESSOR_R4111, 3 },
751 { "vr4120", PROCESSOR_R4120, 3 },
752 { "vr4130", PROCESSOR_R4130, 3 },
753 { "vr4300", PROCESSOR_R4300, 3 },
754 { "r4400", PROCESSOR_R4000, 3 }, /* = r4000 */
755 { "r4600", PROCESSOR_R4600, 3 },
756 { "orion", PROCESSOR_R4600, 3 }, /* = r4600 */
757 { "r4650", PROCESSOR_R4650, 3 },
759 /* MIPS IV */
760 { "r8000", PROCESSOR_R8000, 4 },
761 { "vr5000", PROCESSOR_R5000, 4 },
762 { "vr5400", PROCESSOR_R5400, 4 },
763 { "vr5500", PROCESSOR_R5500, 4 },
764 { "rm7000", PROCESSOR_R7000, 4 },
765 { "rm9000", PROCESSOR_R9000, 4 },
767 /* MIPS32 */
768 { "4kc", PROCESSOR_4KC, 32 },
769 { "4km", PROCESSOR_4KC, 32 }, /* = 4kc */
770 { "4kp", PROCESSOR_4KP, 32 },
771 { "4ksc", PROCESSOR_4KC, 32 },
773 /* MIPS32 Release 2 */
774 { "m4k", PROCESSOR_M4K, 33 },
775 { "4kec", PROCESSOR_4KC, 33 },
776 { "4kem", PROCESSOR_4KC, 33 },
777 { "4kep", PROCESSOR_4KP, 33 },
778 { "4ksd", PROCESSOR_4KC, 33 },
780 { "24kc", PROCESSOR_24KC, 33 },
781 { "24kf2_1", PROCESSOR_24KF2_1, 33 },
782 { "24kf", PROCESSOR_24KF2_1, 33 },
783 { "24kf1_1", PROCESSOR_24KF1_1, 33 },
784 { "24kfx", PROCESSOR_24KF1_1, 33 },
785 { "24kx", PROCESSOR_24KF1_1, 33 },
787 { "24kec", PROCESSOR_24KC, 33 }, /* 24K with DSP */
788 { "24kef2_1", PROCESSOR_24KF2_1, 33 },
789 { "24kef", PROCESSOR_24KF2_1, 33 },
790 { "24kef1_1", PROCESSOR_24KF1_1, 33 },
791 { "24kefx", PROCESSOR_24KF1_1, 33 },
792 { "24kex", PROCESSOR_24KF1_1, 33 },
794 { "34kc", PROCESSOR_24KC, 33 }, /* 34K with MT/DSP */
795 { "34kf2_1", PROCESSOR_24KF2_1, 33 },
796 { "34kf", PROCESSOR_24KF2_1, 33 },
797 { "34kf1_1", PROCESSOR_24KF1_1, 33 },
798 { "34kfx", PROCESSOR_24KF1_1, 33 },
799 { "34kx", PROCESSOR_24KF1_1, 33 },
801 { "74kc", PROCESSOR_74KC, 33 }, /* 74K with DSPr2 */
802 { "74kf2_1", PROCESSOR_74KF2_1, 33 },
803 { "74kf", PROCESSOR_74KF2_1, 33 },
804 { "74kf1_1", PROCESSOR_74KF1_1, 33 },
805 { "74kfx", PROCESSOR_74KF1_1, 33 },
806 { "74kx", PROCESSOR_74KF1_1, 33 },
807 { "74kf3_2", PROCESSOR_74KF3_2, 33 },
809 /* MIPS64 */
810 { "5kc", PROCESSOR_5KC, 64 },
811 { "5kf", PROCESSOR_5KF, 64 },
812 { "20kc", PROCESSOR_20KC, 64 },
813 { "sb1", PROCESSOR_SB1, 64 },
814 { "sb1a", PROCESSOR_SB1A, 64 },
815 { "sr71000", PROCESSOR_SR71000, 64 },
817 /* End marker */
818 { 0, 0, 0 }
821 /* Default costs. If these are used for a processor we should look
822 up the actual costs. */
823 #define DEFAULT_COSTS COSTS_N_INSNS (6), /* fp_add */ \
824 COSTS_N_INSNS (7), /* fp_mult_sf */ \
825 COSTS_N_INSNS (8), /* fp_mult_df */ \
826 COSTS_N_INSNS (23), /* fp_div_sf */ \
827 COSTS_N_INSNS (36), /* fp_div_df */ \
828 COSTS_N_INSNS (10), /* int_mult_si */ \
829 COSTS_N_INSNS (10), /* int_mult_di */ \
830 COSTS_N_INSNS (69), /* int_div_si */ \
831 COSTS_N_INSNS (69), /* int_div_di */ \
832 2, /* branch_cost */ \
833 4 /* memory_latency */
835 /* Need to replace these with the costs of calling the appropriate
836 libgcc routine. */
837 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */ \
838 COSTS_N_INSNS (256), /* fp_mult_sf */ \
839 COSTS_N_INSNS (256), /* fp_mult_df */ \
840 COSTS_N_INSNS (256), /* fp_div_sf */ \
841 COSTS_N_INSNS (256) /* fp_div_df */
843 static struct mips_rtx_cost_data const mips_rtx_cost_optimize_size =
845 COSTS_N_INSNS (1), /* fp_add */
846 COSTS_N_INSNS (1), /* fp_mult_sf */
847 COSTS_N_INSNS (1), /* fp_mult_df */
848 COSTS_N_INSNS (1), /* fp_div_sf */
849 COSTS_N_INSNS (1), /* fp_div_df */
850 COSTS_N_INSNS (1), /* int_mult_si */
851 COSTS_N_INSNS (1), /* int_mult_di */
852 COSTS_N_INSNS (1), /* int_div_si */
853 COSTS_N_INSNS (1), /* int_div_di */
854 2, /* branch_cost */
855 4 /* memory_latency */
858 static struct mips_rtx_cost_data const mips_rtx_cost_data[PROCESSOR_MAX] =
860 { /* R3000 */
861 COSTS_N_INSNS (2), /* fp_add */
862 COSTS_N_INSNS (4), /* fp_mult_sf */
863 COSTS_N_INSNS (5), /* fp_mult_df */
864 COSTS_N_INSNS (12), /* fp_div_sf */
865 COSTS_N_INSNS (19), /* fp_div_df */
866 COSTS_N_INSNS (12), /* int_mult_si */
867 COSTS_N_INSNS (12), /* int_mult_di */
868 COSTS_N_INSNS (35), /* int_div_si */
869 COSTS_N_INSNS (35), /* int_div_di */
870 1, /* branch_cost */
871 4 /* memory_latency */
874 { /* 4KC */
875 SOFT_FP_COSTS,
876 COSTS_N_INSNS (6), /* int_mult_si */
877 COSTS_N_INSNS (6), /* int_mult_di */
878 COSTS_N_INSNS (36), /* int_div_si */
879 COSTS_N_INSNS (36), /* int_div_di */
880 1, /* branch_cost */
881 4 /* memory_latency */
883 { /* 4KP */
884 SOFT_FP_COSTS,
885 COSTS_N_INSNS (36), /* int_mult_si */
886 COSTS_N_INSNS (36), /* int_mult_di */
887 COSTS_N_INSNS (37), /* int_div_si */
888 COSTS_N_INSNS (37), /* int_div_di */
889 1, /* branch_cost */
890 4 /* memory_latency */
892 { /* 5KC */
893 SOFT_FP_COSTS,
894 COSTS_N_INSNS (4), /* int_mult_si */
895 COSTS_N_INSNS (11), /* int_mult_di */
896 COSTS_N_INSNS (36), /* int_div_si */
897 COSTS_N_INSNS (68), /* int_div_di */
898 1, /* branch_cost */
899 4 /* memory_latency */
901 { /* 5KF */
902 COSTS_N_INSNS (4), /* fp_add */
903 COSTS_N_INSNS (4), /* fp_mult_sf */
904 COSTS_N_INSNS (5), /* fp_mult_df */
905 COSTS_N_INSNS (17), /* fp_div_sf */
906 COSTS_N_INSNS (32), /* fp_div_df */
907 COSTS_N_INSNS (4), /* int_mult_si */
908 COSTS_N_INSNS (11), /* int_mult_di */
909 COSTS_N_INSNS (36), /* int_div_si */
910 COSTS_N_INSNS (68), /* int_div_di */
911 1, /* branch_cost */
912 4 /* memory_latency */
914 { /* 20KC */
915 COSTS_N_INSNS (4), /* fp_add */
916 COSTS_N_INSNS (4), /* fp_mult_sf */
917 COSTS_N_INSNS (5), /* fp_mult_df */
918 COSTS_N_INSNS (17), /* fp_div_sf */
919 COSTS_N_INSNS (32), /* fp_div_df */
920 COSTS_N_INSNS (4), /* int_mult_si */
921 COSTS_N_INSNS (7), /* int_mult_di */
922 COSTS_N_INSNS (42), /* int_div_si */
923 COSTS_N_INSNS (72), /* int_div_di */
924 1, /* branch_cost */
925 4 /* memory_latency */
927 { /* 24KC */
928 SOFT_FP_COSTS,
929 COSTS_N_INSNS (5), /* int_mult_si */
930 COSTS_N_INSNS (5), /* int_mult_di */
931 COSTS_N_INSNS (41), /* int_div_si */
932 COSTS_N_INSNS (41), /* int_div_di */
933 1, /* branch_cost */
934 4 /* memory_latency */
936 { /* 24KF2_1 */
937 COSTS_N_INSNS (8), /* fp_add */
938 COSTS_N_INSNS (8), /* fp_mult_sf */
939 COSTS_N_INSNS (10), /* fp_mult_df */
940 COSTS_N_INSNS (34), /* fp_div_sf */
941 COSTS_N_INSNS (64), /* fp_div_df */
942 COSTS_N_INSNS (5), /* int_mult_si */
943 COSTS_N_INSNS (5), /* int_mult_di */
944 COSTS_N_INSNS (41), /* int_div_si */
945 COSTS_N_INSNS (41), /* int_div_di */
946 1, /* branch_cost */
947 4 /* memory_latency */
949 { /* 24KF1_1 */
950 COSTS_N_INSNS (4), /* fp_add */
951 COSTS_N_INSNS (4), /* fp_mult_sf */
952 COSTS_N_INSNS (5), /* fp_mult_df */
953 COSTS_N_INSNS (17), /* fp_div_sf */
954 COSTS_N_INSNS (32), /* fp_div_df */
955 COSTS_N_INSNS (5), /* int_mult_si */
956 COSTS_N_INSNS (5), /* int_mult_di */
957 COSTS_N_INSNS (41), /* int_div_si */
958 COSTS_N_INSNS (41), /* int_div_di */
959 1, /* branch_cost */
960 4 /* memory_latency */
962 { /* 74KC */
963 SOFT_FP_COSTS,
964 COSTS_N_INSNS (5), /* int_mult_si */
965 COSTS_N_INSNS (5), /* int_mult_di */
966 COSTS_N_INSNS (41), /* int_div_si */
967 COSTS_N_INSNS (41), /* int_div_di */
968 1, /* branch_cost */
969 4 /* memory_latency */
971 { /* 74KF2_1 */
972 COSTS_N_INSNS (8), /* fp_add */
973 COSTS_N_INSNS (8), /* fp_mult_sf */
974 COSTS_N_INSNS (10), /* fp_mult_df */
975 COSTS_N_INSNS (34), /* fp_div_sf */
976 COSTS_N_INSNS (64), /* fp_div_df */
977 COSTS_N_INSNS (5), /* int_mult_si */
978 COSTS_N_INSNS (5), /* int_mult_di */
979 COSTS_N_INSNS (41), /* int_div_si */
980 COSTS_N_INSNS (41), /* int_div_di */
981 1, /* branch_cost */
982 4 /* memory_latency */
984 { /* 74KF1_1 */
985 COSTS_N_INSNS (4), /* fp_add */
986 COSTS_N_INSNS (4), /* fp_mult_sf */
987 COSTS_N_INSNS (5), /* fp_mult_df */
988 COSTS_N_INSNS (17), /* fp_div_sf */
989 COSTS_N_INSNS (32), /* fp_div_df */
990 COSTS_N_INSNS (5), /* int_mult_si */
991 COSTS_N_INSNS (5), /* int_mult_di */
992 COSTS_N_INSNS (41), /* int_div_si */
993 COSTS_N_INSNS (41), /* int_div_di */
994 1, /* branch_cost */
995 4 /* memory_latency */
997 { /* 74KF3_2 */
998 COSTS_N_INSNS (6), /* fp_add */
999 COSTS_N_INSNS (6), /* fp_mult_sf */
1000 COSTS_N_INSNS (7), /* fp_mult_df */
1001 COSTS_N_INSNS (25), /* fp_div_sf */
1002 COSTS_N_INSNS (48), /* fp_div_df */
1003 COSTS_N_INSNS (5), /* int_mult_si */
1004 COSTS_N_INSNS (5), /* int_mult_di */
1005 COSTS_N_INSNS (41), /* int_div_si */
1006 COSTS_N_INSNS (41), /* int_div_di */
1007 1, /* branch_cost */
1008 4 /* memory_latency */
1010 { /* M4k */
1011 DEFAULT_COSTS
1013 { /* R3900 */
1014 COSTS_N_INSNS (2), /* fp_add */
1015 COSTS_N_INSNS (4), /* fp_mult_sf */
1016 COSTS_N_INSNS (5), /* fp_mult_df */
1017 COSTS_N_INSNS (12), /* fp_div_sf */
1018 COSTS_N_INSNS (19), /* fp_div_df */
1019 COSTS_N_INSNS (2), /* int_mult_si */
1020 COSTS_N_INSNS (2), /* int_mult_di */
1021 COSTS_N_INSNS (35), /* int_div_si */
1022 COSTS_N_INSNS (35), /* int_div_di */
1023 1, /* branch_cost */
1024 4 /* memory_latency */
1026 { /* R6000 */
1027 COSTS_N_INSNS (3), /* fp_add */
1028 COSTS_N_INSNS (5), /* fp_mult_sf */
1029 COSTS_N_INSNS (6), /* fp_mult_df */
1030 COSTS_N_INSNS (15), /* fp_div_sf */
1031 COSTS_N_INSNS (16), /* fp_div_df */
1032 COSTS_N_INSNS (17), /* int_mult_si */
1033 COSTS_N_INSNS (17), /* int_mult_di */
1034 COSTS_N_INSNS (38), /* int_div_si */
1035 COSTS_N_INSNS (38), /* int_div_di */
1036 2, /* branch_cost */
1037 6 /* memory_latency */
1039 { /* R4000 */
1040 COSTS_N_INSNS (6), /* fp_add */
1041 COSTS_N_INSNS (7), /* fp_mult_sf */
1042 COSTS_N_INSNS (8), /* fp_mult_df */
1043 COSTS_N_INSNS (23), /* fp_div_sf */
1044 COSTS_N_INSNS (36), /* fp_div_df */
1045 COSTS_N_INSNS (10), /* int_mult_si */
1046 COSTS_N_INSNS (10), /* int_mult_di */
1047 COSTS_N_INSNS (69), /* int_div_si */
1048 COSTS_N_INSNS (69), /* int_div_di */
1049 2, /* branch_cost */
1050 6 /* memory_latency */
1052 { /* R4100 */
1053 DEFAULT_COSTS
1055 { /* R4111 */
1056 DEFAULT_COSTS
1058 { /* R4120 */
1059 DEFAULT_COSTS
1061 { /* R4130 */
1062 /* The only costs that appear to be updated here are
1063 integer multiplication. */
1064 SOFT_FP_COSTS,
1065 COSTS_N_INSNS (4), /* int_mult_si */
1066 COSTS_N_INSNS (6), /* int_mult_di */
1067 COSTS_N_INSNS (69), /* int_div_si */
1068 COSTS_N_INSNS (69), /* int_div_di */
1069 1, /* branch_cost */
1070 4 /* memory_latency */
1072 { /* R4300 */
1073 DEFAULT_COSTS
1075 { /* R4600 */
1076 DEFAULT_COSTS
1078 { /* R4650 */
1079 DEFAULT_COSTS
1081 { /* R5000 */
1082 COSTS_N_INSNS (6), /* fp_add */
1083 COSTS_N_INSNS (4), /* fp_mult_sf */
1084 COSTS_N_INSNS (5), /* fp_mult_df */
1085 COSTS_N_INSNS (23), /* fp_div_sf */
1086 COSTS_N_INSNS (36), /* fp_div_df */
1087 COSTS_N_INSNS (5), /* int_mult_si */
1088 COSTS_N_INSNS (5), /* int_mult_di */
1089 COSTS_N_INSNS (36), /* int_div_si */
1090 COSTS_N_INSNS (36), /* int_div_di */
1091 1, /* branch_cost */
1092 4 /* memory_latency */
1094 { /* R5400 */
1095 COSTS_N_INSNS (6), /* fp_add */
1096 COSTS_N_INSNS (5), /* fp_mult_sf */
1097 COSTS_N_INSNS (6), /* fp_mult_df */
1098 COSTS_N_INSNS (30), /* fp_div_sf */
1099 COSTS_N_INSNS (59), /* fp_div_df */
1100 COSTS_N_INSNS (3), /* int_mult_si */
1101 COSTS_N_INSNS (4), /* int_mult_di */
1102 COSTS_N_INSNS (42), /* int_div_si */
1103 COSTS_N_INSNS (74), /* int_div_di */
1104 1, /* branch_cost */
1105 4 /* memory_latency */
1107 { /* R5500 */
1108 COSTS_N_INSNS (6), /* fp_add */
1109 COSTS_N_INSNS (5), /* fp_mult_sf */
1110 COSTS_N_INSNS (6), /* fp_mult_df */
1111 COSTS_N_INSNS (30), /* fp_div_sf */
1112 COSTS_N_INSNS (59), /* fp_div_df */
1113 COSTS_N_INSNS (5), /* int_mult_si */
1114 COSTS_N_INSNS (9), /* int_mult_di */
1115 COSTS_N_INSNS (42), /* int_div_si */
1116 COSTS_N_INSNS (74), /* int_div_di */
1117 1, /* branch_cost */
1118 4 /* memory_latency */
1120 { /* R7000 */
1121 /* The only costs that are changed here are
1122 integer multiplication. */
1123 COSTS_N_INSNS (6), /* fp_add */
1124 COSTS_N_INSNS (7), /* fp_mult_sf */
1125 COSTS_N_INSNS (8), /* fp_mult_df */
1126 COSTS_N_INSNS (23), /* fp_div_sf */
1127 COSTS_N_INSNS (36), /* fp_div_df */
1128 COSTS_N_INSNS (5), /* int_mult_si */
1129 COSTS_N_INSNS (9), /* int_mult_di */
1130 COSTS_N_INSNS (69), /* int_div_si */
1131 COSTS_N_INSNS (69), /* int_div_di */
1132 1, /* branch_cost */
1133 4 /* memory_latency */
1135 { /* R8000 */
1136 DEFAULT_COSTS
1138 { /* R9000 */
1139 /* The only costs that are changed here are
1140 integer multiplication. */
1141 COSTS_N_INSNS (6), /* fp_add */
1142 COSTS_N_INSNS (7), /* fp_mult_sf */
1143 COSTS_N_INSNS (8), /* fp_mult_df */
1144 COSTS_N_INSNS (23), /* fp_div_sf */
1145 COSTS_N_INSNS (36), /* fp_div_df */
1146 COSTS_N_INSNS (3), /* int_mult_si */
1147 COSTS_N_INSNS (8), /* int_mult_di */
1148 COSTS_N_INSNS (69), /* int_div_si */
1149 COSTS_N_INSNS (69), /* int_div_di */
1150 1, /* branch_cost */
1151 4 /* memory_latency */
1153 { /* SB1 */
1154 /* These costs are the same as the SB-1A below. */
1155 COSTS_N_INSNS (4), /* fp_add */
1156 COSTS_N_INSNS (4), /* fp_mult_sf */
1157 COSTS_N_INSNS (4), /* fp_mult_df */
1158 COSTS_N_INSNS (24), /* fp_div_sf */
1159 COSTS_N_INSNS (32), /* fp_div_df */
1160 COSTS_N_INSNS (3), /* int_mult_si */
1161 COSTS_N_INSNS (4), /* int_mult_di */
1162 COSTS_N_INSNS (36), /* int_div_si */
1163 COSTS_N_INSNS (68), /* int_div_di */
1164 1, /* branch_cost */
1165 4 /* memory_latency */
1167 { /* SB1-A */
1168 /* These costs are the same as the SB-1 above. */
1169 COSTS_N_INSNS (4), /* fp_add */
1170 COSTS_N_INSNS (4), /* fp_mult_sf */
1171 COSTS_N_INSNS (4), /* fp_mult_df */
1172 COSTS_N_INSNS (24), /* fp_div_sf */
1173 COSTS_N_INSNS (32), /* fp_div_df */
1174 COSTS_N_INSNS (3), /* int_mult_si */
1175 COSTS_N_INSNS (4), /* int_mult_di */
1176 COSTS_N_INSNS (36), /* int_div_si */
1177 COSTS_N_INSNS (68), /* int_div_di */
1178 1, /* branch_cost */
1179 4 /* memory_latency */
1181 { /* SR71000 */
1182 DEFAULT_COSTS
1186 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
1187 mips16e_s2_s8_regs[X], it must also save the registers in indexes
1188 X + 1 onwards. Likewise mips16e_a0_a3_regs. */
1189 static const unsigned char mips16e_s2_s8_regs[] = {
1190 30, 23, 22, 21, 20, 19, 18
1192 static const unsigned char mips16e_a0_a3_regs[] = {
1193 4, 5, 6, 7
1196 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
1197 ordered from the uppermost in memory to the lowest in memory. */
1198 static const unsigned char mips16e_save_restore_regs[] = {
1199 31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
1202 /* Nonzero if -march should decide the default value of MASK_SOFT_FLOAT. */
1203 #ifndef MIPS_MARCH_CONTROLS_SOFT_FLOAT
1204 #define MIPS_MARCH_CONTROLS_SOFT_FLOAT 0
1205 #endif
1207 /* Initialize the GCC target structure. */
1208 #undef TARGET_ASM_ALIGNED_HI_OP
1209 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
1210 #undef TARGET_ASM_ALIGNED_SI_OP
1211 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
1212 #undef TARGET_ASM_ALIGNED_DI_OP
1213 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
1215 #undef TARGET_ASM_FUNCTION_PROLOGUE
1216 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
1217 #undef TARGET_ASM_FUNCTION_EPILOGUE
1218 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
1219 #undef TARGET_ASM_SELECT_RTX_SECTION
1220 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
1221 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
1222 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
1224 #undef TARGET_SCHED_REORDER
1225 #define TARGET_SCHED_REORDER mips_sched_reorder
1226 #undef TARGET_SCHED_VARIABLE_ISSUE
1227 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
1228 #undef TARGET_SCHED_ADJUST_COST
1229 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
1230 #undef TARGET_SCHED_ISSUE_RATE
1231 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
1232 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1233 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
1234 mips_multipass_dfa_lookahead
1236 #undef TARGET_DEFAULT_TARGET_FLAGS
1237 #define TARGET_DEFAULT_TARGET_FLAGS \
1238 (TARGET_DEFAULT \
1239 | TARGET_CPU_DEFAULT \
1240 | TARGET_ENDIAN_DEFAULT \
1241 | TARGET_FP_EXCEPTIONS_DEFAULT \
1242 | MASK_CHECK_ZERO_DIV \
1243 | MASK_FUSED_MADD)
1244 #undef TARGET_HANDLE_OPTION
1245 #define TARGET_HANDLE_OPTION mips_handle_option
1247 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
1248 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
1250 #undef TARGET_VALID_POINTER_MODE
1251 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
1252 #undef TARGET_RTX_COSTS
1253 #define TARGET_RTX_COSTS mips_rtx_costs
1254 #undef TARGET_ADDRESS_COST
1255 #define TARGET_ADDRESS_COST mips_address_cost
1257 #undef TARGET_IN_SMALL_DATA_P
1258 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
1260 #undef TARGET_MACHINE_DEPENDENT_REORG
1261 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
1263 #undef TARGET_ASM_FILE_START
1264 #define TARGET_ASM_FILE_START mips_file_start
1265 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
1266 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
1268 #undef TARGET_INIT_LIBFUNCS
1269 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
1271 #undef TARGET_BUILD_BUILTIN_VA_LIST
1272 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
1273 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
1274 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
1276 #undef TARGET_PROMOTE_FUNCTION_ARGS
1277 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
1278 #undef TARGET_PROMOTE_FUNCTION_RETURN
1279 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
1280 #undef TARGET_PROMOTE_PROTOTYPES
1281 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
1283 #undef TARGET_RETURN_IN_MEMORY
1284 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
1285 #undef TARGET_RETURN_IN_MSB
1286 #define TARGET_RETURN_IN_MSB mips_return_in_msb
1288 #undef TARGET_ASM_OUTPUT_MI_THUNK
1289 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
1290 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1291 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
1293 #undef TARGET_SETUP_INCOMING_VARARGS
1294 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
1295 #undef TARGET_STRICT_ARGUMENT_NAMING
1296 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
1297 #undef TARGET_MUST_PASS_IN_STACK
1298 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
1299 #undef TARGET_PASS_BY_REFERENCE
1300 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
1301 #undef TARGET_CALLEE_COPIES
1302 #define TARGET_CALLEE_COPIES mips_callee_copies
1303 #undef TARGET_ARG_PARTIAL_BYTES
1304 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
1306 #undef TARGET_MODE_REP_EXTENDED
1307 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
1309 #undef TARGET_VECTOR_MODE_SUPPORTED_P
1310 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
1312 #undef TARGET_INIT_BUILTINS
1313 #define TARGET_INIT_BUILTINS mips_init_builtins
1314 #undef TARGET_EXPAND_BUILTIN
1315 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
1317 #undef TARGET_HAVE_TLS
1318 #define TARGET_HAVE_TLS HAVE_AS_TLS
1320 #undef TARGET_CANNOT_FORCE_CONST_MEM
1321 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
1323 #undef TARGET_ENCODE_SECTION_INFO
1324 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
1326 #undef TARGET_ATTRIBUTE_TABLE
1327 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
1329 #undef TARGET_EXTRA_LIVE_ON_ENTRY
1330 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
1332 #undef TARGET_MIN_ANCHOR_OFFSET
1333 #define TARGET_MIN_ANCHOR_OFFSET -32768
1334 #undef TARGET_MAX_ANCHOR_OFFSET
1335 #define TARGET_MAX_ANCHOR_OFFSET 32767
1336 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
1337 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
1338 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
1339 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
1341 #undef TARGET_COMP_TYPE_ATTRIBUTES
1342 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
1344 #ifdef HAVE_AS_DTPRELWORD
1345 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
1346 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
1347 #endif
1349 struct gcc_target targetm = TARGET_INITIALIZER;
1352 /* Predicates to test for presence of "near" and "far"/"long_call"
1353 attributes on the given TYPE. */
1355 static bool
1356 mips_near_type_p (tree type)
1358 return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1361 static bool
1362 mips_far_type_p (tree type)
1364 return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1365 || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1369 /* Return 0 if the attributes for two types are incompatible, 1 if they
1370 are compatible, and 2 if they are nearly compatible (which causes a
1371 warning to be generated). */
1373 static int
1374 mips_comp_type_attributes (tree type1, tree type2)
1376 /* Check for mismatch of non-default calling convention. */
1377 if (TREE_CODE (type1) != FUNCTION_TYPE)
1378 return 1;
1380 /* Disallow mixed near/far attributes. */
1381 if (mips_far_type_p (type1) && mips_near_type_p (type2))
1382 return 0;
1383 if (mips_near_type_p (type1) && mips_far_type_p (type2))
1384 return 0;
1386 return 1;
1389 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1390 and *OFFSET_PTR. Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise. */
1392 static void
1393 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1395 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
1397 *base_ptr = XEXP (x, 0);
1398 *offset_ptr = INTVAL (XEXP (x, 1));
1400 else
1402 *base_ptr = x;
1403 *offset_ptr = 0;
1407 /* Return true if SYMBOL_REF X is associated with a global symbol
1408 (in the STB_GLOBAL sense). */
1410 static bool
1411 mips_global_symbol_p (rtx x)
1413 tree decl;
1415 decl = SYMBOL_REF_DECL (x);
1416 if (!decl)
1417 return !SYMBOL_REF_LOCAL_P (x);
1419 /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1420 or weak symbols. Relocations in the object file will be against
1421 the target symbol, so it's that symbol's binding that matters here. */
1422 return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1425 /* Return true if SYMBOL_REF X binds locally. */
1427 static bool
1428 mips_symbol_binds_local_p (rtx x)
1430 return (SYMBOL_REF_DECL (x)
1431 ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1432 : SYMBOL_REF_LOCAL_P (x));
1435 /* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF. */
1437 static enum mips_symbol_type
1438 mips_classify_symbol (rtx x)
1440 if (TARGET_RTP_PIC)
1441 return SYMBOL_GOT_DISP;
1443 if (GET_CODE (x) == LABEL_REF)
1445 if (TARGET_MIPS16)
1446 return SYMBOL_CONSTANT_POOL;
1447 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1448 return SYMBOL_GOT_PAGE_OFST;
1449 return SYMBOL_GENERAL;
1452 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1454 if (SYMBOL_REF_TLS_MODEL (x))
1455 return SYMBOL_TLS;
1457 if (CONSTANT_POOL_ADDRESS_P (x))
1459 if (TARGET_MIPS16)
1460 return SYMBOL_CONSTANT_POOL;
1462 if (!TARGET_EMBEDDED_DATA
1463 && GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold)
1464 return SYMBOL_SMALL_DATA;
1467 /* Do not use small-data accesses for weak symbols; they may end up
1468 being zero. */
1469 if (SYMBOL_REF_SMALL_P (x)
1470 && !SYMBOL_REF_WEAK (x))
1471 return SYMBOL_SMALL_DATA;
1473 if (TARGET_ABICALLS)
1475 /* Don't use GOT accesses for locally-binding symbols; we can use
1476 %hi and %lo instead. */
1477 if (TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x))
1478 return SYMBOL_GENERAL;
1480 /* There are three cases to consider:
1482 - o32 PIC (either with or without explicit relocs)
1483 - n32/n64 PIC without explicit relocs
1484 - n32/n64 PIC with explicit relocs
1486 In the first case, both local and global accesses will use an
1487 R_MIPS_GOT16 relocation. We must correctly predict which of
1488 the two semantics (local or global) the assembler and linker
1489 will apply. The choice depends on the symbol's binding rather
1490 than its visibility.
1492 In the second case, the assembler will not use R_MIPS_GOT16
1493 relocations, but it chooses between local and global accesses
1494 in the same way as for o32 PIC.
1496 In the third case we have more freedom since both forms of
1497 access will work for any kind of symbol. However, there seems
1498 little point in doing things differently. */
1499 if (mips_global_symbol_p (x))
1500 return SYMBOL_GOT_DISP;
1502 return SYMBOL_GOT_PAGE_OFST;
1505 return SYMBOL_GENERAL;
1508 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1509 is the alignment (in bytes) of SYMBOL_REF X. */
1511 static bool
1512 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1514 /* If for some reason we can't get the alignment for the
1515 symbol, initializing this to one means we will only accept
1516 a zero offset. */
1517 HOST_WIDE_INT align = 1;
1518 tree t;
1520 /* Get the alignment of the symbol we're referring to. */
1521 t = SYMBOL_REF_DECL (x);
1522 if (t)
1523 align = DECL_ALIGN_UNIT (t);
1525 return offset >= 0 && offset < align;
1528 /* Return true if X is a symbolic constant that can be calculated in
1529 the same way as a bare symbol. If it is, store the type of the
1530 symbol in *SYMBOL_TYPE. */
1532 bool
1533 mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
1535 rtx offset;
1537 split_const (x, &x, &offset);
1538 if (UNSPEC_ADDRESS_P (x))
1540 *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1541 x = UNSPEC_ADDRESS (x);
1543 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1545 *symbol_type = mips_classify_symbol (x);
1546 if (*symbol_type == SYMBOL_TLS)
1547 return false;
1549 else
1550 return false;
1552 if (offset == const0_rtx)
1553 return true;
1555 /* Check whether a nonzero offset is valid for the underlying
1556 relocations. */
1557 switch (*symbol_type)
1559 case SYMBOL_GENERAL:
1560 case SYMBOL_64_HIGH:
1561 case SYMBOL_64_MID:
1562 case SYMBOL_64_LOW:
1563 /* If the target has 64-bit pointers and the object file only
1564 supports 32-bit symbols, the values of those symbols will be
1565 sign-extended. In this case we can't allow an arbitrary offset
1566 in case the 32-bit value X + OFFSET has a different sign from X. */
1567 if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1568 return offset_within_block_p (x, INTVAL (offset));
1570 /* In other cases the relocations can handle any offset. */
1571 return true;
1573 case SYMBOL_CONSTANT_POOL:
1574 /* Allow constant pool references to be converted to LABEL+CONSTANT.
1575 In this case, we no longer have access to the underlying constant,
1576 but the original symbol-based access was known to be valid. */
1577 if (GET_CODE (x) == LABEL_REF)
1578 return true;
1580 /* Fall through. */
1582 case SYMBOL_SMALL_DATA:
1583 /* Make sure that the offset refers to something within the
1584 same object block. This should guarantee that the final
1585 PC- or GP-relative offset is within the 16-bit limit. */
1586 return offset_within_block_p (x, INTVAL (offset));
1588 case SYMBOL_GOT_PAGE_OFST:
1589 case SYMBOL_GOTOFF_PAGE:
1590 /* If the symbol is global, the GOT entry will contain the symbol's
1591 address, and we will apply a 16-bit offset after loading it.
1592 If the symbol is local, the linker should provide enough local
1593 GOT entries for a 16-bit offset, but larger offsets may lead
1594 to GOT overflow. */
1595 return SMALL_INT (offset);
1597 case SYMBOL_TPREL:
1598 case SYMBOL_DTPREL:
1599 /* There is no carry between the HI and LO REL relocations, so the
1600 offset is only valid if we know it won't lead to such a carry. */
1601 return mips_offset_within_alignment_p (x, INTVAL (offset));
1603 case SYMBOL_GOT_DISP:
1604 case SYMBOL_GOTOFF_DISP:
1605 case SYMBOL_GOTOFF_CALL:
1606 case SYMBOL_GOTOFF_LOADGP:
1607 case SYMBOL_TLSGD:
1608 case SYMBOL_TLSLDM:
1609 case SYMBOL_GOTTPREL:
1610 case SYMBOL_TLS:
1611 case SYMBOL_HALF:
1612 return false;
1614 gcc_unreachable ();
1618 /* This function is used to implement REG_MODE_OK_FOR_BASE_P. */
1621 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode, int strict)
1623 if (!HARD_REGISTER_NUM_P (regno))
1625 if (!strict)
1626 return true;
1627 regno = reg_renumber[regno];
1630 /* These fake registers will be eliminated to either the stack or
1631 hard frame pointer, both of which are usually valid base registers.
1632 Reload deals with the cases where the eliminated form isn't valid. */
1633 if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
1634 return true;
1636 /* In mips16 mode, the stack pointer can only address word and doubleword
1637 values, nothing smaller. There are two problems here:
1639 (a) Instantiating virtual registers can introduce new uses of the
1640 stack pointer. If these virtual registers are valid addresses,
1641 the stack pointer should be too.
1643 (b) Most uses of the stack pointer are not made explicit until
1644 FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
1645 We don't know until that stage whether we'll be eliminating to the
1646 stack pointer (which needs the restriction) or the hard frame
1647 pointer (which doesn't).
1649 All in all, it seems more consistent to only enforce this restriction
1650 during and after reload. */
1651 if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
1652 return !strict || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1654 return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
1658 /* Return true if X is a valid base register for the given mode.
1659 Allow only hard registers if STRICT. */
1661 static bool
1662 mips_valid_base_register_p (rtx x, enum machine_mode mode, int strict)
1664 if (!strict && GET_CODE (x) == SUBREG)
1665 x = SUBREG_REG (x);
1667 return (REG_P (x)
1668 && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict));
1672 /* Return true if symbols of type SYMBOL_TYPE can directly address a value
1673 with mode MODE. This is used for both symbolic and LO_SUM addresses. */
1675 static bool
1676 mips_symbolic_address_p (enum mips_symbol_type symbol_type,
1677 enum machine_mode mode)
1679 switch (symbol_type)
1681 case SYMBOL_GENERAL:
1682 return !TARGET_MIPS16;
1684 case SYMBOL_SMALL_DATA:
1685 return true;
1687 case SYMBOL_CONSTANT_POOL:
1688 /* PC-relative addressing is only available for lw and ld. */
1689 return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1691 case SYMBOL_GOT_PAGE_OFST:
1692 return true;
1694 case SYMBOL_GOT_DISP:
1695 /* The address will have to be loaded from the GOT first. */
1696 return false;
1698 case SYMBOL_GOTOFF_PAGE:
1699 case SYMBOL_GOTOFF_DISP:
1700 case SYMBOL_GOTOFF_CALL:
1701 case SYMBOL_GOTOFF_LOADGP:
1702 case SYMBOL_TLS:
1703 case SYMBOL_TLSGD:
1704 case SYMBOL_TLSLDM:
1705 case SYMBOL_DTPREL:
1706 case SYMBOL_GOTTPREL:
1707 case SYMBOL_TPREL:
1708 case SYMBOL_64_HIGH:
1709 case SYMBOL_64_MID:
1710 case SYMBOL_64_LOW:
1711 case SYMBOL_HALF:
1712 return true;
1714 gcc_unreachable ();
1718 /* Return true if X is a valid address for machine mode MODE. If it is,
1719 fill in INFO appropriately. STRICT is true if we should only accept
1720 hard base registers. */
1722 static bool
1723 mips_classify_address (struct mips_address_info *info, rtx x,
1724 enum machine_mode mode, int strict)
1726 switch (GET_CODE (x))
1728 case REG:
1729 case SUBREG:
1730 info->type = ADDRESS_REG;
1731 info->reg = x;
1732 info->offset = const0_rtx;
1733 return mips_valid_base_register_p (info->reg, mode, strict);
1735 case PLUS:
1736 info->type = ADDRESS_REG;
1737 info->reg = XEXP (x, 0);
1738 info->offset = XEXP (x, 1);
1739 return (mips_valid_base_register_p (info->reg, mode, strict)
1740 && const_arith_operand (info->offset, VOIDmode));
1742 case LO_SUM:
1743 info->type = ADDRESS_LO_SUM;
1744 info->reg = XEXP (x, 0);
1745 info->offset = XEXP (x, 1);
1746 return (mips_valid_base_register_p (info->reg, mode, strict)
1747 && mips_symbolic_constant_p (info->offset, &info->symbol_type)
1748 && mips_symbolic_address_p (info->symbol_type, mode)
1749 && mips_lo_relocs[info->symbol_type] != 0);
1751 case CONST_INT:
1752 /* Small-integer addresses don't occur very often, but they
1753 are legitimate if $0 is a valid base register. */
1754 info->type = ADDRESS_CONST_INT;
1755 return !TARGET_MIPS16 && SMALL_INT (x);
1757 case CONST:
1758 case LABEL_REF:
1759 case SYMBOL_REF:
1760 info->type = ADDRESS_SYMBOLIC;
1761 return (mips_symbolic_constant_p (x, &info->symbol_type)
1762 && mips_symbolic_address_p (info->symbol_type, mode)
1763 && !mips_split_p[info->symbol_type]);
1765 default:
1766 return false;
1770 /* Return true if X is a thread-local symbol. */
1772 static bool
1773 mips_tls_operand_p (rtx x)
1775 return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1778 /* Return true if X can not be forced into a constant pool. */
1780 static int
1781 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1783 return mips_tls_operand_p (*x);
1786 /* Return true if X can not be forced into a constant pool. */
1788 static bool
1789 mips_cannot_force_const_mem (rtx x)
1791 rtx base, offset;
1793 if (!TARGET_MIPS16)
1795 /* As an optimization, reject constants that mips_legitimize_move
1796 can expand inline.
1798 Suppose we have a multi-instruction sequence that loads constant C
1799 into register R. If R does not get allocated a hard register, and
1800 R is used in an operand that allows both registers and memory
1801 references, reload will consider forcing C into memory and using
1802 one of the instruction's memory alternatives. Returning false
1803 here will force it to use an input reload instead. */
1804 if (GET_CODE (x) == CONST_INT)
1805 return true;
1807 split_const (x, &base, &offset);
1808 if (symbolic_operand (base, VOIDmode) && SMALL_INT (offset))
1809 return true;
1812 if (TARGET_HAVE_TLS && for_each_rtx (&x, &mips_tls_symbol_ref_1, 0))
1813 return true;
1815 return false;
1818 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. MIPS16 uses per-function
1819 constant pools, but normal-mode code doesn't need to. */
1821 static bool
1822 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
1823 rtx x ATTRIBUTE_UNUSED)
1825 return !TARGET_MIPS16;
1828 /* Return the number of instructions needed to load a symbol of the
1829 given type into a register. If valid in an address, the same number
1830 of instructions are needed for loads and stores. Treat extended
1831 mips16 instructions as two instructions. */
1833 static int
1834 mips_symbol_insns (enum mips_symbol_type type)
1836 switch (type)
1838 case SYMBOL_GENERAL:
1839 /* In mips16 code, general symbols must be fetched from the
1840 constant pool. */
1841 if (TARGET_MIPS16)
1842 return 0;
1844 /* When using 64-bit symbols, we need 5 preparatory instructions,
1845 such as:
1847 lui $at,%highest(symbol)
1848 daddiu $at,$at,%higher(symbol)
1849 dsll $at,$at,16
1850 daddiu $at,$at,%hi(symbol)
1851 dsll $at,$at,16
1853 The final address is then $at + %lo(symbol). With 32-bit
1854 symbols we just need a preparatory lui. */
1855 return (ABI_HAS_64BIT_SYMBOLS ? 6 : 2);
1857 case SYMBOL_SMALL_DATA:
1858 case SYMBOL_HALF:
1859 return 1;
1861 case SYMBOL_CONSTANT_POOL:
1862 /* This case is for mips16 only. Assume we'll need an
1863 extended instruction. */
1864 return 2;
1866 case SYMBOL_GOT_PAGE_OFST:
1867 case SYMBOL_GOT_DISP:
1868 /* Unless -funit-at-a-time is in effect, we can't be sure whether
1869 the local/global classification is accurate. See override_options
1870 for details.
1872 The worst cases are:
1874 (1) For local symbols when generating o32 or o64 code. The assembler
1875 will use:
1877 lw $at,%got(symbol)
1880 ...and the final address will be $at + %lo(symbol).
1882 (2) For global symbols when -mxgot. The assembler will use:
1884 lui $at,%got_hi(symbol)
1885 (d)addu $at,$at,$gp
1887 ...and the final address will be $at + %got_lo(symbol). */
1888 return 3;
1890 case SYMBOL_GOTOFF_PAGE:
1891 case SYMBOL_GOTOFF_DISP:
1892 case SYMBOL_GOTOFF_CALL:
1893 case SYMBOL_GOTOFF_LOADGP:
1894 case SYMBOL_64_HIGH:
1895 case SYMBOL_64_MID:
1896 case SYMBOL_64_LOW:
1897 case SYMBOL_TLSGD:
1898 case SYMBOL_TLSLDM:
1899 case SYMBOL_DTPREL:
1900 case SYMBOL_GOTTPREL:
1901 case SYMBOL_TPREL:
1902 /* Check whether the offset is a 16- or 32-bit value. */
1903 return mips_split_p[type] ? 2 : 1;
1905 case SYMBOL_TLS:
1906 /* We don't treat a bare TLS symbol as a constant. */
1907 return 0;
1909 gcc_unreachable ();
1912 /* Return true if X is a legitimate $sp-based address for mode MDOE. */
1914 bool
1915 mips_stack_address_p (rtx x, enum machine_mode mode)
1917 struct mips_address_info addr;
1919 return (mips_classify_address (&addr, x, mode, false)
1920 && addr.type == ADDRESS_REG
1921 && addr.reg == stack_pointer_rtx);
1924 /* Return true if a value at OFFSET bytes from BASE can be accessed
1925 using an unextended mips16 instruction. MODE is the mode of the
1926 value.
1928 Usually the offset in an unextended instruction is a 5-bit field.
1929 The offset is unsigned and shifted left once for HIs, twice
1930 for SIs, and so on. An exception is SImode accesses off the
1931 stack pointer, which have an 8-bit immediate field. */
1933 static bool
1934 mips16_unextended_reference_p (enum machine_mode mode, rtx base, rtx offset)
1936 if (TARGET_MIPS16
1937 && GET_CODE (offset) == CONST_INT
1938 && INTVAL (offset) >= 0
1939 && (INTVAL (offset) & (GET_MODE_SIZE (mode) - 1)) == 0)
1941 if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
1942 return INTVAL (offset) < 256 * GET_MODE_SIZE (mode);
1943 return INTVAL (offset) < 32 * GET_MODE_SIZE (mode);
1945 return false;
1949 /* Return the number of instructions needed to load or store a value
1950 of mode MODE at X. Return 0 if X isn't valid for MODE.
1952 For mips16 code, count extended instructions as two instructions. */
1955 mips_address_insns (rtx x, enum machine_mode mode)
1957 struct mips_address_info addr;
1958 int factor;
1960 if (mode == BLKmode)
1961 /* BLKmode is used for single unaligned loads and stores. */
1962 factor = 1;
1963 else
1964 /* Each word of a multi-word value will be accessed individually. */
1965 factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1967 if (mips_classify_address (&addr, x, mode, false))
1968 switch (addr.type)
1970 case ADDRESS_REG:
1971 if (TARGET_MIPS16
1972 && !mips16_unextended_reference_p (mode, addr.reg, addr.offset))
1973 return factor * 2;
1974 return factor;
1976 case ADDRESS_LO_SUM:
1977 return (TARGET_MIPS16 ? factor * 2 : factor);
1979 case ADDRESS_CONST_INT:
1980 return factor;
1982 case ADDRESS_SYMBOLIC:
1983 return factor * mips_symbol_insns (addr.symbol_type);
1985 return 0;
1989 /* Likewise for constant X. */
1992 mips_const_insns (rtx x)
1994 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
1995 enum mips_symbol_type symbol_type;
1996 rtx offset;
1998 switch (GET_CODE (x))
2000 case HIGH:
2001 if (TARGET_MIPS16
2002 || !mips_symbolic_constant_p (XEXP (x, 0), &symbol_type)
2003 || !mips_split_p[symbol_type])
2004 return 0;
2006 return 1;
2008 case CONST_INT:
2009 if (TARGET_MIPS16)
2010 /* Unsigned 8-bit constants can be loaded using an unextended
2011 LI instruction. Unsigned 16-bit constants can be loaded
2012 using an extended LI. Negative constants must be loaded
2013 using LI and then negated. */
2014 return (INTVAL (x) >= 0 && INTVAL (x) < 256 ? 1
2015 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2016 : INTVAL (x) > -256 && INTVAL (x) < 0 ? 2
2017 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2018 : 0);
2020 return mips_build_integer (codes, INTVAL (x));
2022 case CONST_DOUBLE:
2023 case CONST_VECTOR:
2024 return (!TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0);
2026 case CONST:
2027 if (CONST_GP_P (x))
2028 return 1;
2030 /* See if we can refer to X directly. */
2031 if (mips_symbolic_constant_p (x, &symbol_type))
2032 return mips_symbol_insns (symbol_type);
2034 /* Otherwise try splitting the constant into a base and offset.
2035 16-bit offsets can be added using an extra addiu. Larger offsets
2036 must be calculated separately and then added to the base. */
2037 split_const (x, &x, &offset);
2038 if (offset != 0)
2040 int n = mips_const_insns (x);
2041 if (n != 0)
2043 if (SMALL_INT (offset))
2044 return n + 1;
2045 else
2046 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2049 return 0;
2051 case SYMBOL_REF:
2052 case LABEL_REF:
2053 return mips_symbol_insns (mips_classify_symbol (x));
2055 default:
2056 return 0;
2061 /* Return the number of instructions needed for memory reference X.
2062 Count extended mips16 instructions as two instructions. */
2065 mips_fetch_insns (rtx x)
2067 gcc_assert (MEM_P (x));
2068 return mips_address_insns (XEXP (x, 0), GET_MODE (x));
2072 /* Return the number of instructions needed for an integer division. */
2075 mips_idiv_insns (void)
2077 int count;
2079 count = 1;
2080 if (TARGET_CHECK_ZERO_DIV)
2082 if (GENERATE_DIVIDE_TRAPS)
2083 count++;
2084 else
2085 count += 2;
2088 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2089 count++;
2090 return count;
2093 /* This function is used to implement GO_IF_LEGITIMATE_ADDRESS. It
2094 returns a nonzero value if X is a legitimate address for a memory
2095 operand of the indicated MODE. STRICT is nonzero if this function
2096 is called during reload. */
2098 bool
2099 mips_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
2101 struct mips_address_info addr;
2103 return mips_classify_address (&addr, x, mode, strict);
2107 /* Copy VALUE to a register and return that register. If new psuedos
2108 are allowed, copy it into a new register, otherwise use DEST. */
2110 static rtx
2111 mips_force_temporary (rtx dest, rtx value)
2113 if (can_create_pseudo_p ())
2114 return force_reg (Pmode, value);
2115 else
2117 emit_move_insn (copy_rtx (dest), value);
2118 return dest;
2123 /* Return a LO_SUM expression for ADDR. TEMP is as for mips_force_temporary
2124 and is used to load the high part into a register. */
2127 mips_split_symbol (rtx temp, rtx addr)
2129 rtx high;
2131 if (!TARGET_MIPS16)
2132 high = mips_force_temporary (temp, gen_rtx_HIGH (Pmode, copy_rtx (addr)));
2133 else if (!can_create_pseudo_p ())
2135 emit_insn (gen_load_const_gp (copy_rtx (temp)));
2136 high = temp;
2138 else
2139 high = mips16_gp_pseudo_reg ();
2140 return gen_rtx_LO_SUM (Pmode, high, addr);
2144 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2145 type SYMBOL_TYPE. */
2148 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2150 rtx base, offset;
2152 split_const (address, &base, &offset);
2153 base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2154 UNSPEC_ADDRESS_FIRST + symbol_type);
2155 if (offset != const0_rtx)
2156 base = gen_rtx_PLUS (Pmode, base, offset);
2157 return gen_rtx_CONST (Pmode, base);
2161 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2162 high part to BASE and return the result. Just return BASE otherwise.
2163 TEMP is available as a temporary register if needed.
2165 The returned expression can be used as the first operand to a LO_SUM. */
2167 static rtx
2168 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2169 enum mips_symbol_type symbol_type)
2171 if (mips_split_p[symbol_type])
2173 addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2174 addr = mips_force_temporary (temp, addr);
2175 return mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2177 return base;
2181 /* Return a legitimate address for REG + OFFSET. TEMP is as for
2182 mips_force_temporary; it is only needed when OFFSET is not a
2183 SMALL_OPERAND. */
2185 static rtx
2186 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2188 if (!SMALL_OPERAND (offset))
2190 rtx high;
2191 if (TARGET_MIPS16)
2193 /* Load the full offset into a register so that we can use
2194 an unextended instruction for the address itself. */
2195 high = GEN_INT (offset);
2196 offset = 0;
2198 else
2200 /* Leave OFFSET as a 16-bit offset and put the excess in HIGH. */
2201 high = GEN_INT (CONST_HIGH_PART (offset));
2202 offset = CONST_LOW_PART (offset);
2204 high = mips_force_temporary (temp, high);
2205 reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2207 return plus_constant (reg, offset);
2210 /* Emit a call to __tls_get_addr. SYM is the TLS symbol we are
2211 referencing, and TYPE is the symbol type to use (either global
2212 dynamic or local dynamic). V0 is an RTX for the return value
2213 location. The entire insn sequence is returned. */
2215 static GTY(()) rtx mips_tls_symbol;
2217 static rtx
2218 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2220 rtx insn, loc, tga, a0;
2222 a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2224 if (!mips_tls_symbol)
2225 mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2227 loc = mips_unspec_address (sym, type);
2229 start_sequence ();
2231 emit_insn (gen_rtx_SET (Pmode, a0,
2232 gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2233 tga = gen_rtx_MEM (Pmode, mips_tls_symbol);
2234 insn = emit_call_insn (gen_call_value (v0, tga, const0_rtx, const0_rtx));
2235 CONST_OR_PURE_CALL_P (insn) = 1;
2236 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), v0);
2237 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2238 insn = get_insns ();
2240 end_sequence ();
2242 return insn;
2245 /* Generate the code to access LOC, a thread local SYMBOL_REF. The
2246 return value will be a valid address and move_operand (either a REG
2247 or a LO_SUM). */
2249 static rtx
2250 mips_legitimize_tls_address (rtx loc)
2252 rtx dest, insn, v0, v1, tmp1, tmp2, eqv;
2253 enum tls_model model;
2255 v0 = gen_rtx_REG (Pmode, GP_RETURN);
2256 v1 = gen_rtx_REG (Pmode, GP_RETURN + 1);
2258 model = SYMBOL_REF_TLS_MODEL (loc);
2259 /* Only TARGET_ABICALLS code can have more than one module; other
2260 code must be be static and should not use a GOT. All TLS models
2261 reduce to local exec in this situation. */
2262 if (!TARGET_ABICALLS)
2263 model = TLS_MODEL_LOCAL_EXEC;
2265 switch (model)
2267 case TLS_MODEL_GLOBAL_DYNAMIC:
2268 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2269 dest = gen_reg_rtx (Pmode);
2270 emit_libcall_block (insn, dest, v0, loc);
2271 break;
2273 case TLS_MODEL_LOCAL_DYNAMIC:
2274 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2275 tmp1 = gen_reg_rtx (Pmode);
2277 /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2278 share the LDM result with other LD model accesses. */
2279 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2280 UNSPEC_TLS_LDM);
2281 emit_libcall_block (insn, tmp1, v0, eqv);
2283 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2284 dest = gen_rtx_LO_SUM (Pmode, tmp2,
2285 mips_unspec_address (loc, SYMBOL_DTPREL));
2286 break;
2288 case TLS_MODEL_INITIAL_EXEC:
2289 tmp1 = gen_reg_rtx (Pmode);
2290 tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2291 if (Pmode == DImode)
2293 emit_insn (gen_tls_get_tp_di (v1));
2294 emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2296 else
2298 emit_insn (gen_tls_get_tp_si (v1));
2299 emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2301 dest = gen_reg_rtx (Pmode);
2302 emit_insn (gen_add3_insn (dest, tmp1, v1));
2303 break;
2305 case TLS_MODEL_LOCAL_EXEC:
2306 if (Pmode == DImode)
2307 emit_insn (gen_tls_get_tp_di (v1));
2308 else
2309 emit_insn (gen_tls_get_tp_si (v1));
2311 tmp1 = mips_unspec_offset_high (NULL, v1, loc, SYMBOL_TPREL);
2312 dest = gen_rtx_LO_SUM (Pmode, tmp1,
2313 mips_unspec_address (loc, SYMBOL_TPREL));
2314 break;
2316 default:
2317 gcc_unreachable ();
2320 return dest;
2323 /* This function is used to implement LEGITIMIZE_ADDRESS. If *XLOC can
2324 be legitimized in a way that the generic machinery might not expect,
2325 put the new address in *XLOC and return true. MODE is the mode of
2326 the memory being accessed. */
2328 bool
2329 mips_legitimize_address (rtx *xloc, enum machine_mode mode)
2331 enum mips_symbol_type symbol_type;
2333 if (mips_tls_operand_p (*xloc))
2335 *xloc = mips_legitimize_tls_address (*xloc);
2336 return true;
2339 /* See if the address can split into a high part and a LO_SUM. */
2340 if (mips_symbolic_constant_p (*xloc, &symbol_type)
2341 && mips_symbolic_address_p (symbol_type, mode)
2342 && mips_split_p[symbol_type])
2344 *xloc = mips_split_symbol (0, *xloc);
2345 return true;
2348 if (GET_CODE (*xloc) == PLUS && GET_CODE (XEXP (*xloc, 1)) == CONST_INT)
2350 /* Handle REG + CONSTANT using mips_add_offset. */
2351 rtx reg;
2353 reg = XEXP (*xloc, 0);
2354 if (!mips_valid_base_register_p (reg, mode, 0))
2355 reg = copy_to_mode_reg (Pmode, reg);
2356 *xloc = mips_add_offset (0, reg, INTVAL (XEXP (*xloc, 1)));
2357 return true;
2360 return false;
2364 /* Subroutine of mips_build_integer (with the same interface).
2365 Assume that the final action in the sequence should be a left shift. */
2367 static unsigned int
2368 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
2370 unsigned int i, shift;
2372 /* Shift VALUE right until its lowest bit is set. Shift arithmetically
2373 since signed numbers are easier to load than unsigned ones. */
2374 shift = 0;
2375 while ((value & 1) == 0)
2376 value /= 2, shift++;
2378 i = mips_build_integer (codes, value);
2379 codes[i].code = ASHIFT;
2380 codes[i].value = shift;
2381 return i + 1;
2385 /* As for mips_build_shift, but assume that the final action will be
2386 an IOR or PLUS operation. */
2388 static unsigned int
2389 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
2391 unsigned HOST_WIDE_INT high;
2392 unsigned int i;
2394 high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
2395 if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
2397 /* The constant is too complex to load with a simple lui/ori pair
2398 so our goal is to clear as many trailing zeros as possible.
2399 In this case, we know bit 16 is set and that the low 16 bits
2400 form a negative number. If we subtract that number from VALUE,
2401 we will clear at least the lowest 17 bits, maybe more. */
2402 i = mips_build_integer (codes, CONST_HIGH_PART (value));
2403 codes[i].code = PLUS;
2404 codes[i].value = CONST_LOW_PART (value);
2406 else
2408 i = mips_build_integer (codes, high);
2409 codes[i].code = IOR;
2410 codes[i].value = value & 0xffff;
2412 return i + 1;
2416 /* Fill CODES with a sequence of rtl operations to load VALUE.
2417 Return the number of operations needed. */
2419 static unsigned int
2420 mips_build_integer (struct mips_integer_op *codes,
2421 unsigned HOST_WIDE_INT value)
2423 if (SMALL_OPERAND (value)
2424 || SMALL_OPERAND_UNSIGNED (value)
2425 || LUI_OPERAND (value))
2427 /* The value can be loaded with a single instruction. */
2428 codes[0].code = UNKNOWN;
2429 codes[0].value = value;
2430 return 1;
2432 else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
2434 /* Either the constant is a simple LUI/ORI combination or its
2435 lowest bit is set. We don't want to shift in this case. */
2436 return mips_build_lower (codes, value);
2438 else if ((value & 0xffff) == 0)
2440 /* The constant will need at least three actions. The lowest
2441 16 bits are clear, so the final action will be a shift. */
2442 return mips_build_shift (codes, value);
2444 else
2446 /* The final action could be a shift, add or inclusive OR.
2447 Rather than use a complex condition to select the best
2448 approach, try both mips_build_shift and mips_build_lower
2449 and pick the one that gives the shortest sequence.
2450 Note that this case is only used once per constant. */
2451 struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
2452 unsigned int cost, alt_cost;
2454 cost = mips_build_shift (codes, value);
2455 alt_cost = mips_build_lower (alt_codes, value);
2456 if (alt_cost < cost)
2458 memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
2459 cost = alt_cost;
2461 return cost;
2466 /* Load VALUE into DEST, using TEMP as a temporary register if need be. */
2468 void
2469 mips_move_integer (rtx dest, rtx temp, unsigned HOST_WIDE_INT value)
2471 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2472 enum machine_mode mode;
2473 unsigned int i, cost;
2474 rtx x;
2476 mode = GET_MODE (dest);
2477 cost = mips_build_integer (codes, value);
2479 /* Apply each binary operation to X. Invariant: X is a legitimate
2480 source operand for a SET pattern. */
2481 x = GEN_INT (codes[0].value);
2482 for (i = 1; i < cost; i++)
2484 if (!can_create_pseudo_p ())
2486 emit_insn (gen_rtx_SET (VOIDmode, temp, x));
2487 x = temp;
2489 else
2490 x = force_reg (mode, x);
2491 x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
2494 emit_insn (gen_rtx_SET (VOIDmode, dest, x));
2498 /* Subroutine of mips_legitimize_move. Move constant SRC into register
2499 DEST given that SRC satisfies immediate_operand but doesn't satisfy
2500 move_operand. */
2502 static void
2503 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
2505 rtx base, offset;
2507 /* Split moves of big integers into smaller pieces. */
2508 if (splittable_const_int_operand (src, mode))
2510 mips_move_integer (dest, dest, INTVAL (src));
2511 return;
2514 /* Split moves of symbolic constants into high/low pairs. */
2515 if (splittable_symbolic_operand (src, mode))
2517 emit_insn (gen_rtx_SET (VOIDmode, dest, mips_split_symbol (dest, src)));
2518 return;
2521 if (mips_tls_operand_p (src))
2523 emit_move_insn (dest, mips_legitimize_tls_address (src));
2524 return;
2527 /* If we have (const (plus symbol offset)), load the symbol first
2528 and then add in the offset. This is usually better than forcing
2529 the constant into memory, at least in non-mips16 code. */
2530 split_const (src, &base, &offset);
2531 if (!TARGET_MIPS16
2532 && offset != const0_rtx
2533 && (can_create_pseudo_p () || SMALL_INT (offset)))
2535 base = mips_force_temporary (dest, base);
2536 emit_move_insn (dest, mips_add_offset (0, base, INTVAL (offset)));
2537 return;
2540 src = force_const_mem (mode, src);
2542 /* When using explicit relocs, constant pool references are sometimes
2543 not legitimate addresses. */
2544 if (!memory_operand (src, VOIDmode))
2545 src = replace_equiv_address (src, mips_split_symbol (dest, XEXP (src, 0)));
2546 emit_move_insn (dest, src);
2550 /* If (set DEST SRC) is not a valid instruction, emit an equivalent
2551 sequence that is valid. */
2553 bool
2554 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
2556 if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
2558 emit_move_insn (dest, force_reg (mode, src));
2559 return true;
2562 /* Check for individual, fully-reloaded mflo and mfhi instructions. */
2563 if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
2564 && REG_P (src) && MD_REG_P (REGNO (src))
2565 && REG_P (dest) && GP_REG_P (REGNO (dest)))
2567 int other_regno = REGNO (src) == HI_REGNUM ? LO_REGNUM : HI_REGNUM;
2568 if (GET_MODE_SIZE (mode) <= 4)
2569 emit_insn (gen_mfhilo_si (gen_rtx_REG (SImode, REGNO (dest)),
2570 gen_rtx_REG (SImode, REGNO (src)),
2571 gen_rtx_REG (SImode, other_regno)));
2572 else
2573 emit_insn (gen_mfhilo_di (gen_rtx_REG (DImode, REGNO (dest)),
2574 gen_rtx_REG (DImode, REGNO (src)),
2575 gen_rtx_REG (DImode, other_regno)));
2576 return true;
2579 /* We need to deal with constants that would be legitimate
2580 immediate_operands but not legitimate move_operands. */
2581 if (CONSTANT_P (src) && !move_operand (src, mode))
2583 mips_legitimize_const_move (mode, dest, src);
2584 set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
2585 return true;
2587 return false;
2590 /* We need a lot of little routines to check constant values on the
2591 mips16. These are used to figure out how long the instruction will
2592 be. It would be much better to do this using constraints, but
2593 there aren't nearly enough letters available. */
2595 static int
2596 m16_check_op (rtx op, int low, int high, int mask)
2598 return (GET_CODE (op) == CONST_INT
2599 && INTVAL (op) >= low
2600 && INTVAL (op) <= high
2601 && (INTVAL (op) & mask) == 0);
2605 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2607 return m16_check_op (op, 0x1, 0x8, 0);
2611 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2613 return m16_check_op (op, - 0x8, 0x7, 0);
2617 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2619 return m16_check_op (op, - 0x7, 0x8, 0);
2623 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2625 return m16_check_op (op, - 0x10, 0xf, 0);
2629 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2631 return m16_check_op (op, - 0xf, 0x10, 0);
2635 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2637 return m16_check_op (op, (- 0x10) << 2, 0xf << 2, 3);
2641 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2643 return m16_check_op (op, (- 0xf) << 2, 0x10 << 2, 3);
2647 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2649 return m16_check_op (op, - 0x80, 0x7f, 0);
2653 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2655 return m16_check_op (op, - 0x7f, 0x80, 0);
2659 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2661 return m16_check_op (op, 0x0, 0xff, 0);
2665 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2667 return m16_check_op (op, - 0xff, 0x0, 0);
2671 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2673 return m16_check_op (op, - 0x1, 0xfe, 0);
2677 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2679 return m16_check_op (op, 0x0, 0xff << 2, 3);
2683 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2685 return m16_check_op (op, (- 0xff) << 2, 0x0, 3);
2689 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2691 return m16_check_op (op, (- 0x80) << 3, 0x7f << 3, 7);
2695 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2697 return m16_check_op (op, (- 0x7f) << 3, 0x80 << 3, 7);
2700 /* Return true if ADDR matches the pattern for the lwxs load scaled indexed
2701 address instruction. */
2703 static bool
2704 mips_lwxs_address_p (rtx addr)
2706 if (ISA_HAS_LWXS
2707 && GET_CODE (addr) == PLUS
2708 && REG_P (XEXP (addr, 1)))
2710 rtx offset = XEXP (addr, 0);
2711 if (GET_CODE (offset) == MULT
2712 && REG_P (XEXP (offset, 0))
2713 && GET_CODE (XEXP (offset, 1)) == CONST_INT
2714 && INTVAL (XEXP (offset, 1)) == 4)
2715 return true;
2717 return false;
2720 static bool
2721 mips_rtx_costs (rtx x, int code, int outer_code, int *total)
2723 enum machine_mode mode = GET_MODE (x);
2724 bool float_mode_p = FLOAT_MODE_P (mode);
2726 switch (code)
2728 case CONST_INT:
2729 if (TARGET_MIPS16)
2731 /* A number between 1 and 8 inclusive is efficient for a shift.
2732 Otherwise, we will need an extended instruction. */
2733 if ((outer_code) == ASHIFT || (outer_code) == ASHIFTRT
2734 || (outer_code) == LSHIFTRT)
2736 if (INTVAL (x) >= 1 && INTVAL (x) <= 8)
2737 *total = 0;
2738 else
2739 *total = COSTS_N_INSNS (1);
2740 return true;
2743 /* We can use cmpi for an xor with an unsigned 16-bit value. */
2744 if ((outer_code) == XOR
2745 && INTVAL (x) >= 0 && INTVAL (x) < 0x10000)
2747 *total = 0;
2748 return true;
2751 /* We may be able to use slt or sltu for a comparison with a
2752 signed 16-bit value. (The boundary conditions aren't quite
2753 right, but this is just a heuristic anyhow.) */
2754 if (((outer_code) == LT || (outer_code) == LE
2755 || (outer_code) == GE || (outer_code) == GT
2756 || (outer_code) == LTU || (outer_code) == LEU
2757 || (outer_code) == GEU || (outer_code) == GTU)
2758 && INTVAL (x) >= -0x8000 && INTVAL (x) < 0x8000)
2760 *total = 0;
2761 return true;
2764 /* Equality comparisons with 0 are cheap. */
2765 if (((outer_code) == EQ || (outer_code) == NE)
2766 && INTVAL (x) == 0)
2768 *total = 0;
2769 return true;
2772 /* Constants in the range 0...255 can be loaded with an unextended
2773 instruction. They are therefore as cheap as a register move.
2775 Given the choice between "li R1,0...255" and "move R1,R2"
2776 (where R2 is a known constant), it is usually better to use "li",
2777 since we do not want to unnecessarily extend the lifetime
2778 of R2. */
2779 if (outer_code == SET
2780 && INTVAL (x) >= 0
2781 && INTVAL (x) < 256)
2783 *total = 0;
2784 return true;
2787 else
2789 /* These can be used anywhere. */
2790 *total = 0;
2791 return true;
2794 /* Otherwise fall through to the handling below because
2795 we'll need to construct the constant. */
2797 case CONST:
2798 case SYMBOL_REF:
2799 case LABEL_REF:
2800 case CONST_DOUBLE:
2801 if (LEGITIMATE_CONSTANT_P (x))
2803 *total = COSTS_N_INSNS (1);
2804 return true;
2806 else
2808 /* The value will need to be fetched from the constant pool. */
2809 *total = CONSTANT_POOL_COST;
2810 return true;
2813 case MEM:
2815 /* If the address is legitimate, return the number of
2816 instructions it needs. */
2817 rtx addr = XEXP (x, 0);
2818 int n = mips_address_insns (addr, GET_MODE (x));
2819 if (n > 0)
2821 *total = COSTS_N_INSNS (n + 1);
2822 return true;
2824 /* Check for scaled indexed address. */
2825 if (mips_lwxs_address_p (addr))
2827 *total = COSTS_N_INSNS (2);
2828 return true;
2830 /* Otherwise use the default handling. */
2831 return false;
2834 case FFS:
2835 *total = COSTS_N_INSNS (6);
2836 return true;
2838 case NOT:
2839 *total = COSTS_N_INSNS ((mode == DImode && !TARGET_64BIT) ? 2 : 1);
2840 return true;
2842 case AND:
2843 case IOR:
2844 case XOR:
2845 if (mode == DImode && !TARGET_64BIT)
2847 *total = COSTS_N_INSNS (2);
2848 return true;
2850 return false;
2852 case ASHIFT:
2853 case ASHIFTRT:
2854 case LSHIFTRT:
2855 if (mode == DImode && !TARGET_64BIT)
2857 *total = COSTS_N_INSNS ((GET_CODE (XEXP (x, 1)) == CONST_INT)
2858 ? 4 : 12);
2859 return true;
2861 return false;
2863 case ABS:
2864 if (float_mode_p)
2865 *total = COSTS_N_INSNS (1);
2866 else
2867 *total = COSTS_N_INSNS (4);
2868 return true;
2870 case LO_SUM:
2871 *total = COSTS_N_INSNS (1);
2872 return true;
2874 case PLUS:
2875 case MINUS:
2876 if (float_mode_p)
2878 *total = mips_cost->fp_add;
2879 return true;
2882 else if (mode == DImode && !TARGET_64BIT)
2884 *total = COSTS_N_INSNS (4);
2885 return true;
2887 return false;
2889 case NEG:
2890 if (mode == DImode && !TARGET_64BIT)
2892 *total = COSTS_N_INSNS (4);
2893 return true;
2895 return false;
2897 case MULT:
2898 if (mode == SFmode)
2899 *total = mips_cost->fp_mult_sf;
2901 else if (mode == DFmode)
2902 *total = mips_cost->fp_mult_df;
2904 else if (mode == SImode)
2905 *total = mips_cost->int_mult_si;
2907 else
2908 *total = mips_cost->int_mult_di;
2910 return true;
2912 case DIV:
2913 case MOD:
2914 if (float_mode_p)
2916 if (mode == SFmode)
2917 *total = mips_cost->fp_div_sf;
2918 else
2919 *total = mips_cost->fp_div_df;
2921 return true;
2923 /* Fall through. */
2925 case UDIV:
2926 case UMOD:
2927 if (mode == DImode)
2928 *total = mips_cost->int_div_di;
2929 else
2930 *total = mips_cost->int_div_si;
2932 return true;
2934 case SIGN_EXTEND:
2935 /* A sign extend from SImode to DImode in 64-bit mode is often
2936 zero instructions, because the result can often be used
2937 directly by another instruction; we'll call it one. */
2938 if (TARGET_64BIT && mode == DImode
2939 && GET_MODE (XEXP (x, 0)) == SImode)
2940 *total = COSTS_N_INSNS (1);
2941 else
2942 *total = COSTS_N_INSNS (2);
2943 return true;
2945 case ZERO_EXTEND:
2946 if (TARGET_64BIT && mode == DImode
2947 && GET_MODE (XEXP (x, 0)) == SImode)
2948 *total = COSTS_N_INSNS (2);
2949 else
2950 *total = COSTS_N_INSNS (1);
2951 return true;
2953 case FLOAT:
2954 case UNSIGNED_FLOAT:
2955 case FIX:
2956 case FLOAT_EXTEND:
2957 case FLOAT_TRUNCATE:
2958 case SQRT:
2959 *total = mips_cost->fp_add;
2960 return true;
2962 default:
2963 return false;
2967 /* Provide the costs of an addressing mode that contains ADDR.
2968 If ADDR is not a valid address, its cost is irrelevant. */
2970 static int
2971 mips_address_cost (rtx addr)
2973 return mips_address_insns (addr, SImode);
2976 /* Return one word of double-word value OP, taking into account the fixed
2977 endianness of certain registers. HIGH_P is true to select the high part,
2978 false to select the low part. */
2981 mips_subword (rtx op, int high_p)
2983 unsigned int byte;
2984 enum machine_mode mode;
2986 mode = GET_MODE (op);
2987 if (mode == VOIDmode)
2988 mode = DImode;
2990 if (TARGET_BIG_ENDIAN ? !high_p : high_p)
2991 byte = UNITS_PER_WORD;
2992 else
2993 byte = 0;
2995 if (FP_REG_RTX_P (op))
2996 return gen_rtx_REG (word_mode, high_p ? REGNO (op) + 1 : REGNO (op));
2998 if (MEM_P (op))
2999 return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
3001 return simplify_gen_subreg (word_mode, op, mode, byte);
3005 /* Return true if a 64-bit move from SRC to DEST should be split into two. */
3007 bool
3008 mips_split_64bit_move_p (rtx dest, rtx src)
3010 if (TARGET_64BIT)
3011 return false;
3013 /* FP->FP moves can be done in a single instruction. */
3014 if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
3015 return false;
3017 /* Check for floating-point loads and stores. They can be done using
3018 ldc1 and sdc1 on MIPS II and above. */
3019 if (mips_isa > 1)
3021 if (FP_REG_RTX_P (dest) && MEM_P (src))
3022 return false;
3023 if (FP_REG_RTX_P (src) && MEM_P (dest))
3024 return false;
3026 return true;
3030 /* Split a 64-bit move from SRC to DEST assuming that
3031 mips_split_64bit_move_p holds.
3033 Moves into and out of FPRs cause some difficulty here. Such moves
3034 will always be DFmode, since paired FPRs are not allowed to store
3035 DImode values. The most natural representation would be two separate
3036 32-bit moves, such as:
3038 (set (reg:SI $f0) (mem:SI ...))
3039 (set (reg:SI $f1) (mem:SI ...))
3041 However, the second insn is invalid because odd-numbered FPRs are
3042 not allowed to store independent values. Use the patterns load_df_low,
3043 load_df_high and store_df_high instead. */
3045 void
3046 mips_split_64bit_move (rtx dest, rtx src)
3048 if (FP_REG_RTX_P (dest))
3050 /* Loading an FPR from memory or from GPRs. */
3051 if (ISA_HAS_MXHC1)
3053 dest = gen_lowpart (DFmode, dest);
3054 emit_insn (gen_load_df_low (dest, mips_subword (src, 0)));
3055 emit_insn (gen_mthc1 (dest, mips_subword (src, 1),
3056 copy_rtx (dest)));
3058 else
3060 emit_insn (gen_load_df_low (copy_rtx (dest),
3061 mips_subword (src, 0)));
3062 emit_insn (gen_load_df_high (dest, mips_subword (src, 1),
3063 copy_rtx (dest)));
3066 else if (FP_REG_RTX_P (src))
3068 /* Storing an FPR into memory or GPRs. */
3069 if (ISA_HAS_MXHC1)
3071 src = gen_lowpart (DFmode, src);
3072 emit_move_insn (mips_subword (dest, 0), mips_subword (src, 0));
3073 emit_insn (gen_mfhc1 (mips_subword (dest, 1), src));
3075 else
3077 emit_move_insn (mips_subword (dest, 0), mips_subword (src, 0));
3078 emit_insn (gen_store_df_high (mips_subword (dest, 1), src));
3081 else
3083 /* The operation can be split into two normal moves. Decide in
3084 which order to do them. */
3085 rtx low_dest;
3087 low_dest = mips_subword (dest, 0);
3088 if (REG_P (low_dest)
3089 && reg_overlap_mentioned_p (low_dest, src))
3091 emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
3092 emit_move_insn (low_dest, mips_subword (src, 0));
3094 else
3096 emit_move_insn (low_dest, mips_subword (src, 0));
3097 emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
3102 /* Return the appropriate instructions to move SRC into DEST. Assume
3103 that SRC is operand 1 and DEST is operand 0. */
3105 const char *
3106 mips_output_move (rtx dest, rtx src)
3108 enum rtx_code dest_code, src_code;
3109 bool dbl_p;
3111 dest_code = GET_CODE (dest);
3112 src_code = GET_CODE (src);
3113 dbl_p = (GET_MODE_SIZE (GET_MODE (dest)) == 8);
3115 if (dbl_p && mips_split_64bit_move_p (dest, src))
3116 return "#";
3118 if ((src_code == REG && GP_REG_P (REGNO (src)))
3119 || (!TARGET_MIPS16 && src == CONST0_RTX (GET_MODE (dest))))
3121 if (dest_code == REG)
3123 if (GP_REG_P (REGNO (dest)))
3124 return "move\t%0,%z1";
3126 if (MD_REG_P (REGNO (dest)))
3127 return "mt%0\t%z1";
3129 if (DSP_ACC_REG_P (REGNO (dest)))
3131 static char retval[] = "mt__\t%z1,%q0";
3132 retval[2] = reg_names[REGNO (dest)][4];
3133 retval[3] = reg_names[REGNO (dest)][5];
3134 return retval;
3137 if (FP_REG_P (REGNO (dest)))
3138 return (dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0");
3140 if (ALL_COP_REG_P (REGNO (dest)))
3142 static char retval[] = "dmtc_\t%z1,%0";
3144 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3145 return (dbl_p ? retval : retval + 1);
3148 if (dest_code == MEM)
3149 return (dbl_p ? "sd\t%z1,%0" : "sw\t%z1,%0");
3151 if (dest_code == REG && GP_REG_P (REGNO (dest)))
3153 if (src_code == REG)
3155 if (DSP_ACC_REG_P (REGNO (src)))
3157 static char retval[] = "mf__\t%0,%q1";
3158 retval[2] = reg_names[REGNO (src)][4];
3159 retval[3] = reg_names[REGNO (src)][5];
3160 return retval;
3163 if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
3164 return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
3166 if (FP_REG_P (REGNO (src)))
3167 return (dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1");
3169 if (ALL_COP_REG_P (REGNO (src)))
3171 static char retval[] = "dmfc_\t%0,%1";
3173 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3174 return (dbl_p ? retval : retval + 1);
3178 if (src_code == MEM)
3179 return (dbl_p ? "ld\t%0,%1" : "lw\t%0,%1");
3181 if (src_code == CONST_INT)
3183 /* Don't use the X format, because that will give out of
3184 range numbers for 64-bit hosts and 32-bit targets. */
3185 if (!TARGET_MIPS16)
3186 return "li\t%0,%1\t\t\t# %X1";
3188 if (INTVAL (src) >= 0 && INTVAL (src) <= 0xffff)
3189 return "li\t%0,%1";
3191 if (INTVAL (src) < 0 && INTVAL (src) >= -0xffff)
3192 return "#";
3195 if (src_code == HIGH)
3196 return "lui\t%0,%h1";
3198 if (CONST_GP_P (src))
3199 return "move\t%0,%1";
3201 if (symbolic_operand (src, VOIDmode))
3202 return (dbl_p ? "dla\t%0,%1" : "la\t%0,%1");
3204 if (src_code == REG && FP_REG_P (REGNO (src)))
3206 if (dest_code == REG && FP_REG_P (REGNO (dest)))
3208 if (GET_MODE (dest) == V2SFmode)
3209 return "mov.ps\t%0,%1";
3210 else
3211 return (dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1");
3214 if (dest_code == MEM)
3215 return (dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0");
3217 if (dest_code == REG && FP_REG_P (REGNO (dest)))
3219 if (src_code == MEM)
3220 return (dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1");
3222 if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
3224 static char retval[] = "l_c_\t%0,%1";
3226 retval[1] = (dbl_p ? 'd' : 'w');
3227 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
3228 return retval;
3230 if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
3232 static char retval[] = "s_c_\t%1,%0";
3234 retval[1] = (dbl_p ? 'd' : 'w');
3235 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
3236 return retval;
3238 gcc_unreachable ();
3241 /* Restore $gp from its save slot. Valid only when using o32 or
3242 o64 abicalls. */
3244 void
3245 mips_restore_gp (void)
3247 rtx address, slot;
3249 gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
3251 address = mips_add_offset (pic_offset_table_rtx,
3252 frame_pointer_needed
3253 ? hard_frame_pointer_rtx
3254 : stack_pointer_rtx,
3255 current_function_outgoing_args_size);
3256 slot = gen_rtx_MEM (Pmode, address);
3258 emit_move_insn (pic_offset_table_rtx, slot);
3259 if (!TARGET_EXPLICIT_RELOCS)
3260 emit_insn (gen_blockage ());
3263 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)). */
3265 static void
3266 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
3268 emit_insn (gen_rtx_SET (VOIDmode, target,
3269 gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
3272 /* Return true if CMP1 is a suitable second operand for relational
3273 operator CODE. See also the *sCC patterns in mips.md. */
3275 static bool
3276 mips_relational_operand_ok_p (enum rtx_code code, rtx cmp1)
3278 switch (code)
3280 case GT:
3281 case GTU:
3282 return reg_or_0_operand (cmp1, VOIDmode);
3284 case GE:
3285 case GEU:
3286 return !TARGET_MIPS16 && cmp1 == const1_rtx;
3288 case LT:
3289 case LTU:
3290 return arith_operand (cmp1, VOIDmode);
3292 case LE:
3293 return sle_operand (cmp1, VOIDmode);
3295 case LEU:
3296 return sleu_operand (cmp1, VOIDmode);
3298 default:
3299 gcc_unreachable ();
3303 /* Canonicalize LE or LEU comparisons into LT comparisons when
3304 possible to avoid extra instructions or inverting the
3305 comparison. */
3307 static bool
3308 mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1,
3309 enum machine_mode mode)
3311 HOST_WIDE_INT original, plus_one;
3313 if (GET_CODE (*cmp1) != CONST_INT)
3314 return false;
3316 original = INTVAL (*cmp1);
3317 plus_one = trunc_int_for_mode ((unsigned HOST_WIDE_INT) original + 1, mode);
3319 switch (*code)
3321 case LE:
3322 if (original < plus_one)
3324 *code = LT;
3325 *cmp1 = force_reg (mode, GEN_INT (plus_one));
3326 return true;
3328 break;
3330 case LEU:
3331 if (plus_one != 0)
3333 *code = LTU;
3334 *cmp1 = force_reg (mode, GEN_INT (plus_one));
3335 return true;
3337 break;
3339 default:
3340 return false;
3343 return false;
3347 /* Compare CMP0 and CMP1 using relational operator CODE and store the
3348 result in TARGET. CMP0 and TARGET are register_operands that have
3349 the same integer mode. If INVERT_PTR is nonnull, it's OK to set
3350 TARGET to the inverse of the result and flip *INVERT_PTR instead. */
3352 static void
3353 mips_emit_int_relational (enum rtx_code code, bool *invert_ptr,
3354 rtx target, rtx cmp0, rtx cmp1)
3356 /* First see if there is a MIPS instruction that can do this operation
3357 with CMP1 in its current form. If not, try to canonicalize the
3358 comparison to LT. If that fails, try doing the same for the
3359 inverse operation. If that also fails, force CMP1 into a register
3360 and try again. */
3361 if (mips_relational_operand_ok_p (code, cmp1))
3362 mips_emit_binary (code, target, cmp0, cmp1);
3363 else if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
3364 mips_emit_binary (code, target, cmp0, cmp1);
3365 else
3367 enum rtx_code inv_code = reverse_condition (code);
3368 if (!mips_relational_operand_ok_p (inv_code, cmp1))
3370 cmp1 = force_reg (GET_MODE (cmp0), cmp1);
3371 mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1);
3373 else if (invert_ptr == 0)
3375 rtx inv_target = gen_reg_rtx (GET_MODE (target));
3376 mips_emit_binary (inv_code, inv_target, cmp0, cmp1);
3377 mips_emit_binary (XOR, target, inv_target, const1_rtx);
3379 else
3381 *invert_ptr = !*invert_ptr;
3382 mips_emit_binary (inv_code, target, cmp0, cmp1);
3387 /* Return a register that is zero iff CMP0 and CMP1 are equal.
3388 The register will have the same mode as CMP0. */
3390 static rtx
3391 mips_zero_if_equal (rtx cmp0, rtx cmp1)
3393 if (cmp1 == const0_rtx)
3394 return cmp0;
3396 if (uns_arith_operand (cmp1, VOIDmode))
3397 return expand_binop (GET_MODE (cmp0), xor_optab,
3398 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3400 return expand_binop (GET_MODE (cmp0), sub_optab,
3401 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3404 /* Convert *CODE into a code that can be used in a floating-point
3405 scc instruction (c.<cond>.<fmt>). Return true if the values of
3406 the condition code registers will be inverted, with 0 indicating
3407 that the condition holds. */
3409 static bool
3410 mips_reverse_fp_cond_p (enum rtx_code *code)
3412 switch (*code)
3414 case NE:
3415 case LTGT:
3416 case ORDERED:
3417 *code = reverse_condition_maybe_unordered (*code);
3418 return true;
3420 default:
3421 return false;
3425 /* Convert a comparison into something that can be used in a branch or
3426 conditional move. cmp_operands[0] and cmp_operands[1] are the values
3427 being compared and *CODE is the code used to compare them.
3429 Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
3430 If NEED_EQ_NE_P, then only EQ/NE comparisons against zero are possible,
3431 otherwise any standard branch condition can be used. The standard branch
3432 conditions are:
3434 - EQ/NE between two registers.
3435 - any comparison between a register and zero. */
3437 static void
3438 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
3440 if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT)
3442 if (!need_eq_ne_p && cmp_operands[1] == const0_rtx)
3444 *op0 = cmp_operands[0];
3445 *op1 = cmp_operands[1];
3447 else if (*code == EQ || *code == NE)
3449 if (need_eq_ne_p)
3451 *op0 = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3452 *op1 = const0_rtx;
3454 else
3456 *op0 = cmp_operands[0];
3457 *op1 = force_reg (GET_MODE (*op0), cmp_operands[1]);
3460 else
3462 /* The comparison needs a separate scc instruction. Store the
3463 result of the scc in *OP0 and compare it against zero. */
3464 bool invert = false;
3465 *op0 = gen_reg_rtx (GET_MODE (cmp_operands[0]));
3466 *op1 = const0_rtx;
3467 mips_emit_int_relational (*code, &invert, *op0,
3468 cmp_operands[0], cmp_operands[1]);
3469 *code = (invert ? EQ : NE);
3472 else
3474 enum rtx_code cmp_code;
3476 /* Floating-point tests use a separate c.cond.fmt comparison to
3477 set a condition code register. The branch or conditional move
3478 will then compare that register against zero.
3480 Set CMP_CODE to the code of the comparison instruction and
3481 *CODE to the code that the branch or move should use. */
3482 cmp_code = *code;
3483 *code = mips_reverse_fp_cond_p (&cmp_code) ? EQ : NE;
3484 *op0 = (ISA_HAS_8CC
3485 ? gen_reg_rtx (CCmode)
3486 : gen_rtx_REG (CCmode, FPSW_REGNUM));
3487 *op1 = const0_rtx;
3488 mips_emit_binary (cmp_code, *op0, cmp_operands[0], cmp_operands[1]);
3492 /* Try comparing cmp_operands[0] and cmp_operands[1] using rtl code CODE.
3493 Store the result in TARGET and return true if successful.
3495 On 64-bit targets, TARGET may be wider than cmp_operands[0]. */
3497 bool
3498 mips_emit_scc (enum rtx_code code, rtx target)
3500 if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) != MODE_INT)
3501 return false;
3503 target = gen_lowpart (GET_MODE (cmp_operands[0]), target);
3504 if (code == EQ || code == NE)
3506 rtx zie = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3507 mips_emit_binary (code, target, zie, const0_rtx);
3509 else
3510 mips_emit_int_relational (code, 0, target,
3511 cmp_operands[0], cmp_operands[1]);
3512 return true;
3515 /* Emit the common code for doing conditional branches.
3516 operand[0] is the label to jump to.
3517 The comparison operands are saved away by cmp{si,di,sf,df}. */
3519 void
3520 gen_conditional_branch (rtx *operands, enum rtx_code code)
3522 rtx op0, op1, condition;
3524 mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
3525 condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
3526 emit_jump_insn (gen_condjump (condition, operands[0]));
3529 /* Implement:
3531 (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
3532 (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS)) */
3534 void
3535 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
3536 enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
3538 rtx cmp_result;
3539 bool reversed_p;
3541 reversed_p = mips_reverse_fp_cond_p (&cond);
3542 cmp_result = gen_reg_rtx (CCV2mode);
3543 emit_insn (gen_scc_ps (cmp_result,
3544 gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
3545 if (reversed_p)
3546 emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
3547 cmp_result));
3548 else
3549 emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
3550 cmp_result));
3553 /* Emit the common code for conditional moves. OPERANDS is the array
3554 of operands passed to the conditional move define_expand. */
3556 void
3557 gen_conditional_move (rtx *operands)
3559 enum rtx_code code;
3560 rtx op0, op1;
3562 code = GET_CODE (operands[1]);
3563 mips_emit_compare (&code, &op0, &op1, true);
3564 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3565 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
3566 gen_rtx_fmt_ee (code,
3567 GET_MODE (op0),
3568 op0, op1),
3569 operands[2], operands[3])));
3572 /* Emit a conditional trap. OPERANDS is the array of operands passed to
3573 the conditional_trap expander. */
3575 void
3576 mips_gen_conditional_trap (rtx *operands)
3578 rtx op0, op1;
3579 enum rtx_code cmp_code = GET_CODE (operands[0]);
3580 enum machine_mode mode = GET_MODE (cmp_operands[0]);
3582 /* MIPS conditional trap machine instructions don't have GT or LE
3583 flavors, so we must invert the comparison and convert to LT and
3584 GE, respectively. */
3585 switch (cmp_code)
3587 case GT: cmp_code = LT; break;
3588 case LE: cmp_code = GE; break;
3589 case GTU: cmp_code = LTU; break;
3590 case LEU: cmp_code = GEU; break;
3591 default: break;
3593 if (cmp_code == GET_CODE (operands[0]))
3595 op0 = cmp_operands[0];
3596 op1 = cmp_operands[1];
3598 else
3600 op0 = cmp_operands[1];
3601 op1 = cmp_operands[0];
3603 op0 = force_reg (mode, op0);
3604 if (!arith_operand (op1, mode))
3605 op1 = force_reg (mode, op1);
3607 emit_insn (gen_rtx_TRAP_IF (VOIDmode,
3608 gen_rtx_fmt_ee (cmp_code, mode, op0, op1),
3609 operands[1]));
3612 /* Return true if calls to X can use R_MIPS_CALL* relocations. */
3614 static bool
3615 mips_ok_for_lazy_binding_p (rtx x)
3617 return (TARGET_USE_GOT
3618 && GET_CODE (x) == SYMBOL_REF
3619 && !mips_symbol_binds_local_p (x));
3622 /* Load function address ADDR into register DEST. SIBCALL_P is true
3623 if the address is needed for a sibling call. */
3625 static void
3626 mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
3628 /* If we're generating PIC, and this call is to a global function,
3629 try to allow its address to be resolved lazily. This isn't
3630 possible if TARGET_CALL_SAVED_GP since the value of $gp on entry
3631 to the stub would be our caller's gp, not ours. */
3632 if (TARGET_EXPLICIT_RELOCS
3633 && !(sibcall_p && TARGET_CALL_SAVED_GP)
3634 && mips_ok_for_lazy_binding_p (addr))
3636 rtx high, lo_sum_symbol;
3638 high = mips_unspec_offset_high (dest, pic_offset_table_rtx,
3639 addr, SYMBOL_GOTOFF_CALL);
3640 lo_sum_symbol = mips_unspec_address (addr, SYMBOL_GOTOFF_CALL);
3641 if (Pmode == SImode)
3642 emit_insn (gen_load_callsi (dest, high, lo_sum_symbol));
3643 else
3644 emit_insn (gen_load_calldi (dest, high, lo_sum_symbol));
3646 else
3647 emit_move_insn (dest, addr);
3651 /* Expand a call or call_value instruction. RESULT is where the
3652 result will go (null for calls), ADDR is the address of the
3653 function, ARGS_SIZE is the size of the arguments and AUX is
3654 the value passed to us by mips_function_arg. SIBCALL_P is true
3655 if we are expanding a sibling call, false if we're expanding
3656 a normal call. */
3658 void
3659 mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p)
3661 rtx orig_addr, pattern, insn;
3663 orig_addr = addr;
3664 if (!call_insn_operand (addr, VOIDmode))
3666 addr = gen_reg_rtx (Pmode);
3667 mips_load_call_address (addr, orig_addr, sibcall_p);
3670 if (mips16_hard_float
3671 && build_mips16_call_stub (result, addr, args_size,
3672 aux == 0 ? 0 : (int) GET_MODE (aux)))
3673 return;
3675 if (result == 0)
3676 pattern = (sibcall_p
3677 ? gen_sibcall_internal (addr, args_size)
3678 : gen_call_internal (addr, args_size));
3679 else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
3681 rtx reg1, reg2;
3683 reg1 = XEXP (XVECEXP (result, 0, 0), 0);
3684 reg2 = XEXP (XVECEXP (result, 0, 1), 0);
3685 pattern =
3686 (sibcall_p
3687 ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
3688 : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
3690 else
3691 pattern = (sibcall_p
3692 ? gen_sibcall_value_internal (result, addr, args_size)
3693 : gen_call_value_internal (result, addr, args_size));
3695 insn = emit_call_insn (pattern);
3697 /* Lazy-binding stubs require $gp to be valid on entry. */
3698 if (mips_ok_for_lazy_binding_p (orig_addr))
3699 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
3703 /* We can handle any sibcall when TARGET_SIBCALLS is true. */
3705 static bool
3706 mips_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
3707 tree exp ATTRIBUTE_UNUSED)
3709 return TARGET_SIBCALLS;
3712 /* Emit code to move general operand SRC into condition-code
3713 register DEST. SCRATCH is a scratch TFmode float register.
3714 The sequence is:
3716 FP1 = SRC
3717 FP2 = 0.0f
3718 DEST = FP2 < FP1
3720 where FP1 and FP2 are single-precision float registers
3721 taken from SCRATCH. */
3723 void
3724 mips_emit_fcc_reload (rtx dest, rtx src, rtx scratch)
3726 rtx fp1, fp2;
3728 /* Change the source to SFmode. */
3729 if (MEM_P (src))
3730 src = adjust_address (src, SFmode, 0);
3731 else if (REG_P (src) || GET_CODE (src) == SUBREG)
3732 src = gen_rtx_REG (SFmode, true_regnum (src));
3734 fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
3735 fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
3737 emit_move_insn (copy_rtx (fp1), src);
3738 emit_move_insn (copy_rtx (fp2), CONST0_RTX (SFmode));
3739 emit_insn (gen_slt_sf (dest, fp2, fp1));
3742 /* Emit code to change the current function's return address to
3743 ADDRESS. SCRATCH is available as a scratch register, if needed.
3744 ADDRESS and SCRATCH are both word-mode GPRs. */
3746 void
3747 mips_set_return_address (rtx address, rtx scratch)
3749 rtx slot_address;
3751 compute_frame_size (get_frame_size ());
3752 gcc_assert ((cfun->machine->frame.mask >> 31) & 1);
3753 slot_address = mips_add_offset (scratch, stack_pointer_rtx,
3754 cfun->machine->frame.gp_sp_offset);
3756 emit_move_insn (gen_rtx_MEM (GET_MODE (address), slot_address), address);
3759 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
3760 Assume that the areas do not overlap. */
3762 static void
3763 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
3765 HOST_WIDE_INT offset, delta;
3766 unsigned HOST_WIDE_INT bits;
3767 int i;
3768 enum machine_mode mode;
3769 rtx *regs;
3771 /* Work out how many bits to move at a time. If both operands have
3772 half-word alignment, it is usually better to move in half words.
3773 For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
3774 and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
3775 Otherwise move word-sized chunks. */
3776 if (MEM_ALIGN (src) == BITS_PER_WORD / 2
3777 && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
3778 bits = BITS_PER_WORD / 2;
3779 else
3780 bits = BITS_PER_WORD;
3782 mode = mode_for_size (bits, MODE_INT, 0);
3783 delta = bits / BITS_PER_UNIT;
3785 /* Allocate a buffer for the temporary registers. */
3786 regs = alloca (sizeof (rtx) * length / delta);
3788 /* Load as many BITS-sized chunks as possible. Use a normal load if
3789 the source has enough alignment, otherwise use left/right pairs. */
3790 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3792 regs[i] = gen_reg_rtx (mode);
3793 if (MEM_ALIGN (src) >= bits)
3794 emit_move_insn (regs[i], adjust_address (src, mode, offset));
3795 else
3797 rtx part = adjust_address (src, BLKmode, offset);
3798 if (!mips_expand_unaligned_load (regs[i], part, bits, 0))
3799 gcc_unreachable ();
3803 /* Copy the chunks to the destination. */
3804 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3805 if (MEM_ALIGN (dest) >= bits)
3806 emit_move_insn (adjust_address (dest, mode, offset), regs[i]);
3807 else
3809 rtx part = adjust_address (dest, BLKmode, offset);
3810 if (!mips_expand_unaligned_store (part, regs[i], bits, 0))
3811 gcc_unreachable ();
3814 /* Mop up any left-over bytes. */
3815 if (offset < length)
3817 src = adjust_address (src, BLKmode, offset);
3818 dest = adjust_address (dest, BLKmode, offset);
3819 move_by_pieces (dest, src, length - offset,
3820 MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
3824 #define MAX_MOVE_REGS 4
3825 #define MAX_MOVE_BYTES (MAX_MOVE_REGS * UNITS_PER_WORD)
3828 /* Helper function for doing a loop-based block operation on memory
3829 reference MEM. Each iteration of the loop will operate on LENGTH
3830 bytes of MEM.
3832 Create a new base register for use within the loop and point it to
3833 the start of MEM. Create a new memory reference that uses this
3834 register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
3836 static void
3837 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
3838 rtx *loop_reg, rtx *loop_mem)
3840 *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
3842 /* Although the new mem does not refer to a known location,
3843 it does keep up to LENGTH bytes of alignment. */
3844 *loop_mem = change_address (mem, BLKmode, *loop_reg);
3845 set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
3849 /* Move LENGTH bytes from SRC to DEST using a loop that moves MAX_MOVE_BYTES
3850 per iteration. LENGTH must be at least MAX_MOVE_BYTES. Assume that the
3851 memory regions do not overlap. */
3853 static void
3854 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length)
3856 rtx label, src_reg, dest_reg, final_src;
3857 HOST_WIDE_INT leftover;
3859 leftover = length % MAX_MOVE_BYTES;
3860 length -= leftover;
3862 /* Create registers and memory references for use within the loop. */
3863 mips_adjust_block_mem (src, MAX_MOVE_BYTES, &src_reg, &src);
3864 mips_adjust_block_mem (dest, MAX_MOVE_BYTES, &dest_reg, &dest);
3866 /* Calculate the value that SRC_REG should have after the last iteration
3867 of the loop. */
3868 final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
3869 0, 0, OPTAB_WIDEN);
3871 /* Emit the start of the loop. */
3872 label = gen_label_rtx ();
3873 emit_label (label);
3875 /* Emit the loop body. */
3876 mips_block_move_straight (dest, src, MAX_MOVE_BYTES);
3878 /* Move on to the next block. */
3879 emit_move_insn (src_reg, plus_constant (src_reg, MAX_MOVE_BYTES));
3880 emit_move_insn (dest_reg, plus_constant (dest_reg, MAX_MOVE_BYTES));
3882 /* Emit the loop condition. */
3883 if (Pmode == DImode)
3884 emit_insn (gen_cmpdi (src_reg, final_src));
3885 else
3886 emit_insn (gen_cmpsi (src_reg, final_src));
3887 emit_jump_insn (gen_bne (label));
3889 /* Mop up any left-over bytes. */
3890 if (leftover)
3891 mips_block_move_straight (dest, src, leftover);
3895 /* Expand a loop of synci insns for the address range [BEGIN, END). */
3897 void
3898 mips_expand_synci_loop (rtx begin, rtx end)
3900 rtx inc, label, cmp, cmp_result;
3902 /* Load INC with the cache line size (rdhwr INC,$1). */
3903 inc = gen_reg_rtx (SImode);
3904 emit_insn (gen_rdhwr (inc, const1_rtx));
3906 /* Loop back to here. */
3907 label = gen_label_rtx ();
3908 emit_label (label);
3910 emit_insn (gen_synci (begin));
3912 cmp = gen_reg_rtx (Pmode);
3913 mips_emit_binary (GTU, cmp, begin, end);
3915 mips_emit_binary (PLUS, begin, begin, inc);
3917 cmp_result = gen_rtx_EQ (VOIDmode, cmp, const0_rtx);
3918 emit_jump_insn (gen_condjump (cmp_result, label));
3921 /* Expand a movmemsi instruction. */
3923 bool
3924 mips_expand_block_move (rtx dest, rtx src, rtx length)
3926 if (GET_CODE (length) == CONST_INT)
3928 if (INTVAL (length) <= 2 * MAX_MOVE_BYTES)
3930 mips_block_move_straight (dest, src, INTVAL (length));
3931 return true;
3933 else if (optimize)
3935 mips_block_move_loop (dest, src, INTVAL (length));
3936 return true;
3939 return false;
3942 /* Argument support functions. */
3944 /* Initialize CUMULATIVE_ARGS for a function. */
3946 void
3947 init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
3948 rtx libname ATTRIBUTE_UNUSED)
3950 static CUMULATIVE_ARGS zero_cum;
3951 tree param, next_param;
3953 *cum = zero_cum;
3954 cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
3956 /* Determine if this function has variable arguments. This is
3957 indicated by the last argument being 'void_type_mode' if there
3958 are no variable arguments. The standard MIPS calling sequence
3959 passes all arguments in the general purpose registers in this case. */
3961 for (param = fntype ? TYPE_ARG_TYPES (fntype) : 0;
3962 param != 0; param = next_param)
3964 next_param = TREE_CHAIN (param);
3965 if (next_param == 0 && TREE_VALUE (param) != void_type_node)
3966 cum->gp_reg_found = 1;
3971 /* Fill INFO with information about a single argument. CUM is the
3972 cumulative state for earlier arguments. MODE is the mode of this
3973 argument and TYPE is its type (if known). NAMED is true if this
3974 is a named (fixed) argument rather than a variable one. */
3976 static void
3977 mips_arg_info (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
3978 tree type, int named, struct mips_arg_info *info)
3980 bool doubleword_aligned_p;
3981 unsigned int num_bytes, num_words, max_regs;
3983 /* Work out the size of the argument. */
3984 num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
3985 num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3987 /* Decide whether it should go in a floating-point register, assuming
3988 one is free. Later code checks for availability.
3990 The checks against UNITS_PER_FPVALUE handle the soft-float and
3991 single-float cases. */
3992 switch (mips_abi)
3994 case ABI_EABI:
3995 /* The EABI conventions have traditionally been defined in terms
3996 of TYPE_MODE, regardless of the actual type. */
3997 info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
3998 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
3999 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4000 break;
4002 case ABI_32:
4003 case ABI_O64:
4004 /* Only leading floating-point scalars are passed in
4005 floating-point registers. We also handle vector floats the same
4006 say, which is OK because they are not covered by the standard ABI. */
4007 info->fpr_p = (!cum->gp_reg_found
4008 && cum->arg_number < 2
4009 && (type == 0 || SCALAR_FLOAT_TYPE_P (type)
4010 || VECTOR_FLOAT_TYPE_P (type))
4011 && (GET_MODE_CLASS (mode) == MODE_FLOAT
4012 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4013 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4014 break;
4016 case ABI_N32:
4017 case ABI_64:
4018 /* Scalar and complex floating-point types are passed in
4019 floating-point registers. */
4020 info->fpr_p = (named
4021 && (type == 0 || FLOAT_TYPE_P (type))
4022 && (GET_MODE_CLASS (mode) == MODE_FLOAT
4023 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4024 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4025 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4027 /* ??? According to the ABI documentation, the real and imaginary
4028 parts of complex floats should be passed in individual registers.
4029 The real and imaginary parts of stack arguments are supposed
4030 to be contiguous and there should be an extra word of padding
4031 at the end.
4033 This has two problems. First, it makes it impossible to use a
4034 single "void *" va_list type, since register and stack arguments
4035 are passed differently. (At the time of writing, MIPSpro cannot
4036 handle complex float varargs correctly.) Second, it's unclear
4037 what should happen when there is only one register free.
4039 For now, we assume that named complex floats should go into FPRs
4040 if there are two FPRs free, otherwise they should be passed in the
4041 same way as a struct containing two floats. */
4042 if (info->fpr_p
4043 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4044 && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4046 if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4047 info->fpr_p = false;
4048 else
4049 num_words = 2;
4051 break;
4053 default:
4054 gcc_unreachable ();
4057 /* See whether the argument has doubleword alignment. */
4058 doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4060 /* Set REG_OFFSET to the register count we're interested in.
4061 The EABI allocates the floating-point registers separately,
4062 but the other ABIs allocate them like integer registers. */
4063 info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4064 ? cum->num_fprs
4065 : cum->num_gprs);
4067 /* Advance to an even register if the argument is doubleword-aligned. */
4068 if (doubleword_aligned_p)
4069 info->reg_offset += info->reg_offset & 1;
4071 /* Work out the offset of a stack argument. */
4072 info->stack_offset = cum->stack_words;
4073 if (doubleword_aligned_p)
4074 info->stack_offset += info->stack_offset & 1;
4076 max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4078 /* Partition the argument between registers and stack. */
4079 info->reg_words = MIN (num_words, max_regs);
4080 info->stack_words = num_words - info->reg_words;
4084 /* INFO describes an argument that is passed in a single-register value.
4085 Return the register it uses, assuming that FPRs are available if
4086 HARD_FLOAT_P. */
4088 static unsigned int
4089 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4091 if (!info->fpr_p || !hard_float_p)
4092 return GP_ARG_FIRST + info->reg_offset;
4093 else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4094 /* In o32, the second argument is always passed in $f14
4095 for TARGET_DOUBLE_FLOAT, regardless of whether the
4096 first argument was a word or doubleword. */
4097 return FP_ARG_FIRST + 2;
4098 else
4099 return FP_ARG_FIRST + info->reg_offset;
4102 /* Implement FUNCTION_ARG_ADVANCE. */
4104 void
4105 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4106 tree type, int named)
4108 struct mips_arg_info info;
4110 mips_arg_info (cum, mode, type, named, &info);
4112 if (!info.fpr_p)
4113 cum->gp_reg_found = true;
4115 /* See the comment above the cumulative args structure in mips.h
4116 for an explanation of what this code does. It assumes the O32
4117 ABI, which passes at most 2 arguments in float registers. */
4118 if (cum->arg_number < 2 && info.fpr_p)
4119 cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4121 if (mips_abi != ABI_EABI || !info.fpr_p)
4122 cum->num_gprs = info.reg_offset + info.reg_words;
4123 else if (info.reg_words > 0)
4124 cum->num_fprs += MAX_FPRS_PER_FMT;
4126 if (info.stack_words > 0)
4127 cum->stack_words = info.stack_offset + info.stack_words;
4129 cum->arg_number++;
4132 /* Implement FUNCTION_ARG. */
4134 struct rtx_def *
4135 function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4136 tree type, int named)
4138 struct mips_arg_info info;
4140 /* We will be called with a mode of VOIDmode after the last argument
4141 has been seen. Whatever we return will be passed to the call
4142 insn. If we need a mips16 fp_code, return a REG with the code
4143 stored as the mode. */
4144 if (mode == VOIDmode)
4146 if (TARGET_MIPS16 && cum->fp_code != 0)
4147 return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4149 else
4150 return 0;
4153 mips_arg_info (cum, mode, type, named, &info);
4155 /* Return straight away if the whole argument is passed on the stack. */
4156 if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4157 return 0;
4159 if (type != 0
4160 && TREE_CODE (type) == RECORD_TYPE
4161 && TARGET_NEWABI
4162 && TYPE_SIZE_UNIT (type)
4163 && host_integerp (TYPE_SIZE_UNIT (type), 1)
4164 && named)
4166 /* The Irix 6 n32/n64 ABIs say that if any 64-bit chunk of the
4167 structure contains a double in its entirety, then that 64-bit
4168 chunk is passed in a floating point register. */
4169 tree field;
4171 /* First check to see if there is any such field. */
4172 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4173 if (TREE_CODE (field) == FIELD_DECL
4174 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4175 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4176 && host_integerp (bit_position (field), 0)
4177 && int_bit_position (field) % BITS_PER_WORD == 0)
4178 break;
4180 if (field != 0)
4182 /* Now handle the special case by returning a PARALLEL
4183 indicating where each 64-bit chunk goes. INFO.REG_WORDS
4184 chunks are passed in registers. */
4185 unsigned int i;
4186 HOST_WIDE_INT bitpos;
4187 rtx ret;
4189 /* assign_parms checks the mode of ENTRY_PARM, so we must
4190 use the actual mode here. */
4191 ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4193 bitpos = 0;
4194 field = TYPE_FIELDS (type);
4195 for (i = 0; i < info.reg_words; i++)
4197 rtx reg;
4199 for (; field; field = TREE_CHAIN (field))
4200 if (TREE_CODE (field) == FIELD_DECL
4201 && int_bit_position (field) >= bitpos)
4202 break;
4204 if (field
4205 && int_bit_position (field) == bitpos
4206 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4207 && !TARGET_SOFT_FLOAT
4208 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4209 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4210 else
4211 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4213 XVECEXP (ret, 0, i)
4214 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4215 GEN_INT (bitpos / BITS_PER_UNIT));
4217 bitpos += BITS_PER_WORD;
4219 return ret;
4223 /* Handle the n32/n64 conventions for passing complex floating-point
4224 arguments in FPR pairs. The real part goes in the lower register
4225 and the imaginary part goes in the upper register. */
4226 if (TARGET_NEWABI
4227 && info.fpr_p
4228 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4230 rtx real, imag;
4231 enum machine_mode inner;
4232 int reg;
4234 inner = GET_MODE_INNER (mode);
4235 reg = FP_ARG_FIRST + info.reg_offset;
4236 if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4238 /* Real part in registers, imaginary part on stack. */
4239 gcc_assert (info.stack_words == info.reg_words);
4240 return gen_rtx_REG (inner, reg);
4242 else
4244 gcc_assert (info.stack_words == 0);
4245 real = gen_rtx_EXPR_LIST (VOIDmode,
4246 gen_rtx_REG (inner, reg),
4247 const0_rtx);
4248 imag = gen_rtx_EXPR_LIST (VOIDmode,
4249 gen_rtx_REG (inner,
4250 reg + info.reg_words / 2),
4251 GEN_INT (GET_MODE_SIZE (inner)));
4252 return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4256 return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4260 /* Implement TARGET_ARG_PARTIAL_BYTES. */
4262 static int
4263 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4264 enum machine_mode mode, tree type, bool named)
4266 struct mips_arg_info info;
4268 mips_arg_info (cum, mode, type, named, &info);
4269 return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4273 /* Implement FUNCTION_ARG_BOUNDARY. Every parameter gets at least
4274 PARM_BOUNDARY bits of alignment, but will be given anything up
4275 to STACK_BOUNDARY bits if the type requires it. */
4278 function_arg_boundary (enum machine_mode mode, tree type)
4280 unsigned int alignment;
4282 alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4283 if (alignment < PARM_BOUNDARY)
4284 alignment = PARM_BOUNDARY;
4285 if (alignment > STACK_BOUNDARY)
4286 alignment = STACK_BOUNDARY;
4287 return alignment;
4290 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
4291 upward rather than downward. In other words, return true if the
4292 first byte of the stack slot has useful data, false if the last
4293 byte does. */
4295 bool
4296 mips_pad_arg_upward (enum machine_mode mode, tree type)
4298 /* On little-endian targets, the first byte of every stack argument
4299 is passed in the first byte of the stack slot. */
4300 if (!BYTES_BIG_ENDIAN)
4301 return true;
4303 /* Otherwise, integral types are padded downward: the last byte of a
4304 stack argument is passed in the last byte of the stack slot. */
4305 if (type != 0
4306 ? INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)
4307 : GET_MODE_CLASS (mode) == MODE_INT)
4308 return false;
4310 /* Big-endian o64 pads floating-point arguments downward. */
4311 if (mips_abi == ABI_O64)
4312 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4313 return false;
4315 /* Other types are padded upward for o32, o64, n32 and n64. */
4316 if (mips_abi != ABI_EABI)
4317 return true;
4319 /* Arguments smaller than a stack slot are padded downward. */
4320 if (mode != BLKmode)
4321 return (GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY);
4322 else
4323 return (int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT));
4327 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...). Return !BYTES_BIG_ENDIAN
4328 if the least significant byte of the register has useful data. Return
4329 the opposite if the most significant byte does. */
4331 bool
4332 mips_pad_reg_upward (enum machine_mode mode, tree type)
4334 /* No shifting is required for floating-point arguments. */
4335 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
4336 return !BYTES_BIG_ENDIAN;
4338 /* Otherwise, apply the same padding to register arguments as we do
4339 to stack arguments. */
4340 return mips_pad_arg_upward (mode, type);
4343 static void
4344 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4345 tree type, int *pretend_size ATTRIBUTE_UNUSED,
4346 int no_rtl)
4348 CUMULATIVE_ARGS local_cum;
4349 int gp_saved, fp_saved;
4351 /* The caller has advanced CUM up to, but not beyond, the last named
4352 argument. Advance a local copy of CUM past the last "real" named
4353 argument, to find out how many registers are left over. */
4355 local_cum = *cum;
4356 FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
4358 /* Found out how many registers we need to save. */
4359 gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
4360 fp_saved = (EABI_FLOAT_VARARGS_P
4361 ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
4362 : 0);
4364 if (!no_rtl)
4366 if (gp_saved > 0)
4368 rtx ptr, mem;
4370 ptr = plus_constant (virtual_incoming_args_rtx,
4371 REG_PARM_STACK_SPACE (cfun->decl)
4372 - gp_saved * UNITS_PER_WORD);
4373 mem = gen_rtx_MEM (BLKmode, ptr);
4374 set_mem_alias_set (mem, get_varargs_alias_set ());
4376 move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
4377 mem, gp_saved);
4379 if (fp_saved > 0)
4381 /* We can't use move_block_from_reg, because it will use
4382 the wrong mode. */
4383 enum machine_mode mode;
4384 int off, i;
4386 /* Set OFF to the offset from virtual_incoming_args_rtx of
4387 the first float register. The FP save area lies below
4388 the integer one, and is aligned to UNITS_PER_FPVALUE bytes. */
4389 off = -gp_saved * UNITS_PER_WORD;
4390 off &= ~(UNITS_PER_FPVALUE - 1);
4391 off -= fp_saved * UNITS_PER_FPREG;
4393 mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
4395 for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
4396 i += MAX_FPRS_PER_FMT)
4398 rtx ptr, mem;
4400 ptr = plus_constant (virtual_incoming_args_rtx, off);
4401 mem = gen_rtx_MEM (mode, ptr);
4402 set_mem_alias_set (mem, get_varargs_alias_set ());
4403 emit_move_insn (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
4404 off += UNITS_PER_HWFPVALUE;
4408 if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
4409 cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
4410 + fp_saved * UNITS_PER_FPREG);
4413 /* Create the va_list data type.
4414 We keep 3 pointers, and two offsets.
4415 Two pointers are to the overflow area, which starts at the CFA.
4416 One of these is constant, for addressing into the GPR save area below it.
4417 The other is advanced up the stack through the overflow region.
4418 The third pointer is to the GPR save area. Since the FPR save area
4419 is just below it, we can address FPR slots off this pointer.
4420 We also keep two one-byte offsets, which are to be subtracted from the
4421 constant pointers to yield addresses in the GPR and FPR save areas.
4422 These are downcounted as float or non-float arguments are used,
4423 and when they get to zero, the argument must be obtained from the
4424 overflow region.
4425 If !EABI_FLOAT_VARARGS_P, then no FPR save area exists, and a single
4426 pointer is enough. It's started at the GPR save area, and is
4427 advanced, period.
4428 Note that the GPR save area is not constant size, due to optimization
4429 in the prologue. Hence, we can't use a design with two pointers
4430 and two offsets, although we could have designed this with two pointers
4431 and three offsets. */
4433 static tree
4434 mips_build_builtin_va_list (void)
4436 if (EABI_FLOAT_VARARGS_P)
4438 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
4439 tree array, index;
4441 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
4443 f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
4444 ptr_type_node);
4445 f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
4446 ptr_type_node);
4447 f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
4448 ptr_type_node);
4449 f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
4450 unsigned_char_type_node);
4451 f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
4452 unsigned_char_type_node);
4453 /* Explicitly pad to the size of a pointer, so that -Wpadded won't
4454 warn on every user file. */
4455 index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
4456 array = build_array_type (unsigned_char_type_node,
4457 build_index_type (index));
4458 f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
4460 DECL_FIELD_CONTEXT (f_ovfl) = record;
4461 DECL_FIELD_CONTEXT (f_gtop) = record;
4462 DECL_FIELD_CONTEXT (f_ftop) = record;
4463 DECL_FIELD_CONTEXT (f_goff) = record;
4464 DECL_FIELD_CONTEXT (f_foff) = record;
4465 DECL_FIELD_CONTEXT (f_res) = record;
4467 TYPE_FIELDS (record) = f_ovfl;
4468 TREE_CHAIN (f_ovfl) = f_gtop;
4469 TREE_CHAIN (f_gtop) = f_ftop;
4470 TREE_CHAIN (f_ftop) = f_goff;
4471 TREE_CHAIN (f_goff) = f_foff;
4472 TREE_CHAIN (f_foff) = f_res;
4474 layout_type (record);
4475 return record;
4477 else if (TARGET_IRIX && TARGET_IRIX6)
4478 /* On IRIX 6, this type is 'char *'. */
4479 return build_pointer_type (char_type_node);
4480 else
4481 /* Otherwise, we use 'void *'. */
4482 return ptr_type_node;
4485 /* Implement va_start. */
4487 void
4488 mips_va_start (tree valist, rtx nextarg)
4490 if (EABI_FLOAT_VARARGS_P)
4492 const CUMULATIVE_ARGS *cum;
4493 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4494 tree ovfl, gtop, ftop, goff, foff;
4495 tree t;
4496 int gpr_save_area_size;
4497 int fpr_save_area_size;
4498 int fpr_offset;
4500 cum = &current_function_args_info;
4501 gpr_save_area_size
4502 = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
4503 fpr_save_area_size
4504 = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
4506 f_ovfl = TYPE_FIELDS (va_list_type_node);
4507 f_gtop = TREE_CHAIN (f_ovfl);
4508 f_ftop = TREE_CHAIN (f_gtop);
4509 f_goff = TREE_CHAIN (f_ftop);
4510 f_foff = TREE_CHAIN (f_goff);
4512 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4513 NULL_TREE);
4514 gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4515 NULL_TREE);
4516 ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4517 NULL_TREE);
4518 goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4519 NULL_TREE);
4520 foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4521 NULL_TREE);
4523 /* Emit code to initialize OVFL, which points to the next varargs
4524 stack argument. CUM->STACK_WORDS gives the number of stack
4525 words used by named arguments. */
4526 t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
4527 if (cum->stack_words > 0)
4528 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
4529 size_int (cum->stack_words * UNITS_PER_WORD));
4530 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4531 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4533 /* Emit code to initialize GTOP, the top of the GPR save area. */
4534 t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
4535 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (gtop), gtop, t);
4536 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4538 /* Emit code to initialize FTOP, the top of the FPR save area.
4539 This address is gpr_save_area_bytes below GTOP, rounded
4540 down to the next fp-aligned boundary. */
4541 t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
4542 fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
4543 fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
4544 if (fpr_offset)
4545 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
4546 size_int (-fpr_offset));
4547 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ftop), ftop, t);
4548 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4550 /* Emit code to initialize GOFF, the offset from GTOP of the
4551 next GPR argument. */
4552 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (goff), goff,
4553 build_int_cst (NULL_TREE, gpr_save_area_size));
4554 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4556 /* Likewise emit code to initialize FOFF, the offset from FTOP
4557 of the next FPR argument. */
4558 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (foff), foff,
4559 build_int_cst (NULL_TREE, fpr_save_area_size));
4560 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4562 else
4564 nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
4565 std_expand_builtin_va_start (valist, nextarg);
4569 /* Implement va_arg. */
4571 static tree
4572 mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
4574 HOST_WIDE_INT size, rsize;
4575 tree addr;
4576 bool indirect;
4578 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
4580 if (indirect)
4581 type = build_pointer_type (type);
4583 size = int_size_in_bytes (type);
4584 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
4586 if (mips_abi != ABI_EABI || !EABI_FLOAT_VARARGS_P)
4587 addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4588 else
4590 /* Not a simple merged stack. */
4592 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4593 tree ovfl, top, off, align;
4594 HOST_WIDE_INT osize;
4595 tree t, u;
4597 f_ovfl = TYPE_FIELDS (va_list_type_node);
4598 f_gtop = TREE_CHAIN (f_ovfl);
4599 f_ftop = TREE_CHAIN (f_gtop);
4600 f_goff = TREE_CHAIN (f_ftop);
4601 f_foff = TREE_CHAIN (f_goff);
4603 /* We maintain separate pointers and offsets for floating-point
4604 and integer arguments, but we need similar code in both cases.
4605 Let:
4607 TOP be the top of the register save area;
4608 OFF be the offset from TOP of the next register;
4609 ADDR_RTX be the address of the argument;
4610 RSIZE be the number of bytes used to store the argument
4611 when it's in the register save area;
4612 OSIZE be the number of bytes used to store it when it's
4613 in the stack overflow area; and
4614 PADDING be (BYTES_BIG_ENDIAN ? OSIZE - RSIZE : 0)
4616 The code we want is:
4618 1: off &= -rsize; // round down
4619 2: if (off != 0)
4620 3: {
4621 4: addr_rtx = top - off;
4622 5: off -= rsize;
4623 6: }
4624 7: else
4625 8: {
4626 9: ovfl += ((intptr_t) ovfl + osize - 1) & -osize;
4627 10: addr_rtx = ovfl + PADDING;
4628 11: ovfl += osize;
4629 14: }
4631 [1] and [9] can sometimes be optimized away. */
4633 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4634 NULL_TREE);
4636 if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
4637 && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
4639 top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4640 NULL_TREE);
4641 off = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4642 NULL_TREE);
4644 /* When floating-point registers are saved to the stack,
4645 each one will take up UNITS_PER_HWFPVALUE bytes, regardless
4646 of the float's precision. */
4647 rsize = UNITS_PER_HWFPVALUE;
4649 /* Overflow arguments are padded to UNITS_PER_WORD bytes
4650 (= PARM_BOUNDARY bits). This can be different from RSIZE
4651 in two cases:
4653 (1) On 32-bit targets when TYPE is a structure such as:
4655 struct s { float f; };
4657 Such structures are passed in paired FPRs, so RSIZE
4658 will be 8 bytes. However, the structure only takes
4659 up 4 bytes of memory, so OSIZE will only be 4.
4661 (2) In combinations such as -mgp64 -msingle-float
4662 -fshort-double. Doubles passed in registers
4663 will then take up 4 (UNITS_PER_HWFPVALUE) bytes,
4664 but those passed on the stack take up
4665 UNITS_PER_WORD bytes. */
4666 osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
4668 else
4670 top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4671 NULL_TREE);
4672 off = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4673 NULL_TREE);
4674 if (rsize > UNITS_PER_WORD)
4676 /* [1] Emit code for: off &= -rsize. */
4677 t = build2 (BIT_AND_EXPR, TREE_TYPE (off), off,
4678 build_int_cst (NULL_TREE, -rsize));
4679 t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (off), off, t);
4680 gimplify_and_add (t, pre_p);
4682 osize = rsize;
4685 /* [2] Emit code to branch if off == 0. */
4686 t = build2 (NE_EXPR, boolean_type_node, off,
4687 build_int_cst (TREE_TYPE (off), 0));
4688 addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
4690 /* [5] Emit code for: off -= rsize. We do this as a form of
4691 post-increment not available to C. Also widen for the
4692 coming pointer arithmetic. */
4693 t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
4694 t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
4695 t = fold_convert (sizetype, t);
4696 t = fold_build1 (NEGATE_EXPR, sizetype, t);
4698 /* [4] Emit code for: addr_rtx = top - off. On big endian machines,
4699 the argument has RSIZE - SIZE bytes of leading padding. */
4700 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
4701 if (BYTES_BIG_ENDIAN && rsize > size)
4703 u = size_int (rsize - size);
4704 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
4706 COND_EXPR_THEN (addr) = t;
4708 if (osize > UNITS_PER_WORD)
4710 /* [9] Emit: ovfl += ((intptr_t) ovfl + osize - 1) & -osize. */
4711 u = size_int (osize - 1);
4712 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
4713 t = fold_convert (sizetype, t);
4714 u = size_int (-osize);
4715 t = build2 (BIT_AND_EXPR, sizetype, t, u);
4716 t = fold_convert (TREE_TYPE (ovfl), t);
4717 align = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (ovfl), ovfl, t);
4719 else
4720 align = NULL;
4722 /* [10, 11]. Emit code to store ovfl in addr_rtx, then
4723 post-increment ovfl by osize. On big-endian machines,
4724 the argument has OSIZE - SIZE bytes of leading padding. */
4725 u = fold_convert (TREE_TYPE (ovfl),
4726 build_int_cst (NULL_TREE, osize));
4727 t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
4728 if (BYTES_BIG_ENDIAN && osize > size)
4730 u = size_int (osize - size);
4731 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
4734 /* String [9] and [10,11] together. */
4735 if (align)
4736 t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
4737 COND_EXPR_ELSE (addr) = t;
4739 addr = fold_convert (build_pointer_type (type), addr);
4740 addr = build_va_arg_indirect_ref (addr);
4743 if (indirect)
4744 addr = build_va_arg_indirect_ref (addr);
4746 return addr;
4749 /* Return true if it is possible to use left/right accesses for a
4750 bitfield of WIDTH bits starting BITPOS bits into *OP. When
4751 returning true, update *OP, *LEFT and *RIGHT as follows:
4753 *OP is a BLKmode reference to the whole field.
4755 *LEFT is a QImode reference to the first byte if big endian or
4756 the last byte if little endian. This address can be used in the
4757 left-side instructions (lwl, swl, ldl, sdl).
4759 *RIGHT is a QImode reference to the opposite end of the field and
4760 can be used in the patterning right-side instruction. */
4762 static bool
4763 mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
4764 rtx *left, rtx *right)
4766 rtx first, last;
4768 /* Check that the operand really is a MEM. Not all the extv and
4769 extzv predicates are checked. */
4770 if (!MEM_P (*op))
4771 return false;
4773 /* Check that the size is valid. */
4774 if (width != 32 && (!TARGET_64BIT || width != 64))
4775 return false;
4777 /* We can only access byte-aligned values. Since we are always passed
4778 a reference to the first byte of the field, it is not necessary to
4779 do anything with BITPOS after this check. */
4780 if (bitpos % BITS_PER_UNIT != 0)
4781 return false;
4783 /* Reject aligned bitfields: we want to use a normal load or store
4784 instead of a left/right pair. */
4785 if (MEM_ALIGN (*op) >= width)
4786 return false;
4788 /* Adjust *OP to refer to the whole field. This also has the effect
4789 of legitimizing *OP's address for BLKmode, possibly simplifying it. */
4790 *op = adjust_address (*op, BLKmode, 0);
4791 set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
4793 /* Get references to both ends of the field. We deliberately don't
4794 use the original QImode *OP for FIRST since the new BLKmode one
4795 might have a simpler address. */
4796 first = adjust_address (*op, QImode, 0);
4797 last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
4799 /* Allocate to LEFT and RIGHT according to endianness. LEFT should
4800 be the upper word and RIGHT the lower word. */
4801 if (TARGET_BIG_ENDIAN)
4802 *left = first, *right = last;
4803 else
4804 *left = last, *right = first;
4806 return true;
4810 /* Try to emit the equivalent of (set DEST (zero_extract SRC WIDTH BITPOS)).
4811 Return true on success. We only handle cases where zero_extract is
4812 equivalent to sign_extract. */
4814 bool
4815 mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
4817 rtx left, right, temp;
4819 /* If TARGET_64BIT, the destination of a 32-bit load will be a
4820 paradoxical word_mode subreg. This is the only case in which
4821 we allow the destination to be larger than the source. */
4822 if (GET_CODE (dest) == SUBREG
4823 && GET_MODE (dest) == DImode
4824 && SUBREG_BYTE (dest) == 0
4825 && GET_MODE (SUBREG_REG (dest)) == SImode)
4826 dest = SUBREG_REG (dest);
4828 /* After the above adjustment, the destination must be the same
4829 width as the source. */
4830 if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
4831 return false;
4833 if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
4834 return false;
4836 temp = gen_reg_rtx (GET_MODE (dest));
4837 if (GET_MODE (dest) == DImode)
4839 emit_insn (gen_mov_ldl (temp, src, left));
4840 emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
4842 else
4844 emit_insn (gen_mov_lwl (temp, src, left));
4845 emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
4847 return true;
4851 /* Try to expand (set (zero_extract DEST WIDTH BITPOS) SRC). Return
4852 true on success. */
4854 bool
4855 mips_expand_unaligned_store (rtx dest, rtx src, unsigned int width, int bitpos)
4857 rtx left, right;
4858 enum machine_mode mode;
4860 if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
4861 return false;
4863 mode = mode_for_size (width, MODE_INT, 0);
4864 src = gen_lowpart (mode, src);
4866 if (mode == DImode)
4868 emit_insn (gen_mov_sdl (dest, src, left));
4869 emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
4871 else
4873 emit_insn (gen_mov_swl (dest, src, left));
4874 emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
4876 return true;
4879 /* Return true if X is a MEM with the same size as MODE. */
4881 bool
4882 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
4884 rtx size;
4886 if (!MEM_P (x))
4887 return false;
4889 size = MEM_SIZE (x);
4890 return size && INTVAL (size) == GET_MODE_SIZE (mode);
4893 /* Return true if (zero_extract OP SIZE POSITION) can be used as the
4894 source of an "ext" instruction or the destination of an "ins"
4895 instruction. OP must be a register operand and the following
4896 conditions must hold:
4898 0 <= POSITION < GET_MODE_BITSIZE (GET_MODE (op))
4899 0 < SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
4900 0 < POSITION + SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
4902 Also reject lengths equal to a word as they are better handled
4903 by the move patterns. */
4905 bool
4906 mips_use_ins_ext_p (rtx op, rtx size, rtx position)
4908 HOST_WIDE_INT len, pos;
4910 if (!ISA_HAS_EXT_INS
4911 || !register_operand (op, VOIDmode)
4912 || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
4913 return false;
4915 len = INTVAL (size);
4916 pos = INTVAL (position);
4918 if (len <= 0 || len >= GET_MODE_BITSIZE (GET_MODE (op))
4919 || pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (op)))
4920 return false;
4922 return true;
4925 /* Set up globals to generate code for the ISA or processor
4926 described by INFO. */
4928 static void
4929 mips_set_architecture (const struct mips_cpu_info *info)
4931 if (info != 0)
4933 mips_arch_info = info;
4934 mips_arch = info->cpu;
4935 mips_isa = info->isa;
4940 /* Likewise for tuning. */
4942 static void
4943 mips_set_tune (const struct mips_cpu_info *info)
4945 if (info != 0)
4947 mips_tune_info = info;
4948 mips_tune = info->cpu;
4952 /* Implement TARGET_HANDLE_OPTION. */
4954 static bool
4955 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
4957 switch (code)
4959 case OPT_mabi_:
4960 if (strcmp (arg, "32") == 0)
4961 mips_abi = ABI_32;
4962 else if (strcmp (arg, "o64") == 0)
4963 mips_abi = ABI_O64;
4964 else if (strcmp (arg, "n32") == 0)
4965 mips_abi = ABI_N32;
4966 else if (strcmp (arg, "64") == 0)
4967 mips_abi = ABI_64;
4968 else if (strcmp (arg, "eabi") == 0)
4969 mips_abi = ABI_EABI;
4970 else
4971 return false;
4972 return true;
4974 case OPT_march_:
4975 case OPT_mtune_:
4976 return mips_parse_cpu (arg) != 0;
4978 case OPT_mips:
4979 mips_isa_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
4980 return mips_isa_info != 0;
4982 case OPT_mno_flush_func:
4983 mips_cache_flush_func = NULL;
4984 return true;
4986 default:
4987 return true;
4991 /* Set up the threshold for data to go into the small data area, instead
4992 of the normal data area, and detect any conflicts in the switches. */
4994 void
4995 override_options (void)
4997 int i, start, regno;
4998 enum machine_mode mode;
5000 #ifdef SUBTARGET_OVERRIDE_OPTIONS
5001 SUBTARGET_OVERRIDE_OPTIONS;
5002 #endif
5004 mips_section_threshold = g_switch_set ? g_switch_value : MIPS_DEFAULT_GVALUE;
5006 /* The following code determines the architecture and register size.
5007 Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
5008 The GAS and GCC code should be kept in sync as much as possible. */
5010 if (mips_arch_string != 0)
5011 mips_set_architecture (mips_parse_cpu (mips_arch_string));
5013 if (mips_isa_info != 0)
5015 if (mips_arch_info == 0)
5016 mips_set_architecture (mips_isa_info);
5017 else if (mips_arch_info->isa != mips_isa_info->isa)
5018 error ("-%s conflicts with the other architecture options, "
5019 "which specify a %s processor",
5020 mips_isa_info->name,
5021 mips_cpu_info_from_isa (mips_arch_info->isa)->name);
5024 if (mips_arch_info == 0)
5026 #ifdef MIPS_CPU_STRING_DEFAULT
5027 mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
5028 #else
5029 mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
5030 #endif
5033 if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
5034 error ("-march=%s is not compatible with the selected ABI",
5035 mips_arch_info->name);
5037 /* Optimize for mips_arch, unless -mtune selects a different processor. */
5038 if (mips_tune_string != 0)
5039 mips_set_tune (mips_parse_cpu (mips_tune_string));
5041 if (mips_tune_info == 0)
5042 mips_set_tune (mips_arch_info);
5044 /* Set cost structure for the processor. */
5045 if (optimize_size)
5046 mips_cost = &mips_rtx_cost_optimize_size;
5047 else
5048 mips_cost = &mips_rtx_cost_data[mips_tune];
5050 if ((target_flags_explicit & MASK_64BIT) != 0)
5052 /* The user specified the size of the integer registers. Make sure
5053 it agrees with the ABI and ISA. */
5054 if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
5055 error ("-mgp64 used with a 32-bit processor");
5056 else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
5057 error ("-mgp32 used with a 64-bit ABI");
5058 else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
5059 error ("-mgp64 used with a 32-bit ABI");
5061 else
5063 /* Infer the integer register size from the ABI and processor.
5064 Restrict ourselves to 32-bit registers if that's all the
5065 processor has, or if the ABI cannot handle 64-bit registers. */
5066 if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
5067 target_flags &= ~MASK_64BIT;
5068 else
5069 target_flags |= MASK_64BIT;
5072 if ((target_flags_explicit & MASK_FLOAT64) != 0)
5074 /* Really, -mfp32 and -mfp64 are ornamental options. There's
5075 only one right answer here. */
5076 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
5077 error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
5078 else if (!TARGET_64BIT && TARGET_FLOAT64
5079 && !(ISA_HAS_MXHC1 && mips_abi == ABI_32))
5080 error ("-mgp32 and -mfp64 can only be combined if the target"
5081 " supports the mfhc1 and mthc1 instructions");
5082 else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
5083 error ("unsupported combination: %s", "-mfp64 -msingle-float");
5085 else
5087 /* -msingle-float selects 32-bit float registers. Otherwise the
5088 float registers should be the same size as the integer ones. */
5089 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
5090 target_flags |= MASK_FLOAT64;
5091 else
5092 target_flags &= ~MASK_FLOAT64;
5095 /* End of code shared with GAS. */
5097 if ((target_flags_explicit & MASK_LONG64) == 0)
5099 if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
5100 target_flags |= MASK_LONG64;
5101 else
5102 target_flags &= ~MASK_LONG64;
5105 if (MIPS_MARCH_CONTROLS_SOFT_FLOAT
5106 && (target_flags_explicit & MASK_SOFT_FLOAT) == 0)
5108 /* For some configurations, it is useful to have -march control
5109 the default setting of MASK_SOFT_FLOAT. */
5110 switch ((int) mips_arch)
5112 case PROCESSOR_R4100:
5113 case PROCESSOR_R4111:
5114 case PROCESSOR_R4120:
5115 case PROCESSOR_R4130:
5116 target_flags |= MASK_SOFT_FLOAT;
5117 break;
5119 default:
5120 target_flags &= ~MASK_SOFT_FLOAT;
5121 break;
5125 if (!TARGET_OLDABI)
5126 flag_pcc_struct_return = 0;
5128 if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
5130 /* If neither -mbranch-likely nor -mno-branch-likely was given
5131 on the command line, set MASK_BRANCHLIKELY based on the target
5132 architecture.
5134 By default, we enable use of Branch Likely instructions on
5135 all architectures which support them with the following
5136 exceptions: when creating MIPS32 or MIPS64 code, and when
5137 tuning for architectures where their use tends to hurt
5138 performance.
5140 The MIPS32 and MIPS64 architecture specifications say "Software
5141 is strongly encouraged to avoid use of Branch Likely
5142 instructions, as they will be removed from a future revision
5143 of the [MIPS32 and MIPS64] architecture." Therefore, we do not
5144 issue those instructions unless instructed to do so by
5145 -mbranch-likely. */
5146 if (ISA_HAS_BRANCHLIKELY
5147 && !(ISA_MIPS32 || ISA_MIPS32R2 || ISA_MIPS64)
5148 && !(TUNE_MIPS5500 || TUNE_SB1))
5149 target_flags |= MASK_BRANCHLIKELY;
5150 else
5151 target_flags &= ~MASK_BRANCHLIKELY;
5153 if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
5154 warning (0, "generation of Branch Likely instructions enabled, but not supported by architecture");
5156 /* The effect of -mabicalls isn't defined for the EABI. */
5157 if (mips_abi == ABI_EABI && TARGET_ABICALLS)
5159 error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
5160 target_flags &= ~MASK_ABICALLS;
5163 if (TARGET_ABICALLS)
5165 /* We need to set flag_pic for executables as well as DSOs
5166 because we may reference symbols that are not defined in
5167 the final executable. (MIPS does not use things like
5168 copy relocs, for example.)
5170 Also, there is a body of code that uses __PIC__ to distinguish
5171 between -mabicalls and -mno-abicalls code. */
5172 flag_pic = 1;
5173 if (mips_section_threshold > 0)
5174 warning (0, "%<-G%> is incompatible with %<-mabicalls%>");
5177 if (TARGET_VXWORKS_RTP && mips_section_threshold > 0)
5178 warning (0, "-G and -mrtp are incompatible");
5180 /* mips_split_addresses is a half-way house between explicit
5181 relocations and the traditional assembler macros. It can
5182 split absolute 32-bit symbolic constants into a high/lo_sum
5183 pair but uses macros for other sorts of access.
5185 Like explicit relocation support for REL targets, it relies
5186 on GNU extensions in the assembler and the linker.
5188 Although this code should work for -O0, it has traditionally
5189 been treated as an optimization. */
5190 if (!TARGET_MIPS16 && TARGET_SPLIT_ADDRESSES
5191 && optimize && !flag_pic
5192 && !ABI_HAS_64BIT_SYMBOLS)
5193 mips_split_addresses = 1;
5194 else
5195 mips_split_addresses = 0;
5197 /* -mvr4130-align is a "speed over size" optimization: it usually produces
5198 faster code, but at the expense of more nops. Enable it at -O3 and
5199 above. */
5200 if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
5201 target_flags |= MASK_VR4130_ALIGN;
5203 /* When compiling for the mips16, we cannot use floating point. We
5204 record the original hard float value in mips16_hard_float. */
5205 if (TARGET_MIPS16)
5207 if (TARGET_SOFT_FLOAT)
5208 mips16_hard_float = 0;
5209 else
5210 mips16_hard_float = 1;
5211 target_flags |= MASK_SOFT_FLOAT;
5213 /* Don't run the scheduler before reload, since it tends to
5214 increase register pressure. */
5215 flag_schedule_insns = 0;
5217 /* Don't do hot/cold partitioning. The constant layout code expects
5218 the whole function to be in a single section. */
5219 flag_reorder_blocks_and_partition = 0;
5221 /* Silently disable -mexplicit-relocs since it doesn't apply
5222 to mips16 code. Even so, it would overly pedantic to warn
5223 about "-mips16 -mexplicit-relocs", especially given that
5224 we use a %gprel() operator. */
5225 target_flags &= ~MASK_EXPLICIT_RELOCS;
5228 /* When using explicit relocs, we call dbr_schedule from within
5229 mips_reorg. */
5230 if (TARGET_EXPLICIT_RELOCS)
5232 mips_flag_delayed_branch = flag_delayed_branch;
5233 flag_delayed_branch = 0;
5236 #ifdef MIPS_TFMODE_FORMAT
5237 REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
5238 #endif
5240 /* Make sure that the user didn't turn off paired single support when
5241 MIPS-3D support is requested. */
5242 if (TARGET_MIPS3D && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
5243 && !TARGET_PAIRED_SINGLE_FLOAT)
5244 error ("-mips3d requires -mpaired-single");
5246 /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT. */
5247 if (TARGET_MIPS3D)
5248 target_flags |= MASK_PAIRED_SINGLE_FLOAT;
5250 /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
5251 and TARGET_HARD_FLOAT are both true. */
5252 if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT))
5253 error ("-mips3d/-mpaired-single must be used with -mfp64 -mhard-float");
5255 /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
5256 enabled. */
5257 if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_MIPS64)
5258 error ("-mips3d/-mpaired-single must be used with -mips64");
5260 /* If TARGET_DSPR2, enable MASK_DSP. */
5261 if (TARGET_DSPR2)
5262 target_flags |= MASK_DSP;
5264 if (TARGET_MIPS16 && TARGET_DSP)
5265 error ("-mips16 and -mdsp cannot be used together");
5267 mips_print_operand_punct['?'] = 1;
5268 mips_print_operand_punct['#'] = 1;
5269 mips_print_operand_punct['/'] = 1;
5270 mips_print_operand_punct['&'] = 1;
5271 mips_print_operand_punct['!'] = 1;
5272 mips_print_operand_punct['*'] = 1;
5273 mips_print_operand_punct['@'] = 1;
5274 mips_print_operand_punct['.'] = 1;
5275 mips_print_operand_punct['('] = 1;
5276 mips_print_operand_punct[')'] = 1;
5277 mips_print_operand_punct['['] = 1;
5278 mips_print_operand_punct[']'] = 1;
5279 mips_print_operand_punct['<'] = 1;
5280 mips_print_operand_punct['>'] = 1;
5281 mips_print_operand_punct['{'] = 1;
5282 mips_print_operand_punct['}'] = 1;
5283 mips_print_operand_punct['^'] = 1;
5284 mips_print_operand_punct['$'] = 1;
5285 mips_print_operand_punct['+'] = 1;
5286 mips_print_operand_punct['~'] = 1;
5288 /* Set up array to map GCC register number to debug register number.
5289 Ignore the special purpose register numbers. */
5291 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5293 mips_dbx_regno[i] = INVALID_REGNUM;
5294 if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
5295 mips_dwarf_regno[i] = i;
5296 else
5297 mips_dwarf_regno[i] = INVALID_REGNUM;
5300 start = GP_DBX_FIRST - GP_REG_FIRST;
5301 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
5302 mips_dbx_regno[i] = i + start;
5304 start = FP_DBX_FIRST - FP_REG_FIRST;
5305 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
5306 mips_dbx_regno[i] = i + start;
5308 /* HI and LO debug registers use big-endian ordering. */
5309 mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
5310 mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
5311 mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
5312 mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
5313 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
5315 mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
5316 mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
5319 /* Set up array giving whether a given register can hold a given mode. */
5321 for (mode = VOIDmode;
5322 mode != MAX_MACHINE_MODE;
5323 mode = (enum machine_mode) ((int)mode + 1))
5325 register int size = GET_MODE_SIZE (mode);
5326 register enum mode_class class = GET_MODE_CLASS (mode);
5328 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
5330 register int temp;
5332 if (mode == CCV2mode)
5333 temp = (ISA_HAS_8CC
5334 && ST_REG_P (regno)
5335 && (regno - ST_REG_FIRST) % 2 == 0);
5337 else if (mode == CCV4mode)
5338 temp = (ISA_HAS_8CC
5339 && ST_REG_P (regno)
5340 && (regno - ST_REG_FIRST) % 4 == 0);
5342 else if (mode == CCmode)
5344 if (! ISA_HAS_8CC)
5345 temp = (regno == FPSW_REGNUM);
5346 else
5347 temp = (ST_REG_P (regno) || GP_REG_P (regno)
5348 || FP_REG_P (regno));
5351 else if (GP_REG_P (regno))
5352 temp = ((regno & 1) == 0 || size <= UNITS_PER_WORD);
5354 else if (FP_REG_P (regno))
5355 temp = ((((regno % MAX_FPRS_PER_FMT) == 0)
5356 || (MIN_FPRS_PER_FMT == 1
5357 && size <= UNITS_PER_FPREG))
5358 && (((class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT
5359 || class == MODE_VECTOR_FLOAT)
5360 && size <= UNITS_PER_FPVALUE)
5361 /* Allow integer modes that fit into a single
5362 register. We need to put integers into FPRs
5363 when using instructions like cvt and trunc.
5364 We can't allow sizes smaller than a word,
5365 the FPU has no appropriate load/store
5366 instructions for those. */
5367 || (class == MODE_INT
5368 && size >= MIN_UNITS_PER_WORD
5369 && size <= UNITS_PER_FPREG)
5370 /* Allow TFmode for CCmode reloads. */
5371 || (ISA_HAS_8CC && mode == TFmode)));
5373 else if (ACC_REG_P (regno))
5374 temp = (INTEGRAL_MODE_P (mode)
5375 && size <= UNITS_PER_WORD * 2
5376 && (size <= UNITS_PER_WORD
5377 || regno == MD_REG_FIRST
5378 || (DSP_ACC_REG_P (regno)
5379 && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)));
5381 else if (ALL_COP_REG_P (regno))
5382 temp = (class == MODE_INT && size <= UNITS_PER_WORD);
5383 else
5384 temp = 0;
5386 mips_hard_regno_mode_ok[(int)mode][regno] = temp;
5390 /* Save GPR registers in word_mode sized hunks. word_mode hasn't been
5391 initialized yet, so we can't use that here. */
5392 gpr_mode = TARGET_64BIT ? DImode : SImode;
5394 /* Provide default values for align_* for 64-bit targets. */
5395 if (TARGET_64BIT && !TARGET_MIPS16)
5397 if (align_loops == 0)
5398 align_loops = 8;
5399 if (align_jumps == 0)
5400 align_jumps = 8;
5401 if (align_functions == 0)
5402 align_functions = 8;
5405 /* Function to allocate machine-dependent function status. */
5406 init_machine_status = &mips_init_machine_status;
5408 if (ABI_HAS_64BIT_SYMBOLS)
5410 if (TARGET_EXPLICIT_RELOCS)
5412 mips_split_p[SYMBOL_64_HIGH] = true;
5413 mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
5414 mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
5416 mips_split_p[SYMBOL_64_MID] = true;
5417 mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
5418 mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
5420 mips_split_p[SYMBOL_64_LOW] = true;
5421 mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
5422 mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
5424 mips_split_p[SYMBOL_GENERAL] = true;
5425 mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
5428 else
5430 if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
5432 mips_split_p[SYMBOL_GENERAL] = true;
5433 mips_hi_relocs[SYMBOL_GENERAL] = "%hi(";
5434 mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
5438 if (TARGET_MIPS16)
5440 /* The high part is provided by a pseudo copy of $gp. */
5441 mips_split_p[SYMBOL_SMALL_DATA] = true;
5442 mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gprel(";
5445 if (TARGET_EXPLICIT_RELOCS)
5447 /* Small data constants are kept whole until after reload,
5448 then lowered by mips_rewrite_small_data. */
5449 mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gp_rel(";
5451 mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
5452 if (TARGET_NEWABI)
5454 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
5455 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
5457 else
5459 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
5460 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
5463 if (TARGET_XGOT)
5465 /* The HIGH and LO_SUM are matched by special .md patterns. */
5466 mips_split_p[SYMBOL_GOT_DISP] = true;
5468 mips_split_p[SYMBOL_GOTOFF_DISP] = true;
5469 mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
5470 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
5472 mips_split_p[SYMBOL_GOTOFF_CALL] = true;
5473 mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
5474 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
5476 else
5478 if (TARGET_NEWABI)
5479 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
5480 else
5481 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
5482 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
5486 if (TARGET_NEWABI)
5488 mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
5489 mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
5490 mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
5493 /* Thread-local relocation operators. */
5494 mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
5495 mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
5496 mips_split_p[SYMBOL_DTPREL] = 1;
5497 mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
5498 mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
5499 mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
5500 mips_split_p[SYMBOL_TPREL] = 1;
5501 mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
5502 mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
5504 mips_lo_relocs[SYMBOL_HALF] = "%half(";
5506 /* We don't have a thread pointer access instruction on MIPS16, or
5507 appropriate TLS relocations. */
5508 if (TARGET_MIPS16)
5509 targetm.have_tls = false;
5511 /* Default to working around R4000 errata only if the processor
5512 was selected explicitly. */
5513 if ((target_flags_explicit & MASK_FIX_R4000) == 0
5514 && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
5515 target_flags |= MASK_FIX_R4000;
5517 /* Default to working around R4400 errata only if the processor
5518 was selected explicitly. */
5519 if ((target_flags_explicit & MASK_FIX_R4400) == 0
5520 && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
5521 target_flags |= MASK_FIX_R4400;
5524 /* Swap the register information for registers I and I + 1, which
5525 currently have the wrong endianness. Note that the registers'
5526 fixedness and call-clobberedness might have been set on the
5527 command line. */
5529 static void
5530 mips_swap_registers (unsigned int i)
5532 int tmpi;
5533 const char *tmps;
5535 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
5536 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
5538 SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
5539 SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
5540 SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
5541 SWAP_STRING (reg_names[i], reg_names[i + 1]);
5543 #undef SWAP_STRING
5544 #undef SWAP_INT
5547 /* Implement CONDITIONAL_REGISTER_USAGE. */
5549 void
5550 mips_conditional_register_usage (void)
5552 if (!TARGET_DSP)
5554 int regno;
5556 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
5557 fixed_regs[regno] = call_used_regs[regno] = 1;
5559 if (!TARGET_HARD_FLOAT)
5561 int regno;
5563 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
5564 fixed_regs[regno] = call_used_regs[regno] = 1;
5565 for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
5566 fixed_regs[regno] = call_used_regs[regno] = 1;
5568 else if (! ISA_HAS_8CC)
5570 int regno;
5572 /* We only have a single condition code register. We
5573 implement this by hiding all the condition code registers,
5574 and generating RTL that refers directly to ST_REG_FIRST. */
5575 for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
5576 fixed_regs[regno] = call_used_regs[regno] = 1;
5578 /* In mips16 mode, we permit the $t temporary registers to be used
5579 for reload. We prohibit the unused $s registers, since they
5580 are caller saved, and saving them via a mips16 register would
5581 probably waste more time than just reloading the value. */
5582 if (TARGET_MIPS16)
5584 fixed_regs[18] = call_used_regs[18] = 1;
5585 fixed_regs[19] = call_used_regs[19] = 1;
5586 fixed_regs[20] = call_used_regs[20] = 1;
5587 fixed_regs[21] = call_used_regs[21] = 1;
5588 fixed_regs[22] = call_used_regs[22] = 1;
5589 fixed_regs[23] = call_used_regs[23] = 1;
5590 fixed_regs[26] = call_used_regs[26] = 1;
5591 fixed_regs[27] = call_used_regs[27] = 1;
5592 fixed_regs[30] = call_used_regs[30] = 1;
5594 /* fp20-23 are now caller saved. */
5595 if (mips_abi == ABI_64)
5597 int regno;
5598 for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
5599 call_really_used_regs[regno] = call_used_regs[regno] = 1;
5601 /* Odd registers from fp21 to fp31 are now caller saved. */
5602 if (mips_abi == ABI_N32)
5604 int regno;
5605 for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
5606 call_really_used_regs[regno] = call_used_regs[regno] = 1;
5608 /* Make sure that double-register accumulator values are correctly
5609 ordered for the current endianness. */
5610 if (TARGET_LITTLE_ENDIAN)
5612 int regno;
5613 mips_swap_registers (MD_REG_FIRST);
5614 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
5615 mips_swap_registers (regno);
5619 /* Allocate a chunk of memory for per-function machine-dependent data. */
5620 static struct machine_function *
5621 mips_init_machine_status (void)
5623 return ((struct machine_function *)
5624 ggc_alloc_cleared (sizeof (struct machine_function)));
5627 /* On the mips16, we want to allocate $24 (T_REG) before other
5628 registers for instructions for which it is possible. This helps
5629 avoid shuffling registers around in order to set up for an xor,
5630 encouraging the compiler to use a cmp instead. */
5632 void
5633 mips_order_regs_for_local_alloc (void)
5635 register int i;
5637 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5638 reg_alloc_order[i] = i;
5640 if (TARGET_MIPS16)
5642 /* It really doesn't matter where we put register 0, since it is
5643 a fixed register anyhow. */
5644 reg_alloc_order[0] = 24;
5645 reg_alloc_order[24] = 0;
5650 /* The MIPS debug format wants all automatic variables and arguments
5651 to be in terms of the virtual frame pointer (stack pointer before
5652 any adjustment in the function), while the MIPS 3.0 linker wants
5653 the frame pointer to be the stack pointer after the initial
5654 adjustment. So, we do the adjustment here. The arg pointer (which
5655 is eliminated) points to the virtual frame pointer, while the frame
5656 pointer (which may be eliminated) points to the stack pointer after
5657 the initial adjustments. */
5659 HOST_WIDE_INT
5660 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
5662 rtx offset2 = const0_rtx;
5663 rtx reg = eliminate_constant_term (addr, &offset2);
5665 if (offset == 0)
5666 offset = INTVAL (offset2);
5668 if (reg == stack_pointer_rtx || reg == frame_pointer_rtx
5669 || reg == hard_frame_pointer_rtx)
5671 HOST_WIDE_INT frame_size = (!cfun->machine->frame.initialized)
5672 ? compute_frame_size (get_frame_size ())
5673 : cfun->machine->frame.total_size;
5675 /* MIPS16 frame is smaller */
5676 if (frame_pointer_needed && TARGET_MIPS16)
5677 frame_size -= cfun->machine->frame.args_size;
5679 offset = offset - frame_size;
5682 /* sdbout_parms does not want this to crash for unrecognized cases. */
5683 #if 0
5684 else if (reg != arg_pointer_rtx)
5685 fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
5686 addr);
5687 #endif
5689 return offset;
5692 /* Implement the PRINT_OPERAND macro. The MIPS-specific operand codes are:
5694 'X' OP is CONST_INT, prints 32 bits in hexadecimal format = "0x%08x",
5695 'x' OP is CONST_INT, prints 16 bits in hexadecimal format = "0x%04x",
5696 'h' OP is HIGH, prints %hi(X),
5697 'd' output integer constant in decimal,
5698 'z' if the operand is 0, use $0 instead of normal operand.
5699 'D' print second part of double-word register or memory operand.
5700 'L' print low-order register of double-word register operand.
5701 'M' print high-order register of double-word register operand.
5702 'C' print part of opcode for a branch condition.
5703 'F' print part of opcode for a floating-point branch condition.
5704 'N' print part of opcode for a branch condition, inverted.
5705 'W' print part of opcode for a floating-point branch condition, inverted.
5706 'T' print 'f' for (eq:CC ...), 't' for (ne:CC ...),
5707 'z' for (eq:?I ...), 'n' for (ne:?I ...).
5708 't' like 'T', but with the EQ/NE cases reversed
5709 'Y' for a CONST_INT X, print mips_fp_conditions[X]
5710 'Z' print the operand and a comma for ISA_HAS_8CC, otherwise print nothing
5711 'R' print the reloc associated with LO_SUM
5712 'q' print DSP accumulator registers
5714 The punctuation characters are:
5716 '(' Turn on .set noreorder
5717 ')' Turn on .set reorder
5718 '[' Turn on .set noat
5719 ']' Turn on .set at
5720 '<' Turn on .set nomacro
5721 '>' Turn on .set macro
5722 '{' Turn on .set volatile (not GAS)
5723 '}' Turn on .set novolatile (not GAS)
5724 '&' Turn on .set noreorder if filling delay slots
5725 '*' Turn on both .set noreorder and .set nomacro if filling delay slots
5726 '!' Turn on .set nomacro if filling delay slots
5727 '#' Print nop if in a .set noreorder section.
5728 '/' Like '#', but does nothing within a delayed branch sequence
5729 '?' Print 'l' if we are to use a branch likely instead of normal branch.
5730 '@' Print the name of the assembler temporary register (at or $1).
5731 '.' Print the name of the register with a hard-wired zero (zero or $0).
5732 '^' Print the name of the pic call-through register (t9 or $25).
5733 '$' Print the name of the stack pointer register (sp or $29).
5734 '+' Print the name of the gp register (usually gp or $28).
5735 '~' Output a branch alignment to LABEL_ALIGN(NULL). */
5737 void
5738 print_operand (FILE *file, rtx op, int letter)
5740 register enum rtx_code code;
5742 if (PRINT_OPERAND_PUNCT_VALID_P (letter))
5744 switch (letter)
5746 case '?':
5747 if (mips_branch_likely)
5748 putc ('l', file);
5749 break;
5751 case '@':
5752 fputs (reg_names [GP_REG_FIRST + 1], file);
5753 break;
5755 case '^':
5756 fputs (reg_names [PIC_FUNCTION_ADDR_REGNUM], file);
5757 break;
5759 case '.':
5760 fputs (reg_names [GP_REG_FIRST + 0], file);
5761 break;
5763 case '$':
5764 fputs (reg_names[STACK_POINTER_REGNUM], file);
5765 break;
5767 case '+':
5768 fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
5769 break;
5771 case '&':
5772 if (final_sequence != 0 && set_noreorder++ == 0)
5773 fputs (".set\tnoreorder\n\t", file);
5774 break;
5776 case '*':
5777 if (final_sequence != 0)
5779 if (set_noreorder++ == 0)
5780 fputs (".set\tnoreorder\n\t", file);
5782 if (set_nomacro++ == 0)
5783 fputs (".set\tnomacro\n\t", file);
5785 break;
5787 case '!':
5788 if (final_sequence != 0 && set_nomacro++ == 0)
5789 fputs ("\n\t.set\tnomacro", file);
5790 break;
5792 case '#':
5793 if (set_noreorder != 0)
5794 fputs ("\n\tnop", file);
5795 break;
5797 case '/':
5798 /* Print an extra newline so that the delayed insn is separated
5799 from the following ones. This looks neater and is consistent
5800 with non-nop delayed sequences. */
5801 if (set_noreorder != 0 && final_sequence == 0)
5802 fputs ("\n\tnop\n", file);
5803 break;
5805 case '(':
5806 if (set_noreorder++ == 0)
5807 fputs (".set\tnoreorder\n\t", file);
5808 break;
5810 case ')':
5811 if (set_noreorder == 0)
5812 error ("internal error: %%) found without a %%( in assembler pattern");
5814 else if (--set_noreorder == 0)
5815 fputs ("\n\t.set\treorder", file);
5817 break;
5819 case '[':
5820 if (set_noat++ == 0)
5821 fputs (".set\tnoat\n\t", file);
5822 break;
5824 case ']':
5825 if (set_noat == 0)
5826 error ("internal error: %%] found without a %%[ in assembler pattern");
5827 else if (--set_noat == 0)
5828 fputs ("\n\t.set\tat", file);
5830 break;
5832 case '<':
5833 if (set_nomacro++ == 0)
5834 fputs (".set\tnomacro\n\t", file);
5835 break;
5837 case '>':
5838 if (set_nomacro == 0)
5839 error ("internal error: %%> found without a %%< in assembler pattern");
5840 else if (--set_nomacro == 0)
5841 fputs ("\n\t.set\tmacro", file);
5843 break;
5845 case '{':
5846 if (set_volatile++ == 0)
5847 fputs ("#.set\tvolatile\n\t", file);
5848 break;
5850 case '}':
5851 if (set_volatile == 0)
5852 error ("internal error: %%} found without a %%{ in assembler pattern");
5853 else if (--set_volatile == 0)
5854 fputs ("\n\t#.set\tnovolatile", file);
5856 break;
5858 case '~':
5860 if (align_labels_log > 0)
5861 ASM_OUTPUT_ALIGN (file, align_labels_log);
5863 break;
5865 default:
5866 error ("PRINT_OPERAND: unknown punctuation '%c'", letter);
5867 break;
5870 return;
5873 if (! op)
5875 error ("PRINT_OPERAND null pointer");
5876 return;
5879 code = GET_CODE (op);
5881 if (letter == 'C')
5882 switch (code)
5884 case EQ: fputs ("eq", file); break;
5885 case NE: fputs ("ne", file); break;
5886 case GT: fputs ("gt", file); break;
5887 case GE: fputs ("ge", file); break;
5888 case LT: fputs ("lt", file); break;
5889 case LE: fputs ("le", file); break;
5890 case GTU: fputs ("gtu", file); break;
5891 case GEU: fputs ("geu", file); break;
5892 case LTU: fputs ("ltu", file); break;
5893 case LEU: fputs ("leu", file); break;
5894 default:
5895 fatal_insn ("PRINT_OPERAND, invalid insn for %%C", op);
5898 else if (letter == 'N')
5899 switch (code)
5901 case EQ: fputs ("ne", file); break;
5902 case NE: fputs ("eq", file); break;
5903 case GT: fputs ("le", file); break;
5904 case GE: fputs ("lt", file); break;
5905 case LT: fputs ("ge", file); break;
5906 case LE: fputs ("gt", file); break;
5907 case GTU: fputs ("leu", file); break;
5908 case GEU: fputs ("ltu", file); break;
5909 case LTU: fputs ("geu", file); break;
5910 case LEU: fputs ("gtu", file); break;
5911 default:
5912 fatal_insn ("PRINT_OPERAND, invalid insn for %%N", op);
5915 else if (letter == 'F')
5916 switch (code)
5918 case EQ: fputs ("c1f", file); break;
5919 case NE: fputs ("c1t", file); break;
5920 default:
5921 fatal_insn ("PRINT_OPERAND, invalid insn for %%F", op);
5924 else if (letter == 'W')
5925 switch (code)
5927 case EQ: fputs ("c1t", file); break;
5928 case NE: fputs ("c1f", file); break;
5929 default:
5930 fatal_insn ("PRINT_OPERAND, invalid insn for %%W", op);
5933 else if (letter == 'h')
5935 if (GET_CODE (op) == HIGH)
5936 op = XEXP (op, 0);
5938 print_operand_reloc (file, op, mips_hi_relocs);
5941 else if (letter == 'R')
5942 print_operand_reloc (file, op, mips_lo_relocs);
5944 else if (letter == 'Y')
5946 if (GET_CODE (op) == CONST_INT
5947 && ((unsigned HOST_WIDE_INT) INTVAL (op)
5948 < ARRAY_SIZE (mips_fp_conditions)))
5949 fputs (mips_fp_conditions[INTVAL (op)], file);
5950 else
5951 output_operand_lossage ("invalid %%Y value");
5954 else if (letter == 'Z')
5956 if (ISA_HAS_8CC)
5958 print_operand (file, op, 0);
5959 fputc (',', file);
5963 else if (letter == 'q')
5965 int regnum;
5967 if (code != REG)
5968 fatal_insn ("PRINT_OPERAND, invalid insn for %%q", op);
5970 regnum = REGNO (op);
5971 if (MD_REG_P (regnum))
5972 fprintf (file, "$ac0");
5973 else if (DSP_ACC_REG_P (regnum))
5974 fprintf (file, "$ac%c", reg_names[regnum][3]);
5975 else
5976 fatal_insn ("PRINT_OPERAND, invalid insn for %%q", op);
5979 else if (code == REG || code == SUBREG)
5981 register int regnum;
5983 if (code == REG)
5984 regnum = REGNO (op);
5985 else
5986 regnum = true_regnum (op);
5988 if ((letter == 'M' && ! WORDS_BIG_ENDIAN)
5989 || (letter == 'L' && WORDS_BIG_ENDIAN)
5990 || letter == 'D')
5991 regnum++;
5993 fprintf (file, "%s", reg_names[regnum]);
5996 else if (code == MEM)
5998 if (letter == 'D')
5999 output_address (plus_constant (XEXP (op, 0), 4));
6000 else
6001 output_address (XEXP (op, 0));
6004 else if (letter == 'x' && GET_CODE (op) == CONST_INT)
6005 fprintf (file, HOST_WIDE_INT_PRINT_HEX, 0xffff & INTVAL(op));
6007 else if (letter == 'X' && GET_CODE(op) == CONST_INT)
6008 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
6010 else if (letter == 'd' && GET_CODE(op) == CONST_INT)
6011 fprintf (file, HOST_WIDE_INT_PRINT_DEC, (INTVAL(op)));
6013 else if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
6014 fputs (reg_names[GP_REG_FIRST], file);
6016 else if (letter == 'd' || letter == 'x' || letter == 'X')
6017 output_operand_lossage ("invalid use of %%d, %%x, or %%X");
6019 else if (letter == 'T' || letter == 't')
6021 int truth = (code == NE) == (letter == 'T');
6022 fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
6025 else if (CONST_GP_P (op))
6026 fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
6028 else
6029 output_addr_const (file, op);
6033 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM.
6034 RELOCS is the array of relocations to use. */
6036 static void
6037 print_operand_reloc (FILE *file, rtx op, const char **relocs)
6039 enum mips_symbol_type symbol_type;
6040 const char *p;
6041 rtx base, offset;
6043 if (!mips_symbolic_constant_p (op, &symbol_type) || relocs[symbol_type] == 0)
6044 fatal_insn ("PRINT_OPERAND, invalid operand for relocation", op);
6046 /* If OP uses an UNSPEC address, we want to print the inner symbol. */
6047 split_const (op, &base, &offset);
6048 if (UNSPEC_ADDRESS_P (base))
6049 op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
6051 fputs (relocs[symbol_type], file);
6052 output_addr_const (file, op);
6053 for (p = relocs[symbol_type]; *p != 0; p++)
6054 if (*p == '(')
6055 fputc (')', file);
6058 /* Output address operand X to FILE. */
6060 void
6061 print_operand_address (FILE *file, rtx x)
6063 struct mips_address_info addr;
6065 if (mips_classify_address (&addr, x, word_mode, true))
6066 switch (addr.type)
6068 case ADDRESS_REG:
6069 print_operand (file, addr.offset, 0);
6070 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6071 return;
6073 case ADDRESS_LO_SUM:
6074 print_operand (file, addr.offset, 'R');
6075 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
6076 return;
6078 case ADDRESS_CONST_INT:
6079 output_addr_const (file, x);
6080 fprintf (file, "(%s)", reg_names[0]);
6081 return;
6083 case ADDRESS_SYMBOLIC:
6084 output_addr_const (file, x);
6085 return;
6087 gcc_unreachable ();
6090 /* When using assembler macros, keep track of all of small-data externs
6091 so that mips_file_end can emit the appropriate declarations for them.
6093 In most cases it would be safe (though pointless) to emit .externs
6094 for other symbols too. One exception is when an object is within
6095 the -G limit but declared by the user to be in a section other
6096 than .sbss or .sdata. */
6098 void
6099 mips_output_external (FILE *file, tree decl, const char *name)
6101 default_elf_asm_output_external (file, decl, name);
6103 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
6104 set in order to avoid putting out names that are never really
6105 used. */
6106 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
6108 if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
6110 fputs ("\t.extern\t", file);
6111 assemble_name (file, name);
6112 fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
6113 int_size_in_bytes (TREE_TYPE (decl)));
6115 else if (TARGET_IRIX
6116 && mips_abi == ABI_32
6117 && TREE_CODE (decl) == FUNCTION_DECL)
6119 /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
6120 `.global name .text' directive for every used but
6121 undefined function. If we don't, the linker may perform
6122 an optimization (skipping over the insns that set $gp)
6123 when it is unsafe. */
6124 fputs ("\t.globl ", file);
6125 assemble_name (file, name);
6126 fputs (" .text\n", file);
6131 /* Emit a new filename to a stream. If we are smuggling stabs, try to
6132 put out a MIPS ECOFF file and a stab. */
6134 void
6135 mips_output_filename (FILE *stream, const char *name)
6138 /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
6139 directives. */
6140 if (write_symbols == DWARF2_DEBUG)
6141 return;
6142 else if (mips_output_filename_first_time)
6144 mips_output_filename_first_time = 0;
6145 num_source_filenames += 1;
6146 current_function_file = name;
6147 fprintf (stream, "\t.file\t%d ", num_source_filenames);
6148 output_quoted_string (stream, name);
6149 putc ('\n', stream);
6152 /* If we are emitting stabs, let dbxout.c handle this (except for
6153 the mips_output_filename_first_time case). */
6154 else if (write_symbols == DBX_DEBUG)
6155 return;
6157 else if (name != current_function_file
6158 && strcmp (name, current_function_file) != 0)
6160 num_source_filenames += 1;
6161 current_function_file = name;
6162 fprintf (stream, "\t.file\t%d ", num_source_filenames);
6163 output_quoted_string (stream, name);
6164 putc ('\n', stream);
6168 /* Output an ASCII string, in a space-saving way. PREFIX is the string
6169 that should be written before the opening quote, such as "\t.ascii\t"
6170 for real string data or "\t# " for a comment. */
6172 void
6173 mips_output_ascii (FILE *stream, const char *string_param, size_t len,
6174 const char *prefix)
6176 size_t i;
6177 int cur_pos = 17;
6178 register const unsigned char *string =
6179 (const unsigned char *)string_param;
6181 fprintf (stream, "%s\"", prefix);
6182 for (i = 0; i < len; i++)
6184 register int c = string[i];
6186 if (ISPRINT (c))
6188 if (c == '\\' || c == '\"')
6190 putc ('\\', stream);
6191 cur_pos++;
6193 putc (c, stream);
6194 cur_pos++;
6196 else
6198 fprintf (stream, "\\%03o", c);
6199 cur_pos += 4;
6202 if (cur_pos > 72 && i+1 < len)
6204 cur_pos = 17;
6205 fprintf (stream, "\"\n%s\"", prefix);
6208 fprintf (stream, "\"\n");
6211 /* Implement TARGET_ASM_FILE_START. */
6213 static void
6214 mips_file_start (void)
6216 default_file_start ();
6218 if (!TARGET_IRIX)
6220 /* Generate a special section to describe the ABI switches used to
6221 produce the resultant binary. This used to be done by the assembler
6222 setting bits in the ELF header's flags field, but we have run out of
6223 bits. GDB needs this information in order to be able to correctly
6224 debug these binaries. See the function mips_gdbarch_init() in
6225 gdb/mips-tdep.c. This is unnecessary for the IRIX 5/6 ABIs and
6226 causes unnecessary IRIX 6 ld warnings. */
6227 const char * abi_string = NULL;
6229 switch (mips_abi)
6231 case ABI_32: abi_string = "abi32"; break;
6232 case ABI_N32: abi_string = "abiN32"; break;
6233 case ABI_64: abi_string = "abi64"; break;
6234 case ABI_O64: abi_string = "abiO64"; break;
6235 case ABI_EABI: abi_string = TARGET_64BIT ? "eabi64" : "eabi32"; break;
6236 default:
6237 gcc_unreachable ();
6239 /* Note - we use fprintf directly rather than calling switch_to_section
6240 because in this way we can avoid creating an allocated section. We
6241 do not want this section to take up any space in the running
6242 executable. */
6243 fprintf (asm_out_file, "\t.section .mdebug.%s\n", abi_string);
6245 /* There is no ELF header flag to distinguish long32 forms of the
6246 EABI from long64 forms. Emit a special section to help tools
6247 such as GDB. Do the same for o64, which is sometimes used with
6248 -mlong64. */
6249 if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
6250 fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n",
6251 TARGET_LONG64 ? 64 : 32);
6253 /* Restore the default section. */
6254 fprintf (asm_out_file, "\t.previous\n");
6256 #ifdef HAVE_AS_GNU_ATTRIBUTE
6257 fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
6258 TARGET_HARD_FLOAT_ABI ? (TARGET_DOUBLE_FLOAT ? 1 : 2) : 3);
6259 #endif
6262 /* Generate the pseudo ops that System V.4 wants. */
6263 if (TARGET_ABICALLS)
6264 fprintf (asm_out_file, "\t.abicalls\n");
6266 if (TARGET_MIPS16)
6267 fprintf (asm_out_file, "\t.set\tmips16\n");
6269 if (flag_verbose_asm)
6270 fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
6271 ASM_COMMENT_START,
6272 mips_section_threshold, mips_arch_info->name, mips_isa);
6275 #ifdef BSS_SECTION_ASM_OP
6276 /* Implement ASM_OUTPUT_ALIGNED_BSS. This differs from the default only
6277 in the use of sbss. */
6279 void
6280 mips_output_aligned_bss (FILE *stream, tree decl, const char *name,
6281 unsigned HOST_WIDE_INT size, int align)
6283 extern tree last_assemble_variable_decl;
6285 if (mips_in_small_data_p (decl))
6286 switch_to_section (get_named_section (NULL, ".sbss", 0));
6287 else
6288 switch_to_section (bss_section);
6289 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
6290 last_assemble_variable_decl = decl;
6291 ASM_DECLARE_OBJECT_NAME (stream, name, decl);
6292 ASM_OUTPUT_SKIP (stream, size != 0 ? size : 1);
6294 #endif
6296 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This is usually the same as the
6297 elfos.h version, but we also need to handle -muninit-const-in-rodata. */
6299 void
6300 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
6301 unsigned HOST_WIDE_INT size,
6302 unsigned int align)
6304 /* If the target wants uninitialized const declarations in
6305 .rdata then don't put them in .comm. */
6306 if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA
6307 && TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)
6308 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
6310 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
6311 targetm.asm_out.globalize_label (stream, name);
6313 switch_to_section (readonly_data_section);
6314 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
6315 mips_declare_object (stream, name, "",
6316 ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
6317 size);
6319 else
6320 mips_declare_common_object (stream, name, "\n\t.comm\t",
6321 size, align, true);
6324 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
6325 NAME is the name of the object and ALIGN is the required alignment
6326 in bytes. TAKES_ALIGNMENT_P is true if the directive takes a third
6327 alignment argument. */
6329 void
6330 mips_declare_common_object (FILE *stream, const char *name,
6331 const char *init_string,
6332 unsigned HOST_WIDE_INT size,
6333 unsigned int align, bool takes_alignment_p)
6335 if (!takes_alignment_p)
6337 size += (align / BITS_PER_UNIT) - 1;
6338 size -= size % (align / BITS_PER_UNIT);
6339 mips_declare_object (stream, name, init_string,
6340 "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
6342 else
6343 mips_declare_object (stream, name, init_string,
6344 "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
6345 size, align / BITS_PER_UNIT);
6348 /* Emit either a label, .comm, or .lcomm directive. When using assembler
6349 macros, mark the symbol as written so that mips_file_end won't emit an
6350 .extern for it. STREAM is the output file, NAME is the name of the
6351 symbol, INIT_STRING is the string that should be written before the
6352 symbol and FINAL_STRING is the string that should be written after it.
6353 FINAL_STRING is a printf() format that consumes the remaining arguments. */
6355 void
6356 mips_declare_object (FILE *stream, const char *name, const char *init_string,
6357 const char *final_string, ...)
6359 va_list ap;
6361 fputs (init_string, stream);
6362 assemble_name (stream, name);
6363 va_start (ap, final_string);
6364 vfprintf (stream, final_string, ap);
6365 va_end (ap);
6367 if (!TARGET_EXPLICIT_RELOCS)
6369 tree name_tree = get_identifier (name);
6370 TREE_ASM_WRITTEN (name_tree) = 1;
6374 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
6375 extern int size_directive_output;
6377 /* Implement ASM_DECLARE_OBJECT_NAME. This is like most of the standard ELF
6378 definitions except that it uses mips_declare_object() to emit the label. */
6380 void
6381 mips_declare_object_name (FILE *stream, const char *name,
6382 tree decl ATTRIBUTE_UNUSED)
6384 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
6385 ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
6386 #endif
6388 size_directive_output = 0;
6389 if (!flag_inhibit_size_directive && DECL_SIZE (decl))
6391 HOST_WIDE_INT size;
6393 size_directive_output = 1;
6394 size = int_size_in_bytes (TREE_TYPE (decl));
6395 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
6398 mips_declare_object (stream, name, "", ":\n");
6401 /* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
6403 void
6404 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
6406 const char *name;
6408 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
6409 if (!flag_inhibit_size_directive
6410 && DECL_SIZE (decl) != 0
6411 && !at_end && top_level
6412 && DECL_INITIAL (decl) == error_mark_node
6413 && !size_directive_output)
6415 HOST_WIDE_INT size;
6417 size_directive_output = 1;
6418 size = int_size_in_bytes (TREE_TYPE (decl));
6419 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
6422 #endif
6424 /* Return true if X is a small data address that can be rewritten
6425 as a LO_SUM. */
6427 static bool
6428 mips_rewrite_small_data_p (rtx x)
6430 enum mips_symbol_type symbol_type;
6432 return (TARGET_EXPLICIT_RELOCS
6433 && mips_symbolic_constant_p (x, &symbol_type)
6434 && symbol_type == SYMBOL_SMALL_DATA);
6438 /* A for_each_rtx callback for mips_small_data_pattern_p. */
6440 static int
6441 mips_small_data_pattern_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
6443 if (GET_CODE (*loc) == LO_SUM)
6444 return -1;
6446 return mips_rewrite_small_data_p (*loc);
6449 /* Return true if OP refers to small data symbols directly, not through
6450 a LO_SUM. */
6452 bool
6453 mips_small_data_pattern_p (rtx op)
6455 return for_each_rtx (&op, mips_small_data_pattern_1, 0);
6458 /* A for_each_rtx callback, used by mips_rewrite_small_data. */
6460 static int
6461 mips_rewrite_small_data_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
6463 if (mips_rewrite_small_data_p (*loc))
6464 *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
6466 if (GET_CODE (*loc) == LO_SUM)
6467 return -1;
6469 return 0;
6472 /* If possible, rewrite OP so that it refers to small data using
6473 explicit relocations. */
6476 mips_rewrite_small_data (rtx op)
6478 op = copy_insn (op);
6479 for_each_rtx (&op, mips_rewrite_small_data_1, 0);
6480 return op;
6483 /* Return true if the current function has an insn that implicitly
6484 refers to $gp. */
6486 static bool
6487 mips_function_has_gp_insn (void)
6489 /* Don't bother rechecking if we found one last time. */
6490 if (!cfun->machine->has_gp_insn_p)
6492 rtx insn;
6494 push_topmost_sequence ();
6495 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6496 if (INSN_P (insn)
6497 && GET_CODE (PATTERN (insn)) != USE
6498 && GET_CODE (PATTERN (insn)) != CLOBBER
6499 && (get_attr_got (insn) != GOT_UNSET
6500 || small_data_pattern (PATTERN (insn), VOIDmode)))
6501 break;
6502 pop_topmost_sequence ();
6504 cfun->machine->has_gp_insn_p = (insn != 0);
6506 return cfun->machine->has_gp_insn_p;
6510 /* Return the register that should be used as the global pointer
6511 within this function. Return 0 if the function doesn't need
6512 a global pointer. */
6514 static unsigned int
6515 mips_global_pointer (void)
6517 unsigned int regno;
6519 /* $gp is always available unless we're using a GOT. */
6520 if (!TARGET_USE_GOT)
6521 return GLOBAL_POINTER_REGNUM;
6523 /* We must always provide $gp when it is used implicitly. */
6524 if (!TARGET_EXPLICIT_RELOCS)
6525 return GLOBAL_POINTER_REGNUM;
6527 /* FUNCTION_PROFILER includes a jal macro, so we need to give it
6528 a valid gp. */
6529 if (current_function_profile)
6530 return GLOBAL_POINTER_REGNUM;
6532 /* If the function has a nonlocal goto, $gp must hold the correct
6533 global pointer for the target function. */
6534 if (current_function_has_nonlocal_goto)
6535 return GLOBAL_POINTER_REGNUM;
6537 /* If the gp is never referenced, there's no need to initialize it.
6538 Note that reload can sometimes introduce constant pool references
6539 into a function that otherwise didn't need them. For example,
6540 suppose we have an instruction like:
6542 (set (reg:DF R1) (float:DF (reg:SI R2)))
6544 If R2 turns out to be constant such as 1, the instruction may have a
6545 REG_EQUAL note saying that R1 == 1.0. Reload then has the option of
6546 using this constant if R2 doesn't get allocated to a register.
6548 In cases like these, reload will have added the constant to the pool
6549 but no instruction will yet refer to it. */
6550 if (!df_regs_ever_live_p (GLOBAL_POINTER_REGNUM)
6551 && !current_function_uses_const_pool
6552 && !mips_function_has_gp_insn ())
6553 return 0;
6555 /* We need a global pointer, but perhaps we can use a call-clobbered
6556 register instead of $gp. */
6557 if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
6558 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6559 if (!df_regs_ever_live_p (regno)
6560 && call_used_regs[regno]
6561 && !fixed_regs[regno]
6562 && regno != PIC_FUNCTION_ADDR_REGNUM)
6563 return regno;
6565 return GLOBAL_POINTER_REGNUM;
6569 /* Return true if the function return value MODE will get returned in a
6570 floating-point register. */
6572 static bool
6573 mips_return_mode_in_fpr_p (enum machine_mode mode)
6575 return ((GET_MODE_CLASS (mode) == MODE_FLOAT
6576 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
6577 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
6578 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
6581 /* Return a two-character string representing a function floating-point
6582 return mode, used to name MIPS16 function stubs. */
6584 static const char *
6585 mips16_call_stub_mode_suffix (enum machine_mode mode)
6587 if (mode == SFmode)
6588 return "sf";
6589 else if (mode == DFmode)
6590 return "df";
6591 else if (mode == SCmode)
6592 return "sc";
6593 else if (mode == DCmode)
6594 return "dc";
6595 else if (mode == V2SFmode)
6596 return "df";
6597 else
6598 gcc_unreachable ();
6601 /* Return true if the current function returns its value in a floating-point
6602 register in MIPS16 mode. */
6604 static bool
6605 mips16_cfun_returns_in_fpr_p (void)
6607 tree return_type = DECL_RESULT (current_function_decl);
6608 return (mips16_hard_float
6609 && !aggregate_value_p (return_type, current_function_decl)
6610 && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
6614 /* Return true if the current function must save REGNO. */
6616 static bool
6617 mips_save_reg_p (unsigned int regno)
6619 /* We only need to save $gp if TARGET_CALL_SAVED_GP and only then
6620 if we have not chosen a call-clobbered substitute. */
6621 if (regno == GLOBAL_POINTER_REGNUM)
6622 return TARGET_CALL_SAVED_GP && cfun->machine->global_pointer == regno;
6624 /* Check call-saved registers. */
6625 if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
6626 return true;
6628 /* Save both registers in an FPR pair if either one is used. This is
6629 needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
6630 register to be used without the even register. */
6631 if (FP_REG_P (regno)
6632 && MAX_FPRS_PER_FMT == 2
6633 && df_regs_ever_live_p (regno + 1)
6634 && !call_used_regs[regno + 1])
6635 return true;
6637 /* We need to save the old frame pointer before setting up a new one. */
6638 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
6639 return true;
6641 /* We need to save the incoming return address if it is ever clobbered
6642 within the function. */
6643 if (regno == GP_REG_FIRST + 31 && df_regs_ever_live_p (regno))
6644 return true;
6646 if (TARGET_MIPS16)
6648 /* $18 is a special case in mips16 code. It may be used to call
6649 a function which returns a floating point value, but it is
6650 marked in call_used_regs. */
6651 if (regno == GP_REG_FIRST + 18 && df_regs_ever_live_p (regno))
6652 return true;
6654 /* $31 is also a special case. It will be used to copy a return
6655 value into the floating point registers if the return value is
6656 floating point. */
6657 if (regno == GP_REG_FIRST + 31
6658 && mips16_cfun_returns_in_fpr_p ())
6659 return true;
6662 return false;
6665 /* Return the index of the lowest X in the range [0, SIZE) for which
6666 bit REGS[X] is set in MASK. Return SIZE if there is no such X. */
6668 static unsigned int
6669 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
6670 unsigned int size)
6672 unsigned int i;
6674 for (i = 0; i < size; i++)
6675 if (BITSET_P (mask, regs[i]))
6676 break;
6678 return i;
6681 /* *MASK_PTR is a mask of general purpose registers and *GP_REG_SIZE_PTR
6682 is the number of bytes that they occupy. If *MASK_PTR contains REGS[X]
6683 for some X in [0, SIZE), adjust *MASK_PTR and *GP_REG_SIZE_PTR so that
6684 the same is true for all indexes (X, SIZE). */
6686 static void
6687 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
6688 unsigned int size, HOST_WIDE_INT *gp_reg_size_ptr)
6690 unsigned int i;
6692 i = mips16e_find_first_register (*mask_ptr, regs, size);
6693 for (i++; i < size; i++)
6694 if (!BITSET_P (*mask_ptr, regs[i]))
6696 *gp_reg_size_ptr += GET_MODE_SIZE (gpr_mode);
6697 *mask_ptr |= 1 << regs[i];
6701 /* Return the bytes needed to compute the frame pointer from the current
6702 stack pointer. SIZE is the size (in bytes) of the local variables.
6704 MIPS stack frames look like:
6706 Before call After call
6707 high +-----------------------+ +-----------------------+
6708 mem. | | | |
6709 | caller's temps. | | caller's temps. |
6710 | | | |
6711 +-----------------------+ +-----------------------+
6712 | | | |
6713 | arguments on stack. | | arguments on stack. |
6714 | | | |
6715 +-----------------------+ +-----------------------+
6716 | 4 words to save | | 4 words to save |
6717 | arguments passed | | arguments passed |
6718 | in registers, even | | in registers, even |
6719 | if not passed. | | if not passed. |
6720 SP->+-----------------------+ VFP->+-----------------------+
6721 (VFP = SP+fp_sp_offset) | |\
6722 | fp register save | | fp_reg_size
6723 | |/
6724 SP+gp_sp_offset->+-----------------------+
6725 /| |\
6726 | | gp register save | | gp_reg_size
6727 gp_reg_rounded | | |/
6728 | +-----------------------+
6729 \| alignment padding |
6730 +-----------------------+
6731 | |\
6732 | local variables | | var_size
6733 | |/
6734 +-----------------------+
6736 | alloca allocations |
6738 +-----------------------+
6739 /| |
6740 cprestore_size | | GP save for V.4 abi |
6741 \| |
6742 +-----------------------+
6743 | |\
6744 | arguments on stack | |
6745 | | |
6746 +-----------------------+ |
6747 | 4 words to save | | args_size
6748 | arguments passed | |
6749 | in registers, even | |
6750 | if not passed. | |
6751 low | (TARGET_OLDABI only) |/
6752 memory SP->+-----------------------+
6756 HOST_WIDE_INT
6757 compute_frame_size (HOST_WIDE_INT size)
6759 unsigned int regno;
6760 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
6761 HOST_WIDE_INT var_size; /* # bytes that variables take up */
6762 HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
6763 HOST_WIDE_INT cprestore_size; /* # bytes that the cprestore slot takes up */
6764 HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */
6765 HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
6766 HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
6767 unsigned int mask; /* mask of saved gp registers */
6768 unsigned int fmask; /* mask of saved fp registers */
6770 cfun->machine->global_pointer = mips_global_pointer ();
6772 gp_reg_size = 0;
6773 fp_reg_size = 0;
6774 mask = 0;
6775 fmask = 0;
6776 var_size = MIPS_STACK_ALIGN (size);
6777 args_size = current_function_outgoing_args_size;
6778 cprestore_size = MIPS_STACK_ALIGN (STARTING_FRAME_OFFSET) - args_size;
6780 /* The space set aside by STARTING_FRAME_OFFSET isn't needed in leaf
6781 functions. If the function has local variables, we're committed
6782 to allocating it anyway. Otherwise reclaim it here. */
6783 if (var_size == 0 && current_function_is_leaf)
6784 cprestore_size = args_size = 0;
6786 /* The MIPS 3.0 linker does not like functions that dynamically
6787 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
6788 looks like we are trying to create a second frame pointer to the
6789 function, so allocate some stack space to make it happy. */
6791 if (args_size == 0 && current_function_calls_alloca)
6792 args_size = 4 * UNITS_PER_WORD;
6794 total_size = var_size + args_size + cprestore_size;
6796 /* Calculate space needed for gp registers. */
6797 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6798 if (mips_save_reg_p (regno))
6800 gp_reg_size += GET_MODE_SIZE (gpr_mode);
6801 mask |= 1 << (regno - GP_REG_FIRST);
6804 /* We need to restore these for the handler. */
6805 if (current_function_calls_eh_return)
6807 unsigned int i;
6808 for (i = 0; ; ++i)
6810 regno = EH_RETURN_DATA_REGNO (i);
6811 if (regno == INVALID_REGNUM)
6812 break;
6813 gp_reg_size += GET_MODE_SIZE (gpr_mode);
6814 mask |= 1 << (regno - GP_REG_FIRST);
6818 /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
6819 $a3-$a0 and $s2-$s8. If we save one register in the range, we must
6820 save all later registers too. */
6821 if (GENERATE_MIPS16E_SAVE_RESTORE)
6823 mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
6824 ARRAY_SIZE (mips16e_s2_s8_regs), &gp_reg_size);
6825 mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
6826 ARRAY_SIZE (mips16e_a0_a3_regs), &gp_reg_size);
6829 /* This loop must iterate over the same space as its companion in
6830 mips_for_each_saved_reg. */
6831 for (regno = (FP_REG_LAST - MAX_FPRS_PER_FMT + 1);
6832 regno >= FP_REG_FIRST;
6833 regno -= MAX_FPRS_PER_FMT)
6835 if (mips_save_reg_p (regno))
6837 fp_reg_size += MAX_FPRS_PER_FMT * UNITS_PER_FPREG;
6838 fmask |= ((1 << MAX_FPRS_PER_FMT) - 1) << (regno - FP_REG_FIRST);
6842 gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
6843 total_size += gp_reg_rounded + MIPS_STACK_ALIGN (fp_reg_size);
6845 /* Add in the space required for saving incoming register arguments. */
6846 total_size += current_function_pretend_args_size;
6847 total_size += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
6849 /* Save other computed information. */
6850 cfun->machine->frame.total_size = total_size;
6851 cfun->machine->frame.var_size = var_size;
6852 cfun->machine->frame.args_size = args_size;
6853 cfun->machine->frame.cprestore_size = cprestore_size;
6854 cfun->machine->frame.gp_reg_size = gp_reg_size;
6855 cfun->machine->frame.fp_reg_size = fp_reg_size;
6856 cfun->machine->frame.mask = mask;
6857 cfun->machine->frame.fmask = fmask;
6858 cfun->machine->frame.initialized = reload_completed;
6859 cfun->machine->frame.num_gp = gp_reg_size / UNITS_PER_WORD;
6860 cfun->machine->frame.num_fp = (fp_reg_size
6861 / (MAX_FPRS_PER_FMT * UNITS_PER_FPREG));
6863 if (mask)
6865 HOST_WIDE_INT offset;
6867 if (GENERATE_MIPS16E_SAVE_RESTORE)
6868 /* MIPS16e SAVE and RESTORE instructions require the GP save area
6869 to be aligned at the high end with any padding at the low end.
6870 It is only safe to use this calculation for o32, where we never
6871 have pretend arguments, and where any varargs will be saved in
6872 the caller-allocated area rather than at the top of the frame. */
6873 offset = (total_size - GET_MODE_SIZE (gpr_mode));
6874 else
6875 offset = (args_size + cprestore_size + var_size
6876 + gp_reg_size - GET_MODE_SIZE (gpr_mode));
6877 cfun->machine->frame.gp_sp_offset = offset;
6878 cfun->machine->frame.gp_save_offset = offset - total_size;
6880 else
6882 cfun->machine->frame.gp_sp_offset = 0;
6883 cfun->machine->frame.gp_save_offset = 0;
6886 if (fmask)
6888 HOST_WIDE_INT offset;
6890 offset = (args_size + cprestore_size + var_size
6891 + gp_reg_rounded + fp_reg_size
6892 - MAX_FPRS_PER_FMT * UNITS_PER_FPREG);
6893 cfun->machine->frame.fp_sp_offset = offset;
6894 cfun->machine->frame.fp_save_offset = offset - total_size;
6896 else
6898 cfun->machine->frame.fp_sp_offset = 0;
6899 cfun->machine->frame.fp_save_offset = 0;
6902 /* Ok, we're done. */
6903 return total_size;
6906 /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame
6907 pointer or argument pointer. TO is either the stack pointer or
6908 hard frame pointer. */
6910 HOST_WIDE_INT
6911 mips_initial_elimination_offset (int from, int to)
6913 HOST_WIDE_INT offset;
6915 compute_frame_size (get_frame_size ());
6917 /* Set OFFSET to the offset from the stack pointer. */
6918 switch (from)
6920 case FRAME_POINTER_REGNUM:
6921 offset = 0;
6922 break;
6924 case ARG_POINTER_REGNUM:
6925 offset = (cfun->machine->frame.total_size
6926 - current_function_pretend_args_size);
6927 break;
6929 default:
6930 gcc_unreachable ();
6933 if (TARGET_MIPS16 && to == HARD_FRAME_POINTER_REGNUM)
6934 offset -= cfun->machine->frame.args_size;
6936 return offset;
6939 /* Implement RETURN_ADDR_RTX. Note, we do not support moving
6940 back to a previous frame. */
6942 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
6944 if (count != 0)
6945 return const0_rtx;
6947 return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
6950 /* Use FN to save or restore register REGNO. MODE is the register's
6951 mode and OFFSET is the offset of its save slot from the current
6952 stack pointer. */
6954 static void
6955 mips_save_restore_reg (enum machine_mode mode, int regno,
6956 HOST_WIDE_INT offset, mips_save_restore_fn fn)
6958 rtx mem;
6960 mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
6962 fn (gen_rtx_REG (mode, regno), mem);
6966 /* Call FN for each register that is saved by the current function.
6967 SP_OFFSET is the offset of the current stack pointer from the start
6968 of the frame. */
6970 static void
6971 mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
6973 enum machine_mode fpr_mode;
6974 HOST_WIDE_INT offset;
6975 int regno;
6977 /* Save registers starting from high to low. The debuggers prefer at least
6978 the return register be stored at func+4, and also it allows us not to
6979 need a nop in the epilogue if at least one register is reloaded in
6980 addition to return address. */
6981 offset = cfun->machine->frame.gp_sp_offset - sp_offset;
6982 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
6983 if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
6985 mips_save_restore_reg (gpr_mode, regno, offset, fn);
6986 offset -= GET_MODE_SIZE (gpr_mode);
6989 /* This loop must iterate over the same space as its companion in
6990 compute_frame_size. */
6991 offset = cfun->machine->frame.fp_sp_offset - sp_offset;
6992 fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
6993 for (regno = (FP_REG_LAST - MAX_FPRS_PER_FMT + 1);
6994 regno >= FP_REG_FIRST;
6995 regno -= MAX_FPRS_PER_FMT)
6996 if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
6998 mips_save_restore_reg (fpr_mode, regno, offset, fn);
6999 offset -= GET_MODE_SIZE (fpr_mode);
7003 /* If we're generating n32 or n64 abicalls, and the current function
7004 does not use $28 as its global pointer, emit a cplocal directive.
7005 Use pic_offset_table_rtx as the argument to the directive. */
7007 static void
7008 mips_output_cplocal (void)
7010 if (!TARGET_EXPLICIT_RELOCS
7011 && cfun->machine->global_pointer > 0
7012 && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
7013 output_asm_insn (".cplocal %+", 0);
7016 /* Return the style of GP load sequence that is being used for the
7017 current function. */
7019 enum mips_loadgp_style
7020 mips_current_loadgp_style (void)
7022 if (!TARGET_USE_GOT || cfun->machine->global_pointer == 0)
7023 return LOADGP_NONE;
7025 if (TARGET_RTP_PIC)
7026 return LOADGP_RTP;
7028 if (TARGET_ABSOLUTE_ABICALLS)
7029 return LOADGP_ABSOLUTE;
7031 return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
7034 /* The __gnu_local_gp symbol. */
7036 static GTY(()) rtx mips_gnu_local_gp;
7038 /* If we're generating n32 or n64 abicalls, emit instructions
7039 to set up the global pointer. */
7041 static void
7042 mips_emit_loadgp (void)
7044 rtx addr, offset, incoming_address, base, index;
7046 switch (mips_current_loadgp_style ())
7048 case LOADGP_ABSOLUTE:
7049 if (mips_gnu_local_gp == NULL)
7051 mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
7052 SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
7054 emit_insn (gen_loadgp_absolute (mips_gnu_local_gp));
7055 break;
7057 case LOADGP_NEWABI:
7058 addr = XEXP (DECL_RTL (current_function_decl), 0);
7059 offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
7060 incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
7061 emit_insn (gen_loadgp_newabi (offset, incoming_address));
7062 if (!TARGET_EXPLICIT_RELOCS)
7063 emit_insn (gen_loadgp_blockage ());
7064 break;
7066 case LOADGP_RTP:
7067 base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
7068 index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
7069 emit_insn (gen_loadgp_rtp (base, index));
7070 if (!TARGET_EXPLICIT_RELOCS)
7071 emit_insn (gen_loadgp_blockage ());
7072 break;
7074 default:
7075 break;
7079 /* Set up the stack and frame (if desired) for the function. */
7081 static void
7082 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
7084 const char *fnname;
7085 HOST_WIDE_INT tsize = cfun->machine->frame.total_size;
7087 #ifdef SDB_DEBUGGING_INFO
7088 if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
7089 SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
7090 #endif
7092 /* In mips16 mode, we may need to generate a 32 bit to handle
7093 floating point arguments. The linker will arrange for any 32-bit
7094 functions to call this stub, which will then jump to the 16-bit
7095 function proper. */
7096 if (mips16_hard_float
7097 && current_function_args_info.fp_code != 0)
7098 build_mips16_function_stub (file);
7100 if (!FUNCTION_NAME_ALREADY_DECLARED)
7102 /* Get the function name the same way that toplev.c does before calling
7103 assemble_start_function. This is needed so that the name used here
7104 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
7105 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
7107 if (!flag_inhibit_size_directive)
7109 fputs ("\t.ent\t", file);
7110 assemble_name (file, fnname);
7111 fputs ("\n", file);
7114 assemble_name (file, fnname);
7115 fputs (":\n", file);
7118 /* Stop mips_file_end from treating this function as external. */
7119 if (TARGET_IRIX && mips_abi == ABI_32)
7120 TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
7122 if (!flag_inhibit_size_directive)
7124 /* .frame FRAMEREG, FRAMESIZE, RETREG */
7125 fprintf (file,
7126 "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
7127 "# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
7128 ", args= " HOST_WIDE_INT_PRINT_DEC
7129 ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
7130 (reg_names[(frame_pointer_needed)
7131 ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
7132 ((frame_pointer_needed && TARGET_MIPS16)
7133 ? tsize - cfun->machine->frame.args_size
7134 : tsize),
7135 reg_names[GP_REG_FIRST + 31],
7136 cfun->machine->frame.var_size,
7137 cfun->machine->frame.num_gp,
7138 cfun->machine->frame.num_fp,
7139 cfun->machine->frame.args_size,
7140 cfun->machine->frame.cprestore_size);
7142 /* .mask MASK, GPOFFSET; .fmask FPOFFSET */
7143 fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
7144 cfun->machine->frame.mask,
7145 cfun->machine->frame.gp_save_offset);
7146 fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
7147 cfun->machine->frame.fmask,
7148 cfun->machine->frame.fp_save_offset);
7150 /* Require:
7151 OLD_SP == *FRAMEREG + FRAMESIZE => can find old_sp from nominated FP reg.
7152 HIGHEST_GP_SAVED == *FRAMEREG + FRAMESIZE + GPOFFSET => can find saved regs. */
7155 if (mips_current_loadgp_style () == LOADGP_OLDABI)
7157 /* Handle the initialization of $gp for SVR4 PIC. */
7158 if (!cfun->machine->all_noreorder_p)
7159 output_asm_insn ("%(.cpload\t%^%)", 0);
7160 else
7161 output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
7163 else if (cfun->machine->all_noreorder_p)
7164 output_asm_insn ("%(%<", 0);
7166 /* Tell the assembler which register we're using as the global
7167 pointer. This is needed for thunks, since they can use either
7168 explicit relocs or assembler macros. */
7169 mips_output_cplocal ();
7172 /* Make the last instruction frame related and note that it performs
7173 the operation described by FRAME_PATTERN. */
7175 static void
7176 mips_set_frame_expr (rtx frame_pattern)
7178 rtx insn;
7180 insn = get_last_insn ();
7181 RTX_FRAME_RELATED_P (insn) = 1;
7182 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
7183 frame_pattern,
7184 REG_NOTES (insn));
7188 /* Return a frame-related rtx that stores REG at MEM.
7189 REG must be a single register. */
7191 static rtx
7192 mips_frame_set (rtx mem, rtx reg)
7194 rtx set;
7196 /* If we're saving the return address register and the dwarf return
7197 address column differs from the hard register number, adjust the
7198 note reg to refer to the former. */
7199 if (REGNO (reg) == GP_REG_FIRST + 31
7200 && DWARF_FRAME_RETURN_COLUMN != GP_REG_FIRST + 31)
7201 reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
7203 set = gen_rtx_SET (VOIDmode, mem, reg);
7204 RTX_FRAME_RELATED_P (set) = 1;
7206 return set;
7210 /* Save register REG to MEM. Make the instruction frame-related. */
7212 static void
7213 mips_save_reg (rtx reg, rtx mem)
7215 if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
7217 rtx x1, x2;
7219 if (mips_split_64bit_move_p (mem, reg))
7220 mips_split_64bit_move (mem, reg);
7221 else
7222 emit_move_insn (mem, reg);
7224 x1 = mips_frame_set (mips_subword (mem, 0), mips_subword (reg, 0));
7225 x2 = mips_frame_set (mips_subword (mem, 1), mips_subword (reg, 1));
7226 mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
7228 else
7230 if (TARGET_MIPS16
7231 && REGNO (reg) != GP_REG_FIRST + 31
7232 && !M16_REG_P (REGNO (reg)))
7234 /* Save a non-mips16 register by moving it through a temporary.
7235 We don't need to do this for $31 since there's a special
7236 instruction for it. */
7237 emit_move_insn (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
7238 emit_move_insn (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
7240 else
7241 emit_move_insn (mem, reg);
7243 mips_set_frame_expr (mips_frame_set (mem, reg));
7247 /* Return a move between register REGNO and memory location SP + OFFSET.
7248 Make the move a load if RESTORE_P, otherwise make it a frame-related
7249 store. */
7251 static rtx
7252 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
7253 unsigned int regno)
7255 rtx reg, mem;
7257 mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
7258 reg = gen_rtx_REG (SImode, regno);
7259 return (restore_p
7260 ? gen_rtx_SET (VOIDmode, reg, mem)
7261 : mips_frame_set (mem, reg));
7264 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
7265 The instruction must:
7267 - Allocate or deallocate SIZE bytes in total; SIZE is known
7268 to be nonzero.
7270 - Save or restore as many registers in *MASK_PTR as possible.
7271 The instruction saves the first registers at the top of the
7272 allocated area, with the other registers below it.
7274 - Save NARGS argument registers above the allocated area.
7276 (NARGS is always zero if RESTORE_P.)
7278 The SAVE and RESTORE instructions cannot save and restore all general
7279 registers, so there may be some registers left over for the caller to
7280 handle. Destructively modify *MASK_PTR so that it contains the registers
7281 that still need to be saved or restored. The caller can save these
7282 registers in the memory immediately below *OFFSET_PTR, which is a
7283 byte offset from the bottom of the allocated stack area. */
7285 static rtx
7286 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
7287 HOST_WIDE_INT *offset_ptr, unsigned int nargs,
7288 HOST_WIDE_INT size)
7290 rtx pattern, set;
7291 HOST_WIDE_INT offset, top_offset;
7292 unsigned int i, regno;
7293 int n;
7295 gcc_assert (cfun->machine->frame.fp_reg_size == 0);
7297 /* Calculate the number of elements in the PARALLEL. We need one element
7298 for the stack adjustment, one for each argument register save, and one
7299 for each additional register move. */
7300 n = 1 + nargs;
7301 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7302 if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
7303 n++;
7305 /* Create the final PARALLEL. */
7306 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
7307 n = 0;
7309 /* Add the stack pointer adjustment. */
7310 set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7311 plus_constant (stack_pointer_rtx,
7312 restore_p ? size : -size));
7313 RTX_FRAME_RELATED_P (set) = 1;
7314 XVECEXP (pattern, 0, n++) = set;
7316 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
7317 top_offset = restore_p ? size : 0;
7319 /* Save the arguments. */
7320 for (i = 0; i < nargs; i++)
7322 offset = top_offset + i * GET_MODE_SIZE (gpr_mode);
7323 set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
7324 XVECEXP (pattern, 0, n++) = set;
7327 /* Then fill in the other register moves. */
7328 offset = top_offset;
7329 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
7331 regno = mips16e_save_restore_regs[i];
7332 if (BITSET_P (*mask_ptr, regno))
7334 offset -= UNITS_PER_WORD;
7335 set = mips16e_save_restore_reg (restore_p, offset, regno);
7336 XVECEXP (pattern, 0, n++) = set;
7337 *mask_ptr &= ~(1 << regno);
7341 /* Tell the caller what offset it should use for the remaining registers. */
7342 *offset_ptr = size + (offset - top_offset) + size;
7344 gcc_assert (n == XVECLEN (pattern, 0));
7346 return pattern;
7349 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
7350 pointer. Return true if PATTERN matches the kind of instruction
7351 generated by mips16e_build_save_restore. If INFO is nonnull,
7352 initialize it when returning true. */
7354 bool
7355 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
7356 struct mips16e_save_restore_info *info)
7358 unsigned int i, nargs, mask;
7359 HOST_WIDE_INT top_offset, save_offset, offset, extra;
7360 rtx set, reg, mem, base;
7361 int n;
7363 if (!GENERATE_MIPS16E_SAVE_RESTORE)
7364 return false;
7366 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
7367 top_offset = adjust > 0 ? adjust : 0;
7369 /* Interpret all other members of the PARALLEL. */
7370 save_offset = top_offset - GET_MODE_SIZE (gpr_mode);
7371 mask = 0;
7372 nargs = 0;
7373 i = 0;
7374 for (n = 1; n < XVECLEN (pattern, 0); n++)
7376 /* Check that we have a SET. */
7377 set = XVECEXP (pattern, 0, n);
7378 if (GET_CODE (set) != SET)
7379 return false;
7381 /* Check that the SET is a load (if restoring) or a store
7382 (if saving). */
7383 mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
7384 if (!MEM_P (mem))
7385 return false;
7387 /* Check that the address is the sum of the stack pointer and a
7388 possibly-zero constant offset. */
7389 mips_split_plus (XEXP (mem, 0), &base, &offset);
7390 if (base != stack_pointer_rtx)
7391 return false;
7393 /* Check that SET's other operand is a register. */
7394 reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
7395 if (!REG_P (reg))
7396 return false;
7398 /* Check for argument saves. */
7399 if (offset == top_offset + nargs * GET_MODE_SIZE (gpr_mode)
7400 && REGNO (reg) == GP_ARG_FIRST + nargs)
7401 nargs++;
7402 else if (offset == save_offset)
7404 while (mips16e_save_restore_regs[i++] != REGNO (reg))
7405 if (i == ARRAY_SIZE (mips16e_save_restore_regs))
7406 return false;
7408 mask |= 1 << REGNO (reg);
7409 save_offset -= GET_MODE_SIZE (gpr_mode);
7411 else
7412 return false;
7415 /* Check that the restrictions on register ranges are met. */
7416 extra = 0;
7417 mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
7418 ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
7419 mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
7420 ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
7421 if (extra != 0)
7422 return false;
7424 /* Make sure that the topmost argument register is not saved twice.
7425 The checks above ensure that the same is then true for the other
7426 argument registers. */
7427 if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
7428 return false;
7430 /* Pass back information, if requested. */
7431 if (info)
7433 info->nargs = nargs;
7434 info->mask = mask;
7435 info->size = (adjust > 0 ? adjust : -adjust);
7438 return true;
7441 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
7442 for the register range [MIN_REG, MAX_REG]. Return a pointer to
7443 the null terminator. */
7445 static char *
7446 mips16e_add_register_range (char *s, unsigned int min_reg,
7447 unsigned int max_reg)
7449 if (min_reg != max_reg)
7450 s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
7451 else
7452 s += sprintf (s, ",%s", reg_names[min_reg]);
7453 return s;
7456 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
7457 PATTERN and ADJUST are as for mips16e_save_restore_pattern_p. */
7459 const char *
7460 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
7462 static char buffer[300];
7464 struct mips16e_save_restore_info info;
7465 unsigned int i, end;
7466 char *s;
7468 /* Parse the pattern. */
7469 if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
7470 gcc_unreachable ();
7472 /* Add the mnemonic. */
7473 s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
7474 s += strlen (s);
7476 /* Save the arguments. */
7477 if (info.nargs > 1)
7478 s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
7479 reg_names[GP_ARG_FIRST + info.nargs - 1]);
7480 else if (info.nargs == 1)
7481 s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
7483 /* Emit the amount of stack space to allocate or deallocate. */
7484 s += sprintf (s, "%d", (int) info.size);
7486 /* Save or restore $16. */
7487 if (BITSET_P (info.mask, 16))
7488 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
7490 /* Save or restore $17. */
7491 if (BITSET_P (info.mask, 17))
7492 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
7494 /* Save or restore registers in the range $s2...$s8, which
7495 mips16e_s2_s8_regs lists in decreasing order. Note that this
7496 is a software register range; the hardware registers are not
7497 numbered consecutively. */
7498 end = ARRAY_SIZE (mips16e_s2_s8_regs);
7499 i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
7500 if (i < end)
7501 s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
7502 mips16e_s2_s8_regs[i]);
7504 /* Save or restore registers in the range $a0...$a3. */
7505 end = ARRAY_SIZE (mips16e_a0_a3_regs);
7506 i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
7507 if (i < end)
7508 s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
7509 mips16e_a0_a3_regs[end - 1]);
7511 /* Save or restore $31. */
7512 if (BITSET_P (info.mask, 31))
7513 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 31]);
7515 return buffer;
7518 /* Return a simplified form of X using the register values in REG_VALUES.
7519 REG_VALUES[R] is the last value assigned to hard register R, or null
7520 if R has not been modified.
7522 This function is rather limited, but is good enough for our purposes. */
7524 static rtx
7525 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
7527 rtx x0, x1;
7529 x = avoid_constant_pool_reference (x);
7531 if (UNARY_P (x))
7533 x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7534 return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
7535 x0, GET_MODE (XEXP (x, 0)));
7538 if (ARITHMETIC_P (x))
7540 x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
7541 x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
7542 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
7545 if (REG_P (x)
7546 && reg_values[REGNO (x)]
7547 && !rtx_unstable_p (reg_values[REGNO (x)]))
7548 return reg_values[REGNO (x)];
7550 return x;
7553 /* Return true if (set DEST SRC) stores an argument register into its
7554 caller-allocated save slot, storing the number of that argument
7555 register in *REGNO_PTR if so. REG_VALUES is as for
7556 mips16e_collect_propagate_value. */
7558 static bool
7559 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
7560 unsigned int *regno_ptr)
7562 unsigned int argno, regno;
7563 HOST_WIDE_INT offset, required_offset;
7564 rtx addr, base;
7566 /* Check that this is a word-mode store. */
7567 if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
7568 return false;
7570 /* Check that the register being saved is an unmodified argument
7571 register. */
7572 regno = REGNO (src);
7573 if (regno < GP_ARG_FIRST || regno > GP_ARG_LAST || reg_values[regno])
7574 return false;
7575 argno = regno - GP_ARG_FIRST;
7577 /* Check whether the address is an appropriate stack pointer or
7578 frame pointer access. The frame pointer is offset from the
7579 stack pointer by the size of the outgoing arguments. */
7580 addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
7581 mips_split_plus (addr, &base, &offset);
7582 required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
7583 if (base == hard_frame_pointer_rtx)
7584 required_offset -= cfun->machine->frame.args_size;
7585 else if (base != stack_pointer_rtx)
7586 return false;
7587 if (offset != required_offset)
7588 return false;
7590 *regno_ptr = regno;
7591 return true;
7594 /* A subroutine of mips_expand_prologue, called only when generating
7595 MIPS16e SAVE instructions. Search the start of the function for any
7596 instructions that save argument registers into their caller-allocated
7597 save slots. Delete such instructions and return a value N such that
7598 saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
7599 instructions redundant. */
7601 static unsigned int
7602 mips16e_collect_argument_saves (void)
7604 rtx reg_values[FIRST_PSEUDO_REGISTER];
7605 rtx insn, next, set, dest, src;
7606 unsigned int nargs, regno;
7608 push_topmost_sequence ();
7609 nargs = 0;
7610 memset (reg_values, 0, sizeof (reg_values));
7611 for (insn = get_insns (); insn; insn = next)
7613 next = NEXT_INSN (insn);
7614 if (NOTE_P (insn))
7615 continue;
7617 if (!INSN_P (insn))
7618 break;
7620 set = PATTERN (insn);
7621 if (GET_CODE (set) != SET)
7622 break;
7624 dest = SET_DEST (set);
7625 src = SET_SRC (set);
7626 if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
7628 if (!BITSET_P (cfun->machine->frame.mask, regno))
7630 delete_insn (insn);
7631 nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
7634 else if (REG_P (dest) && GET_MODE (dest) == word_mode)
7635 reg_values[REGNO (dest)]
7636 = mips16e_collect_propagate_value (src, reg_values);
7637 else
7638 break;
7640 pop_topmost_sequence ();
7642 return nargs;
7645 /* Expand the prologue into a bunch of separate insns. */
7647 void
7648 mips_expand_prologue (void)
7650 HOST_WIDE_INT size;
7651 unsigned int nargs;
7652 rtx insn;
7654 if (cfun->machine->global_pointer > 0)
7655 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
7657 size = compute_frame_size (get_frame_size ());
7659 /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
7660 bytes beforehand; this is enough to cover the register save area
7661 without going out of range. */
7662 if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
7664 HOST_WIDE_INT step1;
7666 step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
7668 if (GENERATE_MIPS16E_SAVE_RESTORE)
7670 HOST_WIDE_INT offset;
7671 unsigned int mask, regno;
7673 /* Try to merge argument stores into the save instruction. */
7674 nargs = mips16e_collect_argument_saves ();
7676 /* Build the save instruction. */
7677 mask = cfun->machine->frame.mask;
7678 insn = mips16e_build_save_restore (false, &mask, &offset,
7679 nargs, step1);
7680 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
7681 size -= step1;
7683 /* Check if we need to save other registers. */
7684 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
7685 if (BITSET_P (mask, regno - GP_REG_FIRST))
7687 offset -= GET_MODE_SIZE (gpr_mode);
7688 mips_save_restore_reg (gpr_mode, regno, offset, mips_save_reg);
7691 else
7693 insn = gen_add3_insn (stack_pointer_rtx,
7694 stack_pointer_rtx,
7695 GEN_INT (-step1));
7696 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
7697 size -= step1;
7698 mips_for_each_saved_reg (size, mips_save_reg);
7702 /* Allocate the rest of the frame. */
7703 if (size > 0)
7705 if (SMALL_OPERAND (-size))
7706 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
7707 stack_pointer_rtx,
7708 GEN_INT (-size)))) = 1;
7709 else
7711 emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
7712 if (TARGET_MIPS16)
7714 /* There are no instructions to add or subtract registers
7715 from the stack pointer, so use the frame pointer as a
7716 temporary. We should always be using a frame pointer
7717 in this case anyway. */
7718 gcc_assert (frame_pointer_needed);
7719 emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
7720 emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
7721 hard_frame_pointer_rtx,
7722 MIPS_PROLOGUE_TEMP (Pmode)));
7723 emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
7725 else
7726 emit_insn (gen_sub3_insn (stack_pointer_rtx,
7727 stack_pointer_rtx,
7728 MIPS_PROLOGUE_TEMP (Pmode)));
7730 /* Describe the combined effect of the previous instructions. */
7731 mips_set_frame_expr
7732 (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7733 plus_constant (stack_pointer_rtx, -size)));
7737 /* Set up the frame pointer, if we're using one. In mips16 code,
7738 we point the frame pointer ahead of the outgoing argument area.
7739 This should allow more variables & incoming arguments to be
7740 accessed with unextended instructions. */
7741 if (frame_pointer_needed)
7743 if (TARGET_MIPS16 && cfun->machine->frame.args_size != 0)
7745 rtx offset = GEN_INT (cfun->machine->frame.args_size);
7746 if (SMALL_OPERAND (cfun->machine->frame.args_size))
7747 RTX_FRAME_RELATED_P
7748 (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
7749 stack_pointer_rtx,
7750 offset))) = 1;
7751 else
7753 emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), offset);
7754 emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
7755 emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
7756 hard_frame_pointer_rtx,
7757 MIPS_PROLOGUE_TEMP (Pmode)));
7758 mips_set_frame_expr
7759 (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
7760 plus_constant (stack_pointer_rtx,
7761 cfun->machine->frame.args_size)));
7764 else
7765 RTX_FRAME_RELATED_P (emit_move_insn (hard_frame_pointer_rtx,
7766 stack_pointer_rtx)) = 1;
7769 mips_emit_loadgp ();
7771 /* If generating o32/o64 abicalls, save $gp on the stack. */
7772 if (TARGET_ABICALLS && TARGET_OLDABI && !current_function_is_leaf)
7773 emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
7775 /* If we are profiling, make sure no instructions are scheduled before
7776 the call to mcount. */
7778 if (current_function_profile)
7779 emit_insn (gen_blockage ());
7782 /* Do any necessary cleanup after a function to restore stack, frame,
7783 and regs. */
7785 #define RA_MASK BITMASK_HIGH /* 1 << 31 */
7787 static void
7788 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
7789 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
7791 /* Reinstate the normal $gp. */
7792 SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
7793 mips_output_cplocal ();
7795 if (cfun->machine->all_noreorder_p)
7797 /* Avoid using %>%) since it adds excess whitespace. */
7798 output_asm_insn (".set\tmacro", 0);
7799 output_asm_insn (".set\treorder", 0);
7800 set_noreorder = set_nomacro = 0;
7803 if (!FUNCTION_NAME_ALREADY_DECLARED && !flag_inhibit_size_directive)
7805 const char *fnname;
7807 /* Get the function name the same way that toplev.c does before calling
7808 assemble_start_function. This is needed so that the name used here
7809 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
7810 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
7811 fputs ("\t.end\t", file);
7812 assemble_name (file, fnname);
7813 fputs ("\n", file);
7817 /* Emit instructions to restore register REG from slot MEM. */
7819 static void
7820 mips_restore_reg (rtx reg, rtx mem)
7822 /* There's no mips16 instruction to load $31 directly. Load into
7823 $7 instead and adjust the return insn appropriately. */
7824 if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
7825 reg = gen_rtx_REG (GET_MODE (reg), 7);
7827 if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
7829 /* Can't restore directly; move through a temporary. */
7830 emit_move_insn (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
7831 emit_move_insn (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
7833 else
7834 emit_move_insn (reg, mem);
7838 /* Expand the epilogue into a bunch of separate insns. SIBCALL_P is true
7839 if this epilogue precedes a sibling call, false if it is for a normal
7840 "epilogue" pattern. */
7842 void
7843 mips_expand_epilogue (int sibcall_p)
7845 HOST_WIDE_INT step1, step2;
7846 rtx base, target;
7848 if (!sibcall_p && mips_can_use_return_insn ())
7850 emit_jump_insn (gen_return ());
7851 return;
7854 /* In mips16 mode, if the return value should go into a floating-point
7855 register, we need to call a helper routine to copy it over. */
7856 if (mips16_cfun_returns_in_fpr_p ())
7858 char *name;
7859 rtx func;
7860 rtx insn;
7861 rtx retval;
7862 rtx call;
7863 tree id;
7864 tree return_type;
7865 enum machine_mode return_mode;
7867 return_type = DECL_RESULT (current_function_decl);
7868 return_mode = DECL_MODE (return_type);
7870 name = ACONCAT (("__mips16_ret_",
7871 mips16_call_stub_mode_suffix (return_mode),
7872 NULL));
7873 id = get_identifier (name);
7874 func = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
7875 retval = gen_rtx_REG (return_mode, GP_RETURN);
7876 call = gen_call_value_internal (retval, func, const0_rtx);
7877 insn = emit_call_insn (call);
7878 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
7881 /* Split the frame into two. STEP1 is the amount of stack we should
7882 deallocate before restoring the registers. STEP2 is the amount we
7883 should deallocate afterwards.
7885 Start off by assuming that no registers need to be restored. */
7886 step1 = cfun->machine->frame.total_size;
7887 step2 = 0;
7889 /* Work out which register holds the frame address. Account for the
7890 frame pointer offset used by mips16 code. */
7891 if (!frame_pointer_needed)
7892 base = stack_pointer_rtx;
7893 else
7895 base = hard_frame_pointer_rtx;
7896 if (TARGET_MIPS16)
7897 step1 -= cfun->machine->frame.args_size;
7900 /* If we need to restore registers, deallocate as much stack as
7901 possible in the second step without going out of range. */
7902 if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
7904 step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
7905 step1 -= step2;
7908 /* Set TARGET to BASE + STEP1. */
7909 target = base;
7910 if (step1 > 0)
7912 rtx adjust;
7914 /* Get an rtx for STEP1 that we can add to BASE. */
7915 adjust = GEN_INT (step1);
7916 if (!SMALL_OPERAND (step1))
7918 emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), adjust);
7919 adjust = MIPS_EPILOGUE_TEMP (Pmode);
7922 /* Normal mode code can copy the result straight into $sp. */
7923 if (!TARGET_MIPS16)
7924 target = stack_pointer_rtx;
7926 emit_insn (gen_add3_insn (target, base, adjust));
7929 /* Copy TARGET into the stack pointer. */
7930 if (target != stack_pointer_rtx)
7931 emit_move_insn (stack_pointer_rtx, target);
7933 /* If we're using addressing macros, $gp is implicitly used by all
7934 SYMBOL_REFs. We must emit a blockage insn before restoring $gp
7935 from the stack. */
7936 if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
7937 emit_insn (gen_blockage ());
7939 if (GENERATE_MIPS16E_SAVE_RESTORE && cfun->machine->frame.mask != 0)
7941 unsigned int regno, mask;
7942 HOST_WIDE_INT offset;
7943 rtx restore;
7945 /* Generate the restore instruction. */
7946 mask = cfun->machine->frame.mask;
7947 restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
7949 /* Restore any other registers manually. */
7950 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
7951 if (BITSET_P (mask, regno - GP_REG_FIRST))
7953 offset -= GET_MODE_SIZE (gpr_mode);
7954 mips_save_restore_reg (gpr_mode, regno, offset, mips_restore_reg);
7957 /* Restore the remaining registers and deallocate the final bit
7958 of the frame. */
7959 emit_insn (restore);
7961 else
7963 /* Restore the registers. */
7964 mips_for_each_saved_reg (cfun->machine->frame.total_size - step2,
7965 mips_restore_reg);
7967 /* Deallocate the final bit of the frame. */
7968 if (step2 > 0)
7969 emit_insn (gen_add3_insn (stack_pointer_rtx,
7970 stack_pointer_rtx,
7971 GEN_INT (step2)));
7974 /* Add in the __builtin_eh_return stack adjustment. We need to
7975 use a temporary in mips16 code. */
7976 if (current_function_calls_eh_return)
7978 if (TARGET_MIPS16)
7980 emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
7981 emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
7982 MIPS_EPILOGUE_TEMP (Pmode),
7983 EH_RETURN_STACKADJ_RTX));
7984 emit_move_insn (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
7986 else
7987 emit_insn (gen_add3_insn (stack_pointer_rtx,
7988 stack_pointer_rtx,
7989 EH_RETURN_STACKADJ_RTX));
7992 if (!sibcall_p)
7994 /* When generating MIPS16 code, the normal mips_for_each_saved_reg
7995 path will restore the return address into $7 rather than $31. */
7996 if (TARGET_MIPS16
7997 && !GENERATE_MIPS16E_SAVE_RESTORE
7998 && (cfun->machine->frame.mask & RA_MASK) != 0)
7999 emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
8000 GP_REG_FIRST + 7)));
8001 else
8002 emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
8003 GP_REG_FIRST + 31)));
8007 /* Return nonzero if this function is known to have a null epilogue.
8008 This allows the optimizer to omit jumps to jumps if no stack
8009 was created. */
8012 mips_can_use_return_insn (void)
8014 if (! reload_completed)
8015 return 0;
8017 if (df_regs_ever_live_p (31) || current_function_profile)
8018 return 0;
8020 /* In mips16 mode, a function that returns a floating point value
8021 needs to arrange to copy the return value into the floating point
8022 registers. */
8023 if (mips16_cfun_returns_in_fpr_p ())
8024 return 0;
8026 if (cfun->machine->frame.initialized)
8027 return cfun->machine->frame.total_size == 0;
8029 return compute_frame_size (get_frame_size ()) == 0;
8032 /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
8033 in order to avoid duplicating too much logic from elsewhere. */
8035 static void
8036 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
8037 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
8038 tree function)
8040 rtx this, temp1, temp2, insn, fnaddr;
8042 /* Pretend to be a post-reload pass while generating rtl. */
8043 reload_completed = 1;
8045 /* Mark the end of the (empty) prologue. */
8046 emit_note (NOTE_INSN_PROLOGUE_END);
8048 /* Pick a global pointer. Use a call-clobbered register if
8049 TARGET_CALL_SAVED_GP, so that we can use a sibcall. */
8050 if (TARGET_USE_GOT)
8052 cfun->machine->global_pointer =
8053 TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
8055 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
8059 /* Set up the global pointer for n32 or n64 abicalls. If
8060 LOADGP_ABSOLUTE then the thunk does not use the gp and there is
8061 no need to load it.*/
8062 if (mips_current_loadgp_style () != LOADGP_ABSOLUTE
8063 || !targetm.binds_local_p (function))
8064 mips_emit_loadgp ();
8066 /* We need two temporary registers in some cases. */
8067 temp1 = gen_rtx_REG (Pmode, 2);
8068 temp2 = gen_rtx_REG (Pmode, 3);
8070 /* Find out which register contains the "this" pointer. */
8071 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
8072 this = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
8073 else
8074 this = gen_rtx_REG (Pmode, GP_ARG_FIRST);
8076 /* Add DELTA to THIS. */
8077 if (delta != 0)
8079 rtx offset = GEN_INT (delta);
8080 if (!SMALL_OPERAND (delta))
8082 emit_move_insn (temp1, offset);
8083 offset = temp1;
8085 emit_insn (gen_add3_insn (this, this, offset));
8088 /* If needed, add *(*THIS + VCALL_OFFSET) to THIS. */
8089 if (vcall_offset != 0)
8091 rtx addr;
8093 /* Set TEMP1 to *THIS. */
8094 emit_move_insn (temp1, gen_rtx_MEM (Pmode, this));
8096 /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET. */
8097 addr = mips_add_offset (temp2, temp1, vcall_offset);
8099 /* Load the offset and add it to THIS. */
8100 emit_move_insn (temp1, gen_rtx_MEM (Pmode, addr));
8101 emit_insn (gen_add3_insn (this, this, temp1));
8104 /* Jump to the target function. Use a sibcall if direct jumps are
8105 allowed, otherwise load the address into a register first. */
8106 fnaddr = XEXP (DECL_RTL (function), 0);
8107 if (TARGET_MIPS16 || TARGET_USE_GOT || SYMBOL_REF_LONG_CALL_P (fnaddr))
8109 /* This is messy. gas treats "la $25,foo" as part of a call
8110 sequence and may allow a global "foo" to be lazily bound.
8111 The general move patterns therefore reject this combination.
8113 In this context, lazy binding would actually be OK
8114 for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
8115 TARGET_CALL_SAVED_GP; see mips_load_call_address.
8116 We must therefore load the address via a temporary
8117 register if mips_dangerous_for_la25_p.
8119 If we jump to the temporary register rather than $25, the assembler
8120 can use the move insn to fill the jump's delay slot. */
8121 if (TARGET_USE_PIC_FN_ADDR_REG
8122 && !mips_dangerous_for_la25_p (fnaddr))
8123 temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
8124 mips_load_call_address (temp1, fnaddr, true);
8126 if (TARGET_USE_PIC_FN_ADDR_REG
8127 && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
8128 emit_move_insn (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
8129 emit_jump_insn (gen_indirect_jump (temp1));
8131 else
8133 insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
8134 SIBLING_CALL_P (insn) = 1;
8137 /* Run just enough of rest_of_compilation. This sequence was
8138 "borrowed" from alpha.c. */
8139 insn = get_insns ();
8140 insn_locators_alloc ();
8141 split_all_insns_noflow ();
8142 if (TARGET_MIPS16)
8143 mips16_lay_out_constants ();
8144 shorten_branches (insn);
8145 final_start_function (insn, file, 1);
8146 final (insn, file, 1);
8147 final_end_function ();
8149 /* Clean up the vars set above. Note that final_end_function resets
8150 the global pointer for us. */
8151 reload_completed = 0;
8154 /* Returns nonzero if X contains a SYMBOL_REF. */
8156 static int
8157 symbolic_expression_p (rtx x)
8159 if (GET_CODE (x) == SYMBOL_REF)
8160 return 1;
8162 if (GET_CODE (x) == CONST)
8163 return symbolic_expression_p (XEXP (x, 0));
8165 if (UNARY_P (x))
8166 return symbolic_expression_p (XEXP (x, 0));
8168 if (ARITHMETIC_P (x))
8169 return (symbolic_expression_p (XEXP (x, 0))
8170 || symbolic_expression_p (XEXP (x, 1)));
8172 return 0;
8175 /* Choose the section to use for the constant rtx expression X that has
8176 mode MODE. */
8178 static section *
8179 mips_select_rtx_section (enum machine_mode mode, rtx x,
8180 unsigned HOST_WIDE_INT align)
8182 if (TARGET_MIPS16)
8184 /* In mips16 mode, the constant table always goes in the same section
8185 as the function, so that constants can be loaded using PC relative
8186 addressing. */
8187 return function_section (current_function_decl);
8189 else if (TARGET_EMBEDDED_DATA)
8191 /* For embedded applications, always put constants in read-only data,
8192 in order to reduce RAM usage. */
8193 return mergeable_constant_section (mode, align, 0);
8195 else
8197 /* For hosted applications, always put constants in small data if
8198 possible, as this gives the best performance. */
8199 /* ??? Consider using mergeable small data sections. */
8201 if (GET_MODE_SIZE (mode) <= (unsigned) mips_section_threshold
8202 && mips_section_threshold > 0)
8203 return get_named_section (NULL, ".sdata", 0);
8204 else if (flag_pic && symbolic_expression_p (x))
8205 return get_named_section (NULL, ".data.rel.ro", 3);
8206 else
8207 return mergeable_constant_section (mode, align, 0);
8211 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
8213 The complication here is that, with the combination TARGET_ABICALLS
8214 && !TARGET_GPWORD, jump tables will use absolute addresses, and should
8215 therefore not be included in the read-only part of a DSO. Handle such
8216 cases by selecting a normal data section instead of a read-only one.
8217 The logic apes that in default_function_rodata_section. */
8219 static section *
8220 mips_function_rodata_section (tree decl)
8222 if (!TARGET_ABICALLS || TARGET_GPWORD)
8223 return default_function_rodata_section (decl);
8225 if (decl && DECL_SECTION_NAME (decl))
8227 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8228 if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
8230 char *rname = ASTRDUP (name);
8231 rname[14] = 'd';
8232 return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
8234 else if (flag_function_sections && flag_data_sections
8235 && strncmp (name, ".text.", 6) == 0)
8237 char *rname = ASTRDUP (name);
8238 memcpy (rname + 1, "data", 4);
8239 return get_section (rname, SECTION_WRITE, decl);
8242 return data_section;
8245 /* Implement TARGET_IN_SMALL_DATA_P. This function controls whether
8246 locally-defined objects go in a small data section. It also controls
8247 the setting of the SYMBOL_REF_SMALL_P flag, which in turn helps
8248 mips_classify_symbol decide when to use %gp_rel(...)($gp) accesses. */
8250 static bool
8251 mips_in_small_data_p (tree decl)
8253 HOST_WIDE_INT size;
8255 if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8256 return false;
8258 /* We don't yet generate small-data references for -mabicalls or
8259 VxWorks RTP code. See the related -G handling in override_options. */
8260 if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8261 return false;
8263 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8265 const char *name;
8267 /* Reject anything that isn't in a known small-data section. */
8268 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8269 if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8270 return false;
8272 /* If a symbol is defined externally, the assembler will use the
8273 usual -G rules when deciding how to implement macros. */
8274 if (TARGET_EXPLICIT_RELOCS || !DECL_EXTERNAL (decl))
8275 return true;
8277 else if (TARGET_EMBEDDED_DATA)
8279 /* Don't put constants into the small data section: we want them
8280 to be in ROM rather than RAM. */
8281 if (TREE_CODE (decl) != VAR_DECL)
8282 return false;
8284 if (TREE_READONLY (decl)
8285 && !TREE_SIDE_EFFECTS (decl)
8286 && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8287 return false;
8290 size = int_size_in_bytes (TREE_TYPE (decl));
8291 return (size > 0 && size <= mips_section_threshold);
8294 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use
8295 anchors for small data: the GP register acts as an anchor in that
8296 case. We also don't want to use them for PC-relative accesses,
8297 where the PC acts as an anchor. */
8299 static bool
8300 mips_use_anchors_for_symbol_p (rtx symbol)
8302 switch (mips_classify_symbol (symbol))
8304 case SYMBOL_CONSTANT_POOL:
8305 case SYMBOL_SMALL_DATA:
8306 return false;
8308 default:
8309 return true;
8313 /* See whether VALTYPE is a record whose fields should be returned in
8314 floating-point registers. If so, return the number of fields and
8315 list them in FIELDS (which should have two elements). Return 0
8316 otherwise.
8318 For n32 & n64, a structure with one or two fields is returned in
8319 floating-point registers as long as every field has a floating-point
8320 type. */
8322 static int
8323 mips_fpr_return_fields (tree valtype, tree *fields)
8325 tree field;
8326 int i;
8328 if (!TARGET_NEWABI)
8329 return 0;
8331 if (TREE_CODE (valtype) != RECORD_TYPE)
8332 return 0;
8334 i = 0;
8335 for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
8337 if (TREE_CODE (field) != FIELD_DECL)
8338 continue;
8340 if (TREE_CODE (TREE_TYPE (field)) != REAL_TYPE)
8341 return 0;
8343 if (i == 2)
8344 return 0;
8346 fields[i++] = field;
8348 return i;
8352 /* Implement TARGET_RETURN_IN_MSB. For n32 & n64, we should return
8353 a value in the most significant part of $2/$3 if:
8355 - the target is big-endian;
8357 - the value has a structure or union type (we generalize this to
8358 cover aggregates from other languages too); and
8360 - the structure is not returned in floating-point registers. */
8362 static bool
8363 mips_return_in_msb (tree valtype)
8365 tree fields[2];
8367 return (TARGET_NEWABI
8368 && TARGET_BIG_ENDIAN
8369 && AGGREGATE_TYPE_P (valtype)
8370 && mips_fpr_return_fields (valtype, fields) == 0);
8374 /* Return a composite value in a pair of floating-point registers.
8375 MODE1 and OFFSET1 are the mode and byte offset for the first value,
8376 likewise MODE2 and OFFSET2 for the second. MODE is the mode of the
8377 complete value.
8379 For n32 & n64, $f0 always holds the first value and $f2 the second.
8380 Otherwise the values are packed together as closely as possible. */
8382 static rtx
8383 mips_return_fpr_pair (enum machine_mode mode,
8384 enum machine_mode mode1, HOST_WIDE_INT offset1,
8385 enum machine_mode mode2, HOST_WIDE_INT offset2)
8387 int inc;
8389 inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
8390 return gen_rtx_PARALLEL
8391 (mode,
8392 gen_rtvec (2,
8393 gen_rtx_EXPR_LIST (VOIDmode,
8394 gen_rtx_REG (mode1, FP_RETURN),
8395 GEN_INT (offset1)),
8396 gen_rtx_EXPR_LIST (VOIDmode,
8397 gen_rtx_REG (mode2, FP_RETURN + inc),
8398 GEN_INT (offset2))));
8403 /* Implement FUNCTION_VALUE and LIBCALL_VALUE. For normal calls,
8404 VALTYPE is the return type and MODE is VOIDmode. For libcalls,
8405 VALTYPE is null and MODE is the mode of the return value. */
8408 mips_function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
8409 enum machine_mode mode)
8411 if (valtype)
8413 tree fields[2];
8414 int unsignedp;
8416 mode = TYPE_MODE (valtype);
8417 unsignedp = TYPE_UNSIGNED (valtype);
8419 /* Since we define TARGET_PROMOTE_FUNCTION_RETURN that returns
8420 true, we must promote the mode just as PROMOTE_MODE does. */
8421 mode = promote_mode (valtype, mode, &unsignedp, 1);
8423 /* Handle structures whose fields are returned in $f0/$f2. */
8424 switch (mips_fpr_return_fields (valtype, fields))
8426 case 1:
8427 return gen_rtx_REG (mode, FP_RETURN);
8429 case 2:
8430 return mips_return_fpr_pair (mode,
8431 TYPE_MODE (TREE_TYPE (fields[0])),
8432 int_byte_position (fields[0]),
8433 TYPE_MODE (TREE_TYPE (fields[1])),
8434 int_byte_position (fields[1]));
8437 /* If a value is passed in the most significant part of a register, see
8438 whether we have to round the mode up to a whole number of words. */
8439 if (mips_return_in_msb (valtype))
8441 HOST_WIDE_INT size = int_size_in_bytes (valtype);
8442 if (size % UNITS_PER_WORD != 0)
8444 size += UNITS_PER_WORD - size % UNITS_PER_WORD;
8445 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
8449 /* For EABI, the class of return register depends entirely on MODE.
8450 For example, "struct { some_type x; }" and "union { some_type x; }"
8451 are returned in the same way as a bare "some_type" would be.
8452 Other ABIs only use FPRs for scalar, complex or vector types. */
8453 if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
8454 return gen_rtx_REG (mode, GP_RETURN);
8457 if (!TARGET_MIPS16)
8459 /* Handle long doubles for n32 & n64. */
8460 if (mode == TFmode)
8461 return mips_return_fpr_pair (mode,
8462 DImode, 0,
8463 DImode, GET_MODE_SIZE (mode) / 2);
8465 if (mips_return_mode_in_fpr_p (mode))
8467 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
8468 return mips_return_fpr_pair (mode,
8469 GET_MODE_INNER (mode), 0,
8470 GET_MODE_INNER (mode),
8471 GET_MODE_SIZE (mode) / 2);
8472 else
8473 return gen_rtx_REG (mode, FP_RETURN);
8477 return gen_rtx_REG (mode, GP_RETURN);
8480 /* Return nonzero when an argument must be passed by reference. */
8482 static bool
8483 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
8484 enum machine_mode mode, tree type,
8485 bool named ATTRIBUTE_UNUSED)
8487 if (mips_abi == ABI_EABI)
8489 int size;
8491 /* ??? How should SCmode be handled? */
8492 if (mode == DImode || mode == DFmode)
8493 return 0;
8495 size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
8496 return size == -1 || size > UNITS_PER_WORD;
8498 else
8500 /* If we have a variable-sized parameter, we have no choice. */
8501 return targetm.calls.must_pass_in_stack (mode, type);
8505 static bool
8506 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
8507 enum machine_mode mode ATTRIBUTE_UNUSED,
8508 tree type ATTRIBUTE_UNUSED, bool named)
8510 return mips_abi == ABI_EABI && named;
8513 /* Return true if registers of class CLASS cannot change from mode FROM
8514 to mode TO. */
8516 bool
8517 mips_cannot_change_mode_class (enum machine_mode from,
8518 enum machine_mode to, enum reg_class class)
8520 if (MIN (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) <= UNITS_PER_WORD
8521 && MAX (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) > UNITS_PER_WORD)
8523 if (TARGET_BIG_ENDIAN)
8525 /* When a multi-word value is stored in paired floating-point
8526 registers, the first register always holds the low word.
8527 We therefore can't allow FPRs to change between single-word
8528 and multi-word modes. */
8529 if (MAX_FPRS_PER_FMT > 1 && reg_classes_intersect_p (FP_REGS, class))
8530 return true;
8534 /* gcc assumes that each word of a multiword register can be accessed
8535 individually using SUBREGs. This is not true for floating-point
8536 registers if they are bigger than a word. */
8537 if (UNITS_PER_FPREG > UNITS_PER_WORD
8538 && GET_MODE_SIZE (from) > UNITS_PER_WORD
8539 && GET_MODE_SIZE (to) < UNITS_PER_FPREG
8540 && reg_classes_intersect_p (FP_REGS, class))
8541 return true;
8543 /* Loading a 32-bit value into a 64-bit floating-point register
8544 will not sign-extend the value, despite what LOAD_EXTEND_OP says.
8545 We can't allow 64-bit float registers to change from SImode to
8546 to a wider mode. */
8547 if (TARGET_64BIT
8548 && TARGET_FLOAT64
8549 && from == SImode
8550 && GET_MODE_SIZE (to) >= UNITS_PER_WORD
8551 && reg_classes_intersect_p (FP_REGS, class))
8552 return true;
8554 return false;
8557 /* Return true if X should not be moved directly into register $25.
8558 We need this because many versions of GAS will treat "la $25,foo" as
8559 part of a call sequence and so allow a global "foo" to be lazily bound. */
8561 bool
8562 mips_dangerous_for_la25_p (rtx x)
8564 return (!TARGET_EXPLICIT_RELOCS
8565 && TARGET_USE_GOT
8566 && GET_CODE (x) == SYMBOL_REF
8567 && mips_global_symbol_p (x));
8570 /* Implement PREFERRED_RELOAD_CLASS. */
8572 enum reg_class
8573 mips_preferred_reload_class (rtx x, enum reg_class class)
8575 if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
8576 return LEA_REGS;
8578 if (TARGET_HARD_FLOAT
8579 && FLOAT_MODE_P (GET_MODE (x))
8580 && reg_class_subset_p (FP_REGS, class))
8581 return FP_REGS;
8583 if (reg_class_subset_p (GR_REGS, class))
8584 class = GR_REGS;
8586 if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, class))
8587 class = M16_REGS;
8589 return class;
8592 /* This function returns the register class required for a secondary
8593 register when copying between one of the registers in CLASS, and X,
8594 using MODE. If IN_P is nonzero, the copy is going from X to the
8595 register, otherwise the register is the source. A return value of
8596 NO_REGS means that no secondary register is required. */
8598 enum reg_class
8599 mips_secondary_reload_class (enum reg_class class,
8600 enum machine_mode mode, rtx x, int in_p)
8602 enum reg_class gr_regs = TARGET_MIPS16 ? M16_REGS : GR_REGS;
8603 int regno = -1;
8604 int gp_reg_p;
8606 if (REG_P (x)|| GET_CODE (x) == SUBREG)
8607 regno = true_regnum (x);
8609 gp_reg_p = TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
8611 if (mips_dangerous_for_la25_p (x))
8613 gr_regs = LEA_REGS;
8614 if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], 25))
8615 return gr_regs;
8618 /* Copying from HI or LO to anywhere other than a general register
8619 requires a general register.
8620 This rule applies to both the original HI/LO pair and the new
8621 DSP accumulators. */
8622 if (reg_class_subset_p (class, ACC_REGS))
8624 if (TARGET_MIPS16 && in_p)
8626 /* We can't really copy to HI or LO at all in mips16 mode. */
8627 return M16_REGS;
8629 return gp_reg_p ? NO_REGS : gr_regs;
8631 if (ACC_REG_P (regno))
8633 if (TARGET_MIPS16 && ! in_p)
8635 /* We can't really copy to HI or LO at all in mips16 mode. */
8636 return M16_REGS;
8638 return class == gr_regs ? NO_REGS : gr_regs;
8641 /* We can only copy a value to a condition code register from a
8642 floating point register, and even then we require a scratch
8643 floating point register. We can only copy a value out of a
8644 condition code register into a general register. */
8645 if (class == ST_REGS)
8647 if (in_p)
8648 return FP_REGS;
8649 return gp_reg_p ? NO_REGS : gr_regs;
8651 if (ST_REG_P (regno))
8653 if (! in_p)
8654 return FP_REGS;
8655 return class == gr_regs ? NO_REGS : gr_regs;
8658 if (class == FP_REGS)
8660 if (MEM_P (x))
8662 /* In this case we can use lwc1, swc1, ldc1 or sdc1. */
8663 return NO_REGS;
8665 else if (CONSTANT_P (x) && GET_MODE_CLASS (mode) == MODE_FLOAT)
8667 /* We can use the l.s and l.d macros to load floating-point
8668 constants. ??? For l.s, we could probably get better
8669 code by returning GR_REGS here. */
8670 return NO_REGS;
8672 else if (gp_reg_p || x == CONST0_RTX (mode))
8674 /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
8675 return NO_REGS;
8677 else if (FP_REG_P (regno))
8679 /* In this case we can use mov.s or mov.d. */
8680 return NO_REGS;
8682 else
8684 /* Otherwise, we need to reload through an integer register. */
8685 return gr_regs;
8689 /* In mips16 mode, going between memory and anything but M16_REGS
8690 requires an M16_REG. */
8691 if (TARGET_MIPS16)
8693 if (class != M16_REGS && class != M16_NA_REGS)
8695 if (gp_reg_p)
8696 return NO_REGS;
8697 return M16_REGS;
8699 if (! gp_reg_p)
8701 if (class == M16_REGS || class == M16_NA_REGS)
8702 return NO_REGS;
8703 return M16_REGS;
8707 return NO_REGS;
8710 /* Implement CLASS_MAX_NREGS.
8712 - UNITS_PER_FPREG controls the number of registers needed by FP_REGS.
8714 - ST_REGS are always hold CCmode values, and CCmode values are
8715 considered to be 4 bytes wide.
8717 All other register classes are covered by UNITS_PER_WORD. Note that
8718 this is true even for unions of integer and float registers when the
8719 latter are smaller than the former. The only supported combination
8720 in which case this occurs is -mgp64 -msingle-float, which has 64-bit
8721 words but 32-bit float registers. A word-based calculation is correct
8722 in that case since -msingle-float disallows multi-FPR values. */
8725 mips_class_max_nregs (enum reg_class class ATTRIBUTE_UNUSED,
8726 enum machine_mode mode)
8728 if (class == ST_REGS)
8729 return (GET_MODE_SIZE (mode) + 3) / 4;
8730 else if (class == FP_REGS)
8731 return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
8732 else
8733 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8736 static bool
8737 mips_valid_pointer_mode (enum machine_mode mode)
8739 return (mode == SImode || (TARGET_64BIT && mode == DImode));
8742 /* Target hook for vector_mode_supported_p. */
8744 static bool
8745 mips_vector_mode_supported_p (enum machine_mode mode)
8747 switch (mode)
8749 case V2SFmode:
8750 return TARGET_PAIRED_SINGLE_FLOAT;
8752 case V2HImode:
8753 case V4QImode:
8754 return TARGET_DSP;
8756 default:
8757 return false;
8761 /* If we can access small data directly (using gp-relative relocation
8762 operators) return the small data pointer, otherwise return null.
8764 For each mips16 function which refers to GP relative symbols, we
8765 use a pseudo register, initialized at the start of the function, to
8766 hold the $gp value. */
8768 static rtx
8769 mips16_gp_pseudo_reg (void)
8771 if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
8773 rtx insn, scan;
8775 cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
8777 /* We want to initialize this to a value which gcc will believe
8778 is constant. */
8779 insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
8781 push_topmost_sequence ();
8782 /* We need to emit the initialization after the FUNCTION_BEG
8783 note, so that it will be integrated. */
8784 for (scan = get_insns (); scan != NULL_RTX; scan = NEXT_INSN (scan))
8785 if (NOTE_P (scan)
8786 && NOTE_KIND (scan) == NOTE_INSN_FUNCTION_BEG)
8787 break;
8788 if (scan == NULL_RTX)
8789 scan = get_insns ();
8790 insn = emit_insn_after (insn, scan);
8791 pop_topmost_sequence ();
8794 return cfun->machine->mips16_gp_pseudo_rtx;
8797 /* Write out code to move floating point arguments in or out of
8798 general registers. Output the instructions to FILE. FP_CODE is
8799 the code describing which arguments are present (see the comment at
8800 the definition of CUMULATIVE_ARGS in mips.h). FROM_FP_P is nonzero if
8801 we are copying from the floating point registers. */
8803 static void
8804 mips16_fp_args (FILE *file, int fp_code, int from_fp_p)
8806 const char *s;
8807 int gparg, fparg;
8808 unsigned int f;
8809 CUMULATIVE_ARGS cum;
8811 /* This code only works for the original 32-bit ABI and the O64 ABI. */
8812 gcc_assert (TARGET_OLDABI);
8814 if (from_fp_p)
8815 s = "mfc1";
8816 else
8817 s = "mtc1";
8819 init_cumulative_args (&cum, NULL, NULL);
8821 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
8823 enum machine_mode mode;
8824 struct mips_arg_info info;
8826 if ((f & 3) == 1)
8827 mode = SFmode;
8828 else if ((f & 3) == 2)
8829 mode = DFmode;
8830 else
8831 gcc_unreachable ();
8833 mips_arg_info (&cum, mode, NULL, true, &info);
8834 gparg = mips_arg_regno (&info, false);
8835 fparg = mips_arg_regno (&info, true);
8837 if (mode == SFmode)
8838 fprintf (file, "\t%s\t%s,%s\n", s,
8839 reg_names[gparg], reg_names[fparg]);
8840 else if (TARGET_64BIT)
8841 fprintf (file, "\td%s\t%s,%s\n", s,
8842 reg_names[gparg], reg_names[fparg]);
8843 else if (ISA_HAS_MXHC1)
8844 /* -mips32r2 -mfp64 */
8845 fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n",
8847 reg_names[gparg + (WORDS_BIG_ENDIAN ? 1 : 0)],
8848 reg_names[fparg],
8849 from_fp_p ? "mfhc1" : "mthc1",
8850 reg_names[gparg + (WORDS_BIG_ENDIAN ? 0 : 1)],
8851 reg_names[fparg]);
8852 else if (TARGET_BIG_ENDIAN)
8853 fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
8854 reg_names[gparg], reg_names[fparg + 1], s,
8855 reg_names[gparg + 1], reg_names[fparg]);
8856 else
8857 fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
8858 reg_names[gparg], reg_names[fparg], s,
8859 reg_names[gparg + 1], reg_names[fparg + 1]);
8861 function_arg_advance (&cum, mode, NULL, true);
8865 /* Build a mips16 function stub. This is used for functions which
8866 take arguments in the floating point registers. It is 32-bit code
8867 that moves the floating point args into the general registers, and
8868 then jumps to the 16-bit code. */
8870 static void
8871 build_mips16_function_stub (FILE *file)
8873 const char *fnname;
8874 char *secname, *stubname;
8875 tree stubid, stubdecl;
8876 int need_comma;
8877 unsigned int f;
8879 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
8880 secname = (char *) alloca (strlen (fnname) + 20);
8881 sprintf (secname, ".mips16.fn.%s", fnname);
8882 stubname = (char *) alloca (strlen (fnname) + 20);
8883 sprintf (stubname, "__fn_stub_%s", fnname);
8884 stubid = get_identifier (stubname);
8885 stubdecl = build_decl (FUNCTION_DECL, stubid,
8886 build_function_type (void_type_node, NULL_TREE));
8887 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
8888 DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
8890 fprintf (file, "\t# Stub function for %s (", current_function_name ());
8891 need_comma = 0;
8892 for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
8894 fprintf (file, "%s%s",
8895 need_comma ? ", " : "",
8896 (f & 3) == 1 ? "float" : "double");
8897 need_comma = 1;
8899 fprintf (file, ")\n");
8901 fprintf (file, "\t.set\tnomips16\n");
8902 switch_to_section (function_section (stubdecl));
8903 ASM_OUTPUT_ALIGN (file, floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT));
8905 /* ??? If FUNCTION_NAME_ALREADY_DECLARED is defined, then we are
8906 within a .ent, and we cannot emit another .ent. */
8907 if (!FUNCTION_NAME_ALREADY_DECLARED)
8909 fputs ("\t.ent\t", file);
8910 assemble_name (file, stubname);
8911 fputs ("\n", file);
8914 assemble_name (file, stubname);
8915 fputs (":\n", file);
8917 /* We don't want the assembler to insert any nops here. */
8918 fprintf (file, "\t.set\tnoreorder\n");
8920 mips16_fp_args (file, current_function_args_info.fp_code, 1);
8922 fprintf (asm_out_file, "\t.set\tnoat\n");
8923 fprintf (asm_out_file, "\tla\t%s,", reg_names[GP_REG_FIRST + 1]);
8924 assemble_name (file, fnname);
8925 fprintf (file, "\n");
8926 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
8927 fprintf (asm_out_file, "\t.set\tat\n");
8929 /* Unfortunately, we can't fill the jump delay slot. We can't fill
8930 with one of the mfc1 instructions, because the result is not
8931 available for one instruction, so if the very first instruction
8932 in the function refers to the register, it will see the wrong
8933 value. */
8934 fprintf (file, "\tnop\n");
8936 fprintf (file, "\t.set\treorder\n");
8938 if (!FUNCTION_NAME_ALREADY_DECLARED)
8940 fputs ("\t.end\t", file);
8941 assemble_name (file, stubname);
8942 fputs ("\n", file);
8945 fprintf (file, "\t.set\tmips16\n");
8947 switch_to_section (function_section (current_function_decl));
8950 /* We keep a list of functions for which we have already built stubs
8951 in build_mips16_call_stub. */
8953 struct mips16_stub
8955 struct mips16_stub *next;
8956 char *name;
8957 int fpret;
8960 static struct mips16_stub *mips16_stubs;
8962 /* Emit code to return a double value from a mips16 stub. GPREG is the
8963 first GP reg to use, FPREG is the first FP reg to use. */
8965 static void
8966 mips16_fpret_double (int gpreg, int fpreg)
8968 if (TARGET_64BIT)
8969 fprintf (asm_out_file, "\tdmfc1\t%s,%s\n",
8970 reg_names[gpreg], reg_names[fpreg]);
8971 else if (TARGET_FLOAT64)
8973 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8974 reg_names[gpreg + WORDS_BIG_ENDIAN],
8975 reg_names[fpreg]);
8976 fprintf (asm_out_file, "\tmfhc1\t%s,%s\n",
8977 reg_names[gpreg + !WORDS_BIG_ENDIAN],
8978 reg_names[fpreg]);
8980 else
8982 if (TARGET_BIG_ENDIAN)
8984 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8985 reg_names[gpreg + 0],
8986 reg_names[fpreg + 1]);
8987 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8988 reg_names[gpreg + 1],
8989 reg_names[fpreg + 0]);
8991 else
8993 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8994 reg_names[gpreg + 0],
8995 reg_names[fpreg + 0]);
8996 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8997 reg_names[gpreg + 1],
8998 reg_names[fpreg + 1]);
9003 /* Build a call stub for a mips16 call. A stub is needed if we are
9004 passing any floating point values which should go into the floating
9005 point registers. If we are, and the call turns out to be to a
9006 32-bit function, the stub will be used to move the values into the
9007 floating point registers before calling the 32-bit function. The
9008 linker will magically adjust the function call to either the 16-bit
9009 function or the 32-bit stub, depending upon where the function call
9010 is actually defined.
9012 Similarly, we need a stub if the return value might come back in a
9013 floating point register.
9015 RETVAL is the location of the return value, or null if this is
9016 a call rather than a call_value. FN is the address of the
9017 function and ARG_SIZE is the size of the arguments. FP_CODE
9018 is the code built by function_arg. This function returns a nonzero
9019 value if it builds the call instruction itself. */
9022 build_mips16_call_stub (rtx retval, rtx fn, rtx arg_size, int fp_code)
9024 int fpret = 0;
9025 const char *fnname;
9026 char *secname, *stubname;
9027 struct mips16_stub *l;
9028 tree stubid, stubdecl;
9029 int need_comma;
9030 unsigned int f;
9032 /* We don't need to do anything if we aren't in mips16 mode, or if
9033 we were invoked with the -msoft-float option. */
9034 if (!mips16_hard_float)
9035 return 0;
9037 /* Figure out whether the value might come back in a floating point
9038 register. */
9039 if (retval)
9040 fpret = mips_return_mode_in_fpr_p (GET_MODE (retval));
9042 /* We don't need to do anything if there were no floating point
9043 arguments and the value will not be returned in a floating point
9044 register. */
9045 if (fp_code == 0 && ! fpret)
9046 return 0;
9048 /* We don't need to do anything if this is a call to a special
9049 mips16 support function. */
9050 if (GET_CODE (fn) == SYMBOL_REF
9051 && strncmp (XSTR (fn, 0), "__mips16_", 9) == 0)
9052 return 0;
9054 /* This code will only work for o32 and o64 abis. The other ABI's
9055 require more sophisticated support. */
9056 gcc_assert (TARGET_OLDABI);
9058 /* If we're calling via a function pointer, then we must always call
9059 via a stub. There are magic stubs provided in libgcc.a for each
9060 of the required cases. Each of them expects the function address
9061 to arrive in register $2. */
9063 if (GET_CODE (fn) != SYMBOL_REF)
9065 char buf[30];
9066 tree id;
9067 rtx stub_fn, insn;
9069 /* ??? If this code is modified to support other ABI's, we need
9070 to handle PARALLEL return values here. */
9072 if (fpret)
9073 sprintf (buf, "__mips16_call_stub_%s_%d",
9074 mips16_call_stub_mode_suffix (GET_MODE (retval)),
9075 fp_code);
9076 else
9077 sprintf (buf, "__mips16_call_stub_%d",
9078 fp_code);
9080 id = get_identifier (buf);
9081 stub_fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
9083 emit_move_insn (gen_rtx_REG (Pmode, 2), fn);
9085 if (retval == NULL_RTX)
9086 insn = gen_call_internal (stub_fn, arg_size);
9087 else
9088 insn = gen_call_value_internal (retval, stub_fn, arg_size);
9089 insn = emit_call_insn (insn);
9091 /* Put the register usage information on the CALL. */
9092 CALL_INSN_FUNCTION_USAGE (insn) =
9093 gen_rtx_EXPR_LIST (VOIDmode,
9094 gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 2)),
9095 CALL_INSN_FUNCTION_USAGE (insn));
9097 /* If we are handling a floating point return value, we need to
9098 save $18 in the function prologue. Putting a note on the
9099 call will mean that df_regs_ever_live_p ($18) will be true if the
9100 call is not eliminated, and we can check that in the prologue
9101 code. */
9102 if (fpret)
9103 CALL_INSN_FUNCTION_USAGE (insn) =
9104 gen_rtx_EXPR_LIST (VOIDmode,
9105 gen_rtx_USE (VOIDmode,
9106 gen_rtx_REG (word_mode, 18)),
9107 CALL_INSN_FUNCTION_USAGE (insn));
9109 /* Return 1 to tell the caller that we've generated the call
9110 insn. */
9111 return 1;
9114 /* We know the function we are going to call. If we have already
9115 built a stub, we don't need to do anything further. */
9117 fnname = XSTR (fn, 0);
9118 for (l = mips16_stubs; l != NULL; l = l->next)
9119 if (strcmp (l->name, fnname) == 0)
9120 break;
9122 if (l == NULL)
9124 /* Build a special purpose stub. When the linker sees a
9125 function call in mips16 code, it will check where the target
9126 is defined. If the target is a 32-bit call, the linker will
9127 search for the section defined here. It can tell which
9128 symbol this section is associated with by looking at the
9129 relocation information (the name is unreliable, since this
9130 might be a static function). If such a section is found, the
9131 linker will redirect the call to the start of the magic
9132 section.
9134 If the function does not return a floating point value, the
9135 special stub section is named
9136 .mips16.call.FNNAME
9138 If the function does return a floating point value, the stub
9139 section is named
9140 .mips16.call.fp.FNNAME
9143 secname = (char *) alloca (strlen (fnname) + 40);
9144 sprintf (secname, ".mips16.call.%s%s",
9145 fpret ? "fp." : "",
9146 fnname);
9147 stubname = (char *) alloca (strlen (fnname) + 20);
9148 sprintf (stubname, "__call_stub_%s%s",
9149 fpret ? "fp_" : "",
9150 fnname);
9151 stubid = get_identifier (stubname);
9152 stubdecl = build_decl (FUNCTION_DECL, stubid,
9153 build_function_type (void_type_node, NULL_TREE));
9154 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
9155 DECL_RESULT (stubdecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
9157 fprintf (asm_out_file, "\t# Stub function to call %s%s (",
9158 (fpret
9159 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
9160 : ""),
9161 fnname);
9162 need_comma = 0;
9163 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
9165 fprintf (asm_out_file, "%s%s",
9166 need_comma ? ", " : "",
9167 (f & 3) == 1 ? "float" : "double");
9168 need_comma = 1;
9170 fprintf (asm_out_file, ")\n");
9172 fprintf (asm_out_file, "\t.set\tnomips16\n");
9173 assemble_start_function (stubdecl, stubname);
9175 if (!FUNCTION_NAME_ALREADY_DECLARED)
9177 fputs ("\t.ent\t", asm_out_file);
9178 assemble_name (asm_out_file, stubname);
9179 fputs ("\n", asm_out_file);
9181 assemble_name (asm_out_file, stubname);
9182 fputs (":\n", asm_out_file);
9185 /* We build the stub code by hand. That's the only way we can
9186 do it, since we can't generate 32-bit code during a 16-bit
9187 compilation. */
9189 /* We don't want the assembler to insert any nops here. */
9190 fprintf (asm_out_file, "\t.set\tnoreorder\n");
9192 mips16_fp_args (asm_out_file, fp_code, 0);
9194 if (! fpret)
9196 fprintf (asm_out_file, "\t.set\tnoat\n");
9197 fprintf (asm_out_file, "\tla\t%s,%s\n", reg_names[GP_REG_FIRST + 1],
9198 fnname);
9199 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
9200 fprintf (asm_out_file, "\t.set\tat\n");
9201 /* Unfortunately, we can't fill the jump delay slot. We
9202 can't fill with one of the mtc1 instructions, because the
9203 result is not available for one instruction, so if the
9204 very first instruction in the function refers to the
9205 register, it will see the wrong value. */
9206 fprintf (asm_out_file, "\tnop\n");
9208 else
9210 fprintf (asm_out_file, "\tmove\t%s,%s\n",
9211 reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
9212 fprintf (asm_out_file, "\tjal\t%s\n", fnname);
9213 /* As above, we can't fill the delay slot. */
9214 fprintf (asm_out_file, "\tnop\n");
9215 if (GET_MODE (retval) == SFmode)
9216 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9217 reg_names[GP_REG_FIRST + 2], reg_names[FP_REG_FIRST + 0]);
9218 else if (GET_MODE (retval) == SCmode)
9220 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9221 reg_names[GP_REG_FIRST + 2],
9222 reg_names[FP_REG_FIRST + 0]);
9223 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9224 reg_names[GP_REG_FIRST + 3],
9225 reg_names[FP_REG_FIRST + MAX_FPRS_PER_FMT]);
9227 else if (GET_MODE (retval) == DFmode
9228 || GET_MODE (retval) == V2SFmode)
9230 mips16_fpret_double (GP_REG_FIRST + 2, FP_REG_FIRST + 0);
9232 else if (GET_MODE (retval) == DCmode)
9234 mips16_fpret_double (GP_REG_FIRST + 2,
9235 FP_REG_FIRST + 0);
9236 mips16_fpret_double (GP_REG_FIRST + 4,
9237 FP_REG_FIRST + MAX_FPRS_PER_FMT);
9239 else
9241 if (TARGET_BIG_ENDIAN)
9243 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9244 reg_names[GP_REG_FIRST + 2],
9245 reg_names[FP_REG_FIRST + 1]);
9246 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9247 reg_names[GP_REG_FIRST + 3],
9248 reg_names[FP_REG_FIRST + 0]);
9250 else
9252 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9253 reg_names[GP_REG_FIRST + 2],
9254 reg_names[FP_REG_FIRST + 0]);
9255 fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
9256 reg_names[GP_REG_FIRST + 3],
9257 reg_names[FP_REG_FIRST + 1]);
9260 fprintf (asm_out_file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 18]);
9261 /* As above, we can't fill the delay slot. */
9262 fprintf (asm_out_file, "\tnop\n");
9265 fprintf (asm_out_file, "\t.set\treorder\n");
9267 #ifdef ASM_DECLARE_FUNCTION_SIZE
9268 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
9269 #endif
9271 if (!FUNCTION_NAME_ALREADY_DECLARED)
9273 fputs ("\t.end\t", asm_out_file);
9274 assemble_name (asm_out_file, stubname);
9275 fputs ("\n", asm_out_file);
9278 fprintf (asm_out_file, "\t.set\tmips16\n");
9280 /* Record this stub. */
9281 l = (struct mips16_stub *) xmalloc (sizeof *l);
9282 l->name = xstrdup (fnname);
9283 l->fpret = fpret;
9284 l->next = mips16_stubs;
9285 mips16_stubs = l;
9288 /* If we expect a floating point return value, but we've built a
9289 stub which does not expect one, then we're in trouble. We can't
9290 use the existing stub, because it won't handle the floating point
9291 value. We can't build a new stub, because the linker won't know
9292 which stub to use for the various calls in this object file.
9293 Fortunately, this case is illegal, since it means that a function
9294 was declared in two different ways in a single compilation. */
9295 if (fpret && ! l->fpret)
9296 error ("cannot handle inconsistent calls to %qs", fnname);
9298 /* If we are calling a stub which handles a floating point return
9299 value, we need to arrange to save $18 in the prologue. We do
9300 this by marking the function call as using the register. The
9301 prologue will later see that it is used, and emit code to save
9302 it. */
9304 if (l->fpret)
9306 rtx insn;
9308 if (retval == NULL_RTX)
9309 insn = gen_call_internal (fn, arg_size);
9310 else
9311 insn = gen_call_value_internal (retval, fn, arg_size);
9312 insn = emit_call_insn (insn);
9314 CALL_INSN_FUNCTION_USAGE (insn) =
9315 gen_rtx_EXPR_LIST (VOIDmode,
9316 gen_rtx_USE (VOIDmode, gen_rtx_REG (word_mode, 18)),
9317 CALL_INSN_FUNCTION_USAGE (insn));
9319 /* Return 1 to tell the caller that we've generated the call
9320 insn. */
9321 return 1;
9324 /* Return 0 to let the caller generate the call insn. */
9325 return 0;
9328 /* An entry in the mips16 constant pool. VALUE is the pool constant,
9329 MODE is its mode, and LABEL is the CODE_LABEL associated with it. */
9331 struct mips16_constant {
9332 struct mips16_constant *next;
9333 rtx value;
9334 rtx label;
9335 enum machine_mode mode;
9338 /* Information about an incomplete mips16 constant pool. FIRST is the
9339 first constant, HIGHEST_ADDRESS is the highest address that the first
9340 byte of the pool can have, and INSN_ADDRESS is the current instruction
9341 address. */
9343 struct mips16_constant_pool {
9344 struct mips16_constant *first;
9345 int highest_address;
9346 int insn_address;
9349 /* Add constant VALUE to POOL and return its label. MODE is the
9350 value's mode (used for CONST_INTs, etc.). */
9352 static rtx
9353 add_constant (struct mips16_constant_pool *pool,
9354 rtx value, enum machine_mode mode)
9356 struct mips16_constant **p, *c;
9357 bool first_of_size_p;
9359 /* See whether the constant is already in the pool. If so, return the
9360 existing label, otherwise leave P pointing to the place where the
9361 constant should be added.
9363 Keep the pool sorted in increasing order of mode size so that we can
9364 reduce the number of alignments needed. */
9365 first_of_size_p = true;
9366 for (p = &pool->first; *p != 0; p = &(*p)->next)
9368 if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
9369 return (*p)->label;
9370 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
9371 break;
9372 if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
9373 first_of_size_p = false;
9376 /* In the worst case, the constant needed by the earliest instruction
9377 will end up at the end of the pool. The entire pool must then be
9378 accessible from that instruction.
9380 When adding the first constant, set the pool's highest address to
9381 the address of the first out-of-range byte. Adjust this address
9382 downwards each time a new constant is added. */
9383 if (pool->first == 0)
9384 /* For pc-relative lw, addiu and daddiu instructions, the base PC value
9385 is the address of the instruction with the lowest two bits clear.
9386 The base PC value for ld has the lowest three bits clear. Assume
9387 the worst case here. */
9388 pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
9389 pool->highest_address -= GET_MODE_SIZE (mode);
9390 if (first_of_size_p)
9391 /* Take into account the worst possible padding due to alignment. */
9392 pool->highest_address -= GET_MODE_SIZE (mode) - 1;
9394 /* Create a new entry. */
9395 c = (struct mips16_constant *) xmalloc (sizeof *c);
9396 c->value = value;
9397 c->mode = mode;
9398 c->label = gen_label_rtx ();
9399 c->next = *p;
9400 *p = c;
9402 return c->label;
9405 /* Output constant VALUE after instruction INSN and return the last
9406 instruction emitted. MODE is the mode of the constant. */
9408 static rtx
9409 dump_constants_1 (enum machine_mode mode, rtx value, rtx insn)
9411 switch (GET_MODE_CLASS (mode))
9413 case MODE_INT:
9415 rtx size = GEN_INT (GET_MODE_SIZE (mode));
9416 return emit_insn_after (gen_consttable_int (value, size), insn);
9419 case MODE_FLOAT:
9420 return emit_insn_after (gen_consttable_float (value), insn);
9422 case MODE_VECTOR_FLOAT:
9423 case MODE_VECTOR_INT:
9425 int i;
9426 for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
9427 insn = dump_constants_1 (GET_MODE_INNER (mode),
9428 CONST_VECTOR_ELT (value, i), insn);
9429 return insn;
9432 default:
9433 gcc_unreachable ();
9438 /* Dump out the constants in CONSTANTS after INSN. */
9440 static void
9441 dump_constants (struct mips16_constant *constants, rtx insn)
9443 struct mips16_constant *c, *next;
9444 int align;
9446 align = 0;
9447 for (c = constants; c != NULL; c = next)
9449 /* If necessary, increase the alignment of PC. */
9450 if (align < GET_MODE_SIZE (c->mode))
9452 int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
9453 insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
9455 align = GET_MODE_SIZE (c->mode);
9457 insn = emit_label_after (c->label, insn);
9458 insn = dump_constants_1 (c->mode, c->value, insn);
9460 next = c->next;
9461 free (c);
9464 emit_barrier_after (insn);
9467 /* Return the length of instruction INSN. */
9469 static int
9470 mips16_insn_length (rtx insn)
9472 if (JUMP_P (insn))
9474 rtx body = PATTERN (insn);
9475 if (GET_CODE (body) == ADDR_VEC)
9476 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
9477 if (GET_CODE (body) == ADDR_DIFF_VEC)
9478 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
9480 return get_attr_length (insn);
9483 /* Rewrite *X so that constant pool references refer to the constant's
9484 label instead. DATA points to the constant pool structure. */
9486 static int
9487 mips16_rewrite_pool_refs (rtx *x, void *data)
9489 struct mips16_constant_pool *pool = data;
9490 if (GET_CODE (*x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (*x))
9491 *x = gen_rtx_LABEL_REF (Pmode, add_constant (pool,
9492 get_pool_constant (*x),
9493 get_pool_mode (*x)));
9494 return 0;
9497 /* Build MIPS16 constant pools. */
9499 static void
9500 mips16_lay_out_constants (void)
9502 struct mips16_constant_pool pool;
9503 rtx insn, barrier;
9505 barrier = 0;
9506 memset (&pool, 0, sizeof (pool));
9507 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9509 /* Rewrite constant pool references in INSN. */
9510 if (INSN_P (insn))
9511 for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &pool);
9513 pool.insn_address += mips16_insn_length (insn);
9515 if (pool.first != NULL)
9517 /* If there are no natural barriers between the first user of
9518 the pool and the highest acceptable address, we'll need to
9519 create a new instruction to jump around the constant pool.
9520 In the worst case, this instruction will be 4 bytes long.
9522 If it's too late to do this transformation after INSN,
9523 do it immediately before INSN. */
9524 if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
9526 rtx label, jump;
9528 label = gen_label_rtx ();
9530 jump = emit_jump_insn_before (gen_jump (label), insn);
9531 JUMP_LABEL (jump) = label;
9532 LABEL_NUSES (label) = 1;
9533 barrier = emit_barrier_after (jump);
9535 emit_label_after (label, barrier);
9536 pool.insn_address += 4;
9539 /* See whether the constant pool is now out of range of the first
9540 user. If so, output the constants after the previous barrier.
9541 Note that any instructions between BARRIER and INSN (inclusive)
9542 will use negative offsets to refer to the pool. */
9543 if (pool.insn_address > pool.highest_address)
9545 dump_constants (pool.first, barrier);
9546 pool.first = NULL;
9547 barrier = 0;
9549 else if (BARRIER_P (insn))
9550 barrier = insn;
9553 dump_constants (pool.first, get_last_insn ());
9556 /* A temporary variable used by for_each_rtx callbacks, etc. */
9557 static rtx mips_sim_insn;
9559 /* A structure representing the state of the processor pipeline.
9560 Used by the mips_sim_* family of functions. */
9561 struct mips_sim {
9562 /* The maximum number of instructions that can be issued in a cycle.
9563 (Caches mips_issue_rate.) */
9564 unsigned int issue_rate;
9566 /* The current simulation time. */
9567 unsigned int time;
9569 /* How many more instructions can be issued in the current cycle. */
9570 unsigned int insns_left;
9572 /* LAST_SET[X].INSN is the last instruction to set register X.
9573 LAST_SET[X].TIME is the time at which that instruction was issued.
9574 INSN is null if no instruction has yet set register X. */
9575 struct {
9576 rtx insn;
9577 unsigned int time;
9578 } last_set[FIRST_PSEUDO_REGISTER];
9580 /* The pipeline's current DFA state. */
9581 state_t dfa_state;
9584 /* Reset STATE to the initial simulation state. */
9586 static void
9587 mips_sim_reset (struct mips_sim *state)
9589 state->time = 0;
9590 state->insns_left = state->issue_rate;
9591 memset (&state->last_set, 0, sizeof (state->last_set));
9592 state_reset (state->dfa_state);
9595 /* Initialize STATE before its first use. DFA_STATE points to an
9596 allocated but uninitialized DFA state. */
9598 static void
9599 mips_sim_init (struct mips_sim *state, state_t dfa_state)
9601 state->issue_rate = mips_issue_rate ();
9602 state->dfa_state = dfa_state;
9603 mips_sim_reset (state);
9606 /* Advance STATE by one clock cycle. */
9608 static void
9609 mips_sim_next_cycle (struct mips_sim *state)
9611 state->time++;
9612 state->insns_left = state->issue_rate;
9613 state_transition (state->dfa_state, 0);
9616 /* Advance simulation state STATE until instruction INSN can read
9617 register REG. */
9619 static void
9620 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
9622 unsigned int i;
9624 for (i = 0; i < HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); i++)
9625 if (state->last_set[REGNO (reg) + i].insn != 0)
9627 unsigned int t;
9629 t = state->last_set[REGNO (reg) + i].time;
9630 t += insn_latency (state->last_set[REGNO (reg) + i].insn, insn);
9631 while (state->time < t)
9632 mips_sim_next_cycle (state);
9636 /* A for_each_rtx callback. If *X is a register, advance simulation state
9637 DATA until mips_sim_insn can read the register's value. */
9639 static int
9640 mips_sim_wait_regs_2 (rtx *x, void *data)
9642 if (REG_P (*x))
9643 mips_sim_wait_reg (data, mips_sim_insn, *x);
9644 return 0;
9647 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X. */
9649 static void
9650 mips_sim_wait_regs_1 (rtx *x, void *data)
9652 for_each_rtx (x, mips_sim_wait_regs_2, data);
9655 /* Advance simulation state STATE until all of INSN's register
9656 dependencies are satisfied. */
9658 static void
9659 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
9661 mips_sim_insn = insn;
9662 note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
9665 /* Advance simulation state STATE until the units required by
9666 instruction INSN are available. */
9668 static void
9669 mips_sim_wait_units (struct mips_sim *state, rtx insn)
9671 state_t tmp_state;
9673 tmp_state = alloca (state_size ());
9674 while (state->insns_left == 0
9675 || (memcpy (tmp_state, state->dfa_state, state_size ()),
9676 state_transition (tmp_state, insn) >= 0))
9677 mips_sim_next_cycle (state);
9680 /* Advance simulation state STATE until INSN is ready to issue. */
9682 static void
9683 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
9685 mips_sim_wait_regs (state, insn);
9686 mips_sim_wait_units (state, insn);
9689 /* mips_sim_insn has just set X. Update the LAST_SET array
9690 in simulation state DATA. */
9692 static void
9693 mips_sim_record_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
9695 struct mips_sim *state;
9696 unsigned int i;
9698 state = data;
9699 if (REG_P (x))
9700 for (i = 0; i < HARD_REGNO_NREGS (REGNO (x), GET_MODE (x)); i++)
9702 state->last_set[REGNO (x) + i].insn = mips_sim_insn;
9703 state->last_set[REGNO (x) + i].time = state->time;
9707 /* Issue instruction INSN in scheduler state STATE. Assume that INSN
9708 can issue immediately (i.e., that mips_sim_wait_insn has already
9709 been called). */
9711 static void
9712 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
9714 state_transition (state->dfa_state, insn);
9715 state->insns_left--;
9717 mips_sim_insn = insn;
9718 note_stores (PATTERN (insn), mips_sim_record_set, state);
9721 /* Simulate issuing a NOP in state STATE. */
9723 static void
9724 mips_sim_issue_nop (struct mips_sim *state)
9726 if (state->insns_left == 0)
9727 mips_sim_next_cycle (state);
9728 state->insns_left--;
9731 /* Update simulation state STATE so that it's ready to accept the instruction
9732 after INSN. INSN should be part of the main rtl chain, not a member of a
9733 SEQUENCE. */
9735 static void
9736 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
9738 /* If INSN is a jump with an implicit delay slot, simulate a nop. */
9739 if (JUMP_P (insn))
9740 mips_sim_issue_nop (state);
9742 switch (GET_CODE (SEQ_BEGIN (insn)))
9744 case CODE_LABEL:
9745 case CALL_INSN:
9746 /* We can't predict the processor state after a call or label. */
9747 mips_sim_reset (state);
9748 break;
9750 case JUMP_INSN:
9751 /* The delay slots of branch likely instructions are only executed
9752 when the branch is taken. Therefore, if the caller has simulated
9753 the delay slot instruction, STATE does not really reflect the state
9754 of the pipeline for the instruction after the delay slot. Also,
9755 branch likely instructions tend to incur a penalty when not taken,
9756 so there will probably be an extra delay between the branch and
9757 the instruction after the delay slot. */
9758 if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
9759 mips_sim_reset (state);
9760 break;
9762 default:
9763 break;
9767 /* The VR4130 pipeline issues aligned pairs of instructions together,
9768 but it stalls the second instruction if it depends on the first.
9769 In order to cut down the amount of logic required, this dependence
9770 check is not based on a full instruction decode. Instead, any non-SPECIAL
9771 instruction is assumed to modify the register specified by bits 20-16
9772 (which is usually the "rt" field).
9774 In beq, beql, bne and bnel instructions, the rt field is actually an
9775 input, so we can end up with a false dependence between the branch
9776 and its delay slot. If this situation occurs in instruction INSN,
9777 try to avoid it by swapping rs and rt. */
9779 static void
9780 vr4130_avoid_branch_rt_conflict (rtx insn)
9782 rtx first, second;
9784 first = SEQ_BEGIN (insn);
9785 second = SEQ_END (insn);
9786 if (JUMP_P (first)
9787 && NONJUMP_INSN_P (second)
9788 && GET_CODE (PATTERN (first)) == SET
9789 && GET_CODE (SET_DEST (PATTERN (first))) == PC
9790 && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
9792 /* Check for the right kind of condition. */
9793 rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
9794 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
9795 && REG_P (XEXP (cond, 0))
9796 && REG_P (XEXP (cond, 1))
9797 && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
9798 && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
9800 /* SECOND mentions the rt register but not the rs register. */
9801 rtx tmp = XEXP (cond, 0);
9802 XEXP (cond, 0) = XEXP (cond, 1);
9803 XEXP (cond, 1) = tmp;
9808 /* Implement -mvr4130-align. Go through each basic block and simulate the
9809 processor pipeline. If we find that a pair of instructions could execute
9810 in parallel, and the first of those instruction is not 8-byte aligned,
9811 insert a nop to make it aligned. */
9813 static void
9814 vr4130_align_insns (void)
9816 struct mips_sim state;
9817 rtx insn, subinsn, last, last2, next;
9818 bool aligned_p;
9820 dfa_start ();
9822 /* LAST is the last instruction before INSN to have a nonzero length.
9823 LAST2 is the last such instruction before LAST. */
9824 last = 0;
9825 last2 = 0;
9827 /* ALIGNED_P is true if INSN is known to be at an aligned address. */
9828 aligned_p = true;
9830 mips_sim_init (&state, alloca (state_size ()));
9831 for (insn = get_insns (); insn != 0; insn = next)
9833 unsigned int length;
9835 next = NEXT_INSN (insn);
9837 /* See the comment above vr4130_avoid_branch_rt_conflict for details.
9838 This isn't really related to the alignment pass, but we do it on
9839 the fly to avoid a separate instruction walk. */
9840 vr4130_avoid_branch_rt_conflict (insn);
9842 if (USEFUL_INSN_P (insn))
9843 FOR_EACH_SUBINSN (subinsn, insn)
9845 mips_sim_wait_insn (&state, subinsn);
9847 /* If we want this instruction to issue in parallel with the
9848 previous one, make sure that the previous instruction is
9849 aligned. There are several reasons why this isn't worthwhile
9850 when the second instruction is a call:
9852 - Calls are less likely to be performance critical,
9853 - There's a good chance that the delay slot can execute
9854 in parallel with the call.
9855 - The return address would then be unaligned.
9857 In general, if we're going to insert a nop between instructions
9858 X and Y, it's better to insert it immediately after X. That
9859 way, if the nop makes Y aligned, it will also align any labels
9860 between X and Y. */
9861 if (state.insns_left != state.issue_rate
9862 && !CALL_P (subinsn))
9864 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
9866 /* SUBINSN is the first instruction in INSN and INSN is
9867 aligned. We want to align the previous instruction
9868 instead, so insert a nop between LAST2 and LAST.
9870 Note that LAST could be either a single instruction
9871 or a branch with a delay slot. In the latter case,
9872 LAST, like INSN, is already aligned, but the delay
9873 slot must have some extra delay that stops it from
9874 issuing at the same time as the branch. We therefore
9875 insert a nop before the branch in order to align its
9876 delay slot. */
9877 emit_insn_after (gen_nop (), last2);
9878 aligned_p = false;
9880 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
9882 /* SUBINSN is the delay slot of INSN, but INSN is
9883 currently unaligned. Insert a nop between
9884 LAST and INSN to align it. */
9885 emit_insn_after (gen_nop (), last);
9886 aligned_p = true;
9889 mips_sim_issue_insn (&state, subinsn);
9891 mips_sim_finish_insn (&state, insn);
9893 /* Update LAST, LAST2 and ALIGNED_P for the next instruction. */
9894 length = get_attr_length (insn);
9895 if (length > 0)
9897 /* If the instruction is an asm statement or multi-instruction
9898 mips.md patern, the length is only an estimate. Insert an
9899 8 byte alignment after it so that the following instructions
9900 can be handled correctly. */
9901 if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
9902 && (recog_memoized (insn) < 0 || length >= 8))
9904 next = emit_insn_after (gen_align (GEN_INT (3)), insn);
9905 next = NEXT_INSN (next);
9906 mips_sim_next_cycle (&state);
9907 aligned_p = true;
9909 else if (length & 4)
9910 aligned_p = !aligned_p;
9911 last2 = last;
9912 last = insn;
9915 /* See whether INSN is an aligned label. */
9916 if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
9917 aligned_p = true;
9919 dfa_finish ();
9922 /* Subroutine of mips_reorg. If there is a hazard between INSN
9923 and a previous instruction, avoid it by inserting nops after
9924 instruction AFTER.
9926 *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
9927 this point. If *DELAYED_REG is non-null, INSN must wait a cycle
9928 before using the value of that register. *HILO_DELAY counts the
9929 number of instructions since the last hilo hazard (that is,
9930 the number of instructions since the last mflo or mfhi).
9932 After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
9933 for the next instruction.
9935 LO_REG is an rtx for the LO register, used in dependence checking. */
9937 static void
9938 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
9939 rtx *delayed_reg, rtx lo_reg)
9941 rtx pattern, set;
9942 int nops, ninsns;
9944 if (!INSN_P (insn))
9945 return;
9947 pattern = PATTERN (insn);
9949 /* Do not put the whole function in .set noreorder if it contains
9950 an asm statement. We don't know whether there will be hazards
9951 between the asm statement and the gcc-generated code. */
9952 if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
9953 cfun->machine->all_noreorder_p = false;
9955 /* Ignore zero-length instructions (barriers and the like). */
9956 ninsns = get_attr_length (insn) / 4;
9957 if (ninsns == 0)
9958 return;
9960 /* Work out how many nops are needed. Note that we only care about
9961 registers that are explicitly mentioned in the instruction's pattern.
9962 It doesn't matter that calls use the argument registers or that they
9963 clobber hi and lo. */
9964 if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
9965 nops = 2 - *hilo_delay;
9966 else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
9967 nops = 1;
9968 else
9969 nops = 0;
9971 /* Insert the nops between this instruction and the previous one.
9972 Each new nop takes us further from the last hilo hazard. */
9973 *hilo_delay += nops;
9974 while (nops-- > 0)
9975 emit_insn_after (gen_hazard_nop (), after);
9977 /* Set up the state for the next instruction. */
9978 *hilo_delay += ninsns;
9979 *delayed_reg = 0;
9980 if (INSN_CODE (insn) >= 0)
9981 switch (get_attr_hazard (insn))
9983 case HAZARD_NONE:
9984 break;
9986 case HAZARD_HILO:
9987 *hilo_delay = 0;
9988 break;
9990 case HAZARD_DELAY:
9991 set = single_set (insn);
9992 gcc_assert (set != 0);
9993 *delayed_reg = SET_DEST (set);
9994 break;
9999 /* Go through the instruction stream and insert nops where necessary.
10000 See if the whole function can then be put into .set noreorder &
10001 .set nomacro. */
10003 static void
10004 mips_avoid_hazards (void)
10006 rtx insn, last_insn, lo_reg, delayed_reg;
10007 int hilo_delay, i;
10009 /* Force all instructions to be split into their final form. */
10010 split_all_insns_noflow ();
10012 /* Recalculate instruction lengths without taking nops into account. */
10013 cfun->machine->ignore_hazard_length_p = true;
10014 shorten_branches (get_insns ());
10016 cfun->machine->all_noreorder_p = true;
10018 /* Profiled functions can't be all noreorder because the profiler
10019 support uses assembler macros. */
10020 if (current_function_profile)
10021 cfun->machine->all_noreorder_p = false;
10023 /* Code compiled with -mfix-vr4120 can't be all noreorder because
10024 we rely on the assembler to work around some errata. */
10025 if (TARGET_FIX_VR4120)
10026 cfun->machine->all_noreorder_p = false;
10028 /* The same is true for -mfix-vr4130 if we might generate mflo or
10029 mfhi instructions. Note that we avoid using mflo and mfhi if
10030 the VR4130 macc and dmacc instructions are available instead;
10031 see the *mfhilo_{si,di}_macc patterns. */
10032 if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
10033 cfun->machine->all_noreorder_p = false;
10035 last_insn = 0;
10036 hilo_delay = 2;
10037 delayed_reg = 0;
10038 lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
10040 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
10041 if (INSN_P (insn))
10043 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
10044 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
10045 mips_avoid_hazard (last_insn, XVECEXP (PATTERN (insn), 0, i),
10046 &hilo_delay, &delayed_reg, lo_reg);
10047 else
10048 mips_avoid_hazard (last_insn, insn, &hilo_delay,
10049 &delayed_reg, lo_reg);
10051 last_insn = insn;
10056 /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
10058 static void
10059 mips_reorg (void)
10061 if (TARGET_MIPS16)
10062 mips16_lay_out_constants ();
10063 else if (TARGET_EXPLICIT_RELOCS)
10065 if (mips_flag_delayed_branch)
10066 dbr_schedule (get_insns ());
10067 mips_avoid_hazards ();
10068 if (TUNE_MIPS4130 && TARGET_VR4130_ALIGN)
10069 vr4130_align_insns ();
10073 /* This function does three things:
10075 - Register the special divsi3 and modsi3 functions if -mfix-vr4120.
10076 - Register the mips16 hardware floating point stubs.
10077 - Register the gofast functions if selected using --enable-gofast. */
10079 #include "config/gofast.h"
10081 static void
10082 mips_init_libfuncs (void)
10084 if (TARGET_FIX_VR4120)
10086 set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
10087 set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
10090 if (mips16_hard_float)
10092 set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
10093 set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
10094 set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
10095 set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
10097 set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
10098 set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
10099 set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
10100 set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
10101 set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
10102 set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
10104 set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
10105 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
10107 if (TARGET_DOUBLE_FLOAT)
10109 set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
10110 set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
10111 set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
10112 set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
10114 set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
10115 set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
10116 set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
10117 set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
10118 set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
10119 set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
10121 set_conv_libfunc (sext_optab, DFmode, SFmode, "__mips16_extendsfdf2");
10122 set_conv_libfunc (trunc_optab, SFmode, DFmode, "__mips16_truncdfsf2");
10124 set_conv_libfunc (sfix_optab, SImode, DFmode, "__mips16_fix_truncdfsi");
10125 set_conv_libfunc (sfloat_optab, DFmode, SImode, "__mips16_floatsidf");
10128 else
10129 gofast_maybe_init_libfuncs ();
10132 /* Return a number assessing the cost of moving a register in class
10133 FROM to class TO. The classes are expressed using the enumeration
10134 values such as `GENERAL_REGS'. A value of 2 is the default; other
10135 values are interpreted relative to that.
10137 It is not required that the cost always equal 2 when FROM is the
10138 same as TO; on some machines it is expensive to move between
10139 registers if they are not general registers.
10141 If reload sees an insn consisting of a single `set' between two
10142 hard registers, and if `REGISTER_MOVE_COST' applied to their
10143 classes returns a value of 2, reload does not check to ensure that
10144 the constraints of the insn are met. Setting a cost of other than
10145 2 will allow reload to verify that the constraints are met. You
10146 should do this if the `movM' pattern's constraints do not allow
10147 such copying.
10149 ??? We make the cost of moving from HI/LO into general
10150 registers the same as for one of moving general registers to
10151 HI/LO for TARGET_MIPS16 in order to prevent allocating a
10152 pseudo to HI/LO. This might hurt optimizations though, it
10153 isn't clear if it is wise. And it might not work in all cases. We
10154 could solve the DImode LO reg problem by using a multiply, just
10155 like reload_{in,out}si. We could solve the SImode/HImode HI reg
10156 problem by using divide instructions. divu puts the remainder in
10157 the HI reg, so doing a divide by -1 will move the value in the HI
10158 reg for all values except -1. We could handle that case by using a
10159 signed divide, e.g. -1 / 2 (or maybe 1 / -2?). We'd have to emit
10160 a compare/branch to test the input value to see which instruction
10161 we need to use. This gets pretty messy, but it is feasible. */
10164 mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10165 enum reg_class to, enum reg_class from)
10167 if (from == M16_REGS && reg_class_subset_p (to, GENERAL_REGS))
10168 return 2;
10169 else if (from == M16_NA_REGS && reg_class_subset_p (to, GENERAL_REGS))
10170 return 2;
10171 else if (reg_class_subset_p (from, GENERAL_REGS))
10173 if (to == M16_REGS)
10174 return 2;
10175 else if (to == M16_NA_REGS)
10176 return 2;
10177 else if (reg_class_subset_p (to, GENERAL_REGS))
10179 if (TARGET_MIPS16)
10180 return 4;
10181 else
10182 return 2;
10184 else if (to == FP_REGS)
10185 return 4;
10186 else if (reg_class_subset_p (to, ACC_REGS))
10188 if (TARGET_MIPS16)
10189 return 12;
10190 else
10191 return 6;
10193 else if (reg_class_subset_p (to, ALL_COP_REGS))
10195 return 5;
10198 else if (from == FP_REGS)
10200 if (reg_class_subset_p (to, GENERAL_REGS))
10201 return 4;
10202 else if (to == FP_REGS)
10203 return 2;
10204 else if (to == ST_REGS)
10205 return 8;
10207 else if (reg_class_subset_p (from, ACC_REGS))
10209 if (reg_class_subset_p (to, GENERAL_REGS))
10211 if (TARGET_MIPS16)
10212 return 12;
10213 else
10214 return 6;
10217 else if (from == ST_REGS && reg_class_subset_p (to, GENERAL_REGS))
10218 return 4;
10219 else if (reg_class_subset_p (from, ALL_COP_REGS))
10221 return 5;
10224 /* Fall through.
10225 ??? What cases are these? Shouldn't we return 2 here? */
10227 return 12;
10230 /* Return the length of INSN. LENGTH is the initial length computed by
10231 attributes in the machine-description file. */
10234 mips_adjust_insn_length (rtx insn, int length)
10236 /* A unconditional jump has an unfilled delay slot if it is not part
10237 of a sequence. A conditional jump normally has a delay slot, but
10238 does not on MIPS16. */
10239 if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
10240 length += 4;
10242 /* See how many nops might be needed to avoid hardware hazards. */
10243 if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
10244 switch (get_attr_hazard (insn))
10246 case HAZARD_NONE:
10247 break;
10249 case HAZARD_DELAY:
10250 length += 4;
10251 break;
10253 case HAZARD_HILO:
10254 length += 8;
10255 break;
10258 /* All MIPS16 instructions are a measly two bytes. */
10259 if (TARGET_MIPS16)
10260 length /= 2;
10262 return length;
10266 /* Return an asm sequence to start a noat block and load the address
10267 of a label into $1. */
10269 const char *
10270 mips_output_load_label (void)
10272 if (TARGET_EXPLICIT_RELOCS)
10273 switch (mips_abi)
10275 case ABI_N32:
10276 return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
10278 case ABI_64:
10279 return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
10281 default:
10282 if (ISA_HAS_LOAD_DELAY)
10283 return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
10284 return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
10286 else
10288 if (Pmode == DImode)
10289 return "%[dla\t%@,%0";
10290 else
10291 return "%[la\t%@,%0";
10295 /* Return the assembly code for INSN, which has the operands given by
10296 OPERANDS, and which branches to OPERANDS[1] if some condition is true.
10297 BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[1]
10298 is in range of a direct branch. BRANCH_IF_FALSE is an inverted
10299 version of BRANCH_IF_TRUE. */
10301 const char *
10302 mips_output_conditional_branch (rtx insn, rtx *operands,
10303 const char *branch_if_true,
10304 const char *branch_if_false)
10306 unsigned int length;
10307 rtx taken, not_taken;
10309 length = get_attr_length (insn);
10310 if (length <= 8)
10312 /* Just a simple conditional branch. */
10313 mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
10314 return branch_if_true;
10317 /* Generate a reversed branch around a direct jump. This fallback does
10318 not use branch-likely instructions. */
10319 mips_branch_likely = false;
10320 not_taken = gen_label_rtx ();
10321 taken = operands[1];
10323 /* Generate the reversed branch to NOT_TAKEN. */
10324 operands[1] = not_taken;
10325 output_asm_insn (branch_if_false, operands);
10327 /* If INSN has a delay slot, we must provide delay slots for both the
10328 branch to NOT_TAKEN and the conditional jump. We must also ensure
10329 that INSN's delay slot is executed in the appropriate cases. */
10330 if (final_sequence)
10332 /* This first delay slot will always be executed, so use INSN's
10333 delay slot if is not annulled. */
10334 if (!INSN_ANNULLED_BRANCH_P (insn))
10336 final_scan_insn (XVECEXP (final_sequence, 0, 1),
10337 asm_out_file, optimize, 1, NULL);
10338 INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
10340 else
10341 output_asm_insn ("nop", 0);
10342 fprintf (asm_out_file, "\n");
10345 /* Output the unconditional branch to TAKEN. */
10346 if (length <= 16)
10347 output_asm_insn ("j\t%0%/", &taken);
10348 else
10350 output_asm_insn (mips_output_load_label (), &taken);
10351 output_asm_insn ("jr\t%@%]%/", 0);
10354 /* Now deal with its delay slot; see above. */
10355 if (final_sequence)
10357 /* This delay slot will only be executed if the branch is taken.
10358 Use INSN's delay slot if is annulled. */
10359 if (INSN_ANNULLED_BRANCH_P (insn))
10361 final_scan_insn (XVECEXP (final_sequence, 0, 1),
10362 asm_out_file, optimize, 1, NULL);
10363 INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
10365 else
10366 output_asm_insn ("nop", 0);
10367 fprintf (asm_out_file, "\n");
10370 /* Output NOT_TAKEN. */
10371 (*targetm.asm_out.internal_label) (asm_out_file, "L",
10372 CODE_LABEL_NUMBER (not_taken));
10373 return "";
10376 /* Return the assembly code for INSN, which branches to OPERANDS[1]
10377 if some ordered condition is true. The condition is given by
10378 OPERANDS[0] if !INVERTED_P, otherwise it is the inverse of
10379 OPERANDS[0]. OPERANDS[2] is the comparison's first operand;
10380 its second is always zero. */
10382 const char *
10383 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
10385 const char *branch[2];
10387 /* Make BRANCH[1] branch to OPERANDS[1] when the condition is true.
10388 Make BRANCH[0] branch on the inverse condition. */
10389 switch (GET_CODE (operands[0]))
10391 /* These cases are equivalent to comparisons against zero. */
10392 case LEU:
10393 inverted_p = !inverted_p;
10394 /* Fall through. */
10395 case GTU:
10396 branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%1");
10397 branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%1");
10398 break;
10400 /* These cases are always true or always false. */
10401 case LTU:
10402 inverted_p = !inverted_p;
10403 /* Fall through. */
10404 case GEU:
10405 branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%1");
10406 branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%1");
10407 break;
10409 default:
10410 branch[!inverted_p] = MIPS_BRANCH ("b%C0z", "%2,%1");
10411 branch[inverted_p] = MIPS_BRANCH ("b%N0z", "%2,%1");
10412 break;
10414 return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
10417 /* Used to output div or ddiv instruction DIVISION, which has the operands
10418 given by OPERANDS. Add in a divide-by-zero check if needed.
10420 When working around R4000 and R4400 errata, we need to make sure that
10421 the division is not immediately followed by a shift[1][2]. We also
10422 need to stop the division from being put into a branch delay slot[3].
10423 The easiest way to avoid both problems is to add a nop after the
10424 division. When a divide-by-zero check is needed, this nop can be
10425 used to fill the branch delay slot.
10427 [1] If a double-word or a variable shift executes immediately
10428 after starting an integer division, the shift may give an
10429 incorrect result. See quotations of errata #16 and #28 from
10430 "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
10431 in mips.md for details.
10433 [2] A similar bug to [1] exists for all revisions of the
10434 R4000 and the R4400 when run in an MC configuration.
10435 From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
10437 "19. In this following sequence:
10439 ddiv (or ddivu or div or divu)
10440 dsll32 (or dsrl32, dsra32)
10442 if an MPT stall occurs, while the divide is slipping the cpu
10443 pipeline, then the following double shift would end up with an
10444 incorrect result.
10446 Workaround: The compiler needs to avoid generating any
10447 sequence with divide followed by extended double shift."
10449 This erratum is also present in "MIPS R4400MC Errata, Processor
10450 Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
10451 & 3.0" as errata #10 and #4, respectively.
10453 [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
10454 (also valid for MIPS R4000MC processors):
10456 "52. R4000SC: This bug does not apply for the R4000PC.
10458 There are two flavors of this bug:
10460 1) If the instruction just after divide takes an RF exception
10461 (tlb-refill, tlb-invalid) and gets an instruction cache
10462 miss (both primary and secondary) and the line which is
10463 currently in secondary cache at this index had the first
10464 data word, where the bits 5..2 are set, then R4000 would
10465 get a wrong result for the div.
10469 div r8, r9
10470 ------------------- # end-of page. -tlb-refill
10474 div r8, r9
10475 ------------------- # end-of page. -tlb-invalid
10478 2) If the divide is in the taken branch delay slot, where the
10479 target takes RF exception and gets an I-cache miss for the
10480 exception vector or where I-cache miss occurs for the
10481 target address, under the above mentioned scenarios, the
10482 div would get wrong results.
10485 j r2 # to next page mapped or unmapped
10486 div r8,r9 # this bug would be there as long
10487 # as there is an ICache miss and
10488 nop # the "data pattern" is present
10491 beq r0, r0, NextPage # to Next page
10492 div r8,r9
10495 This bug is present for div, divu, ddiv, and ddivu
10496 instructions.
10498 Workaround: For item 1), OS could make sure that the next page
10499 after the divide instruction is also mapped. For item 2), the
10500 compiler could make sure that the divide instruction is not in
10501 the branch delay slot."
10503 These processors have PRId values of 0x00004220 and 0x00004300 for
10504 the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400. */
10506 const char *
10507 mips_output_division (const char *division, rtx *operands)
10509 const char *s;
10511 s = division;
10512 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
10514 output_asm_insn (s, operands);
10515 s = "nop";
10517 if (TARGET_CHECK_ZERO_DIV)
10519 if (TARGET_MIPS16)
10521 output_asm_insn (s, operands);
10522 s = "bnez\t%2,1f\n\tbreak\t7\n1:";
10524 else if (GENERATE_DIVIDE_TRAPS)
10526 output_asm_insn (s, operands);
10527 s = "teq\t%2,%.,7";
10529 else
10531 output_asm_insn ("%(bne\t%2,%.,1f", operands);
10532 output_asm_insn (s, operands);
10533 s = "break\t7%)\n1:";
10536 return s;
10539 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
10540 with a final "000" replaced by "k". Ignore case.
10542 Note: this function is shared between GCC and GAS. */
10544 static bool
10545 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
10547 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
10548 given++, canonical++;
10550 return ((*given == 0 && *canonical == 0)
10551 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
10555 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
10556 CPU name. We've traditionally allowed a lot of variation here.
10558 Note: this function is shared between GCC and GAS. */
10560 static bool
10561 mips_matching_cpu_name_p (const char *canonical, const char *given)
10563 /* First see if the name matches exactly, or with a final "000"
10564 turned into "k". */
10565 if (mips_strict_matching_cpu_name_p (canonical, given))
10566 return true;
10568 /* If not, try comparing based on numerical designation alone.
10569 See if GIVEN is an unadorned number, or 'r' followed by a number. */
10570 if (TOLOWER (*given) == 'r')
10571 given++;
10572 if (!ISDIGIT (*given))
10573 return false;
10575 /* Skip over some well-known prefixes in the canonical name,
10576 hoping to find a number there too. */
10577 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
10578 canonical += 2;
10579 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
10580 canonical += 2;
10581 else if (TOLOWER (canonical[0]) == 'r')
10582 canonical += 1;
10584 return mips_strict_matching_cpu_name_p (canonical, given);
10588 /* Return the mips_cpu_info entry for the processor or ISA given
10589 by CPU_STRING. Return null if the string isn't recognized.
10591 A similar function exists in GAS. */
10593 static const struct mips_cpu_info *
10594 mips_parse_cpu (const char *cpu_string)
10596 const struct mips_cpu_info *p;
10597 const char *s;
10599 /* In the past, we allowed upper-case CPU names, but it doesn't
10600 work well with the multilib machinery. */
10601 for (s = cpu_string; *s != 0; s++)
10602 if (ISUPPER (*s))
10604 warning (0, "the cpu name must be lower case");
10605 break;
10608 /* 'from-abi' selects the most compatible architecture for the given
10609 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
10610 EABIs, we have to decide whether we're using the 32-bit or 64-bit
10611 version. Look first at the -mgp options, if given, otherwise base
10612 the choice on MASK_64BIT in TARGET_DEFAULT. */
10613 if (strcasecmp (cpu_string, "from-abi") == 0)
10614 return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
10615 : ABI_NEEDS_64BIT_REGS ? 3
10616 : (TARGET_64BIT ? 3 : 1));
10618 /* 'default' has traditionally been a no-op. Probably not very useful. */
10619 if (strcasecmp (cpu_string, "default") == 0)
10620 return 0;
10622 for (p = mips_cpu_info_table; p->name != 0; p++)
10623 if (mips_matching_cpu_name_p (p->name, cpu_string))
10624 return p;
10626 return 0;
10630 /* Return the processor associated with the given ISA level, or null
10631 if the ISA isn't valid. */
10633 static const struct mips_cpu_info *
10634 mips_cpu_info_from_isa (int isa)
10636 const struct mips_cpu_info *p;
10638 for (p = mips_cpu_info_table; p->name != 0; p++)
10639 if (p->isa == isa)
10640 return p;
10642 return 0;
10645 /* Implement HARD_REGNO_NREGS. The size of FP registers is controlled
10646 by UNITS_PER_FPREG. The size of FP status registers is always 4, because
10647 they only hold condition code modes, and CCmode is always considered to
10648 be 4 bytes wide. All other registers are word sized. */
10650 unsigned int
10651 mips_hard_regno_nregs (int regno, enum machine_mode mode)
10653 if (ST_REG_P (regno))
10654 return ((GET_MODE_SIZE (mode) + 3) / 4);
10655 else if (! FP_REG_P (regno))
10656 return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
10657 else
10658 return ((GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG);
10661 /* Implement TARGET_RETURN_IN_MEMORY. Under the old (i.e., 32 and O64 ABIs)
10662 all BLKmode objects are returned in memory. Under the new (N32 and
10663 64-bit MIPS ABIs) small structures are returned in a register.
10664 Objects with varying size must still be returned in memory, of
10665 course. */
10667 static bool
10668 mips_return_in_memory (tree type, tree fndecl ATTRIBUTE_UNUSED)
10670 if (TARGET_OLDABI)
10671 return (TYPE_MODE (type) == BLKmode);
10672 else
10673 return ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
10674 || (int_size_in_bytes (type) == -1));
10677 static bool
10678 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
10680 return !TARGET_OLDABI;
10683 /* Return true if INSN is a multiply-add or multiply-subtract
10684 instruction and PREV assigns to the accumulator operand. */
10686 bool
10687 mips_linked_madd_p (rtx prev, rtx insn)
10689 rtx x;
10691 x = single_set (insn);
10692 if (x == 0)
10693 return false;
10695 x = SET_SRC (x);
10697 if (GET_CODE (x) == PLUS
10698 && GET_CODE (XEXP (x, 0)) == MULT
10699 && reg_set_p (XEXP (x, 1), prev))
10700 return true;
10702 if (GET_CODE (x) == MINUS
10703 && GET_CODE (XEXP (x, 1)) == MULT
10704 && reg_set_p (XEXP (x, 0), prev))
10705 return true;
10707 return false;
10710 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
10711 that may clobber hi or lo. */
10713 static rtx mips_macc_chains_last_hilo;
10715 /* A TUNE_MACC_CHAINS helper function. Record that instruction INSN has
10716 been scheduled, updating mips_macc_chains_last_hilo appropriately. */
10718 static void
10719 mips_macc_chains_record (rtx insn)
10721 if (get_attr_may_clobber_hilo (insn))
10722 mips_macc_chains_last_hilo = insn;
10725 /* A TUNE_MACC_CHAINS helper function. Search ready queue READY, which
10726 has NREADY elements, looking for a multiply-add or multiply-subtract
10727 instruction that is cumulative with mips_macc_chains_last_hilo.
10728 If there is one, promote it ahead of anything else that might
10729 clobber hi or lo. */
10731 static void
10732 mips_macc_chains_reorder (rtx *ready, int nready)
10734 int i, j;
10736 if (mips_macc_chains_last_hilo != 0)
10737 for (i = nready - 1; i >= 0; i--)
10738 if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
10740 for (j = nready - 1; j > i; j--)
10741 if (recog_memoized (ready[j]) >= 0
10742 && get_attr_may_clobber_hilo (ready[j]))
10744 mips_promote_ready (ready, i, j);
10745 break;
10747 break;
10751 /* The last instruction to be scheduled. */
10753 static rtx vr4130_last_insn;
10755 /* A note_stores callback used by vr4130_true_reg_dependence_p. DATA
10756 points to an rtx that is initially an instruction. Nullify the rtx
10757 if the instruction uses the value of register X. */
10759 static void
10760 vr4130_true_reg_dependence_p_1 (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
10762 rtx *insn_ptr = data;
10763 if (REG_P (x)
10764 && *insn_ptr != 0
10765 && reg_referenced_p (x, PATTERN (*insn_ptr)))
10766 *insn_ptr = 0;
10769 /* Return true if there is true register dependence between vr4130_last_insn
10770 and INSN. */
10772 static bool
10773 vr4130_true_reg_dependence_p (rtx insn)
10775 note_stores (PATTERN (vr4130_last_insn),
10776 vr4130_true_reg_dependence_p_1, &insn);
10777 return insn == 0;
10780 /* A TUNE_MIPS4130 helper function. Given that INSN1 is at the head of
10781 the ready queue and that INSN2 is the instruction after it, return
10782 true if it is worth promoting INSN2 ahead of INSN1. Look for cases
10783 in which INSN1 and INSN2 can probably issue in parallel, but for
10784 which (INSN2, INSN1) should be less sensitive to instruction
10785 alignment than (INSN1, INSN2). See 4130.md for more details. */
10787 static bool
10788 vr4130_swap_insns_p (rtx insn1, rtx insn2)
10790 dep_link_t dep;
10792 /* Check for the following case:
10794 1) there is some other instruction X with an anti dependence on INSN1;
10795 2) X has a higher priority than INSN2; and
10796 3) X is an arithmetic instruction (and thus has no unit restrictions).
10798 If INSN1 is the last instruction blocking X, it would better to
10799 choose (INSN1, X) over (INSN2, INSN1). */
10800 FOR_EACH_DEP_LINK (dep, INSN_FORW_DEPS (insn1))
10801 if (DEP_LINK_KIND (dep) == REG_DEP_ANTI
10802 && INSN_PRIORITY (DEP_LINK_CON (dep)) > INSN_PRIORITY (insn2)
10803 && recog_memoized (DEP_LINK_CON (dep)) >= 0
10804 && get_attr_vr4130_class (DEP_LINK_CON (dep)) == VR4130_CLASS_ALU)
10805 return false;
10807 if (vr4130_last_insn != 0
10808 && recog_memoized (insn1) >= 0
10809 && recog_memoized (insn2) >= 0)
10811 /* See whether INSN1 and INSN2 use different execution units,
10812 or if they are both ALU-type instructions. If so, they can
10813 probably execute in parallel. */
10814 enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
10815 enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
10816 if (class1 != class2 || class1 == VR4130_CLASS_ALU)
10818 /* If only one of the instructions has a dependence on
10819 vr4130_last_insn, prefer to schedule the other one first. */
10820 bool dep1 = vr4130_true_reg_dependence_p (insn1);
10821 bool dep2 = vr4130_true_reg_dependence_p (insn2);
10822 if (dep1 != dep2)
10823 return dep1;
10825 /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
10826 is not an ALU-type instruction and if INSN1 uses the same
10827 execution unit. (Note that if this condition holds, we already
10828 know that INSN2 uses a different execution unit.) */
10829 if (class1 != VR4130_CLASS_ALU
10830 && recog_memoized (vr4130_last_insn) >= 0
10831 && class1 == get_attr_vr4130_class (vr4130_last_insn))
10832 return true;
10835 return false;
10838 /* A TUNE_MIPS4130 helper function. (READY, NREADY) describes a ready
10839 queue with at least two instructions. Swap the first two if
10840 vr4130_swap_insns_p says that it could be worthwhile. */
10842 static void
10843 vr4130_reorder (rtx *ready, int nready)
10845 if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
10846 mips_promote_ready (ready, nready - 2, nready - 1);
10849 /* Remove the instruction at index LOWER from ready queue READY and
10850 reinsert it in front of the instruction at index HIGHER. LOWER must
10851 be <= HIGHER. */
10853 static void
10854 mips_promote_ready (rtx *ready, int lower, int higher)
10856 rtx new_head;
10857 int i;
10859 new_head = ready[lower];
10860 for (i = lower; i < higher; i++)
10861 ready[i] = ready[i + 1];
10862 ready[i] = new_head;
10865 /* Implement TARGET_SCHED_REORDER. */
10867 static int
10868 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
10869 rtx *ready, int *nreadyp, int cycle)
10871 if (!reload_completed && TUNE_MACC_CHAINS)
10873 if (cycle == 0)
10874 mips_macc_chains_last_hilo = 0;
10875 if (*nreadyp > 0)
10876 mips_macc_chains_reorder (ready, *nreadyp);
10878 if (reload_completed && TUNE_MIPS4130 && !TARGET_VR4130_ALIGN)
10880 if (cycle == 0)
10881 vr4130_last_insn = 0;
10882 if (*nreadyp > 1)
10883 vr4130_reorder (ready, *nreadyp);
10885 return mips_issue_rate ();
10888 /* Implement TARGET_SCHED_VARIABLE_ISSUE. */
10890 static int
10891 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
10892 rtx insn, int more)
10894 switch (GET_CODE (PATTERN (insn)))
10896 case USE:
10897 case CLOBBER:
10898 /* Don't count USEs and CLOBBERs against the issue rate. */
10899 break;
10901 default:
10902 more--;
10903 if (!reload_completed && TUNE_MACC_CHAINS)
10904 mips_macc_chains_record (insn);
10905 vr4130_last_insn = insn;
10906 break;
10908 return more;
10911 /* Implement TARGET_SCHED_ADJUST_COST. We assume that anti and output
10912 dependencies have no cost, except on the 20Kc where output-dependence
10913 is treated like input-dependence. */
10915 static int
10916 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
10917 rtx dep ATTRIBUTE_UNUSED, int cost)
10919 if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
10920 && TUNE_20KC)
10921 return cost;
10922 if (REG_NOTE_KIND (link) != 0)
10923 return 0;
10924 return cost;
10927 /* Return the number of instructions that can be issued per cycle. */
10929 static int
10930 mips_issue_rate (void)
10932 switch (mips_tune)
10934 case PROCESSOR_74KC:
10935 case PROCESSOR_74KF2_1:
10936 case PROCESSOR_74KF1_1:
10937 case PROCESSOR_74KF3_2:
10938 /* The 74k is not strictly quad-issue cpu, but can be seen as one
10939 by the scheduler. It can issue 1 ALU, 1 AGEN and 2 FPU insns,
10940 but in reality only a maximum of 3 insns can be issued as the
10941 floating point load/stores also require a slot in the AGEN pipe. */
10942 return 4;
10944 case PROCESSOR_20KC:
10945 case PROCESSOR_R4130:
10946 case PROCESSOR_R5400:
10947 case PROCESSOR_R5500:
10948 case PROCESSOR_R7000:
10949 case PROCESSOR_R9000:
10950 return 2;
10952 case PROCESSOR_SB1:
10953 case PROCESSOR_SB1A:
10954 /* This is actually 4, but we get better performance if we claim 3.
10955 This is partly because of unwanted speculative code motion with the
10956 larger number, and partly because in most common cases we can't
10957 reach the theoretical max of 4. */
10958 return 3;
10960 default:
10961 return 1;
10965 /* Implements TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD. This should
10966 be as wide as the scheduling freedom in the DFA. */
10968 static int
10969 mips_multipass_dfa_lookahead (void)
10971 /* Can schedule up to 4 of the 6 function units in any one cycle. */
10972 if (TUNE_SB1)
10973 return 4;
10975 return 0;
10978 /* Implements a store data bypass check. We need this because the cprestore
10979 pattern is type store, but defined using an UNSPEC. This UNSPEC causes the
10980 default routine to abort. We just return false for that case. */
10981 /* ??? Should try to give a better result here than assuming false. */
10984 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
10986 if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
10987 return false;
10989 return ! store_data_bypass_p (out_insn, in_insn);
10992 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
10993 return the first operand of the associated "pref" or "prefx" insn. */
10996 mips_prefetch_cookie (rtx write, rtx locality)
10998 /* store_streamed / load_streamed. */
10999 if (INTVAL (locality) <= 0)
11000 return GEN_INT (INTVAL (write) + 4);
11002 /* store / load. */
11003 if (INTVAL (locality) <= 2)
11004 return write;
11006 /* store_retained / load_retained. */
11007 return GEN_INT (INTVAL (write) + 6);
11010 /* MIPS builtin function support. */
11012 struct builtin_description
11014 /* The code of the main .md file instruction. See mips_builtin_type
11015 for more information. */
11016 enum insn_code icode;
11018 /* The floating-point comparison code to use with ICODE, if any. */
11019 enum mips_fp_condition cond;
11021 /* The name of the builtin function. */
11022 const char *name;
11024 /* Specifies how the function should be expanded. */
11025 enum mips_builtin_type builtin_type;
11027 /* The function's prototype. */
11028 enum mips_function_type function_type;
11030 /* The target flags required for this function. */
11031 int target_flags;
11034 /* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_mips_<INSN>.
11035 FUNCTION_TYPE and TARGET_FLAGS are builtin_description fields. */
11036 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \
11037 { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN, \
11038 MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
11040 /* Define __builtin_mips_<INSN>_<COND>_{s,d}, both of which require
11041 TARGET_FLAGS. */
11042 #define CMP_SCALAR_BUILTINS(INSN, COND, TARGET_FLAGS) \
11043 { CODE_FOR_mips_ ## INSN ## _cond_s, MIPS_FP_COND_ ## COND, \
11044 "__builtin_mips_" #INSN "_" #COND "_s", \
11045 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, TARGET_FLAGS }, \
11046 { CODE_FOR_mips_ ## INSN ## _cond_d, MIPS_FP_COND_ ## COND, \
11047 "__builtin_mips_" #INSN "_" #COND "_d", \
11048 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, TARGET_FLAGS }
11050 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
11051 The lower and upper forms require TARGET_FLAGS while the any and all
11052 forms require MASK_MIPS3D. */
11053 #define CMP_PS_BUILTINS(INSN, COND, TARGET_FLAGS) \
11054 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11055 "__builtin_mips_any_" #INSN "_" #COND "_ps", \
11056 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D }, \
11057 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11058 "__builtin_mips_all_" #INSN "_" #COND "_ps", \
11059 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D }, \
11060 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11061 "__builtin_mips_lower_" #INSN "_" #COND "_ps", \
11062 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS }, \
11063 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11064 "__builtin_mips_upper_" #INSN "_" #COND "_ps", \
11065 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS }
11067 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s. The functions
11068 require MASK_MIPS3D. */
11069 #define CMP_4S_BUILTINS(INSN, COND) \
11070 { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND, \
11071 "__builtin_mips_any_" #INSN "_" #COND "_4s", \
11072 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11073 MASK_MIPS3D }, \
11074 { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND, \
11075 "__builtin_mips_all_" #INSN "_" #COND "_4s", \
11076 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11077 MASK_MIPS3D }
11079 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps. The comparison
11080 instruction requires TARGET_FLAGS. */
11081 #define MOVTF_BUILTINS(INSN, COND, TARGET_FLAGS) \
11082 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11083 "__builtin_mips_movt_" #INSN "_" #COND "_ps", \
11084 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11085 TARGET_FLAGS }, \
11086 { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND, \
11087 "__builtin_mips_movf_" #INSN "_" #COND "_ps", \
11088 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
11089 TARGET_FLAGS }
11091 /* Define all the builtins related to c.cond.fmt condition COND. */
11092 #define CMP_BUILTINS(COND) \
11093 MOVTF_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT), \
11094 MOVTF_BUILTINS (cabs, COND, MASK_MIPS3D), \
11095 CMP_SCALAR_BUILTINS (cabs, COND, MASK_MIPS3D), \
11096 CMP_PS_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT), \
11097 CMP_PS_BUILTINS (cabs, COND, MASK_MIPS3D), \
11098 CMP_4S_BUILTINS (c, COND), \
11099 CMP_4S_BUILTINS (cabs, COND)
11101 static const struct builtin_description mips_bdesc[] =
11103 DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11104 DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11105 DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11106 DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11107 DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, MASK_PAIRED_SINGLE_FLOAT),
11108 DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11109 DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11110 DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
11112 DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
11113 MASK_PAIRED_SINGLE_FLOAT),
11114 DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
11115 DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
11116 DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
11117 DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
11119 DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
11120 DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
11121 DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
11122 DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
11123 DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
11124 DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
11126 DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
11127 DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
11128 DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
11129 DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
11130 DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
11131 DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
11133 MIPS_FP_CONDITIONS (CMP_BUILTINS)
11136 /* Builtin functions for the SB-1 processor. */
11138 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
11140 static const struct builtin_description sb1_bdesc[] =
11142 DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT)
11145 /* Builtin functions for DSP ASE. */
11147 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
11148 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
11149 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
11150 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
11151 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
11153 /* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction
11154 CODE_FOR_mips_<INSN>. FUNCTION_TYPE and TARGET_FLAGS are
11155 builtin_description fields. */
11156 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \
11157 { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN, \
11158 MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS }
11160 /* Define __builtin_mips_bposge<VALUE>. <VALUE> is 32 for the MIPS32 DSP
11161 branch instruction. TARGET_FLAGS is a builtin_description field. */
11162 #define BPOSGE_BUILTIN(VALUE, TARGET_FLAGS) \
11163 { CODE_FOR_mips_bposge, 0, "__builtin_mips_bposge" #VALUE, \
11164 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, TARGET_FLAGS }
11166 static const struct builtin_description dsp_bdesc[] =
11168 DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11169 DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11170 DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11171 DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
11172 DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
11173 DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11174 DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11175 DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11176 DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
11177 DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
11178 DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11179 DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11180 DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11181 DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, MASK_DSP),
11182 DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, MASK_DSP),
11183 DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, MASK_DSP),
11184 DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
11185 DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
11186 DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
11187 DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
11188 DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, MASK_DSP),
11189 DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, MASK_DSP),
11190 DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11191 DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11192 DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11193 DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11194 DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11195 DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11196 DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11197 DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
11198 DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
11199 DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
11200 DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
11201 DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11202 DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
11203 DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
11204 DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
11205 DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11206 DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
11207 DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
11208 DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11209 DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
11210 DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
11211 DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, MASK_DSP),
11212 DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
11213 DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, MASK_DSP),
11214 DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, MASK_DSP),
11215 DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
11216 DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
11217 DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
11218 DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
11219 DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
11220 DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
11221 DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
11222 DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
11223 DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
11224 DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
11225 DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11226 DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
11227 DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, MASK_DSP),
11228 DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, MASK_DSP),
11229 DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
11230 DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
11231 DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
11232 BPOSGE_BUILTIN (32, MASK_DSP),
11234 /* The following are for the MIPS DSP ASE REV 2. */
11235 DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, MASK_DSPR2),
11236 DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11237 DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11238 DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11239 DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11240 DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
11241 DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
11242 DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11243 DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11244 DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11245 DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11246 DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11247 DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
11248 DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11249 DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
11250 DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11251 DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
11252 DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, MASK_DSPR2),
11253 DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, MASK_DSPR2),
11254 DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
11255 DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSPR2),
11256 DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSPR2),
11257 DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11258 DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11259 DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11260 DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSPR2),
11261 DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11262 DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11263 DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
11264 DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
11265 DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11266 DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSPR2),
11267 DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2),
11268 DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSPR2)
11271 static const struct builtin_description dsp_32only_bdesc[] =
11273 DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
11274 DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
11275 DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
11276 DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
11277 DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11278 DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11279 DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11280 DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
11281 DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
11282 DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11283 DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11284 DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11285 DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
11286 DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11287 DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11288 DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11289 DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11290 DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11291 DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
11292 DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
11293 DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
11295 /* The following are for the MIPS DSP ASE REV 2. */
11296 DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11297 DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11298 DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
11299 DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
11300 DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSPR2),
11301 DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, MASK_DSPR2),
11302 DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11303 DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, MASK_DSPR2),
11304 DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, MASK_DSPR2),
11305 DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11306 DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11307 DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11308 DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11309 DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2),
11310 DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSPR2)
11313 /* This helps provide a mapping from builtin function codes to bdesc
11314 arrays. */
11316 struct bdesc_map
11318 /* The builtin function table that this entry describes. */
11319 const struct builtin_description *bdesc;
11321 /* The number of entries in the builtin function table. */
11322 unsigned int size;
11324 /* The target processor that supports these builtin functions.
11325 PROCESSOR_MAX means we enable them for all processors. */
11326 enum processor_type proc;
11328 /* If the target has these flags, this builtin function table
11329 will not be supported. */
11330 int unsupported_target_flags;
11333 static const struct bdesc_map bdesc_arrays[] =
11335 { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX, 0 },
11336 { sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1, 0 },
11337 { dsp_bdesc, ARRAY_SIZE (dsp_bdesc), PROCESSOR_MAX, 0 },
11338 { dsp_32only_bdesc, ARRAY_SIZE (dsp_32only_bdesc), PROCESSOR_MAX,
11339 MASK_64BIT }
11342 /* Take the argument ARGNUM of the arglist of EXP and convert it into a form
11343 suitable for input operand OP of instruction ICODE. Return the value. */
11345 static rtx
11346 mips_prepare_builtin_arg (enum insn_code icode,
11347 unsigned int op, tree exp, unsigned int argnum)
11349 rtx value;
11350 enum machine_mode mode;
11352 value = expand_normal (CALL_EXPR_ARG (exp, argnum));
11353 mode = insn_data[icode].operand[op].mode;
11354 if (!insn_data[icode].operand[op].predicate (value, mode))
11356 value = copy_to_mode_reg (mode, value);
11357 /* Check the predicate again. */
11358 if (!insn_data[icode].operand[op].predicate (value, mode))
11360 error ("invalid argument to builtin function");
11361 return const0_rtx;
11365 return value;
11368 /* Return an rtx suitable for output operand OP of instruction ICODE.
11369 If TARGET is non-null, try to use it where possible. */
11371 static rtx
11372 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
11374 enum machine_mode mode;
11376 mode = insn_data[icode].operand[op].mode;
11377 if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
11378 target = gen_reg_rtx (mode);
11380 return target;
11383 /* Expand builtin functions. This is called from TARGET_EXPAND_BUILTIN. */
11386 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
11387 enum machine_mode mode ATTRIBUTE_UNUSED,
11388 int ignore ATTRIBUTE_UNUSED)
11390 enum insn_code icode;
11391 enum mips_builtin_type type;
11392 tree fndecl;
11393 unsigned int fcode;
11394 const struct builtin_description *bdesc;
11395 const struct bdesc_map *m;
11397 fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
11398 fcode = DECL_FUNCTION_CODE (fndecl);
11400 bdesc = NULL;
11401 for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
11403 if (fcode < m->size)
11405 bdesc = m->bdesc;
11406 icode = bdesc[fcode].icode;
11407 type = bdesc[fcode].builtin_type;
11408 break;
11410 fcode -= m->size;
11412 if (bdesc == NULL)
11413 return 0;
11415 switch (type)
11417 case MIPS_BUILTIN_DIRECT:
11418 return mips_expand_builtin_direct (icode, target, exp, true);
11420 case MIPS_BUILTIN_DIRECT_NO_TARGET:
11421 return mips_expand_builtin_direct (icode, target, exp, false);
11423 case MIPS_BUILTIN_MOVT:
11424 case MIPS_BUILTIN_MOVF:
11425 return mips_expand_builtin_movtf (type, icode, bdesc[fcode].cond,
11426 target, exp);
11428 case MIPS_BUILTIN_CMP_ANY:
11429 case MIPS_BUILTIN_CMP_ALL:
11430 case MIPS_BUILTIN_CMP_UPPER:
11431 case MIPS_BUILTIN_CMP_LOWER:
11432 case MIPS_BUILTIN_CMP_SINGLE:
11433 return mips_expand_builtin_compare (type, icode, bdesc[fcode].cond,
11434 target, exp);
11436 case MIPS_BUILTIN_BPOSGE32:
11437 return mips_expand_builtin_bposge (type, target);
11439 default:
11440 return 0;
11444 /* Init builtin functions. This is called from TARGET_INIT_BUILTIN. */
11446 void
11447 mips_init_builtins (void)
11449 const struct builtin_description *d;
11450 const struct bdesc_map *m;
11451 tree types[(int) MIPS_MAX_FTYPE_MAX];
11452 tree V2SF_type_node;
11453 tree V2HI_type_node;
11454 tree V4QI_type_node;
11455 unsigned int offset;
11457 /* We have only builtins for -mpaired-single, -mips3d and -mdsp. */
11458 if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP)
11459 return;
11461 if (TARGET_PAIRED_SINGLE_FLOAT)
11463 V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
11465 types[MIPS_V2SF_FTYPE_V2SF]
11466 = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
11468 types[MIPS_V2SF_FTYPE_V2SF_V2SF]
11469 = build_function_type_list (V2SF_type_node,
11470 V2SF_type_node, V2SF_type_node, NULL_TREE);
11472 types[MIPS_V2SF_FTYPE_V2SF_V2SF_INT]
11473 = build_function_type_list (V2SF_type_node,
11474 V2SF_type_node, V2SF_type_node,
11475 integer_type_node, NULL_TREE);
11477 types[MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF]
11478 = build_function_type_list (V2SF_type_node,
11479 V2SF_type_node, V2SF_type_node,
11480 V2SF_type_node, V2SF_type_node, NULL_TREE);
11482 types[MIPS_V2SF_FTYPE_SF_SF]
11483 = build_function_type_list (V2SF_type_node,
11484 float_type_node, float_type_node, NULL_TREE);
11486 types[MIPS_INT_FTYPE_V2SF_V2SF]
11487 = build_function_type_list (integer_type_node,
11488 V2SF_type_node, V2SF_type_node, NULL_TREE);
11490 types[MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF]
11491 = build_function_type_list (integer_type_node,
11492 V2SF_type_node, V2SF_type_node,
11493 V2SF_type_node, V2SF_type_node, NULL_TREE);
11495 types[MIPS_INT_FTYPE_SF_SF]
11496 = build_function_type_list (integer_type_node,
11497 float_type_node, float_type_node, NULL_TREE);
11499 types[MIPS_INT_FTYPE_DF_DF]
11500 = build_function_type_list (integer_type_node,
11501 double_type_node, double_type_node, NULL_TREE);
11503 types[MIPS_SF_FTYPE_V2SF]
11504 = build_function_type_list (float_type_node, V2SF_type_node, NULL_TREE);
11506 types[MIPS_SF_FTYPE_SF]
11507 = build_function_type_list (float_type_node,
11508 float_type_node, NULL_TREE);
11510 types[MIPS_SF_FTYPE_SF_SF]
11511 = build_function_type_list (float_type_node,
11512 float_type_node, float_type_node, NULL_TREE);
11514 types[MIPS_DF_FTYPE_DF]
11515 = build_function_type_list (double_type_node,
11516 double_type_node, NULL_TREE);
11518 types[MIPS_DF_FTYPE_DF_DF]
11519 = build_function_type_list (double_type_node,
11520 double_type_node, double_type_node, NULL_TREE);
11523 if (TARGET_DSP)
11525 V2HI_type_node = build_vector_type_for_mode (intHI_type_node, V2HImode);
11526 V4QI_type_node = build_vector_type_for_mode (intQI_type_node, V4QImode);
11528 types[MIPS_V2HI_FTYPE_V2HI_V2HI]
11529 = build_function_type_list (V2HI_type_node,
11530 V2HI_type_node, V2HI_type_node,
11531 NULL_TREE);
11533 types[MIPS_SI_FTYPE_SI_SI]
11534 = build_function_type_list (intSI_type_node,
11535 intSI_type_node, intSI_type_node,
11536 NULL_TREE);
11538 types[MIPS_V4QI_FTYPE_V4QI_V4QI]
11539 = build_function_type_list (V4QI_type_node,
11540 V4QI_type_node, V4QI_type_node,
11541 NULL_TREE);
11543 types[MIPS_SI_FTYPE_V4QI]
11544 = build_function_type_list (intSI_type_node,
11545 V4QI_type_node,
11546 NULL_TREE);
11548 types[MIPS_V2HI_FTYPE_V2HI]
11549 = build_function_type_list (V2HI_type_node,
11550 V2HI_type_node,
11551 NULL_TREE);
11553 types[MIPS_SI_FTYPE_SI]
11554 = build_function_type_list (intSI_type_node,
11555 intSI_type_node,
11556 NULL_TREE);
11558 types[MIPS_V4QI_FTYPE_V2HI_V2HI]
11559 = build_function_type_list (V4QI_type_node,
11560 V2HI_type_node, V2HI_type_node,
11561 NULL_TREE);
11563 types[MIPS_V2HI_FTYPE_SI_SI]
11564 = build_function_type_list (V2HI_type_node,
11565 intSI_type_node, intSI_type_node,
11566 NULL_TREE);
11568 types[MIPS_SI_FTYPE_V2HI]
11569 = build_function_type_list (intSI_type_node,
11570 V2HI_type_node,
11571 NULL_TREE);
11573 types[MIPS_V2HI_FTYPE_V4QI]
11574 = build_function_type_list (V2HI_type_node,
11575 V4QI_type_node,
11576 NULL_TREE);
11578 types[MIPS_V4QI_FTYPE_V4QI_SI]
11579 = build_function_type_list (V4QI_type_node,
11580 V4QI_type_node, intSI_type_node,
11581 NULL_TREE);
11583 types[MIPS_V2HI_FTYPE_V2HI_SI]
11584 = build_function_type_list (V2HI_type_node,
11585 V2HI_type_node, intSI_type_node,
11586 NULL_TREE);
11588 types[MIPS_V2HI_FTYPE_V4QI_V2HI]
11589 = build_function_type_list (V2HI_type_node,
11590 V4QI_type_node, V2HI_type_node,
11591 NULL_TREE);
11593 types[MIPS_SI_FTYPE_V2HI_V2HI]
11594 = build_function_type_list (intSI_type_node,
11595 V2HI_type_node, V2HI_type_node,
11596 NULL_TREE);
11598 types[MIPS_DI_FTYPE_DI_V4QI_V4QI]
11599 = build_function_type_list (intDI_type_node,
11600 intDI_type_node, V4QI_type_node, V4QI_type_node,
11601 NULL_TREE);
11603 types[MIPS_DI_FTYPE_DI_V2HI_V2HI]
11604 = build_function_type_list (intDI_type_node,
11605 intDI_type_node, V2HI_type_node, V2HI_type_node,
11606 NULL_TREE);
11608 types[MIPS_DI_FTYPE_DI_SI_SI]
11609 = build_function_type_list (intDI_type_node,
11610 intDI_type_node, intSI_type_node, intSI_type_node,
11611 NULL_TREE);
11613 types[MIPS_V4QI_FTYPE_SI]
11614 = build_function_type_list (V4QI_type_node,
11615 intSI_type_node,
11616 NULL_TREE);
11618 types[MIPS_V2HI_FTYPE_SI]
11619 = build_function_type_list (V2HI_type_node,
11620 intSI_type_node,
11621 NULL_TREE);
11623 types[MIPS_VOID_FTYPE_V4QI_V4QI]
11624 = build_function_type_list (void_type_node,
11625 V4QI_type_node, V4QI_type_node,
11626 NULL_TREE);
11628 types[MIPS_SI_FTYPE_V4QI_V4QI]
11629 = build_function_type_list (intSI_type_node,
11630 V4QI_type_node, V4QI_type_node,
11631 NULL_TREE);
11633 types[MIPS_VOID_FTYPE_V2HI_V2HI]
11634 = build_function_type_list (void_type_node,
11635 V2HI_type_node, V2HI_type_node,
11636 NULL_TREE);
11638 types[MIPS_SI_FTYPE_DI_SI]
11639 = build_function_type_list (intSI_type_node,
11640 intDI_type_node, intSI_type_node,
11641 NULL_TREE);
11643 types[MIPS_DI_FTYPE_DI_SI]
11644 = build_function_type_list (intDI_type_node,
11645 intDI_type_node, intSI_type_node,
11646 NULL_TREE);
11648 types[MIPS_VOID_FTYPE_SI_SI]
11649 = build_function_type_list (void_type_node,
11650 intSI_type_node, intSI_type_node,
11651 NULL_TREE);
11653 types[MIPS_SI_FTYPE_PTR_SI]
11654 = build_function_type_list (intSI_type_node,
11655 ptr_type_node, intSI_type_node,
11656 NULL_TREE);
11658 types[MIPS_SI_FTYPE_VOID]
11659 = build_function_type (intSI_type_node, void_list_node);
11661 if (TARGET_DSPR2)
11663 types[MIPS_V4QI_FTYPE_V4QI]
11664 = build_function_type_list (V4QI_type_node,
11665 V4QI_type_node,
11666 NULL_TREE);
11668 types[MIPS_SI_FTYPE_SI_SI_SI]
11669 = build_function_type_list (intSI_type_node,
11670 intSI_type_node, intSI_type_node,
11671 intSI_type_node, NULL_TREE);
11673 types[MIPS_DI_FTYPE_DI_USI_USI]
11674 = build_function_type_list (intDI_type_node,
11675 intDI_type_node,
11676 unsigned_intSI_type_node,
11677 unsigned_intSI_type_node, NULL_TREE);
11679 types[MIPS_DI_FTYPE_SI_SI]
11680 = build_function_type_list (intDI_type_node,
11681 intSI_type_node, intSI_type_node,
11682 NULL_TREE);
11684 types[MIPS_DI_FTYPE_USI_USI]
11685 = build_function_type_list (intDI_type_node,
11686 unsigned_intSI_type_node,
11687 unsigned_intSI_type_node, NULL_TREE);
11689 types[MIPS_V2HI_FTYPE_SI_SI_SI]
11690 = build_function_type_list (V2HI_type_node,
11691 intSI_type_node, intSI_type_node,
11692 intSI_type_node, NULL_TREE);
11697 /* Iterate through all of the bdesc arrays, initializing all of the
11698 builtin functions. */
11700 offset = 0;
11701 for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
11703 if ((m->proc == PROCESSOR_MAX || (m->proc == mips_arch))
11704 && (m->unsupported_target_flags & target_flags) == 0)
11705 for (d = m->bdesc; d < &m->bdesc[m->size]; d++)
11706 if ((d->target_flags & target_flags) == d->target_flags)
11707 add_builtin_function (d->name, types[d->function_type],
11708 d - m->bdesc + offset,
11709 BUILT_IN_MD, NULL, NULL);
11710 offset += m->size;
11714 /* Expand a MIPS_BUILTIN_DIRECT function. ICODE is the code of the
11715 .md pattern and CALL is the function expr with arguments. TARGET,
11716 if nonnull, suggests a good place to put the result.
11717 HAS_TARGET indicates the function must return something. */
11719 static rtx
11720 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
11721 bool has_target)
11723 rtx ops[MAX_RECOG_OPERANDS];
11724 int i = 0;
11725 int j = 0;
11727 if (has_target)
11729 /* We save target to ops[0]. */
11730 ops[0] = mips_prepare_builtin_target (icode, 0, target);
11731 i = 1;
11734 /* We need to test if the arglist is not zero. Some instructions have extra
11735 clobber registers. */
11736 for (; i < insn_data[icode].n_operands && i <= call_expr_nargs (exp); i++, j++)
11737 ops[i] = mips_prepare_builtin_arg (icode, i, exp, j);
11739 switch (i)
11741 case 2:
11742 emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
11743 break;
11745 case 3:
11746 emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
11747 break;
11749 case 4:
11750 emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
11751 break;
11753 default:
11754 gcc_unreachable ();
11756 return target;
11759 /* Expand a __builtin_mips_movt_*_ps() or __builtin_mips_movf_*_ps()
11760 function (TYPE says which). EXP is the tree for the function
11761 function, ICODE is the instruction that should be used to compare
11762 the first two arguments, and COND is the condition it should test.
11763 TARGET, if nonnull, suggests a good place to put the result. */
11765 static rtx
11766 mips_expand_builtin_movtf (enum mips_builtin_type type,
11767 enum insn_code icode, enum mips_fp_condition cond,
11768 rtx target, tree exp)
11770 rtx cmp_result, op0, op1;
11772 cmp_result = mips_prepare_builtin_target (icode, 0, 0);
11773 op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
11774 op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
11775 emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
11777 icode = CODE_FOR_mips_cond_move_tf_ps;
11778 target = mips_prepare_builtin_target (icode, 0, target);
11779 if (type == MIPS_BUILTIN_MOVT)
11781 op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
11782 op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
11784 else
11786 op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
11787 op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
11789 emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
11790 return target;
11793 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
11794 into TARGET otherwise. Return TARGET. */
11796 static rtx
11797 mips_builtin_branch_and_move (rtx condition, rtx target,
11798 rtx value_if_true, rtx value_if_false)
11800 rtx true_label, done_label;
11802 true_label = gen_label_rtx ();
11803 done_label = gen_label_rtx ();
11805 /* First assume that CONDITION is false. */
11806 emit_move_insn (target, value_if_false);
11808 /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise. */
11809 emit_jump_insn (gen_condjump (condition, true_label));
11810 emit_jump_insn (gen_jump (done_label));
11811 emit_barrier ();
11813 /* Fix TARGET if CONDITION is true. */
11814 emit_label (true_label);
11815 emit_move_insn (target, value_if_true);
11817 emit_label (done_label);
11818 return target;
11821 /* Expand a comparison builtin of type BUILTIN_TYPE. ICODE is the code
11822 of the comparison instruction and COND is the condition it should test.
11823 EXP is the function call and arguments and TARGET, if nonnull,
11824 suggests a good place to put the boolean result. */
11826 static rtx
11827 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
11828 enum insn_code icode, enum mips_fp_condition cond,
11829 rtx target, tree exp)
11831 rtx offset, condition, cmp_result, ops[MAX_RECOG_OPERANDS];
11832 int i;
11833 int j = 0;
11835 if (target == 0 || GET_MODE (target) != SImode)
11836 target = gen_reg_rtx (SImode);
11838 /* Prepare the operands to the comparison. */
11839 cmp_result = mips_prepare_builtin_target (icode, 0, 0);
11840 for (i = 1; i < insn_data[icode].n_operands - 1; i++, j++)
11841 ops[i] = mips_prepare_builtin_arg (icode, i, exp, j);
11843 switch (insn_data[icode].n_operands)
11845 case 4:
11846 emit_insn (GEN_FCN (icode) (cmp_result, ops[1], ops[2], GEN_INT (cond)));
11847 break;
11849 case 6:
11850 emit_insn (GEN_FCN (icode) (cmp_result, ops[1], ops[2],
11851 ops[3], ops[4], GEN_INT (cond)));
11852 break;
11854 default:
11855 gcc_unreachable ();
11858 /* If the comparison sets more than one register, we define the result
11859 to be 0 if all registers are false and -1 if all registers are true.
11860 The value of the complete result is indeterminate otherwise. */
11861 switch (builtin_type)
11863 case MIPS_BUILTIN_CMP_ALL:
11864 condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
11865 return mips_builtin_branch_and_move (condition, target,
11866 const0_rtx, const1_rtx);
11868 case MIPS_BUILTIN_CMP_UPPER:
11869 case MIPS_BUILTIN_CMP_LOWER:
11870 offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
11871 condition = gen_single_cc (cmp_result, offset);
11872 return mips_builtin_branch_and_move (condition, target,
11873 const1_rtx, const0_rtx);
11875 default:
11876 condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
11877 return mips_builtin_branch_and_move (condition, target,
11878 const1_rtx, const0_rtx);
11882 /* Expand a bposge builtin of type BUILTIN_TYPE. TARGET, if nonnull,
11883 suggests a good place to put the boolean result. */
11885 static rtx
11886 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
11888 rtx condition, cmp_result;
11889 int cmp_value;
11891 if (target == 0 || GET_MODE (target) != SImode)
11892 target = gen_reg_rtx (SImode);
11894 cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
11896 if (builtin_type == MIPS_BUILTIN_BPOSGE32)
11897 cmp_value = 32;
11898 else
11899 gcc_assert (0);
11901 condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
11902 return mips_builtin_branch_and_move (condition, target,
11903 const1_rtx, const0_rtx);
11906 /* Set SYMBOL_REF_FLAGS for the SYMBOL_REF inside RTL, which belongs to DECL.
11907 FIRST is true if this is the first time handling this decl. */
11909 static void
11910 mips_encode_section_info (tree decl, rtx rtl, int first)
11912 default_encode_section_info (decl, rtl, first);
11914 if (TREE_CODE (decl) == FUNCTION_DECL)
11916 rtx symbol = XEXP (rtl, 0);
11918 if ((TARGET_LONG_CALLS && !mips_near_type_p (TREE_TYPE (decl)))
11919 || mips_far_type_p (TREE_TYPE (decl)))
11920 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
11924 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY. Some code models use the incoming
11925 value of PIC_FUNCTION_ADDR_REGNUM to set up the global pointer. */
11927 static void
11928 mips_extra_live_on_entry (bitmap regs)
11930 if (TARGET_USE_GOT && !TARGET_ABSOLUTE_ABICALLS)
11931 bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
11934 /* SImode values are represented as sign-extended to DImode. */
11937 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
11939 if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
11940 return SIGN_EXTEND;
11942 return UNKNOWN;
11945 /* MIPS implementation of TARGET_ASM_OUTPUT_DWARF_DTPREL. */
11947 static void
11948 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
11950 switch (size)
11952 case 4:
11953 fputs ("\t.dtprelword\t", file);
11954 break;
11956 case 8:
11957 fputs ("\t.dtpreldword\t", file);
11958 break;
11960 default:
11961 gcc_unreachable ();
11963 output_addr_const (file, x);
11964 fputs ("+0x8000", file);
11967 #include "gt-mips.h"