2014-12-19 Andrew MacLeod <amacleod@redhat.com>
[official-gcc.git] / gcc / config / mips / mips.c
blob122864ba764e001d305a46529b7430948f006428
1 /* Subroutines used for MIPS code generation.
2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
3 Contributed by A. Lichnewsky, lich@inria.inria.fr.
4 Changes by Michael Meissner, meissner@osf.org.
5 64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
6 Brendan Eich, brendan@microunity.com.
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
13 any later version.
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-attr.h"
34 #include "recog.h"
35 #include "output.h"
36 #include "tree.h"
37 #include "varasm.h"
38 #include "stringpool.h"
39 #include "stor-layout.h"
40 #include "calls.h"
41 #include "hashtab.h"
42 #include "hash-set.h"
43 #include "vec.h"
44 #include "machmode.h"
45 #include "input.h"
46 #include "function.h"
47 #include "expr.h"
48 #include "insn-codes.h"
49 #include "optabs.h"
50 #include "libfuncs.h"
51 #include "flags.h"
52 #include "reload.h"
53 #include "tm_p.h"
54 #include "ggc.h"
55 #include "gstab.h"
56 #include "hash-table.h"
57 #include "debug.h"
58 #include "target.h"
59 #include "target-def.h"
60 #include "common/common-target.h"
61 #include "langhooks.h"
62 #include "dominance.h"
63 #include "cfg.h"
64 #include "cfgrtl.h"
65 #include "cfganal.h"
66 #include "lcm.h"
67 #include "cfgbuild.h"
68 #include "cfgcleanup.h"
69 #include "predict.h"
70 #include "basic-block.h"
71 #include "sched-int.h"
72 #include "tree-ssa-alias.h"
73 #include "internal-fn.h"
74 #include "gimple-fold.h"
75 #include "tree-eh.h"
76 #include "gimple-expr.h"
77 #include "is-a.h"
78 #include "gimple.h"
79 #include "gimplify.h"
80 #include "bitmap.h"
81 #include "diagnostic.h"
82 #include "target-globals.h"
83 #include "opts.h"
84 #include "tree-pass.h"
85 #include "context.h"
86 #include "hash-map.h"
87 #include "plugin-api.h"
88 #include "ipa-ref.h"
89 #include "cgraph.h"
90 #include "builtins.h"
91 #include "rtl-iter.h"
93 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
94 #define UNSPEC_ADDRESS_P(X) \
95 (GET_CODE (X) == UNSPEC \
96 && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
97 && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
99 /* Extract the symbol or label from UNSPEC wrapper X. */
100 #define UNSPEC_ADDRESS(X) \
101 XVECEXP (X, 0, 0)
103 /* Extract the symbol type from UNSPEC wrapper X. */
104 #define UNSPEC_ADDRESS_TYPE(X) \
105 ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
107 /* The maximum distance between the top of the stack frame and the
108 value $sp has when we save and restore registers.
110 The value for normal-mode code must be a SMALL_OPERAND and must
111 preserve the maximum stack alignment. We therefore use a value
112 of 0x7ff0 in this case.
114 microMIPS LWM and SWM support 12-bit offsets (from -0x800 to 0x7ff),
115 so we use a maximum of 0x7f0 for TARGET_MICROMIPS.
117 MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
118 up to 0x7f8 bytes and can usually save or restore all the registers
119 that we need to save or restore. (Note that we can only use these
120 instructions for o32, for which the stack alignment is 8 bytes.)
122 We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
123 RESTORE are not available. We can then use unextended instructions
124 to save and restore registers, and to allocate and deallocate the top
125 part of the frame. */
126 #define MIPS_MAX_FIRST_STACK_STEP \
127 (!TARGET_COMPRESSION ? 0x7ff0 \
128 : TARGET_MICROMIPS || GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8 \
129 : TARGET_64BIT ? 0x100 : 0x400)
131 /* True if INSN is a mips.md pattern or asm statement. */
132 /* ??? This test exists through the compiler, perhaps it should be
133 moved to rtl.h. */
134 #define USEFUL_INSN_P(INSN) \
135 (NONDEBUG_INSN_P (INSN) \
136 && GET_CODE (PATTERN (INSN)) != USE \
137 && GET_CODE (PATTERN (INSN)) != CLOBBER)
139 /* If INSN is a delayed branch sequence, return the first instruction
140 in the sequence, otherwise return INSN itself. */
141 #define SEQ_BEGIN(INSN) \
142 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
143 ? as_a <rtx_insn *> (XVECEXP (PATTERN (INSN), 0, 0)) \
144 : (INSN))
146 /* Likewise for the last instruction in a delayed branch sequence. */
147 #define SEQ_END(INSN) \
148 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
149 ? as_a <rtx_insn *> (XVECEXP (PATTERN (INSN), \
150 0, \
151 XVECLEN (PATTERN (INSN), 0) - 1)) \
152 : (INSN))
154 /* Execute the following loop body with SUBINSN set to each instruction
155 between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive. */
156 #define FOR_EACH_SUBINSN(SUBINSN, INSN) \
157 for ((SUBINSN) = SEQ_BEGIN (INSN); \
158 (SUBINSN) != NEXT_INSN (SEQ_END (INSN)); \
159 (SUBINSN) = NEXT_INSN (SUBINSN))
161 /* True if bit BIT is set in VALUE. */
162 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
164 /* Return the opcode for a ptr_mode load of the form:
166 l[wd] DEST, OFFSET(BASE). */
167 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE) \
168 (((ptr_mode == DImode ? 0x37 : 0x23) << 26) \
169 | ((BASE) << 21) \
170 | ((DEST) << 16) \
171 | (OFFSET))
173 /* Return the opcode to move register SRC into register DEST. */
174 #define MIPS_MOVE(DEST, SRC) \
175 ((TARGET_64BIT ? 0x2d : 0x21) \
176 | ((DEST) << 11) \
177 | ((SRC) << 21))
179 /* Return the opcode for:
181 lui DEST, VALUE. */
182 #define MIPS_LUI(DEST, VALUE) \
183 ((0xf << 26) | ((DEST) << 16) | (VALUE))
185 /* Return the opcode to jump to register DEST. */
186 #define MIPS_JR(DEST) \
187 (((DEST) << 21) | 0x8)
189 /* Return the opcode for:
191 bal . + (1 + OFFSET) * 4. */
192 #define MIPS_BAL(OFFSET) \
193 ((0x1 << 26) | (0x11 << 16) | (OFFSET))
195 /* Return the usual opcode for a nop. */
196 #define MIPS_NOP 0
198 /* Classifies an address.
200 ADDRESS_REG
201 A natural register + offset address. The register satisfies
202 mips_valid_base_register_p and the offset is a const_arith_operand.
204 ADDRESS_LO_SUM
205 A LO_SUM rtx. The first operand is a valid base register and
206 the second operand is a symbolic address.
208 ADDRESS_CONST_INT
209 A signed 16-bit constant address.
211 ADDRESS_SYMBOLIC:
212 A constant symbolic address. */
213 enum mips_address_type {
214 ADDRESS_REG,
215 ADDRESS_LO_SUM,
216 ADDRESS_CONST_INT,
217 ADDRESS_SYMBOLIC
220 /* Macros to create an enumeration identifier for a function prototype. */
221 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
222 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
223 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
224 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
226 /* Classifies the prototype of a built-in function. */
227 enum mips_function_type {
228 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
229 #include "config/mips/mips-ftypes.def"
230 #undef DEF_MIPS_FTYPE
231 MIPS_MAX_FTYPE_MAX
234 /* Specifies how a built-in function should be converted into rtl. */
235 enum mips_builtin_type {
236 /* The function corresponds directly to an .md pattern. The return
237 value is mapped to operand 0 and the arguments are mapped to
238 operands 1 and above. */
239 MIPS_BUILTIN_DIRECT,
241 /* The function corresponds directly to an .md pattern. There is no return
242 value and the arguments are mapped to operands 0 and above. */
243 MIPS_BUILTIN_DIRECT_NO_TARGET,
245 /* The function corresponds to a comparison instruction followed by
246 a mips_cond_move_tf_ps pattern. The first two arguments are the
247 values to compare and the second two arguments are the vector
248 operands for the movt.ps or movf.ps instruction (in assembly order). */
249 MIPS_BUILTIN_MOVF,
250 MIPS_BUILTIN_MOVT,
252 /* The function corresponds to a V2SF comparison instruction. Operand 0
253 of this instruction is the result of the comparison, which has mode
254 CCV2 or CCV4. The function arguments are mapped to operands 1 and
255 above. The function's return value is an SImode boolean that is
256 true under the following conditions:
258 MIPS_BUILTIN_CMP_ANY: one of the registers is true
259 MIPS_BUILTIN_CMP_ALL: all of the registers are true
260 MIPS_BUILTIN_CMP_LOWER: the first register is true
261 MIPS_BUILTIN_CMP_UPPER: the second register is true. */
262 MIPS_BUILTIN_CMP_ANY,
263 MIPS_BUILTIN_CMP_ALL,
264 MIPS_BUILTIN_CMP_UPPER,
265 MIPS_BUILTIN_CMP_LOWER,
267 /* As above, but the instruction only sets a single $fcc register. */
268 MIPS_BUILTIN_CMP_SINGLE,
270 /* For generating bposge32 branch instructions in MIPS32 DSP ASE. */
271 MIPS_BUILTIN_BPOSGE32
274 /* Invoke MACRO (COND) for each C.cond.fmt condition. */
275 #define MIPS_FP_CONDITIONS(MACRO) \
276 MACRO (f), \
277 MACRO (un), \
278 MACRO (eq), \
279 MACRO (ueq), \
280 MACRO (olt), \
281 MACRO (ult), \
282 MACRO (ole), \
283 MACRO (ule), \
284 MACRO (sf), \
285 MACRO (ngle), \
286 MACRO (seq), \
287 MACRO (ngl), \
288 MACRO (lt), \
289 MACRO (nge), \
290 MACRO (le), \
291 MACRO (ngt)
293 /* Enumerates the codes above as MIPS_FP_COND_<X>. */
294 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
295 enum mips_fp_condition {
296 MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
298 #undef DECLARE_MIPS_COND
300 /* Index X provides the string representation of MIPS_FP_COND_<X>. */
301 #define STRINGIFY(X) #X
302 static const char *const mips_fp_conditions[] = {
303 MIPS_FP_CONDITIONS (STRINGIFY)
305 #undef STRINGIFY
307 /* A class used to control a comdat-style stub that we output in each
308 translation unit that needs it. */
309 class mips_one_only_stub {
310 public:
311 virtual ~mips_one_only_stub () {}
313 /* Return the name of the stub. */
314 virtual const char *get_name () = 0;
316 /* Output the body of the function to asm_out_file. */
317 virtual void output_body () = 0;
320 /* Tuning information that is automatically derived from other sources
321 (such as the scheduler). */
322 static struct {
323 /* The architecture and tuning settings that this structure describes. */
324 enum processor arch;
325 enum processor tune;
327 /* True if this structure describes MIPS16 settings. */
328 bool mips16_p;
330 /* True if the structure has been initialized. */
331 bool initialized_p;
333 /* True if "MULT $0, $0" is preferable to "MTLO $0; MTHI $0"
334 when optimizing for speed. */
335 bool fast_mult_zero_zero_p;
336 } mips_tuning_info;
338 /* Information about a function's frame layout. */
339 struct GTY(()) mips_frame_info {
340 /* The size of the frame in bytes. */
341 HOST_WIDE_INT total_size;
343 /* The number of bytes allocated to variables. */
344 HOST_WIDE_INT var_size;
346 /* The number of bytes allocated to outgoing function arguments. */
347 HOST_WIDE_INT args_size;
349 /* The number of bytes allocated to the .cprestore slot, or 0 if there
350 is no such slot. */
351 HOST_WIDE_INT cprestore_size;
353 /* Bit X is set if the function saves or restores GPR X. */
354 unsigned int mask;
356 /* Likewise FPR X. */
357 unsigned int fmask;
359 /* Likewise doubleword accumulator X ($acX). */
360 unsigned int acc_mask;
362 /* The number of GPRs, FPRs, doubleword accumulators and COP0
363 registers saved. */
364 unsigned int num_gp;
365 unsigned int num_fp;
366 unsigned int num_acc;
367 unsigned int num_cop0_regs;
369 /* The offset of the topmost GPR, FPR, accumulator and COP0-register
370 save slots from the top of the frame, or zero if no such slots are
371 needed. */
372 HOST_WIDE_INT gp_save_offset;
373 HOST_WIDE_INT fp_save_offset;
374 HOST_WIDE_INT acc_save_offset;
375 HOST_WIDE_INT cop0_save_offset;
377 /* Likewise, but giving offsets from the bottom of the frame. */
378 HOST_WIDE_INT gp_sp_offset;
379 HOST_WIDE_INT fp_sp_offset;
380 HOST_WIDE_INT acc_sp_offset;
381 HOST_WIDE_INT cop0_sp_offset;
383 /* Similar, but the value passed to _mcount. */
384 HOST_WIDE_INT ra_fp_offset;
386 /* The offset of arg_pointer_rtx from the bottom of the frame. */
387 HOST_WIDE_INT arg_pointer_offset;
389 /* The offset of hard_frame_pointer_rtx from the bottom of the frame. */
390 HOST_WIDE_INT hard_frame_pointer_offset;
393 struct GTY(()) machine_function {
394 /* The next floating-point condition-code register to allocate
395 for ISA_HAS_8CC targets, relative to ST_REG_FIRST. */
396 unsigned int next_fcc;
398 /* The register returned by mips16_gp_pseudo_reg; see there for details. */
399 rtx mips16_gp_pseudo_rtx;
401 /* The number of extra stack bytes taken up by register varargs.
402 This area is allocated by the callee at the very top of the frame. */
403 int varargs_size;
405 /* The current frame information, calculated by mips_compute_frame_info. */
406 struct mips_frame_info frame;
408 /* The register to use as the function's global pointer, or INVALID_REGNUM
409 if the function doesn't need one. */
410 unsigned int global_pointer;
412 /* How many instructions it takes to load a label into $AT, or 0 if
413 this property hasn't yet been calculated. */
414 unsigned int load_label_num_insns;
416 /* True if mips_adjust_insn_length should ignore an instruction's
417 hazard attribute. */
418 bool ignore_hazard_length_p;
420 /* True if the whole function is suitable for .set noreorder and
421 .set nomacro. */
422 bool all_noreorder_p;
424 /* True if the function has "inflexible" and "flexible" references
425 to the global pointer. See mips_cfun_has_inflexible_gp_ref_p
426 and mips_cfun_has_flexible_gp_ref_p for details. */
427 bool has_inflexible_gp_insn_p;
428 bool has_flexible_gp_insn_p;
430 /* True if the function's prologue must load the global pointer
431 value into pic_offset_table_rtx and store the same value in
432 the function's cprestore slot (if any). Even if this value
433 is currently false, we may decide to set it to true later;
434 see mips_must_initialize_gp_p () for details. */
435 bool must_initialize_gp_p;
437 /* True if the current function must restore $gp after any potential
438 clobber. This value is only meaningful during the first post-epilogue
439 split_insns pass; see mips_must_initialize_gp_p () for details. */
440 bool must_restore_gp_when_clobbered_p;
442 /* True if this is an interrupt handler. */
443 bool interrupt_handler_p;
445 /* True if this is an interrupt handler that uses shadow registers. */
446 bool use_shadow_register_set_p;
448 /* True if this is an interrupt handler that should keep interrupts
449 masked. */
450 bool keep_interrupts_masked_p;
452 /* True if this is an interrupt handler that should use DERET
453 instead of ERET. */
454 bool use_debug_exception_return_p;
457 /* Information about a single argument. */
458 struct mips_arg_info {
459 /* True if the argument is passed in a floating-point register, or
460 would have been if we hadn't run out of registers. */
461 bool fpr_p;
463 /* The number of words passed in registers, rounded up. */
464 unsigned int reg_words;
466 /* For EABI, the offset of the first register from GP_ARG_FIRST or
467 FP_ARG_FIRST. For other ABIs, the offset of the first register from
468 the start of the ABI's argument structure (see the CUMULATIVE_ARGS
469 comment for details).
471 The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
472 on the stack. */
473 unsigned int reg_offset;
475 /* The number of words that must be passed on the stack, rounded up. */
476 unsigned int stack_words;
478 /* The offset from the start of the stack overflow area of the argument's
479 first stack word. Only meaningful when STACK_WORDS is nonzero. */
480 unsigned int stack_offset;
483 /* Information about an address described by mips_address_type.
485 ADDRESS_CONST_INT
486 No fields are used.
488 ADDRESS_REG
489 REG is the base register and OFFSET is the constant offset.
491 ADDRESS_LO_SUM
492 REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
493 is the type of symbol it references.
495 ADDRESS_SYMBOLIC
496 SYMBOL_TYPE is the type of symbol that the address references. */
497 struct mips_address_info {
498 enum mips_address_type type;
499 rtx reg;
500 rtx offset;
501 enum mips_symbol_type symbol_type;
504 /* One stage in a constant building sequence. These sequences have
505 the form:
507 A = VALUE[0]
508 A = A CODE[1] VALUE[1]
509 A = A CODE[2] VALUE[2]
512 where A is an accumulator, each CODE[i] is a binary rtl operation
513 and each VALUE[i] is a constant integer. CODE[0] is undefined. */
514 struct mips_integer_op {
515 enum rtx_code code;
516 unsigned HOST_WIDE_INT value;
519 /* The largest number of operations needed to load an integer constant.
520 The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
521 When the lowest bit is clear, we can try, but reject a sequence with
522 an extra SLL at the end. */
523 #define MIPS_MAX_INTEGER_OPS 7
525 /* Information about a MIPS16e SAVE or RESTORE instruction. */
526 struct mips16e_save_restore_info {
527 /* The number of argument registers saved by a SAVE instruction.
528 0 for RESTORE instructions. */
529 unsigned int nargs;
531 /* Bit X is set if the instruction saves or restores GPR X. */
532 unsigned int mask;
534 /* The total number of bytes to allocate. */
535 HOST_WIDE_INT size;
538 /* Costs of various operations on the different architectures. */
540 struct mips_rtx_cost_data
542 unsigned short fp_add;
543 unsigned short fp_mult_sf;
544 unsigned short fp_mult_df;
545 unsigned short fp_div_sf;
546 unsigned short fp_div_df;
547 unsigned short int_mult_si;
548 unsigned short int_mult_di;
549 unsigned short int_div_si;
550 unsigned short int_div_di;
551 unsigned short branch_cost;
552 unsigned short memory_latency;
555 /* Global variables for machine-dependent things. */
557 /* The -G setting, or the configuration's default small-data limit if
558 no -G option is given. */
559 static unsigned int mips_small_data_threshold;
561 /* The number of file directives written by mips_output_filename. */
562 int num_source_filenames;
564 /* The name that appeared in the last .file directive written by
565 mips_output_filename, or "" if mips_output_filename hasn't
566 written anything yet. */
567 const char *current_function_file = "";
569 /* Arrays that map GCC register numbers to debugger register numbers. */
570 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
571 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
573 /* Information about the current function's epilogue, used only while
574 expanding it. */
575 static struct {
576 /* A list of queued REG_CFA_RESTORE notes. */
577 rtx cfa_restores;
579 /* The CFA is currently defined as CFA_REG + CFA_OFFSET. */
580 rtx cfa_reg;
581 HOST_WIDE_INT cfa_offset;
583 /* The offset of the CFA from the stack pointer while restoring
584 registers. */
585 HOST_WIDE_INT cfa_restore_sp_offset;
586 } mips_epilogue;
588 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs. */
589 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
590 struct mips_asm_switch mips_nomacro = { "macro", 0 };
591 struct mips_asm_switch mips_noat = { "at", 0 };
593 /* True if we're writing out a branch-likely instruction rather than a
594 normal branch. */
595 static bool mips_branch_likely;
597 /* The current instruction-set architecture. */
598 enum processor mips_arch;
599 const struct mips_cpu_info *mips_arch_info;
601 /* The processor that we should tune the code for. */
602 enum processor mips_tune;
603 const struct mips_cpu_info *mips_tune_info;
605 /* The ISA level associated with mips_arch. */
606 int mips_isa;
608 /* The ISA revision level. This is 0 for MIPS I to V and N for
609 MIPS{32,64}rN. */
610 int mips_isa_rev;
612 /* The architecture selected by -mipsN, or null if -mipsN wasn't used. */
613 static const struct mips_cpu_info *mips_isa_option_info;
615 /* Which cost information to use. */
616 static const struct mips_rtx_cost_data *mips_cost;
618 /* The ambient target flags, excluding MASK_MIPS16. */
619 static int mips_base_target_flags;
621 /* The default compression mode. */
622 unsigned int mips_base_compression_flags;
624 /* The ambient values of other global variables. */
625 static int mips_base_schedule_insns; /* flag_schedule_insns */
626 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
627 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
628 static int mips_base_align_loops; /* align_loops */
629 static int mips_base_align_jumps; /* align_jumps */
630 static int mips_base_align_functions; /* align_functions */
632 /* Index [M][R] is true if register R is allowed to hold a value of mode M. */
633 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
635 /* Index C is true if character C is a valid PRINT_OPERAND punctation
636 character. */
637 static bool mips_print_operand_punct[256];
639 static GTY (()) int mips_output_filename_first_time = 1;
641 /* mips_split_p[X] is true if symbols of type X can be split by
642 mips_split_symbol. */
643 bool mips_split_p[NUM_SYMBOL_TYPES];
645 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
646 can be split by mips_split_symbol. */
647 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
649 /* mips_use_pcrel_pool_p[X] is true if symbols of type X should be
650 forced into a PC-relative constant pool. */
651 bool mips_use_pcrel_pool_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 const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
658 /* Likewise for HIGHs. */
659 const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
661 /* Target state for MIPS16. */
662 struct target_globals *mips16_globals;
664 /* Cached value of can_issue_more. This is cached in mips_variable_issue hook
665 and returned from mips_sched_reorder2. */
666 static int cached_can_issue_more;
668 /* The stubs for various MIPS16 support functions, if used. */
669 static mips_one_only_stub *mips16_rdhwr_stub;
670 static mips_one_only_stub *mips16_get_fcsr_stub;
671 static mips_one_only_stub *mips16_set_fcsr_stub;
673 /* Index R is the smallest register class that contains register R. */
674 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
675 LEA_REGS, LEA_REGS, M16_STORE_REGS, V1_REG,
676 M16_STORE_REGS, M16_STORE_REGS, M16_STORE_REGS, M16_STORE_REGS,
677 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
678 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
679 M16_REGS, M16_STORE_REGS, LEA_REGS, LEA_REGS,
680 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
681 T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS,
682 LEA_REGS, M16_SP_REGS, LEA_REGS, LEA_REGS,
684 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
685 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
686 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
687 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
688 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
689 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
690 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
691 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
692 MD0_REG, MD1_REG, NO_REGS, ST_REGS,
693 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
694 ST_REGS, ST_REGS, ST_REGS, NO_REGS,
695 NO_REGS, FRAME_REGS, FRAME_REGS, NO_REGS,
696 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
697 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
698 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
699 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
700 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
701 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
702 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
703 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
704 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
705 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
706 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
707 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
708 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
709 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
710 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
711 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
712 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
713 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
714 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
715 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
716 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
717 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
718 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
719 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
720 DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS,
721 DSP_ACC_REGS, DSP_ACC_REGS, ALL_REGS, ALL_REGS,
722 ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS
725 /* The value of TARGET_ATTRIBUTE_TABLE. */
726 static const struct attribute_spec mips_attribute_table[] = {
727 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, decl_handler,
728 type_handler, om_diagnostic } */
729 { "long_call", 0, 0, false, true, true, NULL, NULL, false },
730 { "far", 0, 0, false, true, true, NULL, NULL, false },
731 { "near", 0, 0, false, true, true, NULL, NULL, false },
732 /* We would really like to treat "mips16" and "nomips16" as type
733 attributes, but GCC doesn't provide the hooks we need to support
734 the right conversion rules. As declaration attributes, they affect
735 code generation but don't carry other semantics. */
736 { "mips16", 0, 0, true, false, false, NULL, NULL, false },
737 { "nomips16", 0, 0, true, false, false, NULL, NULL, false },
738 { "micromips", 0, 0, true, false, false, NULL, NULL, false },
739 { "nomicromips", 0, 0, true, false, false, NULL, NULL, false },
740 { "nocompression", 0, 0, true, false, false, NULL, NULL, false },
741 /* Allow functions to be specified as interrupt handlers */
742 { "interrupt", 0, 0, false, true, true, NULL, NULL, false },
743 { "use_shadow_register_set", 0, 0, false, true, true, NULL, NULL, false },
744 { "keep_interrupts_masked", 0, 0, false, true, true, NULL, NULL, false },
745 { "use_debug_exception_return", 0, 0, false, true, true, NULL, NULL, false },
746 { NULL, 0, 0, false, false, false, NULL, NULL, false }
749 /* A table describing all the processors GCC knows about; see
750 mips-cpus.def for details. */
751 static const struct mips_cpu_info mips_cpu_info_table[] = {
752 #define MIPS_CPU(NAME, CPU, ISA, FLAGS) \
753 { NAME, CPU, ISA, FLAGS },
754 #include "mips-cpus.def"
755 #undef MIPS_CPU
758 /* Default costs. If these are used for a processor we should look
759 up the actual costs. */
760 #define DEFAULT_COSTS COSTS_N_INSNS (6), /* fp_add */ \
761 COSTS_N_INSNS (7), /* fp_mult_sf */ \
762 COSTS_N_INSNS (8), /* fp_mult_df */ \
763 COSTS_N_INSNS (23), /* fp_div_sf */ \
764 COSTS_N_INSNS (36), /* fp_div_df */ \
765 COSTS_N_INSNS (10), /* int_mult_si */ \
766 COSTS_N_INSNS (10), /* int_mult_di */ \
767 COSTS_N_INSNS (69), /* int_div_si */ \
768 COSTS_N_INSNS (69), /* int_div_di */ \
769 2, /* branch_cost */ \
770 4 /* memory_latency */
772 /* Floating-point costs for processors without an FPU. Just assume that
773 all floating-point libcalls are very expensive. */
774 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */ \
775 COSTS_N_INSNS (256), /* fp_mult_sf */ \
776 COSTS_N_INSNS (256), /* fp_mult_df */ \
777 COSTS_N_INSNS (256), /* fp_div_sf */ \
778 COSTS_N_INSNS (256) /* fp_div_df */
780 /* Costs to use when optimizing for size. */
781 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
782 COSTS_N_INSNS (1), /* fp_add */
783 COSTS_N_INSNS (1), /* fp_mult_sf */
784 COSTS_N_INSNS (1), /* fp_mult_df */
785 COSTS_N_INSNS (1), /* fp_div_sf */
786 COSTS_N_INSNS (1), /* fp_div_df */
787 COSTS_N_INSNS (1), /* int_mult_si */
788 COSTS_N_INSNS (1), /* int_mult_di */
789 COSTS_N_INSNS (1), /* int_div_si */
790 COSTS_N_INSNS (1), /* int_div_di */
791 2, /* branch_cost */
792 4 /* memory_latency */
795 /* Costs to use when optimizing for speed, indexed by processor. */
796 static const struct mips_rtx_cost_data
797 mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
798 { /* R3000 */
799 COSTS_N_INSNS (2), /* fp_add */
800 COSTS_N_INSNS (4), /* fp_mult_sf */
801 COSTS_N_INSNS (5), /* fp_mult_df */
802 COSTS_N_INSNS (12), /* fp_div_sf */
803 COSTS_N_INSNS (19), /* fp_div_df */
804 COSTS_N_INSNS (12), /* int_mult_si */
805 COSTS_N_INSNS (12), /* int_mult_di */
806 COSTS_N_INSNS (35), /* int_div_si */
807 COSTS_N_INSNS (35), /* int_div_di */
808 1, /* branch_cost */
809 4 /* memory_latency */
811 { /* 4KC */
812 SOFT_FP_COSTS,
813 COSTS_N_INSNS (6), /* int_mult_si */
814 COSTS_N_INSNS (6), /* int_mult_di */
815 COSTS_N_INSNS (36), /* int_div_si */
816 COSTS_N_INSNS (36), /* int_div_di */
817 1, /* branch_cost */
818 4 /* memory_latency */
820 { /* 4KP */
821 SOFT_FP_COSTS,
822 COSTS_N_INSNS (36), /* int_mult_si */
823 COSTS_N_INSNS (36), /* int_mult_di */
824 COSTS_N_INSNS (37), /* int_div_si */
825 COSTS_N_INSNS (37), /* int_div_di */
826 1, /* branch_cost */
827 4 /* memory_latency */
829 { /* 5KC */
830 SOFT_FP_COSTS,
831 COSTS_N_INSNS (4), /* int_mult_si */
832 COSTS_N_INSNS (11), /* int_mult_di */
833 COSTS_N_INSNS (36), /* int_div_si */
834 COSTS_N_INSNS (68), /* int_div_di */
835 1, /* branch_cost */
836 4 /* memory_latency */
838 { /* 5KF */
839 COSTS_N_INSNS (4), /* fp_add */
840 COSTS_N_INSNS (4), /* fp_mult_sf */
841 COSTS_N_INSNS (5), /* fp_mult_df */
842 COSTS_N_INSNS (17), /* fp_div_sf */
843 COSTS_N_INSNS (32), /* fp_div_df */
844 COSTS_N_INSNS (4), /* int_mult_si */
845 COSTS_N_INSNS (11), /* int_mult_di */
846 COSTS_N_INSNS (36), /* int_div_si */
847 COSTS_N_INSNS (68), /* int_div_di */
848 1, /* branch_cost */
849 4 /* memory_latency */
851 { /* 20KC */
852 COSTS_N_INSNS (4), /* fp_add */
853 COSTS_N_INSNS (4), /* fp_mult_sf */
854 COSTS_N_INSNS (5), /* fp_mult_df */
855 COSTS_N_INSNS (17), /* fp_div_sf */
856 COSTS_N_INSNS (32), /* fp_div_df */
857 COSTS_N_INSNS (4), /* int_mult_si */
858 COSTS_N_INSNS (7), /* int_mult_di */
859 COSTS_N_INSNS (42), /* int_div_si */
860 COSTS_N_INSNS (72), /* int_div_di */
861 1, /* branch_cost */
862 4 /* memory_latency */
864 { /* 24KC */
865 SOFT_FP_COSTS,
866 COSTS_N_INSNS (5), /* int_mult_si */
867 COSTS_N_INSNS (5), /* int_mult_di */
868 COSTS_N_INSNS (41), /* int_div_si */
869 COSTS_N_INSNS (41), /* int_div_di */
870 1, /* branch_cost */
871 4 /* memory_latency */
873 { /* 24KF2_1 */
874 COSTS_N_INSNS (8), /* fp_add */
875 COSTS_N_INSNS (8), /* fp_mult_sf */
876 COSTS_N_INSNS (10), /* fp_mult_df */
877 COSTS_N_INSNS (34), /* fp_div_sf */
878 COSTS_N_INSNS (64), /* fp_div_df */
879 COSTS_N_INSNS (5), /* int_mult_si */
880 COSTS_N_INSNS (5), /* int_mult_di */
881 COSTS_N_INSNS (41), /* int_div_si */
882 COSTS_N_INSNS (41), /* int_div_di */
883 1, /* branch_cost */
884 4 /* memory_latency */
886 { /* 24KF1_1 */
887 COSTS_N_INSNS (4), /* fp_add */
888 COSTS_N_INSNS (4), /* fp_mult_sf */
889 COSTS_N_INSNS (5), /* fp_mult_df */
890 COSTS_N_INSNS (17), /* fp_div_sf */
891 COSTS_N_INSNS (32), /* fp_div_df */
892 COSTS_N_INSNS (5), /* int_mult_si */
893 COSTS_N_INSNS (5), /* int_mult_di */
894 COSTS_N_INSNS (41), /* int_div_si */
895 COSTS_N_INSNS (41), /* int_div_di */
896 1, /* branch_cost */
897 4 /* memory_latency */
899 { /* 74KC */
900 SOFT_FP_COSTS,
901 COSTS_N_INSNS (5), /* int_mult_si */
902 COSTS_N_INSNS (5), /* int_mult_di */
903 COSTS_N_INSNS (41), /* int_div_si */
904 COSTS_N_INSNS (41), /* int_div_di */
905 1, /* branch_cost */
906 4 /* memory_latency */
908 { /* 74KF2_1 */
909 COSTS_N_INSNS (8), /* fp_add */
910 COSTS_N_INSNS (8), /* fp_mult_sf */
911 COSTS_N_INSNS (10), /* fp_mult_df */
912 COSTS_N_INSNS (34), /* fp_div_sf */
913 COSTS_N_INSNS (64), /* fp_div_df */
914 COSTS_N_INSNS (5), /* int_mult_si */
915 COSTS_N_INSNS (5), /* int_mult_di */
916 COSTS_N_INSNS (41), /* int_div_si */
917 COSTS_N_INSNS (41), /* int_div_di */
918 1, /* branch_cost */
919 4 /* memory_latency */
921 { /* 74KF1_1 */
922 COSTS_N_INSNS (4), /* fp_add */
923 COSTS_N_INSNS (4), /* fp_mult_sf */
924 COSTS_N_INSNS (5), /* fp_mult_df */
925 COSTS_N_INSNS (17), /* fp_div_sf */
926 COSTS_N_INSNS (32), /* fp_div_df */
927 COSTS_N_INSNS (5), /* int_mult_si */
928 COSTS_N_INSNS (5), /* int_mult_di */
929 COSTS_N_INSNS (41), /* int_div_si */
930 COSTS_N_INSNS (41), /* int_div_di */
931 1, /* branch_cost */
932 4 /* memory_latency */
934 { /* 74KF3_2 */
935 COSTS_N_INSNS (6), /* fp_add */
936 COSTS_N_INSNS (6), /* fp_mult_sf */
937 COSTS_N_INSNS (7), /* fp_mult_df */
938 COSTS_N_INSNS (25), /* fp_div_sf */
939 COSTS_N_INSNS (48), /* fp_div_df */
940 COSTS_N_INSNS (5), /* int_mult_si */
941 COSTS_N_INSNS (5), /* int_mult_di */
942 COSTS_N_INSNS (41), /* int_div_si */
943 COSTS_N_INSNS (41), /* int_div_di */
944 1, /* branch_cost */
945 4 /* memory_latency */
947 { /* Loongson-2E */
948 DEFAULT_COSTS
950 { /* Loongson-2F */
951 DEFAULT_COSTS
953 { /* Loongson-3A */
954 DEFAULT_COSTS
956 { /* M4k */
957 DEFAULT_COSTS
959 /* Octeon */
961 SOFT_FP_COSTS,
962 COSTS_N_INSNS (5), /* int_mult_si */
963 COSTS_N_INSNS (5), /* int_mult_di */
964 COSTS_N_INSNS (72), /* int_div_si */
965 COSTS_N_INSNS (72), /* int_div_di */
966 1, /* branch_cost */
967 4 /* memory_latency */
969 /* Octeon II */
971 SOFT_FP_COSTS,
972 COSTS_N_INSNS (6), /* int_mult_si */
973 COSTS_N_INSNS (6), /* int_mult_di */
974 COSTS_N_INSNS (18), /* int_div_si */
975 COSTS_N_INSNS (35), /* int_div_di */
976 4, /* branch_cost */
977 4 /* memory_latency */
979 /* Octeon III */
981 COSTS_N_INSNS (6), /* fp_add */
982 COSTS_N_INSNS (6), /* fp_mult_sf */
983 COSTS_N_INSNS (7), /* fp_mult_df */
984 COSTS_N_INSNS (25), /* fp_div_sf */
985 COSTS_N_INSNS (48), /* fp_div_df */
986 COSTS_N_INSNS (6), /* int_mult_si */
987 COSTS_N_INSNS (6), /* int_mult_di */
988 COSTS_N_INSNS (18), /* int_div_si */
989 COSTS_N_INSNS (35), /* int_div_di */
990 4, /* branch_cost */
991 4 /* memory_latency */
993 { /* R3900 */
994 COSTS_N_INSNS (2), /* fp_add */
995 COSTS_N_INSNS (4), /* fp_mult_sf */
996 COSTS_N_INSNS (5), /* fp_mult_df */
997 COSTS_N_INSNS (12), /* fp_div_sf */
998 COSTS_N_INSNS (19), /* fp_div_df */
999 COSTS_N_INSNS (2), /* int_mult_si */
1000 COSTS_N_INSNS (2), /* int_mult_di */
1001 COSTS_N_INSNS (35), /* int_div_si */
1002 COSTS_N_INSNS (35), /* int_div_di */
1003 1, /* branch_cost */
1004 4 /* memory_latency */
1006 { /* R6000 */
1007 COSTS_N_INSNS (3), /* fp_add */
1008 COSTS_N_INSNS (5), /* fp_mult_sf */
1009 COSTS_N_INSNS (6), /* fp_mult_df */
1010 COSTS_N_INSNS (15), /* fp_div_sf */
1011 COSTS_N_INSNS (16), /* fp_div_df */
1012 COSTS_N_INSNS (17), /* int_mult_si */
1013 COSTS_N_INSNS (17), /* int_mult_di */
1014 COSTS_N_INSNS (38), /* int_div_si */
1015 COSTS_N_INSNS (38), /* int_div_di */
1016 2, /* branch_cost */
1017 6 /* memory_latency */
1019 { /* R4000 */
1020 COSTS_N_INSNS (6), /* fp_add */
1021 COSTS_N_INSNS (7), /* fp_mult_sf */
1022 COSTS_N_INSNS (8), /* fp_mult_df */
1023 COSTS_N_INSNS (23), /* fp_div_sf */
1024 COSTS_N_INSNS (36), /* fp_div_df */
1025 COSTS_N_INSNS (10), /* int_mult_si */
1026 COSTS_N_INSNS (10), /* int_mult_di */
1027 COSTS_N_INSNS (69), /* int_div_si */
1028 COSTS_N_INSNS (69), /* int_div_di */
1029 2, /* branch_cost */
1030 6 /* memory_latency */
1032 { /* R4100 */
1033 DEFAULT_COSTS
1035 { /* R4111 */
1036 DEFAULT_COSTS
1038 { /* R4120 */
1039 DEFAULT_COSTS
1041 { /* R4130 */
1042 /* The only costs that appear to be updated here are
1043 integer multiplication. */
1044 SOFT_FP_COSTS,
1045 COSTS_N_INSNS (4), /* int_mult_si */
1046 COSTS_N_INSNS (6), /* int_mult_di */
1047 COSTS_N_INSNS (69), /* int_div_si */
1048 COSTS_N_INSNS (69), /* int_div_di */
1049 1, /* branch_cost */
1050 4 /* memory_latency */
1052 { /* R4300 */
1053 DEFAULT_COSTS
1055 { /* R4600 */
1056 DEFAULT_COSTS
1058 { /* R4650 */
1059 DEFAULT_COSTS
1061 { /* R4700 */
1062 DEFAULT_COSTS
1064 { /* R5000 */
1065 COSTS_N_INSNS (6), /* fp_add */
1066 COSTS_N_INSNS (4), /* fp_mult_sf */
1067 COSTS_N_INSNS (5), /* fp_mult_df */
1068 COSTS_N_INSNS (23), /* fp_div_sf */
1069 COSTS_N_INSNS (36), /* fp_div_df */
1070 COSTS_N_INSNS (5), /* int_mult_si */
1071 COSTS_N_INSNS (5), /* int_mult_di */
1072 COSTS_N_INSNS (36), /* int_div_si */
1073 COSTS_N_INSNS (36), /* int_div_di */
1074 1, /* branch_cost */
1075 4 /* memory_latency */
1077 { /* R5400 */
1078 COSTS_N_INSNS (6), /* fp_add */
1079 COSTS_N_INSNS (5), /* fp_mult_sf */
1080 COSTS_N_INSNS (6), /* fp_mult_df */
1081 COSTS_N_INSNS (30), /* fp_div_sf */
1082 COSTS_N_INSNS (59), /* fp_div_df */
1083 COSTS_N_INSNS (3), /* int_mult_si */
1084 COSTS_N_INSNS (4), /* int_mult_di */
1085 COSTS_N_INSNS (42), /* int_div_si */
1086 COSTS_N_INSNS (74), /* int_div_di */
1087 1, /* branch_cost */
1088 4 /* memory_latency */
1090 { /* R5500 */
1091 COSTS_N_INSNS (6), /* fp_add */
1092 COSTS_N_INSNS (5), /* fp_mult_sf */
1093 COSTS_N_INSNS (6), /* fp_mult_df */
1094 COSTS_N_INSNS (30), /* fp_div_sf */
1095 COSTS_N_INSNS (59), /* fp_div_df */
1096 COSTS_N_INSNS (5), /* int_mult_si */
1097 COSTS_N_INSNS (9), /* int_mult_di */
1098 COSTS_N_INSNS (42), /* int_div_si */
1099 COSTS_N_INSNS (74), /* int_div_di */
1100 1, /* branch_cost */
1101 4 /* memory_latency */
1103 { /* R5900 */
1104 COSTS_N_INSNS (4), /* fp_add */
1105 COSTS_N_INSNS (4), /* fp_mult_sf */
1106 COSTS_N_INSNS (256), /* fp_mult_df */
1107 COSTS_N_INSNS (8), /* fp_div_sf */
1108 COSTS_N_INSNS (256), /* fp_div_df */
1109 COSTS_N_INSNS (4), /* int_mult_si */
1110 COSTS_N_INSNS (256), /* int_mult_di */
1111 COSTS_N_INSNS (37), /* int_div_si */
1112 COSTS_N_INSNS (256), /* int_div_di */
1113 1, /* branch_cost */
1114 4 /* memory_latency */
1116 { /* R7000 */
1117 /* The only costs that are changed here are
1118 integer multiplication. */
1119 COSTS_N_INSNS (6), /* fp_add */
1120 COSTS_N_INSNS (7), /* fp_mult_sf */
1121 COSTS_N_INSNS (8), /* fp_mult_df */
1122 COSTS_N_INSNS (23), /* fp_div_sf */
1123 COSTS_N_INSNS (36), /* fp_div_df */
1124 COSTS_N_INSNS (5), /* int_mult_si */
1125 COSTS_N_INSNS (9), /* int_mult_di */
1126 COSTS_N_INSNS (69), /* int_div_si */
1127 COSTS_N_INSNS (69), /* int_div_di */
1128 1, /* branch_cost */
1129 4 /* memory_latency */
1131 { /* R8000 */
1132 DEFAULT_COSTS
1134 { /* R9000 */
1135 /* The only costs that are changed here are
1136 integer multiplication. */
1137 COSTS_N_INSNS (6), /* fp_add */
1138 COSTS_N_INSNS (7), /* fp_mult_sf */
1139 COSTS_N_INSNS (8), /* fp_mult_df */
1140 COSTS_N_INSNS (23), /* fp_div_sf */
1141 COSTS_N_INSNS (36), /* fp_div_df */
1142 COSTS_N_INSNS (3), /* int_mult_si */
1143 COSTS_N_INSNS (8), /* int_mult_di */
1144 COSTS_N_INSNS (69), /* int_div_si */
1145 COSTS_N_INSNS (69), /* int_div_di */
1146 1, /* branch_cost */
1147 4 /* memory_latency */
1149 { /* R1x000 */
1150 COSTS_N_INSNS (2), /* fp_add */
1151 COSTS_N_INSNS (2), /* fp_mult_sf */
1152 COSTS_N_INSNS (2), /* fp_mult_df */
1153 COSTS_N_INSNS (12), /* fp_div_sf */
1154 COSTS_N_INSNS (19), /* fp_div_df */
1155 COSTS_N_INSNS (5), /* int_mult_si */
1156 COSTS_N_INSNS (9), /* int_mult_di */
1157 COSTS_N_INSNS (34), /* int_div_si */
1158 COSTS_N_INSNS (66), /* int_div_di */
1159 1, /* branch_cost */
1160 4 /* memory_latency */
1162 { /* SB1 */
1163 /* These costs are the same as the SB-1A below. */
1164 COSTS_N_INSNS (4), /* fp_add */
1165 COSTS_N_INSNS (4), /* fp_mult_sf */
1166 COSTS_N_INSNS (4), /* fp_mult_df */
1167 COSTS_N_INSNS (24), /* fp_div_sf */
1168 COSTS_N_INSNS (32), /* fp_div_df */
1169 COSTS_N_INSNS (3), /* int_mult_si */
1170 COSTS_N_INSNS (4), /* int_mult_di */
1171 COSTS_N_INSNS (36), /* int_div_si */
1172 COSTS_N_INSNS (68), /* int_div_di */
1173 1, /* branch_cost */
1174 4 /* memory_latency */
1176 { /* SB1-A */
1177 /* These costs are the same as the SB-1 above. */
1178 COSTS_N_INSNS (4), /* fp_add */
1179 COSTS_N_INSNS (4), /* fp_mult_sf */
1180 COSTS_N_INSNS (4), /* fp_mult_df */
1181 COSTS_N_INSNS (24), /* fp_div_sf */
1182 COSTS_N_INSNS (32), /* fp_div_df */
1183 COSTS_N_INSNS (3), /* int_mult_si */
1184 COSTS_N_INSNS (4), /* int_mult_di */
1185 COSTS_N_INSNS (36), /* int_div_si */
1186 COSTS_N_INSNS (68), /* int_div_di */
1187 1, /* branch_cost */
1188 4 /* memory_latency */
1190 { /* SR71000 */
1191 DEFAULT_COSTS
1193 { /* XLR */
1194 SOFT_FP_COSTS,
1195 COSTS_N_INSNS (8), /* int_mult_si */
1196 COSTS_N_INSNS (8), /* int_mult_di */
1197 COSTS_N_INSNS (72), /* int_div_si */
1198 COSTS_N_INSNS (72), /* int_div_di */
1199 1, /* branch_cost */
1200 4 /* memory_latency */
1202 { /* XLP */
1203 /* These costs are the same as 5KF above. */
1204 COSTS_N_INSNS (4), /* fp_add */
1205 COSTS_N_INSNS (4), /* fp_mult_sf */
1206 COSTS_N_INSNS (5), /* fp_mult_df */
1207 COSTS_N_INSNS (17), /* fp_div_sf */
1208 COSTS_N_INSNS (32), /* fp_div_df */
1209 COSTS_N_INSNS (4), /* int_mult_si */
1210 COSTS_N_INSNS (11), /* int_mult_di */
1211 COSTS_N_INSNS (36), /* int_div_si */
1212 COSTS_N_INSNS (68), /* int_div_di */
1213 1, /* branch_cost */
1214 4 /* memory_latency */
1216 { /* P5600 */
1217 COSTS_N_INSNS (4), /* fp_add */
1218 COSTS_N_INSNS (5), /* fp_mult_sf */
1219 COSTS_N_INSNS (5), /* fp_mult_df */
1220 COSTS_N_INSNS (17), /* fp_div_sf */
1221 COSTS_N_INSNS (17), /* fp_div_df */
1222 COSTS_N_INSNS (5), /* int_mult_si */
1223 COSTS_N_INSNS (5), /* int_mult_di */
1224 COSTS_N_INSNS (8), /* int_div_si */
1225 COSTS_N_INSNS (8), /* int_div_di */
1226 2, /* branch_cost */
1227 4 /* memory_latency */
1231 static rtx mips_find_pic_call_symbol (rtx_insn *, rtx, bool);
1232 static int mips_register_move_cost (machine_mode, reg_class_t,
1233 reg_class_t);
1234 static unsigned int mips_function_arg_boundary (machine_mode, const_tree);
1235 static machine_mode mips_get_reg_raw_mode (int regno);
1237 struct mips16_flip_traits : default_hashmap_traits
1239 static hashval_t hash (const char *s) { return htab_hash_string (s); }
1240 static bool
1241 equal_keys (const char *a, const char *b)
1243 return !strcmp (a, b);
1247 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1248 for -mflip_mips16. It maps decl names onto a boolean mode setting. */
1249 static GTY (()) hash_map<const char *, bool, mips16_flip_traits> *
1250 mflip_mips16_htab;
1252 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1253 mode, false if it should next add an attribute for the opposite mode. */
1254 static GTY(()) bool mips16_flipper;
1256 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1257 for -mflip-mips16. Return true if it should use "mips16" and false if
1258 it should use "nomips16". */
1260 static bool
1261 mflip_mips16_use_mips16_p (tree decl)
1263 const char *name;
1264 bool base_is_mips16 = (mips_base_compression_flags & MASK_MIPS16) != 0;
1266 /* Use the opposite of the command-line setting for anonymous decls. */
1267 if (!DECL_NAME (decl))
1268 return !base_is_mips16;
1270 if (!mflip_mips16_htab)
1271 mflip_mips16_htab
1272 = hash_map<const char *, bool, mips16_flip_traits>::create_ggc (37);
1274 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1276 bool existed;
1277 bool *slot = &mflip_mips16_htab->get_or_insert (name, &existed);
1278 if (!existed)
1280 mips16_flipper = !mips16_flipper;
1281 *slot = mips16_flipper ? !base_is_mips16 : base_is_mips16;
1283 return *slot;
1286 /* Predicates to test for presence of "near" and "far"/"long_call"
1287 attributes on the given TYPE. */
1289 static bool
1290 mips_near_type_p (const_tree type)
1292 return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1295 static bool
1296 mips_far_type_p (const_tree type)
1298 return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1299 || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1303 /* Check if the interrupt attribute is set for a function. */
1305 static bool
1306 mips_interrupt_type_p (tree type)
1308 return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1311 /* Check if the attribute to use shadow register set is set for a function. */
1313 static bool
1314 mips_use_shadow_register_set_p (tree type)
1316 return lookup_attribute ("use_shadow_register_set",
1317 TYPE_ATTRIBUTES (type)) != NULL;
1320 /* Check if the attribute to keep interrupts masked is set for a function. */
1322 static bool
1323 mips_keep_interrupts_masked_p (tree type)
1325 return lookup_attribute ("keep_interrupts_masked",
1326 TYPE_ATTRIBUTES (type)) != NULL;
1329 /* Check if the attribute to use debug exception return is set for
1330 a function. */
1332 static bool
1333 mips_use_debug_exception_return_p (tree type)
1335 return lookup_attribute ("use_debug_exception_return",
1336 TYPE_ATTRIBUTES (type)) != NULL;
1339 /* Return the set of compression modes that are explicitly required
1340 by the attributes in ATTRIBUTES. */
1342 static unsigned int
1343 mips_get_compress_on_flags (tree attributes)
1345 unsigned int flags = 0;
1347 if (lookup_attribute ("mips16", attributes) != NULL)
1348 flags |= MASK_MIPS16;
1350 if (lookup_attribute ("micromips", attributes) != NULL)
1351 flags |= MASK_MICROMIPS;
1353 return flags;
1356 /* Return the set of compression modes that are explicitly forbidden
1357 by the attributes in ATTRIBUTES. */
1359 static unsigned int
1360 mips_get_compress_off_flags (tree attributes)
1362 unsigned int flags = 0;
1364 if (lookup_attribute ("nocompression", attributes) != NULL)
1365 flags |= MASK_MIPS16 | MASK_MICROMIPS;
1367 if (lookup_attribute ("nomips16", attributes) != NULL)
1368 flags |= MASK_MIPS16;
1370 if (lookup_attribute ("nomicromips", attributes) != NULL)
1371 flags |= MASK_MICROMIPS;
1373 return flags;
1376 /* Return the compression mode that should be used for function DECL.
1377 Return the ambient setting if DECL is null. */
1379 static unsigned int
1380 mips_get_compress_mode (tree decl)
1382 unsigned int flags, force_on;
1384 flags = mips_base_compression_flags;
1385 if (decl)
1387 /* Nested functions must use the same frame pointer as their
1388 parent and must therefore use the same ISA mode. */
1389 tree parent = decl_function_context (decl);
1390 if (parent)
1391 decl = parent;
1392 force_on = mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1393 if (force_on)
1394 return force_on;
1395 flags &= ~mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1397 return flags;
1400 /* Return the attribute name associated with MASK_MIPS16 and MASK_MICROMIPS
1401 flags FLAGS. */
1403 static const char *
1404 mips_get_compress_on_name (unsigned int flags)
1406 if (flags == MASK_MIPS16)
1407 return "mips16";
1408 return "micromips";
1411 /* Return the attribute name that forbids MASK_MIPS16 and MASK_MICROMIPS
1412 flags FLAGS. */
1414 static const char *
1415 mips_get_compress_off_name (unsigned int flags)
1417 if (flags == MASK_MIPS16)
1418 return "nomips16";
1419 if (flags == MASK_MICROMIPS)
1420 return "nomicromips";
1421 return "nocompression";
1424 /* Implement TARGET_COMP_TYPE_ATTRIBUTES. */
1426 static int
1427 mips_comp_type_attributes (const_tree type1, const_tree type2)
1429 /* Disallow mixed near/far attributes. */
1430 if (mips_far_type_p (type1) && mips_near_type_p (type2))
1431 return 0;
1432 if (mips_near_type_p (type1) && mips_far_type_p (type2))
1433 return 0;
1434 return 1;
1437 /* Implement TARGET_INSERT_ATTRIBUTES. */
1439 static void
1440 mips_insert_attributes (tree decl, tree *attributes)
1442 const char *name;
1443 unsigned int compression_flags, nocompression_flags;
1445 /* Check for "mips16" and "nomips16" attributes. */
1446 compression_flags = mips_get_compress_on_flags (*attributes);
1447 nocompression_flags = mips_get_compress_off_flags (*attributes);
1449 if (TREE_CODE (decl) != FUNCTION_DECL)
1451 if (nocompression_flags)
1452 error ("%qs attribute only applies to functions",
1453 mips_get_compress_off_name (nocompression_flags));
1455 if (compression_flags)
1456 error ("%qs attribute only applies to functions",
1457 mips_get_compress_on_name (nocompression_flags));
1459 else
1461 compression_flags |= mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1462 nocompression_flags |=
1463 mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1465 if (compression_flags && nocompression_flags)
1466 error ("%qE cannot have both %qs and %qs attributes",
1467 DECL_NAME (decl), mips_get_compress_on_name (compression_flags),
1468 mips_get_compress_off_name (nocompression_flags));
1470 if (compression_flags & MASK_MIPS16
1471 && compression_flags & MASK_MICROMIPS)
1472 error ("%qE cannot have both %qs and %qs attributes",
1473 DECL_NAME (decl), "mips16", "micromips");
1475 if (TARGET_FLIP_MIPS16
1476 && !DECL_ARTIFICIAL (decl)
1477 && compression_flags == 0
1478 && nocompression_flags == 0)
1480 /* Implement -mflip-mips16. If DECL has neither a "nomips16" nor a
1481 "mips16" attribute, arbitrarily pick one. We must pick the same
1482 setting for duplicate declarations of a function. */
1483 name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1484 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1485 name = "nomicromips";
1486 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1491 /* Implement TARGET_MERGE_DECL_ATTRIBUTES. */
1493 static tree
1494 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1496 unsigned int diff;
1498 diff = (mips_get_compress_on_flags (DECL_ATTRIBUTES (olddecl))
1499 ^ mips_get_compress_on_flags (DECL_ATTRIBUTES (newdecl)));
1500 if (diff)
1501 error ("%qE redeclared with conflicting %qs attributes",
1502 DECL_NAME (newdecl), mips_get_compress_on_name (diff));
1504 diff = (mips_get_compress_off_flags (DECL_ATTRIBUTES (olddecl))
1505 ^ mips_get_compress_off_flags (DECL_ATTRIBUTES (newdecl)));
1506 if (diff)
1507 error ("%qE redeclared with conflicting %qs attributes",
1508 DECL_NAME (newdecl), mips_get_compress_off_name (diff));
1510 return merge_attributes (DECL_ATTRIBUTES (olddecl),
1511 DECL_ATTRIBUTES (newdecl));
1514 /* Implement TARGET_CAN_INLINE_P. */
1516 static bool
1517 mips_can_inline_p (tree caller, tree callee)
1519 if (mips_get_compress_mode (callee) != mips_get_compress_mode (caller))
1520 return false;
1521 return default_target_can_inline_p (caller, callee);
1524 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1525 and *OFFSET_PTR. Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise. */
1527 static void
1528 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1530 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1532 *base_ptr = XEXP (x, 0);
1533 *offset_ptr = INTVAL (XEXP (x, 1));
1535 else
1537 *base_ptr = x;
1538 *offset_ptr = 0;
1542 static unsigned int mips_build_integer (struct mips_integer_op *,
1543 unsigned HOST_WIDE_INT);
1545 /* A subroutine of mips_build_integer, with the same interface.
1546 Assume that the final action in the sequence should be a left shift. */
1548 static unsigned int
1549 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1551 unsigned int i, shift;
1553 /* Shift VALUE right until its lowest bit is set. Shift arithmetically
1554 since signed numbers are easier to load than unsigned ones. */
1555 shift = 0;
1556 while ((value & 1) == 0)
1557 value /= 2, shift++;
1559 i = mips_build_integer (codes, value);
1560 codes[i].code = ASHIFT;
1561 codes[i].value = shift;
1562 return i + 1;
1565 /* As for mips_build_shift, but assume that the final action will be
1566 an IOR or PLUS operation. */
1568 static unsigned int
1569 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1571 unsigned HOST_WIDE_INT high;
1572 unsigned int i;
1574 high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1575 if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1577 /* The constant is too complex to load with a simple LUI/ORI pair,
1578 so we want to give the recursive call as many trailing zeros as
1579 possible. In this case, we know bit 16 is set and that the
1580 low 16 bits form a negative number. If we subtract that number
1581 from VALUE, we will clear at least the lowest 17 bits, maybe more. */
1582 i = mips_build_integer (codes, CONST_HIGH_PART (value));
1583 codes[i].code = PLUS;
1584 codes[i].value = CONST_LOW_PART (value);
1586 else
1588 /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1589 bits gives a value with at least 17 trailing zeros. */
1590 i = mips_build_integer (codes, high);
1591 codes[i].code = IOR;
1592 codes[i].value = value & 0xffff;
1594 return i + 1;
1597 /* Fill CODES with a sequence of rtl operations to load VALUE.
1598 Return the number of operations needed. */
1600 static unsigned int
1601 mips_build_integer (struct mips_integer_op *codes,
1602 unsigned HOST_WIDE_INT value)
1604 if (SMALL_OPERAND (value)
1605 || SMALL_OPERAND_UNSIGNED (value)
1606 || LUI_OPERAND (value))
1608 /* The value can be loaded with a single instruction. */
1609 codes[0].code = UNKNOWN;
1610 codes[0].value = value;
1611 return 1;
1613 else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1615 /* Either the constant is a simple LUI/ORI combination or its
1616 lowest bit is set. We don't want to shift in this case. */
1617 return mips_build_lower (codes, value);
1619 else if ((value & 0xffff) == 0)
1621 /* The constant will need at least three actions. The lowest
1622 16 bits are clear, so the final action will be a shift. */
1623 return mips_build_shift (codes, value);
1625 else
1627 /* The final action could be a shift, add or inclusive OR.
1628 Rather than use a complex condition to select the best
1629 approach, try both mips_build_shift and mips_build_lower
1630 and pick the one that gives the shortest sequence.
1631 Note that this case is only used once per constant. */
1632 struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1633 unsigned int cost, alt_cost;
1635 cost = mips_build_shift (codes, value);
1636 alt_cost = mips_build_lower (alt_codes, value);
1637 if (alt_cost < cost)
1639 memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1640 cost = alt_cost;
1642 return cost;
1646 /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
1648 static bool
1649 mips_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1651 return mips_const_insns (x) > 0;
1654 /* Return a SYMBOL_REF for a MIPS16 function called NAME. */
1656 static rtx
1657 mips16_stub_function (const char *name)
1659 rtx x;
1661 x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
1662 SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
1663 return x;
1666 /* Return a legitimate call address for STUB, given that STUB is a MIPS16
1667 support function. */
1669 static rtx
1670 mips16_stub_call_address (mips_one_only_stub *stub)
1672 rtx fn = mips16_stub_function (stub->get_name ());
1673 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_LOCAL;
1674 if (!call_insn_operand (fn, VOIDmode))
1675 fn = force_reg (Pmode, fn);
1676 return fn;
1679 /* A stub for moving the thread pointer into TLS_GET_TP_REGNUM. */
1681 class mips16_rdhwr_one_only_stub : public mips_one_only_stub
1683 virtual const char *get_name ();
1684 virtual void output_body ();
1687 const char *
1688 mips16_rdhwr_one_only_stub::get_name ()
1690 return "__mips16_rdhwr";
1693 void
1694 mips16_rdhwr_one_only_stub::output_body ()
1696 fprintf (asm_out_file,
1697 "\t.set\tpush\n"
1698 "\t.set\tmips32r2\n"
1699 "\t.set\tnoreorder\n"
1700 "\trdhwr\t$3,$29\n"
1701 "\t.set\tpop\n"
1702 "\tj\t$31\n");
1705 /* A stub for moving the FCSR into GET_FCSR_REGNUM. */
1706 class mips16_get_fcsr_one_only_stub : public mips_one_only_stub
1708 virtual const char *get_name ();
1709 virtual void output_body ();
1712 const char *
1713 mips16_get_fcsr_one_only_stub::get_name ()
1715 return "__mips16_get_fcsr";
1718 void
1719 mips16_get_fcsr_one_only_stub::output_body ()
1721 fprintf (asm_out_file,
1722 "\tcfc1\t%s,$31\n"
1723 "\tj\t$31\n", reg_names[GET_FCSR_REGNUM]);
1726 /* A stub for moving SET_FCSR_REGNUM into the FCSR. */
1727 class mips16_set_fcsr_one_only_stub : public mips_one_only_stub
1729 virtual const char *get_name ();
1730 virtual void output_body ();
1733 const char *
1734 mips16_set_fcsr_one_only_stub::get_name ()
1736 return "__mips16_set_fcsr";
1739 void
1740 mips16_set_fcsr_one_only_stub::output_body ()
1742 fprintf (asm_out_file,
1743 "\tctc1\t%s,$31\n"
1744 "\tj\t$31\n", reg_names[SET_FCSR_REGNUM]);
1747 /* Return true if symbols of type TYPE require a GOT access. */
1749 static bool
1750 mips_got_symbol_type_p (enum mips_symbol_type type)
1752 switch (type)
1754 case SYMBOL_GOT_PAGE_OFST:
1755 case SYMBOL_GOT_DISP:
1756 return true;
1758 default:
1759 return false;
1763 /* Return true if X is a thread-local symbol. */
1765 static bool
1766 mips_tls_symbol_p (rtx x)
1768 return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1771 /* Return true if SYMBOL_REF X is associated with a global symbol
1772 (in the STB_GLOBAL sense). */
1774 static bool
1775 mips_global_symbol_p (const_rtx x)
1777 const_tree decl = SYMBOL_REF_DECL (x);
1779 if (!decl)
1780 return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1782 /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1783 or weak symbols. Relocations in the object file will be against
1784 the target symbol, so it's that symbol's binding that matters here. */
1785 return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1788 /* Return true if function X is a libgcc MIPS16 stub function. */
1790 static bool
1791 mips16_stub_function_p (const_rtx x)
1793 return (GET_CODE (x) == SYMBOL_REF
1794 && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1797 /* Return true if function X is a locally-defined and locally-binding
1798 MIPS16 function. */
1800 static bool
1801 mips16_local_function_p (const_rtx x)
1803 return (GET_CODE (x) == SYMBOL_REF
1804 && SYMBOL_REF_LOCAL_P (x)
1805 && !SYMBOL_REF_EXTERNAL_P (x)
1806 && (mips_get_compress_mode (SYMBOL_REF_DECL (x)) & MASK_MIPS16));
1809 /* Return true if SYMBOL_REF X binds locally. */
1811 static bool
1812 mips_symbol_binds_local_p (const_rtx x)
1814 return (SYMBOL_REF_DECL (x)
1815 ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1816 : SYMBOL_REF_LOCAL_P (x));
1819 /* Return true if rtx constants of mode MODE should be put into a small
1820 data section. */
1822 static bool
1823 mips_rtx_constant_in_small_data_p (machine_mode mode)
1825 return (!TARGET_EMBEDDED_DATA
1826 && TARGET_LOCAL_SDATA
1827 && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1830 /* Return true if X should not be moved directly into register $25.
1831 We need this because many versions of GAS will treat "la $25,foo" as
1832 part of a call sequence and so allow a global "foo" to be lazily bound. */
1834 bool
1835 mips_dangerous_for_la25_p (rtx x)
1837 return (!TARGET_EXPLICIT_RELOCS
1838 && TARGET_USE_GOT
1839 && GET_CODE (x) == SYMBOL_REF
1840 && mips_global_symbol_p (x));
1843 /* Return true if calls to X might need $25 to be valid on entry. */
1845 bool
1846 mips_use_pic_fn_addr_reg_p (const_rtx x)
1848 if (!TARGET_USE_PIC_FN_ADDR_REG)
1849 return false;
1851 /* MIPS16 stub functions are guaranteed not to use $25. */
1852 if (mips16_stub_function_p (x))
1853 return false;
1855 if (GET_CODE (x) == SYMBOL_REF)
1857 /* If PLTs and copy relocations are available, the static linker
1858 will make sure that $25 is valid on entry to the target function. */
1859 if (TARGET_ABICALLS_PIC0)
1860 return false;
1862 /* Locally-defined functions use absolute accesses to set up
1863 the global pointer. */
1864 if (TARGET_ABSOLUTE_ABICALLS
1865 && mips_symbol_binds_local_p (x)
1866 && !SYMBOL_REF_EXTERNAL_P (x))
1867 return false;
1870 return true;
1873 /* Return the method that should be used to access SYMBOL_REF or
1874 LABEL_REF X in context CONTEXT. */
1876 static enum mips_symbol_type
1877 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1879 if (TARGET_RTP_PIC)
1880 return SYMBOL_GOT_DISP;
1882 if (GET_CODE (x) == LABEL_REF)
1884 /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1885 code and if we know that the label is in the current function's
1886 text section. LABEL_REFs are used for jump tables as well as
1887 text labels, so we must check whether jump tables live in the
1888 text section. */
1889 if (TARGET_MIPS16_SHORT_JUMP_TABLES
1890 && !LABEL_REF_NONLOCAL_P (x))
1891 return SYMBOL_PC_RELATIVE;
1893 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1894 return SYMBOL_GOT_PAGE_OFST;
1896 return SYMBOL_ABSOLUTE;
1899 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1901 if (SYMBOL_REF_TLS_MODEL (x))
1902 return SYMBOL_TLS;
1904 if (CONSTANT_POOL_ADDRESS_P (x))
1906 if (TARGET_MIPS16_TEXT_LOADS)
1907 return SYMBOL_PC_RELATIVE;
1909 if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1910 return SYMBOL_PC_RELATIVE;
1912 if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1913 return SYMBOL_GP_RELATIVE;
1916 /* Do not use small-data accesses for weak symbols; they may end up
1917 being zero. */
1918 if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1919 return SYMBOL_GP_RELATIVE;
1921 /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1922 is in effect. */
1923 if (TARGET_ABICALLS_PIC2
1924 && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1926 /* There are three cases to consider:
1928 - o32 PIC (either with or without explicit relocs)
1929 - n32/n64 PIC without explicit relocs
1930 - n32/n64 PIC with explicit relocs
1932 In the first case, both local and global accesses will use an
1933 R_MIPS_GOT16 relocation. We must correctly predict which of
1934 the two semantics (local or global) the assembler and linker
1935 will apply. The choice depends on the symbol's binding rather
1936 than its visibility.
1938 In the second case, the assembler will not use R_MIPS_GOT16
1939 relocations, but it chooses between local and global accesses
1940 in the same way as for o32 PIC.
1942 In the third case we have more freedom since both forms of
1943 access will work for any kind of symbol. However, there seems
1944 little point in doing things differently. */
1945 if (mips_global_symbol_p (x))
1946 return SYMBOL_GOT_DISP;
1948 return SYMBOL_GOT_PAGE_OFST;
1951 return SYMBOL_ABSOLUTE;
1954 /* Classify the base of symbolic expression X, given that X appears in
1955 context CONTEXT. */
1957 static enum mips_symbol_type
1958 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1960 rtx offset;
1962 split_const (x, &x, &offset);
1963 if (UNSPEC_ADDRESS_P (x))
1964 return UNSPEC_ADDRESS_TYPE (x);
1966 return mips_classify_symbol (x, context);
1969 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1970 is the alignment in bytes of SYMBOL_REF X. */
1972 static bool
1973 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1975 HOST_WIDE_INT align;
1977 align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1978 return IN_RANGE (offset, 0, align - 1);
1981 /* Return true if X is a symbolic constant that can be used in context
1982 CONTEXT. If it is, store the type of the symbol in *SYMBOL_TYPE. */
1984 bool
1985 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1986 enum mips_symbol_type *symbol_type)
1988 rtx offset;
1990 split_const (x, &x, &offset);
1991 if (UNSPEC_ADDRESS_P (x))
1993 *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1994 x = UNSPEC_ADDRESS (x);
1996 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1998 *symbol_type = mips_classify_symbol (x, context);
1999 if (*symbol_type == SYMBOL_TLS)
2000 return false;
2002 else
2003 return false;
2005 if (offset == const0_rtx)
2006 return true;
2008 /* Check whether a nonzero offset is valid for the underlying
2009 relocations. */
2010 switch (*symbol_type)
2012 case SYMBOL_ABSOLUTE:
2013 case SYMBOL_64_HIGH:
2014 case SYMBOL_64_MID:
2015 case SYMBOL_64_LOW:
2016 /* If the target has 64-bit pointers and the object file only
2017 supports 32-bit symbols, the values of those symbols will be
2018 sign-extended. In this case we can't allow an arbitrary offset
2019 in case the 32-bit value X + OFFSET has a different sign from X. */
2020 if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
2021 return offset_within_block_p (x, INTVAL (offset));
2023 /* In other cases the relocations can handle any offset. */
2024 return true;
2026 case SYMBOL_PC_RELATIVE:
2027 /* Allow constant pool references to be converted to LABEL+CONSTANT.
2028 In this case, we no longer have access to the underlying constant,
2029 but the original symbol-based access was known to be valid. */
2030 if (GET_CODE (x) == LABEL_REF)
2031 return true;
2033 /* Fall through. */
2035 case SYMBOL_GP_RELATIVE:
2036 /* Make sure that the offset refers to something within the
2037 same object block. This should guarantee that the final
2038 PC- or GP-relative offset is within the 16-bit limit. */
2039 return offset_within_block_p (x, INTVAL (offset));
2041 case SYMBOL_GOT_PAGE_OFST:
2042 case SYMBOL_GOTOFF_PAGE:
2043 /* If the symbol is global, the GOT entry will contain the symbol's
2044 address, and we will apply a 16-bit offset after loading it.
2045 If the symbol is local, the linker should provide enough local
2046 GOT entries for a 16-bit offset, but larger offsets may lead
2047 to GOT overflow. */
2048 return SMALL_INT (offset);
2050 case SYMBOL_TPREL:
2051 case SYMBOL_DTPREL:
2052 /* There is no carry between the HI and LO REL relocations, so the
2053 offset is only valid if we know it won't lead to such a carry. */
2054 return mips_offset_within_alignment_p (x, INTVAL (offset));
2056 case SYMBOL_GOT_DISP:
2057 case SYMBOL_GOTOFF_DISP:
2058 case SYMBOL_GOTOFF_CALL:
2059 case SYMBOL_GOTOFF_LOADGP:
2060 case SYMBOL_TLSGD:
2061 case SYMBOL_TLSLDM:
2062 case SYMBOL_GOTTPREL:
2063 case SYMBOL_TLS:
2064 case SYMBOL_HALF:
2065 return false;
2067 gcc_unreachable ();
2070 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
2071 single instruction. We rely on the fact that, in the worst case,
2072 all instructions involved in a MIPS16 address calculation are usually
2073 extended ones. */
2075 static int
2076 mips_symbol_insns_1 (enum mips_symbol_type type, machine_mode mode)
2078 if (mips_use_pcrel_pool_p[(int) type])
2080 if (mode == MAX_MACHINE_MODE)
2081 /* LEAs will be converted into constant-pool references by
2082 mips_reorg. */
2083 type = SYMBOL_PC_RELATIVE;
2084 else
2085 /* The constant must be loaded and then dereferenced. */
2086 return 0;
2089 switch (type)
2091 case SYMBOL_ABSOLUTE:
2092 /* When using 64-bit symbols, we need 5 preparatory instructions,
2093 such as:
2095 lui $at,%highest(symbol)
2096 daddiu $at,$at,%higher(symbol)
2097 dsll $at,$at,16
2098 daddiu $at,$at,%hi(symbol)
2099 dsll $at,$at,16
2101 The final address is then $at + %lo(symbol). With 32-bit
2102 symbols we just need a preparatory LUI for normal mode and
2103 a preparatory LI and SLL for MIPS16. */
2104 return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
2106 case SYMBOL_GP_RELATIVE:
2107 /* Treat GP-relative accesses as taking a single instruction on
2108 MIPS16 too; the copy of $gp can often be shared. */
2109 return 1;
2111 case SYMBOL_PC_RELATIVE:
2112 /* PC-relative constants can be only be used with ADDIUPC,
2113 DADDIUPC, LWPC and LDPC. */
2114 if (mode == MAX_MACHINE_MODE
2115 || GET_MODE_SIZE (mode) == 4
2116 || GET_MODE_SIZE (mode) == 8)
2117 return 1;
2119 /* The constant must be loaded using ADDIUPC or DADDIUPC first. */
2120 return 0;
2122 case SYMBOL_GOT_DISP:
2123 /* The constant will have to be loaded from the GOT before it
2124 is used in an address. */
2125 if (mode != MAX_MACHINE_MODE)
2126 return 0;
2128 /* Fall through. */
2130 case SYMBOL_GOT_PAGE_OFST:
2131 /* Unless -funit-at-a-time is in effect, we can't be sure whether the
2132 local/global classification is accurate. The worst cases are:
2134 (1) For local symbols when generating o32 or o64 code. The assembler
2135 will use:
2137 lw $at,%got(symbol)
2140 ...and the final address will be $at + %lo(symbol).
2142 (2) For global symbols when -mxgot. The assembler will use:
2144 lui $at,%got_hi(symbol)
2145 (d)addu $at,$at,$gp
2147 ...and the final address will be $at + %got_lo(symbol). */
2148 return 3;
2150 case SYMBOL_GOTOFF_PAGE:
2151 case SYMBOL_GOTOFF_DISP:
2152 case SYMBOL_GOTOFF_CALL:
2153 case SYMBOL_GOTOFF_LOADGP:
2154 case SYMBOL_64_HIGH:
2155 case SYMBOL_64_MID:
2156 case SYMBOL_64_LOW:
2157 case SYMBOL_TLSGD:
2158 case SYMBOL_TLSLDM:
2159 case SYMBOL_DTPREL:
2160 case SYMBOL_GOTTPREL:
2161 case SYMBOL_TPREL:
2162 case SYMBOL_HALF:
2163 /* A 16-bit constant formed by a single relocation, or a 32-bit
2164 constant formed from a high 16-bit relocation and a low 16-bit
2165 relocation. Use mips_split_p to determine which. 32-bit
2166 constants need an "lui; addiu" sequence for normal mode and
2167 an "li; sll; addiu" sequence for MIPS16 mode. */
2168 return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
2170 case SYMBOL_TLS:
2171 /* We don't treat a bare TLS symbol as a constant. */
2172 return 0;
2174 gcc_unreachable ();
2177 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
2178 to load symbols of type TYPE into a register. Return 0 if the given
2179 type of symbol cannot be used as an immediate operand.
2181 Otherwise, return the number of instructions needed to load or store
2182 values of mode MODE to or from addresses of type TYPE. Return 0 if
2183 the given type of symbol is not valid in addresses.
2185 In both cases, instruction counts are based off BASE_INSN_LENGTH. */
2187 static int
2188 mips_symbol_insns (enum mips_symbol_type type, machine_mode mode)
2190 return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
2193 /* Implement TARGET_CANNOT_FORCE_CONST_MEM. */
2195 static bool
2196 mips_cannot_force_const_mem (machine_mode mode, rtx x)
2198 enum mips_symbol_type type;
2199 rtx base, offset;
2201 /* There is no assembler syntax for expressing an address-sized
2202 high part. */
2203 if (GET_CODE (x) == HIGH)
2204 return true;
2206 /* As an optimization, reject constants that mips_legitimize_move
2207 can expand inline.
2209 Suppose we have a multi-instruction sequence that loads constant C
2210 into register R. If R does not get allocated a hard register, and
2211 R is used in an operand that allows both registers and memory
2212 references, reload will consider forcing C into memory and using
2213 one of the instruction's memory alternatives. Returning false
2214 here will force it to use an input reload instead. */
2215 if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x))
2216 return true;
2218 split_const (x, &base, &offset);
2219 if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type))
2221 /* See whether we explicitly want these symbols in the pool. */
2222 if (mips_use_pcrel_pool_p[(int) type])
2223 return false;
2225 /* The same optimization as for CONST_INT. */
2226 if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
2227 return true;
2229 /* If MIPS16 constant pools live in the text section, they should
2230 not refer to anything that might need run-time relocation. */
2231 if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2232 return true;
2235 /* TLS symbols must be computed by mips_legitimize_move. */
2236 if (tls_referenced_p (x))
2237 return true;
2239 return false;
2242 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. We can't use blocks for
2243 constants when we're using a per-function constant pool. */
2245 static bool
2246 mips_use_blocks_for_constant_p (machine_mode mode ATTRIBUTE_UNUSED,
2247 const_rtx x ATTRIBUTE_UNUSED)
2249 return !TARGET_MIPS16_PCREL_LOADS;
2252 /* Return true if register REGNO is a valid base register for mode MODE.
2253 STRICT_P is true if REG_OK_STRICT is in effect. */
2256 mips_regno_mode_ok_for_base_p (int regno, machine_mode mode,
2257 bool strict_p)
2259 if (!HARD_REGISTER_NUM_P (regno))
2261 if (!strict_p)
2262 return true;
2263 regno = reg_renumber[regno];
2266 /* These fake registers will be eliminated to either the stack or
2267 hard frame pointer, both of which are usually valid base registers.
2268 Reload deals with the cases where the eliminated form isn't valid. */
2269 if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2270 return true;
2272 /* In MIPS16 mode, the stack pointer can only address word and doubleword
2273 values, nothing smaller. */
2274 if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2275 return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2277 return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2280 /* Return true if X is a valid base register for mode MODE.
2281 STRICT_P is true if REG_OK_STRICT is in effect. */
2283 static bool
2284 mips_valid_base_register_p (rtx x, machine_mode mode, bool strict_p)
2286 if (!strict_p && GET_CODE (x) == SUBREG)
2287 x = SUBREG_REG (x);
2289 return (REG_P (x)
2290 && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2293 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2294 can address a value of mode MODE. */
2296 static bool
2297 mips_valid_offset_p (rtx x, machine_mode mode)
2299 /* Check that X is a signed 16-bit number. */
2300 if (!const_arith_operand (x, Pmode))
2301 return false;
2303 /* We may need to split multiword moves, so make sure that every word
2304 is accessible. */
2305 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2306 && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2307 return false;
2309 return true;
2312 /* Return true if a LO_SUM can address a value of mode MODE when the
2313 LO_SUM symbol has type SYMBOL_TYPE. */
2315 static bool
2316 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, machine_mode mode)
2318 /* Check that symbols of type SYMBOL_TYPE can be used to access values
2319 of mode MODE. */
2320 if (mips_symbol_insns (symbol_type, mode) == 0)
2321 return false;
2323 /* Check that there is a known low-part relocation. */
2324 if (mips_lo_relocs[symbol_type] == NULL)
2325 return false;
2327 /* We may need to split multiword moves, so make sure that each word
2328 can be accessed without inducing a carry. This is mainly needed
2329 for o64, which has historically only guaranteed 64-bit alignment
2330 for 128-bit types. */
2331 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2332 && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2333 return false;
2335 return true;
2338 /* Return true if X is a valid address for machine mode MODE. If it is,
2339 fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in
2340 effect. */
2342 static bool
2343 mips_classify_address (struct mips_address_info *info, rtx x,
2344 machine_mode mode, bool strict_p)
2346 switch (GET_CODE (x))
2348 case REG:
2349 case SUBREG:
2350 info->type = ADDRESS_REG;
2351 info->reg = x;
2352 info->offset = const0_rtx;
2353 return mips_valid_base_register_p (info->reg, mode, strict_p);
2355 case PLUS:
2356 info->type = ADDRESS_REG;
2357 info->reg = XEXP (x, 0);
2358 info->offset = XEXP (x, 1);
2359 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2360 && mips_valid_offset_p (info->offset, mode));
2362 case LO_SUM:
2363 info->type = ADDRESS_LO_SUM;
2364 info->reg = XEXP (x, 0);
2365 info->offset = XEXP (x, 1);
2366 /* We have to trust the creator of the LO_SUM to do something vaguely
2367 sane. Target-independent code that creates a LO_SUM should also
2368 create and verify the matching HIGH. Target-independent code that
2369 adds an offset to a LO_SUM must prove that the offset will not
2370 induce a carry. Failure to do either of these things would be
2371 a bug, and we are not required to check for it here. The MIPS
2372 backend itself should only create LO_SUMs for valid symbolic
2373 constants, with the high part being either a HIGH or a copy
2374 of _gp. */
2375 info->symbol_type
2376 = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2377 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2378 && mips_valid_lo_sum_p (info->symbol_type, mode));
2380 case CONST_INT:
2381 /* Small-integer addresses don't occur very often, but they
2382 are legitimate if $0 is a valid base register. */
2383 info->type = ADDRESS_CONST_INT;
2384 return !TARGET_MIPS16 && SMALL_INT (x);
2386 case CONST:
2387 case LABEL_REF:
2388 case SYMBOL_REF:
2389 info->type = ADDRESS_SYMBOLIC;
2390 return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2391 &info->symbol_type)
2392 && mips_symbol_insns (info->symbol_type, mode) > 0
2393 && !mips_split_p[info->symbol_type]);
2395 default:
2396 return false;
2400 /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
2402 static bool
2403 mips_legitimate_address_p (machine_mode mode, rtx x, bool strict_p)
2405 struct mips_address_info addr;
2407 return mips_classify_address (&addr, x, mode, strict_p);
2410 /* Return true if X is a legitimate $sp-based address for mode MDOE. */
2412 bool
2413 mips_stack_address_p (rtx x, machine_mode mode)
2415 struct mips_address_info addr;
2417 return (mips_classify_address (&addr, x, mode, false)
2418 && addr.type == ADDRESS_REG
2419 && addr.reg == stack_pointer_rtx);
2422 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2423 address instruction. Note that such addresses are not considered
2424 legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2425 is so restricted. */
2427 static bool
2428 mips_lwxs_address_p (rtx addr)
2430 if (ISA_HAS_LWXS
2431 && GET_CODE (addr) == PLUS
2432 && REG_P (XEXP (addr, 1)))
2434 rtx offset = XEXP (addr, 0);
2435 if (GET_CODE (offset) == MULT
2436 && REG_P (XEXP (offset, 0))
2437 && CONST_INT_P (XEXP (offset, 1))
2438 && INTVAL (XEXP (offset, 1)) == 4)
2439 return true;
2441 return false;
2444 /* Return true if ADDR matches the pattern for the L{B,H,W,D}{,U}X load
2445 indexed address instruction. Note that such addresses are
2446 not considered legitimate in the TARGET_LEGITIMATE_ADDRESS_P
2447 sense, because their use is so restricted. */
2449 static bool
2450 mips_lx_address_p (rtx addr, machine_mode mode)
2452 if (GET_CODE (addr) != PLUS
2453 || !REG_P (XEXP (addr, 0))
2454 || !REG_P (XEXP (addr, 1)))
2455 return false;
2456 if (ISA_HAS_LBX && mode == QImode)
2457 return true;
2458 if (ISA_HAS_LHX && mode == HImode)
2459 return true;
2460 if (ISA_HAS_LWX && mode == SImode)
2461 return true;
2462 if (ISA_HAS_LDX && mode == DImode)
2463 return true;
2464 return false;
2467 /* Return true if a value at OFFSET bytes from base register BASE can be
2468 accessed using an unextended MIPS16 instruction. MODE is the mode of
2469 the value.
2471 Usually the offset in an unextended instruction is a 5-bit field.
2472 The offset is unsigned and shifted left once for LH and SH, twice
2473 for LW and SW, and so on. An exception is LWSP and SWSP, which have
2474 an 8-bit immediate field that's shifted left twice. */
2476 static bool
2477 mips16_unextended_reference_p (machine_mode mode, rtx base,
2478 unsigned HOST_WIDE_INT offset)
2480 if (mode != BLKmode && offset % GET_MODE_SIZE (mode) == 0)
2482 if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2483 return offset < 256U * GET_MODE_SIZE (mode);
2484 return offset < 32U * GET_MODE_SIZE (mode);
2486 return false;
2489 /* Return the number of instructions needed to load or store a value
2490 of mode MODE at address X, assuming that BASE_INSN_LENGTH is the
2491 length of one instruction. Return 0 if X isn't valid for MODE.
2492 Assume that multiword moves may need to be split into word moves
2493 if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2494 enough. */
2497 mips_address_insns (rtx x, machine_mode mode, bool might_split_p)
2499 struct mips_address_info addr;
2500 int factor;
2502 /* BLKmode is used for single unaligned loads and stores and should
2503 not count as a multiword mode. (GET_MODE_SIZE (BLKmode) is pretty
2504 meaningless, so we have to single it out as a special case one way
2505 or the other.) */
2506 if (mode != BLKmode && might_split_p)
2507 factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2508 else
2509 factor = 1;
2511 if (mips_classify_address (&addr, x, mode, false))
2512 switch (addr.type)
2514 case ADDRESS_REG:
2515 if (TARGET_MIPS16
2516 && !mips16_unextended_reference_p (mode, addr.reg,
2517 UINTVAL (addr.offset)))
2518 return factor * 2;
2519 return factor;
2521 case ADDRESS_LO_SUM:
2522 return TARGET_MIPS16 ? factor * 2 : factor;
2524 case ADDRESS_CONST_INT:
2525 return factor;
2527 case ADDRESS_SYMBOLIC:
2528 return factor * mips_symbol_insns (addr.symbol_type, mode);
2530 return 0;
2533 /* Return true if X fits within an unsigned field of BITS bits that is
2534 shifted left SHIFT bits before being used. */
2536 bool
2537 mips_unsigned_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2539 return (x & ((1 << shift) - 1)) == 0 && x < ((unsigned) 1 << (shift + bits));
2542 /* Return true if X fits within a signed field of BITS bits that is
2543 shifted left SHIFT bits before being used. */
2545 bool
2546 mips_signed_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2548 x += 1 << (bits + shift - 1);
2549 return mips_unsigned_immediate_p (x, bits, shift);
2552 /* Return true if X is legitimate for accessing values of mode MODE,
2553 if it is based on a MIPS16 register, and if the offset satisfies
2554 OFFSET_PREDICATE. */
2556 bool
2557 m16_based_address_p (rtx x, machine_mode mode,
2558 insn_operand_predicate_fn offset_predicate)
2560 struct mips_address_info addr;
2562 return (mips_classify_address (&addr, x, mode, false)
2563 && addr.type == ADDRESS_REG
2564 && M16_REG_P (REGNO (addr.reg))
2565 && offset_predicate (addr.offset, mode));
2568 /* Return true if X is a legitimate address that conforms to the requirements
2569 for a microMIPS LWSP or SWSP insn. */
2571 bool
2572 lwsp_swsp_address_p (rtx x, machine_mode mode)
2574 struct mips_address_info addr;
2576 return (mips_classify_address (&addr, x, mode, false)
2577 && addr.type == ADDRESS_REG
2578 && REGNO (addr.reg) == STACK_POINTER_REGNUM
2579 && uw5_operand (addr.offset, mode));
2582 /* Return true if X is a legitimate address with a 12-bit offset.
2583 MODE is the mode of the value being accessed. */
2585 bool
2586 umips_12bit_offset_address_p (rtx x, machine_mode mode)
2588 struct mips_address_info addr;
2590 return (mips_classify_address (&addr, x, mode, false)
2591 && addr.type == ADDRESS_REG
2592 && CONST_INT_P (addr.offset)
2593 && UMIPS_12BIT_OFFSET_P (INTVAL (addr.offset)));
2596 /* Return the number of instructions needed to load constant X,
2597 assuming that BASE_INSN_LENGTH is the length of one instruction.
2598 Return 0 if X isn't a valid constant. */
2601 mips_const_insns (rtx x)
2603 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2604 enum mips_symbol_type symbol_type;
2605 rtx offset;
2607 switch (GET_CODE (x))
2609 case HIGH:
2610 if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2611 &symbol_type)
2612 || !mips_split_p[symbol_type])
2613 return 0;
2615 /* This is simply an LUI for normal mode. It is an extended
2616 LI followed by an extended SLL for MIPS16. */
2617 return TARGET_MIPS16 ? 4 : 1;
2619 case CONST_INT:
2620 if (TARGET_MIPS16)
2621 /* Unsigned 8-bit constants can be loaded using an unextended
2622 LI instruction. Unsigned 16-bit constants can be loaded
2623 using an extended LI. Negative constants must be loaded
2624 using LI and then negated. */
2625 return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2626 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2627 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2628 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2629 : 0);
2631 return mips_build_integer (codes, INTVAL (x));
2633 case CONST_DOUBLE:
2634 case CONST_VECTOR:
2635 /* Allow zeros for normal mode, where we can use $0. */
2636 return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2638 case CONST:
2639 if (CONST_GP_P (x))
2640 return 1;
2642 /* See if we can refer to X directly. */
2643 if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2644 return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2646 /* Otherwise try splitting the constant into a base and offset.
2647 If the offset is a 16-bit value, we can load the base address
2648 into a register and then use (D)ADDIU to add in the offset.
2649 If the offset is larger, we can load the base and offset
2650 into separate registers and add them together with (D)ADDU.
2651 However, the latter is only possible before reload; during
2652 and after reload, we must have the option of forcing the
2653 constant into the pool instead. */
2654 split_const (x, &x, &offset);
2655 if (offset != 0)
2657 int n = mips_const_insns (x);
2658 if (n != 0)
2660 if (SMALL_INT (offset))
2661 return n + 1;
2662 else if (!targetm.cannot_force_const_mem (GET_MODE (x), x))
2663 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2666 return 0;
2668 case SYMBOL_REF:
2669 case LABEL_REF:
2670 return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2671 MAX_MACHINE_MODE);
2673 default:
2674 return 0;
2678 /* X is a doubleword constant that can be handled by splitting it into
2679 two words and loading each word separately. Return the number of
2680 instructions required to do this, assuming that BASE_INSN_LENGTH
2681 is the length of one instruction. */
2684 mips_split_const_insns (rtx x)
2686 unsigned int low, high;
2688 low = mips_const_insns (mips_subword (x, false));
2689 high = mips_const_insns (mips_subword (x, true));
2690 gcc_assert (low > 0 && high > 0);
2691 return low + high;
2694 /* Return the number of instructions needed to implement INSN,
2695 given that it loads from or stores to MEM. Assume that
2696 BASE_INSN_LENGTH is the length of one instruction. */
2699 mips_load_store_insns (rtx mem, rtx_insn *insn)
2701 machine_mode mode;
2702 bool might_split_p;
2703 rtx set;
2705 gcc_assert (MEM_P (mem));
2706 mode = GET_MODE (mem);
2708 /* Try to prove that INSN does not need to be split. */
2709 might_split_p = GET_MODE_SIZE (mode) > UNITS_PER_WORD;
2710 if (might_split_p)
2712 set = single_set (insn);
2713 if (set && !mips_split_move_insn_p (SET_DEST (set), SET_SRC (set), insn))
2714 might_split_p = false;
2717 return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2720 /* Return the number of instructions needed for an integer division,
2721 assuming that BASE_INSN_LENGTH is the length of one instruction. */
2724 mips_idiv_insns (void)
2726 int count;
2728 count = 1;
2729 if (TARGET_CHECK_ZERO_DIV)
2731 if (GENERATE_DIVIDE_TRAPS)
2732 count++;
2733 else
2734 count += 2;
2737 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2738 count++;
2739 return count;
2742 /* Emit a move from SRC to DEST. Assume that the move expanders can
2743 handle all moves if !can_create_pseudo_p (). The distinction is
2744 important because, unlike emit_move_insn, the move expanders know
2745 how to force Pmode objects into the constant pool even when the
2746 constant pool address is not itself legitimate. */
2748 rtx_insn *
2749 mips_emit_move (rtx dest, rtx src)
2751 return (can_create_pseudo_p ()
2752 ? emit_move_insn (dest, src)
2753 : emit_move_insn_1 (dest, src));
2756 /* Emit a move from SRC to DEST, splitting compound moves into individual
2757 instructions. SPLIT_TYPE is the type of split to perform. */
2759 static void
2760 mips_emit_move_or_split (rtx dest, rtx src, enum mips_split_type split_type)
2762 if (mips_split_move_p (dest, src, split_type))
2763 mips_split_move (dest, src, split_type);
2764 else
2765 mips_emit_move (dest, src);
2768 /* Emit an instruction of the form (set TARGET (CODE OP0)). */
2770 static void
2771 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2773 emit_insn (gen_rtx_SET (VOIDmode, target,
2774 gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2777 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2778 Return that new register. */
2780 static rtx
2781 mips_force_unary (machine_mode mode, enum rtx_code code, rtx op0)
2783 rtx reg;
2785 reg = gen_reg_rtx (mode);
2786 mips_emit_unary (code, reg, op0);
2787 return reg;
2790 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)). */
2792 void
2793 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2795 emit_insn (gen_rtx_SET (VOIDmode, target,
2796 gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2799 /* Compute (CODE OP0 OP1) and store the result in a new register
2800 of mode MODE. Return that new register. */
2802 static rtx
2803 mips_force_binary (machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2805 rtx reg;
2807 reg = gen_reg_rtx (mode);
2808 mips_emit_binary (code, reg, op0, op1);
2809 return reg;
2812 /* Copy VALUE to a register and return that register. If new pseudos
2813 are allowed, copy it into a new register, otherwise use DEST. */
2815 static rtx
2816 mips_force_temporary (rtx dest, rtx value)
2818 if (can_create_pseudo_p ())
2819 return force_reg (Pmode, value);
2820 else
2822 mips_emit_move (dest, value);
2823 return dest;
2827 /* Emit a call sequence with call pattern PATTERN and return the call
2828 instruction itself (which is not necessarily the last instruction
2829 emitted). ORIG_ADDR is the original, unlegitimized address,
2830 ADDR is the legitimized form, and LAZY_P is true if the call
2831 address is lazily-bound. */
2833 static rtx_insn *
2834 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2836 rtx_insn *insn;
2837 rtx reg;
2839 insn = emit_call_insn (pattern);
2841 if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2843 /* MIPS16 JALRs only take MIPS16 registers. If the target
2844 function requires $25 to be valid on entry, we must copy it
2845 there separately. The move instruction can be put in the
2846 call's delay slot. */
2847 reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2848 emit_insn_before (gen_move_insn (reg, addr), insn);
2849 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2852 if (lazy_p)
2853 /* Lazy-binding stubs require $gp to be valid on entry. */
2854 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2856 if (TARGET_USE_GOT)
2858 /* See the comment above load_call<mode> for details. */
2859 use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2860 gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2861 emit_insn (gen_update_got_version ());
2864 if (TARGET_MIPS16
2865 && TARGET_EXPLICIT_RELOCS
2866 && TARGET_CALL_CLOBBERED_GP)
2868 rtx post_call_tmp_reg = gen_rtx_REG (word_mode, POST_CALL_TMP_REG);
2869 clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), post_call_tmp_reg);
2872 return insn;
2875 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2876 then add CONST_INT OFFSET to the result. */
2878 static rtx
2879 mips_unspec_address_offset (rtx base, rtx offset,
2880 enum mips_symbol_type symbol_type)
2882 base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2883 UNSPEC_ADDRESS_FIRST + symbol_type);
2884 if (offset != const0_rtx)
2885 base = gen_rtx_PLUS (Pmode, base, offset);
2886 return gen_rtx_CONST (Pmode, base);
2889 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2890 type SYMBOL_TYPE. */
2893 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2895 rtx base, offset;
2897 split_const (address, &base, &offset);
2898 return mips_unspec_address_offset (base, offset, symbol_type);
2901 /* If OP is an UNSPEC address, return the address to which it refers,
2902 otherwise return OP itself. */
2905 mips_strip_unspec_address (rtx op)
2907 rtx base, offset;
2909 split_const (op, &base, &offset);
2910 if (UNSPEC_ADDRESS_P (base))
2911 op = plus_constant (Pmode, UNSPEC_ADDRESS (base), INTVAL (offset));
2912 return op;
2915 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2916 high part to BASE and return the result. Just return BASE otherwise.
2917 TEMP is as for mips_force_temporary.
2919 The returned expression can be used as the first operand to a LO_SUM. */
2921 static rtx
2922 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2923 enum mips_symbol_type symbol_type)
2925 if (mips_split_p[symbol_type])
2927 addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2928 addr = mips_force_temporary (temp, addr);
2929 base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2931 return base;
2934 /* Return an instruction that copies $gp into register REG. We want
2935 GCC to treat the register's value as constant, so that its value
2936 can be rematerialized on demand. */
2938 static rtx
2939 gen_load_const_gp (rtx reg)
2941 return PMODE_INSN (gen_load_const_gp, (reg));
2944 /* Return a pseudo register that contains the value of $gp throughout
2945 the current function. Such registers are needed by MIPS16 functions,
2946 for which $gp itself is not a valid base register or addition operand. */
2948 static rtx
2949 mips16_gp_pseudo_reg (void)
2951 if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2953 rtx_insn *scan;
2955 cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2957 push_topmost_sequence ();
2959 scan = get_insns ();
2960 while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2961 scan = NEXT_INSN (scan);
2963 rtx set = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2964 rtx_insn *insn = emit_insn_after (set, scan);
2965 INSN_LOCATION (insn) = 0;
2967 pop_topmost_sequence ();
2970 return cfun->machine->mips16_gp_pseudo_rtx;
2973 /* Return a base register that holds pic_offset_table_rtx.
2974 TEMP, if nonnull, is a scratch Pmode base register. */
2977 mips_pic_base_register (rtx temp)
2979 if (!TARGET_MIPS16)
2980 return pic_offset_table_rtx;
2982 if (currently_expanding_to_rtl)
2983 return mips16_gp_pseudo_reg ();
2985 if (can_create_pseudo_p ())
2986 temp = gen_reg_rtx (Pmode);
2988 if (TARGET_USE_GOT)
2989 /* The first post-reload split exposes all references to $gp
2990 (both uses and definitions). All references must remain
2991 explicit after that point.
2993 It is safe to introduce uses of $gp at any time, so for
2994 simplicity, we do that before the split too. */
2995 mips_emit_move (temp, pic_offset_table_rtx);
2996 else
2997 emit_insn (gen_load_const_gp (temp));
2998 return temp;
3001 /* Return the RHS of a load_call<mode> insn. */
3003 static rtx
3004 mips_unspec_call (rtx reg, rtx symbol)
3006 rtvec vec;
3008 vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
3009 return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
3012 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
3013 reference. Return NULL_RTX otherwise. */
3015 static rtx
3016 mips_strip_unspec_call (rtx src)
3018 if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
3019 return mips_strip_unspec_address (XVECEXP (src, 0, 1));
3020 return NULL_RTX;
3023 /* Create and return a GOT reference of type TYPE for address ADDR.
3024 TEMP, if nonnull, is a scratch Pmode base register. */
3027 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
3029 rtx base, high, lo_sum_symbol;
3031 base = mips_pic_base_register (temp);
3033 /* If we used the temporary register to load $gp, we can't use
3034 it for the high part as well. */
3035 if (temp != NULL && reg_overlap_mentioned_p (base, temp))
3036 temp = NULL;
3038 high = mips_unspec_offset_high (temp, base, addr, type);
3039 lo_sum_symbol = mips_unspec_address (addr, type);
3041 if (type == SYMBOL_GOTOFF_CALL)
3042 return mips_unspec_call (high, lo_sum_symbol);
3043 else
3044 return PMODE_INSN (gen_unspec_got, (high, lo_sum_symbol));
3047 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
3048 it appears in a MEM of that mode. Return true if ADDR is a legitimate
3049 constant in that context and can be split into high and low parts.
3050 If so, and if LOW_OUT is nonnull, emit the high part and store the
3051 low part in *LOW_OUT. Leave *LOW_OUT unchanged otherwise.
3053 TEMP is as for mips_force_temporary and is used to load the high
3054 part into a register.
3056 When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
3057 a legitimize SET_SRC for an .md pattern, otherwise the low part
3058 is guaranteed to be a legitimate address for mode MODE. */
3060 bool
3061 mips_split_symbol (rtx temp, rtx addr, machine_mode mode, rtx *low_out)
3063 enum mips_symbol_context context;
3064 enum mips_symbol_type symbol_type;
3065 rtx high;
3067 context = (mode == MAX_MACHINE_MODE
3068 ? SYMBOL_CONTEXT_LEA
3069 : SYMBOL_CONTEXT_MEM);
3070 if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
3072 addr = XEXP (addr, 0);
3073 if (mips_symbolic_constant_p (addr, context, &symbol_type)
3074 && mips_symbol_insns (symbol_type, mode) > 0
3075 && mips_split_hi_p[symbol_type])
3077 if (low_out)
3078 switch (symbol_type)
3080 case SYMBOL_GOT_PAGE_OFST:
3081 /* The high part of a page/ofst pair is loaded from the GOT. */
3082 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
3083 break;
3085 default:
3086 gcc_unreachable ();
3088 return true;
3091 else
3093 if (mips_symbolic_constant_p (addr, context, &symbol_type)
3094 && mips_symbol_insns (symbol_type, mode) > 0
3095 && mips_split_p[symbol_type])
3097 if (low_out)
3098 switch (symbol_type)
3100 case SYMBOL_GOT_DISP:
3101 /* SYMBOL_GOT_DISP symbols are loaded from the GOT. */
3102 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
3103 break;
3105 case SYMBOL_GP_RELATIVE:
3106 high = mips_pic_base_register (temp);
3107 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3108 break;
3110 default:
3111 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
3112 high = mips_force_temporary (temp, high);
3113 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3114 break;
3116 return true;
3119 return false;
3122 /* Return a legitimate address for REG + OFFSET. TEMP is as for
3123 mips_force_temporary; it is only needed when OFFSET is not a
3124 SMALL_OPERAND. */
3126 static rtx
3127 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
3129 if (!SMALL_OPERAND (offset))
3131 rtx high;
3133 if (TARGET_MIPS16)
3135 /* Load the full offset into a register so that we can use
3136 an unextended instruction for the address itself. */
3137 high = GEN_INT (offset);
3138 offset = 0;
3140 else
3142 /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
3143 The addition inside the macro CONST_HIGH_PART may cause an
3144 overflow, so we need to force a sign-extension check. */
3145 high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
3146 offset = CONST_LOW_PART (offset);
3148 high = mips_force_temporary (temp, high);
3149 reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
3151 return plus_constant (Pmode, reg, offset);
3154 /* The __tls_get_attr symbol. */
3155 static GTY(()) rtx mips_tls_symbol;
3157 /* Return an instruction sequence that calls __tls_get_addr. SYM is
3158 the TLS symbol we are referencing and TYPE is the symbol type to use
3159 (either global dynamic or local dynamic). V0 is an RTX for the
3160 return value location. */
3162 static rtx
3163 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
3165 rtx insn, loc, a0;
3167 a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
3169 if (!mips_tls_symbol)
3170 mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
3172 loc = mips_unspec_address (sym, type);
3174 start_sequence ();
3176 emit_insn (gen_rtx_SET (Pmode, a0,
3177 gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
3178 insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
3179 const0_rtx, NULL_RTX, false);
3180 RTL_CONST_CALL_P (insn) = 1;
3181 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
3182 insn = get_insns ();
3184 end_sequence ();
3186 return insn;
3189 /* Return a pseudo register that contains the current thread pointer. */
3192 mips_expand_thread_pointer (rtx tp)
3194 rtx fn;
3196 if (TARGET_MIPS16)
3198 if (!mips16_rdhwr_stub)
3199 mips16_rdhwr_stub = new mips16_rdhwr_one_only_stub ();
3200 fn = mips16_stub_call_address (mips16_rdhwr_stub);
3201 emit_insn (PMODE_INSN (gen_tls_get_tp_mips16, (tp, fn)));
3203 else
3204 emit_insn (PMODE_INSN (gen_tls_get_tp, (tp)));
3205 return tp;
3208 static rtx
3209 mips_get_tp (void)
3211 return mips_expand_thread_pointer (gen_reg_rtx (Pmode));
3214 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
3215 its address. The return value will be both a valid address and a valid
3216 SET_SRC (either a REG or a LO_SUM). */
3218 static rtx
3219 mips_legitimize_tls_address (rtx loc)
3221 rtx dest, insn, v0, tp, tmp1, tmp2, eqv, offset;
3222 enum tls_model model;
3224 model = SYMBOL_REF_TLS_MODEL (loc);
3225 /* Only TARGET_ABICALLS code can have more than one module; other
3226 code must be be static and should not use a GOT. All TLS models
3227 reduce to local exec in this situation. */
3228 if (!TARGET_ABICALLS)
3229 model = TLS_MODEL_LOCAL_EXEC;
3231 switch (model)
3233 case TLS_MODEL_GLOBAL_DYNAMIC:
3234 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3235 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
3236 dest = gen_reg_rtx (Pmode);
3237 emit_libcall_block (insn, dest, v0, loc);
3238 break;
3240 case TLS_MODEL_LOCAL_DYNAMIC:
3241 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3242 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
3243 tmp1 = gen_reg_rtx (Pmode);
3245 /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
3246 share the LDM result with other LD model accesses. */
3247 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3248 UNSPEC_TLS_LDM);
3249 emit_libcall_block (insn, tmp1, v0, eqv);
3251 offset = mips_unspec_address (loc, SYMBOL_DTPREL);
3252 if (mips_split_p[SYMBOL_DTPREL])
3254 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
3255 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3257 else
3258 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3259 0, 0, OPTAB_DIRECT);
3260 break;
3262 case TLS_MODEL_INITIAL_EXEC:
3263 tp = mips_get_tp ();
3264 tmp1 = gen_reg_rtx (Pmode);
3265 tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
3266 if (Pmode == DImode)
3267 emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
3268 else
3269 emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
3270 dest = gen_reg_rtx (Pmode);
3271 emit_insn (gen_add3_insn (dest, tmp1, tp));
3272 break;
3274 case TLS_MODEL_LOCAL_EXEC:
3275 tmp1 = mips_get_tp ();
3276 offset = mips_unspec_address (loc, SYMBOL_TPREL);
3277 if (mips_split_p[SYMBOL_TPREL])
3279 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_TPREL);
3280 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3282 else
3283 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3284 0, 0, OPTAB_DIRECT);
3285 break;
3287 default:
3288 gcc_unreachable ();
3290 return dest;
3293 /* Implement "TARGET = __builtin_mips_get_fcsr ()" for MIPS16,
3294 using a stub. */
3296 void
3297 mips16_expand_get_fcsr (rtx target)
3299 if (!mips16_get_fcsr_stub)
3300 mips16_get_fcsr_stub = new mips16_get_fcsr_one_only_stub ();
3301 rtx fn = mips16_stub_call_address (mips16_get_fcsr_stub);
3302 emit_insn (PMODE_INSN (gen_mips_get_fcsr_mips16, (fn)));
3303 emit_move_insn (target, gen_rtx_REG (SImode, GET_FCSR_REGNUM));
3306 /* Implement __builtin_mips_set_fcsr (TARGET) for MIPS16, using a stub. */
3308 void
3309 mips16_expand_set_fcsr (rtx newval)
3311 if (!mips16_set_fcsr_stub)
3312 mips16_set_fcsr_stub = new mips16_set_fcsr_one_only_stub ();
3313 rtx fn = mips16_stub_call_address (mips16_set_fcsr_stub);
3314 emit_move_insn (gen_rtx_REG (SImode, SET_FCSR_REGNUM), newval);
3315 emit_insn (PMODE_INSN (gen_mips_set_fcsr_mips16, (fn)));
3318 /* If X is not a valid address for mode MODE, force it into a register. */
3320 static rtx
3321 mips_force_address (rtx x, machine_mode mode)
3323 if (!mips_legitimate_address_p (mode, x, false))
3324 x = force_reg (Pmode, x);
3325 return x;
3328 /* This function is used to implement LEGITIMIZE_ADDRESS. If X can
3329 be legitimized in a way that the generic machinery might not expect,
3330 return a new address, otherwise return NULL. MODE is the mode of
3331 the memory being accessed. */
3333 static rtx
3334 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3335 machine_mode mode)
3337 rtx base, addr;
3338 HOST_WIDE_INT offset;
3340 if (mips_tls_symbol_p (x))
3341 return mips_legitimize_tls_address (x);
3343 /* See if the address can split into a high part and a LO_SUM. */
3344 if (mips_split_symbol (NULL, x, mode, &addr))
3345 return mips_force_address (addr, mode);
3347 /* Handle BASE + OFFSET using mips_add_offset. */
3348 mips_split_plus (x, &base, &offset);
3349 if (offset != 0)
3351 if (!mips_valid_base_register_p (base, mode, false))
3352 base = copy_to_mode_reg (Pmode, base);
3353 addr = mips_add_offset (NULL, base, offset);
3354 return mips_force_address (addr, mode);
3357 return x;
3360 /* Load VALUE into DEST. TEMP is as for mips_force_temporary. */
3362 void
3363 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3365 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3366 machine_mode mode;
3367 unsigned int i, num_ops;
3368 rtx x;
3370 mode = GET_MODE (dest);
3371 num_ops = mips_build_integer (codes, value);
3373 /* Apply each binary operation to X. Invariant: X is a legitimate
3374 source operand for a SET pattern. */
3375 x = GEN_INT (codes[0].value);
3376 for (i = 1; i < num_ops; i++)
3378 if (!can_create_pseudo_p ())
3380 emit_insn (gen_rtx_SET (VOIDmode, temp, x));
3381 x = temp;
3383 else
3384 x = force_reg (mode, x);
3385 x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3388 emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3391 /* Subroutine of mips_legitimize_move. Move constant SRC into register
3392 DEST given that SRC satisfies immediate_operand but doesn't satisfy
3393 move_operand. */
3395 static void
3396 mips_legitimize_const_move (machine_mode mode, rtx dest, rtx src)
3398 rtx base, offset;
3400 /* Split moves of big integers into smaller pieces. */
3401 if (splittable_const_int_operand (src, mode))
3403 mips_move_integer (dest, dest, INTVAL (src));
3404 return;
3407 /* Split moves of symbolic constants into high/low pairs. */
3408 if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3410 emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3411 return;
3414 /* Generate the appropriate access sequences for TLS symbols. */
3415 if (mips_tls_symbol_p (src))
3417 mips_emit_move (dest, mips_legitimize_tls_address (src));
3418 return;
3421 /* If we have (const (plus symbol offset)), and that expression cannot
3422 be forced into memory, load the symbol first and add in the offset.
3423 In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3424 forced into memory, as it usually produces better code. */
3425 split_const (src, &base, &offset);
3426 if (offset != const0_rtx
3427 && (targetm.cannot_force_const_mem (mode, src)
3428 || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3430 base = mips_force_temporary (dest, base);
3431 mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3432 return;
3435 src = force_const_mem (mode, src);
3437 /* When using explicit relocs, constant pool references are sometimes
3438 not legitimate addresses. */
3439 mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3440 mips_emit_move (dest, src);
3443 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3444 sequence that is valid. */
3446 bool
3447 mips_legitimize_move (machine_mode mode, rtx dest, rtx src)
3449 if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3451 mips_emit_move (dest, force_reg (mode, src));
3452 return true;
3455 /* We need to deal with constants that would be legitimate
3456 immediate_operands but aren't legitimate move_operands. */
3457 if (CONSTANT_P (src) && !move_operand (src, mode))
3459 mips_legitimize_const_move (mode, dest, src);
3460 set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3461 return true;
3463 return false;
3466 /* Return true if value X in context CONTEXT is a small-data address
3467 that can be rewritten as a LO_SUM. */
3469 static bool
3470 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3472 enum mips_symbol_type symbol_type;
3474 return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3475 && !mips_split_p[SYMBOL_GP_RELATIVE]
3476 && mips_symbolic_constant_p (x, context, &symbol_type)
3477 && symbol_type == SYMBOL_GP_RELATIVE);
3480 /* Return true if OP refers to small data symbols directly, not through
3481 a LO_SUM. CONTEXT is the context in which X appears. */
3483 static int
3484 mips_small_data_pattern_1 (rtx x, enum mips_symbol_context context)
3486 subrtx_var_iterator::array_type array;
3487 FOR_EACH_SUBRTX_VAR (iter, array, x, ALL)
3489 rtx x = *iter;
3491 /* Ignore things like "g" constraints in asms. We make no particular
3492 guarantee about which symbolic constants are acceptable as asm operands
3493 versus which must be forced into a GPR. */
3494 if (GET_CODE (x) == LO_SUM || GET_CODE (x) == ASM_OPERANDS)
3495 iter.skip_subrtxes ();
3496 else if (MEM_P (x))
3498 if (mips_small_data_pattern_1 (XEXP (x, 0), SYMBOL_CONTEXT_MEM))
3499 return true;
3500 iter.skip_subrtxes ();
3502 else if (mips_rewrite_small_data_p (x, context))
3503 return true;
3505 return false;
3508 /* Return true if OP refers to small data symbols directly, not through
3509 a LO_SUM. */
3511 bool
3512 mips_small_data_pattern_p (rtx op)
3514 return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA);
3517 /* Rewrite *LOC so that it refers to small data using explicit
3518 relocations. CONTEXT is the context in which *LOC appears. */
3520 static void
3521 mips_rewrite_small_data_1 (rtx *loc, enum mips_symbol_context context)
3523 subrtx_ptr_iterator::array_type array;
3524 FOR_EACH_SUBRTX_PTR (iter, array, loc, ALL)
3526 rtx *loc = *iter;
3527 if (MEM_P (*loc))
3529 mips_rewrite_small_data_1 (&XEXP (*loc, 0), SYMBOL_CONTEXT_MEM);
3530 iter.skip_subrtxes ();
3532 else if (mips_rewrite_small_data_p (*loc, context))
3534 *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3535 iter.skip_subrtxes ();
3537 else if (GET_CODE (*loc) == LO_SUM)
3538 iter.skip_subrtxes ();
3542 /* Rewrite instruction pattern PATTERN so that it refers to small data
3543 using explicit relocations. */
3546 mips_rewrite_small_data (rtx pattern)
3548 pattern = copy_insn (pattern);
3549 mips_rewrite_small_data_1 (&pattern, SYMBOL_CONTEXT_LEA);
3550 return pattern;
3553 /* The cost of loading values from the constant pool. It should be
3554 larger than the cost of any constant we want to synthesize inline. */
3555 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3557 /* Return the cost of X when used as an operand to the MIPS16 instruction
3558 that implements CODE. Return -1 if there is no such instruction, or if
3559 X is not a valid immediate operand for it. */
3561 static int
3562 mips16_constant_cost (int code, HOST_WIDE_INT x)
3564 switch (code)
3566 case ASHIFT:
3567 case ASHIFTRT:
3568 case LSHIFTRT:
3569 /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3570 other shifts are extended. The shift patterns truncate the shift
3571 count to the right size, so there are no out-of-range values. */
3572 if (IN_RANGE (x, 1, 8))
3573 return 0;
3574 return COSTS_N_INSNS (1);
3576 case PLUS:
3577 if (IN_RANGE (x, -128, 127))
3578 return 0;
3579 if (SMALL_OPERAND (x))
3580 return COSTS_N_INSNS (1);
3581 return -1;
3583 case LEU:
3584 /* Like LE, but reject the always-true case. */
3585 if (x == -1)
3586 return -1;
3587 case LE:
3588 /* We add 1 to the immediate and use SLT. */
3589 x += 1;
3590 case XOR:
3591 /* We can use CMPI for an xor with an unsigned 16-bit X. */
3592 case LT:
3593 case LTU:
3594 if (IN_RANGE (x, 0, 255))
3595 return 0;
3596 if (SMALL_OPERAND_UNSIGNED (x))
3597 return COSTS_N_INSNS (1);
3598 return -1;
3600 case EQ:
3601 case NE:
3602 /* Equality comparisons with 0 are cheap. */
3603 if (x == 0)
3604 return 0;
3605 return -1;
3607 default:
3608 return -1;
3612 /* Return true if there is a non-MIPS16 instruction that implements CODE
3613 and if that instruction accepts X as an immediate operand. */
3615 static int
3616 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3618 switch (code)
3620 case ASHIFT:
3621 case ASHIFTRT:
3622 case LSHIFTRT:
3623 /* All shift counts are truncated to a valid constant. */
3624 return true;
3626 case ROTATE:
3627 case ROTATERT:
3628 /* Likewise rotates, if the target supports rotates at all. */
3629 return ISA_HAS_ROR;
3631 case AND:
3632 case IOR:
3633 case XOR:
3634 /* These instructions take 16-bit unsigned immediates. */
3635 return SMALL_OPERAND_UNSIGNED (x);
3637 case PLUS:
3638 case LT:
3639 case LTU:
3640 /* These instructions take 16-bit signed immediates. */
3641 return SMALL_OPERAND (x);
3643 case EQ:
3644 case NE:
3645 case GT:
3646 case GTU:
3647 /* The "immediate" forms of these instructions are really
3648 implemented as comparisons with register 0. */
3649 return x == 0;
3651 case GE:
3652 case GEU:
3653 /* Likewise, meaning that the only valid immediate operand is 1. */
3654 return x == 1;
3656 case LE:
3657 /* We add 1 to the immediate and use SLT. */
3658 return SMALL_OPERAND (x + 1);
3660 case LEU:
3661 /* Likewise SLTU, but reject the always-true case. */
3662 return SMALL_OPERAND (x + 1) && x + 1 != 0;
3664 case SIGN_EXTRACT:
3665 case ZERO_EXTRACT:
3666 /* The bit position and size are immediate operands. */
3667 return ISA_HAS_EXT_INS;
3669 default:
3670 /* By default assume that $0 can be used for 0. */
3671 return x == 0;
3675 /* Return the cost of binary operation X, given that the instruction
3676 sequence for a word-sized or smaller operation has cost SINGLE_COST
3677 and that the sequence of a double-word operation has cost DOUBLE_COST.
3678 If SPEED is true, optimize for speed otherwise optimize for size. */
3680 static int
3681 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3683 int cost;
3685 if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3686 cost = double_cost;
3687 else
3688 cost = single_cost;
3689 return (cost
3690 + set_src_cost (XEXP (x, 0), speed)
3691 + rtx_cost (XEXP (x, 1), GET_CODE (x), 1, speed));
3694 /* Return the cost of floating-point multiplications of mode MODE. */
3696 static int
3697 mips_fp_mult_cost (machine_mode mode)
3699 return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3702 /* Return the cost of floating-point divisions of mode MODE. */
3704 static int
3705 mips_fp_div_cost (machine_mode mode)
3707 return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3710 /* Return the cost of sign-extending OP to mode MODE, not including the
3711 cost of OP itself. */
3713 static int
3714 mips_sign_extend_cost (machine_mode mode, rtx op)
3716 if (MEM_P (op))
3717 /* Extended loads are as cheap as unextended ones. */
3718 return 0;
3720 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3721 /* A sign extension from SImode to DImode in 64-bit mode is free. */
3722 return 0;
3724 if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3725 /* We can use SEB or SEH. */
3726 return COSTS_N_INSNS (1);
3728 /* We need to use a shift left and a shift right. */
3729 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3732 /* Return the cost of zero-extending OP to mode MODE, not including the
3733 cost of OP itself. */
3735 static int
3736 mips_zero_extend_cost (machine_mode mode, rtx op)
3738 if (MEM_P (op))
3739 /* Extended loads are as cheap as unextended ones. */
3740 return 0;
3742 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3743 /* We need a shift left by 32 bits and a shift right by 32 bits. */
3744 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3746 if (GENERATE_MIPS16E)
3747 /* We can use ZEB or ZEH. */
3748 return COSTS_N_INSNS (1);
3750 if (TARGET_MIPS16)
3751 /* We need to load 0xff or 0xffff into a register and use AND. */
3752 return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3754 /* We can use ANDI. */
3755 return COSTS_N_INSNS (1);
3758 /* Return the cost of moving between two registers of mode MODE,
3759 assuming that the move will be in pieces of at most UNITS bytes. */
3761 static int
3762 mips_set_reg_reg_piece_cost (machine_mode mode, unsigned int units)
3764 return COSTS_N_INSNS ((GET_MODE_SIZE (mode) + units - 1) / units);
3767 /* Return the cost of moving between two registers of mode MODE. */
3769 static int
3770 mips_set_reg_reg_cost (machine_mode mode)
3772 switch (GET_MODE_CLASS (mode))
3774 case MODE_CC:
3775 return mips_set_reg_reg_piece_cost (mode, GET_MODE_SIZE (CCmode));
3777 case MODE_FLOAT:
3778 case MODE_COMPLEX_FLOAT:
3779 case MODE_VECTOR_FLOAT:
3780 if (TARGET_HARD_FLOAT)
3781 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_HWFPVALUE);
3782 /* Fall through */
3784 default:
3785 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_WORD);
3789 /* Implement TARGET_RTX_COSTS. */
3791 static bool
3792 mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
3793 int *total, bool speed)
3795 machine_mode mode = GET_MODE (x);
3796 bool float_mode_p = FLOAT_MODE_P (mode);
3797 int cost;
3798 rtx addr;
3800 /* The cost of a COMPARE is hard to define for MIPS. COMPAREs don't
3801 appear in the instruction stream, and the cost of a comparison is
3802 really the cost of the branch or scc condition. At the time of
3803 writing, GCC only uses an explicit outer COMPARE code when optabs
3804 is testing whether a constant is expensive enough to force into a
3805 register. We want optabs to pass such constants through the MIPS
3806 expanders instead, so make all constants very cheap here. */
3807 if (outer_code == COMPARE)
3809 gcc_assert (CONSTANT_P (x));
3810 *total = 0;
3811 return true;
3814 switch (code)
3816 case CONST_INT:
3817 /* Treat *clear_upper32-style ANDs as having zero cost in the
3818 second operand. The cost is entirely in the first operand.
3820 ??? This is needed because we would otherwise try to CSE
3821 the constant operand. Although that's the right thing for
3822 instructions that continue to be a register operation throughout
3823 compilation, it is disastrous for instructions that could
3824 later be converted into a memory operation. */
3825 if (TARGET_64BIT
3826 && outer_code == AND
3827 && UINTVAL (x) == 0xffffffff)
3829 *total = 0;
3830 return true;
3833 if (TARGET_MIPS16)
3835 cost = mips16_constant_cost (outer_code, INTVAL (x));
3836 if (cost >= 0)
3838 *total = cost;
3839 return true;
3842 else
3844 /* When not optimizing for size, we care more about the cost
3845 of hot code, and hot code is often in a loop. If a constant
3846 operand needs to be forced into a register, we will often be
3847 able to hoist the constant load out of the loop, so the load
3848 should not contribute to the cost. */
3849 if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3851 *total = 0;
3852 return true;
3855 /* Fall through. */
3857 case CONST:
3858 case SYMBOL_REF:
3859 case LABEL_REF:
3860 case CONST_DOUBLE:
3861 if (force_to_mem_operand (x, VOIDmode))
3863 *total = COSTS_N_INSNS (1);
3864 return true;
3866 cost = mips_const_insns (x);
3867 if (cost > 0)
3869 /* If the constant is likely to be stored in a GPR, SETs of
3870 single-insn constants are as cheap as register sets; we
3871 never want to CSE them.
3873 Don't reduce the cost of storing a floating-point zero in
3874 FPRs. If we have a zero in an FPR for other reasons, we
3875 can get better cfg-cleanup and delayed-branch results by
3876 using it consistently, rather than using $0 sometimes and
3877 an FPR at other times. Also, moves between floating-point
3878 registers are sometimes cheaper than (D)MTC1 $0. */
3879 if (cost == 1
3880 && outer_code == SET
3881 && !(float_mode_p && TARGET_HARD_FLOAT))
3882 cost = 0;
3883 /* When non-MIPS16 code loads a constant N>1 times, we rarely
3884 want to CSE the constant itself. It is usually better to
3885 have N copies of the last operation in the sequence and one
3886 shared copy of the other operations. (Note that this is
3887 not true for MIPS16 code, where the final operation in the
3888 sequence is often an extended instruction.)
3890 Also, if we have a CONST_INT, we don't know whether it is
3891 for a word or doubleword operation, so we cannot rely on
3892 the result of mips_build_integer. */
3893 else if (!TARGET_MIPS16
3894 && (outer_code == SET || mode == VOIDmode))
3895 cost = 1;
3896 *total = COSTS_N_INSNS (cost);
3897 return true;
3899 /* The value will need to be fetched from the constant pool. */
3900 *total = CONSTANT_POOL_COST;
3901 return true;
3903 case MEM:
3904 /* If the address is legitimate, return the number of
3905 instructions it needs. */
3906 addr = XEXP (x, 0);
3907 cost = mips_address_insns (addr, mode, true);
3908 if (cost > 0)
3910 *total = COSTS_N_INSNS (cost + 1);
3911 return true;
3913 /* Check for a scaled indexed address. */
3914 if (mips_lwxs_address_p (addr)
3915 || mips_lx_address_p (addr, mode))
3917 *total = COSTS_N_INSNS (2);
3918 return true;
3920 /* Otherwise use the default handling. */
3921 return false;
3923 case FFS:
3924 *total = COSTS_N_INSNS (6);
3925 return false;
3927 case NOT:
3928 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3929 return false;
3931 case AND:
3932 /* Check for a *clear_upper32 pattern and treat it like a zero
3933 extension. See the pattern's comment for details. */
3934 if (TARGET_64BIT
3935 && mode == DImode
3936 && CONST_INT_P (XEXP (x, 1))
3937 && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3939 *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3940 + set_src_cost (XEXP (x, 0), speed));
3941 return true;
3943 if (ISA_HAS_CINS && CONST_INT_P (XEXP (x, 1)))
3945 rtx op = XEXP (x, 0);
3946 if (GET_CODE (op) == ASHIFT
3947 && CONST_INT_P (XEXP (op, 1))
3948 && mask_low_and_shift_p (mode, XEXP (x, 1), XEXP (op, 1), 32))
3950 *total = COSTS_N_INSNS (1) + set_src_cost (XEXP (op, 0), speed);
3951 return true;
3954 /* (AND (NOT op0) (NOT op1) is a nor operation that can be done in
3955 a single instruction. */
3956 if (!TARGET_MIPS16
3957 && GET_CODE (XEXP (x, 0)) == NOT
3958 && GET_CODE (XEXP (x, 1)) == NOT)
3960 cost = GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1;
3961 *total = (COSTS_N_INSNS (cost)
3962 + set_src_cost (XEXP (XEXP (x, 0), 0), speed)
3963 + set_src_cost (XEXP (XEXP (x, 1), 0), speed));
3964 return true;
3967 /* Fall through. */
3969 case IOR:
3970 case XOR:
3971 /* Double-word operations use two single-word operations. */
3972 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3973 speed);
3974 return true;
3976 case ASHIFT:
3977 case ASHIFTRT:
3978 case LSHIFTRT:
3979 case ROTATE:
3980 case ROTATERT:
3981 if (CONSTANT_P (XEXP (x, 1)))
3982 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3983 speed);
3984 else
3985 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3986 speed);
3987 return true;
3989 case ABS:
3990 if (float_mode_p)
3991 *total = mips_cost->fp_add;
3992 else
3993 *total = COSTS_N_INSNS (4);
3994 return false;
3996 case LO_SUM:
3997 /* Low-part immediates need an extended MIPS16 instruction. */
3998 *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3999 + set_src_cost (XEXP (x, 0), speed));
4000 return true;
4002 case LT:
4003 case LTU:
4004 case LE:
4005 case LEU:
4006 case GT:
4007 case GTU:
4008 case GE:
4009 case GEU:
4010 case EQ:
4011 case NE:
4012 case UNORDERED:
4013 case LTGT:
4014 /* Branch comparisons have VOIDmode, so use the first operand's
4015 mode instead. */
4016 mode = GET_MODE (XEXP (x, 0));
4017 if (FLOAT_MODE_P (mode))
4019 *total = mips_cost->fp_add;
4020 return false;
4022 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
4023 speed);
4024 return true;
4026 case MINUS:
4027 if (float_mode_p
4028 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
4029 && TARGET_FUSED_MADD
4030 && !HONOR_NANS (mode)
4031 && !HONOR_SIGNED_ZEROS (mode))
4033 /* See if we can use NMADD or NMSUB. See mips.md for the
4034 associated patterns. */
4035 rtx op0 = XEXP (x, 0);
4036 rtx op1 = XEXP (x, 1);
4037 if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
4039 *total = (mips_fp_mult_cost (mode)
4040 + set_src_cost (XEXP (XEXP (op0, 0), 0), speed)
4041 + set_src_cost (XEXP (op0, 1), speed)
4042 + set_src_cost (op1, speed));
4043 return true;
4045 if (GET_CODE (op1) == MULT)
4047 *total = (mips_fp_mult_cost (mode)
4048 + set_src_cost (op0, speed)
4049 + set_src_cost (XEXP (op1, 0), speed)
4050 + set_src_cost (XEXP (op1, 1), speed));
4051 return true;
4054 /* Fall through. */
4056 case PLUS:
4057 if (float_mode_p)
4059 /* If this is part of a MADD or MSUB, treat the PLUS as
4060 being free. */
4061 if ((ISA_HAS_FP_MADD4_MSUB4 || ISA_HAS_FP_MADD3_MSUB3)
4062 && TARGET_FUSED_MADD
4063 && GET_CODE (XEXP (x, 0)) == MULT)
4064 *total = 0;
4065 else
4066 *total = mips_cost->fp_add;
4067 return false;
4070 /* Double-word operations require three single-word operations and
4071 an SLTU. The MIPS16 version then needs to move the result of
4072 the SLTU from $24 to a MIPS16 register. */
4073 *total = mips_binary_cost (x, COSTS_N_INSNS (1),
4074 COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
4075 speed);
4076 return true;
4078 case NEG:
4079 if (float_mode_p
4080 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
4081 && TARGET_FUSED_MADD
4082 && !HONOR_NANS (mode)
4083 && HONOR_SIGNED_ZEROS (mode))
4085 /* See if we can use NMADD or NMSUB. See mips.md for the
4086 associated patterns. */
4087 rtx op = XEXP (x, 0);
4088 if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
4089 && GET_CODE (XEXP (op, 0)) == MULT)
4091 *total = (mips_fp_mult_cost (mode)
4092 + set_src_cost (XEXP (XEXP (op, 0), 0), speed)
4093 + set_src_cost (XEXP (XEXP (op, 0), 1), speed)
4094 + set_src_cost (XEXP (op, 1), speed));
4095 return true;
4099 if (float_mode_p)
4100 *total = mips_cost->fp_add;
4101 else
4102 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
4103 return false;
4105 case MULT:
4106 if (float_mode_p)
4107 *total = mips_fp_mult_cost (mode);
4108 else if (mode == DImode && !TARGET_64BIT)
4109 /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
4110 where the mulsidi3 always includes an MFHI and an MFLO. */
4111 *total = (speed
4112 ? mips_cost->int_mult_si * 3 + 6
4113 : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
4114 else if (!speed)
4115 *total = COSTS_N_INSNS (ISA_HAS_MUL3 ? 1 : 2) + 1;
4116 else if (mode == DImode)
4117 *total = mips_cost->int_mult_di;
4118 else
4119 *total = mips_cost->int_mult_si;
4120 return false;
4122 case DIV:
4123 /* Check for a reciprocal. */
4124 if (float_mode_p
4125 && ISA_HAS_FP_RECIP_RSQRT (mode)
4126 && flag_unsafe_math_optimizations
4127 && XEXP (x, 0) == CONST1_RTX (mode))
4129 if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
4130 /* An rsqrt<mode>a or rsqrt<mode>b pattern. Count the
4131 division as being free. */
4132 *total = set_src_cost (XEXP (x, 1), speed);
4133 else
4134 *total = (mips_fp_div_cost (mode)
4135 + set_src_cost (XEXP (x, 1), speed));
4136 return true;
4138 /* Fall through. */
4140 case SQRT:
4141 case MOD:
4142 if (float_mode_p)
4144 *total = mips_fp_div_cost (mode);
4145 return false;
4147 /* Fall through. */
4149 case UDIV:
4150 case UMOD:
4151 if (!speed)
4153 /* It is our responsibility to make division by a power of 2
4154 as cheap as 2 register additions if we want the division
4155 expanders to be used for such operations; see the setting
4156 of sdiv_pow2_cheap in optabs.c. Using (D)DIV for MIPS16
4157 should always produce shorter code than using
4158 expand_sdiv2_pow2. */
4159 if (TARGET_MIPS16
4160 && CONST_INT_P (XEXP (x, 1))
4161 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
4163 *total = COSTS_N_INSNS (2) + set_src_cost (XEXP (x, 0), speed);
4164 return true;
4166 *total = COSTS_N_INSNS (mips_idiv_insns ());
4168 else if (mode == DImode)
4169 *total = mips_cost->int_div_di;
4170 else
4171 *total = mips_cost->int_div_si;
4172 return false;
4174 case SIGN_EXTEND:
4175 *total = mips_sign_extend_cost (mode, XEXP (x, 0));
4176 return false;
4178 case ZERO_EXTEND:
4179 if (outer_code == SET
4180 && ISA_HAS_BADDU
4181 && (GET_CODE (XEXP (x, 0)) == TRUNCATE
4182 || GET_CODE (XEXP (x, 0)) == SUBREG)
4183 && GET_MODE (XEXP (x, 0)) == QImode
4184 && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
4186 *total = set_src_cost (XEXP (XEXP (x, 0), 0), speed);
4187 return true;
4189 *total = mips_zero_extend_cost (mode, XEXP (x, 0));
4190 return false;
4192 case FLOAT:
4193 case UNSIGNED_FLOAT:
4194 case FIX:
4195 case FLOAT_EXTEND:
4196 case FLOAT_TRUNCATE:
4197 *total = mips_cost->fp_add;
4198 return false;
4200 case SET:
4201 if (register_operand (SET_DEST (x), VOIDmode)
4202 && reg_or_0_operand (SET_SRC (x), VOIDmode))
4204 *total = mips_set_reg_reg_cost (GET_MODE (SET_DEST (x)));
4205 return true;
4207 return false;
4209 default:
4210 return false;
4214 /* Implement TARGET_ADDRESS_COST. */
4216 static int
4217 mips_address_cost (rtx addr, machine_mode mode,
4218 addr_space_t as ATTRIBUTE_UNUSED,
4219 bool speed ATTRIBUTE_UNUSED)
4221 return mips_address_insns (addr, mode, false);
4224 /* Information about a single instruction in a multi-instruction
4225 asm sequence. */
4226 struct mips_multi_member {
4227 /* True if this is a label, false if it is code. */
4228 bool is_label_p;
4230 /* The output_asm_insn format of the instruction. */
4231 const char *format;
4233 /* The operands to the instruction. */
4234 rtx operands[MAX_RECOG_OPERANDS];
4236 typedef struct mips_multi_member mips_multi_member;
4238 /* The instructions that make up the current multi-insn sequence. */
4239 static vec<mips_multi_member> mips_multi_members;
4241 /* How many instructions (as opposed to labels) are in the current
4242 multi-insn sequence. */
4243 static unsigned int mips_multi_num_insns;
4245 /* Start a new multi-insn sequence. */
4247 static void
4248 mips_multi_start (void)
4250 mips_multi_members.truncate (0);
4251 mips_multi_num_insns = 0;
4254 /* Add a new, uninitialized member to the current multi-insn sequence. */
4256 static struct mips_multi_member *
4257 mips_multi_add (void)
4259 mips_multi_member empty;
4260 return mips_multi_members.safe_push (empty);
4263 /* Add a normal insn with the given asm format to the current multi-insn
4264 sequence. The other arguments are a null-terminated list of operands. */
4266 static void
4267 mips_multi_add_insn (const char *format, ...)
4269 struct mips_multi_member *member;
4270 va_list ap;
4271 unsigned int i;
4272 rtx op;
4274 member = mips_multi_add ();
4275 member->is_label_p = false;
4276 member->format = format;
4277 va_start (ap, format);
4278 i = 0;
4279 while ((op = va_arg (ap, rtx)))
4280 member->operands[i++] = op;
4281 va_end (ap);
4282 mips_multi_num_insns++;
4285 /* Add the given label definition to the current multi-insn sequence.
4286 The definition should include the colon. */
4288 static void
4289 mips_multi_add_label (const char *label)
4291 struct mips_multi_member *member;
4293 member = mips_multi_add ();
4294 member->is_label_p = true;
4295 member->format = label;
4298 /* Return the index of the last member of the current multi-insn sequence. */
4300 static unsigned int
4301 mips_multi_last_index (void)
4303 return mips_multi_members.length () - 1;
4306 /* Add a copy of an existing instruction to the current multi-insn
4307 sequence. I is the index of the instruction that should be copied. */
4309 static void
4310 mips_multi_copy_insn (unsigned int i)
4312 struct mips_multi_member *member;
4314 member = mips_multi_add ();
4315 memcpy (member, &mips_multi_members[i], sizeof (*member));
4316 gcc_assert (!member->is_label_p);
4319 /* Change the operand of an existing instruction in the current
4320 multi-insn sequence. I is the index of the instruction,
4321 OP is the index of the operand, and X is the new value. */
4323 static void
4324 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
4326 mips_multi_members[i].operands[op] = x;
4329 /* Write out the asm code for the current multi-insn sequence. */
4331 static void
4332 mips_multi_write (void)
4334 struct mips_multi_member *member;
4335 unsigned int i;
4337 FOR_EACH_VEC_ELT (mips_multi_members, i, member)
4338 if (member->is_label_p)
4339 fprintf (asm_out_file, "%s\n", member->format);
4340 else
4341 output_asm_insn (member->format, member->operands);
4344 /* Return one word of double-word value OP, taking into account the fixed
4345 endianness of certain registers. HIGH_P is true to select the high part,
4346 false to select the low part. */
4349 mips_subword (rtx op, bool high_p)
4351 unsigned int byte, offset;
4352 machine_mode mode;
4354 mode = GET_MODE (op);
4355 if (mode == VOIDmode)
4356 mode = TARGET_64BIT ? TImode : DImode;
4358 if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4359 byte = UNITS_PER_WORD;
4360 else
4361 byte = 0;
4363 if (FP_REG_RTX_P (op))
4365 /* Paired FPRs are always ordered little-endian. */
4366 offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4367 return gen_rtx_REG (word_mode, REGNO (op) + offset);
4370 if (MEM_P (op))
4371 return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4373 return simplify_gen_subreg (word_mode, op, mode, byte);
4376 /* Return true if SRC should be moved into DEST using "MULT $0, $0".
4377 SPLIT_TYPE is the condition under which moves should be split. */
4379 static bool
4380 mips_mult_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4382 return ((split_type != SPLIT_FOR_SPEED
4383 || mips_tuning_info.fast_mult_zero_zero_p)
4384 && src == const0_rtx
4385 && REG_P (dest)
4386 && GET_MODE_SIZE (GET_MODE (dest)) == 2 * UNITS_PER_WORD
4387 && (ISA_HAS_DSP_MULT
4388 ? ACC_REG_P (REGNO (dest))
4389 : MD_REG_P (REGNO (dest))));
4392 /* Return true if a move from SRC to DEST should be split into two.
4393 SPLIT_TYPE describes the split condition. */
4395 bool
4396 mips_split_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4398 /* Check whether the move can be done using some variant of MULT $0,$0. */
4399 if (mips_mult_move_p (dest, src, split_type))
4400 return false;
4402 /* FPR-to-FPR moves can be done in a single instruction, if they're
4403 allowed at all. */
4404 unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
4405 if (size == 8 && FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4406 return false;
4408 /* Check for floating-point loads and stores. */
4409 if (size == 8 && ISA_HAS_LDC1_SDC1)
4411 if (FP_REG_RTX_P (dest) && MEM_P (src))
4412 return false;
4413 if (FP_REG_RTX_P (src) && MEM_P (dest))
4414 return false;
4417 /* Otherwise split all multiword moves. */
4418 return size > UNITS_PER_WORD;
4421 /* Split a move from SRC to DEST, given that mips_split_move_p holds.
4422 SPLIT_TYPE describes the split condition. */
4424 void
4425 mips_split_move (rtx dest, rtx src, enum mips_split_type split_type)
4427 rtx low_dest;
4429 gcc_checking_assert (mips_split_move_p (dest, src, split_type));
4430 if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4432 if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4433 emit_insn (gen_move_doubleword_fprdi (dest, src));
4434 else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4435 emit_insn (gen_move_doubleword_fprdf (dest, src));
4436 else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4437 emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4438 else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4439 emit_insn (gen_move_doubleword_fprv2si (dest, src));
4440 else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4441 emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4442 else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4443 emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4444 else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4445 emit_insn (gen_move_doubleword_fprtf (dest, src));
4446 else
4447 gcc_unreachable ();
4449 else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4451 low_dest = mips_subword (dest, false);
4452 mips_emit_move (low_dest, mips_subword (src, false));
4453 if (TARGET_64BIT)
4454 emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4455 else
4456 emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4458 else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4460 mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4461 if (TARGET_64BIT)
4462 emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4463 else
4464 emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4466 else
4468 /* The operation can be split into two normal moves. Decide in
4469 which order to do them. */
4470 low_dest = mips_subword (dest, false);
4471 if (REG_P (low_dest)
4472 && reg_overlap_mentioned_p (low_dest, src))
4474 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4475 mips_emit_move (low_dest, mips_subword (src, false));
4477 else
4479 mips_emit_move (low_dest, mips_subword (src, false));
4480 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4485 /* Return the split type for instruction INSN. */
4487 static enum mips_split_type
4488 mips_insn_split_type (rtx insn)
4490 basic_block bb = BLOCK_FOR_INSN (insn);
4491 if (bb)
4493 if (optimize_bb_for_speed_p (bb))
4494 return SPLIT_FOR_SPEED;
4495 else
4496 return SPLIT_FOR_SIZE;
4498 /* Once CFG information has been removed, we should trust the optimization
4499 decisions made by previous passes and only split where necessary. */
4500 return SPLIT_IF_NECESSARY;
4503 /* Return true if a move from SRC to DEST in INSN should be split. */
4505 bool
4506 mips_split_move_insn_p (rtx dest, rtx src, rtx insn)
4508 return mips_split_move_p (dest, src, mips_insn_split_type (insn));
4511 /* Split a move from SRC to DEST in INSN, given that mips_split_move_insn_p
4512 holds. */
4514 void
4515 mips_split_move_insn (rtx dest, rtx src, rtx insn)
4517 mips_split_move (dest, src, mips_insn_split_type (insn));
4520 /* Return the appropriate instructions to move SRC into DEST. Assume
4521 that SRC is operand 1 and DEST is operand 0. */
4523 const char *
4524 mips_output_move (rtx dest, rtx src)
4526 enum rtx_code dest_code, src_code;
4527 machine_mode mode;
4528 enum mips_symbol_type symbol_type;
4529 bool dbl_p;
4531 dest_code = GET_CODE (dest);
4532 src_code = GET_CODE (src);
4533 mode = GET_MODE (dest);
4534 dbl_p = (GET_MODE_SIZE (mode) == 8);
4536 if (mips_split_move_p (dest, src, SPLIT_IF_NECESSARY))
4537 return "#";
4539 if ((src_code == REG && GP_REG_P (REGNO (src)))
4540 || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4542 if (dest_code == REG)
4544 if (GP_REG_P (REGNO (dest)))
4545 return "move\t%0,%z1";
4547 if (mips_mult_move_p (dest, src, SPLIT_IF_NECESSARY))
4549 if (ISA_HAS_DSP_MULT)
4550 return "mult\t%q0,%.,%.";
4551 else
4552 return "mult\t%.,%.";
4555 /* Moves to HI are handled by special .md insns. */
4556 if (REGNO (dest) == LO_REGNUM)
4557 return "mtlo\t%z1";
4559 if (DSP_ACC_REG_P (REGNO (dest)))
4561 static char retval[] = "mt__\t%z1,%q0";
4563 retval[2] = reg_names[REGNO (dest)][4];
4564 retval[3] = reg_names[REGNO (dest)][5];
4565 return retval;
4568 if (FP_REG_P (REGNO (dest)))
4569 return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4571 if (ALL_COP_REG_P (REGNO (dest)))
4573 static char retval[] = "dmtc_\t%z1,%0";
4575 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4576 return dbl_p ? retval : retval + 1;
4579 if (dest_code == MEM)
4580 switch (GET_MODE_SIZE (mode))
4582 case 1: return "sb\t%z1,%0";
4583 case 2: return "sh\t%z1,%0";
4584 case 4: return "sw\t%z1,%0";
4585 case 8: return "sd\t%z1,%0";
4588 if (dest_code == REG && GP_REG_P (REGNO (dest)))
4590 if (src_code == REG)
4592 /* Moves from HI are handled by special .md insns. */
4593 if (REGNO (src) == LO_REGNUM)
4595 /* When generating VR4120 or VR4130 code, we use MACC and
4596 DMACC instead of MFLO. This avoids both the normal
4597 MIPS III HI/LO hazards and the errata related to
4598 -mfix-vr4130. */
4599 if (ISA_HAS_MACCHI)
4600 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4601 return "mflo\t%0";
4604 if (DSP_ACC_REG_P (REGNO (src)))
4606 static char retval[] = "mf__\t%0,%q1";
4608 retval[2] = reg_names[REGNO (src)][4];
4609 retval[3] = reg_names[REGNO (src)][5];
4610 return retval;
4613 if (FP_REG_P (REGNO (src)))
4614 return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4616 if (ALL_COP_REG_P (REGNO (src)))
4618 static char retval[] = "dmfc_\t%0,%1";
4620 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4621 return dbl_p ? retval : retval + 1;
4625 if (src_code == MEM)
4626 switch (GET_MODE_SIZE (mode))
4628 case 1: return "lbu\t%0,%1";
4629 case 2: return "lhu\t%0,%1";
4630 case 4: return "lw\t%0,%1";
4631 case 8: return "ld\t%0,%1";
4634 if (src_code == CONST_INT)
4636 /* Don't use the X format for the operand itself, because that
4637 will give out-of-range numbers for 64-bit hosts and 32-bit
4638 targets. */
4639 if (!TARGET_MIPS16)
4640 return "li\t%0,%1\t\t\t# %X1";
4642 if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4643 return "li\t%0,%1";
4645 if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4646 return "#";
4649 if (src_code == HIGH)
4650 return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4652 if (CONST_GP_P (src))
4653 return "move\t%0,%1";
4655 if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4656 && mips_lo_relocs[symbol_type] != 0)
4658 /* A signed 16-bit constant formed by applying a relocation
4659 operator to a symbolic address. */
4660 gcc_assert (!mips_split_p[symbol_type]);
4661 return "li\t%0,%R1";
4664 if (symbolic_operand (src, VOIDmode))
4666 gcc_assert (TARGET_MIPS16
4667 ? TARGET_MIPS16_TEXT_LOADS
4668 : !TARGET_EXPLICIT_RELOCS);
4669 return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4672 if (src_code == REG && FP_REG_P (REGNO (src)))
4674 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4676 if (GET_MODE (dest) == V2SFmode)
4677 return "mov.ps\t%0,%1";
4678 else
4679 return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4682 if (dest_code == MEM)
4683 return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4685 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4687 if (src_code == MEM)
4688 return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4690 if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4692 static char retval[] = "l_c_\t%0,%1";
4694 retval[1] = (dbl_p ? 'd' : 'w');
4695 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4696 return retval;
4698 if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4700 static char retval[] = "s_c_\t%1,%0";
4702 retval[1] = (dbl_p ? 'd' : 'w');
4703 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4704 return retval;
4706 gcc_unreachable ();
4709 /* Return true if CMP1 is a suitable second operand for integer ordering
4710 test CODE. See also the *sCC patterns in mips.md. */
4712 static bool
4713 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4715 switch (code)
4717 case GT:
4718 case GTU:
4719 return reg_or_0_operand (cmp1, VOIDmode);
4721 case GE:
4722 case GEU:
4723 return !TARGET_MIPS16 && cmp1 == const1_rtx;
4725 case LT:
4726 case LTU:
4727 return arith_operand (cmp1, VOIDmode);
4729 case LE:
4730 return sle_operand (cmp1, VOIDmode);
4732 case LEU:
4733 return sleu_operand (cmp1, VOIDmode);
4735 default:
4736 gcc_unreachable ();
4740 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4741 integer ordering test *CODE, or if an equivalent combination can
4742 be formed by adjusting *CODE and *CMP1. When returning true, update
4743 *CODE and *CMP1 with the chosen code and operand, otherwise leave
4744 them alone. */
4746 static bool
4747 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4748 machine_mode mode)
4750 HOST_WIDE_INT plus_one;
4752 if (mips_int_order_operand_ok_p (*code, *cmp1))
4753 return true;
4755 if (CONST_INT_P (*cmp1))
4756 switch (*code)
4758 case LE:
4759 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4760 if (INTVAL (*cmp1) < plus_one)
4762 *code = LT;
4763 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4764 return true;
4766 break;
4768 case LEU:
4769 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4770 if (plus_one != 0)
4772 *code = LTU;
4773 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4774 return true;
4776 break;
4778 default:
4779 break;
4781 return false;
4784 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4785 in TARGET. CMP0 and TARGET are register_operands. If INVERT_PTR
4786 is nonnull, it's OK to set TARGET to the inverse of the result and
4787 flip *INVERT_PTR instead. */
4789 static void
4790 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4791 rtx target, rtx cmp0, rtx cmp1)
4793 machine_mode mode;
4795 /* First see if there is a MIPS instruction that can do this operation.
4796 If not, try doing the same for the inverse operation. If that also
4797 fails, force CMP1 into a register and try again. */
4798 mode = GET_MODE (cmp0);
4799 if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4800 mips_emit_binary (code, target, cmp0, cmp1);
4801 else
4803 enum rtx_code inv_code = reverse_condition (code);
4804 if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4806 cmp1 = force_reg (mode, cmp1);
4807 mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4809 else if (invert_ptr == 0)
4811 rtx inv_target;
4813 inv_target = mips_force_binary (GET_MODE (target),
4814 inv_code, cmp0, cmp1);
4815 mips_emit_binary (XOR, target, inv_target, const1_rtx);
4817 else
4819 *invert_ptr = !*invert_ptr;
4820 mips_emit_binary (inv_code, target, cmp0, cmp1);
4825 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4826 The register will have the same mode as CMP0. */
4828 static rtx
4829 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4831 if (cmp1 == const0_rtx)
4832 return cmp0;
4834 if (uns_arith_operand (cmp1, VOIDmode))
4835 return expand_binop (GET_MODE (cmp0), xor_optab,
4836 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4838 return expand_binop (GET_MODE (cmp0), sub_optab,
4839 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4842 /* Convert *CODE into a code that can be used in a floating-point
4843 scc instruction (C.cond.fmt). Return true if the values of
4844 the condition code registers will be inverted, with 0 indicating
4845 that the condition holds. */
4847 static bool
4848 mips_reversed_fp_cond (enum rtx_code *code)
4850 switch (*code)
4852 case NE:
4853 case LTGT:
4854 case ORDERED:
4855 *code = reverse_condition_maybe_unordered (*code);
4856 return true;
4858 default:
4859 return false;
4863 /* Allocate a floating-point condition-code register of mode MODE.
4865 These condition code registers are used for certain kinds
4866 of compound operation, such as compare and branches, vconds,
4867 and built-in functions. At expand time, their use is entirely
4868 controlled by MIPS-specific code and is entirely internal
4869 to these compound operations.
4871 We could (and did in the past) expose condition-code values
4872 as pseudo registers and leave the register allocator to pick
4873 appropriate registers. The problem is that it is not practically
4874 possible for the rtl optimizers to guarantee that no spills will
4875 be needed, even when AVOID_CCMODE_COPIES is defined. We would
4876 therefore need spill and reload sequences to handle the worst case.
4878 Although such sequences do exist, they are very expensive and are
4879 not something we'd want to use. This is especially true of CCV2 and
4880 CCV4, where all the shuffling would greatly outweigh whatever benefit
4881 the vectorization itself provides.
4883 The main benefit of having more than one condition-code register
4884 is to allow the pipelining of operations, especially those involving
4885 comparisons and conditional moves. We don't really expect the
4886 registers to be live for long periods, and certainly never want
4887 them to be live across calls.
4889 Also, there should be no penalty attached to using all the available
4890 registers. They are simply bits in the same underlying FPU control
4891 register.
4893 We therefore expose the hardware registers from the outset and use
4894 a simple round-robin allocation scheme. */
4896 static rtx
4897 mips_allocate_fcc (machine_mode mode)
4899 unsigned int regno, count;
4901 gcc_assert (TARGET_HARD_FLOAT && ISA_HAS_8CC);
4903 if (mode == CCmode)
4904 count = 1;
4905 else if (mode == CCV2mode)
4906 count = 2;
4907 else if (mode == CCV4mode)
4908 count = 4;
4909 else
4910 gcc_unreachable ();
4912 cfun->machine->next_fcc += -cfun->machine->next_fcc & (count - 1);
4913 if (cfun->machine->next_fcc > ST_REG_LAST - ST_REG_FIRST)
4914 cfun->machine->next_fcc = 0;
4915 regno = ST_REG_FIRST + cfun->machine->next_fcc;
4916 cfun->machine->next_fcc += count;
4917 return gen_rtx_REG (mode, regno);
4920 /* Convert a comparison into something that can be used in a branch or
4921 conditional move. On entry, *OP0 and *OP1 are the values being
4922 compared and *CODE is the code used to compare them.
4924 Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4925 If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4926 otherwise any standard branch condition can be used. The standard branch
4927 conditions are:
4929 - EQ or NE between two registers.
4930 - any comparison between a register and zero. */
4932 static void
4933 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4935 rtx cmp_op0 = *op0;
4936 rtx cmp_op1 = *op1;
4938 if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4940 if (!need_eq_ne_p && *op1 == const0_rtx)
4942 else if (*code == EQ || *code == NE)
4944 if (need_eq_ne_p)
4946 *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4947 *op1 = const0_rtx;
4949 else
4950 *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4952 else
4954 /* The comparison needs a separate scc instruction. Store the
4955 result of the scc in *OP0 and compare it against zero. */
4956 bool invert = false;
4957 *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4958 mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4959 *code = (invert ? EQ : NE);
4960 *op1 = const0_rtx;
4963 else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4965 *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4966 mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4967 *code = NE;
4968 *op1 = const0_rtx;
4970 else
4972 enum rtx_code cmp_code;
4974 /* Floating-point tests use a separate C.cond.fmt comparison to
4975 set a condition code register. The branch or conditional move
4976 will then compare that register against zero.
4978 Set CMP_CODE to the code of the comparison instruction and
4979 *CODE to the code that the branch or move should use. */
4980 cmp_code = *code;
4981 *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4982 *op0 = (ISA_HAS_8CC
4983 ? mips_allocate_fcc (CCmode)
4984 : gen_rtx_REG (CCmode, FPSW_REGNUM));
4985 *op1 = const0_rtx;
4986 mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4990 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4991 and OPERAND[3]. Store the result in OPERANDS[0].
4993 On 64-bit targets, the mode of the comparison and target will always be
4994 SImode, thus possibly narrower than that of the comparison's operands. */
4996 void
4997 mips_expand_scc (rtx operands[])
4999 rtx target = operands[0];
5000 enum rtx_code code = GET_CODE (operands[1]);
5001 rtx op0 = operands[2];
5002 rtx op1 = operands[3];
5004 gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
5006 if (code == EQ || code == NE)
5008 if (ISA_HAS_SEQ_SNE
5009 && reg_imm10_operand (op1, GET_MODE (op1)))
5010 mips_emit_binary (code, target, op0, op1);
5011 else
5013 rtx zie = mips_zero_if_equal (op0, op1);
5014 mips_emit_binary (code, target, zie, const0_rtx);
5017 else
5018 mips_emit_int_order_test (code, 0, target, op0, op1);
5021 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
5022 CODE and jump to OPERANDS[3] if the condition holds. */
5024 void
5025 mips_expand_conditional_branch (rtx *operands)
5027 enum rtx_code code = GET_CODE (operands[0]);
5028 rtx op0 = operands[1];
5029 rtx op1 = operands[2];
5030 rtx condition;
5032 mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
5033 condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
5034 emit_jump_insn (gen_condjump (condition, operands[3]));
5037 /* Implement:
5039 (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
5040 (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS)) */
5042 void
5043 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
5044 enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
5046 rtx cmp_result;
5047 bool reversed_p;
5049 reversed_p = mips_reversed_fp_cond (&cond);
5050 cmp_result = mips_allocate_fcc (CCV2mode);
5051 emit_insn (gen_scc_ps (cmp_result,
5052 gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
5053 if (reversed_p)
5054 emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
5055 cmp_result));
5056 else
5057 emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
5058 cmp_result));
5061 /* Perform the comparison in OPERANDS[1]. Move OPERANDS[2] into OPERANDS[0]
5062 if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0]. */
5064 void
5065 mips_expand_conditional_move (rtx *operands)
5067 rtx cond;
5068 enum rtx_code code = GET_CODE (operands[1]);
5069 rtx op0 = XEXP (operands[1], 0);
5070 rtx op1 = XEXP (operands[1], 1);
5072 mips_emit_compare (&code, &op0, &op1, true);
5073 cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
5074 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
5075 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
5076 operands[2], operands[3])));
5079 /* Perform the comparison in COMPARISON, then trap if the condition holds. */
5081 void
5082 mips_expand_conditional_trap (rtx comparison)
5084 rtx op0, op1;
5085 machine_mode mode;
5086 enum rtx_code code;
5088 /* MIPS conditional trap instructions don't have GT or LE flavors,
5089 so we must swap the operands and convert to LT and GE respectively. */
5090 code = GET_CODE (comparison);
5091 switch (code)
5093 case GT:
5094 case LE:
5095 case GTU:
5096 case LEU:
5097 code = swap_condition (code);
5098 op0 = XEXP (comparison, 1);
5099 op1 = XEXP (comparison, 0);
5100 break;
5102 default:
5103 op0 = XEXP (comparison, 0);
5104 op1 = XEXP (comparison, 1);
5105 break;
5108 mode = GET_MODE (XEXP (comparison, 0));
5109 op0 = force_reg (mode, op0);
5110 if (!arith_operand (op1, mode))
5111 op1 = force_reg (mode, op1);
5113 emit_insn (gen_rtx_TRAP_IF (VOIDmode,
5114 gen_rtx_fmt_ee (code, mode, op0, op1),
5115 const0_rtx));
5118 /* Initialize *CUM for a call to a function of type FNTYPE. */
5120 void
5121 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
5123 memset (cum, 0, sizeof (*cum));
5124 cum->prototype = (fntype && prototype_p (fntype));
5125 cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
5128 /* Fill INFO with information about a single argument. CUM is the
5129 cumulative state for earlier arguments. MODE is the mode of this
5130 argument and TYPE is its type (if known). NAMED is true if this
5131 is a named (fixed) argument rather than a variable one. */
5133 static void
5134 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
5135 machine_mode mode, const_tree type, bool named)
5137 bool doubleword_aligned_p;
5138 unsigned int num_bytes, num_words, max_regs;
5140 /* Work out the size of the argument. */
5141 num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5142 num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5144 /* Decide whether it should go in a floating-point register, assuming
5145 one is free. Later code checks for availability.
5147 The checks against UNITS_PER_FPVALUE handle the soft-float and
5148 single-float cases. */
5149 switch (mips_abi)
5151 case ABI_EABI:
5152 /* The EABI conventions have traditionally been defined in terms
5153 of TYPE_MODE, regardless of the actual type. */
5154 info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
5155 || mode == V2SFmode)
5156 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5157 break;
5159 case ABI_32:
5160 case ABI_O64:
5161 /* Only leading floating-point scalars are passed in
5162 floating-point registers. We also handle vector floats the same
5163 say, which is OK because they are not covered by the standard ABI. */
5164 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5165 info->fpr_p = (!cum->gp_reg_found
5166 && cum->arg_number < 2
5167 && (type == 0
5168 || SCALAR_FLOAT_TYPE_P (type)
5169 || VECTOR_FLOAT_TYPE_P (type))
5170 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5171 || mode == V2SFmode)
5172 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5173 break;
5175 case ABI_N32:
5176 case ABI_64:
5177 /* Scalar, complex and vector floating-point types are passed in
5178 floating-point registers, as long as this is a named rather
5179 than a variable argument. */
5180 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5181 info->fpr_p = (named
5182 && (type == 0 || FLOAT_TYPE_P (type))
5183 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5184 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5185 || mode == V2SFmode)
5186 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
5188 /* ??? According to the ABI documentation, the real and imaginary
5189 parts of complex floats should be passed in individual registers.
5190 The real and imaginary parts of stack arguments are supposed
5191 to be contiguous and there should be an extra word of padding
5192 at the end.
5194 This has two problems. First, it makes it impossible to use a
5195 single "void *" va_list type, since register and stack arguments
5196 are passed differently. (At the time of writing, MIPSpro cannot
5197 handle complex float varargs correctly.) Second, it's unclear
5198 what should happen when there is only one register free.
5200 For now, we assume that named complex floats should go into FPRs
5201 if there are two FPRs free, otherwise they should be passed in the
5202 same way as a struct containing two floats. */
5203 if (info->fpr_p
5204 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5205 && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
5207 if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
5208 info->fpr_p = false;
5209 else
5210 num_words = 2;
5212 break;
5214 default:
5215 gcc_unreachable ();
5218 /* See whether the argument has doubleword alignment. */
5219 doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
5220 > BITS_PER_WORD);
5222 /* Set REG_OFFSET to the register count we're interested in.
5223 The EABI allocates the floating-point registers separately,
5224 but the other ABIs allocate them like integer registers. */
5225 info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
5226 ? cum->num_fprs
5227 : cum->num_gprs);
5229 /* Advance to an even register if the argument is doubleword-aligned. */
5230 if (doubleword_aligned_p)
5231 info->reg_offset += info->reg_offset & 1;
5233 /* Work out the offset of a stack argument. */
5234 info->stack_offset = cum->stack_words;
5235 if (doubleword_aligned_p)
5236 info->stack_offset += info->stack_offset & 1;
5238 max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
5240 /* Partition the argument between registers and stack. */
5241 info->reg_words = MIN (num_words, max_regs);
5242 info->stack_words = num_words - info->reg_words;
5245 /* INFO describes a register argument that has the normal format for the
5246 argument's mode. Return the register it uses, assuming that FPRs are
5247 available if HARD_FLOAT_P. */
5249 static unsigned int
5250 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
5252 if (!info->fpr_p || !hard_float_p)
5253 return GP_ARG_FIRST + info->reg_offset;
5254 else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
5255 /* In o32, the second argument is always passed in $f14
5256 for TARGET_DOUBLE_FLOAT, regardless of whether the
5257 first argument was a word or doubleword. */
5258 return FP_ARG_FIRST + 2;
5259 else
5260 return FP_ARG_FIRST + info->reg_offset;
5263 /* Implement TARGET_STRICT_ARGUMENT_NAMING. */
5265 static bool
5266 mips_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
5268 return !TARGET_OLDABI;
5271 /* Implement TARGET_FUNCTION_ARG. */
5273 static rtx
5274 mips_function_arg (cumulative_args_t cum_v, machine_mode mode,
5275 const_tree type, bool named)
5277 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5278 struct mips_arg_info info;
5280 /* We will be called with a mode of VOIDmode after the last argument
5281 has been seen. Whatever we return will be passed to the call expander.
5282 If we need a MIPS16 fp_code, return a REG with the code stored as
5283 the mode. */
5284 if (mode == VOIDmode)
5286 if (TARGET_MIPS16 && cum->fp_code != 0)
5287 return gen_rtx_REG ((machine_mode) cum->fp_code, 0);
5288 else
5289 return NULL;
5292 mips_get_arg_info (&info, cum, mode, type, named);
5294 /* Return straight away if the whole argument is passed on the stack. */
5295 if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
5296 return NULL;
5298 /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
5299 contains a double in its entirety, then that 64-bit chunk is passed
5300 in a floating-point register. */
5301 if (TARGET_NEWABI
5302 && TARGET_HARD_FLOAT
5303 && named
5304 && type != 0
5305 && TREE_CODE (type) == RECORD_TYPE
5306 && TYPE_SIZE_UNIT (type)
5307 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
5309 tree field;
5311 /* First check to see if there is any such field. */
5312 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5313 if (TREE_CODE (field) == FIELD_DECL
5314 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5315 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
5316 && tree_fits_shwi_p (bit_position (field))
5317 && int_bit_position (field) % BITS_PER_WORD == 0)
5318 break;
5320 if (field != 0)
5322 /* Now handle the special case by returning a PARALLEL
5323 indicating where each 64-bit chunk goes. INFO.REG_WORDS
5324 chunks are passed in registers. */
5325 unsigned int i;
5326 HOST_WIDE_INT bitpos;
5327 rtx ret;
5329 /* assign_parms checks the mode of ENTRY_PARM, so we must
5330 use the actual mode here. */
5331 ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
5333 bitpos = 0;
5334 field = TYPE_FIELDS (type);
5335 for (i = 0; i < info.reg_words; i++)
5337 rtx reg;
5339 for (; field; field = DECL_CHAIN (field))
5340 if (TREE_CODE (field) == FIELD_DECL
5341 && int_bit_position (field) >= bitpos)
5342 break;
5344 if (field
5345 && int_bit_position (field) == bitpos
5346 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5347 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
5348 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
5349 else
5350 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
5352 XVECEXP (ret, 0, i)
5353 = gen_rtx_EXPR_LIST (VOIDmode, reg,
5354 GEN_INT (bitpos / BITS_PER_UNIT));
5356 bitpos += BITS_PER_WORD;
5358 return ret;
5362 /* Handle the n32/n64 conventions for passing complex floating-point
5363 arguments in FPR pairs. The real part goes in the lower register
5364 and the imaginary part goes in the upper register. */
5365 if (TARGET_NEWABI
5366 && info.fpr_p
5367 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5369 rtx real, imag;
5370 machine_mode inner;
5371 unsigned int regno;
5373 inner = GET_MODE_INNER (mode);
5374 regno = FP_ARG_FIRST + info.reg_offset;
5375 if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
5377 /* Real part in registers, imaginary part on stack. */
5378 gcc_assert (info.stack_words == info.reg_words);
5379 return gen_rtx_REG (inner, regno);
5381 else
5383 gcc_assert (info.stack_words == 0);
5384 real = gen_rtx_EXPR_LIST (VOIDmode,
5385 gen_rtx_REG (inner, regno),
5386 const0_rtx);
5387 imag = gen_rtx_EXPR_LIST (VOIDmode,
5388 gen_rtx_REG (inner,
5389 regno + info.reg_words / 2),
5390 GEN_INT (GET_MODE_SIZE (inner)));
5391 return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
5395 return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
5398 /* Implement TARGET_FUNCTION_ARG_ADVANCE. */
5400 static void
5401 mips_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
5402 const_tree type, bool named)
5404 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5405 struct mips_arg_info info;
5407 mips_get_arg_info (&info, cum, mode, type, named);
5409 if (!info.fpr_p)
5410 cum->gp_reg_found = true;
5412 /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
5413 an explanation of what this code does. It assumes that we're using
5414 either the o32 or the o64 ABI, both of which pass at most 2 arguments
5415 in FPRs. */
5416 if (cum->arg_number < 2 && info.fpr_p)
5417 cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
5419 /* Advance the register count. This has the effect of setting
5420 num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
5421 argument required us to skip the final GPR and pass the whole
5422 argument on the stack. */
5423 if (mips_abi != ABI_EABI || !info.fpr_p)
5424 cum->num_gprs = info.reg_offset + info.reg_words;
5425 else if (info.reg_words > 0)
5426 cum->num_fprs += MAX_FPRS_PER_FMT;
5428 /* Advance the stack word count. */
5429 if (info.stack_words > 0)
5430 cum->stack_words = info.stack_offset + info.stack_words;
5432 cum->arg_number++;
5435 /* Implement TARGET_ARG_PARTIAL_BYTES. */
5437 static int
5438 mips_arg_partial_bytes (cumulative_args_t cum,
5439 machine_mode mode, tree type, bool named)
5441 struct mips_arg_info info;
5443 mips_get_arg_info (&info, get_cumulative_args (cum), mode, type, named);
5444 return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
5447 /* Implement TARGET_FUNCTION_ARG_BOUNDARY. Every parameter gets at
5448 least PARM_BOUNDARY bits of alignment, but will be given anything up
5449 to STACK_BOUNDARY bits if the type requires it. */
5451 static unsigned int
5452 mips_function_arg_boundary (machine_mode mode, const_tree type)
5454 unsigned int alignment;
5456 alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5457 if (alignment < PARM_BOUNDARY)
5458 alignment = PARM_BOUNDARY;
5459 if (alignment > STACK_BOUNDARY)
5460 alignment = STACK_BOUNDARY;
5461 return alignment;
5464 /* Implement TARGET_GET_RAW_RESULT_MODE and TARGET_GET_RAW_ARG_MODE. */
5466 static machine_mode
5467 mips_get_reg_raw_mode (int regno)
5469 if (TARGET_FLOATXX && FP_REG_P (regno))
5470 return DFmode;
5471 return default_get_reg_raw_mode (regno);
5474 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5475 upward rather than downward. In other words, return true if the
5476 first byte of the stack slot has useful data, false if the last
5477 byte does. */
5479 bool
5480 mips_pad_arg_upward (machine_mode mode, const_tree type)
5482 /* On little-endian targets, the first byte of every stack argument
5483 is passed in the first byte of the stack slot. */
5484 if (!BYTES_BIG_ENDIAN)
5485 return true;
5487 /* Otherwise, integral types are padded downward: the last byte of a
5488 stack argument is passed in the last byte of the stack slot. */
5489 if (type != 0
5490 ? (INTEGRAL_TYPE_P (type)
5491 || POINTER_TYPE_P (type)
5492 || FIXED_POINT_TYPE_P (type))
5493 : (SCALAR_INT_MODE_P (mode)
5494 || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5495 return false;
5497 /* Big-endian o64 pads floating-point arguments downward. */
5498 if (mips_abi == ABI_O64)
5499 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5500 return false;
5502 /* Other types are padded upward for o32, o64, n32 and n64. */
5503 if (mips_abi != ABI_EABI)
5504 return true;
5506 /* Arguments smaller than a stack slot are padded downward. */
5507 if (mode != BLKmode)
5508 return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5509 else
5510 return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5513 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...). Return !BYTES_BIG_ENDIAN
5514 if the least significant byte of the register has useful data. Return
5515 the opposite if the most significant byte does. */
5517 bool
5518 mips_pad_reg_upward (machine_mode mode, tree type)
5520 /* No shifting is required for floating-point arguments. */
5521 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5522 return !BYTES_BIG_ENDIAN;
5524 /* Otherwise, apply the same padding to register arguments as we do
5525 to stack arguments. */
5526 return mips_pad_arg_upward (mode, type);
5529 /* Return nonzero when an argument must be passed by reference. */
5531 static bool
5532 mips_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
5533 machine_mode mode, const_tree type,
5534 bool named ATTRIBUTE_UNUSED)
5536 if (mips_abi == ABI_EABI)
5538 int size;
5540 /* ??? How should SCmode be handled? */
5541 if (mode == DImode || mode == DFmode
5542 || mode == DQmode || mode == UDQmode
5543 || mode == DAmode || mode == UDAmode)
5544 return 0;
5546 size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5547 return size == -1 || size > UNITS_PER_WORD;
5549 else
5551 /* If we have a variable-sized parameter, we have no choice. */
5552 return targetm.calls.must_pass_in_stack (mode, type);
5556 /* Implement TARGET_CALLEE_COPIES. */
5558 static bool
5559 mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED,
5560 machine_mode mode ATTRIBUTE_UNUSED,
5561 const_tree type ATTRIBUTE_UNUSED, bool named)
5563 return mips_abi == ABI_EABI && named;
5566 /* See whether VALTYPE is a record whose fields should be returned in
5567 floating-point registers. If so, return the number of fields and
5568 list them in FIELDS (which should have two elements). Return 0
5569 otherwise.
5571 For n32 & n64, a structure with one or two fields is returned in
5572 floating-point registers as long as every field has a floating-point
5573 type. */
5575 static int
5576 mips_fpr_return_fields (const_tree valtype, tree *fields)
5578 tree field;
5579 int i;
5581 if (!TARGET_NEWABI)
5582 return 0;
5584 if (TREE_CODE (valtype) != RECORD_TYPE)
5585 return 0;
5587 i = 0;
5588 for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5590 if (TREE_CODE (field) != FIELD_DECL)
5591 continue;
5593 if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5594 return 0;
5596 if (i == 2)
5597 return 0;
5599 fields[i++] = field;
5601 return i;
5604 /* Implement TARGET_RETURN_IN_MSB. For n32 & n64, we should return
5605 a value in the most significant part of $2/$3 if:
5607 - the target is big-endian;
5609 - the value has a structure or union type (we generalize this to
5610 cover aggregates from other languages too); and
5612 - the structure is not returned in floating-point registers. */
5614 static bool
5615 mips_return_in_msb (const_tree valtype)
5617 tree fields[2];
5619 return (TARGET_NEWABI
5620 && TARGET_BIG_ENDIAN
5621 && AGGREGATE_TYPE_P (valtype)
5622 && mips_fpr_return_fields (valtype, fields) == 0);
5625 /* Return true if the function return value MODE will get returned in a
5626 floating-point register. */
5628 static bool
5629 mips_return_mode_in_fpr_p (machine_mode mode)
5631 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5632 return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5633 || mode == V2SFmode
5634 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5635 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5638 /* Return the representation of an FPR return register when the
5639 value being returned in FP_RETURN has mode VALUE_MODE and the
5640 return type itself has mode TYPE_MODE. On NewABI targets,
5641 the two modes may be different for structures like:
5643 struct __attribute__((packed)) foo { float f; }
5645 where we return the SFmode value of "f" in FP_RETURN, but where
5646 the structure itself has mode BLKmode. */
5648 static rtx
5649 mips_return_fpr_single (machine_mode type_mode,
5650 machine_mode value_mode)
5652 rtx x;
5654 x = gen_rtx_REG (value_mode, FP_RETURN);
5655 if (type_mode != value_mode)
5657 x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5658 x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5660 return x;
5663 /* Return a composite value in a pair of floating-point registers.
5664 MODE1 and OFFSET1 are the mode and byte offset for the first value,
5665 likewise MODE2 and OFFSET2 for the second. MODE is the mode of the
5666 complete value.
5668 For n32 & n64, $f0 always holds the first value and $f2 the second.
5669 Otherwise the values are packed together as closely as possible. */
5671 static rtx
5672 mips_return_fpr_pair (machine_mode mode,
5673 machine_mode mode1, HOST_WIDE_INT offset1,
5674 machine_mode mode2, HOST_WIDE_INT offset2)
5676 int inc;
5678 inc = (TARGET_NEWABI || mips_abi == ABI_32 ? 2 : MAX_FPRS_PER_FMT);
5679 return gen_rtx_PARALLEL
5680 (mode,
5681 gen_rtvec (2,
5682 gen_rtx_EXPR_LIST (VOIDmode,
5683 gen_rtx_REG (mode1, FP_RETURN),
5684 GEN_INT (offset1)),
5685 gen_rtx_EXPR_LIST (VOIDmode,
5686 gen_rtx_REG (mode2, FP_RETURN + inc),
5687 GEN_INT (offset2))));
5691 /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5692 For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5693 For libcalls, VALTYPE is null and MODE is the mode of the return value. */
5695 static rtx
5696 mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5697 machine_mode mode)
5699 if (valtype)
5701 tree fields[2];
5702 int unsigned_p;
5703 const_tree func;
5705 if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5706 func = fn_decl_or_type;
5707 else
5708 func = NULL;
5710 mode = TYPE_MODE (valtype);
5711 unsigned_p = TYPE_UNSIGNED (valtype);
5713 /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5714 return values, promote the mode here too. */
5715 mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5717 /* Handle structures whose fields are returned in $f0/$f2. */
5718 switch (mips_fpr_return_fields (valtype, fields))
5720 case 1:
5721 return mips_return_fpr_single (mode,
5722 TYPE_MODE (TREE_TYPE (fields[0])));
5724 case 2:
5725 return mips_return_fpr_pair (mode,
5726 TYPE_MODE (TREE_TYPE (fields[0])),
5727 int_byte_position (fields[0]),
5728 TYPE_MODE (TREE_TYPE (fields[1])),
5729 int_byte_position (fields[1]));
5732 /* If a value is passed in the most significant part of a register, see
5733 whether we have to round the mode up to a whole number of words. */
5734 if (mips_return_in_msb (valtype))
5736 HOST_WIDE_INT size = int_size_in_bytes (valtype);
5737 if (size % UNITS_PER_WORD != 0)
5739 size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5740 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5744 /* For EABI, the class of return register depends entirely on MODE.
5745 For example, "struct { some_type x; }" and "union { some_type x; }"
5746 are returned in the same way as a bare "some_type" would be.
5747 Other ABIs only use FPRs for scalar, complex or vector types. */
5748 if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5749 return gen_rtx_REG (mode, GP_RETURN);
5752 if (!TARGET_MIPS16)
5754 /* Handle long doubles for n32 & n64. */
5755 if (mode == TFmode)
5756 return mips_return_fpr_pair (mode,
5757 DImode, 0,
5758 DImode, GET_MODE_SIZE (mode) / 2);
5760 if (mips_return_mode_in_fpr_p (mode))
5762 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5763 return mips_return_fpr_pair (mode,
5764 GET_MODE_INNER (mode), 0,
5765 GET_MODE_INNER (mode),
5766 GET_MODE_SIZE (mode) / 2);
5767 else
5768 return gen_rtx_REG (mode, FP_RETURN);
5772 return gen_rtx_REG (mode, GP_RETURN);
5775 /* Implement TARGET_FUNCTION_VALUE. */
5777 static rtx
5778 mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5779 bool outgoing ATTRIBUTE_UNUSED)
5781 return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5784 /* Implement TARGET_LIBCALL_VALUE. */
5786 static rtx
5787 mips_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5789 return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5792 /* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5794 On the MIPS, R2 R3 and F0 F2 are the only register thus used. */
5796 static bool
5797 mips_function_value_regno_p (const unsigned int regno)
5799 /* Most types only require one GPR or one FPR for return values but for
5800 hard-float two FPRs can be used for _Complex types (for all ABIs)
5801 and long doubles (for n64). */
5802 if (regno == GP_RETURN
5803 || regno == FP_RETURN
5804 || (FP_RETURN != GP_RETURN
5805 && regno == FP_RETURN + 2))
5806 return true;
5808 /* For o32 FP32, _Complex double will be returned in four 32-bit registers.
5809 This does not apply to o32 FPXX as floating-point function argument and
5810 return registers are described as 64-bit even though floating-point
5811 registers are primarily described as 32-bit internally.
5812 See: mips_get_reg_raw_mode. */
5813 if ((mips_abi == ABI_32 && TARGET_FLOAT32)
5814 && FP_RETURN != GP_RETURN
5815 && (regno == FP_RETURN + 1
5816 || regno == FP_RETURN + 3))
5817 return true;
5819 return false;
5822 /* Implement TARGET_RETURN_IN_MEMORY. Under the o32 and o64 ABIs,
5823 all BLKmode objects are returned in memory. Under the n32, n64
5824 and embedded ABIs, small structures are returned in a register.
5825 Objects with varying size must still be returned in memory, of
5826 course. */
5828 static bool
5829 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5831 return (TARGET_OLDABI
5832 ? TYPE_MODE (type) == BLKmode
5833 : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5836 /* Implement TARGET_SETUP_INCOMING_VARARGS. */
5838 static void
5839 mips_setup_incoming_varargs (cumulative_args_t cum, machine_mode mode,
5840 tree type, int *pretend_size ATTRIBUTE_UNUSED,
5841 int no_rtl)
5843 CUMULATIVE_ARGS local_cum;
5844 int gp_saved, fp_saved;
5846 /* The caller has advanced CUM up to, but not beyond, the last named
5847 argument. Advance a local copy of CUM past the last "real" named
5848 argument, to find out how many registers are left over. */
5849 local_cum = *get_cumulative_args (cum);
5850 mips_function_arg_advance (pack_cumulative_args (&local_cum), mode, type,
5851 true);
5853 /* Found out how many registers we need to save. */
5854 gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5855 fp_saved = (EABI_FLOAT_VARARGS_P
5856 ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5857 : 0);
5859 if (!no_rtl)
5861 if (gp_saved > 0)
5863 rtx ptr, mem;
5865 ptr = plus_constant (Pmode, virtual_incoming_args_rtx,
5866 REG_PARM_STACK_SPACE (cfun->decl)
5867 - gp_saved * UNITS_PER_WORD);
5868 mem = gen_frame_mem (BLKmode, ptr);
5869 set_mem_alias_set (mem, get_varargs_alias_set ());
5871 move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5872 mem, gp_saved);
5874 if (fp_saved > 0)
5876 /* We can't use move_block_from_reg, because it will use
5877 the wrong mode. */
5878 machine_mode mode;
5879 int off, i;
5881 /* Set OFF to the offset from virtual_incoming_args_rtx of
5882 the first float register. The FP save area lies below
5883 the integer one, and is aligned to UNITS_PER_FPVALUE bytes. */
5884 off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5885 off -= fp_saved * UNITS_PER_FPREG;
5887 mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5889 for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5890 i += MAX_FPRS_PER_FMT)
5892 rtx ptr, mem;
5894 ptr = plus_constant (Pmode, virtual_incoming_args_rtx, off);
5895 mem = gen_frame_mem (mode, ptr);
5896 set_mem_alias_set (mem, get_varargs_alias_set ());
5897 mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5898 off += UNITS_PER_HWFPVALUE;
5902 if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5903 cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5904 + fp_saved * UNITS_PER_FPREG);
5907 /* Implement TARGET_BUILTIN_VA_LIST. */
5909 static tree
5910 mips_build_builtin_va_list (void)
5912 if (EABI_FLOAT_VARARGS_P)
5914 /* We keep 3 pointers, and two offsets.
5916 Two pointers are to the overflow area, which starts at the CFA.
5917 One of these is constant, for addressing into the GPR save area
5918 below it. The other is advanced up the stack through the
5919 overflow region.
5921 The third pointer is to the bottom of the GPR save area.
5922 Since the FPR save area is just below it, we can address
5923 FPR slots off this pointer.
5925 We also keep two one-byte offsets, which are to be subtracted
5926 from the constant pointers to yield addresses in the GPR and
5927 FPR save areas. These are downcounted as float or non-float
5928 arguments are used, and when they get to zero, the argument
5929 must be obtained from the overflow region. */
5930 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5931 tree array, index;
5933 record = lang_hooks.types.make_type (RECORD_TYPE);
5935 f_ovfl = build_decl (BUILTINS_LOCATION,
5936 FIELD_DECL, get_identifier ("__overflow_argptr"),
5937 ptr_type_node);
5938 f_gtop = build_decl (BUILTINS_LOCATION,
5939 FIELD_DECL, get_identifier ("__gpr_top"),
5940 ptr_type_node);
5941 f_ftop = build_decl (BUILTINS_LOCATION,
5942 FIELD_DECL, get_identifier ("__fpr_top"),
5943 ptr_type_node);
5944 f_goff = build_decl (BUILTINS_LOCATION,
5945 FIELD_DECL, get_identifier ("__gpr_offset"),
5946 unsigned_char_type_node);
5947 f_foff = build_decl (BUILTINS_LOCATION,
5948 FIELD_DECL, get_identifier ("__fpr_offset"),
5949 unsigned_char_type_node);
5950 /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5951 warn on every user file. */
5952 index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5953 array = build_array_type (unsigned_char_type_node,
5954 build_index_type (index));
5955 f_res = build_decl (BUILTINS_LOCATION,
5956 FIELD_DECL, get_identifier ("__reserved"), array);
5958 DECL_FIELD_CONTEXT (f_ovfl) = record;
5959 DECL_FIELD_CONTEXT (f_gtop) = record;
5960 DECL_FIELD_CONTEXT (f_ftop) = record;
5961 DECL_FIELD_CONTEXT (f_goff) = record;
5962 DECL_FIELD_CONTEXT (f_foff) = record;
5963 DECL_FIELD_CONTEXT (f_res) = record;
5965 TYPE_FIELDS (record) = f_ovfl;
5966 DECL_CHAIN (f_ovfl) = f_gtop;
5967 DECL_CHAIN (f_gtop) = f_ftop;
5968 DECL_CHAIN (f_ftop) = f_goff;
5969 DECL_CHAIN (f_goff) = f_foff;
5970 DECL_CHAIN (f_foff) = f_res;
5972 layout_type (record);
5973 return record;
5975 else
5976 /* Otherwise, we use 'void *'. */
5977 return ptr_type_node;
5980 /* Implement TARGET_EXPAND_BUILTIN_VA_START. */
5982 static void
5983 mips_va_start (tree valist, rtx nextarg)
5985 if (EABI_FLOAT_VARARGS_P)
5987 const CUMULATIVE_ARGS *cum;
5988 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5989 tree ovfl, gtop, ftop, goff, foff;
5990 tree t;
5991 int gpr_save_area_size;
5992 int fpr_save_area_size;
5993 int fpr_offset;
5995 cum = &crtl->args.info;
5996 gpr_save_area_size
5997 = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5998 fpr_save_area_size
5999 = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
6001 f_ovfl = TYPE_FIELDS (va_list_type_node);
6002 f_gtop = DECL_CHAIN (f_ovfl);
6003 f_ftop = DECL_CHAIN (f_gtop);
6004 f_goff = DECL_CHAIN (f_ftop);
6005 f_foff = DECL_CHAIN (f_goff);
6007 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6008 NULL_TREE);
6009 gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
6010 NULL_TREE);
6011 ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
6012 NULL_TREE);
6013 goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
6014 NULL_TREE);
6015 foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
6016 NULL_TREE);
6018 /* Emit code to initialize OVFL, which points to the next varargs
6019 stack argument. CUM->STACK_WORDS gives the number of stack
6020 words used by named arguments. */
6021 t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
6022 if (cum->stack_words > 0)
6023 t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
6024 t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
6025 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6027 /* Emit code to initialize GTOP, the top of the GPR save area. */
6028 t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
6029 t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
6030 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6032 /* Emit code to initialize FTOP, the top of the FPR save area.
6033 This address is gpr_save_area_bytes below GTOP, rounded
6034 down to the next fp-aligned boundary. */
6035 t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
6036 fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
6037 fpr_offset &= -UNITS_PER_FPVALUE;
6038 if (fpr_offset)
6039 t = fold_build_pointer_plus_hwi (t, -fpr_offset);
6040 t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
6041 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6043 /* Emit code to initialize GOFF, the offset from GTOP of the
6044 next GPR argument. */
6045 t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
6046 build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
6047 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6049 /* Likewise emit code to initialize FOFF, the offset from FTOP
6050 of the next FPR argument. */
6051 t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
6052 build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
6053 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6055 else
6057 nextarg = plus_constant (Pmode, nextarg, -cfun->machine->varargs_size);
6058 std_expand_builtin_va_start (valist, nextarg);
6062 /* Like std_gimplify_va_arg_expr, but apply alignment to zero-sized
6063 types as well. */
6065 static tree
6066 mips_std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6067 gimple_seq *post_p)
6069 tree addr, t, type_size, rounded_size, valist_tmp;
6070 unsigned HOST_WIDE_INT align, boundary;
6071 bool indirect;
6073 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6074 if (indirect)
6075 type = build_pointer_type (type);
6077 align = PARM_BOUNDARY / BITS_PER_UNIT;
6078 boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
6080 /* When we align parameter on stack for caller, if the parameter
6081 alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
6082 aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee
6083 here with caller. */
6084 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
6085 boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
6087 boundary /= BITS_PER_UNIT;
6089 /* Hoist the valist value into a temporary for the moment. */
6090 valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
6092 /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
6093 requires greater alignment, we must perform dynamic alignment. */
6094 if (boundary > align)
6096 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6097 fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
6098 gimplify_and_add (t, pre_p);
6100 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6101 fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
6102 valist_tmp,
6103 build_int_cst (TREE_TYPE (valist), -boundary)));
6104 gimplify_and_add (t, pre_p);
6106 else
6107 boundary = align;
6109 /* If the actual alignment is less than the alignment of the type,
6110 adjust the type accordingly so that we don't assume strict alignment
6111 when dereferencing the pointer. */
6112 boundary *= BITS_PER_UNIT;
6113 if (boundary < TYPE_ALIGN (type))
6115 type = build_variant_type_copy (type);
6116 TYPE_ALIGN (type) = boundary;
6119 /* Compute the rounded size of the type. */
6120 type_size = size_in_bytes (type);
6121 rounded_size = round_up (type_size, align);
6123 /* Reduce rounded_size so it's sharable with the postqueue. */
6124 gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
6126 /* Get AP. */
6127 addr = valist_tmp;
6128 if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
6130 /* Small args are padded downward. */
6131 t = fold_build2_loc (input_location, GT_EXPR, sizetype,
6132 rounded_size, size_int (align));
6133 t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
6134 size_binop (MINUS_EXPR, rounded_size, type_size));
6135 addr = fold_build_pointer_plus (addr, t);
6138 /* Compute new value for AP. */
6139 t = fold_build_pointer_plus (valist_tmp, rounded_size);
6140 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
6141 gimplify_and_add (t, pre_p);
6143 addr = fold_convert (build_pointer_type (type), addr);
6145 if (indirect)
6146 addr = build_va_arg_indirect_ref (addr);
6148 return build_va_arg_indirect_ref (addr);
6151 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR. */
6153 static tree
6154 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6155 gimple_seq *post_p)
6157 tree addr;
6158 bool indirect_p;
6160 indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
6161 if (indirect_p)
6162 type = build_pointer_type (type);
6164 if (!EABI_FLOAT_VARARGS_P)
6165 addr = mips_std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6166 else
6168 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
6169 tree ovfl, top, off, align;
6170 HOST_WIDE_INT size, rsize, osize;
6171 tree t, u;
6173 f_ovfl = TYPE_FIELDS (va_list_type_node);
6174 f_gtop = DECL_CHAIN (f_ovfl);
6175 f_ftop = DECL_CHAIN (f_gtop);
6176 f_goff = DECL_CHAIN (f_ftop);
6177 f_foff = DECL_CHAIN (f_goff);
6179 /* Let:
6181 TOP be the top of the GPR or FPR save area;
6182 OFF be the offset from TOP of the next register;
6183 ADDR_RTX be the address of the argument;
6184 SIZE be the number of bytes in the argument type;
6185 RSIZE be the number of bytes used to store the argument
6186 when it's in the register save area; and
6187 OSIZE be the number of bytes used to store it when it's
6188 in the stack overflow area.
6190 The code we want is:
6192 1: off &= -rsize; // round down
6193 2: if (off != 0)
6194 3: {
6195 4: addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
6196 5: off -= rsize;
6197 6: }
6198 7: else
6199 8: {
6200 9: ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
6201 10: addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
6202 11: ovfl += osize;
6203 14: }
6205 [1] and [9] can sometimes be optimized away. */
6207 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6208 NULL_TREE);
6209 size = int_size_in_bytes (type);
6211 if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
6212 && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
6214 top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
6215 unshare_expr (valist), f_ftop, NULL_TREE);
6216 off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
6217 unshare_expr (valist), f_foff, NULL_TREE);
6219 /* When va_start saves FPR arguments to the stack, each slot
6220 takes up UNITS_PER_HWFPVALUE bytes, regardless of the
6221 argument's precision. */
6222 rsize = UNITS_PER_HWFPVALUE;
6224 /* Overflow arguments are padded to UNITS_PER_WORD bytes
6225 (= PARM_BOUNDARY bits). This can be different from RSIZE
6226 in two cases:
6228 (1) On 32-bit targets when TYPE is a structure such as:
6230 struct s { float f; };
6232 Such structures are passed in paired FPRs, so RSIZE
6233 will be 8 bytes. However, the structure only takes
6234 up 4 bytes of memory, so OSIZE will only be 4.
6236 (2) In combinations such as -mgp64 -msingle-float
6237 -fshort-double. Doubles passed in registers will then take
6238 up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
6239 stack take up UNITS_PER_WORD bytes. */
6240 osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
6242 else
6244 top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
6245 unshare_expr (valist), f_gtop, NULL_TREE);
6246 off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
6247 unshare_expr (valist), f_goff, NULL_TREE);
6248 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6249 if (rsize > UNITS_PER_WORD)
6251 /* [1] Emit code for: off &= -rsize. */
6252 t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
6253 build_int_cst (TREE_TYPE (off), -rsize));
6254 gimplify_assign (unshare_expr (off), t, pre_p);
6256 osize = rsize;
6259 /* [2] Emit code to branch if off == 0. */
6260 t = build2 (NE_EXPR, boolean_type_node, unshare_expr (off),
6261 build_int_cst (TREE_TYPE (off), 0));
6262 addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
6264 /* [5] Emit code for: off -= rsize. We do this as a form of
6265 post-decrement not available to C. */
6266 t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
6267 t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
6269 /* [4] Emit code for:
6270 addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
6271 t = fold_convert (sizetype, t);
6272 t = fold_build1 (NEGATE_EXPR, sizetype, t);
6273 t = fold_build_pointer_plus (top, t);
6274 if (BYTES_BIG_ENDIAN && rsize > size)
6275 t = fold_build_pointer_plus_hwi (t, rsize - size);
6276 COND_EXPR_THEN (addr) = t;
6278 if (osize > UNITS_PER_WORD)
6280 /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
6281 t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
6282 u = build_int_cst (TREE_TYPE (t), -osize);
6283 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
6284 align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
6285 unshare_expr (ovfl), t);
6287 else
6288 align = NULL;
6290 /* [10, 11] Emit code for:
6291 addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
6292 ovfl += osize. */
6293 u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
6294 t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
6295 if (BYTES_BIG_ENDIAN && osize > size)
6296 t = fold_build_pointer_plus_hwi (t, osize - size);
6298 /* String [9] and [10, 11] together. */
6299 if (align)
6300 t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
6301 COND_EXPR_ELSE (addr) = t;
6303 addr = fold_convert (build_pointer_type (type), addr);
6304 addr = build_va_arg_indirect_ref (addr);
6307 if (indirect_p)
6308 addr = build_va_arg_indirect_ref (addr);
6310 return addr;
6313 /* Declare a unique, locally-binding function called NAME, then start
6314 its definition. */
6316 static void
6317 mips_start_unique_function (const char *name)
6319 tree decl;
6321 decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
6322 get_identifier (name),
6323 build_function_type_list (void_type_node, NULL_TREE));
6324 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
6325 NULL_TREE, void_type_node);
6326 TREE_PUBLIC (decl) = 1;
6327 TREE_STATIC (decl) = 1;
6329 cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl));
6331 targetm.asm_out.unique_section (decl, 0);
6332 switch_to_section (get_named_section (decl, NULL, 0));
6334 targetm.asm_out.globalize_label (asm_out_file, name);
6335 fputs ("\t.hidden\t", asm_out_file);
6336 assemble_name (asm_out_file, name);
6337 putc ('\n', asm_out_file);
6340 /* Start a definition of function NAME. MIPS16_P indicates whether the
6341 function contains MIPS16 code. */
6343 static void
6344 mips_start_function_definition (const char *name, bool mips16_p)
6346 if (mips16_p)
6347 fprintf (asm_out_file, "\t.set\tmips16\n");
6348 else
6349 fprintf (asm_out_file, "\t.set\tnomips16\n");
6351 if (TARGET_MICROMIPS)
6352 fprintf (asm_out_file, "\t.set\tmicromips\n");
6353 #ifdef HAVE_GAS_MICROMIPS
6354 else
6355 fprintf (asm_out_file, "\t.set\tnomicromips\n");
6356 #endif
6358 if (!flag_inhibit_size_directive)
6360 fputs ("\t.ent\t", asm_out_file);
6361 assemble_name (asm_out_file, name);
6362 fputs ("\n", asm_out_file);
6365 ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
6367 /* Start the definition proper. */
6368 assemble_name (asm_out_file, name);
6369 fputs (":\n", asm_out_file);
6372 /* End a function definition started by mips_start_function_definition. */
6374 static void
6375 mips_end_function_definition (const char *name)
6377 if (!flag_inhibit_size_directive)
6379 fputs ("\t.end\t", asm_out_file);
6380 assemble_name (asm_out_file, name);
6381 fputs ("\n", asm_out_file);
6385 /* If *STUB_PTR points to a stub, output a comdat-style definition for it,
6386 then free *STUB_PTR. */
6388 static void
6389 mips_finish_stub (mips_one_only_stub **stub_ptr)
6391 mips_one_only_stub *stub = *stub_ptr;
6392 if (!stub)
6393 return;
6395 const char *name = stub->get_name ();
6396 mips_start_unique_function (name);
6397 mips_start_function_definition (name, false);
6398 stub->output_body ();
6399 mips_end_function_definition (name);
6400 delete stub;
6401 *stub_ptr = 0;
6404 /* Return true if calls to X can use R_MIPS_CALL* relocations. */
6406 static bool
6407 mips_ok_for_lazy_binding_p (rtx x)
6409 return (TARGET_USE_GOT
6410 && GET_CODE (x) == SYMBOL_REF
6411 && !SYMBOL_REF_BIND_NOW_P (x)
6412 && !mips_symbol_binds_local_p (x));
6415 /* Load function address ADDR into register DEST. TYPE is as for
6416 mips_expand_call. Return true if we used an explicit lazy-binding
6417 sequence. */
6419 static bool
6420 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
6422 /* If we're generating PIC, and this call is to a global function,
6423 try to allow its address to be resolved lazily. This isn't
6424 possible for sibcalls when $gp is call-saved because the value
6425 of $gp on entry to the stub would be our caller's gp, not ours. */
6426 if (TARGET_EXPLICIT_RELOCS
6427 && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
6428 && mips_ok_for_lazy_binding_p (addr))
6430 addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
6431 emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
6432 return true;
6434 else
6436 mips_emit_move (dest, addr);
6437 return false;
6441 struct local_alias_traits : default_hashmap_traits
6443 static hashval_t hash (rtx);
6444 static bool equal_keys (rtx, rtx);
6447 /* Each locally-defined hard-float MIPS16 function has a local symbol
6448 associated with it. This hash table maps the function symbol (FUNC)
6449 to the local symbol (LOCAL). */
6450 static GTY (()) hash_map<rtx, rtx, local_alias_traits> *mips16_local_aliases;
6452 /* Hash table callbacks for mips16_local_aliases. */
6454 hashval_t
6455 local_alias_traits::hash (rtx func)
6457 return htab_hash_string (XSTR (func, 0));
6460 bool
6461 local_alias_traits::equal_keys (rtx func1, rtx func2)
6463 return rtx_equal_p (func1, func2);
6466 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
6467 Return a local alias for it, creating a new one if necessary. */
6469 static rtx
6470 mips16_local_alias (rtx func)
6472 /* Create the hash table if this is the first call. */
6473 if (mips16_local_aliases == NULL)
6474 mips16_local_aliases
6475 = hash_map<rtx, rtx, local_alias_traits>::create_ggc (37);
6477 /* Look up the function symbol, creating a new entry if need be. */
6478 bool existed;
6479 rtx *slot = &mips16_local_aliases->get_or_insert (func, &existed);
6480 gcc_assert (slot != NULL);
6482 if (!existed)
6484 const char *func_name, *local_name;
6485 rtx local;
6487 /* Create a new SYMBOL_REF for the local symbol. The choice of
6488 __fn_local_* is based on the __fn_stub_* names that we've
6489 traditionally used for the non-MIPS16 stub. */
6490 func_name = targetm.strip_name_encoding (XSTR (func, 0));
6491 local_name = ACONCAT (("__fn_local_", func_name, NULL));
6492 local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
6493 SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
6495 /* Create a new structure to represent the mapping. */
6496 *slot = local;
6498 return *slot;
6501 /* A chained list of functions for which mips16_build_call_stub has already
6502 generated a stub. NAME is the name of the function and FP_RET_P is true
6503 if the function returns a value in floating-point registers. */
6504 struct mips16_stub {
6505 struct mips16_stub *next;
6506 char *name;
6507 bool fp_ret_p;
6509 static struct mips16_stub *mips16_stubs;
6511 /* Return the two-character string that identifies floating-point
6512 return mode MODE in the name of a MIPS16 function stub. */
6514 static const char *
6515 mips16_call_stub_mode_suffix (machine_mode mode)
6517 if (mode == SFmode)
6518 return "sf";
6519 else if (mode == DFmode)
6520 return "df";
6521 else if (mode == SCmode)
6522 return "sc";
6523 else if (mode == DCmode)
6524 return "dc";
6525 else if (mode == V2SFmode)
6527 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT);
6528 return "df";
6530 else
6531 gcc_unreachable ();
6534 /* Write instructions to move a 32-bit value between general register
6535 GPREG and floating-point register FPREG. DIRECTION is 't' to move
6536 from GPREG to FPREG and 'f' to move in the opposite direction. */
6538 static void
6539 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6541 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6542 reg_names[gpreg], reg_names[fpreg]);
6545 /* Likewise for 64-bit values. */
6547 static void
6548 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6550 if (TARGET_64BIT)
6551 fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
6552 reg_names[gpreg], reg_names[fpreg]);
6553 else if (ISA_HAS_MXHC1)
6555 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6556 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6557 fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
6558 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
6560 else if (TARGET_FLOATXX && direction == 't')
6562 /* Use the argument save area to move via memory. */
6563 fprintf (asm_out_file, "\tsw\t%s,0($sp)\n", reg_names[gpreg]);
6564 fprintf (asm_out_file, "\tsw\t%s,4($sp)\n", reg_names[gpreg + 1]);
6565 fprintf (asm_out_file, "\tldc1\t%s,0($sp)\n", reg_names[fpreg]);
6567 else if (TARGET_FLOATXX && direction == 'f')
6569 /* Use the argument save area to move via memory. */
6570 fprintf (asm_out_file, "\tsdc1\t%s,0($sp)\n", reg_names[fpreg]);
6571 fprintf (asm_out_file, "\tlw\t%s,0($sp)\n", reg_names[gpreg]);
6572 fprintf (asm_out_file, "\tlw\t%s,4($sp)\n", reg_names[gpreg + 1]);
6574 else
6576 /* Move the least-significant word. */
6577 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6578 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6579 /* ...then the most significant word. */
6580 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6581 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6585 /* Write out code to move floating-point arguments into or out of
6586 general registers. FP_CODE is the code describing which arguments
6587 are present (see the comment above the definition of CUMULATIVE_ARGS
6588 in mips.h). DIRECTION is as for mips_output_32bit_xfer. */
6590 static void
6591 mips_output_args_xfer (int fp_code, char direction)
6593 unsigned int gparg, fparg, f;
6594 CUMULATIVE_ARGS cum;
6596 /* This code only works for o32 and o64. */
6597 gcc_assert (TARGET_OLDABI);
6599 mips_init_cumulative_args (&cum, NULL);
6601 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6603 machine_mode mode;
6604 struct mips_arg_info info;
6606 if ((f & 3) == 1)
6607 mode = SFmode;
6608 else if ((f & 3) == 2)
6609 mode = DFmode;
6610 else
6611 gcc_unreachable ();
6613 mips_get_arg_info (&info, &cum, mode, NULL, true);
6614 gparg = mips_arg_regno (&info, false);
6615 fparg = mips_arg_regno (&info, true);
6617 if (mode == SFmode)
6618 mips_output_32bit_xfer (direction, gparg, fparg);
6619 else
6620 mips_output_64bit_xfer (direction, gparg, fparg);
6622 mips_function_arg_advance (pack_cumulative_args (&cum), mode, NULL, true);
6626 /* Write a MIPS16 stub for the current function. This stub is used
6627 for functions which take arguments in the floating-point registers.
6628 It is normal-mode code that moves the floating-point arguments
6629 into the general registers and then jumps to the MIPS16 code. */
6631 static void
6632 mips16_build_function_stub (void)
6634 const char *fnname, *alias_name, *separator;
6635 char *secname, *stubname;
6636 tree stubdecl;
6637 unsigned int f;
6638 rtx symbol, alias;
6640 /* Create the name of the stub, and its unique section. */
6641 symbol = XEXP (DECL_RTL (current_function_decl), 0);
6642 alias = mips16_local_alias (symbol);
6644 fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6645 alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6646 secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6647 stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6649 /* Build a decl for the stub. */
6650 stubdecl = build_decl (BUILTINS_LOCATION,
6651 FUNCTION_DECL, get_identifier (stubname),
6652 build_function_type_list (void_type_node, NULL_TREE));
6653 set_decl_section_name (stubdecl, secname);
6654 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6655 RESULT_DECL, NULL_TREE, void_type_node);
6657 /* Output a comment. */
6658 fprintf (asm_out_file, "\t# Stub function for %s (",
6659 current_function_name ());
6660 separator = "";
6661 for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6663 fprintf (asm_out_file, "%s%s", separator,
6664 (f & 3) == 1 ? "float" : "double");
6665 separator = ", ";
6667 fprintf (asm_out_file, ")\n");
6669 /* Start the function definition. */
6670 assemble_start_function (stubdecl, stubname);
6671 mips_start_function_definition (stubname, false);
6673 /* If generating pic2 code, either set up the global pointer or
6674 switch to pic0. */
6675 if (TARGET_ABICALLS_PIC2)
6677 if (TARGET_ABSOLUTE_ABICALLS)
6678 fprintf (asm_out_file, "\t.option\tpic0\n");
6679 else
6681 output_asm_insn ("%(.cpload\t%^%)", NULL);
6682 /* Emit an R_MIPS_NONE relocation to tell the linker what the
6683 target function is. Use a local GOT access when loading the
6684 symbol, to cut down on the number of unnecessary GOT entries
6685 for stubs that aren't needed. */
6686 output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6687 symbol = alias;
6691 /* Load the address of the MIPS16 function into $25. Do this first so
6692 that targets with coprocessor interlocks can use an MFC1 to fill the
6693 delay slot. */
6694 output_asm_insn ("la\t%^,%0", &symbol);
6696 /* Move the arguments from floating-point registers to general registers. */
6697 mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6699 /* Jump to the MIPS16 function. */
6700 output_asm_insn ("jr\t%^", NULL);
6702 if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6703 fprintf (asm_out_file, "\t.option\tpic2\n");
6705 mips_end_function_definition (stubname);
6707 /* If the linker needs to create a dynamic symbol for the target
6708 function, it will associate the symbol with the stub (which,
6709 unlike the target function, follows the proper calling conventions).
6710 It is therefore useful to have a local alias for the target function,
6711 so that it can still be identified as MIPS16 code. As an optimization,
6712 this symbol can also be used for indirect MIPS16 references from
6713 within this file. */
6714 ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6716 switch_to_section (function_section (current_function_decl));
6719 /* The current function is a MIPS16 function that returns a value in an FPR.
6720 Copy the return value from its soft-float to its hard-float location.
6721 libgcc2 has special non-MIPS16 helper functions for each case. */
6723 static void
6724 mips16_copy_fpr_return_value (void)
6726 rtx fn, insn, retval;
6727 tree return_type;
6728 machine_mode return_mode;
6729 const char *name;
6731 return_type = DECL_RESULT (current_function_decl);
6732 return_mode = DECL_MODE (return_type);
6734 name = ACONCAT (("__mips16_ret_",
6735 mips16_call_stub_mode_suffix (return_mode),
6736 NULL));
6737 fn = mips16_stub_function (name);
6739 /* The function takes arguments in $2 (and possibly $3), so calls
6740 to it cannot be lazily bound. */
6741 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6743 /* Model the call as something that takes the GPR return value as
6744 argument and returns an "updated" value. */
6745 retval = gen_rtx_REG (return_mode, GP_RETURN);
6746 insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6747 const0_rtx, NULL_RTX, false);
6748 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6751 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6752 RETVAL is the location of the return value, or null if this is
6753 a "call" rather than a "call_value". ARGS_SIZE is the size of the
6754 arguments and FP_CODE is the code built by mips_function_arg;
6755 see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6757 There are three alternatives:
6759 - If a stub was needed, emit the call and return the call insn itself.
6761 - If we can avoid using a stub by redirecting the call, set *FN_PTR
6762 to the new target and return null.
6764 - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6765 unmodified.
6767 A stub is needed for calls to functions that, in normal mode,
6768 receive arguments in FPRs or return values in FPRs. The stub
6769 copies the arguments from their soft-float positions to their
6770 hard-float positions, calls the real function, then copies the
6771 return value from its hard-float position to its soft-float
6772 position.
6774 We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6775 If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6776 automatically redirects the JAL to the stub, otherwise the JAL
6777 continues to call FN directly. */
6779 static rtx_insn *
6780 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6782 const char *fnname;
6783 bool fp_ret_p;
6784 struct mips16_stub *l;
6785 rtx_insn *insn;
6786 rtx pattern, fn;
6788 /* We don't need to do anything if we aren't in MIPS16 mode, or if
6789 we were invoked with the -msoft-float option. */
6790 if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6791 return NULL;
6793 /* Figure out whether the value might come back in a floating-point
6794 register. */
6795 fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6797 /* We don't need to do anything if there were no floating-point
6798 arguments and the value will not be returned in a floating-point
6799 register. */
6800 if (fp_code == 0 && !fp_ret_p)
6801 return NULL;
6803 /* We don't need to do anything if this is a call to a special
6804 MIPS16 support function. */
6805 fn = *fn_ptr;
6806 if (mips16_stub_function_p (fn))
6807 return NULL;
6809 /* If we're calling a locally-defined MIPS16 function, we know that
6810 it will return values in both the "soft-float" and "hard-float"
6811 registers. There is no need to use a stub to move the latter
6812 to the former. */
6813 if (fp_code == 0 && mips16_local_function_p (fn))
6814 return NULL;
6816 /* This code will only work for o32 and o64 abis. The other ABI's
6817 require more sophisticated support. */
6818 gcc_assert (TARGET_OLDABI);
6820 /* If we're calling via a function pointer, use one of the magic
6821 libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6822 Each stub expects the function address to arrive in register $2. */
6823 if (GET_CODE (fn) != SYMBOL_REF
6824 || !call_insn_operand (fn, VOIDmode))
6826 char buf[30];
6827 rtx stub_fn, addr;
6828 rtx_insn *insn;
6829 bool lazy_p;
6831 /* If this is a locally-defined and locally-binding function,
6832 avoid the stub by calling the local alias directly. */
6833 if (mips16_local_function_p (fn))
6835 *fn_ptr = mips16_local_alias (fn);
6836 return NULL;
6839 /* Create a SYMBOL_REF for the libgcc.a function. */
6840 if (fp_ret_p)
6841 sprintf (buf, "__mips16_call_stub_%s_%d",
6842 mips16_call_stub_mode_suffix (GET_MODE (retval)),
6843 fp_code);
6844 else
6845 sprintf (buf, "__mips16_call_stub_%d", fp_code);
6846 stub_fn = mips16_stub_function (buf);
6848 /* The function uses $2 as an argument, so calls to it
6849 cannot be lazily bound. */
6850 SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6852 /* Load the target function into $2. */
6853 addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6854 lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6856 /* Emit the call. */
6857 insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6858 args_size, NULL_RTX, lazy_p);
6860 /* Tell GCC that this call does indeed use the value of $2. */
6861 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6863 /* If we are handling a floating-point return value, we need to
6864 save $18 in the function prologue. Putting a note on the
6865 call will mean that df_regs_ever_live_p ($18) will be true if the
6866 call is not eliminated, and we can check that in the prologue
6867 code. */
6868 if (fp_ret_p)
6869 CALL_INSN_FUNCTION_USAGE (insn) =
6870 gen_rtx_EXPR_LIST (VOIDmode,
6871 gen_rtx_CLOBBER (VOIDmode,
6872 gen_rtx_REG (word_mode, 18)),
6873 CALL_INSN_FUNCTION_USAGE (insn));
6875 return insn;
6878 /* We know the function we are going to call. If we have already
6879 built a stub, we don't need to do anything further. */
6880 fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6881 for (l = mips16_stubs; l != NULL; l = l->next)
6882 if (strcmp (l->name, fnname) == 0)
6883 break;
6885 if (l == NULL)
6887 const char *separator;
6888 char *secname, *stubname;
6889 tree stubid, stubdecl;
6890 unsigned int f;
6892 /* If the function does not return in FPRs, the special stub
6893 section is named
6894 .mips16.call.FNNAME
6896 If the function does return in FPRs, the stub section is named
6897 .mips16.call.fp.FNNAME
6899 Build a decl for the stub. */
6900 secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6901 fnname, NULL));
6902 stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6903 fnname, NULL));
6904 stubid = get_identifier (stubname);
6905 stubdecl = build_decl (BUILTINS_LOCATION,
6906 FUNCTION_DECL, stubid,
6907 build_function_type_list (void_type_node,
6908 NULL_TREE));
6909 set_decl_section_name (stubdecl, secname);
6910 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6911 RESULT_DECL, NULL_TREE,
6912 void_type_node);
6914 /* Output a comment. */
6915 fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6916 (fp_ret_p
6917 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6918 : ""),
6919 fnname);
6920 separator = "";
6921 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6923 fprintf (asm_out_file, "%s%s", separator,
6924 (f & 3) == 1 ? "float" : "double");
6925 separator = ", ";
6927 fprintf (asm_out_file, ")\n");
6929 /* Start the function definition. */
6930 assemble_start_function (stubdecl, stubname);
6931 mips_start_function_definition (stubname, false);
6933 if (fp_ret_p)
6935 fprintf (asm_out_file, "\t.cfi_startproc\n");
6937 /* Create a fake CFA 4 bytes below the stack pointer.
6938 This works around unwinders (like libgcc's) that expect
6939 the CFA for non-signal frames to be unique. */
6940 fprintf (asm_out_file, "\t.cfi_def_cfa 29,-4\n");
6942 /* "Save" $sp in itself so we don't use the fake CFA.
6943 This is: DW_CFA_val_expression r29, { DW_OP_reg29 }. */
6944 fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
6946 /* Save the return address in $18. The stub's caller knows
6947 that $18 might be clobbered, even though $18 is usually
6948 a call-saved register.
6950 Do it early on in case the last move to a floating-point
6951 register can be scheduled into the delay slot of the
6952 call we are about to make. */
6953 fprintf (asm_out_file, "\tmove\t%s,%s\n",
6954 reg_names[GP_REG_FIRST + 18],
6955 reg_names[RETURN_ADDR_REGNUM]);
6957 else
6959 /* Load the address of the MIPS16 function into $25. Do this
6960 first so that targets with coprocessor interlocks can use
6961 an MFC1 to fill the delay slot. */
6962 if (TARGET_EXPLICIT_RELOCS)
6964 output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6965 output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6967 else
6968 output_asm_insn ("la\t%^,%0", &fn);
6971 /* Move the arguments from general registers to floating-point
6972 registers. */
6973 mips_output_args_xfer (fp_code, 't');
6975 if (fp_ret_p)
6977 /* Now call the non-MIPS16 function. */
6978 output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6979 fprintf (asm_out_file, "\t.cfi_register 31,18\n");
6981 /* Move the result from floating-point registers to
6982 general registers. */
6983 switch (GET_MODE (retval))
6985 case SCmode:
6986 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
6987 TARGET_BIG_ENDIAN
6988 ? FP_REG_FIRST + 2
6989 : FP_REG_FIRST);
6990 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
6991 TARGET_LITTLE_ENDIAN
6992 ? FP_REG_FIRST + 2
6993 : FP_REG_FIRST);
6994 if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6996 /* On 64-bit targets, complex floats are returned in
6997 a single GPR, such that "sd" on a suitably-aligned
6998 target would store the value correctly. */
6999 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
7000 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
7001 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
7002 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
7003 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
7004 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
7005 fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
7006 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
7007 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
7008 fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
7009 reg_names[GP_RETURN],
7010 reg_names[GP_RETURN],
7011 reg_names[GP_RETURN + 1]);
7013 break;
7015 case SFmode:
7016 mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
7017 break;
7019 case DCmode:
7020 mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
7021 FP_REG_FIRST + 2);
7022 /* Fall though. */
7023 case DFmode:
7024 case V2SFmode:
7025 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT
7026 || GET_MODE (retval) != V2SFmode);
7027 mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
7028 break;
7030 default:
7031 gcc_unreachable ();
7033 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
7034 fprintf (asm_out_file, "\t.cfi_endproc\n");
7036 else
7038 /* Jump to the previously-loaded address. */
7039 output_asm_insn ("jr\t%^", NULL);
7042 #ifdef ASM_DECLARE_FUNCTION_SIZE
7043 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
7044 #endif
7046 mips_end_function_definition (stubname);
7048 /* Record this stub. */
7049 l = XNEW (struct mips16_stub);
7050 l->name = xstrdup (fnname);
7051 l->fp_ret_p = fp_ret_p;
7052 l->next = mips16_stubs;
7053 mips16_stubs = l;
7056 /* If we expect a floating-point return value, but we've built a
7057 stub which does not expect one, then we're in trouble. We can't
7058 use the existing stub, because it won't handle the floating-point
7059 value. We can't build a new stub, because the linker won't know
7060 which stub to use for the various calls in this object file.
7061 Fortunately, this case is illegal, since it means that a function
7062 was declared in two different ways in a single compilation. */
7063 if (fp_ret_p && !l->fp_ret_p)
7064 error ("cannot handle inconsistent calls to %qs", fnname);
7066 if (retval == NULL_RTX)
7067 pattern = gen_call_internal_direct (fn, args_size);
7068 else
7069 pattern = gen_call_value_internal_direct (retval, fn, args_size);
7070 insn = mips_emit_call_insn (pattern, fn, fn, false);
7072 /* If we are calling a stub which handles a floating-point return
7073 value, we need to arrange to save $18 in the prologue. We do this
7074 by marking the function call as using the register. The prologue
7075 will later see that it is used, and emit code to save it. */
7076 if (fp_ret_p)
7077 CALL_INSN_FUNCTION_USAGE (insn) =
7078 gen_rtx_EXPR_LIST (VOIDmode,
7079 gen_rtx_CLOBBER (VOIDmode,
7080 gen_rtx_REG (word_mode, 18)),
7081 CALL_INSN_FUNCTION_USAGE (insn));
7083 return insn;
7086 /* Expand a call of type TYPE. RESULT is where the result will go (null
7087 for "call"s and "sibcall"s), ADDR is the address of the function,
7088 ARGS_SIZE is the size of the arguments and AUX is the value passed
7089 to us by mips_function_arg. LAZY_P is true if this call already
7090 involves a lazily-bound function address (such as when calling
7091 functions through a MIPS16 hard-float stub).
7093 Return the call itself. */
7095 rtx_insn *
7096 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
7097 rtx args_size, rtx aux, bool lazy_p)
7099 rtx orig_addr, pattern;
7100 rtx_insn *insn;
7101 int fp_code;
7103 fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
7104 insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
7105 if (insn)
7107 gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
7108 return insn;
7111 orig_addr = addr;
7112 if (!call_insn_operand (addr, VOIDmode))
7114 if (type == MIPS_CALL_EPILOGUE)
7115 addr = MIPS_EPILOGUE_TEMP (Pmode);
7116 else
7117 addr = gen_reg_rtx (Pmode);
7118 lazy_p |= mips_load_call_address (type, addr, orig_addr);
7121 if (result == 0)
7123 rtx (*fn) (rtx, rtx);
7125 if (type == MIPS_CALL_SIBCALL)
7126 fn = gen_sibcall_internal;
7127 else
7128 fn = gen_call_internal;
7130 pattern = fn (addr, args_size);
7132 else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
7134 /* Handle return values created by mips_return_fpr_pair. */
7135 rtx (*fn) (rtx, rtx, rtx, rtx);
7136 rtx reg1, reg2;
7138 if (type == MIPS_CALL_SIBCALL)
7139 fn = gen_sibcall_value_multiple_internal;
7140 else
7141 fn = gen_call_value_multiple_internal;
7143 reg1 = XEXP (XVECEXP (result, 0, 0), 0);
7144 reg2 = XEXP (XVECEXP (result, 0, 1), 0);
7145 pattern = fn (reg1, addr, args_size, reg2);
7147 else
7149 rtx (*fn) (rtx, rtx, rtx);
7151 if (type == MIPS_CALL_SIBCALL)
7152 fn = gen_sibcall_value_internal;
7153 else
7154 fn = gen_call_value_internal;
7156 /* Handle return values created by mips_return_fpr_single. */
7157 if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
7158 result = XEXP (XVECEXP (result, 0, 0), 0);
7159 pattern = fn (result, addr, args_size);
7162 return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
7165 /* Split call instruction INSN into a $gp-clobbering call and
7166 (where necessary) an instruction to restore $gp from its save slot.
7167 CALL_PATTERN is the pattern of the new call. */
7169 void
7170 mips_split_call (rtx insn, rtx call_pattern)
7172 emit_call_insn (call_pattern);
7173 if (!find_reg_note (insn, REG_NORETURN, 0))
7174 mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode,
7175 POST_CALL_TMP_REG));
7178 /* Return true if a call to DECL may need to use JALX. */
7180 static bool
7181 mips_call_may_need_jalx_p (tree decl)
7183 /* If the current translation unit would use a different mode for DECL,
7184 assume that the call needs JALX. */
7185 if (mips_get_compress_mode (decl) != TARGET_COMPRESSION)
7186 return true;
7188 /* mips_get_compress_mode is always accurate for locally-binding
7189 functions in the current translation unit. */
7190 if (!DECL_EXTERNAL (decl) && targetm.binds_local_p (decl))
7191 return false;
7193 /* When -minterlink-compressed is in effect, assume that functions
7194 could use a different encoding mode unless an attribute explicitly
7195 tells us otherwise. */
7196 if (TARGET_INTERLINK_COMPRESSED)
7198 if (!TARGET_COMPRESSION
7199 && mips_get_compress_off_flags (DECL_ATTRIBUTES (decl)) ==0)
7200 return true;
7201 if (TARGET_COMPRESSION
7202 && mips_get_compress_on_flags (DECL_ATTRIBUTES (decl)) == 0)
7203 return true;
7206 return false;
7209 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL. */
7211 static bool
7212 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
7214 if (!TARGET_SIBCALLS)
7215 return false;
7217 /* Interrupt handlers need special epilogue code and therefore can't
7218 use sibcalls. */
7219 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
7220 return false;
7222 /* Direct Js are only possible to functions that use the same ISA encoding.
7223 There is no JX counterpoart of JALX. */
7224 if (decl
7225 && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode)
7226 && mips_call_may_need_jalx_p (decl))
7227 return false;
7229 /* Sibling calls should not prevent lazy binding. Lazy-binding stubs
7230 require $gp to be valid on entry, so sibcalls can only use stubs
7231 if $gp is call-clobbered. */
7232 if (decl
7233 && TARGET_CALL_SAVED_GP
7234 && !TARGET_ABICALLS_PIC0
7235 && !targetm.binds_local_p (decl))
7236 return false;
7238 /* Otherwise OK. */
7239 return true;
7242 /* Implement TARGET_USE_MOVE_BY_PIECES_INFRASTRUCTURE_P. */
7244 bool
7245 mips_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
7246 unsigned int align,
7247 enum by_pieces_operation op,
7248 bool speed_p)
7250 if (op == STORE_BY_PIECES)
7251 return mips_store_by_pieces_p (size, align);
7252 if (op == MOVE_BY_PIECES && HAVE_movmemsi)
7254 /* movmemsi is meant to generate code that is at least as good as
7255 move_by_pieces. However, movmemsi effectively uses a by-pieces
7256 implementation both for moves smaller than a word and for
7257 word-aligned moves of no more than MIPS_MAX_MOVE_BYTES_STRAIGHT
7258 bytes. We should allow the tree-level optimisers to do such
7259 moves by pieces, as it often exposes other optimization
7260 opportunities. We might as well continue to use movmemsi at
7261 the rtl level though, as it produces better code when
7262 scheduling is disabled (such as at -O). */
7263 if (currently_expanding_to_rtl)
7264 return false;
7265 if (align < BITS_PER_WORD)
7266 return size < UNITS_PER_WORD;
7267 return size <= MIPS_MAX_MOVE_BYTES_STRAIGHT;
7270 return default_use_by_pieces_infrastructure_p (size, align, op, speed_p);
7273 /* Implement a handler for STORE_BY_PIECES operations
7274 for TARGET_USE_MOVE_BY_PIECES_INFRASTRUCTURE_P. */
7276 bool
7277 mips_store_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7279 /* Storing by pieces involves moving constants into registers
7280 of size MIN (ALIGN, BITS_PER_WORD), then storing them.
7281 We need to decide whether it is cheaper to load the address of
7282 constant data into a register and use a block move instead. */
7284 /* If the data is only byte aligned, then:
7286 (a1) A block move of less than 4 bytes would involve three 3 LBs and
7287 3 SBs. We might as well use 3 single-instruction LIs and 3 SBs
7288 instead.
7290 (a2) A block move of 4 bytes from aligned source data can use an
7291 LW/SWL/SWR sequence. This is often better than the 4 LIs and
7292 4 SBs that we would generate when storing by pieces. */
7293 if (align <= BITS_PER_UNIT)
7294 return size < 4;
7296 /* If the data is 2-byte aligned, then:
7298 (b1) A block move of less than 4 bytes would use a combination of LBs,
7299 LHs, SBs and SHs. We get better code by using single-instruction
7300 LIs, SBs and SHs instead.
7302 (b2) A block move of 4 bytes from aligned source data would again use
7303 an LW/SWL/SWR sequence. In most cases, loading the address of
7304 the source data would require at least one extra instruction.
7305 It is often more efficient to use 2 single-instruction LIs and
7306 2 SHs instead.
7308 (b3) A block move of up to 3 additional bytes would be like (b1).
7310 (b4) A block move of 8 bytes from aligned source data can use two
7311 LW/SWL/SWR sequences or a single LD/SDL/SDR sequence. Both
7312 sequences are better than the 4 LIs and 4 SHs that we'd generate
7313 when storing by pieces.
7315 The reasoning for higher alignments is similar:
7317 (c1) A block move of less than 4 bytes would be the same as (b1).
7319 (c2) A block move of 4 bytes would use an LW/SW sequence. Again,
7320 loading the address of the source data would typically require
7321 at least one extra instruction. It is generally better to use
7322 LUI/ORI/SW instead.
7324 (c3) A block move of up to 3 additional bytes would be like (b1).
7326 (c4) A block move of 8 bytes can use two LW/SW sequences or a single
7327 LD/SD sequence, and in these cases we've traditionally preferred
7328 the memory copy over the more bulky constant moves. */
7329 return size < 8;
7332 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
7333 Assume that the areas do not overlap. */
7335 static void
7336 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
7338 HOST_WIDE_INT offset, delta;
7339 unsigned HOST_WIDE_INT bits;
7340 int i;
7341 machine_mode mode;
7342 rtx *regs;
7344 /* Work out how many bits to move at a time. If both operands have
7345 half-word alignment, it is usually better to move in half words.
7346 For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
7347 and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
7348 Otherwise move word-sized chunks. */
7349 if (MEM_ALIGN (src) == BITS_PER_WORD / 2
7350 && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
7351 bits = BITS_PER_WORD / 2;
7352 else
7353 bits = BITS_PER_WORD;
7355 mode = mode_for_size (bits, MODE_INT, 0);
7356 delta = bits / BITS_PER_UNIT;
7358 /* Allocate a buffer for the temporary registers. */
7359 regs = XALLOCAVEC (rtx, length / delta);
7361 /* Load as many BITS-sized chunks as possible. Use a normal load if
7362 the source has enough alignment, otherwise use left/right pairs. */
7363 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7365 regs[i] = gen_reg_rtx (mode);
7366 if (MEM_ALIGN (src) >= bits)
7367 mips_emit_move (regs[i], adjust_address (src, mode, offset));
7368 else
7370 rtx part = adjust_address (src, BLKmode, offset);
7371 set_mem_size (part, delta);
7372 if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0, 0))
7373 gcc_unreachable ();
7377 /* Copy the chunks to the destination. */
7378 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7379 if (MEM_ALIGN (dest) >= bits)
7380 mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
7381 else
7383 rtx part = adjust_address (dest, BLKmode, offset);
7384 set_mem_size (part, delta);
7385 if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
7386 gcc_unreachable ();
7389 /* Mop up any left-over bytes. */
7390 if (offset < length)
7392 src = adjust_address (src, BLKmode, offset);
7393 dest = adjust_address (dest, BLKmode, offset);
7394 move_by_pieces (dest, src, length - offset,
7395 MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
7399 /* Helper function for doing a loop-based block operation on memory
7400 reference MEM. Each iteration of the loop will operate on LENGTH
7401 bytes of MEM.
7403 Create a new base register for use within the loop and point it to
7404 the start of MEM. Create a new memory reference that uses this
7405 register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
7407 static void
7408 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
7409 rtx *loop_reg, rtx *loop_mem)
7411 *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
7413 /* Although the new mem does not refer to a known location,
7414 it does keep up to LENGTH bytes of alignment. */
7415 *loop_mem = change_address (mem, BLKmode, *loop_reg);
7416 set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
7419 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
7420 bytes at a time. LENGTH must be at least BYTES_PER_ITER. Assume that
7421 the memory regions do not overlap. */
7423 static void
7424 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
7425 HOST_WIDE_INT bytes_per_iter)
7427 rtx_code_label *label;
7428 rtx src_reg, dest_reg, final_src, test;
7429 HOST_WIDE_INT leftover;
7431 leftover = length % bytes_per_iter;
7432 length -= leftover;
7434 /* Create registers and memory references for use within the loop. */
7435 mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
7436 mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
7438 /* Calculate the value that SRC_REG should have after the last iteration
7439 of the loop. */
7440 final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
7441 0, 0, OPTAB_WIDEN);
7443 /* Emit the start of the loop. */
7444 label = gen_label_rtx ();
7445 emit_label (label);
7447 /* Emit the loop body. */
7448 mips_block_move_straight (dest, src, bytes_per_iter);
7450 /* Move on to the next block. */
7451 mips_emit_move (src_reg, plus_constant (Pmode, src_reg, bytes_per_iter));
7452 mips_emit_move (dest_reg, plus_constant (Pmode, dest_reg, bytes_per_iter));
7454 /* Emit the loop condition. */
7455 test = gen_rtx_NE (VOIDmode, src_reg, final_src);
7456 if (Pmode == DImode)
7457 emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
7458 else
7459 emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
7461 /* Mop up any left-over bytes. */
7462 if (leftover)
7463 mips_block_move_straight (dest, src, leftover);
7466 /* Expand a movmemsi instruction, which copies LENGTH bytes from
7467 memory reference SRC to memory reference DEST. */
7469 bool
7470 mips_expand_block_move (rtx dest, rtx src, rtx length)
7472 if (CONST_INT_P (length))
7474 if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
7476 mips_block_move_straight (dest, src, INTVAL (length));
7477 return true;
7479 else if (optimize)
7481 mips_block_move_loop (dest, src, INTVAL (length),
7482 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
7483 return true;
7486 return false;
7489 /* Expand a loop of synci insns for the address range [BEGIN, END). */
7491 void
7492 mips_expand_synci_loop (rtx begin, rtx end)
7494 rtx inc, cmp_result, mask, length;
7495 rtx_code_label *label, *end_label;
7497 /* Create end_label. */
7498 end_label = gen_label_rtx ();
7500 /* Check if begin equals end. */
7501 cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
7502 emit_jump_insn (gen_condjump (cmp_result, end_label));
7504 /* Load INC with the cache line size (rdhwr INC,$1). */
7505 inc = gen_reg_rtx (Pmode);
7506 emit_insn (PMODE_INSN (gen_rdhwr_synci_step, (inc)));
7508 /* Check if inc is 0. */
7509 cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
7510 emit_jump_insn (gen_condjump (cmp_result, end_label));
7512 /* Calculate mask. */
7513 mask = mips_force_unary (Pmode, NEG, inc);
7515 /* Mask out begin by mask. */
7516 begin = mips_force_binary (Pmode, AND, begin, mask);
7518 /* Calculate length. */
7519 length = mips_force_binary (Pmode, MINUS, end, begin);
7521 /* Loop back to here. */
7522 label = gen_label_rtx ();
7523 emit_label (label);
7525 emit_insn (gen_synci (begin));
7527 /* Update length. */
7528 mips_emit_binary (MINUS, length, length, inc);
7530 /* Update begin. */
7531 mips_emit_binary (PLUS, begin, begin, inc);
7533 /* Check if length is greater than 0. */
7534 cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
7535 emit_jump_insn (gen_condjump (cmp_result, label));
7537 emit_label (end_label);
7540 /* Expand a QI or HI mode atomic memory operation.
7542 GENERATOR contains a pointer to the gen_* function that generates
7543 the SI mode underlying atomic operation using masks that we
7544 calculate.
7546 RESULT is the return register for the operation. Its value is NULL
7547 if unused.
7549 MEM is the location of the atomic access.
7551 OLDVAL is the first operand for the operation.
7553 NEWVAL is the optional second operand for the operation. Its value
7554 is NULL if unused. */
7556 void
7557 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
7558 rtx result, rtx mem, rtx oldval, rtx newval)
7560 rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
7561 rtx unshifted_mask_reg, mask, inverted_mask, si_op;
7562 rtx res = NULL;
7563 machine_mode mode;
7565 mode = GET_MODE (mem);
7567 /* Compute the address of the containing SImode value. */
7568 orig_addr = force_reg (Pmode, XEXP (mem, 0));
7569 memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
7570 force_reg (Pmode, GEN_INT (-4)));
7572 /* Create a memory reference for it. */
7573 memsi = gen_rtx_MEM (SImode, memsi_addr);
7574 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
7575 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
7577 /* Work out the byte offset of the QImode or HImode value,
7578 counting from the least significant byte. */
7579 shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
7580 if (TARGET_BIG_ENDIAN)
7581 mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
7583 /* Multiply by eight to convert the shift value from bytes to bits. */
7584 mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
7586 /* Make the final shift an SImode value, so that it can be used in
7587 SImode operations. */
7588 shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
7590 /* Set MASK to an inclusive mask of the QImode or HImode value. */
7591 unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
7592 unshifted_mask_reg = force_reg (SImode, unshifted_mask);
7593 mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
7595 /* Compute the equivalent exclusive mask. */
7596 inverted_mask = gen_reg_rtx (SImode);
7597 emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
7598 gen_rtx_NOT (SImode, mask)));
7600 /* Shift the old value into place. */
7601 if (oldval != const0_rtx)
7603 oldval = convert_modes (SImode, mode, oldval, true);
7604 oldval = force_reg (SImode, oldval);
7605 oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
7608 /* Do the same for the new value. */
7609 if (newval && newval != const0_rtx)
7611 newval = convert_modes (SImode, mode, newval, true);
7612 newval = force_reg (SImode, newval);
7613 newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
7616 /* Do the SImode atomic access. */
7617 if (result)
7618 res = gen_reg_rtx (SImode);
7619 if (newval)
7620 si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
7621 else if (result)
7622 si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
7623 else
7624 si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
7626 emit_insn (si_op);
7628 if (result)
7630 /* Shift and convert the result. */
7631 mips_emit_binary (AND, res, res, mask);
7632 mips_emit_binary (LSHIFTRT, res, res, shiftsi);
7633 mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
7637 /* Return true if it is possible to use left/right accesses for a
7638 bitfield of WIDTH bits starting BITPOS bits into BLKmode memory OP.
7639 When returning true, update *LEFT and *RIGHT as follows:
7641 *LEFT is a QImode reference to the first byte if big endian or
7642 the last byte if little endian. This address can be used in the
7643 left-side instructions (LWL, SWL, LDL, SDL).
7645 *RIGHT is a QImode reference to the opposite end of the field and
7646 can be used in the patterning right-side instruction. */
7648 static bool
7649 mips_get_unaligned_mem (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
7650 rtx *left, rtx *right)
7652 rtx first, last;
7654 /* Check that the size is valid. */
7655 if (width != 32 && (!TARGET_64BIT || width != 64))
7656 return false;
7658 /* We can only access byte-aligned values. Since we are always passed
7659 a reference to the first byte of the field, it is not necessary to
7660 do anything with BITPOS after this check. */
7661 if (bitpos % BITS_PER_UNIT != 0)
7662 return false;
7664 /* Reject aligned bitfields: we want to use a normal load or store
7665 instead of a left/right pair. */
7666 if (MEM_ALIGN (op) >= width)
7667 return false;
7669 /* Get references to both ends of the field. */
7670 first = adjust_address (op, QImode, 0);
7671 last = adjust_address (op, QImode, width / BITS_PER_UNIT - 1);
7673 /* Allocate to LEFT and RIGHT according to endianness. LEFT should
7674 correspond to the MSB and RIGHT to the LSB. */
7675 if (TARGET_BIG_ENDIAN)
7676 *left = first, *right = last;
7677 else
7678 *left = last, *right = first;
7680 return true;
7683 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7684 DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7685 the operation is the equivalent of:
7687 (set DEST (*_extract SRC WIDTH BITPOS))
7689 Return true on success. */
7691 bool
7692 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7693 HOST_WIDE_INT bitpos, bool unsigned_p)
7695 rtx left, right, temp;
7696 rtx dest1 = NULL_RTX;
7698 /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7699 be a DImode, create a new temp and emit a zero extend at the end. */
7700 if (GET_MODE (dest) == DImode
7701 && REG_P (dest)
7702 && GET_MODE_BITSIZE (SImode) == width)
7704 dest1 = dest;
7705 dest = gen_reg_rtx (SImode);
7708 if (!mips_get_unaligned_mem (src, width, bitpos, &left, &right))
7709 return false;
7711 temp = gen_reg_rtx (GET_MODE (dest));
7712 if (GET_MODE (dest) == DImode)
7714 emit_insn (gen_mov_ldl (temp, src, left));
7715 emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7717 else
7719 emit_insn (gen_mov_lwl (temp, src, left));
7720 emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7723 /* If we were loading 32bits and the original register was DI then
7724 sign/zero extend into the orignal dest. */
7725 if (dest1)
7727 if (unsigned_p)
7728 emit_insn (gen_zero_extendsidi2 (dest1, dest));
7729 else
7730 emit_insn (gen_extendsidi2 (dest1, dest));
7732 return true;
7735 /* Try to use left/right stores to expand an "ins" pattern. DEST, WIDTH,
7736 BITPOS and SRC are the operands passed to the expander; the operation
7737 is the equivalent of:
7739 (set (zero_extract DEST WIDTH BITPOS) SRC)
7741 Return true on success. */
7743 bool
7744 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7745 HOST_WIDE_INT bitpos)
7747 rtx left, right;
7748 machine_mode mode;
7750 if (!mips_get_unaligned_mem (dest, width, bitpos, &left, &right))
7751 return false;
7753 mode = mode_for_size (width, MODE_INT, 0);
7754 src = gen_lowpart (mode, src);
7755 if (mode == DImode)
7757 emit_insn (gen_mov_sdl (dest, src, left));
7758 emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7760 else
7762 emit_insn (gen_mov_swl (dest, src, left));
7763 emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7765 return true;
7768 /* Return true if X is a MEM with the same size as MODE. */
7770 bool
7771 mips_mem_fits_mode_p (machine_mode mode, rtx x)
7773 return (MEM_P (x)
7774 && MEM_SIZE_KNOWN_P (x)
7775 && MEM_SIZE (x) == GET_MODE_SIZE (mode));
7778 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7779 source of an "ext" instruction or the destination of an "ins"
7780 instruction. OP must be a register operand and the following
7781 conditions must hold:
7783 0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7784 0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7785 0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7787 Also reject lengths equal to a word as they are better handled
7788 by the move patterns. */
7790 bool
7791 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7793 if (!ISA_HAS_EXT_INS
7794 || !register_operand (op, VOIDmode)
7795 || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7796 return false;
7798 if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7799 return false;
7801 if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7802 return false;
7804 return true;
7807 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7808 operation if MAXLEN is the maxium length of consecutive bits that
7809 can make up MASK. MODE is the mode of the operation. See
7810 mask_low_and_shift_len for the actual definition. */
7812 bool
7813 mask_low_and_shift_p (machine_mode mode, rtx mask, rtx shift, int maxlen)
7815 return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7818 /* Return true iff OP1 and OP2 are valid operands together for the
7819 *and<MODE>3 and *and<MODE>3_mips16 patterns. For the cases to consider,
7820 see the table in the comment before the pattern. */
7822 bool
7823 and_operands_ok (machine_mode mode, rtx op1, rtx op2)
7825 return (memory_operand (op1, mode)
7826 ? and_load_operand (op2, mode)
7827 : and_reg_operand (op2, mode));
7830 /* The canonical form of a mask-low-and-shift-left operation is
7831 (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7832 cleared. Thus we need to shift MASK to the right before checking if it
7833 is a valid mask value. MODE is the mode of the operation. If true
7834 return the length of the mask, otherwise return -1. */
7837 mask_low_and_shift_len (machine_mode mode, rtx mask, rtx shift)
7839 HOST_WIDE_INT shval;
7841 shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7842 return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7845 /* Return true if -msplit-addresses is selected and should be honored.
7847 -msplit-addresses is a half-way house between explicit relocations
7848 and the traditional assembler macros. It can split absolute 32-bit
7849 symbolic constants into a high/lo_sum pair but uses macros for other
7850 sorts of access.
7852 Like explicit relocation support for REL targets, it relies
7853 on GNU extensions in the assembler and the linker.
7855 Although this code should work for -O0, it has traditionally
7856 been treated as an optimization. */
7858 static bool
7859 mips_split_addresses_p (void)
7861 return (TARGET_SPLIT_ADDRESSES
7862 && optimize
7863 && !TARGET_MIPS16
7864 && !flag_pic
7865 && !ABI_HAS_64BIT_SYMBOLS);
7868 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs. */
7870 static void
7871 mips_init_relocs (void)
7873 memset (mips_split_p, '\0', sizeof (mips_split_p));
7874 memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7875 memset (mips_use_pcrel_pool_p, '\0', sizeof (mips_use_pcrel_pool_p));
7876 memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7877 memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7879 if (TARGET_MIPS16_PCREL_LOADS)
7880 mips_use_pcrel_pool_p[SYMBOL_ABSOLUTE] = true;
7881 else
7883 if (ABI_HAS_64BIT_SYMBOLS)
7885 if (TARGET_EXPLICIT_RELOCS)
7887 mips_split_p[SYMBOL_64_HIGH] = true;
7888 mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7889 mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7891 mips_split_p[SYMBOL_64_MID] = true;
7892 mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7893 mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7895 mips_split_p[SYMBOL_64_LOW] = true;
7896 mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7897 mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7899 mips_split_p[SYMBOL_ABSOLUTE] = true;
7900 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7903 else
7905 if (TARGET_EXPLICIT_RELOCS
7906 || mips_split_addresses_p ()
7907 || TARGET_MIPS16)
7909 mips_split_p[SYMBOL_ABSOLUTE] = true;
7910 mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7911 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7916 if (TARGET_MIPS16)
7918 /* The high part is provided by a pseudo copy of $gp. */
7919 mips_split_p[SYMBOL_GP_RELATIVE] = true;
7920 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7922 else if (TARGET_EXPLICIT_RELOCS)
7923 /* Small data constants are kept whole until after reload,
7924 then lowered by mips_rewrite_small_data. */
7925 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7927 if (TARGET_EXPLICIT_RELOCS)
7929 mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7930 if (TARGET_NEWABI)
7932 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7933 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7935 else
7937 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7938 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7940 if (TARGET_MIPS16)
7941 /* Expose the use of $28 as soon as possible. */
7942 mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7944 if (TARGET_XGOT)
7946 /* The HIGH and LO_SUM are matched by special .md patterns. */
7947 mips_split_p[SYMBOL_GOT_DISP] = true;
7949 mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7950 mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7951 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7953 mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7954 mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7955 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7957 else
7959 if (TARGET_NEWABI)
7960 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7961 else
7962 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7963 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7964 if (TARGET_MIPS16)
7965 /* Expose the use of $28 as soon as possible. */
7966 mips_split_p[SYMBOL_GOT_DISP] = true;
7970 if (TARGET_NEWABI)
7972 mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7973 mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7974 mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7977 mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7978 mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7980 if (TARGET_MIPS16_PCREL_LOADS)
7982 mips_use_pcrel_pool_p[SYMBOL_DTPREL] = true;
7983 mips_use_pcrel_pool_p[SYMBOL_TPREL] = true;
7985 else
7987 mips_split_p[SYMBOL_DTPREL] = true;
7988 mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7989 mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7991 mips_split_p[SYMBOL_TPREL] = true;
7992 mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7993 mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7996 mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7997 mips_lo_relocs[SYMBOL_HALF] = "%half(";
8000 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
8001 in context CONTEXT. RELOCS is the array of relocations to use. */
8003 static void
8004 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
8005 const char **relocs)
8007 enum mips_symbol_type symbol_type;
8008 const char *p;
8010 symbol_type = mips_classify_symbolic_expression (op, context);
8011 gcc_assert (relocs[symbol_type]);
8013 fputs (relocs[symbol_type], file);
8014 output_addr_const (file, mips_strip_unspec_address (op));
8015 for (p = relocs[symbol_type]; *p != 0; p++)
8016 if (*p == '(')
8017 fputc (')', file);
8020 /* Start a new block with the given asm switch enabled. If we need
8021 to print a directive, emit PREFIX before it and SUFFIX after it. */
8023 static void
8024 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
8025 const char *prefix, const char *suffix)
8027 if (asm_switch->nesting_level == 0)
8028 fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
8029 asm_switch->nesting_level++;
8032 /* Likewise, but end a block. */
8034 static void
8035 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
8036 const char *prefix, const char *suffix)
8038 gcc_assert (asm_switch->nesting_level);
8039 asm_switch->nesting_level--;
8040 if (asm_switch->nesting_level == 0)
8041 fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
8044 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
8045 that either print a complete line or print nothing. */
8047 void
8048 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
8050 mips_push_asm_switch_1 (asm_switch, "\t", "\n");
8053 void
8054 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
8056 mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
8059 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
8060 The punctuation characters are:
8062 '(' Start a nested ".set noreorder" block.
8063 ')' End a nested ".set noreorder" block.
8064 '[' Start a nested ".set noat" block.
8065 ']' End a nested ".set noat" block.
8066 '<' Start a nested ".set nomacro" block.
8067 '>' End a nested ".set nomacro" block.
8068 '*' Behave like %(%< if generating a delayed-branch sequence.
8069 '#' Print a nop if in a ".set noreorder" block.
8070 '/' Like '#', but do nothing within a delayed-branch sequence.
8071 '?' Print "l" if mips_branch_likely is true
8072 '~' Print a nop if mips_branch_likely is true
8073 '.' Print the name of the register with a hard-wired zero (zero or $0).
8074 '@' Print the name of the assembler temporary register (at or $1).
8075 '^' Print the name of the pic call-through register (t9 or $25).
8076 '+' Print the name of the gp register (usually gp or $28).
8077 '$' Print the name of the stack pointer register (sp or $29).
8078 ':' Print "c" to use the compact version if the delay slot is a nop.
8079 '!' Print "s" to use the short version if the delay slot contains a
8080 16-bit instruction.
8082 See also mips_init_print_operand_pucnt. */
8084 static void
8085 mips_print_operand_punctuation (FILE *file, int ch)
8087 switch (ch)
8089 case '(':
8090 mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
8091 break;
8093 case ')':
8094 mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
8095 break;
8097 case '[':
8098 mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
8099 break;
8101 case ']':
8102 mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
8103 break;
8105 case '<':
8106 mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
8107 break;
8109 case '>':
8110 mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
8111 break;
8113 case '*':
8114 if (final_sequence != 0)
8116 mips_print_operand_punctuation (file, '(');
8117 mips_print_operand_punctuation (file, '<');
8119 break;
8121 case '#':
8122 if (mips_noreorder.nesting_level > 0)
8123 fputs ("\n\tnop", file);
8124 break;
8126 case '/':
8127 /* Print an extra newline so that the delayed insn is separated
8128 from the following ones. This looks neater and is consistent
8129 with non-nop delayed sequences. */
8130 if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
8131 fputs ("\n\tnop\n", file);
8132 break;
8134 case '?':
8135 if (mips_branch_likely)
8136 putc ('l', file);
8137 break;
8139 case '~':
8140 if (mips_branch_likely)
8141 fputs ("\n\tnop", file);
8142 break;
8144 case '.':
8145 fputs (reg_names[GP_REG_FIRST + 0], file);
8146 break;
8148 case '@':
8149 fputs (reg_names[AT_REGNUM], file);
8150 break;
8152 case '^':
8153 fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
8154 break;
8156 case '+':
8157 fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
8158 break;
8160 case '$':
8161 fputs (reg_names[STACK_POINTER_REGNUM], file);
8162 break;
8164 case ':':
8165 /* When final_sequence is 0, the delay slot will be a nop. We can
8166 use the compact version for microMIPS. */
8167 if (final_sequence == 0)
8168 putc ('c', file);
8169 break;
8171 case '!':
8172 /* If the delay slot instruction is short, then use the
8173 compact version. */
8174 if (final_sequence == 0
8175 || get_attr_length (final_sequence->insn (1)) == 2)
8176 putc ('s', file);
8177 break;
8179 default:
8180 gcc_unreachable ();
8181 break;
8185 /* Initialize mips_print_operand_punct. */
8187 static void
8188 mips_init_print_operand_punct (void)
8190 const char *p;
8192 for (p = "()[]<>*#/?~.@^+$:!"; *p; p++)
8193 mips_print_operand_punct[(unsigned char) *p] = true;
8196 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
8197 associated with condition CODE. Print the condition part of the
8198 opcode to FILE. */
8200 static void
8201 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
8203 switch (code)
8205 case EQ:
8206 case NE:
8207 case GT:
8208 case GE:
8209 case LT:
8210 case LE:
8211 case GTU:
8212 case GEU:
8213 case LTU:
8214 case LEU:
8215 /* Conveniently, the MIPS names for these conditions are the same
8216 as their RTL equivalents. */
8217 fputs (GET_RTX_NAME (code), file);
8218 break;
8220 default:
8221 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8222 break;
8226 /* Likewise floating-point branches. */
8228 static void
8229 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
8231 switch (code)
8233 case EQ:
8234 fputs ("c1f", file);
8235 break;
8237 case NE:
8238 fputs ("c1t", file);
8239 break;
8241 default:
8242 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8243 break;
8247 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8249 static bool
8250 mips_print_operand_punct_valid_p (unsigned char code)
8252 return mips_print_operand_punct[code];
8255 /* Implement TARGET_PRINT_OPERAND. The MIPS-specific operand codes are:
8257 'X' Print CONST_INT OP in hexadecimal format.
8258 'x' Print the low 16 bits of CONST_INT OP in hexadecimal format.
8259 'd' Print CONST_INT OP in decimal.
8260 'm' Print one less than CONST_INT OP in decimal.
8261 'h' Print the high-part relocation associated with OP, after stripping
8262 any outermost HIGH.
8263 'R' Print the low-part relocation associated with OP.
8264 'C' Print the integer branch condition for comparison OP.
8265 'N' Print the inverse of the integer branch condition for comparison OP.
8266 'F' Print the FPU branch condition for comparison OP.
8267 'W' Print the inverse of the FPU branch condition for comparison OP.
8268 'T' Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
8269 'z' for (eq:?I ...), 'n' for (ne:?I ...).
8270 't' Like 'T', but with the EQ/NE cases reversed
8271 'Y' Print mips_fp_conditions[INTVAL (OP)]
8272 'Z' Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
8273 'q' Print a DSP accumulator register.
8274 'D' Print the second part of a double-word register or memory operand.
8275 'L' Print the low-order register in a double-word register operand.
8276 'M' Print high-order register in a double-word register operand.
8277 'z' Print $0 if OP is zero, otherwise print OP normally.
8278 'b' Print the address of a memory operand, without offset. */
8280 static void
8281 mips_print_operand (FILE *file, rtx op, int letter)
8283 enum rtx_code code;
8285 if (mips_print_operand_punct_valid_p (letter))
8287 mips_print_operand_punctuation (file, letter);
8288 return;
8291 gcc_assert (op);
8292 code = GET_CODE (op);
8294 switch (letter)
8296 case 'X':
8297 if (CONST_INT_P (op))
8298 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
8299 else
8300 output_operand_lossage ("invalid use of '%%%c'", letter);
8301 break;
8303 case 'x':
8304 if (CONST_INT_P (op))
8305 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
8306 else
8307 output_operand_lossage ("invalid use of '%%%c'", letter);
8308 break;
8310 case 'd':
8311 if (CONST_INT_P (op))
8312 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
8313 else
8314 output_operand_lossage ("invalid use of '%%%c'", letter);
8315 break;
8317 case 'm':
8318 if (CONST_INT_P (op))
8319 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
8320 else
8321 output_operand_lossage ("invalid use of '%%%c'", letter);
8322 break;
8324 case 'h':
8325 if (code == HIGH)
8326 op = XEXP (op, 0);
8327 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
8328 break;
8330 case 'R':
8331 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
8332 break;
8334 case 'C':
8335 mips_print_int_branch_condition (file, code, letter);
8336 break;
8338 case 'N':
8339 mips_print_int_branch_condition (file, reverse_condition (code), letter);
8340 break;
8342 case 'F':
8343 mips_print_float_branch_condition (file, code, letter);
8344 break;
8346 case 'W':
8347 mips_print_float_branch_condition (file, reverse_condition (code),
8348 letter);
8349 break;
8351 case 'T':
8352 case 't':
8354 int truth = (code == NE) == (letter == 'T');
8355 fputc ("zfnt"[truth * 2 + ST_REG_P (REGNO (XEXP (op, 0)))], file);
8357 break;
8359 case 'Y':
8360 if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
8361 fputs (mips_fp_conditions[UINTVAL (op)], file);
8362 else
8363 output_operand_lossage ("'%%%c' is not a valid operand prefix",
8364 letter);
8365 break;
8367 case 'Z':
8368 if (ISA_HAS_8CC)
8370 mips_print_operand (file, op, 0);
8371 fputc (',', file);
8373 break;
8375 case 'q':
8376 if (code == REG && MD_REG_P (REGNO (op)))
8377 fprintf (file, "$ac0");
8378 else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
8379 fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
8380 else
8381 output_operand_lossage ("invalid use of '%%%c'", letter);
8382 break;
8384 default:
8385 switch (code)
8387 case REG:
8389 unsigned int regno = REGNO (op);
8390 if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
8391 || (letter == 'L' && TARGET_BIG_ENDIAN)
8392 || letter == 'D')
8393 regno++;
8394 else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
8395 output_operand_lossage ("invalid use of '%%%c'", letter);
8396 /* We need to print $0 .. $31 for COP0 registers. */
8397 if (COP0_REG_P (regno))
8398 fprintf (file, "$%s", &reg_names[regno][4]);
8399 else
8400 fprintf (file, "%s", reg_names[regno]);
8402 break;
8404 case MEM:
8405 if (letter == 'D')
8406 output_address (plus_constant (Pmode, XEXP (op, 0), 4));
8407 else if (letter == 'b')
8409 gcc_assert (REG_P (XEXP (op, 0)));
8410 mips_print_operand (file, XEXP (op, 0), 0);
8412 else if (letter && letter != 'z')
8413 output_operand_lossage ("invalid use of '%%%c'", letter);
8414 else
8415 output_address (XEXP (op, 0));
8416 break;
8418 default:
8419 if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
8420 fputs (reg_names[GP_REG_FIRST], file);
8421 else if (letter && letter != 'z')
8422 output_operand_lossage ("invalid use of '%%%c'", letter);
8423 else if (CONST_GP_P (op))
8424 fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
8425 else
8426 output_addr_const (file, mips_strip_unspec_address (op));
8427 break;
8432 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
8434 static void
8435 mips_print_operand_address (FILE *file, rtx x)
8437 struct mips_address_info addr;
8439 if (mips_classify_address (&addr, x, word_mode, true))
8440 switch (addr.type)
8442 case ADDRESS_REG:
8443 mips_print_operand (file, addr.offset, 0);
8444 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8445 return;
8447 case ADDRESS_LO_SUM:
8448 mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
8449 mips_lo_relocs);
8450 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8451 return;
8453 case ADDRESS_CONST_INT:
8454 output_addr_const (file, x);
8455 fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
8456 return;
8458 case ADDRESS_SYMBOLIC:
8459 output_addr_const (file, mips_strip_unspec_address (x));
8460 return;
8462 gcc_unreachable ();
8465 /* Implement TARGET_ENCODE_SECTION_INFO. */
8467 static void
8468 mips_encode_section_info (tree decl, rtx rtl, int first)
8470 default_encode_section_info (decl, rtl, first);
8472 if (TREE_CODE (decl) == FUNCTION_DECL)
8474 rtx symbol = XEXP (rtl, 0);
8475 tree type = TREE_TYPE (decl);
8477 /* Encode whether the symbol is short or long. */
8478 if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
8479 || mips_far_type_p (type))
8480 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
8484 /* Implement TARGET_SELECT_RTX_SECTION. */
8486 static section *
8487 mips_select_rtx_section (machine_mode mode, rtx x,
8488 unsigned HOST_WIDE_INT align)
8490 /* ??? Consider using mergeable small data sections. */
8491 if (mips_rtx_constant_in_small_data_p (mode))
8492 return get_named_section (NULL, ".sdata", 0);
8494 return default_elf_select_rtx_section (mode, x, align);
8497 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
8499 The complication here is that, with the combination TARGET_ABICALLS
8500 && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
8501 absolute addresses, and should therefore not be included in the
8502 read-only part of a DSO. Handle such cases by selecting a normal
8503 data section instead of a read-only one. The logic apes that in
8504 default_function_rodata_section. */
8506 static section *
8507 mips_function_rodata_section (tree decl)
8509 if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
8510 return default_function_rodata_section (decl);
8512 if (decl && DECL_SECTION_NAME (decl))
8514 const char *name = DECL_SECTION_NAME (decl);
8515 if (DECL_COMDAT_GROUP (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
8517 char *rname = ASTRDUP (name);
8518 rname[14] = 'd';
8519 return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
8521 else if (flag_function_sections
8522 && flag_data_sections
8523 && strncmp (name, ".text.", 6) == 0)
8525 char *rname = ASTRDUP (name);
8526 memcpy (rname + 1, "data", 4);
8527 return get_section (rname, SECTION_WRITE, decl);
8530 return data_section;
8533 /* Implement TARGET_IN_SMALL_DATA_P. */
8535 static bool
8536 mips_in_small_data_p (const_tree decl)
8538 unsigned HOST_WIDE_INT size;
8540 if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8541 return false;
8543 /* We don't yet generate small-data references for -mabicalls
8544 or VxWorks RTP code. See the related -G handling in
8545 mips_option_override. */
8546 if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8547 return false;
8549 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8551 const char *name;
8553 /* Reject anything that isn't in a known small-data section. */
8554 name = DECL_SECTION_NAME (decl);
8555 if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8556 return false;
8558 /* If a symbol is defined externally, the assembler will use the
8559 usual -G rules when deciding how to implement macros. */
8560 if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
8561 return true;
8563 else if (TARGET_EMBEDDED_DATA)
8565 /* Don't put constants into the small data section: we want them
8566 to be in ROM rather than RAM. */
8567 if (TREE_CODE (decl) != VAR_DECL)
8568 return false;
8570 if (TREE_READONLY (decl)
8571 && !TREE_SIDE_EFFECTS (decl)
8572 && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8573 return false;
8576 /* Enforce -mlocal-sdata. */
8577 if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
8578 return false;
8580 /* Enforce -mextern-sdata. */
8581 if (!TARGET_EXTERN_SDATA && DECL_P (decl))
8583 if (DECL_EXTERNAL (decl))
8584 return false;
8585 if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
8586 return false;
8589 /* We have traditionally not treated zero-sized objects as small data,
8590 so this is now effectively part of the ABI. */
8591 size = int_size_in_bytes (TREE_TYPE (decl));
8592 return size > 0 && size <= mips_small_data_threshold;
8595 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use
8596 anchors for small data: the GP register acts as an anchor in that
8597 case. We also don't want to use them for PC-relative accesses,
8598 where the PC acts as an anchor. */
8600 static bool
8601 mips_use_anchors_for_symbol_p (const_rtx symbol)
8603 switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
8605 case SYMBOL_PC_RELATIVE:
8606 case SYMBOL_GP_RELATIVE:
8607 return false;
8609 default:
8610 return default_use_anchors_for_symbol_p (symbol);
8614 /* The MIPS debug format wants all automatic variables and arguments
8615 to be in terms of the virtual frame pointer (stack pointer before
8616 any adjustment in the function), while the MIPS 3.0 linker wants
8617 the frame pointer to be the stack pointer after the initial
8618 adjustment. So, we do the adjustment here. The arg pointer (which
8619 is eliminated) points to the virtual frame pointer, while the frame
8620 pointer (which may be eliminated) points to the stack pointer after
8621 the initial adjustments. */
8623 HOST_WIDE_INT
8624 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
8626 rtx offset2 = const0_rtx;
8627 rtx reg = eliminate_constant_term (addr, &offset2);
8629 if (offset == 0)
8630 offset = INTVAL (offset2);
8632 if (reg == stack_pointer_rtx
8633 || reg == frame_pointer_rtx
8634 || reg == hard_frame_pointer_rtx)
8636 offset -= cfun->machine->frame.total_size;
8637 if (reg == hard_frame_pointer_rtx)
8638 offset += cfun->machine->frame.hard_frame_pointer_offset;
8641 return offset;
8644 /* Implement ASM_OUTPUT_EXTERNAL. */
8646 void
8647 mips_output_external (FILE *file, tree decl, const char *name)
8649 default_elf_asm_output_external (file, decl, name);
8651 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
8652 set in order to avoid putting out names that are never really
8653 used. */
8654 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
8656 if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
8658 /* When using assembler macros, emit .extern directives for
8659 all small-data externs so that the assembler knows how
8660 big they are.
8662 In most cases it would be safe (though pointless) to emit
8663 .externs for other symbols too. One exception is when an
8664 object is within the -G limit but declared by the user to
8665 be in a section other than .sbss or .sdata. */
8666 fputs ("\t.extern\t", file);
8667 assemble_name (file, name);
8668 fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
8669 int_size_in_bytes (TREE_TYPE (decl)));
8674 /* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME. */
8676 static void
8677 mips_output_filename (FILE *stream, const char *name)
8679 /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
8680 directives. */
8681 if (write_symbols == DWARF2_DEBUG)
8682 return;
8683 else if (mips_output_filename_first_time)
8685 mips_output_filename_first_time = 0;
8686 num_source_filenames += 1;
8687 current_function_file = name;
8688 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8689 output_quoted_string (stream, name);
8690 putc ('\n', stream);
8692 /* If we are emitting stabs, let dbxout.c handle this (except for
8693 the mips_output_filename_first_time case). */
8694 else if (write_symbols == DBX_DEBUG)
8695 return;
8696 else if (name != current_function_file
8697 && strcmp (name, current_function_file) != 0)
8699 num_source_filenames += 1;
8700 current_function_file = name;
8701 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8702 output_quoted_string (stream, name);
8703 putc ('\n', stream);
8707 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL. */
8709 static void ATTRIBUTE_UNUSED
8710 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
8712 switch (size)
8714 case 4:
8715 fputs ("\t.dtprelword\t", file);
8716 break;
8718 case 8:
8719 fputs ("\t.dtpreldword\t", file);
8720 break;
8722 default:
8723 gcc_unreachable ();
8725 output_addr_const (file, x);
8726 fputs ("+0x8000", file);
8729 /* Implement TARGET_DWARF_REGISTER_SPAN. */
8731 static rtx
8732 mips_dwarf_register_span (rtx reg)
8734 rtx high, low;
8735 machine_mode mode;
8737 /* TARGET_FLOATXX is implemented as 32-bit floating-point registers but
8738 ensures that double-precision registers are treated as if they were
8739 64-bit physical registers. The code will run correctly with 32-bit or
8740 64-bit registers which means that dwarf information cannot be precise
8741 for all scenarios. We choose to state that the 64-bit values are stored
8742 in a single 64-bit 'piece'. This slightly unusual construct can then be
8743 interpreted as either a pair of registers if the registers are 32-bit or
8744 a single 64-bit register depending on hardware. */
8745 mode = GET_MODE (reg);
8746 if (FP_REG_P (REGNO (reg))
8747 && TARGET_FLOATXX
8748 && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8750 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, reg));
8752 /* By default, GCC maps increasing register numbers to increasing
8753 memory locations, but paired FPRs are always little-endian,
8754 regardless of the prevailing endianness. */
8755 else if (FP_REG_P (REGNO (reg))
8756 && TARGET_BIG_ENDIAN
8757 && MAX_FPRS_PER_FMT > 1
8758 && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8760 gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8761 high = mips_subword (reg, true);
8762 low = mips_subword (reg, false);
8763 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8766 return NULL_RTX;
8769 /* Implement TARGET_DWARF_FRAME_REG_MODE. */
8771 static machine_mode
8772 mips_dwarf_frame_reg_mode (int regno)
8774 machine_mode mode = default_dwarf_frame_reg_mode (regno);
8776 if (FP_REG_P (regno) && mips_abi == ABI_32 && TARGET_FLOAT64)
8777 mode = SImode;
8779 return mode;
8782 /* DSP ALU can bypass data with no delays for the following pairs. */
8783 enum insn_code dspalu_bypass_table[][2] =
8785 {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
8786 {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
8787 {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
8788 {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
8789 {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
8790 {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
8791 {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
8792 {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
8796 mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
8798 int i;
8799 int num_bypass = ARRAY_SIZE (dspalu_bypass_table);
8800 enum insn_code out_icode = (enum insn_code) INSN_CODE (out_insn);
8801 enum insn_code in_icode = (enum insn_code) INSN_CODE (in_insn);
8803 for (i = 0; i < num_bypass; i++)
8805 if (out_icode == dspalu_bypass_table[i][0]
8806 && in_icode == dspalu_bypass_table[i][1])
8807 return true;
8810 return false;
8812 /* Implement ASM_OUTPUT_ASCII. */
8814 void
8815 mips_output_ascii (FILE *stream, const char *string, size_t len)
8817 size_t i;
8818 int cur_pos;
8820 cur_pos = 17;
8821 fprintf (stream, "\t.ascii\t\"");
8822 for (i = 0; i < len; i++)
8824 int c;
8826 c = (unsigned char) string[i];
8827 if (ISPRINT (c))
8829 if (c == '\\' || c == '\"')
8831 putc ('\\', stream);
8832 cur_pos++;
8834 putc (c, stream);
8835 cur_pos++;
8837 else
8839 fprintf (stream, "\\%03o", c);
8840 cur_pos += 4;
8843 if (cur_pos > 72 && i+1 < len)
8845 cur_pos = 17;
8846 fprintf (stream, "\"\n\t.ascii\t\"");
8849 fprintf (stream, "\"\n");
8852 /* Return the pseudo-op for full SYMBOL_(D)TPREL address *ADDR.
8853 Update *ADDR with the operand that should be printed. */
8855 const char *
8856 mips_output_tls_reloc_directive (rtx *addr)
8858 enum mips_symbol_type type;
8860 type = mips_classify_symbolic_expression (*addr, SYMBOL_CONTEXT_LEA);
8861 *addr = mips_strip_unspec_address (*addr);
8862 switch (type)
8864 case SYMBOL_DTPREL:
8865 return Pmode == SImode ? ".dtprelword\t%0" : ".dtpreldword\t%0";
8867 case SYMBOL_TPREL:
8868 return Pmode == SImode ? ".tprelword\t%0" : ".tpreldword\t%0";
8870 default:
8871 gcc_unreachable ();
8875 /* Emit either a label, .comm, or .lcomm directive. When using assembler
8876 macros, mark the symbol as written so that mips_asm_output_external
8877 won't emit an .extern for it. STREAM is the output file, NAME is the
8878 name of the symbol, INIT_STRING is the string that should be written
8879 before the symbol and FINAL_STRING is the string that should be
8880 written after it. FINAL_STRING is a printf format that consumes the
8881 remaining arguments. */
8883 void
8884 mips_declare_object (FILE *stream, const char *name, const char *init_string,
8885 const char *final_string, ...)
8887 va_list ap;
8889 fputs (init_string, stream);
8890 assemble_name (stream, name);
8891 va_start (ap, final_string);
8892 vfprintf (stream, final_string, ap);
8893 va_end (ap);
8895 if (!TARGET_EXPLICIT_RELOCS)
8897 tree name_tree = get_identifier (name);
8898 TREE_ASM_WRITTEN (name_tree) = 1;
8902 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8903 NAME is the name of the object and ALIGN is the required alignment
8904 in bytes. TAKES_ALIGNMENT_P is true if the directive takes a third
8905 alignment argument. */
8907 void
8908 mips_declare_common_object (FILE *stream, const char *name,
8909 const char *init_string,
8910 unsigned HOST_WIDE_INT size,
8911 unsigned int align, bool takes_alignment_p)
8913 if (!takes_alignment_p)
8915 size += (align / BITS_PER_UNIT) - 1;
8916 size -= size % (align / BITS_PER_UNIT);
8917 mips_declare_object (stream, name, init_string,
8918 "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8920 else
8921 mips_declare_object (stream, name, init_string,
8922 "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8923 size, align / BITS_PER_UNIT);
8926 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This is usually the same as the
8927 elfos.h version, but we also need to handle -muninit-const-in-rodata. */
8929 void
8930 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8931 unsigned HOST_WIDE_INT size,
8932 unsigned int align)
8934 /* If the target wants uninitialized const declarations in
8935 .rdata then don't put them in .comm. */
8936 if (TARGET_EMBEDDED_DATA
8937 && TARGET_UNINIT_CONST_IN_RODATA
8938 && TREE_CODE (decl) == VAR_DECL
8939 && TREE_READONLY (decl)
8940 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8942 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8943 targetm.asm_out.globalize_label (stream, name);
8945 switch_to_section (readonly_data_section);
8946 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8947 mips_declare_object (stream, name, "",
8948 ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8949 size);
8951 else
8952 mips_declare_common_object (stream, name, "\n\t.comm\t",
8953 size, align, true);
8956 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8957 extern int size_directive_output;
8959 /* Implement ASM_DECLARE_OBJECT_NAME. This is like most of the standard ELF
8960 definitions except that it uses mips_declare_object to emit the label. */
8962 void
8963 mips_declare_object_name (FILE *stream, const char *name,
8964 tree decl ATTRIBUTE_UNUSED)
8966 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8967 ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8968 #endif
8970 size_directive_output = 0;
8971 if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8973 HOST_WIDE_INT size;
8975 size_directive_output = 1;
8976 size = int_size_in_bytes (TREE_TYPE (decl));
8977 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8980 mips_declare_object (stream, name, "", ":\n");
8983 /* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
8985 void
8986 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8988 const char *name;
8990 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8991 if (!flag_inhibit_size_directive
8992 && DECL_SIZE (decl) != 0
8993 && !at_end
8994 && top_level
8995 && DECL_INITIAL (decl) == error_mark_node
8996 && !size_directive_output)
8998 HOST_WIDE_INT size;
9000 size_directive_output = 1;
9001 size = int_size_in_bytes (TREE_TYPE (decl));
9002 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
9005 #endif
9007 /* Return the FOO in the name of the ".mdebug.FOO" section associated
9008 with the current ABI. */
9010 static const char *
9011 mips_mdebug_abi_name (void)
9013 switch (mips_abi)
9015 case ABI_32:
9016 return "abi32";
9017 case ABI_O64:
9018 return "abiO64";
9019 case ABI_N32:
9020 return "abiN32";
9021 case ABI_64:
9022 return "abi64";
9023 case ABI_EABI:
9024 return TARGET_64BIT ? "eabi64" : "eabi32";
9025 default:
9026 gcc_unreachable ();
9030 /* Implement TARGET_ASM_FILE_START. */
9032 static void
9033 mips_file_start (void)
9035 default_file_start ();
9037 /* Generate a special section to describe the ABI switches used to
9038 produce the resultant binary. */
9040 /* Record the ABI itself. Modern versions of binutils encode
9041 this information in the ELF header flags, but GDB needs the
9042 information in order to correctly debug binaries produced by
9043 older binutils. See the function mips_gdbarch_init in
9044 gdb/mips-tdep.c. */
9045 fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
9046 mips_mdebug_abi_name ());
9048 /* There is no ELF header flag to distinguish long32 forms of the
9049 EABI from long64 forms. Emit a special section to help tools
9050 such as GDB. Do the same for o64, which is sometimes used with
9051 -mlong64. */
9052 if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
9053 fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
9054 "\t.previous\n", TARGET_LONG64 ? 64 : 32);
9056 /* Record the NaN encoding. */
9057 if (HAVE_AS_NAN || mips_nan != MIPS_IEEE_754_DEFAULT)
9058 fprintf (asm_out_file, "\t.nan\t%s\n",
9059 mips_nan == MIPS_IEEE_754_2008 ? "2008" : "legacy");
9061 #ifdef HAVE_AS_DOT_MODULE
9062 /* Record the FP ABI. See below for comments. */
9063 if (TARGET_NO_FLOAT)
9064 #ifdef HAVE_AS_GNU_ATTRIBUTE
9065 fputs ("\t.gnu_attribute 4, 0\n", asm_out_file);
9066 #else
9068 #endif
9069 else if (!TARGET_HARD_FLOAT_ABI)
9070 fputs ("\t.module\tsoftfloat\n", asm_out_file);
9071 else if (!TARGET_DOUBLE_FLOAT)
9072 fputs ("\t.module\tsinglefloat\n", asm_out_file);
9073 else if (TARGET_FLOATXX)
9074 fputs ("\t.module\tfp=xx\n", asm_out_file);
9075 else if (TARGET_FLOAT64)
9076 fputs ("\t.module\tfp=64\n", asm_out_file);
9077 else
9078 fputs ("\t.module\tfp=32\n", asm_out_file);
9080 if (TARGET_ODD_SPREG)
9081 fputs ("\t.module\toddspreg\n", asm_out_file);
9082 else
9083 fputs ("\t.module\tnooddspreg\n", asm_out_file);
9085 #else
9086 #ifdef HAVE_AS_GNU_ATTRIBUTE
9088 int attr;
9090 /* No floating-point operations, -mno-float. */
9091 if (TARGET_NO_FLOAT)
9092 attr = 0;
9093 /* Soft-float code, -msoft-float. */
9094 else if (!TARGET_HARD_FLOAT_ABI)
9095 attr = 3;
9096 /* Single-float code, -msingle-float. */
9097 else if (!TARGET_DOUBLE_FLOAT)
9098 attr = 2;
9099 /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.
9100 Reserved attr=4.
9101 This case used 12 callee-saved double-precision registers
9102 and is deprecated. */
9103 /* 64-bit or 32-bit FP registers on a 32-bit target, -mfpxx. */
9104 else if (TARGET_FLOATXX)
9105 attr = 5;
9106 /* 64-bit FP registers on a 32-bit target, -mfp64 -modd-spreg. */
9107 else if (mips_abi == ABI_32 && TARGET_FLOAT64 && TARGET_ODD_SPREG)
9108 attr = 6;
9109 /* 64-bit FP registers on a 32-bit target, -mfp64 -mno-odd-spreg. */
9110 else if (mips_abi == ABI_32 && TARGET_FLOAT64)
9111 attr = 7;
9112 /* Regular FP code, FP regs same size as GP regs, -mdouble-float. */
9113 else
9114 attr = 1;
9116 fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
9118 #endif
9119 #endif
9121 /* If TARGET_ABICALLS, tell GAS to generate -KPIC code. */
9122 if (TARGET_ABICALLS)
9124 fprintf (asm_out_file, "\t.abicalls\n");
9125 if (TARGET_ABICALLS_PIC0)
9126 fprintf (asm_out_file, "\t.option\tpic0\n");
9129 if (flag_verbose_asm)
9130 fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
9131 ASM_COMMENT_START,
9132 mips_small_data_threshold, mips_arch_info->name, mips_isa);
9135 /* Implement TARGET_ASM_CODE_END. */
9137 static void
9138 mips_code_end (void)
9140 mips_finish_stub (&mips16_rdhwr_stub);
9141 mips_finish_stub (&mips16_get_fcsr_stub);
9142 mips_finish_stub (&mips16_set_fcsr_stub);
9145 /* Make the last instruction frame-related and note that it performs
9146 the operation described by FRAME_PATTERN. */
9148 static void
9149 mips_set_frame_expr (rtx frame_pattern)
9151 rtx_insn *insn;
9153 insn = get_last_insn ();
9154 RTX_FRAME_RELATED_P (insn) = 1;
9155 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9156 frame_pattern,
9157 REG_NOTES (insn));
9160 /* Return a frame-related rtx that stores REG at MEM.
9161 REG must be a single register. */
9163 static rtx
9164 mips_frame_set (rtx mem, rtx reg)
9166 rtx set;
9168 set = gen_rtx_SET (VOIDmode, mem, reg);
9169 RTX_FRAME_RELATED_P (set) = 1;
9171 return set;
9174 /* Record that the epilogue has restored call-saved register REG. */
9176 static void
9177 mips_add_cfa_restore (rtx reg)
9179 mips_epilogue.cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
9180 mips_epilogue.cfa_restores);
9183 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
9184 mips16e_s2_s8_regs[X], it must also save the registers in indexes
9185 X + 1 onwards. Likewise mips16e_a0_a3_regs. */
9186 static const unsigned char mips16e_s2_s8_regs[] = {
9187 30, 23, 22, 21, 20, 19, 18
9189 static const unsigned char mips16e_a0_a3_regs[] = {
9190 4, 5, 6, 7
9193 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
9194 ordered from the uppermost in memory to the lowest in memory. */
9195 static const unsigned char mips16e_save_restore_regs[] = {
9196 31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
9199 /* Return the index of the lowest X in the range [0, SIZE) for which
9200 bit REGS[X] is set in MASK. Return SIZE if there is no such X. */
9202 static unsigned int
9203 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
9204 unsigned int size)
9206 unsigned int i;
9208 for (i = 0; i < size; i++)
9209 if (BITSET_P (mask, regs[i]))
9210 break;
9212 return i;
9215 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
9216 is the number of set bits. If *MASK_PTR contains REGS[X] for some X
9217 in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
9218 is true for all indexes (X, SIZE). */
9220 static void
9221 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
9222 unsigned int size, unsigned int *num_regs_ptr)
9224 unsigned int i;
9226 i = mips16e_find_first_register (*mask_ptr, regs, size);
9227 for (i++; i < size; i++)
9228 if (!BITSET_P (*mask_ptr, regs[i]))
9230 *num_regs_ptr += 1;
9231 *mask_ptr |= 1 << regs[i];
9235 /* Return a simplified form of X using the register values in REG_VALUES.
9236 REG_VALUES[R] is the last value assigned to hard register R, or null
9237 if R has not been modified.
9239 This function is rather limited, but is good enough for our purposes. */
9241 static rtx
9242 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
9244 x = avoid_constant_pool_reference (x);
9246 if (UNARY_P (x))
9248 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9249 return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
9250 x0, GET_MODE (XEXP (x, 0)));
9253 if (ARITHMETIC_P (x))
9255 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9256 rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
9257 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
9260 if (REG_P (x)
9261 && reg_values[REGNO (x)]
9262 && !rtx_unstable_p (reg_values[REGNO (x)]))
9263 return reg_values[REGNO (x)];
9265 return x;
9268 /* Return true if (set DEST SRC) stores an argument register into its
9269 caller-allocated save slot, storing the number of that argument
9270 register in *REGNO_PTR if so. REG_VALUES is as for
9271 mips16e_collect_propagate_value. */
9273 static bool
9274 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
9275 unsigned int *regno_ptr)
9277 unsigned int argno, regno;
9278 HOST_WIDE_INT offset, required_offset;
9279 rtx addr, base;
9281 /* Check that this is a word-mode store. */
9282 if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
9283 return false;
9285 /* Check that the register being saved is an unmodified argument
9286 register. */
9287 regno = REGNO (src);
9288 if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
9289 return false;
9290 argno = regno - GP_ARG_FIRST;
9292 /* Check whether the address is an appropriate stack-pointer or
9293 frame-pointer access. */
9294 addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
9295 mips_split_plus (addr, &base, &offset);
9296 required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
9297 if (base == hard_frame_pointer_rtx)
9298 required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
9299 else if (base != stack_pointer_rtx)
9300 return false;
9301 if (offset != required_offset)
9302 return false;
9304 *regno_ptr = regno;
9305 return true;
9308 /* A subroutine of mips_expand_prologue, called only when generating
9309 MIPS16e SAVE instructions. Search the start of the function for any
9310 instructions that save argument registers into their caller-allocated
9311 save slots. Delete such instructions and return a value N such that
9312 saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
9313 instructions redundant. */
9315 static unsigned int
9316 mips16e_collect_argument_saves (void)
9318 rtx reg_values[FIRST_PSEUDO_REGISTER];
9319 rtx_insn *insn, *next;
9320 rtx set, dest, src;
9321 unsigned int nargs, regno;
9323 push_topmost_sequence ();
9324 nargs = 0;
9325 memset (reg_values, 0, sizeof (reg_values));
9326 for (insn = get_insns (); insn; insn = next)
9328 next = NEXT_INSN (insn);
9329 if (NOTE_P (insn) || DEBUG_INSN_P (insn))
9330 continue;
9332 if (!INSN_P (insn))
9333 break;
9335 set = PATTERN (insn);
9336 if (GET_CODE (set) != SET)
9337 break;
9339 dest = SET_DEST (set);
9340 src = SET_SRC (set);
9341 if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
9343 if (!BITSET_P (cfun->machine->frame.mask, regno))
9345 delete_insn (insn);
9346 nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
9349 else if (REG_P (dest) && GET_MODE (dest) == word_mode)
9350 reg_values[REGNO (dest)]
9351 = mips16e_collect_propagate_value (src, reg_values);
9352 else
9353 break;
9355 pop_topmost_sequence ();
9357 return nargs;
9360 /* Return a move between register REGNO and memory location SP + OFFSET.
9361 REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
9362 Make the move a load if RESTORE_P, otherwise make it a store. */
9364 static rtx
9365 mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
9366 HOST_WIDE_INT offset, unsigned int regno)
9368 rtx reg, mem;
9370 mem = gen_frame_mem (SImode, plus_constant (Pmode, stack_pointer_rtx,
9371 offset));
9372 reg = gen_rtx_REG (SImode, regno);
9373 if (restore_p)
9375 mips_add_cfa_restore (reg);
9376 return gen_rtx_SET (VOIDmode, reg, mem);
9378 if (reg_parm_p)
9379 return gen_rtx_SET (VOIDmode, mem, reg);
9380 return mips_frame_set (mem, reg);
9383 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
9384 The instruction must:
9386 - Allocate or deallocate SIZE bytes in total; SIZE is known
9387 to be nonzero.
9389 - Save or restore as many registers in *MASK_PTR as possible.
9390 The instruction saves the first registers at the top of the
9391 allocated area, with the other registers below it.
9393 - Save NARGS argument registers above the allocated area.
9395 (NARGS is always zero if RESTORE_P.)
9397 The SAVE and RESTORE instructions cannot save and restore all general
9398 registers, so there may be some registers left over for the caller to
9399 handle. Destructively modify *MASK_PTR so that it contains the registers
9400 that still need to be saved or restored. The caller can save these
9401 registers in the memory immediately below *OFFSET_PTR, which is a
9402 byte offset from the bottom of the allocated stack area. */
9404 static rtx
9405 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
9406 HOST_WIDE_INT *offset_ptr, unsigned int nargs,
9407 HOST_WIDE_INT size)
9409 rtx pattern, set;
9410 HOST_WIDE_INT offset, top_offset;
9411 unsigned int i, regno;
9412 int n;
9414 gcc_assert (cfun->machine->frame.num_fp == 0);
9416 /* Calculate the number of elements in the PARALLEL. We need one element
9417 for the stack adjustment, one for each argument register save, and one
9418 for each additional register move. */
9419 n = 1 + nargs;
9420 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9421 if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
9422 n++;
9424 /* Create the final PARALLEL. */
9425 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
9426 n = 0;
9428 /* Add the stack pointer adjustment. */
9429 set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9430 plus_constant (Pmode, stack_pointer_rtx,
9431 restore_p ? size : -size));
9432 RTX_FRAME_RELATED_P (set) = 1;
9433 XVECEXP (pattern, 0, n++) = set;
9435 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9436 top_offset = restore_p ? size : 0;
9438 /* Save the arguments. */
9439 for (i = 0; i < nargs; i++)
9441 offset = top_offset + i * UNITS_PER_WORD;
9442 set = mips16e_save_restore_reg (restore_p, true, offset,
9443 GP_ARG_FIRST + i);
9444 XVECEXP (pattern, 0, n++) = set;
9447 /* Then fill in the other register moves. */
9448 offset = top_offset;
9449 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9451 regno = mips16e_save_restore_regs[i];
9452 if (BITSET_P (*mask_ptr, regno))
9454 offset -= UNITS_PER_WORD;
9455 set = mips16e_save_restore_reg (restore_p, false, offset, regno);
9456 XVECEXP (pattern, 0, n++) = set;
9457 *mask_ptr &= ~(1 << regno);
9461 /* Tell the caller what offset it should use for the remaining registers. */
9462 *offset_ptr = size + (offset - top_offset);
9464 gcc_assert (n == XVECLEN (pattern, 0));
9466 return pattern;
9469 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
9470 pointer. Return true if PATTERN matches the kind of instruction
9471 generated by mips16e_build_save_restore. If INFO is nonnull,
9472 initialize it when returning true. */
9474 bool
9475 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
9476 struct mips16e_save_restore_info *info)
9478 unsigned int i, nargs, mask, extra;
9479 HOST_WIDE_INT top_offset, save_offset, offset;
9480 rtx set, reg, mem, base;
9481 int n;
9483 if (!GENERATE_MIPS16E_SAVE_RESTORE)
9484 return false;
9486 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9487 top_offset = adjust > 0 ? adjust : 0;
9489 /* Interpret all other members of the PARALLEL. */
9490 save_offset = top_offset - UNITS_PER_WORD;
9491 mask = 0;
9492 nargs = 0;
9493 i = 0;
9494 for (n = 1; n < XVECLEN (pattern, 0); n++)
9496 /* Check that we have a SET. */
9497 set = XVECEXP (pattern, 0, n);
9498 if (GET_CODE (set) != SET)
9499 return false;
9501 /* Check that the SET is a load (if restoring) or a store
9502 (if saving). */
9503 mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
9504 if (!MEM_P (mem))
9505 return false;
9507 /* Check that the address is the sum of the stack pointer and a
9508 possibly-zero constant offset. */
9509 mips_split_plus (XEXP (mem, 0), &base, &offset);
9510 if (base != stack_pointer_rtx)
9511 return false;
9513 /* Check that SET's other operand is a register. */
9514 reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
9515 if (!REG_P (reg))
9516 return false;
9518 /* Check for argument saves. */
9519 if (offset == top_offset + nargs * UNITS_PER_WORD
9520 && REGNO (reg) == GP_ARG_FIRST + nargs)
9521 nargs++;
9522 else if (offset == save_offset)
9524 while (mips16e_save_restore_regs[i++] != REGNO (reg))
9525 if (i == ARRAY_SIZE (mips16e_save_restore_regs))
9526 return false;
9528 mask |= 1 << REGNO (reg);
9529 save_offset -= UNITS_PER_WORD;
9531 else
9532 return false;
9535 /* Check that the restrictions on register ranges are met. */
9536 extra = 0;
9537 mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
9538 ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
9539 mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
9540 ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
9541 if (extra != 0)
9542 return false;
9544 /* Make sure that the topmost argument register is not saved twice.
9545 The checks above ensure that the same is then true for the other
9546 argument registers. */
9547 if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
9548 return false;
9550 /* Pass back information, if requested. */
9551 if (info)
9553 info->nargs = nargs;
9554 info->mask = mask;
9555 info->size = (adjust > 0 ? adjust : -adjust);
9558 return true;
9561 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
9562 for the register range [MIN_REG, MAX_REG]. Return a pointer to
9563 the null terminator. */
9565 static char *
9566 mips16e_add_register_range (char *s, unsigned int min_reg,
9567 unsigned int max_reg)
9569 if (min_reg != max_reg)
9570 s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
9571 else
9572 s += sprintf (s, ",%s", reg_names[min_reg]);
9573 return s;
9576 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
9577 PATTERN and ADJUST are as for mips16e_save_restore_pattern_p. */
9579 const char *
9580 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
9582 static char buffer[300];
9584 struct mips16e_save_restore_info info;
9585 unsigned int i, end;
9586 char *s;
9588 /* Parse the pattern. */
9589 if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
9590 gcc_unreachable ();
9592 /* Add the mnemonic. */
9593 s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
9594 s += strlen (s);
9596 /* Save the arguments. */
9597 if (info.nargs > 1)
9598 s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
9599 reg_names[GP_ARG_FIRST + info.nargs - 1]);
9600 else if (info.nargs == 1)
9601 s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
9603 /* Emit the amount of stack space to allocate or deallocate. */
9604 s += sprintf (s, "%d", (int) info.size);
9606 /* Save or restore $16. */
9607 if (BITSET_P (info.mask, 16))
9608 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
9610 /* Save or restore $17. */
9611 if (BITSET_P (info.mask, 17))
9612 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
9614 /* Save or restore registers in the range $s2...$s8, which
9615 mips16e_s2_s8_regs lists in decreasing order. Note that this
9616 is a software register range; the hardware registers are not
9617 numbered consecutively. */
9618 end = ARRAY_SIZE (mips16e_s2_s8_regs);
9619 i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
9620 if (i < end)
9621 s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
9622 mips16e_s2_s8_regs[i]);
9624 /* Save or restore registers in the range $a0...$a3. */
9625 end = ARRAY_SIZE (mips16e_a0_a3_regs);
9626 i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
9627 if (i < end)
9628 s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
9629 mips16e_a0_a3_regs[end - 1]);
9631 /* Save or restore $31. */
9632 if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
9633 s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
9635 return buffer;
9638 /* Return true if the current function returns its value in a floating-point
9639 register in MIPS16 mode. */
9641 static bool
9642 mips16_cfun_returns_in_fpr_p (void)
9644 tree return_type = DECL_RESULT (current_function_decl);
9645 return (TARGET_MIPS16
9646 && TARGET_HARD_FLOAT_ABI
9647 && !aggregate_value_p (return_type, current_function_decl)
9648 && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
9651 /* Return true if predicate PRED is true for at least one instruction.
9652 Cache the result in *CACHE, and assume that the result is true
9653 if *CACHE is already true. */
9655 static bool
9656 mips_find_gp_ref (bool *cache, bool (*pred) (rtx_insn *))
9658 rtx_insn *insn;
9660 if (!*cache)
9662 push_topmost_sequence ();
9663 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9664 if (USEFUL_INSN_P (insn) && pred (insn))
9666 *cache = true;
9667 break;
9669 pop_topmost_sequence ();
9671 return *cache;
9674 /* Return true if INSN refers to the global pointer in an "inflexible" way.
9675 See mips_cfun_has_inflexible_gp_ref_p for details. */
9677 static bool
9678 mips_insn_has_inflexible_gp_ref_p (rtx_insn *insn)
9680 /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
9681 indicate that the target could be a traditional MIPS
9682 lazily-binding stub. */
9683 return find_reg_fusage (insn, USE, pic_offset_table_rtx);
9686 /* Return true if the current function refers to the global pointer
9687 in a way that forces $28 to be valid. This means that we can't
9688 change the choice of global pointer, even for NewABI code.
9690 One example of this (and one which needs several checks) is that
9691 $28 must be valid when calling traditional MIPS lazy-binding stubs.
9692 (This restriction does not apply to PLTs.) */
9694 static bool
9695 mips_cfun_has_inflexible_gp_ref_p (void)
9697 /* If the function has a nonlocal goto, $28 must hold the correct
9698 global pointer for the target function. That is, the target
9699 of the goto implicitly uses $28. */
9700 if (crtl->has_nonlocal_goto)
9701 return true;
9703 if (TARGET_ABICALLS_PIC2)
9705 /* Symbolic accesses implicitly use the global pointer unless
9706 -mexplicit-relocs is in effect. JAL macros to symbolic addresses
9707 might go to traditional MIPS lazy-binding stubs. */
9708 if (!TARGET_EXPLICIT_RELOCS)
9709 return true;
9711 /* FUNCTION_PROFILER includes a JAL to _mcount, which again
9712 can be lazily-bound. */
9713 if (crtl->profile)
9714 return true;
9716 /* MIPS16 functions that return in FPRs need to call an
9717 external libgcc routine. This call is only made explict
9718 during mips_expand_epilogue, and it too might be lazily bound. */
9719 if (mips16_cfun_returns_in_fpr_p ())
9720 return true;
9723 return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
9724 mips_insn_has_inflexible_gp_ref_p);
9727 /* Return true if INSN refers to the global pointer in a "flexible" way.
9728 See mips_cfun_has_flexible_gp_ref_p for details. */
9730 static bool
9731 mips_insn_has_flexible_gp_ref_p (rtx_insn *insn)
9733 return (get_attr_got (insn) != GOT_UNSET
9734 || mips_small_data_pattern_p (PATTERN (insn))
9735 || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
9738 /* Return true if the current function references the global pointer,
9739 but if those references do not inherently require the global pointer
9740 to be $28. Assume !mips_cfun_has_inflexible_gp_ref_p (). */
9742 static bool
9743 mips_cfun_has_flexible_gp_ref_p (void)
9745 /* Reload can sometimes introduce constant pool references
9746 into a function that otherwise didn't need them. For example,
9747 suppose we have an instruction like:
9749 (set (reg:DF R1) (float:DF (reg:SI R2)))
9751 If R2 turns out to be a constant such as 1, the instruction may
9752 have a REG_EQUAL note saying that R1 == 1.0. Reload then has
9753 the option of using this constant if R2 doesn't get allocated
9754 to a register.
9756 In cases like these, reload will have added the constant to the
9757 pool but no instruction will yet refer to it. */
9758 if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
9759 return true;
9761 return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
9762 mips_insn_has_flexible_gp_ref_p);
9765 /* Return the register that should be used as the global pointer
9766 within this function. Return INVALID_REGNUM if the function
9767 doesn't need a global pointer. */
9769 static unsigned int
9770 mips_global_pointer (void)
9772 unsigned int regno;
9774 /* $gp is always available unless we're using a GOT. */
9775 if (!TARGET_USE_GOT)
9776 return GLOBAL_POINTER_REGNUM;
9778 /* If there are inflexible references to $gp, we must use the
9779 standard register. */
9780 if (mips_cfun_has_inflexible_gp_ref_p ())
9781 return GLOBAL_POINTER_REGNUM;
9783 /* If there are no current references to $gp, then the only uses
9784 we can introduce later are those involved in long branches. */
9785 if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
9786 return INVALID_REGNUM;
9788 /* If the global pointer is call-saved, try to use a call-clobbered
9789 alternative. */
9790 if (TARGET_CALL_SAVED_GP && crtl->is_leaf)
9791 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9792 if (!df_regs_ever_live_p (regno)
9793 && call_really_used_regs[regno]
9794 && !fixed_regs[regno]
9795 && regno != PIC_FUNCTION_ADDR_REGNUM)
9796 return regno;
9798 return GLOBAL_POINTER_REGNUM;
9801 /* Return true if the current function's prologue must load the global
9802 pointer value into pic_offset_table_rtx and store the same value in
9803 the function's cprestore slot (if any).
9805 One problem we have to deal with is that, when emitting GOT-based
9806 position independent code, long-branch sequences will need to load
9807 the address of the branch target from the GOT. We don't know until
9808 the very end of compilation whether (and where) the function needs
9809 long branches, so we must ensure that _any_ branch can access the
9810 global pointer in some form. However, we do not want to pessimize
9811 the usual case in which all branches are short.
9813 We handle this as follows:
9815 (1) During reload, we set cfun->machine->global_pointer to
9816 INVALID_REGNUM if we _know_ that the current function
9817 doesn't need a global pointer. This is only valid if
9818 long branches don't need the GOT.
9820 Otherwise, we assume that we might need a global pointer
9821 and pick an appropriate register.
9823 (2) If cfun->machine->global_pointer != INVALID_REGNUM,
9824 we ensure that the global pointer is available at every
9825 block boundary bar entry and exit. We do this in one of two ways:
9827 - If the function has a cprestore slot, we ensure that this
9828 slot is valid at every branch. However, as explained in
9829 point (6) below, there is no guarantee that pic_offset_table_rtx
9830 itself is valid if new uses of the global pointer are introduced
9831 after the first post-epilogue split.
9833 We guarantee that the cprestore slot is valid by loading it
9834 into a fake register, CPRESTORE_SLOT_REGNUM. We then make
9835 this register live at every block boundary bar function entry
9836 and exit. It is then invalid to move the load (and thus the
9837 preceding store) across a block boundary.
9839 - If the function has no cprestore slot, we guarantee that
9840 pic_offset_table_rtx itself is valid at every branch.
9842 See mips_eh_uses for the handling of the register liveness.
9844 (3) During prologue and epilogue generation, we emit "ghost"
9845 placeholder instructions to manipulate the global pointer.
9847 (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
9848 and cfun->machine->must_restore_gp_when_clobbered_p if we already know
9849 that the function needs a global pointer. (There is no need to set
9850 them earlier than this, and doing it as late as possible leads to
9851 fewer false positives.)
9853 (5) If cfun->machine->must_initialize_gp_p is true during a
9854 split_insns pass, we split the ghost instructions into real
9855 instructions. These split instructions can then be optimized in
9856 the usual way. Otherwise, we keep the ghost instructions intact,
9857 and optimize for the case where they aren't needed. We still
9858 have the option of splitting them later, if we need to introduce
9859 new uses of the global pointer.
9861 For example, the scheduler ignores a ghost instruction that
9862 stores $28 to the stack, but it handles the split form of
9863 the ghost instruction as an ordinary store.
9865 (6) [OldABI only.] If cfun->machine->must_restore_gp_when_clobbered_p
9866 is true during the first post-epilogue split_insns pass, we split
9867 calls and restore_gp patterns into instructions that explicitly
9868 load pic_offset_table_rtx from the cprestore slot. Otherwise,
9869 we split these patterns into instructions that _don't_ load from
9870 the cprestore slot.
9872 If cfun->machine->must_restore_gp_when_clobbered_p is true at the
9873 time of the split, then any instructions that exist at that time
9874 can make free use of pic_offset_table_rtx. However, if we want
9875 to introduce new uses of the global pointer after the split,
9876 we must explicitly load the value from the cprestore slot, since
9877 pic_offset_table_rtx itself might not be valid at a given point
9878 in the function.
9880 The idea is that we want to be able to delete redundant
9881 loads from the cprestore slot in the usual case where no
9882 long branches are needed.
9884 (7) If cfun->machine->must_initialize_gp_p is still false at the end
9885 of md_reorg, we decide whether the global pointer is needed for
9886 long branches. If so, we set cfun->machine->must_initialize_gp_p
9887 to true and split the ghost instructions into real instructions
9888 at that stage.
9890 Note that the ghost instructions must have a zero length for three reasons:
9892 - Giving the length of the underlying $gp sequence might cause
9893 us to use long branches in cases where they aren't really needed.
9895 - They would perturb things like alignment calculations.
9897 - More importantly, the hazard detection in md_reorg relies on
9898 empty instructions having a zero length.
9900 If we find a long branch and split the ghost instructions at the
9901 end of md_reorg, the split could introduce more long branches.
9902 That isn't a problem though, because we still do the split before
9903 the final shorten_branches pass.
9905 This is extremely ugly, but it seems like the best compromise between
9906 correctness and efficiency. */
9908 bool
9909 mips_must_initialize_gp_p (void)
9911 return cfun->machine->must_initialize_gp_p;
9914 /* Return true if REGNO is a register that is ordinarily call-clobbered
9915 but must nevertheless be preserved by an interrupt handler. */
9917 static bool
9918 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
9920 if (MD_REG_P (regno))
9921 return true;
9923 if (TARGET_DSP && DSP_ACC_REG_P (regno))
9924 return true;
9926 if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
9928 /* $0 is hard-wired. */
9929 if (regno == GP_REG_FIRST)
9930 return false;
9932 /* The interrupt handler can treat kernel registers as
9933 scratch registers. */
9934 if (KERNEL_REG_P (regno))
9935 return false;
9937 /* The function will return the stack pointer to its original value
9938 anyway. */
9939 if (regno == STACK_POINTER_REGNUM)
9940 return false;
9942 /* Otherwise, return true for registers that aren't ordinarily
9943 call-clobbered. */
9944 return call_really_used_regs[regno];
9947 return false;
9950 /* Return true if the current function should treat register REGNO
9951 as call-saved. */
9953 static bool
9954 mips_cfun_call_saved_reg_p (unsigned int regno)
9956 /* If the user makes an ordinarily-call-saved register global,
9957 that register is no longer call-saved. */
9958 if (global_regs[regno])
9959 return false;
9961 /* Interrupt handlers need to save extra registers. */
9962 if (cfun->machine->interrupt_handler_p
9963 && mips_interrupt_extra_call_saved_reg_p (regno))
9964 return true;
9966 /* call_insns preserve $28 unless they explicitly say otherwise,
9967 so call_really_used_regs[] treats $28 as call-saved. However,
9968 we want the ABI property rather than the default call_insn
9969 property here. */
9970 return (regno == GLOBAL_POINTER_REGNUM
9971 ? TARGET_CALL_SAVED_GP
9972 : !call_really_used_regs[regno]);
9975 /* Return true if the function body might clobber register REGNO.
9976 We know that REGNO is call-saved. */
9978 static bool
9979 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9981 /* Some functions should be treated as clobbering all call-saved
9982 registers. */
9983 if (crtl->saves_all_registers)
9984 return true;
9986 /* DF handles cases where a register is explicitly referenced in
9987 the rtl. Incoming values are passed in call-clobbered registers,
9988 so we can assume that any live call-saved register is set within
9989 the function. */
9990 if (df_regs_ever_live_p (regno))
9991 return true;
9993 /* Check for registers that are clobbered by FUNCTION_PROFILER.
9994 These clobbers are not explicit in the rtl. */
9995 if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9996 return true;
9998 /* If we're using a call-saved global pointer, the function's
9999 prologue will need to set it up. */
10000 if (cfun->machine->global_pointer == regno)
10001 return true;
10003 /* The function's prologue will need to set the frame pointer if
10004 frame_pointer_needed. */
10005 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
10006 return true;
10008 /* If a MIPS16 function returns a value in FPRs, its epilogue
10009 will need to call an external libgcc routine. This yet-to-be
10010 generated call_insn will clobber $31. */
10011 if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
10012 return true;
10014 /* If REGNO is ordinarily call-clobbered, we must assume that any
10015 called function could modify it. */
10016 if (cfun->machine->interrupt_handler_p
10017 && !crtl->is_leaf
10018 && mips_interrupt_extra_call_saved_reg_p (regno))
10019 return true;
10021 return false;
10024 /* Return true if the current function must save register REGNO. */
10026 static bool
10027 mips_save_reg_p (unsigned int regno)
10029 if (mips_cfun_call_saved_reg_p (regno))
10031 if (mips_cfun_might_clobber_call_saved_reg_p (regno))
10032 return true;
10034 /* Save both registers in an FPR pair if either one is used. This is
10035 needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
10036 register to be used without the even register. */
10037 if (FP_REG_P (regno)
10038 && MAX_FPRS_PER_FMT == 2
10039 && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
10040 return true;
10043 /* We need to save the incoming return address if __builtin_eh_return
10044 is being used to set a different return address. */
10045 if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
10046 return true;
10048 return false;
10051 /* Populate the current function's mips_frame_info structure.
10053 MIPS stack frames look like:
10055 +-------------------------------+
10057 | incoming stack arguments |
10059 +-------------------------------+
10061 | caller-allocated save area |
10062 A | for register arguments |
10064 +-------------------------------+ <-- incoming stack pointer
10066 | callee-allocated save area |
10067 B | for arguments that are |
10068 | split between registers and |
10069 | the stack |
10071 +-------------------------------+ <-- arg_pointer_rtx
10073 C | callee-allocated save area |
10074 | for register varargs |
10076 +-------------------------------+ <-- frame_pointer_rtx
10077 | | + cop0_sp_offset
10078 | COP0 reg save area | + UNITS_PER_WORD
10080 +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
10081 | | + UNITS_PER_WORD
10082 | accumulator save area |
10084 +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
10085 | | + UNITS_PER_HWFPVALUE
10086 | FPR save area |
10088 +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
10089 | | + UNITS_PER_WORD
10090 | GPR save area |
10092 +-------------------------------+ <-- frame_pointer_rtx with
10093 | | \ -fstack-protector
10094 | local variables | | var_size
10095 | | /
10096 +-------------------------------+
10097 | | \
10098 | $gp save area | | cprestore_size
10099 | | /
10100 P +-------------------------------+ <-- hard_frame_pointer_rtx for
10101 | | \ MIPS16 code
10102 | outgoing stack arguments | |
10103 | | |
10104 +-------------------------------+ | args_size
10105 | | |
10106 | caller-allocated save area | |
10107 | for register arguments | |
10108 | | /
10109 +-------------------------------+ <-- stack_pointer_rtx
10110 frame_pointer_rtx without
10111 -fstack-protector
10112 hard_frame_pointer_rtx for
10113 non-MIPS16 code.
10115 At least two of A, B and C will be empty.
10117 Dynamic stack allocations such as alloca insert data at point P.
10118 They decrease stack_pointer_rtx but leave frame_pointer_rtx and
10119 hard_frame_pointer_rtx unchanged. */
10121 static void
10122 mips_compute_frame_info (void)
10124 struct mips_frame_info *frame;
10125 HOST_WIDE_INT offset, size;
10126 unsigned int regno, i;
10128 /* Set this function's interrupt properties. */
10129 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
10131 if (mips_isa_rev < 2)
10132 error ("the %<interrupt%> attribute requires a MIPS32r2 processor or greater");
10133 else if (TARGET_HARD_FLOAT)
10134 error ("the %<interrupt%> attribute requires %<-msoft-float%>");
10135 else if (TARGET_MIPS16)
10136 error ("interrupt handlers cannot be MIPS16 functions");
10137 else
10139 cfun->machine->interrupt_handler_p = true;
10140 cfun->machine->use_shadow_register_set_p =
10141 mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
10142 cfun->machine->keep_interrupts_masked_p =
10143 mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
10144 cfun->machine->use_debug_exception_return_p =
10145 mips_use_debug_exception_return_p (TREE_TYPE
10146 (current_function_decl));
10150 frame = &cfun->machine->frame;
10151 memset (frame, 0, sizeof (*frame));
10152 size = get_frame_size ();
10154 cfun->machine->global_pointer = mips_global_pointer ();
10156 /* The first two blocks contain the outgoing argument area and the $gp save
10157 slot. This area isn't needed in leaf functions, but if the
10158 target-independent frame size is nonzero, we have already committed to
10159 allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD. */
10160 if ((size == 0 || FRAME_GROWS_DOWNWARD) && crtl->is_leaf)
10162 /* The MIPS 3.0 linker does not like functions that dynamically
10163 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
10164 looks like we are trying to create a second frame pointer to the
10165 function, so allocate some stack space to make it happy. */
10166 if (cfun->calls_alloca)
10167 frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
10168 else
10169 frame->args_size = 0;
10170 frame->cprestore_size = 0;
10172 else
10174 frame->args_size = crtl->outgoing_args_size;
10175 frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
10177 offset = frame->args_size + frame->cprestore_size;
10179 /* Move above the local variables. */
10180 frame->var_size = MIPS_STACK_ALIGN (size);
10181 offset += frame->var_size;
10183 /* Find out which GPRs we need to save. */
10184 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
10185 if (mips_save_reg_p (regno))
10187 frame->num_gp++;
10188 frame->mask |= 1 << (regno - GP_REG_FIRST);
10191 /* If this function calls eh_return, we must also save and restore the
10192 EH data registers. */
10193 if (crtl->calls_eh_return)
10194 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
10196 frame->num_gp++;
10197 frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
10200 /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
10201 $a3-$a0 and $s2-$s8. If we save one register in the range, we must
10202 save all later registers too. */
10203 if (GENERATE_MIPS16E_SAVE_RESTORE)
10205 mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
10206 ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
10207 mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
10208 ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
10211 /* Move above the GPR save area. */
10212 if (frame->num_gp > 0)
10214 offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
10215 frame->gp_sp_offset = offset - UNITS_PER_WORD;
10218 /* Find out which FPRs we need to save. This loop must iterate over
10219 the same space as its companion in mips_for_each_saved_gpr_and_fpr. */
10220 if (TARGET_HARD_FLOAT)
10221 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
10222 if (mips_save_reg_p (regno))
10224 frame->num_fp += MAX_FPRS_PER_FMT;
10225 frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
10228 /* Move above the FPR save area. */
10229 if (frame->num_fp > 0)
10231 offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
10232 frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
10235 /* Add in space for the interrupt context information. */
10236 if (cfun->machine->interrupt_handler_p)
10238 /* Check HI/LO. */
10239 if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
10241 frame->num_acc++;
10242 frame->acc_mask |= (1 << 0);
10245 /* Check accumulators 1, 2, 3. */
10246 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
10247 if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
10249 frame->num_acc++;
10250 frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
10253 /* All interrupt context functions need space to preserve STATUS. */
10254 frame->num_cop0_regs++;
10256 /* If we don't keep interrupts masked, we need to save EPC. */
10257 if (!cfun->machine->keep_interrupts_masked_p)
10258 frame->num_cop0_regs++;
10261 /* Move above the accumulator save area. */
10262 if (frame->num_acc > 0)
10264 /* Each accumulator needs 2 words. */
10265 offset += frame->num_acc * 2 * UNITS_PER_WORD;
10266 frame->acc_sp_offset = offset - UNITS_PER_WORD;
10269 /* Move above the COP0 register save area. */
10270 if (frame->num_cop0_regs > 0)
10272 offset += frame->num_cop0_regs * UNITS_PER_WORD;
10273 frame->cop0_sp_offset = offset - UNITS_PER_WORD;
10276 /* Move above the callee-allocated varargs save area. */
10277 offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
10278 frame->arg_pointer_offset = offset;
10280 /* Move above the callee-allocated area for pretend stack arguments. */
10281 offset += crtl->args.pretend_args_size;
10282 frame->total_size = offset;
10284 /* Work out the offsets of the save areas from the top of the frame. */
10285 if (frame->gp_sp_offset > 0)
10286 frame->gp_save_offset = frame->gp_sp_offset - offset;
10287 if (frame->fp_sp_offset > 0)
10288 frame->fp_save_offset = frame->fp_sp_offset - offset;
10289 if (frame->acc_sp_offset > 0)
10290 frame->acc_save_offset = frame->acc_sp_offset - offset;
10291 if (frame->num_cop0_regs > 0)
10292 frame->cop0_save_offset = frame->cop0_sp_offset - offset;
10294 /* MIPS16 code offsets the frame pointer by the size of the outgoing
10295 arguments. This tends to increase the chances of using unextended
10296 instructions for local variables and incoming arguments. */
10297 if (TARGET_MIPS16)
10298 frame->hard_frame_pointer_offset = frame->args_size;
10301 /* Return the style of GP load sequence that is being used for the
10302 current function. */
10304 enum mips_loadgp_style
10305 mips_current_loadgp_style (void)
10307 if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
10308 return LOADGP_NONE;
10310 if (TARGET_RTP_PIC)
10311 return LOADGP_RTP;
10313 if (TARGET_ABSOLUTE_ABICALLS)
10314 return LOADGP_ABSOLUTE;
10316 return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
10319 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
10321 static bool
10322 mips_frame_pointer_required (void)
10324 /* If the function contains dynamic stack allocations, we need to
10325 use the frame pointer to access the static parts of the frame. */
10326 if (cfun->calls_alloca)
10327 return true;
10329 /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
10330 reload may be unable to compute the address of a local variable,
10331 since there is no way to add a large constant to the stack pointer
10332 without using a second temporary register. */
10333 if (TARGET_MIPS16)
10335 mips_compute_frame_info ();
10336 if (!SMALL_OPERAND (cfun->machine->frame.total_size))
10337 return true;
10340 return false;
10343 /* Make sure that we're not trying to eliminate to the wrong hard frame
10344 pointer. */
10346 static bool
10347 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
10349 return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
10352 /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame pointer
10353 or argument pointer. TO is either the stack pointer or hard frame
10354 pointer. */
10356 HOST_WIDE_INT
10357 mips_initial_elimination_offset (int from, int to)
10359 HOST_WIDE_INT offset;
10361 mips_compute_frame_info ();
10363 /* Set OFFSET to the offset from the end-of-prologue stack pointer. */
10364 switch (from)
10366 case FRAME_POINTER_REGNUM:
10367 if (FRAME_GROWS_DOWNWARD)
10368 offset = (cfun->machine->frame.args_size
10369 + cfun->machine->frame.cprestore_size
10370 + cfun->machine->frame.var_size);
10371 else
10372 offset = 0;
10373 break;
10375 case ARG_POINTER_REGNUM:
10376 offset = cfun->machine->frame.arg_pointer_offset;
10377 break;
10379 default:
10380 gcc_unreachable ();
10383 if (to == HARD_FRAME_POINTER_REGNUM)
10384 offset -= cfun->machine->frame.hard_frame_pointer_offset;
10386 return offset;
10389 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY. */
10391 static void
10392 mips_extra_live_on_entry (bitmap regs)
10394 if (TARGET_USE_GOT)
10396 /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
10397 the global pointer. */
10398 if (!TARGET_ABSOLUTE_ABICALLS)
10399 bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
10401 /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
10402 the global pointer. */
10403 if (TARGET_MIPS16)
10404 bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
10406 /* See the comment above load_call<mode> for details. */
10407 bitmap_set_bit (regs, GOT_VERSION_REGNUM);
10411 /* Implement RETURN_ADDR_RTX. We do not support moving back to a
10412 previous frame. */
10415 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
10417 if (count != 0)
10418 return const0_rtx;
10420 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
10423 /* Emit code to change the current function's return address to
10424 ADDRESS. SCRATCH is available as a scratch register, if needed.
10425 ADDRESS and SCRATCH are both word-mode GPRs. */
10427 void
10428 mips_set_return_address (rtx address, rtx scratch)
10430 rtx slot_address;
10432 gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
10433 slot_address = mips_add_offset (scratch, stack_pointer_rtx,
10434 cfun->machine->frame.gp_sp_offset);
10435 mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
10438 /* Return true if the current function has a cprestore slot. */
10440 bool
10441 mips_cfun_has_cprestore_slot_p (void)
10443 return (cfun->machine->global_pointer != INVALID_REGNUM
10444 && cfun->machine->frame.cprestore_size > 0);
10447 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
10448 cprestore slot. LOAD_P is true if the caller wants to load from
10449 the cprestore slot; it is false if the caller wants to store to
10450 the slot. */
10452 static void
10453 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
10454 bool load_p)
10456 const struct mips_frame_info *frame;
10458 frame = &cfun->machine->frame;
10459 /* .cprestore always uses the stack pointer instead of the frame pointer.
10460 We have a free choice for direct stores for non-MIPS16 functions,
10461 and for MIPS16 functions whose cprestore slot is in range of the
10462 stack pointer. Using the stack pointer would sometimes give more
10463 (early) scheduling freedom, but using the frame pointer would
10464 sometimes give more (late) scheduling freedom. It's hard to
10465 predict which applies to a given function, so let's keep things
10466 simple.
10468 Loads must always use the frame pointer in functions that call
10469 alloca, and there's little benefit to using the stack pointer
10470 otherwise. */
10471 if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
10473 *base = hard_frame_pointer_rtx;
10474 *offset = frame->args_size - frame->hard_frame_pointer_offset;
10476 else
10478 *base = stack_pointer_rtx;
10479 *offset = frame->args_size;
10483 /* Return true if X is the load or store address of the cprestore slot;
10484 LOAD_P says which. */
10486 bool
10487 mips_cprestore_address_p (rtx x, bool load_p)
10489 rtx given_base, required_base;
10490 HOST_WIDE_INT given_offset, required_offset;
10492 mips_split_plus (x, &given_base, &given_offset);
10493 mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
10494 return given_base == required_base && given_offset == required_offset;
10497 /* Return a MEM rtx for the cprestore slot. LOAD_P is true if we are
10498 going to load from it, false if we are going to store to it.
10499 Use TEMP as a temporary register if need be. */
10501 static rtx
10502 mips_cprestore_slot (rtx temp, bool load_p)
10504 rtx base;
10505 HOST_WIDE_INT offset;
10507 mips_get_cprestore_base_and_offset (&base, &offset, load_p);
10508 return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
10511 /* Emit instructions to save global pointer value GP into cprestore
10512 slot MEM. OFFSET is the offset that MEM applies to the base register.
10514 MEM may not be a legitimate address. If it isn't, TEMP is a
10515 temporary register that can be used, otherwise it is a SCRATCH. */
10517 void
10518 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
10520 if (TARGET_CPRESTORE_DIRECTIVE)
10522 gcc_assert (gp == pic_offset_table_rtx);
10523 emit_insn (PMODE_INSN (gen_cprestore, (mem, offset)));
10525 else
10526 mips_emit_move (mips_cprestore_slot (temp, false), gp);
10529 /* Restore $gp from its save slot, using TEMP as a temporary base register
10530 if need be. This function is for o32 and o64 abicalls only.
10532 See mips_must_initialize_gp_p for details about how we manage the
10533 global pointer. */
10535 void
10536 mips_restore_gp_from_cprestore_slot (rtx temp)
10538 gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
10540 if (!cfun->machine->must_restore_gp_when_clobbered_p)
10542 emit_note (NOTE_INSN_DELETED);
10543 return;
10546 if (TARGET_MIPS16)
10548 mips_emit_move (temp, mips_cprestore_slot (temp, true));
10549 mips_emit_move (pic_offset_table_rtx, temp);
10551 else
10552 mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
10553 if (!TARGET_EXPLICIT_RELOCS)
10554 emit_insn (gen_blockage ());
10557 /* A function to save or store a register. The first argument is the
10558 register and the second is the stack slot. */
10559 typedef void (*mips_save_restore_fn) (rtx, rtx);
10561 /* Use FN to save or restore register REGNO. MODE is the register's
10562 mode and OFFSET is the offset of its save slot from the current
10563 stack pointer. */
10565 static void
10566 mips_save_restore_reg (machine_mode mode, int regno,
10567 HOST_WIDE_INT offset, mips_save_restore_fn fn)
10569 rtx mem;
10571 mem = gen_frame_mem (mode, plus_constant (Pmode, stack_pointer_rtx,
10572 offset));
10573 fn (gen_rtx_REG (mode, regno), mem);
10576 /* Call FN for each accumlator that is saved by the current function.
10577 SP_OFFSET is the offset of the current stack pointer from the start
10578 of the frame. */
10580 static void
10581 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
10583 HOST_WIDE_INT offset;
10584 int regno;
10586 offset = cfun->machine->frame.acc_sp_offset - sp_offset;
10587 if (BITSET_P (cfun->machine->frame.acc_mask, 0))
10589 mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
10590 offset -= UNITS_PER_WORD;
10591 mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
10592 offset -= UNITS_PER_WORD;
10595 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
10596 if (BITSET_P (cfun->machine->frame.acc_mask,
10597 ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
10599 mips_save_restore_reg (word_mode, regno, offset, fn);
10600 offset -= UNITS_PER_WORD;
10604 /* Save register REG to MEM. Make the instruction frame-related. */
10606 static void
10607 mips_save_reg (rtx reg, rtx mem)
10609 if (GET_MODE (reg) == DFmode
10610 && (!TARGET_FLOAT64
10611 || mips_abi == ABI_32))
10613 rtx x1, x2;
10615 mips_emit_move_or_split (mem, reg, SPLIT_IF_NECESSARY);
10617 x1 = mips_frame_set (mips_subword (mem, false),
10618 mips_subword (reg, false));
10619 x2 = mips_frame_set (mips_subword (mem, true),
10620 mips_subword (reg, true));
10621 mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10623 else
10624 mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10627 /* Capture the register combinations that are allowed in a SWM or LWM
10628 instruction. The entries are ordered by number of registers set in
10629 the mask. We also ignore the single register encodings because a
10630 normal SW/LW is preferred. */
10632 static const unsigned int umips_swm_mask[17] = {
10633 0xc0ff0000, 0x80ff0000, 0x40ff0000, 0x807f0000,
10634 0x00ff0000, 0x803f0000, 0x007f0000, 0x801f0000,
10635 0x003f0000, 0x800f0000, 0x001f0000, 0x80070000,
10636 0x000f0000, 0x80030000, 0x00070000, 0x80010000,
10637 0x00030000
10640 static const unsigned int umips_swm_encoding[17] = {
10641 25, 24, 9, 23, 8, 22, 7, 21, 6, 20, 5, 19, 4, 18, 3, 17, 2
10644 /* Try to use a microMIPS LWM or SWM instruction to save or restore
10645 as many GPRs in *MASK as possible. *OFFSET is the offset from the
10646 stack pointer of the topmost save slot.
10648 Remove from *MASK all registers that were handled using LWM and SWM.
10649 Update *OFFSET so that it points to the first unused save slot. */
10651 static bool
10652 umips_build_save_restore (mips_save_restore_fn fn,
10653 unsigned *mask, HOST_WIDE_INT *offset)
10655 int nregs;
10656 unsigned int i, j;
10657 rtx pattern, set, reg, mem;
10658 HOST_WIDE_INT this_offset;
10659 rtx this_base;
10661 /* Try matching $16 to $31 (s0 to ra). */
10662 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
10663 if ((*mask & 0xffff0000) == umips_swm_mask[i])
10664 break;
10666 if (i == ARRAY_SIZE (umips_swm_mask))
10667 return false;
10669 /* Get the offset of the lowest save slot. */
10670 nregs = (umips_swm_encoding[i] & 0xf) + (umips_swm_encoding[i] >> 4);
10671 this_offset = *offset - UNITS_PER_WORD * (nregs - 1);
10673 /* LWM/SWM can only support offsets from -2048 to 2047. */
10674 if (!UMIPS_12BIT_OFFSET_P (this_offset))
10675 return false;
10677 /* Create the final PARALLEL. */
10678 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
10679 this_base = stack_pointer_rtx;
10681 /* For registers $16-$23 and $30. */
10682 for (j = 0; j < (umips_swm_encoding[i] & 0xf); j++)
10684 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10685 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10686 unsigned int regno = (j != 8) ? 16 + j : 30;
10687 *mask &= ~(1 << regno);
10688 reg = gen_rtx_REG (SImode, regno);
10689 if (fn == mips_save_reg)
10690 set = mips_frame_set (mem, reg);
10691 else
10693 set = gen_rtx_SET (VOIDmode, reg, mem);
10694 mips_add_cfa_restore (reg);
10696 XVECEXP (pattern, 0, j) = set;
10699 /* For register $31. */
10700 if (umips_swm_encoding[i] >> 4)
10702 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10703 *mask &= ~(1 << 31);
10704 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10705 reg = gen_rtx_REG (SImode, 31);
10706 if (fn == mips_save_reg)
10707 set = mips_frame_set (mem, reg);
10708 else
10710 set = gen_rtx_SET (VOIDmode, reg, mem);
10711 mips_add_cfa_restore (reg);
10713 XVECEXP (pattern, 0, j) = set;
10716 pattern = emit_insn (pattern);
10717 if (fn == mips_save_reg)
10718 RTX_FRAME_RELATED_P (pattern) = 1;
10720 /* Adjust the last offset. */
10721 *offset -= UNITS_PER_WORD * nregs;
10723 return true;
10726 /* Call FN for each register that is saved by the current function.
10727 SP_OFFSET is the offset of the current stack pointer from the start
10728 of the frame. */
10730 static void
10731 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
10732 mips_save_restore_fn fn)
10734 machine_mode fpr_mode;
10735 int regno;
10736 const struct mips_frame_info *frame = &cfun->machine->frame;
10737 HOST_WIDE_INT offset;
10738 unsigned int mask;
10740 /* Save registers starting from high to low. The debuggers prefer at least
10741 the return register be stored at func+4, and also it allows us not to
10742 need a nop in the epilogue if at least one register is reloaded in
10743 addition to return address. */
10744 offset = frame->gp_sp_offset - sp_offset;
10745 mask = frame->mask;
10747 if (TARGET_MICROMIPS)
10748 umips_build_save_restore (fn, &mask, &offset);
10750 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
10751 if (BITSET_P (mask, regno - GP_REG_FIRST))
10753 /* Record the ra offset for use by mips_function_profiler. */
10754 if (regno == RETURN_ADDR_REGNUM)
10755 cfun->machine->frame.ra_fp_offset = offset + sp_offset;
10756 mips_save_restore_reg (word_mode, regno, offset, fn);
10757 offset -= UNITS_PER_WORD;
10760 /* This loop must iterate over the same space as its companion in
10761 mips_compute_frame_info. */
10762 offset = cfun->machine->frame.fp_sp_offset - sp_offset;
10763 fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
10764 for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
10765 regno >= FP_REG_FIRST;
10766 regno -= MAX_FPRS_PER_FMT)
10767 if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
10769 if (!TARGET_FLOAT64 && TARGET_DOUBLE_FLOAT
10770 && (fixed_regs[regno] || fixed_regs[regno + 1]))
10772 if (fixed_regs[regno])
10773 mips_save_restore_reg (SFmode, regno + 1, offset, fn);
10774 else
10775 mips_save_restore_reg (SFmode, regno, offset, fn);
10777 else
10778 mips_save_restore_reg (fpr_mode, regno, offset, fn);
10779 offset -= GET_MODE_SIZE (fpr_mode);
10783 /* Return true if a move between register REGNO and its save slot (MEM)
10784 can be done in a single move. LOAD_P is true if we are loading
10785 from the slot, false if we are storing to it. */
10787 static bool
10788 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
10790 /* There is a specific MIPS16 instruction for saving $31 to the stack. */
10791 if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
10792 return false;
10794 return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
10795 GET_MODE (mem), mem, load_p) == NO_REGS;
10798 /* Emit a move from SRC to DEST, given that one of them is a register
10799 save slot and that the other is a register. TEMP is a temporary
10800 GPR of the same mode that is available if need be. */
10802 void
10803 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
10805 unsigned int regno;
10806 rtx mem;
10808 if (REG_P (src))
10810 regno = REGNO (src);
10811 mem = dest;
10813 else
10815 regno = REGNO (dest);
10816 mem = src;
10819 if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
10821 /* We don't yet know whether we'll need this instruction or not.
10822 Postpone the decision by emitting a ghost move. This move
10823 is specifically not frame-related; only the split version is. */
10824 if (TARGET_64BIT)
10825 emit_insn (gen_move_gpdi (dest, src));
10826 else
10827 emit_insn (gen_move_gpsi (dest, src));
10828 return;
10831 if (regno == HI_REGNUM)
10833 if (REG_P (dest))
10835 mips_emit_move (temp, src);
10836 if (TARGET_64BIT)
10837 emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
10838 temp, gen_rtx_REG (DImode, LO_REGNUM)));
10839 else
10840 emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
10841 temp, gen_rtx_REG (SImode, LO_REGNUM)));
10843 else
10845 if (TARGET_64BIT)
10846 emit_insn (gen_mfhidi_ti (temp,
10847 gen_rtx_REG (TImode, MD_REG_FIRST)));
10848 else
10849 emit_insn (gen_mfhisi_di (temp,
10850 gen_rtx_REG (DImode, MD_REG_FIRST)));
10851 mips_emit_move (dest, temp);
10854 else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
10855 mips_emit_move (dest, src);
10856 else
10858 gcc_assert (!reg_overlap_mentioned_p (dest, temp));
10859 mips_emit_move (temp, src);
10860 mips_emit_move (dest, temp);
10862 if (MEM_P (dest))
10863 mips_set_frame_expr (mips_frame_set (dest, src));
10866 /* If we're generating n32 or n64 abicalls, and the current function
10867 does not use $28 as its global pointer, emit a cplocal directive.
10868 Use pic_offset_table_rtx as the argument to the directive. */
10870 static void
10871 mips_output_cplocal (void)
10873 if (!TARGET_EXPLICIT_RELOCS
10874 && mips_must_initialize_gp_p ()
10875 && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
10876 output_asm_insn (".cplocal %+", 0);
10879 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE. */
10881 static void
10882 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10884 const char *fnname;
10886 /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
10887 floating-point arguments. */
10888 if (TARGET_MIPS16
10889 && TARGET_HARD_FLOAT_ABI
10890 && crtl->args.info.fp_code != 0)
10891 mips16_build_function_stub ();
10893 /* Get the function name the same way that toplev.c does before calling
10894 assemble_start_function. This is needed so that the name used here
10895 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
10896 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10897 mips_start_function_definition (fnname, TARGET_MIPS16);
10899 /* Output MIPS-specific frame information. */
10900 if (!flag_inhibit_size_directive)
10902 const struct mips_frame_info *frame;
10904 frame = &cfun->machine->frame;
10906 /* .frame FRAMEREG, FRAMESIZE, RETREG. */
10907 fprintf (file,
10908 "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
10909 "# vars= " HOST_WIDE_INT_PRINT_DEC
10910 ", regs= %d/%d"
10911 ", args= " HOST_WIDE_INT_PRINT_DEC
10912 ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
10913 reg_names[frame_pointer_needed
10914 ? HARD_FRAME_POINTER_REGNUM
10915 : STACK_POINTER_REGNUM],
10916 (frame_pointer_needed
10917 ? frame->total_size - frame->hard_frame_pointer_offset
10918 : frame->total_size),
10919 reg_names[RETURN_ADDR_REGNUM],
10920 frame->var_size,
10921 frame->num_gp, frame->num_fp,
10922 frame->args_size,
10923 frame->cprestore_size);
10925 /* .mask MASK, OFFSET. */
10926 fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10927 frame->mask, frame->gp_save_offset);
10929 /* .fmask MASK, OFFSET. */
10930 fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10931 frame->fmask, frame->fp_save_offset);
10934 /* Handle the initialization of $gp for SVR4 PIC, if applicable.
10935 Also emit the ".set noreorder; .set nomacro" sequence for functions
10936 that need it. */
10937 if (mips_must_initialize_gp_p ()
10938 && mips_current_loadgp_style () == LOADGP_OLDABI)
10940 if (TARGET_MIPS16)
10942 /* This is a fixed-form sequence. The position of the
10943 first two instructions is important because of the
10944 way _gp_disp is defined. */
10945 output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
10946 output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
10947 output_asm_insn ("sll\t$2,16", 0);
10948 output_asm_insn ("addu\t$2,$3", 0);
10950 else
10952 /* .cpload must be in a .set noreorder but not a
10953 .set nomacro block. */
10954 mips_push_asm_switch (&mips_noreorder);
10955 output_asm_insn (".cpload\t%^", 0);
10956 if (!cfun->machine->all_noreorder_p)
10957 mips_pop_asm_switch (&mips_noreorder);
10958 else
10959 mips_push_asm_switch (&mips_nomacro);
10962 else if (cfun->machine->all_noreorder_p)
10964 mips_push_asm_switch (&mips_noreorder);
10965 mips_push_asm_switch (&mips_nomacro);
10968 /* Tell the assembler which register we're using as the global
10969 pointer. This is needed for thunks, since they can use either
10970 explicit relocs or assembler macros. */
10971 mips_output_cplocal ();
10974 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE. */
10976 static void
10977 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
10978 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10980 const char *fnname;
10982 /* Reinstate the normal $gp. */
10983 SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
10984 mips_output_cplocal ();
10986 if (cfun->machine->all_noreorder_p)
10988 mips_pop_asm_switch (&mips_nomacro);
10989 mips_pop_asm_switch (&mips_noreorder);
10992 /* Get the function name the same way that toplev.c does before calling
10993 assemble_start_function. This is needed so that the name used here
10994 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
10995 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10996 mips_end_function_definition (fnname);
10999 /* Emit an optimisation barrier for accesses to the current frame. */
11001 static void
11002 mips_frame_barrier (void)
11004 emit_clobber (gen_frame_mem (BLKmode, stack_pointer_rtx));
11008 /* The __gnu_local_gp symbol. */
11010 static GTY(()) rtx mips_gnu_local_gp;
11012 /* If we're generating n32 or n64 abicalls, emit instructions
11013 to set up the global pointer. */
11015 static void
11016 mips_emit_loadgp (void)
11018 rtx addr, offset, incoming_address, base, index, pic_reg;
11020 pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11021 switch (mips_current_loadgp_style ())
11023 case LOADGP_ABSOLUTE:
11024 if (mips_gnu_local_gp == NULL)
11026 mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
11027 SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
11029 emit_insn (PMODE_INSN (gen_loadgp_absolute,
11030 (pic_reg, mips_gnu_local_gp)));
11031 break;
11033 case LOADGP_OLDABI:
11034 /* Added by mips_output_function_prologue. */
11035 break;
11037 case LOADGP_NEWABI:
11038 addr = XEXP (DECL_RTL (current_function_decl), 0);
11039 offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
11040 incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
11041 emit_insn (PMODE_INSN (gen_loadgp_newabi,
11042 (pic_reg, offset, incoming_address)));
11043 break;
11045 case LOADGP_RTP:
11046 base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
11047 index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
11048 emit_insn (PMODE_INSN (gen_loadgp_rtp, (pic_reg, base, index)));
11049 break;
11051 default:
11052 return;
11055 if (TARGET_MIPS16)
11056 emit_insn (PMODE_INSN (gen_copygp_mips16,
11057 (pic_offset_table_rtx, pic_reg)));
11059 /* Emit a blockage if there are implicit uses of the GP register.
11060 This includes profiled functions, because FUNCTION_PROFILE uses
11061 a jal macro. */
11062 if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
11063 emit_insn (gen_loadgp_blockage ());
11066 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
11068 #if PROBE_INTERVAL > 32768
11069 #error Cannot use indexed addressing mode for stack probing
11070 #endif
11072 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
11073 inclusive. These are offsets from the current stack pointer. */
11075 static void
11076 mips_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
11078 if (TARGET_MIPS16)
11079 sorry ("-fstack-check=specific not implemented for MIPS16");
11081 /* See if we have a constant small number of probes to generate. If so,
11082 that's the easy case. */
11083 if (first + size <= 32768)
11085 HOST_WIDE_INT i;
11087 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
11088 it exceeds SIZE. If only one probe is needed, this will not
11089 generate any code. Then probe at FIRST + SIZE. */
11090 for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
11091 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
11092 -(first + i)));
11094 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
11095 -(first + size)));
11098 /* Otherwise, do the same as above, but in a loop. Note that we must be
11099 extra careful with variables wrapping around because we might be at
11100 the very top (or the very bottom) of the address space and we have
11101 to be able to handle this case properly; in particular, we use an
11102 equality test for the loop condition. */
11103 else
11105 HOST_WIDE_INT rounded_size;
11106 rtx r3 = MIPS_PROLOGUE_TEMP (Pmode);
11107 rtx r12 = MIPS_PROLOGUE_TEMP2 (Pmode);
11109 /* Sanity check for the addressing mode we're going to use. */
11110 gcc_assert (first <= 32768);
11113 /* Step 1: round SIZE to the previous multiple of the interval. */
11115 rounded_size = size & -PROBE_INTERVAL;
11118 /* Step 2: compute initial and final value of the loop counter. */
11120 /* TEST_ADDR = SP + FIRST. */
11121 emit_insn (gen_rtx_SET (VOIDmode, r3,
11122 plus_constant (Pmode, stack_pointer_rtx,
11123 -first)));
11125 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
11126 if (rounded_size > 32768)
11128 emit_move_insn (r12, GEN_INT (rounded_size));
11129 emit_insn (gen_rtx_SET (VOIDmode, r12,
11130 gen_rtx_MINUS (Pmode, r3, r12)));
11132 else
11133 emit_insn (gen_rtx_SET (VOIDmode, r12,
11134 plus_constant (Pmode, r3, -rounded_size)));
11137 /* Step 3: the loop
11139 while (TEST_ADDR != LAST_ADDR)
11141 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
11142 probe at TEST_ADDR
11145 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
11146 until it is equal to ROUNDED_SIZE. */
11148 emit_insn (PMODE_INSN (gen_probe_stack_range, (r3, r3, r12)));
11151 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
11152 that SIZE is equal to ROUNDED_SIZE. */
11154 if (size != rounded_size)
11155 emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
11158 /* Make sure nothing is scheduled before we are done. */
11159 emit_insn (gen_blockage ());
11162 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
11163 absolute addresses. */
11165 const char *
11166 mips_output_probe_stack_range (rtx reg1, rtx reg2)
11168 static int labelno = 0;
11169 char loop_lab[32], end_lab[32], tmp[64];
11170 rtx xops[2];
11172 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
11173 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
11175 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
11177 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
11178 xops[0] = reg1;
11179 xops[1] = reg2;
11180 strcpy (tmp, "%(%<beq\t%0,%1,");
11181 output_asm_insn (strcat (tmp, &end_lab[1]), xops);
11183 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
11184 xops[1] = GEN_INT (-PROBE_INTERVAL);
11185 if (TARGET_64BIT && TARGET_LONG64)
11186 output_asm_insn ("daddiu\t%0,%0,%1", xops);
11187 else
11188 output_asm_insn ("addiu\t%0,%0,%1", xops);
11190 /* Probe at TEST_ADDR and branch. */
11191 fprintf (asm_out_file, "\tb\t");
11192 assemble_name_raw (asm_out_file, loop_lab);
11193 fputc ('\n', asm_out_file);
11194 if (TARGET_64BIT)
11195 output_asm_insn ("sd\t$0,0(%0)%)", xops);
11196 else
11197 output_asm_insn ("sw\t$0,0(%0)%)", xops);
11199 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
11201 return "";
11204 /* Return true if X contains a kernel register. */
11206 static bool
11207 mips_refers_to_kernel_reg_p (const_rtx x)
11209 subrtx_iterator::array_type array;
11210 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
11211 if (REG_P (*iter) && KERNEL_REG_P (REGNO (*iter)))
11212 return true;
11213 return false;
11216 /* Expand the "prologue" pattern. */
11218 void
11219 mips_expand_prologue (void)
11221 const struct mips_frame_info *frame;
11222 HOST_WIDE_INT size;
11223 unsigned int nargs;
11225 if (cfun->machine->global_pointer != INVALID_REGNUM)
11227 /* Check whether an insn uses pic_offset_table_rtx, either explicitly
11228 or implicitly. If so, we can commit to using a global pointer
11229 straight away, otherwise we need to defer the decision. */
11230 if (mips_cfun_has_inflexible_gp_ref_p ()
11231 || mips_cfun_has_flexible_gp_ref_p ())
11233 cfun->machine->must_initialize_gp_p = true;
11234 cfun->machine->must_restore_gp_when_clobbered_p = true;
11237 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
11240 frame = &cfun->machine->frame;
11241 size = frame->total_size;
11243 if (flag_stack_usage_info)
11244 current_function_static_stack_size = size;
11246 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
11248 if (crtl->is_leaf && !cfun->calls_alloca)
11250 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
11251 mips_emit_probe_stack_range (STACK_CHECK_PROTECT,
11252 size - STACK_CHECK_PROTECT);
11254 else if (size > 0)
11255 mips_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
11258 /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
11259 bytes beforehand; this is enough to cover the register save area
11260 without going out of range. */
11261 if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
11262 || frame->num_cop0_regs > 0)
11264 HOST_WIDE_INT step1;
11266 step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
11267 if (GENERATE_MIPS16E_SAVE_RESTORE)
11269 HOST_WIDE_INT offset;
11270 unsigned int mask, regno;
11272 /* Try to merge argument stores into the save instruction. */
11273 nargs = mips16e_collect_argument_saves ();
11275 /* Build the save instruction. */
11276 mask = frame->mask;
11277 rtx insn = mips16e_build_save_restore (false, &mask, &offset,
11278 nargs, step1);
11279 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11280 mips_frame_barrier ();
11281 size -= step1;
11283 /* Check if we need to save other registers. */
11284 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11285 if (BITSET_P (mask, regno - GP_REG_FIRST))
11287 offset -= UNITS_PER_WORD;
11288 mips_save_restore_reg (word_mode, regno,
11289 offset, mips_save_reg);
11292 else
11294 if (cfun->machine->interrupt_handler_p)
11296 HOST_WIDE_INT offset;
11297 rtx mem;
11299 /* If this interrupt is using a shadow register set, we need to
11300 get the stack pointer from the previous register set. */
11301 if (cfun->machine->use_shadow_register_set_p)
11302 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
11303 stack_pointer_rtx));
11305 if (!cfun->machine->keep_interrupts_masked_p)
11307 /* Move from COP0 Cause to K0. */
11308 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
11309 gen_rtx_REG (SImode,
11310 COP0_CAUSE_REG_NUM)));
11311 /* Move from COP0 EPC to K1. */
11312 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11313 gen_rtx_REG (SImode,
11314 COP0_EPC_REG_NUM)));
11317 /* Allocate the first part of the frame. */
11318 rtx insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
11319 GEN_INT (-step1));
11320 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11321 mips_frame_barrier ();
11322 size -= step1;
11324 /* Start at the uppermost location for saving. */
11325 offset = frame->cop0_sp_offset - size;
11326 if (!cfun->machine->keep_interrupts_masked_p)
11328 /* Push EPC into its stack slot. */
11329 mem = gen_frame_mem (word_mode,
11330 plus_constant (Pmode, stack_pointer_rtx,
11331 offset));
11332 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11333 offset -= UNITS_PER_WORD;
11336 /* Move from COP0 Status to K1. */
11337 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11338 gen_rtx_REG (SImode,
11339 COP0_STATUS_REG_NUM)));
11341 /* Right justify the RIPL in k0. */
11342 if (!cfun->machine->keep_interrupts_masked_p)
11343 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
11344 gen_rtx_REG (SImode, K0_REG_NUM),
11345 GEN_INT (CAUSE_IPL)));
11347 /* Push Status into its stack slot. */
11348 mem = gen_frame_mem (word_mode,
11349 plus_constant (Pmode, stack_pointer_rtx,
11350 offset));
11351 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11352 offset -= UNITS_PER_WORD;
11354 /* Insert the RIPL into our copy of SR (k1) as the new IPL. */
11355 if (!cfun->machine->keep_interrupts_masked_p)
11356 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11357 GEN_INT (6),
11358 GEN_INT (SR_IPL),
11359 gen_rtx_REG (SImode, K0_REG_NUM)));
11361 if (!cfun->machine->keep_interrupts_masked_p)
11362 /* Enable interrupts by clearing the KSU ERL and EXL bits.
11363 IE is already the correct value, so we don't have to do
11364 anything explicit. */
11365 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11366 GEN_INT (4),
11367 GEN_INT (SR_EXL),
11368 gen_rtx_REG (SImode, GP_REG_FIRST)));
11369 else
11370 /* Disable interrupts by clearing the KSU, ERL, EXL,
11371 and IE bits. */
11372 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11373 GEN_INT (5),
11374 GEN_INT (SR_IE),
11375 gen_rtx_REG (SImode, GP_REG_FIRST)));
11377 else
11379 rtx insn = gen_add3_insn (stack_pointer_rtx,
11380 stack_pointer_rtx,
11381 GEN_INT (-step1));
11382 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11383 mips_frame_barrier ();
11384 size -= step1;
11386 mips_for_each_saved_acc (size, mips_save_reg);
11387 mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
11391 /* Allocate the rest of the frame. */
11392 if (size > 0)
11394 if (SMALL_OPERAND (-size))
11395 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
11396 stack_pointer_rtx,
11397 GEN_INT (-size)))) = 1;
11398 else
11400 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
11401 if (TARGET_MIPS16)
11403 /* There are no instructions to add or subtract registers
11404 from the stack pointer, so use the frame pointer as a
11405 temporary. We should always be using a frame pointer
11406 in this case anyway. */
11407 gcc_assert (frame_pointer_needed);
11408 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11409 emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
11410 hard_frame_pointer_rtx,
11411 MIPS_PROLOGUE_TEMP (Pmode)));
11412 mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
11414 else
11415 emit_insn (gen_sub3_insn (stack_pointer_rtx,
11416 stack_pointer_rtx,
11417 MIPS_PROLOGUE_TEMP (Pmode)));
11419 /* Describe the combined effect of the previous instructions. */
11420 mips_set_frame_expr
11421 (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
11422 plus_constant (Pmode, stack_pointer_rtx, -size)));
11424 mips_frame_barrier ();
11427 /* Set up the frame pointer, if we're using one. */
11428 if (frame_pointer_needed)
11430 HOST_WIDE_INT offset;
11432 offset = frame->hard_frame_pointer_offset;
11433 if (offset == 0)
11435 rtx insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11436 RTX_FRAME_RELATED_P (insn) = 1;
11438 else if (SMALL_OPERAND (offset))
11440 rtx insn = gen_add3_insn (hard_frame_pointer_rtx,
11441 stack_pointer_rtx, GEN_INT (offset));
11442 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11444 else
11446 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
11447 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11448 emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
11449 hard_frame_pointer_rtx,
11450 MIPS_PROLOGUE_TEMP (Pmode)));
11451 mips_set_frame_expr
11452 (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
11453 plus_constant (Pmode, stack_pointer_rtx, offset)));
11457 mips_emit_loadgp ();
11459 /* Initialize the $gp save slot. */
11460 if (mips_cfun_has_cprestore_slot_p ())
11462 rtx base, mem, gp, temp;
11463 HOST_WIDE_INT offset;
11465 mips_get_cprestore_base_and_offset (&base, &offset, false);
11466 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11467 gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11468 temp = (SMALL_OPERAND (offset)
11469 ? gen_rtx_SCRATCH (Pmode)
11470 : MIPS_PROLOGUE_TEMP (Pmode));
11471 emit_insn (PMODE_INSN (gen_potential_cprestore,
11472 (mem, GEN_INT (offset), gp, temp)));
11474 mips_get_cprestore_base_and_offset (&base, &offset, true);
11475 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11476 emit_insn (PMODE_INSN (gen_use_cprestore, (mem)));
11479 /* We need to search back to the last use of K0 or K1. */
11480 if (cfun->machine->interrupt_handler_p)
11482 rtx_insn *insn;
11483 for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
11484 if (INSN_P (insn)
11485 && mips_refers_to_kernel_reg_p (PATTERN (insn)))
11486 break;
11487 /* Emit a move from K1 to COP0 Status after insn. */
11488 gcc_assert (insn != NULL_RTX);
11489 emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11490 gen_rtx_REG (SImode, K1_REG_NUM)),
11491 insn);
11494 /* If we are profiling, make sure no instructions are scheduled before
11495 the call to mcount. */
11496 if (crtl->profile)
11497 emit_insn (gen_blockage ());
11500 /* Attach all pending register saves to the previous instruction.
11501 Return that instruction. */
11503 static rtx_insn *
11504 mips_epilogue_emit_cfa_restores (void)
11506 rtx_insn *insn;
11508 insn = get_last_insn ();
11509 gcc_assert (insn && !REG_NOTES (insn));
11510 if (mips_epilogue.cfa_restores)
11512 RTX_FRAME_RELATED_P (insn) = 1;
11513 REG_NOTES (insn) = mips_epilogue.cfa_restores;
11514 mips_epilogue.cfa_restores = 0;
11516 return insn;
11519 /* Like mips_epilogue_emit_cfa_restores, but also record that the CFA is
11520 now at REG + OFFSET. */
11522 static void
11523 mips_epilogue_set_cfa (rtx reg, HOST_WIDE_INT offset)
11525 rtx_insn *insn;
11527 insn = mips_epilogue_emit_cfa_restores ();
11528 if (reg != mips_epilogue.cfa_reg || offset != mips_epilogue.cfa_offset)
11530 RTX_FRAME_RELATED_P (insn) = 1;
11531 REG_NOTES (insn) = alloc_reg_note (REG_CFA_DEF_CFA,
11532 plus_constant (Pmode, reg, offset),
11533 REG_NOTES (insn));
11534 mips_epilogue.cfa_reg = reg;
11535 mips_epilogue.cfa_offset = offset;
11539 /* Emit instructions to restore register REG from slot MEM. Also update
11540 the cfa_restores list. */
11542 static void
11543 mips_restore_reg (rtx reg, rtx mem)
11545 /* There's no MIPS16 instruction to load $31 directly. Load into
11546 $7 instead and adjust the return insn appropriately. */
11547 if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
11548 reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
11549 else if (GET_MODE (reg) == DFmode
11550 && (!TARGET_FLOAT64
11551 || mips_abi == ABI_32))
11553 mips_add_cfa_restore (mips_subword (reg, true));
11554 mips_add_cfa_restore (mips_subword (reg, false));
11556 else
11557 mips_add_cfa_restore (reg);
11559 mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
11560 if (REGNO (reg) == REGNO (mips_epilogue.cfa_reg))
11561 /* The CFA is currently defined in terms of the register whose
11562 value we have just restored. Redefine the CFA in terms of
11563 the stack pointer. */
11564 mips_epilogue_set_cfa (stack_pointer_rtx,
11565 mips_epilogue.cfa_restore_sp_offset);
11568 /* Emit code to set the stack pointer to BASE + OFFSET, given that
11569 BASE + OFFSET is NEW_FRAME_SIZE bytes below the top of the frame.
11570 BASE, if not the stack pointer, is available as a temporary. */
11572 static void
11573 mips_deallocate_stack (rtx base, rtx offset, HOST_WIDE_INT new_frame_size)
11575 if (base == stack_pointer_rtx && offset == const0_rtx)
11576 return;
11578 mips_frame_barrier ();
11579 if (offset == const0_rtx)
11581 emit_move_insn (stack_pointer_rtx, base);
11582 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11584 else if (TARGET_MIPS16 && base != stack_pointer_rtx)
11586 emit_insn (gen_add3_insn (base, base, offset));
11587 mips_epilogue_set_cfa (base, new_frame_size);
11588 emit_move_insn (stack_pointer_rtx, base);
11590 else
11592 emit_insn (gen_add3_insn (stack_pointer_rtx, base, offset));
11593 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11597 /* Emit any instructions needed before a return. */
11599 void
11600 mips_expand_before_return (void)
11602 /* When using a call-clobbered gp, we start out with unified call
11603 insns that include instructions to restore the gp. We then split
11604 these unified calls after reload. These split calls explicitly
11605 clobber gp, so there is no need to define
11606 PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
11608 For consistency, we should also insert an explicit clobber of $28
11609 before return insns, so that the post-reload optimizers know that
11610 the register is not live on exit. */
11611 if (TARGET_CALL_CLOBBERED_GP)
11612 emit_clobber (pic_offset_table_rtx);
11615 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
11616 says which. */
11618 void
11619 mips_expand_epilogue (bool sibcall_p)
11621 const struct mips_frame_info *frame;
11622 HOST_WIDE_INT step1, step2;
11623 rtx base, adjust;
11624 rtx_insn *insn;
11625 bool use_jraddiusp_p = false;
11627 if (!sibcall_p && mips_can_use_return_insn ())
11629 emit_jump_insn (gen_return ());
11630 return;
11633 /* In MIPS16 mode, if the return value should go into a floating-point
11634 register, we need to call a helper routine to copy it over. */
11635 if (mips16_cfun_returns_in_fpr_p ())
11636 mips16_copy_fpr_return_value ();
11638 /* Split the frame into two. STEP1 is the amount of stack we should
11639 deallocate before restoring the registers. STEP2 is the amount we
11640 should deallocate afterwards.
11642 Start off by assuming that no registers need to be restored. */
11643 frame = &cfun->machine->frame;
11644 step1 = frame->total_size;
11645 step2 = 0;
11647 /* Work out which register holds the frame address. */
11648 if (!frame_pointer_needed)
11649 base = stack_pointer_rtx;
11650 else
11652 base = hard_frame_pointer_rtx;
11653 step1 -= frame->hard_frame_pointer_offset;
11655 mips_epilogue.cfa_reg = base;
11656 mips_epilogue.cfa_offset = step1;
11657 mips_epilogue.cfa_restores = NULL_RTX;
11659 /* If we need to restore registers, deallocate as much stack as
11660 possible in the second step without going out of range. */
11661 if ((frame->mask | frame->fmask | frame->acc_mask) != 0
11662 || frame->num_cop0_regs > 0)
11664 step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
11665 step1 -= step2;
11668 /* Get an rtx for STEP1 that we can add to BASE. */
11669 adjust = GEN_INT (step1);
11670 if (!SMALL_OPERAND (step1))
11672 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
11673 adjust = MIPS_EPILOGUE_TEMP (Pmode);
11675 mips_deallocate_stack (base, adjust, step2);
11677 /* If we're using addressing macros, $gp is implicitly used by all
11678 SYMBOL_REFs. We must emit a blockage insn before restoring $gp
11679 from the stack. */
11680 if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
11681 emit_insn (gen_blockage ());
11683 mips_epilogue.cfa_restore_sp_offset = step2;
11684 if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
11686 unsigned int regno, mask;
11687 HOST_WIDE_INT offset;
11688 rtx restore;
11690 /* Generate the restore instruction. */
11691 mask = frame->mask;
11692 restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
11694 /* Restore any other registers manually. */
11695 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11696 if (BITSET_P (mask, regno - GP_REG_FIRST))
11698 offset -= UNITS_PER_WORD;
11699 mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
11702 /* Restore the remaining registers and deallocate the final bit
11703 of the frame. */
11704 mips_frame_barrier ();
11705 emit_insn (restore);
11706 mips_epilogue_set_cfa (stack_pointer_rtx, 0);
11708 else
11710 /* Restore the registers. */
11711 mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
11712 mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
11713 mips_restore_reg);
11715 if (cfun->machine->interrupt_handler_p)
11717 HOST_WIDE_INT offset;
11718 rtx mem;
11720 offset = frame->cop0_sp_offset - (frame->total_size - step2);
11721 if (!cfun->machine->keep_interrupts_masked_p)
11723 /* Restore the original EPC. */
11724 mem = gen_frame_mem (word_mode,
11725 plus_constant (Pmode, stack_pointer_rtx,
11726 offset));
11727 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11728 offset -= UNITS_PER_WORD;
11730 /* Move to COP0 EPC. */
11731 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
11732 gen_rtx_REG (SImode, K0_REG_NUM)));
11735 /* Restore the original Status. */
11736 mem = gen_frame_mem (word_mode,
11737 plus_constant (Pmode, stack_pointer_rtx,
11738 offset));
11739 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11740 offset -= UNITS_PER_WORD;
11742 /* If we don't use shadow register set, we need to update SP. */
11743 if (!cfun->machine->use_shadow_register_set_p)
11744 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11745 else
11746 /* The choice of position is somewhat arbitrary in this case. */
11747 mips_epilogue_emit_cfa_restores ();
11749 /* Move to COP0 Status. */
11750 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11751 gen_rtx_REG (SImode, K0_REG_NUM)));
11753 else if (TARGET_MICROMIPS
11754 && !crtl->calls_eh_return
11755 && !sibcall_p
11756 && step2 > 0
11757 && mips_unsigned_immediate_p (step2, 5, 2))
11758 use_jraddiusp_p = true;
11759 else
11760 /* Deallocate the final bit of the frame. */
11761 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11764 if (!use_jraddiusp_p)
11765 gcc_assert (!mips_epilogue.cfa_restores);
11767 /* Add in the __builtin_eh_return stack adjustment. We need to
11768 use a temporary in MIPS16 code. */
11769 if (crtl->calls_eh_return)
11771 if (TARGET_MIPS16)
11773 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
11774 emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
11775 MIPS_EPILOGUE_TEMP (Pmode),
11776 EH_RETURN_STACKADJ_RTX));
11777 mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
11779 else
11780 emit_insn (gen_add3_insn (stack_pointer_rtx,
11781 stack_pointer_rtx,
11782 EH_RETURN_STACKADJ_RTX));
11785 if (!sibcall_p)
11787 mips_expand_before_return ();
11788 if (cfun->machine->interrupt_handler_p)
11790 /* Interrupt handlers generate eret or deret. */
11791 if (cfun->machine->use_debug_exception_return_p)
11792 emit_jump_insn (gen_mips_deret ());
11793 else
11794 emit_jump_insn (gen_mips_eret ());
11796 else
11798 rtx pat;
11800 /* When generating MIPS16 code, the normal
11801 mips_for_each_saved_gpr_and_fpr path will restore the return
11802 address into $7 rather than $31. */
11803 if (TARGET_MIPS16
11804 && !GENERATE_MIPS16E_SAVE_RESTORE
11805 && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
11807 /* simple_returns cannot rely on values that are only available
11808 on paths through the epilogue (because return paths that do
11809 not pass through the epilogue may nevertheless reuse a
11810 simple_return that occurs at the end of the epilogue).
11811 Use a normal return here instead. */
11812 rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
11813 pat = gen_return_internal (reg);
11815 else if (use_jraddiusp_p)
11816 pat = gen_jraddiusp (GEN_INT (step2));
11817 else
11819 rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
11820 pat = gen_simple_return_internal (reg);
11822 emit_jump_insn (pat);
11823 if (use_jraddiusp_p)
11824 mips_epilogue_set_cfa (stack_pointer_rtx, step2);
11828 /* Search from the beginning to the first use of K0 or K1. */
11829 if (cfun->machine->interrupt_handler_p
11830 && !cfun->machine->keep_interrupts_masked_p)
11832 for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
11833 if (INSN_P (insn)
11834 && mips_refers_to_kernel_reg_p (PATTERN (insn)))
11835 break;
11836 gcc_assert (insn != NULL_RTX);
11837 /* Insert disable interrupts before the first use of K0 or K1. */
11838 emit_insn_before (gen_mips_di (), insn);
11839 emit_insn_before (gen_mips_ehb (), insn);
11843 /* Return nonzero if this function is known to have a null epilogue.
11844 This allows the optimizer to omit jumps to jumps if no stack
11845 was created. */
11847 bool
11848 mips_can_use_return_insn (void)
11850 /* Interrupt handlers need to go through the epilogue. */
11851 if (cfun->machine->interrupt_handler_p)
11852 return false;
11854 if (!reload_completed)
11855 return false;
11857 if (crtl->profile)
11858 return false;
11860 /* In MIPS16 mode, a function that returns a floating-point value
11861 needs to arrange to copy the return value into the floating-point
11862 registers. */
11863 if (mips16_cfun_returns_in_fpr_p ())
11864 return false;
11866 return cfun->machine->frame.total_size == 0;
11869 /* Return true if register REGNO can store a value of mode MODE.
11870 The result of this function is cached in mips_hard_regno_mode_ok. */
11872 static bool
11873 mips_hard_regno_mode_ok_p (unsigned int regno, machine_mode mode)
11875 unsigned int size;
11876 enum mode_class mclass;
11878 if (mode == CCV2mode)
11879 return (ISA_HAS_8CC
11880 && ST_REG_P (regno)
11881 && (regno - ST_REG_FIRST) % 2 == 0);
11883 if (mode == CCV4mode)
11884 return (ISA_HAS_8CC
11885 && ST_REG_P (regno)
11886 && (regno - ST_REG_FIRST) % 4 == 0);
11888 if (mode == CCmode)
11889 return ISA_HAS_8CC ? ST_REG_P (regno) : regno == FPSW_REGNUM;
11891 size = GET_MODE_SIZE (mode);
11892 mclass = GET_MODE_CLASS (mode);
11894 if (GP_REG_P (regno))
11895 return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
11897 if (FP_REG_P (regno)
11898 && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
11899 || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
11901 /* Deny use of odd-numbered registers for 32-bit data for
11902 the o32 FP64A ABI. */
11903 if (TARGET_O32_FP64A_ABI && size <= 4 && (regno & 1) != 0)
11904 return false;
11906 /* Allow 64-bit vector modes for Loongson-2E/2F. */
11907 if (TARGET_LOONGSON_VECTORS
11908 && (mode == V2SImode
11909 || mode == V4HImode
11910 || mode == V8QImode
11911 || mode == DImode))
11912 return true;
11914 if (mclass == MODE_FLOAT
11915 || mclass == MODE_COMPLEX_FLOAT
11916 || mclass == MODE_VECTOR_FLOAT)
11917 return size <= UNITS_PER_FPVALUE;
11919 /* Allow integer modes that fit into a single register. We need
11920 to put integers into FPRs when using instructions like CVT
11921 and TRUNC. There's no point allowing sizes smaller than a word,
11922 because the FPU has no appropriate load/store instructions. */
11923 if (mclass == MODE_INT)
11924 return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
11927 if (ACC_REG_P (regno)
11928 && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
11930 if (MD_REG_P (regno))
11932 /* After a multiplication or division, clobbering HI makes
11933 the value of LO unpredictable, and vice versa. This means
11934 that, for all interesting cases, HI and LO are effectively
11935 a single register.
11937 We model this by requiring that any value that uses HI
11938 also uses LO. */
11939 if (size <= UNITS_PER_WORD * 2)
11940 return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
11942 else
11944 /* DSP accumulators do not have the same restrictions as
11945 HI and LO, so we can treat them as normal doubleword
11946 registers. */
11947 if (size <= UNITS_PER_WORD)
11948 return true;
11950 if (size <= UNITS_PER_WORD * 2
11951 && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
11952 return true;
11956 if (ALL_COP_REG_P (regno))
11957 return mclass == MODE_INT && size <= UNITS_PER_WORD;
11959 if (regno == GOT_VERSION_REGNUM)
11960 return mode == SImode;
11962 return false;
11965 /* Implement HARD_REGNO_NREGS. */
11967 unsigned int
11968 mips_hard_regno_nregs (int regno, machine_mode mode)
11970 if (ST_REG_P (regno))
11971 /* The size of FP status registers is always 4, because they only hold
11972 CCmode values, and CCmode is always considered to be 4 bytes wide. */
11973 return (GET_MODE_SIZE (mode) + 3) / 4;
11975 if (FP_REG_P (regno))
11976 return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
11978 /* All other registers are word-sized. */
11979 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
11982 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
11983 in mips_hard_regno_nregs. */
11986 mips_class_max_nregs (enum reg_class rclass, machine_mode mode)
11988 int size;
11989 HARD_REG_SET left;
11991 size = 0x8000;
11992 COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
11993 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
11995 if (HARD_REGNO_MODE_OK (ST_REG_FIRST, mode))
11996 size = MIN (size, 4);
11997 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
11999 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
12001 if (HARD_REGNO_MODE_OK (FP_REG_FIRST, mode))
12002 size = MIN (size, UNITS_PER_FPREG);
12003 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
12005 if (!hard_reg_set_empty_p (left))
12006 size = MIN (size, UNITS_PER_WORD);
12007 return (GET_MODE_SIZE (mode) + size - 1) / size;
12010 /* Implement CANNOT_CHANGE_MODE_CLASS. */
12012 bool
12013 mips_cannot_change_mode_class (machine_mode from,
12014 machine_mode to,
12015 enum reg_class rclass)
12017 /* Allow conversions between different Loongson integer vectors,
12018 and between those vectors and DImode. */
12019 if (GET_MODE_SIZE (from) == 8 && GET_MODE_SIZE (to) == 8
12020 && INTEGRAL_MODE_P (from) && INTEGRAL_MODE_P (to))
12021 return false;
12023 /* Otherwise, there are several problems with changing the modes of
12024 values in floating-point registers:
12026 - When a multi-word value is stored in paired floating-point
12027 registers, the first register always holds the low word. We
12028 therefore can't allow FPRs to change between single-word and
12029 multi-word modes on big-endian targets.
12031 - GCC assumes that each word of a multiword register can be
12032 accessed individually using SUBREGs. This is not true for
12033 floating-point registers if they are bigger than a word.
12035 - Loading a 32-bit value into a 64-bit floating-point register
12036 will not sign-extend the value, despite what LOAD_EXTEND_OP
12037 says. We can't allow FPRs to change from SImode to a wider
12038 mode on 64-bit targets.
12040 - If the FPU has already interpreted a value in one format, we
12041 must not ask it to treat the value as having a different
12042 format.
12044 We therefore disallow all mode changes involving FPRs. */
12046 return reg_classes_intersect_p (FP_REGS, rclass);
12049 /* Implement target hook small_register_classes_for_mode_p. */
12051 static bool
12052 mips_small_register_classes_for_mode_p (machine_mode mode
12053 ATTRIBUTE_UNUSED)
12055 return TARGET_MIPS16;
12058 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction. */
12060 static bool
12061 mips_mode_ok_for_mov_fmt_p (machine_mode mode)
12063 switch (mode)
12065 case SFmode:
12066 return TARGET_HARD_FLOAT;
12068 case DFmode:
12069 return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
12071 case V2SFmode:
12072 return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
12074 default:
12075 return false;
12079 /* Implement MODES_TIEABLE_P. */
12081 bool
12082 mips_modes_tieable_p (machine_mode mode1, machine_mode mode2)
12084 /* FPRs allow no mode punning, so it's not worth tying modes if we'd
12085 prefer to put one of them in FPRs. */
12086 return (mode1 == mode2
12087 || (!mips_mode_ok_for_mov_fmt_p (mode1)
12088 && !mips_mode_ok_for_mov_fmt_p (mode2)));
12091 /* Implement TARGET_PREFERRED_RELOAD_CLASS. */
12093 static reg_class_t
12094 mips_preferred_reload_class (rtx x, reg_class_t rclass)
12096 if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
12097 return LEA_REGS;
12099 if (reg_class_subset_p (FP_REGS, rclass)
12100 && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
12101 return FP_REGS;
12103 if (reg_class_subset_p (GR_REGS, rclass))
12104 rclass = GR_REGS;
12106 if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
12107 rclass = M16_REGS;
12109 return rclass;
12112 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
12113 Return a "canonical" class to represent it in later calculations. */
12115 static reg_class_t
12116 mips_canonicalize_move_class (reg_class_t rclass)
12118 /* All moves involving accumulator registers have the same cost. */
12119 if (reg_class_subset_p (rclass, ACC_REGS))
12120 rclass = ACC_REGS;
12122 /* Likewise promote subclasses of general registers to the most
12123 interesting containing class. */
12124 if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
12125 rclass = M16_REGS;
12126 else if (reg_class_subset_p (rclass, GENERAL_REGS))
12127 rclass = GENERAL_REGS;
12129 return rclass;
12132 /* Return the cost of moving a value from a register of class FROM to a GPR.
12133 Return 0 for classes that are unions of other classes handled by this
12134 function. */
12136 static int
12137 mips_move_to_gpr_cost (reg_class_t from)
12139 switch (from)
12141 case M16_REGS:
12142 case GENERAL_REGS:
12143 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
12144 return 2;
12146 case ACC_REGS:
12147 /* MFLO and MFHI. */
12148 return 6;
12150 case FP_REGS:
12151 /* MFC1, etc. */
12152 return 4;
12154 case COP0_REGS:
12155 case COP2_REGS:
12156 case COP3_REGS:
12157 /* This choice of value is historical. */
12158 return 5;
12160 default:
12161 return 0;
12165 /* Return the cost of moving a value from a GPR to a register of class TO.
12166 Return 0 for classes that are unions of other classes handled by this
12167 function. */
12169 static int
12170 mips_move_from_gpr_cost (reg_class_t to)
12172 switch (to)
12174 case M16_REGS:
12175 case GENERAL_REGS:
12176 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
12177 return 2;
12179 case ACC_REGS:
12180 /* MTLO and MTHI. */
12181 return 6;
12183 case FP_REGS:
12184 /* MTC1, etc. */
12185 return 4;
12187 case COP0_REGS:
12188 case COP2_REGS:
12189 case COP3_REGS:
12190 /* This choice of value is historical. */
12191 return 5;
12193 default:
12194 return 0;
12198 /* Implement TARGET_REGISTER_MOVE_COST. Return 0 for classes that are the
12199 maximum of the move costs for subclasses; regclass will work out
12200 the maximum for us. */
12202 static int
12203 mips_register_move_cost (machine_mode mode,
12204 reg_class_t from, reg_class_t to)
12206 reg_class_t dregs;
12207 int cost1, cost2;
12209 from = mips_canonicalize_move_class (from);
12210 to = mips_canonicalize_move_class (to);
12212 /* Handle moves that can be done without using general-purpose registers. */
12213 if (from == FP_REGS)
12215 if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
12216 /* MOV.FMT. */
12217 return 4;
12220 /* Handle cases in which only one class deviates from the ideal. */
12221 dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
12222 if (from == dregs)
12223 return mips_move_from_gpr_cost (to);
12224 if (to == dregs)
12225 return mips_move_to_gpr_cost (from);
12227 /* Handles cases that require a GPR temporary. */
12228 cost1 = mips_move_to_gpr_cost (from);
12229 if (cost1 != 0)
12231 cost2 = mips_move_from_gpr_cost (to);
12232 if (cost2 != 0)
12233 return cost1 + cost2;
12236 return 0;
12239 /* Implement TARGET_REGISTER_PRIORITY. */
12241 static int
12242 mips_register_priority (int hard_regno)
12244 /* Treat MIPS16 registers with higher priority than other regs. */
12245 if (TARGET_MIPS16
12246 && TEST_HARD_REG_BIT (reg_class_contents[M16_REGS], hard_regno))
12247 return 1;
12248 return 0;
12251 /* Implement TARGET_MEMORY_MOVE_COST. */
12253 static int
12254 mips_memory_move_cost (machine_mode mode, reg_class_t rclass, bool in)
12256 return (mips_cost->memory_latency
12257 + memory_move_secondary_cost (mode, rclass, in));
12260 /* Implement SECONDARY_MEMORY_NEEDED. */
12262 bool
12263 mips_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
12264 machine_mode mode)
12266 /* Ignore spilled pseudos. */
12267 if (lra_in_progress && (class1 == NO_REGS || class2 == NO_REGS))
12268 return false;
12270 if (((class1 == FP_REGS) != (class2 == FP_REGS))
12271 && ((TARGET_FLOATXX && !ISA_HAS_MXHC1)
12272 || TARGET_O32_FP64A_ABI)
12273 && GET_MODE_SIZE (mode) >= 8)
12274 return true;
12276 return false;
12279 /* Return the register class required for a secondary register when
12280 copying between one of the registers in RCLASS and value X, which
12281 has mode MODE. X is the source of the move if IN_P, otherwise it
12282 is the destination. Return NO_REGS if no secondary register is
12283 needed. */
12285 enum reg_class
12286 mips_secondary_reload_class (enum reg_class rclass,
12287 machine_mode mode, rtx x, bool)
12289 int regno;
12291 /* If X is a constant that cannot be loaded into $25, it must be loaded
12292 into some other GPR. No other register class allows a direct move. */
12293 if (mips_dangerous_for_la25_p (x))
12294 return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
12296 regno = true_regnum (x);
12297 if (TARGET_MIPS16)
12299 /* In MIPS16 mode, every move must involve a member of M16_REGS. */
12300 if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
12301 return M16_REGS;
12303 return NO_REGS;
12306 /* Copying from accumulator registers to anywhere other than a general
12307 register requires a temporary general register. */
12308 if (reg_class_subset_p (rclass, ACC_REGS))
12309 return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12310 if (ACC_REG_P (regno))
12311 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12313 if (reg_class_subset_p (rclass, FP_REGS))
12315 if (regno < 0
12316 || (MEM_P (x)
12317 && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8)))
12318 /* In this case we can use lwc1, swc1, ldc1 or sdc1. We'll use
12319 pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported. */
12320 return NO_REGS;
12322 if (GP_REG_P (regno) || x == CONST0_RTX (mode))
12323 /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
12324 return NO_REGS;
12326 if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (mode, x))
12327 /* We can force the constant to memory and use lwc1
12328 and ldc1. As above, we will use pairs of lwc1s if
12329 ldc1 is not supported. */
12330 return NO_REGS;
12332 if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
12333 /* In this case we can use mov.fmt. */
12334 return NO_REGS;
12336 /* Otherwise, we need to reload through an integer register. */
12337 return GR_REGS;
12339 if (FP_REG_P (regno))
12340 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12342 return NO_REGS;
12345 /* Implement TARGET_MODE_REP_EXTENDED. */
12347 static int
12348 mips_mode_rep_extended (machine_mode mode, machine_mode mode_rep)
12350 /* On 64-bit targets, SImode register values are sign-extended to DImode. */
12351 if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
12352 return SIGN_EXTEND;
12354 return UNKNOWN;
12357 /* Implement TARGET_VALID_POINTER_MODE. */
12359 static bool
12360 mips_valid_pointer_mode (machine_mode mode)
12362 return mode == SImode || (TARGET_64BIT && mode == DImode);
12365 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P. */
12367 static bool
12368 mips_vector_mode_supported_p (machine_mode mode)
12370 switch (mode)
12372 case V2SFmode:
12373 return TARGET_PAIRED_SINGLE_FLOAT;
12375 case V2HImode:
12376 case V4QImode:
12377 case V2HQmode:
12378 case V2UHQmode:
12379 case V2HAmode:
12380 case V2UHAmode:
12381 case V4QQmode:
12382 case V4UQQmode:
12383 return TARGET_DSP;
12385 case V2SImode:
12386 case V4HImode:
12387 case V8QImode:
12388 return TARGET_LOONGSON_VECTORS;
12390 default:
12391 return false;
12395 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P. */
12397 static bool
12398 mips_scalar_mode_supported_p (machine_mode mode)
12400 if (ALL_FIXED_POINT_MODE_P (mode)
12401 && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
12402 return true;
12404 return default_scalar_mode_supported_p (mode);
12407 /* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE. */
12409 static machine_mode
12410 mips_preferred_simd_mode (machine_mode mode ATTRIBUTE_UNUSED)
12412 if (TARGET_PAIRED_SINGLE_FLOAT
12413 && mode == SFmode)
12414 return V2SFmode;
12415 return word_mode;
12418 /* Implement TARGET_INIT_LIBFUNCS. */
12420 static void
12421 mips_init_libfuncs (void)
12423 if (TARGET_FIX_VR4120)
12425 /* Register the special divsi3 and modsi3 functions needed to work
12426 around VR4120 division errata. */
12427 set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
12428 set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
12431 if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
12433 /* Register the MIPS16 -mhard-float stubs. */
12434 set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
12435 set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
12436 set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
12437 set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
12439 set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
12440 set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
12441 set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
12442 set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
12443 set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
12444 set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
12445 set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
12447 set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
12448 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
12449 set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
12451 if (TARGET_DOUBLE_FLOAT)
12453 set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
12454 set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
12455 set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
12456 set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
12458 set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
12459 set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
12460 set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
12461 set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
12462 set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
12463 set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
12464 set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
12466 set_conv_libfunc (sext_optab, DFmode, SFmode,
12467 "__mips16_extendsfdf2");
12468 set_conv_libfunc (trunc_optab, SFmode, DFmode,
12469 "__mips16_truncdfsf2");
12470 set_conv_libfunc (sfix_optab, SImode, DFmode,
12471 "__mips16_fix_truncdfsi");
12472 set_conv_libfunc (sfloat_optab, DFmode, SImode,
12473 "__mips16_floatsidf");
12474 set_conv_libfunc (ufloat_optab, DFmode, SImode,
12475 "__mips16_floatunsidf");
12479 /* The MIPS16 ISA does not have an encoding for "sync", so we rely
12480 on an external non-MIPS16 routine to implement __sync_synchronize.
12481 Similarly for the rest of the ll/sc libfuncs. */
12482 if (TARGET_MIPS16)
12484 synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
12485 init_sync_libfuncs (UNITS_PER_WORD);
12489 /* Build up a multi-insn sequence that loads label TARGET into $AT. */
12491 static void
12492 mips_process_load_label (rtx target)
12494 rtx base, gp, intop;
12495 HOST_WIDE_INT offset;
12497 mips_multi_start ();
12498 switch (mips_abi)
12500 case ABI_N32:
12501 mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
12502 mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
12503 break;
12505 case ABI_64:
12506 mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
12507 mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
12508 break;
12510 default:
12511 gp = pic_offset_table_rtx;
12512 if (mips_cfun_has_cprestore_slot_p ())
12514 gp = gen_rtx_REG (Pmode, AT_REGNUM);
12515 mips_get_cprestore_base_and_offset (&base, &offset, true);
12516 if (!SMALL_OPERAND (offset))
12518 intop = GEN_INT (CONST_HIGH_PART (offset));
12519 mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
12520 mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
12522 base = gp;
12523 offset = CONST_LOW_PART (offset);
12525 intop = GEN_INT (offset);
12526 if (ISA_HAS_LOAD_DELAY)
12527 mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
12528 else
12529 mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
12531 if (ISA_HAS_LOAD_DELAY)
12532 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
12533 else
12534 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
12535 mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
12536 break;
12540 /* Return the number of instructions needed to load a label into $AT. */
12542 static unsigned int
12543 mips_load_label_num_insns (void)
12545 if (cfun->machine->load_label_num_insns == 0)
12547 mips_process_load_label (pc_rtx);
12548 cfun->machine->load_label_num_insns = mips_multi_num_insns;
12550 return cfun->machine->load_label_num_insns;
12553 /* Emit an asm sequence to start a noat block and load the address
12554 of a label into $1. */
12556 void
12557 mips_output_load_label (rtx target)
12559 mips_push_asm_switch (&mips_noat);
12560 if (TARGET_EXPLICIT_RELOCS)
12562 mips_process_load_label (target);
12563 mips_multi_write ();
12565 else
12567 if (Pmode == DImode)
12568 output_asm_insn ("dla\t%@,%0", &target);
12569 else
12570 output_asm_insn ("la\t%@,%0", &target);
12574 /* Return the length of INSN. LENGTH is the initial length computed by
12575 attributes in the machine-description file. */
12578 mips_adjust_insn_length (rtx_insn *insn, int length)
12580 /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
12581 of a PIC long-branch sequence. Substitute the correct value. */
12582 if (length == MAX_PIC_BRANCH_LENGTH
12583 && JUMP_P (insn)
12584 && INSN_CODE (insn) >= 0
12585 && get_attr_type (insn) == TYPE_BRANCH)
12587 /* Add the branch-over instruction and its delay slot, if this
12588 is a conditional branch. */
12589 length = simplejump_p (insn) ? 0 : 8;
12591 /* Add the size of a load into $AT. */
12592 length += BASE_INSN_LENGTH * mips_load_label_num_insns ();
12594 /* Add the length of an indirect jump, ignoring the delay slot. */
12595 length += TARGET_COMPRESSION ? 2 : 4;
12598 /* A unconditional jump has an unfilled delay slot if it is not part
12599 of a sequence. A conditional jump normally has a delay slot, but
12600 does not on MIPS16. */
12601 if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
12602 length += TARGET_MIPS16 ? 2 : 4;
12604 /* See how many nops might be needed to avoid hardware hazards. */
12605 if (!cfun->machine->ignore_hazard_length_p
12606 && INSN_P (insn)
12607 && INSN_CODE (insn) >= 0)
12608 switch (get_attr_hazard (insn))
12610 case HAZARD_NONE:
12611 break;
12613 case HAZARD_DELAY:
12614 length += NOP_INSN_LENGTH;
12615 break;
12617 case HAZARD_HILO:
12618 length += NOP_INSN_LENGTH * 2;
12619 break;
12622 return length;
12625 /* Return the assembly code for INSN, which has the operands given by
12626 OPERANDS, and which branches to OPERANDS[0] if some condition is true.
12627 BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
12628 is in range of a direct branch. BRANCH_IF_FALSE is an inverted
12629 version of BRANCH_IF_TRUE. */
12631 const char *
12632 mips_output_conditional_branch (rtx_insn *insn, rtx *operands,
12633 const char *branch_if_true,
12634 const char *branch_if_false)
12636 unsigned int length;
12637 rtx taken;
12639 gcc_assert (LABEL_P (operands[0]));
12641 length = get_attr_length (insn);
12642 if (length <= 8)
12644 /* Just a simple conditional branch. */
12645 mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
12646 return branch_if_true;
12649 /* Generate a reversed branch around a direct jump. This fallback does
12650 not use branch-likely instructions. */
12651 mips_branch_likely = false;
12652 rtx_code_label *not_taken = gen_label_rtx ();
12653 taken = operands[0];
12655 /* Generate the reversed branch to NOT_TAKEN. */
12656 operands[0] = not_taken;
12657 output_asm_insn (branch_if_false, operands);
12659 /* If INSN has a delay slot, we must provide delay slots for both the
12660 branch to NOT_TAKEN and the conditional jump. We must also ensure
12661 that INSN's delay slot is executed in the appropriate cases. */
12662 if (final_sequence)
12664 /* This first delay slot will always be executed, so use INSN's
12665 delay slot if is not annulled. */
12666 if (!INSN_ANNULLED_BRANCH_P (insn))
12668 final_scan_insn (final_sequence->insn (1),
12669 asm_out_file, optimize, 1, NULL);
12670 final_sequence->insn (1)->set_deleted ();
12672 else
12673 output_asm_insn ("nop", 0);
12674 fprintf (asm_out_file, "\n");
12677 /* Output the unconditional branch to TAKEN. */
12678 if (TARGET_ABSOLUTE_JUMPS)
12679 output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
12680 else
12682 mips_output_load_label (taken);
12683 output_asm_insn ("jr\t%@%]%/", 0);
12686 /* Now deal with its delay slot; see above. */
12687 if (final_sequence)
12689 /* This delay slot will only be executed if the branch is taken.
12690 Use INSN's delay slot if is annulled. */
12691 if (INSN_ANNULLED_BRANCH_P (insn))
12693 final_scan_insn (final_sequence->insn (1),
12694 asm_out_file, optimize, 1, NULL);
12695 final_sequence->insn (1)->set_deleted ();
12697 else
12698 output_asm_insn ("nop", 0);
12699 fprintf (asm_out_file, "\n");
12702 /* Output NOT_TAKEN. */
12703 targetm.asm_out.internal_label (asm_out_file, "L",
12704 CODE_LABEL_NUMBER (not_taken));
12705 return "";
12708 /* Return the assembly code for INSN, which branches to OPERANDS[0]
12709 if some ordering condition is true. The condition is given by
12710 OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
12711 OPERANDS[1]. OPERANDS[2] is the comparison's first operand;
12712 its second is always zero. */
12714 const char *
12715 mips_output_order_conditional_branch (rtx_insn *insn, rtx *operands, bool inverted_p)
12717 const char *branch[2];
12719 /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
12720 Make BRANCH[0] branch on the inverse condition. */
12721 switch (GET_CODE (operands[1]))
12723 /* These cases are equivalent to comparisons against zero. */
12724 case LEU:
12725 inverted_p = !inverted_p;
12726 /* Fall through. */
12727 case GTU:
12728 branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
12729 branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
12730 break;
12732 /* These cases are always true or always false. */
12733 case LTU:
12734 inverted_p = !inverted_p;
12735 /* Fall through. */
12736 case GEU:
12737 branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
12738 branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
12739 break;
12741 default:
12742 branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
12743 branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
12744 break;
12746 return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
12749 /* Start a block of code that needs access to the LL, SC and SYNC
12750 instructions. */
12752 static void
12753 mips_start_ll_sc_sync_block (void)
12755 if (!ISA_HAS_LL_SC)
12757 output_asm_insn (".set\tpush", 0);
12758 if (TARGET_64BIT)
12759 output_asm_insn (".set\tmips3", 0);
12760 else
12761 output_asm_insn (".set\tmips2", 0);
12765 /* End a block started by mips_start_ll_sc_sync_block. */
12767 static void
12768 mips_end_ll_sc_sync_block (void)
12770 if (!ISA_HAS_LL_SC)
12771 output_asm_insn (".set\tpop", 0);
12774 /* Output and/or return the asm template for a sync instruction. */
12776 const char *
12777 mips_output_sync (void)
12779 mips_start_ll_sc_sync_block ();
12780 output_asm_insn ("sync", 0);
12781 mips_end_ll_sc_sync_block ();
12782 return "";
12785 /* Return the asm template associated with sync_insn1 value TYPE.
12786 IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation. */
12788 static const char *
12789 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
12791 switch (type)
12793 case SYNC_INSN1_MOVE:
12794 return "move\t%0,%z2";
12795 case SYNC_INSN1_LI:
12796 return "li\t%0,%2";
12797 case SYNC_INSN1_ADDU:
12798 return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
12799 case SYNC_INSN1_ADDIU:
12800 return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
12801 case SYNC_INSN1_SUBU:
12802 return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
12803 case SYNC_INSN1_AND:
12804 return "and\t%0,%1,%z2";
12805 case SYNC_INSN1_ANDI:
12806 return "andi\t%0,%1,%2";
12807 case SYNC_INSN1_OR:
12808 return "or\t%0,%1,%z2";
12809 case SYNC_INSN1_ORI:
12810 return "ori\t%0,%1,%2";
12811 case SYNC_INSN1_XOR:
12812 return "xor\t%0,%1,%z2";
12813 case SYNC_INSN1_XORI:
12814 return "xori\t%0,%1,%2";
12816 gcc_unreachable ();
12819 /* Return the asm template associated with sync_insn2 value TYPE. */
12821 static const char *
12822 mips_sync_insn2_template (enum attr_sync_insn2 type)
12824 switch (type)
12826 case SYNC_INSN2_NOP:
12827 gcc_unreachable ();
12828 case SYNC_INSN2_AND:
12829 return "and\t%0,%1,%z2";
12830 case SYNC_INSN2_XOR:
12831 return "xor\t%0,%1,%z2";
12832 case SYNC_INSN2_NOT:
12833 return "nor\t%0,%1,%.";
12835 gcc_unreachable ();
12838 /* OPERANDS are the operands to a sync loop instruction and INDEX is
12839 the value of the one of the sync_* attributes. Return the operand
12840 referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
12841 have the associated attribute. */
12843 static rtx
12844 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
12846 if (index > 0)
12847 default_value = operands[index - 1];
12848 return default_value;
12851 /* INSN is a sync loop with operands OPERANDS. Build up a multi-insn
12852 sequence for it. */
12854 static void
12855 mips_process_sync_loop (rtx_insn *insn, rtx *operands)
12857 rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
12858 rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3, cmp;
12859 unsigned int tmp3_insn;
12860 enum attr_sync_insn1 insn1;
12861 enum attr_sync_insn2 insn2;
12862 bool is_64bit_p;
12863 int memmodel_attr;
12864 enum memmodel model;
12866 /* Read an operand from the sync_WHAT attribute and store it in
12867 variable WHAT. DEFAULT is the default value if no attribute
12868 is specified. */
12869 #define READ_OPERAND(WHAT, DEFAULT) \
12870 WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
12871 DEFAULT)
12873 /* Read the memory. */
12874 READ_OPERAND (mem, 0);
12875 gcc_assert (mem);
12876 is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
12878 /* Read the other attributes. */
12879 at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
12880 READ_OPERAND (oldval, at);
12881 READ_OPERAND (cmp, 0);
12882 READ_OPERAND (newval, at);
12883 READ_OPERAND (inclusive_mask, 0);
12884 READ_OPERAND (exclusive_mask, 0);
12885 READ_OPERAND (required_oldval, 0);
12886 READ_OPERAND (insn1_op2, 0);
12887 insn1 = get_attr_sync_insn1 (insn);
12888 insn2 = get_attr_sync_insn2 (insn);
12890 /* Don't bother setting CMP result that is never used. */
12891 if (cmp && find_reg_note (insn, REG_UNUSED, cmp))
12892 cmp = 0;
12894 memmodel_attr = get_attr_sync_memmodel (insn);
12895 switch (memmodel_attr)
12897 case 10:
12898 model = MEMMODEL_ACQ_REL;
12899 break;
12900 case 11:
12901 model = MEMMODEL_ACQUIRE;
12902 break;
12903 default:
12904 model = (enum memmodel) INTVAL (operands[memmodel_attr]);
12907 mips_multi_start ();
12909 /* Output the release side of the memory barrier. */
12910 if (need_atomic_barrier_p (model, true))
12912 if (required_oldval == 0 && TARGET_OCTEON)
12914 /* Octeon doesn't reorder reads, so a full barrier can be
12915 created by using SYNCW to order writes combined with the
12916 write from the following SC. When the SC successfully
12917 completes, we know that all preceding writes are also
12918 committed to the coherent memory system. It is possible
12919 for a single SYNCW to fail, but a pair of them will never
12920 fail, so we use two. */
12921 mips_multi_add_insn ("syncw", NULL);
12922 mips_multi_add_insn ("syncw", NULL);
12924 else
12925 mips_multi_add_insn ("sync", NULL);
12928 /* Output the branch-back label. */
12929 mips_multi_add_label ("1:");
12931 /* OLDVAL = *MEM. */
12932 mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
12933 oldval, mem, NULL);
12935 /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2. */
12936 if (required_oldval)
12938 if (inclusive_mask == 0)
12939 tmp1 = oldval;
12940 else
12942 gcc_assert (oldval != at);
12943 mips_multi_add_insn ("and\t%0,%1,%2",
12944 at, oldval, inclusive_mask, NULL);
12945 tmp1 = at;
12947 mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
12949 /* CMP = 0 [delay slot]. */
12950 if (cmp)
12951 mips_multi_add_insn ("li\t%0,0", cmp, NULL);
12954 /* $TMP1 = OLDVAL & EXCLUSIVE_MASK. */
12955 if (exclusive_mask == 0)
12956 tmp1 = const0_rtx;
12957 else
12959 gcc_assert (oldval != at);
12960 mips_multi_add_insn ("and\t%0,%1,%z2",
12961 at, oldval, exclusive_mask, NULL);
12962 tmp1 = at;
12965 /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
12967 We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
12968 at least one instruction in that case. */
12969 if (insn1 == SYNC_INSN1_MOVE
12970 && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
12971 tmp2 = insn1_op2;
12972 else
12974 mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
12975 newval, oldval, insn1_op2, NULL);
12976 tmp2 = newval;
12979 /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK). */
12980 if (insn2 == SYNC_INSN2_NOP)
12981 tmp3 = tmp2;
12982 else
12984 mips_multi_add_insn (mips_sync_insn2_template (insn2),
12985 newval, tmp2, inclusive_mask, NULL);
12986 tmp3 = newval;
12988 tmp3_insn = mips_multi_last_index ();
12990 /* $AT = $TMP1 | $TMP3. */
12991 if (tmp1 == const0_rtx || tmp3 == const0_rtx)
12993 mips_multi_set_operand (tmp3_insn, 0, at);
12994 tmp3 = at;
12996 else
12998 gcc_assert (tmp1 != tmp3);
12999 mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
13002 /* if (!commit (*MEM = $AT)) goto 1.
13004 This will sometimes be a delayed branch; see the write code below
13005 for details. */
13006 mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
13008 /* When using branch likely (-mfix-r10000), the delay slot instruction
13009 will be annulled on false. The normal delay slot instructions
13010 calculate the overall result of the atomic operation and must not
13011 be annulled. To ensure this behaviour unconditionally use a NOP
13012 in the delay slot for the branch likely case. */
13014 mips_multi_add_insn ("beq%?\t%0,%.,1b%~", at, NULL);
13016 /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot]. */
13017 if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
13019 mips_multi_copy_insn (tmp3_insn);
13020 mips_multi_set_operand (mips_multi_last_index (), 0, newval);
13022 else if (!(required_oldval && cmp) && !mips_branch_likely)
13023 mips_multi_add_insn ("nop", NULL);
13025 /* CMP = 1 -- either standalone or in a delay slot. */
13026 if (required_oldval && cmp)
13027 mips_multi_add_insn ("li\t%0,1", cmp, NULL);
13029 /* Output the acquire side of the memory barrier. */
13030 if (TARGET_SYNC_AFTER_SC && need_atomic_barrier_p (model, false))
13031 mips_multi_add_insn ("sync", NULL);
13033 /* Output the exit label, if needed. */
13034 if (required_oldval)
13035 mips_multi_add_label ("2:");
13037 #undef READ_OPERAND
13040 /* Output and/or return the asm template for sync loop INSN, which has
13041 the operands given by OPERANDS. */
13043 const char *
13044 mips_output_sync_loop (rtx_insn *insn, rtx *operands)
13046 /* Use branch-likely instructions to work around the LL/SC R10000
13047 errata. */
13048 mips_branch_likely = TARGET_FIX_R10000;
13050 mips_process_sync_loop (insn, operands);
13052 mips_push_asm_switch (&mips_noreorder);
13053 mips_push_asm_switch (&mips_nomacro);
13054 mips_push_asm_switch (&mips_noat);
13055 mips_start_ll_sc_sync_block ();
13057 mips_multi_write ();
13059 mips_end_ll_sc_sync_block ();
13060 mips_pop_asm_switch (&mips_noat);
13061 mips_pop_asm_switch (&mips_nomacro);
13062 mips_pop_asm_switch (&mips_noreorder);
13064 return "";
13067 /* Return the number of individual instructions in sync loop INSN,
13068 which has the operands given by OPERANDS. */
13070 unsigned int
13071 mips_sync_loop_insns (rtx_insn *insn, rtx *operands)
13073 /* Use branch-likely instructions to work around the LL/SC R10000
13074 errata. */
13075 mips_branch_likely = TARGET_FIX_R10000;
13076 mips_process_sync_loop (insn, operands);
13077 return mips_multi_num_insns;
13080 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
13081 the operands given by OPERANDS. Add in a divide-by-zero check if needed.
13083 When working around R4000 and R4400 errata, we need to make sure that
13084 the division is not immediately followed by a shift[1][2]. We also
13085 need to stop the division from being put into a branch delay slot[3].
13086 The easiest way to avoid both problems is to add a nop after the
13087 division. When a divide-by-zero check is needed, this nop can be
13088 used to fill the branch delay slot.
13090 [1] If a double-word or a variable shift executes immediately
13091 after starting an integer division, the shift may give an
13092 incorrect result. See quotations of errata #16 and #28 from
13093 "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
13094 in mips.md for details.
13096 [2] A similar bug to [1] exists for all revisions of the
13097 R4000 and the R4400 when run in an MC configuration.
13098 From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
13100 "19. In this following sequence:
13102 ddiv (or ddivu or div or divu)
13103 dsll32 (or dsrl32, dsra32)
13105 if an MPT stall occurs, while the divide is slipping the cpu
13106 pipeline, then the following double shift would end up with an
13107 incorrect result.
13109 Workaround: The compiler needs to avoid generating any
13110 sequence with divide followed by extended double shift."
13112 This erratum is also present in "MIPS R4400MC Errata, Processor
13113 Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
13114 & 3.0" as errata #10 and #4, respectively.
13116 [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
13117 (also valid for MIPS R4000MC processors):
13119 "52. R4000SC: This bug does not apply for the R4000PC.
13121 There are two flavors of this bug:
13123 1) If the instruction just after divide takes an RF exception
13124 (tlb-refill, tlb-invalid) and gets an instruction cache
13125 miss (both primary and secondary) and the line which is
13126 currently in secondary cache at this index had the first
13127 data word, where the bits 5..2 are set, then R4000 would
13128 get a wrong result for the div.
13132 div r8, r9
13133 ------------------- # end-of page. -tlb-refill
13137 div r8, r9
13138 ------------------- # end-of page. -tlb-invalid
13141 2) If the divide is in the taken branch delay slot, where the
13142 target takes RF exception and gets an I-cache miss for the
13143 exception vector or where I-cache miss occurs for the
13144 target address, under the above mentioned scenarios, the
13145 div would get wrong results.
13148 j r2 # to next page mapped or unmapped
13149 div r8,r9 # this bug would be there as long
13150 # as there is an ICache miss and
13151 nop # the "data pattern" is present
13154 beq r0, r0, NextPage # to Next page
13155 div r8,r9
13158 This bug is present for div, divu, ddiv, and ddivu
13159 instructions.
13161 Workaround: For item 1), OS could make sure that the next page
13162 after the divide instruction is also mapped. For item 2), the
13163 compiler could make sure that the divide instruction is not in
13164 the branch delay slot."
13166 These processors have PRId values of 0x00004220 and 0x00004300 for
13167 the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400. */
13169 const char *
13170 mips_output_division (const char *division, rtx *operands)
13172 const char *s;
13174 s = division;
13175 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
13177 output_asm_insn (s, operands);
13178 s = "nop";
13180 if (TARGET_CHECK_ZERO_DIV)
13182 if (TARGET_MIPS16)
13184 output_asm_insn (s, operands);
13185 s = "bnez\t%2,1f\n\tbreak\t7\n1:";
13187 else if (GENERATE_DIVIDE_TRAPS)
13189 /* Avoid long replay penalty on load miss by putting the trap before
13190 the divide. */
13191 if (TUNE_74K)
13192 output_asm_insn ("teq\t%2,%.,7", operands);
13193 else
13195 output_asm_insn (s, operands);
13196 s = "teq\t%2,%.,7";
13199 else
13201 output_asm_insn ("%(bne\t%2,%.,1f", operands);
13202 output_asm_insn (s, operands);
13203 s = "break\t7%)\n1:";
13206 return s;
13209 /* Return true if destination of IN_INSN is used as add source in
13210 OUT_INSN. Both IN_INSN and OUT_INSN are of type fmadd. Example:
13211 madd.s dst, x, y, z
13212 madd.s a, dst, b, c */
13214 bool
13215 mips_fmadd_bypass (rtx_insn *out_insn, rtx_insn *in_insn)
13217 int dst_reg, src_reg;
13219 gcc_assert (get_attr_type (in_insn) == TYPE_FMADD);
13220 gcc_assert (get_attr_type (out_insn) == TYPE_FMADD);
13222 extract_insn (in_insn);
13223 dst_reg = REG_P (recog_data.operand[0]);
13225 extract_insn (out_insn);
13226 src_reg = REG_P (recog_data.operand[1]);
13228 if (dst_reg == src_reg)
13229 return true;
13231 return false;
13234 /* Return true if IN_INSN is a multiply-add or multiply-subtract
13235 instruction and if OUT_INSN assigns to the accumulator operand. */
13237 bool
13238 mips_linked_madd_p (rtx_insn *out_insn, rtx_insn *in_insn)
13240 enum attr_accum_in accum_in;
13241 int accum_in_opnum;
13242 rtx accum_in_op;
13244 if (recog_memoized (in_insn) < 0)
13245 return false;
13247 accum_in = get_attr_accum_in (in_insn);
13248 if (accum_in == ACCUM_IN_NONE)
13249 return false;
13251 accum_in_opnum = accum_in - ACCUM_IN_0;
13253 extract_insn (in_insn);
13254 gcc_assert (accum_in_opnum < recog_data.n_operands);
13255 accum_in_op = recog_data.operand[accum_in_opnum];
13257 return reg_set_p (accum_in_op, out_insn);
13260 /* True if the dependency between OUT_INSN and IN_INSN is on the store
13261 data rather than the address. We need this because the cprestore
13262 pattern is type "store", but is defined using an UNSPEC_VOLATILE,
13263 which causes the default routine to abort. We just return false
13264 for that case. */
13266 bool
13267 mips_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
13269 if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
13270 return false;
13272 return !store_data_bypass_p (out_insn, in_insn);
13276 /* Variables and flags used in scheduler hooks when tuning for
13277 Loongson 2E/2F. */
13278 static struct
13280 /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
13281 strategy. */
13283 /* If true, then next ALU1/2 instruction will go to ALU1. */
13284 bool alu1_turn_p;
13286 /* If true, then next FALU1/2 unstruction will go to FALU1. */
13287 bool falu1_turn_p;
13289 /* Codes to query if [f]alu{1,2}_core units are subscribed or not. */
13290 int alu1_core_unit_code;
13291 int alu2_core_unit_code;
13292 int falu1_core_unit_code;
13293 int falu2_core_unit_code;
13295 /* True if current cycle has a multi instruction.
13296 This flag is used in mips_ls2_dfa_post_advance_cycle. */
13297 bool cycle_has_multi_p;
13299 /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
13300 These are used in mips_ls2_dfa_post_advance_cycle to initialize
13301 DFA state.
13302 E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
13303 instruction to go ALU1. */
13304 rtx_insn *alu1_turn_enabled_insn;
13305 rtx_insn *alu2_turn_enabled_insn;
13306 rtx_insn *falu1_turn_enabled_insn;
13307 rtx_insn *falu2_turn_enabled_insn;
13308 } mips_ls2;
13310 /* Implement TARGET_SCHED_ADJUST_COST. We assume that anti and output
13311 dependencies have no cost, except on the 20Kc where output-dependence
13312 is treated like input-dependence. */
13314 static int
13315 mips_adjust_cost (rtx_insn *insn ATTRIBUTE_UNUSED, rtx link,
13316 rtx_insn *dep ATTRIBUTE_UNUSED, int cost)
13318 if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
13319 && TUNE_20KC)
13320 return cost;
13321 if (REG_NOTE_KIND (link) != 0)
13322 return 0;
13323 return cost;
13326 /* Return the number of instructions that can be issued per cycle. */
13328 static int
13329 mips_issue_rate (void)
13331 switch (mips_tune)
13333 case PROCESSOR_74KC:
13334 case PROCESSOR_74KF2_1:
13335 case PROCESSOR_74KF1_1:
13336 case PROCESSOR_74KF3_2:
13337 /* The 74k is not strictly quad-issue cpu, but can be seen as one
13338 by the scheduler. It can issue 1 ALU, 1 AGEN and 2 FPU insns,
13339 but in reality only a maximum of 3 insns can be issued as
13340 floating-point loads and stores also require a slot in the
13341 AGEN pipe. */
13342 case PROCESSOR_R10000:
13343 /* All R10K Processors are quad-issue (being the first MIPS
13344 processors to support this feature). */
13345 return 4;
13347 case PROCESSOR_20KC:
13348 case PROCESSOR_R4130:
13349 case PROCESSOR_R5400:
13350 case PROCESSOR_R5500:
13351 case PROCESSOR_R5900:
13352 case PROCESSOR_R7000:
13353 case PROCESSOR_R9000:
13354 case PROCESSOR_OCTEON:
13355 case PROCESSOR_OCTEON2:
13356 case PROCESSOR_OCTEON3:
13357 return 2;
13359 case PROCESSOR_SB1:
13360 case PROCESSOR_SB1A:
13361 /* This is actually 4, but we get better performance if we claim 3.
13362 This is partly because of unwanted speculative code motion with the
13363 larger number, and partly because in most common cases we can't
13364 reach the theoretical max of 4. */
13365 return 3;
13367 case PROCESSOR_LOONGSON_2E:
13368 case PROCESSOR_LOONGSON_2F:
13369 case PROCESSOR_LOONGSON_3A:
13370 case PROCESSOR_P5600:
13371 return 4;
13373 case PROCESSOR_XLP:
13374 return (reload_completed ? 4 : 3);
13376 default:
13377 return 1;
13381 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2. */
13383 static void
13384 mips_ls2_init_dfa_post_cycle_insn (void)
13386 start_sequence ();
13387 emit_insn (gen_ls2_alu1_turn_enabled_insn ());
13388 mips_ls2.alu1_turn_enabled_insn = get_insns ();
13389 end_sequence ();
13391 start_sequence ();
13392 emit_insn (gen_ls2_alu2_turn_enabled_insn ());
13393 mips_ls2.alu2_turn_enabled_insn = get_insns ();
13394 end_sequence ();
13396 start_sequence ();
13397 emit_insn (gen_ls2_falu1_turn_enabled_insn ());
13398 mips_ls2.falu1_turn_enabled_insn = get_insns ();
13399 end_sequence ();
13401 start_sequence ();
13402 emit_insn (gen_ls2_falu2_turn_enabled_insn ());
13403 mips_ls2.falu2_turn_enabled_insn = get_insns ();
13404 end_sequence ();
13406 mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
13407 mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
13408 mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
13409 mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
13412 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
13413 Init data used in mips_dfa_post_advance_cycle. */
13415 static void
13416 mips_init_dfa_post_cycle_insn (void)
13418 if (TUNE_LOONGSON_2EF)
13419 mips_ls2_init_dfa_post_cycle_insn ();
13422 /* Initialize STATE when scheduling for Loongson 2E/2F.
13423 Support round-robin dispatch scheme by enabling only one of
13424 ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
13425 respectively. */
13427 static void
13428 mips_ls2_dfa_post_advance_cycle (state_t state)
13430 if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
13432 /* Though there are no non-pipelined ALU1 insns,
13433 we can get an instruction of type 'multi' before reload. */
13434 gcc_assert (mips_ls2.cycle_has_multi_p);
13435 mips_ls2.alu1_turn_p = false;
13438 mips_ls2.cycle_has_multi_p = false;
13440 if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
13441 /* We have a non-pipelined alu instruction in the core,
13442 adjust round-robin counter. */
13443 mips_ls2.alu1_turn_p = true;
13445 if (mips_ls2.alu1_turn_p)
13447 if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
13448 gcc_unreachable ();
13450 else
13452 if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
13453 gcc_unreachable ();
13456 if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
13458 /* There are no non-pipelined FALU1 insns. */
13459 gcc_unreachable ();
13460 mips_ls2.falu1_turn_p = false;
13463 if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
13464 /* We have a non-pipelined falu instruction in the core,
13465 adjust round-robin counter. */
13466 mips_ls2.falu1_turn_p = true;
13468 if (mips_ls2.falu1_turn_p)
13470 if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
13471 gcc_unreachable ();
13473 else
13475 if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
13476 gcc_unreachable ();
13480 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
13481 This hook is being called at the start of each cycle. */
13483 static void
13484 mips_dfa_post_advance_cycle (void)
13486 if (TUNE_LOONGSON_2EF)
13487 mips_ls2_dfa_post_advance_cycle (curr_state);
13490 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD. This should
13491 be as wide as the scheduling freedom in the DFA. */
13493 static int
13494 mips_multipass_dfa_lookahead (void)
13496 /* Can schedule up to 4 of the 6 function units in any one cycle. */
13497 if (TUNE_SB1)
13498 return 4;
13500 if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
13501 return 4;
13503 if (TUNE_OCTEON)
13504 return 2;
13506 if (TUNE_P5600)
13507 return 4;
13509 return 0;
13512 /* Remove the instruction at index LOWER from ready queue READY and
13513 reinsert it in front of the instruction at index HIGHER. LOWER must
13514 be <= HIGHER. */
13516 static void
13517 mips_promote_ready (rtx_insn **ready, int lower, int higher)
13519 rtx_insn *new_head;
13520 int i;
13522 new_head = ready[lower];
13523 for (i = lower; i < higher; i++)
13524 ready[i] = ready[i + 1];
13525 ready[i] = new_head;
13528 /* If the priority of the instruction at POS2 in the ready queue READY
13529 is within LIMIT units of that of the instruction at POS1, swap the
13530 instructions if POS2 is not already less than POS1. */
13532 static void
13533 mips_maybe_swap_ready (rtx_insn **ready, int pos1, int pos2, int limit)
13535 if (pos1 < pos2
13536 && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
13538 rtx_insn *temp;
13540 temp = ready[pos1];
13541 ready[pos1] = ready[pos2];
13542 ready[pos2] = temp;
13546 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
13547 that may clobber hi or lo. */
13548 static rtx_insn *mips_macc_chains_last_hilo;
13550 /* A TUNE_MACC_CHAINS helper function. Record that instruction INSN has
13551 been scheduled, updating mips_macc_chains_last_hilo appropriately. */
13553 static void
13554 mips_macc_chains_record (rtx_insn *insn)
13556 if (get_attr_may_clobber_hilo (insn))
13557 mips_macc_chains_last_hilo = insn;
13560 /* A TUNE_MACC_CHAINS helper function. Search ready queue READY, which
13561 has NREADY elements, looking for a multiply-add or multiply-subtract
13562 instruction that is cumulative with mips_macc_chains_last_hilo.
13563 If there is one, promote it ahead of anything else that might
13564 clobber hi or lo. */
13566 static void
13567 mips_macc_chains_reorder (rtx_insn **ready, int nready)
13569 int i, j;
13571 if (mips_macc_chains_last_hilo != 0)
13572 for (i = nready - 1; i >= 0; i--)
13573 if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
13575 for (j = nready - 1; j > i; j--)
13576 if (recog_memoized (ready[j]) >= 0
13577 && get_attr_may_clobber_hilo (ready[j]))
13579 mips_promote_ready (ready, i, j);
13580 break;
13582 break;
13586 /* The last instruction to be scheduled. */
13587 static rtx_insn *vr4130_last_insn;
13589 /* A note_stores callback used by vr4130_true_reg_dependence_p. DATA
13590 points to an rtx that is initially an instruction. Nullify the rtx
13591 if the instruction uses the value of register X. */
13593 static void
13594 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13595 void *data)
13597 rtx *insn_ptr;
13599 insn_ptr = (rtx *) data;
13600 if (REG_P (x)
13601 && *insn_ptr != 0
13602 && reg_referenced_p (x, PATTERN (*insn_ptr)))
13603 *insn_ptr = 0;
13606 /* Return true if there is true register dependence between vr4130_last_insn
13607 and INSN. */
13609 static bool
13610 vr4130_true_reg_dependence_p (rtx insn)
13612 note_stores (PATTERN (vr4130_last_insn),
13613 vr4130_true_reg_dependence_p_1, &insn);
13614 return insn == 0;
13617 /* A TUNE_MIPS4130 helper function. Given that INSN1 is at the head of
13618 the ready queue and that INSN2 is the instruction after it, return
13619 true if it is worth promoting INSN2 ahead of INSN1. Look for cases
13620 in which INSN1 and INSN2 can probably issue in parallel, but for
13621 which (INSN2, INSN1) should be less sensitive to instruction
13622 alignment than (INSN1, INSN2). See 4130.md for more details. */
13624 static bool
13625 vr4130_swap_insns_p (rtx_insn *insn1, rtx_insn *insn2)
13627 sd_iterator_def sd_it;
13628 dep_t dep;
13630 /* Check for the following case:
13632 1) there is some other instruction X with an anti dependence on INSN1;
13633 2) X has a higher priority than INSN2; and
13634 3) X is an arithmetic instruction (and thus has no unit restrictions).
13636 If INSN1 is the last instruction blocking X, it would better to
13637 choose (INSN1, X) over (INSN2, INSN1). */
13638 FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
13639 if (DEP_TYPE (dep) == REG_DEP_ANTI
13640 && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
13641 && recog_memoized (DEP_CON (dep)) >= 0
13642 && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
13643 return false;
13645 if (vr4130_last_insn != 0
13646 && recog_memoized (insn1) >= 0
13647 && recog_memoized (insn2) >= 0)
13649 /* See whether INSN1 and INSN2 use different execution units,
13650 or if they are both ALU-type instructions. If so, they can
13651 probably execute in parallel. */
13652 enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
13653 enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
13654 if (class1 != class2 || class1 == VR4130_CLASS_ALU)
13656 /* If only one of the instructions has a dependence on
13657 vr4130_last_insn, prefer to schedule the other one first. */
13658 bool dep1_p = vr4130_true_reg_dependence_p (insn1);
13659 bool dep2_p = vr4130_true_reg_dependence_p (insn2);
13660 if (dep1_p != dep2_p)
13661 return dep1_p;
13663 /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
13664 is not an ALU-type instruction and if INSN1 uses the same
13665 execution unit. (Note that if this condition holds, we already
13666 know that INSN2 uses a different execution unit.) */
13667 if (class1 != VR4130_CLASS_ALU
13668 && recog_memoized (vr4130_last_insn) >= 0
13669 && class1 == get_attr_vr4130_class (vr4130_last_insn))
13670 return true;
13673 return false;
13676 /* A TUNE_MIPS4130 helper function. (READY, NREADY) describes a ready
13677 queue with at least two instructions. Swap the first two if
13678 vr4130_swap_insns_p says that it could be worthwhile. */
13680 static void
13681 vr4130_reorder (rtx_insn **ready, int nready)
13683 if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
13684 mips_promote_ready (ready, nready - 2, nready - 1);
13687 /* Record whether last 74k AGEN instruction was a load or store. */
13688 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
13690 /* Initialize mips_last_74k_agen_insn from INSN. A null argument
13691 resets to TYPE_UNKNOWN state. */
13693 static void
13694 mips_74k_agen_init (rtx_insn *insn)
13696 if (!insn || CALL_P (insn) || JUMP_P (insn))
13697 mips_last_74k_agen_insn = TYPE_UNKNOWN;
13698 else
13700 enum attr_type type = get_attr_type (insn);
13701 if (type == TYPE_LOAD || type == TYPE_STORE)
13702 mips_last_74k_agen_insn = type;
13706 /* A TUNE_74K helper function. The 74K AGEN pipeline likes multiple
13707 loads to be grouped together, and multiple stores to be grouped
13708 together. Swap things around in the ready queue to make this happen. */
13710 static void
13711 mips_74k_agen_reorder (rtx_insn **ready, int nready)
13713 int i;
13714 int store_pos, load_pos;
13716 store_pos = -1;
13717 load_pos = -1;
13719 for (i = nready - 1; i >= 0; i--)
13721 rtx_insn *insn = ready[i];
13722 if (USEFUL_INSN_P (insn))
13723 switch (get_attr_type (insn))
13725 case TYPE_STORE:
13726 if (store_pos == -1)
13727 store_pos = i;
13728 break;
13730 case TYPE_LOAD:
13731 if (load_pos == -1)
13732 load_pos = i;
13733 break;
13735 default:
13736 break;
13740 if (load_pos == -1 || store_pos == -1)
13741 return;
13743 switch (mips_last_74k_agen_insn)
13745 case TYPE_UNKNOWN:
13746 /* Prefer to schedule loads since they have a higher latency. */
13747 case TYPE_LOAD:
13748 /* Swap loads to the front of the queue. */
13749 mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
13750 break;
13751 case TYPE_STORE:
13752 /* Swap stores to the front of the queue. */
13753 mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
13754 break;
13755 default:
13756 break;
13760 /* Implement TARGET_SCHED_INIT. */
13762 static void
13763 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13764 int max_ready ATTRIBUTE_UNUSED)
13766 mips_macc_chains_last_hilo = 0;
13767 vr4130_last_insn = 0;
13768 mips_74k_agen_init (NULL);
13770 /* When scheduling for Loongson2, branch instructions go to ALU1,
13771 therefore basic block is most likely to start with round-robin counter
13772 pointed to ALU2. */
13773 mips_ls2.alu1_turn_p = false;
13774 mips_ls2.falu1_turn_p = true;
13777 /* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2. */
13779 static void
13780 mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13781 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13783 if (!reload_completed
13784 && TUNE_MACC_CHAINS
13785 && *nreadyp > 0)
13786 mips_macc_chains_reorder (ready, *nreadyp);
13788 if (reload_completed
13789 && TUNE_MIPS4130
13790 && !TARGET_VR4130_ALIGN
13791 && *nreadyp > 1)
13792 vr4130_reorder (ready, *nreadyp);
13794 if (TUNE_74K)
13795 mips_74k_agen_reorder (ready, *nreadyp);
13798 /* Implement TARGET_SCHED_REORDER. */
13800 static int
13801 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13802 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13804 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13805 return mips_issue_rate ();
13808 /* Implement TARGET_SCHED_REORDER2. */
13810 static int
13811 mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13812 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13814 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13815 return cached_can_issue_more;
13818 /* Update round-robin counters for ALU1/2 and FALU1/2. */
13820 static void
13821 mips_ls2_variable_issue (rtx_insn *insn)
13823 if (mips_ls2.alu1_turn_p)
13825 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
13826 mips_ls2.alu1_turn_p = false;
13828 else
13830 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
13831 mips_ls2.alu1_turn_p = true;
13834 if (mips_ls2.falu1_turn_p)
13836 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
13837 mips_ls2.falu1_turn_p = false;
13839 else
13841 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
13842 mips_ls2.falu1_turn_p = true;
13845 if (recog_memoized (insn) >= 0)
13846 mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
13849 /* Implement TARGET_SCHED_VARIABLE_ISSUE. */
13851 static int
13852 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13853 rtx_insn *insn, int more)
13855 /* Ignore USEs and CLOBBERs; don't count them against the issue rate. */
13856 if (USEFUL_INSN_P (insn))
13858 if (get_attr_type (insn) != TYPE_GHOST)
13859 more--;
13860 if (!reload_completed && TUNE_MACC_CHAINS)
13861 mips_macc_chains_record (insn);
13862 vr4130_last_insn = insn;
13863 if (TUNE_74K)
13864 mips_74k_agen_init (insn);
13865 else if (TUNE_LOONGSON_2EF)
13866 mips_ls2_variable_issue (insn);
13869 /* Instructions of type 'multi' should all be split before
13870 the second scheduling pass. */
13871 gcc_assert (!reload_completed
13872 || recog_memoized (insn) < 0
13873 || get_attr_type (insn) != TYPE_MULTI);
13875 cached_can_issue_more = more;
13876 return more;
13879 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
13880 return the first operand of the associated PREF or PREFX insn. */
13883 mips_prefetch_cookie (rtx write, rtx locality)
13885 /* store_streamed / load_streamed. */
13886 if (INTVAL (locality) <= 0)
13887 return GEN_INT (INTVAL (write) + 4);
13889 /* store / load. */
13890 if (INTVAL (locality) <= 2)
13891 return write;
13893 /* store_retained / load_retained. */
13894 return GEN_INT (INTVAL (write) + 6);
13897 /* Flags that indicate when a built-in function is available.
13899 BUILTIN_AVAIL_NON_MIPS16
13900 The function is available on the current target if !TARGET_MIPS16.
13902 BUILTIN_AVAIL_MIPS16
13903 The function is available on the current target if TARGET_MIPS16. */
13904 #define BUILTIN_AVAIL_NON_MIPS16 1
13905 #define BUILTIN_AVAIL_MIPS16 2
13907 /* Declare an availability predicate for built-in functions that
13908 require non-MIPS16 mode and also require COND to be true.
13909 NAME is the main part of the predicate's name. */
13910 #define AVAIL_NON_MIPS16(NAME, COND) \
13911 static unsigned int \
13912 mips_builtin_avail_##NAME (void) \
13914 return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0; \
13917 /* Declare an availability predicate for built-in functions that
13918 support both MIPS16 and non-MIPS16 code and also require COND
13919 to be true. NAME is the main part of the predicate's name. */
13920 #define AVAIL_ALL(NAME, COND) \
13921 static unsigned int \
13922 mips_builtin_avail_##NAME (void) \
13924 return (COND) ? BUILTIN_AVAIL_NON_MIPS16 | BUILTIN_AVAIL_MIPS16 : 0; \
13927 /* This structure describes a single built-in function. */
13928 struct mips_builtin_description {
13929 /* The code of the main .md file instruction. See mips_builtin_type
13930 for more information. */
13931 enum insn_code icode;
13933 /* The floating-point comparison code to use with ICODE, if any. */
13934 enum mips_fp_condition cond;
13936 /* The name of the built-in function. */
13937 const char *name;
13939 /* Specifies how the function should be expanded. */
13940 enum mips_builtin_type builtin_type;
13942 /* The function's prototype. */
13943 enum mips_function_type function_type;
13945 /* Whether the function is available. */
13946 unsigned int (*avail) (void);
13949 AVAIL_ALL (hard_float, TARGET_HARD_FLOAT_ABI)
13950 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
13951 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
13952 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
13953 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
13954 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
13955 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
13956 AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
13957 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
13958 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
13959 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
13961 /* Construct a mips_builtin_description from the given arguments.
13963 INSN is the name of the associated instruction pattern, without the
13964 leading CODE_FOR_mips_.
13966 CODE is the floating-point condition code associated with the
13967 function. It can be 'f' if the field is not applicable.
13969 NAME is the name of the function itself, without the leading
13970 "__builtin_mips_".
13972 BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
13974 AVAIL is the name of the availability predicate, without the leading
13975 mips_builtin_avail_. */
13976 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE, \
13977 FUNCTION_TYPE, AVAIL) \
13978 { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND, \
13979 "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE, \
13980 mips_builtin_avail_ ## AVAIL }
13982 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
13983 mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE and AVAIL
13984 are as for MIPS_BUILTIN. */
13985 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
13986 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
13988 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
13989 are subject to mips_builtin_avail_<AVAIL>. */
13990 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL) \
13991 MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s", \
13992 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL), \
13993 MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d", \
13994 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
13996 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
13997 The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
13998 while the any and all forms are subject to mips_builtin_avail_mips3d. */
13999 #define CMP_PS_BUILTINS(INSN, COND, AVAIL) \
14000 MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps", \
14001 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, \
14002 mips3d), \
14003 MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps", \
14004 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, \
14005 mips3d), \
14006 MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
14007 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, \
14008 AVAIL), \
14009 MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
14010 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, \
14011 AVAIL)
14013 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s. The functions
14014 are subject to mips_builtin_avail_mips3d. */
14015 #define CMP_4S_BUILTINS(INSN, COND) \
14016 MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s", \
14017 MIPS_BUILTIN_CMP_ANY, \
14018 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d), \
14019 MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s", \
14020 MIPS_BUILTIN_CMP_ALL, \
14021 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
14023 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps. The comparison
14024 instruction requires mips_builtin_avail_<AVAIL>. */
14025 #define MOVTF_BUILTINS(INSN, COND, AVAIL) \
14026 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps", \
14027 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
14028 AVAIL), \
14029 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps", \
14030 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
14031 AVAIL)
14033 /* Define all the built-in functions related to C.cond.fmt condition COND. */
14034 #define CMP_BUILTINS(COND) \
14035 MOVTF_BUILTINS (c, COND, paired_single), \
14036 MOVTF_BUILTINS (cabs, COND, mips3d), \
14037 CMP_SCALAR_BUILTINS (cabs, COND, mips3d), \
14038 CMP_PS_BUILTINS (c, COND, paired_single), \
14039 CMP_PS_BUILTINS (cabs, COND, mips3d), \
14040 CMP_4S_BUILTINS (c, COND), \
14041 CMP_4S_BUILTINS (cabs, COND)
14043 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
14044 function mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE
14045 and AVAIL are as for MIPS_BUILTIN. */
14046 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
14047 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET, \
14048 FUNCTION_TYPE, AVAIL)
14050 /* Define __builtin_mips_bposge<VALUE>. <VALUE> is 32 for the MIPS32 DSP
14051 branch instruction. AVAIL is as for MIPS_BUILTIN. */
14052 #define BPOSGE_BUILTIN(VALUE, AVAIL) \
14053 MIPS_BUILTIN (bposge, f, "bposge" #VALUE, \
14054 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
14056 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
14057 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
14058 builtin_description field. */
14059 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE) \
14060 { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f, \
14061 "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT, \
14062 FUNCTION_TYPE, mips_builtin_avail_loongson }
14064 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
14065 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
14066 builtin_description field. */
14067 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE) \
14068 LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
14070 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
14071 We use functions of this form when the same insn can be usefully applied
14072 to more than one datatype. */
14073 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE) \
14074 LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
14076 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
14077 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
14078 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
14079 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
14080 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
14081 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
14082 #define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
14083 #define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
14085 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
14086 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
14087 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
14088 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
14089 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
14090 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
14091 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
14092 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
14093 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
14094 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
14095 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
14096 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
14097 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
14098 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
14099 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
14100 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
14101 #define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
14102 #define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
14103 #define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
14104 #define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
14105 #define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
14106 #define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
14107 #define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
14108 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
14109 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
14110 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
14111 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
14112 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
14113 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
14114 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
14116 static const struct mips_builtin_description mips_builtins[] = {
14117 #define MIPS_GET_FCSR 0
14118 DIRECT_BUILTIN (get_fcsr, MIPS_USI_FTYPE_VOID, hard_float),
14119 #define MIPS_SET_FCSR 1
14120 DIRECT_NO_TARGET_BUILTIN (set_fcsr, MIPS_VOID_FTYPE_USI, hard_float),
14122 DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14123 DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14124 DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14125 DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14126 DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
14127 DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
14128 DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
14129 DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
14131 DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
14132 DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14133 DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14134 DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14135 DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
14137 DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
14138 DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
14139 DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14140 DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
14141 DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
14142 DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14144 DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
14145 DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
14146 DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14147 DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
14148 DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
14149 DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14151 MIPS_FP_CONDITIONS (CMP_BUILTINS),
14153 /* Built-in functions for the SB-1 processor. */
14154 DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
14156 /* Built-in functions for the DSP ASE (32-bit and 64-bit). */
14157 DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14158 DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14159 DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14160 DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14161 DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14162 DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14163 DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14164 DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14165 DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14166 DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14167 DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
14168 DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
14169 DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
14170 DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
14171 DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
14172 DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
14173 DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
14174 DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14175 DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14176 DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
14177 DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
14178 DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
14179 DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14180 DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14181 DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14182 DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14183 DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14184 DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14185 DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14186 DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14187 DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14188 DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14189 DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14190 DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14191 DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14192 DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14193 DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14194 DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
14195 DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14196 DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14197 DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14198 DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14199 DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14200 DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
14201 DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
14202 DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
14203 DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
14204 DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14205 DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14206 DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14207 DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14208 DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14209 DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14210 DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14211 DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14212 DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14213 DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14214 DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14215 DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14216 DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
14217 DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
14218 DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
14219 DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14220 DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14221 BPOSGE_BUILTIN (32, dsp),
14223 /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit). */
14224 DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
14225 DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14226 DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14227 DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14228 DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14229 DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14230 DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14231 DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14232 DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14233 DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14234 DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14235 DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14236 DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14237 DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14238 DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14239 DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
14240 DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14241 DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14242 DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14243 DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14244 DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14245 DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
14246 DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14247 DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14248 DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14249 DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14250 DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14251 DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14252 DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14253 DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14254 DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14255 DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14256 DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14257 DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14259 /* Built-in functions for the DSP ASE (32-bit only). */
14260 DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14261 DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14262 DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14263 DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14264 DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14265 DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14266 DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14267 DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14268 DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14269 DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14270 DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14271 DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14272 DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14273 DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14274 DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14275 DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14276 DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
14277 DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14278 DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14279 DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
14280 DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
14281 DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14282 DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14283 DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14284 DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14285 DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
14286 DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
14288 /* Built-in functions for the DSP ASE (64-bit only). */
14289 DIRECT_BUILTIN (ldx, MIPS_DI_FTYPE_POINTER_SI, dsp_64),
14291 /* The following are for the MIPS DSP ASE REV 2 (32-bit only). */
14292 DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14293 DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14294 DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14295 DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14296 DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14297 DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14298 DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14299 DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14300 DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14302 /* Builtin functions for ST Microelectronics Loongson-2E/2F cores. */
14303 LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
14304 LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
14305 LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
14306 LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14307 LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14308 LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14309 LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14310 LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14311 LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14312 LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
14313 LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
14314 LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14315 LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14316 LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14317 LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14318 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
14319 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14320 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14321 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14322 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
14323 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
14324 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14325 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14326 LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14327 LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14328 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14329 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14330 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14331 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14332 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14333 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14334 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14335 LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14336 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14337 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14338 LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14339 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14340 LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
14341 LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
14342 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14343 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14344 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14345 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14346 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14347 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14348 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14349 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14350 LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
14351 LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14352 LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14353 LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14354 LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14355 LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
14356 LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
14357 LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14358 LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14359 LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14360 LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
14361 LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14362 LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
14363 LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
14364 LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14365 LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14366 LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14367 LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14368 LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14369 LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14370 LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14371 LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14372 LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14373 LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14374 LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14375 LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14376 LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14377 LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14378 LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14379 LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14380 LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14381 LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14382 LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14383 LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14384 LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
14385 LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
14386 LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14387 LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14388 LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14389 LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14390 LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14391 LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14392 LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14393 LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14394 LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14395 LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14396 LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14397 LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14398 LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14399 LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14400 LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14401 LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14403 /* Sundry other built-in functions. */
14404 DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
14407 /* Index I is the function declaration for mips_builtins[I], or null if the
14408 function isn't defined on this target. */
14409 static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
14411 /* MODE is a vector mode whose elements have type TYPE. Return the type
14412 of the vector itself. */
14414 static tree
14415 mips_builtin_vector_type (tree type, machine_mode mode)
14417 static tree types[2 * (int) MAX_MACHINE_MODE];
14418 int mode_index;
14420 mode_index = (int) mode;
14422 if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
14423 mode_index += MAX_MACHINE_MODE;
14425 if (types[mode_index] == NULL_TREE)
14426 types[mode_index] = build_vector_type_for_mode (type, mode);
14427 return types[mode_index];
14430 /* Return a type for 'const volatile void *'. */
14432 static tree
14433 mips_build_cvpointer_type (void)
14435 static tree cache;
14437 if (cache == NULL_TREE)
14438 cache = build_pointer_type (build_qualified_type
14439 (void_type_node,
14440 TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
14441 return cache;
14444 /* Source-level argument types. */
14445 #define MIPS_ATYPE_VOID void_type_node
14446 #define MIPS_ATYPE_INT integer_type_node
14447 #define MIPS_ATYPE_POINTER ptr_type_node
14448 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
14450 /* Standard mode-based argument types. */
14451 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
14452 #define MIPS_ATYPE_SI intSI_type_node
14453 #define MIPS_ATYPE_USI unsigned_intSI_type_node
14454 #define MIPS_ATYPE_DI intDI_type_node
14455 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
14456 #define MIPS_ATYPE_SF float_type_node
14457 #define MIPS_ATYPE_DF double_type_node
14459 /* Vector argument types. */
14460 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
14461 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
14462 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
14463 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
14464 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
14465 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
14466 #define MIPS_ATYPE_UV2SI \
14467 mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
14468 #define MIPS_ATYPE_UV4HI \
14469 mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
14470 #define MIPS_ATYPE_UV8QI \
14471 mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
14473 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
14474 their associated MIPS_ATYPEs. */
14475 #define MIPS_FTYPE_ATYPES1(A, B) \
14476 MIPS_ATYPE_##A, MIPS_ATYPE_##B
14478 #define MIPS_FTYPE_ATYPES2(A, B, C) \
14479 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
14481 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
14482 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
14484 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
14485 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
14486 MIPS_ATYPE_##E
14488 /* Return the function type associated with function prototype TYPE. */
14490 static tree
14491 mips_build_function_type (enum mips_function_type type)
14493 static tree types[(int) MIPS_MAX_FTYPE_MAX];
14495 if (types[(int) type] == NULL_TREE)
14496 switch (type)
14498 #define DEF_MIPS_FTYPE(NUM, ARGS) \
14499 case MIPS_FTYPE_NAME##NUM ARGS: \
14500 types[(int) type] \
14501 = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS, \
14502 NULL_TREE); \
14503 break;
14504 #include "config/mips/mips-ftypes.def"
14505 #undef DEF_MIPS_FTYPE
14506 default:
14507 gcc_unreachable ();
14510 return types[(int) type];
14513 /* Implement TARGET_INIT_BUILTINS. */
14515 static void
14516 mips_init_builtins (void)
14518 const struct mips_builtin_description *d;
14519 unsigned int i;
14521 /* Iterate through all of the bdesc arrays, initializing all of the
14522 builtin functions. */
14523 for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
14525 d = &mips_builtins[i];
14526 if (d->avail ())
14527 mips_builtin_decls[i]
14528 = add_builtin_function (d->name,
14529 mips_build_function_type (d->function_type),
14530 i, BUILT_IN_MD, NULL, NULL);
14534 /* Implement TARGET_BUILTIN_DECL. */
14536 static tree
14537 mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
14539 if (code >= ARRAY_SIZE (mips_builtins))
14540 return error_mark_node;
14541 return mips_builtin_decls[code];
14544 /* Take argument ARGNO from EXP's argument list and convert it into
14545 an expand operand. Store the operand in *OP. */
14547 static void
14548 mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
14549 unsigned int argno)
14551 tree arg;
14552 rtx value;
14554 arg = CALL_EXPR_ARG (exp, argno);
14555 value = expand_normal (arg);
14556 create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
14559 /* Expand instruction ICODE as part of a built-in function sequence.
14560 Use the first NOPS elements of OPS as the instruction's operands.
14561 HAS_TARGET_P is true if operand 0 is a target; it is false if the
14562 instruction has no target.
14564 Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx. */
14566 static rtx
14567 mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
14568 struct expand_operand *ops, bool has_target_p)
14570 if (!maybe_expand_insn (icode, nops, ops))
14572 error ("invalid argument to built-in function");
14573 return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
14575 return has_target_p ? ops[0].value : const0_rtx;
14578 /* Expand a floating-point comparison for built-in function call EXP.
14579 The first NARGS arguments are the values to be compared. ICODE is
14580 the .md pattern that does the comparison and COND is the condition
14581 that is being tested. Return an rtx for the result. */
14583 static rtx
14584 mips_expand_builtin_compare_1 (enum insn_code icode,
14585 enum mips_fp_condition cond,
14586 tree exp, int nargs)
14588 struct expand_operand ops[MAX_RECOG_OPERANDS];
14589 rtx output;
14590 int opno, argno;
14592 /* The instruction should have a target operand, an operand for each
14593 argument, and an operand for COND. */
14594 gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args);
14596 output = mips_allocate_fcc (insn_data[(int) icode].operand[0].mode);
14597 opno = 0;
14598 create_fixed_operand (&ops[opno++], output);
14599 for (argno = 0; argno < nargs; argno++)
14600 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14601 create_integer_operand (&ops[opno++], (int) cond);
14602 return mips_expand_builtin_insn (icode, opno, ops, true);
14605 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
14606 HAS_TARGET_P says which. EXP is the CALL_EXPR that calls the function
14607 and ICODE is the code of the associated .md pattern. TARGET, if nonnull,
14608 suggests a good place to put the result. */
14610 static rtx
14611 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
14612 bool has_target_p)
14614 struct expand_operand ops[MAX_RECOG_OPERANDS];
14615 int opno, argno;
14617 /* Map any target to operand 0. */
14618 opno = 0;
14619 if (has_target_p)
14620 create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
14622 /* Map the arguments to the other operands. */
14623 gcc_assert (opno + call_expr_nargs (exp)
14624 == insn_data[icode].n_generator_args);
14625 for (argno = 0; argno < call_expr_nargs (exp); argno++)
14626 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14628 return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
14631 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
14632 function; TYPE says which. EXP is the CALL_EXPR that calls the
14633 function, ICODE is the instruction that should be used to compare
14634 the first two arguments, and COND is the condition it should test.
14635 TARGET, if nonnull, suggests a good place to put the result. */
14637 static rtx
14638 mips_expand_builtin_movtf (enum mips_builtin_type type,
14639 enum insn_code icode, enum mips_fp_condition cond,
14640 rtx target, tree exp)
14642 struct expand_operand ops[4];
14643 rtx cmp_result;
14645 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
14646 create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
14647 if (type == MIPS_BUILTIN_MOVT)
14649 mips_prepare_builtin_arg (&ops[2], exp, 2);
14650 mips_prepare_builtin_arg (&ops[1], exp, 3);
14652 else
14654 mips_prepare_builtin_arg (&ops[1], exp, 2);
14655 mips_prepare_builtin_arg (&ops[2], exp, 3);
14657 create_fixed_operand (&ops[3], cmp_result);
14658 return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
14659 4, ops, true);
14662 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
14663 into TARGET otherwise. Return TARGET. */
14665 static rtx
14666 mips_builtin_branch_and_move (rtx condition, rtx target,
14667 rtx value_if_true, rtx value_if_false)
14669 rtx_code_label *true_label, *done_label;
14671 true_label = gen_label_rtx ();
14672 done_label = gen_label_rtx ();
14674 /* First assume that CONDITION is false. */
14675 mips_emit_move (target, value_if_false);
14677 /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise. */
14678 emit_jump_insn (gen_condjump (condition, true_label));
14679 emit_jump_insn (gen_jump (done_label));
14680 emit_barrier ();
14682 /* Fix TARGET if CONDITION is true. */
14683 emit_label (true_label);
14684 mips_emit_move (target, value_if_true);
14686 emit_label (done_label);
14687 return target;
14690 /* Expand a comparison built-in function of type BUILTIN_TYPE. EXP is
14691 the CALL_EXPR that calls the function, ICODE is the code of the
14692 comparison instruction, and COND is the condition it should test.
14693 TARGET, if nonnull, suggests a good place to put the boolean result. */
14695 static rtx
14696 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
14697 enum insn_code icode, enum mips_fp_condition cond,
14698 rtx target, tree exp)
14700 rtx offset, condition, cmp_result;
14702 if (target == 0 || GET_MODE (target) != SImode)
14703 target = gen_reg_rtx (SImode);
14704 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
14705 call_expr_nargs (exp));
14707 /* If the comparison sets more than one register, we define the result
14708 to be 0 if all registers are false and -1 if all registers are true.
14709 The value of the complete result is indeterminate otherwise. */
14710 switch (builtin_type)
14712 case MIPS_BUILTIN_CMP_ALL:
14713 condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
14714 return mips_builtin_branch_and_move (condition, target,
14715 const0_rtx, const1_rtx);
14717 case MIPS_BUILTIN_CMP_UPPER:
14718 case MIPS_BUILTIN_CMP_LOWER:
14719 offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
14720 condition = gen_single_cc (cmp_result, offset);
14721 return mips_builtin_branch_and_move (condition, target,
14722 const1_rtx, const0_rtx);
14724 default:
14725 condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
14726 return mips_builtin_branch_and_move (condition, target,
14727 const1_rtx, const0_rtx);
14731 /* Expand a bposge built-in function of type BUILTIN_TYPE. TARGET,
14732 if nonnull, suggests a good place to put the boolean result. */
14734 static rtx
14735 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
14737 rtx condition, cmp_result;
14738 int cmp_value;
14740 if (target == 0 || GET_MODE (target) != SImode)
14741 target = gen_reg_rtx (SImode);
14743 cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
14745 if (builtin_type == MIPS_BUILTIN_BPOSGE32)
14746 cmp_value = 32;
14747 else
14748 gcc_assert (0);
14750 condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
14751 return mips_builtin_branch_and_move (condition, target,
14752 const1_rtx, const0_rtx);
14755 /* Implement TARGET_EXPAND_BUILTIN. */
14757 static rtx
14758 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
14759 machine_mode mode, int ignore)
14761 tree fndecl;
14762 unsigned int fcode, avail;
14763 const struct mips_builtin_description *d;
14765 fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14766 fcode = DECL_FUNCTION_CODE (fndecl);
14767 gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
14768 d = &mips_builtins[fcode];
14769 avail = d->avail ();
14770 gcc_assert (avail != 0);
14771 if (TARGET_MIPS16 && !(avail & BUILTIN_AVAIL_MIPS16))
14773 error ("built-in function %qE not supported for MIPS16",
14774 DECL_NAME (fndecl));
14775 return ignore ? const0_rtx : CONST0_RTX (mode);
14777 switch (d->builtin_type)
14779 case MIPS_BUILTIN_DIRECT:
14780 return mips_expand_builtin_direct (d->icode, target, exp, true);
14782 case MIPS_BUILTIN_DIRECT_NO_TARGET:
14783 return mips_expand_builtin_direct (d->icode, target, exp, false);
14785 case MIPS_BUILTIN_MOVT:
14786 case MIPS_BUILTIN_MOVF:
14787 return mips_expand_builtin_movtf (d->builtin_type, d->icode,
14788 d->cond, target, exp);
14790 case MIPS_BUILTIN_CMP_ANY:
14791 case MIPS_BUILTIN_CMP_ALL:
14792 case MIPS_BUILTIN_CMP_UPPER:
14793 case MIPS_BUILTIN_CMP_LOWER:
14794 case MIPS_BUILTIN_CMP_SINGLE:
14795 return mips_expand_builtin_compare (d->builtin_type, d->icode,
14796 d->cond, target, exp);
14798 case MIPS_BUILTIN_BPOSGE32:
14799 return mips_expand_builtin_bposge (d->builtin_type, target);
14801 gcc_unreachable ();
14804 /* An entry in the MIPS16 constant pool. VALUE is the pool constant,
14805 MODE is its mode, and LABEL is the CODE_LABEL associated with it. */
14806 struct mips16_constant {
14807 struct mips16_constant *next;
14808 rtx value;
14809 rtx_code_label *label;
14810 machine_mode mode;
14813 /* Information about an incomplete MIPS16 constant pool. FIRST is the
14814 first constant, HIGHEST_ADDRESS is the highest address that the first
14815 byte of the pool can have, and INSN_ADDRESS is the current instruction
14816 address. */
14817 struct mips16_constant_pool {
14818 struct mips16_constant *first;
14819 int highest_address;
14820 int insn_address;
14823 /* Add constant VALUE to POOL and return its label. MODE is the
14824 value's mode (used for CONST_INTs, etc.). */
14826 static rtx_code_label *
14827 mips16_add_constant (struct mips16_constant_pool *pool,
14828 rtx value, machine_mode mode)
14830 struct mips16_constant **p, *c;
14831 bool first_of_size_p;
14833 /* See whether the constant is already in the pool. If so, return the
14834 existing label, otherwise leave P pointing to the place where the
14835 constant should be added.
14837 Keep the pool sorted in increasing order of mode size so that we can
14838 reduce the number of alignments needed. */
14839 first_of_size_p = true;
14840 for (p = &pool->first; *p != 0; p = &(*p)->next)
14842 if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
14843 return (*p)->label;
14844 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
14845 break;
14846 if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
14847 first_of_size_p = false;
14850 /* In the worst case, the constant needed by the earliest instruction
14851 will end up at the end of the pool. The entire pool must then be
14852 accessible from that instruction.
14854 When adding the first constant, set the pool's highest address to
14855 the address of the first out-of-range byte. Adjust this address
14856 downwards each time a new constant is added. */
14857 if (pool->first == 0)
14858 /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
14859 of the instruction with the lowest two bits clear. The base PC
14860 value for LDPC has the lowest three bits clear. Assume the worst
14861 case here; namely that the PC-relative instruction occupies the
14862 last 2 bytes in an aligned word. */
14863 pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
14864 pool->highest_address -= GET_MODE_SIZE (mode);
14865 if (first_of_size_p)
14866 /* Take into account the worst possible padding due to alignment. */
14867 pool->highest_address -= GET_MODE_SIZE (mode) - 1;
14869 /* Create a new entry. */
14870 c = XNEW (struct mips16_constant);
14871 c->value = value;
14872 c->mode = mode;
14873 c->label = gen_label_rtx ();
14874 c->next = *p;
14875 *p = c;
14877 return c->label;
14880 /* Output constant VALUE after instruction INSN and return the last
14881 instruction emitted. MODE is the mode of the constant. */
14883 static rtx_insn *
14884 mips16_emit_constants_1 (machine_mode mode, rtx value, rtx_insn *insn)
14886 if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
14888 rtx size = GEN_INT (GET_MODE_SIZE (mode));
14889 return emit_insn_after (gen_consttable_int (value, size), insn);
14892 if (SCALAR_FLOAT_MODE_P (mode))
14893 return emit_insn_after (gen_consttable_float (value), insn);
14895 if (VECTOR_MODE_P (mode))
14897 int i;
14899 for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
14900 insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
14901 CONST_VECTOR_ELT (value, i), insn);
14902 return insn;
14905 gcc_unreachable ();
14908 /* Dump out the constants in CONSTANTS after INSN. */
14910 static void
14911 mips16_emit_constants (struct mips16_constant *constants, rtx_insn *insn)
14913 struct mips16_constant *c, *next;
14914 int align;
14916 align = 0;
14917 for (c = constants; c != NULL; c = next)
14919 /* If necessary, increase the alignment of PC. */
14920 if (align < GET_MODE_SIZE (c->mode))
14922 int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
14923 insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
14925 align = GET_MODE_SIZE (c->mode);
14927 insn = emit_label_after (c->label, insn);
14928 insn = mips16_emit_constants_1 (c->mode, c->value, insn);
14930 next = c->next;
14931 free (c);
14934 emit_barrier_after (insn);
14937 /* Return the length of instruction INSN. */
14939 static int
14940 mips16_insn_length (rtx_insn *insn)
14942 if (JUMP_TABLE_DATA_P (insn))
14944 rtx body = PATTERN (insn);
14945 if (GET_CODE (body) == ADDR_VEC)
14946 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
14947 else if (GET_CODE (body) == ADDR_DIFF_VEC)
14948 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
14949 else
14950 gcc_unreachable ();
14952 return get_attr_length (insn);
14955 /* If *X is a symbolic constant that refers to the constant pool, add
14956 the constant to POOL and rewrite *X to use the constant's label. */
14958 static void
14959 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
14961 rtx base, offset;
14962 rtx_code_label *label;
14964 split_const (*x, &base, &offset);
14965 if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
14967 label = mips16_add_constant (pool, copy_rtx (get_pool_constant (base)),
14968 get_pool_mode (base));
14969 base = gen_rtx_LABEL_REF (Pmode, label);
14970 *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
14974 /* Rewrite INSN so that constant pool references refer to the constant's
14975 label instead. */
14977 static void
14978 mips16_rewrite_pool_refs (rtx_insn *insn, struct mips16_constant_pool *pool)
14980 subrtx_ptr_iterator::array_type array;
14981 FOR_EACH_SUBRTX_PTR (iter, array, &PATTERN (insn), ALL)
14983 rtx *loc = *iter;
14985 if (force_to_mem_operand (*loc, Pmode))
14987 rtx mem = force_const_mem (GET_MODE (*loc), *loc);
14988 validate_change (insn, loc, mem, false);
14991 if (MEM_P (*loc))
14993 mips16_rewrite_pool_constant (pool, &XEXP (*loc, 0));
14994 iter.skip_subrtxes ();
14996 else
14998 if (TARGET_MIPS16_TEXT_LOADS)
14999 mips16_rewrite_pool_constant (pool, loc);
15000 if (GET_CODE (*loc) == CONST
15001 /* Don't rewrite the __mips16_rdwr symbol. */
15002 || (GET_CODE (*loc) == UNSPEC
15003 && XINT (*loc, 1) == UNSPEC_TLS_GET_TP))
15004 iter.skip_subrtxes ();
15009 /* Return whether CFG is used in mips_reorg. */
15011 static bool
15012 mips_cfg_in_reorg (void)
15014 return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
15015 || TARGET_RELAX_PIC_CALLS);
15018 /* Build MIPS16 constant pools. Split the instructions if SPLIT_P,
15019 otherwise assume that they are already split. */
15021 static void
15022 mips16_lay_out_constants (bool split_p)
15024 struct mips16_constant_pool pool;
15025 rtx_insn *insn, *barrier;
15027 if (!TARGET_MIPS16_PCREL_LOADS)
15028 return;
15030 if (split_p)
15032 if (mips_cfg_in_reorg ())
15033 split_all_insns ();
15034 else
15035 split_all_insns_noflow ();
15037 barrier = 0;
15038 memset (&pool, 0, sizeof (pool));
15039 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15041 /* Rewrite constant pool references in INSN. */
15042 if (USEFUL_INSN_P (insn))
15043 mips16_rewrite_pool_refs (insn, &pool);
15045 pool.insn_address += mips16_insn_length (insn);
15047 if (pool.first != NULL)
15049 /* If there are no natural barriers between the first user of
15050 the pool and the highest acceptable address, we'll need to
15051 create a new instruction to jump around the constant pool.
15052 In the worst case, this instruction will be 4 bytes long.
15054 If it's too late to do this transformation after INSN,
15055 do it immediately before INSN. */
15056 if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
15058 rtx_code_label *label;
15059 rtx_insn *jump;
15061 label = gen_label_rtx ();
15063 jump = emit_jump_insn_before (gen_jump (label), insn);
15064 JUMP_LABEL (jump) = label;
15065 LABEL_NUSES (label) = 1;
15066 barrier = emit_barrier_after (jump);
15068 emit_label_after (label, barrier);
15069 pool.insn_address += 4;
15072 /* See whether the constant pool is now out of range of the first
15073 user. If so, output the constants after the previous barrier.
15074 Note that any instructions between BARRIER and INSN (inclusive)
15075 will use negative offsets to refer to the pool. */
15076 if (pool.insn_address > pool.highest_address)
15078 mips16_emit_constants (pool.first, barrier);
15079 pool.first = NULL;
15080 barrier = 0;
15082 else if (BARRIER_P (insn))
15083 barrier = insn;
15086 mips16_emit_constants (pool.first, get_last_insn ());
15089 /* Return true if it is worth r10k_simplify_address's while replacing
15090 an address with X. We are looking for constants, and for addresses
15091 at a known offset from the incoming stack pointer. */
15093 static bool
15094 r10k_simplified_address_p (rtx x)
15096 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
15097 x = XEXP (x, 0);
15098 return x == virtual_incoming_args_rtx || CONSTANT_P (x);
15101 /* X is an expression that appears in INSN. Try to use the UD chains
15102 to simplify it, returning the simplified form on success and the
15103 original form otherwise. Replace the incoming value of $sp with
15104 virtual_incoming_args_rtx (which should never occur in X otherwise). */
15106 static rtx
15107 r10k_simplify_address (rtx x, rtx_insn *insn)
15109 rtx newx, op0, op1, set, note;
15110 rtx_insn *def_insn;
15111 df_ref use, def;
15112 struct df_link *defs;
15114 newx = NULL_RTX;
15115 if (UNARY_P (x))
15117 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15118 if (op0 != XEXP (x, 0))
15119 newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
15120 op0, GET_MODE (XEXP (x, 0)));
15122 else if (BINARY_P (x))
15124 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15125 op1 = r10k_simplify_address (XEXP (x, 1), insn);
15126 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
15127 newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
15129 else if (GET_CODE (x) == LO_SUM)
15131 /* LO_SUMs can be offset from HIGHs, if we know they won't
15132 overflow. See mips_classify_address for the rationale behind
15133 the lax check. */
15134 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15135 if (GET_CODE (op0) == HIGH)
15136 newx = XEXP (x, 1);
15138 else if (REG_P (x))
15140 /* Uses are recorded by regno_reg_rtx, not X itself. */
15141 use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
15142 gcc_assert (use);
15143 defs = DF_REF_CHAIN (use);
15145 /* Require a single definition. */
15146 if (defs && defs->next == NULL)
15148 def = defs->ref;
15149 if (DF_REF_IS_ARTIFICIAL (def))
15151 /* Replace the incoming value of $sp with
15152 virtual_incoming_args_rtx. */
15153 if (x == stack_pointer_rtx
15154 && DF_REF_BB (def) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
15155 newx = virtual_incoming_args_rtx;
15157 else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
15158 DF_REF_BB (def)))
15160 /* Make sure that DEF_INSN is a single set of REG. */
15161 def_insn = DF_REF_INSN (def);
15162 if (NONJUMP_INSN_P (def_insn))
15164 set = single_set (def_insn);
15165 if (set && rtx_equal_p (SET_DEST (set), x))
15167 /* Prefer to use notes, since the def-use chains
15168 are often shorter. */
15169 note = find_reg_equal_equiv_note (def_insn);
15170 if (note)
15171 newx = XEXP (note, 0);
15172 else
15173 newx = SET_SRC (set);
15174 newx = r10k_simplify_address (newx, def_insn);
15180 if (newx && r10k_simplified_address_p (newx))
15181 return newx;
15182 return x;
15185 /* Return true if ADDRESS is known to be an uncached address
15186 on R10K systems. */
15188 static bool
15189 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
15191 unsigned HOST_WIDE_INT upper;
15193 /* Check for KSEG1. */
15194 if (address + 0x60000000 < 0x20000000)
15195 return true;
15197 /* Check for uncached XKPHYS addresses. */
15198 if (Pmode == DImode)
15200 upper = (address >> 40) & 0xf9ffff;
15201 if (upper == 0x900000 || upper == 0xb80000)
15202 return true;
15204 return false;
15207 /* Return true if we can prove that an access to address X in instruction
15208 INSN would be safe from R10K speculation. This X is a general
15209 expression; it might not be a legitimate address. */
15211 static bool
15212 r10k_safe_address_p (rtx x, rtx_insn *insn)
15214 rtx base, offset;
15215 HOST_WIDE_INT offset_val;
15217 x = r10k_simplify_address (x, insn);
15219 /* Check for references to the stack frame. It doesn't really matter
15220 how much of the frame has been allocated at INSN; -mr10k-cache-barrier
15221 allows us to assume that accesses to any part of the eventual frame
15222 is safe from speculation at any point in the function. */
15223 mips_split_plus (x, &base, &offset_val);
15224 if (base == virtual_incoming_args_rtx
15225 && offset_val >= -cfun->machine->frame.total_size
15226 && offset_val < cfun->machine->frame.args_size)
15227 return true;
15229 /* Check for uncached addresses. */
15230 if (CONST_INT_P (x))
15231 return r10k_uncached_address_p (INTVAL (x));
15233 /* Check for accesses to a static object. */
15234 split_const (x, &base, &offset);
15235 return offset_within_block_p (base, INTVAL (offset));
15238 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
15239 an in-range access to an automatic variable, or to an object with
15240 a link-time-constant address. */
15242 static bool
15243 r10k_safe_mem_expr_p (tree expr, unsigned HOST_WIDE_INT offset)
15245 HOST_WIDE_INT bitoffset, bitsize;
15246 tree inner, var_offset;
15247 machine_mode mode;
15248 int unsigned_p, volatile_p;
15250 inner = get_inner_reference (expr, &bitsize, &bitoffset, &var_offset, &mode,
15251 &unsigned_p, &volatile_p, false);
15252 if (!DECL_P (inner) || !DECL_SIZE_UNIT (inner) || var_offset)
15253 return false;
15255 offset += bitoffset / BITS_PER_UNIT;
15256 return offset < tree_to_uhwi (DECL_SIZE_UNIT (inner));
15259 /* Return true if X contains a MEM that is not safe from R10K speculation.
15260 INSN is the instruction that contains X. */
15262 static bool
15263 r10k_needs_protection_p_1 (rtx x, rtx_insn *insn)
15265 subrtx_var_iterator::array_type array;
15266 FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
15268 rtx mem = *iter;
15269 if (MEM_P (mem))
15271 if ((MEM_EXPR (mem)
15272 && MEM_OFFSET_KNOWN_P (mem)
15273 && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
15274 || r10k_safe_address_p (XEXP (mem, 0), insn))
15275 iter.skip_subrtxes ();
15276 else
15277 return true;
15280 return false;
15283 /* A note_stores callback for which DATA points to an instruction pointer.
15284 If *DATA is nonnull, make it null if it X contains a MEM that is not
15285 safe from R10K speculation. */
15287 static void
15288 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
15289 void *data)
15291 rtx_insn **insn_ptr;
15293 insn_ptr = (rtx_insn **) data;
15294 if (*insn_ptr && r10k_needs_protection_p_1 (x, *insn_ptr))
15295 *insn_ptr = NULL;
15298 /* X is the pattern of a call instruction. Return true if the call is
15299 not to a declared function. */
15301 static bool
15302 r10k_needs_protection_p_call (const_rtx x)
15304 subrtx_iterator::array_type array;
15305 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
15307 const_rtx mem = *iter;
15308 if (MEM_P (mem))
15310 const_rtx addr = XEXP (mem, 0);
15311 if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DECL (addr))
15312 iter.skip_subrtxes ();
15313 else
15314 return true;
15317 return false;
15320 /* Return true if instruction INSN needs to be protected by an R10K
15321 cache barrier. */
15323 static bool
15324 r10k_needs_protection_p (rtx_insn *insn)
15326 if (CALL_P (insn))
15327 return r10k_needs_protection_p_call (PATTERN (insn));
15329 if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
15331 note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
15332 return insn == NULL_RTX;
15335 return r10k_needs_protection_p_1 (PATTERN (insn), insn);
15338 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
15339 edge is unconditional. */
15341 static bool
15342 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
15344 edge_iterator ei;
15345 edge e;
15347 FOR_EACH_EDGE (e, ei, bb->preds)
15348 if (!single_succ_p (e->src)
15349 || !bitmap_bit_p (protected_bbs, e->src->index)
15350 || (e->flags & EDGE_COMPLEX) != 0)
15351 return false;
15352 return true;
15355 /* Implement -mr10k-cache-barrier= for the current function. */
15357 static void
15358 r10k_insert_cache_barriers (void)
15360 int *rev_post_order;
15361 unsigned int i, n;
15362 basic_block bb;
15363 sbitmap protected_bbs;
15364 rtx_insn *insn, *end;
15365 rtx unprotected_region;
15367 if (TARGET_MIPS16)
15369 sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
15370 return;
15373 /* Calculate dominators. */
15374 calculate_dominance_info (CDI_DOMINATORS);
15376 /* Bit X of PROTECTED_BBS is set if the last operation in basic block
15377 X is protected by a cache barrier. */
15378 protected_bbs = sbitmap_alloc (last_basic_block_for_fn (cfun));
15379 bitmap_clear (protected_bbs);
15381 /* Iterate over the basic blocks in reverse post-order. */
15382 rev_post_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
15383 n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
15384 for (i = 0; i < n; i++)
15386 bb = BASIC_BLOCK_FOR_FN (cfun, rev_post_order[i]);
15388 /* If this block is only reached by unconditional edges, and if the
15389 source of every edge is protected, the beginning of the block is
15390 also protected. */
15391 if (r10k_protected_bb_p (bb, protected_bbs))
15392 unprotected_region = NULL_RTX;
15393 else
15394 unprotected_region = pc_rtx;
15395 end = NEXT_INSN (BB_END (bb));
15397 /* UNPROTECTED_REGION is:
15399 - null if we are processing a protected region,
15400 - pc_rtx if we are processing an unprotected region but have
15401 not yet found the first instruction in it
15402 - the first instruction in an unprotected region otherwise. */
15403 for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
15405 if (unprotected_region && USEFUL_INSN_P (insn))
15407 if (recog_memoized (insn) == CODE_FOR_mips_cache)
15408 /* This CACHE instruction protects the following code. */
15409 unprotected_region = NULL_RTX;
15410 else
15412 /* See if INSN is the first instruction in this
15413 unprotected region. */
15414 if (unprotected_region == pc_rtx)
15415 unprotected_region = insn;
15417 /* See if INSN needs to be protected. If so,
15418 we must insert a cache barrier somewhere between
15419 PREV_INSN (UNPROTECTED_REGION) and INSN. It isn't
15420 clear which position is better performance-wise,
15421 but as a tie-breaker, we assume that it is better
15422 to allow delay slots to be back-filled where
15423 possible, and that it is better not to insert
15424 barriers in the middle of already-scheduled code.
15425 We therefore insert the barrier at the beginning
15426 of the region. */
15427 if (r10k_needs_protection_p (insn))
15429 emit_insn_before (gen_r10k_cache_barrier (),
15430 unprotected_region);
15431 unprotected_region = NULL_RTX;
15436 if (CALL_P (insn))
15437 /* The called function is not required to protect the exit path.
15438 The code that follows a call is therefore unprotected. */
15439 unprotected_region = pc_rtx;
15442 /* Record whether the end of this block is protected. */
15443 if (unprotected_region == NULL_RTX)
15444 bitmap_set_bit (protected_bbs, bb->index);
15446 XDELETEVEC (rev_post_order);
15448 sbitmap_free (protected_bbs);
15450 free_dominance_info (CDI_DOMINATORS);
15453 /* If INSN is a call, return the underlying CALL expr. Return NULL_RTX
15454 otherwise. If INSN has two call rtx, then store the second one in
15455 SECOND_CALL. */
15457 static rtx
15458 mips_call_expr_from_insn (rtx_insn *insn, rtx *second_call)
15460 rtx x;
15461 rtx x2;
15463 if (!CALL_P (insn))
15464 return NULL_RTX;
15466 x = PATTERN (insn);
15467 if (GET_CODE (x) == PARALLEL)
15469 /* Calls returning complex values have two CALL rtx. Look for the second
15470 one here, and return it via the SECOND_CALL arg. */
15471 x2 = XVECEXP (x, 0, 1);
15472 if (GET_CODE (x2) == SET)
15473 x2 = XEXP (x2, 1);
15474 if (GET_CODE (x2) == CALL)
15475 *second_call = x2;
15477 x = XVECEXP (x, 0, 0);
15479 if (GET_CODE (x) == SET)
15480 x = XEXP (x, 1);
15481 gcc_assert (GET_CODE (x) == CALL);
15483 return x;
15486 /* REG is set in DEF. See if the definition is one of the ways we load a
15487 register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
15488 If it is, return the symbol reference of the function, otherwise return
15489 NULL_RTX.
15491 If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
15492 the values of source registers, otherwise treat such registers as
15493 having an unknown value. */
15495 static rtx
15496 mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
15498 rtx_insn *def_insn;
15499 rtx set;
15501 if (DF_REF_IS_ARTIFICIAL (def))
15502 return NULL_RTX;
15504 def_insn = DF_REF_INSN (def);
15505 set = single_set (def_insn);
15506 if (set && rtx_equal_p (SET_DEST (set), reg))
15508 rtx note, src, symbol;
15510 /* First see whether the source is a plain symbol. This is used
15511 when calling symbols that are not lazily bound. */
15512 src = SET_SRC (set);
15513 if (GET_CODE (src) == SYMBOL_REF)
15514 return src;
15516 /* Handle %call16 references. */
15517 symbol = mips_strip_unspec_call (src);
15518 if (symbol)
15520 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15521 return symbol;
15524 /* If we have something more complicated, look for a
15525 REG_EQUAL or REG_EQUIV note. */
15526 note = find_reg_equal_equiv_note (def_insn);
15527 if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
15528 return XEXP (note, 0);
15530 /* Follow at most one simple register copy. Such copies are
15531 interesting in cases like:
15533 for (...)
15535 locally_binding_fn (...);
15538 and:
15540 locally_binding_fn (...);
15542 locally_binding_fn (...);
15544 where the load of locally_binding_fn can legitimately be
15545 hoisted or shared. However, we do not expect to see complex
15546 chains of copies, so a full worklist solution to the problem
15547 would probably be overkill. */
15548 if (recurse_p && REG_P (src))
15549 return mips_find_pic_call_symbol (def_insn, src, false);
15552 return NULL_RTX;
15555 /* Find the definition of the use of REG in INSN. See if the definition
15556 is one of the ways we load a register with a symbol address for a
15557 mips_use_pic_fn_addr_reg_p call. If it is return the symbol reference
15558 of the function, otherwise return NULL_RTX. RECURSE_P is as for
15559 mips_pic_call_symbol_from_set. */
15561 static rtx
15562 mips_find_pic_call_symbol (rtx_insn *insn, rtx reg, bool recurse_p)
15564 df_ref use;
15565 struct df_link *defs;
15566 rtx symbol;
15568 use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
15569 if (!use)
15570 return NULL_RTX;
15571 defs = DF_REF_CHAIN (use);
15572 if (!defs)
15573 return NULL_RTX;
15574 symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15575 if (!symbol)
15576 return NULL_RTX;
15578 /* If we have more than one definition, they need to be identical. */
15579 for (defs = defs->next; defs; defs = defs->next)
15581 rtx other;
15583 other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15584 if (!rtx_equal_p (symbol, other))
15585 return NULL_RTX;
15588 return symbol;
15591 /* Replace the args_size operand of the call expression CALL with the
15592 call-attribute UNSPEC and fill in SYMBOL as the function symbol. */
15594 static void
15595 mips_annotate_pic_call_expr (rtx call, rtx symbol)
15597 rtx args_size;
15599 args_size = XEXP (call, 1);
15600 XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
15601 gen_rtvec (2, args_size, symbol),
15602 UNSPEC_CALL_ATTR);
15605 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression. See
15606 if instead of the arg_size argument it contains the call attributes. If
15607 yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
15608 symbol from the call attributes. Also return false if ARGS_SIZE_OPNO is
15609 -1. */
15611 bool
15612 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
15614 rtx args_size, symbol;
15616 if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
15617 return false;
15619 args_size = operands[args_size_opno];
15620 if (GET_CODE (args_size) != UNSPEC)
15621 return false;
15622 gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
15624 symbol = XVECEXP (args_size, 0, 1);
15625 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15627 operands[args_size_opno] = symbol;
15628 return true;
15631 /* Use DF to annotate PIC indirect calls with the function symbol they
15632 dispatch to. */
15634 static void
15635 mips_annotate_pic_calls (void)
15637 basic_block bb;
15638 rtx_insn *insn;
15640 FOR_EACH_BB_FN (bb, cfun)
15641 FOR_BB_INSNS (bb, insn)
15643 rtx call, reg, symbol, second_call;
15645 second_call = 0;
15646 call = mips_call_expr_from_insn (insn, &second_call);
15647 if (!call)
15648 continue;
15649 gcc_assert (MEM_P (XEXP (call, 0)));
15650 reg = XEXP (XEXP (call, 0), 0);
15651 if (!REG_P (reg))
15652 continue;
15654 symbol = mips_find_pic_call_symbol (insn, reg, true);
15655 if (symbol)
15657 mips_annotate_pic_call_expr (call, symbol);
15658 if (second_call)
15659 mips_annotate_pic_call_expr (second_call, symbol);
15664 /* A temporary variable used by note_uses callbacks, etc. */
15665 static rtx_insn *mips_sim_insn;
15667 /* A structure representing the state of the processor pipeline.
15668 Used by the mips_sim_* family of functions. */
15669 struct mips_sim {
15670 /* The maximum number of instructions that can be issued in a cycle.
15671 (Caches mips_issue_rate.) */
15672 unsigned int issue_rate;
15674 /* The current simulation time. */
15675 unsigned int time;
15677 /* How many more instructions can be issued in the current cycle. */
15678 unsigned int insns_left;
15680 /* LAST_SET[X].INSN is the last instruction to set register X.
15681 LAST_SET[X].TIME is the time at which that instruction was issued.
15682 INSN is null if no instruction has yet set register X. */
15683 struct {
15684 rtx_insn *insn;
15685 unsigned int time;
15686 } last_set[FIRST_PSEUDO_REGISTER];
15688 /* The pipeline's current DFA state. */
15689 state_t dfa_state;
15692 /* Reset STATE to the initial simulation state. */
15694 static void
15695 mips_sim_reset (struct mips_sim *state)
15697 curr_state = state->dfa_state;
15699 state->time = 0;
15700 state->insns_left = state->issue_rate;
15701 memset (&state->last_set, 0, sizeof (state->last_set));
15702 state_reset (curr_state);
15704 targetm.sched.init (0, false, 0);
15705 advance_state (curr_state);
15708 /* Initialize STATE before its first use. DFA_STATE points to an
15709 allocated but uninitialized DFA state. */
15711 static void
15712 mips_sim_init (struct mips_sim *state, state_t dfa_state)
15714 if (targetm.sched.init_dfa_pre_cycle_insn)
15715 targetm.sched.init_dfa_pre_cycle_insn ();
15717 if (targetm.sched.init_dfa_post_cycle_insn)
15718 targetm.sched.init_dfa_post_cycle_insn ();
15720 state->issue_rate = mips_issue_rate ();
15721 state->dfa_state = dfa_state;
15722 mips_sim_reset (state);
15725 /* Advance STATE by one clock cycle. */
15727 static void
15728 mips_sim_next_cycle (struct mips_sim *state)
15730 curr_state = state->dfa_state;
15732 state->time++;
15733 state->insns_left = state->issue_rate;
15734 advance_state (curr_state);
15737 /* Advance simulation state STATE until instruction INSN can read
15738 register REG. */
15740 static void
15741 mips_sim_wait_reg (struct mips_sim *state, rtx_insn *insn, rtx reg)
15743 unsigned int regno, end_regno;
15745 end_regno = END_REGNO (reg);
15746 for (regno = REGNO (reg); regno < end_regno; regno++)
15747 if (state->last_set[regno].insn != 0)
15749 unsigned int t;
15751 t = (state->last_set[regno].time
15752 + insn_latency (state->last_set[regno].insn, insn));
15753 while (state->time < t)
15754 mips_sim_next_cycle (state);
15758 /* A note_uses callback. For each register in *X, advance simulation
15759 state DATA until mips_sim_insn can read the register's value. */
15761 static void
15762 mips_sim_wait_regs_1 (rtx *x, void *data)
15764 subrtx_var_iterator::array_type array;
15765 FOR_EACH_SUBRTX_VAR (iter, array, *x, NONCONST)
15766 if (REG_P (*iter))
15767 mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *iter);
15770 /* Advance simulation state STATE until all of INSN's register
15771 dependencies are satisfied. */
15773 static void
15774 mips_sim_wait_regs (struct mips_sim *state, rtx_insn *insn)
15776 mips_sim_insn = insn;
15777 note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
15780 /* Advance simulation state STATE until the units required by
15781 instruction INSN are available. */
15783 static void
15784 mips_sim_wait_units (struct mips_sim *state, rtx_insn *insn)
15786 state_t tmp_state;
15788 tmp_state = alloca (state_size ());
15789 while (state->insns_left == 0
15790 || (memcpy (tmp_state, state->dfa_state, state_size ()),
15791 state_transition (tmp_state, insn) >= 0))
15792 mips_sim_next_cycle (state);
15795 /* Advance simulation state STATE until INSN is ready to issue. */
15797 static void
15798 mips_sim_wait_insn (struct mips_sim *state, rtx_insn *insn)
15800 mips_sim_wait_regs (state, insn);
15801 mips_sim_wait_units (state, insn);
15804 /* mips_sim_insn has just set X. Update the LAST_SET array
15805 in simulation state DATA. */
15807 static void
15808 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
15810 struct mips_sim *state;
15812 state = (struct mips_sim *) data;
15813 if (REG_P (x))
15815 unsigned int regno, end_regno;
15817 end_regno = END_REGNO (x);
15818 for (regno = REGNO (x); regno < end_regno; regno++)
15820 state->last_set[regno].insn = mips_sim_insn;
15821 state->last_set[regno].time = state->time;
15826 /* Issue instruction INSN in scheduler state STATE. Assume that INSN
15827 can issue immediately (i.e., that mips_sim_wait_insn has already
15828 been called). */
15830 static void
15831 mips_sim_issue_insn (struct mips_sim *state, rtx_insn *insn)
15833 curr_state = state->dfa_state;
15835 state_transition (curr_state, insn);
15836 state->insns_left = targetm.sched.variable_issue (0, false, insn,
15837 state->insns_left);
15839 mips_sim_insn = insn;
15840 note_stores (PATTERN (insn), mips_sim_record_set, state);
15843 /* Simulate issuing a NOP in state STATE. */
15845 static void
15846 mips_sim_issue_nop (struct mips_sim *state)
15848 if (state->insns_left == 0)
15849 mips_sim_next_cycle (state);
15850 state->insns_left--;
15853 /* Update simulation state STATE so that it's ready to accept the instruction
15854 after INSN. INSN should be part of the main rtl chain, not a member of a
15855 SEQUENCE. */
15857 static void
15858 mips_sim_finish_insn (struct mips_sim *state, rtx_insn *insn)
15860 /* If INSN is a jump with an implicit delay slot, simulate a nop. */
15861 if (JUMP_P (insn))
15862 mips_sim_issue_nop (state);
15864 switch (GET_CODE (SEQ_BEGIN (insn)))
15866 case CODE_LABEL:
15867 case CALL_INSN:
15868 /* We can't predict the processor state after a call or label. */
15869 mips_sim_reset (state);
15870 break;
15872 case JUMP_INSN:
15873 /* The delay slots of branch likely instructions are only executed
15874 when the branch is taken. Therefore, if the caller has simulated
15875 the delay slot instruction, STATE does not really reflect the state
15876 of the pipeline for the instruction after the delay slot. Also,
15877 branch likely instructions tend to incur a penalty when not taken,
15878 so there will probably be an extra delay between the branch and
15879 the instruction after the delay slot. */
15880 if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
15881 mips_sim_reset (state);
15882 break;
15884 default:
15885 break;
15889 /* Use simulator state STATE to calculate the execution time of
15890 instruction sequence SEQ. */
15892 static unsigned int
15893 mips_seq_time (struct mips_sim *state, rtx_insn *seq)
15895 mips_sim_reset (state);
15896 for (rtx_insn *insn = seq; insn; insn = NEXT_INSN (insn))
15898 mips_sim_wait_insn (state, insn);
15899 mips_sim_issue_insn (state, insn);
15901 return state->time;
15904 /* Return the execution-time cost of mips_tuning_info.fast_mult_zero_zero_p
15905 setting SETTING, using STATE to simulate instruction sequences. */
15907 static unsigned int
15908 mips_mult_zero_zero_cost (struct mips_sim *state, bool setting)
15910 mips_tuning_info.fast_mult_zero_zero_p = setting;
15911 start_sequence ();
15913 machine_mode dword_mode = TARGET_64BIT ? TImode : DImode;
15914 rtx hilo = gen_rtx_REG (dword_mode, MD_REG_FIRST);
15915 mips_emit_move_or_split (hilo, const0_rtx, SPLIT_FOR_SPEED);
15917 /* If the target provides mulsidi3_32bit then that's the most likely
15918 consumer of the result. Test for bypasses. */
15919 if (dword_mode == DImode && HAVE_maddsidi4)
15921 rtx gpr = gen_rtx_REG (SImode, GP_REG_FIRST + 4);
15922 emit_insn (gen_maddsidi4 (hilo, gpr, gpr, hilo));
15925 unsigned int time = mips_seq_time (state, get_insns ());
15926 end_sequence ();
15927 return time;
15930 /* Check the relative speeds of "MULT $0,$0" and "MTLO $0; MTHI $0"
15931 and set up mips_tuning_info.fast_mult_zero_zero_p accordingly.
15932 Prefer MULT -- which is shorter -- in the event of a tie. */
15934 static void
15935 mips_set_fast_mult_zero_zero_p (struct mips_sim *state)
15937 if (TARGET_MIPS16)
15938 /* No MTLO or MTHI available. */
15939 mips_tuning_info.fast_mult_zero_zero_p = true;
15940 else
15942 unsigned int true_time = mips_mult_zero_zero_cost (state, true);
15943 unsigned int false_time = mips_mult_zero_zero_cost (state, false);
15944 mips_tuning_info.fast_mult_zero_zero_p = (true_time <= false_time);
15948 /* Set up costs based on the current architecture and tuning settings. */
15950 static void
15951 mips_set_tuning_info (void)
15953 if (mips_tuning_info.initialized_p
15954 && mips_tuning_info.arch == mips_arch
15955 && mips_tuning_info.tune == mips_tune
15956 && mips_tuning_info.mips16_p == TARGET_MIPS16)
15957 return;
15959 mips_tuning_info.arch = mips_arch;
15960 mips_tuning_info.tune = mips_tune;
15961 mips_tuning_info.mips16_p = TARGET_MIPS16;
15962 mips_tuning_info.initialized_p = true;
15964 dfa_start ();
15966 struct mips_sim state;
15967 mips_sim_init (&state, alloca (state_size ()));
15969 mips_set_fast_mult_zero_zero_p (&state);
15971 dfa_finish ();
15974 /* Implement TARGET_EXPAND_TO_RTL_HOOK. */
15976 static void
15977 mips_expand_to_rtl_hook (void)
15979 /* We need to call this at a point where we can safely create sequences
15980 of instructions, so TARGET_OVERRIDE_OPTIONS is too early. We also
15981 need to call it at a point where the DFA infrastructure is not
15982 already in use, so we can't just call it lazily on demand.
15984 At present, mips_tuning_info is only needed during post-expand
15985 RTL passes such as split_insns, so this hook should be early enough.
15986 We may need to move the call elsewhere if mips_tuning_info starts
15987 to be used for other things (such as rtx_costs, or expanders that
15988 could be called during gimple optimization). */
15989 mips_set_tuning_info ();
15992 /* The VR4130 pipeline issues aligned pairs of instructions together,
15993 but it stalls the second instruction if it depends on the first.
15994 In order to cut down the amount of logic required, this dependence
15995 check is not based on a full instruction decode. Instead, any non-SPECIAL
15996 instruction is assumed to modify the register specified by bits 20-16
15997 (which is usually the "rt" field).
15999 In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
16000 input, so we can end up with a false dependence between the branch
16001 and its delay slot. If this situation occurs in instruction INSN,
16002 try to avoid it by swapping rs and rt. */
16004 static void
16005 vr4130_avoid_branch_rt_conflict (rtx_insn *insn)
16007 rtx_insn *first, *second;
16009 first = SEQ_BEGIN (insn);
16010 second = SEQ_END (insn);
16011 if (JUMP_P (first)
16012 && NONJUMP_INSN_P (second)
16013 && GET_CODE (PATTERN (first)) == SET
16014 && GET_CODE (SET_DEST (PATTERN (first))) == PC
16015 && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
16017 /* Check for the right kind of condition. */
16018 rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
16019 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
16020 && REG_P (XEXP (cond, 0))
16021 && REG_P (XEXP (cond, 1))
16022 && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
16023 && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
16025 /* SECOND mentions the rt register but not the rs register. */
16026 rtx tmp = XEXP (cond, 0);
16027 XEXP (cond, 0) = XEXP (cond, 1);
16028 XEXP (cond, 1) = tmp;
16033 /* Implement -mvr4130-align. Go through each basic block and simulate the
16034 processor pipeline. If we find that a pair of instructions could execute
16035 in parallel, and the first of those instructions is not 8-byte aligned,
16036 insert a nop to make it aligned. */
16038 static void
16039 vr4130_align_insns (void)
16041 struct mips_sim state;
16042 rtx_insn *insn, *subinsn, *last, *last2, *next;
16043 bool aligned_p;
16045 dfa_start ();
16047 /* LAST is the last instruction before INSN to have a nonzero length.
16048 LAST2 is the last such instruction before LAST. */
16049 last = 0;
16050 last2 = 0;
16052 /* ALIGNED_P is true if INSN is known to be at an aligned address. */
16053 aligned_p = true;
16055 mips_sim_init (&state, alloca (state_size ()));
16056 for (insn = get_insns (); insn != 0; insn = next)
16058 unsigned int length;
16060 next = NEXT_INSN (insn);
16062 /* See the comment above vr4130_avoid_branch_rt_conflict for details.
16063 This isn't really related to the alignment pass, but we do it on
16064 the fly to avoid a separate instruction walk. */
16065 vr4130_avoid_branch_rt_conflict (insn);
16067 length = get_attr_length (insn);
16068 if (length > 0 && USEFUL_INSN_P (insn))
16069 FOR_EACH_SUBINSN (subinsn, insn)
16071 mips_sim_wait_insn (&state, subinsn);
16073 /* If we want this instruction to issue in parallel with the
16074 previous one, make sure that the previous instruction is
16075 aligned. There are several reasons why this isn't worthwhile
16076 when the second instruction is a call:
16078 - Calls are less likely to be performance critical,
16079 - There's a good chance that the delay slot can execute
16080 in parallel with the call.
16081 - The return address would then be unaligned.
16083 In general, if we're going to insert a nop between instructions
16084 X and Y, it's better to insert it immediately after X. That
16085 way, if the nop makes Y aligned, it will also align any labels
16086 between X and Y. */
16087 if (state.insns_left != state.issue_rate
16088 && !CALL_P (subinsn))
16090 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
16092 /* SUBINSN is the first instruction in INSN and INSN is
16093 aligned. We want to align the previous instruction
16094 instead, so insert a nop between LAST2 and LAST.
16096 Note that LAST could be either a single instruction
16097 or a branch with a delay slot. In the latter case,
16098 LAST, like INSN, is already aligned, but the delay
16099 slot must have some extra delay that stops it from
16100 issuing at the same time as the branch. We therefore
16101 insert a nop before the branch in order to align its
16102 delay slot. */
16103 gcc_assert (last2);
16104 emit_insn_after (gen_nop (), last2);
16105 aligned_p = false;
16107 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
16109 /* SUBINSN is the delay slot of INSN, but INSN is
16110 currently unaligned. Insert a nop between
16111 LAST and INSN to align it. */
16112 gcc_assert (last);
16113 emit_insn_after (gen_nop (), last);
16114 aligned_p = true;
16117 mips_sim_issue_insn (&state, subinsn);
16119 mips_sim_finish_insn (&state, insn);
16121 /* Update LAST, LAST2 and ALIGNED_P for the next instruction. */
16122 length = get_attr_length (insn);
16123 if (length > 0)
16125 /* If the instruction is an asm statement or multi-instruction
16126 mips.md patern, the length is only an estimate. Insert an
16127 8 byte alignment after it so that the following instructions
16128 can be handled correctly. */
16129 if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
16130 && (recog_memoized (insn) < 0 || length >= 8))
16132 next = emit_insn_after (gen_align (GEN_INT (3)), insn);
16133 next = NEXT_INSN (next);
16134 mips_sim_next_cycle (&state);
16135 aligned_p = true;
16137 else if (length & 4)
16138 aligned_p = !aligned_p;
16139 last2 = last;
16140 last = insn;
16143 /* See whether INSN is an aligned label. */
16144 if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
16145 aligned_p = true;
16147 dfa_finish ();
16150 /* This structure records that the current function has a LO_SUM
16151 involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
16152 the largest offset applied to BASE by all such LO_SUMs. */
16153 struct mips_lo_sum_offset {
16154 rtx base;
16155 HOST_WIDE_INT offset;
16158 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE. */
16160 static hashval_t
16161 mips_hash_base (rtx base)
16163 int do_not_record_p;
16165 return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
16168 /* Hashtable helpers. */
16170 struct mips_lo_sum_offset_hasher : typed_free_remove <mips_lo_sum_offset>
16172 typedef mips_lo_sum_offset value_type;
16173 typedef rtx_def compare_type;
16174 static inline hashval_t hash (const value_type *);
16175 static inline bool equal (const value_type *, const compare_type *);
16178 /* Hash-table callbacks for mips_lo_sum_offsets. */
16180 inline hashval_t
16181 mips_lo_sum_offset_hasher::hash (const value_type *entry)
16183 return mips_hash_base (entry->base);
16186 inline bool
16187 mips_lo_sum_offset_hasher::equal (const value_type *entry,
16188 const compare_type *value)
16190 return rtx_equal_p (entry->base, value);
16193 typedef hash_table<mips_lo_sum_offset_hasher> mips_offset_table;
16195 /* Look up symbolic constant X in HTAB, which is a hash table of
16196 mips_lo_sum_offsets. If OPTION is NO_INSERT, return true if X can be
16197 paired with a recorded LO_SUM, otherwise record X in the table. */
16199 static bool
16200 mips_lo_sum_offset_lookup (mips_offset_table *htab, rtx x,
16201 enum insert_option option)
16203 rtx base, offset;
16204 mips_lo_sum_offset **slot;
16205 struct mips_lo_sum_offset *entry;
16207 /* Split X into a base and offset. */
16208 split_const (x, &base, &offset);
16209 if (UNSPEC_ADDRESS_P (base))
16210 base = UNSPEC_ADDRESS (base);
16212 /* Look up the base in the hash table. */
16213 slot = htab->find_slot_with_hash (base, mips_hash_base (base), option);
16214 if (slot == NULL)
16215 return false;
16217 entry = (struct mips_lo_sum_offset *) *slot;
16218 if (option == INSERT)
16220 if (entry == NULL)
16222 entry = XNEW (struct mips_lo_sum_offset);
16223 entry->base = base;
16224 entry->offset = INTVAL (offset);
16225 *slot = entry;
16227 else
16229 if (INTVAL (offset) > entry->offset)
16230 entry->offset = INTVAL (offset);
16233 return INTVAL (offset) <= entry->offset;
16236 /* Search X for LO_SUMs and record them in HTAB. */
16238 static void
16239 mips_record_lo_sums (const_rtx x, mips_offset_table *htab)
16241 subrtx_iterator::array_type array;
16242 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
16243 if (GET_CODE (*iter) == LO_SUM)
16244 mips_lo_sum_offset_lookup (htab, XEXP (*iter, 1), INSERT);
16247 /* Return true if INSN is a SET of an orphaned high-part relocation.
16248 HTAB is a hash table of mips_lo_sum_offsets that describes all the
16249 LO_SUMs in the current function. */
16251 static bool
16252 mips_orphaned_high_part_p (mips_offset_table *htab, rtx_insn *insn)
16254 enum mips_symbol_type type;
16255 rtx x, set;
16257 set = single_set (insn);
16258 if (set)
16260 /* Check for %his. */
16261 x = SET_SRC (set);
16262 if (GET_CODE (x) == HIGH
16263 && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
16264 return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
16266 /* Check for local %gots (and %got_pages, which is redundant but OK). */
16267 if (GET_CODE (x) == UNSPEC
16268 && XINT (x, 1) == UNSPEC_LOAD_GOT
16269 && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
16270 SYMBOL_CONTEXT_LEA, &type)
16271 && type == SYMBOL_GOTOFF_PAGE)
16272 return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
16274 return false;
16277 /* Subroutine of mips_reorg_process_insns. If there is a hazard between
16278 INSN and a previous instruction, avoid it by inserting nops after
16279 instruction AFTER.
16281 *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
16282 this point. If *DELAYED_REG is non-null, INSN must wait a cycle
16283 before using the value of that register. *HILO_DELAY counts the
16284 number of instructions since the last hilo hazard (that is,
16285 the number of instructions since the last MFLO or MFHI).
16287 After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
16288 for the next instruction.
16290 LO_REG is an rtx for the LO register, used in dependence checking. */
16292 static void
16293 mips_avoid_hazard (rtx_insn *after, rtx_insn *insn, int *hilo_delay,
16294 rtx *delayed_reg, rtx lo_reg)
16296 rtx pattern, set;
16297 int nops, ninsns;
16299 pattern = PATTERN (insn);
16301 /* Do not put the whole function in .set noreorder if it contains
16302 an asm statement. We don't know whether there will be hazards
16303 between the asm statement and the gcc-generated code. */
16304 if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
16305 cfun->machine->all_noreorder_p = false;
16307 /* Ignore zero-length instructions (barriers and the like). */
16308 ninsns = get_attr_length (insn) / 4;
16309 if (ninsns == 0)
16310 return;
16312 /* Work out how many nops are needed. Note that we only care about
16313 registers that are explicitly mentioned in the instruction's pattern.
16314 It doesn't matter that calls use the argument registers or that they
16315 clobber hi and lo. */
16316 if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
16317 nops = 2 - *hilo_delay;
16318 else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
16319 nops = 1;
16320 else
16321 nops = 0;
16323 /* Insert the nops between this instruction and the previous one.
16324 Each new nop takes us further from the last hilo hazard. */
16325 *hilo_delay += nops;
16326 while (nops-- > 0)
16327 emit_insn_after (gen_hazard_nop (), after);
16329 /* Set up the state for the next instruction. */
16330 *hilo_delay += ninsns;
16331 *delayed_reg = 0;
16332 if (INSN_CODE (insn) >= 0)
16333 switch (get_attr_hazard (insn))
16335 case HAZARD_NONE:
16336 break;
16338 case HAZARD_HILO:
16339 *hilo_delay = 0;
16340 break;
16342 case HAZARD_DELAY:
16343 set = single_set (insn);
16344 gcc_assert (set);
16345 *delayed_reg = SET_DEST (set);
16346 break;
16350 /* Go through the instruction stream and insert nops where necessary.
16351 Also delete any high-part relocations whose partnering low parts
16352 are now all dead. See if the whole function can then be put into
16353 .set noreorder and .set nomacro. */
16355 static void
16356 mips_reorg_process_insns (void)
16358 rtx_insn *insn, *last_insn, *subinsn, *next_insn;
16359 rtx lo_reg, delayed_reg;
16360 int hilo_delay;
16362 /* Force all instructions to be split into their final form. */
16363 split_all_insns_noflow ();
16365 /* Recalculate instruction lengths without taking nops into account. */
16366 cfun->machine->ignore_hazard_length_p = true;
16367 shorten_branches (get_insns ());
16369 cfun->machine->all_noreorder_p = true;
16371 /* We don't track MIPS16 PC-relative offsets closely enough to make
16372 a good job of "set .noreorder" code in MIPS16 mode. */
16373 if (TARGET_MIPS16)
16374 cfun->machine->all_noreorder_p = false;
16376 /* Code that doesn't use explicit relocs can't be ".set nomacro". */
16377 if (!TARGET_EXPLICIT_RELOCS)
16378 cfun->machine->all_noreorder_p = false;
16380 /* Profiled functions can't be all noreorder because the profiler
16381 support uses assembler macros. */
16382 if (crtl->profile)
16383 cfun->machine->all_noreorder_p = false;
16385 /* Code compiled with -mfix-vr4120, -mfix-rm7000 or -mfix-24k can't be
16386 all noreorder because we rely on the assembler to work around some
16387 errata. The R5900 too has several bugs. */
16388 if (TARGET_FIX_VR4120
16389 || TARGET_FIX_RM7000
16390 || TARGET_FIX_24K
16391 || TARGET_MIPS5900)
16392 cfun->machine->all_noreorder_p = false;
16394 /* The same is true for -mfix-vr4130 if we might generate MFLO or
16395 MFHI instructions. Note that we avoid using MFLO and MFHI if
16396 the VR4130 MACC and DMACC instructions are available instead;
16397 see the *mfhilo_{si,di}_macc patterns. */
16398 if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
16399 cfun->machine->all_noreorder_p = false;
16401 mips_offset_table htab (37);
16403 /* Make a first pass over the instructions, recording all the LO_SUMs. */
16404 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16405 FOR_EACH_SUBINSN (subinsn, insn)
16406 if (USEFUL_INSN_P (subinsn))
16408 rtx body = PATTERN (insn);
16409 int noperands = asm_noperands (body);
16410 if (noperands >= 0)
16412 rtx *ops = XALLOCAVEC (rtx, noperands);
16413 bool *used = XALLOCAVEC (bool, noperands);
16414 const char *string = decode_asm_operands (body, ops, NULL, NULL,
16415 NULL, NULL);
16416 get_referenced_operands (string, used, noperands);
16417 for (int i = 0; i < noperands; ++i)
16418 if (used[i])
16419 mips_record_lo_sums (ops[i], &htab);
16421 else
16422 mips_record_lo_sums (PATTERN (subinsn), &htab);
16425 last_insn = 0;
16426 hilo_delay = 2;
16427 delayed_reg = 0;
16428 lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
16430 /* Make a second pass over the instructions. Delete orphaned
16431 high-part relocations or turn them into NOPs. Avoid hazards
16432 by inserting NOPs. */
16433 for (insn = get_insns (); insn != 0; insn = next_insn)
16435 next_insn = NEXT_INSN (insn);
16436 if (USEFUL_INSN_P (insn))
16438 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
16440 /* If we find an orphaned high-part relocation in a delay
16441 slot, it's easier to turn that instruction into a NOP than
16442 to delete it. The delay slot will be a NOP either way. */
16443 FOR_EACH_SUBINSN (subinsn, insn)
16444 if (INSN_P (subinsn))
16446 if (mips_orphaned_high_part_p (&htab, subinsn))
16448 PATTERN (subinsn) = gen_nop ();
16449 INSN_CODE (subinsn) = CODE_FOR_nop;
16451 mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
16452 &delayed_reg, lo_reg);
16454 last_insn = insn;
16456 else
16458 /* INSN is a single instruction. Delete it if it's an
16459 orphaned high-part relocation. */
16460 if (mips_orphaned_high_part_p (&htab, insn))
16461 delete_insn (insn);
16462 /* Also delete cache barriers if the last instruction
16463 was an annulled branch. INSN will not be speculatively
16464 executed. */
16465 else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
16466 && last_insn
16467 && JUMP_P (SEQ_BEGIN (last_insn))
16468 && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
16469 delete_insn (insn);
16470 else
16472 mips_avoid_hazard (last_insn, insn, &hilo_delay,
16473 &delayed_reg, lo_reg);
16474 last_insn = insn;
16481 /* Return true if the function has a long branch instruction. */
16483 static bool
16484 mips_has_long_branch_p (void)
16486 rtx_insn *insn, *subinsn;
16487 int normal_length;
16489 /* We need up-to-date instruction lengths. */
16490 shorten_branches (get_insns ());
16492 /* Look for a branch that is longer than normal. The normal length for
16493 non-MIPS16 branches is 8, because the length includes the delay slot.
16494 It is 4 for MIPS16, because MIPS16 branches are extended instructions,
16495 but they have no delay slot. */
16496 normal_length = (TARGET_MIPS16 ? 4 : 8);
16497 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16498 FOR_EACH_SUBINSN (subinsn, insn)
16499 if (JUMP_P (subinsn)
16500 && get_attr_length (subinsn) > normal_length
16501 && (any_condjump_p (subinsn) || any_uncondjump_p (subinsn)))
16502 return true;
16504 return false;
16507 /* If we are using a GOT, but have not decided to use a global pointer yet,
16508 see whether we need one to implement long branches. Convert the ghost
16509 global-pointer instructions into real ones if so. */
16511 static bool
16512 mips_expand_ghost_gp_insns (void)
16514 /* Quick exit if we already know that we will or won't need a
16515 global pointer. */
16516 if (!TARGET_USE_GOT
16517 || cfun->machine->global_pointer == INVALID_REGNUM
16518 || mips_must_initialize_gp_p ())
16519 return false;
16521 /* Run a full check for long branches. */
16522 if (!mips_has_long_branch_p ())
16523 return false;
16525 /* We've now established that we need $gp. */
16526 cfun->machine->must_initialize_gp_p = true;
16527 split_all_insns_noflow ();
16529 return true;
16532 /* Subroutine of mips_reorg to manage passes that require DF. */
16534 static void
16535 mips_df_reorg (void)
16537 /* Create def-use chains. */
16538 df_set_flags (DF_EQ_NOTES);
16539 df_chain_add_problem (DF_UD_CHAIN);
16540 df_analyze ();
16542 if (TARGET_RELAX_PIC_CALLS)
16543 mips_annotate_pic_calls ();
16545 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
16546 r10k_insert_cache_barriers ();
16548 df_finish_pass (false);
16551 /* Emit code to load LABEL_REF SRC into MIPS16 register DEST. This is
16552 called very late in mips_reorg, but the caller is required to run
16553 mips16_lay_out_constants on the result. */
16555 static void
16556 mips16_load_branch_target (rtx dest, rtx src)
16558 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
16560 rtx page, low;
16562 if (mips_cfun_has_cprestore_slot_p ())
16563 mips_emit_move (dest, mips_cprestore_slot (dest, true));
16564 else
16565 mips_emit_move (dest, pic_offset_table_rtx);
16566 page = mips_unspec_address (src, SYMBOL_GOTOFF_PAGE);
16567 low = mips_unspec_address (src, SYMBOL_GOT_PAGE_OFST);
16568 emit_insn (gen_rtx_SET (VOIDmode, dest,
16569 PMODE_INSN (gen_unspec_got, (dest, page))));
16570 emit_insn (gen_rtx_SET (VOIDmode, dest,
16571 gen_rtx_LO_SUM (Pmode, dest, low)));
16573 else
16575 src = mips_unspec_address (src, SYMBOL_ABSOLUTE);
16576 mips_emit_move (dest, src);
16580 /* If we're compiling a MIPS16 function, look for and split any long branches.
16581 This must be called after all other instruction modifications in
16582 mips_reorg. */
16584 static void
16585 mips16_split_long_branches (void)
16587 bool something_changed;
16589 if (!TARGET_MIPS16)
16590 return;
16592 /* Loop until the alignments for all targets are sufficient. */
16595 rtx_insn *insn;
16597 shorten_branches (get_insns ());
16598 something_changed = false;
16599 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16600 if (JUMP_P (insn)
16601 && get_attr_length (insn) > 4
16602 && (any_condjump_p (insn) || any_uncondjump_p (insn)))
16604 rtx old_label, temp, saved_temp;
16605 rtx_code_label *new_label;
16606 rtx target;
16607 rtx_insn *jump, *jump_sequence;
16609 start_sequence ();
16611 /* Free up a MIPS16 register by saving it in $1. */
16612 saved_temp = gen_rtx_REG (Pmode, AT_REGNUM);
16613 temp = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
16614 emit_move_insn (saved_temp, temp);
16616 /* Load the branch target into TEMP. */
16617 old_label = JUMP_LABEL (insn);
16618 target = gen_rtx_LABEL_REF (Pmode, old_label);
16619 mips16_load_branch_target (temp, target);
16621 /* Jump to the target and restore the register's
16622 original value. */
16623 jump = emit_jump_insn (PMODE_INSN (gen_indirect_jump_and_restore,
16624 (temp, temp, saved_temp)));
16625 JUMP_LABEL (jump) = old_label;
16626 LABEL_NUSES (old_label)++;
16628 /* Rewrite any symbolic references that are supposed to use
16629 a PC-relative constant pool. */
16630 mips16_lay_out_constants (false);
16632 if (simplejump_p (insn))
16633 /* We're going to replace INSN with a longer form. */
16634 new_label = NULL;
16635 else
16637 /* Create a branch-around label for the original
16638 instruction. */
16639 new_label = gen_label_rtx ();
16640 emit_label (new_label);
16643 jump_sequence = get_insns ();
16644 end_sequence ();
16646 emit_insn_after (jump_sequence, insn);
16647 if (new_label)
16648 invert_jump (insn, new_label, false);
16649 else
16650 delete_insn (insn);
16651 something_changed = true;
16654 while (something_changed);
16657 /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
16659 static void
16660 mips_reorg (void)
16662 /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF. Also during
16663 insn splitting in mips16_lay_out_constants, DF insn info is only kept up
16664 to date if the CFG is available. */
16665 if (mips_cfg_in_reorg ())
16666 compute_bb_for_insn ();
16667 mips16_lay_out_constants (true);
16668 if (mips_cfg_in_reorg ())
16670 mips_df_reorg ();
16671 free_bb_for_insn ();
16675 /* We use a machine specific pass to do a second machine dependent reorg
16676 pass after delay branch scheduling. */
16678 static unsigned int
16679 mips_machine_reorg2 (void)
16681 mips_reorg_process_insns ();
16682 if (!TARGET_MIPS16
16683 && TARGET_EXPLICIT_RELOCS
16684 && TUNE_MIPS4130
16685 && TARGET_VR4130_ALIGN)
16686 vr4130_align_insns ();
16687 if (mips_expand_ghost_gp_insns ())
16688 /* The expansion could invalidate some of the VR4130 alignment
16689 optimizations, but this should be an extremely rare case anyhow. */
16690 mips_reorg_process_insns ();
16691 mips16_split_long_branches ();
16692 return 0;
16695 namespace {
16697 const pass_data pass_data_mips_machine_reorg2 =
16699 RTL_PASS, /* type */
16700 "mach2", /* name */
16701 OPTGROUP_NONE, /* optinfo_flags */
16702 TV_MACH_DEP, /* tv_id */
16703 0, /* properties_required */
16704 0, /* properties_provided */
16705 0, /* properties_destroyed */
16706 0, /* todo_flags_start */
16707 0, /* todo_flags_finish */
16710 class pass_mips_machine_reorg2 : public rtl_opt_pass
16712 public:
16713 pass_mips_machine_reorg2(gcc::context *ctxt)
16714 : rtl_opt_pass(pass_data_mips_machine_reorg2, ctxt)
16717 /* opt_pass methods: */
16718 virtual unsigned int execute (function *) { return mips_machine_reorg2 (); }
16720 }; // class pass_mips_machine_reorg2
16722 } // anon namespace
16724 rtl_opt_pass *
16725 make_pass_mips_machine_reorg2 (gcc::context *ctxt)
16727 return new pass_mips_machine_reorg2 (ctxt);
16731 /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
16732 in order to avoid duplicating too much logic from elsewhere. */
16734 static void
16735 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
16736 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
16737 tree function)
16739 rtx this_rtx, temp1, temp2, fnaddr;
16740 rtx_insn *insn;
16741 bool use_sibcall_p;
16743 /* Pretend to be a post-reload pass while generating rtl. */
16744 reload_completed = 1;
16746 /* Mark the end of the (empty) prologue. */
16747 emit_note (NOTE_INSN_PROLOGUE_END);
16749 /* Determine if we can use a sibcall to call FUNCTION directly. */
16750 fnaddr = XEXP (DECL_RTL (function), 0);
16751 use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
16752 && const_call_insn_operand (fnaddr, Pmode));
16754 /* Determine if we need to load FNADDR from the GOT. */
16755 if (!use_sibcall_p
16756 && (mips_got_symbol_type_p
16757 (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
16759 /* Pick a global pointer. Use a call-clobbered register if
16760 TARGET_CALL_SAVED_GP. */
16761 cfun->machine->global_pointer
16762 = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
16763 cfun->machine->must_initialize_gp_p = true;
16764 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
16766 /* Set up the global pointer for n32 or n64 abicalls. */
16767 mips_emit_loadgp ();
16770 /* We need two temporary registers in some cases. */
16771 temp1 = gen_rtx_REG (Pmode, 2);
16772 temp2 = gen_rtx_REG (Pmode, 3);
16774 /* Find out which register contains the "this" pointer. */
16775 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
16776 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
16777 else
16778 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
16780 /* Add DELTA to THIS_RTX. */
16781 if (delta != 0)
16783 rtx offset = GEN_INT (delta);
16784 if (!SMALL_OPERAND (delta))
16786 mips_emit_move (temp1, offset);
16787 offset = temp1;
16789 emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
16792 /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX. */
16793 if (vcall_offset != 0)
16795 rtx addr;
16797 /* Set TEMP1 to *THIS_RTX. */
16798 mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
16800 /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET. */
16801 addr = mips_add_offset (temp2, temp1, vcall_offset);
16803 /* Load the offset and add it to THIS_RTX. */
16804 mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
16805 emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
16808 /* Jump to the target function. Use a sibcall if direct jumps are
16809 allowed, otherwise load the address into a register first. */
16810 if (use_sibcall_p)
16812 insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
16813 SIBLING_CALL_P (insn) = 1;
16815 else
16817 /* This is messy. GAS treats "la $25,foo" as part of a call
16818 sequence and may allow a global "foo" to be lazily bound.
16819 The general move patterns therefore reject this combination.
16821 In this context, lazy binding would actually be OK
16822 for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
16823 TARGET_CALL_SAVED_GP; see mips_load_call_address.
16824 We must therefore load the address via a temporary
16825 register if mips_dangerous_for_la25_p.
16827 If we jump to the temporary register rather than $25,
16828 the assembler can use the move insn to fill the jump's
16829 delay slot.
16831 We can use the same technique for MIPS16 code, where $25
16832 is not a valid JR register. */
16833 if (TARGET_USE_PIC_FN_ADDR_REG
16834 && !TARGET_MIPS16
16835 && !mips_dangerous_for_la25_p (fnaddr))
16836 temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
16837 mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
16839 if (TARGET_USE_PIC_FN_ADDR_REG
16840 && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
16841 mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
16842 emit_jump_insn (gen_indirect_jump (temp1));
16845 /* Run just enough of rest_of_compilation. This sequence was
16846 "borrowed" from alpha.c. */
16847 insn = get_insns ();
16848 split_all_insns_noflow ();
16849 mips16_lay_out_constants (true);
16850 shorten_branches (insn);
16851 final_start_function (insn, file, 1);
16852 final (insn, file, 1);
16853 final_end_function ();
16855 /* Clean up the vars set above. Note that final_end_function resets
16856 the global pointer for us. */
16857 reload_completed = 0;
16861 /* The last argument passed to mips_set_compression_mode,
16862 or negative if the function hasn't been called yet. */
16863 static unsigned int old_compression_mode = -1;
16865 /* Set up the target-dependent global state for ISA mode COMPRESSION_MODE,
16866 which is either MASK_MIPS16 or MASK_MICROMIPS. */
16868 static void
16869 mips_set_compression_mode (unsigned int compression_mode)
16872 if (compression_mode == old_compression_mode)
16873 return;
16875 /* Restore base settings of various flags. */
16876 target_flags = mips_base_target_flags;
16877 flag_schedule_insns = mips_base_schedule_insns;
16878 flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
16879 flag_move_loop_invariants = mips_base_move_loop_invariants;
16880 align_loops = mips_base_align_loops;
16881 align_jumps = mips_base_align_jumps;
16882 align_functions = mips_base_align_functions;
16883 target_flags &= ~(MASK_MIPS16 | MASK_MICROMIPS);
16884 target_flags |= compression_mode;
16886 if (compression_mode & MASK_MIPS16)
16888 /* Switch to MIPS16 mode. */
16889 target_flags |= MASK_MIPS16;
16891 /* Turn off SYNCI if it was on, MIPS16 doesn't support it. */
16892 target_flags &= ~MASK_SYNCI;
16894 /* Don't run the scheduler before reload, since it tends to
16895 increase register pressure. */
16896 flag_schedule_insns = 0;
16898 /* Don't do hot/cold partitioning. mips16_lay_out_constants expects
16899 the whole function to be in a single section. */
16900 flag_reorder_blocks_and_partition = 0;
16902 /* Don't move loop invariants, because it tends to increase
16903 register pressure. It also introduces an extra move in cases
16904 where the constant is the first operand in a two-operand binary
16905 instruction, or when it forms a register argument to a functon
16906 call. */
16907 flag_move_loop_invariants = 0;
16909 target_flags |= MASK_EXPLICIT_RELOCS;
16911 /* Experiments suggest we get the best overall section-anchor
16912 results from using the range of an unextended LW or SW. Code
16913 that makes heavy use of byte or short accesses can do better
16914 with ranges of 0...31 and 0...63 respectively, but most code is
16915 sensitive to the range of LW and SW instead. */
16916 targetm.min_anchor_offset = 0;
16917 targetm.max_anchor_offset = 127;
16919 targetm.const_anchor = 0;
16921 /* MIPS16 has no BAL instruction. */
16922 target_flags &= ~MASK_RELAX_PIC_CALLS;
16924 /* The R4000 errata don't apply to any known MIPS16 cores.
16925 It's simpler to make the R4000 fixes and MIPS16 mode
16926 mutually exclusive. */
16927 target_flags &= ~MASK_FIX_R4000;
16929 if (flag_pic && !TARGET_OLDABI)
16930 sorry ("MIPS16 PIC for ABIs other than o32 and o64");
16932 if (TARGET_XGOT)
16933 sorry ("MIPS16 -mxgot code");
16935 if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
16936 sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
16938 else
16940 /* Switch to microMIPS or the standard encoding. */
16942 if (TARGET_MICROMIPS)
16943 /* Avoid branch likely. */
16944 target_flags &= ~MASK_BRANCHLIKELY;
16946 /* Provide default values for align_* for 64-bit targets. */
16947 if (TARGET_64BIT)
16949 if (align_loops == 0)
16950 align_loops = 8;
16951 if (align_jumps == 0)
16952 align_jumps = 8;
16953 if (align_functions == 0)
16954 align_functions = 8;
16957 targetm.min_anchor_offset = -32768;
16958 targetm.max_anchor_offset = 32767;
16960 targetm.const_anchor = 0x8000;
16963 /* (Re)initialize MIPS target internals for new ISA. */
16964 mips_init_relocs ();
16966 if (compression_mode & MASK_MIPS16)
16968 if (!mips16_globals)
16969 mips16_globals = save_target_globals_default_opts ();
16970 else
16971 restore_target_globals (mips16_globals);
16973 else
16974 restore_target_globals (&default_target_globals);
16976 old_compression_mode = compression_mode;
16979 /* Implement TARGET_SET_CURRENT_FUNCTION. Decide whether the current
16980 function should use the MIPS16 or microMIPS ISA and switch modes
16981 accordingly. */
16983 static void
16984 mips_set_current_function (tree fndecl)
16986 mips_set_compression_mode (mips_get_compress_mode (fndecl));
16989 /* Allocate a chunk of memory for per-function machine-dependent data. */
16991 static struct machine_function *
16992 mips_init_machine_status (void)
16994 return ggc_cleared_alloc<machine_function> ();
16997 /* Return the processor associated with the given ISA level, or null
16998 if the ISA isn't valid. */
17000 static const struct mips_cpu_info *
17001 mips_cpu_info_from_isa (int isa)
17003 unsigned int i;
17005 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
17006 if (mips_cpu_info_table[i].isa == isa)
17007 return mips_cpu_info_table + i;
17009 return NULL;
17012 /* Return a mips_cpu_info entry determined by an option valued
17013 OPT. */
17015 static const struct mips_cpu_info *
17016 mips_cpu_info_from_opt (int opt)
17018 switch (opt)
17020 case MIPS_ARCH_OPTION_FROM_ABI:
17021 /* 'from-abi' selects the most compatible architecture for the
17022 given ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit
17023 ABIs. For the EABIs, we have to decide whether we're using
17024 the 32-bit or 64-bit version. */
17025 return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
17026 : ABI_NEEDS_64BIT_REGS ? 3
17027 : (TARGET_64BIT ? 3 : 1));
17029 case MIPS_ARCH_OPTION_NATIVE:
17030 gcc_unreachable ();
17032 default:
17033 return &mips_cpu_info_table[opt];
17037 /* Return a default mips_cpu_info entry, given that no -march= option
17038 was explicitly specified. */
17040 static const struct mips_cpu_info *
17041 mips_default_arch (void)
17043 #if defined (MIPS_CPU_STRING_DEFAULT)
17044 unsigned int i;
17045 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
17046 if (strcmp (mips_cpu_info_table[i].name, MIPS_CPU_STRING_DEFAULT) == 0)
17047 return mips_cpu_info_table + i;
17048 gcc_unreachable ();
17049 #elif defined (MIPS_ISA_DEFAULT)
17050 return mips_cpu_info_from_isa (MIPS_ISA_DEFAULT);
17051 #else
17052 /* 'from-abi' makes a good default: you get whatever the ABI
17053 requires. */
17054 return mips_cpu_info_from_opt (MIPS_ARCH_OPTION_FROM_ABI);
17055 #endif
17058 /* Set up globals to generate code for the ISA or processor
17059 described by INFO. */
17061 static void
17062 mips_set_architecture (const struct mips_cpu_info *info)
17064 if (info != 0)
17066 mips_arch_info = info;
17067 mips_arch = info->cpu;
17068 mips_isa = info->isa;
17069 if (mips_isa < 32)
17070 mips_isa_rev = 0;
17071 else
17072 mips_isa_rev = (mips_isa & 31) + 1;
17076 /* Likewise for tuning. */
17078 static void
17079 mips_set_tune (const struct mips_cpu_info *info)
17081 if (info != 0)
17083 mips_tune_info = info;
17084 mips_tune = info->cpu;
17088 /* Implement TARGET_OPTION_OVERRIDE. */
17090 static void
17091 mips_option_override (void)
17093 int i, start, regno, mode;
17095 if (global_options_set.x_mips_isa_option)
17096 mips_isa_option_info = &mips_cpu_info_table[mips_isa_option];
17098 #ifdef SUBTARGET_OVERRIDE_OPTIONS
17099 SUBTARGET_OVERRIDE_OPTIONS;
17100 #endif
17102 /* MIPS16 and microMIPS cannot coexist. */
17103 if (TARGET_MICROMIPS && TARGET_MIPS16)
17104 error ("unsupported combination: %s", "-mips16 -mmicromips");
17106 /* Save the base compression state and process flags as though we
17107 were generating uncompressed code. */
17108 mips_base_compression_flags = TARGET_COMPRESSION;
17109 target_flags &= ~TARGET_COMPRESSION;
17111 /* -mno-float overrides -mhard-float and -msoft-float. */
17112 if (TARGET_NO_FLOAT)
17114 target_flags |= MASK_SOFT_FLOAT_ABI;
17115 target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
17118 if (TARGET_FLIP_MIPS16)
17119 TARGET_INTERLINK_COMPRESSED = 1;
17121 /* Set the small data limit. */
17122 mips_small_data_threshold = (global_options_set.x_g_switch_value
17123 ? g_switch_value
17124 : MIPS_DEFAULT_GVALUE);
17126 /* The following code determines the architecture and register size.
17127 Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
17128 The GAS and GCC code should be kept in sync as much as possible. */
17130 if (global_options_set.x_mips_arch_option)
17131 mips_set_architecture (mips_cpu_info_from_opt (mips_arch_option));
17133 if (mips_isa_option_info != 0)
17135 if (mips_arch_info == 0)
17136 mips_set_architecture (mips_isa_option_info);
17137 else if (mips_arch_info->isa != mips_isa_option_info->isa)
17138 error ("%<-%s%> conflicts with the other architecture options, "
17139 "which specify a %s processor",
17140 mips_isa_option_info->name,
17141 mips_cpu_info_from_isa (mips_arch_info->isa)->name);
17144 if (mips_arch_info == 0)
17145 mips_set_architecture (mips_default_arch ());
17147 if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
17148 error ("%<-march=%s%> is not compatible with the selected ABI",
17149 mips_arch_info->name);
17151 /* Optimize for mips_arch, unless -mtune selects a different processor. */
17152 if (global_options_set.x_mips_tune_option)
17153 mips_set_tune (mips_cpu_info_from_opt (mips_tune_option));
17155 if (mips_tune_info == 0)
17156 mips_set_tune (mips_arch_info);
17158 if ((target_flags_explicit & MASK_64BIT) != 0)
17160 /* The user specified the size of the integer registers. Make sure
17161 it agrees with the ABI and ISA. */
17162 if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
17163 error ("%<-mgp64%> used with a 32-bit processor");
17164 else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
17165 error ("%<-mgp32%> used with a 64-bit ABI");
17166 else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
17167 error ("%<-mgp64%> used with a 32-bit ABI");
17169 else
17171 /* Infer the integer register size from the ABI and processor.
17172 Restrict ourselves to 32-bit registers if that's all the
17173 processor has, or if the ABI cannot handle 64-bit registers. */
17174 if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
17175 target_flags &= ~MASK_64BIT;
17176 else
17177 target_flags |= MASK_64BIT;
17180 if ((target_flags_explicit & MASK_FLOAT64) != 0)
17182 if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
17183 error ("unsupported combination: %s", "-mfp64 -msingle-float");
17184 else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
17185 error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
17186 else if (!TARGET_64BIT && TARGET_FLOAT64)
17188 if (!ISA_HAS_MXHC1)
17189 error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
17190 " the target supports the mfhc1 and mthc1 instructions");
17191 else if (mips_abi != ABI_32)
17192 error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
17193 " the o32 ABI");
17196 else
17198 /* -msingle-float selects 32-bit float registers. Otherwise the
17199 float registers should be the same size as the integer ones. */
17200 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
17201 target_flags |= MASK_FLOAT64;
17202 else
17203 target_flags &= ~MASK_FLOAT64;
17206 if (mips_abi != ABI_32 && TARGET_FLOATXX)
17207 error ("%<-mfpxx%> can only be used with the o32 ABI");
17208 else if (ISA_MIPS1 && !TARGET_FLOAT32)
17209 error ("%<-march=%s%> requires %<-mfp32%>", mips_arch_info->name);
17210 else if (TARGET_FLOATXX && !mips_lra_flag)
17211 error ("%<-mfpxx%> requires %<-mlra%>");
17213 /* End of code shared with GAS. */
17215 /* The R5900 FPU only supports single precision. */
17216 if (TARGET_MIPS5900 && TARGET_HARD_FLOAT_ABI && TARGET_DOUBLE_FLOAT)
17217 error ("unsupported combination: %s",
17218 "-march=r5900 -mhard-float -mdouble-float");
17220 /* If a -mlong* option was given, check that it matches the ABI,
17221 otherwise infer the -mlong* setting from the other options. */
17222 if ((target_flags_explicit & MASK_LONG64) != 0)
17224 if (TARGET_LONG64)
17226 if (mips_abi == ABI_N32)
17227 error ("%qs is incompatible with %qs", "-mabi=n32", "-mlong64");
17228 else if (mips_abi == ABI_32)
17229 error ("%qs is incompatible with %qs", "-mabi=32", "-mlong64");
17230 else if (mips_abi == ABI_O64 && TARGET_ABICALLS)
17231 /* We have traditionally allowed non-abicalls code to use
17232 an LP64 form of o64. However, it would take a bit more
17233 effort to support the combination of 32-bit GOT entries
17234 and 64-bit pointers, so we treat the abicalls case as
17235 an error. */
17236 error ("the combination of %qs and %qs is incompatible with %qs",
17237 "-mabi=o64", "-mabicalls", "-mlong64");
17239 else
17241 if (mips_abi == ABI_64)
17242 error ("%qs is incompatible with %qs", "-mabi=64", "-mlong32");
17245 else
17247 if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
17248 target_flags |= MASK_LONG64;
17249 else
17250 target_flags &= ~MASK_LONG64;
17253 if (!TARGET_OLDABI)
17254 flag_pcc_struct_return = 0;
17256 /* Decide which rtx_costs structure to use. */
17257 if (optimize_size)
17258 mips_cost = &mips_rtx_cost_optimize_size;
17259 else
17260 mips_cost = &mips_rtx_cost_data[mips_tune];
17262 /* If the user hasn't specified a branch cost, use the processor's
17263 default. */
17264 if (mips_branch_cost == 0)
17265 mips_branch_cost = mips_cost->branch_cost;
17267 /* If neither -mbranch-likely nor -mno-branch-likely was given
17268 on the command line, set MASK_BRANCHLIKELY based on the target
17269 architecture and tuning flags. Annulled delay slots are a
17270 size win, so we only consider the processor-specific tuning
17271 for !optimize_size. */
17272 if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
17274 if (ISA_HAS_BRANCHLIKELY
17275 && (optimize_size
17276 || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
17277 target_flags |= MASK_BRANCHLIKELY;
17278 else
17279 target_flags &= ~MASK_BRANCHLIKELY;
17281 else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
17282 warning (0, "the %qs architecture does not support branch-likely"
17283 " instructions", mips_arch_info->name);
17285 /* If the user hasn't specified -mimadd or -mno-imadd set
17286 MASK_IMADD based on the target architecture and tuning
17287 flags. */
17288 if ((target_flags_explicit & MASK_IMADD) == 0)
17290 if (ISA_HAS_MADD_MSUB &&
17291 (mips_tune_info->tune_flags & PTF_AVOID_IMADD) == 0)
17292 target_flags |= MASK_IMADD;
17293 else
17294 target_flags &= ~MASK_IMADD;
17296 else if (TARGET_IMADD && !ISA_HAS_MADD_MSUB)
17297 warning (0, "the %qs architecture does not support madd or msub"
17298 " instructions", mips_arch_info->name);
17300 /* If neither -modd-spreg nor -mno-odd-spreg was given on the command
17301 line, set MASK_ODD_SPREG based on the ISA and ABI. */
17302 if ((target_flags_explicit & MASK_ODD_SPREG) == 0)
17304 /* Disable TARGET_ODD_SPREG when using the o32 FPXX ABI. */
17305 if (!ISA_HAS_ODD_SPREG || TARGET_FLOATXX)
17306 target_flags &= ~MASK_ODD_SPREG;
17307 else
17308 target_flags |= MASK_ODD_SPREG;
17310 else if (TARGET_ODD_SPREG && !ISA_HAS_ODD_SPREG)
17311 warning (0, "the %qs architecture does not support odd single-precision"
17312 " registers", mips_arch_info->name);
17314 if (!TARGET_ODD_SPREG && TARGET_64BIT)
17316 error ("unsupported combination: %s", "-mgp64 -mno-odd-spreg");
17317 /* Allow compilation to continue further even though invalid output
17318 will be produced. */
17319 target_flags |= MASK_ODD_SPREG;
17322 /* The effect of -mabicalls isn't defined for the EABI. */
17323 if (mips_abi == ABI_EABI && TARGET_ABICALLS)
17325 error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
17326 target_flags &= ~MASK_ABICALLS;
17329 /* PIC requires -mabicalls. */
17330 if (flag_pic)
17332 if (mips_abi == ABI_EABI)
17333 error ("cannot generate position-independent code for %qs",
17334 "-mabi=eabi");
17335 else if (!TARGET_ABICALLS)
17336 error ("position-independent code requires %qs", "-mabicalls");
17339 if (TARGET_ABICALLS_PIC2)
17340 /* We need to set flag_pic for executables as well as DSOs
17341 because we may reference symbols that are not defined in
17342 the final executable. (MIPS does not use things like
17343 copy relocs, for example.)
17345 There is a body of code that uses __PIC__ to distinguish
17346 between -mabicalls and -mno-abicalls code. The non-__PIC__
17347 variant is usually appropriate for TARGET_ABICALLS_PIC0, as
17348 long as any indirect jumps use $25. */
17349 flag_pic = 1;
17351 /* -mvr4130-align is a "speed over size" optimization: it usually produces
17352 faster code, but at the expense of more nops. Enable it at -O3 and
17353 above. */
17354 if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
17355 target_flags |= MASK_VR4130_ALIGN;
17357 /* Prefer a call to memcpy over inline code when optimizing for size,
17358 though see MOVE_RATIO in mips.h. */
17359 if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
17360 target_flags |= MASK_MEMCPY;
17362 /* If we have a nonzero small-data limit, check that the -mgpopt
17363 setting is consistent with the other target flags. */
17364 if (mips_small_data_threshold > 0)
17366 if (!TARGET_GPOPT)
17368 if (!TARGET_EXPLICIT_RELOCS)
17369 error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
17371 TARGET_LOCAL_SDATA = false;
17372 TARGET_EXTERN_SDATA = false;
17374 else
17376 if (TARGET_VXWORKS_RTP)
17377 warning (0, "cannot use small-data accesses for %qs", "-mrtp");
17379 if (TARGET_ABICALLS)
17380 warning (0, "cannot use small-data accesses for %qs",
17381 "-mabicalls");
17385 /* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
17386 for all its floating point. */
17387 if (mips_nan != MIPS_IEEE_754_2008)
17389 REAL_MODE_FORMAT (SFmode) = &mips_single_format;
17390 REAL_MODE_FORMAT (DFmode) = &mips_double_format;
17391 REAL_MODE_FORMAT (TFmode) = &mips_quad_format;
17394 /* Make sure that the user didn't turn off paired single support when
17395 MIPS-3D support is requested. */
17396 if (TARGET_MIPS3D
17397 && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
17398 && !TARGET_PAIRED_SINGLE_FLOAT)
17399 error ("%<-mips3d%> requires %<-mpaired-single%>");
17401 /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT. */
17402 if (TARGET_MIPS3D)
17403 target_flags |= MASK_PAIRED_SINGLE_FLOAT;
17405 /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
17406 and TARGET_HARD_FLOAT_ABI are both true. */
17407 if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
17409 error ("%qs must be used with %qs",
17410 TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
17411 TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
17412 target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17413 TARGET_MIPS3D = 0;
17416 /* Make sure that -mpaired-single is only used on ISAs that support it.
17417 We must disable it otherwise since it relies on other ISA properties
17418 like ISA_HAS_8CC having their normal values. */
17419 if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
17421 error ("the %qs architecture does not support paired-single"
17422 " instructions", mips_arch_info->name);
17423 target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17424 TARGET_MIPS3D = 0;
17427 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
17428 && !TARGET_CACHE_BUILTIN)
17430 error ("%qs requires a target that provides the %qs instruction",
17431 "-mr10k-cache-barrier", "cache");
17432 mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
17435 /* If TARGET_DSPR2, enable TARGET_DSP. */
17436 if (TARGET_DSPR2)
17437 TARGET_DSP = true;
17439 /* .eh_frame addresses should be the same width as a C pointer.
17440 Most MIPS ABIs support only one pointer size, so the assembler
17441 will usually know exactly how big an .eh_frame address is.
17443 Unfortunately, this is not true of the 64-bit EABI. The ABI was
17444 originally defined to use 64-bit pointers (i.e. it is LP64), and
17445 this is still the default mode. However, we also support an n32-like
17446 ILP32 mode, which is selected by -mlong32. The problem is that the
17447 assembler has traditionally not had an -mlong option, so it has
17448 traditionally not known whether we're using the ILP32 or LP64 form.
17450 As it happens, gas versions up to and including 2.19 use _32-bit_
17451 addresses for EABI64 .cfi_* directives. This is wrong for the
17452 default LP64 mode, so we can't use the directives by default.
17453 Moreover, since gas's current behavior is at odds with gcc's
17454 default behavior, it seems unwise to rely on future versions
17455 of gas behaving the same way. We therefore avoid using .cfi
17456 directives for -mlong32 as well. */
17457 if (mips_abi == ABI_EABI && TARGET_64BIT)
17458 flag_dwarf2_cfi_asm = 0;
17460 /* .cfi_* directives generate a read-only section, so fall back on
17461 manual .eh_frame creation if we need the section to be writable. */
17462 if (TARGET_WRITABLE_EH_FRAME)
17463 flag_dwarf2_cfi_asm = 0;
17465 mips_init_print_operand_punct ();
17467 /* Set up array to map GCC register number to debug register number.
17468 Ignore the special purpose register numbers. */
17470 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17472 mips_dbx_regno[i] = IGNORED_DWARF_REGNUM;
17473 if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
17474 mips_dwarf_regno[i] = i;
17475 else
17476 mips_dwarf_regno[i] = INVALID_REGNUM;
17479 start = GP_DBX_FIRST - GP_REG_FIRST;
17480 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
17481 mips_dbx_regno[i] = i + start;
17483 start = FP_DBX_FIRST - FP_REG_FIRST;
17484 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
17485 mips_dbx_regno[i] = i + start;
17487 /* Accumulator debug registers use big-endian ordering. */
17488 mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
17489 mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
17490 mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
17491 mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
17492 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
17494 mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
17495 mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
17498 /* Set up mips_hard_regno_mode_ok. */
17499 for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
17500 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
17501 mips_hard_regno_mode_ok[mode][regno]
17502 = mips_hard_regno_mode_ok_p (regno, (machine_mode) mode);
17504 /* Function to allocate machine-dependent function status. */
17505 init_machine_status = &mips_init_machine_status;
17507 /* Default to working around R4000 errata only if the processor
17508 was selected explicitly. */
17509 if ((target_flags_explicit & MASK_FIX_R4000) == 0
17510 && strcmp (mips_arch_info->name, "r4000") == 0)
17511 target_flags |= MASK_FIX_R4000;
17513 /* Default to working around R4400 errata only if the processor
17514 was selected explicitly. */
17515 if ((target_flags_explicit & MASK_FIX_R4400) == 0
17516 && strcmp (mips_arch_info->name, "r4400") == 0)
17517 target_flags |= MASK_FIX_R4400;
17519 /* Default to working around R10000 errata only if the processor
17520 was selected explicitly. */
17521 if ((target_flags_explicit & MASK_FIX_R10000) == 0
17522 && strcmp (mips_arch_info->name, "r10000") == 0)
17523 target_flags |= MASK_FIX_R10000;
17525 /* Make sure that branch-likely instructions available when using
17526 -mfix-r10000. The instructions are not available if either:
17528 1. -mno-branch-likely was passed.
17529 2. The selected ISA does not support branch-likely and
17530 the command line does not include -mbranch-likely. */
17531 if (TARGET_FIX_R10000
17532 && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
17533 ? !ISA_HAS_BRANCHLIKELY
17534 : !TARGET_BRANCHLIKELY))
17535 sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
17537 if (TARGET_SYNCI && !ISA_HAS_SYNCI)
17539 warning (0, "the %qs architecture does not support the synci "
17540 "instruction", mips_arch_info->name);
17541 target_flags &= ~MASK_SYNCI;
17544 /* Only optimize PIC indirect calls if they are actually required. */
17545 if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
17546 target_flags &= ~MASK_RELAX_PIC_CALLS;
17548 /* Save base state of options. */
17549 mips_base_target_flags = target_flags;
17550 mips_base_schedule_insns = flag_schedule_insns;
17551 mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
17552 mips_base_move_loop_invariants = flag_move_loop_invariants;
17553 mips_base_align_loops = align_loops;
17554 mips_base_align_jumps = align_jumps;
17555 mips_base_align_functions = align_functions;
17557 /* Now select the ISA mode.
17559 Do all CPP-sensitive stuff in uncompressed mode; we'll switch modes
17560 later if required. */
17561 mips_set_compression_mode (0);
17563 /* We register a second machine specific reorg pass after delay slot
17564 filling. Registering the pass must be done at start up. It's
17565 convenient to do it here. */
17566 opt_pass *new_pass = make_pass_mips_machine_reorg2 (g);
17567 struct register_pass_info insert_pass_mips_machine_reorg2 =
17569 new_pass, /* pass */
17570 "dbr", /* reference_pass_name */
17571 1, /* ref_pass_instance_number */
17572 PASS_POS_INSERT_AFTER /* po_op */
17574 register_pass (&insert_pass_mips_machine_reorg2);
17576 if (TARGET_HARD_FLOAT_ABI && TARGET_MIPS5900)
17577 REAL_MODE_FORMAT (SFmode) = &spu_single_format;
17580 /* Swap the register information for registers I and I + 1, which
17581 currently have the wrong endianness. Note that the registers'
17582 fixedness and call-clobberedness might have been set on the
17583 command line. */
17585 static void
17586 mips_swap_registers (unsigned int i)
17588 int tmpi;
17589 const char *tmps;
17591 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
17592 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
17594 SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
17595 SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
17596 SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
17597 SWAP_STRING (reg_names[i], reg_names[i + 1]);
17599 #undef SWAP_STRING
17600 #undef SWAP_INT
17603 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
17605 static void
17606 mips_conditional_register_usage (void)
17609 if (ISA_HAS_DSP)
17611 /* These DSP control register fields are global. */
17612 global_regs[CCDSP_PO_REGNUM] = 1;
17613 global_regs[CCDSP_SC_REGNUM] = 1;
17615 else
17616 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17617 reg_class_contents[(int) DSP_ACC_REGS]);
17619 if (!TARGET_HARD_FLOAT)
17621 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17622 reg_class_contents[(int) FP_REGS]);
17623 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17624 reg_class_contents[(int) ST_REGS]);
17626 else if (!ISA_HAS_8CC)
17628 /* We only have a single condition-code register. We implement
17629 this by fixing all the condition-code registers and generating
17630 RTL that refers directly to ST_REG_FIRST. */
17631 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17632 reg_class_contents[(int) ST_REGS]);
17633 SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
17634 fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
17636 if (TARGET_MIPS16)
17638 /* In MIPS16 mode, we prohibit the unused $s registers, since they
17639 are call-saved, and saving them via a MIPS16 register would
17640 probably waste more time than just reloading the value.
17642 We permit the $t temporary registers when optimizing for speed
17643 but not when optimizing for space because using them results in
17644 code that is larger (but faster) then not using them. We do
17645 allow $24 (t8) because it is used in CMP and CMPI instructions
17646 and $25 (t9) because it is used as the function call address in
17647 SVR4 PIC code. */
17649 fixed_regs[18] = call_used_regs[18] = 1;
17650 fixed_regs[19] = call_used_regs[19] = 1;
17651 fixed_regs[20] = call_used_regs[20] = 1;
17652 fixed_regs[21] = call_used_regs[21] = 1;
17653 fixed_regs[22] = call_used_regs[22] = 1;
17654 fixed_regs[23] = call_used_regs[23] = 1;
17655 fixed_regs[26] = call_used_regs[26] = 1;
17656 fixed_regs[27] = call_used_regs[27] = 1;
17657 fixed_regs[30] = call_used_regs[30] = 1;
17658 if (optimize_size)
17660 fixed_regs[8] = call_used_regs[8] = 1;
17661 fixed_regs[9] = call_used_regs[9] = 1;
17662 fixed_regs[10] = call_used_regs[10] = 1;
17663 fixed_regs[11] = call_used_regs[11] = 1;
17664 fixed_regs[12] = call_used_regs[12] = 1;
17665 fixed_regs[13] = call_used_regs[13] = 1;
17666 fixed_regs[14] = call_used_regs[14] = 1;
17667 fixed_regs[15] = call_used_regs[15] = 1;
17670 /* Do not allow HI and LO to be treated as register operands.
17671 There are no MTHI or MTLO instructions (or any real need
17672 for them) and one-way registers cannot easily be reloaded. */
17673 AND_COMPL_HARD_REG_SET (operand_reg_set,
17674 reg_class_contents[(int) MD_REGS]);
17676 /* $f20-$f23 are call-clobbered for n64. */
17677 if (mips_abi == ABI_64)
17679 int regno;
17680 for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
17681 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17683 /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
17684 for n32 and o32 FP64. */
17685 if (mips_abi == ABI_N32
17686 || (mips_abi == ABI_32
17687 && TARGET_FLOAT64))
17689 int regno;
17690 for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
17691 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17693 /* Make sure that double-register accumulator values are correctly
17694 ordered for the current endianness. */
17695 if (TARGET_LITTLE_ENDIAN)
17697 unsigned int regno;
17699 mips_swap_registers (MD_REG_FIRST);
17700 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
17701 mips_swap_registers (regno);
17705 /* Implement EH_USES. */
17707 bool
17708 mips_eh_uses (unsigned int regno)
17710 if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
17712 /* We need to force certain registers to be live in order to handle
17713 PIC long branches correctly. See mips_must_initialize_gp_p for
17714 details. */
17715 if (mips_cfun_has_cprestore_slot_p ())
17717 if (regno == CPRESTORE_SLOT_REGNUM)
17718 return true;
17720 else
17722 if (cfun->machine->global_pointer == regno)
17723 return true;
17727 return false;
17730 /* Implement EPILOGUE_USES. */
17732 bool
17733 mips_epilogue_uses (unsigned int regno)
17735 /* Say that the epilogue uses the return address register. Note that
17736 in the case of sibcalls, the values "used by the epilogue" are
17737 considered live at the start of the called function. */
17738 if (regno == RETURN_ADDR_REGNUM)
17739 return true;
17741 /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
17742 See the comment above load_call<mode> for details. */
17743 if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
17744 return true;
17746 /* An interrupt handler must preserve some registers that are
17747 ordinarily call-clobbered. */
17748 if (cfun->machine->interrupt_handler_p
17749 && mips_interrupt_extra_call_saved_reg_p (regno))
17750 return true;
17752 return false;
17755 /* Return true if INSN needs to be wrapped in ".set noat".
17756 INSN has NOPERANDS operands, stored in OPVEC. */
17758 static bool
17759 mips_need_noat_wrapper_p (rtx_insn *insn, rtx *opvec, int noperands)
17761 if (recog_memoized (insn) >= 0)
17763 subrtx_iterator::array_type array;
17764 for (int i = 0; i < noperands; i++)
17765 FOR_EACH_SUBRTX (iter, array, opvec[i], NONCONST)
17766 if (REG_P (*iter) && REGNO (*iter) == AT_REGNUM)
17767 return true;
17769 return false;
17772 /* Implement FINAL_PRESCAN_INSN. */
17774 void
17775 mips_final_prescan_insn (rtx_insn *insn, rtx *opvec, int noperands)
17777 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17778 mips_push_asm_switch (&mips_noat);
17781 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN. */
17783 static void
17784 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx_insn *insn,
17785 rtx *opvec, int noperands)
17787 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17788 mips_pop_asm_switch (&mips_noat);
17791 /* Return the function that is used to expand the <u>mulsidi3 pattern.
17792 EXT_CODE is the code of the extension used. Return NULL if widening
17793 multiplication shouldn't be used. */
17795 mulsidi3_gen_fn
17796 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
17798 bool signed_p;
17800 signed_p = ext_code == SIGN_EXTEND;
17801 if (TARGET_64BIT)
17803 /* Don't use widening multiplication with MULT when we have DMUL. Even
17804 with the extension of its input operands DMUL is faster. Note that
17805 the extension is not needed for signed multiplication. In order to
17806 ensure that we always remove the redundant sign-extension in this
17807 case we still expand mulsidi3 for DMUL. */
17808 if (ISA_HAS_DMUL3)
17809 return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
17810 if (TARGET_MIPS16)
17811 return (signed_p
17812 ? gen_mulsidi3_64bit_mips16
17813 : gen_umulsidi3_64bit_mips16);
17814 if (TARGET_FIX_R4000)
17815 return NULL;
17816 return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
17818 else
17820 if (TARGET_MIPS16)
17821 return (signed_p
17822 ? gen_mulsidi3_32bit_mips16
17823 : gen_umulsidi3_32bit_mips16);
17824 if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
17825 return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
17826 return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
17830 /* Return true if PATTERN matches the kind of instruction generated by
17831 umips_build_save_restore. SAVE_P is true for store. */
17833 bool
17834 umips_save_restore_pattern_p (bool save_p, rtx pattern)
17836 int n;
17837 unsigned int i;
17838 HOST_WIDE_INT first_offset = 0;
17839 rtx first_base = 0;
17840 unsigned int regmask = 0;
17842 for (n = 0; n < XVECLEN (pattern, 0); n++)
17844 rtx set, reg, mem, this_base;
17845 HOST_WIDE_INT this_offset;
17847 /* Check that we have a SET. */
17848 set = XVECEXP (pattern, 0, n);
17849 if (GET_CODE (set) != SET)
17850 return false;
17852 /* Check that the SET is a load (if restoring) or a store
17853 (if saving). */
17854 mem = save_p ? SET_DEST (set) : SET_SRC (set);
17855 if (!MEM_P (mem) || MEM_VOLATILE_P (mem))
17856 return false;
17858 /* Check that the address is the sum of base and a possibly-zero
17859 constant offset. Determine if the offset is in range. */
17860 mips_split_plus (XEXP (mem, 0), &this_base, &this_offset);
17861 if (!REG_P (this_base))
17862 return false;
17864 if (n == 0)
17866 if (!UMIPS_12BIT_OFFSET_P (this_offset))
17867 return false;
17868 first_base = this_base;
17869 first_offset = this_offset;
17871 else
17873 /* Check that the save slots are consecutive. */
17874 if (REGNO (this_base) != REGNO (first_base)
17875 || this_offset != first_offset + UNITS_PER_WORD * n)
17876 return false;
17879 /* Check that SET's other operand is a register. */
17880 reg = save_p ? SET_SRC (set) : SET_DEST (set);
17881 if (!REG_P (reg))
17882 return false;
17884 regmask |= 1 << REGNO (reg);
17887 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
17888 if (regmask == umips_swm_mask[i])
17889 return true;
17891 return false;
17894 /* Return the assembly instruction for microMIPS LWM or SWM.
17895 SAVE_P and PATTERN are as for umips_save_restore_pattern_p. */
17897 const char *
17898 umips_output_save_restore (bool save_p, rtx pattern)
17900 static char buffer[300];
17901 char *s;
17902 int n;
17903 HOST_WIDE_INT offset;
17904 rtx base, mem, set, last_set, last_reg;
17906 /* Parse the pattern. */
17907 gcc_assert (umips_save_restore_pattern_p (save_p, pattern));
17909 s = strcpy (buffer, save_p ? "swm\t" : "lwm\t");
17910 s += strlen (s);
17911 n = XVECLEN (pattern, 0);
17913 set = XVECEXP (pattern, 0, 0);
17914 mem = save_p ? SET_DEST (set) : SET_SRC (set);
17915 mips_split_plus (XEXP (mem, 0), &base, &offset);
17917 last_set = XVECEXP (pattern, 0, n - 1);
17918 last_reg = save_p ? SET_SRC (last_set) : SET_DEST (last_set);
17920 if (REGNO (last_reg) == 31)
17921 n--;
17923 gcc_assert (n <= 9);
17924 if (n == 0)
17926 else if (n == 1)
17927 s += sprintf (s, "%s,", reg_names[16]);
17928 else if (n < 9)
17929 s += sprintf (s, "%s-%s,", reg_names[16], reg_names[15 + n]);
17930 else if (n == 9)
17931 s += sprintf (s, "%s-%s,%s,", reg_names[16], reg_names[23],
17932 reg_names[30]);
17934 if (REGNO (last_reg) == 31)
17935 s += sprintf (s, "%s,", reg_names[31]);
17937 s += sprintf (s, "%d(%s)", (int)offset, reg_names[REGNO (base)]);
17938 return buffer;
17941 /* Return true if MEM1 and MEM2 use the same base register, and the
17942 offset of MEM2 equals the offset of MEM1 plus 4. FIRST_REG is the
17943 register into (from) which the contents of MEM1 will be loaded
17944 (stored), depending on the value of LOAD_P.
17945 SWAP_P is true when the 1st and 2nd instructions are swapped. */
17947 static bool
17948 umips_load_store_pair_p_1 (bool load_p, bool swap_p,
17949 rtx first_reg, rtx mem1, rtx mem2)
17951 rtx base1, base2;
17952 HOST_WIDE_INT offset1, offset2;
17954 if (!MEM_P (mem1) || !MEM_P (mem2))
17955 return false;
17957 mips_split_plus (XEXP (mem1, 0), &base1, &offset1);
17958 mips_split_plus (XEXP (mem2, 0), &base2, &offset2);
17960 if (!REG_P (base1) || !rtx_equal_p (base1, base2))
17961 return false;
17963 /* Avoid invalid load pair instructions. */
17964 if (load_p && REGNO (first_reg) == REGNO (base1))
17965 return false;
17967 /* We must avoid this case for anti-dependence.
17968 Ex: lw $3, 4($3)
17969 lw $2, 0($3)
17970 first_reg is $2, but the base is $3. */
17971 if (load_p
17972 && swap_p
17973 && REGNO (first_reg) + 1 == REGNO (base1))
17974 return false;
17976 if (offset2 != offset1 + 4)
17977 return false;
17979 if (!UMIPS_12BIT_OFFSET_P (offset1))
17980 return false;
17982 return true;
17985 /* OPERANDS describes the operands to a pair of SETs, in the order
17986 dest1, src1, dest2, src2. Return true if the operands can be used
17987 in an LWP or SWP instruction; LOAD_P says which. */
17989 bool
17990 umips_load_store_pair_p (bool load_p, rtx *operands)
17992 rtx reg1, reg2, mem1, mem2;
17994 if (load_p)
17996 reg1 = operands[0];
17997 reg2 = operands[2];
17998 mem1 = operands[1];
17999 mem2 = operands[3];
18001 else
18003 reg1 = operands[1];
18004 reg2 = operands[3];
18005 mem1 = operands[0];
18006 mem2 = operands[2];
18009 if (REGNO (reg2) == REGNO (reg1) + 1)
18010 return umips_load_store_pair_p_1 (load_p, false, reg1, mem1, mem2);
18012 if (REGNO (reg1) == REGNO (reg2) + 1)
18013 return umips_load_store_pair_p_1 (load_p, true, reg2, mem2, mem1);
18015 return false;
18018 /* Return the assembly instruction for a microMIPS LWP or SWP in which
18019 the first register is REG and the first memory slot is MEM.
18020 LOAD_P is true for LWP. */
18022 static void
18023 umips_output_load_store_pair_1 (bool load_p, rtx reg, rtx mem)
18025 rtx ops[] = {reg, mem};
18027 if (load_p)
18028 output_asm_insn ("lwp\t%0,%1", ops);
18029 else
18030 output_asm_insn ("swp\t%0,%1", ops);
18033 /* Output the assembly instruction for a microMIPS LWP or SWP instruction.
18034 LOAD_P and OPERANDS are as for umips_load_store_pair_p. */
18036 void
18037 umips_output_load_store_pair (bool load_p, rtx *operands)
18039 rtx reg1, reg2, mem1, mem2;
18040 if (load_p)
18042 reg1 = operands[0];
18043 reg2 = operands[2];
18044 mem1 = operands[1];
18045 mem2 = operands[3];
18047 else
18049 reg1 = operands[1];
18050 reg2 = operands[3];
18051 mem1 = operands[0];
18052 mem2 = operands[2];
18055 if (REGNO (reg2) == REGNO (reg1) + 1)
18057 umips_output_load_store_pair_1 (load_p, reg1, mem1);
18058 return;
18061 gcc_assert (REGNO (reg1) == REGNO (reg2) + 1);
18062 umips_output_load_store_pair_1 (load_p, reg2, mem2);
18065 /* Return true if REG1 and REG2 match the criteria for a movep insn. */
18067 bool
18068 umips_movep_target_p (rtx reg1, rtx reg2)
18070 int regno1, regno2, pair;
18071 unsigned int i;
18072 static const int match[8] = {
18073 0x00000060, /* 5, 6 */
18074 0x000000a0, /* 5, 7 */
18075 0x000000c0, /* 6, 7 */
18076 0x00200010, /* 4, 21 */
18077 0x00400010, /* 4, 22 */
18078 0x00000030, /* 4, 5 */
18079 0x00000050, /* 4, 6 */
18080 0x00000090 /* 4, 7 */
18083 if (!REG_P (reg1) || !REG_P (reg2))
18084 return false;
18086 regno1 = REGNO (reg1);
18087 regno2 = REGNO (reg2);
18089 if (!GP_REG_P (regno1) || !GP_REG_P (regno2))
18090 return false;
18092 pair = (1 << regno1) | (1 << regno2);
18094 for (i = 0; i < ARRAY_SIZE (match); i++)
18095 if (pair == match[i])
18096 return true;
18098 return false;
18101 /* Return the size in bytes of the trampoline code, padded to
18102 TRAMPOLINE_ALIGNMENT bits. The static chain pointer and target
18103 function address immediately follow. */
18106 mips_trampoline_code_size (void)
18108 if (TARGET_USE_PIC_FN_ADDR_REG)
18109 return 4 * 4;
18110 else if (ptr_mode == DImode)
18111 return 8 * 4;
18112 else if (ISA_HAS_LOAD_DELAY)
18113 return 6 * 4;
18114 else
18115 return 4 * 4;
18118 /* Implement TARGET_TRAMPOLINE_INIT. */
18120 static void
18121 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
18123 rtx addr, end_addr, high, low, opcode, mem;
18124 rtx trampoline[8];
18125 unsigned int i, j;
18126 HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
18128 /* Work out the offsets of the pointers from the start of the
18129 trampoline code. */
18130 end_addr_offset = mips_trampoline_code_size ();
18131 static_chain_offset = end_addr_offset;
18132 target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
18134 /* Get pointers to the beginning and end of the code block. */
18135 addr = force_reg (Pmode, XEXP (m_tramp, 0));
18136 end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
18138 #define OP(X) gen_int_mode (X, SImode)
18140 /* Build up the code in TRAMPOLINE. */
18141 i = 0;
18142 if (TARGET_USE_PIC_FN_ADDR_REG)
18144 /* $25 contains the address of the trampoline. Emit code of the form:
18146 l[wd] $1, target_function_offset($25)
18147 l[wd] $static_chain, static_chain_offset($25)
18148 jr $1
18149 move $25,$1. */
18150 trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
18151 target_function_offset,
18152 PIC_FUNCTION_ADDR_REGNUM));
18153 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18154 static_chain_offset,
18155 PIC_FUNCTION_ADDR_REGNUM));
18156 trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
18157 trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
18159 else if (ptr_mode == DImode)
18161 /* It's too cumbersome to create the full 64-bit address, so let's
18162 instead use:
18164 move $1, $31
18165 bal 1f
18167 1: l[wd] $25, target_function_offset - 12($31)
18168 l[wd] $static_chain, static_chain_offset - 12($31)
18169 jr $25
18170 move $31, $1
18172 where 12 is the offset of "1:" from the start of the code block. */
18173 trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
18174 trampoline[i++] = OP (MIPS_BAL (1));
18175 trampoline[i++] = OP (MIPS_NOP);
18176 trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18177 target_function_offset - 12,
18178 RETURN_ADDR_REGNUM));
18179 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18180 static_chain_offset - 12,
18181 RETURN_ADDR_REGNUM));
18182 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18183 trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
18185 else
18187 /* If the target has load delays, emit:
18189 lui $1, %hi(end_addr)
18190 lw $25, %lo(end_addr + ...)($1)
18191 lw $static_chain, %lo(end_addr + ...)($1)
18192 jr $25
18195 Otherwise emit:
18197 lui $1, %hi(end_addr)
18198 lw $25, %lo(end_addr + ...)($1)
18199 jr $25
18200 lw $static_chain, %lo(end_addr + ...)($1). */
18202 /* Split END_ADDR into %hi and %lo values. Trampolines are aligned
18203 to 64 bits, so the %lo value will have the bottom 3 bits clear. */
18204 high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
18205 NULL, false, OPTAB_WIDEN);
18206 high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
18207 NULL, false, OPTAB_WIDEN);
18208 low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
18210 /* Emit the LUI. */
18211 opcode = OP (MIPS_LUI (AT_REGNUM, 0));
18212 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
18213 NULL, false, OPTAB_WIDEN);
18215 /* Emit the load of the target function. */
18216 opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18217 target_function_offset - end_addr_offset,
18218 AT_REGNUM));
18219 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18220 NULL, false, OPTAB_WIDEN);
18222 /* Emit the JR here, if we can. */
18223 if (!ISA_HAS_LOAD_DELAY)
18224 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18226 /* Emit the load of the static chain register. */
18227 opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18228 static_chain_offset - end_addr_offset,
18229 AT_REGNUM));
18230 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18231 NULL, false, OPTAB_WIDEN);
18233 /* Emit the JR, if we couldn't above. */
18234 if (ISA_HAS_LOAD_DELAY)
18236 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18237 trampoline[i++] = OP (MIPS_NOP);
18241 #undef OP
18243 /* Copy the trampoline code. Leave any padding uninitialized. */
18244 for (j = 0; j < i; j++)
18246 mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
18247 mips_emit_move (mem, trampoline[j]);
18250 /* Set up the static chain pointer field. */
18251 mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
18252 mips_emit_move (mem, chain_value);
18254 /* Set up the target function field. */
18255 mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
18256 mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
18258 /* Flush the code part of the trampoline. */
18259 emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
18260 emit_insn (gen_clear_cache (addr, end_addr));
18263 /* Implement FUNCTION_PROFILER. */
18265 void mips_function_profiler (FILE *file)
18267 if (TARGET_MIPS16)
18268 sorry ("mips16 function profiling");
18269 if (TARGET_LONG_CALLS)
18271 /* For TARGET_LONG_CALLS use $3 for the address of _mcount. */
18272 if (Pmode == DImode)
18273 fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
18274 else
18275 fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
18277 mips_push_asm_switch (&mips_noat);
18278 fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
18279 reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
18280 /* _mcount treats $2 as the static chain register. */
18281 if (cfun->static_chain_decl != NULL)
18282 fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
18283 reg_names[STATIC_CHAIN_REGNUM]);
18284 if (TARGET_MCOUNT_RA_ADDRESS)
18286 /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
18287 ra save location. */
18288 if (cfun->machine->frame.ra_fp_offset == 0)
18289 /* ra not saved, pass zero. */
18290 fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
18291 else
18292 fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
18293 Pmode == DImode ? "dla" : "la", reg_names[12],
18294 cfun->machine->frame.ra_fp_offset,
18295 reg_names[STACK_POINTER_REGNUM]);
18297 if (!TARGET_NEWABI)
18298 fprintf (file,
18299 "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from stack\n",
18300 TARGET_64BIT ? "dsubu" : "subu",
18301 reg_names[STACK_POINTER_REGNUM],
18302 reg_names[STACK_POINTER_REGNUM],
18303 Pmode == DImode ? 16 : 8);
18305 if (TARGET_LONG_CALLS)
18306 fprintf (file, "\tjalr\t%s\n", reg_names[3]);
18307 else
18308 fprintf (file, "\tjal\t_mcount\n");
18309 mips_pop_asm_switch (&mips_noat);
18310 /* _mcount treats $2 as the static chain register. */
18311 if (cfun->static_chain_decl != NULL)
18312 fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
18313 reg_names[2]);
18316 /* Implement TARGET_SHIFT_TRUNCATION_MASK. We want to keep the default
18317 behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
18318 when TARGET_LOONGSON_VECTORS is true. */
18320 static unsigned HOST_WIDE_INT
18321 mips_shift_truncation_mask (machine_mode mode)
18323 if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
18324 return 0;
18326 return GET_MODE_BITSIZE (mode) - 1;
18329 /* Implement TARGET_PREPARE_PCH_SAVE. */
18331 static void
18332 mips_prepare_pch_save (void)
18334 /* We are called in a context where the current MIPS16 vs. non-MIPS16
18335 setting should be irrelevant. The question then is: which setting
18336 makes most sense at load time?
18338 The PCH is loaded before the first token is read. We should never
18339 have switched into MIPS16 mode by that point, and thus should not
18340 have populated mips16_globals. Nor can we load the entire contents
18341 of mips16_globals from the PCH file, because mips16_globals contains
18342 a combination of GGC and non-GGC data.
18344 There is therefore no point in trying save the GGC part of
18345 mips16_globals to the PCH file, or to preserve MIPS16ness across
18346 the PCH save and load. The loading compiler would not have access
18347 to the non-GGC parts of mips16_globals (either from the PCH file,
18348 or from a copy that the loading compiler generated itself) and would
18349 have to call target_reinit anyway.
18351 It therefore seems best to switch back to non-MIPS16 mode at
18352 save time, and to ensure that mips16_globals remains null after
18353 a PCH load. */
18354 mips_set_compression_mode (0);
18355 mips16_globals = 0;
18358 /* Generate or test for an insn that supports a constant permutation. */
18360 #define MAX_VECT_LEN 8
18362 struct expand_vec_perm_d
18364 rtx target, op0, op1;
18365 unsigned char perm[MAX_VECT_LEN];
18366 machine_mode vmode;
18367 unsigned char nelt;
18368 bool one_vector_p;
18369 bool testing_p;
18372 /* Construct (set target (vec_select op0 (parallel perm))) and
18373 return true if that's a valid instruction in the active ISA. */
18375 static bool
18376 mips_expand_vselect (rtx target, rtx op0,
18377 const unsigned char *perm, unsigned nelt)
18379 rtx rperm[MAX_VECT_LEN], x;
18380 rtx_insn *insn;
18381 unsigned i;
18383 for (i = 0; i < nelt; ++i)
18384 rperm[i] = GEN_INT (perm[i]);
18386 x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
18387 x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
18388 x = gen_rtx_SET (VOIDmode, target, x);
18390 insn = emit_insn (x);
18391 if (recog_memoized (insn) < 0)
18393 remove_insn (insn);
18394 return false;
18396 return true;
18399 /* Similar, but generate a vec_concat from op0 and op1 as well. */
18401 static bool
18402 mips_expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
18403 const unsigned char *perm, unsigned nelt)
18405 machine_mode v2mode;
18406 rtx x;
18408 v2mode = GET_MODE_2XWIDER_MODE (GET_MODE (op0));
18409 x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
18410 return mips_expand_vselect (target, x, perm, nelt);
18413 /* Recognize patterns for even-odd extraction. */
18415 static bool
18416 mips_expand_vpc_loongson_even_odd (struct expand_vec_perm_d *d)
18418 unsigned i, odd, nelt = d->nelt;
18419 rtx t0, t1, t2, t3;
18421 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18422 return false;
18423 /* Even-odd for V2SI/V2SFmode is matched by interleave directly. */
18424 if (nelt < 4)
18425 return false;
18427 odd = d->perm[0];
18428 if (odd > 1)
18429 return false;
18430 for (i = 1; i < nelt; ++i)
18431 if (d->perm[i] != i * 2 + odd)
18432 return false;
18434 if (d->testing_p)
18435 return true;
18437 /* We need 2*log2(N)-1 operations to achieve odd/even with interleave. */
18438 t0 = gen_reg_rtx (d->vmode);
18439 t1 = gen_reg_rtx (d->vmode);
18440 switch (d->vmode)
18442 case V4HImode:
18443 emit_insn (gen_loongson_punpckhhw (t0, d->op0, d->op1));
18444 emit_insn (gen_loongson_punpcklhw (t1, d->op0, d->op1));
18445 if (odd)
18446 emit_insn (gen_loongson_punpckhhw (d->target, t1, t0));
18447 else
18448 emit_insn (gen_loongson_punpcklhw (d->target, t1, t0));
18449 break;
18451 case V8QImode:
18452 t2 = gen_reg_rtx (d->vmode);
18453 t3 = gen_reg_rtx (d->vmode);
18454 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op1));
18455 emit_insn (gen_loongson_punpcklbh (t1, d->op0, d->op1));
18456 emit_insn (gen_loongson_punpckhbh (t2, t1, t0));
18457 emit_insn (gen_loongson_punpcklbh (t3, t1, t0));
18458 if (odd)
18459 emit_insn (gen_loongson_punpckhbh (d->target, t3, t2));
18460 else
18461 emit_insn (gen_loongson_punpcklbh (d->target, t3, t2));
18462 break;
18464 default:
18465 gcc_unreachable ();
18467 return true;
18470 /* Recognize patterns for the Loongson PSHUFH instruction. */
18472 static bool
18473 mips_expand_vpc_loongson_pshufh (struct expand_vec_perm_d *d)
18475 unsigned i, mask;
18476 rtx rmask;
18478 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18479 return false;
18480 if (d->vmode != V4HImode)
18481 return false;
18482 if (d->testing_p)
18483 return true;
18485 /* Convert the selector into the packed 8-bit form for pshufh. */
18486 /* Recall that loongson is little-endian only. No big-endian
18487 adjustment required. */
18488 for (i = mask = 0; i < 4; i++)
18489 mask |= (d->perm[i] & 3) << (i * 2);
18490 rmask = force_reg (SImode, GEN_INT (mask));
18492 if (d->one_vector_p)
18493 emit_insn (gen_loongson_pshufh (d->target, d->op0, rmask));
18494 else
18496 rtx t0, t1, x, merge, rmerge[4];
18498 t0 = gen_reg_rtx (V4HImode);
18499 t1 = gen_reg_rtx (V4HImode);
18500 emit_insn (gen_loongson_pshufh (t1, d->op1, rmask));
18501 emit_insn (gen_loongson_pshufh (t0, d->op0, rmask));
18503 for (i = 0; i < 4; ++i)
18504 rmerge[i] = (d->perm[i] & 4 ? constm1_rtx : const0_rtx);
18505 merge = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmerge));
18506 merge = force_reg (V4HImode, merge);
18508 x = gen_rtx_AND (V4HImode, merge, t1);
18509 emit_insn (gen_rtx_SET (VOIDmode, t1, x));
18511 x = gen_rtx_NOT (V4HImode, merge);
18512 x = gen_rtx_AND (V4HImode, x, t0);
18513 emit_insn (gen_rtx_SET (VOIDmode, t0, x));
18515 x = gen_rtx_IOR (V4HImode, t0, t1);
18516 emit_insn (gen_rtx_SET (VOIDmode, d->target, x));
18519 return true;
18522 /* Recognize broadcast patterns for the Loongson. */
18524 static bool
18525 mips_expand_vpc_loongson_bcast (struct expand_vec_perm_d *d)
18527 unsigned i, elt;
18528 rtx t0, t1;
18530 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18531 return false;
18532 /* Note that we've already matched V2SI via punpck and V4HI via pshufh. */
18533 if (d->vmode != V8QImode)
18534 return false;
18535 if (!d->one_vector_p)
18536 return false;
18538 elt = d->perm[0];
18539 for (i = 1; i < 8; ++i)
18540 if (d->perm[i] != elt)
18541 return false;
18543 if (d->testing_p)
18544 return true;
18546 /* With one interleave we put two of the desired element adjacent. */
18547 t0 = gen_reg_rtx (V8QImode);
18548 if (elt < 4)
18549 emit_insn (gen_loongson_punpcklbh (t0, d->op0, d->op0));
18550 else
18551 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op0));
18553 /* Shuffle that one HImode element into all locations. */
18554 elt &= 3;
18555 elt *= 0x55;
18556 t1 = gen_reg_rtx (V4HImode);
18557 emit_insn (gen_loongson_pshufh (t1, gen_lowpart (V4HImode, t0),
18558 force_reg (SImode, GEN_INT (elt))));
18560 emit_move_insn (d->target, gen_lowpart (V8QImode, t1));
18561 return true;
18564 static bool
18565 mips_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
18567 unsigned int i, nelt = d->nelt;
18568 unsigned char perm2[MAX_VECT_LEN];
18570 if (d->one_vector_p)
18572 /* Try interleave with alternating operands. */
18573 memcpy (perm2, d->perm, sizeof(perm2));
18574 for (i = 1; i < nelt; i += 2)
18575 perm2[i] += nelt;
18576 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1, perm2, nelt))
18577 return true;
18579 else
18581 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1,
18582 d->perm, nelt))
18583 return true;
18585 /* Try again with swapped operands. */
18586 for (i = 0; i < nelt; ++i)
18587 perm2[i] = (d->perm[i] + nelt) & (2 * nelt - 1);
18588 if (mips_expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
18589 return true;
18592 if (mips_expand_vpc_loongson_even_odd (d))
18593 return true;
18594 if (mips_expand_vpc_loongson_pshufh (d))
18595 return true;
18596 if (mips_expand_vpc_loongson_bcast (d))
18597 return true;
18598 return false;
18601 /* Expand a vec_perm_const pattern. */
18603 bool
18604 mips_expand_vec_perm_const (rtx operands[4])
18606 struct expand_vec_perm_d d;
18607 int i, nelt, which;
18608 unsigned char orig_perm[MAX_VECT_LEN];
18609 rtx sel;
18610 bool ok;
18612 d.target = operands[0];
18613 d.op0 = operands[1];
18614 d.op1 = operands[2];
18615 sel = operands[3];
18617 d.vmode = GET_MODE (d.target);
18618 gcc_assert (VECTOR_MODE_P (d.vmode));
18619 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18620 d.testing_p = false;
18622 for (i = which = 0; i < nelt; ++i)
18624 rtx e = XVECEXP (sel, 0, i);
18625 int ei = INTVAL (e) & (2 * nelt - 1);
18626 which |= (ei < nelt ? 1 : 2);
18627 orig_perm[i] = ei;
18629 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18631 switch (which)
18633 default:
18634 gcc_unreachable();
18636 case 3:
18637 d.one_vector_p = false;
18638 if (!rtx_equal_p (d.op0, d.op1))
18639 break;
18640 /* FALLTHRU */
18642 case 2:
18643 for (i = 0; i < nelt; ++i)
18644 d.perm[i] &= nelt - 1;
18645 d.op0 = d.op1;
18646 d.one_vector_p = true;
18647 break;
18649 case 1:
18650 d.op1 = d.op0;
18651 d.one_vector_p = true;
18652 break;
18655 ok = mips_expand_vec_perm_const_1 (&d);
18657 /* If we were given a two-vector permutation which just happened to
18658 have both input vectors equal, we folded this into a one-vector
18659 permutation. There are several loongson patterns that are matched
18660 via direct vec_select+vec_concat expansion, but we do not have
18661 support in mips_expand_vec_perm_const_1 to guess the adjustment
18662 that should be made for a single operand. Just try again with
18663 the original permutation. */
18664 if (!ok && which == 3)
18666 d.op0 = operands[1];
18667 d.op1 = operands[2];
18668 d.one_vector_p = false;
18669 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18670 ok = mips_expand_vec_perm_const_1 (&d);
18673 return ok;
18676 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST_OK. */
18678 static bool
18679 mips_vectorize_vec_perm_const_ok (machine_mode vmode,
18680 const unsigned char *sel)
18682 struct expand_vec_perm_d d;
18683 unsigned int i, nelt, which;
18684 bool ret;
18686 d.vmode = vmode;
18687 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18688 d.testing_p = true;
18689 memcpy (d.perm, sel, nelt);
18691 /* Categorize the set of elements in the selector. */
18692 for (i = which = 0; i < nelt; ++i)
18694 unsigned char e = d.perm[i];
18695 gcc_assert (e < 2 * nelt);
18696 which |= (e < nelt ? 1 : 2);
18699 /* For all elements from second vector, fold the elements to first. */
18700 if (which == 2)
18701 for (i = 0; i < nelt; ++i)
18702 d.perm[i] -= nelt;
18704 /* Check whether the mask can be applied to the vector type. */
18705 d.one_vector_p = (which != 3);
18707 d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
18708 d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
18709 if (!d.one_vector_p)
18710 d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
18712 start_sequence ();
18713 ret = mips_expand_vec_perm_const_1 (&d);
18714 end_sequence ();
18716 return ret;
18719 /* Expand an integral vector unpack operation. */
18721 void
18722 mips_expand_vec_unpack (rtx operands[2], bool unsigned_p, bool high_p)
18724 machine_mode imode = GET_MODE (operands[1]);
18725 rtx (*unpack) (rtx, rtx, rtx);
18726 rtx (*cmpgt) (rtx, rtx, rtx);
18727 rtx tmp, dest, zero;
18729 switch (imode)
18731 case V8QImode:
18732 if (high_p)
18733 unpack = gen_loongson_punpckhbh;
18734 else
18735 unpack = gen_loongson_punpcklbh;
18736 cmpgt = gen_loongson_pcmpgtb;
18737 break;
18738 case V4HImode:
18739 if (high_p)
18740 unpack = gen_loongson_punpckhhw;
18741 else
18742 unpack = gen_loongson_punpcklhw;
18743 cmpgt = gen_loongson_pcmpgth;
18744 break;
18745 default:
18746 gcc_unreachable ();
18749 zero = force_reg (imode, CONST0_RTX (imode));
18750 if (unsigned_p)
18751 tmp = zero;
18752 else
18754 tmp = gen_reg_rtx (imode);
18755 emit_insn (cmpgt (tmp, zero, operands[1]));
18758 dest = gen_reg_rtx (imode);
18759 emit_insn (unpack (dest, operands[1], tmp));
18761 emit_move_insn (operands[0], gen_lowpart (GET_MODE (operands[0]), dest));
18764 /* A subroutine of mips_expand_vec_init, match constant vector elements. */
18766 static inline bool
18767 mips_constant_elt_p (rtx x)
18769 return CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE;
18772 /* A subroutine of mips_expand_vec_init, expand via broadcast. */
18774 static void
18775 mips_expand_vi_broadcast (machine_mode vmode, rtx target, rtx elt)
18777 struct expand_vec_perm_d d;
18778 rtx t1;
18779 bool ok;
18781 if (elt != const0_rtx)
18782 elt = force_reg (GET_MODE_INNER (vmode), elt);
18783 if (REG_P (elt))
18784 elt = gen_lowpart (DImode, elt);
18786 t1 = gen_reg_rtx (vmode);
18787 switch (vmode)
18789 case V8QImode:
18790 emit_insn (gen_loongson_vec_init1_v8qi (t1, elt));
18791 break;
18792 case V4HImode:
18793 emit_insn (gen_loongson_vec_init1_v4hi (t1, elt));
18794 break;
18795 default:
18796 gcc_unreachable ();
18799 memset (&d, 0, sizeof (d));
18800 d.target = target;
18801 d.op0 = t1;
18802 d.op1 = t1;
18803 d.vmode = vmode;
18804 d.nelt = GET_MODE_NUNITS (vmode);
18805 d.one_vector_p = true;
18807 ok = mips_expand_vec_perm_const_1 (&d);
18808 gcc_assert (ok);
18811 /* A subroutine of mips_expand_vec_init, replacing all of the non-constant
18812 elements of VALS with zeros, copy the constant vector to TARGET. */
18814 static void
18815 mips_expand_vi_constant (machine_mode vmode, unsigned nelt,
18816 rtx target, rtx vals)
18818 rtvec vec = shallow_copy_rtvec (XVEC (vals, 0));
18819 unsigned i;
18821 for (i = 0; i < nelt; ++i)
18823 if (!mips_constant_elt_p (RTVEC_ELT (vec, i)))
18824 RTVEC_ELT (vec, i) = const0_rtx;
18827 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, vec));
18831 /* A subroutine of mips_expand_vec_init, expand via pinsrh. */
18833 static void
18834 mips_expand_vi_loongson_one_pinsrh (rtx target, rtx vals, unsigned one_var)
18836 mips_expand_vi_constant (V4HImode, 4, target, vals);
18838 emit_insn (gen_vec_setv4hi (target, target, XVECEXP (vals, 0, one_var),
18839 GEN_INT (one_var)));
18842 /* A subroutine of mips_expand_vec_init, expand anything via memory. */
18844 static void
18845 mips_expand_vi_general (machine_mode vmode, machine_mode imode,
18846 unsigned nelt, unsigned nvar, rtx target, rtx vals)
18848 rtx mem = assign_stack_temp (vmode, GET_MODE_SIZE (vmode));
18849 unsigned int i, isize = GET_MODE_SIZE (imode);
18851 if (nvar < nelt)
18852 mips_expand_vi_constant (vmode, nelt, mem, vals);
18854 for (i = 0; i < nelt; ++i)
18856 rtx x = XVECEXP (vals, 0, i);
18857 if (!mips_constant_elt_p (x))
18858 emit_move_insn (adjust_address (mem, imode, i * isize), x);
18861 emit_move_insn (target, mem);
18864 /* Expand a vector initialization. */
18866 void
18867 mips_expand_vector_init (rtx target, rtx vals)
18869 machine_mode vmode = GET_MODE (target);
18870 machine_mode imode = GET_MODE_INNER (vmode);
18871 unsigned i, nelt = GET_MODE_NUNITS (vmode);
18872 unsigned nvar = 0, one_var = -1u;
18873 bool all_same = true;
18874 rtx x;
18876 for (i = 0; i < nelt; ++i)
18878 x = XVECEXP (vals, 0, i);
18879 if (!mips_constant_elt_p (x))
18880 nvar++, one_var = i;
18881 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
18882 all_same = false;
18885 /* Load constants from the pool, or whatever's handy. */
18886 if (nvar == 0)
18888 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)));
18889 return;
18892 /* For two-part initialization, always use CONCAT. */
18893 if (nelt == 2)
18895 rtx op0 = force_reg (imode, XVECEXP (vals, 0, 0));
18896 rtx op1 = force_reg (imode, XVECEXP (vals, 0, 1));
18897 x = gen_rtx_VEC_CONCAT (vmode, op0, op1);
18898 emit_insn (gen_rtx_SET (VOIDmode, target, x));
18899 return;
18902 /* Loongson is the only cpu with vectors with more elements. */
18903 gcc_assert (TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS);
18905 /* If all values are identical, broadcast the value. */
18906 if (all_same)
18908 mips_expand_vi_broadcast (vmode, target, XVECEXP (vals, 0, 0));
18909 return;
18912 /* If we've only got one non-variable V4HImode, use PINSRH. */
18913 if (nvar == 1 && vmode == V4HImode)
18915 mips_expand_vi_loongson_one_pinsrh (target, vals, one_var);
18916 return;
18919 mips_expand_vi_general (vmode, imode, nelt, nvar, target, vals);
18922 /* Expand a vector reduction. */
18924 void
18925 mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
18927 machine_mode vmode = GET_MODE (in);
18928 unsigned char perm2[2];
18929 rtx last, next, fold, x;
18930 bool ok;
18932 last = in;
18933 fold = gen_reg_rtx (vmode);
18934 switch (vmode)
18936 case V2SFmode:
18937 /* Use PUL/PLU to produce { L, H } op { H, L }.
18938 By reversing the pair order, rather than a pure interleave high,
18939 we avoid erroneous exceptional conditions that we might otherwise
18940 produce from the computation of H op H. */
18941 perm2[0] = 1;
18942 perm2[1] = 2;
18943 ok = mips_expand_vselect_vconcat (fold, last, last, perm2, 2);
18944 gcc_assert (ok);
18945 break;
18947 case V2SImode:
18948 /* Use interleave to produce { H, L } op { H, H }. */
18949 emit_insn (gen_loongson_punpckhwd (fold, last, last));
18950 break;
18952 case V4HImode:
18953 /* Perform the first reduction with interleave,
18954 and subsequent reductions with shifts. */
18955 emit_insn (gen_loongson_punpckhwd_hi (fold, last, last));
18957 next = gen_reg_rtx (vmode);
18958 emit_insn (gen (next, last, fold));
18959 last = next;
18961 fold = gen_reg_rtx (vmode);
18962 x = force_reg (SImode, GEN_INT (16));
18963 emit_insn (gen_vec_shr_v4hi (fold, last, x));
18964 break;
18966 case V8QImode:
18967 emit_insn (gen_loongson_punpckhwd_qi (fold, last, last));
18969 next = gen_reg_rtx (vmode);
18970 emit_insn (gen (next, last, fold));
18971 last = next;
18973 fold = gen_reg_rtx (vmode);
18974 x = force_reg (SImode, GEN_INT (16));
18975 emit_insn (gen_vec_shr_v8qi (fold, last, x));
18977 next = gen_reg_rtx (vmode);
18978 emit_insn (gen (next, last, fold));
18979 last = next;
18981 fold = gen_reg_rtx (vmode);
18982 x = force_reg (SImode, GEN_INT (8));
18983 emit_insn (gen_vec_shr_v8qi (fold, last, x));
18984 break;
18986 default:
18987 gcc_unreachable ();
18990 emit_insn (gen (target, last, fold));
18993 /* Expand a vector minimum/maximum. */
18995 void
18996 mips_expand_vec_minmax (rtx target, rtx op0, rtx op1,
18997 rtx (*cmp) (rtx, rtx, rtx), bool min_p)
18999 machine_mode vmode = GET_MODE (target);
19000 rtx tc, t0, t1, x;
19002 tc = gen_reg_rtx (vmode);
19003 t0 = gen_reg_rtx (vmode);
19004 t1 = gen_reg_rtx (vmode);
19006 /* op0 > op1 */
19007 emit_insn (cmp (tc, op0, op1));
19009 x = gen_rtx_AND (vmode, tc, (min_p ? op1 : op0));
19010 emit_insn (gen_rtx_SET (VOIDmode, t0, x));
19012 x = gen_rtx_NOT (vmode, tc);
19013 x = gen_rtx_AND (vmode, x, (min_p ? op0 : op1));
19014 emit_insn (gen_rtx_SET (VOIDmode, t1, x));
19016 x = gen_rtx_IOR (vmode, t0, t1);
19017 emit_insn (gen_rtx_SET (VOIDmode, target, x));
19020 /* Implement HARD_REGNO_CALLER_SAVE_MODE. */
19022 machine_mode
19023 mips_hard_regno_caller_save_mode (unsigned int regno,
19024 unsigned int nregs,
19025 machine_mode mode)
19027 /* For performance, avoid saving/restoring upper parts of a register
19028 by returning MODE as save mode when the mode is known. */
19029 if (mode == VOIDmode)
19030 return choose_hard_reg_mode (regno, nregs, false);
19031 else
19032 return mode;
19035 /* Implement TARGET_CASE_VALUES_THRESHOLD. */
19037 unsigned int
19038 mips_case_values_threshold (void)
19040 /* In MIPS16 mode using a larger case threshold generates smaller code. */
19041 if (TARGET_MIPS16 && optimize_size)
19042 return 10;
19043 else
19044 return default_case_values_threshold ();
19047 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */
19049 static void
19050 mips_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
19052 if (!TARGET_HARD_FLOAT_ABI)
19053 return;
19054 tree exceptions_var = create_tmp_var (MIPS_ATYPE_USI);
19055 tree fcsr_orig_var = create_tmp_var (MIPS_ATYPE_USI);
19056 tree fcsr_mod_var = create_tmp_var (MIPS_ATYPE_USI);
19057 tree get_fcsr = mips_builtin_decls[MIPS_GET_FCSR];
19058 tree set_fcsr = mips_builtin_decls[MIPS_SET_FCSR];
19059 tree get_fcsr_hold_call = build_call_expr (get_fcsr, 0);
19060 tree hold_assign_orig = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19061 fcsr_orig_var, get_fcsr_hold_call);
19062 tree hold_mod_val = build2 (BIT_AND_EXPR, MIPS_ATYPE_USI, fcsr_orig_var,
19063 build_int_cst (MIPS_ATYPE_USI, 0xfffff003));
19064 tree hold_assign_mod = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19065 fcsr_mod_var, hold_mod_val);
19066 tree set_fcsr_hold_call = build_call_expr (set_fcsr, 1, fcsr_mod_var);
19067 tree hold_all = build2 (COMPOUND_EXPR, MIPS_ATYPE_USI,
19068 hold_assign_orig, hold_assign_mod);
19069 *hold = build2 (COMPOUND_EXPR, void_type_node, hold_all,
19070 set_fcsr_hold_call);
19072 *clear = build_call_expr (set_fcsr, 1, fcsr_mod_var);
19074 tree get_fcsr_update_call = build_call_expr (get_fcsr, 0);
19075 *update = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19076 exceptions_var, get_fcsr_update_call);
19077 tree set_fcsr_update_call = build_call_expr (set_fcsr, 1, fcsr_orig_var);
19078 *update = build2 (COMPOUND_EXPR, void_type_node, *update,
19079 set_fcsr_update_call);
19080 tree atomic_feraiseexcept
19081 = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
19082 tree int_exceptions_var = fold_convert (integer_type_node,
19083 exceptions_var);
19084 tree atomic_feraiseexcept_call = build_call_expr (atomic_feraiseexcept,
19085 1, int_exceptions_var);
19086 *update = build2 (COMPOUND_EXPR, void_type_node, *update,
19087 atomic_feraiseexcept_call);
19090 /* Implement TARGET_SPILL_CLASS. */
19092 static reg_class_t
19093 mips_spill_class (reg_class_t rclass ATTRIBUTE_UNUSED,
19094 machine_mode mode ATTRIBUTE_UNUSED)
19096 if (TARGET_MIPS16)
19097 return SPILL_REGS;
19098 return NO_REGS;
19101 /* Implement TARGET_LRA_P. */
19103 static bool
19104 mips_lra_p (void)
19106 return mips_lra_flag;
19109 /* Initialize the GCC target structure. */
19110 #undef TARGET_ASM_ALIGNED_HI_OP
19111 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
19112 #undef TARGET_ASM_ALIGNED_SI_OP
19113 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
19114 #undef TARGET_ASM_ALIGNED_DI_OP
19115 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
19117 #undef TARGET_OPTION_OVERRIDE
19118 #define TARGET_OPTION_OVERRIDE mips_option_override
19120 #undef TARGET_LEGITIMIZE_ADDRESS
19121 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
19123 #undef TARGET_ASM_FUNCTION_PROLOGUE
19124 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
19125 #undef TARGET_ASM_FUNCTION_EPILOGUE
19126 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
19127 #undef TARGET_ASM_SELECT_RTX_SECTION
19128 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
19129 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
19130 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
19132 #undef TARGET_SCHED_INIT
19133 #define TARGET_SCHED_INIT mips_sched_init
19134 #undef TARGET_SCHED_REORDER
19135 #define TARGET_SCHED_REORDER mips_sched_reorder
19136 #undef TARGET_SCHED_REORDER2
19137 #define TARGET_SCHED_REORDER2 mips_sched_reorder2
19138 #undef TARGET_SCHED_VARIABLE_ISSUE
19139 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
19140 #undef TARGET_SCHED_ADJUST_COST
19141 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
19142 #undef TARGET_SCHED_ISSUE_RATE
19143 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
19144 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
19145 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
19146 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
19147 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
19148 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
19149 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
19150 mips_multipass_dfa_lookahead
19151 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
19152 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
19153 mips_small_register_classes_for_mode_p
19155 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
19156 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
19158 #undef TARGET_INSERT_ATTRIBUTES
19159 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
19160 #undef TARGET_MERGE_DECL_ATTRIBUTES
19161 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
19162 #undef TARGET_CAN_INLINE_P
19163 #define TARGET_CAN_INLINE_P mips_can_inline_p
19164 #undef TARGET_SET_CURRENT_FUNCTION
19165 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
19167 #undef TARGET_VALID_POINTER_MODE
19168 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
19169 #undef TARGET_REGISTER_MOVE_COST
19170 #define TARGET_REGISTER_MOVE_COST mips_register_move_cost
19171 #undef TARGET_REGISTER_PRIORITY
19172 #define TARGET_REGISTER_PRIORITY mips_register_priority
19173 #undef TARGET_MEMORY_MOVE_COST
19174 #define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
19175 #undef TARGET_RTX_COSTS
19176 #define TARGET_RTX_COSTS mips_rtx_costs
19177 #undef TARGET_ADDRESS_COST
19178 #define TARGET_ADDRESS_COST mips_address_cost
19180 #undef TARGET_IN_SMALL_DATA_P
19181 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
19183 #undef TARGET_MACHINE_DEPENDENT_REORG
19184 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
19186 #undef TARGET_PREFERRED_RELOAD_CLASS
19187 #define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
19189 #undef TARGET_EXPAND_TO_RTL_HOOK
19190 #define TARGET_EXPAND_TO_RTL_HOOK mips_expand_to_rtl_hook
19191 #undef TARGET_ASM_FILE_START
19192 #define TARGET_ASM_FILE_START mips_file_start
19193 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
19194 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
19195 #undef TARGET_ASM_CODE_END
19196 #define TARGET_ASM_CODE_END mips_code_end
19198 #undef TARGET_INIT_LIBFUNCS
19199 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
19201 #undef TARGET_BUILD_BUILTIN_VA_LIST
19202 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
19203 #undef TARGET_EXPAND_BUILTIN_VA_START
19204 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
19205 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
19206 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
19208 #undef TARGET_PROMOTE_FUNCTION_MODE
19209 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
19210 #undef TARGET_PROMOTE_PROTOTYPES
19211 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
19213 #undef TARGET_FUNCTION_VALUE
19214 #define TARGET_FUNCTION_VALUE mips_function_value
19215 #undef TARGET_LIBCALL_VALUE
19216 #define TARGET_LIBCALL_VALUE mips_libcall_value
19217 #undef TARGET_FUNCTION_VALUE_REGNO_P
19218 #define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
19219 #undef TARGET_RETURN_IN_MEMORY
19220 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
19221 #undef TARGET_RETURN_IN_MSB
19222 #define TARGET_RETURN_IN_MSB mips_return_in_msb
19224 #undef TARGET_ASM_OUTPUT_MI_THUNK
19225 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
19226 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
19227 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
19229 #undef TARGET_PRINT_OPERAND
19230 #define TARGET_PRINT_OPERAND mips_print_operand
19231 #undef TARGET_PRINT_OPERAND_ADDRESS
19232 #define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
19233 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
19234 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
19236 #undef TARGET_SETUP_INCOMING_VARARGS
19237 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
19238 #undef TARGET_STRICT_ARGUMENT_NAMING
19239 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
19240 #undef TARGET_MUST_PASS_IN_STACK
19241 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
19242 #undef TARGET_PASS_BY_REFERENCE
19243 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
19244 #undef TARGET_CALLEE_COPIES
19245 #define TARGET_CALLEE_COPIES mips_callee_copies
19246 #undef TARGET_ARG_PARTIAL_BYTES
19247 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
19248 #undef TARGET_FUNCTION_ARG
19249 #define TARGET_FUNCTION_ARG mips_function_arg
19250 #undef TARGET_FUNCTION_ARG_ADVANCE
19251 #define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
19252 #undef TARGET_FUNCTION_ARG_BOUNDARY
19253 #define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
19254 #undef TARGET_GET_RAW_RESULT_MODE
19255 #define TARGET_GET_RAW_RESULT_MODE mips_get_reg_raw_mode
19256 #undef TARGET_GET_RAW_ARG_MODE
19257 #define TARGET_GET_RAW_ARG_MODE mips_get_reg_raw_mode
19259 #undef TARGET_MODE_REP_EXTENDED
19260 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
19262 #undef TARGET_VECTOR_MODE_SUPPORTED_P
19263 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
19265 #undef TARGET_SCALAR_MODE_SUPPORTED_P
19266 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
19268 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
19269 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
19271 #undef TARGET_INIT_BUILTINS
19272 #define TARGET_INIT_BUILTINS mips_init_builtins
19273 #undef TARGET_BUILTIN_DECL
19274 #define TARGET_BUILTIN_DECL mips_builtin_decl
19275 #undef TARGET_EXPAND_BUILTIN
19276 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
19278 #undef TARGET_HAVE_TLS
19279 #define TARGET_HAVE_TLS HAVE_AS_TLS
19281 #undef TARGET_CANNOT_FORCE_CONST_MEM
19282 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
19284 #undef TARGET_LEGITIMATE_CONSTANT_P
19285 #define TARGET_LEGITIMATE_CONSTANT_P mips_legitimate_constant_p
19287 #undef TARGET_ENCODE_SECTION_INFO
19288 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
19290 #undef TARGET_ATTRIBUTE_TABLE
19291 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
19292 /* All our function attributes are related to how out-of-line copies should
19293 be compiled or called. They don't in themselves prevent inlining. */
19294 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
19295 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
19297 #undef TARGET_EXTRA_LIVE_ON_ENTRY
19298 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
19300 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
19301 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
19302 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
19303 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
19305 #undef TARGET_COMP_TYPE_ATTRIBUTES
19306 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
19308 #ifdef HAVE_AS_DTPRELWORD
19309 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
19310 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
19311 #endif
19312 #undef TARGET_DWARF_REGISTER_SPAN
19313 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
19314 #undef TARGET_DWARF_FRAME_REG_MODE
19315 #define TARGET_DWARF_FRAME_REG_MODE mips_dwarf_frame_reg_mode
19317 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
19318 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
19320 #undef TARGET_LEGITIMATE_ADDRESS_P
19321 #define TARGET_LEGITIMATE_ADDRESS_P mips_legitimate_address_p
19323 #undef TARGET_FRAME_POINTER_REQUIRED
19324 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
19326 #undef TARGET_CAN_ELIMINATE
19327 #define TARGET_CAN_ELIMINATE mips_can_eliminate
19329 #undef TARGET_CONDITIONAL_REGISTER_USAGE
19330 #define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
19332 #undef TARGET_TRAMPOLINE_INIT
19333 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
19335 #undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
19336 #define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
19338 #undef TARGET_SHIFT_TRUNCATION_MASK
19339 #define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
19341 #undef TARGET_PREPARE_PCH_SAVE
19342 #define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
19344 #undef TARGET_VECTORIZE_VEC_PERM_CONST_OK
19345 #define TARGET_VECTORIZE_VEC_PERM_CONST_OK mips_vectorize_vec_perm_const_ok
19347 #undef TARGET_CASE_VALUES_THRESHOLD
19348 #define TARGET_CASE_VALUES_THRESHOLD mips_case_values_threshold
19350 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
19351 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV mips_atomic_assign_expand_fenv
19353 #undef TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
19354 #define TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS true
19356 #undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
19357 #define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P \
19358 mips_use_by_pieces_infrastructure_p
19360 #undef TARGET_SPILL_CLASS
19361 #define TARGET_SPILL_CLASS mips_spill_class
19362 #undef TARGET_LRA_P
19363 #define TARGET_LRA_P mips_lra_p
19365 struct gcc_target targetm = TARGET_INITIALIZER;
19367 #include "gt-mips.h"