2015-07-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
[official-gcc.git] / gcc / config / mips / mips.c
blob95a0ae3f44c6e93f7538bdd029bac76ff221a6cb
1 /* Subroutines used for MIPS code generation.
2 Copyright (C) 1989-2015 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 "alias.h"
37 #include "symtab.h"
38 #include "tree.h"
39 #include "fold-const.h"
40 #include "varasm.h"
41 #include "stringpool.h"
42 #include "stor-layout.h"
43 #include "calls.h"
44 #include "function.h"
45 #include "flags.h"
46 #include "expmed.h"
47 #include "dojump.h"
48 #include "explow.h"
49 #include "emit-rtl.h"
50 #include "stmt.h"
51 #include "expr.h"
52 #include "insn-codes.h"
53 #include "optabs.h"
54 #include "libfuncs.h"
55 #include "reload.h"
56 #include "tm_p.h"
57 #include "gstab.h"
58 #include "debug.h"
59 #include "target.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 "gimple.h"
78 #include "gimplify.h"
79 #include "bitmap.h"
80 #include "diagnostic.h"
81 #include "target-globals.h"
82 #include "opts.h"
83 #include "tree-pass.h"
84 #include "context.h"
85 #include "cgraph.h"
86 #include "builtins.h"
87 #include "rtl-iter.h"
89 /* This file should be included last. */
90 #include "target-def.h"
92 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
93 #define UNSPEC_ADDRESS_P(X) \
94 (GET_CODE (X) == UNSPEC \
95 && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
96 && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
98 /* Extract the symbol or label from UNSPEC wrapper X. */
99 #define UNSPEC_ADDRESS(X) \
100 XVECEXP (X, 0, 0)
102 /* Extract the symbol type from UNSPEC wrapper X. */
103 #define UNSPEC_ADDRESS_TYPE(X) \
104 ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
106 /* The maximum distance between the top of the stack frame and the
107 value $sp has when we save and restore registers.
109 The value for normal-mode code must be a SMALL_OPERAND and must
110 preserve the maximum stack alignment. We therefore use a value
111 of 0x7ff0 in this case.
113 microMIPS LWM and SWM support 12-bit offsets (from -0x800 to 0x7ff),
114 so we use a maximum of 0x7f0 for TARGET_MICROMIPS.
116 MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
117 up to 0x7f8 bytes and can usually save or restore all the registers
118 that we need to save or restore. (Note that we can only use these
119 instructions for o32, for which the stack alignment is 8 bytes.)
121 We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
122 RESTORE are not available. We can then use unextended instructions
123 to save and restore registers, and to allocate and deallocate the top
124 part of the frame. */
125 #define MIPS_MAX_FIRST_STACK_STEP \
126 (!TARGET_COMPRESSION ? 0x7ff0 \
127 : TARGET_MICROMIPS || GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8 \
128 : TARGET_64BIT ? 0x100 : 0x400)
130 /* True if INSN is a mips.md pattern or asm statement. */
131 /* ??? This test exists through the compiler, perhaps it should be
132 moved to rtl.h. */
133 #define USEFUL_INSN_P(INSN) \
134 (NONDEBUG_INSN_P (INSN) \
135 && GET_CODE (PATTERN (INSN)) != USE \
136 && GET_CODE (PATTERN (INSN)) != CLOBBER)
138 /* If INSN is a delayed branch sequence, return the first instruction
139 in the sequence, otherwise return INSN itself. */
140 #define SEQ_BEGIN(INSN) \
141 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
142 ? as_a <rtx_insn *> (XVECEXP (PATTERN (INSN), 0, 0)) \
143 : (INSN))
145 /* Likewise for the last instruction in a delayed branch sequence. */
146 #define SEQ_END(INSN) \
147 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
148 ? as_a <rtx_insn *> (XVECEXP (PATTERN (INSN), \
149 0, \
150 XVECLEN (PATTERN (INSN), 0) - 1)) \
151 : (INSN))
153 /* Execute the following loop body with SUBINSN set to each instruction
154 between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive. */
155 #define FOR_EACH_SUBINSN(SUBINSN, INSN) \
156 for ((SUBINSN) = SEQ_BEGIN (INSN); \
157 (SUBINSN) != NEXT_INSN (SEQ_END (INSN)); \
158 (SUBINSN) = NEXT_INSN (SUBINSN))
160 /* True if bit BIT is set in VALUE. */
161 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
163 /* Return the opcode for a ptr_mode load of the form:
165 l[wd] DEST, OFFSET(BASE). */
166 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE) \
167 (((ptr_mode == DImode ? 0x37 : 0x23) << 26) \
168 | ((BASE) << 21) \
169 | ((DEST) << 16) \
170 | (OFFSET))
172 /* Return the opcode to move register SRC into register DEST. */
173 #define MIPS_MOVE(DEST, SRC) \
174 ((TARGET_64BIT ? 0x2d : 0x21) \
175 | ((DEST) << 11) \
176 | ((SRC) << 21))
178 /* Return the opcode for:
180 lui DEST, VALUE. */
181 #define MIPS_LUI(DEST, VALUE) \
182 ((0xf << 26) | ((DEST) << 16) | (VALUE))
184 /* Return the opcode to jump to register DEST. When the JR opcode is not
185 available use JALR $0, DEST. */
186 #define MIPS_JR(DEST) \
187 (((DEST) << 21) | (ISA_HAS_JR ? 0x8 : 0x9))
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 /* Target state for MICROMIPS. */
665 struct target_globals *micromips_globals;
667 /* Cached value of can_issue_more. This is cached in mips_variable_issue hook
668 and returned from mips_sched_reorder2. */
669 static int cached_can_issue_more;
671 /* The stubs for various MIPS16 support functions, if used. */
672 static mips_one_only_stub *mips16_rdhwr_stub;
673 static mips_one_only_stub *mips16_get_fcsr_stub;
674 static mips_one_only_stub *mips16_set_fcsr_stub;
676 /* Index R is the smallest register class that contains register R. */
677 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
678 LEA_REGS, LEA_REGS, M16_STORE_REGS, V1_REG,
679 M16_STORE_REGS, M16_STORE_REGS, M16_STORE_REGS, M16_STORE_REGS,
680 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
681 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
682 M16_REGS, M16_STORE_REGS, LEA_REGS, LEA_REGS,
683 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
684 T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS,
685 LEA_REGS, M16_SP_REGS, LEA_REGS, LEA_REGS,
687 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
688 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
689 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
690 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
691 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
692 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
693 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
694 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
695 MD0_REG, MD1_REG, NO_REGS, ST_REGS,
696 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
697 ST_REGS, ST_REGS, ST_REGS, NO_REGS,
698 NO_REGS, FRAME_REGS, FRAME_REGS, NO_REGS,
699 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
700 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
701 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
702 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
703 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
704 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
705 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
706 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
707 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
708 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
709 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
710 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
711 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
712 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
713 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
714 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
715 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
716 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
717 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
718 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
719 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
720 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
721 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
722 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
723 DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS,
724 DSP_ACC_REGS, DSP_ACC_REGS, ALL_REGS, ALL_REGS,
725 ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS
728 /* The value of TARGET_ATTRIBUTE_TABLE. */
729 static const struct attribute_spec mips_attribute_table[] = {
730 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
731 om_diagnostic } */
732 { "long_call", 0, 0, false, true, true, NULL, false },
733 { "far", 0, 0, false, true, true, NULL, false },
734 { "near", 0, 0, false, true, true, NULL, false },
735 /* We would really like to treat "mips16" and "nomips16" as type
736 attributes, but GCC doesn't provide the hooks we need to support
737 the right conversion rules. As declaration attributes, they affect
738 code generation but don't carry other semantics. */
739 { "mips16", 0, 0, true, false, false, NULL, false },
740 { "nomips16", 0, 0, true, false, false, NULL, false },
741 { "micromips", 0, 0, true, false, false, NULL, false },
742 { "nomicromips", 0, 0, true, false, false, NULL, false },
743 { "nocompression", 0, 0, true, false, false, NULL, false },
744 /* Allow functions to be specified as interrupt handlers */
745 { "interrupt", 0, 0, false, true, true, NULL, false },
746 { "use_shadow_register_set", 0, 0, false, true, true, NULL, false },
747 { "keep_interrupts_masked", 0, 0, false, true, true, NULL, false },
748 { "use_debug_exception_return", 0, 0, false, true, true, NULL, false },
749 { NULL, 0, 0, false, false, false, NULL, false }
752 /* A table describing all the processors GCC knows about; see
753 mips-cpus.def for details. */
754 static const struct mips_cpu_info mips_cpu_info_table[] = {
755 #define MIPS_CPU(NAME, CPU, ISA, FLAGS) \
756 { NAME, CPU, ISA, FLAGS },
757 #include "mips-cpus.def"
758 #undef MIPS_CPU
761 /* Default costs. If these are used for a processor we should look
762 up the actual costs. */
763 #define DEFAULT_COSTS COSTS_N_INSNS (6), /* fp_add */ \
764 COSTS_N_INSNS (7), /* fp_mult_sf */ \
765 COSTS_N_INSNS (8), /* fp_mult_df */ \
766 COSTS_N_INSNS (23), /* fp_div_sf */ \
767 COSTS_N_INSNS (36), /* fp_div_df */ \
768 COSTS_N_INSNS (10), /* int_mult_si */ \
769 COSTS_N_INSNS (10), /* int_mult_di */ \
770 COSTS_N_INSNS (69), /* int_div_si */ \
771 COSTS_N_INSNS (69), /* int_div_di */ \
772 2, /* branch_cost */ \
773 4 /* memory_latency */
775 /* Floating-point costs for processors without an FPU. Just assume that
776 all floating-point libcalls are very expensive. */
777 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */ \
778 COSTS_N_INSNS (256), /* fp_mult_sf */ \
779 COSTS_N_INSNS (256), /* fp_mult_df */ \
780 COSTS_N_INSNS (256), /* fp_div_sf */ \
781 COSTS_N_INSNS (256) /* fp_div_df */
783 /* Costs to use when optimizing for size. */
784 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
785 COSTS_N_INSNS (1), /* fp_add */
786 COSTS_N_INSNS (1), /* fp_mult_sf */
787 COSTS_N_INSNS (1), /* fp_mult_df */
788 COSTS_N_INSNS (1), /* fp_div_sf */
789 COSTS_N_INSNS (1), /* fp_div_df */
790 COSTS_N_INSNS (1), /* int_mult_si */
791 COSTS_N_INSNS (1), /* int_mult_di */
792 COSTS_N_INSNS (1), /* int_div_si */
793 COSTS_N_INSNS (1), /* int_div_di */
794 2, /* branch_cost */
795 4 /* memory_latency */
798 /* Costs to use when optimizing for speed, indexed by processor. */
799 static const struct mips_rtx_cost_data
800 mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
801 { /* R3000 */
802 COSTS_N_INSNS (2), /* fp_add */
803 COSTS_N_INSNS (4), /* fp_mult_sf */
804 COSTS_N_INSNS (5), /* fp_mult_df */
805 COSTS_N_INSNS (12), /* fp_div_sf */
806 COSTS_N_INSNS (19), /* fp_div_df */
807 COSTS_N_INSNS (12), /* int_mult_si */
808 COSTS_N_INSNS (12), /* int_mult_di */
809 COSTS_N_INSNS (35), /* int_div_si */
810 COSTS_N_INSNS (35), /* int_div_di */
811 1, /* branch_cost */
812 4 /* memory_latency */
814 { /* 4KC */
815 SOFT_FP_COSTS,
816 COSTS_N_INSNS (6), /* int_mult_si */
817 COSTS_N_INSNS (6), /* int_mult_di */
818 COSTS_N_INSNS (36), /* int_div_si */
819 COSTS_N_INSNS (36), /* int_div_di */
820 1, /* branch_cost */
821 4 /* memory_latency */
823 { /* 4KP */
824 SOFT_FP_COSTS,
825 COSTS_N_INSNS (36), /* int_mult_si */
826 COSTS_N_INSNS (36), /* int_mult_di */
827 COSTS_N_INSNS (37), /* int_div_si */
828 COSTS_N_INSNS (37), /* int_div_di */
829 1, /* branch_cost */
830 4 /* memory_latency */
832 { /* 5KC */
833 SOFT_FP_COSTS,
834 COSTS_N_INSNS (4), /* int_mult_si */
835 COSTS_N_INSNS (11), /* int_mult_di */
836 COSTS_N_INSNS (36), /* int_div_si */
837 COSTS_N_INSNS (68), /* int_div_di */
838 1, /* branch_cost */
839 4 /* memory_latency */
841 { /* 5KF */
842 COSTS_N_INSNS (4), /* fp_add */
843 COSTS_N_INSNS (4), /* fp_mult_sf */
844 COSTS_N_INSNS (5), /* fp_mult_df */
845 COSTS_N_INSNS (17), /* fp_div_sf */
846 COSTS_N_INSNS (32), /* fp_div_df */
847 COSTS_N_INSNS (4), /* int_mult_si */
848 COSTS_N_INSNS (11), /* int_mult_di */
849 COSTS_N_INSNS (36), /* int_div_si */
850 COSTS_N_INSNS (68), /* int_div_di */
851 1, /* branch_cost */
852 4 /* memory_latency */
854 { /* 20KC */
855 COSTS_N_INSNS (4), /* fp_add */
856 COSTS_N_INSNS (4), /* fp_mult_sf */
857 COSTS_N_INSNS (5), /* fp_mult_df */
858 COSTS_N_INSNS (17), /* fp_div_sf */
859 COSTS_N_INSNS (32), /* fp_div_df */
860 COSTS_N_INSNS (4), /* int_mult_si */
861 COSTS_N_INSNS (7), /* int_mult_di */
862 COSTS_N_INSNS (42), /* int_div_si */
863 COSTS_N_INSNS (72), /* int_div_di */
864 1, /* branch_cost */
865 4 /* memory_latency */
867 { /* 24KC */
868 SOFT_FP_COSTS,
869 COSTS_N_INSNS (5), /* int_mult_si */
870 COSTS_N_INSNS (5), /* int_mult_di */
871 COSTS_N_INSNS (41), /* int_div_si */
872 COSTS_N_INSNS (41), /* int_div_di */
873 1, /* branch_cost */
874 4 /* memory_latency */
876 { /* 24KF2_1 */
877 COSTS_N_INSNS (8), /* fp_add */
878 COSTS_N_INSNS (8), /* fp_mult_sf */
879 COSTS_N_INSNS (10), /* fp_mult_df */
880 COSTS_N_INSNS (34), /* fp_div_sf */
881 COSTS_N_INSNS (64), /* fp_div_df */
882 COSTS_N_INSNS (5), /* int_mult_si */
883 COSTS_N_INSNS (5), /* int_mult_di */
884 COSTS_N_INSNS (41), /* int_div_si */
885 COSTS_N_INSNS (41), /* int_div_di */
886 1, /* branch_cost */
887 4 /* memory_latency */
889 { /* 24KF1_1 */
890 COSTS_N_INSNS (4), /* fp_add */
891 COSTS_N_INSNS (4), /* fp_mult_sf */
892 COSTS_N_INSNS (5), /* fp_mult_df */
893 COSTS_N_INSNS (17), /* fp_div_sf */
894 COSTS_N_INSNS (32), /* fp_div_df */
895 COSTS_N_INSNS (5), /* int_mult_si */
896 COSTS_N_INSNS (5), /* int_mult_di */
897 COSTS_N_INSNS (41), /* int_div_si */
898 COSTS_N_INSNS (41), /* int_div_di */
899 1, /* branch_cost */
900 4 /* memory_latency */
902 { /* 74KC */
903 SOFT_FP_COSTS,
904 COSTS_N_INSNS (5), /* int_mult_si */
905 COSTS_N_INSNS (5), /* int_mult_di */
906 COSTS_N_INSNS (41), /* int_div_si */
907 COSTS_N_INSNS (41), /* int_div_di */
908 1, /* branch_cost */
909 4 /* memory_latency */
911 { /* 74KF2_1 */
912 COSTS_N_INSNS (8), /* fp_add */
913 COSTS_N_INSNS (8), /* fp_mult_sf */
914 COSTS_N_INSNS (10), /* fp_mult_df */
915 COSTS_N_INSNS (34), /* fp_div_sf */
916 COSTS_N_INSNS (64), /* fp_div_df */
917 COSTS_N_INSNS (5), /* int_mult_si */
918 COSTS_N_INSNS (5), /* int_mult_di */
919 COSTS_N_INSNS (41), /* int_div_si */
920 COSTS_N_INSNS (41), /* int_div_di */
921 1, /* branch_cost */
922 4 /* memory_latency */
924 { /* 74KF1_1 */
925 COSTS_N_INSNS (4), /* fp_add */
926 COSTS_N_INSNS (4), /* fp_mult_sf */
927 COSTS_N_INSNS (5), /* fp_mult_df */
928 COSTS_N_INSNS (17), /* fp_div_sf */
929 COSTS_N_INSNS (32), /* fp_div_df */
930 COSTS_N_INSNS (5), /* int_mult_si */
931 COSTS_N_INSNS (5), /* int_mult_di */
932 COSTS_N_INSNS (41), /* int_div_si */
933 COSTS_N_INSNS (41), /* int_div_di */
934 1, /* branch_cost */
935 4 /* memory_latency */
937 { /* 74KF3_2 */
938 COSTS_N_INSNS (6), /* fp_add */
939 COSTS_N_INSNS (6), /* fp_mult_sf */
940 COSTS_N_INSNS (7), /* fp_mult_df */
941 COSTS_N_INSNS (25), /* fp_div_sf */
942 COSTS_N_INSNS (48), /* fp_div_df */
943 COSTS_N_INSNS (5), /* int_mult_si */
944 COSTS_N_INSNS (5), /* int_mult_di */
945 COSTS_N_INSNS (41), /* int_div_si */
946 COSTS_N_INSNS (41), /* int_div_di */
947 1, /* branch_cost */
948 4 /* memory_latency */
950 { /* Loongson-2E */
951 DEFAULT_COSTS
953 { /* Loongson-2F */
954 DEFAULT_COSTS
956 { /* Loongson-3A */
957 DEFAULT_COSTS
959 { /* M4k */
960 DEFAULT_COSTS
962 /* Octeon */
964 SOFT_FP_COSTS,
965 COSTS_N_INSNS (5), /* int_mult_si */
966 COSTS_N_INSNS (5), /* int_mult_di */
967 COSTS_N_INSNS (72), /* int_div_si */
968 COSTS_N_INSNS (72), /* int_div_di */
969 1, /* branch_cost */
970 4 /* memory_latency */
972 /* Octeon II */
974 SOFT_FP_COSTS,
975 COSTS_N_INSNS (6), /* int_mult_si */
976 COSTS_N_INSNS (6), /* int_mult_di */
977 COSTS_N_INSNS (18), /* int_div_si */
978 COSTS_N_INSNS (35), /* int_div_di */
979 4, /* branch_cost */
980 4 /* memory_latency */
982 /* Octeon III */
984 COSTS_N_INSNS (6), /* fp_add */
985 COSTS_N_INSNS (6), /* fp_mult_sf */
986 COSTS_N_INSNS (7), /* fp_mult_df */
987 COSTS_N_INSNS (25), /* fp_div_sf */
988 COSTS_N_INSNS (48), /* fp_div_df */
989 COSTS_N_INSNS (6), /* int_mult_si */
990 COSTS_N_INSNS (6), /* int_mult_di */
991 COSTS_N_INSNS (18), /* int_div_si */
992 COSTS_N_INSNS (35), /* int_div_di */
993 4, /* branch_cost */
994 4 /* memory_latency */
996 { /* R3900 */
997 COSTS_N_INSNS (2), /* fp_add */
998 COSTS_N_INSNS (4), /* fp_mult_sf */
999 COSTS_N_INSNS (5), /* fp_mult_df */
1000 COSTS_N_INSNS (12), /* fp_div_sf */
1001 COSTS_N_INSNS (19), /* fp_div_df */
1002 COSTS_N_INSNS (2), /* int_mult_si */
1003 COSTS_N_INSNS (2), /* int_mult_di */
1004 COSTS_N_INSNS (35), /* int_div_si */
1005 COSTS_N_INSNS (35), /* int_div_di */
1006 1, /* branch_cost */
1007 4 /* memory_latency */
1009 { /* R6000 */
1010 COSTS_N_INSNS (3), /* fp_add */
1011 COSTS_N_INSNS (5), /* fp_mult_sf */
1012 COSTS_N_INSNS (6), /* fp_mult_df */
1013 COSTS_N_INSNS (15), /* fp_div_sf */
1014 COSTS_N_INSNS (16), /* fp_div_df */
1015 COSTS_N_INSNS (17), /* int_mult_si */
1016 COSTS_N_INSNS (17), /* int_mult_di */
1017 COSTS_N_INSNS (38), /* int_div_si */
1018 COSTS_N_INSNS (38), /* int_div_di */
1019 2, /* branch_cost */
1020 6 /* memory_latency */
1022 { /* R4000 */
1023 COSTS_N_INSNS (6), /* fp_add */
1024 COSTS_N_INSNS (7), /* fp_mult_sf */
1025 COSTS_N_INSNS (8), /* fp_mult_df */
1026 COSTS_N_INSNS (23), /* fp_div_sf */
1027 COSTS_N_INSNS (36), /* fp_div_df */
1028 COSTS_N_INSNS (10), /* int_mult_si */
1029 COSTS_N_INSNS (10), /* int_mult_di */
1030 COSTS_N_INSNS (69), /* int_div_si */
1031 COSTS_N_INSNS (69), /* int_div_di */
1032 2, /* branch_cost */
1033 6 /* memory_latency */
1035 { /* R4100 */
1036 DEFAULT_COSTS
1038 { /* R4111 */
1039 DEFAULT_COSTS
1041 { /* R4120 */
1042 DEFAULT_COSTS
1044 { /* R4130 */
1045 /* The only costs that appear to be updated here are
1046 integer multiplication. */
1047 SOFT_FP_COSTS,
1048 COSTS_N_INSNS (4), /* int_mult_si */
1049 COSTS_N_INSNS (6), /* int_mult_di */
1050 COSTS_N_INSNS (69), /* int_div_si */
1051 COSTS_N_INSNS (69), /* int_div_di */
1052 1, /* branch_cost */
1053 4 /* memory_latency */
1055 { /* R4300 */
1056 DEFAULT_COSTS
1058 { /* R4600 */
1059 DEFAULT_COSTS
1061 { /* R4650 */
1062 DEFAULT_COSTS
1064 { /* R4700 */
1065 DEFAULT_COSTS
1067 { /* R5000 */
1068 COSTS_N_INSNS (6), /* fp_add */
1069 COSTS_N_INSNS (4), /* fp_mult_sf */
1070 COSTS_N_INSNS (5), /* fp_mult_df */
1071 COSTS_N_INSNS (23), /* fp_div_sf */
1072 COSTS_N_INSNS (36), /* fp_div_df */
1073 COSTS_N_INSNS (5), /* int_mult_si */
1074 COSTS_N_INSNS (5), /* int_mult_di */
1075 COSTS_N_INSNS (36), /* int_div_si */
1076 COSTS_N_INSNS (36), /* int_div_di */
1077 1, /* branch_cost */
1078 4 /* memory_latency */
1080 { /* R5400 */
1081 COSTS_N_INSNS (6), /* fp_add */
1082 COSTS_N_INSNS (5), /* fp_mult_sf */
1083 COSTS_N_INSNS (6), /* fp_mult_df */
1084 COSTS_N_INSNS (30), /* fp_div_sf */
1085 COSTS_N_INSNS (59), /* fp_div_df */
1086 COSTS_N_INSNS (3), /* int_mult_si */
1087 COSTS_N_INSNS (4), /* int_mult_di */
1088 COSTS_N_INSNS (42), /* int_div_si */
1089 COSTS_N_INSNS (74), /* int_div_di */
1090 1, /* branch_cost */
1091 4 /* memory_latency */
1093 { /* R5500 */
1094 COSTS_N_INSNS (6), /* fp_add */
1095 COSTS_N_INSNS (5), /* fp_mult_sf */
1096 COSTS_N_INSNS (6), /* fp_mult_df */
1097 COSTS_N_INSNS (30), /* fp_div_sf */
1098 COSTS_N_INSNS (59), /* fp_div_df */
1099 COSTS_N_INSNS (5), /* int_mult_si */
1100 COSTS_N_INSNS (9), /* int_mult_di */
1101 COSTS_N_INSNS (42), /* int_div_si */
1102 COSTS_N_INSNS (74), /* int_div_di */
1103 1, /* branch_cost */
1104 4 /* memory_latency */
1106 { /* R5900 */
1107 COSTS_N_INSNS (4), /* fp_add */
1108 COSTS_N_INSNS (4), /* fp_mult_sf */
1109 COSTS_N_INSNS (256), /* fp_mult_df */
1110 COSTS_N_INSNS (8), /* fp_div_sf */
1111 COSTS_N_INSNS (256), /* fp_div_df */
1112 COSTS_N_INSNS (4), /* int_mult_si */
1113 COSTS_N_INSNS (256), /* int_mult_di */
1114 COSTS_N_INSNS (37), /* int_div_si */
1115 COSTS_N_INSNS (256), /* int_div_di */
1116 1, /* branch_cost */
1117 4 /* memory_latency */
1119 { /* R7000 */
1120 /* The only costs that are changed here are
1121 integer multiplication. */
1122 COSTS_N_INSNS (6), /* fp_add */
1123 COSTS_N_INSNS (7), /* fp_mult_sf */
1124 COSTS_N_INSNS (8), /* fp_mult_df */
1125 COSTS_N_INSNS (23), /* fp_div_sf */
1126 COSTS_N_INSNS (36), /* fp_div_df */
1127 COSTS_N_INSNS (5), /* int_mult_si */
1128 COSTS_N_INSNS (9), /* int_mult_di */
1129 COSTS_N_INSNS (69), /* int_div_si */
1130 COSTS_N_INSNS (69), /* int_div_di */
1131 1, /* branch_cost */
1132 4 /* memory_latency */
1134 { /* R8000 */
1135 DEFAULT_COSTS
1137 { /* R9000 */
1138 /* The only costs that are changed here are
1139 integer multiplication. */
1140 COSTS_N_INSNS (6), /* fp_add */
1141 COSTS_N_INSNS (7), /* fp_mult_sf */
1142 COSTS_N_INSNS (8), /* fp_mult_df */
1143 COSTS_N_INSNS (23), /* fp_div_sf */
1144 COSTS_N_INSNS (36), /* fp_div_df */
1145 COSTS_N_INSNS (3), /* int_mult_si */
1146 COSTS_N_INSNS (8), /* int_mult_di */
1147 COSTS_N_INSNS (69), /* int_div_si */
1148 COSTS_N_INSNS (69), /* int_div_di */
1149 1, /* branch_cost */
1150 4 /* memory_latency */
1152 { /* R1x000 */
1153 COSTS_N_INSNS (2), /* fp_add */
1154 COSTS_N_INSNS (2), /* fp_mult_sf */
1155 COSTS_N_INSNS (2), /* fp_mult_df */
1156 COSTS_N_INSNS (12), /* fp_div_sf */
1157 COSTS_N_INSNS (19), /* fp_div_df */
1158 COSTS_N_INSNS (5), /* int_mult_si */
1159 COSTS_N_INSNS (9), /* int_mult_di */
1160 COSTS_N_INSNS (34), /* int_div_si */
1161 COSTS_N_INSNS (66), /* int_div_di */
1162 1, /* branch_cost */
1163 4 /* memory_latency */
1165 { /* SB1 */
1166 /* These costs are the same as the SB-1A below. */
1167 COSTS_N_INSNS (4), /* fp_add */
1168 COSTS_N_INSNS (4), /* fp_mult_sf */
1169 COSTS_N_INSNS (4), /* fp_mult_df */
1170 COSTS_N_INSNS (24), /* fp_div_sf */
1171 COSTS_N_INSNS (32), /* fp_div_df */
1172 COSTS_N_INSNS (3), /* int_mult_si */
1173 COSTS_N_INSNS (4), /* int_mult_di */
1174 COSTS_N_INSNS (36), /* int_div_si */
1175 COSTS_N_INSNS (68), /* int_div_di */
1176 1, /* branch_cost */
1177 4 /* memory_latency */
1179 { /* SB1-A */
1180 /* These costs are the same as the SB-1 above. */
1181 COSTS_N_INSNS (4), /* fp_add */
1182 COSTS_N_INSNS (4), /* fp_mult_sf */
1183 COSTS_N_INSNS (4), /* fp_mult_df */
1184 COSTS_N_INSNS (24), /* fp_div_sf */
1185 COSTS_N_INSNS (32), /* fp_div_df */
1186 COSTS_N_INSNS (3), /* int_mult_si */
1187 COSTS_N_INSNS (4), /* int_mult_di */
1188 COSTS_N_INSNS (36), /* int_div_si */
1189 COSTS_N_INSNS (68), /* int_div_di */
1190 1, /* branch_cost */
1191 4 /* memory_latency */
1193 { /* SR71000 */
1194 DEFAULT_COSTS
1196 { /* XLR */
1197 SOFT_FP_COSTS,
1198 COSTS_N_INSNS (8), /* int_mult_si */
1199 COSTS_N_INSNS (8), /* int_mult_di */
1200 COSTS_N_INSNS (72), /* int_div_si */
1201 COSTS_N_INSNS (72), /* int_div_di */
1202 1, /* branch_cost */
1203 4 /* memory_latency */
1205 { /* XLP */
1206 /* These costs are the same as 5KF above. */
1207 COSTS_N_INSNS (4), /* fp_add */
1208 COSTS_N_INSNS (4), /* fp_mult_sf */
1209 COSTS_N_INSNS (5), /* fp_mult_df */
1210 COSTS_N_INSNS (17), /* fp_div_sf */
1211 COSTS_N_INSNS (32), /* fp_div_df */
1212 COSTS_N_INSNS (4), /* int_mult_si */
1213 COSTS_N_INSNS (11), /* int_mult_di */
1214 COSTS_N_INSNS (36), /* int_div_si */
1215 COSTS_N_INSNS (68), /* int_div_di */
1216 1, /* branch_cost */
1217 4 /* memory_latency */
1219 { /* P5600 */
1220 COSTS_N_INSNS (4), /* fp_add */
1221 COSTS_N_INSNS (5), /* fp_mult_sf */
1222 COSTS_N_INSNS (5), /* fp_mult_df */
1223 COSTS_N_INSNS (17), /* fp_div_sf */
1224 COSTS_N_INSNS (17), /* fp_div_df */
1225 COSTS_N_INSNS (5), /* int_mult_si */
1226 COSTS_N_INSNS (5), /* int_mult_di */
1227 COSTS_N_INSNS (8), /* int_div_si */
1228 COSTS_N_INSNS (8), /* int_div_di */
1229 2, /* branch_cost */
1230 4 /* memory_latency */
1232 { /* W32 */
1233 COSTS_N_INSNS (4), /* fp_add */
1234 COSTS_N_INSNS (4), /* fp_mult_sf */
1235 COSTS_N_INSNS (5), /* fp_mult_df */
1236 COSTS_N_INSNS (17), /* fp_div_sf */
1237 COSTS_N_INSNS (32), /* fp_div_df */
1238 COSTS_N_INSNS (5), /* int_mult_si */
1239 COSTS_N_INSNS (5), /* int_mult_di */
1240 COSTS_N_INSNS (41), /* int_div_si */
1241 COSTS_N_INSNS (41), /* int_div_di */
1242 1, /* branch_cost */
1243 4 /* memory_latency */
1245 { /* W64 */
1246 COSTS_N_INSNS (4), /* fp_add */
1247 COSTS_N_INSNS (4), /* fp_mult_sf */
1248 COSTS_N_INSNS (5), /* fp_mult_df */
1249 COSTS_N_INSNS (17), /* fp_div_sf */
1250 COSTS_N_INSNS (32), /* fp_div_df */
1251 COSTS_N_INSNS (5), /* int_mult_si */
1252 COSTS_N_INSNS (5), /* int_mult_di */
1253 COSTS_N_INSNS (41), /* int_div_si */
1254 COSTS_N_INSNS (41), /* int_div_di */
1255 1, /* branch_cost */
1256 4 /* memory_latency */
1260 static rtx mips_find_pic_call_symbol (rtx_insn *, rtx, bool);
1261 static int mips_register_move_cost (machine_mode, reg_class_t,
1262 reg_class_t);
1263 static unsigned int mips_function_arg_boundary (machine_mode, const_tree);
1264 static machine_mode mips_get_reg_raw_mode (int regno);
1266 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1267 for -mflip_mips16. It maps decl names onto a boolean mode setting. */
1268 static GTY (()) hash_map<nofree_string_hash, bool> *mflip_mips16_htab;
1270 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1271 mode, false if it should next add an attribute for the opposite mode. */
1272 static GTY(()) bool mips16_flipper;
1274 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1275 for -mflip-mips16. Return true if it should use "mips16" and false if
1276 it should use "nomips16". */
1278 static bool
1279 mflip_mips16_use_mips16_p (tree decl)
1281 const char *name;
1282 bool base_is_mips16 = (mips_base_compression_flags & MASK_MIPS16) != 0;
1284 /* Use the opposite of the command-line setting for anonymous decls. */
1285 if (!DECL_NAME (decl))
1286 return !base_is_mips16;
1288 if (!mflip_mips16_htab)
1289 mflip_mips16_htab = hash_map<nofree_string_hash, bool>::create_ggc (37);
1291 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1293 bool existed;
1294 bool *slot = &mflip_mips16_htab->get_or_insert (name, &existed);
1295 if (!existed)
1297 mips16_flipper = !mips16_flipper;
1298 *slot = mips16_flipper ? !base_is_mips16 : base_is_mips16;
1300 return *slot;
1303 /* Predicates to test for presence of "near" and "far"/"long_call"
1304 attributes on the given TYPE. */
1306 static bool
1307 mips_near_type_p (const_tree type)
1309 return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1312 static bool
1313 mips_far_type_p (const_tree type)
1315 return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1316 || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1320 /* Check if the interrupt attribute is set for a function. */
1322 static bool
1323 mips_interrupt_type_p (tree type)
1325 return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1328 /* Check if the attribute to use shadow register set is set for a function. */
1330 static bool
1331 mips_use_shadow_register_set_p (tree type)
1333 return lookup_attribute ("use_shadow_register_set",
1334 TYPE_ATTRIBUTES (type)) != NULL;
1337 /* Check if the attribute to keep interrupts masked is set for a function. */
1339 static bool
1340 mips_keep_interrupts_masked_p (tree type)
1342 return lookup_attribute ("keep_interrupts_masked",
1343 TYPE_ATTRIBUTES (type)) != NULL;
1346 /* Check if the attribute to use debug exception return is set for
1347 a function. */
1349 static bool
1350 mips_use_debug_exception_return_p (tree type)
1352 return lookup_attribute ("use_debug_exception_return",
1353 TYPE_ATTRIBUTES (type)) != NULL;
1356 /* Return the set of compression modes that are explicitly required
1357 by the attributes in ATTRIBUTES. */
1359 static unsigned int
1360 mips_get_compress_on_flags (tree attributes)
1362 unsigned int flags = 0;
1364 if (lookup_attribute ("mips16", attributes) != NULL)
1365 flags |= MASK_MIPS16;
1367 if (lookup_attribute ("micromips", attributes) != NULL)
1368 flags |= MASK_MICROMIPS;
1370 return flags;
1373 /* Return the set of compression modes that are explicitly forbidden
1374 by the attributes in ATTRIBUTES. */
1376 static unsigned int
1377 mips_get_compress_off_flags (tree attributes)
1379 unsigned int flags = 0;
1381 if (lookup_attribute ("nocompression", attributes) != NULL)
1382 flags |= MASK_MIPS16 | MASK_MICROMIPS;
1384 if (lookup_attribute ("nomips16", attributes) != NULL)
1385 flags |= MASK_MIPS16;
1387 if (lookup_attribute ("nomicromips", attributes) != NULL)
1388 flags |= MASK_MICROMIPS;
1390 return flags;
1393 /* Return the compression mode that should be used for function DECL.
1394 Return the ambient setting if DECL is null. */
1396 static unsigned int
1397 mips_get_compress_mode (tree decl)
1399 unsigned int flags, force_on;
1401 flags = mips_base_compression_flags;
1402 if (decl)
1404 /* Nested functions must use the same frame pointer as their
1405 parent and must therefore use the same ISA mode. */
1406 tree parent = decl_function_context (decl);
1407 if (parent)
1408 decl = parent;
1409 force_on = mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1410 if (force_on)
1411 return force_on;
1412 flags &= ~mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1414 return flags;
1417 /* Return the attribute name associated with MASK_MIPS16 and MASK_MICROMIPS
1418 flags FLAGS. */
1420 static const char *
1421 mips_get_compress_on_name (unsigned int flags)
1423 if (flags == MASK_MIPS16)
1424 return "mips16";
1425 return "micromips";
1428 /* Return the attribute name that forbids MASK_MIPS16 and MASK_MICROMIPS
1429 flags FLAGS. */
1431 static const char *
1432 mips_get_compress_off_name (unsigned int flags)
1434 if (flags == MASK_MIPS16)
1435 return "nomips16";
1436 if (flags == MASK_MICROMIPS)
1437 return "nomicromips";
1438 return "nocompression";
1441 /* Implement TARGET_COMP_TYPE_ATTRIBUTES. */
1443 static int
1444 mips_comp_type_attributes (const_tree type1, const_tree type2)
1446 /* Disallow mixed near/far attributes. */
1447 if (mips_far_type_p (type1) && mips_near_type_p (type2))
1448 return 0;
1449 if (mips_near_type_p (type1) && mips_far_type_p (type2))
1450 return 0;
1451 return 1;
1454 /* Implement TARGET_INSERT_ATTRIBUTES. */
1456 static void
1457 mips_insert_attributes (tree decl, tree *attributes)
1459 const char *name;
1460 unsigned int compression_flags, nocompression_flags;
1462 /* Check for "mips16" and "nomips16" attributes. */
1463 compression_flags = mips_get_compress_on_flags (*attributes);
1464 nocompression_flags = mips_get_compress_off_flags (*attributes);
1466 if (TREE_CODE (decl) != FUNCTION_DECL)
1468 if (nocompression_flags)
1469 error ("%qs attribute only applies to functions",
1470 mips_get_compress_off_name (nocompression_flags));
1472 if (compression_flags)
1473 error ("%qs attribute only applies to functions",
1474 mips_get_compress_on_name (nocompression_flags));
1476 else
1478 compression_flags |= mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1479 nocompression_flags |=
1480 mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1482 if (compression_flags && nocompression_flags)
1483 error ("%qE cannot have both %qs and %qs attributes",
1484 DECL_NAME (decl), mips_get_compress_on_name (compression_flags),
1485 mips_get_compress_off_name (nocompression_flags));
1487 if (compression_flags & MASK_MIPS16
1488 && compression_flags & MASK_MICROMIPS)
1489 error ("%qE cannot have both %qs and %qs attributes",
1490 DECL_NAME (decl), "mips16", "micromips");
1492 if (TARGET_FLIP_MIPS16
1493 && !DECL_ARTIFICIAL (decl)
1494 && compression_flags == 0
1495 && nocompression_flags == 0)
1497 /* Implement -mflip-mips16. If DECL has neither a "nomips16" nor a
1498 "mips16" attribute, arbitrarily pick one. We must pick the same
1499 setting for duplicate declarations of a function. */
1500 name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1501 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1502 name = "nomicromips";
1503 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1508 /* Implement TARGET_MERGE_DECL_ATTRIBUTES. */
1510 static tree
1511 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1513 unsigned int diff;
1515 diff = (mips_get_compress_on_flags (DECL_ATTRIBUTES (olddecl))
1516 ^ mips_get_compress_on_flags (DECL_ATTRIBUTES (newdecl)));
1517 if (diff)
1518 error ("%qE redeclared with conflicting %qs attributes",
1519 DECL_NAME (newdecl), mips_get_compress_on_name (diff));
1521 diff = (mips_get_compress_off_flags (DECL_ATTRIBUTES (olddecl))
1522 ^ mips_get_compress_off_flags (DECL_ATTRIBUTES (newdecl)));
1523 if (diff)
1524 error ("%qE redeclared with conflicting %qs attributes",
1525 DECL_NAME (newdecl), mips_get_compress_off_name (diff));
1527 return merge_attributes (DECL_ATTRIBUTES (olddecl),
1528 DECL_ATTRIBUTES (newdecl));
1531 /* Implement TARGET_CAN_INLINE_P. */
1533 static bool
1534 mips_can_inline_p (tree caller, tree callee)
1536 if (mips_get_compress_mode (callee) != mips_get_compress_mode (caller))
1537 return false;
1538 return default_target_can_inline_p (caller, callee);
1541 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1542 and *OFFSET_PTR. Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise. */
1544 static void
1545 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1547 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1549 *base_ptr = XEXP (x, 0);
1550 *offset_ptr = INTVAL (XEXP (x, 1));
1552 else
1554 *base_ptr = x;
1555 *offset_ptr = 0;
1559 static unsigned int mips_build_integer (struct mips_integer_op *,
1560 unsigned HOST_WIDE_INT);
1562 /* A subroutine of mips_build_integer, with the same interface.
1563 Assume that the final action in the sequence should be a left shift. */
1565 static unsigned int
1566 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1568 unsigned int i, shift;
1570 /* Shift VALUE right until its lowest bit is set. Shift arithmetically
1571 since signed numbers are easier to load than unsigned ones. */
1572 shift = 0;
1573 while ((value & 1) == 0)
1574 value /= 2, shift++;
1576 i = mips_build_integer (codes, value);
1577 codes[i].code = ASHIFT;
1578 codes[i].value = shift;
1579 return i + 1;
1582 /* As for mips_build_shift, but assume that the final action will be
1583 an IOR or PLUS operation. */
1585 static unsigned int
1586 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1588 unsigned HOST_WIDE_INT high;
1589 unsigned int i;
1591 high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1592 if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1594 /* The constant is too complex to load with a simple LUI/ORI pair,
1595 so we want to give the recursive call as many trailing zeros as
1596 possible. In this case, we know bit 16 is set and that the
1597 low 16 bits form a negative number. If we subtract that number
1598 from VALUE, we will clear at least the lowest 17 bits, maybe more. */
1599 i = mips_build_integer (codes, CONST_HIGH_PART (value));
1600 codes[i].code = PLUS;
1601 codes[i].value = CONST_LOW_PART (value);
1603 else
1605 /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1606 bits gives a value with at least 17 trailing zeros. */
1607 i = mips_build_integer (codes, high);
1608 codes[i].code = IOR;
1609 codes[i].value = value & 0xffff;
1611 return i + 1;
1614 /* Fill CODES with a sequence of rtl operations to load VALUE.
1615 Return the number of operations needed. */
1617 static unsigned int
1618 mips_build_integer (struct mips_integer_op *codes,
1619 unsigned HOST_WIDE_INT value)
1621 if (SMALL_OPERAND (value)
1622 || SMALL_OPERAND_UNSIGNED (value)
1623 || LUI_OPERAND (value))
1625 /* The value can be loaded with a single instruction. */
1626 codes[0].code = UNKNOWN;
1627 codes[0].value = value;
1628 return 1;
1630 else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1632 /* Either the constant is a simple LUI/ORI combination or its
1633 lowest bit is set. We don't want to shift in this case. */
1634 return mips_build_lower (codes, value);
1636 else if ((value & 0xffff) == 0)
1638 /* The constant will need at least three actions. The lowest
1639 16 bits are clear, so the final action will be a shift. */
1640 return mips_build_shift (codes, value);
1642 else
1644 /* The final action could be a shift, add or inclusive OR.
1645 Rather than use a complex condition to select the best
1646 approach, try both mips_build_shift and mips_build_lower
1647 and pick the one that gives the shortest sequence.
1648 Note that this case is only used once per constant. */
1649 struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1650 unsigned int cost, alt_cost;
1652 cost = mips_build_shift (codes, value);
1653 alt_cost = mips_build_lower (alt_codes, value);
1654 if (alt_cost < cost)
1656 memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1657 cost = alt_cost;
1659 return cost;
1663 /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
1665 static bool
1666 mips_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1668 return mips_const_insns (x) > 0;
1671 /* Return a SYMBOL_REF for a MIPS16 function called NAME. */
1673 static rtx
1674 mips16_stub_function (const char *name)
1676 rtx x;
1678 x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
1679 SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
1680 return x;
1683 /* Return a legitimate call address for STUB, given that STUB is a MIPS16
1684 support function. */
1686 static rtx
1687 mips16_stub_call_address (mips_one_only_stub *stub)
1689 rtx fn = mips16_stub_function (stub->get_name ());
1690 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_LOCAL;
1691 if (!call_insn_operand (fn, VOIDmode))
1692 fn = force_reg (Pmode, fn);
1693 return fn;
1696 /* A stub for moving the thread pointer into TLS_GET_TP_REGNUM. */
1698 class mips16_rdhwr_one_only_stub : public mips_one_only_stub
1700 virtual const char *get_name ();
1701 virtual void output_body ();
1704 const char *
1705 mips16_rdhwr_one_only_stub::get_name ()
1707 return "__mips16_rdhwr";
1710 void
1711 mips16_rdhwr_one_only_stub::output_body ()
1713 fprintf (asm_out_file,
1714 "\t.set\tpush\n"
1715 "\t.set\tmips32r2\n"
1716 "\t.set\tnoreorder\n"
1717 "\trdhwr\t$3,$29\n"
1718 "\t.set\tpop\n"
1719 "\tj\t$31\n");
1722 /* A stub for moving the FCSR into GET_FCSR_REGNUM. */
1723 class mips16_get_fcsr_one_only_stub : public mips_one_only_stub
1725 virtual const char *get_name ();
1726 virtual void output_body ();
1729 const char *
1730 mips16_get_fcsr_one_only_stub::get_name ()
1732 return "__mips16_get_fcsr";
1735 void
1736 mips16_get_fcsr_one_only_stub::output_body ()
1738 fprintf (asm_out_file,
1739 "\tcfc1\t%s,$31\n"
1740 "\tj\t$31\n", reg_names[GET_FCSR_REGNUM]);
1743 /* A stub for moving SET_FCSR_REGNUM into the FCSR. */
1744 class mips16_set_fcsr_one_only_stub : public mips_one_only_stub
1746 virtual const char *get_name ();
1747 virtual void output_body ();
1750 const char *
1751 mips16_set_fcsr_one_only_stub::get_name ()
1753 return "__mips16_set_fcsr";
1756 void
1757 mips16_set_fcsr_one_only_stub::output_body ()
1759 fprintf (asm_out_file,
1760 "\tctc1\t%s,$31\n"
1761 "\tj\t$31\n", reg_names[SET_FCSR_REGNUM]);
1764 /* Return true if symbols of type TYPE require a GOT access. */
1766 static bool
1767 mips_got_symbol_type_p (enum mips_symbol_type type)
1769 switch (type)
1771 case SYMBOL_GOT_PAGE_OFST:
1772 case SYMBOL_GOT_DISP:
1773 return true;
1775 default:
1776 return false;
1780 /* Return true if X is a thread-local symbol. */
1782 static bool
1783 mips_tls_symbol_p (rtx x)
1785 return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1788 /* Return true if SYMBOL_REF X is associated with a global symbol
1789 (in the STB_GLOBAL sense). */
1791 static bool
1792 mips_global_symbol_p (const_rtx x)
1794 const_tree decl = SYMBOL_REF_DECL (x);
1796 if (!decl)
1797 return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1799 /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1800 or weak symbols. Relocations in the object file will be against
1801 the target symbol, so it's that symbol's binding that matters here. */
1802 return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1805 /* Return true if function X is a libgcc MIPS16 stub function. */
1807 static bool
1808 mips16_stub_function_p (const_rtx x)
1810 return (GET_CODE (x) == SYMBOL_REF
1811 && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1814 /* Return true if function X is a locally-defined and locally-binding
1815 MIPS16 function. */
1817 static bool
1818 mips16_local_function_p (const_rtx x)
1820 return (GET_CODE (x) == SYMBOL_REF
1821 && SYMBOL_REF_LOCAL_P (x)
1822 && !SYMBOL_REF_EXTERNAL_P (x)
1823 && (mips_get_compress_mode (SYMBOL_REF_DECL (x)) & MASK_MIPS16));
1826 /* Return true if SYMBOL_REF X binds locally. */
1828 static bool
1829 mips_symbol_binds_local_p (const_rtx x)
1831 return (SYMBOL_REF_DECL (x)
1832 ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1833 : SYMBOL_REF_LOCAL_P (x));
1836 /* Return true if rtx constants of mode MODE should be put into a small
1837 data section. */
1839 static bool
1840 mips_rtx_constant_in_small_data_p (machine_mode mode)
1842 return (!TARGET_EMBEDDED_DATA
1843 && TARGET_LOCAL_SDATA
1844 && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1847 /* Return true if X should not be moved directly into register $25.
1848 We need this because many versions of GAS will treat "la $25,foo" as
1849 part of a call sequence and so allow a global "foo" to be lazily bound. */
1851 bool
1852 mips_dangerous_for_la25_p (rtx x)
1854 return (!TARGET_EXPLICIT_RELOCS
1855 && TARGET_USE_GOT
1856 && GET_CODE (x) == SYMBOL_REF
1857 && mips_global_symbol_p (x));
1860 /* Return true if calls to X might need $25 to be valid on entry. */
1862 bool
1863 mips_use_pic_fn_addr_reg_p (const_rtx x)
1865 if (!TARGET_USE_PIC_FN_ADDR_REG)
1866 return false;
1868 /* MIPS16 stub functions are guaranteed not to use $25. */
1869 if (mips16_stub_function_p (x))
1870 return false;
1872 if (GET_CODE (x) == SYMBOL_REF)
1874 /* If PLTs and copy relocations are available, the static linker
1875 will make sure that $25 is valid on entry to the target function. */
1876 if (TARGET_ABICALLS_PIC0)
1877 return false;
1879 /* Locally-defined functions use absolute accesses to set up
1880 the global pointer. */
1881 if (TARGET_ABSOLUTE_ABICALLS
1882 && mips_symbol_binds_local_p (x)
1883 && !SYMBOL_REF_EXTERNAL_P (x))
1884 return false;
1887 return true;
1890 /* Return the method that should be used to access SYMBOL_REF or
1891 LABEL_REF X in context CONTEXT. */
1893 static enum mips_symbol_type
1894 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1896 if (TARGET_RTP_PIC)
1897 return SYMBOL_GOT_DISP;
1899 if (GET_CODE (x) == LABEL_REF)
1901 /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1902 code and if we know that the label is in the current function's
1903 text section. LABEL_REFs are used for jump tables as well as
1904 text labels, so we must check whether jump tables live in the
1905 text section. */
1906 if (TARGET_MIPS16_SHORT_JUMP_TABLES
1907 && !LABEL_REF_NONLOCAL_P (x))
1908 return SYMBOL_PC_RELATIVE;
1910 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1911 return SYMBOL_GOT_PAGE_OFST;
1913 return SYMBOL_ABSOLUTE;
1916 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1918 if (SYMBOL_REF_TLS_MODEL (x))
1919 return SYMBOL_TLS;
1921 if (CONSTANT_POOL_ADDRESS_P (x))
1923 if (TARGET_MIPS16_TEXT_LOADS)
1924 return SYMBOL_PC_RELATIVE;
1926 if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1927 return SYMBOL_PC_RELATIVE;
1929 if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1930 return SYMBOL_GP_RELATIVE;
1933 /* Do not use small-data accesses for weak symbols; they may end up
1934 being zero. */
1935 if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1936 return SYMBOL_GP_RELATIVE;
1938 /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1939 is in effect. */
1940 if (TARGET_ABICALLS_PIC2
1941 && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1943 /* There are three cases to consider:
1945 - o32 PIC (either with or without explicit relocs)
1946 - n32/n64 PIC without explicit relocs
1947 - n32/n64 PIC with explicit relocs
1949 In the first case, both local and global accesses will use an
1950 R_MIPS_GOT16 relocation. We must correctly predict which of
1951 the two semantics (local or global) the assembler and linker
1952 will apply. The choice depends on the symbol's binding rather
1953 than its visibility.
1955 In the second case, the assembler will not use R_MIPS_GOT16
1956 relocations, but it chooses between local and global accesses
1957 in the same way as for o32 PIC.
1959 In the third case we have more freedom since both forms of
1960 access will work for any kind of symbol. However, there seems
1961 little point in doing things differently. */
1962 if (mips_global_symbol_p (x))
1963 return SYMBOL_GOT_DISP;
1965 return SYMBOL_GOT_PAGE_OFST;
1968 return SYMBOL_ABSOLUTE;
1971 /* Classify the base of symbolic expression X, given that X appears in
1972 context CONTEXT. */
1974 static enum mips_symbol_type
1975 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1977 rtx offset;
1979 split_const (x, &x, &offset);
1980 if (UNSPEC_ADDRESS_P (x))
1981 return UNSPEC_ADDRESS_TYPE (x);
1983 return mips_classify_symbol (x, context);
1986 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1987 is the alignment in bytes of SYMBOL_REF X. */
1989 static bool
1990 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1992 HOST_WIDE_INT align;
1994 align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1995 return IN_RANGE (offset, 0, align - 1);
1998 /* Return true if X is a symbolic constant that can be used in context
1999 CONTEXT. If it is, store the type of the symbol in *SYMBOL_TYPE. */
2001 bool
2002 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
2003 enum mips_symbol_type *symbol_type)
2005 rtx offset;
2007 split_const (x, &x, &offset);
2008 if (UNSPEC_ADDRESS_P (x))
2010 *symbol_type = UNSPEC_ADDRESS_TYPE (x);
2011 x = UNSPEC_ADDRESS (x);
2013 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
2015 *symbol_type = mips_classify_symbol (x, context);
2016 if (*symbol_type == SYMBOL_TLS)
2017 return false;
2019 else
2020 return false;
2022 if (offset == const0_rtx)
2023 return true;
2025 /* Check whether a nonzero offset is valid for the underlying
2026 relocations. */
2027 switch (*symbol_type)
2029 case SYMBOL_ABSOLUTE:
2030 case SYMBOL_64_HIGH:
2031 case SYMBOL_64_MID:
2032 case SYMBOL_64_LOW:
2033 /* If the target has 64-bit pointers and the object file only
2034 supports 32-bit symbols, the values of those symbols will be
2035 sign-extended. In this case we can't allow an arbitrary offset
2036 in case the 32-bit value X + OFFSET has a different sign from X. */
2037 if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
2038 return offset_within_block_p (x, INTVAL (offset));
2040 /* In other cases the relocations can handle any offset. */
2041 return true;
2043 case SYMBOL_PC_RELATIVE:
2044 /* Allow constant pool references to be converted to LABEL+CONSTANT.
2045 In this case, we no longer have access to the underlying constant,
2046 but the original symbol-based access was known to be valid. */
2047 if (GET_CODE (x) == LABEL_REF)
2048 return true;
2050 /* Fall through. */
2052 case SYMBOL_GP_RELATIVE:
2053 /* Make sure that the offset refers to something within the
2054 same object block. This should guarantee that the final
2055 PC- or GP-relative offset is within the 16-bit limit. */
2056 return offset_within_block_p (x, INTVAL (offset));
2058 case SYMBOL_GOT_PAGE_OFST:
2059 case SYMBOL_GOTOFF_PAGE:
2060 /* If the symbol is global, the GOT entry will contain the symbol's
2061 address, and we will apply a 16-bit offset after loading it.
2062 If the symbol is local, the linker should provide enough local
2063 GOT entries for a 16-bit offset, but larger offsets may lead
2064 to GOT overflow. */
2065 return SMALL_INT (offset);
2067 case SYMBOL_TPREL:
2068 case SYMBOL_DTPREL:
2069 /* There is no carry between the HI and LO REL relocations, so the
2070 offset is only valid if we know it won't lead to such a carry. */
2071 return mips_offset_within_alignment_p (x, INTVAL (offset));
2073 case SYMBOL_GOT_DISP:
2074 case SYMBOL_GOTOFF_DISP:
2075 case SYMBOL_GOTOFF_CALL:
2076 case SYMBOL_GOTOFF_LOADGP:
2077 case SYMBOL_TLSGD:
2078 case SYMBOL_TLSLDM:
2079 case SYMBOL_GOTTPREL:
2080 case SYMBOL_TLS:
2081 case SYMBOL_HALF:
2082 return false;
2084 gcc_unreachable ();
2087 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
2088 single instruction. We rely on the fact that, in the worst case,
2089 all instructions involved in a MIPS16 address calculation are usually
2090 extended ones. */
2092 static int
2093 mips_symbol_insns_1 (enum mips_symbol_type type, machine_mode mode)
2095 if (mips_use_pcrel_pool_p[(int) type])
2097 if (mode == MAX_MACHINE_MODE)
2098 /* LEAs will be converted into constant-pool references by
2099 mips_reorg. */
2100 type = SYMBOL_PC_RELATIVE;
2101 else
2102 /* The constant must be loaded and then dereferenced. */
2103 return 0;
2106 switch (type)
2108 case SYMBOL_ABSOLUTE:
2109 /* When using 64-bit symbols, we need 5 preparatory instructions,
2110 such as:
2112 lui $at,%highest(symbol)
2113 daddiu $at,$at,%higher(symbol)
2114 dsll $at,$at,16
2115 daddiu $at,$at,%hi(symbol)
2116 dsll $at,$at,16
2118 The final address is then $at + %lo(symbol). With 32-bit
2119 symbols we just need a preparatory LUI for normal mode and
2120 a preparatory LI and SLL for MIPS16. */
2121 return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
2123 case SYMBOL_GP_RELATIVE:
2124 /* Treat GP-relative accesses as taking a single instruction on
2125 MIPS16 too; the copy of $gp can often be shared. */
2126 return 1;
2128 case SYMBOL_PC_RELATIVE:
2129 /* PC-relative constants can be only be used with ADDIUPC,
2130 DADDIUPC, LWPC and LDPC. */
2131 if (mode == MAX_MACHINE_MODE
2132 || GET_MODE_SIZE (mode) == 4
2133 || GET_MODE_SIZE (mode) == 8)
2134 return 1;
2136 /* The constant must be loaded using ADDIUPC or DADDIUPC first. */
2137 return 0;
2139 case SYMBOL_GOT_DISP:
2140 /* The constant will have to be loaded from the GOT before it
2141 is used in an address. */
2142 if (mode != MAX_MACHINE_MODE)
2143 return 0;
2145 /* Fall through. */
2147 case SYMBOL_GOT_PAGE_OFST:
2148 /* Unless -funit-at-a-time is in effect, we can't be sure whether the
2149 local/global classification is accurate. The worst cases are:
2151 (1) For local symbols when generating o32 or o64 code. The assembler
2152 will use:
2154 lw $at,%got(symbol)
2157 ...and the final address will be $at + %lo(symbol).
2159 (2) For global symbols when -mxgot. The assembler will use:
2161 lui $at,%got_hi(symbol)
2162 (d)addu $at,$at,$gp
2164 ...and the final address will be $at + %got_lo(symbol). */
2165 return 3;
2167 case SYMBOL_GOTOFF_PAGE:
2168 case SYMBOL_GOTOFF_DISP:
2169 case SYMBOL_GOTOFF_CALL:
2170 case SYMBOL_GOTOFF_LOADGP:
2171 case SYMBOL_64_HIGH:
2172 case SYMBOL_64_MID:
2173 case SYMBOL_64_LOW:
2174 case SYMBOL_TLSGD:
2175 case SYMBOL_TLSLDM:
2176 case SYMBOL_DTPREL:
2177 case SYMBOL_GOTTPREL:
2178 case SYMBOL_TPREL:
2179 case SYMBOL_HALF:
2180 /* A 16-bit constant formed by a single relocation, or a 32-bit
2181 constant formed from a high 16-bit relocation and a low 16-bit
2182 relocation. Use mips_split_p to determine which. 32-bit
2183 constants need an "lui; addiu" sequence for normal mode and
2184 an "li; sll; addiu" sequence for MIPS16 mode. */
2185 return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
2187 case SYMBOL_TLS:
2188 /* We don't treat a bare TLS symbol as a constant. */
2189 return 0;
2191 gcc_unreachable ();
2194 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
2195 to load symbols of type TYPE into a register. Return 0 if the given
2196 type of symbol cannot be used as an immediate operand.
2198 Otherwise, return the number of instructions needed to load or store
2199 values of mode MODE to or from addresses of type TYPE. Return 0 if
2200 the given type of symbol is not valid in addresses.
2202 In both cases, instruction counts are based off BASE_INSN_LENGTH. */
2204 static int
2205 mips_symbol_insns (enum mips_symbol_type type, machine_mode mode)
2207 return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
2210 /* Implement TARGET_CANNOT_FORCE_CONST_MEM. */
2212 static bool
2213 mips_cannot_force_const_mem (machine_mode mode, rtx x)
2215 enum mips_symbol_type type;
2216 rtx base, offset;
2218 /* There is no assembler syntax for expressing an address-sized
2219 high part. */
2220 if (GET_CODE (x) == HIGH)
2221 return true;
2223 /* As an optimization, reject constants that mips_legitimize_move
2224 can expand inline.
2226 Suppose we have a multi-instruction sequence that loads constant C
2227 into register R. If R does not get allocated a hard register, and
2228 R is used in an operand that allows both registers and memory
2229 references, reload will consider forcing C into memory and using
2230 one of the instruction's memory alternatives. Returning false
2231 here will force it to use an input reload instead. */
2232 if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x))
2233 return true;
2235 split_const (x, &base, &offset);
2236 if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type))
2238 /* See whether we explicitly want these symbols in the pool. */
2239 if (mips_use_pcrel_pool_p[(int) type])
2240 return false;
2242 /* The same optimization as for CONST_INT. */
2243 if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
2244 return true;
2246 /* If MIPS16 constant pools live in the text section, they should
2247 not refer to anything that might need run-time relocation. */
2248 if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2249 return true;
2252 /* TLS symbols must be computed by mips_legitimize_move. */
2253 if (tls_referenced_p (x))
2254 return true;
2256 return false;
2259 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. We can't use blocks for
2260 constants when we're using a per-function constant pool. */
2262 static bool
2263 mips_use_blocks_for_constant_p (machine_mode mode ATTRIBUTE_UNUSED,
2264 const_rtx x ATTRIBUTE_UNUSED)
2266 return !TARGET_MIPS16_PCREL_LOADS;
2269 /* Return true if register REGNO is a valid base register for mode MODE.
2270 STRICT_P is true if REG_OK_STRICT is in effect. */
2273 mips_regno_mode_ok_for_base_p (int regno, machine_mode mode,
2274 bool strict_p)
2276 if (!HARD_REGISTER_NUM_P (regno))
2278 if (!strict_p)
2279 return true;
2280 regno = reg_renumber[regno];
2283 /* These fake registers will be eliminated to either the stack or
2284 hard frame pointer, both of which are usually valid base registers.
2285 Reload deals with the cases where the eliminated form isn't valid. */
2286 if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2287 return true;
2289 /* In MIPS16 mode, the stack pointer can only address word and doubleword
2290 values, nothing smaller. */
2291 if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2292 return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2294 return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2297 /* Return true if X is a valid base register for mode MODE.
2298 STRICT_P is true if REG_OK_STRICT is in effect. */
2300 static bool
2301 mips_valid_base_register_p (rtx x, machine_mode mode, bool strict_p)
2303 if (!strict_p && GET_CODE (x) == SUBREG)
2304 x = SUBREG_REG (x);
2306 return (REG_P (x)
2307 && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2310 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2311 can address a value of mode MODE. */
2313 static bool
2314 mips_valid_offset_p (rtx x, machine_mode mode)
2316 /* Check that X is a signed 16-bit number. */
2317 if (!const_arith_operand (x, Pmode))
2318 return false;
2320 /* We may need to split multiword moves, so make sure that every word
2321 is accessible. */
2322 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2323 && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2324 return false;
2326 return true;
2329 /* Return true if a LO_SUM can address a value of mode MODE when the
2330 LO_SUM symbol has type SYMBOL_TYPE. */
2332 static bool
2333 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, machine_mode mode)
2335 /* Check that symbols of type SYMBOL_TYPE can be used to access values
2336 of mode MODE. */
2337 if (mips_symbol_insns (symbol_type, mode) == 0)
2338 return false;
2340 /* Check that there is a known low-part relocation. */
2341 if (mips_lo_relocs[symbol_type] == NULL)
2342 return false;
2344 /* We may need to split multiword moves, so make sure that each word
2345 can be accessed without inducing a carry. This is mainly needed
2346 for o64, which has historically only guaranteed 64-bit alignment
2347 for 128-bit types. */
2348 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2349 && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2350 return false;
2352 return true;
2355 /* Return true if X is a valid address for machine mode MODE. If it is,
2356 fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in
2357 effect. */
2359 static bool
2360 mips_classify_address (struct mips_address_info *info, rtx x,
2361 machine_mode mode, bool strict_p)
2363 switch (GET_CODE (x))
2365 case REG:
2366 case SUBREG:
2367 info->type = ADDRESS_REG;
2368 info->reg = x;
2369 info->offset = const0_rtx;
2370 return mips_valid_base_register_p (info->reg, mode, strict_p);
2372 case PLUS:
2373 info->type = ADDRESS_REG;
2374 info->reg = XEXP (x, 0);
2375 info->offset = XEXP (x, 1);
2376 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2377 && mips_valid_offset_p (info->offset, mode));
2379 case LO_SUM:
2380 info->type = ADDRESS_LO_SUM;
2381 info->reg = XEXP (x, 0);
2382 info->offset = XEXP (x, 1);
2383 /* We have to trust the creator of the LO_SUM to do something vaguely
2384 sane. Target-independent code that creates a LO_SUM should also
2385 create and verify the matching HIGH. Target-independent code that
2386 adds an offset to a LO_SUM must prove that the offset will not
2387 induce a carry. Failure to do either of these things would be
2388 a bug, and we are not required to check for it here. The MIPS
2389 backend itself should only create LO_SUMs for valid symbolic
2390 constants, with the high part being either a HIGH or a copy
2391 of _gp. */
2392 info->symbol_type
2393 = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2394 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2395 && mips_valid_lo_sum_p (info->symbol_type, mode));
2397 case CONST_INT:
2398 /* Small-integer addresses don't occur very often, but they
2399 are legitimate if $0 is a valid base register. */
2400 info->type = ADDRESS_CONST_INT;
2401 return !TARGET_MIPS16 && SMALL_INT (x);
2403 case CONST:
2404 case LABEL_REF:
2405 case SYMBOL_REF:
2406 info->type = ADDRESS_SYMBOLIC;
2407 return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2408 &info->symbol_type)
2409 && mips_symbol_insns (info->symbol_type, mode) > 0
2410 && !mips_split_p[info->symbol_type]);
2412 default:
2413 return false;
2417 /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
2419 static bool
2420 mips_legitimate_address_p (machine_mode mode, rtx x, bool strict_p)
2422 struct mips_address_info addr;
2424 return mips_classify_address (&addr, x, mode, strict_p);
2427 /* Return true if X is a legitimate $sp-based address for mode MDOE. */
2429 bool
2430 mips_stack_address_p (rtx x, machine_mode mode)
2432 struct mips_address_info addr;
2434 return (mips_classify_address (&addr, x, mode, false)
2435 && addr.type == ADDRESS_REG
2436 && addr.reg == stack_pointer_rtx);
2439 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2440 address instruction. Note that such addresses are not considered
2441 legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2442 is so restricted. */
2444 static bool
2445 mips_lwxs_address_p (rtx addr)
2447 if (ISA_HAS_LWXS
2448 && GET_CODE (addr) == PLUS
2449 && REG_P (XEXP (addr, 1)))
2451 rtx offset = XEXP (addr, 0);
2452 if (GET_CODE (offset) == MULT
2453 && REG_P (XEXP (offset, 0))
2454 && CONST_INT_P (XEXP (offset, 1))
2455 && INTVAL (XEXP (offset, 1)) == 4)
2456 return true;
2458 return false;
2461 /* Return true if ADDR matches the pattern for the L{B,H,W,D}{,U}X load
2462 indexed address instruction. Note that such addresses are
2463 not considered legitimate in the TARGET_LEGITIMATE_ADDRESS_P
2464 sense, because their use is so restricted. */
2466 static bool
2467 mips_lx_address_p (rtx addr, machine_mode mode)
2469 if (GET_CODE (addr) != PLUS
2470 || !REG_P (XEXP (addr, 0))
2471 || !REG_P (XEXP (addr, 1)))
2472 return false;
2473 if (ISA_HAS_LBX && mode == QImode)
2474 return true;
2475 if (ISA_HAS_LHX && mode == HImode)
2476 return true;
2477 if (ISA_HAS_LWX && mode == SImode)
2478 return true;
2479 if (ISA_HAS_LDX && mode == DImode)
2480 return true;
2481 return false;
2484 /* Return true if a value at OFFSET bytes from base register BASE can be
2485 accessed using an unextended MIPS16 instruction. MODE is the mode of
2486 the value.
2488 Usually the offset in an unextended instruction is a 5-bit field.
2489 The offset is unsigned and shifted left once for LH and SH, twice
2490 for LW and SW, and so on. An exception is LWSP and SWSP, which have
2491 an 8-bit immediate field that's shifted left twice. */
2493 static bool
2494 mips16_unextended_reference_p (machine_mode mode, rtx base,
2495 unsigned HOST_WIDE_INT offset)
2497 if (mode != BLKmode && offset % GET_MODE_SIZE (mode) == 0)
2499 if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2500 return offset < 256U * GET_MODE_SIZE (mode);
2501 return offset < 32U * GET_MODE_SIZE (mode);
2503 return false;
2506 /* Return the number of instructions needed to load or store a value
2507 of mode MODE at address X, assuming that BASE_INSN_LENGTH is the
2508 length of one instruction. Return 0 if X isn't valid for MODE.
2509 Assume that multiword moves may need to be split into word moves
2510 if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2511 enough. */
2514 mips_address_insns (rtx x, machine_mode mode, bool might_split_p)
2516 struct mips_address_info addr;
2517 int factor;
2519 /* BLKmode is used for single unaligned loads and stores and should
2520 not count as a multiword mode. (GET_MODE_SIZE (BLKmode) is pretty
2521 meaningless, so we have to single it out as a special case one way
2522 or the other.) */
2523 if (mode != BLKmode && might_split_p)
2524 factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2525 else
2526 factor = 1;
2528 if (mips_classify_address (&addr, x, mode, false))
2529 switch (addr.type)
2531 case ADDRESS_REG:
2532 if (TARGET_MIPS16
2533 && !mips16_unextended_reference_p (mode, addr.reg,
2534 UINTVAL (addr.offset)))
2535 return factor * 2;
2536 return factor;
2538 case ADDRESS_LO_SUM:
2539 return TARGET_MIPS16 ? factor * 2 : factor;
2541 case ADDRESS_CONST_INT:
2542 return factor;
2544 case ADDRESS_SYMBOLIC:
2545 return factor * mips_symbol_insns (addr.symbol_type, mode);
2547 return 0;
2550 /* Return true if X fits within an unsigned field of BITS bits that is
2551 shifted left SHIFT bits before being used. */
2553 bool
2554 mips_unsigned_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2556 return (x & ((1 << shift) - 1)) == 0 && x < ((unsigned) 1 << (shift + bits));
2559 /* Return true if X fits within a signed field of BITS bits that is
2560 shifted left SHIFT bits before being used. */
2562 bool
2563 mips_signed_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2565 x += 1 << (bits + shift - 1);
2566 return mips_unsigned_immediate_p (x, bits, shift);
2569 /* Return true if X is legitimate for accessing values of mode MODE,
2570 if it is based on a MIPS16 register, and if the offset satisfies
2571 OFFSET_PREDICATE. */
2573 bool
2574 m16_based_address_p (rtx x, machine_mode mode,
2575 insn_operand_predicate_fn offset_predicate)
2577 struct mips_address_info addr;
2579 return (mips_classify_address (&addr, x, mode, false)
2580 && addr.type == ADDRESS_REG
2581 && M16_REG_P (REGNO (addr.reg))
2582 && offset_predicate (addr.offset, mode));
2585 /* Return true if X is a legitimate address that conforms to the requirements
2586 for a microMIPS LWSP or SWSP insn. */
2588 bool
2589 lwsp_swsp_address_p (rtx x, machine_mode mode)
2591 struct mips_address_info addr;
2593 return (mips_classify_address (&addr, x, mode, false)
2594 && addr.type == ADDRESS_REG
2595 && REGNO (addr.reg) == STACK_POINTER_REGNUM
2596 && uw5_operand (addr.offset, mode));
2599 /* Return true if X is a legitimate address with a 12-bit offset.
2600 MODE is the mode of the value being accessed. */
2602 bool
2603 umips_12bit_offset_address_p (rtx x, machine_mode mode)
2605 struct mips_address_info addr;
2607 return (mips_classify_address (&addr, x, mode, false)
2608 && addr.type == ADDRESS_REG
2609 && CONST_INT_P (addr.offset)
2610 && UMIPS_12BIT_OFFSET_P (INTVAL (addr.offset)));
2613 /* Return true if X is a legitimate address with a 9-bit offset.
2614 MODE is the mode of the value being accessed. */
2616 bool
2617 mips_9bit_offset_address_p (rtx x, machine_mode mode)
2619 struct mips_address_info addr;
2621 return (mips_classify_address (&addr, x, mode, false)
2622 && addr.type == ADDRESS_REG
2623 && CONST_INT_P (addr.offset)
2624 && MIPS_9BIT_OFFSET_P (INTVAL (addr.offset)));
2627 /* Return the number of instructions needed to load constant X,
2628 assuming that BASE_INSN_LENGTH is the length of one instruction.
2629 Return 0 if X isn't a valid constant. */
2632 mips_const_insns (rtx x)
2634 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2635 enum mips_symbol_type symbol_type;
2636 rtx offset;
2638 switch (GET_CODE (x))
2640 case HIGH:
2641 if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2642 &symbol_type)
2643 || !mips_split_p[symbol_type])
2644 return 0;
2646 /* This is simply an LUI for normal mode. It is an extended
2647 LI followed by an extended SLL for MIPS16. */
2648 return TARGET_MIPS16 ? 4 : 1;
2650 case CONST_INT:
2651 if (TARGET_MIPS16)
2652 /* Unsigned 8-bit constants can be loaded using an unextended
2653 LI instruction. Unsigned 16-bit constants can be loaded
2654 using an extended LI. Negative constants must be loaded
2655 using LI and then negated. */
2656 return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2657 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2658 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2659 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2660 : 0);
2662 return mips_build_integer (codes, INTVAL (x));
2664 case CONST_DOUBLE:
2665 case CONST_VECTOR:
2666 /* Allow zeros for normal mode, where we can use $0. */
2667 return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2669 case CONST:
2670 if (CONST_GP_P (x))
2671 return 1;
2673 /* See if we can refer to X directly. */
2674 if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2675 return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2677 /* Otherwise try splitting the constant into a base and offset.
2678 If the offset is a 16-bit value, we can load the base address
2679 into a register and then use (D)ADDIU to add in the offset.
2680 If the offset is larger, we can load the base and offset
2681 into separate registers and add them together with (D)ADDU.
2682 However, the latter is only possible before reload; during
2683 and after reload, we must have the option of forcing the
2684 constant into the pool instead. */
2685 split_const (x, &x, &offset);
2686 if (offset != 0)
2688 int n = mips_const_insns (x);
2689 if (n != 0)
2691 if (SMALL_INT (offset))
2692 return n + 1;
2693 else if (!targetm.cannot_force_const_mem (GET_MODE (x), x))
2694 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2697 return 0;
2699 case SYMBOL_REF:
2700 case LABEL_REF:
2701 return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2702 MAX_MACHINE_MODE);
2704 default:
2705 return 0;
2709 /* X is a doubleword constant that can be handled by splitting it into
2710 two words and loading each word separately. Return the number of
2711 instructions required to do this, assuming that BASE_INSN_LENGTH
2712 is the length of one instruction. */
2715 mips_split_const_insns (rtx x)
2717 unsigned int low, high;
2719 low = mips_const_insns (mips_subword (x, false));
2720 high = mips_const_insns (mips_subword (x, true));
2721 gcc_assert (low > 0 && high > 0);
2722 return low + high;
2725 /* Return the number of instructions needed to implement INSN,
2726 given that it loads from or stores to MEM. Assume that
2727 BASE_INSN_LENGTH is the length of one instruction. */
2730 mips_load_store_insns (rtx mem, rtx_insn *insn)
2732 machine_mode mode;
2733 bool might_split_p;
2734 rtx set;
2736 gcc_assert (MEM_P (mem));
2737 mode = GET_MODE (mem);
2739 /* Try to prove that INSN does not need to be split. */
2740 might_split_p = GET_MODE_SIZE (mode) > UNITS_PER_WORD;
2741 if (might_split_p)
2743 set = single_set (insn);
2744 if (set && !mips_split_move_insn_p (SET_DEST (set), SET_SRC (set), insn))
2745 might_split_p = false;
2748 return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2751 /* Return the number of instructions needed for an integer division,
2752 assuming that BASE_INSN_LENGTH is the length of one instruction. */
2755 mips_idiv_insns (void)
2757 int count;
2759 count = 1;
2760 if (TARGET_CHECK_ZERO_DIV)
2762 if (GENERATE_DIVIDE_TRAPS)
2763 count++;
2764 else
2765 count += 2;
2768 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2769 count++;
2770 return count;
2773 /* Emit a move from SRC to DEST. Assume that the move expanders can
2774 handle all moves if !can_create_pseudo_p (). The distinction is
2775 important because, unlike emit_move_insn, the move expanders know
2776 how to force Pmode objects into the constant pool even when the
2777 constant pool address is not itself legitimate. */
2779 rtx_insn *
2780 mips_emit_move (rtx dest, rtx src)
2782 return (can_create_pseudo_p ()
2783 ? emit_move_insn (dest, src)
2784 : emit_move_insn_1 (dest, src));
2787 /* Emit a move from SRC to DEST, splitting compound moves into individual
2788 instructions. SPLIT_TYPE is the type of split to perform. */
2790 static void
2791 mips_emit_move_or_split (rtx dest, rtx src, enum mips_split_type split_type)
2793 if (mips_split_move_p (dest, src, split_type))
2794 mips_split_move (dest, src, split_type);
2795 else
2796 mips_emit_move (dest, src);
2799 /* Emit an instruction of the form (set TARGET (CODE OP0)). */
2801 static void
2802 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2804 emit_insn (gen_rtx_SET (target, gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2807 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2808 Return that new register. */
2810 static rtx
2811 mips_force_unary (machine_mode mode, enum rtx_code code, rtx op0)
2813 rtx reg;
2815 reg = gen_reg_rtx (mode);
2816 mips_emit_unary (code, reg, op0);
2817 return reg;
2820 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)). */
2822 void
2823 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2825 emit_insn (gen_rtx_SET (target, gen_rtx_fmt_ee (code, GET_MODE (target),
2826 op0, op1)));
2829 /* Compute (CODE OP0 OP1) and store the result in a new register
2830 of mode MODE. Return that new register. */
2832 static rtx
2833 mips_force_binary (machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2835 rtx reg;
2837 reg = gen_reg_rtx (mode);
2838 mips_emit_binary (code, reg, op0, op1);
2839 return reg;
2842 /* Copy VALUE to a register and return that register. If new pseudos
2843 are allowed, copy it into a new register, otherwise use DEST. */
2845 static rtx
2846 mips_force_temporary (rtx dest, rtx value)
2848 if (can_create_pseudo_p ())
2849 return force_reg (Pmode, value);
2850 else
2852 mips_emit_move (dest, value);
2853 return dest;
2857 /* Emit a call sequence with call pattern PATTERN and return the call
2858 instruction itself (which is not necessarily the last instruction
2859 emitted). ORIG_ADDR is the original, unlegitimized address,
2860 ADDR is the legitimized form, and LAZY_P is true if the call
2861 address is lazily-bound. */
2863 static rtx_insn *
2864 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2866 rtx_insn *insn;
2867 rtx reg;
2869 insn = emit_call_insn (pattern);
2871 if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2873 /* MIPS16 JALRs only take MIPS16 registers. If the target
2874 function requires $25 to be valid on entry, we must copy it
2875 there separately. The move instruction can be put in the
2876 call's delay slot. */
2877 reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2878 emit_insn_before (gen_move_insn (reg, addr), insn);
2879 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2882 if (lazy_p)
2883 /* Lazy-binding stubs require $gp to be valid on entry. */
2884 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2886 if (TARGET_USE_GOT)
2888 /* See the comment above load_call<mode> for details. */
2889 use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2890 gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2891 emit_insn (gen_update_got_version ());
2894 if (TARGET_MIPS16
2895 && TARGET_EXPLICIT_RELOCS
2896 && TARGET_CALL_CLOBBERED_GP)
2898 rtx post_call_tmp_reg = gen_rtx_REG (word_mode, POST_CALL_TMP_REG);
2899 clobber_reg (&CALL_INSN_FUNCTION_USAGE (insn), post_call_tmp_reg);
2902 return insn;
2905 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2906 then add CONST_INT OFFSET to the result. */
2908 static rtx
2909 mips_unspec_address_offset (rtx base, rtx offset,
2910 enum mips_symbol_type symbol_type)
2912 base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2913 UNSPEC_ADDRESS_FIRST + symbol_type);
2914 if (offset != const0_rtx)
2915 base = gen_rtx_PLUS (Pmode, base, offset);
2916 return gen_rtx_CONST (Pmode, base);
2919 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2920 type SYMBOL_TYPE. */
2923 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2925 rtx base, offset;
2927 split_const (address, &base, &offset);
2928 return mips_unspec_address_offset (base, offset, symbol_type);
2931 /* If OP is an UNSPEC address, return the address to which it refers,
2932 otherwise return OP itself. */
2935 mips_strip_unspec_address (rtx op)
2937 rtx base, offset;
2939 split_const (op, &base, &offset);
2940 if (UNSPEC_ADDRESS_P (base))
2941 op = plus_constant (Pmode, UNSPEC_ADDRESS (base), INTVAL (offset));
2942 return op;
2945 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2946 high part to BASE and return the result. Just return BASE otherwise.
2947 TEMP is as for mips_force_temporary.
2949 The returned expression can be used as the first operand to a LO_SUM. */
2951 static rtx
2952 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2953 enum mips_symbol_type symbol_type)
2955 if (mips_split_p[symbol_type])
2957 addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2958 addr = mips_force_temporary (temp, addr);
2959 base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2961 return base;
2964 /* Return an instruction that copies $gp into register REG. We want
2965 GCC to treat the register's value as constant, so that its value
2966 can be rematerialized on demand. */
2968 static rtx
2969 gen_load_const_gp (rtx reg)
2971 return PMODE_INSN (gen_load_const_gp, (reg));
2974 /* Return a pseudo register that contains the value of $gp throughout
2975 the current function. Such registers are needed by MIPS16 functions,
2976 for which $gp itself is not a valid base register or addition operand. */
2978 static rtx
2979 mips16_gp_pseudo_reg (void)
2981 if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2983 rtx_insn *scan;
2985 cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2987 push_topmost_sequence ();
2989 scan = get_insns ();
2990 while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2991 scan = NEXT_INSN (scan);
2993 rtx set = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2994 rtx_insn *insn = emit_insn_after (set, scan);
2995 INSN_LOCATION (insn) = 0;
2997 pop_topmost_sequence ();
3000 return cfun->machine->mips16_gp_pseudo_rtx;
3003 /* Return a base register that holds pic_offset_table_rtx.
3004 TEMP, if nonnull, is a scratch Pmode base register. */
3007 mips_pic_base_register (rtx temp)
3009 if (!TARGET_MIPS16)
3010 return pic_offset_table_rtx;
3012 if (currently_expanding_to_rtl)
3013 return mips16_gp_pseudo_reg ();
3015 if (can_create_pseudo_p ())
3016 temp = gen_reg_rtx (Pmode);
3018 if (TARGET_USE_GOT)
3019 /* The first post-reload split exposes all references to $gp
3020 (both uses and definitions). All references must remain
3021 explicit after that point.
3023 It is safe to introduce uses of $gp at any time, so for
3024 simplicity, we do that before the split too. */
3025 mips_emit_move (temp, pic_offset_table_rtx);
3026 else
3027 emit_insn (gen_load_const_gp (temp));
3028 return temp;
3031 /* Return the RHS of a load_call<mode> insn. */
3033 static rtx
3034 mips_unspec_call (rtx reg, rtx symbol)
3036 rtvec vec;
3038 vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
3039 return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
3042 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
3043 reference. Return NULL_RTX otherwise. */
3045 static rtx
3046 mips_strip_unspec_call (rtx src)
3048 if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
3049 return mips_strip_unspec_address (XVECEXP (src, 0, 1));
3050 return NULL_RTX;
3053 /* Create and return a GOT reference of type TYPE for address ADDR.
3054 TEMP, if nonnull, is a scratch Pmode base register. */
3057 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
3059 rtx base, high, lo_sum_symbol;
3061 base = mips_pic_base_register (temp);
3063 /* If we used the temporary register to load $gp, we can't use
3064 it for the high part as well. */
3065 if (temp != NULL && reg_overlap_mentioned_p (base, temp))
3066 temp = NULL;
3068 high = mips_unspec_offset_high (temp, base, addr, type);
3069 lo_sum_symbol = mips_unspec_address (addr, type);
3071 if (type == SYMBOL_GOTOFF_CALL)
3072 return mips_unspec_call (high, lo_sum_symbol);
3073 else
3074 return PMODE_INSN (gen_unspec_got, (high, lo_sum_symbol));
3077 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
3078 it appears in a MEM of that mode. Return true if ADDR is a legitimate
3079 constant in that context and can be split into high and low parts.
3080 If so, and if LOW_OUT is nonnull, emit the high part and store the
3081 low part in *LOW_OUT. Leave *LOW_OUT unchanged otherwise.
3083 TEMP is as for mips_force_temporary and is used to load the high
3084 part into a register.
3086 When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
3087 a legitimize SET_SRC for an .md pattern, otherwise the low part
3088 is guaranteed to be a legitimate address for mode MODE. */
3090 bool
3091 mips_split_symbol (rtx temp, rtx addr, machine_mode mode, rtx *low_out)
3093 enum mips_symbol_context context;
3094 enum mips_symbol_type symbol_type;
3095 rtx high;
3097 context = (mode == MAX_MACHINE_MODE
3098 ? SYMBOL_CONTEXT_LEA
3099 : SYMBOL_CONTEXT_MEM);
3100 if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
3102 addr = XEXP (addr, 0);
3103 if (mips_symbolic_constant_p (addr, context, &symbol_type)
3104 && mips_symbol_insns (symbol_type, mode) > 0
3105 && mips_split_hi_p[symbol_type])
3107 if (low_out)
3108 switch (symbol_type)
3110 case SYMBOL_GOT_PAGE_OFST:
3111 /* The high part of a page/ofst pair is loaded from the GOT. */
3112 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
3113 break;
3115 default:
3116 gcc_unreachable ();
3118 return true;
3121 else
3123 if (mips_symbolic_constant_p (addr, context, &symbol_type)
3124 && mips_symbol_insns (symbol_type, mode) > 0
3125 && mips_split_p[symbol_type])
3127 if (low_out)
3128 switch (symbol_type)
3130 case SYMBOL_GOT_DISP:
3131 /* SYMBOL_GOT_DISP symbols are loaded from the GOT. */
3132 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
3133 break;
3135 case SYMBOL_GP_RELATIVE:
3136 high = mips_pic_base_register (temp);
3137 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3138 break;
3140 default:
3141 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
3142 high = mips_force_temporary (temp, high);
3143 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3144 break;
3146 return true;
3149 return false;
3152 /* Return a legitimate address for REG + OFFSET. TEMP is as for
3153 mips_force_temporary; it is only needed when OFFSET is not a
3154 SMALL_OPERAND. */
3156 static rtx
3157 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
3159 if (!SMALL_OPERAND (offset))
3161 rtx high;
3163 if (TARGET_MIPS16)
3165 /* Load the full offset into a register so that we can use
3166 an unextended instruction for the address itself. */
3167 high = GEN_INT (offset);
3168 offset = 0;
3170 else
3172 /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
3173 The addition inside the macro CONST_HIGH_PART may cause an
3174 overflow, so we need to force a sign-extension check. */
3175 high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
3176 offset = CONST_LOW_PART (offset);
3178 high = mips_force_temporary (temp, high);
3179 reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
3181 return plus_constant (Pmode, reg, offset);
3184 /* The __tls_get_attr symbol. */
3185 static GTY(()) rtx mips_tls_symbol;
3187 /* Return an instruction sequence that calls __tls_get_addr. SYM is
3188 the TLS symbol we are referencing and TYPE is the symbol type to use
3189 (either global dynamic or local dynamic). V0 is an RTX for the
3190 return value location. */
3192 static rtx
3193 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
3195 rtx insn, loc, a0;
3197 a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
3199 if (!mips_tls_symbol)
3200 mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
3202 loc = mips_unspec_address (sym, type);
3204 start_sequence ();
3206 emit_insn (gen_rtx_SET (a0, gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx,
3207 loc)));
3208 insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
3209 const0_rtx, NULL_RTX, false);
3210 RTL_CONST_CALL_P (insn) = 1;
3211 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
3212 insn = get_insns ();
3214 end_sequence ();
3216 return insn;
3219 /* Return a pseudo register that contains the current thread pointer. */
3222 mips_expand_thread_pointer (rtx tp)
3224 rtx fn;
3226 if (TARGET_MIPS16)
3228 if (!mips16_rdhwr_stub)
3229 mips16_rdhwr_stub = new mips16_rdhwr_one_only_stub ();
3230 fn = mips16_stub_call_address (mips16_rdhwr_stub);
3231 emit_insn (PMODE_INSN (gen_tls_get_tp_mips16, (tp, fn)));
3233 else
3234 emit_insn (PMODE_INSN (gen_tls_get_tp, (tp)));
3235 return tp;
3238 static rtx
3239 mips_get_tp (void)
3241 return mips_expand_thread_pointer (gen_reg_rtx (Pmode));
3244 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
3245 its address. The return value will be both a valid address and a valid
3246 SET_SRC (either a REG or a LO_SUM). */
3248 static rtx
3249 mips_legitimize_tls_address (rtx loc)
3251 rtx dest, insn, v0, tp, tmp1, tmp2, eqv, offset;
3252 enum tls_model model;
3254 model = SYMBOL_REF_TLS_MODEL (loc);
3255 /* Only TARGET_ABICALLS code can have more than one module; other
3256 code must be be static and should not use a GOT. All TLS models
3257 reduce to local exec in this situation. */
3258 if (!TARGET_ABICALLS)
3259 model = TLS_MODEL_LOCAL_EXEC;
3261 switch (model)
3263 case TLS_MODEL_GLOBAL_DYNAMIC:
3264 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3265 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
3266 dest = gen_reg_rtx (Pmode);
3267 emit_libcall_block (insn, dest, v0, loc);
3268 break;
3270 case TLS_MODEL_LOCAL_DYNAMIC:
3271 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3272 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
3273 tmp1 = gen_reg_rtx (Pmode);
3275 /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
3276 share the LDM result with other LD model accesses. */
3277 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3278 UNSPEC_TLS_LDM);
3279 emit_libcall_block (insn, tmp1, v0, eqv);
3281 offset = mips_unspec_address (loc, SYMBOL_DTPREL);
3282 if (mips_split_p[SYMBOL_DTPREL])
3284 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
3285 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3287 else
3288 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3289 0, 0, OPTAB_DIRECT);
3290 break;
3292 case TLS_MODEL_INITIAL_EXEC:
3293 tp = mips_get_tp ();
3294 tmp1 = gen_reg_rtx (Pmode);
3295 tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
3296 if (Pmode == DImode)
3297 emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
3298 else
3299 emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
3300 dest = gen_reg_rtx (Pmode);
3301 emit_insn (gen_add3_insn (dest, tmp1, tp));
3302 break;
3304 case TLS_MODEL_LOCAL_EXEC:
3305 tmp1 = mips_get_tp ();
3306 offset = mips_unspec_address (loc, SYMBOL_TPREL);
3307 if (mips_split_p[SYMBOL_TPREL])
3309 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_TPREL);
3310 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3312 else
3313 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3314 0, 0, OPTAB_DIRECT);
3315 break;
3317 default:
3318 gcc_unreachable ();
3320 return dest;
3323 /* Implement "TARGET = __builtin_mips_get_fcsr ()" for MIPS16,
3324 using a stub. */
3326 void
3327 mips16_expand_get_fcsr (rtx target)
3329 if (!mips16_get_fcsr_stub)
3330 mips16_get_fcsr_stub = new mips16_get_fcsr_one_only_stub ();
3331 rtx fn = mips16_stub_call_address (mips16_get_fcsr_stub);
3332 emit_insn (PMODE_INSN (gen_mips_get_fcsr_mips16, (fn)));
3333 emit_move_insn (target, gen_rtx_REG (SImode, GET_FCSR_REGNUM));
3336 /* Implement __builtin_mips_set_fcsr (TARGET) for MIPS16, using a stub. */
3338 void
3339 mips16_expand_set_fcsr (rtx newval)
3341 if (!mips16_set_fcsr_stub)
3342 mips16_set_fcsr_stub = new mips16_set_fcsr_one_only_stub ();
3343 rtx fn = mips16_stub_call_address (mips16_set_fcsr_stub);
3344 emit_move_insn (gen_rtx_REG (SImode, SET_FCSR_REGNUM), newval);
3345 emit_insn (PMODE_INSN (gen_mips_set_fcsr_mips16, (fn)));
3348 /* If X is not a valid address for mode MODE, force it into a register. */
3350 static rtx
3351 mips_force_address (rtx x, machine_mode mode)
3353 if (!mips_legitimate_address_p (mode, x, false))
3354 x = force_reg (Pmode, x);
3355 return x;
3358 /* This function is used to implement LEGITIMIZE_ADDRESS. If X can
3359 be legitimized in a way that the generic machinery might not expect,
3360 return a new address, otherwise return NULL. MODE is the mode of
3361 the memory being accessed. */
3363 static rtx
3364 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3365 machine_mode mode)
3367 rtx base, addr;
3368 HOST_WIDE_INT offset;
3370 if (mips_tls_symbol_p (x))
3371 return mips_legitimize_tls_address (x);
3373 /* See if the address can split into a high part and a LO_SUM. */
3374 if (mips_split_symbol (NULL, x, mode, &addr))
3375 return mips_force_address (addr, mode);
3377 /* Handle BASE + OFFSET using mips_add_offset. */
3378 mips_split_plus (x, &base, &offset);
3379 if (offset != 0)
3381 if (!mips_valid_base_register_p (base, mode, false))
3382 base = copy_to_mode_reg (Pmode, base);
3383 addr = mips_add_offset (NULL, base, offset);
3384 return mips_force_address (addr, mode);
3387 return x;
3390 /* Load VALUE into DEST. TEMP is as for mips_force_temporary. */
3392 void
3393 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3395 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3396 machine_mode mode;
3397 unsigned int i, num_ops;
3398 rtx x;
3400 mode = GET_MODE (dest);
3401 num_ops = mips_build_integer (codes, value);
3403 /* Apply each binary operation to X. Invariant: X is a legitimate
3404 source operand for a SET pattern. */
3405 x = GEN_INT (codes[0].value);
3406 for (i = 1; i < num_ops; i++)
3408 if (!can_create_pseudo_p ())
3410 emit_insn (gen_rtx_SET (temp, x));
3411 x = temp;
3413 else
3414 x = force_reg (mode, x);
3415 x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3418 emit_insn (gen_rtx_SET (dest, x));
3421 /* Subroutine of mips_legitimize_move. Move constant SRC into register
3422 DEST given that SRC satisfies immediate_operand but doesn't satisfy
3423 move_operand. */
3425 static void
3426 mips_legitimize_const_move (machine_mode mode, rtx dest, rtx src)
3428 rtx base, offset;
3430 /* Split moves of big integers into smaller pieces. */
3431 if (splittable_const_int_operand (src, mode))
3433 mips_move_integer (dest, dest, INTVAL (src));
3434 return;
3437 /* Split moves of symbolic constants into high/low pairs. */
3438 if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3440 emit_insn (gen_rtx_SET (dest, src));
3441 return;
3444 /* Generate the appropriate access sequences for TLS symbols. */
3445 if (mips_tls_symbol_p (src))
3447 mips_emit_move (dest, mips_legitimize_tls_address (src));
3448 return;
3451 /* If we have (const (plus symbol offset)), and that expression cannot
3452 be forced into memory, load the symbol first and add in the offset.
3453 In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3454 forced into memory, as it usually produces better code. */
3455 split_const (src, &base, &offset);
3456 if (offset != const0_rtx
3457 && (targetm.cannot_force_const_mem (mode, src)
3458 || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3460 base = mips_force_temporary (dest, base);
3461 mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3462 return;
3465 src = force_const_mem (mode, src);
3467 /* When using explicit relocs, constant pool references are sometimes
3468 not legitimate addresses. */
3469 mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3470 mips_emit_move (dest, src);
3473 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3474 sequence that is valid. */
3476 bool
3477 mips_legitimize_move (machine_mode mode, rtx dest, rtx src)
3479 if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3481 mips_emit_move (dest, force_reg (mode, src));
3482 return true;
3485 /* We need to deal with constants that would be legitimate
3486 immediate_operands but aren't legitimate move_operands. */
3487 if (CONSTANT_P (src) && !move_operand (src, mode))
3489 mips_legitimize_const_move (mode, dest, src);
3490 set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3491 return true;
3493 return false;
3496 /* Return true if value X in context CONTEXT is a small-data address
3497 that can be rewritten as a LO_SUM. */
3499 static bool
3500 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3502 enum mips_symbol_type symbol_type;
3504 return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3505 && !mips_split_p[SYMBOL_GP_RELATIVE]
3506 && mips_symbolic_constant_p (x, context, &symbol_type)
3507 && symbol_type == SYMBOL_GP_RELATIVE);
3510 /* Return true if OP refers to small data symbols directly, not through
3511 a LO_SUM. CONTEXT is the context in which X appears. */
3513 static int
3514 mips_small_data_pattern_1 (rtx x, enum mips_symbol_context context)
3516 subrtx_var_iterator::array_type array;
3517 FOR_EACH_SUBRTX_VAR (iter, array, x, ALL)
3519 rtx x = *iter;
3521 /* Ignore things like "g" constraints in asms. We make no particular
3522 guarantee about which symbolic constants are acceptable as asm operands
3523 versus which must be forced into a GPR. */
3524 if (GET_CODE (x) == LO_SUM || GET_CODE (x) == ASM_OPERANDS)
3525 iter.skip_subrtxes ();
3526 else if (MEM_P (x))
3528 if (mips_small_data_pattern_1 (XEXP (x, 0), SYMBOL_CONTEXT_MEM))
3529 return true;
3530 iter.skip_subrtxes ();
3532 else if (mips_rewrite_small_data_p (x, context))
3533 return true;
3535 return false;
3538 /* Return true if OP refers to small data symbols directly, not through
3539 a LO_SUM. */
3541 bool
3542 mips_small_data_pattern_p (rtx op)
3544 return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA);
3547 /* Rewrite *LOC so that it refers to small data using explicit
3548 relocations. CONTEXT is the context in which *LOC appears. */
3550 static void
3551 mips_rewrite_small_data_1 (rtx *loc, enum mips_symbol_context context)
3553 subrtx_ptr_iterator::array_type array;
3554 FOR_EACH_SUBRTX_PTR (iter, array, loc, ALL)
3556 rtx *loc = *iter;
3557 if (MEM_P (*loc))
3559 mips_rewrite_small_data_1 (&XEXP (*loc, 0), SYMBOL_CONTEXT_MEM);
3560 iter.skip_subrtxes ();
3562 else if (mips_rewrite_small_data_p (*loc, context))
3564 *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3565 iter.skip_subrtxes ();
3567 else if (GET_CODE (*loc) == LO_SUM)
3568 iter.skip_subrtxes ();
3572 /* Rewrite instruction pattern PATTERN so that it refers to small data
3573 using explicit relocations. */
3576 mips_rewrite_small_data (rtx pattern)
3578 pattern = copy_insn (pattern);
3579 mips_rewrite_small_data_1 (&pattern, SYMBOL_CONTEXT_LEA);
3580 return pattern;
3583 /* The cost of loading values from the constant pool. It should be
3584 larger than the cost of any constant we want to synthesize inline. */
3585 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3587 /* Return the cost of X when used as an operand to the MIPS16 instruction
3588 that implements CODE. Return -1 if there is no such instruction, or if
3589 X is not a valid immediate operand for it. */
3591 static int
3592 mips16_constant_cost (int code, HOST_WIDE_INT x)
3594 switch (code)
3596 case ASHIFT:
3597 case ASHIFTRT:
3598 case LSHIFTRT:
3599 /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3600 other shifts are extended. The shift patterns truncate the shift
3601 count to the right size, so there are no out-of-range values. */
3602 if (IN_RANGE (x, 1, 8))
3603 return 0;
3604 return COSTS_N_INSNS (1);
3606 case PLUS:
3607 if (IN_RANGE (x, -128, 127))
3608 return 0;
3609 if (SMALL_OPERAND (x))
3610 return COSTS_N_INSNS (1);
3611 return -1;
3613 case LEU:
3614 /* Like LE, but reject the always-true case. */
3615 if (x == -1)
3616 return -1;
3617 case LE:
3618 /* We add 1 to the immediate and use SLT. */
3619 x += 1;
3620 case XOR:
3621 /* We can use CMPI for an xor with an unsigned 16-bit X. */
3622 case LT:
3623 case LTU:
3624 if (IN_RANGE (x, 0, 255))
3625 return 0;
3626 if (SMALL_OPERAND_UNSIGNED (x))
3627 return COSTS_N_INSNS (1);
3628 return -1;
3630 case EQ:
3631 case NE:
3632 /* Equality comparisons with 0 are cheap. */
3633 if (x == 0)
3634 return 0;
3635 return -1;
3637 default:
3638 return -1;
3642 /* Return true if there is a non-MIPS16 instruction that implements CODE
3643 and if that instruction accepts X as an immediate operand. */
3645 static int
3646 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3648 switch (code)
3650 case ASHIFT:
3651 case ASHIFTRT:
3652 case LSHIFTRT:
3653 /* All shift counts are truncated to a valid constant. */
3654 return true;
3656 case ROTATE:
3657 case ROTATERT:
3658 /* Likewise rotates, if the target supports rotates at all. */
3659 return ISA_HAS_ROR;
3661 case AND:
3662 case IOR:
3663 case XOR:
3664 /* These instructions take 16-bit unsigned immediates. */
3665 return SMALL_OPERAND_UNSIGNED (x);
3667 case PLUS:
3668 case LT:
3669 case LTU:
3670 /* These instructions take 16-bit signed immediates. */
3671 return SMALL_OPERAND (x);
3673 case EQ:
3674 case NE:
3675 case GT:
3676 case GTU:
3677 /* The "immediate" forms of these instructions are really
3678 implemented as comparisons with register 0. */
3679 return x == 0;
3681 case GE:
3682 case GEU:
3683 /* Likewise, meaning that the only valid immediate operand is 1. */
3684 return x == 1;
3686 case LE:
3687 /* We add 1 to the immediate and use SLT. */
3688 return SMALL_OPERAND (x + 1);
3690 case LEU:
3691 /* Likewise SLTU, but reject the always-true case. */
3692 return SMALL_OPERAND (x + 1) && x + 1 != 0;
3694 case SIGN_EXTRACT:
3695 case ZERO_EXTRACT:
3696 /* The bit position and size are immediate operands. */
3697 return ISA_HAS_EXT_INS;
3699 default:
3700 /* By default assume that $0 can be used for 0. */
3701 return x == 0;
3705 /* Return the cost of binary operation X, given that the instruction
3706 sequence for a word-sized or smaller operation has cost SINGLE_COST
3707 and that the sequence of a double-word operation has cost DOUBLE_COST.
3708 If SPEED is true, optimize for speed otherwise optimize for size. */
3710 static int
3711 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3713 int cost;
3715 if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3716 cost = double_cost;
3717 else
3718 cost = single_cost;
3719 return (cost
3720 + set_src_cost (XEXP (x, 0), speed)
3721 + rtx_cost (XEXP (x, 1), GET_CODE (x), 1, speed));
3724 /* Return the cost of floating-point multiplications of mode MODE. */
3726 static int
3727 mips_fp_mult_cost (machine_mode mode)
3729 return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3732 /* Return the cost of floating-point divisions of mode MODE. */
3734 static int
3735 mips_fp_div_cost (machine_mode mode)
3737 return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3740 /* Return the cost of sign-extending OP to mode MODE, not including the
3741 cost of OP itself. */
3743 static int
3744 mips_sign_extend_cost (machine_mode mode, rtx op)
3746 if (MEM_P (op))
3747 /* Extended loads are as cheap as unextended ones. */
3748 return 0;
3750 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3751 /* A sign extension from SImode to DImode in 64-bit mode is free. */
3752 return 0;
3754 if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3755 /* We can use SEB or SEH. */
3756 return COSTS_N_INSNS (1);
3758 /* We need to use a shift left and a shift right. */
3759 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3762 /* Return the cost of zero-extending OP to mode MODE, not including the
3763 cost of OP itself. */
3765 static int
3766 mips_zero_extend_cost (machine_mode mode, rtx op)
3768 if (MEM_P (op))
3769 /* Extended loads are as cheap as unextended ones. */
3770 return 0;
3772 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3773 /* We need a shift left by 32 bits and a shift right by 32 bits. */
3774 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3776 if (GENERATE_MIPS16E)
3777 /* We can use ZEB or ZEH. */
3778 return COSTS_N_INSNS (1);
3780 if (TARGET_MIPS16)
3781 /* We need to load 0xff or 0xffff into a register and use AND. */
3782 return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3784 /* We can use ANDI. */
3785 return COSTS_N_INSNS (1);
3788 /* Return the cost of moving between two registers of mode MODE,
3789 assuming that the move will be in pieces of at most UNITS bytes. */
3791 static int
3792 mips_set_reg_reg_piece_cost (machine_mode mode, unsigned int units)
3794 return COSTS_N_INSNS ((GET_MODE_SIZE (mode) + units - 1) / units);
3797 /* Return the cost of moving between two registers of mode MODE. */
3799 static int
3800 mips_set_reg_reg_cost (machine_mode mode)
3802 switch (GET_MODE_CLASS (mode))
3804 case MODE_CC:
3805 return mips_set_reg_reg_piece_cost (mode, GET_MODE_SIZE (CCmode));
3807 case MODE_FLOAT:
3808 case MODE_COMPLEX_FLOAT:
3809 case MODE_VECTOR_FLOAT:
3810 if (TARGET_HARD_FLOAT)
3811 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_HWFPVALUE);
3812 /* Fall through */
3814 default:
3815 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_WORD);
3819 /* Implement TARGET_RTX_COSTS. */
3821 static bool
3822 mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
3823 int *total, bool speed)
3825 machine_mode mode = GET_MODE (x);
3826 bool float_mode_p = FLOAT_MODE_P (mode);
3827 int cost;
3828 rtx addr;
3830 /* The cost of a COMPARE is hard to define for MIPS. COMPAREs don't
3831 appear in the instruction stream, and the cost of a comparison is
3832 really the cost of the branch or scc condition. At the time of
3833 writing, GCC only uses an explicit outer COMPARE code when optabs
3834 is testing whether a constant is expensive enough to force into a
3835 register. We want optabs to pass such constants through the MIPS
3836 expanders instead, so make all constants very cheap here. */
3837 if (outer_code == COMPARE)
3839 gcc_assert (CONSTANT_P (x));
3840 *total = 0;
3841 return true;
3844 switch (code)
3846 case CONST_INT:
3847 /* Treat *clear_upper32-style ANDs as having zero cost in the
3848 second operand. The cost is entirely in the first operand.
3850 ??? This is needed because we would otherwise try to CSE
3851 the constant operand. Although that's the right thing for
3852 instructions that continue to be a register operation throughout
3853 compilation, it is disastrous for instructions that could
3854 later be converted into a memory operation. */
3855 if (TARGET_64BIT
3856 && outer_code == AND
3857 && UINTVAL (x) == 0xffffffff)
3859 *total = 0;
3860 return true;
3863 if (TARGET_MIPS16)
3865 cost = mips16_constant_cost (outer_code, INTVAL (x));
3866 if (cost >= 0)
3868 *total = cost;
3869 return true;
3872 else
3874 /* When not optimizing for size, we care more about the cost
3875 of hot code, and hot code is often in a loop. If a constant
3876 operand needs to be forced into a register, we will often be
3877 able to hoist the constant load out of the loop, so the load
3878 should not contribute to the cost. */
3879 if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3881 *total = 0;
3882 return true;
3885 /* Fall through. */
3887 case CONST:
3888 case SYMBOL_REF:
3889 case LABEL_REF:
3890 case CONST_DOUBLE:
3891 if (force_to_mem_operand (x, VOIDmode))
3893 *total = COSTS_N_INSNS (1);
3894 return true;
3896 cost = mips_const_insns (x);
3897 if (cost > 0)
3899 /* If the constant is likely to be stored in a GPR, SETs of
3900 single-insn constants are as cheap as register sets; we
3901 never want to CSE them.
3903 Don't reduce the cost of storing a floating-point zero in
3904 FPRs. If we have a zero in an FPR for other reasons, we
3905 can get better cfg-cleanup and delayed-branch results by
3906 using it consistently, rather than using $0 sometimes and
3907 an FPR at other times. Also, moves between floating-point
3908 registers are sometimes cheaper than (D)MTC1 $0. */
3909 if (cost == 1
3910 && outer_code == SET
3911 && !(float_mode_p && TARGET_HARD_FLOAT))
3912 cost = 0;
3913 /* When non-MIPS16 code loads a constant N>1 times, we rarely
3914 want to CSE the constant itself. It is usually better to
3915 have N copies of the last operation in the sequence and one
3916 shared copy of the other operations. (Note that this is
3917 not true for MIPS16 code, where the final operation in the
3918 sequence is often an extended instruction.)
3920 Also, if we have a CONST_INT, we don't know whether it is
3921 for a word or doubleword operation, so we cannot rely on
3922 the result of mips_build_integer. */
3923 else if (!TARGET_MIPS16
3924 && (outer_code == SET || mode == VOIDmode))
3925 cost = 1;
3926 *total = COSTS_N_INSNS (cost);
3927 return true;
3929 /* The value will need to be fetched from the constant pool. */
3930 *total = CONSTANT_POOL_COST;
3931 return true;
3933 case MEM:
3934 /* If the address is legitimate, return the number of
3935 instructions it needs. */
3936 addr = XEXP (x, 0);
3937 cost = mips_address_insns (addr, mode, true);
3938 if (cost > 0)
3940 *total = COSTS_N_INSNS (cost + 1);
3941 return true;
3943 /* Check for a scaled indexed address. */
3944 if (mips_lwxs_address_p (addr)
3945 || mips_lx_address_p (addr, mode))
3947 *total = COSTS_N_INSNS (2);
3948 return true;
3950 /* Otherwise use the default handling. */
3951 return false;
3953 case FFS:
3954 *total = COSTS_N_INSNS (6);
3955 return false;
3957 case NOT:
3958 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3959 return false;
3961 case AND:
3962 /* Check for a *clear_upper32 pattern and treat it like a zero
3963 extension. See the pattern's comment for details. */
3964 if (TARGET_64BIT
3965 && mode == DImode
3966 && CONST_INT_P (XEXP (x, 1))
3967 && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3969 *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3970 + set_src_cost (XEXP (x, 0), speed));
3971 return true;
3973 if (ISA_HAS_CINS && CONST_INT_P (XEXP (x, 1)))
3975 rtx op = XEXP (x, 0);
3976 if (GET_CODE (op) == ASHIFT
3977 && CONST_INT_P (XEXP (op, 1))
3978 && mask_low_and_shift_p (mode, XEXP (x, 1), XEXP (op, 1), 32))
3980 *total = COSTS_N_INSNS (1) + set_src_cost (XEXP (op, 0), speed);
3981 return true;
3984 /* (AND (NOT op0) (NOT op1) is a nor operation that can be done in
3985 a single instruction. */
3986 if (!TARGET_MIPS16
3987 && GET_CODE (XEXP (x, 0)) == NOT
3988 && GET_CODE (XEXP (x, 1)) == NOT)
3990 cost = GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1;
3991 *total = (COSTS_N_INSNS (cost)
3992 + set_src_cost (XEXP (XEXP (x, 0), 0), speed)
3993 + set_src_cost (XEXP (XEXP (x, 1), 0), speed));
3994 return true;
3997 /* Fall through. */
3999 case IOR:
4000 case XOR:
4001 /* Double-word operations use two single-word operations. */
4002 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
4003 speed);
4004 return true;
4006 case ASHIFT:
4007 case ASHIFTRT:
4008 case LSHIFTRT:
4009 case ROTATE:
4010 case ROTATERT:
4011 if (CONSTANT_P (XEXP (x, 1)))
4012 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
4013 speed);
4014 else
4015 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
4016 speed);
4017 return true;
4019 case ABS:
4020 if (float_mode_p)
4021 *total = mips_cost->fp_add;
4022 else
4023 *total = COSTS_N_INSNS (4);
4024 return false;
4026 case LO_SUM:
4027 /* Low-part immediates need an extended MIPS16 instruction. */
4028 *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
4029 + set_src_cost (XEXP (x, 0), speed));
4030 return true;
4032 case LT:
4033 case LTU:
4034 case LE:
4035 case LEU:
4036 case GT:
4037 case GTU:
4038 case GE:
4039 case GEU:
4040 case EQ:
4041 case NE:
4042 case UNORDERED:
4043 case LTGT:
4044 /* Branch comparisons have VOIDmode, so use the first operand's
4045 mode instead. */
4046 mode = GET_MODE (XEXP (x, 0));
4047 if (FLOAT_MODE_P (mode))
4049 *total = mips_cost->fp_add;
4050 return false;
4052 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
4053 speed);
4054 return true;
4056 case MINUS:
4057 if (float_mode_p
4058 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
4059 && TARGET_FUSED_MADD
4060 && !HONOR_SIGNED_ZEROS (mode))
4062 /* See if we can use NMADD or NMSUB. See mips.md for the
4063 associated patterns. */
4064 rtx op0 = XEXP (x, 0);
4065 rtx op1 = XEXP (x, 1);
4066 if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
4068 *total = (mips_fp_mult_cost (mode)
4069 + set_src_cost (XEXP (XEXP (op0, 0), 0), speed)
4070 + set_src_cost (XEXP (op0, 1), speed)
4071 + set_src_cost (op1, speed));
4072 return true;
4074 if (GET_CODE (op1) == MULT)
4076 *total = (mips_fp_mult_cost (mode)
4077 + set_src_cost (op0, speed)
4078 + set_src_cost (XEXP (op1, 0), speed)
4079 + set_src_cost (XEXP (op1, 1), speed));
4080 return true;
4083 /* Fall through. */
4085 case PLUS:
4086 if (float_mode_p)
4088 /* If this is part of a MADD or MSUB, treat the PLUS as
4089 being free. */
4090 if ((ISA_HAS_FP_MADD4_MSUB4 || ISA_HAS_FP_MADD3_MSUB3)
4091 && TARGET_FUSED_MADD
4092 && GET_CODE (XEXP (x, 0)) == MULT)
4093 *total = 0;
4094 else
4095 *total = mips_cost->fp_add;
4096 return false;
4099 /* If it's an add + mult (which is equivalent to shift left) and
4100 it's immediate operand satisfies const_immlsa_operand predicate. */
4101 if (((ISA_HAS_LSA && mode == SImode)
4102 || (ISA_HAS_DLSA && mode == DImode))
4103 && GET_CODE (XEXP (x, 0)) == MULT)
4105 rtx op2 = XEXP (XEXP (x, 0), 1);
4106 if (const_immlsa_operand (op2, mode))
4108 *total = (COSTS_N_INSNS (1)
4109 + set_src_cost (XEXP (XEXP (x, 0), 0), speed)
4110 + set_src_cost (XEXP (x, 1), speed));
4111 return true;
4115 /* Double-word operations require three single-word operations and
4116 an SLTU. The MIPS16 version then needs to move the result of
4117 the SLTU from $24 to a MIPS16 register. */
4118 *total = mips_binary_cost (x, COSTS_N_INSNS (1),
4119 COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
4120 speed);
4121 return true;
4123 case NEG:
4124 if (float_mode_p
4125 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
4126 && TARGET_FUSED_MADD
4127 && HONOR_SIGNED_ZEROS (mode))
4129 /* See if we can use NMADD or NMSUB. See mips.md for the
4130 associated patterns. */
4131 rtx op = XEXP (x, 0);
4132 if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
4133 && GET_CODE (XEXP (op, 0)) == MULT)
4135 *total = (mips_fp_mult_cost (mode)
4136 + set_src_cost (XEXP (XEXP (op, 0), 0), speed)
4137 + set_src_cost (XEXP (XEXP (op, 0), 1), speed)
4138 + set_src_cost (XEXP (op, 1), speed));
4139 return true;
4143 if (float_mode_p)
4144 *total = mips_cost->fp_add;
4145 else
4146 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
4147 return false;
4149 case FMA:
4150 if (ISA_HAS_FP_MADDF_MSUBF)
4151 *total = mips_fp_mult_cost (mode);
4152 return false;
4154 case MULT:
4155 if (float_mode_p)
4156 *total = mips_fp_mult_cost (mode);
4157 else if (mode == DImode && !TARGET_64BIT)
4158 /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
4159 where the mulsidi3 always includes an MFHI and an MFLO. */
4160 *total = (speed
4161 ? mips_cost->int_mult_si * 3 + 6
4162 : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
4163 else if (!speed)
4164 *total = COSTS_N_INSNS ((ISA_HAS_MUL3 || ISA_HAS_R6MUL) ? 1 : 2) + 1;
4165 else if (mode == DImode)
4166 *total = mips_cost->int_mult_di;
4167 else
4168 *total = mips_cost->int_mult_si;
4169 return false;
4171 case DIV:
4172 /* Check for a reciprocal. */
4173 if (float_mode_p
4174 && ISA_HAS_FP_RECIP_RSQRT (mode)
4175 && flag_unsafe_math_optimizations
4176 && XEXP (x, 0) == CONST1_RTX (mode))
4178 if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
4179 /* An rsqrt<mode>a or rsqrt<mode>b pattern. Count the
4180 division as being free. */
4181 *total = set_src_cost (XEXP (x, 1), speed);
4182 else
4183 *total = (mips_fp_div_cost (mode)
4184 + set_src_cost (XEXP (x, 1), speed));
4185 return true;
4187 /* Fall through. */
4189 case SQRT:
4190 case MOD:
4191 if (float_mode_p)
4193 *total = mips_fp_div_cost (mode);
4194 return false;
4196 /* Fall through. */
4198 case UDIV:
4199 case UMOD:
4200 if (!speed)
4202 /* It is our responsibility to make division by a power of 2
4203 as cheap as 2 register additions if we want the division
4204 expanders to be used for such operations; see the setting
4205 of sdiv_pow2_cheap in optabs.c. Using (D)DIV for MIPS16
4206 should always produce shorter code than using
4207 expand_sdiv2_pow2. */
4208 if (TARGET_MIPS16
4209 && CONST_INT_P (XEXP (x, 1))
4210 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
4212 *total = COSTS_N_INSNS (2) + set_src_cost (XEXP (x, 0), speed);
4213 return true;
4215 *total = COSTS_N_INSNS (mips_idiv_insns ());
4217 else if (mode == DImode)
4218 *total = mips_cost->int_div_di;
4219 else
4220 *total = mips_cost->int_div_si;
4221 return false;
4223 case SIGN_EXTEND:
4224 *total = mips_sign_extend_cost (mode, XEXP (x, 0));
4225 return false;
4227 case ZERO_EXTEND:
4228 if (outer_code == SET
4229 && ISA_HAS_BADDU
4230 && (GET_CODE (XEXP (x, 0)) == TRUNCATE
4231 || GET_CODE (XEXP (x, 0)) == SUBREG)
4232 && GET_MODE (XEXP (x, 0)) == QImode
4233 && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
4235 *total = set_src_cost (XEXP (XEXP (x, 0), 0), speed);
4236 return true;
4238 *total = mips_zero_extend_cost (mode, XEXP (x, 0));
4239 return false;
4240 case TRUNCATE:
4241 /* Costings for highpart multiplies. Matching patterns of the form:
4243 (lshiftrt:DI (mult:DI (sign_extend:DI (...)
4244 (sign_extend:DI (...))
4245 (const_int 32)
4247 if (ISA_HAS_R6MUL
4248 && (GET_CODE (XEXP (x, 0)) == ASHIFTRT
4249 || GET_CODE (XEXP (x, 0)) == LSHIFTRT)
4250 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4251 && ((INTVAL (XEXP (XEXP (x, 0), 1)) == 32
4252 && GET_MODE (XEXP (x, 0)) == DImode)
4253 || (ISA_HAS_R6DMUL
4254 && INTVAL (XEXP (XEXP (x, 0), 1)) == 64
4255 && GET_MODE (XEXP (x, 0)) == TImode))
4256 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
4257 && ((GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == SIGN_EXTEND
4258 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == SIGN_EXTEND)
4259 || (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ZERO_EXTEND
4260 && (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1))
4261 == ZERO_EXTEND))))
4263 if (!speed)
4264 *total = COSTS_N_INSNS (1) + 1;
4265 else if (mode == DImode)
4266 *total = mips_cost->int_mult_di;
4267 else
4268 *total = mips_cost->int_mult_si;
4270 /* Sign extension is free, zero extension costs for DImode when
4271 on a 64bit core / when DMUL is present. */
4272 for (int i = 0; i < 2; ++i)
4274 rtx op = XEXP (XEXP (XEXP (x, 0), 0), i);
4275 if (ISA_HAS_R6DMUL
4276 && GET_CODE (op) == ZERO_EXTEND
4277 && GET_MODE (op) == DImode)
4278 *total += rtx_cost (op, MULT, i, speed);
4279 else
4280 *total += rtx_cost (XEXP (op, 0), GET_CODE (op), 0, speed);
4283 return true;
4285 return false;
4287 case FLOAT:
4288 case UNSIGNED_FLOAT:
4289 case FIX:
4290 case FLOAT_EXTEND:
4291 case FLOAT_TRUNCATE:
4292 *total = mips_cost->fp_add;
4293 return false;
4295 case SET:
4296 if (register_operand (SET_DEST (x), VOIDmode)
4297 && reg_or_0_operand (SET_SRC (x), VOIDmode))
4299 *total = mips_set_reg_reg_cost (GET_MODE (SET_DEST (x)));
4300 return true;
4302 return false;
4304 default:
4305 return false;
4309 /* Implement TARGET_ADDRESS_COST. */
4311 static int
4312 mips_address_cost (rtx addr, machine_mode mode,
4313 addr_space_t as ATTRIBUTE_UNUSED,
4314 bool speed ATTRIBUTE_UNUSED)
4316 return mips_address_insns (addr, mode, false);
4319 /* Information about a single instruction in a multi-instruction
4320 asm sequence. */
4321 struct mips_multi_member {
4322 /* True if this is a label, false if it is code. */
4323 bool is_label_p;
4325 /* The output_asm_insn format of the instruction. */
4326 const char *format;
4328 /* The operands to the instruction. */
4329 rtx operands[MAX_RECOG_OPERANDS];
4331 typedef struct mips_multi_member mips_multi_member;
4333 /* The instructions that make up the current multi-insn sequence. */
4334 static vec<mips_multi_member> mips_multi_members;
4336 /* How many instructions (as opposed to labels) are in the current
4337 multi-insn sequence. */
4338 static unsigned int mips_multi_num_insns;
4340 /* Start a new multi-insn sequence. */
4342 static void
4343 mips_multi_start (void)
4345 mips_multi_members.truncate (0);
4346 mips_multi_num_insns = 0;
4349 /* Add a new, uninitialized member to the current multi-insn sequence. */
4351 static struct mips_multi_member *
4352 mips_multi_add (void)
4354 mips_multi_member empty;
4355 return mips_multi_members.safe_push (empty);
4358 /* Add a normal insn with the given asm format to the current multi-insn
4359 sequence. The other arguments are a null-terminated list of operands. */
4361 static void
4362 mips_multi_add_insn (const char *format, ...)
4364 struct mips_multi_member *member;
4365 va_list ap;
4366 unsigned int i;
4367 rtx op;
4369 member = mips_multi_add ();
4370 member->is_label_p = false;
4371 member->format = format;
4372 va_start (ap, format);
4373 i = 0;
4374 while ((op = va_arg (ap, rtx)))
4375 member->operands[i++] = op;
4376 va_end (ap);
4377 mips_multi_num_insns++;
4380 /* Add the given label definition to the current multi-insn sequence.
4381 The definition should include the colon. */
4383 static void
4384 mips_multi_add_label (const char *label)
4386 struct mips_multi_member *member;
4388 member = mips_multi_add ();
4389 member->is_label_p = true;
4390 member->format = label;
4393 /* Return the index of the last member of the current multi-insn sequence. */
4395 static unsigned int
4396 mips_multi_last_index (void)
4398 return mips_multi_members.length () - 1;
4401 /* Add a copy of an existing instruction to the current multi-insn
4402 sequence. I is the index of the instruction that should be copied. */
4404 static void
4405 mips_multi_copy_insn (unsigned int i)
4407 struct mips_multi_member *member;
4409 member = mips_multi_add ();
4410 memcpy (member, &mips_multi_members[i], sizeof (*member));
4411 gcc_assert (!member->is_label_p);
4414 /* Change the operand of an existing instruction in the current
4415 multi-insn sequence. I is the index of the instruction,
4416 OP is the index of the operand, and X is the new value. */
4418 static void
4419 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
4421 mips_multi_members[i].operands[op] = x;
4424 /* Write out the asm code for the current multi-insn sequence. */
4426 static void
4427 mips_multi_write (void)
4429 struct mips_multi_member *member;
4430 unsigned int i;
4432 FOR_EACH_VEC_ELT (mips_multi_members, i, member)
4433 if (member->is_label_p)
4434 fprintf (asm_out_file, "%s\n", member->format);
4435 else
4436 output_asm_insn (member->format, member->operands);
4439 /* Return one word of double-word value OP, taking into account the fixed
4440 endianness of certain registers. HIGH_P is true to select the high part,
4441 false to select the low part. */
4444 mips_subword (rtx op, bool high_p)
4446 unsigned int byte, offset;
4447 machine_mode mode;
4449 mode = GET_MODE (op);
4450 if (mode == VOIDmode)
4451 mode = TARGET_64BIT ? TImode : DImode;
4453 if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4454 byte = UNITS_PER_WORD;
4455 else
4456 byte = 0;
4458 if (FP_REG_RTX_P (op))
4460 /* Paired FPRs are always ordered little-endian. */
4461 offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4462 return gen_rtx_REG (word_mode, REGNO (op) + offset);
4465 if (MEM_P (op))
4466 return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4468 return simplify_gen_subreg (word_mode, op, mode, byte);
4471 /* Return true if SRC should be moved into DEST using "MULT $0, $0".
4472 SPLIT_TYPE is the condition under which moves should be split. */
4474 static bool
4475 mips_mult_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4477 return ((split_type != SPLIT_FOR_SPEED
4478 || mips_tuning_info.fast_mult_zero_zero_p)
4479 && src == const0_rtx
4480 && REG_P (dest)
4481 && GET_MODE_SIZE (GET_MODE (dest)) == 2 * UNITS_PER_WORD
4482 && (ISA_HAS_DSP_MULT
4483 ? ACC_REG_P (REGNO (dest))
4484 : MD_REG_P (REGNO (dest))));
4487 /* Return true if a move from SRC to DEST should be split into two.
4488 SPLIT_TYPE describes the split condition. */
4490 bool
4491 mips_split_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4493 /* Check whether the move can be done using some variant of MULT $0,$0. */
4494 if (mips_mult_move_p (dest, src, split_type))
4495 return false;
4497 /* FPR-to-FPR moves can be done in a single instruction, if they're
4498 allowed at all. */
4499 unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
4500 if (size == 8 && FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4501 return false;
4503 /* Check for floating-point loads and stores. */
4504 if (size == 8 && ISA_HAS_LDC1_SDC1)
4506 if (FP_REG_RTX_P (dest) && MEM_P (src))
4507 return false;
4508 if (FP_REG_RTX_P (src) && MEM_P (dest))
4509 return false;
4512 /* Otherwise split all multiword moves. */
4513 return size > UNITS_PER_WORD;
4516 /* Split a move from SRC to DEST, given that mips_split_move_p holds.
4517 SPLIT_TYPE describes the split condition. */
4519 void
4520 mips_split_move (rtx dest, rtx src, enum mips_split_type split_type)
4522 rtx low_dest;
4524 gcc_checking_assert (mips_split_move_p (dest, src, split_type));
4525 if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4527 if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4528 emit_insn (gen_move_doubleword_fprdi (dest, src));
4529 else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4530 emit_insn (gen_move_doubleword_fprdf (dest, src));
4531 else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4532 emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4533 else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4534 emit_insn (gen_move_doubleword_fprv2si (dest, src));
4535 else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4536 emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4537 else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4538 emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4539 else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4540 emit_insn (gen_move_doubleword_fprtf (dest, src));
4541 else
4542 gcc_unreachable ();
4544 else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4546 low_dest = mips_subword (dest, false);
4547 mips_emit_move (low_dest, mips_subword (src, false));
4548 if (TARGET_64BIT)
4549 emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4550 else
4551 emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4553 else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4555 mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4556 if (TARGET_64BIT)
4557 emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4558 else
4559 emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4561 else
4563 /* The operation can be split into two normal moves. Decide in
4564 which order to do them. */
4565 low_dest = mips_subword (dest, false);
4566 if (REG_P (low_dest)
4567 && reg_overlap_mentioned_p (low_dest, src))
4569 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4570 mips_emit_move (low_dest, mips_subword (src, false));
4572 else
4574 mips_emit_move (low_dest, mips_subword (src, false));
4575 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4580 /* Return the split type for instruction INSN. */
4582 static enum mips_split_type
4583 mips_insn_split_type (rtx insn)
4585 basic_block bb = BLOCK_FOR_INSN (insn);
4586 if (bb)
4588 if (optimize_bb_for_speed_p (bb))
4589 return SPLIT_FOR_SPEED;
4590 else
4591 return SPLIT_FOR_SIZE;
4593 /* Once CFG information has been removed, we should trust the optimization
4594 decisions made by previous passes and only split where necessary. */
4595 return SPLIT_IF_NECESSARY;
4598 /* Return true if a move from SRC to DEST in INSN should be split. */
4600 bool
4601 mips_split_move_insn_p (rtx dest, rtx src, rtx insn)
4603 return mips_split_move_p (dest, src, mips_insn_split_type (insn));
4606 /* Split a move from SRC to DEST in INSN, given that mips_split_move_insn_p
4607 holds. */
4609 void
4610 mips_split_move_insn (rtx dest, rtx src, rtx insn)
4612 mips_split_move (dest, src, mips_insn_split_type (insn));
4615 /* Return the appropriate instructions to move SRC into DEST. Assume
4616 that SRC is operand 1 and DEST is operand 0. */
4618 const char *
4619 mips_output_move (rtx dest, rtx src)
4621 enum rtx_code dest_code, src_code;
4622 machine_mode mode;
4623 enum mips_symbol_type symbol_type;
4624 bool dbl_p;
4626 dest_code = GET_CODE (dest);
4627 src_code = GET_CODE (src);
4628 mode = GET_MODE (dest);
4629 dbl_p = (GET_MODE_SIZE (mode) == 8);
4631 if (mips_split_move_p (dest, src, SPLIT_IF_NECESSARY))
4632 return "#";
4634 if ((src_code == REG && GP_REG_P (REGNO (src)))
4635 || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4637 if (dest_code == REG)
4639 if (GP_REG_P (REGNO (dest)))
4640 return "move\t%0,%z1";
4642 if (mips_mult_move_p (dest, src, SPLIT_IF_NECESSARY))
4644 if (ISA_HAS_DSP_MULT)
4645 return "mult\t%q0,%.,%.";
4646 else
4647 return "mult\t%.,%.";
4650 /* Moves to HI are handled by special .md insns. */
4651 if (REGNO (dest) == LO_REGNUM)
4652 return "mtlo\t%z1";
4654 if (DSP_ACC_REG_P (REGNO (dest)))
4656 static char retval[] = "mt__\t%z1,%q0";
4658 retval[2] = reg_names[REGNO (dest)][4];
4659 retval[3] = reg_names[REGNO (dest)][5];
4660 return retval;
4663 if (FP_REG_P (REGNO (dest)))
4664 return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4666 if (ALL_COP_REG_P (REGNO (dest)))
4668 static char retval[] = "dmtc_\t%z1,%0";
4670 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4671 return dbl_p ? retval : retval + 1;
4674 if (dest_code == MEM)
4675 switch (GET_MODE_SIZE (mode))
4677 case 1: return "sb\t%z1,%0";
4678 case 2: return "sh\t%z1,%0";
4679 case 4: return "sw\t%z1,%0";
4680 case 8: return "sd\t%z1,%0";
4683 if (dest_code == REG && GP_REG_P (REGNO (dest)))
4685 if (src_code == REG)
4687 /* Moves from HI are handled by special .md insns. */
4688 if (REGNO (src) == LO_REGNUM)
4690 /* When generating VR4120 or VR4130 code, we use MACC and
4691 DMACC instead of MFLO. This avoids both the normal
4692 MIPS III HI/LO hazards and the errata related to
4693 -mfix-vr4130. */
4694 if (ISA_HAS_MACCHI)
4695 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4696 return "mflo\t%0";
4699 if (DSP_ACC_REG_P (REGNO (src)))
4701 static char retval[] = "mf__\t%0,%q1";
4703 retval[2] = reg_names[REGNO (src)][4];
4704 retval[3] = reg_names[REGNO (src)][5];
4705 return retval;
4708 if (FP_REG_P (REGNO (src)))
4709 return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4711 if (ALL_COP_REG_P (REGNO (src)))
4713 static char retval[] = "dmfc_\t%0,%1";
4715 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4716 return dbl_p ? retval : retval + 1;
4720 if (src_code == MEM)
4721 switch (GET_MODE_SIZE (mode))
4723 case 1: return "lbu\t%0,%1";
4724 case 2: return "lhu\t%0,%1";
4725 case 4: return "lw\t%0,%1";
4726 case 8: return "ld\t%0,%1";
4729 if (src_code == CONST_INT)
4731 /* Don't use the X format for the operand itself, because that
4732 will give out-of-range numbers for 64-bit hosts and 32-bit
4733 targets. */
4734 if (!TARGET_MIPS16)
4735 return "li\t%0,%1\t\t\t# %X1";
4737 if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4738 return "li\t%0,%1";
4740 if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4741 return "#";
4744 if (src_code == HIGH)
4745 return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4747 if (CONST_GP_P (src))
4748 return "move\t%0,%1";
4750 if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4751 && mips_lo_relocs[symbol_type] != 0)
4753 /* A signed 16-bit constant formed by applying a relocation
4754 operator to a symbolic address. */
4755 gcc_assert (!mips_split_p[symbol_type]);
4756 return "li\t%0,%R1";
4759 if (symbolic_operand (src, VOIDmode))
4761 gcc_assert (TARGET_MIPS16
4762 ? TARGET_MIPS16_TEXT_LOADS
4763 : !TARGET_EXPLICIT_RELOCS);
4764 return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4767 if (src_code == REG && FP_REG_P (REGNO (src)))
4769 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4771 if (GET_MODE (dest) == V2SFmode)
4772 return "mov.ps\t%0,%1";
4773 else
4774 return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4777 if (dest_code == MEM)
4778 return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4780 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4782 if (src_code == MEM)
4783 return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4785 if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4787 static char retval[] = "l_c_\t%0,%1";
4789 retval[1] = (dbl_p ? 'd' : 'w');
4790 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4791 return retval;
4793 if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4795 static char retval[] = "s_c_\t%1,%0";
4797 retval[1] = (dbl_p ? 'd' : 'w');
4798 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4799 return retval;
4801 gcc_unreachable ();
4804 /* Return true if CMP1 is a suitable second operand for integer ordering
4805 test CODE. See also the *sCC patterns in mips.md. */
4807 static bool
4808 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4810 switch (code)
4812 case GT:
4813 case GTU:
4814 return reg_or_0_operand (cmp1, VOIDmode);
4816 case GE:
4817 case GEU:
4818 return !TARGET_MIPS16 && cmp1 == const1_rtx;
4820 case LT:
4821 case LTU:
4822 return arith_operand (cmp1, VOIDmode);
4824 case LE:
4825 return sle_operand (cmp1, VOIDmode);
4827 case LEU:
4828 return sleu_operand (cmp1, VOIDmode);
4830 default:
4831 gcc_unreachable ();
4835 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4836 integer ordering test *CODE, or if an equivalent combination can
4837 be formed by adjusting *CODE and *CMP1. When returning true, update
4838 *CODE and *CMP1 with the chosen code and operand, otherwise leave
4839 them alone. */
4841 static bool
4842 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4843 machine_mode mode)
4845 HOST_WIDE_INT plus_one;
4847 if (mips_int_order_operand_ok_p (*code, *cmp1))
4848 return true;
4850 if (CONST_INT_P (*cmp1))
4851 switch (*code)
4853 case LE:
4854 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4855 if (INTVAL (*cmp1) < plus_one)
4857 *code = LT;
4858 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4859 return true;
4861 break;
4863 case LEU:
4864 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4865 if (plus_one != 0)
4867 *code = LTU;
4868 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4869 return true;
4871 break;
4873 default:
4874 break;
4876 return false;
4879 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4880 in TARGET. CMP0 and TARGET are register_operands. If INVERT_PTR
4881 is nonnull, it's OK to set TARGET to the inverse of the result and
4882 flip *INVERT_PTR instead. */
4884 static void
4885 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4886 rtx target, rtx cmp0, rtx cmp1)
4888 machine_mode mode;
4890 /* First see if there is a MIPS instruction that can do this operation.
4891 If not, try doing the same for the inverse operation. If that also
4892 fails, force CMP1 into a register and try again. */
4893 mode = GET_MODE (cmp0);
4894 if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4895 mips_emit_binary (code, target, cmp0, cmp1);
4896 else
4898 enum rtx_code inv_code = reverse_condition (code);
4899 if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4901 cmp1 = force_reg (mode, cmp1);
4902 mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4904 else if (invert_ptr == 0)
4906 rtx inv_target;
4908 inv_target = mips_force_binary (GET_MODE (target),
4909 inv_code, cmp0, cmp1);
4910 mips_emit_binary (XOR, target, inv_target, const1_rtx);
4912 else
4914 *invert_ptr = !*invert_ptr;
4915 mips_emit_binary (inv_code, target, cmp0, cmp1);
4920 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4921 The register will have the same mode as CMP0. */
4923 static rtx
4924 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4926 if (cmp1 == const0_rtx)
4927 return cmp0;
4929 if (uns_arith_operand (cmp1, VOIDmode))
4930 return expand_binop (GET_MODE (cmp0), xor_optab,
4931 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4933 return expand_binop (GET_MODE (cmp0), sub_optab,
4934 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4937 /* Convert *CODE into a code that can be used in a floating-point
4938 scc instruction (C.cond.fmt). Return true if the values of
4939 the condition code registers will be inverted, with 0 indicating
4940 that the condition holds. */
4942 static bool
4943 mips_reversed_fp_cond (enum rtx_code *code)
4945 switch (*code)
4947 case NE:
4948 case LTGT:
4949 case ORDERED:
4950 *code = reverse_condition_maybe_unordered (*code);
4951 return true;
4953 default:
4954 return false;
4958 /* Allocate a floating-point condition-code register of mode MODE.
4960 These condition code registers are used for certain kinds
4961 of compound operation, such as compare and branches, vconds,
4962 and built-in functions. At expand time, their use is entirely
4963 controlled by MIPS-specific code and is entirely internal
4964 to these compound operations.
4966 We could (and did in the past) expose condition-code values
4967 as pseudo registers and leave the register allocator to pick
4968 appropriate registers. The problem is that it is not practically
4969 possible for the rtl optimizers to guarantee that no spills will
4970 be needed, even when AVOID_CCMODE_COPIES is defined. We would
4971 therefore need spill and reload sequences to handle the worst case.
4973 Although such sequences do exist, they are very expensive and are
4974 not something we'd want to use. This is especially true of CCV2 and
4975 CCV4, where all the shuffling would greatly outweigh whatever benefit
4976 the vectorization itself provides.
4978 The main benefit of having more than one condition-code register
4979 is to allow the pipelining of operations, especially those involving
4980 comparisons and conditional moves. We don't really expect the
4981 registers to be live for long periods, and certainly never want
4982 them to be live across calls.
4984 Also, there should be no penalty attached to using all the available
4985 registers. They are simply bits in the same underlying FPU control
4986 register.
4988 We therefore expose the hardware registers from the outset and use
4989 a simple round-robin allocation scheme. */
4991 static rtx
4992 mips_allocate_fcc (machine_mode mode)
4994 unsigned int regno, count;
4996 gcc_assert (TARGET_HARD_FLOAT && ISA_HAS_8CC);
4998 if (mode == CCmode)
4999 count = 1;
5000 else if (mode == CCV2mode)
5001 count = 2;
5002 else if (mode == CCV4mode)
5003 count = 4;
5004 else
5005 gcc_unreachable ();
5007 cfun->machine->next_fcc += -cfun->machine->next_fcc & (count - 1);
5008 if (cfun->machine->next_fcc > ST_REG_LAST - ST_REG_FIRST)
5009 cfun->machine->next_fcc = 0;
5010 regno = ST_REG_FIRST + cfun->machine->next_fcc;
5011 cfun->machine->next_fcc += count;
5012 return gen_rtx_REG (mode, regno);
5015 /* Convert a comparison into something that can be used in a branch or
5016 conditional move. On entry, *OP0 and *OP1 are the values being
5017 compared and *CODE is the code used to compare them.
5019 Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
5020 If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
5021 otherwise any standard branch condition can be used. The standard branch
5022 conditions are:
5024 - EQ or NE between two registers.
5025 - any comparison between a register and zero. */
5027 static void
5028 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
5030 rtx cmp_op0 = *op0;
5031 rtx cmp_op1 = *op1;
5033 if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
5035 if (!need_eq_ne_p && *op1 == const0_rtx)
5037 else if (*code == EQ || *code == NE)
5039 if (need_eq_ne_p)
5041 *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
5042 *op1 = const0_rtx;
5044 else
5045 *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
5047 else
5049 /* The comparison needs a separate scc instruction. Store the
5050 result of the scc in *OP0 and compare it against zero. */
5051 bool invert = false;
5052 *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
5053 mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
5054 *code = (invert ? EQ : NE);
5055 *op1 = const0_rtx;
5058 else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
5060 *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
5061 mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
5062 *code = NE;
5063 *op1 = const0_rtx;
5065 else
5067 enum rtx_code cmp_code;
5069 /* Floating-point tests use a separate C.cond.fmt or CMP.cond.fmt
5070 comparison to set a register. The branch or conditional move will
5071 then compare that register against zero.
5073 Set CMP_CODE to the code of the comparison instruction and
5074 *CODE to the code that the branch or move should use. */
5075 cmp_code = *code;
5076 if (ISA_HAS_CCF)
5078 /* All FP conditions can be implemented directly with CMP.cond.fmt
5079 or by reversing the operands. */
5080 *code = NE;
5081 *op0 = gen_reg_rtx (CCFmode);
5083 else
5085 /* Three FP conditions cannot be implemented by reversing the
5086 operands for C.cond.fmt, instead a reversed condition code is
5087 required and a test for false. */
5088 *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
5089 if (ISA_HAS_8CC)
5090 *op0 = mips_allocate_fcc (CCmode);
5091 else
5092 *op0 = gen_rtx_REG (CCmode, FPSW_REGNUM);
5095 *op1 = const0_rtx;
5096 mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
5100 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
5101 and OPERAND[3]. Store the result in OPERANDS[0].
5103 On 64-bit targets, the mode of the comparison and target will always be
5104 SImode, thus possibly narrower than that of the comparison's operands. */
5106 void
5107 mips_expand_scc (rtx operands[])
5109 rtx target = operands[0];
5110 enum rtx_code code = GET_CODE (operands[1]);
5111 rtx op0 = operands[2];
5112 rtx op1 = operands[3];
5114 gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
5116 if (code == EQ || code == NE)
5118 if (ISA_HAS_SEQ_SNE
5119 && reg_imm10_operand (op1, GET_MODE (op1)))
5120 mips_emit_binary (code, target, op0, op1);
5121 else
5123 rtx zie = mips_zero_if_equal (op0, op1);
5124 mips_emit_binary (code, target, zie, const0_rtx);
5127 else
5128 mips_emit_int_order_test (code, 0, target, op0, op1);
5131 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
5132 CODE and jump to OPERANDS[3] if the condition holds. */
5134 void
5135 mips_expand_conditional_branch (rtx *operands)
5137 enum rtx_code code = GET_CODE (operands[0]);
5138 rtx op0 = operands[1];
5139 rtx op1 = operands[2];
5140 rtx condition;
5142 mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
5143 condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
5144 emit_jump_insn (gen_condjump (condition, operands[3]));
5147 /* Implement:
5149 (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
5150 (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS)) */
5152 void
5153 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
5154 enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
5156 rtx cmp_result;
5157 bool reversed_p;
5159 reversed_p = mips_reversed_fp_cond (&cond);
5160 cmp_result = mips_allocate_fcc (CCV2mode);
5161 emit_insn (gen_scc_ps (cmp_result,
5162 gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
5163 if (reversed_p)
5164 emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
5165 cmp_result));
5166 else
5167 emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
5168 cmp_result));
5171 /* Perform the comparison in OPERANDS[1]. Move OPERANDS[2] into OPERANDS[0]
5172 if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0]. */
5174 void
5175 mips_expand_conditional_move (rtx *operands)
5177 rtx cond;
5178 enum rtx_code code = GET_CODE (operands[1]);
5179 rtx op0 = XEXP (operands[1], 0);
5180 rtx op1 = XEXP (operands[1], 1);
5182 mips_emit_compare (&code, &op0, &op1, true);
5183 cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
5185 /* There is no direct support for general conditional GP move involving
5186 two registers using SEL. */
5187 if (ISA_HAS_SEL
5188 && INTEGRAL_MODE_P (GET_MODE (operands[2]))
5189 && register_operand (operands[2], VOIDmode)
5190 && register_operand (operands[3], VOIDmode))
5192 machine_mode mode = GET_MODE (operands[0]);
5193 rtx temp = gen_reg_rtx (mode);
5194 rtx temp2 = gen_reg_rtx (mode);
5196 emit_insn (gen_rtx_SET (temp,
5197 gen_rtx_IF_THEN_ELSE (mode, cond,
5198 operands[2], const0_rtx)));
5200 /* Flip the test for the second operand. */
5201 cond = gen_rtx_fmt_ee ((code == EQ) ? NE : EQ, GET_MODE (op0), op0, op1);
5203 emit_insn (gen_rtx_SET (temp2,
5204 gen_rtx_IF_THEN_ELSE (mode, cond,
5205 operands[3], const0_rtx)));
5207 /* Merge the two results, at least one is guaranteed to be zero. */
5208 emit_insn (gen_rtx_SET (operands[0], gen_rtx_IOR (mode, temp, temp2)));
5210 else
5212 if (FLOAT_MODE_P (GET_MODE (operands[2])) && !ISA_HAS_SEL)
5214 operands[2] = force_reg (GET_MODE (operands[0]), operands[2]);
5215 operands[3] = force_reg (GET_MODE (operands[0]), operands[3]);
5218 emit_insn (gen_rtx_SET (operands[0],
5219 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
5220 operands[2], operands[3])));
5224 /* Perform the comparison in COMPARISON, then trap if the condition holds. */
5226 void
5227 mips_expand_conditional_trap (rtx comparison)
5229 rtx op0, op1;
5230 machine_mode mode;
5231 enum rtx_code code;
5233 /* MIPS conditional trap instructions don't have GT or LE flavors,
5234 so we must swap the operands and convert to LT and GE respectively. */
5235 code = GET_CODE (comparison);
5236 switch (code)
5238 case GT:
5239 case LE:
5240 case GTU:
5241 case LEU:
5242 code = swap_condition (code);
5243 op0 = XEXP (comparison, 1);
5244 op1 = XEXP (comparison, 0);
5245 break;
5247 default:
5248 op0 = XEXP (comparison, 0);
5249 op1 = XEXP (comparison, 1);
5250 break;
5253 mode = GET_MODE (XEXP (comparison, 0));
5254 op0 = force_reg (mode, op0);
5255 if (!(ISA_HAS_COND_TRAPI
5256 ? arith_operand (op1, mode)
5257 : reg_or_0_operand (op1, mode)))
5258 op1 = force_reg (mode, op1);
5260 emit_insn (gen_rtx_TRAP_IF (VOIDmode,
5261 gen_rtx_fmt_ee (code, mode, op0, op1),
5262 const0_rtx));
5265 /* Initialize *CUM for a call to a function of type FNTYPE. */
5267 void
5268 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
5270 memset (cum, 0, sizeof (*cum));
5271 cum->prototype = (fntype && prototype_p (fntype));
5272 cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
5275 /* Fill INFO with information about a single argument. CUM is the
5276 cumulative state for earlier arguments. MODE is the mode of this
5277 argument and TYPE is its type (if known). NAMED is true if this
5278 is a named (fixed) argument rather than a variable one. */
5280 static void
5281 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
5282 machine_mode mode, const_tree type, bool named)
5284 bool doubleword_aligned_p;
5285 unsigned int num_bytes, num_words, max_regs;
5287 /* Work out the size of the argument. */
5288 num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5289 num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5291 /* Decide whether it should go in a floating-point register, assuming
5292 one is free. Later code checks for availability.
5294 The checks against UNITS_PER_FPVALUE handle the soft-float and
5295 single-float cases. */
5296 switch (mips_abi)
5298 case ABI_EABI:
5299 /* The EABI conventions have traditionally been defined in terms
5300 of TYPE_MODE, regardless of the actual type. */
5301 info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
5302 || mode == V2SFmode)
5303 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5304 break;
5306 case ABI_32:
5307 case ABI_O64:
5308 /* Only leading floating-point scalars are passed in
5309 floating-point registers. We also handle vector floats the same
5310 say, which is OK because they are not covered by the standard ABI. */
5311 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5312 info->fpr_p = (!cum->gp_reg_found
5313 && cum->arg_number < 2
5314 && (type == 0
5315 || SCALAR_FLOAT_TYPE_P (type)
5316 || VECTOR_FLOAT_TYPE_P (type))
5317 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5318 || mode == V2SFmode)
5319 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5320 break;
5322 case ABI_N32:
5323 case ABI_64:
5324 /* Scalar, complex and vector floating-point types are passed in
5325 floating-point registers, as long as this is a named rather
5326 than a variable argument. */
5327 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5328 info->fpr_p = (named
5329 && (type == 0 || FLOAT_TYPE_P (type))
5330 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5331 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5332 || mode == V2SFmode)
5333 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
5335 /* ??? According to the ABI documentation, the real and imaginary
5336 parts of complex floats should be passed in individual registers.
5337 The real and imaginary parts of stack arguments are supposed
5338 to be contiguous and there should be an extra word of padding
5339 at the end.
5341 This has two problems. First, it makes it impossible to use a
5342 single "void *" va_list type, since register and stack arguments
5343 are passed differently. (At the time of writing, MIPSpro cannot
5344 handle complex float varargs correctly.) Second, it's unclear
5345 what should happen when there is only one register free.
5347 For now, we assume that named complex floats should go into FPRs
5348 if there are two FPRs free, otherwise they should be passed in the
5349 same way as a struct containing two floats. */
5350 if (info->fpr_p
5351 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5352 && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
5354 if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
5355 info->fpr_p = false;
5356 else
5357 num_words = 2;
5359 break;
5361 default:
5362 gcc_unreachable ();
5365 /* See whether the argument has doubleword alignment. */
5366 doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
5367 > BITS_PER_WORD);
5369 /* Set REG_OFFSET to the register count we're interested in.
5370 The EABI allocates the floating-point registers separately,
5371 but the other ABIs allocate them like integer registers. */
5372 info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
5373 ? cum->num_fprs
5374 : cum->num_gprs);
5376 /* Advance to an even register if the argument is doubleword-aligned. */
5377 if (doubleword_aligned_p)
5378 info->reg_offset += info->reg_offset & 1;
5380 /* Work out the offset of a stack argument. */
5381 info->stack_offset = cum->stack_words;
5382 if (doubleword_aligned_p)
5383 info->stack_offset += info->stack_offset & 1;
5385 max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
5387 /* Partition the argument between registers and stack. */
5388 info->reg_words = MIN (num_words, max_regs);
5389 info->stack_words = num_words - info->reg_words;
5392 /* INFO describes a register argument that has the normal format for the
5393 argument's mode. Return the register it uses, assuming that FPRs are
5394 available if HARD_FLOAT_P. */
5396 static unsigned int
5397 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
5399 if (!info->fpr_p || !hard_float_p)
5400 return GP_ARG_FIRST + info->reg_offset;
5401 else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
5402 /* In o32, the second argument is always passed in $f14
5403 for TARGET_DOUBLE_FLOAT, regardless of whether the
5404 first argument was a word or doubleword. */
5405 return FP_ARG_FIRST + 2;
5406 else
5407 return FP_ARG_FIRST + info->reg_offset;
5410 /* Implement TARGET_STRICT_ARGUMENT_NAMING. */
5412 static bool
5413 mips_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
5415 return !TARGET_OLDABI;
5418 /* Implement TARGET_FUNCTION_ARG. */
5420 static rtx
5421 mips_function_arg (cumulative_args_t cum_v, machine_mode mode,
5422 const_tree type, bool named)
5424 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5425 struct mips_arg_info info;
5427 /* We will be called with a mode of VOIDmode after the last argument
5428 has been seen. Whatever we return will be passed to the call expander.
5429 If we need a MIPS16 fp_code, return a REG with the code stored as
5430 the mode. */
5431 if (mode == VOIDmode)
5433 if (TARGET_MIPS16 && cum->fp_code != 0)
5434 return gen_rtx_REG ((machine_mode) cum->fp_code, 0);
5435 else
5436 return NULL;
5439 mips_get_arg_info (&info, cum, mode, type, named);
5441 /* Return straight away if the whole argument is passed on the stack. */
5442 if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
5443 return NULL;
5445 /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
5446 contains a double in its entirety, then that 64-bit chunk is passed
5447 in a floating-point register. */
5448 if (TARGET_NEWABI
5449 && TARGET_HARD_FLOAT
5450 && named
5451 && type != 0
5452 && TREE_CODE (type) == RECORD_TYPE
5453 && TYPE_SIZE_UNIT (type)
5454 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
5456 tree field;
5458 /* First check to see if there is any such field. */
5459 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5460 if (TREE_CODE (field) == FIELD_DECL
5461 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5462 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
5463 && tree_fits_shwi_p (bit_position (field))
5464 && int_bit_position (field) % BITS_PER_WORD == 0)
5465 break;
5467 if (field != 0)
5469 /* Now handle the special case by returning a PARALLEL
5470 indicating where each 64-bit chunk goes. INFO.REG_WORDS
5471 chunks are passed in registers. */
5472 unsigned int i;
5473 HOST_WIDE_INT bitpos;
5474 rtx ret;
5476 /* assign_parms checks the mode of ENTRY_PARM, so we must
5477 use the actual mode here. */
5478 ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
5480 bitpos = 0;
5481 field = TYPE_FIELDS (type);
5482 for (i = 0; i < info.reg_words; i++)
5484 rtx reg;
5486 for (; field; field = DECL_CHAIN (field))
5487 if (TREE_CODE (field) == FIELD_DECL
5488 && int_bit_position (field) >= bitpos)
5489 break;
5491 if (field
5492 && int_bit_position (field) == bitpos
5493 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5494 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
5495 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
5496 else
5497 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
5499 XVECEXP (ret, 0, i)
5500 = gen_rtx_EXPR_LIST (VOIDmode, reg,
5501 GEN_INT (bitpos / BITS_PER_UNIT));
5503 bitpos += BITS_PER_WORD;
5505 return ret;
5509 /* Handle the n32/n64 conventions for passing complex floating-point
5510 arguments in FPR pairs. The real part goes in the lower register
5511 and the imaginary part goes in the upper register. */
5512 if (TARGET_NEWABI
5513 && info.fpr_p
5514 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5516 rtx real, imag;
5517 machine_mode inner;
5518 unsigned int regno;
5520 inner = GET_MODE_INNER (mode);
5521 regno = FP_ARG_FIRST + info.reg_offset;
5522 if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
5524 /* Real part in registers, imaginary part on stack. */
5525 gcc_assert (info.stack_words == info.reg_words);
5526 return gen_rtx_REG (inner, regno);
5528 else
5530 gcc_assert (info.stack_words == 0);
5531 real = gen_rtx_EXPR_LIST (VOIDmode,
5532 gen_rtx_REG (inner, regno),
5533 const0_rtx);
5534 imag = gen_rtx_EXPR_LIST (VOIDmode,
5535 gen_rtx_REG (inner,
5536 regno + info.reg_words / 2),
5537 GEN_INT (GET_MODE_SIZE (inner)));
5538 return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
5542 return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
5545 /* Implement TARGET_FUNCTION_ARG_ADVANCE. */
5547 static void
5548 mips_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
5549 const_tree type, bool named)
5551 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5552 struct mips_arg_info info;
5554 mips_get_arg_info (&info, cum, mode, type, named);
5556 if (!info.fpr_p)
5557 cum->gp_reg_found = true;
5559 /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
5560 an explanation of what this code does. It assumes that we're using
5561 either the o32 or the o64 ABI, both of which pass at most 2 arguments
5562 in FPRs. */
5563 if (cum->arg_number < 2 && info.fpr_p)
5564 cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
5566 /* Advance the register count. This has the effect of setting
5567 num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
5568 argument required us to skip the final GPR and pass the whole
5569 argument on the stack. */
5570 if (mips_abi != ABI_EABI || !info.fpr_p)
5571 cum->num_gprs = info.reg_offset + info.reg_words;
5572 else if (info.reg_words > 0)
5573 cum->num_fprs += MAX_FPRS_PER_FMT;
5575 /* Advance the stack word count. */
5576 if (info.stack_words > 0)
5577 cum->stack_words = info.stack_offset + info.stack_words;
5579 cum->arg_number++;
5582 /* Implement TARGET_ARG_PARTIAL_BYTES. */
5584 static int
5585 mips_arg_partial_bytes (cumulative_args_t cum,
5586 machine_mode mode, tree type, bool named)
5588 struct mips_arg_info info;
5590 mips_get_arg_info (&info, get_cumulative_args (cum), mode, type, named);
5591 return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
5594 /* Implement TARGET_FUNCTION_ARG_BOUNDARY. Every parameter gets at
5595 least PARM_BOUNDARY bits of alignment, but will be given anything up
5596 to STACK_BOUNDARY bits if the type requires it. */
5598 static unsigned int
5599 mips_function_arg_boundary (machine_mode mode, const_tree type)
5601 unsigned int alignment;
5603 alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5604 if (alignment < PARM_BOUNDARY)
5605 alignment = PARM_BOUNDARY;
5606 if (alignment > STACK_BOUNDARY)
5607 alignment = STACK_BOUNDARY;
5608 return alignment;
5611 /* Implement TARGET_GET_RAW_RESULT_MODE and TARGET_GET_RAW_ARG_MODE. */
5613 static machine_mode
5614 mips_get_reg_raw_mode (int regno)
5616 if (TARGET_FLOATXX && FP_REG_P (regno))
5617 return DFmode;
5618 return default_get_reg_raw_mode (regno);
5621 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5622 upward rather than downward. In other words, return true if the
5623 first byte of the stack slot has useful data, false if the last
5624 byte does. */
5626 bool
5627 mips_pad_arg_upward (machine_mode mode, const_tree type)
5629 /* On little-endian targets, the first byte of every stack argument
5630 is passed in the first byte of the stack slot. */
5631 if (!BYTES_BIG_ENDIAN)
5632 return true;
5634 /* Otherwise, integral types are padded downward: the last byte of a
5635 stack argument is passed in the last byte of the stack slot. */
5636 if (type != 0
5637 ? (INTEGRAL_TYPE_P (type)
5638 || POINTER_TYPE_P (type)
5639 || FIXED_POINT_TYPE_P (type))
5640 : (SCALAR_INT_MODE_P (mode)
5641 || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5642 return false;
5644 /* Big-endian o64 pads floating-point arguments downward. */
5645 if (mips_abi == ABI_O64)
5646 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5647 return false;
5649 /* Other types are padded upward for o32, o64, n32 and n64. */
5650 if (mips_abi != ABI_EABI)
5651 return true;
5653 /* Arguments smaller than a stack slot are padded downward. */
5654 if (mode != BLKmode)
5655 return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5656 else
5657 return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5660 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...). Return !BYTES_BIG_ENDIAN
5661 if the least significant byte of the register has useful data. Return
5662 the opposite if the most significant byte does. */
5664 bool
5665 mips_pad_reg_upward (machine_mode mode, tree type)
5667 /* No shifting is required for floating-point arguments. */
5668 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5669 return !BYTES_BIG_ENDIAN;
5671 /* Otherwise, apply the same padding to register arguments as we do
5672 to stack arguments. */
5673 return mips_pad_arg_upward (mode, type);
5676 /* Return nonzero when an argument must be passed by reference. */
5678 static bool
5679 mips_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
5680 machine_mode mode, const_tree type,
5681 bool named ATTRIBUTE_UNUSED)
5683 if (mips_abi == ABI_EABI)
5685 int size;
5687 /* ??? How should SCmode be handled? */
5688 if (mode == DImode || mode == DFmode
5689 || mode == DQmode || mode == UDQmode
5690 || mode == DAmode || mode == UDAmode)
5691 return 0;
5693 size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5694 return size == -1 || size > UNITS_PER_WORD;
5696 else
5698 /* If we have a variable-sized parameter, we have no choice. */
5699 return targetm.calls.must_pass_in_stack (mode, type);
5703 /* Implement TARGET_CALLEE_COPIES. */
5705 static bool
5706 mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED,
5707 machine_mode mode ATTRIBUTE_UNUSED,
5708 const_tree type ATTRIBUTE_UNUSED, bool named)
5710 return mips_abi == ABI_EABI && named;
5713 /* See whether VALTYPE is a record whose fields should be returned in
5714 floating-point registers. If so, return the number of fields and
5715 list them in FIELDS (which should have two elements). Return 0
5716 otherwise.
5718 For n32 & n64, a structure with one or two fields is returned in
5719 floating-point registers as long as every field has a floating-point
5720 type. */
5722 static int
5723 mips_fpr_return_fields (const_tree valtype, tree *fields)
5725 tree field;
5726 int i;
5728 if (!TARGET_NEWABI)
5729 return 0;
5731 if (TREE_CODE (valtype) != RECORD_TYPE)
5732 return 0;
5734 i = 0;
5735 for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5737 if (TREE_CODE (field) != FIELD_DECL)
5738 continue;
5740 if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5741 return 0;
5743 if (i == 2)
5744 return 0;
5746 fields[i++] = field;
5748 return i;
5751 /* Implement TARGET_RETURN_IN_MSB. For n32 & n64, we should return
5752 a value in the most significant part of $2/$3 if:
5754 - the target is big-endian;
5756 - the value has a structure or union type (we generalize this to
5757 cover aggregates from other languages too); and
5759 - the structure is not returned in floating-point registers. */
5761 static bool
5762 mips_return_in_msb (const_tree valtype)
5764 tree fields[2];
5766 return (TARGET_NEWABI
5767 && TARGET_BIG_ENDIAN
5768 && AGGREGATE_TYPE_P (valtype)
5769 && mips_fpr_return_fields (valtype, fields) == 0);
5772 /* Return true if the function return value MODE will get returned in a
5773 floating-point register. */
5775 static bool
5776 mips_return_mode_in_fpr_p (machine_mode mode)
5778 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT || mode != V2SFmode);
5779 return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5780 || mode == V2SFmode
5781 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5782 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5785 /* Return the representation of an FPR return register when the
5786 value being returned in FP_RETURN has mode VALUE_MODE and the
5787 return type itself has mode TYPE_MODE. On NewABI targets,
5788 the two modes may be different for structures like:
5790 struct __attribute__((packed)) foo { float f; }
5792 where we return the SFmode value of "f" in FP_RETURN, but where
5793 the structure itself has mode BLKmode. */
5795 static rtx
5796 mips_return_fpr_single (machine_mode type_mode,
5797 machine_mode value_mode)
5799 rtx x;
5801 x = gen_rtx_REG (value_mode, FP_RETURN);
5802 if (type_mode != value_mode)
5804 x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5805 x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5807 return x;
5810 /* Return a composite value in a pair of floating-point registers.
5811 MODE1 and OFFSET1 are the mode and byte offset for the first value,
5812 likewise MODE2 and OFFSET2 for the second. MODE is the mode of the
5813 complete value.
5815 For n32 & n64, $f0 always holds the first value and $f2 the second.
5816 Otherwise the values are packed together as closely as possible. */
5818 static rtx
5819 mips_return_fpr_pair (machine_mode mode,
5820 machine_mode mode1, HOST_WIDE_INT offset1,
5821 machine_mode mode2, HOST_WIDE_INT offset2)
5823 int inc;
5825 inc = (TARGET_NEWABI || mips_abi == ABI_32 ? 2 : MAX_FPRS_PER_FMT);
5826 return gen_rtx_PARALLEL
5827 (mode,
5828 gen_rtvec (2,
5829 gen_rtx_EXPR_LIST (VOIDmode,
5830 gen_rtx_REG (mode1, FP_RETURN),
5831 GEN_INT (offset1)),
5832 gen_rtx_EXPR_LIST (VOIDmode,
5833 gen_rtx_REG (mode2, FP_RETURN + inc),
5834 GEN_INT (offset2))));
5838 /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5839 For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5840 For libcalls, VALTYPE is null and MODE is the mode of the return value. */
5842 static rtx
5843 mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5844 machine_mode mode)
5846 if (valtype)
5848 tree fields[2];
5849 int unsigned_p;
5850 const_tree func;
5852 if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5853 func = fn_decl_or_type;
5854 else
5855 func = NULL;
5857 mode = TYPE_MODE (valtype);
5858 unsigned_p = TYPE_UNSIGNED (valtype);
5860 /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5861 return values, promote the mode here too. */
5862 mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5864 /* Handle structures whose fields are returned in $f0/$f2. */
5865 switch (mips_fpr_return_fields (valtype, fields))
5867 case 1:
5868 return mips_return_fpr_single (mode,
5869 TYPE_MODE (TREE_TYPE (fields[0])));
5871 case 2:
5872 return mips_return_fpr_pair (mode,
5873 TYPE_MODE (TREE_TYPE (fields[0])),
5874 int_byte_position (fields[0]),
5875 TYPE_MODE (TREE_TYPE (fields[1])),
5876 int_byte_position (fields[1]));
5879 /* If a value is passed in the most significant part of a register, see
5880 whether we have to round the mode up to a whole number of words. */
5881 if (mips_return_in_msb (valtype))
5883 HOST_WIDE_INT size = int_size_in_bytes (valtype);
5884 if (size % UNITS_PER_WORD != 0)
5886 size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5887 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5891 /* For EABI, the class of return register depends entirely on MODE.
5892 For example, "struct { some_type x; }" and "union { some_type x; }"
5893 are returned in the same way as a bare "some_type" would be.
5894 Other ABIs only use FPRs for scalar, complex or vector types. */
5895 if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5896 return gen_rtx_REG (mode, GP_RETURN);
5899 if (!TARGET_MIPS16)
5901 /* Handle long doubles for n32 & n64. */
5902 if (mode == TFmode)
5903 return mips_return_fpr_pair (mode,
5904 DImode, 0,
5905 DImode, GET_MODE_SIZE (mode) / 2);
5907 if (mips_return_mode_in_fpr_p (mode))
5909 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5910 return mips_return_fpr_pair (mode,
5911 GET_MODE_INNER (mode), 0,
5912 GET_MODE_INNER (mode),
5913 GET_MODE_SIZE (mode) / 2);
5914 else
5915 return gen_rtx_REG (mode, FP_RETURN);
5919 return gen_rtx_REG (mode, GP_RETURN);
5922 /* Implement TARGET_FUNCTION_VALUE. */
5924 static rtx
5925 mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5926 bool outgoing ATTRIBUTE_UNUSED)
5928 return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5931 /* Implement TARGET_LIBCALL_VALUE. */
5933 static rtx
5934 mips_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5936 return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5939 /* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5941 On the MIPS, R2 R3 and F0 F2 are the only register thus used. */
5943 static bool
5944 mips_function_value_regno_p (const unsigned int regno)
5946 /* Most types only require one GPR or one FPR for return values but for
5947 hard-float two FPRs can be used for _Complex types (for all ABIs)
5948 and long doubles (for n64). */
5949 if (regno == GP_RETURN
5950 || regno == FP_RETURN
5951 || (FP_RETURN != GP_RETURN
5952 && regno == FP_RETURN + 2))
5953 return true;
5955 /* For o32 FP32, _Complex double will be returned in four 32-bit registers.
5956 This does not apply to o32 FPXX as floating-point function argument and
5957 return registers are described as 64-bit even though floating-point
5958 registers are primarily described as 32-bit internally.
5959 See: mips_get_reg_raw_mode. */
5960 if ((mips_abi == ABI_32 && TARGET_FLOAT32)
5961 && FP_RETURN != GP_RETURN
5962 && (regno == FP_RETURN + 1
5963 || regno == FP_RETURN + 3))
5964 return true;
5966 return false;
5969 /* Implement TARGET_RETURN_IN_MEMORY. Under the o32 and o64 ABIs,
5970 all BLKmode objects are returned in memory. Under the n32, n64
5971 and embedded ABIs, small structures are returned in a register.
5972 Objects with varying size must still be returned in memory, of
5973 course. */
5975 static bool
5976 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5978 return (TARGET_OLDABI
5979 ? TYPE_MODE (type) == BLKmode
5980 : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5983 /* Implement TARGET_SETUP_INCOMING_VARARGS. */
5985 static void
5986 mips_setup_incoming_varargs (cumulative_args_t cum, machine_mode mode,
5987 tree type, int *pretend_size ATTRIBUTE_UNUSED,
5988 int no_rtl)
5990 CUMULATIVE_ARGS local_cum;
5991 int gp_saved, fp_saved;
5993 /* The caller has advanced CUM up to, but not beyond, the last named
5994 argument. Advance a local copy of CUM past the last "real" named
5995 argument, to find out how many registers are left over. */
5996 local_cum = *get_cumulative_args (cum);
5997 mips_function_arg_advance (pack_cumulative_args (&local_cum), mode, type,
5998 true);
6000 /* Found out how many registers we need to save. */
6001 gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
6002 fp_saved = (EABI_FLOAT_VARARGS_P
6003 ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
6004 : 0);
6006 if (!no_rtl)
6008 if (gp_saved > 0)
6010 rtx ptr, mem;
6012 ptr = plus_constant (Pmode, virtual_incoming_args_rtx,
6013 REG_PARM_STACK_SPACE (cfun->decl)
6014 - gp_saved * UNITS_PER_WORD);
6015 mem = gen_frame_mem (BLKmode, ptr);
6016 set_mem_alias_set (mem, get_varargs_alias_set ());
6018 move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
6019 mem, gp_saved);
6021 if (fp_saved > 0)
6023 /* We can't use move_block_from_reg, because it will use
6024 the wrong mode. */
6025 machine_mode mode;
6026 int off, i;
6028 /* Set OFF to the offset from virtual_incoming_args_rtx of
6029 the first float register. The FP save area lies below
6030 the integer one, and is aligned to UNITS_PER_FPVALUE bytes. */
6031 off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
6032 off -= fp_saved * UNITS_PER_FPREG;
6034 mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
6036 for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
6037 i += MAX_FPRS_PER_FMT)
6039 rtx ptr, mem;
6041 ptr = plus_constant (Pmode, virtual_incoming_args_rtx, off);
6042 mem = gen_frame_mem (mode, ptr);
6043 set_mem_alias_set (mem, get_varargs_alias_set ());
6044 mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
6045 off += UNITS_PER_HWFPVALUE;
6049 if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
6050 cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
6051 + fp_saved * UNITS_PER_FPREG);
6054 /* Implement TARGET_BUILTIN_VA_LIST. */
6056 static tree
6057 mips_build_builtin_va_list (void)
6059 if (EABI_FLOAT_VARARGS_P)
6061 /* We keep 3 pointers, and two offsets.
6063 Two pointers are to the overflow area, which starts at the CFA.
6064 One of these is constant, for addressing into the GPR save area
6065 below it. The other is advanced up the stack through the
6066 overflow region.
6068 The third pointer is to the bottom of the GPR save area.
6069 Since the FPR save area is just below it, we can address
6070 FPR slots off this pointer.
6072 We also keep two one-byte offsets, which are to be subtracted
6073 from the constant pointers to yield addresses in the GPR and
6074 FPR save areas. These are downcounted as float or non-float
6075 arguments are used, and when they get to zero, the argument
6076 must be obtained from the overflow region. */
6077 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
6078 tree array, index;
6080 record = lang_hooks.types.make_type (RECORD_TYPE);
6082 f_ovfl = build_decl (BUILTINS_LOCATION,
6083 FIELD_DECL, get_identifier ("__overflow_argptr"),
6084 ptr_type_node);
6085 f_gtop = build_decl (BUILTINS_LOCATION,
6086 FIELD_DECL, get_identifier ("__gpr_top"),
6087 ptr_type_node);
6088 f_ftop = build_decl (BUILTINS_LOCATION,
6089 FIELD_DECL, get_identifier ("__fpr_top"),
6090 ptr_type_node);
6091 f_goff = build_decl (BUILTINS_LOCATION,
6092 FIELD_DECL, get_identifier ("__gpr_offset"),
6093 unsigned_char_type_node);
6094 f_foff = build_decl (BUILTINS_LOCATION,
6095 FIELD_DECL, get_identifier ("__fpr_offset"),
6096 unsigned_char_type_node);
6097 /* Explicitly pad to the size of a pointer, so that -Wpadded won't
6098 warn on every user file. */
6099 index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
6100 array = build_array_type (unsigned_char_type_node,
6101 build_index_type (index));
6102 f_res = build_decl (BUILTINS_LOCATION,
6103 FIELD_DECL, get_identifier ("__reserved"), array);
6105 DECL_FIELD_CONTEXT (f_ovfl) = record;
6106 DECL_FIELD_CONTEXT (f_gtop) = record;
6107 DECL_FIELD_CONTEXT (f_ftop) = record;
6108 DECL_FIELD_CONTEXT (f_goff) = record;
6109 DECL_FIELD_CONTEXT (f_foff) = record;
6110 DECL_FIELD_CONTEXT (f_res) = record;
6112 TYPE_FIELDS (record) = f_ovfl;
6113 DECL_CHAIN (f_ovfl) = f_gtop;
6114 DECL_CHAIN (f_gtop) = f_ftop;
6115 DECL_CHAIN (f_ftop) = f_goff;
6116 DECL_CHAIN (f_goff) = f_foff;
6117 DECL_CHAIN (f_foff) = f_res;
6119 layout_type (record);
6120 return record;
6122 else
6123 /* Otherwise, we use 'void *'. */
6124 return ptr_type_node;
6127 /* Implement TARGET_EXPAND_BUILTIN_VA_START. */
6129 static void
6130 mips_va_start (tree valist, rtx nextarg)
6132 if (EABI_FLOAT_VARARGS_P)
6134 const CUMULATIVE_ARGS *cum;
6135 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
6136 tree ovfl, gtop, ftop, goff, foff;
6137 tree t;
6138 int gpr_save_area_size;
6139 int fpr_save_area_size;
6140 int fpr_offset;
6142 cum = &crtl->args.info;
6143 gpr_save_area_size
6144 = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
6145 fpr_save_area_size
6146 = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
6148 f_ovfl = TYPE_FIELDS (va_list_type_node);
6149 f_gtop = DECL_CHAIN (f_ovfl);
6150 f_ftop = DECL_CHAIN (f_gtop);
6151 f_goff = DECL_CHAIN (f_ftop);
6152 f_foff = DECL_CHAIN (f_goff);
6154 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6155 NULL_TREE);
6156 gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
6157 NULL_TREE);
6158 ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
6159 NULL_TREE);
6160 goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
6161 NULL_TREE);
6162 foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
6163 NULL_TREE);
6165 /* Emit code to initialize OVFL, which points to the next varargs
6166 stack argument. CUM->STACK_WORDS gives the number of stack
6167 words used by named arguments. */
6168 t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
6169 if (cum->stack_words > 0)
6170 t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
6171 t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
6172 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6174 /* Emit code to initialize GTOP, the top of the GPR save area. */
6175 t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
6176 t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
6177 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6179 /* Emit code to initialize FTOP, the top of the FPR save area.
6180 This address is gpr_save_area_bytes below GTOP, rounded
6181 down to the next fp-aligned boundary. */
6182 t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
6183 fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
6184 fpr_offset &= -UNITS_PER_FPVALUE;
6185 if (fpr_offset)
6186 t = fold_build_pointer_plus_hwi (t, -fpr_offset);
6187 t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
6188 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6190 /* Emit code to initialize GOFF, the offset from GTOP of the
6191 next GPR argument. */
6192 t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
6193 build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
6194 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6196 /* Likewise emit code to initialize FOFF, the offset from FTOP
6197 of the next FPR argument. */
6198 t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
6199 build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
6200 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6202 else
6204 nextarg = plus_constant (Pmode, nextarg, -cfun->machine->varargs_size);
6205 std_expand_builtin_va_start (valist, nextarg);
6209 /* Like std_gimplify_va_arg_expr, but apply alignment to zero-sized
6210 types as well. */
6212 static tree
6213 mips_std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6214 gimple_seq *post_p)
6216 tree addr, t, type_size, rounded_size, valist_tmp;
6217 unsigned HOST_WIDE_INT align, boundary;
6218 bool indirect;
6220 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6221 if (indirect)
6222 type = build_pointer_type (type);
6224 align = PARM_BOUNDARY / BITS_PER_UNIT;
6225 boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
6227 /* When we align parameter on stack for caller, if the parameter
6228 alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
6229 aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee
6230 here with caller. */
6231 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
6232 boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
6234 boundary /= BITS_PER_UNIT;
6236 /* Hoist the valist value into a temporary for the moment. */
6237 valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
6239 /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
6240 requires greater alignment, we must perform dynamic alignment. */
6241 if (boundary > align)
6243 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6244 fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
6245 gimplify_and_add (t, pre_p);
6247 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6248 fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
6249 valist_tmp,
6250 build_int_cst (TREE_TYPE (valist), -boundary)));
6251 gimplify_and_add (t, pre_p);
6253 else
6254 boundary = align;
6256 /* If the actual alignment is less than the alignment of the type,
6257 adjust the type accordingly so that we don't assume strict alignment
6258 when dereferencing the pointer. */
6259 boundary *= BITS_PER_UNIT;
6260 if (boundary < TYPE_ALIGN (type))
6262 type = build_variant_type_copy (type);
6263 TYPE_ALIGN (type) = boundary;
6266 /* Compute the rounded size of the type. */
6267 type_size = size_in_bytes (type);
6268 rounded_size = round_up (type_size, align);
6270 /* Reduce rounded_size so it's sharable with the postqueue. */
6271 gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
6273 /* Get AP. */
6274 addr = valist_tmp;
6275 if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
6277 /* Small args are padded downward. */
6278 t = fold_build2_loc (input_location, GT_EXPR, sizetype,
6279 rounded_size, size_int (align));
6280 t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
6281 size_binop (MINUS_EXPR, rounded_size, type_size));
6282 addr = fold_build_pointer_plus (addr, t);
6285 /* Compute new value for AP. */
6286 t = fold_build_pointer_plus (valist_tmp, rounded_size);
6287 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
6288 gimplify_and_add (t, pre_p);
6290 addr = fold_convert (build_pointer_type (type), addr);
6292 if (indirect)
6293 addr = build_va_arg_indirect_ref (addr);
6295 return build_va_arg_indirect_ref (addr);
6298 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR. */
6300 static tree
6301 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6302 gimple_seq *post_p)
6304 tree addr;
6305 bool indirect_p;
6307 indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
6308 if (indirect_p)
6309 type = build_pointer_type (type);
6311 if (!EABI_FLOAT_VARARGS_P)
6312 addr = mips_std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6313 else
6315 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
6316 tree ovfl, top, off, align;
6317 HOST_WIDE_INT size, rsize, osize;
6318 tree t, u;
6320 f_ovfl = TYPE_FIELDS (va_list_type_node);
6321 f_gtop = DECL_CHAIN (f_ovfl);
6322 f_ftop = DECL_CHAIN (f_gtop);
6323 f_goff = DECL_CHAIN (f_ftop);
6324 f_foff = DECL_CHAIN (f_goff);
6326 /* Let:
6328 TOP be the top of the GPR or FPR save area;
6329 OFF be the offset from TOP of the next register;
6330 ADDR_RTX be the address of the argument;
6331 SIZE be the number of bytes in the argument type;
6332 RSIZE be the number of bytes used to store the argument
6333 when it's in the register save area; and
6334 OSIZE be the number of bytes used to store it when it's
6335 in the stack overflow area.
6337 The code we want is:
6339 1: off &= -rsize; // round down
6340 2: if (off != 0)
6341 3: {
6342 4: addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
6343 5: off -= rsize;
6344 6: }
6345 7: else
6346 8: {
6347 9: ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
6348 10: addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
6349 11: ovfl += osize;
6350 14: }
6352 [1] and [9] can sometimes be optimized away. */
6354 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6355 NULL_TREE);
6356 size = int_size_in_bytes (type);
6358 if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
6359 && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
6361 top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
6362 unshare_expr (valist), f_ftop, NULL_TREE);
6363 off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
6364 unshare_expr (valist), f_foff, NULL_TREE);
6366 /* When va_start saves FPR arguments to the stack, each slot
6367 takes up UNITS_PER_HWFPVALUE bytes, regardless of the
6368 argument's precision. */
6369 rsize = UNITS_PER_HWFPVALUE;
6371 /* Overflow arguments are padded to UNITS_PER_WORD bytes
6372 (= PARM_BOUNDARY bits). This can be different from RSIZE
6373 in two cases:
6375 (1) On 32-bit targets when TYPE is a structure such as:
6377 struct s { float f; };
6379 Such structures are passed in paired FPRs, so RSIZE
6380 will be 8 bytes. However, the structure only takes
6381 up 4 bytes of memory, so OSIZE will only be 4.
6383 (2) In combinations such as -mgp64 -msingle-float
6384 -fshort-double. Doubles passed in registers will then take
6385 up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
6386 stack take up UNITS_PER_WORD bytes. */
6387 osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
6389 else
6391 top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
6392 unshare_expr (valist), f_gtop, NULL_TREE);
6393 off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
6394 unshare_expr (valist), f_goff, NULL_TREE);
6395 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6396 if (rsize > UNITS_PER_WORD)
6398 /* [1] Emit code for: off &= -rsize. */
6399 t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
6400 build_int_cst (TREE_TYPE (off), -rsize));
6401 gimplify_assign (unshare_expr (off), t, pre_p);
6403 osize = rsize;
6406 /* [2] Emit code to branch if off == 0. */
6407 t = build2 (NE_EXPR, boolean_type_node, unshare_expr (off),
6408 build_int_cst (TREE_TYPE (off), 0));
6409 addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
6411 /* [5] Emit code for: off -= rsize. We do this as a form of
6412 post-decrement not available to C. */
6413 t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
6414 t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
6416 /* [4] Emit code for:
6417 addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
6418 t = fold_convert (sizetype, t);
6419 t = fold_build1 (NEGATE_EXPR, sizetype, t);
6420 t = fold_build_pointer_plus (top, t);
6421 if (BYTES_BIG_ENDIAN && rsize > size)
6422 t = fold_build_pointer_plus_hwi (t, rsize - size);
6423 COND_EXPR_THEN (addr) = t;
6425 if (osize > UNITS_PER_WORD)
6427 /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
6428 t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
6429 u = build_int_cst (TREE_TYPE (t), -osize);
6430 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
6431 align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
6432 unshare_expr (ovfl), t);
6434 else
6435 align = NULL;
6437 /* [10, 11] Emit code for:
6438 addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
6439 ovfl += osize. */
6440 u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
6441 t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
6442 if (BYTES_BIG_ENDIAN && osize > size)
6443 t = fold_build_pointer_plus_hwi (t, osize - size);
6445 /* String [9] and [10, 11] together. */
6446 if (align)
6447 t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
6448 COND_EXPR_ELSE (addr) = t;
6450 addr = fold_convert (build_pointer_type (type), addr);
6451 addr = build_va_arg_indirect_ref (addr);
6454 if (indirect_p)
6455 addr = build_va_arg_indirect_ref (addr);
6457 return addr;
6460 /* Declare a unique, locally-binding function called NAME, then start
6461 its definition. */
6463 static void
6464 mips_start_unique_function (const char *name)
6466 tree decl;
6468 decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
6469 get_identifier (name),
6470 build_function_type_list (void_type_node, NULL_TREE));
6471 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
6472 NULL_TREE, void_type_node);
6473 TREE_PUBLIC (decl) = 1;
6474 TREE_STATIC (decl) = 1;
6476 cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl));
6478 targetm.asm_out.unique_section (decl, 0);
6479 switch_to_section (get_named_section (decl, NULL, 0));
6481 targetm.asm_out.globalize_label (asm_out_file, name);
6482 fputs ("\t.hidden\t", asm_out_file);
6483 assemble_name (asm_out_file, name);
6484 putc ('\n', asm_out_file);
6487 /* Start a definition of function NAME. MIPS16_P indicates whether the
6488 function contains MIPS16 code. */
6490 static void
6491 mips_start_function_definition (const char *name, bool mips16_p)
6493 if (mips16_p)
6494 fprintf (asm_out_file, "\t.set\tmips16\n");
6495 else
6496 fprintf (asm_out_file, "\t.set\tnomips16\n");
6498 if (TARGET_MICROMIPS)
6499 fprintf (asm_out_file, "\t.set\tmicromips\n");
6500 #ifdef HAVE_GAS_MICROMIPS
6501 else
6502 fprintf (asm_out_file, "\t.set\tnomicromips\n");
6503 #endif
6505 if (!flag_inhibit_size_directive)
6507 fputs ("\t.ent\t", asm_out_file);
6508 assemble_name (asm_out_file, name);
6509 fputs ("\n", asm_out_file);
6512 ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
6514 /* Start the definition proper. */
6515 assemble_name (asm_out_file, name);
6516 fputs (":\n", asm_out_file);
6519 /* End a function definition started by mips_start_function_definition. */
6521 static void
6522 mips_end_function_definition (const char *name)
6524 if (!flag_inhibit_size_directive)
6526 fputs ("\t.end\t", asm_out_file);
6527 assemble_name (asm_out_file, name);
6528 fputs ("\n", asm_out_file);
6532 /* If *STUB_PTR points to a stub, output a comdat-style definition for it,
6533 then free *STUB_PTR. */
6535 static void
6536 mips_finish_stub (mips_one_only_stub **stub_ptr)
6538 mips_one_only_stub *stub = *stub_ptr;
6539 if (!stub)
6540 return;
6542 const char *name = stub->get_name ();
6543 mips_start_unique_function (name);
6544 mips_start_function_definition (name, false);
6545 stub->output_body ();
6546 mips_end_function_definition (name);
6547 delete stub;
6548 *stub_ptr = 0;
6551 /* Return true if calls to X can use R_MIPS_CALL* relocations. */
6553 static bool
6554 mips_ok_for_lazy_binding_p (rtx x)
6556 return (TARGET_USE_GOT
6557 && GET_CODE (x) == SYMBOL_REF
6558 && !SYMBOL_REF_BIND_NOW_P (x)
6559 && !mips_symbol_binds_local_p (x));
6562 /* Load function address ADDR into register DEST. TYPE is as for
6563 mips_expand_call. Return true if we used an explicit lazy-binding
6564 sequence. */
6566 static bool
6567 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
6569 /* If we're generating PIC, and this call is to a global function,
6570 try to allow its address to be resolved lazily. This isn't
6571 possible for sibcalls when $gp is call-saved because the value
6572 of $gp on entry to the stub would be our caller's gp, not ours. */
6573 if (TARGET_EXPLICIT_RELOCS
6574 && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
6575 && mips_ok_for_lazy_binding_p (addr))
6577 addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
6578 emit_insn (gen_rtx_SET (dest, addr));
6579 return true;
6581 else
6583 mips_emit_move (dest, addr);
6584 return false;
6588 /* Each locally-defined hard-float MIPS16 function has a local symbol
6589 associated with it. This hash table maps the function symbol (FUNC)
6590 to the local symbol (LOCAL). */
6591 static GTY (()) hash_map<nofree_string_hash, rtx> *mips16_local_aliases;
6593 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
6594 Return a local alias for it, creating a new one if necessary. */
6596 static rtx
6597 mips16_local_alias (rtx func)
6599 /* Create the hash table if this is the first call. */
6600 if (mips16_local_aliases == NULL)
6601 mips16_local_aliases = hash_map<nofree_string_hash, rtx>::create_ggc (37);
6603 /* Look up the function symbol, creating a new entry if need be. */
6604 bool existed;
6605 const char *func_name = XSTR (func, 0);
6606 rtx *slot = &mips16_local_aliases->get_or_insert (func_name, &existed);
6607 gcc_assert (slot != NULL);
6609 if (!existed)
6611 rtx local;
6613 /* Create a new SYMBOL_REF for the local symbol. The choice of
6614 __fn_local_* is based on the __fn_stub_* names that we've
6615 traditionally used for the non-MIPS16 stub. */
6616 func_name = targetm.strip_name_encoding (XSTR (func, 0));
6617 const char *local_name = ACONCAT (("__fn_local_", func_name, NULL));
6618 local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
6619 SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
6621 /* Create a new structure to represent the mapping. */
6622 *slot = local;
6624 return *slot;
6627 /* A chained list of functions for which mips16_build_call_stub has already
6628 generated a stub. NAME is the name of the function and FP_RET_P is true
6629 if the function returns a value in floating-point registers. */
6630 struct mips16_stub {
6631 struct mips16_stub *next;
6632 char *name;
6633 bool fp_ret_p;
6635 static struct mips16_stub *mips16_stubs;
6637 /* Return the two-character string that identifies floating-point
6638 return mode MODE in the name of a MIPS16 function stub. */
6640 static const char *
6641 mips16_call_stub_mode_suffix (machine_mode mode)
6643 if (mode == SFmode)
6644 return "sf";
6645 else if (mode == DFmode)
6646 return "df";
6647 else if (mode == SCmode)
6648 return "sc";
6649 else if (mode == DCmode)
6650 return "dc";
6651 else if (mode == V2SFmode)
6653 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT);
6654 return "df";
6656 else
6657 gcc_unreachable ();
6660 /* Write instructions to move a 32-bit value between general register
6661 GPREG and floating-point register FPREG. DIRECTION is 't' to move
6662 from GPREG to FPREG and 'f' to move in the opposite direction. */
6664 static void
6665 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6667 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6668 reg_names[gpreg], reg_names[fpreg]);
6671 /* Likewise for 64-bit values. */
6673 static void
6674 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6676 if (TARGET_64BIT)
6677 fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
6678 reg_names[gpreg], reg_names[fpreg]);
6679 else if (ISA_HAS_MXHC1)
6681 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6682 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6683 fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
6684 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
6686 else if (TARGET_FLOATXX && direction == 't')
6688 /* Use the argument save area to move via memory. */
6689 fprintf (asm_out_file, "\tsw\t%s,0($sp)\n", reg_names[gpreg]);
6690 fprintf (asm_out_file, "\tsw\t%s,4($sp)\n", reg_names[gpreg + 1]);
6691 fprintf (asm_out_file, "\tldc1\t%s,0($sp)\n", reg_names[fpreg]);
6693 else if (TARGET_FLOATXX && direction == 'f')
6695 /* Use the argument save area to move via memory. */
6696 fprintf (asm_out_file, "\tsdc1\t%s,0($sp)\n", reg_names[fpreg]);
6697 fprintf (asm_out_file, "\tlw\t%s,0($sp)\n", reg_names[gpreg]);
6698 fprintf (asm_out_file, "\tlw\t%s,4($sp)\n", reg_names[gpreg + 1]);
6700 else
6702 /* Move the least-significant word. */
6703 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6704 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6705 /* ...then the most significant word. */
6706 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6707 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6711 /* Write out code to move floating-point arguments into or out of
6712 general registers. FP_CODE is the code describing which arguments
6713 are present (see the comment above the definition of CUMULATIVE_ARGS
6714 in mips.h). DIRECTION is as for mips_output_32bit_xfer. */
6716 static void
6717 mips_output_args_xfer (int fp_code, char direction)
6719 unsigned int gparg, fparg, f;
6720 CUMULATIVE_ARGS cum;
6722 /* This code only works for o32 and o64. */
6723 gcc_assert (TARGET_OLDABI);
6725 mips_init_cumulative_args (&cum, NULL);
6727 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6729 machine_mode mode;
6730 struct mips_arg_info info;
6732 if ((f & 3) == 1)
6733 mode = SFmode;
6734 else if ((f & 3) == 2)
6735 mode = DFmode;
6736 else
6737 gcc_unreachable ();
6739 mips_get_arg_info (&info, &cum, mode, NULL, true);
6740 gparg = mips_arg_regno (&info, false);
6741 fparg = mips_arg_regno (&info, true);
6743 if (mode == SFmode)
6744 mips_output_32bit_xfer (direction, gparg, fparg);
6745 else
6746 mips_output_64bit_xfer (direction, gparg, fparg);
6748 mips_function_arg_advance (pack_cumulative_args (&cum), mode, NULL, true);
6752 /* Write a MIPS16 stub for the current function. This stub is used
6753 for functions which take arguments in the floating-point registers.
6754 It is normal-mode code that moves the floating-point arguments
6755 into the general registers and then jumps to the MIPS16 code. */
6757 static void
6758 mips16_build_function_stub (void)
6760 const char *fnname, *alias_name, *separator;
6761 char *secname, *stubname;
6762 tree stubdecl;
6763 unsigned int f;
6764 rtx symbol, alias;
6766 /* Create the name of the stub, and its unique section. */
6767 symbol = XEXP (DECL_RTL (current_function_decl), 0);
6768 alias = mips16_local_alias (symbol);
6770 fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6771 alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6772 secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6773 stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6775 /* Build a decl for the stub. */
6776 stubdecl = build_decl (BUILTINS_LOCATION,
6777 FUNCTION_DECL, get_identifier (stubname),
6778 build_function_type_list (void_type_node, NULL_TREE));
6779 set_decl_section_name (stubdecl, secname);
6780 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6781 RESULT_DECL, NULL_TREE, void_type_node);
6783 /* Output a comment. */
6784 fprintf (asm_out_file, "\t# Stub function for %s (",
6785 current_function_name ());
6786 separator = "";
6787 for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6789 fprintf (asm_out_file, "%s%s", separator,
6790 (f & 3) == 1 ? "float" : "double");
6791 separator = ", ";
6793 fprintf (asm_out_file, ")\n");
6795 /* Start the function definition. */
6796 assemble_start_function (stubdecl, stubname);
6797 mips_start_function_definition (stubname, false);
6799 /* If generating pic2 code, either set up the global pointer or
6800 switch to pic0. */
6801 if (TARGET_ABICALLS_PIC2)
6803 if (TARGET_ABSOLUTE_ABICALLS)
6804 fprintf (asm_out_file, "\t.option\tpic0\n");
6805 else
6807 output_asm_insn ("%(.cpload\t%^%)", NULL);
6808 /* Emit an R_MIPS_NONE relocation to tell the linker what the
6809 target function is. Use a local GOT access when loading the
6810 symbol, to cut down on the number of unnecessary GOT entries
6811 for stubs that aren't needed. */
6812 output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6813 symbol = alias;
6817 /* Load the address of the MIPS16 function into $25. Do this first so
6818 that targets with coprocessor interlocks can use an MFC1 to fill the
6819 delay slot. */
6820 output_asm_insn ("la\t%^,%0", &symbol);
6822 /* Move the arguments from floating-point registers to general registers. */
6823 mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6825 /* Jump to the MIPS16 function. */
6826 output_asm_insn ("jr\t%^", NULL);
6828 if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6829 fprintf (asm_out_file, "\t.option\tpic2\n");
6831 mips_end_function_definition (stubname);
6833 /* If the linker needs to create a dynamic symbol for the target
6834 function, it will associate the symbol with the stub (which,
6835 unlike the target function, follows the proper calling conventions).
6836 It is therefore useful to have a local alias for the target function,
6837 so that it can still be identified as MIPS16 code. As an optimization,
6838 this symbol can also be used for indirect MIPS16 references from
6839 within this file. */
6840 ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6842 switch_to_section (function_section (current_function_decl));
6845 /* The current function is a MIPS16 function that returns a value in an FPR.
6846 Copy the return value from its soft-float to its hard-float location.
6847 libgcc2 has special non-MIPS16 helper functions for each case. */
6849 static void
6850 mips16_copy_fpr_return_value (void)
6852 rtx fn, insn, retval;
6853 tree return_type;
6854 machine_mode return_mode;
6855 const char *name;
6857 return_type = DECL_RESULT (current_function_decl);
6858 return_mode = DECL_MODE (return_type);
6860 name = ACONCAT (("__mips16_ret_",
6861 mips16_call_stub_mode_suffix (return_mode),
6862 NULL));
6863 fn = mips16_stub_function (name);
6865 /* The function takes arguments in $2 (and possibly $3), so calls
6866 to it cannot be lazily bound. */
6867 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6869 /* Model the call as something that takes the GPR return value as
6870 argument and returns an "updated" value. */
6871 retval = gen_rtx_REG (return_mode, GP_RETURN);
6872 insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6873 const0_rtx, NULL_RTX, false);
6874 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6877 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6878 RETVAL is the location of the return value, or null if this is
6879 a "call" rather than a "call_value". ARGS_SIZE is the size of the
6880 arguments and FP_CODE is the code built by mips_function_arg;
6881 see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6883 There are three alternatives:
6885 - If a stub was needed, emit the call and return the call insn itself.
6887 - If we can avoid using a stub by redirecting the call, set *FN_PTR
6888 to the new target and return null.
6890 - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6891 unmodified.
6893 A stub is needed for calls to functions that, in normal mode,
6894 receive arguments in FPRs or return values in FPRs. The stub
6895 copies the arguments from their soft-float positions to their
6896 hard-float positions, calls the real function, then copies the
6897 return value from its hard-float position to its soft-float
6898 position.
6900 We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6901 If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6902 automatically redirects the JAL to the stub, otherwise the JAL
6903 continues to call FN directly. */
6905 static rtx_insn *
6906 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6908 const char *fnname;
6909 bool fp_ret_p;
6910 struct mips16_stub *l;
6911 rtx_insn *insn;
6912 rtx pattern, fn;
6914 /* We don't need to do anything if we aren't in MIPS16 mode, or if
6915 we were invoked with the -msoft-float option. */
6916 if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6917 return NULL;
6919 /* Figure out whether the value might come back in a floating-point
6920 register. */
6921 fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6923 /* We don't need to do anything if there were no floating-point
6924 arguments and the value will not be returned in a floating-point
6925 register. */
6926 if (fp_code == 0 && !fp_ret_p)
6927 return NULL;
6929 /* We don't need to do anything if this is a call to a special
6930 MIPS16 support function. */
6931 fn = *fn_ptr;
6932 if (mips16_stub_function_p (fn))
6933 return NULL;
6935 /* If we're calling a locally-defined MIPS16 function, we know that
6936 it will return values in both the "soft-float" and "hard-float"
6937 registers. There is no need to use a stub to move the latter
6938 to the former. */
6939 if (fp_code == 0 && mips16_local_function_p (fn))
6940 return NULL;
6942 /* This code will only work for o32 and o64 abis. The other ABI's
6943 require more sophisticated support. */
6944 gcc_assert (TARGET_OLDABI);
6946 /* If we're calling via a function pointer, use one of the magic
6947 libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6948 Each stub expects the function address to arrive in register $2. */
6949 if (GET_CODE (fn) != SYMBOL_REF
6950 || !call_insn_operand (fn, VOIDmode))
6952 char buf[30];
6953 rtx stub_fn, addr;
6954 rtx_insn *insn;
6955 bool lazy_p;
6957 /* If this is a locally-defined and locally-binding function,
6958 avoid the stub by calling the local alias directly. */
6959 if (mips16_local_function_p (fn))
6961 *fn_ptr = mips16_local_alias (fn);
6962 return NULL;
6965 /* Create a SYMBOL_REF for the libgcc.a function. */
6966 if (fp_ret_p)
6967 sprintf (buf, "__mips16_call_stub_%s_%d",
6968 mips16_call_stub_mode_suffix (GET_MODE (retval)),
6969 fp_code);
6970 else
6971 sprintf (buf, "__mips16_call_stub_%d", fp_code);
6972 stub_fn = mips16_stub_function (buf);
6974 /* The function uses $2 as an argument, so calls to it
6975 cannot be lazily bound. */
6976 SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6978 /* Load the target function into $2. */
6979 addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6980 lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6982 /* Emit the call. */
6983 insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6984 args_size, NULL_RTX, lazy_p);
6986 /* Tell GCC that this call does indeed use the value of $2. */
6987 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6989 /* If we are handling a floating-point return value, we need to
6990 save $18 in the function prologue. Putting a note on the
6991 call will mean that df_regs_ever_live_p ($18) will be true if the
6992 call is not eliminated, and we can check that in the prologue
6993 code. */
6994 if (fp_ret_p)
6995 CALL_INSN_FUNCTION_USAGE (insn) =
6996 gen_rtx_EXPR_LIST (VOIDmode,
6997 gen_rtx_CLOBBER (VOIDmode,
6998 gen_rtx_REG (word_mode, 18)),
6999 CALL_INSN_FUNCTION_USAGE (insn));
7001 return insn;
7004 /* We know the function we are going to call. If we have already
7005 built a stub, we don't need to do anything further. */
7006 fnname = targetm.strip_name_encoding (XSTR (fn, 0));
7007 for (l = mips16_stubs; l != NULL; l = l->next)
7008 if (strcmp (l->name, fnname) == 0)
7009 break;
7011 if (l == NULL)
7013 const char *separator;
7014 char *secname, *stubname;
7015 tree stubid, stubdecl;
7016 unsigned int f;
7018 /* If the function does not return in FPRs, the special stub
7019 section is named
7020 .mips16.call.FNNAME
7022 If the function does return in FPRs, the stub section is named
7023 .mips16.call.fp.FNNAME
7025 Build a decl for the stub. */
7026 secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
7027 fnname, NULL));
7028 stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
7029 fnname, NULL));
7030 stubid = get_identifier (stubname);
7031 stubdecl = build_decl (BUILTINS_LOCATION,
7032 FUNCTION_DECL, stubid,
7033 build_function_type_list (void_type_node,
7034 NULL_TREE));
7035 set_decl_section_name (stubdecl, secname);
7036 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
7037 RESULT_DECL, NULL_TREE,
7038 void_type_node);
7040 /* Output a comment. */
7041 fprintf (asm_out_file, "\t# Stub function to call %s%s (",
7042 (fp_ret_p
7043 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
7044 : ""),
7045 fnname);
7046 separator = "";
7047 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
7049 fprintf (asm_out_file, "%s%s", separator,
7050 (f & 3) == 1 ? "float" : "double");
7051 separator = ", ";
7053 fprintf (asm_out_file, ")\n");
7055 /* Start the function definition. */
7056 assemble_start_function (stubdecl, stubname);
7057 mips_start_function_definition (stubname, false);
7059 if (fp_ret_p)
7061 fprintf (asm_out_file, "\t.cfi_startproc\n");
7063 /* Create a fake CFA 4 bytes below the stack pointer.
7064 This works around unwinders (like libgcc's) that expect
7065 the CFA for non-signal frames to be unique. */
7066 fprintf (asm_out_file, "\t.cfi_def_cfa 29,-4\n");
7068 /* "Save" $sp in itself so we don't use the fake CFA.
7069 This is: DW_CFA_val_expression r29, { DW_OP_reg29 }. */
7070 fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
7072 /* Save the return address in $18. The stub's caller knows
7073 that $18 might be clobbered, even though $18 is usually
7074 a call-saved register.
7076 Do it early on in case the last move to a floating-point
7077 register can be scheduled into the delay slot of the
7078 call we are about to make. */
7079 fprintf (asm_out_file, "\tmove\t%s,%s\n",
7080 reg_names[GP_REG_FIRST + 18],
7081 reg_names[RETURN_ADDR_REGNUM]);
7083 else
7085 /* Load the address of the MIPS16 function into $25. Do this
7086 first so that targets with coprocessor interlocks can use
7087 an MFC1 to fill the delay slot. */
7088 if (TARGET_EXPLICIT_RELOCS)
7090 output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
7091 output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
7093 else
7094 output_asm_insn ("la\t%^,%0", &fn);
7097 /* Move the arguments from general registers to floating-point
7098 registers. */
7099 mips_output_args_xfer (fp_code, 't');
7101 if (fp_ret_p)
7103 /* Now call the non-MIPS16 function. */
7104 output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
7105 fprintf (asm_out_file, "\t.cfi_register 31,18\n");
7107 /* Move the result from floating-point registers to
7108 general registers. */
7109 switch (GET_MODE (retval))
7111 case SCmode:
7112 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
7113 TARGET_BIG_ENDIAN
7114 ? FP_REG_FIRST + 2
7115 : FP_REG_FIRST);
7116 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
7117 TARGET_LITTLE_ENDIAN
7118 ? FP_REG_FIRST + 2
7119 : FP_REG_FIRST);
7120 if (GET_MODE (retval) == SCmode && TARGET_64BIT)
7122 /* On 64-bit targets, complex floats are returned in
7123 a single GPR, such that "sd" on a suitably-aligned
7124 target would store the value correctly. */
7125 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
7126 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
7127 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
7128 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
7129 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
7130 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
7131 fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
7132 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
7133 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
7134 fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
7135 reg_names[GP_RETURN],
7136 reg_names[GP_RETURN],
7137 reg_names[GP_RETURN + 1]);
7139 break;
7141 case SFmode:
7142 mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
7143 break;
7145 case DCmode:
7146 mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
7147 FP_REG_FIRST + 2);
7148 /* Fall though. */
7149 case DFmode:
7150 case V2SFmode:
7151 gcc_assert (TARGET_PAIRED_SINGLE_FLOAT
7152 || GET_MODE (retval) != V2SFmode);
7153 mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
7154 break;
7156 default:
7157 gcc_unreachable ();
7159 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
7160 fprintf (asm_out_file, "\t.cfi_endproc\n");
7162 else
7164 /* Jump to the previously-loaded address. */
7165 output_asm_insn ("jr\t%^", NULL);
7168 #ifdef ASM_DECLARE_FUNCTION_SIZE
7169 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
7170 #endif
7172 mips_end_function_definition (stubname);
7174 /* Record this stub. */
7175 l = XNEW (struct mips16_stub);
7176 l->name = xstrdup (fnname);
7177 l->fp_ret_p = fp_ret_p;
7178 l->next = mips16_stubs;
7179 mips16_stubs = l;
7182 /* If we expect a floating-point return value, but we've built a
7183 stub which does not expect one, then we're in trouble. We can't
7184 use the existing stub, because it won't handle the floating-point
7185 value. We can't build a new stub, because the linker won't know
7186 which stub to use for the various calls in this object file.
7187 Fortunately, this case is illegal, since it means that a function
7188 was declared in two different ways in a single compilation. */
7189 if (fp_ret_p && !l->fp_ret_p)
7190 error ("cannot handle inconsistent calls to %qs", fnname);
7192 if (retval == NULL_RTX)
7193 pattern = gen_call_internal_direct (fn, args_size);
7194 else
7195 pattern = gen_call_value_internal_direct (retval, fn, args_size);
7196 insn = mips_emit_call_insn (pattern, fn, fn, false);
7198 /* If we are calling a stub which handles a floating-point return
7199 value, we need to arrange to save $18 in the prologue. We do this
7200 by marking the function call as using the register. The prologue
7201 will later see that it is used, and emit code to save it. */
7202 if (fp_ret_p)
7203 CALL_INSN_FUNCTION_USAGE (insn) =
7204 gen_rtx_EXPR_LIST (VOIDmode,
7205 gen_rtx_CLOBBER (VOIDmode,
7206 gen_rtx_REG (word_mode, 18)),
7207 CALL_INSN_FUNCTION_USAGE (insn));
7209 return insn;
7212 /* Expand a call of type TYPE. RESULT is where the result will go (null
7213 for "call"s and "sibcall"s), ADDR is the address of the function,
7214 ARGS_SIZE is the size of the arguments and AUX is the value passed
7215 to us by mips_function_arg. LAZY_P is true if this call already
7216 involves a lazily-bound function address (such as when calling
7217 functions through a MIPS16 hard-float stub).
7219 Return the call itself. */
7221 rtx_insn *
7222 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
7223 rtx args_size, rtx aux, bool lazy_p)
7225 rtx orig_addr, pattern;
7226 rtx_insn *insn;
7227 int fp_code;
7229 fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
7230 insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
7231 if (insn)
7233 gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
7234 return insn;
7237 orig_addr = addr;
7238 if (!call_insn_operand (addr, VOIDmode))
7240 if (type == MIPS_CALL_EPILOGUE)
7241 addr = MIPS_EPILOGUE_TEMP (Pmode);
7242 else
7243 addr = gen_reg_rtx (Pmode);
7244 lazy_p |= mips_load_call_address (type, addr, orig_addr);
7247 if (result == 0)
7249 rtx (*fn) (rtx, rtx);
7251 if (type == MIPS_CALL_SIBCALL)
7252 fn = gen_sibcall_internal;
7253 else
7254 fn = gen_call_internal;
7256 pattern = fn (addr, args_size);
7258 else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
7260 /* Handle return values created by mips_return_fpr_pair. */
7261 rtx (*fn) (rtx, rtx, rtx, rtx);
7262 rtx reg1, reg2;
7264 if (type == MIPS_CALL_SIBCALL)
7265 fn = gen_sibcall_value_multiple_internal;
7266 else
7267 fn = gen_call_value_multiple_internal;
7269 reg1 = XEXP (XVECEXP (result, 0, 0), 0);
7270 reg2 = XEXP (XVECEXP (result, 0, 1), 0);
7271 pattern = fn (reg1, addr, args_size, reg2);
7273 else
7275 rtx (*fn) (rtx, rtx, rtx);
7277 if (type == MIPS_CALL_SIBCALL)
7278 fn = gen_sibcall_value_internal;
7279 else
7280 fn = gen_call_value_internal;
7282 /* Handle return values created by mips_return_fpr_single. */
7283 if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
7284 result = XEXP (XVECEXP (result, 0, 0), 0);
7285 pattern = fn (result, addr, args_size);
7288 return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
7291 /* Split call instruction INSN into a $gp-clobbering call and
7292 (where necessary) an instruction to restore $gp from its save slot.
7293 CALL_PATTERN is the pattern of the new call. */
7295 void
7296 mips_split_call (rtx insn, rtx call_pattern)
7298 emit_call_insn (call_pattern);
7299 if (!find_reg_note (insn, REG_NORETURN, 0))
7300 mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode,
7301 POST_CALL_TMP_REG));
7304 /* Return true if a call to DECL may need to use JALX. */
7306 static bool
7307 mips_call_may_need_jalx_p (tree decl)
7309 /* If the current translation unit would use a different mode for DECL,
7310 assume that the call needs JALX. */
7311 if (mips_get_compress_mode (decl) != TARGET_COMPRESSION)
7312 return true;
7314 /* mips_get_compress_mode is always accurate for locally-binding
7315 functions in the current translation unit. */
7316 if (!DECL_EXTERNAL (decl) && targetm.binds_local_p (decl))
7317 return false;
7319 /* When -minterlink-compressed is in effect, assume that functions
7320 could use a different encoding mode unless an attribute explicitly
7321 tells us otherwise. */
7322 if (TARGET_INTERLINK_COMPRESSED)
7324 if (!TARGET_COMPRESSION
7325 && mips_get_compress_off_flags (DECL_ATTRIBUTES (decl)) ==0)
7326 return true;
7327 if (TARGET_COMPRESSION
7328 && mips_get_compress_on_flags (DECL_ATTRIBUTES (decl)) == 0)
7329 return true;
7332 return false;
7335 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL. */
7337 static bool
7338 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
7340 if (!TARGET_SIBCALLS)
7341 return false;
7343 /* Interrupt handlers need special epilogue code and therefore can't
7344 use sibcalls. */
7345 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
7346 return false;
7348 /* Direct Js are only possible to functions that use the same ISA encoding.
7349 There is no JX counterpoart of JALX. */
7350 if (decl
7351 && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode)
7352 && mips_call_may_need_jalx_p (decl))
7353 return false;
7355 /* Sibling calls should not prevent lazy binding. Lazy-binding stubs
7356 require $gp to be valid on entry, so sibcalls can only use stubs
7357 if $gp is call-clobbered. */
7358 if (decl
7359 && TARGET_CALL_SAVED_GP
7360 && !TARGET_ABICALLS_PIC0
7361 && !targetm.binds_local_p (decl))
7362 return false;
7364 /* Otherwise OK. */
7365 return true;
7368 /* Implement TARGET_USE_MOVE_BY_PIECES_INFRASTRUCTURE_P. */
7370 bool
7371 mips_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
7372 unsigned int align,
7373 enum by_pieces_operation op,
7374 bool speed_p)
7376 if (op == STORE_BY_PIECES)
7377 return mips_store_by_pieces_p (size, align);
7378 if (op == MOVE_BY_PIECES && HAVE_movmemsi)
7380 /* movmemsi is meant to generate code that is at least as good as
7381 move_by_pieces. However, movmemsi effectively uses a by-pieces
7382 implementation both for moves smaller than a word and for
7383 word-aligned moves of no more than MIPS_MAX_MOVE_BYTES_STRAIGHT
7384 bytes. We should allow the tree-level optimisers to do such
7385 moves by pieces, as it often exposes other optimization
7386 opportunities. We might as well continue to use movmemsi at
7387 the rtl level though, as it produces better code when
7388 scheduling is disabled (such as at -O). */
7389 if (currently_expanding_to_rtl)
7390 return false;
7391 if (align < BITS_PER_WORD)
7392 return size < UNITS_PER_WORD;
7393 return size <= MIPS_MAX_MOVE_BYTES_STRAIGHT;
7396 return default_use_by_pieces_infrastructure_p (size, align, op, speed_p);
7399 /* Implement a handler for STORE_BY_PIECES operations
7400 for TARGET_USE_MOVE_BY_PIECES_INFRASTRUCTURE_P. */
7402 bool
7403 mips_store_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7405 /* Storing by pieces involves moving constants into registers
7406 of size MIN (ALIGN, BITS_PER_WORD), then storing them.
7407 We need to decide whether it is cheaper to load the address of
7408 constant data into a register and use a block move instead. */
7410 /* If the data is only byte aligned, then:
7412 (a1) A block move of less than 4 bytes would involve three 3 LBs and
7413 3 SBs. We might as well use 3 single-instruction LIs and 3 SBs
7414 instead.
7416 (a2) A block move of 4 bytes from aligned source data can use an
7417 LW/SWL/SWR sequence. This is often better than the 4 LIs and
7418 4 SBs that we would generate when storing by pieces. */
7419 if (align <= BITS_PER_UNIT)
7420 return size < 4;
7422 /* If the data is 2-byte aligned, then:
7424 (b1) A block move of less than 4 bytes would use a combination of LBs,
7425 LHs, SBs and SHs. We get better code by using single-instruction
7426 LIs, SBs and SHs instead.
7428 (b2) A block move of 4 bytes from aligned source data would again use
7429 an LW/SWL/SWR sequence. In most cases, loading the address of
7430 the source data would require at least one extra instruction.
7431 It is often more efficient to use 2 single-instruction LIs and
7432 2 SHs instead.
7434 (b3) A block move of up to 3 additional bytes would be like (b1).
7436 (b4) A block move of 8 bytes from aligned source data can use two
7437 LW/SWL/SWR sequences or a single LD/SDL/SDR sequence. Both
7438 sequences are better than the 4 LIs and 4 SHs that we'd generate
7439 when storing by pieces.
7441 The reasoning for higher alignments is similar:
7443 (c1) A block move of less than 4 bytes would be the same as (b1).
7445 (c2) A block move of 4 bytes would use an LW/SW sequence. Again,
7446 loading the address of the source data would typically require
7447 at least one extra instruction. It is generally better to use
7448 LUI/ORI/SW instead.
7450 (c3) A block move of up to 3 additional bytes would be like (b1).
7452 (c4) A block move of 8 bytes can use two LW/SW sequences or a single
7453 LD/SD sequence, and in these cases we've traditionally preferred
7454 the memory copy over the more bulky constant moves. */
7455 return size < 8;
7458 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
7459 Assume that the areas do not overlap. */
7461 static void
7462 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
7464 HOST_WIDE_INT offset, delta;
7465 unsigned HOST_WIDE_INT bits;
7466 int i;
7467 machine_mode mode;
7468 rtx *regs;
7470 /* Work out how many bits to move at a time. If both operands have
7471 half-word alignment, it is usually better to move in half words.
7472 For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
7473 and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
7474 Otherwise move word-sized chunks. */
7475 if (MEM_ALIGN (src) == BITS_PER_WORD / 2
7476 && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
7477 bits = BITS_PER_WORD / 2;
7478 else
7479 bits = BITS_PER_WORD;
7481 mode = mode_for_size (bits, MODE_INT, 0);
7482 delta = bits / BITS_PER_UNIT;
7484 /* Allocate a buffer for the temporary registers. */
7485 regs = XALLOCAVEC (rtx, length / delta);
7487 /* Load as many BITS-sized chunks as possible. Use a normal load if
7488 the source has enough alignment, otherwise use left/right pairs. */
7489 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7491 regs[i] = gen_reg_rtx (mode);
7492 if (MEM_ALIGN (src) >= bits)
7493 mips_emit_move (regs[i], adjust_address (src, mode, offset));
7494 else
7496 rtx part = adjust_address (src, BLKmode, offset);
7497 set_mem_size (part, delta);
7498 if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0, 0))
7499 gcc_unreachable ();
7503 /* Copy the chunks to the destination. */
7504 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7505 if (MEM_ALIGN (dest) >= bits)
7506 mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
7507 else
7509 rtx part = adjust_address (dest, BLKmode, offset);
7510 set_mem_size (part, delta);
7511 if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
7512 gcc_unreachable ();
7515 /* Mop up any left-over bytes. */
7516 if (offset < length)
7518 src = adjust_address (src, BLKmode, offset);
7519 dest = adjust_address (dest, BLKmode, offset);
7520 move_by_pieces (dest, src, length - offset,
7521 MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
7525 /* Helper function for doing a loop-based block operation on memory
7526 reference MEM. Each iteration of the loop will operate on LENGTH
7527 bytes of MEM.
7529 Create a new base register for use within the loop and point it to
7530 the start of MEM. Create a new memory reference that uses this
7531 register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
7533 static void
7534 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
7535 rtx *loop_reg, rtx *loop_mem)
7537 *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
7539 /* Although the new mem does not refer to a known location,
7540 it does keep up to LENGTH bytes of alignment. */
7541 *loop_mem = change_address (mem, BLKmode, *loop_reg);
7542 set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
7545 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
7546 bytes at a time. LENGTH must be at least BYTES_PER_ITER. Assume that
7547 the memory regions do not overlap. */
7549 static void
7550 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
7551 HOST_WIDE_INT bytes_per_iter)
7553 rtx_code_label *label;
7554 rtx src_reg, dest_reg, final_src, test;
7555 HOST_WIDE_INT leftover;
7557 leftover = length % bytes_per_iter;
7558 length -= leftover;
7560 /* Create registers and memory references for use within the loop. */
7561 mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
7562 mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
7564 /* Calculate the value that SRC_REG should have after the last iteration
7565 of the loop. */
7566 final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
7567 0, 0, OPTAB_WIDEN);
7569 /* Emit the start of the loop. */
7570 label = gen_label_rtx ();
7571 emit_label (label);
7573 /* Emit the loop body. */
7574 mips_block_move_straight (dest, src, bytes_per_iter);
7576 /* Move on to the next block. */
7577 mips_emit_move (src_reg, plus_constant (Pmode, src_reg, bytes_per_iter));
7578 mips_emit_move (dest_reg, plus_constant (Pmode, dest_reg, bytes_per_iter));
7580 /* Emit the loop condition. */
7581 test = gen_rtx_NE (VOIDmode, src_reg, final_src);
7582 if (Pmode == DImode)
7583 emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
7584 else
7585 emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
7587 /* Mop up any left-over bytes. */
7588 if (leftover)
7589 mips_block_move_straight (dest, src, leftover);
7592 /* Expand a movmemsi instruction, which copies LENGTH bytes from
7593 memory reference SRC to memory reference DEST. */
7595 bool
7596 mips_expand_block_move (rtx dest, rtx src, rtx length)
7598 /* Disable entirely for R6 initially. */
7599 if (!ISA_HAS_LWL_LWR)
7600 return false;
7602 if (CONST_INT_P (length))
7604 if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
7606 mips_block_move_straight (dest, src, INTVAL (length));
7607 return true;
7609 else if (optimize)
7611 mips_block_move_loop (dest, src, INTVAL (length),
7612 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
7613 return true;
7616 return false;
7619 /* Expand a loop of synci insns for the address range [BEGIN, END). */
7621 void
7622 mips_expand_synci_loop (rtx begin, rtx end)
7624 rtx inc, cmp_result, mask, length;
7625 rtx_code_label *label, *end_label;
7627 /* Create end_label. */
7628 end_label = gen_label_rtx ();
7630 /* Check if begin equals end. */
7631 cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
7632 emit_jump_insn (gen_condjump (cmp_result, end_label));
7634 /* Load INC with the cache line size (rdhwr INC,$1). */
7635 inc = gen_reg_rtx (Pmode);
7636 emit_insn (PMODE_INSN (gen_rdhwr_synci_step, (inc)));
7638 /* Check if inc is 0. */
7639 cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
7640 emit_jump_insn (gen_condjump (cmp_result, end_label));
7642 /* Calculate mask. */
7643 mask = mips_force_unary (Pmode, NEG, inc);
7645 /* Mask out begin by mask. */
7646 begin = mips_force_binary (Pmode, AND, begin, mask);
7648 /* Calculate length. */
7649 length = mips_force_binary (Pmode, MINUS, end, begin);
7651 /* Loop back to here. */
7652 label = gen_label_rtx ();
7653 emit_label (label);
7655 emit_insn (gen_synci (begin));
7657 /* Update length. */
7658 mips_emit_binary (MINUS, length, length, inc);
7660 /* Update begin. */
7661 mips_emit_binary (PLUS, begin, begin, inc);
7663 /* Check if length is greater than 0. */
7664 cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
7665 emit_jump_insn (gen_condjump (cmp_result, label));
7667 emit_label (end_label);
7670 /* Expand a QI or HI mode atomic memory operation.
7672 GENERATOR contains a pointer to the gen_* function that generates
7673 the SI mode underlying atomic operation using masks that we
7674 calculate.
7676 RESULT is the return register for the operation. Its value is NULL
7677 if unused.
7679 MEM is the location of the atomic access.
7681 OLDVAL is the first operand for the operation.
7683 NEWVAL is the optional second operand for the operation. Its value
7684 is NULL if unused. */
7686 void
7687 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
7688 rtx result, rtx mem, rtx oldval, rtx newval)
7690 rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
7691 rtx unshifted_mask_reg, mask, inverted_mask, si_op;
7692 rtx res = NULL;
7693 machine_mode mode;
7695 mode = GET_MODE (mem);
7697 /* Compute the address of the containing SImode value. */
7698 orig_addr = force_reg (Pmode, XEXP (mem, 0));
7699 memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
7700 force_reg (Pmode, GEN_INT (-4)));
7702 /* Create a memory reference for it. */
7703 memsi = gen_rtx_MEM (SImode, memsi_addr);
7704 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
7705 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
7707 /* Work out the byte offset of the QImode or HImode value,
7708 counting from the least significant byte. */
7709 shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
7710 if (TARGET_BIG_ENDIAN)
7711 mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
7713 /* Multiply by eight to convert the shift value from bytes to bits. */
7714 mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
7716 /* Make the final shift an SImode value, so that it can be used in
7717 SImode operations. */
7718 shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
7720 /* Set MASK to an inclusive mask of the QImode or HImode value. */
7721 unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
7722 unshifted_mask_reg = force_reg (SImode, unshifted_mask);
7723 mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
7725 /* Compute the equivalent exclusive mask. */
7726 inverted_mask = gen_reg_rtx (SImode);
7727 emit_insn (gen_rtx_SET (inverted_mask, gen_rtx_NOT (SImode, mask)));
7729 /* Shift the old value into place. */
7730 if (oldval != const0_rtx)
7732 oldval = convert_modes (SImode, mode, oldval, true);
7733 oldval = force_reg (SImode, oldval);
7734 oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
7737 /* Do the same for the new value. */
7738 if (newval && newval != const0_rtx)
7740 newval = convert_modes (SImode, mode, newval, true);
7741 newval = force_reg (SImode, newval);
7742 newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
7745 /* Do the SImode atomic access. */
7746 if (result)
7747 res = gen_reg_rtx (SImode);
7748 if (newval)
7749 si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
7750 else if (result)
7751 si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
7752 else
7753 si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
7755 emit_insn (si_op);
7757 if (result)
7759 /* Shift and convert the result. */
7760 mips_emit_binary (AND, res, res, mask);
7761 mips_emit_binary (LSHIFTRT, res, res, shiftsi);
7762 mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
7766 /* Return true if it is possible to use left/right accesses for a
7767 bitfield of WIDTH bits starting BITPOS bits into BLKmode memory OP.
7768 When returning true, update *LEFT and *RIGHT as follows:
7770 *LEFT is a QImode reference to the first byte if big endian or
7771 the last byte if little endian. This address can be used in the
7772 left-side instructions (LWL, SWL, LDL, SDL).
7774 *RIGHT is a QImode reference to the opposite end of the field and
7775 can be used in the patterning right-side instruction. */
7777 static bool
7778 mips_get_unaligned_mem (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
7779 rtx *left, rtx *right)
7781 rtx first, last;
7783 /* Check that the size is valid. */
7784 if (width != 32 && (!TARGET_64BIT || width != 64))
7785 return false;
7787 /* We can only access byte-aligned values. Since we are always passed
7788 a reference to the first byte of the field, it is not necessary to
7789 do anything with BITPOS after this check. */
7790 if (bitpos % BITS_PER_UNIT != 0)
7791 return false;
7793 /* Reject aligned bitfields: we want to use a normal load or store
7794 instead of a left/right pair. */
7795 if (MEM_ALIGN (op) >= width)
7796 return false;
7798 /* Get references to both ends of the field. */
7799 first = adjust_address (op, QImode, 0);
7800 last = adjust_address (op, QImode, width / BITS_PER_UNIT - 1);
7802 /* Allocate to LEFT and RIGHT according to endianness. LEFT should
7803 correspond to the MSB and RIGHT to the LSB. */
7804 if (TARGET_BIG_ENDIAN)
7805 *left = first, *right = last;
7806 else
7807 *left = last, *right = first;
7809 return true;
7812 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7813 DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7814 the operation is the equivalent of:
7816 (set DEST (*_extract SRC WIDTH BITPOS))
7818 Return true on success. */
7820 bool
7821 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7822 HOST_WIDE_INT bitpos, bool unsigned_p)
7824 rtx left, right, temp;
7825 rtx dest1 = NULL_RTX;
7827 /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7828 be a DImode, create a new temp and emit a zero extend at the end. */
7829 if (GET_MODE (dest) == DImode
7830 && REG_P (dest)
7831 && GET_MODE_BITSIZE (SImode) == width)
7833 dest1 = dest;
7834 dest = gen_reg_rtx (SImode);
7837 if (!mips_get_unaligned_mem (src, width, bitpos, &left, &right))
7838 return false;
7840 temp = gen_reg_rtx (GET_MODE (dest));
7841 if (GET_MODE (dest) == DImode)
7843 emit_insn (gen_mov_ldl (temp, src, left));
7844 emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7846 else
7848 emit_insn (gen_mov_lwl (temp, src, left));
7849 emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7852 /* If we were loading 32bits and the original register was DI then
7853 sign/zero extend into the orignal dest. */
7854 if (dest1)
7856 if (unsigned_p)
7857 emit_insn (gen_zero_extendsidi2 (dest1, dest));
7858 else
7859 emit_insn (gen_extendsidi2 (dest1, dest));
7861 return true;
7864 /* Try to use left/right stores to expand an "ins" pattern. DEST, WIDTH,
7865 BITPOS and SRC are the operands passed to the expander; the operation
7866 is the equivalent of:
7868 (set (zero_extract DEST WIDTH BITPOS) SRC)
7870 Return true on success. */
7872 bool
7873 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7874 HOST_WIDE_INT bitpos)
7876 rtx left, right;
7877 machine_mode mode;
7879 if (!mips_get_unaligned_mem (dest, width, bitpos, &left, &right))
7880 return false;
7882 mode = mode_for_size (width, MODE_INT, 0);
7883 src = gen_lowpart (mode, src);
7884 if (mode == DImode)
7886 emit_insn (gen_mov_sdl (dest, src, left));
7887 emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7889 else
7891 emit_insn (gen_mov_swl (dest, src, left));
7892 emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7894 return true;
7897 /* Return true if X is a MEM with the same size as MODE. */
7899 bool
7900 mips_mem_fits_mode_p (machine_mode mode, rtx x)
7902 return (MEM_P (x)
7903 && MEM_SIZE_KNOWN_P (x)
7904 && MEM_SIZE (x) == GET_MODE_SIZE (mode));
7907 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7908 source of an "ext" instruction or the destination of an "ins"
7909 instruction. OP must be a register operand and the following
7910 conditions must hold:
7912 0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7913 0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7914 0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7916 Also reject lengths equal to a word as they are better handled
7917 by the move patterns. */
7919 bool
7920 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7922 if (!ISA_HAS_EXT_INS
7923 || !register_operand (op, VOIDmode)
7924 || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7925 return false;
7927 if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7928 return false;
7930 if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7931 return false;
7933 return true;
7936 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7937 operation if MAXLEN is the maxium length of consecutive bits that
7938 can make up MASK. MODE is the mode of the operation. See
7939 mask_low_and_shift_len for the actual definition. */
7941 bool
7942 mask_low_and_shift_p (machine_mode mode, rtx mask, rtx shift, int maxlen)
7944 return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7947 /* Return true iff OP1 and OP2 are valid operands together for the
7948 *and<MODE>3 and *and<MODE>3_mips16 patterns. For the cases to consider,
7949 see the table in the comment before the pattern. */
7951 bool
7952 and_operands_ok (machine_mode mode, rtx op1, rtx op2)
7954 return (memory_operand (op1, mode)
7955 ? and_load_operand (op2, mode)
7956 : and_reg_operand (op2, mode));
7959 /* The canonical form of a mask-low-and-shift-left operation is
7960 (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7961 cleared. Thus we need to shift MASK to the right before checking if it
7962 is a valid mask value. MODE is the mode of the operation. If true
7963 return the length of the mask, otherwise return -1. */
7966 mask_low_and_shift_len (machine_mode mode, rtx mask, rtx shift)
7968 HOST_WIDE_INT shval;
7970 shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7971 return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7974 /* Return true if -msplit-addresses is selected and should be honored.
7976 -msplit-addresses is a half-way house between explicit relocations
7977 and the traditional assembler macros. It can split absolute 32-bit
7978 symbolic constants into a high/lo_sum pair but uses macros for other
7979 sorts of access.
7981 Like explicit relocation support for REL targets, it relies
7982 on GNU extensions in the assembler and the linker.
7984 Although this code should work for -O0, it has traditionally
7985 been treated as an optimization. */
7987 static bool
7988 mips_split_addresses_p (void)
7990 return (TARGET_SPLIT_ADDRESSES
7991 && optimize
7992 && !TARGET_MIPS16
7993 && !flag_pic
7994 && !ABI_HAS_64BIT_SYMBOLS);
7997 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs. */
7999 static void
8000 mips_init_relocs (void)
8002 memset (mips_split_p, '\0', sizeof (mips_split_p));
8003 memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
8004 memset (mips_use_pcrel_pool_p, '\0', sizeof (mips_use_pcrel_pool_p));
8005 memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
8006 memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
8008 if (TARGET_MIPS16_PCREL_LOADS)
8009 mips_use_pcrel_pool_p[SYMBOL_ABSOLUTE] = true;
8010 else
8012 if (ABI_HAS_64BIT_SYMBOLS)
8014 if (TARGET_EXPLICIT_RELOCS)
8016 mips_split_p[SYMBOL_64_HIGH] = true;
8017 mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
8018 mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
8020 mips_split_p[SYMBOL_64_MID] = true;
8021 mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
8022 mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
8024 mips_split_p[SYMBOL_64_LOW] = true;
8025 mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
8026 mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
8028 mips_split_p[SYMBOL_ABSOLUTE] = true;
8029 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
8032 else
8034 if (TARGET_EXPLICIT_RELOCS
8035 || mips_split_addresses_p ()
8036 || TARGET_MIPS16)
8038 mips_split_p[SYMBOL_ABSOLUTE] = true;
8039 mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
8040 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
8045 if (TARGET_MIPS16)
8047 /* The high part is provided by a pseudo copy of $gp. */
8048 mips_split_p[SYMBOL_GP_RELATIVE] = true;
8049 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
8051 else if (TARGET_EXPLICIT_RELOCS)
8052 /* Small data constants are kept whole until after reload,
8053 then lowered by mips_rewrite_small_data. */
8054 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
8056 if (TARGET_EXPLICIT_RELOCS)
8058 mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
8059 if (TARGET_NEWABI)
8061 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
8062 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
8064 else
8066 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
8067 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
8069 if (TARGET_MIPS16)
8070 /* Expose the use of $28 as soon as possible. */
8071 mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
8073 if (TARGET_XGOT)
8075 /* The HIGH and LO_SUM are matched by special .md patterns. */
8076 mips_split_p[SYMBOL_GOT_DISP] = true;
8078 mips_split_p[SYMBOL_GOTOFF_DISP] = true;
8079 mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
8080 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
8082 mips_split_p[SYMBOL_GOTOFF_CALL] = true;
8083 mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
8084 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
8086 else
8088 if (TARGET_NEWABI)
8089 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
8090 else
8091 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
8092 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
8093 if (TARGET_MIPS16)
8094 /* Expose the use of $28 as soon as possible. */
8095 mips_split_p[SYMBOL_GOT_DISP] = true;
8099 if (TARGET_NEWABI)
8101 mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
8102 mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
8103 mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
8106 mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
8107 mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
8109 if (TARGET_MIPS16_PCREL_LOADS)
8111 mips_use_pcrel_pool_p[SYMBOL_DTPREL] = true;
8112 mips_use_pcrel_pool_p[SYMBOL_TPREL] = true;
8114 else
8116 mips_split_p[SYMBOL_DTPREL] = true;
8117 mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
8118 mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
8120 mips_split_p[SYMBOL_TPREL] = true;
8121 mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
8122 mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
8125 mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
8126 mips_lo_relocs[SYMBOL_HALF] = "%half(";
8129 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
8130 in context CONTEXT. RELOCS is the array of relocations to use. */
8132 static void
8133 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
8134 const char **relocs)
8136 enum mips_symbol_type symbol_type;
8137 const char *p;
8139 symbol_type = mips_classify_symbolic_expression (op, context);
8140 gcc_assert (relocs[symbol_type]);
8142 fputs (relocs[symbol_type], file);
8143 output_addr_const (file, mips_strip_unspec_address (op));
8144 for (p = relocs[symbol_type]; *p != 0; p++)
8145 if (*p == '(')
8146 fputc (')', file);
8149 /* Start a new block with the given asm switch enabled. If we need
8150 to print a directive, emit PREFIX before it and SUFFIX after it. */
8152 static void
8153 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
8154 const char *prefix, const char *suffix)
8156 if (asm_switch->nesting_level == 0)
8157 fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
8158 asm_switch->nesting_level++;
8161 /* Likewise, but end a block. */
8163 static void
8164 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
8165 const char *prefix, const char *suffix)
8167 gcc_assert (asm_switch->nesting_level);
8168 asm_switch->nesting_level--;
8169 if (asm_switch->nesting_level == 0)
8170 fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
8173 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
8174 that either print a complete line or print nothing. */
8176 void
8177 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
8179 mips_push_asm_switch_1 (asm_switch, "\t", "\n");
8182 void
8183 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
8185 mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
8188 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
8189 The punctuation characters are:
8191 '(' Start a nested ".set noreorder" block.
8192 ')' End a nested ".set noreorder" block.
8193 '[' Start a nested ".set noat" block.
8194 ']' End a nested ".set noat" block.
8195 '<' Start a nested ".set nomacro" block.
8196 '>' End a nested ".set nomacro" block.
8197 '*' Behave like %(%< if generating a delayed-branch sequence.
8198 '#' Print a nop if in a ".set noreorder" block.
8199 '/' Like '#', but do nothing within a delayed-branch sequence.
8200 '?' Print "l" if mips_branch_likely is true
8201 '~' Print a nop if mips_branch_likely is true
8202 '.' Print the name of the register with a hard-wired zero (zero or $0).
8203 '@' Print the name of the assembler temporary register (at or $1).
8204 '^' Print the name of the pic call-through register (t9 or $25).
8205 '+' Print the name of the gp register (usually gp or $28).
8206 '$' Print the name of the stack pointer register (sp or $29).
8207 ':' Print "c" to use the compact version if the delay slot is a nop.
8208 '!' Print "s" to use the short version if the delay slot contains a
8209 16-bit instruction.
8211 See also mips_init_print_operand_pucnt. */
8213 static void
8214 mips_print_operand_punctuation (FILE *file, int ch)
8216 switch (ch)
8218 case '(':
8219 mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
8220 break;
8222 case ')':
8223 mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
8224 break;
8226 case '[':
8227 mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
8228 break;
8230 case ']':
8231 mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
8232 break;
8234 case '<':
8235 mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
8236 break;
8238 case '>':
8239 mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
8240 break;
8242 case '*':
8243 if (final_sequence != 0)
8245 mips_print_operand_punctuation (file, '(');
8246 mips_print_operand_punctuation (file, '<');
8248 break;
8250 case '#':
8251 if (mips_noreorder.nesting_level > 0)
8252 fputs ("\n\tnop", file);
8253 break;
8255 case '/':
8256 /* Print an extra newline so that the delayed insn is separated
8257 from the following ones. This looks neater and is consistent
8258 with non-nop delayed sequences. */
8259 if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
8260 fputs ("\n\tnop\n", file);
8261 break;
8263 case '?':
8264 if (mips_branch_likely)
8265 putc ('l', file);
8266 break;
8268 case '~':
8269 if (mips_branch_likely)
8270 fputs ("\n\tnop", file);
8271 break;
8273 case '.':
8274 fputs (reg_names[GP_REG_FIRST + 0], file);
8275 break;
8277 case '@':
8278 fputs (reg_names[AT_REGNUM], file);
8279 break;
8281 case '^':
8282 fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
8283 break;
8285 case '+':
8286 fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
8287 break;
8289 case '$':
8290 fputs (reg_names[STACK_POINTER_REGNUM], file);
8291 break;
8293 case ':':
8294 /* When final_sequence is 0, the delay slot will be a nop. We can
8295 use the compact version for microMIPS. */
8296 if (final_sequence == 0)
8297 putc ('c', file);
8298 break;
8300 case '!':
8301 /* If the delay slot instruction is short, then use the
8302 compact version. */
8303 if (final_sequence == 0
8304 || get_attr_length (final_sequence->insn (1)) == 2)
8305 putc ('s', file);
8306 break;
8308 default:
8309 gcc_unreachable ();
8310 break;
8314 /* Initialize mips_print_operand_punct. */
8316 static void
8317 mips_init_print_operand_punct (void)
8319 const char *p;
8321 for (p = "()[]<>*#/?~.@^+$:!"; *p; p++)
8322 mips_print_operand_punct[(unsigned char) *p] = true;
8325 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
8326 associated with condition CODE. Print the condition part of the
8327 opcode to FILE. */
8329 static void
8330 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
8332 switch (code)
8334 case EQ:
8335 case NE:
8336 case GT:
8337 case GE:
8338 case LT:
8339 case LE:
8340 case GTU:
8341 case GEU:
8342 case LTU:
8343 case LEU:
8344 /* Conveniently, the MIPS names for these conditions are the same
8345 as their RTL equivalents. */
8346 fputs (GET_RTX_NAME (code), file);
8347 break;
8349 default:
8350 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8351 break;
8355 /* Likewise floating-point branches. */
8357 static void
8358 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
8360 switch (code)
8362 case EQ:
8363 if (ISA_HAS_CCF)
8364 fputs ("c1eqz", file);
8365 else
8366 fputs ("c1f", file);
8367 break;
8369 case NE:
8370 if (ISA_HAS_CCF)
8371 fputs ("c1nez", file);
8372 else
8373 fputs ("c1t", file);
8374 break;
8376 default:
8377 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8378 break;
8382 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8384 static bool
8385 mips_print_operand_punct_valid_p (unsigned char code)
8387 return mips_print_operand_punct[code];
8390 /* Implement TARGET_PRINT_OPERAND. The MIPS-specific operand codes are:
8392 'X' Print CONST_INT OP in hexadecimal format.
8393 'x' Print the low 16 bits of CONST_INT OP in hexadecimal format.
8394 'd' Print CONST_INT OP in decimal.
8395 'm' Print one less than CONST_INT OP in decimal.
8396 'h' Print the high-part relocation associated with OP, after stripping
8397 any outermost HIGH.
8398 'R' Print the low-part relocation associated with OP.
8399 'C' Print the integer branch condition for comparison OP.
8400 'N' Print the inverse of the integer branch condition for comparison OP.
8401 'F' Print the FPU branch condition for comparison OP.
8402 'W' Print the inverse of the FPU branch condition for comparison OP.
8403 'T' Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
8404 'z' for (eq:?I ...), 'n' for (ne:?I ...).
8405 't' Like 'T', but with the EQ/NE cases reversed
8406 'Y' Print mips_fp_conditions[INTVAL (OP)]
8407 'Z' Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
8408 'q' Print a DSP accumulator register.
8409 'D' Print the second part of a double-word register or memory operand.
8410 'L' Print the low-order register in a double-word register operand.
8411 'M' Print high-order register in a double-word register operand.
8412 'z' Print $0 if OP is zero, otherwise print OP normally.
8413 'b' Print the address of a memory operand, without offset. */
8415 static void
8416 mips_print_operand (FILE *file, rtx op, int letter)
8418 enum rtx_code code;
8420 if (mips_print_operand_punct_valid_p (letter))
8422 mips_print_operand_punctuation (file, letter);
8423 return;
8426 gcc_assert (op);
8427 code = GET_CODE (op);
8429 switch (letter)
8431 case 'X':
8432 if (CONST_INT_P (op))
8433 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
8434 else
8435 output_operand_lossage ("invalid use of '%%%c'", letter);
8436 break;
8438 case 'x':
8439 if (CONST_INT_P (op))
8440 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
8441 else
8442 output_operand_lossage ("invalid use of '%%%c'", letter);
8443 break;
8445 case 'd':
8446 if (CONST_INT_P (op))
8447 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
8448 else
8449 output_operand_lossage ("invalid use of '%%%c'", letter);
8450 break;
8452 case 'm':
8453 if (CONST_INT_P (op))
8454 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
8455 else
8456 output_operand_lossage ("invalid use of '%%%c'", letter);
8457 break;
8459 case 'h':
8460 if (code == HIGH)
8461 op = XEXP (op, 0);
8462 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
8463 break;
8465 case 'R':
8466 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
8467 break;
8469 case 'C':
8470 mips_print_int_branch_condition (file, code, letter);
8471 break;
8473 case 'N':
8474 mips_print_int_branch_condition (file, reverse_condition (code), letter);
8475 break;
8477 case 'F':
8478 mips_print_float_branch_condition (file, code, letter);
8479 break;
8481 case 'W':
8482 mips_print_float_branch_condition (file, reverse_condition (code),
8483 letter);
8484 break;
8486 case 'T':
8487 case 't':
8489 int truth = (code == NE) == (letter == 'T');
8490 fputc ("zfnt"[truth * 2 + ST_REG_P (REGNO (XEXP (op, 0)))], file);
8492 break;
8494 case 'Y':
8495 if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
8496 fputs (mips_fp_conditions[UINTVAL (op)], file);
8497 else
8498 output_operand_lossage ("'%%%c' is not a valid operand prefix",
8499 letter);
8500 break;
8502 case 'Z':
8503 if (ISA_HAS_8CC || ISA_HAS_CCF)
8505 mips_print_operand (file, op, 0);
8506 fputc (',', file);
8508 break;
8510 case 'q':
8511 if (code == REG && MD_REG_P (REGNO (op)))
8512 fprintf (file, "$ac0");
8513 else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
8514 fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
8515 else
8516 output_operand_lossage ("invalid use of '%%%c'", letter);
8517 break;
8519 default:
8520 switch (code)
8522 case REG:
8524 unsigned int regno = REGNO (op);
8525 if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
8526 || (letter == 'L' && TARGET_BIG_ENDIAN)
8527 || letter == 'D')
8528 regno++;
8529 else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
8530 output_operand_lossage ("invalid use of '%%%c'", letter);
8531 /* We need to print $0 .. $31 for COP0 registers. */
8532 if (COP0_REG_P (regno))
8533 fprintf (file, "$%s", &reg_names[regno][4]);
8534 else
8535 fprintf (file, "%s", reg_names[regno]);
8537 break;
8539 case MEM:
8540 if (letter == 'D')
8541 output_address (plus_constant (Pmode, XEXP (op, 0), 4));
8542 else if (letter == 'b')
8544 gcc_assert (REG_P (XEXP (op, 0)));
8545 mips_print_operand (file, XEXP (op, 0), 0);
8547 else if (letter && letter != 'z')
8548 output_operand_lossage ("invalid use of '%%%c'", letter);
8549 else
8550 output_address (XEXP (op, 0));
8551 break;
8553 default:
8554 if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
8555 fputs (reg_names[GP_REG_FIRST], file);
8556 else if (letter && letter != 'z')
8557 output_operand_lossage ("invalid use of '%%%c'", letter);
8558 else if (CONST_GP_P (op))
8559 fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
8560 else
8561 output_addr_const (file, mips_strip_unspec_address (op));
8562 break;
8567 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
8569 static void
8570 mips_print_operand_address (FILE *file, rtx x)
8572 struct mips_address_info addr;
8574 if (mips_classify_address (&addr, x, word_mode, true))
8575 switch (addr.type)
8577 case ADDRESS_REG:
8578 mips_print_operand (file, addr.offset, 0);
8579 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8580 return;
8582 case ADDRESS_LO_SUM:
8583 mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
8584 mips_lo_relocs);
8585 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8586 return;
8588 case ADDRESS_CONST_INT:
8589 output_addr_const (file, x);
8590 fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
8591 return;
8593 case ADDRESS_SYMBOLIC:
8594 output_addr_const (file, mips_strip_unspec_address (x));
8595 return;
8597 gcc_unreachable ();
8600 /* Implement TARGET_ENCODE_SECTION_INFO. */
8602 static void
8603 mips_encode_section_info (tree decl, rtx rtl, int first)
8605 default_encode_section_info (decl, rtl, first);
8607 if (TREE_CODE (decl) == FUNCTION_DECL)
8609 rtx symbol = XEXP (rtl, 0);
8610 tree type = TREE_TYPE (decl);
8612 /* Encode whether the symbol is short or long. */
8613 if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
8614 || mips_far_type_p (type))
8615 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
8619 /* Implement TARGET_SELECT_RTX_SECTION. */
8621 static section *
8622 mips_select_rtx_section (machine_mode mode, rtx x,
8623 unsigned HOST_WIDE_INT align)
8625 /* ??? Consider using mergeable small data sections. */
8626 if (mips_rtx_constant_in_small_data_p (mode))
8627 return get_named_section (NULL, ".sdata", 0);
8629 return default_elf_select_rtx_section (mode, x, align);
8632 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
8634 The complication here is that, with the combination TARGET_ABICALLS
8635 && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
8636 absolute addresses, and should therefore not be included in the
8637 read-only part of a DSO. Handle such cases by selecting a normal
8638 data section instead of a read-only one. The logic apes that in
8639 default_function_rodata_section. */
8641 static section *
8642 mips_function_rodata_section (tree decl)
8644 if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
8645 return default_function_rodata_section (decl);
8647 if (decl && DECL_SECTION_NAME (decl))
8649 const char *name = DECL_SECTION_NAME (decl);
8650 if (DECL_COMDAT_GROUP (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
8652 char *rname = ASTRDUP (name);
8653 rname[14] = 'd';
8654 return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
8656 else if (flag_function_sections
8657 && flag_data_sections
8658 && strncmp (name, ".text.", 6) == 0)
8660 char *rname = ASTRDUP (name);
8661 memcpy (rname + 1, "data", 4);
8662 return get_section (rname, SECTION_WRITE, decl);
8665 return data_section;
8668 /* Implement TARGET_IN_SMALL_DATA_P. */
8670 static bool
8671 mips_in_small_data_p (const_tree decl)
8673 unsigned HOST_WIDE_INT size;
8675 if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8676 return false;
8678 /* We don't yet generate small-data references for -mabicalls
8679 or VxWorks RTP code. See the related -G handling in
8680 mips_option_override. */
8681 if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8682 return false;
8684 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8686 const char *name;
8688 /* Reject anything that isn't in a known small-data section. */
8689 name = DECL_SECTION_NAME (decl);
8690 if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8691 return false;
8693 /* If a symbol is defined externally, the assembler will use the
8694 usual -G rules when deciding how to implement macros. */
8695 if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
8696 return true;
8698 else if (TARGET_EMBEDDED_DATA)
8700 /* Don't put constants into the small data section: we want them
8701 to be in ROM rather than RAM. */
8702 if (TREE_CODE (decl) != VAR_DECL)
8703 return false;
8705 if (TREE_READONLY (decl)
8706 && !TREE_SIDE_EFFECTS (decl)
8707 && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8708 return false;
8711 /* Enforce -mlocal-sdata. */
8712 if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
8713 return false;
8715 /* Enforce -mextern-sdata. */
8716 if (!TARGET_EXTERN_SDATA && DECL_P (decl))
8718 if (DECL_EXTERNAL (decl))
8719 return false;
8720 if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
8721 return false;
8724 /* We have traditionally not treated zero-sized objects as small data,
8725 so this is now effectively part of the ABI. */
8726 size = int_size_in_bytes (TREE_TYPE (decl));
8727 return size > 0 && size <= mips_small_data_threshold;
8730 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use
8731 anchors for small data: the GP register acts as an anchor in that
8732 case. We also don't want to use them for PC-relative accesses,
8733 where the PC acts as an anchor. */
8735 static bool
8736 mips_use_anchors_for_symbol_p (const_rtx symbol)
8738 switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
8740 case SYMBOL_PC_RELATIVE:
8741 case SYMBOL_GP_RELATIVE:
8742 return false;
8744 default:
8745 return default_use_anchors_for_symbol_p (symbol);
8749 /* The MIPS debug format wants all automatic variables and arguments
8750 to be in terms of the virtual frame pointer (stack pointer before
8751 any adjustment in the function), while the MIPS 3.0 linker wants
8752 the frame pointer to be the stack pointer after the initial
8753 adjustment. So, we do the adjustment here. The arg pointer (which
8754 is eliminated) points to the virtual frame pointer, while the frame
8755 pointer (which may be eliminated) points to the stack pointer after
8756 the initial adjustments. */
8758 HOST_WIDE_INT
8759 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
8761 rtx offset2 = const0_rtx;
8762 rtx reg = eliminate_constant_term (addr, &offset2);
8764 if (offset == 0)
8765 offset = INTVAL (offset2);
8767 if (reg == stack_pointer_rtx
8768 || reg == frame_pointer_rtx
8769 || reg == hard_frame_pointer_rtx)
8771 offset -= cfun->machine->frame.total_size;
8772 if (reg == hard_frame_pointer_rtx)
8773 offset += cfun->machine->frame.hard_frame_pointer_offset;
8776 return offset;
8779 /* Implement ASM_OUTPUT_EXTERNAL. */
8781 void
8782 mips_output_external (FILE *file, tree decl, const char *name)
8784 default_elf_asm_output_external (file, decl, name);
8786 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
8787 set in order to avoid putting out names that are never really
8788 used. */
8789 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
8791 if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
8793 /* When using assembler macros, emit .extern directives for
8794 all small-data externs so that the assembler knows how
8795 big they are.
8797 In most cases it would be safe (though pointless) to emit
8798 .externs for other symbols too. One exception is when an
8799 object is within the -G limit but declared by the user to
8800 be in a section other than .sbss or .sdata. */
8801 fputs ("\t.extern\t", file);
8802 assemble_name (file, name);
8803 fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
8804 int_size_in_bytes (TREE_TYPE (decl)));
8809 /* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME. */
8811 static void
8812 mips_output_filename (FILE *stream, const char *name)
8814 /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
8815 directives. */
8816 if (write_symbols == DWARF2_DEBUG)
8817 return;
8818 else if (mips_output_filename_first_time)
8820 mips_output_filename_first_time = 0;
8821 num_source_filenames += 1;
8822 current_function_file = name;
8823 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8824 output_quoted_string (stream, name);
8825 putc ('\n', stream);
8827 /* If we are emitting stabs, let dbxout.c handle this (except for
8828 the mips_output_filename_first_time case). */
8829 else if (write_symbols == DBX_DEBUG)
8830 return;
8831 else if (name != current_function_file
8832 && strcmp (name, current_function_file) != 0)
8834 num_source_filenames += 1;
8835 current_function_file = name;
8836 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8837 output_quoted_string (stream, name);
8838 putc ('\n', stream);
8842 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL. */
8844 static void ATTRIBUTE_UNUSED
8845 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
8847 switch (size)
8849 case 4:
8850 fputs ("\t.dtprelword\t", file);
8851 break;
8853 case 8:
8854 fputs ("\t.dtpreldword\t", file);
8855 break;
8857 default:
8858 gcc_unreachable ();
8860 output_addr_const (file, x);
8861 fputs ("+0x8000", file);
8864 /* Implement TARGET_DWARF_REGISTER_SPAN. */
8866 static rtx
8867 mips_dwarf_register_span (rtx reg)
8869 rtx high, low;
8870 machine_mode mode;
8872 /* TARGET_FLOATXX is implemented as 32-bit floating-point registers but
8873 ensures that double-precision registers are treated as if they were
8874 64-bit physical registers. The code will run correctly with 32-bit or
8875 64-bit registers which means that dwarf information cannot be precise
8876 for all scenarios. We choose to state that the 64-bit values are stored
8877 in a single 64-bit 'piece'. This slightly unusual construct can then be
8878 interpreted as either a pair of registers if the registers are 32-bit or
8879 a single 64-bit register depending on hardware. */
8880 mode = GET_MODE (reg);
8881 if (FP_REG_P (REGNO (reg))
8882 && TARGET_FLOATXX
8883 && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8885 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, reg));
8887 /* By default, GCC maps increasing register numbers to increasing
8888 memory locations, but paired FPRs are always little-endian,
8889 regardless of the prevailing endianness. */
8890 else if (FP_REG_P (REGNO (reg))
8891 && TARGET_BIG_ENDIAN
8892 && MAX_FPRS_PER_FMT > 1
8893 && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8895 gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8896 high = mips_subword (reg, true);
8897 low = mips_subword (reg, false);
8898 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8901 return NULL_RTX;
8904 /* Implement TARGET_DWARF_FRAME_REG_MODE. */
8906 static machine_mode
8907 mips_dwarf_frame_reg_mode (int regno)
8909 machine_mode mode = default_dwarf_frame_reg_mode (regno);
8911 if (FP_REG_P (regno) && mips_abi == ABI_32 && TARGET_FLOAT64)
8912 mode = SImode;
8914 return mode;
8917 /* DSP ALU can bypass data with no delays for the following pairs. */
8918 enum insn_code dspalu_bypass_table[][2] =
8920 {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
8921 {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
8922 {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
8923 {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
8924 {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
8925 {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
8926 {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
8927 {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
8931 mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
8933 int i;
8934 int num_bypass = ARRAY_SIZE (dspalu_bypass_table);
8935 enum insn_code out_icode = (enum insn_code) INSN_CODE (out_insn);
8936 enum insn_code in_icode = (enum insn_code) INSN_CODE (in_insn);
8938 for (i = 0; i < num_bypass; i++)
8940 if (out_icode == dspalu_bypass_table[i][0]
8941 && in_icode == dspalu_bypass_table[i][1])
8942 return true;
8945 return false;
8947 /* Implement ASM_OUTPUT_ASCII. */
8949 void
8950 mips_output_ascii (FILE *stream, const char *string, size_t len)
8952 size_t i;
8953 int cur_pos;
8955 cur_pos = 17;
8956 fprintf (stream, "\t.ascii\t\"");
8957 for (i = 0; i < len; i++)
8959 int c;
8961 c = (unsigned char) string[i];
8962 if (ISPRINT (c))
8964 if (c == '\\' || c == '\"')
8966 putc ('\\', stream);
8967 cur_pos++;
8969 putc (c, stream);
8970 cur_pos++;
8972 else
8974 fprintf (stream, "\\%03o", c);
8975 cur_pos += 4;
8978 if (cur_pos > 72 && i+1 < len)
8980 cur_pos = 17;
8981 fprintf (stream, "\"\n\t.ascii\t\"");
8984 fprintf (stream, "\"\n");
8987 /* Return the pseudo-op for full SYMBOL_(D)TPREL address *ADDR.
8988 Update *ADDR with the operand that should be printed. */
8990 const char *
8991 mips_output_tls_reloc_directive (rtx *addr)
8993 enum mips_symbol_type type;
8995 type = mips_classify_symbolic_expression (*addr, SYMBOL_CONTEXT_LEA);
8996 *addr = mips_strip_unspec_address (*addr);
8997 switch (type)
8999 case SYMBOL_DTPREL:
9000 return Pmode == SImode ? ".dtprelword\t%0" : ".dtpreldword\t%0";
9002 case SYMBOL_TPREL:
9003 return Pmode == SImode ? ".tprelword\t%0" : ".tpreldword\t%0";
9005 default:
9006 gcc_unreachable ();
9010 /* Emit either a label, .comm, or .lcomm directive. When using assembler
9011 macros, mark the symbol as written so that mips_asm_output_external
9012 won't emit an .extern for it. STREAM is the output file, NAME is the
9013 name of the symbol, INIT_STRING is the string that should be written
9014 before the symbol and FINAL_STRING is the string that should be
9015 written after it. FINAL_STRING is a printf format that consumes the
9016 remaining arguments. */
9018 void
9019 mips_declare_object (FILE *stream, const char *name, const char *init_string,
9020 const char *final_string, ...)
9022 va_list ap;
9024 fputs (init_string, stream);
9025 assemble_name (stream, name);
9026 va_start (ap, final_string);
9027 vfprintf (stream, final_string, ap);
9028 va_end (ap);
9030 if (!TARGET_EXPLICIT_RELOCS)
9032 tree name_tree = get_identifier (name);
9033 TREE_ASM_WRITTEN (name_tree) = 1;
9037 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
9038 NAME is the name of the object and ALIGN is the required alignment
9039 in bytes. TAKES_ALIGNMENT_P is true if the directive takes a third
9040 alignment argument. */
9042 void
9043 mips_declare_common_object (FILE *stream, const char *name,
9044 const char *init_string,
9045 unsigned HOST_WIDE_INT size,
9046 unsigned int align, bool takes_alignment_p)
9048 if (!takes_alignment_p)
9050 size += (align / BITS_PER_UNIT) - 1;
9051 size -= size % (align / BITS_PER_UNIT);
9052 mips_declare_object (stream, name, init_string,
9053 "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
9055 else
9056 mips_declare_object (stream, name, init_string,
9057 "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
9058 size, align / BITS_PER_UNIT);
9061 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This is usually the same as the
9062 elfos.h version, but we also need to handle -muninit-const-in-rodata. */
9064 void
9065 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
9066 unsigned HOST_WIDE_INT size,
9067 unsigned int align)
9069 /* If the target wants uninitialized const declarations in
9070 .rdata then don't put them in .comm. */
9071 if (TARGET_EMBEDDED_DATA
9072 && TARGET_UNINIT_CONST_IN_RODATA
9073 && TREE_CODE (decl) == VAR_DECL
9074 && TREE_READONLY (decl)
9075 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
9077 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
9078 targetm.asm_out.globalize_label (stream, name);
9080 switch_to_section (readonly_data_section);
9081 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
9082 mips_declare_object (stream, name, "",
9083 ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
9084 size);
9086 else
9087 mips_declare_common_object (stream, name, "\n\t.comm\t",
9088 size, align, true);
9091 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
9092 extern int size_directive_output;
9094 /* Implement ASM_DECLARE_OBJECT_NAME. This is like most of the standard ELF
9095 definitions except that it uses mips_declare_object to emit the label. */
9097 void
9098 mips_declare_object_name (FILE *stream, const char *name,
9099 tree decl ATTRIBUTE_UNUSED)
9101 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
9102 ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
9103 #endif
9105 size_directive_output = 0;
9106 if (!flag_inhibit_size_directive && DECL_SIZE (decl))
9108 HOST_WIDE_INT size;
9110 size_directive_output = 1;
9111 size = int_size_in_bytes (TREE_TYPE (decl));
9112 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
9115 mips_declare_object (stream, name, "", ":\n");
9118 /* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
9120 void
9121 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
9123 const char *name;
9125 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
9126 if (!flag_inhibit_size_directive
9127 && DECL_SIZE (decl) != 0
9128 && !at_end
9129 && top_level
9130 && DECL_INITIAL (decl) == error_mark_node
9131 && !size_directive_output)
9133 HOST_WIDE_INT size;
9135 size_directive_output = 1;
9136 size = int_size_in_bytes (TREE_TYPE (decl));
9137 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
9140 #endif
9142 /* Return the FOO in the name of the ".mdebug.FOO" section associated
9143 with the current ABI. */
9145 static const char *
9146 mips_mdebug_abi_name (void)
9148 switch (mips_abi)
9150 case ABI_32:
9151 return "abi32";
9152 case ABI_O64:
9153 return "abiO64";
9154 case ABI_N32:
9155 return "abiN32";
9156 case ABI_64:
9157 return "abi64";
9158 case ABI_EABI:
9159 return TARGET_64BIT ? "eabi64" : "eabi32";
9160 default:
9161 gcc_unreachable ();
9165 /* Implement TARGET_ASM_FILE_START. */
9167 static void
9168 mips_file_start (void)
9170 default_file_start ();
9172 /* Generate a special section to describe the ABI switches used to
9173 produce the resultant binary. */
9175 /* Record the ABI itself. Modern versions of binutils encode
9176 this information in the ELF header flags, but GDB needs the
9177 information in order to correctly debug binaries produced by
9178 older binutils. See the function mips_gdbarch_init in
9179 gdb/mips-tdep.c. */
9180 fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
9181 mips_mdebug_abi_name ());
9183 /* There is no ELF header flag to distinguish long32 forms of the
9184 EABI from long64 forms. Emit a special section to help tools
9185 such as GDB. Do the same for o64, which is sometimes used with
9186 -mlong64. */
9187 if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
9188 fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
9189 "\t.previous\n", TARGET_LONG64 ? 64 : 32);
9191 /* Record the NaN encoding. */
9192 if (HAVE_AS_NAN || mips_nan != MIPS_IEEE_754_DEFAULT)
9193 fprintf (asm_out_file, "\t.nan\t%s\n",
9194 mips_nan == MIPS_IEEE_754_2008 ? "2008" : "legacy");
9196 #ifdef HAVE_AS_DOT_MODULE
9197 /* Record the FP ABI. See below for comments. */
9198 if (TARGET_NO_FLOAT)
9199 #ifdef HAVE_AS_GNU_ATTRIBUTE
9200 fputs ("\t.gnu_attribute 4, 0\n", asm_out_file);
9201 #else
9203 #endif
9204 else if (!TARGET_HARD_FLOAT_ABI)
9205 fputs ("\t.module\tsoftfloat\n", asm_out_file);
9206 else if (!TARGET_DOUBLE_FLOAT)
9207 fputs ("\t.module\tsinglefloat\n", asm_out_file);
9208 else if (TARGET_FLOATXX)
9209 fputs ("\t.module\tfp=xx\n", asm_out_file);
9210 else if (TARGET_FLOAT64)
9211 fputs ("\t.module\tfp=64\n", asm_out_file);
9212 else
9213 fputs ("\t.module\tfp=32\n", asm_out_file);
9215 if (TARGET_ODD_SPREG)
9216 fputs ("\t.module\toddspreg\n", asm_out_file);
9217 else
9218 fputs ("\t.module\tnooddspreg\n", asm_out_file);
9220 #else
9221 #ifdef HAVE_AS_GNU_ATTRIBUTE
9223 int attr;
9225 /* No floating-point operations, -mno-float. */
9226 if (TARGET_NO_FLOAT)
9227 attr = 0;
9228 /* Soft-float code, -msoft-float. */
9229 else if (!TARGET_HARD_FLOAT_ABI)
9230 attr = 3;
9231 /* Single-float code, -msingle-float. */
9232 else if (!TARGET_DOUBLE_FLOAT)
9233 attr = 2;
9234 /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.
9235 Reserved attr=4.
9236 This case used 12 callee-saved double-precision registers
9237 and is deprecated. */
9238 /* 64-bit or 32-bit FP registers on a 32-bit target, -mfpxx. */
9239 else if (TARGET_FLOATXX)
9240 attr = 5;
9241 /* 64-bit FP registers on a 32-bit target, -mfp64 -modd-spreg. */
9242 else if (mips_abi == ABI_32 && TARGET_FLOAT64 && TARGET_ODD_SPREG)
9243 attr = 6;
9244 /* 64-bit FP registers on a 32-bit target, -mfp64 -mno-odd-spreg. */
9245 else if (mips_abi == ABI_32 && TARGET_FLOAT64)
9246 attr = 7;
9247 /* Regular FP code, FP regs same size as GP regs, -mdouble-float. */
9248 else
9249 attr = 1;
9251 fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
9253 #endif
9254 #endif
9256 /* If TARGET_ABICALLS, tell GAS to generate -KPIC code. */
9257 if (TARGET_ABICALLS)
9259 fprintf (asm_out_file, "\t.abicalls\n");
9260 if (TARGET_ABICALLS_PIC0)
9261 fprintf (asm_out_file, "\t.option\tpic0\n");
9264 if (flag_verbose_asm)
9265 fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
9266 ASM_COMMENT_START,
9267 mips_small_data_threshold, mips_arch_info->name, mips_isa);
9270 /* Implement TARGET_ASM_CODE_END. */
9272 static void
9273 mips_code_end (void)
9275 mips_finish_stub (&mips16_rdhwr_stub);
9276 mips_finish_stub (&mips16_get_fcsr_stub);
9277 mips_finish_stub (&mips16_set_fcsr_stub);
9280 /* Make the last instruction frame-related and note that it performs
9281 the operation described by FRAME_PATTERN. */
9283 static void
9284 mips_set_frame_expr (rtx frame_pattern)
9286 rtx_insn *insn;
9288 insn = get_last_insn ();
9289 RTX_FRAME_RELATED_P (insn) = 1;
9290 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9291 frame_pattern,
9292 REG_NOTES (insn));
9295 /* Return a frame-related rtx that stores REG at MEM.
9296 REG must be a single register. */
9298 static rtx
9299 mips_frame_set (rtx mem, rtx reg)
9301 rtx set;
9303 set = gen_rtx_SET (mem, reg);
9304 RTX_FRAME_RELATED_P (set) = 1;
9306 return set;
9309 /* Record that the epilogue has restored call-saved register REG. */
9311 static void
9312 mips_add_cfa_restore (rtx reg)
9314 mips_epilogue.cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
9315 mips_epilogue.cfa_restores);
9318 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
9319 mips16e_s2_s8_regs[X], it must also save the registers in indexes
9320 X + 1 onwards. Likewise mips16e_a0_a3_regs. */
9321 static const unsigned char mips16e_s2_s8_regs[] = {
9322 30, 23, 22, 21, 20, 19, 18
9324 static const unsigned char mips16e_a0_a3_regs[] = {
9325 4, 5, 6, 7
9328 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
9329 ordered from the uppermost in memory to the lowest in memory. */
9330 static const unsigned char mips16e_save_restore_regs[] = {
9331 31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
9334 /* Return the index of the lowest X in the range [0, SIZE) for which
9335 bit REGS[X] is set in MASK. Return SIZE if there is no such X. */
9337 static unsigned int
9338 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
9339 unsigned int size)
9341 unsigned int i;
9343 for (i = 0; i < size; i++)
9344 if (BITSET_P (mask, regs[i]))
9345 break;
9347 return i;
9350 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
9351 is the number of set bits. If *MASK_PTR contains REGS[X] for some X
9352 in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
9353 is true for all indexes (X, SIZE). */
9355 static void
9356 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
9357 unsigned int size, unsigned int *num_regs_ptr)
9359 unsigned int i;
9361 i = mips16e_find_first_register (*mask_ptr, regs, size);
9362 for (i++; i < size; i++)
9363 if (!BITSET_P (*mask_ptr, regs[i]))
9365 *num_regs_ptr += 1;
9366 *mask_ptr |= 1 << regs[i];
9370 /* Return a simplified form of X using the register values in REG_VALUES.
9371 REG_VALUES[R] is the last value assigned to hard register R, or null
9372 if R has not been modified.
9374 This function is rather limited, but is good enough for our purposes. */
9376 static rtx
9377 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
9379 x = avoid_constant_pool_reference (x);
9381 if (UNARY_P (x))
9383 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9384 return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
9385 x0, GET_MODE (XEXP (x, 0)));
9388 if (ARITHMETIC_P (x))
9390 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9391 rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
9392 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
9395 if (REG_P (x)
9396 && reg_values[REGNO (x)]
9397 && !rtx_unstable_p (reg_values[REGNO (x)]))
9398 return reg_values[REGNO (x)];
9400 return x;
9403 /* Return true if (set DEST SRC) stores an argument register into its
9404 caller-allocated save slot, storing the number of that argument
9405 register in *REGNO_PTR if so. REG_VALUES is as for
9406 mips16e_collect_propagate_value. */
9408 static bool
9409 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
9410 unsigned int *regno_ptr)
9412 unsigned int argno, regno;
9413 HOST_WIDE_INT offset, required_offset;
9414 rtx addr, base;
9416 /* Check that this is a word-mode store. */
9417 if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
9418 return false;
9420 /* Check that the register being saved is an unmodified argument
9421 register. */
9422 regno = REGNO (src);
9423 if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
9424 return false;
9425 argno = regno - GP_ARG_FIRST;
9427 /* Check whether the address is an appropriate stack-pointer or
9428 frame-pointer access. */
9429 addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
9430 mips_split_plus (addr, &base, &offset);
9431 required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
9432 if (base == hard_frame_pointer_rtx)
9433 required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
9434 else if (base != stack_pointer_rtx)
9435 return false;
9436 if (offset != required_offset)
9437 return false;
9439 *regno_ptr = regno;
9440 return true;
9443 /* A subroutine of mips_expand_prologue, called only when generating
9444 MIPS16e SAVE instructions. Search the start of the function for any
9445 instructions that save argument registers into their caller-allocated
9446 save slots. Delete such instructions and return a value N such that
9447 saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
9448 instructions redundant. */
9450 static unsigned int
9451 mips16e_collect_argument_saves (void)
9453 rtx reg_values[FIRST_PSEUDO_REGISTER];
9454 rtx_insn *insn, *next;
9455 rtx set, dest, src;
9456 unsigned int nargs, regno;
9458 push_topmost_sequence ();
9459 nargs = 0;
9460 memset (reg_values, 0, sizeof (reg_values));
9461 for (insn = get_insns (); insn; insn = next)
9463 next = NEXT_INSN (insn);
9464 if (NOTE_P (insn) || DEBUG_INSN_P (insn))
9465 continue;
9467 if (!INSN_P (insn))
9468 break;
9470 set = PATTERN (insn);
9471 if (GET_CODE (set) != SET)
9472 break;
9474 dest = SET_DEST (set);
9475 src = SET_SRC (set);
9476 if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
9478 if (!BITSET_P (cfun->machine->frame.mask, regno))
9480 delete_insn (insn);
9481 nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
9484 else if (REG_P (dest) && GET_MODE (dest) == word_mode)
9485 reg_values[REGNO (dest)]
9486 = mips16e_collect_propagate_value (src, reg_values);
9487 else
9488 break;
9490 pop_topmost_sequence ();
9492 return nargs;
9495 /* Return a move between register REGNO and memory location SP + OFFSET.
9496 REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
9497 Make the move a load if RESTORE_P, otherwise make it a store. */
9499 static rtx
9500 mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
9501 HOST_WIDE_INT offset, unsigned int regno)
9503 rtx reg, mem;
9505 mem = gen_frame_mem (SImode, plus_constant (Pmode, stack_pointer_rtx,
9506 offset));
9507 reg = gen_rtx_REG (SImode, regno);
9508 if (restore_p)
9510 mips_add_cfa_restore (reg);
9511 return gen_rtx_SET (reg, mem);
9513 if (reg_parm_p)
9514 return gen_rtx_SET (mem, reg);
9515 return mips_frame_set (mem, reg);
9518 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
9519 The instruction must:
9521 - Allocate or deallocate SIZE bytes in total; SIZE is known
9522 to be nonzero.
9524 - Save or restore as many registers in *MASK_PTR as possible.
9525 The instruction saves the first registers at the top of the
9526 allocated area, with the other registers below it.
9528 - Save NARGS argument registers above the allocated area.
9530 (NARGS is always zero if RESTORE_P.)
9532 The SAVE and RESTORE instructions cannot save and restore all general
9533 registers, so there may be some registers left over for the caller to
9534 handle. Destructively modify *MASK_PTR so that it contains the registers
9535 that still need to be saved or restored. The caller can save these
9536 registers in the memory immediately below *OFFSET_PTR, which is a
9537 byte offset from the bottom of the allocated stack area. */
9539 static rtx
9540 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
9541 HOST_WIDE_INT *offset_ptr, unsigned int nargs,
9542 HOST_WIDE_INT size)
9544 rtx pattern, set;
9545 HOST_WIDE_INT offset, top_offset;
9546 unsigned int i, regno;
9547 int n;
9549 gcc_assert (cfun->machine->frame.num_fp == 0);
9551 /* Calculate the number of elements in the PARALLEL. We need one element
9552 for the stack adjustment, one for each argument register save, and one
9553 for each additional register move. */
9554 n = 1 + nargs;
9555 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9556 if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
9557 n++;
9559 /* Create the final PARALLEL. */
9560 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
9561 n = 0;
9563 /* Add the stack pointer adjustment. */
9564 set = gen_rtx_SET (stack_pointer_rtx,
9565 plus_constant (Pmode, stack_pointer_rtx,
9566 restore_p ? size : -size));
9567 RTX_FRAME_RELATED_P (set) = 1;
9568 XVECEXP (pattern, 0, n++) = set;
9570 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9571 top_offset = restore_p ? size : 0;
9573 /* Save the arguments. */
9574 for (i = 0; i < nargs; i++)
9576 offset = top_offset + i * UNITS_PER_WORD;
9577 set = mips16e_save_restore_reg (restore_p, true, offset,
9578 GP_ARG_FIRST + i);
9579 XVECEXP (pattern, 0, n++) = set;
9582 /* Then fill in the other register moves. */
9583 offset = top_offset;
9584 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9586 regno = mips16e_save_restore_regs[i];
9587 if (BITSET_P (*mask_ptr, regno))
9589 offset -= UNITS_PER_WORD;
9590 set = mips16e_save_restore_reg (restore_p, false, offset, regno);
9591 XVECEXP (pattern, 0, n++) = set;
9592 *mask_ptr &= ~(1 << regno);
9596 /* Tell the caller what offset it should use for the remaining registers. */
9597 *offset_ptr = size + (offset - top_offset);
9599 gcc_assert (n == XVECLEN (pattern, 0));
9601 return pattern;
9604 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
9605 pointer. Return true if PATTERN matches the kind of instruction
9606 generated by mips16e_build_save_restore. If INFO is nonnull,
9607 initialize it when returning true. */
9609 bool
9610 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
9611 struct mips16e_save_restore_info *info)
9613 unsigned int i, nargs, mask, extra;
9614 HOST_WIDE_INT top_offset, save_offset, offset;
9615 rtx set, reg, mem, base;
9616 int n;
9618 if (!GENERATE_MIPS16E_SAVE_RESTORE)
9619 return false;
9621 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9622 top_offset = adjust > 0 ? adjust : 0;
9624 /* Interpret all other members of the PARALLEL. */
9625 save_offset = top_offset - UNITS_PER_WORD;
9626 mask = 0;
9627 nargs = 0;
9628 i = 0;
9629 for (n = 1; n < XVECLEN (pattern, 0); n++)
9631 /* Check that we have a SET. */
9632 set = XVECEXP (pattern, 0, n);
9633 if (GET_CODE (set) != SET)
9634 return false;
9636 /* Check that the SET is a load (if restoring) or a store
9637 (if saving). */
9638 mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
9639 if (!MEM_P (mem))
9640 return false;
9642 /* Check that the address is the sum of the stack pointer and a
9643 possibly-zero constant offset. */
9644 mips_split_plus (XEXP (mem, 0), &base, &offset);
9645 if (base != stack_pointer_rtx)
9646 return false;
9648 /* Check that SET's other operand is a register. */
9649 reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
9650 if (!REG_P (reg))
9651 return false;
9653 /* Check for argument saves. */
9654 if (offset == top_offset + nargs * UNITS_PER_WORD
9655 && REGNO (reg) == GP_ARG_FIRST + nargs)
9656 nargs++;
9657 else if (offset == save_offset)
9659 while (mips16e_save_restore_regs[i++] != REGNO (reg))
9660 if (i == ARRAY_SIZE (mips16e_save_restore_regs))
9661 return false;
9663 mask |= 1 << REGNO (reg);
9664 save_offset -= UNITS_PER_WORD;
9666 else
9667 return false;
9670 /* Check that the restrictions on register ranges are met. */
9671 extra = 0;
9672 mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
9673 ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
9674 mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
9675 ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
9676 if (extra != 0)
9677 return false;
9679 /* Make sure that the topmost argument register is not saved twice.
9680 The checks above ensure that the same is then true for the other
9681 argument registers. */
9682 if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
9683 return false;
9685 /* Pass back information, if requested. */
9686 if (info)
9688 info->nargs = nargs;
9689 info->mask = mask;
9690 info->size = (adjust > 0 ? adjust : -adjust);
9693 return true;
9696 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
9697 for the register range [MIN_REG, MAX_REG]. Return a pointer to
9698 the null terminator. */
9700 static char *
9701 mips16e_add_register_range (char *s, unsigned int min_reg,
9702 unsigned int max_reg)
9704 if (min_reg != max_reg)
9705 s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
9706 else
9707 s += sprintf (s, ",%s", reg_names[min_reg]);
9708 return s;
9711 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
9712 PATTERN and ADJUST are as for mips16e_save_restore_pattern_p. */
9714 const char *
9715 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
9717 static char buffer[300];
9719 struct mips16e_save_restore_info info;
9720 unsigned int i, end;
9721 char *s;
9723 /* Parse the pattern. */
9724 if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
9725 gcc_unreachable ();
9727 /* Add the mnemonic. */
9728 s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
9729 s += strlen (s);
9731 /* Save the arguments. */
9732 if (info.nargs > 1)
9733 s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
9734 reg_names[GP_ARG_FIRST + info.nargs - 1]);
9735 else if (info.nargs == 1)
9736 s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
9738 /* Emit the amount of stack space to allocate or deallocate. */
9739 s += sprintf (s, "%d", (int) info.size);
9741 /* Save or restore $16. */
9742 if (BITSET_P (info.mask, 16))
9743 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
9745 /* Save or restore $17. */
9746 if (BITSET_P (info.mask, 17))
9747 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
9749 /* Save or restore registers in the range $s2...$s8, which
9750 mips16e_s2_s8_regs lists in decreasing order. Note that this
9751 is a software register range; the hardware registers are not
9752 numbered consecutively. */
9753 end = ARRAY_SIZE (mips16e_s2_s8_regs);
9754 i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
9755 if (i < end)
9756 s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
9757 mips16e_s2_s8_regs[i]);
9759 /* Save or restore registers in the range $a0...$a3. */
9760 end = ARRAY_SIZE (mips16e_a0_a3_regs);
9761 i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
9762 if (i < end)
9763 s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
9764 mips16e_a0_a3_regs[end - 1]);
9766 /* Save or restore $31. */
9767 if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
9768 s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
9770 return buffer;
9773 /* Return true if the current function returns its value in a floating-point
9774 register in MIPS16 mode. */
9776 static bool
9777 mips16_cfun_returns_in_fpr_p (void)
9779 tree return_type = DECL_RESULT (current_function_decl);
9780 return (TARGET_MIPS16
9781 && TARGET_HARD_FLOAT_ABI
9782 && !aggregate_value_p (return_type, current_function_decl)
9783 && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
9786 /* Return true if predicate PRED is true for at least one instruction.
9787 Cache the result in *CACHE, and assume that the result is true
9788 if *CACHE is already true. */
9790 static bool
9791 mips_find_gp_ref (bool *cache, bool (*pred) (rtx_insn *))
9793 rtx_insn *insn, *subinsn;
9795 if (!*cache)
9797 push_topmost_sequence ();
9798 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9799 FOR_EACH_SUBINSN (subinsn, insn)
9800 if (USEFUL_INSN_P (subinsn) && pred (subinsn))
9802 *cache = true;
9803 break;
9805 pop_topmost_sequence ();
9807 return *cache;
9810 /* Return true if INSN refers to the global pointer in an "inflexible" way.
9811 See mips_cfun_has_inflexible_gp_ref_p for details. */
9813 static bool
9814 mips_insn_has_inflexible_gp_ref_p (rtx_insn *insn)
9816 /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
9817 indicate that the target could be a traditional MIPS
9818 lazily-binding stub. */
9819 return find_reg_fusage (insn, USE, pic_offset_table_rtx);
9822 /* Return true if the current function refers to the global pointer
9823 in a way that forces $28 to be valid. This means that we can't
9824 change the choice of global pointer, even for NewABI code.
9826 One example of this (and one which needs several checks) is that
9827 $28 must be valid when calling traditional MIPS lazy-binding stubs.
9828 (This restriction does not apply to PLTs.) */
9830 static bool
9831 mips_cfun_has_inflexible_gp_ref_p (void)
9833 /* If the function has a nonlocal goto, $28 must hold the correct
9834 global pointer for the target function. That is, the target
9835 of the goto implicitly uses $28. */
9836 if (crtl->has_nonlocal_goto)
9837 return true;
9839 if (TARGET_ABICALLS_PIC2)
9841 /* Symbolic accesses implicitly use the global pointer unless
9842 -mexplicit-relocs is in effect. JAL macros to symbolic addresses
9843 might go to traditional MIPS lazy-binding stubs. */
9844 if (!TARGET_EXPLICIT_RELOCS)
9845 return true;
9847 /* FUNCTION_PROFILER includes a JAL to _mcount, which again
9848 can be lazily-bound. */
9849 if (crtl->profile)
9850 return true;
9852 /* MIPS16 functions that return in FPRs need to call an
9853 external libgcc routine. This call is only made explict
9854 during mips_expand_epilogue, and it too might be lazily bound. */
9855 if (mips16_cfun_returns_in_fpr_p ())
9856 return true;
9859 return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
9860 mips_insn_has_inflexible_gp_ref_p);
9863 /* Return true if INSN refers to the global pointer in a "flexible" way.
9864 See mips_cfun_has_flexible_gp_ref_p for details. */
9866 static bool
9867 mips_insn_has_flexible_gp_ref_p (rtx_insn *insn)
9869 return (get_attr_got (insn) != GOT_UNSET
9870 || mips_small_data_pattern_p (PATTERN (insn))
9871 || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
9874 /* Return true if the current function references the global pointer,
9875 but if those references do not inherently require the global pointer
9876 to be $28. Assume !mips_cfun_has_inflexible_gp_ref_p (). */
9878 static bool
9879 mips_cfun_has_flexible_gp_ref_p (void)
9881 /* Reload can sometimes introduce constant pool references
9882 into a function that otherwise didn't need them. For example,
9883 suppose we have an instruction like:
9885 (set (reg:DF R1) (float:DF (reg:SI R2)))
9887 If R2 turns out to be a constant such as 1, the instruction may
9888 have a REG_EQUAL note saying that R1 == 1.0. Reload then has
9889 the option of using this constant if R2 doesn't get allocated
9890 to a register.
9892 In cases like these, reload will have added the constant to the
9893 pool but no instruction will yet refer to it. */
9894 if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
9895 return true;
9897 return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
9898 mips_insn_has_flexible_gp_ref_p);
9901 /* Return the register that should be used as the global pointer
9902 within this function. Return INVALID_REGNUM if the function
9903 doesn't need a global pointer. */
9905 static unsigned int
9906 mips_global_pointer (void)
9908 unsigned int regno;
9910 /* $gp is always available unless we're using a GOT. */
9911 if (!TARGET_USE_GOT)
9912 return GLOBAL_POINTER_REGNUM;
9914 /* If there are inflexible references to $gp, we must use the
9915 standard register. */
9916 if (mips_cfun_has_inflexible_gp_ref_p ())
9917 return GLOBAL_POINTER_REGNUM;
9919 /* If there are no current references to $gp, then the only uses
9920 we can introduce later are those involved in long branches. */
9921 if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
9922 return INVALID_REGNUM;
9924 /* If the global pointer is call-saved, try to use a call-clobbered
9925 alternative. */
9926 if (TARGET_CALL_SAVED_GP && crtl->is_leaf)
9927 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9928 if (!df_regs_ever_live_p (regno)
9929 && call_really_used_regs[regno]
9930 && !fixed_regs[regno]
9931 && regno != PIC_FUNCTION_ADDR_REGNUM)
9932 return regno;
9934 return GLOBAL_POINTER_REGNUM;
9937 /* Return true if the current function's prologue must load the global
9938 pointer value into pic_offset_table_rtx and store the same value in
9939 the function's cprestore slot (if any).
9941 One problem we have to deal with is that, when emitting GOT-based
9942 position independent code, long-branch sequences will need to load
9943 the address of the branch target from the GOT. We don't know until
9944 the very end of compilation whether (and where) the function needs
9945 long branches, so we must ensure that _any_ branch can access the
9946 global pointer in some form. However, we do not want to pessimize
9947 the usual case in which all branches are short.
9949 We handle this as follows:
9951 (1) During reload, we set cfun->machine->global_pointer to
9952 INVALID_REGNUM if we _know_ that the current function
9953 doesn't need a global pointer. This is only valid if
9954 long branches don't need the GOT.
9956 Otherwise, we assume that we might need a global pointer
9957 and pick an appropriate register.
9959 (2) If cfun->machine->global_pointer != INVALID_REGNUM,
9960 we ensure that the global pointer is available at every
9961 block boundary bar entry and exit. We do this in one of two ways:
9963 - If the function has a cprestore slot, we ensure that this
9964 slot is valid at every branch. However, as explained in
9965 point (6) below, there is no guarantee that pic_offset_table_rtx
9966 itself is valid if new uses of the global pointer are introduced
9967 after the first post-epilogue split.
9969 We guarantee that the cprestore slot is valid by loading it
9970 into a fake register, CPRESTORE_SLOT_REGNUM. We then make
9971 this register live at every block boundary bar function entry
9972 and exit. It is then invalid to move the load (and thus the
9973 preceding store) across a block boundary.
9975 - If the function has no cprestore slot, we guarantee that
9976 pic_offset_table_rtx itself is valid at every branch.
9978 See mips_eh_uses for the handling of the register liveness.
9980 (3) During prologue and epilogue generation, we emit "ghost"
9981 placeholder instructions to manipulate the global pointer.
9983 (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
9984 and cfun->machine->must_restore_gp_when_clobbered_p if we already know
9985 that the function needs a global pointer. (There is no need to set
9986 them earlier than this, and doing it as late as possible leads to
9987 fewer false positives.)
9989 (5) If cfun->machine->must_initialize_gp_p is true during a
9990 split_insns pass, we split the ghost instructions into real
9991 instructions. These split instructions can then be optimized in
9992 the usual way. Otherwise, we keep the ghost instructions intact,
9993 and optimize for the case where they aren't needed. We still
9994 have the option of splitting them later, if we need to introduce
9995 new uses of the global pointer.
9997 For example, the scheduler ignores a ghost instruction that
9998 stores $28 to the stack, but it handles the split form of
9999 the ghost instruction as an ordinary store.
10001 (6) [OldABI only.] If cfun->machine->must_restore_gp_when_clobbered_p
10002 is true during the first post-epilogue split_insns pass, we split
10003 calls and restore_gp patterns into instructions that explicitly
10004 load pic_offset_table_rtx from the cprestore slot. Otherwise,
10005 we split these patterns into instructions that _don't_ load from
10006 the cprestore slot.
10008 If cfun->machine->must_restore_gp_when_clobbered_p is true at the
10009 time of the split, then any instructions that exist at that time
10010 can make free use of pic_offset_table_rtx. However, if we want
10011 to introduce new uses of the global pointer after the split,
10012 we must explicitly load the value from the cprestore slot, since
10013 pic_offset_table_rtx itself might not be valid at a given point
10014 in the function.
10016 The idea is that we want to be able to delete redundant
10017 loads from the cprestore slot in the usual case where no
10018 long branches are needed.
10020 (7) If cfun->machine->must_initialize_gp_p is still false at the end
10021 of md_reorg, we decide whether the global pointer is needed for
10022 long branches. If so, we set cfun->machine->must_initialize_gp_p
10023 to true and split the ghost instructions into real instructions
10024 at that stage.
10026 Note that the ghost instructions must have a zero length for three reasons:
10028 - Giving the length of the underlying $gp sequence might cause
10029 us to use long branches in cases where they aren't really needed.
10031 - They would perturb things like alignment calculations.
10033 - More importantly, the hazard detection in md_reorg relies on
10034 empty instructions having a zero length.
10036 If we find a long branch and split the ghost instructions at the
10037 end of md_reorg, the split could introduce more long branches.
10038 That isn't a problem though, because we still do the split before
10039 the final shorten_branches pass.
10041 This is extremely ugly, but it seems like the best compromise between
10042 correctness and efficiency. */
10044 bool
10045 mips_must_initialize_gp_p (void)
10047 return cfun->machine->must_initialize_gp_p;
10050 /* Return true if REGNO is a register that is ordinarily call-clobbered
10051 but must nevertheless be preserved by an interrupt handler. */
10053 static bool
10054 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
10056 if ((ISA_HAS_HILO || TARGET_DSP)
10057 && MD_REG_P (regno))
10058 return true;
10060 if (TARGET_DSP && DSP_ACC_REG_P (regno))
10061 return true;
10063 if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
10065 /* $0 is hard-wired. */
10066 if (regno == GP_REG_FIRST)
10067 return false;
10069 /* The interrupt handler can treat kernel registers as
10070 scratch registers. */
10071 if (KERNEL_REG_P (regno))
10072 return false;
10074 /* The function will return the stack pointer to its original value
10075 anyway. */
10076 if (regno == STACK_POINTER_REGNUM)
10077 return false;
10079 /* Otherwise, return true for registers that aren't ordinarily
10080 call-clobbered. */
10081 return call_really_used_regs[regno];
10084 return false;
10087 /* Return true if the current function should treat register REGNO
10088 as call-saved. */
10090 static bool
10091 mips_cfun_call_saved_reg_p (unsigned int regno)
10093 /* If the user makes an ordinarily-call-saved register global,
10094 that register is no longer call-saved. */
10095 if (global_regs[regno])
10096 return false;
10098 /* Interrupt handlers need to save extra registers. */
10099 if (cfun->machine->interrupt_handler_p
10100 && mips_interrupt_extra_call_saved_reg_p (regno))
10101 return true;
10103 /* call_insns preserve $28 unless they explicitly say otherwise,
10104 so call_really_used_regs[] treats $28 as call-saved. However,
10105 we want the ABI property rather than the default call_insn
10106 property here. */
10107 return (regno == GLOBAL_POINTER_REGNUM
10108 ? TARGET_CALL_SAVED_GP
10109 : !call_really_used_regs[regno]);
10112 /* Return true if the function body might clobber register REGNO.
10113 We know that REGNO is call-saved. */
10115 static bool
10116 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
10118 /* Some functions should be treated as clobbering all call-saved
10119 registers. */
10120 if (crtl->saves_all_registers)
10121 return true;
10123 /* DF handles cases where a register is explicitly referenced in
10124 the rtl. Incoming values are passed in call-clobbered registers,
10125 so we can assume that any live call-saved register is set within
10126 the function. */
10127 if (df_regs_ever_live_p (regno))
10128 return true;
10130 /* Check for registers that are clobbered by FUNCTION_PROFILER.
10131 These clobbers are not explicit in the rtl. */
10132 if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
10133 return true;
10135 /* If we're using a call-saved global pointer, the function's
10136 prologue will need to set it up. */
10137 if (cfun->machine->global_pointer == regno)
10138 return true;
10140 /* The function's prologue will need to set the frame pointer if
10141 frame_pointer_needed. */
10142 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
10143 return true;
10145 /* If a MIPS16 function returns a value in FPRs, its epilogue
10146 will need to call an external libgcc routine. This yet-to-be
10147 generated call_insn will clobber $31. */
10148 if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
10149 return true;
10151 /* If REGNO is ordinarily call-clobbered, we must assume that any
10152 called function could modify it. */
10153 if (cfun->machine->interrupt_handler_p
10154 && !crtl->is_leaf
10155 && mips_interrupt_extra_call_saved_reg_p (regno))
10156 return true;
10158 return false;
10161 /* Return true if the current function must save register REGNO. */
10163 static bool
10164 mips_save_reg_p (unsigned int regno)
10166 if (mips_cfun_call_saved_reg_p (regno))
10168 if (mips_cfun_might_clobber_call_saved_reg_p (regno))
10169 return true;
10171 /* Save both registers in an FPR pair if either one is used. This is
10172 needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
10173 register to be used without the even register. */
10174 if (FP_REG_P (regno)
10175 && MAX_FPRS_PER_FMT == 2
10176 && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
10177 return true;
10180 /* We need to save the incoming return address if __builtin_eh_return
10181 is being used to set a different return address. */
10182 if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
10183 return true;
10185 return false;
10188 /* Populate the current function's mips_frame_info structure.
10190 MIPS stack frames look like:
10192 +-------------------------------+
10194 | incoming stack arguments |
10196 +-------------------------------+
10198 | caller-allocated save area |
10199 A | for register arguments |
10201 +-------------------------------+ <-- incoming stack pointer
10203 | callee-allocated save area |
10204 B | for arguments that are |
10205 | split between registers and |
10206 | the stack |
10208 +-------------------------------+ <-- arg_pointer_rtx
10210 C | callee-allocated save area |
10211 | for register varargs |
10213 +-------------------------------+ <-- frame_pointer_rtx
10214 | | + cop0_sp_offset
10215 | COP0 reg save area | + UNITS_PER_WORD
10217 +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
10218 | | + UNITS_PER_WORD
10219 | accumulator save area |
10221 +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
10222 | | + UNITS_PER_HWFPVALUE
10223 | FPR save area |
10225 +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
10226 | | + UNITS_PER_WORD
10227 | GPR save area |
10229 +-------------------------------+ <-- frame_pointer_rtx with
10230 | | \ -fstack-protector
10231 | local variables | | var_size
10232 | | /
10233 +-------------------------------+
10234 | | \
10235 | $gp save area | | cprestore_size
10236 | | /
10237 P +-------------------------------+ <-- hard_frame_pointer_rtx for
10238 | | \ MIPS16 code
10239 | outgoing stack arguments | |
10240 | | |
10241 +-------------------------------+ | args_size
10242 | | |
10243 | caller-allocated save area | |
10244 | for register arguments | |
10245 | | /
10246 +-------------------------------+ <-- stack_pointer_rtx
10247 frame_pointer_rtx without
10248 -fstack-protector
10249 hard_frame_pointer_rtx for
10250 non-MIPS16 code.
10252 At least two of A, B and C will be empty.
10254 Dynamic stack allocations such as alloca insert data at point P.
10255 They decrease stack_pointer_rtx but leave frame_pointer_rtx and
10256 hard_frame_pointer_rtx unchanged. */
10258 static void
10259 mips_compute_frame_info (void)
10261 struct mips_frame_info *frame;
10262 HOST_WIDE_INT offset, size;
10263 unsigned int regno, i;
10265 /* Set this function's interrupt properties. */
10266 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
10268 if (mips_isa_rev < 2)
10269 error ("the %<interrupt%> attribute requires a MIPS32r2 processor or greater");
10270 else if (TARGET_HARD_FLOAT)
10271 error ("the %<interrupt%> attribute requires %<-msoft-float%>");
10272 else if (TARGET_MIPS16)
10273 error ("interrupt handlers cannot be MIPS16 functions");
10274 else
10276 cfun->machine->interrupt_handler_p = true;
10277 cfun->machine->use_shadow_register_set_p =
10278 mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
10279 cfun->machine->keep_interrupts_masked_p =
10280 mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
10281 cfun->machine->use_debug_exception_return_p =
10282 mips_use_debug_exception_return_p (TREE_TYPE
10283 (current_function_decl));
10287 frame = &cfun->machine->frame;
10288 memset (frame, 0, sizeof (*frame));
10289 size = get_frame_size ();
10291 cfun->machine->global_pointer = mips_global_pointer ();
10293 /* The first two blocks contain the outgoing argument area and the $gp save
10294 slot. This area isn't needed in leaf functions, but if the
10295 target-independent frame size is nonzero, we have already committed to
10296 allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD. */
10297 if ((size == 0 || FRAME_GROWS_DOWNWARD) && crtl->is_leaf)
10299 /* The MIPS 3.0 linker does not like functions that dynamically
10300 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
10301 looks like we are trying to create a second frame pointer to the
10302 function, so allocate some stack space to make it happy. */
10303 if (cfun->calls_alloca)
10304 frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
10305 else
10306 frame->args_size = 0;
10307 frame->cprestore_size = 0;
10309 else
10311 frame->args_size = crtl->outgoing_args_size;
10312 frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
10314 offset = frame->args_size + frame->cprestore_size;
10316 /* Move above the local variables. */
10317 frame->var_size = MIPS_STACK_ALIGN (size);
10318 offset += frame->var_size;
10320 /* Find out which GPRs we need to save. */
10321 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
10322 if (mips_save_reg_p (regno))
10324 frame->num_gp++;
10325 frame->mask |= 1 << (regno - GP_REG_FIRST);
10328 /* If this function calls eh_return, we must also save and restore the
10329 EH data registers. */
10330 if (crtl->calls_eh_return)
10331 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
10333 frame->num_gp++;
10334 frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
10337 /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
10338 $a3-$a0 and $s2-$s8. If we save one register in the range, we must
10339 save all later registers too. */
10340 if (GENERATE_MIPS16E_SAVE_RESTORE)
10342 mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
10343 ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
10344 mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
10345 ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
10348 /* Move above the GPR save area. */
10349 if (frame->num_gp > 0)
10351 offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
10352 frame->gp_sp_offset = offset - UNITS_PER_WORD;
10355 /* Find out which FPRs we need to save. This loop must iterate over
10356 the same space as its companion in mips_for_each_saved_gpr_and_fpr. */
10357 if (TARGET_HARD_FLOAT)
10358 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
10359 if (mips_save_reg_p (regno))
10361 frame->num_fp += MAX_FPRS_PER_FMT;
10362 frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
10365 /* Move above the FPR save area. */
10366 if (frame->num_fp > 0)
10368 offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
10369 frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
10372 /* Add in space for the interrupt context information. */
10373 if (cfun->machine->interrupt_handler_p)
10375 /* Check HI/LO. */
10376 if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
10378 frame->num_acc++;
10379 frame->acc_mask |= (1 << 0);
10382 /* Check accumulators 1, 2, 3. */
10383 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
10384 if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
10386 frame->num_acc++;
10387 frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
10390 /* All interrupt context functions need space to preserve STATUS. */
10391 frame->num_cop0_regs++;
10393 /* If we don't keep interrupts masked, we need to save EPC. */
10394 if (!cfun->machine->keep_interrupts_masked_p)
10395 frame->num_cop0_regs++;
10398 /* Move above the accumulator save area. */
10399 if (frame->num_acc > 0)
10401 /* Each accumulator needs 2 words. */
10402 offset += frame->num_acc * 2 * UNITS_PER_WORD;
10403 frame->acc_sp_offset = offset - UNITS_PER_WORD;
10406 /* Move above the COP0 register save area. */
10407 if (frame->num_cop0_regs > 0)
10409 offset += frame->num_cop0_regs * UNITS_PER_WORD;
10410 frame->cop0_sp_offset = offset - UNITS_PER_WORD;
10413 /* Move above the callee-allocated varargs save area. */
10414 offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
10415 frame->arg_pointer_offset = offset;
10417 /* Move above the callee-allocated area for pretend stack arguments. */
10418 offset += crtl->args.pretend_args_size;
10419 frame->total_size = offset;
10421 /* Work out the offsets of the save areas from the top of the frame. */
10422 if (frame->gp_sp_offset > 0)
10423 frame->gp_save_offset = frame->gp_sp_offset - offset;
10424 if (frame->fp_sp_offset > 0)
10425 frame->fp_save_offset = frame->fp_sp_offset - offset;
10426 if (frame->acc_sp_offset > 0)
10427 frame->acc_save_offset = frame->acc_sp_offset - offset;
10428 if (frame->num_cop0_regs > 0)
10429 frame->cop0_save_offset = frame->cop0_sp_offset - offset;
10431 /* MIPS16 code offsets the frame pointer by the size of the outgoing
10432 arguments. This tends to increase the chances of using unextended
10433 instructions for local variables and incoming arguments. */
10434 if (TARGET_MIPS16)
10435 frame->hard_frame_pointer_offset = frame->args_size;
10438 /* Return the style of GP load sequence that is being used for the
10439 current function. */
10441 enum mips_loadgp_style
10442 mips_current_loadgp_style (void)
10444 if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
10445 return LOADGP_NONE;
10447 if (TARGET_RTP_PIC)
10448 return LOADGP_RTP;
10450 if (TARGET_ABSOLUTE_ABICALLS)
10451 return LOADGP_ABSOLUTE;
10453 return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
10456 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
10458 static bool
10459 mips_frame_pointer_required (void)
10461 /* If the function contains dynamic stack allocations, we need to
10462 use the frame pointer to access the static parts of the frame. */
10463 if (cfun->calls_alloca)
10464 return true;
10466 /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
10467 reload may be unable to compute the address of a local variable,
10468 since there is no way to add a large constant to the stack pointer
10469 without using a second temporary register. */
10470 if (TARGET_MIPS16)
10472 mips_compute_frame_info ();
10473 if (!SMALL_OPERAND (cfun->machine->frame.total_size))
10474 return true;
10477 return false;
10480 /* Make sure that we're not trying to eliminate to the wrong hard frame
10481 pointer. */
10483 static bool
10484 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
10486 return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
10489 /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame pointer
10490 or argument pointer. TO is either the stack pointer or hard frame
10491 pointer. */
10493 HOST_WIDE_INT
10494 mips_initial_elimination_offset (int from, int to)
10496 HOST_WIDE_INT offset;
10498 mips_compute_frame_info ();
10500 /* Set OFFSET to the offset from the end-of-prologue stack pointer. */
10501 switch (from)
10503 case FRAME_POINTER_REGNUM:
10504 if (FRAME_GROWS_DOWNWARD)
10505 offset = (cfun->machine->frame.args_size
10506 + cfun->machine->frame.cprestore_size
10507 + cfun->machine->frame.var_size);
10508 else
10509 offset = 0;
10510 break;
10512 case ARG_POINTER_REGNUM:
10513 offset = cfun->machine->frame.arg_pointer_offset;
10514 break;
10516 default:
10517 gcc_unreachable ();
10520 if (to == HARD_FRAME_POINTER_REGNUM)
10521 offset -= cfun->machine->frame.hard_frame_pointer_offset;
10523 return offset;
10526 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY. */
10528 static void
10529 mips_extra_live_on_entry (bitmap regs)
10531 if (TARGET_USE_GOT)
10533 /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
10534 the global pointer. */
10535 if (!TARGET_ABSOLUTE_ABICALLS)
10536 bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
10538 /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
10539 the global pointer. */
10540 if (TARGET_MIPS16)
10541 bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
10543 /* See the comment above load_call<mode> for details. */
10544 bitmap_set_bit (regs, GOT_VERSION_REGNUM);
10548 /* Implement RETURN_ADDR_RTX. We do not support moving back to a
10549 previous frame. */
10552 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
10554 if (count != 0)
10555 return const0_rtx;
10557 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
10560 /* Emit code to change the current function's return address to
10561 ADDRESS. SCRATCH is available as a scratch register, if needed.
10562 ADDRESS and SCRATCH are both word-mode GPRs. */
10564 void
10565 mips_set_return_address (rtx address, rtx scratch)
10567 rtx slot_address;
10569 gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
10570 slot_address = mips_add_offset (scratch, stack_pointer_rtx,
10571 cfun->machine->frame.gp_sp_offset);
10572 mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
10575 /* Return true if the current function has a cprestore slot. */
10577 bool
10578 mips_cfun_has_cprestore_slot_p (void)
10580 return (cfun->machine->global_pointer != INVALID_REGNUM
10581 && cfun->machine->frame.cprestore_size > 0);
10584 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
10585 cprestore slot. LOAD_P is true if the caller wants to load from
10586 the cprestore slot; it is false if the caller wants to store to
10587 the slot. */
10589 static void
10590 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
10591 bool load_p)
10593 const struct mips_frame_info *frame;
10595 frame = &cfun->machine->frame;
10596 /* .cprestore always uses the stack pointer instead of the frame pointer.
10597 We have a free choice for direct stores for non-MIPS16 functions,
10598 and for MIPS16 functions whose cprestore slot is in range of the
10599 stack pointer. Using the stack pointer would sometimes give more
10600 (early) scheduling freedom, but using the frame pointer would
10601 sometimes give more (late) scheduling freedom. It's hard to
10602 predict which applies to a given function, so let's keep things
10603 simple.
10605 Loads must always use the frame pointer in functions that call
10606 alloca, and there's little benefit to using the stack pointer
10607 otherwise. */
10608 if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
10610 *base = hard_frame_pointer_rtx;
10611 *offset = frame->args_size - frame->hard_frame_pointer_offset;
10613 else
10615 *base = stack_pointer_rtx;
10616 *offset = frame->args_size;
10620 /* Return true if X is the load or store address of the cprestore slot;
10621 LOAD_P says which. */
10623 bool
10624 mips_cprestore_address_p (rtx x, bool load_p)
10626 rtx given_base, required_base;
10627 HOST_WIDE_INT given_offset, required_offset;
10629 mips_split_plus (x, &given_base, &given_offset);
10630 mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
10631 return given_base == required_base && given_offset == required_offset;
10634 /* Return a MEM rtx for the cprestore slot. LOAD_P is true if we are
10635 going to load from it, false if we are going to store to it.
10636 Use TEMP as a temporary register if need be. */
10638 static rtx
10639 mips_cprestore_slot (rtx temp, bool load_p)
10641 rtx base;
10642 HOST_WIDE_INT offset;
10644 mips_get_cprestore_base_and_offset (&base, &offset, load_p);
10645 return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
10648 /* Emit instructions to save global pointer value GP into cprestore
10649 slot MEM. OFFSET is the offset that MEM applies to the base register.
10651 MEM may not be a legitimate address. If it isn't, TEMP is a
10652 temporary register that can be used, otherwise it is a SCRATCH. */
10654 void
10655 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
10657 if (TARGET_CPRESTORE_DIRECTIVE)
10659 gcc_assert (gp == pic_offset_table_rtx);
10660 emit_insn (PMODE_INSN (gen_cprestore, (mem, offset)));
10662 else
10663 mips_emit_move (mips_cprestore_slot (temp, false), gp);
10666 /* Restore $gp from its save slot, using TEMP as a temporary base register
10667 if need be. This function is for o32 and o64 abicalls only.
10669 See mips_must_initialize_gp_p for details about how we manage the
10670 global pointer. */
10672 void
10673 mips_restore_gp_from_cprestore_slot (rtx temp)
10675 gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
10677 if (!cfun->machine->must_restore_gp_when_clobbered_p)
10679 emit_note (NOTE_INSN_DELETED);
10680 return;
10683 if (TARGET_MIPS16)
10685 mips_emit_move (temp, mips_cprestore_slot (temp, true));
10686 mips_emit_move (pic_offset_table_rtx, temp);
10688 else
10689 mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
10690 if (!TARGET_EXPLICIT_RELOCS)
10691 emit_insn (gen_blockage ());
10694 /* A function to save or store a register. The first argument is the
10695 register and the second is the stack slot. */
10696 typedef void (*mips_save_restore_fn) (rtx, rtx);
10698 /* Use FN to save or restore register REGNO. MODE is the register's
10699 mode and OFFSET is the offset of its save slot from the current
10700 stack pointer. */
10702 static void
10703 mips_save_restore_reg (machine_mode mode, int regno,
10704 HOST_WIDE_INT offset, mips_save_restore_fn fn)
10706 rtx mem;
10708 mem = gen_frame_mem (mode, plus_constant (Pmode, stack_pointer_rtx,
10709 offset));
10710 fn (gen_rtx_REG (mode, regno), mem);
10713 /* Call FN for each accumlator that is saved by the current function.
10714 SP_OFFSET is the offset of the current stack pointer from the start
10715 of the frame. */
10717 static void
10718 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
10720 HOST_WIDE_INT offset;
10721 int regno;
10723 offset = cfun->machine->frame.acc_sp_offset - sp_offset;
10724 if (BITSET_P (cfun->machine->frame.acc_mask, 0))
10726 mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
10727 offset -= UNITS_PER_WORD;
10728 mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
10729 offset -= UNITS_PER_WORD;
10732 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
10733 if (BITSET_P (cfun->machine->frame.acc_mask,
10734 ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
10736 mips_save_restore_reg (word_mode, regno, offset, fn);
10737 offset -= UNITS_PER_WORD;
10741 /* Save register REG to MEM. Make the instruction frame-related. */
10743 static void
10744 mips_save_reg (rtx reg, rtx mem)
10746 if (GET_MODE (reg) == DFmode
10747 && (!TARGET_FLOAT64
10748 || mips_abi == ABI_32))
10750 rtx x1, x2;
10752 mips_emit_move_or_split (mem, reg, SPLIT_IF_NECESSARY);
10754 x1 = mips_frame_set (mips_subword (mem, false),
10755 mips_subword (reg, false));
10756 x2 = mips_frame_set (mips_subword (mem, true),
10757 mips_subword (reg, true));
10758 mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10760 else
10761 mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10764 /* Capture the register combinations that are allowed in a SWM or LWM
10765 instruction. The entries are ordered by number of registers set in
10766 the mask. We also ignore the single register encodings because a
10767 normal SW/LW is preferred. */
10769 static const unsigned int umips_swm_mask[17] = {
10770 0xc0ff0000, 0x80ff0000, 0x40ff0000, 0x807f0000,
10771 0x00ff0000, 0x803f0000, 0x007f0000, 0x801f0000,
10772 0x003f0000, 0x800f0000, 0x001f0000, 0x80070000,
10773 0x000f0000, 0x80030000, 0x00070000, 0x80010000,
10774 0x00030000
10777 static const unsigned int umips_swm_encoding[17] = {
10778 25, 24, 9, 23, 8, 22, 7, 21, 6, 20, 5, 19, 4, 18, 3, 17, 2
10781 /* Try to use a microMIPS LWM or SWM instruction to save or restore
10782 as many GPRs in *MASK as possible. *OFFSET is the offset from the
10783 stack pointer of the topmost save slot.
10785 Remove from *MASK all registers that were handled using LWM and SWM.
10786 Update *OFFSET so that it points to the first unused save slot. */
10788 static bool
10789 umips_build_save_restore (mips_save_restore_fn fn,
10790 unsigned *mask, HOST_WIDE_INT *offset)
10792 int nregs;
10793 unsigned int i, j;
10794 rtx pattern, set, reg, mem;
10795 HOST_WIDE_INT this_offset;
10796 rtx this_base;
10798 /* Try matching $16 to $31 (s0 to ra). */
10799 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
10800 if ((*mask & 0xffff0000) == umips_swm_mask[i])
10801 break;
10803 if (i == ARRAY_SIZE (umips_swm_mask))
10804 return false;
10806 /* Get the offset of the lowest save slot. */
10807 nregs = (umips_swm_encoding[i] & 0xf) + (umips_swm_encoding[i] >> 4);
10808 this_offset = *offset - UNITS_PER_WORD * (nregs - 1);
10810 /* LWM/SWM can only support offsets from -2048 to 2047. */
10811 if (!UMIPS_12BIT_OFFSET_P (this_offset))
10812 return false;
10814 /* Create the final PARALLEL. */
10815 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
10816 this_base = stack_pointer_rtx;
10818 /* For registers $16-$23 and $30. */
10819 for (j = 0; j < (umips_swm_encoding[i] & 0xf); j++)
10821 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10822 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10823 unsigned int regno = (j != 8) ? 16 + j : 30;
10824 *mask &= ~(1 << regno);
10825 reg = gen_rtx_REG (SImode, regno);
10826 if (fn == mips_save_reg)
10827 set = mips_frame_set (mem, reg);
10828 else
10830 set = gen_rtx_SET (reg, mem);
10831 mips_add_cfa_restore (reg);
10833 XVECEXP (pattern, 0, j) = set;
10836 /* For register $31. */
10837 if (umips_swm_encoding[i] >> 4)
10839 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10840 *mask &= ~(1 << 31);
10841 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10842 reg = gen_rtx_REG (SImode, 31);
10843 if (fn == mips_save_reg)
10844 set = mips_frame_set (mem, reg);
10845 else
10847 set = gen_rtx_SET (reg, mem);
10848 mips_add_cfa_restore (reg);
10850 XVECEXP (pattern, 0, j) = set;
10853 pattern = emit_insn (pattern);
10854 if (fn == mips_save_reg)
10855 RTX_FRAME_RELATED_P (pattern) = 1;
10857 /* Adjust the last offset. */
10858 *offset -= UNITS_PER_WORD * nregs;
10860 return true;
10863 /* Call FN for each register that is saved by the current function.
10864 SP_OFFSET is the offset of the current stack pointer from the start
10865 of the frame. */
10867 static void
10868 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
10869 mips_save_restore_fn fn)
10871 machine_mode fpr_mode;
10872 int regno;
10873 const struct mips_frame_info *frame = &cfun->machine->frame;
10874 HOST_WIDE_INT offset;
10875 unsigned int mask;
10877 /* Save registers starting from high to low. The debuggers prefer at least
10878 the return register be stored at func+4, and also it allows us not to
10879 need a nop in the epilogue if at least one register is reloaded in
10880 addition to return address. */
10881 offset = frame->gp_sp_offset - sp_offset;
10882 mask = frame->mask;
10884 if (TARGET_MICROMIPS)
10885 umips_build_save_restore (fn, &mask, &offset);
10887 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
10888 if (BITSET_P (mask, regno - GP_REG_FIRST))
10890 /* Record the ra offset for use by mips_function_profiler. */
10891 if (regno == RETURN_ADDR_REGNUM)
10892 cfun->machine->frame.ra_fp_offset = offset + sp_offset;
10893 mips_save_restore_reg (word_mode, regno, offset, fn);
10894 offset -= UNITS_PER_WORD;
10897 /* This loop must iterate over the same space as its companion in
10898 mips_compute_frame_info. */
10899 offset = cfun->machine->frame.fp_sp_offset - sp_offset;
10900 fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
10901 for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
10902 regno >= FP_REG_FIRST;
10903 regno -= MAX_FPRS_PER_FMT)
10904 if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
10906 if (!TARGET_FLOAT64 && TARGET_DOUBLE_FLOAT
10907 && (fixed_regs[regno] || fixed_regs[regno + 1]))
10909 if (fixed_regs[regno])
10910 mips_save_restore_reg (SFmode, regno + 1, offset, fn);
10911 else
10912 mips_save_restore_reg (SFmode, regno, offset, fn);
10914 else
10915 mips_save_restore_reg (fpr_mode, regno, offset, fn);
10916 offset -= GET_MODE_SIZE (fpr_mode);
10920 /* Return true if a move between register REGNO and its save slot (MEM)
10921 can be done in a single move. LOAD_P is true if we are loading
10922 from the slot, false if we are storing to it. */
10924 static bool
10925 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
10927 /* There is a specific MIPS16 instruction for saving $31 to the stack. */
10928 if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
10929 return false;
10931 return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
10932 GET_MODE (mem), mem, load_p) == NO_REGS;
10935 /* Emit a move from SRC to DEST, given that one of them is a register
10936 save slot and that the other is a register. TEMP is a temporary
10937 GPR of the same mode that is available if need be. */
10939 void
10940 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
10942 unsigned int regno;
10943 rtx mem;
10945 if (REG_P (src))
10947 regno = REGNO (src);
10948 mem = dest;
10950 else
10952 regno = REGNO (dest);
10953 mem = src;
10956 if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
10958 /* We don't yet know whether we'll need this instruction or not.
10959 Postpone the decision by emitting a ghost move. This move
10960 is specifically not frame-related; only the split version is. */
10961 if (TARGET_64BIT)
10962 emit_insn (gen_move_gpdi (dest, src));
10963 else
10964 emit_insn (gen_move_gpsi (dest, src));
10965 return;
10968 if (regno == HI_REGNUM)
10970 if (REG_P (dest))
10972 mips_emit_move (temp, src);
10973 if (TARGET_64BIT)
10974 emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
10975 temp, gen_rtx_REG (DImode, LO_REGNUM)));
10976 else
10977 emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
10978 temp, gen_rtx_REG (SImode, LO_REGNUM)));
10980 else
10982 if (TARGET_64BIT)
10983 emit_insn (gen_mfhidi_ti (temp,
10984 gen_rtx_REG (TImode, MD_REG_FIRST)));
10985 else
10986 emit_insn (gen_mfhisi_di (temp,
10987 gen_rtx_REG (DImode, MD_REG_FIRST)));
10988 mips_emit_move (dest, temp);
10991 else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
10992 mips_emit_move (dest, src);
10993 else
10995 gcc_assert (!reg_overlap_mentioned_p (dest, temp));
10996 mips_emit_move (temp, src);
10997 mips_emit_move (dest, temp);
10999 if (MEM_P (dest))
11000 mips_set_frame_expr (mips_frame_set (dest, src));
11003 /* If we're generating n32 or n64 abicalls, and the current function
11004 does not use $28 as its global pointer, emit a cplocal directive.
11005 Use pic_offset_table_rtx as the argument to the directive. */
11007 static void
11008 mips_output_cplocal (void)
11010 if (!TARGET_EXPLICIT_RELOCS
11011 && mips_must_initialize_gp_p ()
11012 && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
11013 output_asm_insn (".cplocal %+", 0);
11016 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE. */
11018 static void
11019 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
11021 const char *fnname;
11023 /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
11024 floating-point arguments. */
11025 if (TARGET_MIPS16
11026 && TARGET_HARD_FLOAT_ABI
11027 && crtl->args.info.fp_code != 0)
11028 mips16_build_function_stub ();
11030 /* Get the function name the same way that toplev.c does before calling
11031 assemble_start_function. This is needed so that the name used here
11032 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
11033 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
11034 mips_start_function_definition (fnname, TARGET_MIPS16);
11036 /* Output MIPS-specific frame information. */
11037 if (!flag_inhibit_size_directive)
11039 const struct mips_frame_info *frame;
11041 frame = &cfun->machine->frame;
11043 /* .frame FRAMEREG, FRAMESIZE, RETREG. */
11044 fprintf (file,
11045 "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
11046 "# vars= " HOST_WIDE_INT_PRINT_DEC
11047 ", regs= %d/%d"
11048 ", args= " HOST_WIDE_INT_PRINT_DEC
11049 ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
11050 reg_names[frame_pointer_needed
11051 ? HARD_FRAME_POINTER_REGNUM
11052 : STACK_POINTER_REGNUM],
11053 (frame_pointer_needed
11054 ? frame->total_size - frame->hard_frame_pointer_offset
11055 : frame->total_size),
11056 reg_names[RETURN_ADDR_REGNUM],
11057 frame->var_size,
11058 frame->num_gp, frame->num_fp,
11059 frame->args_size,
11060 frame->cprestore_size);
11062 /* .mask MASK, OFFSET. */
11063 fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
11064 frame->mask, frame->gp_save_offset);
11066 /* .fmask MASK, OFFSET. */
11067 fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
11068 frame->fmask, frame->fp_save_offset);
11071 /* Handle the initialization of $gp for SVR4 PIC, if applicable.
11072 Also emit the ".set noreorder; .set nomacro" sequence for functions
11073 that need it. */
11074 if (mips_must_initialize_gp_p ()
11075 && mips_current_loadgp_style () == LOADGP_OLDABI)
11077 if (TARGET_MIPS16)
11079 /* This is a fixed-form sequence. The position of the
11080 first two instructions is important because of the
11081 way _gp_disp is defined. */
11082 output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
11083 output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
11084 output_asm_insn ("sll\t$2,16", 0);
11085 output_asm_insn ("addu\t$2,$3", 0);
11087 else
11089 /* .cpload must be in a .set noreorder but not a
11090 .set nomacro block. */
11091 mips_push_asm_switch (&mips_noreorder);
11092 output_asm_insn (".cpload\t%^", 0);
11093 if (!cfun->machine->all_noreorder_p)
11094 mips_pop_asm_switch (&mips_noreorder);
11095 else
11096 mips_push_asm_switch (&mips_nomacro);
11099 else if (cfun->machine->all_noreorder_p)
11101 mips_push_asm_switch (&mips_noreorder);
11102 mips_push_asm_switch (&mips_nomacro);
11105 /* Tell the assembler which register we're using as the global
11106 pointer. This is needed for thunks, since they can use either
11107 explicit relocs or assembler macros. */
11108 mips_output_cplocal ();
11111 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE. */
11113 static void
11114 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
11115 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
11117 const char *fnname;
11119 /* Reinstate the normal $gp. */
11120 SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
11121 mips_output_cplocal ();
11123 if (cfun->machine->all_noreorder_p)
11125 mips_pop_asm_switch (&mips_nomacro);
11126 mips_pop_asm_switch (&mips_noreorder);
11129 /* Get the function name the same way that toplev.c does before calling
11130 assemble_start_function. This is needed so that the name used here
11131 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
11132 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
11133 mips_end_function_definition (fnname);
11136 /* Emit an optimisation barrier for accesses to the current frame. */
11138 static void
11139 mips_frame_barrier (void)
11141 emit_clobber (gen_frame_mem (BLKmode, stack_pointer_rtx));
11145 /* The __gnu_local_gp symbol. */
11147 static GTY(()) rtx mips_gnu_local_gp;
11149 /* If we're generating n32 or n64 abicalls, emit instructions
11150 to set up the global pointer. */
11152 static void
11153 mips_emit_loadgp (void)
11155 rtx addr, offset, incoming_address, base, index, pic_reg;
11157 pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11158 switch (mips_current_loadgp_style ())
11160 case LOADGP_ABSOLUTE:
11161 if (mips_gnu_local_gp == NULL)
11163 mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
11164 SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
11166 emit_insn (PMODE_INSN (gen_loadgp_absolute,
11167 (pic_reg, mips_gnu_local_gp)));
11168 break;
11170 case LOADGP_OLDABI:
11171 /* Added by mips_output_function_prologue. */
11172 break;
11174 case LOADGP_NEWABI:
11175 addr = XEXP (DECL_RTL (current_function_decl), 0);
11176 offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
11177 incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
11178 emit_insn (PMODE_INSN (gen_loadgp_newabi,
11179 (pic_reg, offset, incoming_address)));
11180 break;
11182 case LOADGP_RTP:
11183 base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
11184 index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
11185 emit_insn (PMODE_INSN (gen_loadgp_rtp, (pic_reg, base, index)));
11186 break;
11188 default:
11189 return;
11192 if (TARGET_MIPS16)
11193 emit_insn (PMODE_INSN (gen_copygp_mips16,
11194 (pic_offset_table_rtx, pic_reg)));
11196 /* Emit a blockage if there are implicit uses of the GP register.
11197 This includes profiled functions, because FUNCTION_PROFILE uses
11198 a jal macro. */
11199 if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
11200 emit_insn (gen_loadgp_blockage ());
11203 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
11205 #if PROBE_INTERVAL > 32768
11206 #error Cannot use indexed addressing mode for stack probing
11207 #endif
11209 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
11210 inclusive. These are offsets from the current stack pointer. */
11212 static void
11213 mips_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
11215 if (TARGET_MIPS16)
11216 sorry ("-fstack-check=specific not implemented for MIPS16");
11218 /* See if we have a constant small number of probes to generate. If so,
11219 that's the easy case. */
11220 if (first + size <= 32768)
11222 HOST_WIDE_INT i;
11224 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
11225 it exceeds SIZE. If only one probe is needed, this will not
11226 generate any code. Then probe at FIRST + SIZE. */
11227 for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
11228 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
11229 -(first + i)));
11231 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
11232 -(first + size)));
11235 /* Otherwise, do the same as above, but in a loop. Note that we must be
11236 extra careful with variables wrapping around because we might be at
11237 the very top (or the very bottom) of the address space and we have
11238 to be able to handle this case properly; in particular, we use an
11239 equality test for the loop condition. */
11240 else
11242 HOST_WIDE_INT rounded_size;
11243 rtx r3 = MIPS_PROLOGUE_TEMP (Pmode);
11244 rtx r12 = MIPS_PROLOGUE_TEMP2 (Pmode);
11246 /* Sanity check for the addressing mode we're going to use. */
11247 gcc_assert (first <= 32768);
11250 /* Step 1: round SIZE to the previous multiple of the interval. */
11252 rounded_size = size & -PROBE_INTERVAL;
11255 /* Step 2: compute initial and final value of the loop counter. */
11257 /* TEST_ADDR = SP + FIRST. */
11258 emit_insn (gen_rtx_SET (r3, plus_constant (Pmode, stack_pointer_rtx,
11259 -first)));
11261 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
11262 if (rounded_size > 32768)
11264 emit_move_insn (r12, GEN_INT (rounded_size));
11265 emit_insn (gen_rtx_SET (r12, gen_rtx_MINUS (Pmode, r3, r12)));
11267 else
11268 emit_insn (gen_rtx_SET (r12, plus_constant (Pmode, r3,
11269 -rounded_size)));
11272 /* Step 3: the loop
11274 while (TEST_ADDR != LAST_ADDR)
11276 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
11277 probe at TEST_ADDR
11280 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
11281 until it is equal to ROUNDED_SIZE. */
11283 emit_insn (PMODE_INSN (gen_probe_stack_range, (r3, r3, r12)));
11286 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
11287 that SIZE is equal to ROUNDED_SIZE. */
11289 if (size != rounded_size)
11290 emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
11293 /* Make sure nothing is scheduled before we are done. */
11294 emit_insn (gen_blockage ());
11297 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
11298 absolute addresses. */
11300 const char *
11301 mips_output_probe_stack_range (rtx reg1, rtx reg2)
11303 static int labelno = 0;
11304 char loop_lab[32], end_lab[32], tmp[64];
11305 rtx xops[2];
11307 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
11308 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
11310 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
11312 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
11313 xops[0] = reg1;
11314 xops[1] = reg2;
11315 strcpy (tmp, "%(%<beq\t%0,%1,");
11316 output_asm_insn (strcat (tmp, &end_lab[1]), xops);
11318 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
11319 xops[1] = GEN_INT (-PROBE_INTERVAL);
11320 if (TARGET_64BIT && TARGET_LONG64)
11321 output_asm_insn ("daddiu\t%0,%0,%1", xops);
11322 else
11323 output_asm_insn ("addiu\t%0,%0,%1", xops);
11325 /* Probe at TEST_ADDR and branch. */
11326 fprintf (asm_out_file, "\tb\t");
11327 assemble_name_raw (asm_out_file, loop_lab);
11328 fputc ('\n', asm_out_file);
11329 if (TARGET_64BIT)
11330 output_asm_insn ("sd\t$0,0(%0)%)", xops);
11331 else
11332 output_asm_insn ("sw\t$0,0(%0)%)", xops);
11334 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
11336 return "";
11339 /* Return true if X contains a kernel register. */
11341 static bool
11342 mips_refers_to_kernel_reg_p (const_rtx x)
11344 subrtx_iterator::array_type array;
11345 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
11346 if (REG_P (*iter) && KERNEL_REG_P (REGNO (*iter)))
11347 return true;
11348 return false;
11351 /* Expand the "prologue" pattern. */
11353 void
11354 mips_expand_prologue (void)
11356 const struct mips_frame_info *frame;
11357 HOST_WIDE_INT size;
11358 unsigned int nargs;
11360 if (cfun->machine->global_pointer != INVALID_REGNUM)
11362 /* Check whether an insn uses pic_offset_table_rtx, either explicitly
11363 or implicitly. If so, we can commit to using a global pointer
11364 straight away, otherwise we need to defer the decision. */
11365 if (mips_cfun_has_inflexible_gp_ref_p ()
11366 || mips_cfun_has_flexible_gp_ref_p ())
11368 cfun->machine->must_initialize_gp_p = true;
11369 cfun->machine->must_restore_gp_when_clobbered_p = true;
11372 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
11375 frame = &cfun->machine->frame;
11376 size = frame->total_size;
11378 if (flag_stack_usage_info)
11379 current_function_static_stack_size = size;
11381 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
11383 if (crtl->is_leaf && !cfun->calls_alloca)
11385 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
11386 mips_emit_probe_stack_range (STACK_CHECK_PROTECT,
11387 size - STACK_CHECK_PROTECT);
11389 else if (size > 0)
11390 mips_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
11393 /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
11394 bytes beforehand; this is enough to cover the register save area
11395 without going out of range. */
11396 if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
11397 || frame->num_cop0_regs > 0)
11399 HOST_WIDE_INT step1;
11401 step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
11402 if (GENERATE_MIPS16E_SAVE_RESTORE)
11404 HOST_WIDE_INT offset;
11405 unsigned int mask, regno;
11407 /* Try to merge argument stores into the save instruction. */
11408 nargs = mips16e_collect_argument_saves ();
11410 /* Build the save instruction. */
11411 mask = frame->mask;
11412 rtx insn = mips16e_build_save_restore (false, &mask, &offset,
11413 nargs, step1);
11414 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11415 mips_frame_barrier ();
11416 size -= step1;
11418 /* Check if we need to save other registers. */
11419 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11420 if (BITSET_P (mask, regno - GP_REG_FIRST))
11422 offset -= UNITS_PER_WORD;
11423 mips_save_restore_reg (word_mode, regno,
11424 offset, mips_save_reg);
11427 else
11429 if (cfun->machine->interrupt_handler_p)
11431 HOST_WIDE_INT offset;
11432 rtx mem;
11434 /* If this interrupt is using a shadow register set, we need to
11435 get the stack pointer from the previous register set. */
11436 if (cfun->machine->use_shadow_register_set_p)
11437 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
11438 stack_pointer_rtx));
11440 if (!cfun->machine->keep_interrupts_masked_p)
11442 /* Move from COP0 Cause to K0. */
11443 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
11444 gen_rtx_REG (SImode,
11445 COP0_CAUSE_REG_NUM)));
11446 /* Move from COP0 EPC to K1. */
11447 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11448 gen_rtx_REG (SImode,
11449 COP0_EPC_REG_NUM)));
11452 /* Allocate the first part of the frame. */
11453 rtx insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
11454 GEN_INT (-step1));
11455 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11456 mips_frame_barrier ();
11457 size -= step1;
11459 /* Start at the uppermost location for saving. */
11460 offset = frame->cop0_sp_offset - size;
11461 if (!cfun->machine->keep_interrupts_masked_p)
11463 /* Push EPC into its stack slot. */
11464 mem = gen_frame_mem (word_mode,
11465 plus_constant (Pmode, stack_pointer_rtx,
11466 offset));
11467 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11468 offset -= UNITS_PER_WORD;
11471 /* Move from COP0 Status to K1. */
11472 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11473 gen_rtx_REG (SImode,
11474 COP0_STATUS_REG_NUM)));
11476 /* Right justify the RIPL in k0. */
11477 if (!cfun->machine->keep_interrupts_masked_p)
11478 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
11479 gen_rtx_REG (SImode, K0_REG_NUM),
11480 GEN_INT (CAUSE_IPL)));
11482 /* Push Status into its stack slot. */
11483 mem = gen_frame_mem (word_mode,
11484 plus_constant (Pmode, stack_pointer_rtx,
11485 offset));
11486 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11487 offset -= UNITS_PER_WORD;
11489 /* Insert the RIPL into our copy of SR (k1) as the new IPL. */
11490 if (!cfun->machine->keep_interrupts_masked_p)
11491 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11492 GEN_INT (6),
11493 GEN_INT (SR_IPL),
11494 gen_rtx_REG (SImode, K0_REG_NUM)));
11496 if (!cfun->machine->keep_interrupts_masked_p)
11497 /* Enable interrupts by clearing the KSU ERL and EXL bits.
11498 IE is already the correct value, so we don't have to do
11499 anything explicit. */
11500 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11501 GEN_INT (4),
11502 GEN_INT (SR_EXL),
11503 gen_rtx_REG (SImode, GP_REG_FIRST)));
11504 else
11505 /* Disable interrupts by clearing the KSU, ERL, EXL,
11506 and IE bits. */
11507 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11508 GEN_INT (5),
11509 GEN_INT (SR_IE),
11510 gen_rtx_REG (SImode, GP_REG_FIRST)));
11512 else
11514 rtx insn = gen_add3_insn (stack_pointer_rtx,
11515 stack_pointer_rtx,
11516 GEN_INT (-step1));
11517 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11518 mips_frame_barrier ();
11519 size -= step1;
11521 mips_for_each_saved_acc (size, mips_save_reg);
11522 mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
11526 /* Allocate the rest of the frame. */
11527 if (size > 0)
11529 if (SMALL_OPERAND (-size))
11530 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
11531 stack_pointer_rtx,
11532 GEN_INT (-size)))) = 1;
11533 else
11535 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
11536 if (TARGET_MIPS16)
11538 /* There are no instructions to add or subtract registers
11539 from the stack pointer, so use the frame pointer as a
11540 temporary. We should always be using a frame pointer
11541 in this case anyway. */
11542 gcc_assert (frame_pointer_needed);
11543 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11544 emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
11545 hard_frame_pointer_rtx,
11546 MIPS_PROLOGUE_TEMP (Pmode)));
11547 mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
11549 else
11550 emit_insn (gen_sub3_insn (stack_pointer_rtx,
11551 stack_pointer_rtx,
11552 MIPS_PROLOGUE_TEMP (Pmode)));
11554 /* Describe the combined effect of the previous instructions. */
11555 mips_set_frame_expr
11556 (gen_rtx_SET (stack_pointer_rtx,
11557 plus_constant (Pmode, stack_pointer_rtx, -size)));
11559 mips_frame_barrier ();
11562 /* Set up the frame pointer, if we're using one. */
11563 if (frame_pointer_needed)
11565 HOST_WIDE_INT offset;
11567 offset = frame->hard_frame_pointer_offset;
11568 if (offset == 0)
11570 rtx insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11571 RTX_FRAME_RELATED_P (insn) = 1;
11573 else if (SMALL_OPERAND (offset))
11575 rtx insn = gen_add3_insn (hard_frame_pointer_rtx,
11576 stack_pointer_rtx, GEN_INT (offset));
11577 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11579 else
11581 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
11582 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11583 emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
11584 hard_frame_pointer_rtx,
11585 MIPS_PROLOGUE_TEMP (Pmode)));
11586 mips_set_frame_expr
11587 (gen_rtx_SET (hard_frame_pointer_rtx,
11588 plus_constant (Pmode, stack_pointer_rtx, offset)));
11592 mips_emit_loadgp ();
11594 /* Initialize the $gp save slot. */
11595 if (mips_cfun_has_cprestore_slot_p ())
11597 rtx base, mem, gp, temp;
11598 HOST_WIDE_INT offset;
11600 mips_get_cprestore_base_and_offset (&base, &offset, false);
11601 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11602 gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11603 temp = (SMALL_OPERAND (offset)
11604 ? gen_rtx_SCRATCH (Pmode)
11605 : MIPS_PROLOGUE_TEMP (Pmode));
11606 emit_insn (PMODE_INSN (gen_potential_cprestore,
11607 (mem, GEN_INT (offset), gp, temp)));
11609 mips_get_cprestore_base_and_offset (&base, &offset, true);
11610 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11611 emit_insn (PMODE_INSN (gen_use_cprestore, (mem)));
11614 /* We need to search back to the last use of K0 or K1. */
11615 if (cfun->machine->interrupt_handler_p)
11617 rtx_insn *insn;
11618 for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
11619 if (INSN_P (insn)
11620 && mips_refers_to_kernel_reg_p (PATTERN (insn)))
11621 break;
11622 /* Emit a move from K1 to COP0 Status after insn. */
11623 gcc_assert (insn != NULL_RTX);
11624 emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11625 gen_rtx_REG (SImode, K1_REG_NUM)),
11626 insn);
11629 /* If we are profiling, make sure no instructions are scheduled before
11630 the call to mcount. */
11631 if (crtl->profile)
11632 emit_insn (gen_blockage ());
11635 /* Attach all pending register saves to the previous instruction.
11636 Return that instruction. */
11638 static rtx_insn *
11639 mips_epilogue_emit_cfa_restores (void)
11641 rtx_insn *insn;
11643 insn = get_last_insn ();
11644 gcc_assert (insn && !REG_NOTES (insn));
11645 if (mips_epilogue.cfa_restores)
11647 RTX_FRAME_RELATED_P (insn) = 1;
11648 REG_NOTES (insn) = mips_epilogue.cfa_restores;
11649 mips_epilogue.cfa_restores = 0;
11651 return insn;
11654 /* Like mips_epilogue_emit_cfa_restores, but also record that the CFA is
11655 now at REG + OFFSET. */
11657 static void
11658 mips_epilogue_set_cfa (rtx reg, HOST_WIDE_INT offset)
11660 rtx_insn *insn;
11662 insn = mips_epilogue_emit_cfa_restores ();
11663 if (reg != mips_epilogue.cfa_reg || offset != mips_epilogue.cfa_offset)
11665 RTX_FRAME_RELATED_P (insn) = 1;
11666 REG_NOTES (insn) = alloc_reg_note (REG_CFA_DEF_CFA,
11667 plus_constant (Pmode, reg, offset),
11668 REG_NOTES (insn));
11669 mips_epilogue.cfa_reg = reg;
11670 mips_epilogue.cfa_offset = offset;
11674 /* Emit instructions to restore register REG from slot MEM. Also update
11675 the cfa_restores list. */
11677 static void
11678 mips_restore_reg (rtx reg, rtx mem)
11680 /* There's no MIPS16 instruction to load $31 directly. Load into
11681 $7 instead and adjust the return insn appropriately. */
11682 if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
11683 reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
11684 else if (GET_MODE (reg) == DFmode
11685 && (!TARGET_FLOAT64
11686 || mips_abi == ABI_32))
11688 mips_add_cfa_restore (mips_subword (reg, true));
11689 mips_add_cfa_restore (mips_subword (reg, false));
11691 else
11692 mips_add_cfa_restore (reg);
11694 mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
11695 if (REGNO (reg) == REGNO (mips_epilogue.cfa_reg))
11696 /* The CFA is currently defined in terms of the register whose
11697 value we have just restored. Redefine the CFA in terms of
11698 the stack pointer. */
11699 mips_epilogue_set_cfa (stack_pointer_rtx,
11700 mips_epilogue.cfa_restore_sp_offset);
11703 /* Emit code to set the stack pointer to BASE + OFFSET, given that
11704 BASE + OFFSET is NEW_FRAME_SIZE bytes below the top of the frame.
11705 BASE, if not the stack pointer, is available as a temporary. */
11707 static void
11708 mips_deallocate_stack (rtx base, rtx offset, HOST_WIDE_INT new_frame_size)
11710 if (base == stack_pointer_rtx && offset == const0_rtx)
11711 return;
11713 mips_frame_barrier ();
11714 if (offset == const0_rtx)
11716 emit_move_insn (stack_pointer_rtx, base);
11717 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11719 else if (TARGET_MIPS16 && base != stack_pointer_rtx)
11721 emit_insn (gen_add3_insn (base, base, offset));
11722 mips_epilogue_set_cfa (base, new_frame_size);
11723 emit_move_insn (stack_pointer_rtx, base);
11725 else
11727 emit_insn (gen_add3_insn (stack_pointer_rtx, base, offset));
11728 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11732 /* Emit any instructions needed before a return. */
11734 void
11735 mips_expand_before_return (void)
11737 /* When using a call-clobbered gp, we start out with unified call
11738 insns that include instructions to restore the gp. We then split
11739 these unified calls after reload. These split calls explicitly
11740 clobber gp, so there is no need to define
11741 PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
11743 For consistency, we should also insert an explicit clobber of $28
11744 before return insns, so that the post-reload optimizers know that
11745 the register is not live on exit. */
11746 if (TARGET_CALL_CLOBBERED_GP)
11747 emit_clobber (pic_offset_table_rtx);
11750 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
11751 says which. */
11753 void
11754 mips_expand_epilogue (bool sibcall_p)
11756 const struct mips_frame_info *frame;
11757 HOST_WIDE_INT step1, step2;
11758 rtx base, adjust;
11759 rtx_insn *insn;
11760 bool use_jraddiusp_p = false;
11762 if (!sibcall_p && mips_can_use_return_insn ())
11764 emit_jump_insn (gen_return ());
11765 return;
11768 /* In MIPS16 mode, if the return value should go into a floating-point
11769 register, we need to call a helper routine to copy it over. */
11770 if (mips16_cfun_returns_in_fpr_p ())
11771 mips16_copy_fpr_return_value ();
11773 /* Split the frame into two. STEP1 is the amount of stack we should
11774 deallocate before restoring the registers. STEP2 is the amount we
11775 should deallocate afterwards.
11777 Start off by assuming that no registers need to be restored. */
11778 frame = &cfun->machine->frame;
11779 step1 = frame->total_size;
11780 step2 = 0;
11782 /* Work out which register holds the frame address. */
11783 if (!frame_pointer_needed)
11784 base = stack_pointer_rtx;
11785 else
11787 base = hard_frame_pointer_rtx;
11788 step1 -= frame->hard_frame_pointer_offset;
11790 mips_epilogue.cfa_reg = base;
11791 mips_epilogue.cfa_offset = step1;
11792 mips_epilogue.cfa_restores = NULL_RTX;
11794 /* If we need to restore registers, deallocate as much stack as
11795 possible in the second step without going out of range. */
11796 if ((frame->mask | frame->fmask | frame->acc_mask) != 0
11797 || frame->num_cop0_regs > 0)
11799 step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
11800 step1 -= step2;
11803 /* Get an rtx for STEP1 that we can add to BASE. */
11804 adjust = GEN_INT (step1);
11805 if (!SMALL_OPERAND (step1))
11807 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
11808 adjust = MIPS_EPILOGUE_TEMP (Pmode);
11810 mips_deallocate_stack (base, adjust, step2);
11812 /* If we're using addressing macros, $gp is implicitly used by all
11813 SYMBOL_REFs. We must emit a blockage insn before restoring $gp
11814 from the stack. */
11815 if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
11816 emit_insn (gen_blockage ());
11818 mips_epilogue.cfa_restore_sp_offset = step2;
11819 if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
11821 unsigned int regno, mask;
11822 HOST_WIDE_INT offset;
11823 rtx restore;
11825 /* Generate the restore instruction. */
11826 mask = frame->mask;
11827 restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
11829 /* Restore any other registers manually. */
11830 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11831 if (BITSET_P (mask, regno - GP_REG_FIRST))
11833 offset -= UNITS_PER_WORD;
11834 mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
11837 /* Restore the remaining registers and deallocate the final bit
11838 of the frame. */
11839 mips_frame_barrier ();
11840 emit_insn (restore);
11841 mips_epilogue_set_cfa (stack_pointer_rtx, 0);
11843 else
11845 /* Restore the registers. */
11846 mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
11847 mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
11848 mips_restore_reg);
11850 if (cfun->machine->interrupt_handler_p)
11852 HOST_WIDE_INT offset;
11853 rtx mem;
11855 offset = frame->cop0_sp_offset - (frame->total_size - step2);
11856 if (!cfun->machine->keep_interrupts_masked_p)
11858 /* Restore the original EPC. */
11859 mem = gen_frame_mem (word_mode,
11860 plus_constant (Pmode, stack_pointer_rtx,
11861 offset));
11862 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11863 offset -= UNITS_PER_WORD;
11865 /* Move to COP0 EPC. */
11866 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
11867 gen_rtx_REG (SImode, K0_REG_NUM)));
11870 /* Restore the original Status. */
11871 mem = gen_frame_mem (word_mode,
11872 plus_constant (Pmode, stack_pointer_rtx,
11873 offset));
11874 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11875 offset -= UNITS_PER_WORD;
11877 /* If we don't use shadow register set, we need to update SP. */
11878 if (!cfun->machine->use_shadow_register_set_p)
11879 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11880 else
11881 /* The choice of position is somewhat arbitrary in this case. */
11882 mips_epilogue_emit_cfa_restores ();
11884 /* Move to COP0 Status. */
11885 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11886 gen_rtx_REG (SImode, K0_REG_NUM)));
11888 else if (TARGET_MICROMIPS
11889 && !crtl->calls_eh_return
11890 && !sibcall_p
11891 && step2 > 0
11892 && mips_unsigned_immediate_p (step2, 5, 2))
11893 use_jraddiusp_p = true;
11894 else
11895 /* Deallocate the final bit of the frame. */
11896 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11899 if (!use_jraddiusp_p)
11900 gcc_assert (!mips_epilogue.cfa_restores);
11902 /* Add in the __builtin_eh_return stack adjustment. We need to
11903 use a temporary in MIPS16 code. */
11904 if (crtl->calls_eh_return)
11906 if (TARGET_MIPS16)
11908 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
11909 emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
11910 MIPS_EPILOGUE_TEMP (Pmode),
11911 EH_RETURN_STACKADJ_RTX));
11912 mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
11914 else
11915 emit_insn (gen_add3_insn (stack_pointer_rtx,
11916 stack_pointer_rtx,
11917 EH_RETURN_STACKADJ_RTX));
11920 if (!sibcall_p)
11922 mips_expand_before_return ();
11923 if (cfun->machine->interrupt_handler_p)
11925 /* Interrupt handlers generate eret or deret. */
11926 if (cfun->machine->use_debug_exception_return_p)
11927 emit_jump_insn (gen_mips_deret ());
11928 else
11929 emit_jump_insn (gen_mips_eret ());
11931 else
11933 rtx pat;
11935 /* When generating MIPS16 code, the normal
11936 mips_for_each_saved_gpr_and_fpr path will restore the return
11937 address into $7 rather than $31. */
11938 if (TARGET_MIPS16
11939 && !GENERATE_MIPS16E_SAVE_RESTORE
11940 && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
11942 /* simple_returns cannot rely on values that are only available
11943 on paths through the epilogue (because return paths that do
11944 not pass through the epilogue may nevertheless reuse a
11945 simple_return that occurs at the end of the epilogue).
11946 Use a normal return here instead. */
11947 rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
11948 pat = gen_return_internal (reg);
11950 else if (use_jraddiusp_p)
11951 pat = gen_jraddiusp (GEN_INT (step2));
11952 else
11954 rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
11955 pat = gen_simple_return_internal (reg);
11957 emit_jump_insn (pat);
11958 if (use_jraddiusp_p)
11959 mips_epilogue_set_cfa (stack_pointer_rtx, step2);
11963 /* Search from the beginning to the first use of K0 or K1. */
11964 if (cfun->machine->interrupt_handler_p
11965 && !cfun->machine->keep_interrupts_masked_p)
11967 for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
11968 if (INSN_P (insn)
11969 && mips_refers_to_kernel_reg_p (PATTERN (insn)))
11970 break;
11971 gcc_assert (insn != NULL_RTX);
11972 /* Insert disable interrupts before the first use of K0 or K1. */
11973 emit_insn_before (gen_mips_di (), insn);
11974 emit_insn_before (gen_mips_ehb (), insn);
11978 /* Return nonzero if this function is known to have a null epilogue.
11979 This allows the optimizer to omit jumps to jumps if no stack
11980 was created. */
11982 bool
11983 mips_can_use_return_insn (void)
11985 /* Interrupt handlers need to go through the epilogue. */
11986 if (cfun->machine->interrupt_handler_p)
11987 return false;
11989 if (!reload_completed)
11990 return false;
11992 if (crtl->profile)
11993 return false;
11995 /* In MIPS16 mode, a function that returns a floating-point value
11996 needs to arrange to copy the return value into the floating-point
11997 registers. */
11998 if (mips16_cfun_returns_in_fpr_p ())
11999 return false;
12001 return cfun->machine->frame.total_size == 0;
12004 /* Return true if register REGNO can store a value of mode MODE.
12005 The result of this function is cached in mips_hard_regno_mode_ok. */
12007 static bool
12008 mips_hard_regno_mode_ok_p (unsigned int regno, machine_mode mode)
12010 unsigned int size;
12011 enum mode_class mclass;
12013 if (mode == CCV2mode)
12014 return (ISA_HAS_8CC
12015 && ST_REG_P (regno)
12016 && (regno - ST_REG_FIRST) % 2 == 0);
12018 if (mode == CCV4mode)
12019 return (ISA_HAS_8CC
12020 && ST_REG_P (regno)
12021 && (regno - ST_REG_FIRST) % 4 == 0);
12023 if (mode == CCmode)
12024 return ISA_HAS_8CC ? ST_REG_P (regno) : regno == FPSW_REGNUM;
12026 size = GET_MODE_SIZE (mode);
12027 mclass = GET_MODE_CLASS (mode);
12029 if (GP_REG_P (regno) && mode != CCFmode)
12030 return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
12032 if (FP_REG_P (regno)
12033 && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
12034 || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
12036 /* Deny use of odd-numbered registers for 32-bit data for
12037 the o32 FP64A ABI. */
12038 if (TARGET_O32_FP64A_ABI && size <= 4 && (regno & 1) != 0)
12039 return false;
12041 /* The FPXX ABI requires double-precision values to be placed in
12042 even-numbered registers. Disallow odd-numbered registers with
12043 CCFmode because CCFmode double-precision compares will write a
12044 64-bit value to a register. */
12045 if (mode == CCFmode)
12046 return !(TARGET_FLOATXX && (regno & 1) != 0);
12048 /* Allow 64-bit vector modes for Loongson-2E/2F. */
12049 if (TARGET_LOONGSON_VECTORS
12050 && (mode == V2SImode
12051 || mode == V4HImode
12052 || mode == V8QImode
12053 || mode == DImode))
12054 return true;
12056 if (mclass == MODE_FLOAT
12057 || mclass == MODE_COMPLEX_FLOAT
12058 || mclass == MODE_VECTOR_FLOAT)
12059 return size <= UNITS_PER_FPVALUE;
12061 /* Allow integer modes that fit into a single register. We need
12062 to put integers into FPRs when using instructions like CVT
12063 and TRUNC. There's no point allowing sizes smaller than a word,
12064 because the FPU has no appropriate load/store instructions. */
12065 if (mclass == MODE_INT)
12066 return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
12069 /* Don't allow vector modes in accumulators. */
12070 if (ACC_REG_P (regno)
12071 && !VECTOR_MODE_P (mode)
12072 && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
12074 if (MD_REG_P (regno))
12076 /* After a multiplication or division, clobbering HI makes
12077 the value of LO unpredictable, and vice versa. This means
12078 that, for all interesting cases, HI and LO are effectively
12079 a single register.
12081 We model this by requiring that any value that uses HI
12082 also uses LO. */
12083 if (size <= UNITS_PER_WORD * 2)
12084 return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
12086 else
12088 /* DSP accumulators do not have the same restrictions as
12089 HI and LO, so we can treat them as normal doubleword
12090 registers. */
12091 if (size <= UNITS_PER_WORD)
12092 return true;
12094 if (size <= UNITS_PER_WORD * 2
12095 && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
12096 return true;
12100 if (ALL_COP_REG_P (regno))
12101 return mclass == MODE_INT && size <= UNITS_PER_WORD;
12103 if (regno == GOT_VERSION_REGNUM)
12104 return mode == SImode;
12106 return false;
12109 /* Implement HARD_REGNO_NREGS. */
12111 unsigned int
12112 mips_hard_regno_nregs (int regno, machine_mode mode)
12114 if (ST_REG_P (regno))
12115 /* The size of FP status registers is always 4, because they only hold
12116 CCmode values, and CCmode is always considered to be 4 bytes wide. */
12117 return (GET_MODE_SIZE (mode) + 3) / 4;
12119 if (FP_REG_P (regno))
12120 return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
12122 /* All other registers are word-sized. */
12123 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
12126 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
12127 in mips_hard_regno_nregs. */
12130 mips_class_max_nregs (enum reg_class rclass, machine_mode mode)
12132 int size;
12133 HARD_REG_SET left;
12135 size = 0x8000;
12136 COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
12137 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
12139 if (HARD_REGNO_MODE_OK (ST_REG_FIRST, mode))
12140 size = MIN (size, 4);
12141 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
12143 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
12145 if (HARD_REGNO_MODE_OK (FP_REG_FIRST, mode))
12146 size = MIN (size, UNITS_PER_FPREG);
12147 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
12149 if (!hard_reg_set_empty_p (left))
12150 size = MIN (size, UNITS_PER_WORD);
12151 return (GET_MODE_SIZE (mode) + size - 1) / size;
12154 /* Implement CANNOT_CHANGE_MODE_CLASS. */
12156 bool
12157 mips_cannot_change_mode_class (machine_mode from,
12158 machine_mode to,
12159 enum reg_class rclass)
12161 /* Allow conversions between different Loongson integer vectors,
12162 and between those vectors and DImode. */
12163 if (GET_MODE_SIZE (from) == 8 && GET_MODE_SIZE (to) == 8
12164 && INTEGRAL_MODE_P (from) && INTEGRAL_MODE_P (to))
12165 return false;
12167 /* Otherwise, there are several problems with changing the modes of
12168 values in floating-point registers:
12170 - When a multi-word value is stored in paired floating-point
12171 registers, the first register always holds the low word. We
12172 therefore can't allow FPRs to change between single-word and
12173 multi-word modes on big-endian targets.
12175 - GCC assumes that each word of a multiword register can be
12176 accessed individually using SUBREGs. This is not true for
12177 floating-point registers if they are bigger than a word.
12179 - Loading a 32-bit value into a 64-bit floating-point register
12180 will not sign-extend the value, despite what LOAD_EXTEND_OP
12181 says. We can't allow FPRs to change from SImode to a wider
12182 mode on 64-bit targets.
12184 - If the FPU has already interpreted a value in one format, we
12185 must not ask it to treat the value as having a different
12186 format.
12188 We therefore disallow all mode changes involving FPRs. */
12190 return reg_classes_intersect_p (FP_REGS, rclass);
12193 /* Implement target hook small_register_classes_for_mode_p. */
12195 static bool
12196 mips_small_register_classes_for_mode_p (machine_mode mode
12197 ATTRIBUTE_UNUSED)
12199 return TARGET_MIPS16;
12202 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction. */
12204 static bool
12205 mips_mode_ok_for_mov_fmt_p (machine_mode mode)
12207 switch (mode)
12209 case CCFmode:
12210 case SFmode:
12211 return TARGET_HARD_FLOAT;
12213 case DFmode:
12214 return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
12216 case V2SFmode:
12217 return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
12219 default:
12220 return false;
12224 /* Implement MODES_TIEABLE_P. */
12226 bool
12227 mips_modes_tieable_p (machine_mode mode1, machine_mode mode2)
12229 /* FPRs allow no mode punning, so it's not worth tying modes if we'd
12230 prefer to put one of them in FPRs. */
12231 return (mode1 == mode2
12232 || (!mips_mode_ok_for_mov_fmt_p (mode1)
12233 && !mips_mode_ok_for_mov_fmt_p (mode2)));
12236 /* Implement TARGET_PREFERRED_RELOAD_CLASS. */
12238 static reg_class_t
12239 mips_preferred_reload_class (rtx x, reg_class_t rclass)
12241 if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
12242 return LEA_REGS;
12244 if (reg_class_subset_p (FP_REGS, rclass)
12245 && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
12246 return FP_REGS;
12248 if (reg_class_subset_p (GR_REGS, rclass))
12249 rclass = GR_REGS;
12251 if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
12252 rclass = M16_REGS;
12254 return rclass;
12257 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
12258 Return a "canonical" class to represent it in later calculations. */
12260 static reg_class_t
12261 mips_canonicalize_move_class (reg_class_t rclass)
12263 /* All moves involving accumulator registers have the same cost. */
12264 if (reg_class_subset_p (rclass, ACC_REGS))
12265 rclass = ACC_REGS;
12267 /* Likewise promote subclasses of general registers to the most
12268 interesting containing class. */
12269 if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
12270 rclass = M16_REGS;
12271 else if (reg_class_subset_p (rclass, GENERAL_REGS))
12272 rclass = GENERAL_REGS;
12274 return rclass;
12277 /* Return the cost of moving a value from a register of class FROM to a GPR.
12278 Return 0 for classes that are unions of other classes handled by this
12279 function. */
12281 static int
12282 mips_move_to_gpr_cost (reg_class_t from)
12284 switch (from)
12286 case M16_REGS:
12287 case GENERAL_REGS:
12288 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
12289 return 2;
12291 case ACC_REGS:
12292 /* MFLO and MFHI. */
12293 return 6;
12295 case FP_REGS:
12296 /* MFC1, etc. */
12297 return 4;
12299 case COP0_REGS:
12300 case COP2_REGS:
12301 case COP3_REGS:
12302 /* This choice of value is historical. */
12303 return 5;
12305 default:
12306 return 0;
12310 /* Return the cost of moving a value from a GPR to a register of class TO.
12311 Return 0 for classes that are unions of other classes handled by this
12312 function. */
12314 static int
12315 mips_move_from_gpr_cost (reg_class_t to)
12317 switch (to)
12319 case M16_REGS:
12320 case GENERAL_REGS:
12321 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
12322 return 2;
12324 case ACC_REGS:
12325 /* MTLO and MTHI. */
12326 return 6;
12328 case FP_REGS:
12329 /* MTC1, etc. */
12330 return 4;
12332 case COP0_REGS:
12333 case COP2_REGS:
12334 case COP3_REGS:
12335 /* This choice of value is historical. */
12336 return 5;
12338 default:
12339 return 0;
12343 /* Implement TARGET_REGISTER_MOVE_COST. Return 0 for classes that are the
12344 maximum of the move costs for subclasses; regclass will work out
12345 the maximum for us. */
12347 static int
12348 mips_register_move_cost (machine_mode mode,
12349 reg_class_t from, reg_class_t to)
12351 reg_class_t dregs;
12352 int cost1, cost2;
12354 from = mips_canonicalize_move_class (from);
12355 to = mips_canonicalize_move_class (to);
12357 /* Handle moves that can be done without using general-purpose registers. */
12358 if (from == FP_REGS)
12360 if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
12361 /* MOV.FMT. */
12362 return 4;
12365 /* Handle cases in which only one class deviates from the ideal. */
12366 dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
12367 if (from == dregs)
12368 return mips_move_from_gpr_cost (to);
12369 if (to == dregs)
12370 return mips_move_to_gpr_cost (from);
12372 /* Handles cases that require a GPR temporary. */
12373 cost1 = mips_move_to_gpr_cost (from);
12374 if (cost1 != 0)
12376 cost2 = mips_move_from_gpr_cost (to);
12377 if (cost2 != 0)
12378 return cost1 + cost2;
12381 return 0;
12384 /* Implement TARGET_REGISTER_PRIORITY. */
12386 static int
12387 mips_register_priority (int hard_regno)
12389 /* Treat MIPS16 registers with higher priority than other regs. */
12390 if (TARGET_MIPS16
12391 && TEST_HARD_REG_BIT (reg_class_contents[M16_REGS], hard_regno))
12392 return 1;
12393 return 0;
12396 /* Implement TARGET_MEMORY_MOVE_COST. */
12398 static int
12399 mips_memory_move_cost (machine_mode mode, reg_class_t rclass, bool in)
12401 return (mips_cost->memory_latency
12402 + memory_move_secondary_cost (mode, rclass, in));
12405 /* Implement SECONDARY_MEMORY_NEEDED. */
12407 bool
12408 mips_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
12409 machine_mode mode)
12411 /* Ignore spilled pseudos. */
12412 if (lra_in_progress && (class1 == NO_REGS || class2 == NO_REGS))
12413 return false;
12415 if (((class1 == FP_REGS) != (class2 == FP_REGS))
12416 && ((TARGET_FLOATXX && !ISA_HAS_MXHC1)
12417 || TARGET_O32_FP64A_ABI)
12418 && GET_MODE_SIZE (mode) >= 8)
12419 return true;
12421 return false;
12424 /* Return the register class required for a secondary register when
12425 copying between one of the registers in RCLASS and value X, which
12426 has mode MODE. X is the source of the move if IN_P, otherwise it
12427 is the destination. Return NO_REGS if no secondary register is
12428 needed. */
12430 enum reg_class
12431 mips_secondary_reload_class (enum reg_class rclass,
12432 machine_mode mode, rtx x, bool)
12434 int regno;
12436 /* If X is a constant that cannot be loaded into $25, it must be loaded
12437 into some other GPR. No other register class allows a direct move. */
12438 if (mips_dangerous_for_la25_p (x))
12439 return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
12441 regno = true_regnum (x);
12442 if (TARGET_MIPS16)
12444 /* In MIPS16 mode, every move must involve a member of M16_REGS. */
12445 if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
12446 return M16_REGS;
12448 return NO_REGS;
12451 /* Copying from accumulator registers to anywhere other than a general
12452 register requires a temporary general register. */
12453 if (reg_class_subset_p (rclass, ACC_REGS))
12454 return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12455 if (ACC_REG_P (regno))
12456 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12458 if (reg_class_subset_p (rclass, FP_REGS))
12460 if (regno < 0
12461 || (MEM_P (x)
12462 && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8)))
12463 /* In this case we can use lwc1, swc1, ldc1 or sdc1. We'll use
12464 pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported. */
12465 return NO_REGS;
12467 if (GP_REG_P (regno) || x == CONST0_RTX (mode))
12468 /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
12469 return NO_REGS;
12471 if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (mode, x))
12472 /* We can force the constant to memory and use lwc1
12473 and ldc1. As above, we will use pairs of lwc1s if
12474 ldc1 is not supported. */
12475 return NO_REGS;
12477 if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
12478 /* In this case we can use mov.fmt. */
12479 return NO_REGS;
12481 /* Otherwise, we need to reload through an integer register. */
12482 return GR_REGS;
12484 if (FP_REG_P (regno))
12485 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12487 return NO_REGS;
12490 /* Implement TARGET_MODE_REP_EXTENDED. */
12492 static int
12493 mips_mode_rep_extended (machine_mode mode, machine_mode mode_rep)
12495 /* On 64-bit targets, SImode register values are sign-extended to DImode. */
12496 if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
12497 return SIGN_EXTEND;
12499 return UNKNOWN;
12502 /* Implement TARGET_VALID_POINTER_MODE. */
12504 static bool
12505 mips_valid_pointer_mode (machine_mode mode)
12507 return mode == SImode || (TARGET_64BIT && mode == DImode);
12510 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P. */
12512 static bool
12513 mips_vector_mode_supported_p (machine_mode mode)
12515 switch (mode)
12517 case V2SFmode:
12518 return TARGET_PAIRED_SINGLE_FLOAT;
12520 case V2HImode:
12521 case V4QImode:
12522 case V2HQmode:
12523 case V2UHQmode:
12524 case V2HAmode:
12525 case V2UHAmode:
12526 case V4QQmode:
12527 case V4UQQmode:
12528 return TARGET_DSP;
12530 case V2SImode:
12531 case V4HImode:
12532 case V8QImode:
12533 return TARGET_LOONGSON_VECTORS;
12535 default:
12536 return false;
12540 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P. */
12542 static bool
12543 mips_scalar_mode_supported_p (machine_mode mode)
12545 if (ALL_FIXED_POINT_MODE_P (mode)
12546 && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
12547 return true;
12549 return default_scalar_mode_supported_p (mode);
12552 /* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE. */
12554 static machine_mode
12555 mips_preferred_simd_mode (machine_mode mode ATTRIBUTE_UNUSED)
12557 if (TARGET_PAIRED_SINGLE_FLOAT
12558 && mode == SFmode)
12559 return V2SFmode;
12560 return word_mode;
12563 /* Implement TARGET_INIT_LIBFUNCS. */
12565 static void
12566 mips_init_libfuncs (void)
12568 if (TARGET_FIX_VR4120)
12570 /* Register the special divsi3 and modsi3 functions needed to work
12571 around VR4120 division errata. */
12572 set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
12573 set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
12576 if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
12578 /* Register the MIPS16 -mhard-float stubs. */
12579 set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
12580 set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
12581 set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
12582 set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
12584 set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
12585 set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
12586 set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
12587 set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
12588 set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
12589 set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
12590 set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
12592 set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
12593 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
12594 set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
12596 if (TARGET_DOUBLE_FLOAT)
12598 set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
12599 set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
12600 set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
12601 set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
12603 set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
12604 set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
12605 set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
12606 set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
12607 set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
12608 set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
12609 set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
12611 set_conv_libfunc (sext_optab, DFmode, SFmode,
12612 "__mips16_extendsfdf2");
12613 set_conv_libfunc (trunc_optab, SFmode, DFmode,
12614 "__mips16_truncdfsf2");
12615 set_conv_libfunc (sfix_optab, SImode, DFmode,
12616 "__mips16_fix_truncdfsi");
12617 set_conv_libfunc (sfloat_optab, DFmode, SImode,
12618 "__mips16_floatsidf");
12619 set_conv_libfunc (ufloat_optab, DFmode, SImode,
12620 "__mips16_floatunsidf");
12624 /* The MIPS16 ISA does not have an encoding for "sync", so we rely
12625 on an external non-MIPS16 routine to implement __sync_synchronize.
12626 Similarly for the rest of the ll/sc libfuncs. */
12627 if (TARGET_MIPS16)
12629 synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
12630 init_sync_libfuncs (UNITS_PER_WORD);
12634 /* Build up a multi-insn sequence that loads label TARGET into $AT. */
12636 static void
12637 mips_process_load_label (rtx target)
12639 rtx base, gp, intop;
12640 HOST_WIDE_INT offset;
12642 mips_multi_start ();
12643 switch (mips_abi)
12645 case ABI_N32:
12646 mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
12647 mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
12648 break;
12650 case ABI_64:
12651 mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
12652 mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
12653 break;
12655 default:
12656 gp = pic_offset_table_rtx;
12657 if (mips_cfun_has_cprestore_slot_p ())
12659 gp = gen_rtx_REG (Pmode, AT_REGNUM);
12660 mips_get_cprestore_base_and_offset (&base, &offset, true);
12661 if (!SMALL_OPERAND (offset))
12663 intop = GEN_INT (CONST_HIGH_PART (offset));
12664 mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
12665 mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
12667 base = gp;
12668 offset = CONST_LOW_PART (offset);
12670 intop = GEN_INT (offset);
12671 if (ISA_HAS_LOAD_DELAY)
12672 mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
12673 else
12674 mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
12676 if (ISA_HAS_LOAD_DELAY)
12677 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
12678 else
12679 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
12680 mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
12681 break;
12685 /* Return the number of instructions needed to load a label into $AT. */
12687 static unsigned int
12688 mips_load_label_num_insns (void)
12690 if (cfun->machine->load_label_num_insns == 0)
12692 mips_process_load_label (pc_rtx);
12693 cfun->machine->load_label_num_insns = mips_multi_num_insns;
12695 return cfun->machine->load_label_num_insns;
12698 /* Emit an asm sequence to start a noat block and load the address
12699 of a label into $1. */
12701 void
12702 mips_output_load_label (rtx target)
12704 mips_push_asm_switch (&mips_noat);
12705 if (TARGET_EXPLICIT_RELOCS)
12707 mips_process_load_label (target);
12708 mips_multi_write ();
12710 else
12712 if (Pmode == DImode)
12713 output_asm_insn ("dla\t%@,%0", &target);
12714 else
12715 output_asm_insn ("la\t%@,%0", &target);
12719 /* Return the length of INSN. LENGTH is the initial length computed by
12720 attributes in the machine-description file. */
12723 mips_adjust_insn_length (rtx_insn *insn, int length)
12725 /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
12726 of a PIC long-branch sequence. Substitute the correct value. */
12727 if (length == MAX_PIC_BRANCH_LENGTH
12728 && JUMP_P (insn)
12729 && INSN_CODE (insn) >= 0
12730 && get_attr_type (insn) == TYPE_BRANCH)
12732 /* Add the branch-over instruction and its delay slot, if this
12733 is a conditional branch. */
12734 length = simplejump_p (insn) ? 0 : 8;
12736 /* Add the size of a load into $AT. */
12737 length += BASE_INSN_LENGTH * mips_load_label_num_insns ();
12739 /* Add the length of an indirect jump, ignoring the delay slot. */
12740 length += TARGET_COMPRESSION ? 2 : 4;
12743 /* A unconditional jump has an unfilled delay slot if it is not part
12744 of a sequence. A conditional jump normally has a delay slot, but
12745 does not on MIPS16. */
12746 if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
12747 length += TARGET_MIPS16 ? 2 : 4;
12749 /* See how many nops might be needed to avoid hardware hazards. */
12750 if (!cfun->machine->ignore_hazard_length_p
12751 && INSN_P (insn)
12752 && INSN_CODE (insn) >= 0)
12753 switch (get_attr_hazard (insn))
12755 case HAZARD_NONE:
12756 break;
12758 case HAZARD_DELAY:
12759 length += NOP_INSN_LENGTH;
12760 break;
12762 case HAZARD_HILO:
12763 length += NOP_INSN_LENGTH * 2;
12764 break;
12767 return length;
12770 /* Return the assembly code for INSN, which has the operands given by
12771 OPERANDS, and which branches to OPERANDS[0] if some condition is true.
12772 BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
12773 is in range of a direct branch. BRANCH_IF_FALSE is an inverted
12774 version of BRANCH_IF_TRUE. */
12776 const char *
12777 mips_output_conditional_branch (rtx_insn *insn, rtx *operands,
12778 const char *branch_if_true,
12779 const char *branch_if_false)
12781 unsigned int length;
12782 rtx taken;
12784 gcc_assert (LABEL_P (operands[0]));
12786 length = get_attr_length (insn);
12787 if (length <= 8)
12789 /* Just a simple conditional branch. */
12790 mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
12791 return branch_if_true;
12794 /* Generate a reversed branch around a direct jump. This fallback does
12795 not use branch-likely instructions. */
12796 mips_branch_likely = false;
12797 rtx_code_label *not_taken = gen_label_rtx ();
12798 taken = operands[0];
12800 /* Generate the reversed branch to NOT_TAKEN. */
12801 operands[0] = not_taken;
12802 output_asm_insn (branch_if_false, operands);
12804 /* If INSN has a delay slot, we must provide delay slots for both the
12805 branch to NOT_TAKEN and the conditional jump. We must also ensure
12806 that INSN's delay slot is executed in the appropriate cases. */
12807 if (final_sequence)
12809 /* This first delay slot will always be executed, so use INSN's
12810 delay slot if is not annulled. */
12811 if (!INSN_ANNULLED_BRANCH_P (insn))
12813 final_scan_insn (final_sequence->insn (1),
12814 asm_out_file, optimize, 1, NULL);
12815 final_sequence->insn (1)->set_deleted ();
12817 else
12818 output_asm_insn ("nop", 0);
12819 fprintf (asm_out_file, "\n");
12822 /* Output the unconditional branch to TAKEN. */
12823 if (TARGET_ABSOLUTE_JUMPS)
12824 output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
12825 else
12827 mips_output_load_label (taken);
12828 output_asm_insn ("jr\t%@%]%/", 0);
12831 /* Now deal with its delay slot; see above. */
12832 if (final_sequence)
12834 /* This delay slot will only be executed if the branch is taken.
12835 Use INSN's delay slot if is annulled. */
12836 if (INSN_ANNULLED_BRANCH_P (insn))
12838 final_scan_insn (final_sequence->insn (1),
12839 asm_out_file, optimize, 1, NULL);
12840 final_sequence->insn (1)->set_deleted ();
12842 else
12843 output_asm_insn ("nop", 0);
12844 fprintf (asm_out_file, "\n");
12847 /* Output NOT_TAKEN. */
12848 targetm.asm_out.internal_label (asm_out_file, "L",
12849 CODE_LABEL_NUMBER (not_taken));
12850 return "";
12853 /* Return the assembly code for INSN, which branches to OPERANDS[0]
12854 if some ordering condition is true. The condition is given by
12855 OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
12856 OPERANDS[1]. OPERANDS[2] is the comparison's first operand;
12857 its second is always zero. */
12859 const char *
12860 mips_output_order_conditional_branch (rtx_insn *insn, rtx *operands, bool inverted_p)
12862 const char *branch[2];
12864 /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
12865 Make BRANCH[0] branch on the inverse condition. */
12866 switch (GET_CODE (operands[1]))
12868 /* These cases are equivalent to comparisons against zero. */
12869 case LEU:
12870 inverted_p = !inverted_p;
12871 /* Fall through. */
12872 case GTU:
12873 branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
12874 branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
12875 break;
12877 /* These cases are always true or always false. */
12878 case LTU:
12879 inverted_p = !inverted_p;
12880 /* Fall through. */
12881 case GEU:
12882 branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
12883 branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
12884 break;
12886 default:
12887 branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
12888 branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
12889 break;
12891 return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
12894 /* Start a block of code that needs access to the LL, SC and SYNC
12895 instructions. */
12897 static void
12898 mips_start_ll_sc_sync_block (void)
12900 if (!ISA_HAS_LL_SC)
12902 output_asm_insn (".set\tpush", 0);
12903 if (TARGET_64BIT)
12904 output_asm_insn (".set\tmips3", 0);
12905 else
12906 output_asm_insn (".set\tmips2", 0);
12910 /* End a block started by mips_start_ll_sc_sync_block. */
12912 static void
12913 mips_end_ll_sc_sync_block (void)
12915 if (!ISA_HAS_LL_SC)
12916 output_asm_insn (".set\tpop", 0);
12919 /* Output and/or return the asm template for a sync instruction. */
12921 const char *
12922 mips_output_sync (void)
12924 mips_start_ll_sc_sync_block ();
12925 output_asm_insn ("sync", 0);
12926 mips_end_ll_sc_sync_block ();
12927 return "";
12930 /* Return the asm template associated with sync_insn1 value TYPE.
12931 IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation. */
12933 static const char *
12934 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
12936 switch (type)
12938 case SYNC_INSN1_MOVE:
12939 return "move\t%0,%z2";
12940 case SYNC_INSN1_LI:
12941 return "li\t%0,%2";
12942 case SYNC_INSN1_ADDU:
12943 return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
12944 case SYNC_INSN1_ADDIU:
12945 return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
12946 case SYNC_INSN1_SUBU:
12947 return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
12948 case SYNC_INSN1_AND:
12949 return "and\t%0,%1,%z2";
12950 case SYNC_INSN1_ANDI:
12951 return "andi\t%0,%1,%2";
12952 case SYNC_INSN1_OR:
12953 return "or\t%0,%1,%z2";
12954 case SYNC_INSN1_ORI:
12955 return "ori\t%0,%1,%2";
12956 case SYNC_INSN1_XOR:
12957 return "xor\t%0,%1,%z2";
12958 case SYNC_INSN1_XORI:
12959 return "xori\t%0,%1,%2";
12961 gcc_unreachable ();
12964 /* Return the asm template associated with sync_insn2 value TYPE. */
12966 static const char *
12967 mips_sync_insn2_template (enum attr_sync_insn2 type)
12969 switch (type)
12971 case SYNC_INSN2_NOP:
12972 gcc_unreachable ();
12973 case SYNC_INSN2_AND:
12974 return "and\t%0,%1,%z2";
12975 case SYNC_INSN2_XOR:
12976 return "xor\t%0,%1,%z2";
12977 case SYNC_INSN2_NOT:
12978 return "nor\t%0,%1,%.";
12980 gcc_unreachable ();
12983 /* OPERANDS are the operands to a sync loop instruction and INDEX is
12984 the value of the one of the sync_* attributes. Return the operand
12985 referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
12986 have the associated attribute. */
12988 static rtx
12989 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
12991 if (index > 0)
12992 default_value = operands[index - 1];
12993 return default_value;
12996 /* INSN is a sync loop with operands OPERANDS. Build up a multi-insn
12997 sequence for it. */
12999 static void
13000 mips_process_sync_loop (rtx_insn *insn, rtx *operands)
13002 rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
13003 rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3, cmp;
13004 unsigned int tmp3_insn;
13005 enum attr_sync_insn1 insn1;
13006 enum attr_sync_insn2 insn2;
13007 bool is_64bit_p;
13008 int memmodel_attr;
13009 enum memmodel model;
13011 /* Read an operand from the sync_WHAT attribute and store it in
13012 variable WHAT. DEFAULT is the default value if no attribute
13013 is specified. */
13014 #define READ_OPERAND(WHAT, DEFAULT) \
13015 WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
13016 DEFAULT)
13018 /* Read the memory. */
13019 READ_OPERAND (mem, 0);
13020 gcc_assert (mem);
13021 is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
13023 /* Read the other attributes. */
13024 at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
13025 READ_OPERAND (oldval, at);
13026 READ_OPERAND (cmp, 0);
13027 READ_OPERAND (newval, at);
13028 READ_OPERAND (inclusive_mask, 0);
13029 READ_OPERAND (exclusive_mask, 0);
13030 READ_OPERAND (required_oldval, 0);
13031 READ_OPERAND (insn1_op2, 0);
13032 insn1 = get_attr_sync_insn1 (insn);
13033 insn2 = get_attr_sync_insn2 (insn);
13035 /* Don't bother setting CMP result that is never used. */
13036 if (cmp && find_reg_note (insn, REG_UNUSED, cmp))
13037 cmp = 0;
13039 memmodel_attr = get_attr_sync_memmodel (insn);
13040 switch (memmodel_attr)
13042 case 10:
13043 model = MEMMODEL_ACQ_REL;
13044 break;
13045 case 11:
13046 model = MEMMODEL_ACQUIRE;
13047 break;
13048 default:
13049 model = memmodel_from_int (INTVAL (operands[memmodel_attr]));
13052 mips_multi_start ();
13054 /* Output the release side of the memory barrier. */
13055 if (need_atomic_barrier_p (model, true))
13057 if (required_oldval == 0 && TARGET_OCTEON)
13059 /* Octeon doesn't reorder reads, so a full barrier can be
13060 created by using SYNCW to order writes combined with the
13061 write from the following SC. When the SC successfully
13062 completes, we know that all preceding writes are also
13063 committed to the coherent memory system. It is possible
13064 for a single SYNCW to fail, but a pair of them will never
13065 fail, so we use two. */
13066 mips_multi_add_insn ("syncw", NULL);
13067 mips_multi_add_insn ("syncw", NULL);
13069 else
13070 mips_multi_add_insn ("sync", NULL);
13073 /* Output the branch-back label. */
13074 mips_multi_add_label ("1:");
13076 /* OLDVAL = *MEM. */
13077 mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
13078 oldval, mem, NULL);
13080 /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2. */
13081 if (required_oldval)
13083 if (inclusive_mask == 0)
13084 tmp1 = oldval;
13085 else
13087 gcc_assert (oldval != at);
13088 mips_multi_add_insn ("and\t%0,%1,%2",
13089 at, oldval, inclusive_mask, NULL);
13090 tmp1 = at;
13092 mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
13094 /* CMP = 0 [delay slot]. */
13095 if (cmp)
13096 mips_multi_add_insn ("li\t%0,0", cmp, NULL);
13099 /* $TMP1 = OLDVAL & EXCLUSIVE_MASK. */
13100 if (exclusive_mask == 0)
13101 tmp1 = const0_rtx;
13102 else
13104 gcc_assert (oldval != at);
13105 mips_multi_add_insn ("and\t%0,%1,%z2",
13106 at, oldval, exclusive_mask, NULL);
13107 tmp1 = at;
13110 /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
13112 We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
13113 at least one instruction in that case. */
13114 if (insn1 == SYNC_INSN1_MOVE
13115 && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
13116 tmp2 = insn1_op2;
13117 else
13119 mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
13120 newval, oldval, insn1_op2, NULL);
13121 tmp2 = newval;
13124 /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK). */
13125 if (insn2 == SYNC_INSN2_NOP)
13126 tmp3 = tmp2;
13127 else
13129 mips_multi_add_insn (mips_sync_insn2_template (insn2),
13130 newval, tmp2, inclusive_mask, NULL);
13131 tmp3 = newval;
13133 tmp3_insn = mips_multi_last_index ();
13135 /* $AT = $TMP1 | $TMP3. */
13136 if (tmp1 == const0_rtx || tmp3 == const0_rtx)
13138 mips_multi_set_operand (tmp3_insn, 0, at);
13139 tmp3 = at;
13141 else
13143 gcc_assert (tmp1 != tmp3);
13144 mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
13147 /* if (!commit (*MEM = $AT)) goto 1.
13149 This will sometimes be a delayed branch; see the write code below
13150 for details. */
13151 mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
13153 /* When using branch likely (-mfix-r10000), the delay slot instruction
13154 will be annulled on false. The normal delay slot instructions
13155 calculate the overall result of the atomic operation and must not
13156 be annulled. To ensure this behaviour unconditionally use a NOP
13157 in the delay slot for the branch likely case. */
13159 mips_multi_add_insn ("beq%?\t%0,%.,1b%~", at, NULL);
13161 /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot]. */
13162 if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
13164 mips_multi_copy_insn (tmp3_insn);
13165 mips_multi_set_operand (mips_multi_last_index (), 0, newval);
13167 else if (!(required_oldval && cmp) && !mips_branch_likely)
13168 mips_multi_add_insn ("nop", NULL);
13170 /* CMP = 1 -- either standalone or in a delay slot. */
13171 if (required_oldval && cmp)
13172 mips_multi_add_insn ("li\t%0,1", cmp, NULL);
13174 /* Output the acquire side of the memory barrier. */
13175 if (TARGET_SYNC_AFTER_SC && need_atomic_barrier_p (model, false))
13176 mips_multi_add_insn ("sync", NULL);
13178 /* Output the exit label, if needed. */
13179 if (required_oldval)
13180 mips_multi_add_label ("2:");
13182 #undef READ_OPERAND
13185 /* Output and/or return the asm template for sync loop INSN, which has
13186 the operands given by OPERANDS. */
13188 const char *
13189 mips_output_sync_loop (rtx_insn *insn, rtx *operands)
13191 /* Use branch-likely instructions to work around the LL/SC R10000
13192 errata. */
13193 mips_branch_likely = TARGET_FIX_R10000;
13195 mips_process_sync_loop (insn, operands);
13197 mips_push_asm_switch (&mips_noreorder);
13198 mips_push_asm_switch (&mips_nomacro);
13199 mips_push_asm_switch (&mips_noat);
13200 mips_start_ll_sc_sync_block ();
13202 mips_multi_write ();
13204 mips_end_ll_sc_sync_block ();
13205 mips_pop_asm_switch (&mips_noat);
13206 mips_pop_asm_switch (&mips_nomacro);
13207 mips_pop_asm_switch (&mips_noreorder);
13209 return "";
13212 /* Return the number of individual instructions in sync loop INSN,
13213 which has the operands given by OPERANDS. */
13215 unsigned int
13216 mips_sync_loop_insns (rtx_insn *insn, rtx *operands)
13218 /* Use branch-likely instructions to work around the LL/SC R10000
13219 errata. */
13220 mips_branch_likely = TARGET_FIX_R10000;
13221 mips_process_sync_loop (insn, operands);
13222 return mips_multi_num_insns;
13225 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
13226 the operands given by OPERANDS. Add in a divide-by-zero check if needed.
13228 When working around R4000 and R4400 errata, we need to make sure that
13229 the division is not immediately followed by a shift[1][2]. We also
13230 need to stop the division from being put into a branch delay slot[3].
13231 The easiest way to avoid both problems is to add a nop after the
13232 division. When a divide-by-zero check is needed, this nop can be
13233 used to fill the branch delay slot.
13235 [1] If a double-word or a variable shift executes immediately
13236 after starting an integer division, the shift may give an
13237 incorrect result. See quotations of errata #16 and #28 from
13238 "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
13239 in mips.md for details.
13241 [2] A similar bug to [1] exists for all revisions of the
13242 R4000 and the R4400 when run in an MC configuration.
13243 From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
13245 "19. In this following sequence:
13247 ddiv (or ddivu or div or divu)
13248 dsll32 (or dsrl32, dsra32)
13250 if an MPT stall occurs, while the divide is slipping the cpu
13251 pipeline, then the following double shift would end up with an
13252 incorrect result.
13254 Workaround: The compiler needs to avoid generating any
13255 sequence with divide followed by extended double shift."
13257 This erratum is also present in "MIPS R4400MC Errata, Processor
13258 Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
13259 & 3.0" as errata #10 and #4, respectively.
13261 [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
13262 (also valid for MIPS R4000MC processors):
13264 "52. R4000SC: This bug does not apply for the R4000PC.
13266 There are two flavors of this bug:
13268 1) If the instruction just after divide takes an RF exception
13269 (tlb-refill, tlb-invalid) and gets an instruction cache
13270 miss (both primary and secondary) and the line which is
13271 currently in secondary cache at this index had the first
13272 data word, where the bits 5..2 are set, then R4000 would
13273 get a wrong result for the div.
13277 div r8, r9
13278 ------------------- # end-of page. -tlb-refill
13282 div r8, r9
13283 ------------------- # end-of page. -tlb-invalid
13286 2) If the divide is in the taken branch delay slot, where the
13287 target takes RF exception and gets an I-cache miss for the
13288 exception vector or where I-cache miss occurs for the
13289 target address, under the above mentioned scenarios, the
13290 div would get wrong results.
13293 j r2 # to next page mapped or unmapped
13294 div r8,r9 # this bug would be there as long
13295 # as there is an ICache miss and
13296 nop # the "data pattern" is present
13299 beq r0, r0, NextPage # to Next page
13300 div r8,r9
13303 This bug is present for div, divu, ddiv, and ddivu
13304 instructions.
13306 Workaround: For item 1), OS could make sure that the next page
13307 after the divide instruction is also mapped. For item 2), the
13308 compiler could make sure that the divide instruction is not in
13309 the branch delay slot."
13311 These processors have PRId values of 0x00004220 and 0x00004300 for
13312 the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400. */
13314 const char *
13315 mips_output_division (const char *division, rtx *operands)
13317 const char *s;
13319 s = division;
13320 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
13322 output_asm_insn (s, operands);
13323 s = "nop";
13325 if (TARGET_CHECK_ZERO_DIV)
13327 if (TARGET_MIPS16)
13329 output_asm_insn (s, operands);
13330 s = "bnez\t%2,1f\n\tbreak\t7\n1:";
13332 else if (GENERATE_DIVIDE_TRAPS)
13334 /* Avoid long replay penalty on load miss by putting the trap before
13335 the divide. */
13336 if (TUNE_74K)
13337 output_asm_insn ("teq\t%2,%.,7", operands);
13338 else
13340 output_asm_insn (s, operands);
13341 s = "teq\t%2,%.,7";
13344 else
13346 output_asm_insn ("%(bne\t%2,%.,1f", operands);
13347 output_asm_insn (s, operands);
13348 s = "break\t7%)\n1:";
13351 return s;
13354 /* Return true if destination of IN_INSN is used as add source in
13355 OUT_INSN. Both IN_INSN and OUT_INSN are of type fmadd. Example:
13356 madd.s dst, x, y, z
13357 madd.s a, dst, b, c */
13359 bool
13360 mips_fmadd_bypass (rtx_insn *out_insn, rtx_insn *in_insn)
13362 int dst_reg, src_reg;
13364 gcc_assert (get_attr_type (in_insn) == TYPE_FMADD);
13365 gcc_assert (get_attr_type (out_insn) == TYPE_FMADD);
13367 extract_insn (in_insn);
13368 dst_reg = REG_P (recog_data.operand[0]);
13370 extract_insn (out_insn);
13371 src_reg = REG_P (recog_data.operand[1]);
13373 if (dst_reg == src_reg)
13374 return true;
13376 return false;
13379 /* Return true if IN_INSN is a multiply-add or multiply-subtract
13380 instruction and if OUT_INSN assigns to the accumulator operand. */
13382 bool
13383 mips_linked_madd_p (rtx_insn *out_insn, rtx_insn *in_insn)
13385 enum attr_accum_in accum_in;
13386 int accum_in_opnum;
13387 rtx accum_in_op;
13389 if (recog_memoized (in_insn) < 0)
13390 return false;
13392 accum_in = get_attr_accum_in (in_insn);
13393 if (accum_in == ACCUM_IN_NONE)
13394 return false;
13396 accum_in_opnum = accum_in - ACCUM_IN_0;
13398 extract_insn (in_insn);
13399 gcc_assert (accum_in_opnum < recog_data.n_operands);
13400 accum_in_op = recog_data.operand[accum_in_opnum];
13402 return reg_set_p (accum_in_op, out_insn);
13405 /* True if the dependency between OUT_INSN and IN_INSN is on the store
13406 data rather than the address. We need this because the cprestore
13407 pattern is type "store", but is defined using an UNSPEC_VOLATILE,
13408 which causes the default routine to abort. We just return false
13409 for that case. */
13411 bool
13412 mips_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
13414 if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
13415 return false;
13417 return !store_data_bypass_p (out_insn, in_insn);
13421 /* Variables and flags used in scheduler hooks when tuning for
13422 Loongson 2E/2F. */
13423 static struct
13425 /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
13426 strategy. */
13428 /* If true, then next ALU1/2 instruction will go to ALU1. */
13429 bool alu1_turn_p;
13431 /* If true, then next FALU1/2 unstruction will go to FALU1. */
13432 bool falu1_turn_p;
13434 /* Codes to query if [f]alu{1,2}_core units are subscribed or not. */
13435 int alu1_core_unit_code;
13436 int alu2_core_unit_code;
13437 int falu1_core_unit_code;
13438 int falu2_core_unit_code;
13440 /* True if current cycle has a multi instruction.
13441 This flag is used in mips_ls2_dfa_post_advance_cycle. */
13442 bool cycle_has_multi_p;
13444 /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
13445 These are used in mips_ls2_dfa_post_advance_cycle to initialize
13446 DFA state.
13447 E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
13448 instruction to go ALU1. */
13449 rtx_insn *alu1_turn_enabled_insn;
13450 rtx_insn *alu2_turn_enabled_insn;
13451 rtx_insn *falu1_turn_enabled_insn;
13452 rtx_insn *falu2_turn_enabled_insn;
13453 } mips_ls2;
13455 /* Implement TARGET_SCHED_ADJUST_COST. We assume that anti and output
13456 dependencies have no cost, except on the 20Kc where output-dependence
13457 is treated like input-dependence. */
13459 static int
13460 mips_adjust_cost (rtx_insn *insn ATTRIBUTE_UNUSED, rtx link,
13461 rtx_insn *dep ATTRIBUTE_UNUSED, int cost)
13463 if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
13464 && TUNE_20KC)
13465 return cost;
13466 if (REG_NOTE_KIND (link) != 0)
13467 return 0;
13468 return cost;
13471 /* Return the number of instructions that can be issued per cycle. */
13473 static int
13474 mips_issue_rate (void)
13476 switch (mips_tune)
13478 case PROCESSOR_74KC:
13479 case PROCESSOR_74KF2_1:
13480 case PROCESSOR_74KF1_1:
13481 case PROCESSOR_74KF3_2:
13482 /* The 74k is not strictly quad-issue cpu, but can be seen as one
13483 by the scheduler. It can issue 1 ALU, 1 AGEN and 2 FPU insns,
13484 but in reality only a maximum of 3 insns can be issued as
13485 floating-point loads and stores also require a slot in the
13486 AGEN pipe. */
13487 case PROCESSOR_R10000:
13488 /* All R10K Processors are quad-issue (being the first MIPS
13489 processors to support this feature). */
13490 return 4;
13492 case PROCESSOR_20KC:
13493 case PROCESSOR_R4130:
13494 case PROCESSOR_R5400:
13495 case PROCESSOR_R5500:
13496 case PROCESSOR_R5900:
13497 case PROCESSOR_R7000:
13498 case PROCESSOR_R9000:
13499 case PROCESSOR_OCTEON:
13500 case PROCESSOR_OCTEON2:
13501 case PROCESSOR_OCTEON3:
13502 return 2;
13504 case PROCESSOR_SB1:
13505 case PROCESSOR_SB1A:
13506 /* This is actually 4, but we get better performance if we claim 3.
13507 This is partly because of unwanted speculative code motion with the
13508 larger number, and partly because in most common cases we can't
13509 reach the theoretical max of 4. */
13510 return 3;
13512 case PROCESSOR_LOONGSON_2E:
13513 case PROCESSOR_LOONGSON_2F:
13514 case PROCESSOR_LOONGSON_3A:
13515 case PROCESSOR_P5600:
13516 return 4;
13518 case PROCESSOR_XLP:
13519 return (reload_completed ? 4 : 3);
13521 default:
13522 return 1;
13526 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2. */
13528 static void
13529 mips_ls2_init_dfa_post_cycle_insn (void)
13531 start_sequence ();
13532 emit_insn (gen_ls2_alu1_turn_enabled_insn ());
13533 mips_ls2.alu1_turn_enabled_insn = get_insns ();
13534 end_sequence ();
13536 start_sequence ();
13537 emit_insn (gen_ls2_alu2_turn_enabled_insn ());
13538 mips_ls2.alu2_turn_enabled_insn = get_insns ();
13539 end_sequence ();
13541 start_sequence ();
13542 emit_insn (gen_ls2_falu1_turn_enabled_insn ());
13543 mips_ls2.falu1_turn_enabled_insn = get_insns ();
13544 end_sequence ();
13546 start_sequence ();
13547 emit_insn (gen_ls2_falu2_turn_enabled_insn ());
13548 mips_ls2.falu2_turn_enabled_insn = get_insns ();
13549 end_sequence ();
13551 mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
13552 mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
13553 mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
13554 mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
13557 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
13558 Init data used in mips_dfa_post_advance_cycle. */
13560 static void
13561 mips_init_dfa_post_cycle_insn (void)
13563 if (TUNE_LOONGSON_2EF)
13564 mips_ls2_init_dfa_post_cycle_insn ();
13567 /* Initialize STATE when scheduling for Loongson 2E/2F.
13568 Support round-robin dispatch scheme by enabling only one of
13569 ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
13570 respectively. */
13572 static void
13573 mips_ls2_dfa_post_advance_cycle (state_t state)
13575 if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
13577 /* Though there are no non-pipelined ALU1 insns,
13578 we can get an instruction of type 'multi' before reload. */
13579 gcc_assert (mips_ls2.cycle_has_multi_p);
13580 mips_ls2.alu1_turn_p = false;
13583 mips_ls2.cycle_has_multi_p = false;
13585 if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
13586 /* We have a non-pipelined alu instruction in the core,
13587 adjust round-robin counter. */
13588 mips_ls2.alu1_turn_p = true;
13590 if (mips_ls2.alu1_turn_p)
13592 if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
13593 gcc_unreachable ();
13595 else
13597 if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
13598 gcc_unreachable ();
13601 if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
13603 /* There are no non-pipelined FALU1 insns. */
13604 gcc_unreachable ();
13605 mips_ls2.falu1_turn_p = false;
13608 if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
13609 /* We have a non-pipelined falu instruction in the core,
13610 adjust round-robin counter. */
13611 mips_ls2.falu1_turn_p = true;
13613 if (mips_ls2.falu1_turn_p)
13615 if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
13616 gcc_unreachable ();
13618 else
13620 if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
13621 gcc_unreachable ();
13625 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
13626 This hook is being called at the start of each cycle. */
13628 static void
13629 mips_dfa_post_advance_cycle (void)
13631 if (TUNE_LOONGSON_2EF)
13632 mips_ls2_dfa_post_advance_cycle (curr_state);
13635 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD. This should
13636 be as wide as the scheduling freedom in the DFA. */
13638 static int
13639 mips_multipass_dfa_lookahead (void)
13641 /* Can schedule up to 4 of the 6 function units in any one cycle. */
13642 if (TUNE_SB1)
13643 return 4;
13645 if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
13646 return 4;
13648 if (TUNE_OCTEON)
13649 return 2;
13651 if (TUNE_P5600)
13652 return 4;
13654 return 0;
13657 /* Remove the instruction at index LOWER from ready queue READY and
13658 reinsert it in front of the instruction at index HIGHER. LOWER must
13659 be <= HIGHER. */
13661 static void
13662 mips_promote_ready (rtx_insn **ready, int lower, int higher)
13664 rtx_insn *new_head;
13665 int i;
13667 new_head = ready[lower];
13668 for (i = lower; i < higher; i++)
13669 ready[i] = ready[i + 1];
13670 ready[i] = new_head;
13673 /* If the priority of the instruction at POS2 in the ready queue READY
13674 is within LIMIT units of that of the instruction at POS1, swap the
13675 instructions if POS2 is not already less than POS1. */
13677 static void
13678 mips_maybe_swap_ready (rtx_insn **ready, int pos1, int pos2, int limit)
13680 if (pos1 < pos2
13681 && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
13683 rtx_insn *temp;
13685 temp = ready[pos1];
13686 ready[pos1] = ready[pos2];
13687 ready[pos2] = temp;
13691 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
13692 that may clobber hi or lo. */
13693 static rtx_insn *mips_macc_chains_last_hilo;
13695 /* A TUNE_MACC_CHAINS helper function. Record that instruction INSN has
13696 been scheduled, updating mips_macc_chains_last_hilo appropriately. */
13698 static void
13699 mips_macc_chains_record (rtx_insn *insn)
13701 if (get_attr_may_clobber_hilo (insn))
13702 mips_macc_chains_last_hilo = insn;
13705 /* A TUNE_MACC_CHAINS helper function. Search ready queue READY, which
13706 has NREADY elements, looking for a multiply-add or multiply-subtract
13707 instruction that is cumulative with mips_macc_chains_last_hilo.
13708 If there is one, promote it ahead of anything else that might
13709 clobber hi or lo. */
13711 static void
13712 mips_macc_chains_reorder (rtx_insn **ready, int nready)
13714 int i, j;
13716 if (mips_macc_chains_last_hilo != 0)
13717 for (i = nready - 1; i >= 0; i--)
13718 if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
13720 for (j = nready - 1; j > i; j--)
13721 if (recog_memoized (ready[j]) >= 0
13722 && get_attr_may_clobber_hilo (ready[j]))
13724 mips_promote_ready (ready, i, j);
13725 break;
13727 break;
13731 /* The last instruction to be scheduled. */
13732 static rtx_insn *vr4130_last_insn;
13734 /* A note_stores callback used by vr4130_true_reg_dependence_p. DATA
13735 points to an rtx that is initially an instruction. Nullify the rtx
13736 if the instruction uses the value of register X. */
13738 static void
13739 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13740 void *data)
13742 rtx *insn_ptr;
13744 insn_ptr = (rtx *) data;
13745 if (REG_P (x)
13746 && *insn_ptr != 0
13747 && reg_referenced_p (x, PATTERN (*insn_ptr)))
13748 *insn_ptr = 0;
13751 /* Return true if there is true register dependence between vr4130_last_insn
13752 and INSN. */
13754 static bool
13755 vr4130_true_reg_dependence_p (rtx insn)
13757 note_stores (PATTERN (vr4130_last_insn),
13758 vr4130_true_reg_dependence_p_1, &insn);
13759 return insn == 0;
13762 /* A TUNE_MIPS4130 helper function. Given that INSN1 is at the head of
13763 the ready queue and that INSN2 is the instruction after it, return
13764 true if it is worth promoting INSN2 ahead of INSN1. Look for cases
13765 in which INSN1 and INSN2 can probably issue in parallel, but for
13766 which (INSN2, INSN1) should be less sensitive to instruction
13767 alignment than (INSN1, INSN2). See 4130.md for more details. */
13769 static bool
13770 vr4130_swap_insns_p (rtx_insn *insn1, rtx_insn *insn2)
13772 sd_iterator_def sd_it;
13773 dep_t dep;
13775 /* Check for the following case:
13777 1) there is some other instruction X with an anti dependence on INSN1;
13778 2) X has a higher priority than INSN2; and
13779 3) X is an arithmetic instruction (and thus has no unit restrictions).
13781 If INSN1 is the last instruction blocking X, it would better to
13782 choose (INSN1, X) over (INSN2, INSN1). */
13783 FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
13784 if (DEP_TYPE (dep) == REG_DEP_ANTI
13785 && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
13786 && recog_memoized (DEP_CON (dep)) >= 0
13787 && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
13788 return false;
13790 if (vr4130_last_insn != 0
13791 && recog_memoized (insn1) >= 0
13792 && recog_memoized (insn2) >= 0)
13794 /* See whether INSN1 and INSN2 use different execution units,
13795 or if they are both ALU-type instructions. If so, they can
13796 probably execute in parallel. */
13797 enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
13798 enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
13799 if (class1 != class2 || class1 == VR4130_CLASS_ALU)
13801 /* If only one of the instructions has a dependence on
13802 vr4130_last_insn, prefer to schedule the other one first. */
13803 bool dep1_p = vr4130_true_reg_dependence_p (insn1);
13804 bool dep2_p = vr4130_true_reg_dependence_p (insn2);
13805 if (dep1_p != dep2_p)
13806 return dep1_p;
13808 /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
13809 is not an ALU-type instruction and if INSN1 uses the same
13810 execution unit. (Note that if this condition holds, we already
13811 know that INSN2 uses a different execution unit.) */
13812 if (class1 != VR4130_CLASS_ALU
13813 && recog_memoized (vr4130_last_insn) >= 0
13814 && class1 == get_attr_vr4130_class (vr4130_last_insn))
13815 return true;
13818 return false;
13821 /* A TUNE_MIPS4130 helper function. (READY, NREADY) describes a ready
13822 queue with at least two instructions. Swap the first two if
13823 vr4130_swap_insns_p says that it could be worthwhile. */
13825 static void
13826 vr4130_reorder (rtx_insn **ready, int nready)
13828 if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
13829 mips_promote_ready (ready, nready - 2, nready - 1);
13832 /* Record whether last 74k AGEN instruction was a load or store. */
13833 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
13835 /* Initialize mips_last_74k_agen_insn from INSN. A null argument
13836 resets to TYPE_UNKNOWN state. */
13838 static void
13839 mips_74k_agen_init (rtx_insn *insn)
13841 if (!insn || CALL_P (insn) || JUMP_P (insn))
13842 mips_last_74k_agen_insn = TYPE_UNKNOWN;
13843 else
13845 enum attr_type type = get_attr_type (insn);
13846 if (type == TYPE_LOAD || type == TYPE_STORE)
13847 mips_last_74k_agen_insn = type;
13851 /* A TUNE_74K helper function. The 74K AGEN pipeline likes multiple
13852 loads to be grouped together, and multiple stores to be grouped
13853 together. Swap things around in the ready queue to make this happen. */
13855 static void
13856 mips_74k_agen_reorder (rtx_insn **ready, int nready)
13858 int i;
13859 int store_pos, load_pos;
13861 store_pos = -1;
13862 load_pos = -1;
13864 for (i = nready - 1; i >= 0; i--)
13866 rtx_insn *insn = ready[i];
13867 if (USEFUL_INSN_P (insn))
13868 switch (get_attr_type (insn))
13870 case TYPE_STORE:
13871 if (store_pos == -1)
13872 store_pos = i;
13873 break;
13875 case TYPE_LOAD:
13876 if (load_pos == -1)
13877 load_pos = i;
13878 break;
13880 default:
13881 break;
13885 if (load_pos == -1 || store_pos == -1)
13886 return;
13888 switch (mips_last_74k_agen_insn)
13890 case TYPE_UNKNOWN:
13891 /* Prefer to schedule loads since they have a higher latency. */
13892 case TYPE_LOAD:
13893 /* Swap loads to the front of the queue. */
13894 mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
13895 break;
13896 case TYPE_STORE:
13897 /* Swap stores to the front of the queue. */
13898 mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
13899 break;
13900 default:
13901 break;
13905 /* Implement TARGET_SCHED_INIT. */
13907 static void
13908 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13909 int max_ready ATTRIBUTE_UNUSED)
13911 mips_macc_chains_last_hilo = 0;
13912 vr4130_last_insn = 0;
13913 mips_74k_agen_init (NULL);
13915 /* When scheduling for Loongson2, branch instructions go to ALU1,
13916 therefore basic block is most likely to start with round-robin counter
13917 pointed to ALU2. */
13918 mips_ls2.alu1_turn_p = false;
13919 mips_ls2.falu1_turn_p = true;
13922 /* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2. */
13924 static void
13925 mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13926 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13928 if (!reload_completed
13929 && TUNE_MACC_CHAINS
13930 && *nreadyp > 0)
13931 mips_macc_chains_reorder (ready, *nreadyp);
13933 if (reload_completed
13934 && TUNE_MIPS4130
13935 && !TARGET_VR4130_ALIGN
13936 && *nreadyp > 1)
13937 vr4130_reorder (ready, *nreadyp);
13939 if (TUNE_74K)
13940 mips_74k_agen_reorder (ready, *nreadyp);
13943 /* Implement TARGET_SCHED_REORDER. */
13945 static int
13946 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13947 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13949 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13950 return mips_issue_rate ();
13953 /* Implement TARGET_SCHED_REORDER2. */
13955 static int
13956 mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13957 rtx_insn **ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13959 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13960 return cached_can_issue_more;
13963 /* Update round-robin counters for ALU1/2 and FALU1/2. */
13965 static void
13966 mips_ls2_variable_issue (rtx_insn *insn)
13968 if (mips_ls2.alu1_turn_p)
13970 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
13971 mips_ls2.alu1_turn_p = false;
13973 else
13975 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
13976 mips_ls2.alu1_turn_p = true;
13979 if (mips_ls2.falu1_turn_p)
13981 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
13982 mips_ls2.falu1_turn_p = false;
13984 else
13986 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
13987 mips_ls2.falu1_turn_p = true;
13990 if (recog_memoized (insn) >= 0)
13991 mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
13994 /* Implement TARGET_SCHED_VARIABLE_ISSUE. */
13996 static int
13997 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13998 rtx_insn *insn, int more)
14000 /* Ignore USEs and CLOBBERs; don't count them against the issue rate. */
14001 if (USEFUL_INSN_P (insn))
14003 if (get_attr_type (insn) != TYPE_GHOST)
14004 more--;
14005 if (!reload_completed && TUNE_MACC_CHAINS)
14006 mips_macc_chains_record (insn);
14007 vr4130_last_insn = insn;
14008 if (TUNE_74K)
14009 mips_74k_agen_init (insn);
14010 else if (TUNE_LOONGSON_2EF)
14011 mips_ls2_variable_issue (insn);
14014 /* Instructions of type 'multi' should all be split before
14015 the second scheduling pass. */
14016 gcc_assert (!reload_completed
14017 || recog_memoized (insn) < 0
14018 || get_attr_type (insn) != TYPE_MULTI);
14020 cached_can_issue_more = more;
14021 return more;
14024 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
14025 return the first operand of the associated PREF or PREFX insn. */
14028 mips_prefetch_cookie (rtx write, rtx locality)
14030 /* store_streamed / load_streamed. */
14031 if (INTVAL (locality) <= 0)
14032 return GEN_INT (INTVAL (write) + 4);
14034 /* store / load. */
14035 if (INTVAL (locality) <= 2)
14036 return write;
14038 /* store_retained / load_retained. */
14039 return GEN_INT (INTVAL (write) + 6);
14042 /* Flags that indicate when a built-in function is available.
14044 BUILTIN_AVAIL_NON_MIPS16
14045 The function is available on the current target if !TARGET_MIPS16.
14047 BUILTIN_AVAIL_MIPS16
14048 The function is available on the current target if TARGET_MIPS16. */
14049 #define BUILTIN_AVAIL_NON_MIPS16 1
14050 #define BUILTIN_AVAIL_MIPS16 2
14052 /* Declare an availability predicate for built-in functions that
14053 require non-MIPS16 mode and also require COND to be true.
14054 NAME is the main part of the predicate's name. */
14055 #define AVAIL_NON_MIPS16(NAME, COND) \
14056 static unsigned int \
14057 mips_builtin_avail_##NAME (void) \
14059 return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0; \
14062 /* Declare an availability predicate for built-in functions that
14063 support both MIPS16 and non-MIPS16 code and also require COND
14064 to be true. NAME is the main part of the predicate's name. */
14065 #define AVAIL_ALL(NAME, COND) \
14066 static unsigned int \
14067 mips_builtin_avail_##NAME (void) \
14069 return (COND) ? BUILTIN_AVAIL_NON_MIPS16 | BUILTIN_AVAIL_MIPS16 : 0; \
14072 /* This structure describes a single built-in function. */
14073 struct mips_builtin_description {
14074 /* The code of the main .md file instruction. See mips_builtin_type
14075 for more information. */
14076 enum insn_code icode;
14078 /* The floating-point comparison code to use with ICODE, if any. */
14079 enum mips_fp_condition cond;
14081 /* The name of the built-in function. */
14082 const char *name;
14084 /* Specifies how the function should be expanded. */
14085 enum mips_builtin_type builtin_type;
14087 /* The function's prototype. */
14088 enum mips_function_type function_type;
14090 /* Whether the function is available. */
14091 unsigned int (*avail) (void);
14094 AVAIL_ALL (hard_float, TARGET_HARD_FLOAT_ABI)
14095 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
14096 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
14097 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
14098 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
14099 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
14100 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
14101 AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
14102 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
14103 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
14104 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
14106 /* Construct a mips_builtin_description from the given arguments.
14108 INSN is the name of the associated instruction pattern, without the
14109 leading CODE_FOR_mips_.
14111 CODE is the floating-point condition code associated with the
14112 function. It can be 'f' if the field is not applicable.
14114 NAME is the name of the function itself, without the leading
14115 "__builtin_mips_".
14117 BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
14119 AVAIL is the name of the availability predicate, without the leading
14120 mips_builtin_avail_. */
14121 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE, \
14122 FUNCTION_TYPE, AVAIL) \
14123 { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND, \
14124 "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE, \
14125 mips_builtin_avail_ ## AVAIL }
14127 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
14128 mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE and AVAIL
14129 are as for MIPS_BUILTIN. */
14130 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
14131 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
14133 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
14134 are subject to mips_builtin_avail_<AVAIL>. */
14135 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL) \
14136 MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s", \
14137 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL), \
14138 MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d", \
14139 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
14141 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
14142 The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
14143 while the any and all forms are subject to mips_builtin_avail_mips3d. */
14144 #define CMP_PS_BUILTINS(INSN, COND, AVAIL) \
14145 MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps", \
14146 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, \
14147 mips3d), \
14148 MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps", \
14149 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, \
14150 mips3d), \
14151 MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
14152 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, \
14153 AVAIL), \
14154 MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
14155 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, \
14156 AVAIL)
14158 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s. The functions
14159 are subject to mips_builtin_avail_mips3d. */
14160 #define CMP_4S_BUILTINS(INSN, COND) \
14161 MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s", \
14162 MIPS_BUILTIN_CMP_ANY, \
14163 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d), \
14164 MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s", \
14165 MIPS_BUILTIN_CMP_ALL, \
14166 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
14168 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps. The comparison
14169 instruction requires mips_builtin_avail_<AVAIL>. */
14170 #define MOVTF_BUILTINS(INSN, COND, AVAIL) \
14171 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps", \
14172 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
14173 AVAIL), \
14174 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps", \
14175 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
14176 AVAIL)
14178 /* Define all the built-in functions related to C.cond.fmt condition COND. */
14179 #define CMP_BUILTINS(COND) \
14180 MOVTF_BUILTINS (c, COND, paired_single), \
14181 MOVTF_BUILTINS (cabs, COND, mips3d), \
14182 CMP_SCALAR_BUILTINS (cabs, COND, mips3d), \
14183 CMP_PS_BUILTINS (c, COND, paired_single), \
14184 CMP_PS_BUILTINS (cabs, COND, mips3d), \
14185 CMP_4S_BUILTINS (c, COND), \
14186 CMP_4S_BUILTINS (cabs, COND)
14188 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
14189 function mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE
14190 and AVAIL are as for MIPS_BUILTIN. */
14191 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
14192 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET, \
14193 FUNCTION_TYPE, AVAIL)
14195 /* Define __builtin_mips_bposge<VALUE>. <VALUE> is 32 for the MIPS32 DSP
14196 branch instruction. AVAIL is as for MIPS_BUILTIN. */
14197 #define BPOSGE_BUILTIN(VALUE, AVAIL) \
14198 MIPS_BUILTIN (bposge, f, "bposge" #VALUE, \
14199 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
14201 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
14202 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
14203 builtin_description field. */
14204 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE) \
14205 { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f, \
14206 "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT, \
14207 FUNCTION_TYPE, mips_builtin_avail_loongson }
14209 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
14210 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
14211 builtin_description field. */
14212 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE) \
14213 LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
14215 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
14216 We use functions of this form when the same insn can be usefully applied
14217 to more than one datatype. */
14218 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE) \
14219 LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
14221 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
14222 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
14223 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
14224 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
14225 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
14226 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
14227 #define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
14228 #define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
14230 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
14231 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
14232 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
14233 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
14234 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
14235 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
14236 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
14237 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
14238 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
14239 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
14240 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
14241 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
14242 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
14243 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
14244 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
14245 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
14246 #define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
14247 #define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
14248 #define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
14249 #define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
14250 #define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
14251 #define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
14252 #define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
14253 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
14254 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
14255 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
14256 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
14257 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
14258 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
14259 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
14261 static const struct mips_builtin_description mips_builtins[] = {
14262 #define MIPS_GET_FCSR 0
14263 DIRECT_BUILTIN (get_fcsr, MIPS_USI_FTYPE_VOID, hard_float),
14264 #define MIPS_SET_FCSR 1
14265 DIRECT_NO_TARGET_BUILTIN (set_fcsr, MIPS_VOID_FTYPE_USI, hard_float),
14267 DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14268 DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14269 DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14270 DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
14271 DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
14272 DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
14273 DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
14274 DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
14276 DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
14277 DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14278 DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14279 DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14280 DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
14282 DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
14283 DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
14284 DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14285 DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
14286 DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
14287 DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14289 DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
14290 DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
14291 DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
14292 DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
14293 DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
14294 DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
14296 MIPS_FP_CONDITIONS (CMP_BUILTINS),
14298 /* Built-in functions for the SB-1 processor. */
14299 DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
14301 /* Built-in functions for the DSP ASE (32-bit and 64-bit). */
14302 DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14303 DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14304 DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14305 DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14306 DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14307 DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14308 DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14309 DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14310 DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14311 DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14312 DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
14313 DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
14314 DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
14315 DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
14316 DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
14317 DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
14318 DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
14319 DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14320 DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14321 DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
14322 DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
14323 DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
14324 DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14325 DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14326 DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14327 DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14328 DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14329 DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14330 DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14331 DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14332 DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14333 DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14334 DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14335 DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14336 DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14337 DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14338 DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14339 DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
14340 DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14341 DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14342 DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14343 DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14344 DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14345 DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
14346 DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
14347 DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
14348 DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
14349 DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14350 DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14351 DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14352 DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14353 DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14354 DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14355 DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14356 DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14357 DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14358 DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14359 DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14360 DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14361 DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
14362 DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
14363 DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
14364 DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14365 DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14366 BPOSGE_BUILTIN (32, dsp),
14368 /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit). */
14369 DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
14370 DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14371 DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14372 DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14373 DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14374 DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14375 DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14376 DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14377 DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14378 DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14379 DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14380 DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14381 DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14382 DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14383 DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14384 DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
14385 DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14386 DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14387 DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14388 DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14389 DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14390 DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
14391 DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14392 DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14393 DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14394 DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14395 DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14396 DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14397 DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14398 DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14399 DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14400 DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14401 DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14402 DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14404 /* Built-in functions for the DSP ASE (32-bit only). */
14405 DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14406 DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14407 DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14408 DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14409 DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14410 DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14411 DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14412 DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14413 DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14414 DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14415 DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14416 DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14417 DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14418 DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14419 DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14420 DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14421 DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
14422 DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14423 DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14424 DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
14425 DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
14426 DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14427 DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14428 DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14429 DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14430 DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
14431 DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
14433 /* Built-in functions for the DSP ASE (64-bit only). */
14434 DIRECT_BUILTIN (ldx, MIPS_DI_FTYPE_POINTER_SI, dsp_64),
14436 /* The following are for the MIPS DSP ASE REV 2 (32-bit only). */
14437 DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14438 DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14439 DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14440 DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14441 DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14442 DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14443 DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14444 DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14445 DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14447 /* Builtin functions for ST Microelectronics Loongson-2E/2F cores. */
14448 LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
14449 LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
14450 LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
14451 LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14452 LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14453 LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14454 LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14455 LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14456 LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14457 LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
14458 LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
14459 LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14460 LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14461 LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14462 LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14463 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
14464 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14465 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14466 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14467 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
14468 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
14469 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14470 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14471 LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14472 LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14473 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14474 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14475 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14476 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14477 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14478 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14479 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14480 LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14481 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14482 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14483 LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14484 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14485 LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
14486 LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
14487 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14488 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14489 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14490 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14491 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14492 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14493 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14494 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14495 LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
14496 LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14497 LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14498 LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14499 LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14500 LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
14501 LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
14502 LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14503 LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14504 LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14505 LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
14506 LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14507 LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
14508 LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
14509 LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14510 LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14511 LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14512 LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14513 LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14514 LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14515 LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14516 LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14517 LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14518 LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14519 LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14520 LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14521 LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14522 LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14523 LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14524 LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14525 LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14526 LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14527 LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14528 LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14529 LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
14530 LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
14531 LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14532 LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14533 LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14534 LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14535 LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14536 LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14537 LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14538 LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14539 LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14540 LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14541 LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14542 LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14543 LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14544 LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14545 LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14546 LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14548 /* Sundry other built-in functions. */
14549 DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
14552 /* Index I is the function declaration for mips_builtins[I], or null if the
14553 function isn't defined on this target. */
14554 static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
14556 /* MODE is a vector mode whose elements have type TYPE. Return the type
14557 of the vector itself. */
14559 static tree
14560 mips_builtin_vector_type (tree type, machine_mode mode)
14562 static tree types[2 * (int) MAX_MACHINE_MODE];
14563 int mode_index;
14565 mode_index = (int) mode;
14567 if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
14568 mode_index += MAX_MACHINE_MODE;
14570 if (types[mode_index] == NULL_TREE)
14571 types[mode_index] = build_vector_type_for_mode (type, mode);
14572 return types[mode_index];
14575 /* Return a type for 'const volatile void *'. */
14577 static tree
14578 mips_build_cvpointer_type (void)
14580 static tree cache;
14582 if (cache == NULL_TREE)
14583 cache = build_pointer_type (build_qualified_type
14584 (void_type_node,
14585 TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
14586 return cache;
14589 /* Source-level argument types. */
14590 #define MIPS_ATYPE_VOID void_type_node
14591 #define MIPS_ATYPE_INT integer_type_node
14592 #define MIPS_ATYPE_POINTER ptr_type_node
14593 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
14595 /* Standard mode-based argument types. */
14596 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
14597 #define MIPS_ATYPE_SI intSI_type_node
14598 #define MIPS_ATYPE_USI unsigned_intSI_type_node
14599 #define MIPS_ATYPE_DI intDI_type_node
14600 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
14601 #define MIPS_ATYPE_SF float_type_node
14602 #define MIPS_ATYPE_DF double_type_node
14604 /* Vector argument types. */
14605 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
14606 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
14607 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
14608 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
14609 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
14610 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
14611 #define MIPS_ATYPE_UV2SI \
14612 mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
14613 #define MIPS_ATYPE_UV4HI \
14614 mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
14615 #define MIPS_ATYPE_UV8QI \
14616 mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
14618 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
14619 their associated MIPS_ATYPEs. */
14620 #define MIPS_FTYPE_ATYPES1(A, B) \
14621 MIPS_ATYPE_##A, MIPS_ATYPE_##B
14623 #define MIPS_FTYPE_ATYPES2(A, B, C) \
14624 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
14626 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
14627 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
14629 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
14630 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
14631 MIPS_ATYPE_##E
14633 /* Return the function type associated with function prototype TYPE. */
14635 static tree
14636 mips_build_function_type (enum mips_function_type type)
14638 static tree types[(int) MIPS_MAX_FTYPE_MAX];
14640 if (types[(int) type] == NULL_TREE)
14641 switch (type)
14643 #define DEF_MIPS_FTYPE(NUM, ARGS) \
14644 case MIPS_FTYPE_NAME##NUM ARGS: \
14645 types[(int) type] \
14646 = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS, \
14647 NULL_TREE); \
14648 break;
14649 #include "config/mips/mips-ftypes.def"
14650 #undef DEF_MIPS_FTYPE
14651 default:
14652 gcc_unreachable ();
14655 return types[(int) type];
14658 /* Implement TARGET_INIT_BUILTINS. */
14660 static void
14661 mips_init_builtins (void)
14663 const struct mips_builtin_description *d;
14664 unsigned int i;
14666 /* Iterate through all of the bdesc arrays, initializing all of the
14667 builtin functions. */
14668 for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
14670 d = &mips_builtins[i];
14671 if (d->avail ())
14672 mips_builtin_decls[i]
14673 = add_builtin_function (d->name,
14674 mips_build_function_type (d->function_type),
14675 i, BUILT_IN_MD, NULL, NULL);
14679 /* Implement TARGET_BUILTIN_DECL. */
14681 static tree
14682 mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
14684 if (code >= ARRAY_SIZE (mips_builtins))
14685 return error_mark_node;
14686 return mips_builtin_decls[code];
14689 /* Take argument ARGNO from EXP's argument list and convert it into
14690 an expand operand. Store the operand in *OP. */
14692 static void
14693 mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
14694 unsigned int argno)
14696 tree arg;
14697 rtx value;
14699 arg = CALL_EXPR_ARG (exp, argno);
14700 value = expand_normal (arg);
14701 create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
14704 /* Expand instruction ICODE as part of a built-in function sequence.
14705 Use the first NOPS elements of OPS as the instruction's operands.
14706 HAS_TARGET_P is true if operand 0 is a target; it is false if the
14707 instruction has no target.
14709 Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx. */
14711 static rtx
14712 mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
14713 struct expand_operand *ops, bool has_target_p)
14715 if (!maybe_expand_insn (icode, nops, ops))
14717 error ("invalid argument to built-in function");
14718 return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
14720 return has_target_p ? ops[0].value : const0_rtx;
14723 /* Expand a floating-point comparison for built-in function call EXP.
14724 The first NARGS arguments are the values to be compared. ICODE is
14725 the .md pattern that does the comparison and COND is the condition
14726 that is being tested. Return an rtx for the result. */
14728 static rtx
14729 mips_expand_builtin_compare_1 (enum insn_code icode,
14730 enum mips_fp_condition cond,
14731 tree exp, int nargs)
14733 struct expand_operand ops[MAX_RECOG_OPERANDS];
14734 rtx output;
14735 int opno, argno;
14737 /* The instruction should have a target operand, an operand for each
14738 argument, and an operand for COND. */
14739 gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args);
14741 output = mips_allocate_fcc (insn_data[(int) icode].operand[0].mode);
14742 opno = 0;
14743 create_fixed_operand (&ops[opno++], output);
14744 for (argno = 0; argno < nargs; argno++)
14745 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14746 create_integer_operand (&ops[opno++], (int) cond);
14747 return mips_expand_builtin_insn (icode, opno, ops, true);
14750 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
14751 HAS_TARGET_P says which. EXP is the CALL_EXPR that calls the function
14752 and ICODE is the code of the associated .md pattern. TARGET, if nonnull,
14753 suggests a good place to put the result. */
14755 static rtx
14756 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
14757 bool has_target_p)
14759 struct expand_operand ops[MAX_RECOG_OPERANDS];
14760 int opno, argno;
14762 /* Map any target to operand 0. */
14763 opno = 0;
14764 if (has_target_p)
14765 create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
14767 /* Map the arguments to the other operands. */
14768 gcc_assert (opno + call_expr_nargs (exp)
14769 == insn_data[icode].n_generator_args);
14770 for (argno = 0; argno < call_expr_nargs (exp); argno++)
14771 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14773 return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
14776 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
14777 function; TYPE says which. EXP is the CALL_EXPR that calls the
14778 function, ICODE is the instruction that should be used to compare
14779 the first two arguments, and COND is the condition it should test.
14780 TARGET, if nonnull, suggests a good place to put the result. */
14782 static rtx
14783 mips_expand_builtin_movtf (enum mips_builtin_type type,
14784 enum insn_code icode, enum mips_fp_condition cond,
14785 rtx target, tree exp)
14787 struct expand_operand ops[4];
14788 rtx cmp_result;
14790 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
14791 create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
14792 if (type == MIPS_BUILTIN_MOVT)
14794 mips_prepare_builtin_arg (&ops[2], exp, 2);
14795 mips_prepare_builtin_arg (&ops[1], exp, 3);
14797 else
14799 mips_prepare_builtin_arg (&ops[1], exp, 2);
14800 mips_prepare_builtin_arg (&ops[2], exp, 3);
14802 create_fixed_operand (&ops[3], cmp_result);
14803 return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
14804 4, ops, true);
14807 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
14808 into TARGET otherwise. Return TARGET. */
14810 static rtx
14811 mips_builtin_branch_and_move (rtx condition, rtx target,
14812 rtx value_if_true, rtx value_if_false)
14814 rtx_code_label *true_label, *done_label;
14816 true_label = gen_label_rtx ();
14817 done_label = gen_label_rtx ();
14819 /* First assume that CONDITION is false. */
14820 mips_emit_move (target, value_if_false);
14822 /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise. */
14823 emit_jump_insn (gen_condjump (condition, true_label));
14824 emit_jump_insn (gen_jump (done_label));
14825 emit_barrier ();
14827 /* Fix TARGET if CONDITION is true. */
14828 emit_label (true_label);
14829 mips_emit_move (target, value_if_true);
14831 emit_label (done_label);
14832 return target;
14835 /* Expand a comparison built-in function of type BUILTIN_TYPE. EXP is
14836 the CALL_EXPR that calls the function, ICODE is the code of the
14837 comparison instruction, and COND is the condition it should test.
14838 TARGET, if nonnull, suggests a good place to put the boolean result. */
14840 static rtx
14841 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
14842 enum insn_code icode, enum mips_fp_condition cond,
14843 rtx target, tree exp)
14845 rtx offset, condition, cmp_result;
14847 if (target == 0 || GET_MODE (target) != SImode)
14848 target = gen_reg_rtx (SImode);
14849 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
14850 call_expr_nargs (exp));
14852 /* If the comparison sets more than one register, we define the result
14853 to be 0 if all registers are false and -1 if all registers are true.
14854 The value of the complete result is indeterminate otherwise. */
14855 switch (builtin_type)
14857 case MIPS_BUILTIN_CMP_ALL:
14858 condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
14859 return mips_builtin_branch_and_move (condition, target,
14860 const0_rtx, const1_rtx);
14862 case MIPS_BUILTIN_CMP_UPPER:
14863 case MIPS_BUILTIN_CMP_LOWER:
14864 offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
14865 condition = gen_single_cc (cmp_result, offset);
14866 return mips_builtin_branch_and_move (condition, target,
14867 const1_rtx, const0_rtx);
14869 default:
14870 condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
14871 return mips_builtin_branch_and_move (condition, target,
14872 const1_rtx, const0_rtx);
14876 /* Expand a bposge built-in function of type BUILTIN_TYPE. TARGET,
14877 if nonnull, suggests a good place to put the boolean result. */
14879 static rtx
14880 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
14882 rtx condition, cmp_result;
14883 int cmp_value;
14885 if (target == 0 || GET_MODE (target) != SImode)
14886 target = gen_reg_rtx (SImode);
14888 cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
14890 if (builtin_type == MIPS_BUILTIN_BPOSGE32)
14891 cmp_value = 32;
14892 else
14893 gcc_assert (0);
14895 condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
14896 return mips_builtin_branch_and_move (condition, target,
14897 const1_rtx, const0_rtx);
14900 /* Implement TARGET_EXPAND_BUILTIN. */
14902 static rtx
14903 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
14904 machine_mode mode, int ignore)
14906 tree fndecl;
14907 unsigned int fcode, avail;
14908 const struct mips_builtin_description *d;
14910 fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14911 fcode = DECL_FUNCTION_CODE (fndecl);
14912 gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
14913 d = &mips_builtins[fcode];
14914 avail = d->avail ();
14915 gcc_assert (avail != 0);
14916 if (TARGET_MIPS16 && !(avail & BUILTIN_AVAIL_MIPS16))
14918 error ("built-in function %qE not supported for MIPS16",
14919 DECL_NAME (fndecl));
14920 return ignore ? const0_rtx : CONST0_RTX (mode);
14922 switch (d->builtin_type)
14924 case MIPS_BUILTIN_DIRECT:
14925 return mips_expand_builtin_direct (d->icode, target, exp, true);
14927 case MIPS_BUILTIN_DIRECT_NO_TARGET:
14928 return mips_expand_builtin_direct (d->icode, target, exp, false);
14930 case MIPS_BUILTIN_MOVT:
14931 case MIPS_BUILTIN_MOVF:
14932 return mips_expand_builtin_movtf (d->builtin_type, d->icode,
14933 d->cond, target, exp);
14935 case MIPS_BUILTIN_CMP_ANY:
14936 case MIPS_BUILTIN_CMP_ALL:
14937 case MIPS_BUILTIN_CMP_UPPER:
14938 case MIPS_BUILTIN_CMP_LOWER:
14939 case MIPS_BUILTIN_CMP_SINGLE:
14940 return mips_expand_builtin_compare (d->builtin_type, d->icode,
14941 d->cond, target, exp);
14943 case MIPS_BUILTIN_BPOSGE32:
14944 return mips_expand_builtin_bposge (d->builtin_type, target);
14946 gcc_unreachable ();
14949 /* An entry in the MIPS16 constant pool. VALUE is the pool constant,
14950 MODE is its mode, and LABEL is the CODE_LABEL associated with it. */
14951 struct mips16_constant {
14952 struct mips16_constant *next;
14953 rtx value;
14954 rtx_code_label *label;
14955 machine_mode mode;
14958 /* Information about an incomplete MIPS16 constant pool. FIRST is the
14959 first constant, HIGHEST_ADDRESS is the highest address that the first
14960 byte of the pool can have, and INSN_ADDRESS is the current instruction
14961 address. */
14962 struct mips16_constant_pool {
14963 struct mips16_constant *first;
14964 int highest_address;
14965 int insn_address;
14968 /* Add constant VALUE to POOL and return its label. MODE is the
14969 value's mode (used for CONST_INTs, etc.). */
14971 static rtx_code_label *
14972 mips16_add_constant (struct mips16_constant_pool *pool,
14973 rtx value, machine_mode mode)
14975 struct mips16_constant **p, *c;
14976 bool first_of_size_p;
14978 /* See whether the constant is already in the pool. If so, return the
14979 existing label, otherwise leave P pointing to the place where the
14980 constant should be added.
14982 Keep the pool sorted in increasing order of mode size so that we can
14983 reduce the number of alignments needed. */
14984 first_of_size_p = true;
14985 for (p = &pool->first; *p != 0; p = &(*p)->next)
14987 if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
14988 return (*p)->label;
14989 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
14990 break;
14991 if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
14992 first_of_size_p = false;
14995 /* In the worst case, the constant needed by the earliest instruction
14996 will end up at the end of the pool. The entire pool must then be
14997 accessible from that instruction.
14999 When adding the first constant, set the pool's highest address to
15000 the address of the first out-of-range byte. Adjust this address
15001 downwards each time a new constant is added. */
15002 if (pool->first == 0)
15003 /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
15004 of the instruction with the lowest two bits clear. The base PC
15005 value for LDPC has the lowest three bits clear. Assume the worst
15006 case here; namely that the PC-relative instruction occupies the
15007 last 2 bytes in an aligned word. */
15008 pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
15009 pool->highest_address -= GET_MODE_SIZE (mode);
15010 if (first_of_size_p)
15011 /* Take into account the worst possible padding due to alignment. */
15012 pool->highest_address -= GET_MODE_SIZE (mode) - 1;
15014 /* Create a new entry. */
15015 c = XNEW (struct mips16_constant);
15016 c->value = value;
15017 c->mode = mode;
15018 c->label = gen_label_rtx ();
15019 c->next = *p;
15020 *p = c;
15022 return c->label;
15025 /* Output constant VALUE after instruction INSN and return the last
15026 instruction emitted. MODE is the mode of the constant. */
15028 static rtx_insn *
15029 mips16_emit_constants_1 (machine_mode mode, rtx value, rtx_insn *insn)
15031 if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
15033 rtx size = GEN_INT (GET_MODE_SIZE (mode));
15034 return emit_insn_after (gen_consttable_int (value, size), insn);
15037 if (SCALAR_FLOAT_MODE_P (mode))
15038 return emit_insn_after (gen_consttable_float (value), insn);
15040 if (VECTOR_MODE_P (mode))
15042 int i;
15044 for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
15045 insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
15046 CONST_VECTOR_ELT (value, i), insn);
15047 return insn;
15050 gcc_unreachable ();
15053 /* Dump out the constants in CONSTANTS after INSN. */
15055 static void
15056 mips16_emit_constants (struct mips16_constant *constants, rtx_insn *insn)
15058 struct mips16_constant *c, *next;
15059 int align;
15061 align = 0;
15062 for (c = constants; c != NULL; c = next)
15064 /* If necessary, increase the alignment of PC. */
15065 if (align < GET_MODE_SIZE (c->mode))
15067 int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
15068 insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
15070 align = GET_MODE_SIZE (c->mode);
15072 insn = emit_label_after (c->label, insn);
15073 insn = mips16_emit_constants_1 (c->mode, c->value, insn);
15075 next = c->next;
15076 free (c);
15079 emit_barrier_after (insn);
15082 /* Return the length of instruction INSN. */
15084 static int
15085 mips16_insn_length (rtx_insn *insn)
15087 if (JUMP_TABLE_DATA_P (insn))
15089 rtx body = PATTERN (insn);
15090 if (GET_CODE (body) == ADDR_VEC)
15091 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
15092 else if (GET_CODE (body) == ADDR_DIFF_VEC)
15093 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
15094 else
15095 gcc_unreachable ();
15097 return get_attr_length (insn);
15100 /* If *X is a symbolic constant that refers to the constant pool, add
15101 the constant to POOL and rewrite *X to use the constant's label. */
15103 static void
15104 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
15106 rtx base, offset;
15107 rtx_code_label *label;
15109 split_const (*x, &base, &offset);
15110 if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
15112 label = mips16_add_constant (pool, copy_rtx (get_pool_constant (base)),
15113 get_pool_mode (base));
15114 base = gen_rtx_LABEL_REF (Pmode, label);
15115 *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
15119 /* Rewrite INSN so that constant pool references refer to the constant's
15120 label instead. */
15122 static void
15123 mips16_rewrite_pool_refs (rtx_insn *insn, struct mips16_constant_pool *pool)
15125 subrtx_ptr_iterator::array_type array;
15126 FOR_EACH_SUBRTX_PTR (iter, array, &PATTERN (insn), ALL)
15128 rtx *loc = *iter;
15130 if (force_to_mem_operand (*loc, Pmode))
15132 rtx mem = force_const_mem (GET_MODE (*loc), *loc);
15133 validate_change (insn, loc, mem, false);
15136 if (MEM_P (*loc))
15138 mips16_rewrite_pool_constant (pool, &XEXP (*loc, 0));
15139 iter.skip_subrtxes ();
15141 else
15143 if (TARGET_MIPS16_TEXT_LOADS)
15144 mips16_rewrite_pool_constant (pool, loc);
15145 if (GET_CODE (*loc) == CONST
15146 /* Don't rewrite the __mips16_rdwr symbol. */
15147 || (GET_CODE (*loc) == UNSPEC
15148 && XINT (*loc, 1) == UNSPEC_TLS_GET_TP))
15149 iter.skip_subrtxes ();
15154 /* Return whether CFG is used in mips_reorg. */
15156 static bool
15157 mips_cfg_in_reorg (void)
15159 return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
15160 || TARGET_RELAX_PIC_CALLS);
15163 /* Build MIPS16 constant pools. Split the instructions if SPLIT_P,
15164 otherwise assume that they are already split. */
15166 static void
15167 mips16_lay_out_constants (bool split_p)
15169 struct mips16_constant_pool pool;
15170 rtx_insn *insn, *barrier;
15172 if (!TARGET_MIPS16_PCREL_LOADS)
15173 return;
15175 if (split_p)
15177 if (mips_cfg_in_reorg ())
15178 split_all_insns ();
15179 else
15180 split_all_insns_noflow ();
15182 barrier = 0;
15183 memset (&pool, 0, sizeof (pool));
15184 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
15186 /* Rewrite constant pool references in INSN. */
15187 if (USEFUL_INSN_P (insn))
15188 mips16_rewrite_pool_refs (insn, &pool);
15190 pool.insn_address += mips16_insn_length (insn);
15192 if (pool.first != NULL)
15194 /* If there are no natural barriers between the first user of
15195 the pool and the highest acceptable address, we'll need to
15196 create a new instruction to jump around the constant pool.
15197 In the worst case, this instruction will be 4 bytes long.
15199 If it's too late to do this transformation after INSN,
15200 do it immediately before INSN. */
15201 if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
15203 rtx_code_label *label;
15204 rtx_insn *jump;
15206 label = gen_label_rtx ();
15208 jump = emit_jump_insn_before (gen_jump (label), insn);
15209 JUMP_LABEL (jump) = label;
15210 LABEL_NUSES (label) = 1;
15211 barrier = emit_barrier_after (jump);
15213 emit_label_after (label, barrier);
15214 pool.insn_address += 4;
15217 /* See whether the constant pool is now out of range of the first
15218 user. If so, output the constants after the previous barrier.
15219 Note that any instructions between BARRIER and INSN (inclusive)
15220 will use negative offsets to refer to the pool. */
15221 if (pool.insn_address > pool.highest_address)
15223 mips16_emit_constants (pool.first, barrier);
15224 pool.first = NULL;
15225 barrier = 0;
15227 else if (BARRIER_P (insn))
15228 barrier = insn;
15231 mips16_emit_constants (pool.first, get_last_insn ());
15234 /* Return true if it is worth r10k_simplify_address's while replacing
15235 an address with X. We are looking for constants, and for addresses
15236 at a known offset from the incoming stack pointer. */
15238 static bool
15239 r10k_simplified_address_p (rtx x)
15241 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
15242 x = XEXP (x, 0);
15243 return x == virtual_incoming_args_rtx || CONSTANT_P (x);
15246 /* X is an expression that appears in INSN. Try to use the UD chains
15247 to simplify it, returning the simplified form on success and the
15248 original form otherwise. Replace the incoming value of $sp with
15249 virtual_incoming_args_rtx (which should never occur in X otherwise). */
15251 static rtx
15252 r10k_simplify_address (rtx x, rtx_insn *insn)
15254 rtx newx, op0, op1, set, note;
15255 rtx_insn *def_insn;
15256 df_ref use, def;
15257 struct df_link *defs;
15259 newx = NULL_RTX;
15260 if (UNARY_P (x))
15262 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15263 if (op0 != XEXP (x, 0))
15264 newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
15265 op0, GET_MODE (XEXP (x, 0)));
15267 else if (BINARY_P (x))
15269 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15270 op1 = r10k_simplify_address (XEXP (x, 1), insn);
15271 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
15272 newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
15274 else if (GET_CODE (x) == LO_SUM)
15276 /* LO_SUMs can be offset from HIGHs, if we know they won't
15277 overflow. See mips_classify_address for the rationale behind
15278 the lax check. */
15279 op0 = r10k_simplify_address (XEXP (x, 0), insn);
15280 if (GET_CODE (op0) == HIGH)
15281 newx = XEXP (x, 1);
15283 else if (REG_P (x))
15285 /* Uses are recorded by regno_reg_rtx, not X itself. */
15286 use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
15287 gcc_assert (use);
15288 defs = DF_REF_CHAIN (use);
15290 /* Require a single definition. */
15291 if (defs && defs->next == NULL)
15293 def = defs->ref;
15294 if (DF_REF_IS_ARTIFICIAL (def))
15296 /* Replace the incoming value of $sp with
15297 virtual_incoming_args_rtx. */
15298 if (x == stack_pointer_rtx
15299 && DF_REF_BB (def) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
15300 newx = virtual_incoming_args_rtx;
15302 else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
15303 DF_REF_BB (def)))
15305 /* Make sure that DEF_INSN is a single set of REG. */
15306 def_insn = DF_REF_INSN (def);
15307 if (NONJUMP_INSN_P (def_insn))
15309 set = single_set (def_insn);
15310 if (set && rtx_equal_p (SET_DEST (set), x))
15312 /* Prefer to use notes, since the def-use chains
15313 are often shorter. */
15314 note = find_reg_equal_equiv_note (def_insn);
15315 if (note)
15316 newx = XEXP (note, 0);
15317 else
15318 newx = SET_SRC (set);
15319 newx = r10k_simplify_address (newx, def_insn);
15325 if (newx && r10k_simplified_address_p (newx))
15326 return newx;
15327 return x;
15330 /* Return true if ADDRESS is known to be an uncached address
15331 on R10K systems. */
15333 static bool
15334 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
15336 unsigned HOST_WIDE_INT upper;
15338 /* Check for KSEG1. */
15339 if (address + 0x60000000 < 0x20000000)
15340 return true;
15342 /* Check for uncached XKPHYS addresses. */
15343 if (Pmode == DImode)
15345 upper = (address >> 40) & 0xf9ffff;
15346 if (upper == 0x900000 || upper == 0xb80000)
15347 return true;
15349 return false;
15352 /* Return true if we can prove that an access to address X in instruction
15353 INSN would be safe from R10K speculation. This X is a general
15354 expression; it might not be a legitimate address. */
15356 static bool
15357 r10k_safe_address_p (rtx x, rtx_insn *insn)
15359 rtx base, offset;
15360 HOST_WIDE_INT offset_val;
15362 x = r10k_simplify_address (x, insn);
15364 /* Check for references to the stack frame. It doesn't really matter
15365 how much of the frame has been allocated at INSN; -mr10k-cache-barrier
15366 allows us to assume that accesses to any part of the eventual frame
15367 is safe from speculation at any point in the function. */
15368 mips_split_plus (x, &base, &offset_val);
15369 if (base == virtual_incoming_args_rtx
15370 && offset_val >= -cfun->machine->frame.total_size
15371 && offset_val < cfun->machine->frame.args_size)
15372 return true;
15374 /* Check for uncached addresses. */
15375 if (CONST_INT_P (x))
15376 return r10k_uncached_address_p (INTVAL (x));
15378 /* Check for accesses to a static object. */
15379 split_const (x, &base, &offset);
15380 return offset_within_block_p (base, INTVAL (offset));
15383 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
15384 an in-range access to an automatic variable, or to an object with
15385 a link-time-constant address. */
15387 static bool
15388 r10k_safe_mem_expr_p (tree expr, unsigned HOST_WIDE_INT offset)
15390 HOST_WIDE_INT bitoffset, bitsize;
15391 tree inner, var_offset;
15392 machine_mode mode;
15393 int unsigned_p, volatile_p;
15395 inner = get_inner_reference (expr, &bitsize, &bitoffset, &var_offset, &mode,
15396 &unsigned_p, &volatile_p, false);
15397 if (!DECL_P (inner) || !DECL_SIZE_UNIT (inner) || var_offset)
15398 return false;
15400 offset += bitoffset / BITS_PER_UNIT;
15401 return offset < tree_to_uhwi (DECL_SIZE_UNIT (inner));
15404 /* Return true if X contains a MEM that is not safe from R10K speculation.
15405 INSN is the instruction that contains X. */
15407 static bool
15408 r10k_needs_protection_p_1 (rtx x, rtx_insn *insn)
15410 subrtx_var_iterator::array_type array;
15411 FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
15413 rtx mem = *iter;
15414 if (MEM_P (mem))
15416 if ((MEM_EXPR (mem)
15417 && MEM_OFFSET_KNOWN_P (mem)
15418 && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
15419 || r10k_safe_address_p (XEXP (mem, 0), insn))
15420 iter.skip_subrtxes ();
15421 else
15422 return true;
15425 return false;
15428 /* A note_stores callback for which DATA points to an instruction pointer.
15429 If *DATA is nonnull, make it null if it X contains a MEM that is not
15430 safe from R10K speculation. */
15432 static void
15433 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
15434 void *data)
15436 rtx_insn **insn_ptr;
15438 insn_ptr = (rtx_insn **) data;
15439 if (*insn_ptr && r10k_needs_protection_p_1 (x, *insn_ptr))
15440 *insn_ptr = NULL;
15443 /* X is the pattern of a call instruction. Return true if the call is
15444 not to a declared function. */
15446 static bool
15447 r10k_needs_protection_p_call (const_rtx x)
15449 subrtx_iterator::array_type array;
15450 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
15452 const_rtx mem = *iter;
15453 if (MEM_P (mem))
15455 const_rtx addr = XEXP (mem, 0);
15456 if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DECL (addr))
15457 iter.skip_subrtxes ();
15458 else
15459 return true;
15462 return false;
15465 /* Return true if instruction INSN needs to be protected by an R10K
15466 cache barrier. */
15468 static bool
15469 r10k_needs_protection_p (rtx_insn *insn)
15471 if (CALL_P (insn))
15472 return r10k_needs_protection_p_call (PATTERN (insn));
15474 if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
15476 note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
15477 return insn == NULL_RTX;
15480 return r10k_needs_protection_p_1 (PATTERN (insn), insn);
15483 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
15484 edge is unconditional. */
15486 static bool
15487 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
15489 edge_iterator ei;
15490 edge e;
15492 FOR_EACH_EDGE (e, ei, bb->preds)
15493 if (!single_succ_p (e->src)
15494 || !bitmap_bit_p (protected_bbs, e->src->index)
15495 || (e->flags & EDGE_COMPLEX) != 0)
15496 return false;
15497 return true;
15500 /* Implement -mr10k-cache-barrier= for the current function. */
15502 static void
15503 r10k_insert_cache_barriers (void)
15505 int *rev_post_order;
15506 unsigned int i, n;
15507 basic_block bb;
15508 sbitmap protected_bbs;
15509 rtx_insn *insn, *end;
15510 rtx unprotected_region;
15512 if (TARGET_MIPS16)
15514 sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
15515 return;
15518 /* Calculate dominators. */
15519 calculate_dominance_info (CDI_DOMINATORS);
15521 /* Bit X of PROTECTED_BBS is set if the last operation in basic block
15522 X is protected by a cache barrier. */
15523 protected_bbs = sbitmap_alloc (last_basic_block_for_fn (cfun));
15524 bitmap_clear (protected_bbs);
15526 /* Iterate over the basic blocks in reverse post-order. */
15527 rev_post_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
15528 n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
15529 for (i = 0; i < n; i++)
15531 bb = BASIC_BLOCK_FOR_FN (cfun, rev_post_order[i]);
15533 /* If this block is only reached by unconditional edges, and if the
15534 source of every edge is protected, the beginning of the block is
15535 also protected. */
15536 if (r10k_protected_bb_p (bb, protected_bbs))
15537 unprotected_region = NULL_RTX;
15538 else
15539 unprotected_region = pc_rtx;
15540 end = NEXT_INSN (BB_END (bb));
15542 /* UNPROTECTED_REGION is:
15544 - null if we are processing a protected region,
15545 - pc_rtx if we are processing an unprotected region but have
15546 not yet found the first instruction in it
15547 - the first instruction in an unprotected region otherwise. */
15548 for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
15550 if (unprotected_region && USEFUL_INSN_P (insn))
15552 if (recog_memoized (insn) == CODE_FOR_mips_cache)
15553 /* This CACHE instruction protects the following code. */
15554 unprotected_region = NULL_RTX;
15555 else
15557 /* See if INSN is the first instruction in this
15558 unprotected region. */
15559 if (unprotected_region == pc_rtx)
15560 unprotected_region = insn;
15562 /* See if INSN needs to be protected. If so,
15563 we must insert a cache barrier somewhere between
15564 PREV_INSN (UNPROTECTED_REGION) and INSN. It isn't
15565 clear which position is better performance-wise,
15566 but as a tie-breaker, we assume that it is better
15567 to allow delay slots to be back-filled where
15568 possible, and that it is better not to insert
15569 barriers in the middle of already-scheduled code.
15570 We therefore insert the barrier at the beginning
15571 of the region. */
15572 if (r10k_needs_protection_p (insn))
15574 emit_insn_before (gen_r10k_cache_barrier (),
15575 unprotected_region);
15576 unprotected_region = NULL_RTX;
15581 if (CALL_P (insn))
15582 /* The called function is not required to protect the exit path.
15583 The code that follows a call is therefore unprotected. */
15584 unprotected_region = pc_rtx;
15587 /* Record whether the end of this block is protected. */
15588 if (unprotected_region == NULL_RTX)
15589 bitmap_set_bit (protected_bbs, bb->index);
15591 XDELETEVEC (rev_post_order);
15593 sbitmap_free (protected_bbs);
15595 free_dominance_info (CDI_DOMINATORS);
15598 /* If INSN is a call, return the underlying CALL expr. Return NULL_RTX
15599 otherwise. If INSN has two call rtx, then store the second one in
15600 SECOND_CALL. */
15602 static rtx
15603 mips_call_expr_from_insn (rtx_insn *insn, rtx *second_call)
15605 rtx x;
15606 rtx x2;
15608 if (!CALL_P (insn))
15609 return NULL_RTX;
15611 x = PATTERN (insn);
15612 if (GET_CODE (x) == PARALLEL)
15614 /* Calls returning complex values have two CALL rtx. Look for the second
15615 one here, and return it via the SECOND_CALL arg. */
15616 x2 = XVECEXP (x, 0, 1);
15617 if (GET_CODE (x2) == SET)
15618 x2 = XEXP (x2, 1);
15619 if (GET_CODE (x2) == CALL)
15620 *second_call = x2;
15622 x = XVECEXP (x, 0, 0);
15624 if (GET_CODE (x) == SET)
15625 x = XEXP (x, 1);
15626 gcc_assert (GET_CODE (x) == CALL);
15628 return x;
15631 /* REG is set in DEF. See if the definition is one of the ways we load a
15632 register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
15633 If it is, return the symbol reference of the function, otherwise return
15634 NULL_RTX.
15636 If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
15637 the values of source registers, otherwise treat such registers as
15638 having an unknown value. */
15640 static rtx
15641 mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
15643 rtx_insn *def_insn;
15644 rtx set;
15646 if (DF_REF_IS_ARTIFICIAL (def))
15647 return NULL_RTX;
15649 def_insn = DF_REF_INSN (def);
15650 set = single_set (def_insn);
15651 if (set && rtx_equal_p (SET_DEST (set), reg))
15653 rtx note, src, symbol;
15655 /* First see whether the source is a plain symbol. This is used
15656 when calling symbols that are not lazily bound. */
15657 src = SET_SRC (set);
15658 if (GET_CODE (src) == SYMBOL_REF)
15659 return src;
15661 /* Handle %call16 references. */
15662 symbol = mips_strip_unspec_call (src);
15663 if (symbol)
15665 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15666 return symbol;
15669 /* If we have something more complicated, look for a
15670 REG_EQUAL or REG_EQUIV note. */
15671 note = find_reg_equal_equiv_note (def_insn);
15672 if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
15673 return XEXP (note, 0);
15675 /* Follow at most one simple register copy. Such copies are
15676 interesting in cases like:
15678 for (...)
15680 locally_binding_fn (...);
15683 and:
15685 locally_binding_fn (...);
15687 locally_binding_fn (...);
15689 where the load of locally_binding_fn can legitimately be
15690 hoisted or shared. However, we do not expect to see complex
15691 chains of copies, so a full worklist solution to the problem
15692 would probably be overkill. */
15693 if (recurse_p && REG_P (src))
15694 return mips_find_pic_call_symbol (def_insn, src, false);
15697 return NULL_RTX;
15700 /* Find the definition of the use of REG in INSN. See if the definition
15701 is one of the ways we load a register with a symbol address for a
15702 mips_use_pic_fn_addr_reg_p call. If it is return the symbol reference
15703 of the function, otherwise return NULL_RTX. RECURSE_P is as for
15704 mips_pic_call_symbol_from_set. */
15706 static rtx
15707 mips_find_pic_call_symbol (rtx_insn *insn, rtx reg, bool recurse_p)
15709 df_ref use;
15710 struct df_link *defs;
15711 rtx symbol;
15713 use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
15714 if (!use)
15715 return NULL_RTX;
15716 defs = DF_REF_CHAIN (use);
15717 if (!defs)
15718 return NULL_RTX;
15719 symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15720 if (!symbol)
15721 return NULL_RTX;
15723 /* If we have more than one definition, they need to be identical. */
15724 for (defs = defs->next; defs; defs = defs->next)
15726 rtx other;
15728 other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15729 if (!rtx_equal_p (symbol, other))
15730 return NULL_RTX;
15733 return symbol;
15736 /* Replace the args_size operand of the call expression CALL with the
15737 call-attribute UNSPEC and fill in SYMBOL as the function symbol. */
15739 static void
15740 mips_annotate_pic_call_expr (rtx call, rtx symbol)
15742 rtx args_size;
15744 args_size = XEXP (call, 1);
15745 XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
15746 gen_rtvec (2, args_size, symbol),
15747 UNSPEC_CALL_ATTR);
15750 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression. See
15751 if instead of the arg_size argument it contains the call attributes. If
15752 yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
15753 symbol from the call attributes. Also return false if ARGS_SIZE_OPNO is
15754 -1. */
15756 bool
15757 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
15759 rtx args_size, symbol;
15761 if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
15762 return false;
15764 args_size = operands[args_size_opno];
15765 if (GET_CODE (args_size) != UNSPEC)
15766 return false;
15767 gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
15769 symbol = XVECEXP (args_size, 0, 1);
15770 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15772 operands[args_size_opno] = symbol;
15773 return true;
15776 /* Use DF to annotate PIC indirect calls with the function symbol they
15777 dispatch to. */
15779 static void
15780 mips_annotate_pic_calls (void)
15782 basic_block bb;
15783 rtx_insn *insn;
15785 FOR_EACH_BB_FN (bb, cfun)
15786 FOR_BB_INSNS (bb, insn)
15788 rtx call, reg, symbol, second_call;
15790 second_call = 0;
15791 call = mips_call_expr_from_insn (insn, &second_call);
15792 if (!call)
15793 continue;
15794 gcc_assert (MEM_P (XEXP (call, 0)));
15795 reg = XEXP (XEXP (call, 0), 0);
15796 if (!REG_P (reg))
15797 continue;
15799 symbol = mips_find_pic_call_symbol (insn, reg, true);
15800 if (symbol)
15802 mips_annotate_pic_call_expr (call, symbol);
15803 if (second_call)
15804 mips_annotate_pic_call_expr (second_call, symbol);
15809 /* A temporary variable used by note_uses callbacks, etc. */
15810 static rtx_insn *mips_sim_insn;
15812 /* A structure representing the state of the processor pipeline.
15813 Used by the mips_sim_* family of functions. */
15814 struct mips_sim {
15815 /* The maximum number of instructions that can be issued in a cycle.
15816 (Caches mips_issue_rate.) */
15817 unsigned int issue_rate;
15819 /* The current simulation time. */
15820 unsigned int time;
15822 /* How many more instructions can be issued in the current cycle. */
15823 unsigned int insns_left;
15825 /* LAST_SET[X].INSN is the last instruction to set register X.
15826 LAST_SET[X].TIME is the time at which that instruction was issued.
15827 INSN is null if no instruction has yet set register X. */
15828 struct {
15829 rtx_insn *insn;
15830 unsigned int time;
15831 } last_set[FIRST_PSEUDO_REGISTER];
15833 /* The pipeline's current DFA state. */
15834 state_t dfa_state;
15837 /* Reset STATE to the initial simulation state. */
15839 static void
15840 mips_sim_reset (struct mips_sim *state)
15842 curr_state = state->dfa_state;
15844 state->time = 0;
15845 state->insns_left = state->issue_rate;
15846 memset (&state->last_set, 0, sizeof (state->last_set));
15847 state_reset (curr_state);
15849 targetm.sched.init (0, false, 0);
15850 advance_state (curr_state);
15853 /* Initialize STATE before its first use. DFA_STATE points to an
15854 allocated but uninitialized DFA state. */
15856 static void
15857 mips_sim_init (struct mips_sim *state, state_t dfa_state)
15859 if (targetm.sched.init_dfa_pre_cycle_insn)
15860 targetm.sched.init_dfa_pre_cycle_insn ();
15862 if (targetm.sched.init_dfa_post_cycle_insn)
15863 targetm.sched.init_dfa_post_cycle_insn ();
15865 state->issue_rate = mips_issue_rate ();
15866 state->dfa_state = dfa_state;
15867 mips_sim_reset (state);
15870 /* Advance STATE by one clock cycle. */
15872 static void
15873 mips_sim_next_cycle (struct mips_sim *state)
15875 curr_state = state->dfa_state;
15877 state->time++;
15878 state->insns_left = state->issue_rate;
15879 advance_state (curr_state);
15882 /* Advance simulation state STATE until instruction INSN can read
15883 register REG. */
15885 static void
15886 mips_sim_wait_reg (struct mips_sim *state, rtx_insn *insn, rtx reg)
15888 unsigned int regno, end_regno;
15890 end_regno = END_REGNO (reg);
15891 for (regno = REGNO (reg); regno < end_regno; regno++)
15892 if (state->last_set[regno].insn != 0)
15894 unsigned int t;
15896 t = (state->last_set[regno].time
15897 + insn_latency (state->last_set[regno].insn, insn));
15898 while (state->time < t)
15899 mips_sim_next_cycle (state);
15903 /* A note_uses callback. For each register in *X, advance simulation
15904 state DATA until mips_sim_insn can read the register's value. */
15906 static void
15907 mips_sim_wait_regs_1 (rtx *x, void *data)
15909 subrtx_var_iterator::array_type array;
15910 FOR_EACH_SUBRTX_VAR (iter, array, *x, NONCONST)
15911 if (REG_P (*iter))
15912 mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *iter);
15915 /* Advance simulation state STATE until all of INSN's register
15916 dependencies are satisfied. */
15918 static void
15919 mips_sim_wait_regs (struct mips_sim *state, rtx_insn *insn)
15921 mips_sim_insn = insn;
15922 note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
15925 /* Advance simulation state STATE until the units required by
15926 instruction INSN are available. */
15928 static void
15929 mips_sim_wait_units (struct mips_sim *state, rtx_insn *insn)
15931 state_t tmp_state;
15933 tmp_state = alloca (state_size ());
15934 while (state->insns_left == 0
15935 || (memcpy (tmp_state, state->dfa_state, state_size ()),
15936 state_transition (tmp_state, insn) >= 0))
15937 mips_sim_next_cycle (state);
15940 /* Advance simulation state STATE until INSN is ready to issue. */
15942 static void
15943 mips_sim_wait_insn (struct mips_sim *state, rtx_insn *insn)
15945 mips_sim_wait_regs (state, insn);
15946 mips_sim_wait_units (state, insn);
15949 /* mips_sim_insn has just set X. Update the LAST_SET array
15950 in simulation state DATA. */
15952 static void
15953 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
15955 struct mips_sim *state;
15957 state = (struct mips_sim *) data;
15958 if (REG_P (x))
15960 unsigned int regno, end_regno;
15962 end_regno = END_REGNO (x);
15963 for (regno = REGNO (x); regno < end_regno; regno++)
15965 state->last_set[regno].insn = mips_sim_insn;
15966 state->last_set[regno].time = state->time;
15971 /* Issue instruction INSN in scheduler state STATE. Assume that INSN
15972 can issue immediately (i.e., that mips_sim_wait_insn has already
15973 been called). */
15975 static void
15976 mips_sim_issue_insn (struct mips_sim *state, rtx_insn *insn)
15978 curr_state = state->dfa_state;
15980 state_transition (curr_state, insn);
15981 state->insns_left = targetm.sched.variable_issue (0, false, insn,
15982 state->insns_left);
15984 mips_sim_insn = insn;
15985 note_stores (PATTERN (insn), mips_sim_record_set, state);
15988 /* Simulate issuing a NOP in state STATE. */
15990 static void
15991 mips_sim_issue_nop (struct mips_sim *state)
15993 if (state->insns_left == 0)
15994 mips_sim_next_cycle (state);
15995 state->insns_left--;
15998 /* Update simulation state STATE so that it's ready to accept the instruction
15999 after INSN. INSN should be part of the main rtl chain, not a member of a
16000 SEQUENCE. */
16002 static void
16003 mips_sim_finish_insn (struct mips_sim *state, rtx_insn *insn)
16005 /* If INSN is a jump with an implicit delay slot, simulate a nop. */
16006 if (JUMP_P (insn))
16007 mips_sim_issue_nop (state);
16009 switch (GET_CODE (SEQ_BEGIN (insn)))
16011 case CODE_LABEL:
16012 case CALL_INSN:
16013 /* We can't predict the processor state after a call or label. */
16014 mips_sim_reset (state);
16015 break;
16017 case JUMP_INSN:
16018 /* The delay slots of branch likely instructions are only executed
16019 when the branch is taken. Therefore, if the caller has simulated
16020 the delay slot instruction, STATE does not really reflect the state
16021 of the pipeline for the instruction after the delay slot. Also,
16022 branch likely instructions tend to incur a penalty when not taken,
16023 so there will probably be an extra delay between the branch and
16024 the instruction after the delay slot. */
16025 if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
16026 mips_sim_reset (state);
16027 break;
16029 default:
16030 break;
16034 /* Use simulator state STATE to calculate the execution time of
16035 instruction sequence SEQ. */
16037 static unsigned int
16038 mips_seq_time (struct mips_sim *state, rtx_insn *seq)
16040 mips_sim_reset (state);
16041 for (rtx_insn *insn = seq; insn; insn = NEXT_INSN (insn))
16043 mips_sim_wait_insn (state, insn);
16044 mips_sim_issue_insn (state, insn);
16046 return state->time;
16049 /* Return the execution-time cost of mips_tuning_info.fast_mult_zero_zero_p
16050 setting SETTING, using STATE to simulate instruction sequences. */
16052 static unsigned int
16053 mips_mult_zero_zero_cost (struct mips_sim *state, bool setting)
16055 mips_tuning_info.fast_mult_zero_zero_p = setting;
16056 start_sequence ();
16058 machine_mode dword_mode = TARGET_64BIT ? TImode : DImode;
16059 rtx hilo = gen_rtx_REG (dword_mode, MD_REG_FIRST);
16060 mips_emit_move_or_split (hilo, const0_rtx, SPLIT_FOR_SPEED);
16062 /* If the target provides mulsidi3_32bit then that's the most likely
16063 consumer of the result. Test for bypasses. */
16064 if (dword_mode == DImode && HAVE_maddsidi4)
16066 rtx gpr = gen_rtx_REG (SImode, GP_REG_FIRST + 4);
16067 emit_insn (gen_maddsidi4 (hilo, gpr, gpr, hilo));
16070 unsigned int time = mips_seq_time (state, get_insns ());
16071 end_sequence ();
16072 return time;
16075 /* Check the relative speeds of "MULT $0,$0" and "MTLO $0; MTHI $0"
16076 and set up mips_tuning_info.fast_mult_zero_zero_p accordingly.
16077 Prefer MULT -- which is shorter -- in the event of a tie. */
16079 static void
16080 mips_set_fast_mult_zero_zero_p (struct mips_sim *state)
16082 if (TARGET_MIPS16 || !ISA_HAS_HILO)
16083 /* No MTLO or MTHI available for MIPS16. Also, when there are no HI or LO
16084 registers then there is no reason to zero them, arbitrarily choose to
16085 say that "MULT $0,$0" would be faster. */
16086 mips_tuning_info.fast_mult_zero_zero_p = true;
16087 else
16089 unsigned int true_time = mips_mult_zero_zero_cost (state, true);
16090 unsigned int false_time = mips_mult_zero_zero_cost (state, false);
16091 mips_tuning_info.fast_mult_zero_zero_p = (true_time <= false_time);
16095 /* Set up costs based on the current architecture and tuning settings. */
16097 static void
16098 mips_set_tuning_info (void)
16100 if (mips_tuning_info.initialized_p
16101 && mips_tuning_info.arch == mips_arch
16102 && mips_tuning_info.tune == mips_tune
16103 && mips_tuning_info.mips16_p == TARGET_MIPS16)
16104 return;
16106 mips_tuning_info.arch = mips_arch;
16107 mips_tuning_info.tune = mips_tune;
16108 mips_tuning_info.mips16_p = TARGET_MIPS16;
16109 mips_tuning_info.initialized_p = true;
16111 dfa_start ();
16113 struct mips_sim state;
16114 mips_sim_init (&state, alloca (state_size ()));
16116 mips_set_fast_mult_zero_zero_p (&state);
16118 dfa_finish ();
16121 /* Implement TARGET_EXPAND_TO_RTL_HOOK. */
16123 static void
16124 mips_expand_to_rtl_hook (void)
16126 /* We need to call this at a point where we can safely create sequences
16127 of instructions, so TARGET_OVERRIDE_OPTIONS is too early. We also
16128 need to call it at a point where the DFA infrastructure is not
16129 already in use, so we can't just call it lazily on demand.
16131 At present, mips_tuning_info is only needed during post-expand
16132 RTL passes such as split_insns, so this hook should be early enough.
16133 We may need to move the call elsewhere if mips_tuning_info starts
16134 to be used for other things (such as rtx_costs, or expanders that
16135 could be called during gimple optimization). */
16136 mips_set_tuning_info ();
16139 /* The VR4130 pipeline issues aligned pairs of instructions together,
16140 but it stalls the second instruction if it depends on the first.
16141 In order to cut down the amount of logic required, this dependence
16142 check is not based on a full instruction decode. Instead, any non-SPECIAL
16143 instruction is assumed to modify the register specified by bits 20-16
16144 (which is usually the "rt" field).
16146 In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
16147 input, so we can end up with a false dependence between the branch
16148 and its delay slot. If this situation occurs in instruction INSN,
16149 try to avoid it by swapping rs and rt. */
16151 static void
16152 vr4130_avoid_branch_rt_conflict (rtx_insn *insn)
16154 rtx_insn *first, *second;
16156 first = SEQ_BEGIN (insn);
16157 second = SEQ_END (insn);
16158 if (JUMP_P (first)
16159 && NONJUMP_INSN_P (second)
16160 && GET_CODE (PATTERN (first)) == SET
16161 && GET_CODE (SET_DEST (PATTERN (first))) == PC
16162 && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
16164 /* Check for the right kind of condition. */
16165 rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
16166 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
16167 && REG_P (XEXP (cond, 0))
16168 && REG_P (XEXP (cond, 1))
16169 && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
16170 && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
16172 /* SECOND mentions the rt register but not the rs register. */
16173 rtx tmp = XEXP (cond, 0);
16174 XEXP (cond, 0) = XEXP (cond, 1);
16175 XEXP (cond, 1) = tmp;
16180 /* Implement -mvr4130-align. Go through each basic block and simulate the
16181 processor pipeline. If we find that a pair of instructions could execute
16182 in parallel, and the first of those instructions is not 8-byte aligned,
16183 insert a nop to make it aligned. */
16185 static void
16186 vr4130_align_insns (void)
16188 struct mips_sim state;
16189 rtx_insn *insn, *subinsn, *last, *last2, *next;
16190 bool aligned_p;
16192 dfa_start ();
16194 /* LAST is the last instruction before INSN to have a nonzero length.
16195 LAST2 is the last such instruction before LAST. */
16196 last = 0;
16197 last2 = 0;
16199 /* ALIGNED_P is true if INSN is known to be at an aligned address. */
16200 aligned_p = true;
16202 mips_sim_init (&state, alloca (state_size ()));
16203 for (insn = get_insns (); insn != 0; insn = next)
16205 unsigned int length;
16207 next = NEXT_INSN (insn);
16209 /* See the comment above vr4130_avoid_branch_rt_conflict for details.
16210 This isn't really related to the alignment pass, but we do it on
16211 the fly to avoid a separate instruction walk. */
16212 vr4130_avoid_branch_rt_conflict (insn);
16214 length = get_attr_length (insn);
16215 if (length > 0 && USEFUL_INSN_P (insn))
16216 FOR_EACH_SUBINSN (subinsn, insn)
16218 mips_sim_wait_insn (&state, subinsn);
16220 /* If we want this instruction to issue in parallel with the
16221 previous one, make sure that the previous instruction is
16222 aligned. There are several reasons why this isn't worthwhile
16223 when the second instruction is a call:
16225 - Calls are less likely to be performance critical,
16226 - There's a good chance that the delay slot can execute
16227 in parallel with the call.
16228 - The return address would then be unaligned.
16230 In general, if we're going to insert a nop between instructions
16231 X and Y, it's better to insert it immediately after X. That
16232 way, if the nop makes Y aligned, it will also align any labels
16233 between X and Y. */
16234 if (state.insns_left != state.issue_rate
16235 && !CALL_P (subinsn))
16237 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
16239 /* SUBINSN is the first instruction in INSN and INSN is
16240 aligned. We want to align the previous instruction
16241 instead, so insert a nop between LAST2 and LAST.
16243 Note that LAST could be either a single instruction
16244 or a branch with a delay slot. In the latter case,
16245 LAST, like INSN, is already aligned, but the delay
16246 slot must have some extra delay that stops it from
16247 issuing at the same time as the branch. We therefore
16248 insert a nop before the branch in order to align its
16249 delay slot. */
16250 gcc_assert (last2);
16251 emit_insn_after (gen_nop (), last2);
16252 aligned_p = false;
16254 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
16256 /* SUBINSN is the delay slot of INSN, but INSN is
16257 currently unaligned. Insert a nop between
16258 LAST and INSN to align it. */
16259 gcc_assert (last);
16260 emit_insn_after (gen_nop (), last);
16261 aligned_p = true;
16264 mips_sim_issue_insn (&state, subinsn);
16266 mips_sim_finish_insn (&state, insn);
16268 /* Update LAST, LAST2 and ALIGNED_P for the next instruction. */
16269 length = get_attr_length (insn);
16270 if (length > 0)
16272 /* If the instruction is an asm statement or multi-instruction
16273 mips.md patern, the length is only an estimate. Insert an
16274 8 byte alignment after it so that the following instructions
16275 can be handled correctly. */
16276 if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
16277 && (recog_memoized (insn) < 0 || length >= 8))
16279 next = emit_insn_after (gen_align (GEN_INT (3)), insn);
16280 next = NEXT_INSN (next);
16281 mips_sim_next_cycle (&state);
16282 aligned_p = true;
16284 else if (length & 4)
16285 aligned_p = !aligned_p;
16286 last2 = last;
16287 last = insn;
16290 /* See whether INSN is an aligned label. */
16291 if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
16292 aligned_p = true;
16294 dfa_finish ();
16297 /* This structure records that the current function has a LO_SUM
16298 involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
16299 the largest offset applied to BASE by all such LO_SUMs. */
16300 struct mips_lo_sum_offset {
16301 rtx base;
16302 HOST_WIDE_INT offset;
16305 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE. */
16307 static hashval_t
16308 mips_hash_base (rtx base)
16310 int do_not_record_p;
16312 return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
16315 /* Hashtable helpers. */
16317 struct mips_lo_sum_offset_hasher : free_ptr_hash <mips_lo_sum_offset>
16319 typedef rtx_def *compare_type;
16320 static inline hashval_t hash (const mips_lo_sum_offset *);
16321 static inline bool equal (const mips_lo_sum_offset *, const rtx_def *);
16324 /* Hash-table callbacks for mips_lo_sum_offsets. */
16326 inline hashval_t
16327 mips_lo_sum_offset_hasher::hash (const mips_lo_sum_offset *entry)
16329 return mips_hash_base (entry->base);
16332 inline bool
16333 mips_lo_sum_offset_hasher::equal (const mips_lo_sum_offset *entry,
16334 const rtx_def *value)
16336 return rtx_equal_p (entry->base, value);
16339 typedef hash_table<mips_lo_sum_offset_hasher> mips_offset_table;
16341 /* Look up symbolic constant X in HTAB, which is a hash table of
16342 mips_lo_sum_offsets. If OPTION is NO_INSERT, return true if X can be
16343 paired with a recorded LO_SUM, otherwise record X in the table. */
16345 static bool
16346 mips_lo_sum_offset_lookup (mips_offset_table *htab, rtx x,
16347 enum insert_option option)
16349 rtx base, offset;
16350 mips_lo_sum_offset **slot;
16351 struct mips_lo_sum_offset *entry;
16353 /* Split X into a base and offset. */
16354 split_const (x, &base, &offset);
16355 if (UNSPEC_ADDRESS_P (base))
16356 base = UNSPEC_ADDRESS (base);
16358 /* Look up the base in the hash table. */
16359 slot = htab->find_slot_with_hash (base, mips_hash_base (base), option);
16360 if (slot == NULL)
16361 return false;
16363 entry = (struct mips_lo_sum_offset *) *slot;
16364 if (option == INSERT)
16366 if (entry == NULL)
16368 entry = XNEW (struct mips_lo_sum_offset);
16369 entry->base = base;
16370 entry->offset = INTVAL (offset);
16371 *slot = entry;
16373 else
16375 if (INTVAL (offset) > entry->offset)
16376 entry->offset = INTVAL (offset);
16379 return INTVAL (offset) <= entry->offset;
16382 /* Search X for LO_SUMs and record them in HTAB. */
16384 static void
16385 mips_record_lo_sums (const_rtx x, mips_offset_table *htab)
16387 subrtx_iterator::array_type array;
16388 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
16389 if (GET_CODE (*iter) == LO_SUM)
16390 mips_lo_sum_offset_lookup (htab, XEXP (*iter, 1), INSERT);
16393 /* Return true if INSN is a SET of an orphaned high-part relocation.
16394 HTAB is a hash table of mips_lo_sum_offsets that describes all the
16395 LO_SUMs in the current function. */
16397 static bool
16398 mips_orphaned_high_part_p (mips_offset_table *htab, rtx_insn *insn)
16400 enum mips_symbol_type type;
16401 rtx x, set;
16403 set = single_set (insn);
16404 if (set)
16406 /* Check for %his. */
16407 x = SET_SRC (set);
16408 if (GET_CODE (x) == HIGH
16409 && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
16410 return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
16412 /* Check for local %gots (and %got_pages, which is redundant but OK). */
16413 if (GET_CODE (x) == UNSPEC
16414 && XINT (x, 1) == UNSPEC_LOAD_GOT
16415 && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
16416 SYMBOL_CONTEXT_LEA, &type)
16417 && type == SYMBOL_GOTOFF_PAGE)
16418 return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
16420 return false;
16423 /* Subroutine of mips_reorg_process_insns. If there is a hazard between
16424 INSN and a previous instruction, avoid it by inserting nops after
16425 instruction AFTER.
16427 *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
16428 this point. If *DELAYED_REG is non-null, INSN must wait a cycle
16429 before using the value of that register. *HILO_DELAY counts the
16430 number of instructions since the last hilo hazard (that is,
16431 the number of instructions since the last MFLO or MFHI).
16433 After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
16434 for the next instruction.
16436 LO_REG is an rtx for the LO register, used in dependence checking. */
16438 static void
16439 mips_avoid_hazard (rtx_insn *after, rtx_insn *insn, int *hilo_delay,
16440 rtx *delayed_reg, rtx lo_reg)
16442 rtx pattern, set;
16443 int nops, ninsns;
16445 pattern = PATTERN (insn);
16447 /* Do not put the whole function in .set noreorder if it contains
16448 an asm statement. We don't know whether there will be hazards
16449 between the asm statement and the gcc-generated code. */
16450 if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
16451 cfun->machine->all_noreorder_p = false;
16453 /* Ignore zero-length instructions (barriers and the like). */
16454 ninsns = get_attr_length (insn) / 4;
16455 if (ninsns == 0)
16456 return;
16458 /* Work out how many nops are needed. Note that we only care about
16459 registers that are explicitly mentioned in the instruction's pattern.
16460 It doesn't matter that calls use the argument registers or that they
16461 clobber hi and lo. */
16462 if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
16463 nops = 2 - *hilo_delay;
16464 else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
16465 nops = 1;
16466 else
16467 nops = 0;
16469 /* Insert the nops between this instruction and the previous one.
16470 Each new nop takes us further from the last hilo hazard. */
16471 *hilo_delay += nops;
16472 while (nops-- > 0)
16473 emit_insn_after (gen_hazard_nop (), after);
16475 /* Set up the state for the next instruction. */
16476 *hilo_delay += ninsns;
16477 *delayed_reg = 0;
16478 if (INSN_CODE (insn) >= 0)
16479 switch (get_attr_hazard (insn))
16481 case HAZARD_NONE:
16482 break;
16484 case HAZARD_HILO:
16485 *hilo_delay = 0;
16486 break;
16488 case HAZARD_DELAY:
16489 set = single_set (insn);
16490 gcc_assert (set);
16491 *delayed_reg = SET_DEST (set);
16492 break;
16496 /* Go through the instruction stream and insert nops where necessary.
16497 Also delete any high-part relocations whose partnering low parts
16498 are now all dead. See if the whole function can then be put into
16499 .set noreorder and .set nomacro. */
16501 static void
16502 mips_reorg_process_insns (void)
16504 rtx_insn *insn, *last_insn, *subinsn, *next_insn;
16505 rtx lo_reg, delayed_reg;
16506 int hilo_delay;
16508 /* Force all instructions to be split into their final form. */
16509 split_all_insns_noflow ();
16511 /* Recalculate instruction lengths without taking nops into account. */
16512 cfun->machine->ignore_hazard_length_p = true;
16513 shorten_branches (get_insns ());
16515 cfun->machine->all_noreorder_p = true;
16517 /* We don't track MIPS16 PC-relative offsets closely enough to make
16518 a good job of "set .noreorder" code in MIPS16 mode. */
16519 if (TARGET_MIPS16)
16520 cfun->machine->all_noreorder_p = false;
16522 /* Code that doesn't use explicit relocs can't be ".set nomacro". */
16523 if (!TARGET_EXPLICIT_RELOCS)
16524 cfun->machine->all_noreorder_p = false;
16526 /* Profiled functions can't be all noreorder because the profiler
16527 support uses assembler macros. */
16528 if (crtl->profile)
16529 cfun->machine->all_noreorder_p = false;
16531 /* Code compiled with -mfix-vr4120, -mfix-rm7000 or -mfix-24k can't be
16532 all noreorder because we rely on the assembler to work around some
16533 errata. The R5900 too has several bugs. */
16534 if (TARGET_FIX_VR4120
16535 || TARGET_FIX_RM7000
16536 || TARGET_FIX_24K
16537 || TARGET_MIPS5900)
16538 cfun->machine->all_noreorder_p = false;
16540 /* The same is true for -mfix-vr4130 if we might generate MFLO or
16541 MFHI instructions. Note that we avoid using MFLO and MFHI if
16542 the VR4130 MACC and DMACC instructions are available instead;
16543 see the *mfhilo_{si,di}_macc patterns. */
16544 if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
16545 cfun->machine->all_noreorder_p = false;
16547 mips_offset_table htab (37);
16549 /* Make a first pass over the instructions, recording all the LO_SUMs. */
16550 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16551 FOR_EACH_SUBINSN (subinsn, insn)
16552 if (USEFUL_INSN_P (subinsn))
16554 rtx body = PATTERN (insn);
16555 int noperands = asm_noperands (body);
16556 if (noperands >= 0)
16558 rtx *ops = XALLOCAVEC (rtx, noperands);
16559 bool *used = XALLOCAVEC (bool, noperands);
16560 const char *string = decode_asm_operands (body, ops, NULL, NULL,
16561 NULL, NULL);
16562 get_referenced_operands (string, used, noperands);
16563 for (int i = 0; i < noperands; ++i)
16564 if (used[i])
16565 mips_record_lo_sums (ops[i], &htab);
16567 else
16568 mips_record_lo_sums (PATTERN (subinsn), &htab);
16571 last_insn = 0;
16572 hilo_delay = 2;
16573 delayed_reg = 0;
16574 lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
16576 /* Make a second pass over the instructions. Delete orphaned
16577 high-part relocations or turn them into NOPs. Avoid hazards
16578 by inserting NOPs. */
16579 for (insn = get_insns (); insn != 0; insn = next_insn)
16581 next_insn = NEXT_INSN (insn);
16582 if (USEFUL_INSN_P (insn))
16584 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
16586 /* If we find an orphaned high-part relocation in a delay
16587 slot, it's easier to turn that instruction into a NOP than
16588 to delete it. The delay slot will be a NOP either way. */
16589 FOR_EACH_SUBINSN (subinsn, insn)
16590 if (INSN_P (subinsn))
16592 if (mips_orphaned_high_part_p (&htab, subinsn))
16594 PATTERN (subinsn) = gen_nop ();
16595 INSN_CODE (subinsn) = CODE_FOR_nop;
16597 mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
16598 &delayed_reg, lo_reg);
16600 last_insn = insn;
16602 else
16604 /* INSN is a single instruction. Delete it if it's an
16605 orphaned high-part relocation. */
16606 if (mips_orphaned_high_part_p (&htab, insn))
16607 delete_insn (insn);
16608 /* Also delete cache barriers if the last instruction
16609 was an annulled branch. INSN will not be speculatively
16610 executed. */
16611 else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
16612 && last_insn
16613 && JUMP_P (SEQ_BEGIN (last_insn))
16614 && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
16615 delete_insn (insn);
16616 else
16618 mips_avoid_hazard (last_insn, insn, &hilo_delay,
16619 &delayed_reg, lo_reg);
16620 last_insn = insn;
16627 /* Return true if the function has a long branch instruction. */
16629 static bool
16630 mips_has_long_branch_p (void)
16632 rtx_insn *insn, *subinsn;
16633 int normal_length;
16635 /* We need up-to-date instruction lengths. */
16636 shorten_branches (get_insns ());
16638 /* Look for a branch that is longer than normal. The normal length for
16639 non-MIPS16 branches is 8, because the length includes the delay slot.
16640 It is 4 for MIPS16, because MIPS16 branches are extended instructions,
16641 but they have no delay slot. */
16642 normal_length = (TARGET_MIPS16 ? 4 : 8);
16643 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16644 FOR_EACH_SUBINSN (subinsn, insn)
16645 if (JUMP_P (subinsn)
16646 && get_attr_length (subinsn) > normal_length
16647 && (any_condjump_p (subinsn) || any_uncondjump_p (subinsn)))
16648 return true;
16650 return false;
16653 /* If we are using a GOT, but have not decided to use a global pointer yet,
16654 see whether we need one to implement long branches. Convert the ghost
16655 global-pointer instructions into real ones if so. */
16657 static bool
16658 mips_expand_ghost_gp_insns (void)
16660 /* Quick exit if we already know that we will or won't need a
16661 global pointer. */
16662 if (!TARGET_USE_GOT
16663 || cfun->machine->global_pointer == INVALID_REGNUM
16664 || mips_must_initialize_gp_p ())
16665 return false;
16667 /* Run a full check for long branches. */
16668 if (!mips_has_long_branch_p ())
16669 return false;
16671 /* We've now established that we need $gp. */
16672 cfun->machine->must_initialize_gp_p = true;
16673 split_all_insns_noflow ();
16675 return true;
16678 /* Subroutine of mips_reorg to manage passes that require DF. */
16680 static void
16681 mips_df_reorg (void)
16683 /* Create def-use chains. */
16684 df_set_flags (DF_EQ_NOTES);
16685 df_chain_add_problem (DF_UD_CHAIN);
16686 df_analyze ();
16688 if (TARGET_RELAX_PIC_CALLS)
16689 mips_annotate_pic_calls ();
16691 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
16692 r10k_insert_cache_barriers ();
16694 df_finish_pass (false);
16697 /* Emit code to load LABEL_REF SRC into MIPS16 register DEST. This is
16698 called very late in mips_reorg, but the caller is required to run
16699 mips16_lay_out_constants on the result. */
16701 static void
16702 mips16_load_branch_target (rtx dest, rtx src)
16704 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
16706 rtx page, low;
16708 if (mips_cfun_has_cprestore_slot_p ())
16709 mips_emit_move (dest, mips_cprestore_slot (dest, true));
16710 else
16711 mips_emit_move (dest, pic_offset_table_rtx);
16712 page = mips_unspec_address (src, SYMBOL_GOTOFF_PAGE);
16713 low = mips_unspec_address (src, SYMBOL_GOT_PAGE_OFST);
16714 emit_insn (gen_rtx_SET (dest,
16715 PMODE_INSN (gen_unspec_got, (dest, page))));
16716 emit_insn (gen_rtx_SET (dest, gen_rtx_LO_SUM (Pmode, dest, low)));
16718 else
16720 src = mips_unspec_address (src, SYMBOL_ABSOLUTE);
16721 mips_emit_move (dest, src);
16725 /* If we're compiling a MIPS16 function, look for and split any long branches.
16726 This must be called after all other instruction modifications in
16727 mips_reorg. */
16729 static void
16730 mips16_split_long_branches (void)
16732 bool something_changed;
16734 if (!TARGET_MIPS16)
16735 return;
16737 /* Loop until the alignments for all targets are sufficient. */
16740 rtx_insn *insn;
16741 rtx_jump_insn *jump_insn;
16743 shorten_branches (get_insns ());
16744 something_changed = false;
16745 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16746 if ((jump_insn = dyn_cast <rtx_jump_insn *> (insn))
16747 && get_attr_length (jump_insn) > 4
16748 && (any_condjump_p (jump_insn) || any_uncondjump_p (jump_insn)))
16750 rtx old_label, temp, saved_temp;
16751 rtx_code_label *new_label;
16752 rtx target;
16753 rtx_insn *jump, *jump_sequence;
16755 start_sequence ();
16757 /* Free up a MIPS16 register by saving it in $1. */
16758 saved_temp = gen_rtx_REG (Pmode, AT_REGNUM);
16759 temp = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
16760 emit_move_insn (saved_temp, temp);
16762 /* Load the branch target into TEMP. */
16763 old_label = JUMP_LABEL (jump_insn);
16764 target = gen_rtx_LABEL_REF (Pmode, old_label);
16765 mips16_load_branch_target (temp, target);
16767 /* Jump to the target and restore the register's
16768 original value. */
16769 jump = emit_jump_insn (PMODE_INSN (gen_indirect_jump_and_restore,
16770 (temp, temp, saved_temp)));
16771 JUMP_LABEL (jump) = old_label;
16772 LABEL_NUSES (old_label)++;
16774 /* Rewrite any symbolic references that are supposed to use
16775 a PC-relative constant pool. */
16776 mips16_lay_out_constants (false);
16778 if (simplejump_p (jump_insn))
16779 /* We're going to replace INSN with a longer form. */
16780 new_label = NULL;
16781 else
16783 /* Create a branch-around label for the original
16784 instruction. */
16785 new_label = gen_label_rtx ();
16786 emit_label (new_label);
16789 jump_sequence = get_insns ();
16790 end_sequence ();
16792 emit_insn_after (jump_sequence, jump_insn);
16793 if (new_label)
16794 invert_jump (jump_insn, new_label, false);
16795 else
16796 delete_insn (jump_insn);
16797 something_changed = true;
16800 while (something_changed);
16803 /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
16805 static void
16806 mips_reorg (void)
16808 /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF. Also during
16809 insn splitting in mips16_lay_out_constants, DF insn info is only kept up
16810 to date if the CFG is available. */
16811 if (mips_cfg_in_reorg ())
16812 compute_bb_for_insn ();
16813 mips16_lay_out_constants (true);
16814 if (mips_cfg_in_reorg ())
16816 mips_df_reorg ();
16817 free_bb_for_insn ();
16821 /* We use a machine specific pass to do a second machine dependent reorg
16822 pass after delay branch scheduling. */
16824 static unsigned int
16825 mips_machine_reorg2 (void)
16827 mips_reorg_process_insns ();
16828 if (!TARGET_MIPS16
16829 && TARGET_EXPLICIT_RELOCS
16830 && TUNE_MIPS4130
16831 && TARGET_VR4130_ALIGN)
16832 vr4130_align_insns ();
16833 if (mips_expand_ghost_gp_insns ())
16834 /* The expansion could invalidate some of the VR4130 alignment
16835 optimizations, but this should be an extremely rare case anyhow. */
16836 mips_reorg_process_insns ();
16837 mips16_split_long_branches ();
16838 return 0;
16841 namespace {
16843 const pass_data pass_data_mips_machine_reorg2 =
16845 RTL_PASS, /* type */
16846 "mach2", /* name */
16847 OPTGROUP_NONE, /* optinfo_flags */
16848 TV_MACH_DEP, /* tv_id */
16849 0, /* properties_required */
16850 0, /* properties_provided */
16851 0, /* properties_destroyed */
16852 0, /* todo_flags_start */
16853 0, /* todo_flags_finish */
16856 class pass_mips_machine_reorg2 : public rtl_opt_pass
16858 public:
16859 pass_mips_machine_reorg2(gcc::context *ctxt)
16860 : rtl_opt_pass(pass_data_mips_machine_reorg2, ctxt)
16863 /* opt_pass methods: */
16864 virtual unsigned int execute (function *) { return mips_machine_reorg2 (); }
16866 }; // class pass_mips_machine_reorg2
16868 } // anon namespace
16870 rtl_opt_pass *
16871 make_pass_mips_machine_reorg2 (gcc::context *ctxt)
16873 return new pass_mips_machine_reorg2 (ctxt);
16877 /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
16878 in order to avoid duplicating too much logic from elsewhere. */
16880 static void
16881 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
16882 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
16883 tree function)
16885 rtx this_rtx, temp1, temp2, fnaddr;
16886 rtx_insn *insn;
16887 bool use_sibcall_p;
16889 /* Pretend to be a post-reload pass while generating rtl. */
16890 reload_completed = 1;
16892 /* Mark the end of the (empty) prologue. */
16893 emit_note (NOTE_INSN_PROLOGUE_END);
16895 /* Determine if we can use a sibcall to call FUNCTION directly. */
16896 fnaddr = XEXP (DECL_RTL (function), 0);
16897 use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
16898 && const_call_insn_operand (fnaddr, Pmode));
16900 /* Determine if we need to load FNADDR from the GOT. */
16901 if (!use_sibcall_p
16902 && (mips_got_symbol_type_p
16903 (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
16905 /* Pick a global pointer. Use a call-clobbered register if
16906 TARGET_CALL_SAVED_GP. */
16907 cfun->machine->global_pointer
16908 = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
16909 cfun->machine->must_initialize_gp_p = true;
16910 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
16912 /* Set up the global pointer for n32 or n64 abicalls. */
16913 mips_emit_loadgp ();
16916 /* We need two temporary registers in some cases. */
16917 temp1 = gen_rtx_REG (Pmode, 2);
16918 temp2 = gen_rtx_REG (Pmode, 3);
16920 /* Find out which register contains the "this" pointer. */
16921 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
16922 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
16923 else
16924 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
16926 /* Add DELTA to THIS_RTX. */
16927 if (delta != 0)
16929 rtx offset = GEN_INT (delta);
16930 if (!SMALL_OPERAND (delta))
16932 mips_emit_move (temp1, offset);
16933 offset = temp1;
16935 emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
16938 /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX. */
16939 if (vcall_offset != 0)
16941 rtx addr;
16943 /* Set TEMP1 to *THIS_RTX. */
16944 mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
16946 /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET. */
16947 addr = mips_add_offset (temp2, temp1, vcall_offset);
16949 /* Load the offset and add it to THIS_RTX. */
16950 mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
16951 emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
16954 /* Jump to the target function. Use a sibcall if direct jumps are
16955 allowed, otherwise load the address into a register first. */
16956 if (use_sibcall_p)
16958 insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
16959 SIBLING_CALL_P (insn) = 1;
16961 else
16963 /* This is messy. GAS treats "la $25,foo" as part of a call
16964 sequence and may allow a global "foo" to be lazily bound.
16965 The general move patterns therefore reject this combination.
16967 In this context, lazy binding would actually be OK
16968 for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
16969 TARGET_CALL_SAVED_GP; see mips_load_call_address.
16970 We must therefore load the address via a temporary
16971 register if mips_dangerous_for_la25_p.
16973 If we jump to the temporary register rather than $25,
16974 the assembler can use the move insn to fill the jump's
16975 delay slot.
16977 We can use the same technique for MIPS16 code, where $25
16978 is not a valid JR register. */
16979 if (TARGET_USE_PIC_FN_ADDR_REG
16980 && !TARGET_MIPS16
16981 && !mips_dangerous_for_la25_p (fnaddr))
16982 temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
16983 mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
16985 if (TARGET_USE_PIC_FN_ADDR_REG
16986 && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
16987 mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
16988 emit_jump_insn (gen_indirect_jump (temp1));
16991 /* Run just enough of rest_of_compilation. This sequence was
16992 "borrowed" from alpha.c. */
16993 insn = get_insns ();
16994 split_all_insns_noflow ();
16995 mips16_lay_out_constants (true);
16996 shorten_branches (insn);
16997 final_start_function (insn, file, 1);
16998 final (insn, file, 1);
16999 final_end_function ();
17001 /* Clean up the vars set above. Note that final_end_function resets
17002 the global pointer for us. */
17003 reload_completed = 0;
17007 /* The last argument passed to mips_set_compression_mode,
17008 or negative if the function hasn't been called yet. */
17009 static unsigned int old_compression_mode = -1;
17011 /* Set up the target-dependent global state for ISA mode COMPRESSION_MODE,
17012 which is either MASK_MIPS16 or MASK_MICROMIPS. */
17014 static void
17015 mips_set_compression_mode (unsigned int compression_mode)
17018 if (compression_mode == old_compression_mode)
17019 return;
17021 /* Restore base settings of various flags. */
17022 target_flags = mips_base_target_flags;
17023 flag_schedule_insns = mips_base_schedule_insns;
17024 flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
17025 flag_move_loop_invariants = mips_base_move_loop_invariants;
17026 align_loops = mips_base_align_loops;
17027 align_jumps = mips_base_align_jumps;
17028 align_functions = mips_base_align_functions;
17029 target_flags &= ~(MASK_MIPS16 | MASK_MICROMIPS);
17030 target_flags |= compression_mode;
17032 if (compression_mode & MASK_MIPS16)
17034 /* Switch to MIPS16 mode. */
17035 target_flags |= MASK_MIPS16;
17037 /* Turn off SYNCI if it was on, MIPS16 doesn't support it. */
17038 target_flags &= ~MASK_SYNCI;
17040 /* Don't run the scheduler before reload, since it tends to
17041 increase register pressure. */
17042 flag_schedule_insns = 0;
17044 /* Don't do hot/cold partitioning. mips16_lay_out_constants expects
17045 the whole function to be in a single section. */
17046 flag_reorder_blocks_and_partition = 0;
17048 /* Don't move loop invariants, because it tends to increase
17049 register pressure. It also introduces an extra move in cases
17050 where the constant is the first operand in a two-operand binary
17051 instruction, or when it forms a register argument to a functon
17052 call. */
17053 flag_move_loop_invariants = 0;
17055 target_flags |= MASK_EXPLICIT_RELOCS;
17057 /* Experiments suggest we get the best overall section-anchor
17058 results from using the range of an unextended LW or SW. Code
17059 that makes heavy use of byte or short accesses can do better
17060 with ranges of 0...31 and 0...63 respectively, but most code is
17061 sensitive to the range of LW and SW instead. */
17062 targetm.min_anchor_offset = 0;
17063 targetm.max_anchor_offset = 127;
17065 targetm.const_anchor = 0;
17067 /* MIPS16 has no BAL instruction. */
17068 target_flags &= ~MASK_RELAX_PIC_CALLS;
17070 /* The R4000 errata don't apply to any known MIPS16 cores.
17071 It's simpler to make the R4000 fixes and MIPS16 mode
17072 mutually exclusive. */
17073 target_flags &= ~MASK_FIX_R4000;
17075 if (flag_pic && !TARGET_OLDABI)
17076 sorry ("MIPS16 PIC for ABIs other than o32 and o64");
17078 if (TARGET_XGOT)
17079 sorry ("MIPS16 -mxgot code");
17081 if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
17082 sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
17084 else
17086 /* Switch to microMIPS or the standard encoding. */
17088 if (TARGET_MICROMIPS)
17089 /* Avoid branch likely. */
17090 target_flags &= ~MASK_BRANCHLIKELY;
17092 /* Provide default values for align_* for 64-bit targets. */
17093 if (TARGET_64BIT)
17095 if (align_loops == 0)
17096 align_loops = 8;
17097 if (align_jumps == 0)
17098 align_jumps = 8;
17099 if (align_functions == 0)
17100 align_functions = 8;
17103 targetm.min_anchor_offset = -32768;
17104 targetm.max_anchor_offset = 32767;
17106 targetm.const_anchor = 0x8000;
17109 /* (Re)initialize MIPS target internals for new ISA. */
17110 mips_init_relocs ();
17112 if (compression_mode & MASK_MIPS16)
17114 if (!mips16_globals)
17115 mips16_globals = save_target_globals_default_opts ();
17116 else
17117 restore_target_globals (mips16_globals);
17119 else if (compression_mode & MASK_MICROMIPS)
17121 if (!micromips_globals)
17122 micromips_globals = save_target_globals_default_opts ();
17123 else
17124 restore_target_globals (micromips_globals);
17126 else
17127 restore_target_globals (&default_target_globals);
17129 old_compression_mode = compression_mode;
17132 /* Implement TARGET_SET_CURRENT_FUNCTION. Decide whether the current
17133 function should use the MIPS16 or microMIPS ISA and switch modes
17134 accordingly. */
17136 static void
17137 mips_set_current_function (tree fndecl)
17139 mips_set_compression_mode (mips_get_compress_mode (fndecl));
17142 /* Allocate a chunk of memory for per-function machine-dependent data. */
17144 static struct machine_function *
17145 mips_init_machine_status (void)
17147 return ggc_cleared_alloc<machine_function> ();
17150 /* Return the processor associated with the given ISA level, or null
17151 if the ISA isn't valid. */
17153 static const struct mips_cpu_info *
17154 mips_cpu_info_from_isa (int isa)
17156 unsigned int i;
17158 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
17159 if (mips_cpu_info_table[i].isa == isa)
17160 return mips_cpu_info_table + i;
17162 return NULL;
17165 /* Return a mips_cpu_info entry determined by an option valued
17166 OPT. */
17168 static const struct mips_cpu_info *
17169 mips_cpu_info_from_opt (int opt)
17171 switch (opt)
17173 case MIPS_ARCH_OPTION_FROM_ABI:
17174 /* 'from-abi' selects the most compatible architecture for the
17175 given ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit
17176 ABIs. For the EABIs, we have to decide whether we're using
17177 the 32-bit or 64-bit version. */
17178 return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
17179 : ABI_NEEDS_64BIT_REGS ? 3
17180 : (TARGET_64BIT ? 3 : 1));
17182 case MIPS_ARCH_OPTION_NATIVE:
17183 gcc_unreachable ();
17185 default:
17186 return &mips_cpu_info_table[opt];
17190 /* Return a default mips_cpu_info entry, given that no -march= option
17191 was explicitly specified. */
17193 static const struct mips_cpu_info *
17194 mips_default_arch (void)
17196 #if defined (MIPS_CPU_STRING_DEFAULT)
17197 unsigned int i;
17198 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
17199 if (strcmp (mips_cpu_info_table[i].name, MIPS_CPU_STRING_DEFAULT) == 0)
17200 return mips_cpu_info_table + i;
17201 gcc_unreachable ();
17202 #elif defined (MIPS_ISA_DEFAULT)
17203 return mips_cpu_info_from_isa (MIPS_ISA_DEFAULT);
17204 #else
17205 /* 'from-abi' makes a good default: you get whatever the ABI
17206 requires. */
17207 return mips_cpu_info_from_opt (MIPS_ARCH_OPTION_FROM_ABI);
17208 #endif
17211 /* Set up globals to generate code for the ISA or processor
17212 described by INFO. */
17214 static void
17215 mips_set_architecture (const struct mips_cpu_info *info)
17217 if (info != 0)
17219 mips_arch_info = info;
17220 mips_arch = info->cpu;
17221 mips_isa = info->isa;
17222 if (mips_isa < 32)
17223 mips_isa_rev = 0;
17224 else
17225 mips_isa_rev = (mips_isa & 31) + 1;
17229 /* Likewise for tuning. */
17231 static void
17232 mips_set_tune (const struct mips_cpu_info *info)
17234 if (info != 0)
17236 mips_tune_info = info;
17237 mips_tune = info->cpu;
17241 /* Implement TARGET_OPTION_OVERRIDE. */
17243 static void
17244 mips_option_override (void)
17246 int i, start, regno, mode;
17248 if (global_options_set.x_mips_isa_option)
17249 mips_isa_option_info = &mips_cpu_info_table[mips_isa_option];
17251 #ifdef SUBTARGET_OVERRIDE_OPTIONS
17252 SUBTARGET_OVERRIDE_OPTIONS;
17253 #endif
17255 /* MIPS16 and microMIPS cannot coexist. */
17256 if (TARGET_MICROMIPS && TARGET_MIPS16)
17257 error ("unsupported combination: %s", "-mips16 -mmicromips");
17259 /* Save the base compression state and process flags as though we
17260 were generating uncompressed code. */
17261 mips_base_compression_flags = TARGET_COMPRESSION;
17262 target_flags &= ~TARGET_COMPRESSION;
17264 /* -mno-float overrides -mhard-float and -msoft-float. */
17265 if (TARGET_NO_FLOAT)
17267 target_flags |= MASK_SOFT_FLOAT_ABI;
17268 target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
17271 if (TARGET_FLIP_MIPS16)
17272 TARGET_INTERLINK_COMPRESSED = 1;
17274 /* Set the small data limit. */
17275 mips_small_data_threshold = (global_options_set.x_g_switch_value
17276 ? g_switch_value
17277 : MIPS_DEFAULT_GVALUE);
17279 /* The following code determines the architecture and register size.
17280 Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
17281 The GAS and GCC code should be kept in sync as much as possible. */
17283 if (global_options_set.x_mips_arch_option)
17284 mips_set_architecture (mips_cpu_info_from_opt (mips_arch_option));
17286 if (mips_isa_option_info != 0)
17288 if (mips_arch_info == 0)
17289 mips_set_architecture (mips_isa_option_info);
17290 else if (mips_arch_info->isa != mips_isa_option_info->isa)
17291 error ("%<-%s%> conflicts with the other architecture options, "
17292 "which specify a %s processor",
17293 mips_isa_option_info->name,
17294 mips_cpu_info_from_isa (mips_arch_info->isa)->name);
17297 if (mips_arch_info == 0)
17298 mips_set_architecture (mips_default_arch ());
17300 if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
17301 error ("%<-march=%s%> is not compatible with the selected ABI",
17302 mips_arch_info->name);
17304 /* Optimize for mips_arch, unless -mtune selects a different processor. */
17305 if (global_options_set.x_mips_tune_option)
17306 mips_set_tune (mips_cpu_info_from_opt (mips_tune_option));
17308 if (mips_tune_info == 0)
17309 mips_set_tune (mips_arch_info);
17311 if ((target_flags_explicit & MASK_64BIT) != 0)
17313 /* The user specified the size of the integer registers. Make sure
17314 it agrees with the ABI and ISA. */
17315 if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
17316 error ("%<-mgp64%> used with a 32-bit processor");
17317 else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
17318 error ("%<-mgp32%> used with a 64-bit ABI");
17319 else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
17320 error ("%<-mgp64%> used with a 32-bit ABI");
17322 else
17324 /* Infer the integer register size from the ABI and processor.
17325 Restrict ourselves to 32-bit registers if that's all the
17326 processor has, or if the ABI cannot handle 64-bit registers. */
17327 if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
17328 target_flags &= ~MASK_64BIT;
17329 else
17330 target_flags |= MASK_64BIT;
17333 if ((target_flags_explicit & MASK_FLOAT64) != 0)
17335 if (mips_isa_rev >= 6 && !TARGET_FLOAT64)
17336 error ("the %qs architecture does not support %<-mfp32%>",
17337 mips_arch_info->name);
17338 else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
17339 error ("unsupported combination: %s", "-mfp64 -msingle-float");
17340 else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
17341 error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
17342 else if (!TARGET_64BIT && TARGET_FLOAT64)
17344 if (!ISA_HAS_MXHC1)
17345 error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
17346 " the target supports the mfhc1 and mthc1 instructions");
17347 else if (mips_abi != ABI_32)
17348 error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
17349 " the o32 ABI");
17352 else
17354 /* -msingle-float selects 32-bit float registers. On r6 and later,
17355 -mdouble-float selects 64-bit float registers, since the old paired
17356 register model is not supported. In other cases the float registers
17357 should be the same size as the integer ones. */
17358 if (mips_isa_rev >= 6 && TARGET_DOUBLE_FLOAT && !TARGET_FLOATXX)
17359 target_flags |= MASK_FLOAT64;
17360 else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
17361 target_flags |= MASK_FLOAT64;
17362 else
17363 target_flags &= ~MASK_FLOAT64;
17366 if (mips_abi != ABI_32 && TARGET_FLOATXX)
17367 error ("%<-mfpxx%> can only be used with the o32 ABI");
17368 else if (TARGET_FLOAT64 && TARGET_FLOATXX)
17369 error ("unsupported combination: %s", "-mfp64 -mfpxx");
17370 else if (ISA_MIPS1 && !TARGET_FLOAT32)
17371 error ("%<-march=%s%> requires %<-mfp32%>", mips_arch_info->name);
17372 else if (TARGET_FLOATXX && !mips_lra_flag)
17373 error ("%<-mfpxx%> requires %<-mlra%>");
17375 /* End of code shared with GAS. */
17377 /* The R5900 FPU only supports single precision. */
17378 if (TARGET_MIPS5900 && TARGET_HARD_FLOAT_ABI && TARGET_DOUBLE_FLOAT)
17379 error ("unsupported combination: %s",
17380 "-march=r5900 -mhard-float -mdouble-float");
17382 /* If a -mlong* option was given, check that it matches the ABI,
17383 otherwise infer the -mlong* setting from the other options. */
17384 if ((target_flags_explicit & MASK_LONG64) != 0)
17386 if (TARGET_LONG64)
17388 if (mips_abi == ABI_N32)
17389 error ("%qs is incompatible with %qs", "-mabi=n32", "-mlong64");
17390 else if (mips_abi == ABI_32)
17391 error ("%qs is incompatible with %qs", "-mabi=32", "-mlong64");
17392 else if (mips_abi == ABI_O64 && TARGET_ABICALLS)
17393 /* We have traditionally allowed non-abicalls code to use
17394 an LP64 form of o64. However, it would take a bit more
17395 effort to support the combination of 32-bit GOT entries
17396 and 64-bit pointers, so we treat the abicalls case as
17397 an error. */
17398 error ("the combination of %qs and %qs is incompatible with %qs",
17399 "-mabi=o64", "-mabicalls", "-mlong64");
17401 else
17403 if (mips_abi == ABI_64)
17404 error ("%qs is incompatible with %qs", "-mabi=64", "-mlong32");
17407 else
17409 if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
17410 target_flags |= MASK_LONG64;
17411 else
17412 target_flags &= ~MASK_LONG64;
17415 if (!TARGET_OLDABI)
17416 flag_pcc_struct_return = 0;
17418 /* Decide which rtx_costs structure to use. */
17419 if (optimize_size)
17420 mips_cost = &mips_rtx_cost_optimize_size;
17421 else
17422 mips_cost = &mips_rtx_cost_data[mips_tune];
17424 /* If the user hasn't specified a branch cost, use the processor's
17425 default. */
17426 if (mips_branch_cost == 0)
17427 mips_branch_cost = mips_cost->branch_cost;
17429 /* If neither -mbranch-likely nor -mno-branch-likely was given
17430 on the command line, set MASK_BRANCHLIKELY based on the target
17431 architecture and tuning flags. Annulled delay slots are a
17432 size win, so we only consider the processor-specific tuning
17433 for !optimize_size. */
17434 if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
17436 if (ISA_HAS_BRANCHLIKELY
17437 && (optimize_size
17438 || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
17439 target_flags |= MASK_BRANCHLIKELY;
17440 else
17441 target_flags &= ~MASK_BRANCHLIKELY;
17443 else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
17444 warning (0, "the %qs architecture does not support branch-likely"
17445 " instructions", mips_arch_info->name);
17447 /* If the user hasn't specified -mimadd or -mno-imadd set
17448 MASK_IMADD based on the target architecture and tuning
17449 flags. */
17450 if ((target_flags_explicit & MASK_IMADD) == 0)
17452 if (ISA_HAS_MADD_MSUB &&
17453 (mips_tune_info->tune_flags & PTF_AVOID_IMADD) == 0)
17454 target_flags |= MASK_IMADD;
17455 else
17456 target_flags &= ~MASK_IMADD;
17458 else if (TARGET_IMADD && !ISA_HAS_MADD_MSUB)
17459 warning (0, "the %qs architecture does not support madd or msub"
17460 " instructions", mips_arch_info->name);
17462 /* If neither -modd-spreg nor -mno-odd-spreg was given on the command
17463 line, set MASK_ODD_SPREG based on the ISA and ABI. */
17464 if ((target_flags_explicit & MASK_ODD_SPREG) == 0)
17466 /* Disable TARGET_ODD_SPREG when using the o32 FPXX ABI. */
17467 if (!ISA_HAS_ODD_SPREG || TARGET_FLOATXX)
17468 target_flags &= ~MASK_ODD_SPREG;
17469 else
17470 target_flags |= MASK_ODD_SPREG;
17472 else if (TARGET_ODD_SPREG && !ISA_HAS_ODD_SPREG)
17473 warning (0, "the %qs architecture does not support odd single-precision"
17474 " registers", mips_arch_info->name);
17476 if (!TARGET_ODD_SPREG && TARGET_64BIT)
17478 error ("unsupported combination: %s", "-mgp64 -mno-odd-spreg");
17479 /* Allow compilation to continue further even though invalid output
17480 will be produced. */
17481 target_flags |= MASK_ODD_SPREG;
17484 /* The effect of -mabicalls isn't defined for the EABI. */
17485 if (mips_abi == ABI_EABI && TARGET_ABICALLS)
17487 error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
17488 target_flags &= ~MASK_ABICALLS;
17491 /* PIC requires -mabicalls. */
17492 if (flag_pic)
17494 if (mips_abi == ABI_EABI)
17495 error ("cannot generate position-independent code for %qs",
17496 "-mabi=eabi");
17497 else if (!TARGET_ABICALLS)
17498 error ("position-independent code requires %qs", "-mabicalls");
17501 if (TARGET_ABICALLS_PIC2)
17502 /* We need to set flag_pic for executables as well as DSOs
17503 because we may reference symbols that are not defined in
17504 the final executable. (MIPS does not use things like
17505 copy relocs, for example.)
17507 There is a body of code that uses __PIC__ to distinguish
17508 between -mabicalls and -mno-abicalls code. The non-__PIC__
17509 variant is usually appropriate for TARGET_ABICALLS_PIC0, as
17510 long as any indirect jumps use $25. */
17511 flag_pic = 1;
17513 /* -mvr4130-align is a "speed over size" optimization: it usually produces
17514 faster code, but at the expense of more nops. Enable it at -O3 and
17515 above. */
17516 if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
17517 target_flags |= MASK_VR4130_ALIGN;
17519 /* Prefer a call to memcpy over inline code when optimizing for size,
17520 though see MOVE_RATIO in mips.h. */
17521 if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
17522 target_flags |= MASK_MEMCPY;
17524 /* If we have a nonzero small-data limit, check that the -mgpopt
17525 setting is consistent with the other target flags. */
17526 if (mips_small_data_threshold > 0)
17528 if (!TARGET_GPOPT)
17530 if (!TARGET_EXPLICIT_RELOCS)
17531 error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
17533 TARGET_LOCAL_SDATA = false;
17534 TARGET_EXTERN_SDATA = false;
17536 else
17538 if (TARGET_VXWORKS_RTP)
17539 warning (0, "cannot use small-data accesses for %qs", "-mrtp");
17541 if (TARGET_ABICALLS)
17542 warning (0, "cannot use small-data accesses for %qs",
17543 "-mabicalls");
17547 /* Set NaN and ABS defaults. */
17548 if (mips_nan == MIPS_IEEE_754_DEFAULT && !ISA_HAS_IEEE_754_LEGACY)
17549 mips_nan = MIPS_IEEE_754_2008;
17550 if (mips_abs == MIPS_IEEE_754_DEFAULT && !ISA_HAS_IEEE_754_LEGACY)
17551 mips_abs = MIPS_IEEE_754_2008;
17553 /* Check for IEEE 754 legacy/2008 support. */
17554 if ((mips_nan == MIPS_IEEE_754_LEGACY
17555 || mips_abs == MIPS_IEEE_754_LEGACY)
17556 && !ISA_HAS_IEEE_754_LEGACY)
17557 warning (0, "the %qs architecture does not support %<-m%s=legacy%>",
17558 mips_arch_info->name,
17559 mips_nan == MIPS_IEEE_754_LEGACY ? "nan" : "abs");
17561 if ((mips_nan == MIPS_IEEE_754_2008
17562 || mips_abs == MIPS_IEEE_754_2008)
17563 && !ISA_HAS_IEEE_754_2008)
17564 warning (0, "the %qs architecture does not support %<-m%s=2008%>",
17565 mips_arch_info->name,
17566 mips_nan == MIPS_IEEE_754_2008 ? "nan" : "abs");
17568 /* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
17569 for all its floating point. */
17570 if (mips_nan != MIPS_IEEE_754_2008)
17572 REAL_MODE_FORMAT (SFmode) = &mips_single_format;
17573 REAL_MODE_FORMAT (DFmode) = &mips_double_format;
17574 REAL_MODE_FORMAT (TFmode) = &mips_quad_format;
17577 /* Make sure that the user didn't turn off paired single support when
17578 MIPS-3D support is requested. */
17579 if (TARGET_MIPS3D
17580 && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
17581 && !TARGET_PAIRED_SINGLE_FLOAT)
17582 error ("%<-mips3d%> requires %<-mpaired-single%>");
17584 /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT. */
17585 if (TARGET_MIPS3D)
17586 target_flags |= MASK_PAIRED_SINGLE_FLOAT;
17588 /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
17589 and TARGET_HARD_FLOAT_ABI are both true. */
17590 if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
17592 error ("%qs must be used with %qs",
17593 TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
17594 TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
17595 target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17596 TARGET_MIPS3D = 0;
17599 /* Make sure that -mpaired-single is only used on ISAs that support it.
17600 We must disable it otherwise since it relies on other ISA properties
17601 like ISA_HAS_8CC having their normal values. */
17602 if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
17604 error ("the %qs architecture does not support paired-single"
17605 " instructions", mips_arch_info->name);
17606 target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17607 TARGET_MIPS3D = 0;
17610 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
17611 && !TARGET_CACHE_BUILTIN)
17613 error ("%qs requires a target that provides the %qs instruction",
17614 "-mr10k-cache-barrier", "cache");
17615 mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
17618 /* If TARGET_DSPR2, enable TARGET_DSP. */
17619 if (TARGET_DSPR2)
17620 TARGET_DSP = true;
17622 if (TARGET_DSP && mips_isa_rev >= 6)
17624 error ("the %qs architecture does not support DSP instructions",
17625 mips_arch_info->name);
17626 TARGET_DSP = false;
17627 TARGET_DSPR2 = false;
17630 /* .eh_frame addresses should be the same width as a C pointer.
17631 Most MIPS ABIs support only one pointer size, so the assembler
17632 will usually know exactly how big an .eh_frame address is.
17634 Unfortunately, this is not true of the 64-bit EABI. The ABI was
17635 originally defined to use 64-bit pointers (i.e. it is LP64), and
17636 this is still the default mode. However, we also support an n32-like
17637 ILP32 mode, which is selected by -mlong32. The problem is that the
17638 assembler has traditionally not had an -mlong option, so it has
17639 traditionally not known whether we're using the ILP32 or LP64 form.
17641 As it happens, gas versions up to and including 2.19 use _32-bit_
17642 addresses for EABI64 .cfi_* directives. This is wrong for the
17643 default LP64 mode, so we can't use the directives by default.
17644 Moreover, since gas's current behavior is at odds with gcc's
17645 default behavior, it seems unwise to rely on future versions
17646 of gas behaving the same way. We therefore avoid using .cfi
17647 directives for -mlong32 as well. */
17648 if (mips_abi == ABI_EABI && TARGET_64BIT)
17649 flag_dwarf2_cfi_asm = 0;
17651 /* .cfi_* directives generate a read-only section, so fall back on
17652 manual .eh_frame creation if we need the section to be writable. */
17653 if (TARGET_WRITABLE_EH_FRAME)
17654 flag_dwarf2_cfi_asm = 0;
17656 mips_init_print_operand_punct ();
17658 /* Set up array to map GCC register number to debug register number.
17659 Ignore the special purpose register numbers. */
17661 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17663 mips_dbx_regno[i] = IGNORED_DWARF_REGNUM;
17664 if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
17665 mips_dwarf_regno[i] = i;
17666 else
17667 mips_dwarf_regno[i] = INVALID_REGNUM;
17670 start = GP_DBX_FIRST - GP_REG_FIRST;
17671 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
17672 mips_dbx_regno[i] = i + start;
17674 start = FP_DBX_FIRST - FP_REG_FIRST;
17675 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
17676 mips_dbx_regno[i] = i + start;
17678 /* Accumulator debug registers use big-endian ordering. */
17679 mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
17680 mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
17681 mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
17682 mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
17683 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
17685 mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
17686 mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
17689 /* Set up mips_hard_regno_mode_ok. */
17690 for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
17691 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
17692 mips_hard_regno_mode_ok[mode][regno]
17693 = mips_hard_regno_mode_ok_p (regno, (machine_mode) mode);
17695 /* Function to allocate machine-dependent function status. */
17696 init_machine_status = &mips_init_machine_status;
17698 /* Default to working around R4000 errata only if the processor
17699 was selected explicitly. */
17700 if ((target_flags_explicit & MASK_FIX_R4000) == 0
17701 && strcmp (mips_arch_info->name, "r4000") == 0)
17702 target_flags |= MASK_FIX_R4000;
17704 /* Default to working around R4400 errata only if the processor
17705 was selected explicitly. */
17706 if ((target_flags_explicit & MASK_FIX_R4400) == 0
17707 && strcmp (mips_arch_info->name, "r4400") == 0)
17708 target_flags |= MASK_FIX_R4400;
17710 /* Default to working around R10000 errata only if the processor
17711 was selected explicitly. */
17712 if ((target_flags_explicit & MASK_FIX_R10000) == 0
17713 && strcmp (mips_arch_info->name, "r10000") == 0)
17714 target_flags |= MASK_FIX_R10000;
17716 /* Make sure that branch-likely instructions available when using
17717 -mfix-r10000. The instructions are not available if either:
17719 1. -mno-branch-likely was passed.
17720 2. The selected ISA does not support branch-likely and
17721 the command line does not include -mbranch-likely. */
17722 if (TARGET_FIX_R10000
17723 && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
17724 ? !ISA_HAS_BRANCHLIKELY
17725 : !TARGET_BRANCHLIKELY))
17726 sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
17728 if (TARGET_SYNCI && !ISA_HAS_SYNCI)
17730 warning (0, "the %qs architecture does not support the synci "
17731 "instruction", mips_arch_info->name);
17732 target_flags &= ~MASK_SYNCI;
17735 /* Only optimize PIC indirect calls if they are actually required. */
17736 if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
17737 target_flags &= ~MASK_RELAX_PIC_CALLS;
17739 /* Save base state of options. */
17740 mips_base_target_flags = target_flags;
17741 mips_base_schedule_insns = flag_schedule_insns;
17742 mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
17743 mips_base_move_loop_invariants = flag_move_loop_invariants;
17744 mips_base_align_loops = align_loops;
17745 mips_base_align_jumps = align_jumps;
17746 mips_base_align_functions = align_functions;
17748 /* Now select the ISA mode.
17750 Do all CPP-sensitive stuff in uncompressed mode; we'll switch modes
17751 later if required. */
17752 mips_set_compression_mode (0);
17754 /* We register a second machine specific reorg pass after delay slot
17755 filling. Registering the pass must be done at start up. It's
17756 convenient to do it here. */
17757 opt_pass *new_pass = make_pass_mips_machine_reorg2 (g);
17758 struct register_pass_info insert_pass_mips_machine_reorg2 =
17760 new_pass, /* pass */
17761 "dbr", /* reference_pass_name */
17762 1, /* ref_pass_instance_number */
17763 PASS_POS_INSERT_AFTER /* po_op */
17765 register_pass (&insert_pass_mips_machine_reorg2);
17767 if (TARGET_HARD_FLOAT_ABI && TARGET_MIPS5900)
17768 REAL_MODE_FORMAT (SFmode) = &spu_single_format;
17771 /* Swap the register information for registers I and I + 1, which
17772 currently have the wrong endianness. Note that the registers'
17773 fixedness and call-clobberedness might have been set on the
17774 command line. */
17776 static void
17777 mips_swap_registers (unsigned int i)
17779 int tmpi;
17780 const char *tmps;
17782 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
17783 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
17785 SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
17786 SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
17787 SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
17788 SWAP_STRING (reg_names[i], reg_names[i + 1]);
17790 #undef SWAP_STRING
17791 #undef SWAP_INT
17794 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
17796 static void
17797 mips_conditional_register_usage (void)
17800 if (ISA_HAS_DSP)
17802 /* These DSP control register fields are global. */
17803 global_regs[CCDSP_PO_REGNUM] = 1;
17804 global_regs[CCDSP_SC_REGNUM] = 1;
17806 else
17807 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17808 reg_class_contents[(int) DSP_ACC_REGS]);
17810 if (!ISA_HAS_HILO)
17811 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17812 reg_class_contents[(int) MD_REGS]);
17814 if (!TARGET_HARD_FLOAT)
17816 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17817 reg_class_contents[(int) FP_REGS]);
17818 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17819 reg_class_contents[(int) ST_REGS]);
17821 else if (!ISA_HAS_8CC)
17823 /* We only have a single condition-code register. We implement
17824 this by fixing all the condition-code registers and generating
17825 RTL that refers directly to ST_REG_FIRST. */
17826 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17827 reg_class_contents[(int) ST_REGS]);
17828 if (!ISA_HAS_CCF)
17829 SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
17830 fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
17832 if (TARGET_MIPS16)
17834 /* In MIPS16 mode, we prohibit the unused $s registers, since they
17835 are call-saved, and saving them via a MIPS16 register would
17836 probably waste more time than just reloading the value.
17838 We permit the $t temporary registers when optimizing for speed
17839 but not when optimizing for space because using them results in
17840 code that is larger (but faster) then not using them. We do
17841 allow $24 (t8) because it is used in CMP and CMPI instructions
17842 and $25 (t9) because it is used as the function call address in
17843 SVR4 PIC code. */
17845 fixed_regs[18] = call_used_regs[18] = 1;
17846 fixed_regs[19] = call_used_regs[19] = 1;
17847 fixed_regs[20] = call_used_regs[20] = 1;
17848 fixed_regs[21] = call_used_regs[21] = 1;
17849 fixed_regs[22] = call_used_regs[22] = 1;
17850 fixed_regs[23] = call_used_regs[23] = 1;
17851 fixed_regs[26] = call_used_regs[26] = 1;
17852 fixed_regs[27] = call_used_regs[27] = 1;
17853 fixed_regs[30] = call_used_regs[30] = 1;
17854 if (optimize_size)
17856 fixed_regs[8] = call_used_regs[8] = 1;
17857 fixed_regs[9] = call_used_regs[9] = 1;
17858 fixed_regs[10] = call_used_regs[10] = 1;
17859 fixed_regs[11] = call_used_regs[11] = 1;
17860 fixed_regs[12] = call_used_regs[12] = 1;
17861 fixed_regs[13] = call_used_regs[13] = 1;
17862 fixed_regs[14] = call_used_regs[14] = 1;
17863 fixed_regs[15] = call_used_regs[15] = 1;
17866 /* Do not allow HI and LO to be treated as register operands.
17867 There are no MTHI or MTLO instructions (or any real need
17868 for them) and one-way registers cannot easily be reloaded. */
17869 AND_COMPL_HARD_REG_SET (operand_reg_set,
17870 reg_class_contents[(int) MD_REGS]);
17872 /* $f20-$f23 are call-clobbered for n64. */
17873 if (mips_abi == ABI_64)
17875 int regno;
17876 for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
17877 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17879 /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
17880 for n32 and o32 FP64. */
17881 if (mips_abi == ABI_N32
17882 || (mips_abi == ABI_32
17883 && TARGET_FLOAT64))
17885 int regno;
17886 for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
17887 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17889 /* Make sure that double-register accumulator values are correctly
17890 ordered for the current endianness. */
17891 if (TARGET_LITTLE_ENDIAN)
17893 unsigned int regno;
17895 mips_swap_registers (MD_REG_FIRST);
17896 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
17897 mips_swap_registers (regno);
17901 /* Implement EH_USES. */
17903 bool
17904 mips_eh_uses (unsigned int regno)
17906 if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
17908 /* We need to force certain registers to be live in order to handle
17909 PIC long branches correctly. See mips_must_initialize_gp_p for
17910 details. */
17911 if (mips_cfun_has_cprestore_slot_p ())
17913 if (regno == CPRESTORE_SLOT_REGNUM)
17914 return true;
17916 else
17918 if (cfun->machine->global_pointer == regno)
17919 return true;
17923 return false;
17926 /* Implement EPILOGUE_USES. */
17928 bool
17929 mips_epilogue_uses (unsigned int regno)
17931 /* Say that the epilogue uses the return address register. Note that
17932 in the case of sibcalls, the values "used by the epilogue" are
17933 considered live at the start of the called function. */
17934 if (regno == RETURN_ADDR_REGNUM)
17935 return true;
17937 /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
17938 See the comment above load_call<mode> for details. */
17939 if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
17940 return true;
17942 /* An interrupt handler must preserve some registers that are
17943 ordinarily call-clobbered. */
17944 if (cfun->machine->interrupt_handler_p
17945 && mips_interrupt_extra_call_saved_reg_p (regno))
17946 return true;
17948 return false;
17951 /* Return true if INSN needs to be wrapped in ".set noat".
17952 INSN has NOPERANDS operands, stored in OPVEC. */
17954 static bool
17955 mips_need_noat_wrapper_p (rtx_insn *insn, rtx *opvec, int noperands)
17957 if (recog_memoized (insn) >= 0)
17959 subrtx_iterator::array_type array;
17960 for (int i = 0; i < noperands; i++)
17961 FOR_EACH_SUBRTX (iter, array, opvec[i], NONCONST)
17962 if (REG_P (*iter) && REGNO (*iter) == AT_REGNUM)
17963 return true;
17965 return false;
17968 /* Implement FINAL_PRESCAN_INSN. */
17970 void
17971 mips_final_prescan_insn (rtx_insn *insn, rtx *opvec, int noperands)
17973 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17974 mips_push_asm_switch (&mips_noat);
17977 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN. */
17979 static void
17980 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx_insn *insn,
17981 rtx *opvec, int noperands)
17983 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17984 mips_pop_asm_switch (&mips_noat);
17987 /* Return the function that is used to expand the <u>mulsidi3 pattern.
17988 EXT_CODE is the code of the extension used. Return NULL if widening
17989 multiplication shouldn't be used. */
17991 mulsidi3_gen_fn
17992 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
17994 bool signed_p;
17996 signed_p = ext_code == SIGN_EXTEND;
17997 if (TARGET_64BIT)
17999 /* Don't use widening multiplication with MULT when we have DMUL. Even
18000 with the extension of its input operands DMUL is faster. Note that
18001 the extension is not needed for signed multiplication. In order to
18002 ensure that we always remove the redundant sign-extension in this
18003 case we still expand mulsidi3 for DMUL. */
18004 if (ISA_HAS_R6DMUL)
18005 return signed_p ? gen_mulsidi3_64bit_r6dmul : NULL;
18006 if (ISA_HAS_DMUL3)
18007 return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
18008 if (TARGET_MIPS16)
18009 return (signed_p
18010 ? gen_mulsidi3_64bit_mips16
18011 : gen_umulsidi3_64bit_mips16);
18012 if (TARGET_FIX_R4000)
18013 return NULL;
18014 return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
18016 else
18018 if (ISA_HAS_R6MUL)
18019 return (signed_p ? gen_mulsidi3_32bit_r6 : gen_umulsidi3_32bit_r6);
18020 if (TARGET_MIPS16)
18021 return (signed_p
18022 ? gen_mulsidi3_32bit_mips16
18023 : gen_umulsidi3_32bit_mips16);
18024 if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
18025 return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
18026 return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
18030 /* Return true if PATTERN matches the kind of instruction generated by
18031 umips_build_save_restore. SAVE_P is true for store. */
18033 bool
18034 umips_save_restore_pattern_p (bool save_p, rtx pattern)
18036 int n;
18037 unsigned int i;
18038 HOST_WIDE_INT first_offset = 0;
18039 rtx first_base = 0;
18040 unsigned int regmask = 0;
18042 for (n = 0; n < XVECLEN (pattern, 0); n++)
18044 rtx set, reg, mem, this_base;
18045 HOST_WIDE_INT this_offset;
18047 /* Check that we have a SET. */
18048 set = XVECEXP (pattern, 0, n);
18049 if (GET_CODE (set) != SET)
18050 return false;
18052 /* Check that the SET is a load (if restoring) or a store
18053 (if saving). */
18054 mem = save_p ? SET_DEST (set) : SET_SRC (set);
18055 if (!MEM_P (mem) || MEM_VOLATILE_P (mem))
18056 return false;
18058 /* Check that the address is the sum of base and a possibly-zero
18059 constant offset. Determine if the offset is in range. */
18060 mips_split_plus (XEXP (mem, 0), &this_base, &this_offset);
18061 if (!REG_P (this_base))
18062 return false;
18064 if (n == 0)
18066 if (!UMIPS_12BIT_OFFSET_P (this_offset))
18067 return false;
18068 first_base = this_base;
18069 first_offset = this_offset;
18071 else
18073 /* Check that the save slots are consecutive. */
18074 if (REGNO (this_base) != REGNO (first_base)
18075 || this_offset != first_offset + UNITS_PER_WORD * n)
18076 return false;
18079 /* Check that SET's other operand is a register. */
18080 reg = save_p ? SET_SRC (set) : SET_DEST (set);
18081 if (!REG_P (reg))
18082 return false;
18084 regmask |= 1 << REGNO (reg);
18087 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
18088 if (regmask == umips_swm_mask[i])
18089 return true;
18091 return false;
18094 /* Return the assembly instruction for microMIPS LWM or SWM.
18095 SAVE_P and PATTERN are as for umips_save_restore_pattern_p. */
18097 const char *
18098 umips_output_save_restore (bool save_p, rtx pattern)
18100 static char buffer[300];
18101 char *s;
18102 int n;
18103 HOST_WIDE_INT offset;
18104 rtx base, mem, set, last_set, last_reg;
18106 /* Parse the pattern. */
18107 gcc_assert (umips_save_restore_pattern_p (save_p, pattern));
18109 s = strcpy (buffer, save_p ? "swm\t" : "lwm\t");
18110 s += strlen (s);
18111 n = XVECLEN (pattern, 0);
18113 set = XVECEXP (pattern, 0, 0);
18114 mem = save_p ? SET_DEST (set) : SET_SRC (set);
18115 mips_split_plus (XEXP (mem, 0), &base, &offset);
18117 last_set = XVECEXP (pattern, 0, n - 1);
18118 last_reg = save_p ? SET_SRC (last_set) : SET_DEST (last_set);
18120 if (REGNO (last_reg) == 31)
18121 n--;
18123 gcc_assert (n <= 9);
18124 if (n == 0)
18126 else if (n == 1)
18127 s += sprintf (s, "%s,", reg_names[16]);
18128 else if (n < 9)
18129 s += sprintf (s, "%s-%s,", reg_names[16], reg_names[15 + n]);
18130 else if (n == 9)
18131 s += sprintf (s, "%s-%s,%s,", reg_names[16], reg_names[23],
18132 reg_names[30]);
18134 if (REGNO (last_reg) == 31)
18135 s += sprintf (s, "%s,", reg_names[31]);
18137 s += sprintf (s, "%d(%s)", (int)offset, reg_names[REGNO (base)]);
18138 return buffer;
18141 /* Return true if MEM1 and MEM2 use the same base register, and the
18142 offset of MEM2 equals the offset of MEM1 plus 4. FIRST_REG is the
18143 register into (from) which the contents of MEM1 will be loaded
18144 (stored), depending on the value of LOAD_P.
18145 SWAP_P is true when the 1st and 2nd instructions are swapped. */
18147 static bool
18148 umips_load_store_pair_p_1 (bool load_p, bool swap_p,
18149 rtx first_reg, rtx mem1, rtx mem2)
18151 rtx base1, base2;
18152 HOST_WIDE_INT offset1, offset2;
18154 if (!MEM_P (mem1) || !MEM_P (mem2))
18155 return false;
18157 mips_split_plus (XEXP (mem1, 0), &base1, &offset1);
18158 mips_split_plus (XEXP (mem2, 0), &base2, &offset2);
18160 if (!REG_P (base1) || !rtx_equal_p (base1, base2))
18161 return false;
18163 /* Avoid invalid load pair instructions. */
18164 if (load_p && REGNO (first_reg) == REGNO (base1))
18165 return false;
18167 /* We must avoid this case for anti-dependence.
18168 Ex: lw $3, 4($3)
18169 lw $2, 0($3)
18170 first_reg is $2, but the base is $3. */
18171 if (load_p
18172 && swap_p
18173 && REGNO (first_reg) + 1 == REGNO (base1))
18174 return false;
18176 if (offset2 != offset1 + 4)
18177 return false;
18179 if (!UMIPS_12BIT_OFFSET_P (offset1))
18180 return false;
18182 return true;
18185 bool
18186 mips_load_store_bonding_p (rtx *operands, machine_mode mode, bool load_p)
18188 rtx reg1, reg2, mem1, mem2, base1, base2;
18189 enum reg_class rc1, rc2;
18190 HOST_WIDE_INT offset1, offset2;
18192 if (load_p)
18194 reg1 = operands[0];
18195 reg2 = operands[2];
18196 mem1 = operands[1];
18197 mem2 = operands[3];
18199 else
18201 reg1 = operands[1];
18202 reg2 = operands[3];
18203 mem1 = operands[0];
18204 mem2 = operands[2];
18207 if (mips_address_insns (XEXP (mem1, 0), mode, false) == 0
18208 || mips_address_insns (XEXP (mem2, 0), mode, false) == 0)
18209 return false;
18211 mips_split_plus (XEXP (mem1, 0), &base1, &offset1);
18212 mips_split_plus (XEXP (mem2, 0), &base2, &offset2);
18214 /* Base regs do not match. */
18215 if (!REG_P (base1) || !rtx_equal_p (base1, base2))
18216 return false;
18218 /* Either of the loads is clobbering base register. It is legitimate to bond
18219 loads if second load clobbers base register. However, hardware does not
18220 support such bonding. */
18221 if (load_p
18222 && (REGNO (reg1) == REGNO (base1)
18223 || (REGNO (reg2) == REGNO (base1))))
18224 return false;
18226 /* Loading in same registers. */
18227 if (load_p
18228 && REGNO (reg1) == REGNO (reg2))
18229 return false;
18231 /* The loads/stores are not of same type. */
18232 rc1 = REGNO_REG_CLASS (REGNO (reg1));
18233 rc2 = REGNO_REG_CLASS (REGNO (reg2));
18234 if (rc1 != rc2
18235 && !reg_class_subset_p (rc1, rc2)
18236 && !reg_class_subset_p (rc2, rc1))
18237 return false;
18239 if (abs (offset1 - offset2) != GET_MODE_SIZE (mode))
18240 return false;
18242 return true;
18245 /* OPERANDS describes the operands to a pair of SETs, in the order
18246 dest1, src1, dest2, src2. Return true if the operands can be used
18247 in an LWP or SWP instruction; LOAD_P says which. */
18249 bool
18250 umips_load_store_pair_p (bool load_p, rtx *operands)
18252 rtx reg1, reg2, mem1, mem2;
18254 if (load_p)
18256 reg1 = operands[0];
18257 reg2 = operands[2];
18258 mem1 = operands[1];
18259 mem2 = operands[3];
18261 else
18263 reg1 = operands[1];
18264 reg2 = operands[3];
18265 mem1 = operands[0];
18266 mem2 = operands[2];
18269 if (REGNO (reg2) == REGNO (reg1) + 1)
18270 return umips_load_store_pair_p_1 (load_p, false, reg1, mem1, mem2);
18272 if (REGNO (reg1) == REGNO (reg2) + 1)
18273 return umips_load_store_pair_p_1 (load_p, true, reg2, mem2, mem1);
18275 return false;
18278 /* Return the assembly instruction for a microMIPS LWP or SWP in which
18279 the first register is REG and the first memory slot is MEM.
18280 LOAD_P is true for LWP. */
18282 static void
18283 umips_output_load_store_pair_1 (bool load_p, rtx reg, rtx mem)
18285 rtx ops[] = {reg, mem};
18287 if (load_p)
18288 output_asm_insn ("lwp\t%0,%1", ops);
18289 else
18290 output_asm_insn ("swp\t%0,%1", ops);
18293 /* Output the assembly instruction for a microMIPS LWP or SWP instruction.
18294 LOAD_P and OPERANDS are as for umips_load_store_pair_p. */
18296 void
18297 umips_output_load_store_pair (bool load_p, rtx *operands)
18299 rtx reg1, reg2, mem1, mem2;
18300 if (load_p)
18302 reg1 = operands[0];
18303 reg2 = operands[2];
18304 mem1 = operands[1];
18305 mem2 = operands[3];
18307 else
18309 reg1 = operands[1];
18310 reg2 = operands[3];
18311 mem1 = operands[0];
18312 mem2 = operands[2];
18315 if (REGNO (reg2) == REGNO (reg1) + 1)
18317 umips_output_load_store_pair_1 (load_p, reg1, mem1);
18318 return;
18321 gcc_assert (REGNO (reg1) == REGNO (reg2) + 1);
18322 umips_output_load_store_pair_1 (load_p, reg2, mem2);
18325 /* Return true if REG1 and REG2 match the criteria for a movep insn. */
18327 bool
18328 umips_movep_target_p (rtx reg1, rtx reg2)
18330 int regno1, regno2, pair;
18331 unsigned int i;
18332 static const int match[8] = {
18333 0x00000060, /* 5, 6 */
18334 0x000000a0, /* 5, 7 */
18335 0x000000c0, /* 6, 7 */
18336 0x00200010, /* 4, 21 */
18337 0x00400010, /* 4, 22 */
18338 0x00000030, /* 4, 5 */
18339 0x00000050, /* 4, 6 */
18340 0x00000090 /* 4, 7 */
18343 if (!REG_P (reg1) || !REG_P (reg2))
18344 return false;
18346 regno1 = REGNO (reg1);
18347 regno2 = REGNO (reg2);
18349 if (!GP_REG_P (regno1) || !GP_REG_P (regno2))
18350 return false;
18352 pair = (1 << regno1) | (1 << regno2);
18354 for (i = 0; i < ARRAY_SIZE (match); i++)
18355 if (pair == match[i])
18356 return true;
18358 return false;
18361 /* Return the size in bytes of the trampoline code, padded to
18362 TRAMPOLINE_ALIGNMENT bits. The static chain pointer and target
18363 function address immediately follow. */
18366 mips_trampoline_code_size (void)
18368 if (TARGET_USE_PIC_FN_ADDR_REG)
18369 return 4 * 4;
18370 else if (ptr_mode == DImode)
18371 return 8 * 4;
18372 else if (ISA_HAS_LOAD_DELAY)
18373 return 6 * 4;
18374 else
18375 return 4 * 4;
18378 /* Implement TARGET_TRAMPOLINE_INIT. */
18380 static void
18381 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
18383 rtx addr, end_addr, high, low, opcode, mem;
18384 rtx trampoline[8];
18385 unsigned int i, j;
18386 HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
18388 /* Work out the offsets of the pointers from the start of the
18389 trampoline code. */
18390 end_addr_offset = mips_trampoline_code_size ();
18391 static_chain_offset = end_addr_offset;
18392 target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
18394 /* Get pointers to the beginning and end of the code block. */
18395 addr = force_reg (Pmode, XEXP (m_tramp, 0));
18396 end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
18398 #define OP(X) gen_int_mode (X, SImode)
18400 /* Build up the code in TRAMPOLINE. */
18401 i = 0;
18402 if (TARGET_USE_PIC_FN_ADDR_REG)
18404 /* $25 contains the address of the trampoline. Emit code of the form:
18406 l[wd] $1, target_function_offset($25)
18407 l[wd] $static_chain, static_chain_offset($25)
18408 jr $1
18409 move $25,$1. */
18410 trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
18411 target_function_offset,
18412 PIC_FUNCTION_ADDR_REGNUM));
18413 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18414 static_chain_offset,
18415 PIC_FUNCTION_ADDR_REGNUM));
18416 trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
18417 trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
18419 else if (ptr_mode == DImode)
18421 /* It's too cumbersome to create the full 64-bit address, so let's
18422 instead use:
18424 move $1, $31
18425 bal 1f
18427 1: l[wd] $25, target_function_offset - 12($31)
18428 l[wd] $static_chain, static_chain_offset - 12($31)
18429 jr $25
18430 move $31, $1
18432 where 12 is the offset of "1:" from the start of the code block. */
18433 trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
18434 trampoline[i++] = OP (MIPS_BAL (1));
18435 trampoline[i++] = OP (MIPS_NOP);
18436 trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18437 target_function_offset - 12,
18438 RETURN_ADDR_REGNUM));
18439 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18440 static_chain_offset - 12,
18441 RETURN_ADDR_REGNUM));
18442 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18443 trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
18445 else
18447 /* If the target has load delays, emit:
18449 lui $1, %hi(end_addr)
18450 lw $25, %lo(end_addr + ...)($1)
18451 lw $static_chain, %lo(end_addr + ...)($1)
18452 jr $25
18455 Otherwise emit:
18457 lui $1, %hi(end_addr)
18458 lw $25, %lo(end_addr + ...)($1)
18459 jr $25
18460 lw $static_chain, %lo(end_addr + ...)($1). */
18462 /* Split END_ADDR into %hi and %lo values. Trampolines are aligned
18463 to 64 bits, so the %lo value will have the bottom 3 bits clear. */
18464 high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
18465 NULL, false, OPTAB_WIDEN);
18466 high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
18467 NULL, false, OPTAB_WIDEN);
18468 low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
18470 /* Emit the LUI. */
18471 opcode = OP (MIPS_LUI (AT_REGNUM, 0));
18472 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
18473 NULL, false, OPTAB_WIDEN);
18475 /* Emit the load of the target function. */
18476 opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18477 target_function_offset - end_addr_offset,
18478 AT_REGNUM));
18479 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18480 NULL, false, OPTAB_WIDEN);
18482 /* Emit the JR here, if we can. */
18483 if (!ISA_HAS_LOAD_DELAY)
18484 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18486 /* Emit the load of the static chain register. */
18487 opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18488 static_chain_offset - end_addr_offset,
18489 AT_REGNUM));
18490 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18491 NULL, false, OPTAB_WIDEN);
18493 /* Emit the JR, if we couldn't above. */
18494 if (ISA_HAS_LOAD_DELAY)
18496 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18497 trampoline[i++] = OP (MIPS_NOP);
18501 #undef OP
18503 /* Copy the trampoline code. Leave any padding uninitialized. */
18504 for (j = 0; j < i; j++)
18506 mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
18507 mips_emit_move (mem, trampoline[j]);
18510 /* Set up the static chain pointer field. */
18511 mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
18512 mips_emit_move (mem, chain_value);
18514 /* Set up the target function field. */
18515 mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
18516 mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
18518 /* Flush the code part of the trampoline. */
18519 emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
18520 emit_insn (gen_clear_cache (addr, end_addr));
18523 /* Implement FUNCTION_PROFILER. */
18525 void mips_function_profiler (FILE *file)
18527 if (TARGET_MIPS16)
18528 sorry ("mips16 function profiling");
18529 if (TARGET_LONG_CALLS)
18531 /* For TARGET_LONG_CALLS use $3 for the address of _mcount. */
18532 if (Pmode == DImode)
18533 fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
18534 else
18535 fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
18537 mips_push_asm_switch (&mips_noat);
18538 fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
18539 reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
18540 /* _mcount treats $2 as the static chain register. */
18541 if (cfun->static_chain_decl != NULL)
18542 fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
18543 reg_names[STATIC_CHAIN_REGNUM]);
18544 if (TARGET_MCOUNT_RA_ADDRESS)
18546 /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
18547 ra save location. */
18548 if (cfun->machine->frame.ra_fp_offset == 0)
18549 /* ra not saved, pass zero. */
18550 fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
18551 else
18552 fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
18553 Pmode == DImode ? "dla" : "la", reg_names[12],
18554 cfun->machine->frame.ra_fp_offset,
18555 reg_names[STACK_POINTER_REGNUM]);
18557 if (!TARGET_NEWABI)
18558 fprintf (file,
18559 "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from stack\n",
18560 TARGET_64BIT ? "dsubu" : "subu",
18561 reg_names[STACK_POINTER_REGNUM],
18562 reg_names[STACK_POINTER_REGNUM],
18563 Pmode == DImode ? 16 : 8);
18565 if (TARGET_LONG_CALLS)
18566 fprintf (file, "\tjalr\t%s\n", reg_names[3]);
18567 else
18568 fprintf (file, "\tjal\t_mcount\n");
18569 mips_pop_asm_switch (&mips_noat);
18570 /* _mcount treats $2 as the static chain register. */
18571 if (cfun->static_chain_decl != NULL)
18572 fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
18573 reg_names[2]);
18576 /* Implement TARGET_SHIFT_TRUNCATION_MASK. We want to keep the default
18577 behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
18578 when TARGET_LOONGSON_VECTORS is true. */
18580 static unsigned HOST_WIDE_INT
18581 mips_shift_truncation_mask (machine_mode mode)
18583 if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
18584 return 0;
18586 return GET_MODE_BITSIZE (mode) - 1;
18589 /* Implement TARGET_PREPARE_PCH_SAVE. */
18591 static void
18592 mips_prepare_pch_save (void)
18594 /* We are called in a context where the current MIPS16 vs. non-MIPS16
18595 setting should be irrelevant. The question then is: which setting
18596 makes most sense at load time?
18598 The PCH is loaded before the first token is read. We should never
18599 have switched into MIPS16 mode by that point, and thus should not
18600 have populated mips16_globals. Nor can we load the entire contents
18601 of mips16_globals from the PCH file, because mips16_globals contains
18602 a combination of GGC and non-GGC data.
18604 There is therefore no point in trying save the GGC part of
18605 mips16_globals to the PCH file, or to preserve MIPS16ness across
18606 the PCH save and load. The loading compiler would not have access
18607 to the non-GGC parts of mips16_globals (either from the PCH file,
18608 or from a copy that the loading compiler generated itself) and would
18609 have to call target_reinit anyway.
18611 It therefore seems best to switch back to non-MIPS16 mode at
18612 save time, and to ensure that mips16_globals remains null after
18613 a PCH load. */
18614 mips_set_compression_mode (0);
18615 mips16_globals = 0;
18618 /* Generate or test for an insn that supports a constant permutation. */
18620 #define MAX_VECT_LEN 8
18622 struct expand_vec_perm_d
18624 rtx target, op0, op1;
18625 unsigned char perm[MAX_VECT_LEN];
18626 machine_mode vmode;
18627 unsigned char nelt;
18628 bool one_vector_p;
18629 bool testing_p;
18632 /* Construct (set target (vec_select op0 (parallel perm))) and
18633 return true if that's a valid instruction in the active ISA. */
18635 static bool
18636 mips_expand_vselect (rtx target, rtx op0,
18637 const unsigned char *perm, unsigned nelt)
18639 rtx rperm[MAX_VECT_LEN], x;
18640 rtx_insn *insn;
18641 unsigned i;
18643 for (i = 0; i < nelt; ++i)
18644 rperm[i] = GEN_INT (perm[i]);
18646 x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
18647 x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
18648 x = gen_rtx_SET (target, x);
18650 insn = emit_insn (x);
18651 if (recog_memoized (insn) < 0)
18653 remove_insn (insn);
18654 return false;
18656 return true;
18659 /* Similar, but generate a vec_concat from op0 and op1 as well. */
18661 static bool
18662 mips_expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
18663 const unsigned char *perm, unsigned nelt)
18665 machine_mode v2mode;
18666 rtx x;
18668 v2mode = GET_MODE_2XWIDER_MODE (GET_MODE (op0));
18669 x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
18670 return mips_expand_vselect (target, x, perm, nelt);
18673 /* Recognize patterns for even-odd extraction. */
18675 static bool
18676 mips_expand_vpc_loongson_even_odd (struct expand_vec_perm_d *d)
18678 unsigned i, odd, nelt = d->nelt;
18679 rtx t0, t1, t2, t3;
18681 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18682 return false;
18683 /* Even-odd for V2SI/V2SFmode is matched by interleave directly. */
18684 if (nelt < 4)
18685 return false;
18687 odd = d->perm[0];
18688 if (odd > 1)
18689 return false;
18690 for (i = 1; i < nelt; ++i)
18691 if (d->perm[i] != i * 2 + odd)
18692 return false;
18694 if (d->testing_p)
18695 return true;
18697 /* We need 2*log2(N)-1 operations to achieve odd/even with interleave. */
18698 t0 = gen_reg_rtx (d->vmode);
18699 t1 = gen_reg_rtx (d->vmode);
18700 switch (d->vmode)
18702 case V4HImode:
18703 emit_insn (gen_loongson_punpckhhw (t0, d->op0, d->op1));
18704 emit_insn (gen_loongson_punpcklhw (t1, d->op0, d->op1));
18705 if (odd)
18706 emit_insn (gen_loongson_punpckhhw (d->target, t1, t0));
18707 else
18708 emit_insn (gen_loongson_punpcklhw (d->target, t1, t0));
18709 break;
18711 case V8QImode:
18712 t2 = gen_reg_rtx (d->vmode);
18713 t3 = gen_reg_rtx (d->vmode);
18714 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op1));
18715 emit_insn (gen_loongson_punpcklbh (t1, d->op0, d->op1));
18716 emit_insn (gen_loongson_punpckhbh (t2, t1, t0));
18717 emit_insn (gen_loongson_punpcklbh (t3, t1, t0));
18718 if (odd)
18719 emit_insn (gen_loongson_punpckhbh (d->target, t3, t2));
18720 else
18721 emit_insn (gen_loongson_punpcklbh (d->target, t3, t2));
18722 break;
18724 default:
18725 gcc_unreachable ();
18727 return true;
18730 /* Recognize patterns for the Loongson PSHUFH instruction. */
18732 static bool
18733 mips_expand_vpc_loongson_pshufh (struct expand_vec_perm_d *d)
18735 unsigned i, mask;
18736 rtx rmask;
18738 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18739 return false;
18740 if (d->vmode != V4HImode)
18741 return false;
18742 if (d->testing_p)
18743 return true;
18745 /* Convert the selector into the packed 8-bit form for pshufh. */
18746 /* Recall that loongson is little-endian only. No big-endian
18747 adjustment required. */
18748 for (i = mask = 0; i < 4; i++)
18749 mask |= (d->perm[i] & 3) << (i * 2);
18750 rmask = force_reg (SImode, GEN_INT (mask));
18752 if (d->one_vector_p)
18753 emit_insn (gen_loongson_pshufh (d->target, d->op0, rmask));
18754 else
18756 rtx t0, t1, x, merge, rmerge[4];
18758 t0 = gen_reg_rtx (V4HImode);
18759 t1 = gen_reg_rtx (V4HImode);
18760 emit_insn (gen_loongson_pshufh (t1, d->op1, rmask));
18761 emit_insn (gen_loongson_pshufh (t0, d->op0, rmask));
18763 for (i = 0; i < 4; ++i)
18764 rmerge[i] = (d->perm[i] & 4 ? constm1_rtx : const0_rtx);
18765 merge = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmerge));
18766 merge = force_reg (V4HImode, merge);
18768 x = gen_rtx_AND (V4HImode, merge, t1);
18769 emit_insn (gen_rtx_SET (t1, x));
18771 x = gen_rtx_NOT (V4HImode, merge);
18772 x = gen_rtx_AND (V4HImode, x, t0);
18773 emit_insn (gen_rtx_SET (t0, x));
18775 x = gen_rtx_IOR (V4HImode, t0, t1);
18776 emit_insn (gen_rtx_SET (d->target, x));
18779 return true;
18782 /* Recognize broadcast patterns for the Loongson. */
18784 static bool
18785 mips_expand_vpc_loongson_bcast (struct expand_vec_perm_d *d)
18787 unsigned i, elt;
18788 rtx t0, t1;
18790 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18791 return false;
18792 /* Note that we've already matched V2SI via punpck and V4HI via pshufh. */
18793 if (d->vmode != V8QImode)
18794 return false;
18795 if (!d->one_vector_p)
18796 return false;
18798 elt = d->perm[0];
18799 for (i = 1; i < 8; ++i)
18800 if (d->perm[i] != elt)
18801 return false;
18803 if (d->testing_p)
18804 return true;
18806 /* With one interleave we put two of the desired element adjacent. */
18807 t0 = gen_reg_rtx (V8QImode);
18808 if (elt < 4)
18809 emit_insn (gen_loongson_punpcklbh (t0, d->op0, d->op0));
18810 else
18811 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op0));
18813 /* Shuffle that one HImode element into all locations. */
18814 elt &= 3;
18815 elt *= 0x55;
18816 t1 = gen_reg_rtx (V4HImode);
18817 emit_insn (gen_loongson_pshufh (t1, gen_lowpart (V4HImode, t0),
18818 force_reg (SImode, GEN_INT (elt))));
18820 emit_move_insn (d->target, gen_lowpart (V8QImode, t1));
18821 return true;
18824 static bool
18825 mips_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
18827 unsigned int i, nelt = d->nelt;
18828 unsigned char perm2[MAX_VECT_LEN];
18830 if (d->one_vector_p)
18832 /* Try interleave with alternating operands. */
18833 memcpy (perm2, d->perm, sizeof(perm2));
18834 for (i = 1; i < nelt; i += 2)
18835 perm2[i] += nelt;
18836 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1, perm2, nelt))
18837 return true;
18839 else
18841 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1,
18842 d->perm, nelt))
18843 return true;
18845 /* Try again with swapped operands. */
18846 for (i = 0; i < nelt; ++i)
18847 perm2[i] = (d->perm[i] + nelt) & (2 * nelt - 1);
18848 if (mips_expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
18849 return true;
18852 if (mips_expand_vpc_loongson_even_odd (d))
18853 return true;
18854 if (mips_expand_vpc_loongson_pshufh (d))
18855 return true;
18856 if (mips_expand_vpc_loongson_bcast (d))
18857 return true;
18858 return false;
18861 /* Expand a vec_perm_const pattern. */
18863 bool
18864 mips_expand_vec_perm_const (rtx operands[4])
18866 struct expand_vec_perm_d d;
18867 int i, nelt, which;
18868 unsigned char orig_perm[MAX_VECT_LEN];
18869 rtx sel;
18870 bool ok;
18872 d.target = operands[0];
18873 d.op0 = operands[1];
18874 d.op1 = operands[2];
18875 sel = operands[3];
18877 d.vmode = GET_MODE (d.target);
18878 gcc_assert (VECTOR_MODE_P (d.vmode));
18879 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18880 d.testing_p = false;
18882 for (i = which = 0; i < nelt; ++i)
18884 rtx e = XVECEXP (sel, 0, i);
18885 int ei = INTVAL (e) & (2 * nelt - 1);
18886 which |= (ei < nelt ? 1 : 2);
18887 orig_perm[i] = ei;
18889 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18891 switch (which)
18893 default:
18894 gcc_unreachable();
18896 case 3:
18897 d.one_vector_p = false;
18898 if (!rtx_equal_p (d.op0, d.op1))
18899 break;
18900 /* FALLTHRU */
18902 case 2:
18903 for (i = 0; i < nelt; ++i)
18904 d.perm[i] &= nelt - 1;
18905 d.op0 = d.op1;
18906 d.one_vector_p = true;
18907 break;
18909 case 1:
18910 d.op1 = d.op0;
18911 d.one_vector_p = true;
18912 break;
18915 ok = mips_expand_vec_perm_const_1 (&d);
18917 /* If we were given a two-vector permutation which just happened to
18918 have both input vectors equal, we folded this into a one-vector
18919 permutation. There are several loongson patterns that are matched
18920 via direct vec_select+vec_concat expansion, but we do not have
18921 support in mips_expand_vec_perm_const_1 to guess the adjustment
18922 that should be made for a single operand. Just try again with
18923 the original permutation. */
18924 if (!ok && which == 3)
18926 d.op0 = operands[1];
18927 d.op1 = operands[2];
18928 d.one_vector_p = false;
18929 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18930 ok = mips_expand_vec_perm_const_1 (&d);
18933 return ok;
18936 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST_OK. */
18938 static bool
18939 mips_vectorize_vec_perm_const_ok (machine_mode vmode,
18940 const unsigned char *sel)
18942 struct expand_vec_perm_d d;
18943 unsigned int i, nelt, which;
18944 bool ret;
18946 d.vmode = vmode;
18947 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18948 d.testing_p = true;
18949 memcpy (d.perm, sel, nelt);
18951 /* Categorize the set of elements in the selector. */
18952 for (i = which = 0; i < nelt; ++i)
18954 unsigned char e = d.perm[i];
18955 gcc_assert (e < 2 * nelt);
18956 which |= (e < nelt ? 1 : 2);
18959 /* For all elements from second vector, fold the elements to first. */
18960 if (which == 2)
18961 for (i = 0; i < nelt; ++i)
18962 d.perm[i] -= nelt;
18964 /* Check whether the mask can be applied to the vector type. */
18965 d.one_vector_p = (which != 3);
18967 d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
18968 d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
18969 if (!d.one_vector_p)
18970 d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
18972 start_sequence ();
18973 ret = mips_expand_vec_perm_const_1 (&d);
18974 end_sequence ();
18976 return ret;
18979 /* Expand an integral vector unpack operation. */
18981 void
18982 mips_expand_vec_unpack (rtx operands[2], bool unsigned_p, bool high_p)
18984 machine_mode imode = GET_MODE (operands[1]);
18985 rtx (*unpack) (rtx, rtx, rtx);
18986 rtx (*cmpgt) (rtx, rtx, rtx);
18987 rtx tmp, dest, zero;
18989 switch (imode)
18991 case V8QImode:
18992 if (high_p)
18993 unpack = gen_loongson_punpckhbh;
18994 else
18995 unpack = gen_loongson_punpcklbh;
18996 cmpgt = gen_loongson_pcmpgtb;
18997 break;
18998 case V4HImode:
18999 if (high_p)
19000 unpack = gen_loongson_punpckhhw;
19001 else
19002 unpack = gen_loongson_punpcklhw;
19003 cmpgt = gen_loongson_pcmpgth;
19004 break;
19005 default:
19006 gcc_unreachable ();
19009 zero = force_reg (imode, CONST0_RTX (imode));
19010 if (unsigned_p)
19011 tmp = zero;
19012 else
19014 tmp = gen_reg_rtx (imode);
19015 emit_insn (cmpgt (tmp, zero, operands[1]));
19018 dest = gen_reg_rtx (imode);
19019 emit_insn (unpack (dest, operands[1], tmp));
19021 emit_move_insn (operands[0], gen_lowpart (GET_MODE (operands[0]), dest));
19024 /* A subroutine of mips_expand_vec_init, match constant vector elements. */
19026 static inline bool
19027 mips_constant_elt_p (rtx x)
19029 return CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE;
19032 /* A subroutine of mips_expand_vec_init, expand via broadcast. */
19034 static void
19035 mips_expand_vi_broadcast (machine_mode vmode, rtx target, rtx elt)
19037 struct expand_vec_perm_d d;
19038 rtx t1;
19039 bool ok;
19041 if (elt != const0_rtx)
19042 elt = force_reg (GET_MODE_INNER (vmode), elt);
19043 if (REG_P (elt))
19044 elt = gen_lowpart (DImode, elt);
19046 t1 = gen_reg_rtx (vmode);
19047 switch (vmode)
19049 case V8QImode:
19050 emit_insn (gen_loongson_vec_init1_v8qi (t1, elt));
19051 break;
19052 case V4HImode:
19053 emit_insn (gen_loongson_vec_init1_v4hi (t1, elt));
19054 break;
19055 default:
19056 gcc_unreachable ();
19059 memset (&d, 0, sizeof (d));
19060 d.target = target;
19061 d.op0 = t1;
19062 d.op1 = t1;
19063 d.vmode = vmode;
19064 d.nelt = GET_MODE_NUNITS (vmode);
19065 d.one_vector_p = true;
19067 ok = mips_expand_vec_perm_const_1 (&d);
19068 gcc_assert (ok);
19071 /* A subroutine of mips_expand_vec_init, replacing all of the non-constant
19072 elements of VALS with zeros, copy the constant vector to TARGET. */
19074 static void
19075 mips_expand_vi_constant (machine_mode vmode, unsigned nelt,
19076 rtx target, rtx vals)
19078 rtvec vec = shallow_copy_rtvec (XVEC (vals, 0));
19079 unsigned i;
19081 for (i = 0; i < nelt; ++i)
19083 if (!mips_constant_elt_p (RTVEC_ELT (vec, i)))
19084 RTVEC_ELT (vec, i) = const0_rtx;
19087 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, vec));
19091 /* A subroutine of mips_expand_vec_init, expand via pinsrh. */
19093 static void
19094 mips_expand_vi_loongson_one_pinsrh (rtx target, rtx vals, unsigned one_var)
19096 mips_expand_vi_constant (V4HImode, 4, target, vals);
19098 emit_insn (gen_vec_setv4hi (target, target, XVECEXP (vals, 0, one_var),
19099 GEN_INT (one_var)));
19102 /* A subroutine of mips_expand_vec_init, expand anything via memory. */
19104 static void
19105 mips_expand_vi_general (machine_mode vmode, machine_mode imode,
19106 unsigned nelt, unsigned nvar, rtx target, rtx vals)
19108 rtx mem = assign_stack_temp (vmode, GET_MODE_SIZE (vmode));
19109 unsigned int i, isize = GET_MODE_SIZE (imode);
19111 if (nvar < nelt)
19112 mips_expand_vi_constant (vmode, nelt, mem, vals);
19114 for (i = 0; i < nelt; ++i)
19116 rtx x = XVECEXP (vals, 0, i);
19117 if (!mips_constant_elt_p (x))
19118 emit_move_insn (adjust_address (mem, imode, i * isize), x);
19121 emit_move_insn (target, mem);
19124 /* Expand a vector initialization. */
19126 void
19127 mips_expand_vector_init (rtx target, rtx vals)
19129 machine_mode vmode = GET_MODE (target);
19130 machine_mode imode = GET_MODE_INNER (vmode);
19131 unsigned i, nelt = GET_MODE_NUNITS (vmode);
19132 unsigned nvar = 0, one_var = -1u;
19133 bool all_same = true;
19134 rtx x;
19136 for (i = 0; i < nelt; ++i)
19138 x = XVECEXP (vals, 0, i);
19139 if (!mips_constant_elt_p (x))
19140 nvar++, one_var = i;
19141 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
19142 all_same = false;
19145 /* Load constants from the pool, or whatever's handy. */
19146 if (nvar == 0)
19148 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)));
19149 return;
19152 /* For two-part initialization, always use CONCAT. */
19153 if (nelt == 2)
19155 rtx op0 = force_reg (imode, XVECEXP (vals, 0, 0));
19156 rtx op1 = force_reg (imode, XVECEXP (vals, 0, 1));
19157 x = gen_rtx_VEC_CONCAT (vmode, op0, op1);
19158 emit_insn (gen_rtx_SET (target, x));
19159 return;
19162 /* Loongson is the only cpu with vectors with more elements. */
19163 gcc_assert (TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS);
19165 /* If all values are identical, broadcast the value. */
19166 if (all_same)
19168 mips_expand_vi_broadcast (vmode, target, XVECEXP (vals, 0, 0));
19169 return;
19172 /* If we've only got one non-variable V4HImode, use PINSRH. */
19173 if (nvar == 1 && vmode == V4HImode)
19175 mips_expand_vi_loongson_one_pinsrh (target, vals, one_var);
19176 return;
19179 mips_expand_vi_general (vmode, imode, nelt, nvar, target, vals);
19182 /* Expand a vector reduction. */
19184 void
19185 mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
19187 machine_mode vmode = GET_MODE (in);
19188 unsigned char perm2[2];
19189 rtx last, next, fold, x;
19190 bool ok;
19192 last = in;
19193 fold = gen_reg_rtx (vmode);
19194 switch (vmode)
19196 case V2SFmode:
19197 /* Use PUL/PLU to produce { L, H } op { H, L }.
19198 By reversing the pair order, rather than a pure interleave high,
19199 we avoid erroneous exceptional conditions that we might otherwise
19200 produce from the computation of H op H. */
19201 perm2[0] = 1;
19202 perm2[1] = 2;
19203 ok = mips_expand_vselect_vconcat (fold, last, last, perm2, 2);
19204 gcc_assert (ok);
19205 break;
19207 case V2SImode:
19208 /* Use interleave to produce { H, L } op { H, H }. */
19209 emit_insn (gen_loongson_punpckhwd (fold, last, last));
19210 break;
19212 case V4HImode:
19213 /* Perform the first reduction with interleave,
19214 and subsequent reductions with shifts. */
19215 emit_insn (gen_loongson_punpckhwd_hi (fold, last, last));
19217 next = gen_reg_rtx (vmode);
19218 emit_insn (gen (next, last, fold));
19219 last = next;
19221 fold = gen_reg_rtx (vmode);
19222 x = force_reg (SImode, GEN_INT (16));
19223 emit_insn (gen_vec_shr_v4hi (fold, last, x));
19224 break;
19226 case V8QImode:
19227 emit_insn (gen_loongson_punpckhwd_qi (fold, last, last));
19229 next = gen_reg_rtx (vmode);
19230 emit_insn (gen (next, last, fold));
19231 last = next;
19233 fold = gen_reg_rtx (vmode);
19234 x = force_reg (SImode, GEN_INT (16));
19235 emit_insn (gen_vec_shr_v8qi (fold, last, x));
19237 next = gen_reg_rtx (vmode);
19238 emit_insn (gen (next, last, fold));
19239 last = next;
19241 fold = gen_reg_rtx (vmode);
19242 x = force_reg (SImode, GEN_INT (8));
19243 emit_insn (gen_vec_shr_v8qi (fold, last, x));
19244 break;
19246 default:
19247 gcc_unreachable ();
19250 emit_insn (gen (target, last, fold));
19253 /* Expand a vector minimum/maximum. */
19255 void
19256 mips_expand_vec_minmax (rtx target, rtx op0, rtx op1,
19257 rtx (*cmp) (rtx, rtx, rtx), bool min_p)
19259 machine_mode vmode = GET_MODE (target);
19260 rtx tc, t0, t1, x;
19262 tc = gen_reg_rtx (vmode);
19263 t0 = gen_reg_rtx (vmode);
19264 t1 = gen_reg_rtx (vmode);
19266 /* op0 > op1 */
19267 emit_insn (cmp (tc, op0, op1));
19269 x = gen_rtx_AND (vmode, tc, (min_p ? op1 : op0));
19270 emit_insn (gen_rtx_SET (t0, x));
19272 x = gen_rtx_NOT (vmode, tc);
19273 x = gen_rtx_AND (vmode, x, (min_p ? op0 : op1));
19274 emit_insn (gen_rtx_SET (t1, x));
19276 x = gen_rtx_IOR (vmode, t0, t1);
19277 emit_insn (gen_rtx_SET (target, x));
19280 /* Implement HARD_REGNO_CALLER_SAVE_MODE. */
19282 machine_mode
19283 mips_hard_regno_caller_save_mode (unsigned int regno,
19284 unsigned int nregs,
19285 machine_mode mode)
19287 /* For performance, avoid saving/restoring upper parts of a register
19288 by returning MODE as save mode when the mode is known. */
19289 if (mode == VOIDmode)
19290 return choose_hard_reg_mode (regno, nregs, false);
19291 else
19292 return mode;
19295 /* Implement TARGET_CASE_VALUES_THRESHOLD. */
19297 unsigned int
19298 mips_case_values_threshold (void)
19300 /* In MIPS16 mode using a larger case threshold generates smaller code. */
19301 if (TARGET_MIPS16 && optimize_size)
19302 return 10;
19303 else
19304 return default_case_values_threshold ();
19307 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */
19309 static void
19310 mips_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
19312 if (!TARGET_HARD_FLOAT_ABI)
19313 return;
19314 tree exceptions_var = create_tmp_var (MIPS_ATYPE_USI);
19315 tree fcsr_orig_var = create_tmp_var (MIPS_ATYPE_USI);
19316 tree fcsr_mod_var = create_tmp_var (MIPS_ATYPE_USI);
19317 tree get_fcsr = mips_builtin_decls[MIPS_GET_FCSR];
19318 tree set_fcsr = mips_builtin_decls[MIPS_SET_FCSR];
19319 tree get_fcsr_hold_call = build_call_expr (get_fcsr, 0);
19320 tree hold_assign_orig = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19321 fcsr_orig_var, get_fcsr_hold_call);
19322 tree hold_mod_val = build2 (BIT_AND_EXPR, MIPS_ATYPE_USI, fcsr_orig_var,
19323 build_int_cst (MIPS_ATYPE_USI, 0xfffff003));
19324 tree hold_assign_mod = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19325 fcsr_mod_var, hold_mod_val);
19326 tree set_fcsr_hold_call = build_call_expr (set_fcsr, 1, fcsr_mod_var);
19327 tree hold_all = build2 (COMPOUND_EXPR, MIPS_ATYPE_USI,
19328 hold_assign_orig, hold_assign_mod);
19329 *hold = build2 (COMPOUND_EXPR, void_type_node, hold_all,
19330 set_fcsr_hold_call);
19332 *clear = build_call_expr (set_fcsr, 1, fcsr_mod_var);
19334 tree get_fcsr_update_call = build_call_expr (get_fcsr, 0);
19335 *update = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
19336 exceptions_var, get_fcsr_update_call);
19337 tree set_fcsr_update_call = build_call_expr (set_fcsr, 1, fcsr_orig_var);
19338 *update = build2 (COMPOUND_EXPR, void_type_node, *update,
19339 set_fcsr_update_call);
19340 tree atomic_feraiseexcept
19341 = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
19342 tree int_exceptions_var = fold_convert (integer_type_node,
19343 exceptions_var);
19344 tree atomic_feraiseexcept_call = build_call_expr (atomic_feraiseexcept,
19345 1, int_exceptions_var);
19346 *update = build2 (COMPOUND_EXPR, void_type_node, *update,
19347 atomic_feraiseexcept_call);
19350 /* Implement TARGET_SPILL_CLASS. */
19352 static reg_class_t
19353 mips_spill_class (reg_class_t rclass ATTRIBUTE_UNUSED,
19354 machine_mode mode ATTRIBUTE_UNUSED)
19356 if (TARGET_MIPS16)
19357 return SPILL_REGS;
19358 return NO_REGS;
19361 /* Implement TARGET_LRA_P. */
19363 static bool
19364 mips_lra_p (void)
19366 return mips_lra_flag;
19369 /* Implement TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS. */
19371 static reg_class_t
19372 mips_ira_change_pseudo_allocno_class (int regno, reg_class_t allocno_class)
19374 /* LRA will allocate an FPR for an integer mode pseudo instead of spilling
19375 to memory if an FPR is present in the allocno class. It is rare that
19376 we actually need to place an integer mode value in an FPR so where
19377 possible limit the allocation to GR_REGS. This will slightly pessimize
19378 code that involves integer to/from float conversions as these will have
19379 to reload into FPRs in LRA. Such reloads are sometimes eliminated and
19380 sometimes only partially eliminated. We choose to take this penalty
19381 in order to eliminate usage of FPRs in code that does not use floating
19382 point data.
19384 This change has a similar effect to increasing the cost of FPR->GPR
19385 register moves for integer modes so that they are higher than the cost
19386 of memory but changing the allocno class is more reliable.
19388 This is also similar to forbidding integer mode values in FPRs entirely
19389 but this would lead to an inconsistency in the integer to/from float
19390 instructions that say integer mode values must be placed in FPRs. */
19391 if (INTEGRAL_MODE_P (PSEUDO_REGNO_MODE (regno)) && allocno_class == ALL_REGS)
19392 return GR_REGS;
19393 return allocno_class;
19396 /* Initialize the GCC target structure. */
19397 #undef TARGET_ASM_ALIGNED_HI_OP
19398 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
19399 #undef TARGET_ASM_ALIGNED_SI_OP
19400 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
19401 #undef TARGET_ASM_ALIGNED_DI_OP
19402 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
19404 #undef TARGET_OPTION_OVERRIDE
19405 #define TARGET_OPTION_OVERRIDE mips_option_override
19407 #undef TARGET_LEGITIMIZE_ADDRESS
19408 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
19410 #undef TARGET_ASM_FUNCTION_PROLOGUE
19411 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
19412 #undef TARGET_ASM_FUNCTION_EPILOGUE
19413 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
19414 #undef TARGET_ASM_SELECT_RTX_SECTION
19415 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
19416 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
19417 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
19419 #undef TARGET_SCHED_INIT
19420 #define TARGET_SCHED_INIT mips_sched_init
19421 #undef TARGET_SCHED_REORDER
19422 #define TARGET_SCHED_REORDER mips_sched_reorder
19423 #undef TARGET_SCHED_REORDER2
19424 #define TARGET_SCHED_REORDER2 mips_sched_reorder2
19425 #undef TARGET_SCHED_VARIABLE_ISSUE
19426 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
19427 #undef TARGET_SCHED_ADJUST_COST
19428 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
19429 #undef TARGET_SCHED_ISSUE_RATE
19430 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
19431 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
19432 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
19433 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
19434 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
19435 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
19436 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
19437 mips_multipass_dfa_lookahead
19438 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
19439 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
19440 mips_small_register_classes_for_mode_p
19442 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
19443 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
19445 #undef TARGET_INSERT_ATTRIBUTES
19446 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
19447 #undef TARGET_MERGE_DECL_ATTRIBUTES
19448 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
19449 #undef TARGET_CAN_INLINE_P
19450 #define TARGET_CAN_INLINE_P mips_can_inline_p
19451 #undef TARGET_SET_CURRENT_FUNCTION
19452 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
19454 #undef TARGET_VALID_POINTER_MODE
19455 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
19456 #undef TARGET_REGISTER_MOVE_COST
19457 #define TARGET_REGISTER_MOVE_COST mips_register_move_cost
19458 #undef TARGET_REGISTER_PRIORITY
19459 #define TARGET_REGISTER_PRIORITY mips_register_priority
19460 #undef TARGET_MEMORY_MOVE_COST
19461 #define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
19462 #undef TARGET_RTX_COSTS
19463 #define TARGET_RTX_COSTS mips_rtx_costs
19464 #undef TARGET_ADDRESS_COST
19465 #define TARGET_ADDRESS_COST mips_address_cost
19467 #undef TARGET_IN_SMALL_DATA_P
19468 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
19470 #undef TARGET_MACHINE_DEPENDENT_REORG
19471 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
19473 #undef TARGET_PREFERRED_RELOAD_CLASS
19474 #define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
19476 #undef TARGET_EXPAND_TO_RTL_HOOK
19477 #define TARGET_EXPAND_TO_RTL_HOOK mips_expand_to_rtl_hook
19478 #undef TARGET_ASM_FILE_START
19479 #define TARGET_ASM_FILE_START mips_file_start
19480 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
19481 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
19482 #undef TARGET_ASM_CODE_END
19483 #define TARGET_ASM_CODE_END mips_code_end
19485 #undef TARGET_INIT_LIBFUNCS
19486 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
19488 #undef TARGET_BUILD_BUILTIN_VA_LIST
19489 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
19490 #undef TARGET_EXPAND_BUILTIN_VA_START
19491 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
19492 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
19493 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
19495 #undef TARGET_PROMOTE_FUNCTION_MODE
19496 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
19497 #undef TARGET_PROMOTE_PROTOTYPES
19498 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
19500 #undef TARGET_FUNCTION_VALUE
19501 #define TARGET_FUNCTION_VALUE mips_function_value
19502 #undef TARGET_LIBCALL_VALUE
19503 #define TARGET_LIBCALL_VALUE mips_libcall_value
19504 #undef TARGET_FUNCTION_VALUE_REGNO_P
19505 #define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
19506 #undef TARGET_RETURN_IN_MEMORY
19507 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
19508 #undef TARGET_RETURN_IN_MSB
19509 #define TARGET_RETURN_IN_MSB mips_return_in_msb
19511 #undef TARGET_ASM_OUTPUT_MI_THUNK
19512 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
19513 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
19514 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
19516 #undef TARGET_PRINT_OPERAND
19517 #define TARGET_PRINT_OPERAND mips_print_operand
19518 #undef TARGET_PRINT_OPERAND_ADDRESS
19519 #define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
19520 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
19521 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
19523 #undef TARGET_SETUP_INCOMING_VARARGS
19524 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
19525 #undef TARGET_STRICT_ARGUMENT_NAMING
19526 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
19527 #undef TARGET_MUST_PASS_IN_STACK
19528 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
19529 #undef TARGET_PASS_BY_REFERENCE
19530 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
19531 #undef TARGET_CALLEE_COPIES
19532 #define TARGET_CALLEE_COPIES mips_callee_copies
19533 #undef TARGET_ARG_PARTIAL_BYTES
19534 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
19535 #undef TARGET_FUNCTION_ARG
19536 #define TARGET_FUNCTION_ARG mips_function_arg
19537 #undef TARGET_FUNCTION_ARG_ADVANCE
19538 #define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
19539 #undef TARGET_FUNCTION_ARG_BOUNDARY
19540 #define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
19541 #undef TARGET_GET_RAW_RESULT_MODE
19542 #define TARGET_GET_RAW_RESULT_MODE mips_get_reg_raw_mode
19543 #undef TARGET_GET_RAW_ARG_MODE
19544 #define TARGET_GET_RAW_ARG_MODE mips_get_reg_raw_mode
19546 #undef TARGET_MODE_REP_EXTENDED
19547 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
19549 #undef TARGET_VECTOR_MODE_SUPPORTED_P
19550 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
19552 #undef TARGET_SCALAR_MODE_SUPPORTED_P
19553 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
19555 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
19556 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
19558 #undef TARGET_INIT_BUILTINS
19559 #define TARGET_INIT_BUILTINS mips_init_builtins
19560 #undef TARGET_BUILTIN_DECL
19561 #define TARGET_BUILTIN_DECL mips_builtin_decl
19562 #undef TARGET_EXPAND_BUILTIN
19563 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
19565 #undef TARGET_HAVE_TLS
19566 #define TARGET_HAVE_TLS HAVE_AS_TLS
19568 #undef TARGET_CANNOT_FORCE_CONST_MEM
19569 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
19571 #undef TARGET_LEGITIMATE_CONSTANT_P
19572 #define TARGET_LEGITIMATE_CONSTANT_P mips_legitimate_constant_p
19574 #undef TARGET_ENCODE_SECTION_INFO
19575 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
19577 #undef TARGET_ATTRIBUTE_TABLE
19578 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
19579 /* All our function attributes are related to how out-of-line copies should
19580 be compiled or called. They don't in themselves prevent inlining. */
19581 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
19582 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
19584 #undef TARGET_EXTRA_LIVE_ON_ENTRY
19585 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
19587 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
19588 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
19589 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
19590 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
19592 #undef TARGET_COMP_TYPE_ATTRIBUTES
19593 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
19595 #ifdef HAVE_AS_DTPRELWORD
19596 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
19597 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
19598 #endif
19599 #undef TARGET_DWARF_REGISTER_SPAN
19600 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
19601 #undef TARGET_DWARF_FRAME_REG_MODE
19602 #define TARGET_DWARF_FRAME_REG_MODE mips_dwarf_frame_reg_mode
19604 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
19605 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
19607 #undef TARGET_LEGITIMATE_ADDRESS_P
19608 #define TARGET_LEGITIMATE_ADDRESS_P mips_legitimate_address_p
19610 #undef TARGET_FRAME_POINTER_REQUIRED
19611 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
19613 #undef TARGET_CAN_ELIMINATE
19614 #define TARGET_CAN_ELIMINATE mips_can_eliminate
19616 #undef TARGET_CONDITIONAL_REGISTER_USAGE
19617 #define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
19619 #undef TARGET_TRAMPOLINE_INIT
19620 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
19622 #undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
19623 #define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
19625 #undef TARGET_SHIFT_TRUNCATION_MASK
19626 #define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
19628 #undef TARGET_PREPARE_PCH_SAVE
19629 #define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
19631 #undef TARGET_VECTORIZE_VEC_PERM_CONST_OK
19632 #define TARGET_VECTORIZE_VEC_PERM_CONST_OK mips_vectorize_vec_perm_const_ok
19634 #undef TARGET_CASE_VALUES_THRESHOLD
19635 #define TARGET_CASE_VALUES_THRESHOLD mips_case_values_threshold
19637 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
19638 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV mips_atomic_assign_expand_fenv
19640 #undef TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
19641 #define TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS true
19643 #undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
19644 #define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P \
19645 mips_use_by_pieces_infrastructure_p
19647 #undef TARGET_SPILL_CLASS
19648 #define TARGET_SPILL_CLASS mips_spill_class
19649 #undef TARGET_LRA_P
19650 #define TARGET_LRA_P mips_lra_p
19651 #undef TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
19652 #define TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS mips_ira_change_pseudo_allocno_class
19654 struct gcc_target targetm = TARGET_INITIALIZER;
19656 #include "gt-mips.h"