5bad0f8b12272765b955b379c25be5b2f26dffd8
[gcc.git] / gcc / config / mips / mips.c
1 /* Subroutines used for MIPS code generation.
2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
3 Contributed by A. Lichnewsky, lich@inria.inria.fr.
4 Changes by Michael Meissner, meissner@osf.org.
5 64-bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
6 Brendan Eich, brendan@microunity.com.
7
8 This file is part of GCC.
9
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.
14
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.
19
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/>. */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-attr.h"
34 #include "recog.h"
35 #include "output.h"
36 #include "tree.h"
37 #include "varasm.h"
38 #include "stringpool.h"
39 #include "stor-layout.h"
40 #include "calls.h"
41 #include "function.h"
42 #include "expr.h"
43 #include "optabs.h"
44 #include "libfuncs.h"
45 #include "flags.h"
46 #include "reload.h"
47 #include "tm_p.h"
48 #include "ggc.h"
49 #include "gstab.h"
50 #include "hash-table.h"
51 #include "debug.h"
52 #include "target.h"
53 #include "target-def.h"
54 #include "common/common-target.h"
55 #include "langhooks.h"
56 #include "sched-int.h"
57 #include "pointer-set.h"
58 #include "vec.h"
59 #include "basic-block.h"
60 #include "tree-ssa-alias.h"
61 #include "internal-fn.h"
62 #include "gimple-fold.h"
63 #include "tree-eh.h"
64 #include "gimple-expr.h"
65 #include "is-a.h"
66 #include "gimple.h"
67 #include "gimplify.h"
68 #include "bitmap.h"
69 #include "diagnostic.h"
70 #include "target-globals.h"
71 #include "opts.h"
72 #include "tree-pass.h"
73 #include "context.h"
74
75 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
76 #define UNSPEC_ADDRESS_P(X) \
77 (GET_CODE (X) == UNSPEC \
78 && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
79 && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
80
81 /* Extract the symbol or label from UNSPEC wrapper X. */
82 #define UNSPEC_ADDRESS(X) \
83 XVECEXP (X, 0, 0)
84
85 /* Extract the symbol type from UNSPEC wrapper X. */
86 #define UNSPEC_ADDRESS_TYPE(X) \
87 ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
88
89 /* The maximum distance between the top of the stack frame and the
90 value $sp has when we save and restore registers.
91
92 The value for normal-mode code must be a SMALL_OPERAND and must
93 preserve the maximum stack alignment. We therefore use a value
94 of 0x7ff0 in this case.
95
96 microMIPS LWM and SWM support 12-bit offsets (from -0x800 to 0x7ff),
97 so we use a maximum of 0x7f0 for TARGET_MICROMIPS.
98
99 MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
100 up to 0x7f8 bytes and can usually save or restore all the registers
101 that we need to save or restore. (Note that we can only use these
102 instructions for o32, for which the stack alignment is 8 bytes.)
103
104 We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
105 RESTORE are not available. We can then use unextended instructions
106 to save and restore registers, and to allocate and deallocate the top
107 part of the frame. */
108 #define MIPS_MAX_FIRST_STACK_STEP \
109 (!TARGET_COMPRESSION ? 0x7ff0 \
110 : TARGET_MICROMIPS || GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8 \
111 : TARGET_64BIT ? 0x100 : 0x400)
112
113 /* True if INSN is a mips.md pattern or asm statement. */
114 /* ??? This test exists through the compiler, perhaps it should be
115 moved to rtl.h. */
116 #define USEFUL_INSN_P(INSN) \
117 (NONDEBUG_INSN_P (INSN) \
118 && GET_CODE (PATTERN (INSN)) != USE \
119 && GET_CODE (PATTERN (INSN)) != CLOBBER)
120
121 /* If INSN is a delayed branch sequence, return the first instruction
122 in the sequence, otherwise return INSN itself. */
123 #define SEQ_BEGIN(INSN) \
124 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
125 ? XVECEXP (PATTERN (INSN), 0, 0) \
126 : (INSN))
127
128 /* Likewise for the last instruction in a delayed branch sequence. */
129 #define SEQ_END(INSN) \
130 (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE \
131 ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1) \
132 : (INSN))
133
134 /* Execute the following loop body with SUBINSN set to each instruction
135 between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive. */
136 #define FOR_EACH_SUBINSN(SUBINSN, INSN) \
137 for ((SUBINSN) = SEQ_BEGIN (INSN); \
138 (SUBINSN) != NEXT_INSN (SEQ_END (INSN)); \
139 (SUBINSN) = NEXT_INSN (SUBINSN))
140
141 /* True if bit BIT is set in VALUE. */
142 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
143
144 /* Return the opcode for a ptr_mode load of the form:
145
146 l[wd] DEST, OFFSET(BASE). */
147 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE) \
148 (((ptr_mode == DImode ? 0x37 : 0x23) << 26) \
149 | ((BASE) << 21) \
150 | ((DEST) << 16) \
151 | (OFFSET))
152
153 /* Return the opcode to move register SRC into register DEST. */
154 #define MIPS_MOVE(DEST, SRC) \
155 ((TARGET_64BIT ? 0x2d : 0x21) \
156 | ((DEST) << 11) \
157 | ((SRC) << 21))
158
159 /* Return the opcode for:
160
161 lui DEST, VALUE. */
162 #define MIPS_LUI(DEST, VALUE) \
163 ((0xf << 26) | ((DEST) << 16) | (VALUE))
164
165 /* Return the opcode to jump to register DEST. */
166 #define MIPS_JR(DEST) \
167 (((DEST) << 21) | 0x8)
168
169 /* Return the opcode for:
170
171 bal . + (1 + OFFSET) * 4. */
172 #define MIPS_BAL(OFFSET) \
173 ((0x1 << 26) | (0x11 << 16) | (OFFSET))
174
175 /* Return the usual opcode for a nop. */
176 #define MIPS_NOP 0
177
178 /* Classifies an address.
179
180 ADDRESS_REG
181 A natural register + offset address. The register satisfies
182 mips_valid_base_register_p and the offset is a const_arith_operand.
183
184 ADDRESS_LO_SUM
185 A LO_SUM rtx. The first operand is a valid base register and
186 the second operand is a symbolic address.
187
188 ADDRESS_CONST_INT
189 A signed 16-bit constant address.
190
191 ADDRESS_SYMBOLIC:
192 A constant symbolic address. */
193 enum mips_address_type {
194 ADDRESS_REG,
195 ADDRESS_LO_SUM,
196 ADDRESS_CONST_INT,
197 ADDRESS_SYMBOLIC
198 };
199
200 /* Macros to create an enumeration identifier for a function prototype. */
201 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
202 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
203 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
204 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
205
206 /* Classifies the prototype of a built-in function. */
207 enum mips_function_type {
208 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
209 #include "config/mips/mips-ftypes.def"
210 #undef DEF_MIPS_FTYPE
211 MIPS_MAX_FTYPE_MAX
212 };
213
214 /* Specifies how a built-in function should be converted into rtl. */
215 enum mips_builtin_type {
216 /* The function corresponds directly to an .md pattern. The return
217 value is mapped to operand 0 and the arguments are mapped to
218 operands 1 and above. */
219 MIPS_BUILTIN_DIRECT,
220
221 /* The function corresponds directly to an .md pattern. There is no return
222 value and the arguments are mapped to operands 0 and above. */
223 MIPS_BUILTIN_DIRECT_NO_TARGET,
224
225 /* The function corresponds to a comparison instruction followed by
226 a mips_cond_move_tf_ps pattern. The first two arguments are the
227 values to compare and the second two arguments are the vector
228 operands for the movt.ps or movf.ps instruction (in assembly order). */
229 MIPS_BUILTIN_MOVF,
230 MIPS_BUILTIN_MOVT,
231
232 /* The function corresponds to a V2SF comparison instruction. Operand 0
233 of this instruction is the result of the comparison, which has mode
234 CCV2 or CCV4. The function arguments are mapped to operands 1 and
235 above. The function's return value is an SImode boolean that is
236 true under the following conditions:
237
238 MIPS_BUILTIN_CMP_ANY: one of the registers is true
239 MIPS_BUILTIN_CMP_ALL: all of the registers are true
240 MIPS_BUILTIN_CMP_LOWER: the first register is true
241 MIPS_BUILTIN_CMP_UPPER: the second register is true. */
242 MIPS_BUILTIN_CMP_ANY,
243 MIPS_BUILTIN_CMP_ALL,
244 MIPS_BUILTIN_CMP_UPPER,
245 MIPS_BUILTIN_CMP_LOWER,
246
247 /* As above, but the instruction only sets a single $fcc register. */
248 MIPS_BUILTIN_CMP_SINGLE,
249
250 /* For generating bposge32 branch instructions in MIPS32 DSP ASE. */
251 MIPS_BUILTIN_BPOSGE32
252 };
253
254 /* Invoke MACRO (COND) for each C.cond.fmt condition. */
255 #define MIPS_FP_CONDITIONS(MACRO) \
256 MACRO (f), \
257 MACRO (un), \
258 MACRO (eq), \
259 MACRO (ueq), \
260 MACRO (olt), \
261 MACRO (ult), \
262 MACRO (ole), \
263 MACRO (ule), \
264 MACRO (sf), \
265 MACRO (ngle), \
266 MACRO (seq), \
267 MACRO (ngl), \
268 MACRO (lt), \
269 MACRO (nge), \
270 MACRO (le), \
271 MACRO (ngt)
272
273 /* Enumerates the codes above as MIPS_FP_COND_<X>. */
274 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
275 enum mips_fp_condition {
276 MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
277 };
278
279 /* Index X provides the string representation of MIPS_FP_COND_<X>. */
280 #define STRINGIFY(X) #X
281 static const char *const mips_fp_conditions[] = {
282 MIPS_FP_CONDITIONS (STRINGIFY)
283 };
284
285 /* Tuning information that is automatically derived from other sources
286 (such as the scheduler). */
287 static struct {
288 /* The architecture and tuning settings that this structure describes. */
289 enum processor arch;
290 enum processor tune;
291
292 /* True if this structure describes MIPS16 settings. */
293 bool mips16_p;
294
295 /* True if the structure has been initialized. */
296 bool initialized_p;
297
298 /* True if "MULT $0, $0" is preferable to "MTLO $0; MTHI $0"
299 when optimizing for speed. */
300 bool fast_mult_zero_zero_p;
301 } mips_tuning_info;
302
303 /* Information about a function's frame layout. */
304 struct GTY(()) mips_frame_info {
305 /* The size of the frame in bytes. */
306 HOST_WIDE_INT total_size;
307
308 /* The number of bytes allocated to variables. */
309 HOST_WIDE_INT var_size;
310
311 /* The number of bytes allocated to outgoing function arguments. */
312 HOST_WIDE_INT args_size;
313
314 /* The number of bytes allocated to the .cprestore slot, or 0 if there
315 is no such slot. */
316 HOST_WIDE_INT cprestore_size;
317
318 /* Bit X is set if the function saves or restores GPR X. */
319 unsigned int mask;
320
321 /* Likewise FPR X. */
322 unsigned int fmask;
323
324 /* Likewise doubleword accumulator X ($acX). */
325 unsigned int acc_mask;
326
327 /* The number of GPRs, FPRs, doubleword accumulators and COP0
328 registers saved. */
329 unsigned int num_gp;
330 unsigned int num_fp;
331 unsigned int num_acc;
332 unsigned int num_cop0_regs;
333
334 /* The offset of the topmost GPR, FPR, accumulator and COP0-register
335 save slots from the top of the frame, or zero if no such slots are
336 needed. */
337 HOST_WIDE_INT gp_save_offset;
338 HOST_WIDE_INT fp_save_offset;
339 HOST_WIDE_INT acc_save_offset;
340 HOST_WIDE_INT cop0_save_offset;
341
342 /* Likewise, but giving offsets from the bottom of the frame. */
343 HOST_WIDE_INT gp_sp_offset;
344 HOST_WIDE_INT fp_sp_offset;
345 HOST_WIDE_INT acc_sp_offset;
346 HOST_WIDE_INT cop0_sp_offset;
347
348 /* Similar, but the value passed to _mcount. */
349 HOST_WIDE_INT ra_fp_offset;
350
351 /* The offset of arg_pointer_rtx from the bottom of the frame. */
352 HOST_WIDE_INT arg_pointer_offset;
353
354 /* The offset of hard_frame_pointer_rtx from the bottom of the frame. */
355 HOST_WIDE_INT hard_frame_pointer_offset;
356 };
357
358 struct GTY(()) machine_function {
359 /* The next floating-point condition-code register to allocate
360 for ISA_HAS_8CC targets, relative to ST_REG_FIRST. */
361 unsigned int next_fcc;
362
363 /* The register returned by mips16_gp_pseudo_reg; see there for details. */
364 rtx mips16_gp_pseudo_rtx;
365
366 /* The number of extra stack bytes taken up by register varargs.
367 This area is allocated by the callee at the very top of the frame. */
368 int varargs_size;
369
370 /* The current frame information, calculated by mips_compute_frame_info. */
371 struct mips_frame_info frame;
372
373 /* The register to use as the function's global pointer, or INVALID_REGNUM
374 if the function doesn't need one. */
375 unsigned int global_pointer;
376
377 /* How many instructions it takes to load a label into $AT, or 0 if
378 this property hasn't yet been calculated. */
379 unsigned int load_label_num_insns;
380
381 /* True if mips_adjust_insn_length should ignore an instruction's
382 hazard attribute. */
383 bool ignore_hazard_length_p;
384
385 /* True if the whole function is suitable for .set noreorder and
386 .set nomacro. */
387 bool all_noreorder_p;
388
389 /* True if the function has "inflexible" and "flexible" references
390 to the global pointer. See mips_cfun_has_inflexible_gp_ref_p
391 and mips_cfun_has_flexible_gp_ref_p for details. */
392 bool has_inflexible_gp_insn_p;
393 bool has_flexible_gp_insn_p;
394
395 /* True if the function's prologue must load the global pointer
396 value into pic_offset_table_rtx and store the same value in
397 the function's cprestore slot (if any). Even if this value
398 is currently false, we may decide to set it to true later;
399 see mips_must_initialize_gp_p () for details. */
400 bool must_initialize_gp_p;
401
402 /* True if the current function must restore $gp after any potential
403 clobber. This value is only meaningful during the first post-epilogue
404 split_insns pass; see mips_must_initialize_gp_p () for details. */
405 bool must_restore_gp_when_clobbered_p;
406
407 /* True if this is an interrupt handler. */
408 bool interrupt_handler_p;
409
410 /* True if this is an interrupt handler that uses shadow registers. */
411 bool use_shadow_register_set_p;
412
413 /* True if this is an interrupt handler that should keep interrupts
414 masked. */
415 bool keep_interrupts_masked_p;
416
417 /* True if this is an interrupt handler that should use DERET
418 instead of ERET. */
419 bool use_debug_exception_return_p;
420 };
421
422 /* Information about a single argument. */
423 struct mips_arg_info {
424 /* True if the argument is passed in a floating-point register, or
425 would have been if we hadn't run out of registers. */
426 bool fpr_p;
427
428 /* The number of words passed in registers, rounded up. */
429 unsigned int reg_words;
430
431 /* For EABI, the offset of the first register from GP_ARG_FIRST or
432 FP_ARG_FIRST. For other ABIs, the offset of the first register from
433 the start of the ABI's argument structure (see the CUMULATIVE_ARGS
434 comment for details).
435
436 The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
437 on the stack. */
438 unsigned int reg_offset;
439
440 /* The number of words that must be passed on the stack, rounded up. */
441 unsigned int stack_words;
442
443 /* The offset from the start of the stack overflow area of the argument's
444 first stack word. Only meaningful when STACK_WORDS is nonzero. */
445 unsigned int stack_offset;
446 };
447
448 /* Information about an address described by mips_address_type.
449
450 ADDRESS_CONST_INT
451 No fields are used.
452
453 ADDRESS_REG
454 REG is the base register and OFFSET is the constant offset.
455
456 ADDRESS_LO_SUM
457 REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
458 is the type of symbol it references.
459
460 ADDRESS_SYMBOLIC
461 SYMBOL_TYPE is the type of symbol that the address references. */
462 struct mips_address_info {
463 enum mips_address_type type;
464 rtx reg;
465 rtx offset;
466 enum mips_symbol_type symbol_type;
467 };
468
469 /* One stage in a constant building sequence. These sequences have
470 the form:
471
472 A = VALUE[0]
473 A = A CODE[1] VALUE[1]
474 A = A CODE[2] VALUE[2]
475 ...
476
477 where A is an accumulator, each CODE[i] is a binary rtl operation
478 and each VALUE[i] is a constant integer. CODE[0] is undefined. */
479 struct mips_integer_op {
480 enum rtx_code code;
481 unsigned HOST_WIDE_INT value;
482 };
483
484 /* The largest number of operations needed to load an integer constant.
485 The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
486 When the lowest bit is clear, we can try, but reject a sequence with
487 an extra SLL at the end. */
488 #define MIPS_MAX_INTEGER_OPS 7
489
490 /* Information about a MIPS16e SAVE or RESTORE instruction. */
491 struct mips16e_save_restore_info {
492 /* The number of argument registers saved by a SAVE instruction.
493 0 for RESTORE instructions. */
494 unsigned int nargs;
495
496 /* Bit X is set if the instruction saves or restores GPR X. */
497 unsigned int mask;
498
499 /* The total number of bytes to allocate. */
500 HOST_WIDE_INT size;
501 };
502
503 /* Costs of various operations on the different architectures. */
504
505 struct mips_rtx_cost_data
506 {
507 unsigned short fp_add;
508 unsigned short fp_mult_sf;
509 unsigned short fp_mult_df;
510 unsigned short fp_div_sf;
511 unsigned short fp_div_df;
512 unsigned short int_mult_si;
513 unsigned short int_mult_di;
514 unsigned short int_div_si;
515 unsigned short int_div_di;
516 unsigned short branch_cost;
517 unsigned short memory_latency;
518 };
519
520 /* Global variables for machine-dependent things. */
521
522 /* The -G setting, or the configuration's default small-data limit if
523 no -G option is given. */
524 static unsigned int mips_small_data_threshold;
525
526 /* The number of file directives written by mips_output_filename. */
527 int num_source_filenames;
528
529 /* The name that appeared in the last .file directive written by
530 mips_output_filename, or "" if mips_output_filename hasn't
531 written anything yet. */
532 const char *current_function_file = "";
533
534 /* Arrays that map GCC register numbers to debugger register numbers. */
535 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
536 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
537
538 /* Information about the current function's epilogue, used only while
539 expanding it. */
540 static struct {
541 /* A list of queued REG_CFA_RESTORE notes. */
542 rtx cfa_restores;
543
544 /* The CFA is currently defined as CFA_REG + CFA_OFFSET. */
545 rtx cfa_reg;
546 HOST_WIDE_INT cfa_offset;
547
548 /* The offset of the CFA from the stack pointer while restoring
549 registers. */
550 HOST_WIDE_INT cfa_restore_sp_offset;
551 } mips_epilogue;
552
553 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs. */
554 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
555 struct mips_asm_switch mips_nomacro = { "macro", 0 };
556 struct mips_asm_switch mips_noat = { "at", 0 };
557
558 /* True if we're writing out a branch-likely instruction rather than a
559 normal branch. */
560 static bool mips_branch_likely;
561
562 /* The current instruction-set architecture. */
563 enum processor mips_arch;
564 const struct mips_cpu_info *mips_arch_info;
565
566 /* The processor that we should tune the code for. */
567 enum processor mips_tune;
568 const struct mips_cpu_info *mips_tune_info;
569
570 /* The ISA level associated with mips_arch. */
571 int mips_isa;
572
573 /* The architecture selected by -mipsN, or null if -mipsN wasn't used. */
574 static const struct mips_cpu_info *mips_isa_option_info;
575
576 /* Which cost information to use. */
577 static const struct mips_rtx_cost_data *mips_cost;
578
579 /* The ambient target flags, excluding MASK_MIPS16. */
580 static int mips_base_target_flags;
581
582 /* The default compression mode. */
583 unsigned int mips_base_compression_flags;
584
585 /* The ambient values of other global variables. */
586 static int mips_base_schedule_insns; /* flag_schedule_insns */
587 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
588 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
589 static int mips_base_align_loops; /* align_loops */
590 static int mips_base_align_jumps; /* align_jumps */
591 static int mips_base_align_functions; /* align_functions */
592
593 /* Index [M][R] is true if register R is allowed to hold a value of mode M. */
594 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
595
596 /* Index C is true if character C is a valid PRINT_OPERAND punctation
597 character. */
598 static bool mips_print_operand_punct[256];
599
600 static GTY (()) int mips_output_filename_first_time = 1;
601
602 /* mips_split_p[X] is true if symbols of type X can be split by
603 mips_split_symbol. */
604 bool mips_split_p[NUM_SYMBOL_TYPES];
605
606 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
607 can be split by mips_split_symbol. */
608 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
609
610 /* mips_use_pcrel_pool_p[X] is true if symbols of type X should be
611 forced into a PC-relative constant pool. */
612 bool mips_use_pcrel_pool_p[NUM_SYMBOL_TYPES];
613
614 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
615 appears in a LO_SUM. It can be null if such LO_SUMs aren't valid or
616 if they are matched by a special .md file pattern. */
617 const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
618
619 /* Likewise for HIGHs. */
620 const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
621
622 /* Target state for MIPS16. */
623 struct target_globals *mips16_globals;
624
625 /* Cached value of can_issue_more. This is cached in mips_variable_issue hook
626 and returned from mips_sched_reorder2. */
627 static int cached_can_issue_more;
628
629 /* True if the output uses __mips16_rdhwr. */
630 static bool mips_need_mips16_rdhwr_p;
631
632 /* Index R is the smallest register class that contains register R. */
633 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
634 LEA_REGS, LEA_REGS, M16_REGS, V1_REG,
635 M16_REGS, M16_REGS, M16_REGS, M16_REGS,
636 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
637 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
638 M16_REGS, M16_REGS, LEA_REGS, LEA_REGS,
639 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
640 T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS,
641 LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
642 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
643 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
644 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
645 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
646 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
647 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
648 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
649 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
650 MD0_REG, MD1_REG, NO_REGS, ST_REGS,
651 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
652 ST_REGS, ST_REGS, ST_REGS, NO_REGS,
653 NO_REGS, FRAME_REGS, FRAME_REGS, NO_REGS,
654 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
655 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
656 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
657 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
658 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
659 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
660 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
661 COP0_REGS, COP0_REGS, COP0_REGS, COP0_REGS,
662 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
663 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
664 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
665 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
666 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
667 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
668 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
669 COP2_REGS, COP2_REGS, COP2_REGS, COP2_REGS,
670 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
671 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
672 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
673 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
674 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
675 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
676 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
677 COP3_REGS, COP3_REGS, COP3_REGS, COP3_REGS,
678 DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS, DSP_ACC_REGS,
679 DSP_ACC_REGS, DSP_ACC_REGS, ALL_REGS, ALL_REGS,
680 ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS
681 };
682
683 /* The value of TARGET_ATTRIBUTE_TABLE. */
684 static const struct attribute_spec mips_attribute_table[] = {
685 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
686 om_diagnostic } */
687 { "long_call", 0, 0, false, true, true, NULL, false },
688 { "far", 0, 0, false, true, true, NULL, false },
689 { "near", 0, 0, false, true, true, NULL, false },
690 /* We would really like to treat "mips16" and "nomips16" as type
691 attributes, but GCC doesn't provide the hooks we need to support
692 the right conversion rules. As declaration attributes, they affect
693 code generation but don't carry other semantics. */
694 { "mips16", 0, 0, true, false, false, NULL, false },
695 { "nomips16", 0, 0, true, false, false, NULL, false },
696 { "micromips", 0, 0, true, false, false, NULL, false },
697 { "nomicromips", 0, 0, true, false, false, NULL, false },
698 { "nocompression", 0, 0, true, false, false, NULL, false },
699 /* Allow functions to be specified as interrupt handlers */
700 { "interrupt", 0, 0, false, true, true, NULL, false },
701 { "use_shadow_register_set", 0, 0, false, true, true, NULL, false },
702 { "keep_interrupts_masked", 0, 0, false, true, true, NULL, false },
703 { "use_debug_exception_return", 0, 0, false, true, true, NULL, false },
704 { NULL, 0, 0, false, false, false, NULL, false }
705 };
706 \f
707 /* A table describing all the processors GCC knows about; see
708 mips-cpus.def for details. */
709 static const struct mips_cpu_info mips_cpu_info_table[] = {
710 #define MIPS_CPU(NAME, CPU, ISA, FLAGS) \
711 { NAME, CPU, ISA, FLAGS },
712 #include "mips-cpus.def"
713 #undef MIPS_CPU
714 };
715
716 /* Default costs. If these are used for a processor we should look
717 up the actual costs. */
718 #define DEFAULT_COSTS COSTS_N_INSNS (6), /* fp_add */ \
719 COSTS_N_INSNS (7), /* fp_mult_sf */ \
720 COSTS_N_INSNS (8), /* fp_mult_df */ \
721 COSTS_N_INSNS (23), /* fp_div_sf */ \
722 COSTS_N_INSNS (36), /* fp_div_df */ \
723 COSTS_N_INSNS (10), /* int_mult_si */ \
724 COSTS_N_INSNS (10), /* int_mult_di */ \
725 COSTS_N_INSNS (69), /* int_div_si */ \
726 COSTS_N_INSNS (69), /* int_div_di */ \
727 2, /* branch_cost */ \
728 4 /* memory_latency */
729
730 /* Floating-point costs for processors without an FPU. Just assume that
731 all floating-point libcalls are very expensive. */
732 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */ \
733 COSTS_N_INSNS (256), /* fp_mult_sf */ \
734 COSTS_N_INSNS (256), /* fp_mult_df */ \
735 COSTS_N_INSNS (256), /* fp_div_sf */ \
736 COSTS_N_INSNS (256) /* fp_div_df */
737
738 /* Costs to use when optimizing for size. */
739 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
740 COSTS_N_INSNS (1), /* fp_add */
741 COSTS_N_INSNS (1), /* fp_mult_sf */
742 COSTS_N_INSNS (1), /* fp_mult_df */
743 COSTS_N_INSNS (1), /* fp_div_sf */
744 COSTS_N_INSNS (1), /* fp_div_df */
745 COSTS_N_INSNS (1), /* int_mult_si */
746 COSTS_N_INSNS (1), /* int_mult_di */
747 COSTS_N_INSNS (1), /* int_div_si */
748 COSTS_N_INSNS (1), /* int_div_di */
749 2, /* branch_cost */
750 4 /* memory_latency */
751 };
752
753 /* Costs to use when optimizing for speed, indexed by processor. */
754 static const struct mips_rtx_cost_data
755 mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
756 { /* R3000 */
757 COSTS_N_INSNS (2), /* fp_add */
758 COSTS_N_INSNS (4), /* fp_mult_sf */
759 COSTS_N_INSNS (5), /* fp_mult_df */
760 COSTS_N_INSNS (12), /* fp_div_sf */
761 COSTS_N_INSNS (19), /* fp_div_df */
762 COSTS_N_INSNS (12), /* int_mult_si */
763 COSTS_N_INSNS (12), /* int_mult_di */
764 COSTS_N_INSNS (35), /* int_div_si */
765 COSTS_N_INSNS (35), /* int_div_di */
766 1, /* branch_cost */
767 4 /* memory_latency */
768 },
769 { /* 4KC */
770 SOFT_FP_COSTS,
771 COSTS_N_INSNS (6), /* int_mult_si */
772 COSTS_N_INSNS (6), /* int_mult_di */
773 COSTS_N_INSNS (36), /* int_div_si */
774 COSTS_N_INSNS (36), /* int_div_di */
775 1, /* branch_cost */
776 4 /* memory_latency */
777 },
778 { /* 4KP */
779 SOFT_FP_COSTS,
780 COSTS_N_INSNS (36), /* int_mult_si */
781 COSTS_N_INSNS (36), /* int_mult_di */
782 COSTS_N_INSNS (37), /* int_div_si */
783 COSTS_N_INSNS (37), /* int_div_di */
784 1, /* branch_cost */
785 4 /* memory_latency */
786 },
787 { /* 5KC */
788 SOFT_FP_COSTS,
789 COSTS_N_INSNS (4), /* int_mult_si */
790 COSTS_N_INSNS (11), /* int_mult_di */
791 COSTS_N_INSNS (36), /* int_div_si */
792 COSTS_N_INSNS (68), /* int_div_di */
793 1, /* branch_cost */
794 4 /* memory_latency */
795 },
796 { /* 5KF */
797 COSTS_N_INSNS (4), /* fp_add */
798 COSTS_N_INSNS (4), /* fp_mult_sf */
799 COSTS_N_INSNS (5), /* fp_mult_df */
800 COSTS_N_INSNS (17), /* fp_div_sf */
801 COSTS_N_INSNS (32), /* fp_div_df */
802 COSTS_N_INSNS (4), /* int_mult_si */
803 COSTS_N_INSNS (11), /* int_mult_di */
804 COSTS_N_INSNS (36), /* int_div_si */
805 COSTS_N_INSNS (68), /* int_div_di */
806 1, /* branch_cost */
807 4 /* memory_latency */
808 },
809 { /* 20KC */
810 COSTS_N_INSNS (4), /* fp_add */
811 COSTS_N_INSNS (4), /* fp_mult_sf */
812 COSTS_N_INSNS (5), /* fp_mult_df */
813 COSTS_N_INSNS (17), /* fp_div_sf */
814 COSTS_N_INSNS (32), /* fp_div_df */
815 COSTS_N_INSNS (4), /* int_mult_si */
816 COSTS_N_INSNS (7), /* int_mult_di */
817 COSTS_N_INSNS (42), /* int_div_si */
818 COSTS_N_INSNS (72), /* int_div_di */
819 1, /* branch_cost */
820 4 /* memory_latency */
821 },
822 { /* 24KC */
823 SOFT_FP_COSTS,
824 COSTS_N_INSNS (5), /* int_mult_si */
825 COSTS_N_INSNS (5), /* int_mult_di */
826 COSTS_N_INSNS (41), /* int_div_si */
827 COSTS_N_INSNS (41), /* int_div_di */
828 1, /* branch_cost */
829 4 /* memory_latency */
830 },
831 { /* 24KF2_1 */
832 COSTS_N_INSNS (8), /* fp_add */
833 COSTS_N_INSNS (8), /* fp_mult_sf */
834 COSTS_N_INSNS (10), /* fp_mult_df */
835 COSTS_N_INSNS (34), /* fp_div_sf */
836 COSTS_N_INSNS (64), /* fp_div_df */
837 COSTS_N_INSNS (5), /* int_mult_si */
838 COSTS_N_INSNS (5), /* int_mult_di */
839 COSTS_N_INSNS (41), /* int_div_si */
840 COSTS_N_INSNS (41), /* int_div_di */
841 1, /* branch_cost */
842 4 /* memory_latency */
843 },
844 { /* 24KF1_1 */
845 COSTS_N_INSNS (4), /* fp_add */
846 COSTS_N_INSNS (4), /* fp_mult_sf */
847 COSTS_N_INSNS (5), /* fp_mult_df */
848 COSTS_N_INSNS (17), /* fp_div_sf */
849 COSTS_N_INSNS (32), /* fp_div_df */
850 COSTS_N_INSNS (5), /* int_mult_si */
851 COSTS_N_INSNS (5), /* int_mult_di */
852 COSTS_N_INSNS (41), /* int_div_si */
853 COSTS_N_INSNS (41), /* int_div_di */
854 1, /* branch_cost */
855 4 /* memory_latency */
856 },
857 { /* 74KC */
858 SOFT_FP_COSTS,
859 COSTS_N_INSNS (5), /* int_mult_si */
860 COSTS_N_INSNS (5), /* int_mult_di */
861 COSTS_N_INSNS (41), /* int_div_si */
862 COSTS_N_INSNS (41), /* int_div_di */
863 1, /* branch_cost */
864 4 /* memory_latency */
865 },
866 { /* 74KF2_1 */
867 COSTS_N_INSNS (8), /* fp_add */
868 COSTS_N_INSNS (8), /* fp_mult_sf */
869 COSTS_N_INSNS (10), /* fp_mult_df */
870 COSTS_N_INSNS (34), /* fp_div_sf */
871 COSTS_N_INSNS (64), /* fp_div_df */
872 COSTS_N_INSNS (5), /* int_mult_si */
873 COSTS_N_INSNS (5), /* int_mult_di */
874 COSTS_N_INSNS (41), /* int_div_si */
875 COSTS_N_INSNS (41), /* int_div_di */
876 1, /* branch_cost */
877 4 /* memory_latency */
878 },
879 { /* 74KF1_1 */
880 COSTS_N_INSNS (4), /* fp_add */
881 COSTS_N_INSNS (4), /* fp_mult_sf */
882 COSTS_N_INSNS (5), /* fp_mult_df */
883 COSTS_N_INSNS (17), /* fp_div_sf */
884 COSTS_N_INSNS (32), /* fp_div_df */
885 COSTS_N_INSNS (5), /* int_mult_si */
886 COSTS_N_INSNS (5), /* int_mult_di */
887 COSTS_N_INSNS (41), /* int_div_si */
888 COSTS_N_INSNS (41), /* int_div_di */
889 1, /* branch_cost */
890 4 /* memory_latency */
891 },
892 { /* 74KF3_2 */
893 COSTS_N_INSNS (6), /* fp_add */
894 COSTS_N_INSNS (6), /* fp_mult_sf */
895 COSTS_N_INSNS (7), /* fp_mult_df */
896 COSTS_N_INSNS (25), /* fp_div_sf */
897 COSTS_N_INSNS (48), /* fp_div_df */
898 COSTS_N_INSNS (5), /* int_mult_si */
899 COSTS_N_INSNS (5), /* int_mult_di */
900 COSTS_N_INSNS (41), /* int_div_si */
901 COSTS_N_INSNS (41), /* int_div_di */
902 1, /* branch_cost */
903 4 /* memory_latency */
904 },
905 { /* Loongson-2E */
906 DEFAULT_COSTS
907 },
908 { /* Loongson-2F */
909 DEFAULT_COSTS
910 },
911 { /* Loongson-3A */
912 DEFAULT_COSTS
913 },
914 { /* M4k */
915 DEFAULT_COSTS
916 },
917 /* Octeon */
918 {
919 SOFT_FP_COSTS,
920 COSTS_N_INSNS (5), /* int_mult_si */
921 COSTS_N_INSNS (5), /* int_mult_di */
922 COSTS_N_INSNS (72), /* int_div_si */
923 COSTS_N_INSNS (72), /* int_div_di */
924 1, /* branch_cost */
925 4 /* memory_latency */
926 },
927 /* Octeon II */
928 {
929 SOFT_FP_COSTS,
930 COSTS_N_INSNS (6), /* int_mult_si */
931 COSTS_N_INSNS (6), /* int_mult_di */
932 COSTS_N_INSNS (18), /* int_div_si */
933 COSTS_N_INSNS (35), /* int_div_di */
934 4, /* branch_cost */
935 4 /* memory_latency */
936 },
937 { /* R3900 */
938 COSTS_N_INSNS (2), /* fp_add */
939 COSTS_N_INSNS (4), /* fp_mult_sf */
940 COSTS_N_INSNS (5), /* fp_mult_df */
941 COSTS_N_INSNS (12), /* fp_div_sf */
942 COSTS_N_INSNS (19), /* fp_div_df */
943 COSTS_N_INSNS (2), /* int_mult_si */
944 COSTS_N_INSNS (2), /* int_mult_di */
945 COSTS_N_INSNS (35), /* int_div_si */
946 COSTS_N_INSNS (35), /* int_div_di */
947 1, /* branch_cost */
948 4 /* memory_latency */
949 },
950 { /* R6000 */
951 COSTS_N_INSNS (3), /* fp_add */
952 COSTS_N_INSNS (5), /* fp_mult_sf */
953 COSTS_N_INSNS (6), /* fp_mult_df */
954 COSTS_N_INSNS (15), /* fp_div_sf */
955 COSTS_N_INSNS (16), /* fp_div_df */
956 COSTS_N_INSNS (17), /* int_mult_si */
957 COSTS_N_INSNS (17), /* int_mult_di */
958 COSTS_N_INSNS (38), /* int_div_si */
959 COSTS_N_INSNS (38), /* int_div_di */
960 2, /* branch_cost */
961 6 /* memory_latency */
962 },
963 { /* R4000 */
964 COSTS_N_INSNS (6), /* fp_add */
965 COSTS_N_INSNS (7), /* fp_mult_sf */
966 COSTS_N_INSNS (8), /* fp_mult_df */
967 COSTS_N_INSNS (23), /* fp_div_sf */
968 COSTS_N_INSNS (36), /* fp_div_df */
969 COSTS_N_INSNS (10), /* int_mult_si */
970 COSTS_N_INSNS (10), /* int_mult_di */
971 COSTS_N_INSNS (69), /* int_div_si */
972 COSTS_N_INSNS (69), /* int_div_di */
973 2, /* branch_cost */
974 6 /* memory_latency */
975 },
976 { /* R4100 */
977 DEFAULT_COSTS
978 },
979 { /* R4111 */
980 DEFAULT_COSTS
981 },
982 { /* R4120 */
983 DEFAULT_COSTS
984 },
985 { /* R4130 */
986 /* The only costs that appear to be updated here are
987 integer multiplication. */
988 SOFT_FP_COSTS,
989 COSTS_N_INSNS (4), /* int_mult_si */
990 COSTS_N_INSNS (6), /* int_mult_di */
991 COSTS_N_INSNS (69), /* int_div_si */
992 COSTS_N_INSNS (69), /* int_div_di */
993 1, /* branch_cost */
994 4 /* memory_latency */
995 },
996 { /* R4300 */
997 DEFAULT_COSTS
998 },
999 { /* R4600 */
1000 DEFAULT_COSTS
1001 },
1002 { /* R4650 */
1003 DEFAULT_COSTS
1004 },
1005 { /* R4700 */
1006 DEFAULT_COSTS
1007 },
1008 { /* R5000 */
1009 COSTS_N_INSNS (6), /* fp_add */
1010 COSTS_N_INSNS (4), /* fp_mult_sf */
1011 COSTS_N_INSNS (5), /* fp_mult_df */
1012 COSTS_N_INSNS (23), /* fp_div_sf */
1013 COSTS_N_INSNS (36), /* fp_div_df */
1014 COSTS_N_INSNS (5), /* int_mult_si */
1015 COSTS_N_INSNS (5), /* int_mult_di */
1016 COSTS_N_INSNS (36), /* int_div_si */
1017 COSTS_N_INSNS (36), /* int_div_di */
1018 1, /* branch_cost */
1019 4 /* memory_latency */
1020 },
1021 { /* R5400 */
1022 COSTS_N_INSNS (6), /* fp_add */
1023 COSTS_N_INSNS (5), /* fp_mult_sf */
1024 COSTS_N_INSNS (6), /* fp_mult_df */
1025 COSTS_N_INSNS (30), /* fp_div_sf */
1026 COSTS_N_INSNS (59), /* fp_div_df */
1027 COSTS_N_INSNS (3), /* int_mult_si */
1028 COSTS_N_INSNS (4), /* int_mult_di */
1029 COSTS_N_INSNS (42), /* int_div_si */
1030 COSTS_N_INSNS (74), /* int_div_di */
1031 1, /* branch_cost */
1032 4 /* memory_latency */
1033 },
1034 { /* R5500 */
1035 COSTS_N_INSNS (6), /* fp_add */
1036 COSTS_N_INSNS (5), /* fp_mult_sf */
1037 COSTS_N_INSNS (6), /* fp_mult_df */
1038 COSTS_N_INSNS (30), /* fp_div_sf */
1039 COSTS_N_INSNS (59), /* fp_div_df */
1040 COSTS_N_INSNS (5), /* int_mult_si */
1041 COSTS_N_INSNS (9), /* int_mult_di */
1042 COSTS_N_INSNS (42), /* int_div_si */
1043 COSTS_N_INSNS (74), /* int_div_di */
1044 1, /* branch_cost */
1045 4 /* memory_latency */
1046 },
1047 { /* R5900 */
1048 COSTS_N_INSNS (4), /* fp_add */
1049 COSTS_N_INSNS (4), /* fp_mult_sf */
1050 COSTS_N_INSNS (256), /* fp_mult_df */
1051 COSTS_N_INSNS (8), /* fp_div_sf */
1052 COSTS_N_INSNS (256), /* fp_div_df */
1053 COSTS_N_INSNS (4), /* int_mult_si */
1054 COSTS_N_INSNS (256), /* int_mult_di */
1055 COSTS_N_INSNS (37), /* int_div_si */
1056 COSTS_N_INSNS (256), /* int_div_di */
1057 1, /* branch_cost */
1058 4 /* memory_latency */
1059 },
1060 { /* R7000 */
1061 /* The only costs that are changed here are
1062 integer multiplication. */
1063 COSTS_N_INSNS (6), /* fp_add */
1064 COSTS_N_INSNS (7), /* fp_mult_sf */
1065 COSTS_N_INSNS (8), /* fp_mult_df */
1066 COSTS_N_INSNS (23), /* fp_div_sf */
1067 COSTS_N_INSNS (36), /* fp_div_df */
1068 COSTS_N_INSNS (5), /* int_mult_si */
1069 COSTS_N_INSNS (9), /* int_mult_di */
1070 COSTS_N_INSNS (69), /* int_div_si */
1071 COSTS_N_INSNS (69), /* int_div_di */
1072 1, /* branch_cost */
1073 4 /* memory_latency */
1074 },
1075 { /* R8000 */
1076 DEFAULT_COSTS
1077 },
1078 { /* R9000 */
1079 /* The only costs that are changed here are
1080 integer multiplication. */
1081 COSTS_N_INSNS (6), /* fp_add */
1082 COSTS_N_INSNS (7), /* fp_mult_sf */
1083 COSTS_N_INSNS (8), /* fp_mult_df */
1084 COSTS_N_INSNS (23), /* fp_div_sf */
1085 COSTS_N_INSNS (36), /* fp_div_df */
1086 COSTS_N_INSNS (3), /* int_mult_si */
1087 COSTS_N_INSNS (8), /* int_mult_di */
1088 COSTS_N_INSNS (69), /* int_div_si */
1089 COSTS_N_INSNS (69), /* int_div_di */
1090 1, /* branch_cost */
1091 4 /* memory_latency */
1092 },
1093 { /* R1x000 */
1094 COSTS_N_INSNS (2), /* fp_add */
1095 COSTS_N_INSNS (2), /* fp_mult_sf */
1096 COSTS_N_INSNS (2), /* fp_mult_df */
1097 COSTS_N_INSNS (12), /* fp_div_sf */
1098 COSTS_N_INSNS (19), /* fp_div_df */
1099 COSTS_N_INSNS (5), /* int_mult_si */
1100 COSTS_N_INSNS (9), /* int_mult_di */
1101 COSTS_N_INSNS (34), /* int_div_si */
1102 COSTS_N_INSNS (66), /* int_div_di */
1103 1, /* branch_cost */
1104 4 /* memory_latency */
1105 },
1106 { /* SB1 */
1107 /* These costs are the same as the SB-1A below. */
1108 COSTS_N_INSNS (4), /* fp_add */
1109 COSTS_N_INSNS (4), /* fp_mult_sf */
1110 COSTS_N_INSNS (4), /* fp_mult_df */
1111 COSTS_N_INSNS (24), /* fp_div_sf */
1112 COSTS_N_INSNS (32), /* fp_div_df */
1113 COSTS_N_INSNS (3), /* int_mult_si */
1114 COSTS_N_INSNS (4), /* int_mult_di */
1115 COSTS_N_INSNS (36), /* int_div_si */
1116 COSTS_N_INSNS (68), /* int_div_di */
1117 1, /* branch_cost */
1118 4 /* memory_latency */
1119 },
1120 { /* SB1-A */
1121 /* These costs are the same as the SB-1 above. */
1122 COSTS_N_INSNS (4), /* fp_add */
1123 COSTS_N_INSNS (4), /* fp_mult_sf */
1124 COSTS_N_INSNS (4), /* fp_mult_df */
1125 COSTS_N_INSNS (24), /* fp_div_sf */
1126 COSTS_N_INSNS (32), /* fp_div_df */
1127 COSTS_N_INSNS (3), /* int_mult_si */
1128 COSTS_N_INSNS (4), /* int_mult_di */
1129 COSTS_N_INSNS (36), /* int_div_si */
1130 COSTS_N_INSNS (68), /* int_div_di */
1131 1, /* branch_cost */
1132 4 /* memory_latency */
1133 },
1134 { /* SR71000 */
1135 DEFAULT_COSTS
1136 },
1137 { /* XLR */
1138 SOFT_FP_COSTS,
1139 COSTS_N_INSNS (8), /* int_mult_si */
1140 COSTS_N_INSNS (8), /* int_mult_di */
1141 COSTS_N_INSNS (72), /* int_div_si */
1142 COSTS_N_INSNS (72), /* int_div_di */
1143 1, /* branch_cost */
1144 4 /* memory_latency */
1145 },
1146 { /* XLP */
1147 /* These costs are the same as 5KF above. */
1148 COSTS_N_INSNS (4), /* fp_add */
1149 COSTS_N_INSNS (4), /* fp_mult_sf */
1150 COSTS_N_INSNS (5), /* fp_mult_df */
1151 COSTS_N_INSNS (17), /* fp_div_sf */
1152 COSTS_N_INSNS (32), /* fp_div_df */
1153 COSTS_N_INSNS (4), /* int_mult_si */
1154 COSTS_N_INSNS (11), /* int_mult_di */
1155 COSTS_N_INSNS (36), /* int_div_si */
1156 COSTS_N_INSNS (68), /* int_div_di */
1157 1, /* branch_cost */
1158 4 /* memory_latency */
1159 }
1160 };
1161 \f
1162 static rtx mips_find_pic_call_symbol (rtx, rtx, bool);
1163 static int mips_register_move_cost (enum machine_mode, reg_class_t,
1164 reg_class_t);
1165 static unsigned int mips_function_arg_boundary (enum machine_mode, const_tree);
1166 \f
1167 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1168 for -mflip_mips16. It maps decl names onto a boolean mode setting. */
1169 struct GTY (()) mflip_mips16_entry {
1170 const char *name;
1171 bool mips16_p;
1172 };
1173 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1174
1175 /* Hash table callbacks for mflip_mips16_htab. */
1176
1177 static hashval_t
1178 mflip_mips16_htab_hash (const void *entry)
1179 {
1180 return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1181 }
1182
1183 static int
1184 mflip_mips16_htab_eq (const void *entry, const void *name)
1185 {
1186 return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1187 (const char *) name) == 0;
1188 }
1189
1190 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1191 mode, false if it should next add an attribute for the opposite mode. */
1192 static GTY(()) bool mips16_flipper;
1193
1194 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1195 for -mflip-mips16. Return true if it should use "mips16" and false if
1196 it should use "nomips16". */
1197
1198 static bool
1199 mflip_mips16_use_mips16_p (tree decl)
1200 {
1201 struct mflip_mips16_entry *entry;
1202 const char *name;
1203 hashval_t hash;
1204 void **slot;
1205 bool base_is_mips16 = (mips_base_compression_flags & MASK_MIPS16) != 0;
1206
1207 /* Use the opposite of the command-line setting for anonymous decls. */
1208 if (!DECL_NAME (decl))
1209 return !base_is_mips16;
1210
1211 if (!mflip_mips16_htab)
1212 mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1213 mflip_mips16_htab_eq, NULL);
1214
1215 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1216 hash = htab_hash_string (name);
1217 slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1218 entry = (struct mflip_mips16_entry *) *slot;
1219 if (!entry)
1220 {
1221 mips16_flipper = !mips16_flipper;
1222 entry = ggc_alloc_mflip_mips16_entry ();
1223 entry->name = name;
1224 entry->mips16_p = mips16_flipper ? !base_is_mips16 : base_is_mips16;
1225 *slot = entry;
1226 }
1227 return entry->mips16_p;
1228 }
1229 \f
1230 /* Predicates to test for presence of "near" and "far"/"long_call"
1231 attributes on the given TYPE. */
1232
1233 static bool
1234 mips_near_type_p (const_tree type)
1235 {
1236 return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1237 }
1238
1239 static bool
1240 mips_far_type_p (const_tree type)
1241 {
1242 return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1243 || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1244 }
1245
1246
1247 /* Check if the interrupt attribute is set for a function. */
1248
1249 static bool
1250 mips_interrupt_type_p (tree type)
1251 {
1252 return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1253 }
1254
1255 /* Check if the attribute to use shadow register set is set for a function. */
1256
1257 static bool
1258 mips_use_shadow_register_set_p (tree type)
1259 {
1260 return lookup_attribute ("use_shadow_register_set",
1261 TYPE_ATTRIBUTES (type)) != NULL;
1262 }
1263
1264 /* Check if the attribute to keep interrupts masked is set for a function. */
1265
1266 static bool
1267 mips_keep_interrupts_masked_p (tree type)
1268 {
1269 return lookup_attribute ("keep_interrupts_masked",
1270 TYPE_ATTRIBUTES (type)) != NULL;
1271 }
1272
1273 /* Check if the attribute to use debug exception return is set for
1274 a function. */
1275
1276 static bool
1277 mips_use_debug_exception_return_p (tree type)
1278 {
1279 return lookup_attribute ("use_debug_exception_return",
1280 TYPE_ATTRIBUTES (type)) != NULL;
1281 }
1282
1283 /* Return the set of compression modes that are explicitly required
1284 by the attributes in ATTRIBUTES. */
1285
1286 static unsigned int
1287 mips_get_compress_on_flags (tree attributes)
1288 {
1289 unsigned int flags = 0;
1290
1291 if (lookup_attribute ("mips16", attributes) != NULL)
1292 flags |= MASK_MIPS16;
1293
1294 if (lookup_attribute ("micromips", attributes) != NULL)
1295 flags |= MASK_MICROMIPS;
1296
1297 return flags;
1298 }
1299
1300 /* Return the set of compression modes that are explicitly forbidden
1301 by the attributes in ATTRIBUTES. */
1302
1303 static unsigned int
1304 mips_get_compress_off_flags (tree attributes)
1305 {
1306 unsigned int flags = 0;
1307
1308 if (lookup_attribute ("nocompression", attributes) != NULL)
1309 flags |= MASK_MIPS16 | MASK_MICROMIPS;
1310
1311 if (lookup_attribute ("nomips16", attributes) != NULL)
1312 flags |= MASK_MIPS16;
1313
1314 if (lookup_attribute ("nomicromips", attributes) != NULL)
1315 flags |= MASK_MICROMIPS;
1316
1317 return flags;
1318 }
1319
1320 /* Return the compression mode that should be used for function DECL.
1321 Return the ambient setting if DECL is null. */
1322
1323 static unsigned int
1324 mips_get_compress_mode (tree decl)
1325 {
1326 unsigned int flags, force_on;
1327
1328 flags = mips_base_compression_flags;
1329 if (decl)
1330 {
1331 /* Nested functions must use the same frame pointer as their
1332 parent and must therefore use the same ISA mode. */
1333 tree parent = decl_function_context (decl);
1334 if (parent)
1335 decl = parent;
1336 force_on = mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1337 if (force_on)
1338 return force_on;
1339 flags &= ~mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1340 }
1341 return flags;
1342 }
1343
1344 /* Return the attribute name associated with MASK_MIPS16 and MASK_MICROMIPS
1345 flags FLAGS. */
1346
1347 static const char *
1348 mips_get_compress_on_name (unsigned int flags)
1349 {
1350 if (flags == MASK_MIPS16)
1351 return "mips16";
1352 return "micromips";
1353 }
1354
1355 /* Return the attribute name that forbids MASK_MIPS16 and MASK_MICROMIPS
1356 flags FLAGS. */
1357
1358 static const char *
1359 mips_get_compress_off_name (unsigned int flags)
1360 {
1361 if (flags == MASK_MIPS16)
1362 return "nomips16";
1363 if (flags == MASK_MICROMIPS)
1364 return "nomicromips";
1365 return "nocompression";
1366 }
1367
1368 /* Implement TARGET_COMP_TYPE_ATTRIBUTES. */
1369
1370 static int
1371 mips_comp_type_attributes (const_tree type1, const_tree type2)
1372 {
1373 /* Disallow mixed near/far attributes. */
1374 if (mips_far_type_p (type1) && mips_near_type_p (type2))
1375 return 0;
1376 if (mips_near_type_p (type1) && mips_far_type_p (type2))
1377 return 0;
1378 return 1;
1379 }
1380
1381 /* Implement TARGET_INSERT_ATTRIBUTES. */
1382
1383 static void
1384 mips_insert_attributes (tree decl, tree *attributes)
1385 {
1386 const char *name;
1387 unsigned int compression_flags, nocompression_flags;
1388
1389 /* Check for "mips16" and "nomips16" attributes. */
1390 compression_flags = mips_get_compress_on_flags (*attributes);
1391 nocompression_flags = mips_get_compress_off_flags (*attributes);
1392
1393 if (TREE_CODE (decl) != FUNCTION_DECL)
1394 {
1395 if (nocompression_flags)
1396 error ("%qs attribute only applies to functions",
1397 mips_get_compress_off_name (nocompression_flags));
1398
1399 if (compression_flags)
1400 error ("%qs attribute only applies to functions",
1401 mips_get_compress_on_name (nocompression_flags));
1402 }
1403 else
1404 {
1405 compression_flags |= mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1406 nocompression_flags |=
1407 mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1408
1409 if (compression_flags && nocompression_flags)
1410 error ("%qE cannot have both %qs and %qs attributes",
1411 DECL_NAME (decl), mips_get_compress_on_name (compression_flags),
1412 mips_get_compress_off_name (nocompression_flags));
1413
1414 if (compression_flags & MASK_MIPS16
1415 && compression_flags & MASK_MICROMIPS)
1416 error ("%qE cannot have both %qs and %qs attributes",
1417 DECL_NAME (decl), "mips16", "micromips");
1418
1419 if (TARGET_FLIP_MIPS16
1420 && !DECL_ARTIFICIAL (decl)
1421 && compression_flags == 0
1422 && nocompression_flags == 0)
1423 {
1424 /* Implement -mflip-mips16. If DECL has neither a "nomips16" nor a
1425 "mips16" attribute, arbitrarily pick one. We must pick the same
1426 setting for duplicate declarations of a function. */
1427 name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1428 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1429 name = "nomicromips";
1430 *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1431 }
1432 }
1433 }
1434
1435 /* Implement TARGET_MERGE_DECL_ATTRIBUTES. */
1436
1437 static tree
1438 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1439 {
1440 unsigned int diff;
1441
1442 diff = (mips_get_compress_on_flags (DECL_ATTRIBUTES (olddecl))
1443 ^ mips_get_compress_on_flags (DECL_ATTRIBUTES (newdecl)));
1444 if (diff)
1445 error ("%qE redeclared with conflicting %qs attributes",
1446 DECL_NAME (newdecl), mips_get_compress_on_name (diff));
1447
1448 diff = (mips_get_compress_off_flags (DECL_ATTRIBUTES (olddecl))
1449 ^ mips_get_compress_off_flags (DECL_ATTRIBUTES (newdecl)));
1450 if (diff)
1451 error ("%qE redeclared with conflicting %qs attributes",
1452 DECL_NAME (newdecl), mips_get_compress_off_name (diff));
1453
1454 return merge_attributes (DECL_ATTRIBUTES (olddecl),
1455 DECL_ATTRIBUTES (newdecl));
1456 }
1457
1458 /* Implement TARGET_CAN_INLINE_P. */
1459
1460 static bool
1461 mips_can_inline_p (tree caller, tree callee)
1462 {
1463 if (mips_get_compress_mode (callee) != mips_get_compress_mode (caller))
1464 return false;
1465 return default_target_can_inline_p (caller, callee);
1466 }
1467 \f
1468 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1469 and *OFFSET_PTR. Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise. */
1470
1471 static void
1472 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1473 {
1474 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1475 {
1476 *base_ptr = XEXP (x, 0);
1477 *offset_ptr = INTVAL (XEXP (x, 1));
1478 }
1479 else
1480 {
1481 *base_ptr = x;
1482 *offset_ptr = 0;
1483 }
1484 }
1485 \f
1486 static unsigned int mips_build_integer (struct mips_integer_op *,
1487 unsigned HOST_WIDE_INT);
1488
1489 /* A subroutine of mips_build_integer, with the same interface.
1490 Assume that the final action in the sequence should be a left shift. */
1491
1492 static unsigned int
1493 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1494 {
1495 unsigned int i, shift;
1496
1497 /* Shift VALUE right until its lowest bit is set. Shift arithmetically
1498 since signed numbers are easier to load than unsigned ones. */
1499 shift = 0;
1500 while ((value & 1) == 0)
1501 value /= 2, shift++;
1502
1503 i = mips_build_integer (codes, value);
1504 codes[i].code = ASHIFT;
1505 codes[i].value = shift;
1506 return i + 1;
1507 }
1508
1509 /* As for mips_build_shift, but assume that the final action will be
1510 an IOR or PLUS operation. */
1511
1512 static unsigned int
1513 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1514 {
1515 unsigned HOST_WIDE_INT high;
1516 unsigned int i;
1517
1518 high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1519 if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1520 {
1521 /* The constant is too complex to load with a simple LUI/ORI pair,
1522 so we want to give the recursive call as many trailing zeros as
1523 possible. In this case, we know bit 16 is set and that the
1524 low 16 bits form a negative number. If we subtract that number
1525 from VALUE, we will clear at least the lowest 17 bits, maybe more. */
1526 i = mips_build_integer (codes, CONST_HIGH_PART (value));
1527 codes[i].code = PLUS;
1528 codes[i].value = CONST_LOW_PART (value);
1529 }
1530 else
1531 {
1532 /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1533 bits gives a value with at least 17 trailing zeros. */
1534 i = mips_build_integer (codes, high);
1535 codes[i].code = IOR;
1536 codes[i].value = value & 0xffff;
1537 }
1538 return i + 1;
1539 }
1540
1541 /* Fill CODES with a sequence of rtl operations to load VALUE.
1542 Return the number of operations needed. */
1543
1544 static unsigned int
1545 mips_build_integer (struct mips_integer_op *codes,
1546 unsigned HOST_WIDE_INT value)
1547 {
1548 if (SMALL_OPERAND (value)
1549 || SMALL_OPERAND_UNSIGNED (value)
1550 || LUI_OPERAND (value))
1551 {
1552 /* The value can be loaded with a single instruction. */
1553 codes[0].code = UNKNOWN;
1554 codes[0].value = value;
1555 return 1;
1556 }
1557 else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1558 {
1559 /* Either the constant is a simple LUI/ORI combination or its
1560 lowest bit is set. We don't want to shift in this case. */
1561 return mips_build_lower (codes, value);
1562 }
1563 else if ((value & 0xffff) == 0)
1564 {
1565 /* The constant will need at least three actions. The lowest
1566 16 bits are clear, so the final action will be a shift. */
1567 return mips_build_shift (codes, value);
1568 }
1569 else
1570 {
1571 /* The final action could be a shift, add or inclusive OR.
1572 Rather than use a complex condition to select the best
1573 approach, try both mips_build_shift and mips_build_lower
1574 and pick the one that gives the shortest sequence.
1575 Note that this case is only used once per constant. */
1576 struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1577 unsigned int cost, alt_cost;
1578
1579 cost = mips_build_shift (codes, value);
1580 alt_cost = mips_build_lower (alt_codes, value);
1581 if (alt_cost < cost)
1582 {
1583 memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1584 cost = alt_cost;
1585 }
1586 return cost;
1587 }
1588 }
1589 \f
1590 /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
1591
1592 static bool
1593 mips_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1594 {
1595 return mips_const_insns (x) > 0;
1596 }
1597 \f
1598 /* Return a SYMBOL_REF for a MIPS16 function called NAME. */
1599
1600 static rtx
1601 mips16_stub_function (const char *name)
1602 {
1603 rtx x;
1604
1605 x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
1606 SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
1607 return x;
1608 }
1609 \f
1610 /* Return true if symbols of type TYPE require a GOT access. */
1611
1612 static bool
1613 mips_got_symbol_type_p (enum mips_symbol_type type)
1614 {
1615 switch (type)
1616 {
1617 case SYMBOL_GOT_PAGE_OFST:
1618 case SYMBOL_GOT_DISP:
1619 return true;
1620
1621 default:
1622 return false;
1623 }
1624 }
1625
1626 /* Return true if X is a thread-local symbol. */
1627
1628 static bool
1629 mips_tls_symbol_p (rtx x)
1630 {
1631 return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1632 }
1633
1634 /* Return true if SYMBOL_REF X is associated with a global symbol
1635 (in the STB_GLOBAL sense). */
1636
1637 static bool
1638 mips_global_symbol_p (const_rtx x)
1639 {
1640 const_tree decl = SYMBOL_REF_DECL (x);
1641
1642 if (!decl)
1643 return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1644
1645 /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1646 or weak symbols. Relocations in the object file will be against
1647 the target symbol, so it's that symbol's binding that matters here. */
1648 return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1649 }
1650
1651 /* Return true if function X is a libgcc MIPS16 stub function. */
1652
1653 static bool
1654 mips16_stub_function_p (const_rtx x)
1655 {
1656 return (GET_CODE (x) == SYMBOL_REF
1657 && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1658 }
1659
1660 /* Return true if function X is a locally-defined and locally-binding
1661 MIPS16 function. */
1662
1663 static bool
1664 mips16_local_function_p (const_rtx x)
1665 {
1666 return (GET_CODE (x) == SYMBOL_REF
1667 && SYMBOL_REF_LOCAL_P (x)
1668 && !SYMBOL_REF_EXTERNAL_P (x)
1669 && (mips_get_compress_mode (SYMBOL_REF_DECL (x)) & MASK_MIPS16));
1670 }
1671
1672 /* Return true if SYMBOL_REF X binds locally. */
1673
1674 static bool
1675 mips_symbol_binds_local_p (const_rtx x)
1676 {
1677 return (SYMBOL_REF_DECL (x)
1678 ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1679 : SYMBOL_REF_LOCAL_P (x));
1680 }
1681
1682 /* Return true if rtx constants of mode MODE should be put into a small
1683 data section. */
1684
1685 static bool
1686 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1687 {
1688 return (!TARGET_EMBEDDED_DATA
1689 && TARGET_LOCAL_SDATA
1690 && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1691 }
1692
1693 /* Return true if X should not be moved directly into register $25.
1694 We need this because many versions of GAS will treat "la $25,foo" as
1695 part of a call sequence and so allow a global "foo" to be lazily bound. */
1696
1697 bool
1698 mips_dangerous_for_la25_p (rtx x)
1699 {
1700 return (!TARGET_EXPLICIT_RELOCS
1701 && TARGET_USE_GOT
1702 && GET_CODE (x) == SYMBOL_REF
1703 && mips_global_symbol_p (x));
1704 }
1705
1706 /* Return true if calls to X might need $25 to be valid on entry. */
1707
1708 bool
1709 mips_use_pic_fn_addr_reg_p (const_rtx x)
1710 {
1711 if (!TARGET_USE_PIC_FN_ADDR_REG)
1712 return false;
1713
1714 /* MIPS16 stub functions are guaranteed not to use $25. */
1715 if (mips16_stub_function_p (x))
1716 return false;
1717
1718 if (GET_CODE (x) == SYMBOL_REF)
1719 {
1720 /* If PLTs and copy relocations are available, the static linker
1721 will make sure that $25 is valid on entry to the target function. */
1722 if (TARGET_ABICALLS_PIC0)
1723 return false;
1724
1725 /* Locally-defined functions use absolute accesses to set up
1726 the global pointer. */
1727 if (TARGET_ABSOLUTE_ABICALLS
1728 && mips_symbol_binds_local_p (x)
1729 && !SYMBOL_REF_EXTERNAL_P (x))
1730 return false;
1731 }
1732
1733 return true;
1734 }
1735
1736 /* Return the method that should be used to access SYMBOL_REF or
1737 LABEL_REF X in context CONTEXT. */
1738
1739 static enum mips_symbol_type
1740 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1741 {
1742 if (TARGET_RTP_PIC)
1743 return SYMBOL_GOT_DISP;
1744
1745 if (GET_CODE (x) == LABEL_REF)
1746 {
1747 /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1748 code and if we know that the label is in the current function's
1749 text section. LABEL_REFs are used for jump tables as well as
1750 text labels, so we must check whether jump tables live in the
1751 text section. */
1752 if (TARGET_MIPS16_SHORT_JUMP_TABLES
1753 && !LABEL_REF_NONLOCAL_P (x))
1754 return SYMBOL_PC_RELATIVE;
1755
1756 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1757 return SYMBOL_GOT_PAGE_OFST;
1758
1759 return SYMBOL_ABSOLUTE;
1760 }
1761
1762 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1763
1764 if (SYMBOL_REF_TLS_MODEL (x))
1765 return SYMBOL_TLS;
1766
1767 if (CONSTANT_POOL_ADDRESS_P (x))
1768 {
1769 if (TARGET_MIPS16_TEXT_LOADS)
1770 return SYMBOL_PC_RELATIVE;
1771
1772 if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1773 return SYMBOL_PC_RELATIVE;
1774
1775 if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1776 return SYMBOL_GP_RELATIVE;
1777 }
1778
1779 /* Do not use small-data accesses for weak symbols; they may end up
1780 being zero. */
1781 if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1782 return SYMBOL_GP_RELATIVE;
1783
1784 /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1785 is in effect. */
1786 if (TARGET_ABICALLS_PIC2
1787 && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1788 {
1789 /* There are three cases to consider:
1790
1791 - o32 PIC (either with or without explicit relocs)
1792 - n32/n64 PIC without explicit relocs
1793 - n32/n64 PIC with explicit relocs
1794
1795 In the first case, both local and global accesses will use an
1796 R_MIPS_GOT16 relocation. We must correctly predict which of
1797 the two semantics (local or global) the assembler and linker
1798 will apply. The choice depends on the symbol's binding rather
1799 than its visibility.
1800
1801 In the second case, the assembler will not use R_MIPS_GOT16
1802 relocations, but it chooses between local and global accesses
1803 in the same way as for o32 PIC.
1804
1805 In the third case we have more freedom since both forms of
1806 access will work for any kind of symbol. However, there seems
1807 little point in doing things differently. */
1808 if (mips_global_symbol_p (x))
1809 return SYMBOL_GOT_DISP;
1810
1811 return SYMBOL_GOT_PAGE_OFST;
1812 }
1813
1814 return SYMBOL_ABSOLUTE;
1815 }
1816
1817 /* Classify the base of symbolic expression X, given that X appears in
1818 context CONTEXT. */
1819
1820 static enum mips_symbol_type
1821 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1822 {
1823 rtx offset;
1824
1825 split_const (x, &x, &offset);
1826 if (UNSPEC_ADDRESS_P (x))
1827 return UNSPEC_ADDRESS_TYPE (x);
1828
1829 return mips_classify_symbol (x, context);
1830 }
1831
1832 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1833 is the alignment in bytes of SYMBOL_REF X. */
1834
1835 static bool
1836 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1837 {
1838 HOST_WIDE_INT align;
1839
1840 align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1841 return IN_RANGE (offset, 0, align - 1);
1842 }
1843
1844 /* Return true if X is a symbolic constant that can be used in context
1845 CONTEXT. If it is, store the type of the symbol in *SYMBOL_TYPE. */
1846
1847 bool
1848 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1849 enum mips_symbol_type *symbol_type)
1850 {
1851 rtx offset;
1852
1853 split_const (x, &x, &offset);
1854 if (UNSPEC_ADDRESS_P (x))
1855 {
1856 *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1857 x = UNSPEC_ADDRESS (x);
1858 }
1859 else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1860 {
1861 *symbol_type = mips_classify_symbol (x, context);
1862 if (*symbol_type == SYMBOL_TLS)
1863 return false;
1864 }
1865 else
1866 return false;
1867
1868 if (offset == const0_rtx)
1869 return true;
1870
1871 /* Check whether a nonzero offset is valid for the underlying
1872 relocations. */
1873 switch (*symbol_type)
1874 {
1875 case SYMBOL_ABSOLUTE:
1876 case SYMBOL_64_HIGH:
1877 case SYMBOL_64_MID:
1878 case SYMBOL_64_LOW:
1879 /* If the target has 64-bit pointers and the object file only
1880 supports 32-bit symbols, the values of those symbols will be
1881 sign-extended. In this case we can't allow an arbitrary offset
1882 in case the 32-bit value X + OFFSET has a different sign from X. */
1883 if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1884 return offset_within_block_p (x, INTVAL (offset));
1885
1886 /* In other cases the relocations can handle any offset. */
1887 return true;
1888
1889 case SYMBOL_PC_RELATIVE:
1890 /* Allow constant pool references to be converted to LABEL+CONSTANT.
1891 In this case, we no longer have access to the underlying constant,
1892 but the original symbol-based access was known to be valid. */
1893 if (GET_CODE (x) == LABEL_REF)
1894 return true;
1895
1896 /* Fall through. */
1897
1898 case SYMBOL_GP_RELATIVE:
1899 /* Make sure that the offset refers to something within the
1900 same object block. This should guarantee that the final
1901 PC- or GP-relative offset is within the 16-bit limit. */
1902 return offset_within_block_p (x, INTVAL (offset));
1903
1904 case SYMBOL_GOT_PAGE_OFST:
1905 case SYMBOL_GOTOFF_PAGE:
1906 /* If the symbol is global, the GOT entry will contain the symbol's
1907 address, and we will apply a 16-bit offset after loading it.
1908 If the symbol is local, the linker should provide enough local
1909 GOT entries for a 16-bit offset, but larger offsets may lead
1910 to GOT overflow. */
1911 return SMALL_INT (offset);
1912
1913 case SYMBOL_TPREL:
1914 case SYMBOL_DTPREL:
1915 /* There is no carry between the HI and LO REL relocations, so the
1916 offset is only valid if we know it won't lead to such a carry. */
1917 return mips_offset_within_alignment_p (x, INTVAL (offset));
1918
1919 case SYMBOL_GOT_DISP:
1920 case SYMBOL_GOTOFF_DISP:
1921 case SYMBOL_GOTOFF_CALL:
1922 case SYMBOL_GOTOFF_LOADGP:
1923 case SYMBOL_TLSGD:
1924 case SYMBOL_TLSLDM:
1925 case SYMBOL_GOTTPREL:
1926 case SYMBOL_TLS:
1927 case SYMBOL_HALF:
1928 return false;
1929 }
1930 gcc_unreachable ();
1931 }
1932 \f
1933 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1934 single instruction. We rely on the fact that, in the worst case,
1935 all instructions involved in a MIPS16 address calculation are usually
1936 extended ones. */
1937
1938 static int
1939 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1940 {
1941 if (mips_use_pcrel_pool_p[(int) type])
1942 {
1943 if (mode == MAX_MACHINE_MODE)
1944 /* LEAs will be converted into constant-pool references by
1945 mips_reorg. */
1946 type = SYMBOL_PC_RELATIVE;
1947 else
1948 /* The constant must be loaded and then dereferenced. */
1949 return 0;
1950 }
1951
1952 switch (type)
1953 {
1954 case SYMBOL_ABSOLUTE:
1955 /* When using 64-bit symbols, we need 5 preparatory instructions,
1956 such as:
1957
1958 lui $at,%highest(symbol)
1959 daddiu $at,$at,%higher(symbol)
1960 dsll $at,$at,16
1961 daddiu $at,$at,%hi(symbol)
1962 dsll $at,$at,16
1963
1964 The final address is then $at + %lo(symbol). With 32-bit
1965 symbols we just need a preparatory LUI for normal mode and
1966 a preparatory LI and SLL for MIPS16. */
1967 return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1968
1969 case SYMBOL_GP_RELATIVE:
1970 /* Treat GP-relative accesses as taking a single instruction on
1971 MIPS16 too; the copy of $gp can often be shared. */
1972 return 1;
1973
1974 case SYMBOL_PC_RELATIVE:
1975 /* PC-relative constants can be only be used with ADDIUPC,
1976 DADDIUPC, LWPC and LDPC. */
1977 if (mode == MAX_MACHINE_MODE
1978 || GET_MODE_SIZE (mode) == 4
1979 || GET_MODE_SIZE (mode) == 8)
1980 return 1;
1981
1982 /* The constant must be loaded using ADDIUPC or DADDIUPC first. */
1983 return 0;
1984
1985 case SYMBOL_GOT_DISP:
1986 /* The constant will have to be loaded from the GOT before it
1987 is used in an address. */
1988 if (mode != MAX_MACHINE_MODE)
1989 return 0;
1990
1991 /* Fall through. */
1992
1993 case SYMBOL_GOT_PAGE_OFST:
1994 /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1995 local/global classification is accurate. The worst cases are:
1996
1997 (1) For local symbols when generating o32 or o64 code. The assembler
1998 will use:
1999
2000 lw $at,%got(symbol)
2001 nop
2002
2003 ...and the final address will be $at + %lo(symbol).
2004
2005 (2) For global symbols when -mxgot. The assembler will use:
2006
2007 lui $at,%got_hi(symbol)
2008 (d)addu $at,$at,$gp
2009
2010 ...and the final address will be $at + %got_lo(symbol). */
2011 return 3;
2012
2013 case SYMBOL_GOTOFF_PAGE:
2014 case SYMBOL_GOTOFF_DISP:
2015 case SYMBOL_GOTOFF_CALL:
2016 case SYMBOL_GOTOFF_LOADGP:
2017 case SYMBOL_64_HIGH:
2018 case SYMBOL_64_MID:
2019 case SYMBOL_64_LOW:
2020 case SYMBOL_TLSGD:
2021 case SYMBOL_TLSLDM:
2022 case SYMBOL_DTPREL:
2023 case SYMBOL_GOTTPREL:
2024 case SYMBOL_TPREL:
2025 case SYMBOL_HALF:
2026 /* A 16-bit constant formed by a single relocation, or a 32-bit
2027 constant formed from a high 16-bit relocation and a low 16-bit
2028 relocation. Use mips_split_p to determine which. 32-bit
2029 constants need an "lui; addiu" sequence for normal mode and
2030 an "li; sll; addiu" sequence for MIPS16 mode. */
2031 return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
2032
2033 case SYMBOL_TLS:
2034 /* We don't treat a bare TLS symbol as a constant. */
2035 return 0;
2036 }
2037 gcc_unreachable ();
2038 }
2039
2040 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
2041 to load symbols of type TYPE into a register. Return 0 if the given
2042 type of symbol cannot be used as an immediate operand.
2043
2044 Otherwise, return the number of instructions needed to load or store
2045 values of mode MODE to or from addresses of type TYPE. Return 0 if
2046 the given type of symbol is not valid in addresses.
2047
2048 In both cases, instruction counts are based off BASE_INSN_LENGTH. */
2049
2050 static int
2051 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
2052 {
2053 return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
2054 }
2055 \f
2056 /* A for_each_rtx callback. Stop the search if *X references a
2057 thread-local symbol. */
2058
2059 static int
2060 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
2061 {
2062 return mips_tls_symbol_p (*x);
2063 }
2064
2065 /* Implement TARGET_CANNOT_FORCE_CONST_MEM. */
2066
2067 static bool
2068 mips_cannot_force_const_mem (enum machine_mode mode, rtx x)
2069 {
2070 enum mips_symbol_type type;
2071 rtx base, offset;
2072
2073 /* There is no assembler syntax for expressing an address-sized
2074 high part. */
2075 if (GET_CODE (x) == HIGH)
2076 return true;
2077
2078 /* As an optimization, reject constants that mips_legitimize_move
2079 can expand inline.
2080
2081 Suppose we have a multi-instruction sequence that loads constant C
2082 into register R. If R does not get allocated a hard register, and
2083 R is used in an operand that allows both registers and memory
2084 references, reload will consider forcing C into memory and using
2085 one of the instruction's memory alternatives. Returning false
2086 here will force it to use an input reload instead. */
2087 if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x))
2088 return true;
2089
2090 split_const (x, &base, &offset);
2091 if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type))
2092 {
2093 /* See whether we explicitly want these symbols in the pool. */
2094 if (mips_use_pcrel_pool_p[(int) type])
2095 return false;
2096
2097 /* The same optimization as for CONST_INT. */
2098 if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
2099 return true;
2100
2101 /* If MIPS16 constant pools live in the text section, they should
2102 not refer to anything that might need run-time relocation. */
2103 if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2104 return true;
2105 }
2106
2107 /* TLS symbols must be computed by mips_legitimize_move. */
2108 if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
2109 return true;
2110
2111 return false;
2112 }
2113
2114 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P. We can't use blocks for
2115 constants when we're using a per-function constant pool. */
2116
2117 static bool
2118 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
2119 const_rtx x ATTRIBUTE_UNUSED)
2120 {
2121 return !TARGET_MIPS16_PCREL_LOADS;
2122 }
2123 \f
2124 /* Return true if register REGNO is a valid base register for mode MODE.
2125 STRICT_P is true if REG_OK_STRICT is in effect. */
2126
2127 int
2128 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
2129 bool strict_p)
2130 {
2131 if (!HARD_REGISTER_NUM_P (regno))
2132 {
2133 if (!strict_p)
2134 return true;
2135 regno = reg_renumber[regno];
2136 }
2137
2138 /* These fake registers will be eliminated to either the stack or
2139 hard frame pointer, both of which are usually valid base registers.
2140 Reload deals with the cases where the eliminated form isn't valid. */
2141 if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2142 return true;
2143
2144 /* In MIPS16 mode, the stack pointer can only address word and doubleword
2145 values, nothing smaller. There are two problems here:
2146
2147 (a) Instantiating virtual registers can introduce new uses of the
2148 stack pointer. If these virtual registers are valid addresses,
2149 the stack pointer should be too.
2150
2151 (b) Most uses of the stack pointer are not made explicit until
2152 FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2153 We don't know until that stage whether we'll be eliminating to the
2154 stack pointer (which needs the restriction) or the hard frame
2155 pointer (which doesn't).
2156
2157 All in all, it seems more consistent to only enforce this restriction
2158 during and after reload. */
2159 if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2160 return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2161
2162 return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2163 }
2164
2165 /* Return true if X is a valid base register for mode MODE.
2166 STRICT_P is true if REG_OK_STRICT is in effect. */
2167
2168 static bool
2169 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2170 {
2171 if (!strict_p && GET_CODE (x) == SUBREG)
2172 x = SUBREG_REG (x);
2173
2174 return (REG_P (x)
2175 && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2176 }
2177
2178 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2179 can address a value of mode MODE. */
2180
2181 static bool
2182 mips_valid_offset_p (rtx x, enum machine_mode mode)
2183 {
2184 /* Check that X is a signed 16-bit number. */
2185 if (!const_arith_operand (x, Pmode))
2186 return false;
2187
2188 /* We may need to split multiword moves, so make sure that every word
2189 is accessible. */
2190 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2191 && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2192 return false;
2193
2194 return true;
2195 }
2196
2197 /* Return true if a LO_SUM can address a value of mode MODE when the
2198 LO_SUM symbol has type SYMBOL_TYPE. */
2199
2200 static bool
2201 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2202 {
2203 /* Check that symbols of type SYMBOL_TYPE can be used to access values
2204 of mode MODE. */
2205 if (mips_symbol_insns (symbol_type, mode) == 0)
2206 return false;
2207
2208 /* Check that there is a known low-part relocation. */
2209 if (mips_lo_relocs[symbol_type] == NULL)
2210 return false;
2211
2212 /* We may need to split multiword moves, so make sure that each word
2213 can be accessed without inducing a carry. This is mainly needed
2214 for o64, which has historically only guaranteed 64-bit alignment
2215 for 128-bit types. */
2216 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2217 && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2218 return false;
2219
2220 return true;
2221 }
2222
2223 /* Return true if X is a valid address for machine mode MODE. If it is,
2224 fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in
2225 effect. */
2226
2227 static bool
2228 mips_classify_address (struct mips_address_info *info, rtx x,
2229 enum machine_mode mode, bool strict_p)
2230 {
2231 switch (GET_CODE (x))
2232 {
2233 case REG:
2234 case SUBREG:
2235 info->type = ADDRESS_REG;
2236 info->reg = x;
2237 info->offset = const0_rtx;
2238 return mips_valid_base_register_p (info->reg, mode, strict_p);
2239
2240 case PLUS:
2241 info->type = ADDRESS_REG;
2242 info->reg = XEXP (x, 0);
2243 info->offset = XEXP (x, 1);
2244 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2245 && mips_valid_offset_p (info->offset, mode));
2246
2247 case LO_SUM:
2248 info->type = ADDRESS_LO_SUM;
2249 info->reg = XEXP (x, 0);
2250 info->offset = XEXP (x, 1);
2251 /* We have to trust the creator of the LO_SUM to do something vaguely
2252 sane. Target-independent code that creates a LO_SUM should also
2253 create and verify the matching HIGH. Target-independent code that
2254 adds an offset to a LO_SUM must prove that the offset will not
2255 induce a carry. Failure to do either of these things would be
2256 a bug, and we are not required to check for it here. The MIPS
2257 backend itself should only create LO_SUMs for valid symbolic
2258 constants, with the high part being either a HIGH or a copy
2259 of _gp. */
2260 info->symbol_type
2261 = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2262 return (mips_valid_base_register_p (info->reg, mode, strict_p)
2263 && mips_valid_lo_sum_p (info->symbol_type, mode));
2264
2265 case CONST_INT:
2266 /* Small-integer addresses don't occur very often, but they
2267 are legitimate if $0 is a valid base register. */
2268 info->type = ADDRESS_CONST_INT;
2269 return !TARGET_MIPS16 && SMALL_INT (x);
2270
2271 case CONST:
2272 case LABEL_REF:
2273 case SYMBOL_REF:
2274 info->type = ADDRESS_SYMBOLIC;
2275 return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2276 &info->symbol_type)
2277 && mips_symbol_insns (info->symbol_type, mode) > 0
2278 && !mips_split_p[info->symbol_type]);
2279
2280 default:
2281 return false;
2282 }
2283 }
2284
2285 /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
2286
2287 static bool
2288 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2289 {
2290 struct mips_address_info addr;
2291
2292 return mips_classify_address (&addr, x, mode, strict_p);
2293 }
2294
2295 /* Return true if X is a legitimate $sp-based address for mode MDOE. */
2296
2297 bool
2298 mips_stack_address_p (rtx x, enum machine_mode mode)
2299 {
2300 struct mips_address_info addr;
2301
2302 return (mips_classify_address (&addr, x, mode, false)
2303 && addr.type == ADDRESS_REG
2304 && addr.reg == stack_pointer_rtx);
2305 }
2306
2307 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2308 address instruction. Note that such addresses are not considered
2309 legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2310 is so restricted. */
2311
2312 static bool
2313 mips_lwxs_address_p (rtx addr)
2314 {
2315 if (ISA_HAS_LWXS
2316 && GET_CODE (addr) == PLUS
2317 && REG_P (XEXP (addr, 1)))
2318 {
2319 rtx offset = XEXP (addr, 0);
2320 if (GET_CODE (offset) == MULT
2321 && REG_P (XEXP (offset, 0))
2322 && CONST_INT_P (XEXP (offset, 1))
2323 && INTVAL (XEXP (offset, 1)) == 4)
2324 return true;
2325 }
2326 return false;
2327 }
2328
2329 /* Return true if ADDR matches the pattern for the L{B,H,W,D}{,U}X load
2330 indexed address instruction. Note that such addresses are
2331 not considered legitimate in the TARGET_LEGITIMATE_ADDRESS_P
2332 sense, because their use is so restricted. */
2333
2334 static bool
2335 mips_lx_address_p (rtx addr, enum machine_mode mode)
2336 {
2337 if (GET_CODE (addr) != PLUS
2338 || !REG_P (XEXP (addr, 0))
2339 || !REG_P (XEXP (addr, 1)))
2340 return false;
2341 if (ISA_HAS_LBX && mode == QImode)
2342 return true;
2343 if (ISA_HAS_LHX && mode == HImode)
2344 return true;
2345 if (ISA_HAS_LWX && mode == SImode)
2346 return true;
2347 if (ISA_HAS_LDX && mode == DImode)
2348 return true;
2349 return false;
2350 }
2351 \f
2352 /* Return true if a value at OFFSET bytes from base register BASE can be
2353 accessed using an unextended MIPS16 instruction. MODE is the mode of
2354 the value.
2355
2356 Usually the offset in an unextended instruction is a 5-bit field.
2357 The offset is unsigned and shifted left once for LH and SH, twice
2358 for LW and SW, and so on. An exception is LWSP and SWSP, which have
2359 an 8-bit immediate field that's shifted left twice. */
2360
2361 static bool
2362 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2363 unsigned HOST_WIDE_INT offset)
2364 {
2365 if (mode != BLKmode && offset % GET_MODE_SIZE (mode) == 0)
2366 {
2367 if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2368 return offset < 256U * GET_MODE_SIZE (mode);
2369 return offset < 32U * GET_MODE_SIZE (mode);
2370 }
2371 return false;
2372 }
2373
2374 /* Return the number of instructions needed to load or store a value
2375 of mode MODE at address X, assuming that BASE_INSN_LENGTH is the
2376 length of one instruction. Return 0 if X isn't valid for MODE.
2377 Assume that multiword moves may need to be split into word moves
2378 if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2379 enough. */
2380
2381 int
2382 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2383 {
2384 struct mips_address_info addr;
2385 int factor;
2386
2387 /* BLKmode is used for single unaligned loads and stores and should
2388 not count as a multiword mode. (GET_MODE_SIZE (BLKmode) is pretty
2389 meaningless, so we have to single it out as a special case one way
2390 or the other.) */
2391 if (mode != BLKmode && might_split_p)
2392 factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2393 else
2394 factor = 1;
2395
2396 if (mips_classify_address (&addr, x, mode, false))
2397 switch (addr.type)
2398 {
2399 case ADDRESS_REG:
2400 if (TARGET_MIPS16
2401 && !mips16_unextended_reference_p (mode, addr.reg,
2402 UINTVAL (addr.offset)))
2403 return factor * 2;
2404 return factor;
2405
2406 case ADDRESS_LO_SUM:
2407 return TARGET_MIPS16 ? factor * 2 : factor;
2408
2409 case ADDRESS_CONST_INT:
2410 return factor;
2411
2412 case ADDRESS_SYMBOLIC:
2413 return factor * mips_symbol_insns (addr.symbol_type, mode);
2414 }
2415 return 0;
2416 }
2417
2418 /* Return true if X fits within an unsigned field of BITS bits that is
2419 shifted left SHIFT bits before being used. */
2420
2421 bool
2422 mips_unsigned_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2423 {
2424 return (x & ((1 << shift) - 1)) == 0 && x < ((unsigned) 1 << (shift + bits));
2425 }
2426
2427 /* Return true if X fits within a signed field of BITS bits that is
2428 shifted left SHIFT bits before being used. */
2429
2430 bool
2431 mips_signed_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2432 {
2433 x += 1 << (bits + shift - 1);
2434 return mips_unsigned_immediate_p (x, bits, shift);
2435 }
2436
2437 /* Return true if X is legitimate for accessing values of mode MODE,
2438 if it is based on a MIPS16 register, and if the offset satisfies
2439 OFFSET_PREDICATE. */
2440
2441 bool
2442 m16_based_address_p (rtx x, enum machine_mode mode,
2443 insn_operand_predicate_fn offset_predicate)
2444 {
2445 struct mips_address_info addr;
2446
2447 return (mips_classify_address (&addr, x, mode, false)
2448 && addr.type == ADDRESS_REG
2449 && M16_REG_P (REGNO (addr.reg))
2450 && offset_predicate (addr.offset, mode));
2451 }
2452
2453 /* Return true if X is a legitimate address that conforms to the requirements
2454 for a microMIPS LWSP or SWSP insn. */
2455
2456 bool
2457 lwsp_swsp_address_p (rtx x, enum machine_mode mode)
2458 {
2459 struct mips_address_info addr;
2460
2461 return (mips_classify_address (&addr, x, mode, false)
2462 && addr.type == ADDRESS_REG
2463 && REGNO (addr.reg) == STACK_POINTER_REGNUM
2464 && uw5_operand (addr.offset, mode));
2465 }
2466
2467 /* Return true if X is a legitimate address with a 12-bit offset.
2468 MODE is the mode of the value being accessed. */
2469
2470 bool
2471 umips_12bit_offset_address_p (rtx x, enum machine_mode mode)
2472 {
2473 struct mips_address_info addr;
2474
2475 return (mips_classify_address (&addr, x, mode, false)
2476 && addr.type == ADDRESS_REG
2477 && CONST_INT_P (addr.offset)
2478 && UMIPS_12BIT_OFFSET_P (INTVAL (addr.offset)));
2479 }
2480
2481 /* Return the number of instructions needed to load constant X,
2482 assuming that BASE_INSN_LENGTH is the length of one instruction.
2483 Return 0 if X isn't a valid constant. */
2484
2485 int
2486 mips_const_insns (rtx x)
2487 {
2488 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2489 enum mips_symbol_type symbol_type;
2490 rtx offset;
2491
2492 switch (GET_CODE (x))
2493 {
2494 case HIGH:
2495 if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2496 &symbol_type)
2497 || !mips_split_p[symbol_type])
2498 return 0;
2499
2500 /* This is simply an LUI for normal mode. It is an extended
2501 LI followed by an extended SLL for MIPS16. */
2502 return TARGET_MIPS16 ? 4 : 1;
2503
2504 case CONST_INT:
2505 if (TARGET_MIPS16)
2506 /* Unsigned 8-bit constants can be loaded using an unextended
2507 LI instruction. Unsigned 16-bit constants can be loaded
2508 using an extended LI. Negative constants must be loaded
2509 using LI and then negated. */
2510 return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2511 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2512 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2513 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2514 : 0);
2515
2516 return mips_build_integer (codes, INTVAL (x));
2517
2518 case CONST_DOUBLE:
2519 case CONST_VECTOR:
2520 /* Allow zeros for normal mode, where we can use $0. */
2521 return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2522
2523 case CONST:
2524 if (CONST_GP_P (x))
2525 return 1;
2526
2527 /* See if we can refer to X directly. */
2528 if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2529 return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2530
2531 /* Otherwise try splitting the constant into a base and offset.
2532 If the offset is a 16-bit value, we can load the base address
2533 into a register and then use (D)ADDIU to add in the offset.
2534 If the offset is larger, we can load the base and offset
2535 into separate registers and add them together with (D)ADDU.
2536 However, the latter is only possible before reload; during
2537 and after reload, we must have the option of forcing the
2538 constant into the pool instead. */
2539 split_const (x, &x, &offset);
2540 if (offset != 0)
2541 {
2542 int n = mips_const_insns (x);
2543 if (n != 0)
2544 {
2545 if (SMALL_INT (offset))
2546 return n + 1;
2547 else if (!targetm.cannot_force_const_mem (GET_MODE (x), x))
2548 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2549 }
2550 }
2551 return 0;
2552
2553 case SYMBOL_REF:
2554 case LABEL_REF:
2555 return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2556 MAX_MACHINE_MODE);
2557
2558 default:
2559 return 0;
2560 }
2561 }
2562
2563 /* X is a doubleword constant that can be handled by splitting it into
2564 two words and loading each word separately. Return the number of
2565 instructions required to do this, assuming that BASE_INSN_LENGTH
2566 is the length of one instruction. */
2567
2568 int
2569 mips_split_const_insns (rtx x)
2570 {
2571 unsigned int low, high;
2572
2573 low = mips_const_insns (mips_subword (x, false));
2574 high = mips_const_insns (mips_subword (x, true));
2575 gcc_assert (low > 0 && high > 0);
2576 return low + high;
2577 }
2578
2579 /* Return the number of instructions needed to implement INSN,
2580 given that it loads from or stores to MEM. Assume that
2581 BASE_INSN_LENGTH is the length of one instruction. */
2582
2583 int
2584 mips_load_store_insns (rtx mem, rtx insn)
2585 {
2586 enum machine_mode mode;
2587 bool might_split_p;
2588 rtx set;
2589
2590 gcc_assert (MEM_P (mem));
2591 mode = GET_MODE (mem);
2592
2593 /* Try to prove that INSN does not need to be split. */
2594 might_split_p = GET_MODE_SIZE (mode) > UNITS_PER_WORD;
2595 if (might_split_p)
2596 {
2597 set = single_set (insn);
2598 if (set && !mips_split_move_insn_p (SET_DEST (set), SET_SRC (set), insn))
2599 might_split_p = false;
2600 }
2601
2602 return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2603 }
2604
2605 /* Return the number of instructions needed for an integer division,
2606 assuming that BASE_INSN_LENGTH is the length of one instruction. */
2607
2608 int
2609 mips_idiv_insns (void)
2610 {
2611 int count;
2612
2613 count = 1;
2614 if (TARGET_CHECK_ZERO_DIV)
2615 {
2616 if (GENERATE_DIVIDE_TRAPS)
2617 count++;
2618 else
2619 count += 2;
2620 }
2621
2622 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2623 count++;
2624 return count;
2625 }
2626 \f
2627 /* Emit a move from SRC to DEST. Assume that the move expanders can
2628 handle all moves if !can_create_pseudo_p (). The distinction is
2629 important because, unlike emit_move_insn, the move expanders know
2630 how to force Pmode objects into the constant pool even when the
2631 constant pool address is not itself legitimate. */
2632
2633 rtx
2634 mips_emit_move (rtx dest, rtx src)
2635 {
2636 return (can_create_pseudo_p ()
2637 ? emit_move_insn (dest, src)
2638 : emit_move_insn_1 (dest, src));
2639 }
2640
2641 /* Emit a move from SRC to DEST, splitting compound moves into individual
2642 instructions. SPLIT_TYPE is the type of split to perform. */
2643
2644 static void
2645 mips_emit_move_or_split (rtx dest, rtx src, enum mips_split_type split_type)
2646 {
2647 if (mips_split_move_p (dest, src, split_type))
2648 mips_split_move (dest, src, split_type);
2649 else
2650 mips_emit_move (dest, src);
2651 }
2652
2653 /* Emit an instruction of the form (set TARGET (CODE OP0)). */
2654
2655 static void
2656 mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2657 {
2658 emit_insn (gen_rtx_SET (VOIDmode, target,
2659 gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2660 }
2661
2662 /* Compute (CODE OP0) and store the result in a new register of mode MODE.
2663 Return that new register. */
2664
2665 static rtx
2666 mips_force_unary (enum machine_mode mode, enum rtx_code code, rtx op0)
2667 {
2668 rtx reg;
2669
2670 reg = gen_reg_rtx (mode);
2671 mips_emit_unary (code, reg, op0);
2672 return reg;
2673 }
2674
2675 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)). */
2676
2677 void
2678 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2679 {
2680 emit_insn (gen_rtx_SET (VOIDmode, target,
2681 gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2682 }
2683
2684 /* Compute (CODE OP0 OP1) and store the result in a new register
2685 of mode MODE. Return that new register. */
2686
2687 static rtx
2688 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2689 {
2690 rtx reg;
2691
2692 reg = gen_reg_rtx (mode);
2693 mips_emit_binary (code, reg, op0, op1);
2694 return reg;
2695 }
2696
2697 /* Copy VALUE to a register and return that register. If new pseudos
2698 are allowed, copy it into a new register, otherwise use DEST. */
2699
2700 static rtx
2701 mips_force_temporary (rtx dest, rtx value)
2702 {
2703 if (can_create_pseudo_p ())
2704 return force_reg (Pmode, value);
2705 else
2706 {
2707 mips_emit_move (dest, value);
2708 return dest;
2709 }
2710 }
2711
2712 /* Emit a call sequence with call pattern PATTERN and return the call
2713 instruction itself (which is not necessarily the last instruction
2714 emitted). ORIG_ADDR is the original, unlegitimized address,
2715 ADDR is the legitimized form, and LAZY_P is true if the call
2716 address is lazily-bound. */
2717
2718 static rtx
2719 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2720 {
2721 rtx insn, reg;
2722
2723 insn = emit_call_insn (pattern);
2724
2725 if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2726 {
2727 /* MIPS16 JALRs only take MIPS16 registers. If the target
2728 function requires $25 to be valid on entry, we must copy it
2729 there separately. The move instruction can be put in the
2730 call's delay slot. */
2731 reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2732 emit_insn_before (gen_move_insn (reg, addr), insn);
2733 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2734 }
2735
2736 if (lazy_p)
2737 /* Lazy-binding stubs require $gp to be valid on entry. */
2738 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2739
2740 if (TARGET_USE_GOT)
2741 {
2742 /* See the comment above load_call<mode> for details. */
2743 use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2744 gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2745 emit_insn (gen_update_got_version ());
2746 }
2747 return insn;
2748 }
2749 \f
2750 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2751 then add CONST_INT OFFSET to the result. */
2752
2753 static rtx
2754 mips_unspec_address_offset (rtx base, rtx offset,
2755 enum mips_symbol_type symbol_type)
2756 {
2757 base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2758 UNSPEC_ADDRESS_FIRST + symbol_type);
2759 if (offset != const0_rtx)
2760 base = gen_rtx_PLUS (Pmode, base, offset);
2761 return gen_rtx_CONST (Pmode, base);
2762 }
2763
2764 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2765 type SYMBOL_TYPE. */
2766
2767 rtx
2768 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2769 {
2770 rtx base, offset;
2771
2772 split_const (address, &base, &offset);
2773 return mips_unspec_address_offset (base, offset, symbol_type);
2774 }
2775
2776 /* If OP is an UNSPEC address, return the address to which it refers,
2777 otherwise return OP itself. */
2778
2779 rtx
2780 mips_strip_unspec_address (rtx op)
2781 {
2782 rtx base, offset;
2783
2784 split_const (op, &base, &offset);
2785 if (UNSPEC_ADDRESS_P (base))
2786 op = plus_constant (Pmode, UNSPEC_ADDRESS (base), INTVAL (offset));
2787 return op;
2788 }
2789
2790 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2791 high part to BASE and return the result. Just return BASE otherwise.
2792 TEMP is as for mips_force_temporary.
2793
2794 The returned expression can be used as the first operand to a LO_SUM. */
2795
2796 static rtx
2797 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2798 enum mips_symbol_type symbol_type)
2799 {
2800 if (mips_split_p[symbol_type])
2801 {
2802 addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2803 addr = mips_force_temporary (temp, addr);
2804 base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2805 }
2806 return base;
2807 }
2808 \f
2809 /* Return an instruction that copies $gp into register REG. We want
2810 GCC to treat the register's value as constant, so that its value
2811 can be rematerialized on demand. */
2812
2813 static rtx
2814 gen_load_const_gp (rtx reg)
2815 {
2816 return PMODE_INSN (gen_load_const_gp, (reg));
2817 }
2818
2819 /* Return a pseudo register that contains the value of $gp throughout
2820 the current function. Such registers are needed by MIPS16 functions,
2821 for which $gp itself is not a valid base register or addition operand. */
2822
2823 static rtx
2824 mips16_gp_pseudo_reg (void)
2825 {
2826 if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2827 {
2828 rtx insn, scan;
2829
2830 cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2831
2832 push_topmost_sequence ();
2833
2834 scan = get_insns ();
2835 while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2836 scan = NEXT_INSN (scan);
2837
2838 insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2839 insn = emit_insn_after (insn, scan);
2840 INSN_LOCATION (insn) = 0;
2841
2842 pop_topmost_sequence ();
2843 }
2844
2845 return cfun->machine->mips16_gp_pseudo_rtx;
2846 }
2847
2848 /* Return a base register that holds pic_offset_table_rtx.
2849 TEMP, if nonnull, is a scratch Pmode base register. */
2850
2851 rtx
2852 mips_pic_base_register (rtx temp)
2853 {
2854 if (!TARGET_MIPS16)
2855 return pic_offset_table_rtx;
2856
2857 if (currently_expanding_to_rtl)
2858 return mips16_gp_pseudo_reg ();
2859
2860 if (can_create_pseudo_p ())
2861 temp = gen_reg_rtx (Pmode);
2862
2863 if (TARGET_USE_GOT)
2864 /* The first post-reload split exposes all references to $gp
2865 (both uses and definitions). All references must remain
2866 explicit after that point.
2867
2868 It is safe to introduce uses of $gp at any time, so for
2869 simplicity, we do that before the split too. */
2870 mips_emit_move (temp, pic_offset_table_rtx);
2871 else
2872 emit_insn (gen_load_const_gp (temp));
2873 return temp;
2874 }
2875
2876 /* Return the RHS of a load_call<mode> insn. */
2877
2878 static rtx
2879 mips_unspec_call (rtx reg, rtx symbol)
2880 {
2881 rtvec vec;
2882
2883 vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2884 return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2885 }
2886
2887 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2888 reference. Return NULL_RTX otherwise. */
2889
2890 static rtx
2891 mips_strip_unspec_call (rtx src)
2892 {
2893 if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2894 return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2895 return NULL_RTX;
2896 }
2897
2898 /* Create and return a GOT reference of type TYPE for address ADDR.
2899 TEMP, if nonnull, is a scratch Pmode base register. */
2900
2901 rtx
2902 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2903 {
2904 rtx base, high, lo_sum_symbol;
2905
2906 base = mips_pic_base_register (temp);
2907
2908 /* If we used the temporary register to load $gp, we can't use
2909 it for the high part as well. */
2910 if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2911 temp = NULL;
2912
2913 high = mips_unspec_offset_high (temp, base, addr, type);
2914 lo_sum_symbol = mips_unspec_address (addr, type);
2915
2916 if (type == SYMBOL_GOTOFF_CALL)
2917 return mips_unspec_call (high, lo_sum_symbol);
2918 else
2919 return PMODE_INSN (gen_unspec_got, (high, lo_sum_symbol));
2920 }
2921
2922 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2923 it appears in a MEM of that mode. Return true if ADDR is a legitimate
2924 constant in that context and can be split into high and low parts.
2925 If so, and if LOW_OUT is nonnull, emit the high part and store the
2926 low part in *LOW_OUT. Leave *LOW_OUT unchanged otherwise.
2927
2928 TEMP is as for mips_force_temporary and is used to load the high
2929 part into a register.
2930
2931 When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2932 a legitimize SET_SRC for an .md pattern, otherwise the low part
2933 is guaranteed to be a legitimate address for mode MODE. */
2934
2935 bool
2936 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2937 {
2938 enum mips_symbol_context context;
2939 enum mips_symbol_type symbol_type;
2940 rtx high;
2941
2942 context = (mode == MAX_MACHINE_MODE
2943 ? SYMBOL_CONTEXT_LEA
2944 : SYMBOL_CONTEXT_MEM);
2945 if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2946 {
2947 addr = XEXP (addr, 0);
2948 if (mips_symbolic_constant_p (addr, context, &symbol_type)
2949 && mips_symbol_insns (symbol_type, mode) > 0
2950 && mips_split_hi_p[symbol_type])
2951 {
2952 if (low_out)
2953 switch (symbol_type)
2954 {
2955 case SYMBOL_GOT_PAGE_OFST:
2956 /* The high part of a page/ofst pair is loaded from the GOT. */
2957 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2958 break;
2959
2960 default:
2961 gcc_unreachable ();
2962 }
2963 return true;
2964 }
2965 }
2966 else
2967 {
2968 if (mips_symbolic_constant_p (addr, context, &symbol_type)
2969 && mips_symbol_insns (symbol_type, mode) > 0
2970 && mips_split_p[symbol_type])
2971 {
2972 if (low_out)
2973 switch (symbol_type)
2974 {
2975 case SYMBOL_GOT_DISP:
2976 /* SYMBOL_GOT_DISP symbols are loaded from the GOT. */
2977 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2978 break;
2979
2980 case SYMBOL_GP_RELATIVE:
2981 high = mips_pic_base_register (temp);
2982 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2983 break;
2984
2985 default:
2986 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2987 high = mips_force_temporary (temp, high);
2988 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2989 break;
2990 }
2991 return true;
2992 }
2993 }
2994 return false;
2995 }
2996
2997 /* Return a legitimate address for REG + OFFSET. TEMP is as for
2998 mips_force_temporary; it is only needed when OFFSET is not a
2999 SMALL_OPERAND. */
3000
3001 static rtx
3002 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
3003 {
3004 if (!SMALL_OPERAND (offset))
3005 {
3006 rtx high;
3007
3008 if (TARGET_MIPS16)
3009 {
3010 /* Load the full offset into a register so that we can use
3011 an unextended instruction for the address itself. */
3012 high = GEN_INT (offset);
3013 offset = 0;
3014 }
3015 else
3016 {
3017 /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
3018 The addition inside the macro CONST_HIGH_PART may cause an
3019 overflow, so we need to force a sign-extension check. */
3020 high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
3021 offset = CONST_LOW_PART (offset);
3022 }
3023 high = mips_force_temporary (temp, high);
3024 reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
3025 }
3026 return plus_constant (Pmode, reg, offset);
3027 }
3028 \f
3029 /* The __tls_get_attr symbol. */
3030 static GTY(()) rtx mips_tls_symbol;
3031
3032 /* Return an instruction sequence that calls __tls_get_addr. SYM is
3033 the TLS symbol we are referencing and TYPE is the symbol type to use
3034 (either global dynamic or local dynamic). V0 is an RTX for the
3035 return value location. */
3036
3037 static rtx
3038 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
3039 {
3040 rtx insn, loc, a0;
3041
3042 a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
3043
3044 if (!mips_tls_symbol)
3045 mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
3046
3047 loc = mips_unspec_address (sym, type);
3048
3049 start_sequence ();
3050
3051 emit_insn (gen_rtx_SET (Pmode, a0,
3052 gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
3053 insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
3054 const0_rtx, NULL_RTX, false);
3055 RTL_CONST_CALL_P (insn) = 1;
3056 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
3057 insn = get_insns ();
3058
3059 end_sequence ();
3060
3061 return insn;
3062 }
3063
3064 /* Return a pseudo register that contains the current thread pointer. */
3065
3066 rtx
3067 mips_expand_thread_pointer (rtx tp)
3068 {
3069 rtx fn;
3070
3071 if (TARGET_MIPS16)
3072 {
3073 mips_need_mips16_rdhwr_p = true;
3074 fn = mips16_stub_function ("__mips16_rdhwr");
3075 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_LOCAL;
3076 if (!call_insn_operand (fn, VOIDmode))
3077 fn = force_reg (Pmode, fn);
3078 emit_insn (PMODE_INSN (gen_tls_get_tp_mips16, (tp, fn)));
3079 }
3080 else
3081 emit_insn (PMODE_INSN (gen_tls_get_tp, (tp)));
3082 return tp;
3083 }
3084
3085 static rtx
3086 mips_get_tp (void)
3087 {
3088 return mips_expand_thread_pointer (gen_reg_rtx (Pmode));
3089 }
3090
3091 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
3092 its address. The return value will be both a valid address and a valid
3093 SET_SRC (either a REG or a LO_SUM). */
3094
3095 static rtx
3096 mips_legitimize_tls_address (rtx loc)
3097 {
3098 rtx dest, insn, v0, tp, tmp1, tmp2, eqv, offset;
3099 enum tls_model model;
3100
3101 model = SYMBOL_REF_TLS_MODEL (loc);
3102 /* Only TARGET_ABICALLS code can have more than one module; other
3103 code must be be static and should not use a GOT. All TLS models
3104 reduce to local exec in this situation. */
3105 if (!TARGET_ABICALLS)
3106 model = TLS_MODEL_LOCAL_EXEC;
3107
3108 switch (model)
3109 {
3110 case TLS_MODEL_GLOBAL_DYNAMIC:
3111 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3112 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
3113 dest = gen_reg_rtx (Pmode);
3114 emit_libcall_block (insn, dest, v0, loc);
3115 break;
3116
3117 case TLS_MODEL_LOCAL_DYNAMIC:
3118 v0 = gen_rtx_REG (Pmode, GP_RETURN);
3119 insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
3120 tmp1 = gen_reg_rtx (Pmode);
3121
3122 /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
3123 share the LDM result with other LD model accesses. */
3124 eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3125 UNSPEC_TLS_LDM);
3126 emit_libcall_block (insn, tmp1, v0, eqv);
3127
3128 offset = mips_unspec_address (loc, SYMBOL_DTPREL);
3129 if (mips_split_p[SYMBOL_DTPREL])
3130 {
3131 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
3132 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3133 }
3134 else
3135 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3136 0, 0, OPTAB_DIRECT);
3137 break;
3138
3139 case TLS_MODEL_INITIAL_EXEC:
3140 tp = mips_get_tp ();
3141 tmp1 = gen_reg_rtx (Pmode);
3142 tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
3143 if (Pmode == DImode)
3144 emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
3145 else
3146 emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
3147 dest = gen_reg_rtx (Pmode);
3148 emit_insn (gen_add3_insn (dest, tmp1, tp));
3149 break;
3150
3151 case TLS_MODEL_LOCAL_EXEC:
3152 tmp1 = mips_get_tp ();
3153 offset = mips_unspec_address (loc, SYMBOL_TPREL);
3154 if (mips_split_p[SYMBOL_TPREL])
3155 {
3156 tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_TPREL);
3157 dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3158 }
3159 else
3160 dest = expand_binop (Pmode, add_optab, tmp1, offset,
3161 0, 0, OPTAB_DIRECT);
3162 break;
3163
3164 default:
3165 gcc_unreachable ();
3166 }
3167 return dest;
3168 }
3169 \f
3170 /* If X is not a valid address for mode MODE, force it into a register. */
3171
3172 static rtx
3173 mips_force_address (rtx x, enum machine_mode mode)
3174 {
3175 if (!mips_legitimate_address_p (mode, x, false))
3176 x = force_reg (Pmode, x);
3177 return x;
3178 }
3179
3180 /* This function is used to implement LEGITIMIZE_ADDRESS. If X can
3181 be legitimized in a way that the generic machinery might not expect,
3182 return a new address, otherwise return NULL. MODE is the mode of
3183 the memory being accessed. */
3184
3185 static rtx
3186 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3187 enum machine_mode mode)
3188 {
3189 rtx base, addr;
3190 HOST_WIDE_INT offset;
3191
3192 if (mips_tls_symbol_p (x))
3193 return mips_legitimize_tls_address (x);
3194
3195 /* See if the address can split into a high part and a LO_SUM. */
3196 if (mips_split_symbol (NULL, x, mode, &addr))
3197 return mips_force_address (addr, mode);
3198
3199 /* Handle BASE + OFFSET using mips_add_offset. */
3200 mips_split_plus (x, &base, &offset);
3201 if (offset != 0)
3202 {
3203 if (!mips_valid_base_register_p (base, mode, false))
3204 base = copy_to_mode_reg (Pmode, base);
3205 addr = mips_add_offset (NULL, base, offset);
3206 return mips_force_address (addr, mode);
3207 }
3208
3209 return x;
3210 }
3211
3212 /* Load VALUE into DEST. TEMP is as for mips_force_temporary. */
3213
3214 void
3215 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3216 {
3217 struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3218 enum machine_mode mode;
3219 unsigned int i, num_ops;
3220 rtx x;
3221
3222 mode = GET_MODE (dest);
3223 num_ops = mips_build_integer (codes, value);
3224
3225 /* Apply each binary operation to X. Invariant: X is a legitimate
3226 source operand for a SET pattern. */
3227 x = GEN_INT (codes[0].value);
3228 for (i = 1; i < num_ops; i++)
3229 {
3230 if (!can_create_pseudo_p ())
3231 {
3232 emit_insn (gen_rtx_SET (VOIDmode, temp, x));
3233 x = temp;
3234 }
3235 else
3236 x = force_reg (mode, x);
3237 x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3238 }
3239
3240 emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3241 }
3242
3243 /* Subroutine of mips_legitimize_move. Move constant SRC into register
3244 DEST given that SRC satisfies immediate_operand but doesn't satisfy
3245 move_operand. */
3246
3247 static void
3248 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3249 {
3250 rtx base, offset;
3251
3252 /* Split moves of big integers into smaller pieces. */
3253 if (splittable_const_int_operand (src, mode))
3254 {
3255 mips_move_integer (dest, dest, INTVAL (src));
3256 return;
3257 }
3258
3259 /* Split moves of symbolic constants into high/low pairs. */
3260 if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3261 {
3262 emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3263 return;
3264 }
3265
3266 /* Generate the appropriate access sequences for TLS symbols. */
3267 if (mips_tls_symbol_p (src))
3268 {
3269 mips_emit_move (dest, mips_legitimize_tls_address (src));
3270 return;
3271 }
3272
3273 /* If we have (const (plus symbol offset)), and that expression cannot
3274 be forced into memory, load the symbol first and add in the offset.
3275 In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3276 forced into memory, as it usually produces better code. */
3277 split_const (src, &base, &offset);
3278 if (offset != const0_rtx
3279 && (targetm.cannot_force_const_mem (mode, src)
3280 || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3281 {
3282 base = mips_force_temporary (dest, base);
3283 mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3284 return;
3285 }
3286
3287 src = force_const_mem (mode, src);
3288
3289 /* When using explicit relocs, constant pool references are sometimes
3290 not legitimate addresses. */
3291 mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3292 mips_emit_move (dest, src);
3293 }
3294
3295 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3296 sequence that is valid. */
3297
3298 bool
3299 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3300 {
3301 if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3302 {
3303 mips_emit_move (dest, force_reg (mode, src));
3304 return true;
3305 }
3306
3307 /* We need to deal with constants that would be legitimate
3308 immediate_operands but aren't legitimate move_operands. */
3309 if (CONSTANT_P (src) && !move_operand (src, mode))
3310 {
3311 mips_legitimize_const_move (mode, dest, src);
3312 set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3313 return true;
3314 }
3315 return false;
3316 }
3317 \f
3318 /* Return true if value X in context CONTEXT is a small-data address
3319 that can be rewritten as a LO_SUM. */
3320
3321 static bool
3322 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3323 {
3324 enum mips_symbol_type symbol_type;
3325
3326 return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3327 && !mips_split_p[SYMBOL_GP_RELATIVE]
3328 && mips_symbolic_constant_p (x, context, &symbol_type)
3329 && symbol_type == SYMBOL_GP_RELATIVE);
3330 }
3331
3332 /* A for_each_rtx callback for mips_small_data_pattern_p. DATA is the
3333 containing MEM, or null if none. */
3334
3335 static int
3336 mips_small_data_pattern_1 (rtx *loc, void *data)
3337 {
3338 enum mips_symbol_context context;
3339
3340 /* Ignore things like "g" constraints in asms. We make no particular
3341 guarantee about which symbolic constants are acceptable as asm operands
3342 versus which must be forced into a GPR. */
3343 if (GET_CODE (*loc) == LO_SUM || GET_CODE (*loc) == ASM_OPERANDS)
3344 return -1;
3345
3346 if (MEM_P (*loc))
3347 {
3348 if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3349 return 1;
3350 return -1;
3351 }
3352
3353 context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3354 return mips_rewrite_small_data_p (*loc, context);
3355 }
3356
3357 /* Return true if OP refers to small data symbols directly, not through
3358 a LO_SUM. */
3359
3360 bool
3361 mips_small_data_pattern_p (rtx op)
3362 {
3363 return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3364 }
3365
3366 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3367 DATA is the containing MEM, or null if none. */
3368
3369 static int
3370 mips_rewrite_small_data_1 (rtx *loc, void *data)
3371 {
3372 enum mips_symbol_context context;
3373
3374 if (MEM_P (*loc))
3375 {
3376 for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3377 return -1;
3378 }
3379
3380 context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3381 if (mips_rewrite_small_data_p (*loc, context))
3382 *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3383
3384 if (GET_CODE (*loc) == LO_SUM)
3385 return -1;
3386
3387 return 0;
3388 }
3389
3390 /* Rewrite instruction pattern PATTERN so that it refers to small data
3391 using explicit relocations. */
3392
3393 rtx
3394 mips_rewrite_small_data (rtx pattern)
3395 {
3396 pattern = copy_insn (pattern);
3397 for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3398 return pattern;
3399 }
3400 \f
3401 /* The cost of loading values from the constant pool. It should be
3402 larger than the cost of any constant we want to synthesize inline. */
3403 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3404
3405 /* Return the cost of X when used as an operand to the MIPS16 instruction
3406 that implements CODE. Return -1 if there is no such instruction, or if
3407 X is not a valid immediate operand for it. */
3408
3409 static int
3410 mips16_constant_cost (int code, HOST_WIDE_INT x)
3411 {
3412 switch (code)
3413 {
3414 case ASHIFT:
3415 case ASHIFTRT:
3416 case LSHIFTRT:
3417 /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3418 other shifts are extended. The shift patterns truncate the shift
3419 count to the right size, so there are no out-of-range values. */
3420 if (IN_RANGE (x, 1, 8))
3421 return 0;
3422 return COSTS_N_INSNS (1);
3423
3424 case PLUS:
3425 if (IN_RANGE (x, -128, 127))
3426 return 0;
3427 if (SMALL_OPERAND (x))
3428 return COSTS_N_INSNS (1);
3429 return -1;
3430
3431 case LEU:
3432 /* Like LE, but reject the always-true case. */
3433 if (x == -1)
3434 return -1;
3435 case LE:
3436 /* We add 1 to the immediate and use SLT. */
3437 x += 1;
3438 case XOR:
3439 /* We can use CMPI for an xor with an unsigned 16-bit X. */
3440 case LT:
3441 case LTU:
3442 if (IN_RANGE (x, 0, 255))
3443 return 0;
3444 if (SMALL_OPERAND_UNSIGNED (x))
3445 return COSTS_N_INSNS (1);
3446 return -1;
3447
3448 case EQ:
3449 case NE:
3450 /* Equality comparisons with 0 are cheap. */
3451 if (x == 0)
3452 return 0;
3453 return -1;
3454
3455 default:
3456 return -1;
3457 }
3458 }
3459
3460 /* Return true if there is a non-MIPS16 instruction that implements CODE
3461 and if that instruction accepts X as an immediate operand. */
3462
3463 static int
3464 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3465 {
3466 switch (code)
3467 {
3468 case ASHIFT:
3469 case ASHIFTRT:
3470 case LSHIFTRT:
3471 /* All shift counts are truncated to a valid constant. */
3472 return true;
3473
3474 case ROTATE:
3475 case ROTATERT:
3476 /* Likewise rotates, if the target supports rotates at all. */
3477 return ISA_HAS_ROR;
3478
3479 case AND:
3480 case IOR:
3481 case XOR:
3482 /* These instructions take 16-bit unsigned immediates. */
3483 return SMALL_OPERAND_UNSIGNED (x);
3484
3485 case PLUS:
3486 case LT:
3487 case LTU:
3488 /* These instructions take 16-bit signed immediates. */
3489 return SMALL_OPERAND (x);
3490
3491 case EQ:
3492 case NE:
3493 case GT:
3494 case GTU:
3495 /* The "immediate" forms of these instructions are really
3496 implemented as comparisons with register 0. */
3497 return x == 0;
3498
3499 case GE:
3500 case GEU:
3501 /* Likewise, meaning that the only valid immediate operand is 1. */
3502 return x == 1;
3503
3504 case LE:
3505 /* We add 1 to the immediate and use SLT. */
3506 return SMALL_OPERAND (x + 1);
3507
3508 case LEU:
3509 /* Likewise SLTU, but reject the always-true case. */
3510 return SMALL_OPERAND (x + 1) && x + 1 != 0;
3511
3512 case SIGN_EXTRACT:
3513 case ZERO_EXTRACT:
3514 /* The bit position and size are immediate operands. */
3515 return ISA_HAS_EXT_INS;
3516
3517 default:
3518 /* By default assume that $0 can be used for 0. */
3519 return x == 0;
3520 }
3521 }
3522
3523 /* Return the cost of binary operation X, given that the instruction
3524 sequence for a word-sized or smaller operation has cost SINGLE_COST
3525 and that the sequence of a double-word operation has cost DOUBLE_COST.
3526 If SPEED is true, optimize for speed otherwise optimize for size. */
3527
3528 static int
3529 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3530 {
3531 int cost;
3532
3533 if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3534 cost = double_cost;
3535 else
3536 cost = single_cost;
3537 return (cost
3538 + set_src_cost (XEXP (x, 0), speed)
3539 + rtx_cost (XEXP (x, 1), GET_CODE (x), 1, speed));
3540 }
3541
3542 /* Return the cost of floating-point multiplications of mode MODE. */
3543
3544 static int
3545 mips_fp_mult_cost (enum machine_mode mode)
3546 {
3547 return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3548 }
3549
3550 /* Return the cost of floating-point divisions of mode MODE. */
3551
3552 static int
3553 mips_fp_div_cost (enum machine_mode mode)
3554 {
3555 return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3556 }
3557
3558 /* Return the cost of sign-extending OP to mode MODE, not including the
3559 cost of OP itself. */
3560
3561 static int
3562 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3563 {
3564 if (MEM_P (op))
3565 /* Extended loads are as cheap as unextended ones. */
3566 return 0;
3567
3568 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3569 /* A sign extension from SImode to DImode in 64-bit mode is free. */
3570 return 0;
3571
3572 if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3573 /* We can use SEB or SEH. */
3574 return COSTS_N_INSNS (1);
3575
3576 /* We need to use a shift left and a shift right. */
3577 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3578 }
3579
3580 /* Return the cost of zero-extending OP to mode MODE, not including the
3581 cost of OP itself. */
3582
3583 static int
3584 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3585 {
3586 if (MEM_P (op))
3587 /* Extended loads are as cheap as unextended ones. */
3588 return 0;
3589
3590 if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3591 /* We need a shift left by 32 bits and a shift right by 32 bits. */
3592 return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3593
3594 if (GENERATE_MIPS16E)
3595 /* We can use ZEB or ZEH. */
3596 return COSTS_N_INSNS (1);
3597
3598 if (TARGET_MIPS16)
3599 /* We need to load 0xff or 0xffff into a register and use AND. */
3600 return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3601
3602 /* We can use ANDI. */
3603 return COSTS_N_INSNS (1);
3604 }
3605
3606 /* Return the cost of moving between two registers of mode MODE,
3607 assuming that the move will be in pieces of at most UNITS bytes. */
3608
3609 static int
3610 mips_set_reg_reg_piece_cost (enum machine_mode mode, unsigned int units)
3611 {
3612 return COSTS_N_INSNS ((GET_MODE_SIZE (mode) + units - 1) / units);
3613 }
3614
3615 /* Return the cost of moving between two registers of mode MODE. */
3616
3617 static int
3618 mips_set_reg_reg_cost (enum machine_mode mode)
3619 {
3620 switch (GET_MODE_CLASS (mode))
3621 {
3622 case MODE_CC:
3623 return mips_set_reg_reg_piece_cost (mode, GET_MODE_SIZE (CCmode));
3624
3625 case MODE_FLOAT:
3626 case MODE_COMPLEX_FLOAT:
3627 case MODE_VECTOR_FLOAT:
3628 if (TARGET_HARD_FLOAT)
3629 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_HWFPVALUE);
3630 /* Fall through */
3631
3632 default:
3633 return mips_set_reg_reg_piece_cost (mode, UNITS_PER_WORD);
3634 }
3635 }
3636
3637 /* Implement TARGET_RTX_COSTS. */
3638
3639 static bool
3640 mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
3641 int *total, bool speed)
3642 {
3643 enum machine_mode mode = GET_MODE (x);
3644 bool float_mode_p = FLOAT_MODE_P (mode);
3645 int cost;
3646 rtx addr;
3647
3648 /* The cost of a COMPARE is hard to define for MIPS. COMPAREs don't
3649 appear in the instruction stream, and the cost of a comparison is
3650 really the cost of the branch or scc condition. At the time of
3651 writing, GCC only uses an explicit outer COMPARE code when optabs
3652 is testing whether a constant is expensive enough to force into a
3653 register. We want optabs to pass such constants through the MIPS
3654 expanders instead, so make all constants very cheap here. */
3655 if (outer_code == COMPARE)
3656 {
3657 gcc_assert (CONSTANT_P (x));
3658 *total = 0;
3659 return true;
3660 }
3661
3662 switch (code)
3663 {
3664 case CONST_INT:
3665 /* Treat *clear_upper32-style ANDs as having zero cost in the
3666 second operand. The cost is entirely in the first operand.
3667
3668 ??? This is needed because we would otherwise try to CSE
3669 the constant operand. Although that's the right thing for
3670 instructions that continue to be a register operation throughout
3671 compilation, it is disastrous for instructions that could
3672 later be converted into a memory operation. */
3673 if (TARGET_64BIT
3674 && outer_code == AND
3675 && UINTVAL (x) == 0xffffffff)
3676 {
3677 *total = 0;
3678 return true;
3679 }
3680
3681 if (TARGET_MIPS16)
3682 {
3683 cost = mips16_constant_cost (outer_code, INTVAL (x));
3684 if (cost >= 0)
3685 {
3686 *total = cost;
3687 return true;
3688 }
3689 }
3690 else
3691 {
3692 /* When not optimizing for size, we care more about the cost
3693 of hot code, and hot code is often in a loop. If a constant
3694 operand needs to be forced into a register, we will often be
3695 able to hoist the constant load out of the loop, so the load
3696 should not contribute to the cost. */
3697 if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3698 {
3699 *total = 0;
3700 return true;
3701 }
3702 }
3703 /* Fall through. */
3704
3705 case CONST:
3706 case SYMBOL_REF:
3707 case LABEL_REF:
3708 case CONST_DOUBLE:
3709 if (force_to_mem_operand (x, VOIDmode))
3710 {
3711 *total = COSTS_N_INSNS (1);
3712 return true;
3713 }
3714 cost = mips_const_insns (x);
3715 if (cost > 0)
3716 {
3717 /* If the constant is likely to be stored in a GPR, SETs of
3718 single-insn constants are as cheap as register sets; we
3719 never want to CSE them.
3720
3721 Don't reduce the cost of storing a floating-point zero in
3722 FPRs. If we have a zero in an FPR for other reasons, we
3723 can get better cfg-cleanup and delayed-branch results by
3724 using it consistently, rather than using $0 sometimes and
3725 an FPR at other times. Also, moves between floating-point
3726 registers are sometimes cheaper than (D)MTC1 $0. */
3727 if (cost == 1
3728 && outer_code == SET
3729 && !(float_mode_p && TARGET_HARD_FLOAT))
3730 cost = 0;
3731 /* When non-MIPS16 code loads a constant N>1 times, we rarely
3732 want to CSE the constant itself. It is usually better to
3733 have N copies of the last operation in the sequence and one
3734 shared copy of the other operations. (Note that this is
3735 not true for MIPS16 code, where the final operation in the
3736 sequence is often an extended instruction.)
3737
3738 Also, if we have a CONST_INT, we don't know whether it is
3739 for a word or doubleword operation, so we cannot rely on
3740 the result of mips_build_integer. */
3741 else if (!TARGET_MIPS16
3742 && (outer_code == SET || mode == VOIDmode))
3743 cost = 1;
3744 *total = COSTS_N_INSNS (cost);
3745 return true;
3746 }
3747 /* The value will need to be fetched from the constant pool. */
3748 *total = CONSTANT_POOL_COST;
3749 return true;
3750
3751 case MEM:
3752 /* If the address is legitimate, return the number of
3753 instructions it needs. */
3754 addr = XEXP (x, 0);
3755 cost = mips_address_insns (addr, mode, true);
3756 if (cost > 0)
3757 {
3758 *total = COSTS_N_INSNS (cost + 1);
3759 return true;
3760 }
3761 /* Check for a scaled indexed address. */
3762 if (mips_lwxs_address_p (addr)
3763 || mips_lx_address_p (addr, mode))
3764 {
3765 *total = COSTS_N_INSNS (2);
3766 return true;
3767 }
3768 /* Otherwise use the default handling. */
3769 return false;
3770
3771 case FFS:
3772 *total = COSTS_N_INSNS (6);
3773 return false;
3774
3775 case NOT:
3776 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3777 return false;
3778
3779 case AND:
3780 /* Check for a *clear_upper32 pattern and treat it like a zero
3781 extension. See the pattern's comment for details. */
3782 if (TARGET_64BIT
3783 && mode == DImode
3784 && CONST_INT_P (XEXP (x, 1))
3785 && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3786 {
3787 *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3788 + set_src_cost (XEXP (x, 0), speed));
3789 return true;
3790 }
3791 if (ISA_HAS_CINS && CONST_INT_P (XEXP (x, 1)))
3792 {
3793 rtx op = XEXP (x, 0);
3794 if (GET_CODE (op) == ASHIFT
3795 && CONST_INT_P (XEXP (op, 1))
3796 && mask_low_and_shift_p (mode, XEXP (x, 1), XEXP (op, 1), 32))
3797 {
3798 *total = COSTS_N_INSNS (1) + set_src_cost (XEXP (op, 0), speed);
3799 return true;
3800 }
3801 }
3802 /* (AND (NOT op0) (NOT op1) is a nor operation that can be done in
3803 a single instruction. */
3804 if (!TARGET_MIPS16
3805 && GET_CODE (XEXP (x, 0)) == NOT
3806 && GET_CODE (XEXP (x, 1)) == NOT)
3807 {
3808 cost = GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1;
3809 *total = (COSTS_N_INSNS (cost)
3810 + set_src_cost (XEXP (XEXP (x, 0), 0), speed)
3811 + set_src_cost (XEXP (XEXP (x, 1), 0), speed));
3812 return true;
3813 }
3814
3815 /* Fall through. */
3816
3817 case IOR:
3818 case XOR:
3819 /* Double-word operations use two single-word operations. */
3820 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3821 speed);
3822 return true;
3823
3824 case ASHIFT:
3825 case ASHIFTRT:
3826 case LSHIFTRT:
3827 case ROTATE:
3828 case ROTATERT:
3829 if (CONSTANT_P (XEXP (x, 1)))
3830 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3831 speed);
3832 else
3833 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3834 speed);
3835 return true;
3836
3837 case ABS:
3838 if (float_mode_p)
3839 *total = mips_cost->fp_add;
3840 else
3841 *total = COSTS_N_INSNS (4);
3842 return false;
3843
3844 case LO_SUM:
3845 /* Low-part immediates need an extended MIPS16 instruction. */
3846 *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3847 + set_src_cost (XEXP (x, 0), speed));
3848 return true;
3849
3850 case LT:
3851 case LTU:
3852 case LE:
3853 case LEU:
3854 case GT:
3855 case GTU:
3856 case GE:
3857 case GEU:
3858 case EQ:
3859 case NE:
3860 case UNORDERED:
3861 case LTGT:
3862 /* Branch comparisons have VOIDmode, so use the first operand's
3863 mode instead. */
3864 mode = GET_MODE (XEXP (x, 0));
3865 if (FLOAT_MODE_P (mode))
3866 {
3867 *total = mips_cost->fp_add;
3868 return false;
3869 }
3870 *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3871 speed);
3872 return true;
3873
3874 case MINUS:
3875 if (float_mode_p
3876 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
3877 && TARGET_FUSED_MADD
3878 && !HONOR_NANS (mode)
3879 && !HONOR_SIGNED_ZEROS (mode))
3880 {
3881 /* See if we can use NMADD or NMSUB. See mips.md for the
3882 associated patterns. */
3883 rtx op0 = XEXP (x, 0);
3884 rtx op1 = XEXP (x, 1);
3885 if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3886 {
3887 *total = (mips_fp_mult_cost (mode)
3888 + set_src_cost (XEXP (XEXP (op0, 0), 0), speed)
3889 + set_src_cost (XEXP (op0, 1), speed)
3890 + set_src_cost (op1, speed));
3891 return true;
3892 }
3893 if (GET_CODE (op1) == MULT)
3894 {
3895 *total = (mips_fp_mult_cost (mode)
3896 + set_src_cost (op0, speed)
3897 + set_src_cost (XEXP (op1, 0), speed)
3898 + set_src_cost (XEXP (op1, 1), speed));
3899 return true;
3900 }
3901 }
3902 /* Fall through. */
3903
3904 case PLUS:
3905 if (float_mode_p)
3906 {
3907 /* If this is part of a MADD or MSUB, treat the PLUS as
3908 being free. */
3909 if ((ISA_HAS_FP_MADD4_MSUB4 || ISA_HAS_FP_MADD3_MSUB3)
3910 && TARGET_FUSED_MADD
3911 && GET_CODE (XEXP (x, 0)) == MULT)
3912 *total = 0;
3913 else
3914 *total = mips_cost->fp_add;
3915 return false;
3916 }
3917
3918 /* Double-word operations require three single-word operations and
3919 an SLTU. The MIPS16 version then needs to move the result of
3920 the SLTU from $24 to a MIPS16 register. */
3921 *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3922 COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
3923 speed);
3924 return true;
3925
3926 case NEG:
3927 if (float_mode_p
3928 && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
3929 && TARGET_FUSED_MADD
3930 && !HONOR_NANS (mode)
3931 && HONOR_SIGNED_ZEROS (mode))
3932 {
3933 /* See if we can use NMADD or NMSUB. See mips.md for the
3934 associated patterns. */
3935 rtx op = XEXP (x, 0);
3936 if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3937 && GET_CODE (XEXP (op, 0)) == MULT)
3938 {
3939 *total = (mips_fp_mult_cost (mode)
3940 + set_src_cost (XEXP (XEXP (op, 0), 0), speed)
3941 + set_src_cost (XEXP (XEXP (op, 0), 1), speed)
3942 + set_src_cost (XEXP (op, 1), speed));
3943 return true;
3944 }
3945 }
3946
3947 if (float_mode_p)
3948 *total = mips_cost->fp_add;
3949 else
3950 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3951 return false;
3952
3953 case MULT:
3954 if (float_mode_p)
3955 *total = mips_fp_mult_cost (mode);
3956 else if (mode == DImode && !TARGET_64BIT)
3957 /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3958 where the mulsidi3 always includes an MFHI and an MFLO. */
3959 *total = (speed
3960 ? mips_cost->int_mult_si * 3 + 6
3961 : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
3962 else if (!speed)
3963 *total = COSTS_N_INSNS (ISA_HAS_MUL3 ? 1 : 2) + 1;
3964 else if (mode == DImode)
3965 *total = mips_cost->int_mult_di;
3966 else
3967 *total = mips_cost->int_mult_si;
3968 return false;
3969
3970 case DIV:
3971 /* Check for a reciprocal. */
3972 if (float_mode_p
3973 && ISA_HAS_FP_RECIP_RSQRT (mode)
3974 && flag_unsafe_math_optimizations
3975 && XEXP (x, 0) == CONST1_RTX (mode))
3976 {
3977 if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3978 /* An rsqrt<mode>a or rsqrt<mode>b pattern. Count the
3979 division as being free. */
3980 *total = set_src_cost (XEXP (x, 1), speed);
3981 else
3982 *total = (mips_fp_div_cost (mode)
3983 + set_src_cost (XEXP (x, 1), speed));
3984 return true;
3985 }
3986 /* Fall through. */
3987
3988 case SQRT:
3989 case MOD:
3990 if (float_mode_p)
3991 {
3992 *total = mips_fp_div_cost (mode);
3993 return false;
3994 }
3995 /* Fall through. */
3996
3997 case UDIV:
3998 case UMOD:
3999 if (!speed)
4000 {
4001 /* It is our responsibility to make division by a power of 2
4002 as cheap as 2 register additions if we want the division
4003 expanders to be used for such operations; see the setting
4004 of sdiv_pow2_cheap in optabs.c. Using (D)DIV for MIPS16
4005 should always produce shorter code than using
4006 expand_sdiv2_pow2. */
4007 if (TARGET_MIPS16
4008 && CONST_INT_P (XEXP (x, 1))
4009 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
4010 {
4011 *total = COSTS_N_INSNS (2) + set_src_cost (XEXP (x, 0), speed);
4012 return true;
4013 }
4014 *total = COSTS_N_INSNS (mips_idiv_insns ());
4015 }
4016 else if (mode == DImode)
4017 *total = mips_cost->int_div_di;
4018 else
4019 *total = mips_cost->int_div_si;
4020 return false;
4021
4022 case SIGN_EXTEND:
4023 *total = mips_sign_extend_cost (mode, XEXP (x, 0));
4024 return false;
4025
4026 case ZERO_EXTEND:
4027 if (outer_code == SET
4028 && ISA_HAS_BADDU
4029 && (GET_CODE (XEXP (x, 0)) == TRUNCATE
4030 || GET_CODE (XEXP (x, 0)) == SUBREG)
4031 && GET_MODE (XEXP (x, 0)) == QImode
4032 && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
4033 {
4034 *total = set_src_cost (XEXP (XEXP (x, 0), 0), speed);
4035 return true;
4036 }
4037 *total = mips_zero_extend_cost (mode, XEXP (x, 0));
4038 return false;
4039
4040 case FLOAT:
4041 case UNSIGNED_FLOAT:
4042 case FIX:
4043 case FLOAT_EXTEND:
4044 case FLOAT_TRUNCATE:
4045 *total = mips_cost->fp_add;
4046 return false;
4047
4048 case SET:
4049 if (register_operand (SET_DEST (x), VOIDmode)
4050 && reg_or_0_operand (SET_SRC (x), VOIDmode))
4051 {
4052 *total = mips_set_reg_reg_cost (GET_MODE (SET_DEST (x)));
4053 return true;
4054 }
4055 return false;
4056
4057 default:
4058 return false;
4059 }
4060 }
4061
4062 /* Implement TARGET_ADDRESS_COST. */
4063
4064 static int
4065 mips_address_cost (rtx addr, enum machine_mode mode,
4066 addr_space_t as ATTRIBUTE_UNUSED,
4067 bool speed ATTRIBUTE_UNUSED)
4068 {
4069 return mips_address_insns (addr, mode, false);
4070 }
4071 \f
4072 /* Information about a single instruction in a multi-instruction
4073 asm sequence. */
4074 struct mips_multi_member {
4075 /* True if this is a label, false if it is code. */
4076 bool is_label_p;
4077
4078 /* The output_asm_insn format of the instruction. */
4079 const char *format;
4080
4081 /* The operands to the instruction. */
4082 rtx operands[MAX_RECOG_OPERANDS];
4083 };
4084 typedef struct mips_multi_member mips_multi_member;
4085
4086 /* The instructions that make up the current multi-insn sequence. */
4087 static vec<mips_multi_member> mips_multi_members;
4088
4089 /* How many instructions (as opposed to labels) are in the current
4090 multi-insn sequence. */
4091 static unsigned int mips_multi_num_insns;
4092
4093 /* Start a new multi-insn sequence. */
4094
4095 static void
4096 mips_multi_start (void)
4097 {
4098 mips_multi_members.truncate (0);
4099 mips_multi_num_insns = 0;
4100 }
4101
4102 /* Add a new, uninitialized member to the current multi-insn sequence. */
4103
4104 static struct mips_multi_member *
4105 mips_multi_add (void)
4106 {
4107 mips_multi_member empty;
4108 return mips_multi_members.safe_push (empty);
4109 }
4110
4111 /* Add a normal insn with the given asm format to the current multi-insn
4112 sequence. The other arguments are a null-terminated list of operands. */
4113
4114 static void
4115 mips_multi_add_insn (const char *format, ...)
4116 {
4117 struct mips_multi_member *member;
4118 va_list ap;
4119 unsigned int i;
4120 rtx op;
4121
4122 member = mips_multi_add ();
4123 member->is_label_p = false;
4124 member->format = format;
4125 va_start (ap, format);
4126 i = 0;
4127 while ((op = va_arg (ap, rtx)))
4128 member->operands[i++] = op;
4129 va_end (ap);
4130 mips_multi_num_insns++;
4131 }
4132
4133 /* Add the given label definition to the current multi-insn sequence.
4134 The definition should include the colon. */
4135
4136 static void
4137 mips_multi_add_label (const char *label)
4138 {
4139 struct mips_multi_member *member;
4140
4141 member = mips_multi_add ();
4142 member->is_label_p = true;
4143 member->format = label;
4144 }
4145
4146 /* Return the index of the last member of the current multi-insn sequence. */
4147
4148 static unsigned int
4149 mips_multi_last_index (void)
4150 {
4151 return mips_multi_members.length () - 1;
4152 }
4153
4154 /* Add a copy of an existing instruction to the current multi-insn
4155 sequence. I is the index of the instruction that should be copied. */
4156
4157 static void
4158 mips_multi_copy_insn (unsigned int i)
4159 {
4160 struct mips_multi_member *member;
4161
4162 member = mips_multi_add ();
4163 memcpy (member, &mips_multi_members[i], sizeof (*member));
4164 gcc_assert (!member->is_label_p);
4165 }
4166
4167 /* Change the operand of an existing instruction in the current
4168 multi-insn sequence. I is the index of the instruction,
4169 OP is the index of the operand, and X is the new value. */
4170
4171 static void
4172 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
4173 {
4174 mips_multi_members[i].operands[op] = x;
4175 }
4176
4177 /* Write out the asm code for the current multi-insn sequence. */
4178
4179 static void
4180 mips_multi_write (void)
4181 {
4182 struct mips_multi_member *member;
4183 unsigned int i;
4184
4185 FOR_EACH_VEC_ELT (mips_multi_members, i, member)
4186 if (member->is_label_p)
4187 fprintf (asm_out_file, "%s\n", member->format);
4188 else
4189 output_asm_insn (member->format, member->operands);
4190 }
4191 \f
4192 /* Return one word of double-word value OP, taking into account the fixed
4193 endianness of certain registers. HIGH_P is true to select the high part,
4194 false to select the low part. */
4195
4196 rtx
4197 mips_subword (rtx op, bool high_p)
4198 {
4199 unsigned int byte, offset;
4200 enum machine_mode mode;
4201
4202 mode = GET_MODE (op);
4203 if (mode == VOIDmode)
4204 mode = TARGET_64BIT ? TImode : DImode;
4205
4206 if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4207 byte = UNITS_PER_WORD;
4208 else
4209 byte = 0;
4210
4211 if (FP_REG_RTX_P (op))
4212 {
4213 /* Paired FPRs are always ordered little-endian. */
4214 offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4215 return gen_rtx_REG (word_mode, REGNO (op) + offset);
4216 }
4217
4218 if (MEM_P (op))
4219 return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4220
4221 return simplify_gen_subreg (word_mode, op, mode, byte);
4222 }
4223
4224 /* Return true if SRC should be moved into DEST using "MULT $0, $0".
4225 SPLIT_TYPE is the condition under which moves should be split. */
4226
4227 static bool
4228 mips_mult_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4229 {
4230 return ((split_type != SPLIT_FOR_SPEED
4231 || mips_tuning_info.fast_mult_zero_zero_p)
4232 && src == const0_rtx
4233 && REG_P (dest)
4234 && GET_MODE_SIZE (GET_MODE (dest)) == 2 * UNITS_PER_WORD
4235 && (ISA_HAS_DSP_MULT
4236 ? ACC_REG_P (REGNO (dest))
4237 : MD_REG_P (REGNO (dest))));
4238 }
4239
4240 /* Return true if a move from SRC to DEST should be split into two.
4241 SPLIT_TYPE describes the split condition. */
4242
4243 bool
4244 mips_split_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4245 {
4246 /* Check whether the move can be done using some variant of MULT $0,$0. */
4247 if (mips_mult_move_p (dest, src, split_type))
4248 return false;
4249
4250 /* FPR-to-FPR moves can be done in a single instruction, if they're
4251 allowed at all. */
4252 unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
4253 if (size == 8 && FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4254 return false;
4255
4256 /* Check for floating-point loads and stores. */
4257 if (size == 8 && ISA_HAS_LDC1_SDC1)
4258 {
4259 if (FP_REG_RTX_P (dest) && MEM_P (src))
4260 return false;
4261 if (FP_REG_RTX_P (src) && MEM_P (dest))
4262 return false;
4263 }
4264
4265 /* Otherwise split all multiword moves. */
4266 return size > UNITS_PER_WORD;
4267 }
4268
4269 /* Split a move from SRC to DEST, given that mips_split_move_p holds.
4270 SPLIT_TYPE describes the split condition. */
4271
4272 void
4273 mips_split_move (rtx dest, rtx src, enum mips_split_type split_type)
4274 {
4275 rtx low_dest;
4276
4277 gcc_checking_assert (mips_split_move_p (dest, src, split_type));
4278 if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4279 {
4280 if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4281 emit_insn (gen_move_doubleword_fprdi (dest, src));
4282 else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4283 emit_insn (gen_move_doubleword_fprdf (dest, src));
4284 else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4285 emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4286 else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4287 emit_insn (gen_move_doubleword_fprv2si (dest, src));
4288 else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4289 emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4290 else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4291 emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4292 else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4293 emit_insn (gen_move_doubleword_fprtf (dest, src));
4294 else
4295 gcc_unreachable ();
4296 }
4297 else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4298 {
4299 low_dest = mips_subword (dest, false);
4300 mips_emit_move (low_dest, mips_subword (src, false));
4301 if (TARGET_64BIT)
4302 emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4303 else
4304 emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4305 }
4306 else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4307 {
4308 mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4309 if (TARGET_64BIT)
4310 emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4311 else
4312 emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4313 }
4314 else
4315 {
4316 /* The operation can be split into two normal moves. Decide in
4317 which order to do them. */
4318 low_dest = mips_subword (dest, false);
4319 if (REG_P (low_dest)
4320 && reg_overlap_mentioned_p (low_dest, src))
4321 {
4322 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4323 mips_emit_move (low_dest, mips_subword (src, false));
4324 }
4325 else
4326 {
4327 mips_emit_move (low_dest, mips_subword (src, false));
4328 mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4329 }
4330 }
4331 }
4332
4333 /* Return the split type for instruction INSN. */
4334
4335 static enum mips_split_type
4336 mips_insn_split_type (rtx insn)
4337 {
4338 basic_block bb = BLOCK_FOR_INSN (insn);
4339 if (bb)
4340 {
4341 if (optimize_bb_for_speed_p (bb))
4342 return SPLIT_FOR_SPEED;
4343 else
4344 return SPLIT_FOR_SIZE;
4345 }
4346 /* Once CFG information has been removed, we should trust the optimization
4347 decisions made by previous passes and only split where necessary. */
4348 return SPLIT_IF_NECESSARY;
4349 }
4350
4351 /* Return true if a move from SRC to DEST in INSN should be split. */
4352
4353 bool
4354 mips_split_move_insn_p (rtx dest, rtx src, rtx insn)
4355 {
4356 return mips_split_move_p (dest, src, mips_insn_split_type (insn));
4357 }
4358
4359 /* Split a move from SRC to DEST in INSN, given that mips_split_move_insn_p
4360 holds. */
4361
4362 void
4363 mips_split_move_insn (rtx dest, rtx src, rtx insn)
4364 {
4365 mips_split_move (dest, src, mips_insn_split_type (insn));
4366 }
4367 \f
4368 /* Return the appropriate instructions to move SRC into DEST. Assume
4369 that SRC is operand 1 and DEST is operand 0. */
4370
4371 const char *
4372 mips_output_move (rtx dest, rtx src)
4373 {
4374 enum rtx_code dest_code, src_code;
4375 enum machine_mode mode;
4376 enum mips_symbol_type symbol_type;
4377 bool dbl_p;
4378
4379 dest_code = GET_CODE (dest);
4380 src_code = GET_CODE (src);
4381 mode = GET_MODE (dest);
4382 dbl_p = (GET_MODE_SIZE (mode) == 8);
4383
4384 if (mips_split_move_p (dest, src, SPLIT_IF_NECESSARY))
4385 return "#";
4386
4387 if ((src_code == REG && GP_REG_P (REGNO (src)))
4388 || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4389 {
4390 if (dest_code == REG)
4391 {
4392 if (GP_REG_P (REGNO (dest)))
4393 return "move\t%0,%z1";
4394
4395 if (mips_mult_move_p (dest, src, SPLIT_IF_NECESSARY))
4396 {
4397 if (ISA_HAS_DSP_MULT)
4398 return "mult\t%q0,%.,%.";
4399 else
4400 return "mult\t%.,%.";
4401 }
4402
4403 /* Moves to HI are handled by special .md insns. */
4404 if (REGNO (dest) == LO_REGNUM)
4405 return "mtlo\t%z1";
4406
4407 if (DSP_ACC_REG_P (REGNO (dest)))
4408 {
4409 static char retval[] = "mt__\t%z1,%q0";
4410
4411 retval[2] = reg_names[REGNO (dest)][4];
4412 retval[3] = reg_names[REGNO (dest)][5];
4413 return retval;
4414 }
4415
4416 if (FP_REG_P (REGNO (dest)))
4417 return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4418
4419 if (ALL_COP_REG_P (REGNO (dest)))
4420 {
4421 static char retval[] = "dmtc_\t%z1,%0";
4422
4423 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4424 return dbl_p ? retval : retval + 1;
4425 }
4426 }
4427 if (dest_code == MEM)
4428 switch (GET_MODE_SIZE (mode))
4429 {
4430 case 1: return "sb\t%z1,%0";
4431 case 2: return "sh\t%z1,%0";
4432 case 4: return "sw\t%z1,%0";
4433 case 8: return "sd\t%z1,%0";
4434 }
4435 }
4436 if (dest_code == REG && GP_REG_P (REGNO (dest)))
4437 {
4438 if (src_code == REG)
4439 {
4440 /* Moves from HI are handled by special .md insns. */
4441 if (REGNO (src) == LO_REGNUM)
4442 {
4443 /* When generating VR4120 or VR4130 code, we use MACC and
4444 DMACC instead of MFLO. This avoids both the normal
4445 MIPS III HI/LO hazards and the errata related to
4446 -mfix-vr4130. */
4447 if (ISA_HAS_MACCHI)
4448 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4449 return "mflo\t%0";
4450 }
4451
4452 if (DSP_ACC_REG_P (REGNO (src)))
4453 {
4454 static char retval[] = "mf__\t%0,%q1";
4455
4456 retval[2] = reg_names[REGNO (src)][4];
4457 retval[3] = reg_names[REGNO (src)][5];
4458 return retval;
4459 }
4460
4461 if (FP_REG_P (REGNO (src)))
4462 return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4463
4464 if (ALL_COP_REG_P (REGNO (src)))
4465 {
4466 static char retval[] = "dmfc_\t%0,%1";
4467
4468 retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4469 return dbl_p ? retval : retval + 1;
4470 }
4471 }
4472
4473 if (src_code == MEM)
4474 switch (GET_MODE_SIZE (mode))
4475 {
4476 case 1: return "lbu\t%0,%1";
4477 case 2: return "lhu\t%0,%1";
4478 case 4: return "lw\t%0,%1";
4479 case 8: return "ld\t%0,%1";
4480 }
4481
4482 if (src_code == CONST_INT)
4483 {
4484 /* Don't use the X format for the operand itself, because that
4485 will give out-of-range numbers for 64-bit hosts and 32-bit
4486 targets. */
4487 if (!TARGET_MIPS16)
4488 return "li\t%0,%1\t\t\t# %X1";
4489
4490 if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4491 return "li\t%0,%1";
4492
4493 if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4494 return "#";
4495 }
4496
4497 if (src_code == HIGH)
4498 return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4499
4500 if (CONST_GP_P (src))
4501 return "move\t%0,%1";
4502
4503 if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4504 && mips_lo_relocs[symbol_type] != 0)
4505 {
4506 /* A signed 16-bit constant formed by applying a relocation
4507 operator to a symbolic address. */
4508 gcc_assert (!mips_split_p[symbol_type]);
4509 return "li\t%0,%R1";
4510 }
4511
4512 if (symbolic_operand (src, VOIDmode))
4513 {
4514 gcc_assert (TARGET_MIPS16
4515 ? TARGET_MIPS16_TEXT_LOADS
4516 : !TARGET_EXPLICIT_RELOCS);
4517 return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4518 }
4519 }
4520 if (src_code == REG && FP_REG_P (REGNO (src)))
4521 {
4522 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4523 {
4524 if (GET_MODE (dest) == V2SFmode)
4525 return "mov.ps\t%0,%1";
4526 else
4527 return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4528 }
4529
4530 if (dest_code == MEM)
4531 return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4532 }
4533 if (dest_code == REG && FP_REG_P (REGNO (dest)))
4534 {
4535 if (src_code == MEM)
4536 return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4537 }
4538 if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4539 {
4540 static char retval[] = "l_c_\t%0,%1";
4541
4542 retval[1] = (dbl_p ? 'd' : 'w');
4543 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4544 return retval;
4545 }
4546 if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4547 {
4548 static char retval[] = "s_c_\t%1,%0";
4549
4550 retval[1] = (dbl_p ? 'd' : 'w');
4551 retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4552 return retval;
4553 }
4554 gcc_unreachable ();
4555 }
4556 \f
4557 /* Return true if CMP1 is a suitable second operand for integer ordering
4558 test CODE. See also the *sCC patterns in mips.md. */
4559
4560 static bool
4561 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4562 {
4563 switch (code)
4564 {
4565 case GT:
4566 case GTU:
4567 return reg_or_0_operand (cmp1, VOIDmode);
4568
4569 case GE:
4570 case GEU:
4571 return !TARGET_MIPS16 && cmp1 == const1_rtx;
4572
4573 case LT:
4574 case LTU:
4575 return arith_operand (cmp1, VOIDmode);
4576
4577 case LE:
4578 return sle_operand (cmp1, VOIDmode);
4579
4580 case LEU:
4581 return sleu_operand (cmp1, VOIDmode);
4582
4583 default:
4584 gcc_unreachable ();
4585 }
4586 }
4587
4588 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4589 integer ordering test *CODE, or if an equivalent combination can
4590 be formed by adjusting *CODE and *CMP1. When returning true, update
4591 *CODE and *CMP1 with the chosen code and operand, otherwise leave
4592 them alone. */
4593
4594 static bool
4595 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4596 enum machine_mode mode)
4597 {
4598 HOST_WIDE_INT plus_one;
4599
4600 if (mips_int_order_operand_ok_p (*code, *cmp1))
4601 return true;
4602
4603 if (CONST_INT_P (*cmp1))
4604 switch (*code)
4605 {
4606 case LE:
4607 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4608 if (INTVAL (*cmp1) < plus_one)
4609 {
4610 *code = LT;
4611 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4612 return true;
4613 }
4614 break;
4615
4616 case LEU:
4617 plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4618 if (plus_one != 0)
4619 {
4620 *code = LTU;
4621 *cmp1 = force_reg (mode, GEN_INT (plus_one));
4622 return true;
4623 }
4624 break;
4625
4626 default:
4627 break;
4628 }
4629 return false;
4630 }
4631
4632 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4633 in TARGET. CMP0 and TARGET are register_operands. If INVERT_PTR
4634 is nonnull, it's OK to set TARGET to the inverse of the result and
4635 flip *INVERT_PTR instead. */
4636
4637 static void
4638 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4639 rtx target, rtx cmp0, rtx cmp1)
4640 {
4641 enum machine_mode mode;
4642
4643 /* First see if there is a MIPS instruction that can do this operation.
4644 If not, try doing the same for the inverse operation. If that also
4645 fails, force CMP1 into a register and try again. */
4646 mode = GET_MODE (cmp0);
4647 if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4648 mips_emit_binary (code, target, cmp0, cmp1);
4649 else
4650 {
4651 enum rtx_code inv_code = reverse_condition (code);
4652 if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4653 {
4654 cmp1 = force_reg (mode, cmp1);
4655 mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4656 }
4657 else if (invert_ptr == 0)
4658 {
4659 rtx inv_target;
4660
4661 inv_target = mips_force_binary (GET_MODE (target),
4662 inv_code, cmp0, cmp1);
4663 mips_emit_binary (XOR, target, inv_target, const1_rtx);
4664 }
4665 else
4666 {
4667 *invert_ptr = !*invert_ptr;
4668 mips_emit_binary (inv_code, target, cmp0, cmp1);
4669 }
4670 }
4671 }
4672
4673 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4674 The register will have the same mode as CMP0. */
4675
4676 static rtx
4677 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4678 {
4679 if (cmp1 == const0_rtx)
4680 return cmp0;
4681
4682 if (uns_arith_operand (cmp1, VOIDmode))
4683 return expand_binop (GET_MODE (cmp0), xor_optab,
4684 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4685
4686 return expand_binop (GET_MODE (cmp0), sub_optab,
4687 cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4688 }
4689
4690 /* Convert *CODE into a code that can be used in a floating-point
4691 scc instruction (C.cond.fmt). Return true if the values of
4692 the condition code registers will be inverted, with 0 indicating
4693 that the condition holds. */
4694
4695 static bool
4696 mips_reversed_fp_cond (enum rtx_code *code)
4697 {
4698 switch (*code)
4699 {
4700 case NE:
4701 case LTGT:
4702 case ORDERED:
4703 *code = reverse_condition_maybe_unordered (*code);
4704 return true;
4705
4706 default:
4707 return false;
4708 }
4709 }
4710
4711 /* Allocate a floating-point condition-code register of mode MODE.
4712
4713 These condition code registers are used for certain kinds
4714 of compound operation, such as compare and branches, vconds,
4715 and built-in functions. At expand time, their use is entirely
4716 controlled by MIPS-specific code and is entirely internal
4717 to these compound operations.
4718
4719 We could (and did in the past) expose condition-code values
4720 as pseudo registers and leave the register allocator to pick
4721 appropriate registers. The problem is that it is not practically
4722 possible for the rtl optimizers to guarantee that no spills will
4723 be needed, even when AVOID_CCMODE_COPIES is defined. We would
4724 therefore need spill and reload sequences to handle the worst case.
4725
4726 Although such sequences do exist, they are very expensive and are
4727 not something we'd want to use. This is especially true of CCV2 and
4728 CCV4, where all the shuffling would greatly outweigh whatever benefit
4729 the vectorization itself provides.
4730
4731 The main benefit of having more than one condition-code register
4732 is to allow the pipelining of operations, especially those involving
4733 comparisons and conditional moves. We don't really expect the
4734 registers to be live for long periods, and certainly never want
4735 them to be live across calls.
4736
4737 Also, there should be no penalty attached to using all the available
4738 registers. They are simply bits in the same underlying FPU control
4739 register.
4740
4741 We therefore expose the hardware registers from the outset and use
4742 a simple round-robin allocation scheme. */
4743
4744 static rtx
4745 mips_allocate_fcc (enum machine_mode mode)
4746 {
4747 unsigned int regno, count;
4748
4749 gcc_assert (TARGET_HARD_FLOAT && ISA_HAS_8CC);
4750
4751 if (mode == CCmode)
4752 count = 1;
4753 else if (mode == CCV2mode)
4754 count = 2;
4755 else if (mode == CCV4mode)
4756 count = 4;
4757 else
4758 gcc_unreachable ();
4759
4760 cfun->machine->next_fcc += -cfun->machine->next_fcc & (count - 1);
4761 if (cfun->machine->next_fcc > ST_REG_LAST - ST_REG_FIRST)
4762 cfun->machine->next_fcc = 0;
4763 regno = ST_REG_FIRST + cfun->machine->next_fcc;
4764 cfun->machine->next_fcc += count;
4765 return gen_rtx_REG (mode, regno);
4766 }
4767
4768 /* Convert a comparison into something that can be used in a branch or
4769 conditional move. On entry, *OP0 and *OP1 are the values being
4770 compared and *CODE is the code used to compare them.
4771
4772 Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4773 If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4774 otherwise any standard branch condition can be used. The standard branch
4775 conditions are:
4776
4777 - EQ or NE between two registers.
4778 - any comparison between a register and zero. */
4779
4780 static void
4781 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4782 {
4783 rtx cmp_op0 = *op0;
4784 rtx cmp_op1 = *op1;
4785
4786 if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4787 {
4788 if (!need_eq_ne_p && *op1 == const0_rtx)
4789 ;
4790 else if (*code == EQ || *code == NE)
4791 {
4792 if (need_eq_ne_p)
4793 {
4794 *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4795 *op1 = const0_rtx;
4796 }
4797 else
4798 *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4799 }
4800 else
4801 {
4802 /* The comparison needs a separate scc instruction. Store the
4803 result of the scc in *OP0 and compare it against zero. */
4804 bool invert = false;
4805 *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4806 mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4807 *code = (invert ? EQ : NE);
4808 *op1 = const0_rtx;
4809 }
4810 }
4811 else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4812 {
4813 *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4814 mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4815 *code = NE;
4816 *op1 = const0_rtx;
4817 }
4818 else
4819 {
4820 enum rtx_code cmp_code;
4821
4822 /* Floating-point tests use a separate C.cond.fmt comparison to
4823 set a condition code register. The branch or conditional move
4824 will then compare that register against zero.
4825
4826 Set CMP_CODE to the code of the comparison instruction and
4827 *CODE to the code that the branch or move should use. */
4828 cmp_code = *code;
4829 *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4830 *op0 = (ISA_HAS_8CC
4831 ? mips_allocate_fcc (CCmode)
4832 : gen_rtx_REG (CCmode, FPSW_REGNUM));
4833 *op1 = const0_rtx;
4834 mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4835 }
4836 }
4837 \f
4838 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4839 and OPERAND[3]. Store the result in OPERANDS[0].
4840
4841 On 64-bit targets, the mode of the comparison and target will always be
4842 SImode, thus possibly narrower than that of the comparison's operands. */
4843
4844 void
4845 mips_expand_scc (rtx operands[])
4846 {
4847 rtx target = operands[0];
4848 enum rtx_code code = GET_CODE (operands[1]);
4849 rtx op0 = operands[2];
4850 rtx op1 = operands[3];
4851
4852 gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4853
4854 if (code == EQ || code == NE)
4855 {
4856 if (ISA_HAS_SEQ_SNE
4857 && reg_imm10_operand (op1, GET_MODE (op1)))
4858 mips_emit_binary (code, target, op0, op1);
4859 else
4860 {
4861 rtx zie = mips_zero_if_equal (op0, op1);
4862 mips_emit_binary (code, target, zie, const0_rtx);
4863 }
4864 }
4865 else
4866 mips_emit_int_order_test (code, 0, target, op0, op1);
4867 }
4868
4869 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4870 CODE and jump to OPERANDS[3] if the condition holds. */
4871
4872 void
4873 mips_expand_conditional_branch (rtx *operands)
4874 {
4875 enum rtx_code code = GET_CODE (operands[0]);
4876 rtx op0 = operands[1];
4877 rtx op1 = operands[2];
4878 rtx condition;
4879
4880 mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4881 condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4882 emit_jump_insn (gen_condjump (condition, operands[3]));
4883 }
4884
4885 /* Implement:
4886
4887 (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4888 (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS)) */
4889
4890 void
4891 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4892 enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4893 {
4894 rtx cmp_result;
4895 bool reversed_p;
4896
4897 reversed_p = mips_reversed_fp_cond (&cond);
4898 cmp_result = mips_allocate_fcc (CCV2mode);
4899 emit_insn (gen_scc_ps (cmp_result,
4900 gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4901 if (reversed_p)
4902 emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4903 cmp_result));
4904 else
4905 emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4906 cmp_result));
4907 }
4908
4909 /* Perform the comparison in OPERANDS[1]. Move OPERANDS[2] into OPERANDS[0]
4910 if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0]. */
4911
4912 void
4913 mips_expand_conditional_move (rtx *operands)
4914 {
4915 rtx cond;
4916 enum rtx_code code = GET_CODE (operands[1]);
4917 rtx op0 = XEXP (operands[1], 0);
4918 rtx op1 = XEXP (operands[1], 1);
4919
4920 mips_emit_compare (&code, &op0, &op1, true);
4921 cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
4922 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4923 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4924 operands[2], operands[3])));
4925 }
4926
4927 /* Perform the comparison in COMPARISON, then trap if the condition holds. */
4928
4929 void
4930 mips_expand_conditional_trap (rtx comparison)
4931 {
4932 rtx op0, op1;
4933 enum machine_mode mode;
4934 enum rtx_code code;
4935
4936 /* MIPS conditional trap instructions don't have GT or LE flavors,
4937 so we must swap the operands and convert to LT and GE respectively. */
4938 code = GET_CODE (comparison);
4939 switch (code)
4940 {
4941 case GT:
4942 case LE:
4943 case GTU:
4944 case LEU:
4945 code = swap_condition (code);
4946 op0 = XEXP (comparison, 1);
4947 op1 = XEXP (comparison, 0);
4948 break;
4949
4950 default:
4951 op0 = XEXP (comparison, 0);
4952 op1 = XEXP (comparison, 1);
4953 break;
4954 }
4955
4956 mode = GET_MODE (XEXP (comparison, 0));
4957 op0 = force_reg (mode, op0);
4958 if (!arith_operand (op1, mode))
4959 op1 = force_reg (mode, op1);
4960
4961 emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4962 gen_rtx_fmt_ee (code, mode, op0, op1),
4963 const0_rtx));
4964 }
4965 \f
4966 /* Initialize *CUM for a call to a function of type FNTYPE. */
4967
4968 void
4969 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4970 {
4971 memset (cum, 0, sizeof (*cum));
4972 cum->prototype = (fntype && prototype_p (fntype));
4973 cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4974 }
4975
4976 /* Fill INFO with information about a single argument. CUM is the
4977 cumulative state for earlier arguments. MODE is the mode of this
4978 argument and TYPE is its type (if known). NAMED is true if this
4979 is a named (fixed) argument rather than a variable one. */
4980
4981 static void
4982 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4983 enum machine_mode mode, const_tree type, bool named)
4984 {
4985 bool doubleword_aligned_p;
4986 unsigned int num_bytes, num_words, max_regs;
4987
4988 /* Work out the size of the argument. */
4989 num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4990 num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4991
4992 /* Decide whether it should go in a floating-point register, assuming
4993 one is free. Later code checks for availability.
4994
4995 The checks against UNITS_PER_FPVALUE handle the soft-float and
4996 single-float cases. */
4997 switch (mips_abi)
4998 {
4999 case ABI_EABI:
5000 /* The EABI conventions have traditionally been defined in terms
5001 of TYPE_MODE, regardless of the actual type. */
5002 info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
5003 || mode == V2SFmode)
5004 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5005 break;
5006
5007 case ABI_32:
5008 case ABI_O64:
5009 /* Only leading floating-point scalars are passed in
5010 floating-point registers. We also handle vector floats the same
5011 say, which is OK because they are not covered by the standard ABI. */
5012 info->fpr_p = (!cum->gp_reg_found
5013 && cum->arg_number < 2
5014 && (type == 0
5015 || SCALAR_FLOAT_TYPE_P (type)
5016 || VECTOR_FLOAT_TYPE_P (type))
5017 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5018 || mode == V2SFmode)
5019 && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5020 break;
5021
5022 case ABI_N32:
5023 case ABI_64:
5024 /* Scalar, complex and vector floating-point types are passed in
5025 floating-point registers, as long as this is a named rather
5026 than a variable argument. */
5027 info->fpr_p = (named
5028 && (type == 0 || FLOAT_TYPE_P (type))
5029 && (GET_MODE_CLASS (mode) == MODE_FLOAT
5030 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5031 || mode == V2SFmode)
5032 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
5033
5034 /* ??? According to the ABI documentation, the real and imaginary
5035 parts of complex floats should be passed in individual registers.
5036 The real and imaginary parts of stack arguments are supposed
5037 to be contiguous and there should be an extra word of padding
5038 at the end.
5039
5040 This has two problems. First, it makes it impossible to use a
5041 single "void *" va_list type, since register and stack arguments
5042 are passed differently. (At the time of writing, MIPSpro cannot
5043 handle complex float varargs correctly.) Second, it's unclear
5044 what should happen when there is only one register free.
5045
5046 For now, we assume that named complex floats should go into FPRs
5047 if there are two FPRs free, otherwise they should be passed in the
5048 same way as a struct containing two floats. */
5049 if (info->fpr_p
5050 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5051 && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
5052 {
5053 if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
5054 info->fpr_p = false;
5055 else
5056 num_words = 2;
5057 }
5058 break;
5059
5060 default:
5061 gcc_unreachable ();
5062 }
5063
5064 /* See whether the argument has doubleword alignment. */
5065 doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
5066 > BITS_PER_WORD);
5067
5068 /* Set REG_OFFSET to the register count we're interested in.
5069 The EABI allocates the floating-point registers separately,
5070 but the other ABIs allocate them like integer registers. */
5071 info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
5072 ? cum->num_fprs
5073 : cum->num_gprs);
5074
5075 /* Advance to an even register if the argument is doubleword-aligned. */
5076 if (doubleword_aligned_p)
5077 info->reg_offset += info->reg_offset & 1;
5078
5079 /* Work out the offset of a stack argument. */
5080 info->stack_offset = cum->stack_words;
5081 if (doubleword_aligned_p)
5082 info->stack_offset += info->stack_offset & 1;
5083
5084 max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
5085
5086 /* Partition the argument between registers and stack. */
5087 info->reg_words = MIN (num_words, max_regs);
5088 info->stack_words = num_words - info->reg_words;
5089 }
5090
5091 /* INFO describes a register argument that has the normal format for the
5092 argument's mode. Return the register it uses, assuming that FPRs are
5093 available if HARD_FLOAT_P. */
5094
5095 static unsigned int
5096 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
5097 {
5098 if (!info->fpr_p || !hard_float_p)
5099 return GP_ARG_FIRST + info->reg_offset;
5100 else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
5101 /* In o32, the second argument is always passed in $f14
5102 for TARGET_DOUBLE_FLOAT, regardless of whether the
5103 first argument was a word or doubleword. */
5104 return FP_ARG_FIRST + 2;
5105 else
5106 return FP_ARG_FIRST + info->reg_offset;
5107 }
5108
5109 /* Implement TARGET_STRICT_ARGUMENT_NAMING. */
5110
5111 static bool
5112 mips_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
5113 {
5114 return !TARGET_OLDABI;
5115 }
5116
5117 /* Implement TARGET_FUNCTION_ARG. */
5118
5119 static rtx
5120 mips_function_arg (cumulative_args_t cum_v, enum machine_mode mode,
5121 const_tree type, bool named)
5122 {
5123 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5124 struct mips_arg_info info;
5125
5126 /* We will be called with a mode of VOIDmode after the last argument
5127 has been seen. Whatever we return will be passed to the call expander.
5128 If we need a MIPS16 fp_code, return a REG with the code stored as
5129 the mode. */
5130 if (mode == VOIDmode)
5131 {
5132 if (TARGET_MIPS16 && cum->fp_code != 0)
5133 return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
5134 else
5135 return NULL;
5136 }
5137
5138 mips_get_arg_info (&info, cum, mode, type, named);
5139
5140 /* Return straight away if the whole argument is passed on the stack. */
5141 if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
5142 return NULL;
5143
5144 /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
5145 contains a double in its entirety, then that 64-bit chunk is passed
5146 in a floating-point register. */
5147 if (TARGET_NEWABI
5148 && TARGET_HARD_FLOAT
5149 && named
5150 && type != 0
5151 && TREE_CODE (type) == RECORD_TYPE
5152 && TYPE_SIZE_UNIT (type)
5153 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
5154 {
5155 tree field;
5156
5157 /* First check to see if there is any such field. */
5158 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5159 if (TREE_CODE (field) == FIELD_DECL
5160 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5161 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
5162 && tree_fits_shwi_p (bit_position (field))
5163 && int_bit_position (field) % BITS_PER_WORD == 0)
5164 break;
5165
5166 if (field != 0)
5167 {
5168 /* Now handle the special case by returning a PARALLEL
5169 indicating where each 64-bit chunk goes. INFO.REG_WORDS
5170 chunks are passed in registers. */
5171 unsigned int i;
5172 HOST_WIDE_INT bitpos;
5173 rtx ret;
5174
5175 /* assign_parms checks the mode of ENTRY_PARM, so we must
5176 use the actual mode here. */
5177 ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
5178
5179 bitpos = 0;
5180 field = TYPE_FIELDS (type);
5181 for (i = 0; i < info.reg_words; i++)
5182 {
5183 rtx reg;
5184
5185 for (; field; field = DECL_CHAIN (field))
5186 if (TREE_CODE (field) == FIELD_DECL
5187 && int_bit_position (field) >= bitpos)
5188 break;
5189
5190 if (field
5191 && int_bit_position (field) == bitpos
5192 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5193 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
5194 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
5195 else
5196 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
5197
5198 XVECEXP (ret, 0, i)
5199 = gen_rtx_EXPR_LIST (VOIDmode, reg,
5200 GEN_INT (bitpos / BITS_PER_UNIT));
5201
5202 bitpos += BITS_PER_WORD;
5203 }
5204 return ret;
5205 }
5206 }
5207
5208 /* Handle the n32/n64 conventions for passing complex floating-point
5209 arguments in FPR pairs. The real part goes in the lower register
5210 and the imaginary part goes in the upper register. */
5211 if (TARGET_NEWABI
5212 && info.fpr_p
5213 && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5214 {
5215 rtx real, imag;
5216 enum machine_mode inner;
5217 unsigned int regno;
5218
5219 inner = GET_MODE_INNER (mode);
5220 regno = FP_ARG_FIRST + info.reg_offset;
5221 if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
5222 {
5223 /* Real part in registers, imaginary part on stack. */
5224 gcc_assert (info.stack_words == info.reg_words);
5225 return gen_rtx_REG (inner, regno);
5226 }
5227 else
5228 {
5229 gcc_assert (info.stack_words == 0);
5230 real = gen_rtx_EXPR_LIST (VOIDmode,
5231 gen_rtx_REG (inner, regno),
5232 const0_rtx);
5233 imag = gen_rtx_EXPR_LIST (VOIDmode,
5234 gen_rtx_REG (inner,
5235 regno + info.reg_words / 2),
5236 GEN_INT (GET_MODE_SIZE (inner)));
5237 return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
5238 }
5239 }
5240
5241 return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
5242 }
5243
5244 /* Implement TARGET_FUNCTION_ARG_ADVANCE. */
5245
5246 static void
5247 mips_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
5248 const_tree type, bool named)
5249 {
5250 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5251 struct mips_arg_info info;
5252
5253 mips_get_arg_info (&info, cum, mode, type, named);
5254
5255 if (!info.fpr_p)
5256 cum->gp_reg_found = true;
5257
5258 /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
5259 an explanation of what this code does. It assumes that we're using
5260 either the o32 or the o64 ABI, both of which pass at most 2 arguments
5261 in FPRs. */
5262 if (cum->arg_number < 2 && info.fpr_p)
5263 cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
5264
5265 /* Advance the register count. This has the effect of setting
5266 num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
5267 argument required us to skip the final GPR and pass the whole
5268 argument on the stack. */
5269 if (mips_abi != ABI_EABI || !info.fpr_p)
5270 cum->num_gprs = info.reg_offset + info.reg_words;
5271 else if (info.reg_words > 0)
5272 cum->num_fprs += MAX_FPRS_PER_FMT;
5273
5274 /* Advance the stack word count. */
5275 if (info.stack_words > 0)
5276 cum->stack_words = info.stack_offset + info.stack_words;
5277
5278 cum->arg_number++;
5279 }
5280
5281 /* Implement TARGET_ARG_PARTIAL_BYTES. */
5282
5283 static int
5284 mips_arg_partial_bytes (cumulative_args_t cum,
5285 enum machine_mode mode, tree type, bool named)
5286 {
5287 struct mips_arg_info info;
5288
5289 mips_get_arg_info (&info, get_cumulative_args (cum), mode, type, named);
5290 return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
5291 }
5292
5293 /* Implement TARGET_FUNCTION_ARG_BOUNDARY. Every parameter gets at
5294 least PARM_BOUNDARY bits of alignment, but will be given anything up
5295 to STACK_BOUNDARY bits if the type requires it. */
5296
5297 static unsigned int
5298 mips_function_arg_boundary (enum machine_mode mode, const_tree type)
5299 {
5300 unsigned int alignment;
5301
5302 alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5303 if (alignment < PARM_BOUNDARY)
5304 alignment = PARM_BOUNDARY;
5305 if (alignment > STACK_BOUNDARY)
5306 alignment = STACK_BOUNDARY;
5307 return alignment;
5308 }
5309
5310 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5311 upward rather than downward. In other words, return true if the
5312 first byte of the stack slot has useful data, false if the last
5313 byte does. */
5314
5315 bool
5316 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
5317 {
5318 /* On little-endian targets, the first byte of every stack argument
5319 is passed in the first byte of the stack slot. */
5320 if (!BYTES_BIG_ENDIAN)
5321 return true;
5322
5323 /* Otherwise, integral types are padded downward: the last byte of a
5324 stack argument is passed in the last byte of the stack slot. */
5325 if (type != 0
5326 ? (INTEGRAL_TYPE_P (type)
5327 || POINTER_TYPE_P (type)
5328 || FIXED_POINT_TYPE_P (type))
5329 : (SCALAR_INT_MODE_P (mode)
5330 || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5331 return false;
5332
5333 /* Big-endian o64 pads floating-point arguments downward. */
5334 if (mips_abi == ABI_O64)
5335 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5336 return false;
5337
5338 /* Other types are padded upward for o32, o64, n32 and n64. */
5339 if (mips_abi != ABI_EABI)
5340 return true;
5341
5342 /* Arguments smaller than a stack slot are padded downward. */
5343 if (mode != BLKmode)
5344 return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5345 else
5346 return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5347 }
5348
5349 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...). Return !BYTES_BIG_ENDIAN
5350 if the least significant byte of the register has useful data. Return
5351 the opposite if the most significant byte does. */
5352
5353 bool
5354 mips_pad_reg_upward (enum machine_mode mode, tree type)
5355 {
5356 /* No shifting is required for floating-point arguments. */
5357 if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5358 return !BYTES_BIG_ENDIAN;
5359
5360 /* Otherwise, apply the same padding to register arguments as we do
5361 to stack arguments. */
5362 return mips_pad_arg_upward (mode, type);
5363 }
5364
5365 /* Return nonzero when an argument must be passed by reference. */
5366
5367 static bool
5368 mips_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
5369 enum machine_mode mode, const_tree type,
5370 bool named ATTRIBUTE_UNUSED)
5371 {
5372 if (mips_abi == ABI_EABI)
5373 {
5374 int size;
5375
5376 /* ??? How should SCmode be handled? */
5377 if (mode == DImode || mode == DFmode
5378 || mode == DQmode || mode == UDQmode
5379 || mode == DAmode || mode == UDAmode)
5380 return 0;
5381
5382 size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5383 return size == -1 || size > UNITS_PER_WORD;
5384 }
5385 else
5386 {
5387 /* If we have a variable-sized parameter, we have no choice. */
5388 return targetm.calls.must_pass_in_stack (mode, type);
5389 }
5390 }
5391
5392 /* Implement TARGET_CALLEE_COPIES. */
5393
5394 static bool
5395 mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED,
5396 enum machine_mode mode ATTRIBUTE_UNUSED,
5397 const_tree type ATTRIBUTE_UNUSED, bool named)
5398 {
5399 return mips_abi == ABI_EABI && named;
5400 }
5401 \f
5402 /* See whether VALTYPE is a record whose fields should be returned in
5403 floating-point registers. If so, return the number of fields and
5404 list them in FIELDS (which should have two elements). Return 0
5405 otherwise.
5406
5407 For n32 & n64, a structure with one or two fields is returned in
5408 floating-point registers as long as every field has a floating-point
5409 type. */
5410
5411 static int
5412 mips_fpr_return_fields (const_tree valtype, tree *fields)
5413 {
5414 tree field;
5415 int i;
5416
5417 if (!TARGET_NEWABI)
5418 return 0;
5419
5420 if (TREE_CODE (valtype) != RECORD_TYPE)
5421 return 0;
5422
5423 i = 0;
5424 for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5425 {
5426 if (TREE_CODE (field) != FIELD_DECL)
5427 continue;
5428
5429 if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5430 return 0;
5431
5432 if (i == 2)
5433 return 0;
5434
5435 fields[i++] = field;
5436 }
5437 return i;
5438 }
5439
5440 /* Implement TARGET_RETURN_IN_MSB. For n32 & n64, we should return
5441 a value in the most significant part of $2/$3 if:
5442
5443 - the target is big-endian;
5444
5445 - the value has a structure or union type (we generalize this to
5446 cover aggregates from other languages too); and
5447
5448 - the structure is not returned in floating-point registers. */
5449
5450 static bool
5451 mips_return_in_msb (const_tree valtype)
5452 {
5453 tree fields[2];
5454
5455 return (TARGET_NEWABI
5456 && TARGET_BIG_ENDIAN
5457 && AGGREGATE_TYPE_P (valtype)
5458 && mips_fpr_return_fields (valtype, fields) == 0);
5459 }
5460
5461 /* Return true if the function return value MODE will get returned in a
5462 floating-point register. */
5463
5464 static bool
5465 mips_return_mode_in_fpr_p (enum machine_mode mode)
5466 {
5467 return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5468 || mode == V2SFmode
5469 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5470 && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5471 }
5472
5473 /* Return the representation of an FPR return register when the
5474 value being returned in FP_RETURN has mode VALUE_MODE and the
5475 return type itself has mode TYPE_MODE. On NewABI targets,
5476 the two modes may be different for structures like:
5477
5478 struct __attribute__((packed)) foo { float f; }
5479
5480 where we return the SFmode value of "f" in FP_RETURN, but where
5481 the structure itself has mode BLKmode. */
5482
5483 static rtx
5484 mips_return_fpr_single (enum machine_mode type_mode,
5485 enum machine_mode value_mode)
5486 {
5487 rtx x;
5488
5489 x = gen_rtx_REG (value_mode, FP_RETURN);
5490 if (type_mode != value_mode)
5491 {
5492 x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5493 x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5494 }
5495 return x;
5496 }
5497
5498 /* Return a composite value in a pair of floating-point registers.
5499 MODE1 and OFFSET1 are the mode and byte offset for the first value,
5500 likewise MODE2 and OFFSET2 for the second. MODE is the mode of the
5501 complete value.
5502
5503 For n32 & n64, $f0 always holds the first value and $f2 the second.
5504 Otherwise the values are packed together as closely as possible. */
5505
5506 static rtx
5507 mips_return_fpr_pair (enum machine_mode mode,
5508 enum machine_mode mode1, HOST_WIDE_INT offset1,
5509 enum machine_mode mode2, HOST_WIDE_INT offset2)
5510 {
5511 int inc;
5512
5513 inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5514 return gen_rtx_PARALLEL
5515 (mode,
5516 gen_rtvec (2,
5517 gen_rtx_EXPR_LIST (VOIDmode,
5518 gen_rtx_REG (mode1, FP_RETURN),
5519 GEN_INT (offset1)),
5520 gen_rtx_EXPR_LIST (VOIDmode,
5521 gen_rtx_REG (mode2, FP_RETURN + inc),
5522 GEN_INT (offset2))));
5523
5524 }
5525
5526 /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5527 For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5528 For libcalls, VALTYPE is null and MODE is the mode of the return value. */
5529
5530 static rtx
5531 mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5532 enum machine_mode mode)
5533 {
5534 if (valtype)
5535 {
5536 tree fields[2];
5537 int unsigned_p;
5538 const_tree func;
5539
5540 if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5541 func = fn_decl_or_type;
5542 else
5543 func = NULL;
5544
5545 mode = TYPE_MODE (valtype);
5546 unsigned_p = TYPE_UNSIGNED (valtype);
5547
5548 /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5549 return values, promote the mode here too. */
5550 mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5551
5552 /* Handle structures whose fields are returned in $f0/$f2. */
5553 switch (mips_fpr_return_fields (valtype, fields))
5554 {
5555 case 1:
5556 return mips_return_fpr_single (mode,
5557 TYPE_MODE (TREE_TYPE (fields[0])));
5558
5559 case 2:
5560 return mips_return_fpr_pair (mode,
5561 TYPE_MODE (TREE_TYPE (fields[0])),
5562 int_byte_position (fields[0]),
5563 TYPE_MODE (TREE_TYPE (fields[1])),
5564 int_byte_position (fields[1]));
5565 }
5566
5567 /* If a value is passed in the most significant part of a register, see
5568 whether we have to round the mode up to a whole number of words. */
5569 if (mips_return_in_msb (valtype))
5570 {
5571 HOST_WIDE_INT size = int_size_in_bytes (valtype);
5572 if (size % UNITS_PER_WORD != 0)
5573 {
5574 size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5575 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5576 }
5577 }
5578
5579 /* For EABI, the class of return register depends entirely on MODE.
5580 For example, "struct { some_type x; }" and "union { some_type x; }"
5581 are returned in the same way as a bare "some_type" would be.
5582 Other ABIs only use FPRs for scalar, complex or vector types. */
5583 if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5584 return gen_rtx_REG (mode, GP_RETURN);
5585 }
5586
5587 if (!TARGET_MIPS16)
5588 {
5589 /* Handle long doubles for n32 & n64. */
5590 if (mode == TFmode)
5591 return mips_return_fpr_pair (mode,
5592 DImode, 0,
5593 DImode, GET_MODE_SIZE (mode) / 2);
5594
5595 if (mips_return_mode_in_fpr_p (mode))
5596 {
5597 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5598 return mips_return_fpr_pair (mode,
5599 GET_MODE_INNER (mode), 0,
5600 GET_MODE_INNER (mode),
5601 GET_MODE_SIZE (mode) / 2);
5602 else
5603 return gen_rtx_REG (mode, FP_RETURN);
5604 }
5605 }
5606
5607 return gen_rtx_REG (mode, GP_RETURN);
5608 }
5609
5610 /* Implement TARGET_FUNCTION_VALUE. */
5611
5612 static rtx
5613 mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5614 bool outgoing ATTRIBUTE_UNUSED)
5615 {
5616 return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5617 }
5618
5619 /* Implement TARGET_LIBCALL_VALUE. */
5620
5621 static rtx
5622 mips_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5623 {
5624 return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5625 }
5626
5627 /* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5628
5629 On the MIPS, R2 R3 and F0 F2 are the only register thus used.
5630 Currently, R2 and F0 are only implemented here (C has no complex type). */
5631
5632 static bool
5633 mips_function_value_regno_p (const unsigned int regno)
5634 {
5635 if (regno == GP_RETURN
5636 || regno == FP_RETURN
5637 || (LONG_DOUBLE_TYPE_SIZE == 128
5638 && FP_RETURN != GP_RETURN
5639 && regno == FP_RETURN + 2))
5640 return true;
5641
5642 return false;
5643 }
5644
5645 /* Implement TARGET_RETURN_IN_MEMORY. Under the o32 and o64 ABIs,
5646 all BLKmode objects are returned in memory. Under the n32, n64
5647 and embedded ABIs, small structures are returned in a register.
5648 Objects with varying size must still be returned in memory, of
5649 course. */
5650
5651 static bool
5652 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5653 {
5654 return (TARGET_OLDABI
5655 ? TYPE_MODE (type) == BLKmode
5656 : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5657 }
5658 \f
5659 /* Implement TARGET_SETUP_INCOMING_VARARGS. */
5660
5661 static void
5662 mips_setup_incoming_varargs (cumulative_args_t cum, enum machine_mode mode,
5663 tree type, int *pretend_size ATTRIBUTE_UNUSED,
5664 int no_rtl)
5665 {
5666 CUMULATIVE_ARGS local_cum;
5667 int gp_saved, fp_saved;
5668
5669 /* The caller has advanced CUM up to, but not beyond, the last named
5670 argument. Advance a local copy of CUM past the last "real" named
5671 argument, to find out how many registers are left over. */
5672 local_cum = *get_cumulative_args (cum);
5673 mips_function_arg_advance (pack_cumulative_args (&local_cum), mode, type,
5674 true);
5675
5676 /* Found out how many registers we need to save. */
5677 gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5678 fp_saved = (EABI_FLOAT_VARARGS_P
5679 ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5680 : 0);
5681
5682 if (!no_rtl)
5683 {
5684 if (gp_saved > 0)
5685 {
5686 rtx ptr, mem;
5687
5688 ptr = plus_constant (Pmode, virtual_incoming_args_rtx,
5689 REG_PARM_STACK_SPACE (cfun->decl)
5690 - gp_saved * UNITS_PER_WORD);
5691 mem = gen_frame_mem (BLKmode, ptr);
5692 set_mem_alias_set (mem, get_varargs_alias_set ());
5693
5694 move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5695 mem, gp_saved);
5696 }
5697 if (fp_saved > 0)
5698 {
5699 /* We can't use move_block_from_reg, because it will use
5700 the wrong mode. */
5701 enum machine_mode mode;
5702 int off, i;
5703
5704 /* Set OFF to the offset from virtual_incoming_args_rtx of
5705 the first float register. The FP save area lies below
5706 the integer one, and is aligned to UNITS_PER_FPVALUE bytes. */
5707 off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5708 off -= fp_saved * UNITS_PER_FPREG;
5709
5710 mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5711
5712 for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5713 i += MAX_FPRS_PER_FMT)
5714 {
5715 rtx ptr, mem;
5716
5717 ptr = plus_constant (Pmode, virtual_incoming_args_rtx, off);
5718 mem = gen_frame_mem (mode, ptr);
5719 set_mem_alias_set (mem, get_varargs_alias_set ());
5720 mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5721 off += UNITS_PER_HWFPVALUE;
5722 }
5723 }
5724 }
5725 if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5726 cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5727 + fp_saved * UNITS_PER_FPREG);
5728 }
5729
5730 /* Implement TARGET_BUILTIN_VA_LIST. */
5731
5732 static tree
5733 mips_build_builtin_va_list (void)
5734 {
5735 if (EABI_FLOAT_VARARGS_P)
5736 {
5737 /* We keep 3 pointers, and two offsets.
5738
5739 Two pointers are to the overflow area, which starts at the CFA.
5740 One of these is constant, for addressing into the GPR save area
5741 below it. The other is advanced up the stack through the
5742 overflow region.
5743
5744 The third pointer is to the bottom of the GPR save area.
5745 Since the FPR save area is just below it, we can address
5746 FPR slots off this pointer.
5747
5748 We also keep two one-byte offsets, which are to be subtracted
5749 from the constant pointers to yield addresses in the GPR and
5750 FPR save areas. These are downcounted as float or non-float
5751 arguments are used, and when they get to zero, the argument
5752 must be obtained from the overflow region. */
5753 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5754 tree array, index;
5755
5756 record = lang_hooks.types.make_type (RECORD_TYPE);
5757
5758 f_ovfl = build_decl (BUILTINS_LOCATION,
5759 FIELD_DECL, get_identifier ("__overflow_argptr"),
5760 ptr_type_node);
5761 f_gtop = build_decl (BUILTINS_LOCATION,
5762 FIELD_DECL, get_identifier ("__gpr_top"),
5763 ptr_type_node);
5764 f_ftop = build_decl (BUILTINS_LOCATION,
5765 FIELD_DECL, get_identifier ("__fpr_top"),
5766 ptr_type_node);
5767 f_goff = build_decl (BUILTINS_LOCATION,
5768 FIELD_DECL, get_identifier ("__gpr_offset"),
5769 unsigned_char_type_node);
5770 f_foff = build_decl (BUILTINS_LOCATION,
5771 FIELD_DECL, get_identifier ("__fpr_offset"),
5772 unsigned_char_type_node);
5773 /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5774 warn on every user file. */
5775 index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5776 array = build_array_type (unsigned_char_type_node,
5777 build_index_type (index));
5778 f_res = build_decl (BUILTINS_LOCATION,
5779 FIELD_DECL, get_identifier ("__reserved"), array);
5780
5781 DECL_FIELD_CONTEXT (f_ovfl) = record;
5782 DECL_FIELD_CONTEXT (f_gtop) = record;
5783 DECL_FIELD_CONTEXT (f_ftop) = record;
5784 DECL_FIELD_CONTEXT (f_goff) = record;
5785 DECL_FIELD_CONTEXT (f_foff) = record;
5786 DECL_FIELD_CONTEXT (f_res) = record;
5787
5788 TYPE_FIELDS (record) = f_ovfl;
5789 DECL_CHAIN (f_ovfl) = f_gtop;
5790 DECL_CHAIN (f_gtop) = f_ftop;
5791 DECL_CHAIN (f_ftop) = f_goff;
5792 DECL_CHAIN (f_goff) = f_foff;
5793 DECL_CHAIN (f_foff) = f_res;
5794
5795 layout_type (record);
5796 return record;
5797 }
5798 else
5799 /* Otherwise, we use 'void *'. */
5800 return ptr_type_node;
5801 }
5802
5803 /* Implement TARGET_EXPAND_BUILTIN_VA_START. */
5804
5805 static void
5806 mips_va_start (tree valist, rtx nextarg)
5807 {
5808 if (EABI_FLOAT_VARARGS_P)
5809 {
5810 const CUMULATIVE_ARGS *cum;
5811 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5812 tree ovfl, gtop, ftop, goff, foff;
5813 tree t;
5814 int gpr_save_area_size;
5815 int fpr_save_area_size;
5816 int fpr_offset;
5817
5818 cum = &crtl->args.info;
5819 gpr_save_area_size
5820 = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5821 fpr_save_area_size
5822 = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5823
5824 f_ovfl = TYPE_FIELDS (va_list_type_node);
5825 f_gtop = DECL_CHAIN (f_ovfl);
5826 f_ftop = DECL_CHAIN (f_gtop);
5827 f_goff = DECL_CHAIN (f_ftop);
5828 f_foff = DECL_CHAIN (f_goff);
5829
5830 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5831 NULL_TREE);
5832 gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5833 NULL_TREE);
5834 ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5835 NULL_TREE);
5836 goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5837 NULL_TREE);
5838 foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5839 NULL_TREE);
5840
5841 /* Emit code to initialize OVFL, which points to the next varargs
5842 stack argument. CUM->STACK_WORDS gives the number of stack
5843 words used by named arguments. */
5844 t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5845 if (cum->stack_words > 0)
5846 t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
5847 t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5848 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5849
5850 /* Emit code to initialize GTOP, the top of the GPR save area. */
5851 t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5852 t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5853 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5854
5855 /* Emit code to initialize FTOP, the top of the FPR save area.
5856 This address is gpr_save_area_bytes below GTOP, rounded
5857 down to the next fp-aligned boundary. */
5858 t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5859 fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5860 fpr_offset &= -UNITS_PER_FPVALUE;
5861 if (fpr_offset)
5862 t = fold_build_pointer_plus_hwi (t, -fpr_offset);
5863 t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5864 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5865
5866 /* Emit code to initialize GOFF, the offset from GTOP of the
5867 next GPR argument. */
5868 t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5869 build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5870 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5871
5872 /* Likewise emit code to initialize FOFF, the offset from FTOP
5873 of the next FPR argument. */
5874 t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5875 build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5876 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5877 }
5878 else
5879 {
5880 nextarg = plus_constant (Pmode, nextarg, -cfun->machine->varargs_size);
5881 std_expand_builtin_va_start (valist, nextarg);
5882 }
5883 }
5884
5885 /* Like std_gimplify_va_arg_expr, but apply alignment to zero-sized
5886 types as well. */
5887
5888 static tree
5889 mips_std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5890 gimple_seq *post_p)
5891 {
5892 tree addr, t, type_size, rounded_size, valist_tmp;
5893 unsigned HOST_WIDE_INT align, boundary;
5894 bool indirect;
5895
5896 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
5897 if (indirect)
5898 type = build_pointer_type (type);
5899
5900 align = PARM_BOUNDARY / BITS_PER_UNIT;
5901 boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
5902
5903 /* When we align parameter on stack for caller, if the parameter
5904 alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
5905 aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee
5906 here with caller. */
5907 if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
5908 boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
5909
5910 boundary /= BITS_PER_UNIT;
5911
5912 /* Hoist the valist value into a temporary for the moment. */
5913 valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
5914
5915 /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
5916 requires greater alignment, we must perform dynamic alignment. */
5917 if (boundary > align)
5918 {
5919 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
5920 fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
5921 gimplify_and_add (t, pre_p);
5922
5923 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
5924 fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
5925 valist_tmp,
5926 build_int_cst (TREE_TYPE (valist), -boundary)));
5927 gimplify_and_add (t, pre_p);
5928 }
5929 else
5930 boundary = align;
5931
5932 /* If the actual alignment is less than the alignment of the type,
5933 adjust the type accordingly so that we don't assume strict alignment
5934 when dereferencing the pointer. */
5935 boundary *= BITS_PER_UNIT;
5936 if (boundary < TYPE_ALIGN (type))
5937 {
5938 type = build_variant_type_copy (type);
5939 TYPE_ALIGN (type) = boundary;
5940 }
5941
5942 /* Compute the rounded size of the type. */
5943 type_size = size_in_bytes (type);
5944 rounded_size = round_up (type_size, align);
5945
5946 /* Reduce rounded_size so it's sharable with the postqueue. */
5947 gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
5948
5949 /* Get AP. */
5950 addr = valist_tmp;
5951 if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
5952 {
5953 /* Small args are padded downward. */
5954 t = fold_build2_loc (input_location, GT_EXPR, sizetype,
5955 rounded_size, size_int (align));
5956 t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
5957 size_binop (MINUS_EXPR, rounded_size, type_size));
5958 addr = fold_build_pointer_plus (addr, t);
5959 }
5960
5961 /* Compute new value for AP. */
5962 t = fold_build_pointer_plus (valist_tmp, rounded_size);
5963 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
5964 gimplify_and_add (t, pre_p);
5965
5966 addr = fold_convert (build_pointer_type (type), addr);
5967
5968 if (indirect)
5969 addr = build_va_arg_indirect_ref (addr);
5970
5971 return build_va_arg_indirect_ref (addr);
5972 }
5973
5974 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR. */
5975
5976 static tree
5977 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5978 gimple_seq *post_p)
5979 {
5980 tree addr;
5981 bool indirect_p;
5982
5983 indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5984 if (indirect_p)
5985 type = build_pointer_type (type);
5986
5987 if (!EABI_FLOAT_VARARGS_P)
5988 addr = mips_std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5989 else
5990 {
5991 tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5992 tree ovfl, top, off, align;
5993 HOST_WIDE_INT size, rsize, osize;
5994 tree t, u;
5995
5996 f_ovfl = TYPE_FIELDS (va_list_type_node);
5997 f_gtop = DECL_CHAIN (f_ovfl);
5998 f_ftop = DECL_CHAIN (f_gtop);
5999 f_goff = DECL_CHAIN (f_ftop);
6000 f_foff = DECL_CHAIN (f_goff);
6001
6002 /* Let:
6003
6004 TOP be the top of the GPR or FPR save area;
6005 OFF be the offset from TOP of the next register;
6006 ADDR_RTX be the address of the argument;
6007 SIZE be the number of bytes in the argument type;
6008 RSIZE be the number of bytes used to store the argument
6009 when it's in the register save area; and
6010 OSIZE be the number of bytes used to store it when it's
6011 in the stack overflow area.
6012
6013 The code we want is:
6014
6015 1: off &= -rsize; // round down
6016 2: if (off != 0)
6017 3: {
6018 4: addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
6019 5: off -= rsize;
6020 6: }
6021 7: else
6022 8: {
6023 9: ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
6024 10: addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
6025 11: ovfl += osize;
6026 14: }
6027
6028 [1] and [9] can sometimes be optimized away. */
6029
6030 ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6031 NULL_TREE);
6032 size = int_size_in_bytes (type);
6033
6034 if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
6035 && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
6036 {
6037 top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
6038 unshare_expr (valist), f_ftop, NULL_TREE);
6039 off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
6040 unshare_expr (valist), f_foff, NULL_TREE);
6041
6042 /* When va_start saves FPR arguments to the stack, each slot
6043 takes up UNITS_PER_HWFPVALUE bytes, regardless of the
6044 argument's precision. */
6045 rsize = UNITS_PER_HWFPVALUE;
6046
6047 /* Overflow arguments are padded to UNITS_PER_WORD bytes
6048 (= PARM_BOUNDARY bits). This can be different from RSIZE
6049 in two cases:
6050
6051 (1) On 32-bit targets when TYPE is a structure such as:
6052
6053 struct s { float f; };
6054
6055 Such structures are passed in paired FPRs, so RSIZE
6056 will be 8 bytes. However, the structure only takes
6057 up 4 bytes of memory, so OSIZE will only be 4.
6058
6059 (2) In combinations such as -mgp64 -msingle-float
6060 -fshort-double. Doubles passed in registers will then take
6061 up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
6062 stack take up UNITS_PER_WORD bytes. */
6063 osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
6064 }
6065 else
6066 {
6067 top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
6068 unshare_expr (valist), f_gtop, NULL_TREE);
6069 off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
6070 unshare_expr (valist), f_goff, NULL_TREE);
6071 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6072 if (rsize > UNITS_PER_WORD)
6073 {
6074 /* [1] Emit code for: off &= -rsize. */
6075 t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
6076 build_int_cst (TREE_TYPE (off), -rsize));
6077 gimplify_assign (unshare_expr (off), t, pre_p);
6078 }
6079 osize = rsize;
6080 }
6081
6082 /* [2] Emit code to branch if off == 0. */
6083 t = build2 (NE_EXPR, boolean_type_node, unshare_expr (off),
6084 build_int_cst (TREE_TYPE (off), 0));
6085 addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
6086
6087 /* [5] Emit code for: off -= rsize. We do this as a form of
6088 post-decrement not available to C. */
6089 t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
6090 t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
6091
6092 /* [4] Emit code for:
6093 addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
6094 t = fold_convert (sizetype, t);
6095 t = fold_build1 (NEGATE_EXPR, sizetype, t);
6096 t = fold_build_pointer_plus (top, t);
6097 if (BYTES_BIG_ENDIAN && rsize > size)
6098 t = fold_build_pointer_plus_hwi (t, rsize - size);
6099 COND_EXPR_THEN (addr) = t;
6100
6101 if (osize > UNITS_PER_WORD)
6102 {
6103 /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
6104 t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
6105 u = build_int_cst (TREE_TYPE (t), -osize);
6106 t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
6107 align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
6108 unshare_expr (ovfl), t);
6109 }
6110 else
6111 align = NULL;
6112
6113 /* [10, 11] Emit code for:
6114 addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
6115 ovfl += osize. */
6116 u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
6117 t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
6118 if (BYTES_BIG_ENDIAN && osize > size)
6119 t = fold_build_pointer_plus_hwi (t, osize - size);
6120
6121 /* String [9] and [10, 11] together. */
6122 if (align)
6123 t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
6124 COND_EXPR_ELSE (addr) = t;
6125
6126 addr = fold_convert (build_pointer_type (type), addr);
6127 addr = build_va_arg_indirect_ref (addr);
6128 }
6129
6130 if (indirect_p)
6131 addr = build_va_arg_indirect_ref (addr);
6132
6133 return addr;
6134 }
6135 \f
6136 /* Declare a unique, locally-binding function called NAME, then start
6137 its definition. */
6138
6139 static void
6140 mips_start_unique_function (const char *name)
6141 {
6142 tree decl;
6143
6144 decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
6145 get_identifier (name),
6146 build_function_type_list (void_type_node, NULL_TREE));
6147 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
6148 NULL_TREE, void_type_node);
6149 TREE_PUBLIC (decl) = 1;
6150 TREE_STATIC (decl) = 1;
6151
6152 DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
6153
6154 targetm.asm_out.unique_section (decl, 0);
6155 switch_to_section (get_named_section (decl, NULL, 0));
6156
6157 targetm.asm_out.globalize_label (asm_out_file, name);
6158 fputs ("\t.hidden\t", asm_out_file);
6159 assemble_name (asm_out_file, name);
6160 putc ('\n', asm_out_file);
6161 }
6162
6163 /* Start a definition of function NAME. MIPS16_P indicates whether the
6164 function contains MIPS16 code. */
6165
6166 static void
6167 mips_start_function_definition (const char *name, bool mips16_p)
6168 {
6169 if (mips16_p)
6170 fprintf (asm_out_file, "\t.set\tmips16\n");
6171 else
6172 fprintf (asm_out_file, "\t.set\tnomips16\n");
6173
6174 if (TARGET_MICROMIPS)
6175 fprintf (asm_out_file, "\t.set\tmicromips\n");
6176 #ifdef HAVE_GAS_MICROMIPS
6177 else
6178 fprintf (asm_out_file, "\t.set\tnomicromips\n");
6179 #endif
6180
6181 if (!flag_inhibit_size_directive)
6182 {
6183 fputs ("\t.ent\t", asm_out_file);
6184 assemble_name (asm_out_file, name);
6185 fputs ("\n", asm_out_file);
6186 }
6187
6188 ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
6189
6190 /* Start the definition proper. */
6191 assemble_name (asm_out_file, name);
6192 fputs (":\n", asm_out_file);
6193 }
6194
6195 /* End a function definition started by mips_start_function_definition. */
6196
6197 static void
6198 mips_end_function_definition (const char *name)
6199 {
6200 if (!flag_inhibit_size_directive)
6201 {
6202 fputs ("\t.end\t", asm_out_file);
6203 assemble_name (asm_out_file, name);
6204 fputs ("\n", asm_out_file);
6205 }
6206 }
6207 \f
6208 /* Output a definition of the __mips16_rdhwr function. */
6209
6210 static void
6211 mips_output_mips16_rdhwr (void)
6212 {
6213 const char *name;
6214
6215 name = "__mips16_rdhwr";
6216 mips_start_unique_function (name);
6217 mips_start_function_definition (name, false);
6218 fprintf (asm_out_file,
6219 "\t.set\tpush\n"
6220 "\t.set\tmips32r2\n"
6221 "\t.set\tnoreorder\n"
6222 "\trdhwr\t$3,$29\n"
6223 "\t.set\tpop\n"
6224 "\tj\t$31\n");
6225 mips_end_function_definition (name);
6226 }
6227 \f
6228 /* Return true if calls to X can use R_MIPS_CALL* relocations. */
6229
6230 static bool
6231 mips_ok_for_lazy_binding_p (rtx x)
6232 {
6233 return (TARGET_USE_GOT
6234 && GET_CODE (x) == SYMBOL_REF
6235 && !SYMBOL_REF_BIND_NOW_P (x)
6236 && !mips_symbol_binds_local_p (x));
6237 }
6238
6239 /* Load function address ADDR into register DEST. TYPE is as for
6240 mips_expand_call. Return true if we used an explicit lazy-binding
6241 sequence. */
6242
6243 static bool
6244 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
6245 {
6246 /* If we're generating PIC, and this call is to a global function,
6247 try to allow its address to be resolved lazily. This isn't
6248 possible for sibcalls when $gp is call-saved because the value
6249 of $gp on entry to the stub would be our caller's gp, not ours. */
6250 if (TARGET_EXPLICIT_RELOCS
6251 && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
6252 && mips_ok_for_lazy_binding_p (addr))
6253 {
6254 addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
6255 emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
6256 return true;
6257 }
6258 else
6259 {
6260 mips_emit_move (dest, addr);
6261 return false;
6262 }
6263 }
6264 \f
6265 /* Each locally-defined hard-float MIPS16 function has a local symbol
6266 associated with it. This hash table maps the function symbol (FUNC)
6267 to the local symbol (LOCAL). */
6268 struct GTY(()) mips16_local_alias {
6269 rtx func;
6270 rtx local;
6271 };
6272 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
6273
6274 /* Hash table callbacks for mips16_local_aliases. */
6275
6276 static hashval_t
6277 mips16_local_aliases_hash (const void *entry)
6278 {
6279 const struct mips16_local_alias *alias;
6280
6281 alias = (const struct mips16_local_alias *) entry;
6282 return htab_hash_string (XSTR (alias->func, 0));
6283 }
6284
6285 static int
6286 mips16_local_aliases_eq (const void *entry1, const void *entry2)
6287 {
6288 const struct mips16_local_alias *alias1, *alias2;
6289
6290 alias1 = (const struct mips16_local_alias *) entry1;
6291 alias2 = (const struct mips16_local_alias *) entry2;
6292 return rtx_equal_p (alias1->func, alias2->func);
6293 }
6294
6295 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
6296 Return a local alias for it, creating a new one if necessary. */
6297
6298 static rtx
6299 mips16_local_alias (rtx func)
6300 {
6301 struct mips16_local_alias *alias, tmp_alias;
6302 void **slot;
6303
6304 /* Create the hash table if this is the first call. */
6305 if (mips16_local_aliases == NULL)
6306 mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
6307 mips16_local_aliases_eq, NULL);
6308
6309 /* Look up the function symbol, creating a new entry if need be. */
6310 tmp_alias.func = func;
6311 slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
6312 gcc_assert (slot != NULL);
6313
6314 alias = (struct mips16_local_alias *) *slot;
6315 if (alias == NULL)
6316 {
6317 const char *func_name, *local_name;
6318 rtx local;
6319
6320 /* Create a new SYMBOL_REF for the local symbol. The choice of
6321 __fn_local_* is based on the __fn_stub_* names that we've
6322 traditionally used for the non-MIPS16 stub. */
6323 func_name = targetm.strip_name_encoding (XSTR (func, 0));
6324 local_name = ACONCAT (("__fn_local_", func_name, NULL));
6325 local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
6326 SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
6327
6328 /* Create a new structure to represent the mapping. */
6329 alias = ggc_alloc_mips16_local_alias ();
6330 alias->func = func;
6331 alias->local = local;
6332 *slot = alias;
6333 }
6334 return alias->local;
6335 }
6336 \f
6337 /* A chained list of functions for which mips16_build_call_stub has already
6338 generated a stub. NAME is the name of the function and FP_RET_P is true
6339 if the function returns a value in floating-point registers. */
6340 struct mips16_stub {
6341 struct mips16_stub *next;
6342 char *name;
6343 bool fp_ret_p;
6344 };
6345 static struct mips16_stub *mips16_stubs;
6346
6347 /* Return the two-character string that identifies floating-point
6348 return mode MODE in the name of a MIPS16 function stub. */
6349
6350 static const char *
6351 mips16_call_stub_mode_suffix (enum machine_mode mode)
6352 {
6353 if (mode == SFmode)
6354 return "sf";
6355 else if (mode == DFmode)
6356 return "df";
6357 else if (mode == SCmode)
6358 return "sc";
6359 else if (mode == DCmode)
6360 return "dc";
6361 else if (mode == V2SFmode)
6362 return "df";
6363 else
6364 gcc_unreachable ();
6365 }
6366
6367 /* Write instructions to move a 32-bit value between general register
6368 GPREG and floating-point register FPREG. DIRECTION is 't' to move
6369 from GPREG to FPREG and 'f' to move in the opposite direction. */
6370
6371 static void
6372 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6373 {
6374 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6375 reg_names[gpreg], reg_names[fpreg]);
6376 }
6377
6378 /* Likewise for 64-bit values. */
6379
6380 static void
6381 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6382 {
6383 if (TARGET_64BIT)
6384 fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
6385 reg_names[gpreg], reg_names[fpreg]);
6386 else if (TARGET_FLOAT64)
6387 {
6388 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6389 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6390 fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
6391 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
6392 }
6393 else
6394 {
6395 /* Move the least-significant word. */
6396 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6397 reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6398 /* ...then the most significant word. */
6399 fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6400 reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6401 }
6402 }
6403
6404 /* Write out code to move floating-point arguments into or out of
6405 general registers. FP_CODE is the code describing which arguments
6406 are present (see the comment above the definition of CUMULATIVE_ARGS
6407 in mips.h). DIRECTION is as for mips_output_32bit_xfer. */
6408
6409 static void
6410 mips_output_args_xfer (int fp_code, char direction)
6411 {
6412 unsigned int gparg, fparg, f;
6413 CUMULATIVE_ARGS cum;
6414
6415 /* This code only works for o32 and o64. */
6416 gcc_assert (TARGET_OLDABI);
6417
6418 mips_init_cumulative_args (&cum, NULL);
6419
6420 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6421 {
6422 enum machine_mode mode;
6423 struct mips_arg_info info;
6424
6425 if ((f & 3) == 1)
6426 mode = SFmode;
6427 else if ((f & 3) == 2)
6428 mode = DFmode;
6429 else
6430 gcc_unreachable ();
6431
6432 mips_get_arg_info (&info, &cum, mode, NULL, true);
6433 gparg = mips_arg_regno (&info, false);
6434 fparg = mips_arg_regno (&info, true);
6435
6436 if (mode == SFmode)
6437 mips_output_32bit_xfer (direction, gparg, fparg);
6438 else
6439 mips_output_64bit_xfer (direction, gparg, fparg);
6440
6441 mips_function_arg_advance (pack_cumulative_args (&cum), mode, NULL, true);
6442 }
6443 }
6444
6445 /* Write a MIPS16 stub for the current function. This stub is used
6446 for functions which take arguments in the floating-point registers.
6447 It is normal-mode code that moves the floating-point arguments
6448 into the general registers and then jumps to the MIPS16 code. */
6449
6450 static void
6451 mips16_build_function_stub (void)
6452 {
6453 const char *fnname, *alias_name, *separator;
6454 char *secname, *stubname;
6455 tree stubdecl;
6456 unsigned int f;
6457 rtx symbol, alias;
6458
6459 /* Create the name of the stub, and its unique section. */
6460 symbol = XEXP (DECL_RTL (current_function_decl), 0);
6461 alias = mips16_local_alias (symbol);
6462
6463 fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6464 alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6465 secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6466 stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6467
6468 /* Build a decl for the stub. */
6469 stubdecl = build_decl (BUILTINS_LOCATION,
6470 FUNCTION_DECL, get_identifier (stubname),
6471 build_function_type_list (void_type_node, NULL_TREE));
6472 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6473 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6474 RESULT_DECL, NULL_TREE, void_type_node);
6475
6476 /* Output a comment. */
6477 fprintf (asm_out_file, "\t# Stub function for %s (",
6478 current_function_name ());
6479 separator = "";
6480 for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6481 {
6482 fprintf (asm_out_file, "%s%s", separator,
6483 (f & 3) == 1 ? "float" : "double");
6484 separator = ", ";
6485 }
6486 fprintf (asm_out_file, ")\n");
6487
6488 /* Start the function definition. */
6489 assemble_start_function (stubdecl, stubname);
6490 mips_start_function_definition (stubname, false);
6491
6492 /* If generating pic2 code, either set up the global pointer or
6493 switch to pic0. */
6494 if (TARGET_ABICALLS_PIC2)
6495 {
6496 if (TARGET_ABSOLUTE_ABICALLS)
6497 fprintf (asm_out_file, "\t.option\tpic0\n");
6498 else
6499 {
6500 output_asm_insn ("%(.cpload\t%^%)", NULL);
6501 /* Emit an R_MIPS_NONE relocation to tell the linker what the
6502 target function is. Use a local GOT access when loading the
6503 symbol, to cut down on the number of unnecessary GOT entries
6504 for stubs that aren't needed. */
6505 output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6506 symbol = alias;
6507 }
6508 }
6509
6510 /* Load the address of the MIPS16 function into $25. Do this first so
6511 that targets with coprocessor interlocks can use an MFC1 to fill the
6512 delay slot. */
6513 output_asm_insn ("la\t%^,%0", &symbol);
6514
6515 /* Move the arguments from floating-point registers to general registers. */
6516 mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6517
6518 /* Jump to the MIPS16 function. */
6519 output_asm_insn ("jr\t%^", NULL);
6520
6521 if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6522 fprintf (asm_out_file, "\t.option\tpic2\n");
6523
6524 mips_end_function_definition (stubname);
6525
6526 /* If the linker needs to create a dynamic symbol for the target
6527 function, it will associate the symbol with the stub (which,
6528 unlike the target function, follows the proper calling conventions).
6529 It is therefore useful to have a local alias for the target function,
6530 so that it can still be identified as MIPS16 code. As an optimization,
6531 this symbol can also be used for indirect MIPS16 references from
6532 within this file. */
6533 ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6534
6535 switch_to_section (function_section (current_function_decl));
6536 }
6537
6538 /* The current function is a MIPS16 function that returns a value in an FPR.
6539 Copy the return value from its soft-float to its hard-float location.
6540 libgcc2 has special non-MIPS16 helper functions for each case. */
6541
6542 static void
6543 mips16_copy_fpr_return_value (void)
6544 {
6545 rtx fn, insn, retval;
6546 tree return_type;
6547 enum machine_mode return_mode;
6548 const char *name;
6549
6550 return_type = DECL_RESULT (current_function_decl);
6551 return_mode = DECL_MODE (return_type);
6552
6553 name = ACONCAT (("__mips16_ret_",
6554 mips16_call_stub_mode_suffix (return_mode),
6555 NULL));
6556 fn = mips16_stub_function (name);
6557
6558 /* The function takes arguments in $2 (and possibly $3), so calls
6559 to it cannot be lazily bound. */
6560 SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6561
6562 /* Model the call as something that takes the GPR return value as
6563 argument and returns an "updated" value. */
6564 retval = gen_rtx_REG (return_mode, GP_RETURN);
6565 insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6566 const0_rtx, NULL_RTX, false);
6567 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6568 }
6569
6570 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6571 RETVAL is the location of the return value, or null if this is
6572 a "call" rather than a "call_value". ARGS_SIZE is the size of the
6573 arguments and FP_CODE is the code built by mips_function_arg;
6574 see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6575
6576 There are three alternatives:
6577
6578 - If a stub was needed, emit the call and return the call insn itself.
6579
6580 - If we can avoid using a stub by redirecting the call, set *FN_PTR
6581 to the new target and return null.
6582
6583 - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6584 unmodified.
6585
6586 A stub is needed for calls to functions that, in normal mode,
6587 receive arguments in FPRs or return values in FPRs. The stub
6588 copies the arguments from their soft-float positions to their
6589 hard-float positions, calls the real function, then copies the
6590 return value from its hard-float position to its soft-float
6591 position.
6592
6593 We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6594 If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6595 automatically redirects the JAL to the stub, otherwise the JAL
6596 continues to call FN directly. */
6597
6598 static rtx
6599 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6600 {
6601 const char *fnname;
6602 bool fp_ret_p;
6603 struct mips16_stub *l;
6604 rtx insn, fn;
6605
6606 /* We don't need to do anything if we aren't in MIPS16 mode, or if
6607 we were invoked with the -msoft-float option. */
6608 if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6609 return NULL_RTX;
6610
6611 /* Figure out whether the value might come back in a floating-point
6612 register. */
6613 fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6614
6615 /* We don't need to do anything if there were no floating-point
6616 arguments and the value will not be returned in a floating-point
6617 register. */
6618 if (fp_code == 0 && !fp_ret_p)
6619 return NULL_RTX;
6620
6621 /* We don't need to do anything if this is a call to a special
6622 MIPS16 support function. */
6623 fn = *fn_ptr;
6624 if (mips16_stub_function_p (fn))
6625 return NULL_RTX;
6626
6627 /* If we're calling a locally-defined MIPS16 function, we know that
6628 it will return values in both the "soft-float" and "hard-float"
6629 registers. There is no need to use a stub to move the latter
6630 to the former. */
6631 if (fp_code == 0 && mips16_local_function_p (fn))
6632 return NULL_RTX;
6633
6634 /* This code will only work for o32 and o64 abis. The other ABI's
6635 require more sophisticated support. */
6636 gcc_assert (TARGET_OLDABI);
6637
6638 /* If we're calling via a function pointer, use one of the magic
6639 libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6640 Each stub expects the function address to arrive in register $2. */
6641 if (GET_CODE (fn) != SYMBOL_REF
6642 || !call_insn_operand (fn, VOIDmode))
6643 {
6644 char buf[30];
6645 rtx stub_fn, insn, addr;
6646 bool lazy_p;
6647
6648 /* If this is a locally-defined and locally-binding function,
6649 avoid the stub by calling the local alias directly. */
6650 if (mips16_local_function_p (fn))
6651 {
6652 *fn_ptr = mips16_local_alias (fn);
6653 return NULL_RTX;
6654 }
6655
6656 /* Create a SYMBOL_REF for the libgcc.a function. */
6657 if (fp_ret_p)
6658 sprintf (buf, "__mips16_call_stub_%s_%d",
6659 mips16_call_stub_mode_suffix (GET_MODE (retval)),
6660 fp_code);
6661 else
6662 sprintf (buf, "__mips16_call_stub_%d", fp_code);
6663 stub_fn = mips16_stub_function (buf);
6664
6665 /* The function uses $2 as an argument, so calls to it
6666 cannot be lazily bound. */
6667 SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6668
6669 /* Load the target function into $2. */
6670 addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6671 lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6672
6673 /* Emit the call. */
6674 insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6675 args_size, NULL_RTX, lazy_p);
6676
6677 /* Tell GCC that this call does indeed use the value of $2. */
6678 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6679
6680 /* If we are handling a floating-point return value, we need to
6681 save $18 in the function prologue. Putting a note on the
6682 call will mean that df_regs_ever_live_p ($18) will be true if the
6683 call is not eliminated, and we can check that in the prologue
6684 code. */
6685 if (fp_ret_p)
6686 CALL_INSN_FUNCTION_USAGE (insn) =
6687 gen_rtx_EXPR_LIST (VOIDmode,
6688 gen_rtx_CLOBBER (VOIDmode,
6689 gen_rtx_REG (word_mode, 18)),
6690 CALL_INSN_FUNCTION_USAGE (insn));
6691
6692 return insn;
6693 }
6694
6695 /* We know the function we are going to call. If we have already
6696 built a stub, we don't need to do anything further. */
6697 fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6698 for (l = mips16_stubs; l != NULL; l = l->next)
6699 if (strcmp (l->name, fnname) == 0)
6700 break;
6701
6702 if (l == NULL)
6703 {
6704 const char *separator;
6705 char *secname, *stubname;
6706 tree stubid, stubdecl;
6707 unsigned int f;
6708
6709 /* If the function does not return in FPRs, the special stub
6710 section is named
6711 .mips16.call.FNNAME
6712
6713 If the function does return in FPRs, the stub section is named
6714 .mips16.call.fp.FNNAME
6715
6716 Build a decl for the stub. */
6717 secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6718 fnname, NULL));
6719 stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6720 fnname, NULL));
6721 stubid = get_identifier (stubname);
6722 stubdecl = build_decl (BUILTINS_LOCATION,
6723 FUNCTION_DECL, stubid,
6724 build_function_type_list (void_type_node,
6725 NULL_TREE));
6726 DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6727 DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6728 RESULT_DECL, NULL_TREE,
6729 void_type_node);
6730
6731 /* Output a comment. */
6732 fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6733 (fp_ret_p
6734 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6735 : ""),
6736 fnname);
6737 separator = "";
6738 for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6739 {
6740 fprintf (asm_out_file, "%s%s", separator,
6741 (f & 3) == 1 ? "float" : "double");
6742 separator = ", ";
6743 }
6744 fprintf (asm_out_file, ")\n");
6745
6746 /* Start the function definition. */
6747 assemble_start_function (stubdecl, stubname);
6748 mips_start_function_definition (stubname, false);
6749
6750 if (fp_ret_p)
6751 {
6752 fprintf (asm_out_file, "\t.cfi_startproc\n");
6753
6754 /* Create a fake CFA 4 bytes below the stack pointer.
6755 This works around unwinders (like libgcc's) that expect
6756 the CFA for non-signal frames to be unique. */
6757 fprintf (asm_out_file, "\t.cfi_def_cfa 29,-4\n");
6758
6759 /* "Save" $sp in itself so we don't use the fake CFA.
6760 This is: DW_CFA_val_expression r29, { DW_OP_reg29 }. */
6761 fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
6762 }
6763 else
6764 {
6765 /* Load the address of the MIPS16 function into $25. Do this
6766 first so that targets with coprocessor interlocks can use
6767 an MFC1 to fill the delay slot. */
6768 if (TARGET_EXPLICIT_RELOCS)
6769 {
6770 output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6771 output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6772 }
6773 else
6774 output_asm_insn ("la\t%^,%0", &fn);
6775 }
6776
6777 /* Move the arguments from general registers to floating-point
6778 registers. */
6779 mips_output_args_xfer (fp_code, 't');
6780
6781 if (fp_ret_p)
6782 {
6783 /* Save the return address in $18 and call the non-MIPS16 function.
6784 The stub's caller knows that $18 might be clobbered, even though
6785 $18 is usually a call-saved register. */
6786 fprintf (asm_out_file, "\tmove\t%s,%s\n",
6787 reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6788 output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6789 fprintf (asm_out_file, "\t.cfi_register 31,18\n");
6790
6791 /* Move the result from floating-point registers to
6792 general registers. */
6793 switch (GET_MODE (retval))
6794 {
6795 case SCmode:
6796 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
6797 TARGET_BIG_ENDIAN
6798 ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6799 : FP_REG_FIRST);
6800 mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
6801 TARGET_LITTLE_ENDIAN
6802 ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6803 : FP_REG_FIRST);
6804 if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6805 {
6806 /* On 64-bit targets, complex floats are returned in
6807 a single GPR, such that "sd" on a suitably-aligned
6808 target would store the value correctly. */
6809 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6810 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6811 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6812 fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6813 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6814 reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6815 fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
6816 reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6817 reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6818 fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6819 reg_names[GP_RETURN],
6820 reg_names[GP_RETURN],
6821 reg_names[GP_RETURN + 1]);
6822 }
6823 break;
6824
6825 case SFmode:
6826 mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6827 break;
6828
6829 case DCmode:
6830 mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6831 FP_REG_FIRST + MAX_FPRS_PER_FMT);
6832 /* Fall though. */
6833 case DFmode:
6834 case V2SFmode:
6835 mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6836 break;
6837
6838 default:
6839 gcc_unreachable ();
6840 }
6841 fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6842 fprintf (asm_out_file, "\t.cfi_endproc\n");
6843 }
6844 else
6845 {
6846 /* Jump to the previously-loaded address. */
6847 output_asm_insn ("jr\t%^", NULL);
6848 }
6849
6850 #ifdef ASM_DECLARE_FUNCTION_SIZE
6851 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6852 #endif
6853
6854 mips_end_function_definition (stubname);
6855
6856 /* Record this stub. */
6857 l = XNEW (struct mips16_stub);
6858 l->name = xstrdup (fnname);
6859 l->fp_ret_p = fp_ret_p;
6860 l->next = mips16_stubs;
6861 mips16_stubs = l;
6862 }
6863
6864 /* If we expect a floating-point return value, but we've built a
6865 stub which does not expect one, then we're in trouble. We can't
6866 use the existing stub, because it won't handle the floating-point
6867 value. We can't build a new stub, because the linker won't know
6868 which stub to use for the various calls in this object file.
6869 Fortunately, this case is illegal, since it means that a function
6870 was declared in two different ways in a single compilation. */
6871 if (fp_ret_p && !l->fp_ret_p)
6872 error ("cannot handle inconsistent calls to %qs", fnname);
6873
6874 if (retval == NULL_RTX)
6875 insn = gen_call_internal_direct (fn, args_size);
6876 else
6877 insn = gen_call_value_internal_direct (retval, fn, args_size);
6878 insn = mips_emit_call_insn (insn, fn, fn, false);
6879
6880 /* If we are calling a stub which handles a floating-point return
6881 value, we need to arrange to save $18 in the prologue. We do this
6882 by marking the function call as using the register. The prologue
6883 will later see that it is used, and emit code to save it. */
6884 if (fp_ret_p)
6885 CALL_INSN_FUNCTION_USAGE (insn) =
6886 gen_rtx_EXPR_LIST (VOIDmode,
6887 gen_rtx_CLOBBER (VOIDmode,
6888 gen_rtx_REG (word_mode, 18)),
6889 CALL_INSN_FUNCTION_USAGE (insn));
6890
6891 return insn;
6892 }
6893 \f
6894 /* Expand a call of type TYPE. RESULT is where the result will go (null
6895 for "call"s and "sibcall"s), ADDR is the address of the function,
6896 ARGS_SIZE is the size of the arguments and AUX is the value passed
6897 to us by mips_function_arg. LAZY_P is true if this call already
6898 involves a lazily-bound function address (such as when calling
6899 functions through a MIPS16 hard-float stub).
6900
6901 Return the call itself. */
6902
6903 rtx
6904 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6905 rtx args_size, rtx aux, bool lazy_p)
6906 {
6907 rtx orig_addr, pattern, insn;
6908 int fp_code;
6909
6910 fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6911 insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6912 if (insn)
6913 {
6914 gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6915 return insn;
6916 }
6917
6918 orig_addr = addr;
6919 if (!call_insn_operand (addr, VOIDmode))
6920 {
6921 if (type == MIPS_CALL_EPILOGUE)
6922 addr = MIPS_EPILOGUE_TEMP (Pmode);
6923 else
6924 addr = gen_reg_rtx (Pmode);
6925 lazy_p |= mips_load_call_address (type, addr, orig_addr);
6926 }
6927
6928 if (result == 0)
6929 {
6930 rtx (*fn) (rtx, rtx);
6931
6932 if (type == MIPS_CALL_SIBCALL)
6933 fn = gen_sibcall_internal;
6934 else
6935 fn = gen_call_internal;
6936
6937 pattern = fn (addr, args_size);
6938 }
6939 else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6940 {
6941 /* Handle return values created by mips_return_fpr_pair. */
6942 rtx (*fn) (rtx, rtx, rtx, rtx);
6943 rtx reg1, reg2;
6944
6945 if (type == MIPS_CALL_SIBCALL)
6946 fn = gen_sibcall_value_multiple_internal;
6947 else
6948 fn = gen_call_value_multiple_internal;
6949
6950 reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6951 reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6952 pattern = fn (reg1, addr, args_size, reg2);
6953 }
6954 else
6955 {
6956 rtx (*fn) (rtx, rtx, rtx);
6957
6958 if (type == MIPS_CALL_SIBCALL)
6959 fn = gen_sibcall_value_internal;
6960 else
6961 fn = gen_call_value_internal;
6962
6963 /* Handle return values created by mips_return_fpr_single. */
6964 if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6965 result = XEXP (XVECEXP (result, 0, 0), 0);
6966 pattern = fn (result, addr, args_size);
6967 }
6968
6969 return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6970 }
6971
6972 /* Split call instruction INSN into a $gp-clobbering call and
6973 (where necessary) an instruction to restore $gp from its save slot.
6974 CALL_PATTERN is the pattern of the new call. */
6975
6976 void
6977 mips_split_call (rtx insn, rtx call_pattern)
6978 {
6979 emit_call_insn (call_pattern);
6980 if (!find_reg_note (insn, REG_NORETURN, 0))
6981 /* Pick a temporary register that is suitable for both MIPS16 and
6982 non-MIPS16 code. $4 and $5 are used for returning complex double
6983 values in soft-float code, so $6 is the first suitable candidate. */
6984 mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6985 }
6986
6987 /* Return true if a call to DECL may need to use JALX. */
6988
6989 static bool
6990 mips_call_may_need_jalx_p (tree decl)
6991 {
6992 /* If the current translation unit would use a different mode for DECL,
6993 assume that the call needs JALX. */
6994 if (mips_get_compress_mode (decl) != TARGET_COMPRESSION)
6995 return true;
6996
6997 /* mips_get_compress_mode is always accurate for locally-binding
6998 functions in the current translation unit. */
6999 if (!DECL_EXTERNAL (decl) && targetm.binds_local_p (decl))
7000 return false;
7001
7002 /* When -minterlink-compressed is in effect, assume that functions
7003 could use a different encoding mode unless an attribute explicitly
7004 tells us otherwise. */
7005 if (TARGET_INTERLINK_COMPRESSED)
7006 {
7007 if (!TARGET_COMPRESSION
7008 && mips_get_compress_off_flags (DECL_ATTRIBUTES (decl)) ==0)
7009 return true;
7010 if (TARGET_COMPRESSION
7011 && mips_get_compress_on_flags (DECL_ATTRIBUTES (decl)) == 0)
7012 return true;
7013 }
7014
7015 return false;
7016 }
7017
7018 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL. */
7019
7020 static bool
7021 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
7022 {
7023 if (!TARGET_SIBCALLS)
7024 return false;
7025
7026 /* Interrupt handlers need special epilogue code and therefore can't
7027 use sibcalls. */
7028 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
7029 return false;
7030
7031 /* Direct Js are only possible to functions that use the same ISA encoding.
7032 There is no JX counterpoart of JALX. */
7033 if (decl
7034 && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode)
7035 && mips_call_may_need_jalx_p (decl))
7036 return false;
7037
7038 /* Sibling calls should not prevent lazy binding. Lazy-binding stubs
7039 require $gp to be valid on entry, so sibcalls can only use stubs
7040 if $gp is call-clobbered. */
7041 if (decl
7042 && TARGET_CALL_SAVED_GP
7043 && !TARGET_ABICALLS_PIC0
7044 && !targetm.binds_local_p (decl))
7045 return false;
7046
7047 /* Otherwise OK. */
7048 return true;
7049 }
7050 \f
7051 /* Emit code to move general operand SRC into condition-code
7052 register DEST given that SCRATCH is a scratch TFmode FPR.
7053 The sequence is:
7054
7055 FP1 = SRC
7056 FP2 = 0.0f
7057 DEST = FP2 < FP1
7058
7059 where FP1 and FP2 are single-precision FPRs taken from SCRATCH. */
7060
7061 void
7062 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
7063 {
7064 rtx fp1, fp2;
7065
7066 /* Change the source to SFmode. */
7067 if (MEM_P (src))
7068 src = adjust_address (src, SFmode, 0);
7069 else if (REG_P (src) || GET_CODE (src) == SUBREG)
7070 src = gen_rtx_REG (SFmode, true_regnum (src));
7071
7072 fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
7073 fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
7074
7075 mips_emit_move (copy_rtx (fp1), src);
7076 mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
7077 emit_insn (gen_slt_sf (dest, fp2, fp1));
7078 }
7079 \f
7080 /* Implement MOVE_BY_PIECES_P. */
7081
7082 bool
7083 mips_move_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7084 {
7085 if (HAVE_movmemsi)
7086 {
7087 /* movmemsi is meant to generate code that is at least as good as
7088 move_by_pieces. However, movmemsi effectively uses a by-pieces
7089 implementation both for moves smaller than a word and for
7090 word-aligned moves of no more than MIPS_MAX_MOVE_BYTES_STRAIGHT
7091 bytes. We should allow the tree-level optimisers to do such
7092 moves by pieces, as it often exposes other optimization
7093 opportunities. We might as well continue to use movmemsi at
7094 the rtl level though, as it produces better code when
7095 scheduling is disabled (such as at -O). */
7096 if (currently_expanding_to_rtl)
7097 return false;
7098 if (align < BITS_PER_WORD)
7099 return size < UNITS_PER_WORD;
7100 return size <= MIPS_MAX_MOVE_BYTES_STRAIGHT;
7101 }
7102 /* The default value. If this becomes a target hook, we should
7103 call the default definition instead. */
7104 return (move_by_pieces_ninsns (size, align, MOVE_MAX_PIECES + 1)
7105 < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ()));
7106 }
7107
7108 /* Implement STORE_BY_PIECES_P. */
7109
7110 bool
7111 mips_store_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7112 {
7113 /* Storing by pieces involves moving constants into registers
7114 of size MIN (ALIGN, BITS_PER_WORD), then storing them.
7115 We need to decide whether it is cheaper to load the address of
7116 constant data into a register and use a block move instead. */
7117
7118 /* If the data is only byte aligned, then:
7119
7120 (a1) A block move of less than 4 bytes would involve three 3 LBs and
7121 3 SBs. We might as well use 3 single-instruction LIs and 3 SBs
7122 instead.
7123
7124 (a2) A block move of 4 bytes from aligned source data can use an
7125 LW/SWL/SWR sequence. This is often better than the 4 LIs and
7126 4 SBs that we would generate when storing by pieces. */
7127 if (align <= BITS_PER_UNIT)
7128 return size < 4;
7129
7130 /* If the data is 2-byte aligned, then:
7131
7132 (b1) A block move of less than 4 bytes would use a combination of LBs,
7133 LHs, SBs and SHs. We get better code by using single-instruction
7134 LIs, SBs and SHs instead.
7135
7136 (b2) A block move of 4 bytes from aligned source data would again use
7137 an LW/SWL/SWR sequence. In most cases, loading the address of
7138 the source data would require at least one extra instruction.
7139 It is often more efficient to use 2 single-instruction LIs and
7140 2 SHs instead.
7141
7142 (b3) A block move of up to 3 additional bytes would be like (b1).
7143
7144 (b4) A block move of 8 bytes from aligned source data can use two
7145 LW/SWL/SWR sequences or a single LD/SDL/SDR sequence. Both
7146 sequences are better than the 4 LIs and 4 SHs that we'd generate
7147 when storing by pieces.
7148
7149 The reasoning for higher alignments is similar:
7150
7151 (c1) A block move of less than 4 bytes would be the same as (b1).
7152
7153 (c2) A block move of 4 bytes would use an LW/SW sequence. Again,
7154 loading the address of the source data would typically require
7155 at least one extra instruction. It is generally better to use
7156 LUI/ORI/SW instead.
7157
7158 (c3) A block move of up to 3 additional bytes would be like (b1).
7159
7160 (c4) A block move of 8 bytes can use two LW/SW sequences or a single
7161 LD/SD sequence, and in these cases we've traditionally preferred
7162 the memory copy over the more bulky constant moves. */
7163 return size < 8;
7164 }
7165
7166 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
7167 Assume that the areas do not overlap. */
7168
7169 static void
7170 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
7171 {
7172 HOST_WIDE_INT offset, delta;
7173 unsigned HOST_WIDE_INT bits;
7174 int i;
7175 enum machine_mode mode;
7176 rtx *regs;
7177
7178 /* Work out how many bits to move at a time. If both operands have
7179 half-word alignment, it is usually better to move in half words.
7180 For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
7181 and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
7182 Otherwise move word-sized chunks. */
7183 if (MEM_ALIGN (src) == BITS_PER_WORD / 2
7184 && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
7185 bits = BITS_PER_WORD / 2;
7186 else
7187 bits = BITS_PER_WORD;
7188
7189 mode = mode_for_size (bits, MODE_INT, 0);
7190 delta = bits / BITS_PER_UNIT;
7191
7192 /* Allocate a buffer for the temporary registers. */
7193 regs = XALLOCAVEC (rtx, length / delta);
7194
7195 /* Load as many BITS-sized chunks as possible. Use a normal load if
7196 the source has enough alignment, otherwise use left/right pairs. */
7197 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7198 {
7199 regs[i] = gen_reg_rtx (mode);
7200 if (MEM_ALIGN (src) >= bits)
7201 mips_emit_move (regs[i], adjust_address (src, mode, offset));
7202 else
7203 {
7204 rtx part = adjust_address (src, BLKmode, offset);
7205 set_mem_size (part, delta);
7206 if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0, 0))
7207 gcc_unreachable ();
7208 }
7209 }
7210
7211 /* Copy the chunks to the destination. */
7212 for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7213 if (MEM_ALIGN (dest) >= bits)
7214 mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
7215 else
7216 {
7217 rtx part = adjust_address (dest, BLKmode, offset);
7218 set_mem_size (part, delta);
7219 if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
7220 gcc_unreachable ();
7221 }
7222
7223 /* Mop up any left-over bytes. */
7224 if (offset < length)
7225 {
7226 src = adjust_address (src, BLKmode, offset);
7227 dest = adjust_address (dest, BLKmode, offset);
7228 move_by_pieces (dest, src, length - offset,
7229 MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
7230 }
7231 }
7232
7233 /* Helper function for doing a loop-based block operation on memory
7234 reference MEM. Each iteration of the loop will operate on LENGTH
7235 bytes of MEM.
7236
7237 Create a new base register for use within the loop and point it to
7238 the start of MEM. Create a new memory reference that uses this
7239 register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
7240
7241 static void
7242 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
7243 rtx *loop_reg, rtx *loop_mem)
7244 {
7245 *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
7246
7247 /* Although the new mem does not refer to a known location,
7248 it does keep up to LENGTH bytes of alignment. */
7249 *loop_mem = change_address (mem, BLKmode, *loop_reg);
7250 set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
7251 }
7252
7253 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
7254 bytes at a time. LENGTH must be at least BYTES_PER_ITER. Assume that
7255 the memory regions do not overlap. */
7256
7257 static void
7258 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
7259 HOST_WIDE_INT bytes_per_iter)
7260 {
7261 rtx label, src_reg, dest_reg, final_src, test;
7262 HOST_WIDE_INT leftover;
7263
7264 leftover = length % bytes_per_iter;
7265 length -= leftover;
7266
7267 /* Create registers and memory references for use within the loop. */
7268 mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
7269 mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
7270
7271 /* Calculate the value that SRC_REG should have after the last iteration
7272 of the loop. */
7273 final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
7274 0, 0, OPTAB_WIDEN);
7275
7276 /* Emit the start of the loop. */
7277 label = gen_label_rtx ();
7278 emit_label (label);
7279
7280 /* Emit the loop body. */
7281 mips_block_move_straight (dest, src, bytes_per_iter);
7282
7283 /* Move on to the next block. */
7284 mips_emit_move (src_reg, plus_constant (Pmode, src_reg, bytes_per_iter));
7285 mips_emit_move (dest_reg, plus_constant (Pmode, dest_reg, bytes_per_iter));
7286
7287 /* Emit the loop condition. */
7288 test = gen_rtx_NE (VOIDmode, src_reg, final_src);
7289 if (Pmode == DImode)
7290 emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
7291 else
7292 emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
7293
7294 /* Mop up any left-over bytes. */
7295 if (leftover)
7296 mips_block_move_straight (dest, src, leftover);
7297 }
7298
7299 /* Expand a movmemsi instruction, which copies LENGTH bytes from
7300 memory reference SRC to memory reference DEST. */
7301
7302 bool
7303 mips_expand_block_move (rtx dest, rtx src, rtx length)
7304 {
7305 if (CONST_INT_P (length))
7306 {
7307 if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
7308 {
7309 mips_block_move_straight (dest, src, INTVAL (length));
7310 return true;
7311 }
7312 else if (optimize)
7313 {
7314 mips_block_move_loop (dest, src, INTVAL (length),
7315 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
7316 return true;
7317 }
7318 }
7319 return false;
7320 }
7321 \f
7322 /* Expand a loop of synci insns for the address range [BEGIN, END). */
7323
7324 void
7325 mips_expand_synci_loop (rtx begin, rtx end)
7326 {
7327 rtx inc, label, end_label, cmp_result, mask, length;
7328
7329 /* Create end_label. */
7330 end_label = gen_label_rtx ();
7331
7332 /* Check if begin equals end. */
7333 cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
7334 emit_jump_insn (gen_condjump (cmp_result, end_label));
7335
7336 /* Load INC with the cache line size (rdhwr INC,$1). */
7337 inc = gen_reg_rtx (Pmode);
7338 emit_insn (PMODE_INSN (gen_rdhwr_synci_step, (inc)));
7339
7340 /* Check if inc is 0. */
7341 cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
7342 emit_jump_insn (gen_condjump (cmp_result, end_label));
7343
7344 /* Calculate mask. */
7345 mask = mips_force_unary (Pmode, NEG, inc);
7346
7347 /* Mask out begin by mask. */
7348 begin = mips_force_binary (Pmode, AND, begin, mask);
7349
7350 /* Calculate length. */
7351 length = mips_force_binary (Pmode, MINUS, end, begin);
7352
7353 /* Loop back to here. */
7354 label = gen_label_rtx ();
7355 emit_label (label);
7356
7357 emit_insn (gen_synci (begin));
7358
7359 /* Update length. */
7360 mips_emit_binary (MINUS, length, length, inc);
7361
7362 /* Update begin. */
7363 mips_emit_binary (PLUS, begin, begin, inc);
7364
7365 /* Check if length is greater than 0. */
7366 cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
7367 emit_jump_insn (gen_condjump (cmp_result, label));
7368
7369 emit_label (end_label);
7370 }
7371 \f
7372 /* Expand a QI or HI mode atomic memory operation.
7373
7374 GENERATOR contains a pointer to the gen_* function that generates
7375 the SI mode underlying atomic operation using masks that we
7376 calculate.
7377
7378 RESULT is the return register for the operation. Its value is NULL
7379 if unused.
7380
7381 MEM is the location of the atomic access.
7382
7383 OLDVAL is the first operand for the operation.
7384
7385 NEWVAL is the optional second operand for the operation. Its value
7386 is NULL if unused. */
7387
7388 void
7389 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
7390 rtx result, rtx mem, rtx oldval, rtx newval)
7391 {
7392 rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
7393 rtx unshifted_mask_reg, mask, inverted_mask, si_op;
7394 rtx res = NULL;
7395 enum machine_mode mode;
7396
7397 mode = GET_MODE (mem);
7398
7399 /* Compute the address of the containing SImode value. */
7400 orig_addr = force_reg (Pmode, XEXP (mem, 0));
7401 memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
7402 force_reg (Pmode, GEN_INT (-4)));
7403
7404 /* Create a memory reference for it. */
7405 memsi = gen_rtx_MEM (SImode, memsi_addr);
7406 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
7407 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
7408
7409 /* Work out the byte offset of the QImode or HImode value,
7410 counting from the least significant byte. */
7411 shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
7412 if (TARGET_BIG_ENDIAN)
7413 mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
7414
7415 /* Multiply by eight to convert the shift value from bytes to bits. */
7416 mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
7417
7418 /* Make the final shift an SImode value, so that it can be used in
7419 SImode operations. */
7420 shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
7421
7422 /* Set MASK to an inclusive mask of the QImode or HImode value. */
7423 unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
7424 unshifted_mask_reg = force_reg (SImode, unshifted_mask);
7425 mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
7426
7427 /* Compute the equivalent exclusive mask. */
7428 inverted_mask = gen_reg_rtx (SImode);
7429 emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
7430 gen_rtx_NOT (SImode, mask)));
7431
7432 /* Shift the old value into place. */
7433 if (oldval != const0_rtx)
7434 {
7435 oldval = convert_modes (SImode, mode, oldval, true);
7436 oldval = force_reg (SImode, oldval);
7437 oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
7438 }
7439
7440 /* Do the same for the new value. */
7441 if (newval && newval != const0_rtx)
7442 {
7443 newval = convert_modes (SImode, mode, newval, true);
7444 newval = force_reg (SImode, newval);
7445 newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
7446 }
7447
7448 /* Do the SImode atomic access. */
7449 if (result)
7450 res = gen_reg_rtx (SImode);
7451 if (newval)
7452 si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
7453 else if (result)
7454 si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
7455 else
7456 si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
7457
7458 emit_insn (si_op);
7459
7460 if (result)
7461 {
7462 /* Shift and convert the result. */
7463 mips_emit_binary (AND, res, res, mask);
7464 mips_emit_binary (LSHIFTRT, res, res, shiftsi);
7465 mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
7466 }
7467 }
7468
7469 /* Return true if it is possible to use left/right accesses for a
7470 bitfield of WIDTH bits starting BITPOS bits into BLKmode memory OP.
7471 When returning true, update *LEFT and *RIGHT as follows:
7472
7473 *LEFT is a QImode reference to the first byte if big endian or
7474 the last byte if little endian. This address can be used in the
7475 left-side instructions (LWL, SWL, LDL, SDL).
7476
7477 *RIGHT is a QImode reference to the opposite end of the field and
7478 can be used in the patterning right-side instruction. */
7479
7480 static bool
7481 mips_get_unaligned_mem (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
7482 rtx *left, rtx *right)
7483 {
7484 rtx first, last;
7485
7486 /* Check that the size is valid. */
7487 if (width != 32 && (!TARGET_64BIT || width != 64))
7488 return false;
7489
7490 /* We can only access byte-aligned values. Since we are always passed
7491 a reference to the first byte of the field, it is not necessary to
7492 do anything with BITPOS after this check. */
7493 if (bitpos % BITS_PER_UNIT != 0)
7494 return false;
7495
7496 /* Reject aligned bitfields: we want to use a normal load or store
7497 instead of a left/right pair. */
7498 if (MEM_ALIGN (op) >= width)
7499 return false;
7500
7501 /* Get references to both ends of the field. */
7502 first = adjust_address (op, QImode, 0);
7503 last = adjust_address (op, QImode, width / BITS_PER_UNIT - 1);
7504
7505 /* Allocate to LEFT and RIGHT according to endianness. LEFT should
7506 correspond to the MSB and RIGHT to the LSB. */
7507 if (TARGET_BIG_ENDIAN)
7508 *left = first, *right = last;
7509 else
7510 *left = last, *right = first;
7511
7512 return true;
7513 }
7514
7515 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7516 DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7517 the operation is the equivalent of:
7518
7519 (set DEST (*_extract SRC WIDTH BITPOS))
7520
7521 Return true on success. */
7522
7523 bool
7524 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7525 HOST_WIDE_INT bitpos, bool unsigned_p)
7526 {
7527 rtx left, right, temp;
7528 rtx dest1 = NULL_RTX;
7529
7530 /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7531 be a DImode, create a new temp and emit a zero extend at the end. */
7532 if (GET_MODE (dest) == DImode
7533 && REG_P (dest)
7534 && GET_MODE_BITSIZE (SImode) == width)
7535 {
7536 dest1 = dest;
7537 dest = gen_reg_rtx (SImode);
7538 }
7539
7540 if (!mips_get_unaligned_mem (src, width, bitpos, &left, &right))
7541 return false;
7542
7543 temp = gen_reg_rtx (GET_MODE (dest));
7544 if (GET_MODE (dest) == DImode)
7545 {
7546 emit_insn (gen_mov_ldl (temp, src, left));
7547 emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7548 }
7549 else
7550 {
7551 emit_insn (gen_mov_lwl (temp, src, left));
7552 emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7553 }
7554
7555 /* If we were loading 32bits and the original register was DI then
7556 sign/zero extend into the orignal dest. */
7557 if (dest1)
7558 {
7559 if (unsigned_p)
7560 emit_insn (gen_zero_extendsidi2 (dest1, dest));
7561 else
7562 emit_insn (gen_extendsidi2 (dest1, dest));
7563 }
7564 return true;
7565 }
7566
7567 /* Try to use left/right stores to expand an "ins" pattern. DEST, WIDTH,
7568 BITPOS and SRC are the operands passed to the expander; the operation
7569 is the equivalent of:
7570
7571 (set (zero_extract DEST WIDTH BITPOS) SRC)
7572
7573 Return true on success. */
7574
7575 bool
7576 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7577 HOST_WIDE_INT bitpos)
7578 {
7579 rtx left, right;
7580 enum machine_mode mode;
7581
7582 if (!mips_get_unaligned_mem (dest, width, bitpos, &left, &right))
7583 return false;
7584
7585 mode = mode_for_size (width, MODE_INT, 0);
7586 src = gen_lowpart (mode, src);
7587 if (mode == DImode)
7588 {
7589 emit_insn (gen_mov_sdl (dest, src, left));
7590 emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7591 }
7592 else
7593 {
7594 emit_insn (gen_mov_swl (dest, src, left));
7595 emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7596 }
7597 return true;
7598 }
7599
7600 /* Return true if X is a MEM with the same size as MODE. */
7601
7602 bool
7603 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
7604 {
7605 return (MEM_P (x)
7606 && MEM_SIZE_KNOWN_P (x)
7607 && MEM_SIZE (x) == GET_MODE_SIZE (mode));
7608 }
7609
7610 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7611 source of an "ext" instruction or the destination of an "ins"
7612 instruction. OP must be a register operand and the following
7613 conditions must hold:
7614
7615 0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
7616 0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7617 0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
7618
7619 Also reject lengths equal to a word as they are better handled
7620 by the move patterns. */
7621
7622 bool
7623 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7624 {
7625 if (!ISA_HAS_EXT_INS
7626 || !register_operand (op, VOIDmode)
7627 || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7628 return false;
7629
7630 if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7631 return false;
7632
7633 if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7634 return false;
7635
7636 return true;
7637 }
7638
7639 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7640 operation if MAXLEN is the maxium length of consecutive bits that
7641 can make up MASK. MODE is the mode of the operation. See
7642 mask_low_and_shift_len for the actual definition. */
7643
7644 bool
7645 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
7646 {
7647 return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7648 }
7649
7650 /* Return true iff OP1 and OP2 are valid operands together for the
7651 *and<MODE>3 and *and<MODE>3_mips16 patterns. For the cases to consider,
7652 see the table in the comment before the pattern. */
7653
7654 bool
7655 and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7656 {
7657 return (memory_operand (op1, mode)
7658 ? and_load_operand (op2, mode)
7659 : and_reg_operand (op2, mode));
7660 }
7661
7662 /* The canonical form of a mask-low-and-shift-left operation is
7663 (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7664 cleared. Thus we need to shift MASK to the right before checking if it
7665 is a valid mask value. MODE is the mode of the operation. If true
7666 return the length of the mask, otherwise return -1. */
7667
7668 int
7669 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7670 {
7671 HOST_WIDE_INT shval;
7672
7673 shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7674 return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7675 }
7676 \f
7677 /* Return true if -msplit-addresses is selected and should be honored.
7678
7679 -msplit-addresses is a half-way house between explicit relocations
7680 and the traditional assembler macros. It can split absolute 32-bit
7681 symbolic constants into a high/lo_sum pair but uses macros for other
7682 sorts of access.
7683
7684 Like explicit relocation support for REL targets, it relies
7685 on GNU extensions in the assembler and the linker.
7686
7687 Although this code should work for -O0, it has traditionally
7688 been treated as an optimization. */
7689
7690 static bool
7691 mips_split_addresses_p (void)
7692 {
7693 return (TARGET_SPLIT_ADDRESSES
7694 && optimize
7695 && !TARGET_MIPS16
7696 && !flag_pic
7697 && !ABI_HAS_64BIT_SYMBOLS);
7698 }
7699
7700 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs. */
7701
7702 static void
7703 mips_init_relocs (void)
7704 {
7705 memset (mips_split_p, '\0', sizeof (mips_split_p));
7706 memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7707 memset (mips_use_pcrel_pool_p, '\0', sizeof (mips_use_pcrel_pool_p));
7708 memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7709 memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7710
7711 if (TARGET_MIPS16_PCREL_LOADS)
7712 mips_use_pcrel_pool_p[SYMBOL_ABSOLUTE] = true;
7713 else
7714 {
7715 if (ABI_HAS_64BIT_SYMBOLS)
7716 {
7717 if (TARGET_EXPLICIT_RELOCS)
7718 {
7719 mips_split_p[SYMBOL_64_HIGH] = true;
7720 mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7721 mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7722
7723 mips_split_p[SYMBOL_64_MID] = true;
7724 mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7725 mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7726
7727 mips_split_p[SYMBOL_64_LOW] = true;
7728 mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7729 mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7730
7731 mips_split_p[SYMBOL_ABSOLUTE] = true;
7732 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7733 }
7734 }
7735 else
7736 {
7737 if (TARGET_EXPLICIT_RELOCS
7738 || mips_split_addresses_p ()
7739 || TARGET_MIPS16)
7740 {
7741 mips_split_p[SYMBOL_ABSOLUTE] = true;
7742 mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7743 mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7744 }
7745 }
7746 }
7747
7748 if (TARGET_MIPS16)
7749 {
7750 /* The high part is provided by a pseudo copy of $gp. */
7751 mips_split_p[SYMBOL_GP_RELATIVE] = true;
7752 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7753 }
7754 else if (TARGET_EXPLICIT_RELOCS)
7755 /* Small data constants are kept whole until after reload,
7756 then lowered by mips_rewrite_small_data. */
7757 mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7758
7759 if (TARGET_EXPLICIT_RELOCS)
7760 {
7761 mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7762 if (TARGET_NEWABI)
7763 {
7764 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7765 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7766 }
7767 else
7768 {
7769 mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7770 mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7771 }
7772 if (TARGET_MIPS16)
7773 /* Expose the use of $28 as soon as possible. */
7774 mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7775
7776 if (TARGET_XGOT)
7777 {
7778 /* The HIGH and LO_SUM are matched by special .md patterns. */
7779 mips_split_p[SYMBOL_GOT_DISP] = true;
7780
7781 mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7782 mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7783 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7784
7785 mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7786 mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7787 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7788 }
7789 else
7790 {
7791 if (TARGET_NEWABI)
7792 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7793 else
7794 mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7795 mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7796 if (TARGET_MIPS16)
7797 /* Expose the use of $28 as soon as possible. */
7798 mips_split_p[SYMBOL_GOT_DISP] = true;
7799 }
7800 }
7801
7802 if (TARGET_NEWABI)
7803 {
7804 mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7805 mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7806 mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7807 }
7808
7809 mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7810 mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7811
7812 if (TARGET_MIPS16_PCREL_LOADS)
7813 {
7814 mips_use_pcrel_pool_p[SYMBOL_DTPREL] = true;
7815 mips_use_pcrel_pool_p[SYMBOL_TPREL] = true;
7816 }
7817 else
7818 {
7819 mips_split_p[SYMBOL_DTPREL] = true;
7820 mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7821 mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7822
7823 mips_split_p[SYMBOL_TPREL] = true;
7824 mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7825 mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7826 }
7827
7828 mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7829 mips_lo_relocs[SYMBOL_HALF] = "%half(";
7830 }
7831
7832 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7833 in context CONTEXT. RELOCS is the array of relocations to use. */
7834
7835 static void
7836 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7837 const char **relocs)
7838 {
7839 enum mips_symbol_type symbol_type;
7840 const char *p;
7841
7842 symbol_type = mips_classify_symbolic_expression (op, context);
7843 gcc_assert (relocs[symbol_type]);
7844
7845 fputs (relocs[symbol_type], file);
7846 output_addr_const (file, mips_strip_unspec_address (op));
7847 for (p = relocs[symbol_type]; *p != 0; p++)
7848 if (*p == '(')
7849 fputc (')', file);
7850 }
7851
7852 /* Start a new block with the given asm switch enabled. If we need
7853 to print a directive, emit PREFIX before it and SUFFIX after it. */
7854
7855 static void
7856 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7857 const char *prefix, const char *suffix)
7858 {
7859 if (asm_switch->nesting_level == 0)
7860 fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7861 asm_switch->nesting_level++;
7862 }
7863
7864 /* Likewise, but end a block. */
7865
7866 static void
7867 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7868 const char *prefix, const char *suffix)
7869 {
7870 gcc_assert (asm_switch->nesting_level);
7871 asm_switch->nesting_level--;
7872 if (asm_switch->nesting_level == 0)
7873 fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7874 }
7875
7876 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7877 that either print a complete line or print nothing. */
7878
7879 void
7880 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
7881 {
7882 mips_push_asm_switch_1 (asm_switch, "\t", "\n");
7883 }
7884
7885 void
7886 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
7887 {
7888 mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
7889 }
7890
7891 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
7892 The punctuation characters are:
7893
7894 '(' Start a nested ".set noreorder" block.
7895 ')' End a nested ".set noreorder" block.
7896 '[' Start a nested ".set noat" block.
7897 ']' End a nested ".set noat" block.
7898 '<' Start a nested ".set nomacro" block.
7899 '>' End a nested ".set nomacro" block.
7900 '*' Behave like %(%< if generating a delayed-branch sequence.
7901 '#' Print a nop if in a ".set noreorder" block.
7902 '/' Like '#', but do nothing within a delayed-branch sequence.
7903 '?' Print "l" if mips_branch_likely is true
7904 '~' Print a nop if mips_branch_likely is true
7905 '.' Print the name of the register with a hard-wired zero (zero or $0).
7906 '@' Print the name of the assembler temporary register (at or $1).
7907 '^' Print the name of the pic call-through register (t9 or $25).
7908 '+' Print the name of the gp register (usually gp or $28).
7909 '$' Print the name of the stack pointer register (sp or $29).
7910 ':' Print "c" to use the compact version if the delay slot is a nop.
7911 '!' Print "s" to use the short version if the delay slot contains a
7912 16-bit instruction.
7913
7914 See also mips_init_print_operand_pucnt. */
7915
7916 static void
7917 mips_print_operand_punctuation (FILE *file, int ch)
7918 {
7919 switch (ch)
7920 {
7921 case '(':
7922 mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
7923 break;
7924
7925 case ')':
7926 mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
7927 break;
7928
7929 case '[':
7930 mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
7931 break;
7932
7933 case ']':
7934 mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
7935 break;
7936
7937 case '<':
7938 mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
7939 break;
7940
7941 case '>':
7942 mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
7943 break;
7944
7945 case '*':
7946 if (final_sequence != 0)
7947 {
7948 mips_print_operand_punctuation (file, '(');
7949 mips_print_operand_punctuation (file, '<');
7950 }
7951 break;
7952
7953 case '#':
7954 if (mips_noreorder.nesting_level > 0)
7955 fputs ("\n\tnop", file);
7956 break;
7957
7958 case '/':
7959 /* Print an extra newline so that the delayed insn is separated
7960 from the following ones. This looks neater and is consistent
7961 with non-nop delayed sequences. */
7962 if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
7963 fputs ("\n\tnop\n", file);
7964 break;
7965
7966 case '?':
7967 if (mips_branch_likely)
7968 putc ('l', file);
7969 break;
7970
7971 case '~':
7972 if (mips_branch_likely)
7973 fputs ("\n\tnop", file);
7974 break;
7975
7976 case '.':
7977 fputs (reg_names[GP_REG_FIRST + 0], file);
7978 break;
7979
7980 case '@':
7981 fputs (reg_names[AT_REGNUM], file);
7982 break;
7983
7984 case '^':
7985 fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7986 break;
7987
7988 case '+':
7989 fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7990 break;
7991
7992 case '$':
7993 fputs (reg_names[STACK_POINTER_REGNUM], file);
7994 break;
7995
7996 case ':':
7997 /* When final_sequence is 0, the delay slot will be a nop. We can
7998 use the compact version for microMIPS. */
7999 if (final_sequence == 0)
8000 putc ('c', file);
8001 break;
8002
8003 case '!':
8004 /* If the delay slot instruction is short, then use the
8005 compact version. */
8006 if (final_sequence == 0
8007 || get_attr_length (XVECEXP (final_sequence, 0, 1)) == 2)
8008 putc ('s', file);
8009 break;
8010
8011 default:
8012 gcc_unreachable ();
8013 break;
8014 }
8015 }
8016
8017 /* Initialize mips_print_operand_punct. */
8018
8019 static void
8020 mips_init_print_operand_punct (void)
8021 {
8022 const char *p;
8023
8024 for (p = "()[]<>*#/?~.@^+$:!"; *p; p++)
8025 mips_print_operand_punct[(unsigned char) *p] = true;
8026 }
8027
8028 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
8029 associated with condition CODE. Print the condition part of the
8030 opcode to FILE. */
8031
8032 static void
8033 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
8034 {
8035 switch (code)
8036 {
8037 case EQ:
8038 case NE:
8039 case GT:
8040 case GE:
8041 case LT:
8042 case LE:
8043 case GTU:
8044 case GEU:
8045 case LTU:
8046 case LEU:
8047 /* Conveniently, the MIPS names for these conditions are the same
8048 as their RTL equivalents. */
8049 fputs (GET_RTX_NAME (code), file);
8050 break;
8051
8052 default:
8053 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8054 break;
8055 }
8056 }
8057
8058 /* Likewise floating-point branches. */
8059
8060 static void
8061 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
8062 {
8063 switch (code)
8064 {
8065 case EQ:
8066 fputs ("c1f", file);
8067 break;
8068
8069 case NE:
8070 fputs ("c1t", file);
8071 break;
8072
8073 default:
8074 output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8075 break;
8076 }
8077 }
8078
8079 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8080
8081 static bool
8082 mips_print_operand_punct_valid_p (unsigned char code)
8083 {
8084 return mips_print_operand_punct[code];
8085 }
8086
8087 /* Implement TARGET_PRINT_OPERAND. The MIPS-specific operand codes are:
8088
8089 'X' Print CONST_INT OP in hexadecimal format.
8090 'x' Print the low 16 bits of CONST_INT OP in hexadecimal format.
8091 'd' Print CONST_INT OP in decimal.
8092 'm' Print one less than CONST_INT OP in decimal.
8093 'h' Print the high-part relocation associated with OP, after stripping
8094 any outermost HIGH.
8095 'R' Print the low-part relocation associated with OP.
8096 'C' Print the integer branch condition for comparison OP.
8097 'N' Print the inverse of the integer branch condition for comparison OP.
8098 'F' Print the FPU branch condition for comparison OP.
8099 'W' Print the inverse of the FPU branch condition for comparison OP.
8100 'T' Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
8101 'z' for (eq:?I ...), 'n' for (ne:?I ...).
8102 't' Like 'T', but with the EQ/NE cases reversed
8103 'Y' Print mips_fp_conditions[INTVAL (OP)]
8104 'Z' Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
8105 'q' Print a DSP accumulator register.
8106 'D' Print the second part of a double-word register or memory operand.
8107 'L' Print the low-order register in a double-word register operand.
8108 'M' Print high-order register in a double-word register operand.
8109 'z' Print $0 if OP is zero, otherwise print OP normally.
8110 'b' Print the address of a memory operand, without offset. */
8111
8112 static void
8113 mips_print_operand (FILE *file, rtx op, int letter)
8114 {
8115 enum rtx_code code;
8116
8117 if (mips_print_operand_punct_valid_p (letter))
8118 {
8119 mips_print_operand_punctuation (file, letter);
8120 return;
8121 }
8122
8123 gcc_assert (op);
8124 code = GET_CODE (op);
8125
8126 switch (letter)
8127 {
8128 case 'X':
8129 if (CONST_INT_P (op))
8130 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
8131 else
8132 output_operand_lossage ("invalid use of '%%%c'", letter);
8133 break;
8134
8135 case 'x':
8136 if (CONST_INT_P (op))
8137 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
8138 else
8139 output_operand_lossage ("invalid use of '%%%c'", letter);
8140 break;
8141
8142 case 'd':
8143 if (CONST_INT_P (op))
8144 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
8145 else
8146 output_operand_lossage ("invalid use of '%%%c'", letter);
8147 break;
8148
8149 case 'm':
8150 if (CONST_INT_P (op))
8151 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
8152 else
8153 output_operand_lossage ("invalid use of '%%%c'", letter);
8154 break;
8155
8156 case 'h':
8157 if (code == HIGH)
8158 op = XEXP (op, 0);
8159 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
8160 break;
8161
8162 case 'R':
8163 mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
8164 break;
8165
8166 case 'C':
8167 mips_print_int_branch_condition (file, code, letter);
8168 break;
8169
8170 case 'N':
8171 mips_print_int_branch_condition (file, reverse_condition (code), letter);
8172 break;
8173
8174 case 'F':
8175 mips_print_float_branch_condition (file, code, letter);
8176 break;
8177
8178 case 'W':
8179 mips_print_float_branch_condition (file, reverse_condition (code),
8180 letter);
8181 break;
8182
8183 case 'T':
8184 case 't':
8185 {
8186 int truth = (code == NE) == (letter == 'T');
8187 fputc ("zfnt"[truth * 2 + ST_REG_P (REGNO (XEXP (op, 0)))], file);
8188 }
8189 break;
8190
8191 case 'Y':
8192 if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
8193 fputs (mips_fp_conditions[UINTVAL (op)], file);
8194 else
8195 output_operand_lossage ("'%%%c' is not a valid operand prefix",
8196 letter);
8197 break;
8198
8199 case 'Z':
8200 if (ISA_HAS_8CC)
8201 {
8202 mips_print_operand (file, op, 0);
8203 fputc (',', file);
8204 }
8205 break;
8206
8207 case 'q':
8208 if (code == REG && MD_REG_P (REGNO (op)))
8209 fprintf (file, "$ac0");
8210 else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
8211 fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
8212 else
8213 output_operand_lossage ("invalid use of '%%%c'", letter);
8214 break;
8215
8216 default:
8217 switch (code)
8218 {
8219 case REG:
8220 {
8221 unsigned int regno = REGNO (op);
8222 if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
8223 || (letter == 'L' && TARGET_BIG_ENDIAN)
8224 || letter == 'D')
8225 regno++;
8226 else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
8227 output_operand_lossage ("invalid use of '%%%c'", letter);
8228 /* We need to print $0 .. $31 for COP0 registers. */
8229 if (COP0_REG_P (regno))
8230 fprintf (file, "$%s", &reg_names[regno][4]);
8231 else
8232 fprintf (file, "%s", reg_names[regno]);
8233 }
8234 break;
8235
8236 case MEM:
8237 if (letter == 'D')
8238 output_address (plus_constant (Pmode, XEXP (op, 0), 4));
8239 else if (letter == 'b')
8240 {
8241 gcc_assert (REG_P (XEXP (op, 0)));
8242 mips_print_operand (file, XEXP (op, 0), 0);
8243 }
8244 else if (letter && letter != 'z')
8245 output_operand_lossage ("invalid use of '%%%c'", letter);
8246 else
8247 output_address (XEXP (op, 0));
8248 break;
8249
8250 default:
8251 if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
8252 fputs (reg_names[GP_REG_FIRST], file);
8253 else if (letter && letter != 'z')
8254 output_operand_lossage ("invalid use of '%%%c'", letter);
8255 else if (CONST_GP_P (op))
8256 fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
8257 else
8258 output_addr_const (file, mips_strip_unspec_address (op));
8259 break;
8260 }
8261 }
8262 }
8263
8264 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
8265
8266 static void
8267 mips_print_operand_address (FILE *file, rtx x)
8268 {
8269 struct mips_address_info addr;
8270
8271 if (mips_classify_address (&addr, x, word_mode, true))
8272 switch (addr.type)
8273 {
8274 case ADDRESS_REG:
8275 mips_print_operand (file, addr.offset, 0);
8276 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8277 return;
8278
8279 case ADDRESS_LO_SUM:
8280 mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
8281 mips_lo_relocs);
8282 fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8283 return;
8284
8285 case ADDRESS_CONST_INT:
8286 output_addr_const (file, x);
8287 fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
8288 return;
8289
8290 case ADDRESS_SYMBOLIC:
8291 output_addr_const (file, mips_strip_unspec_address (x));
8292 return;
8293 }
8294 gcc_unreachable ();
8295 }
8296 \f
8297 /* Implement TARGET_ENCODE_SECTION_INFO. */
8298
8299 static void
8300 mips_encode_section_info (tree decl, rtx rtl, int first)
8301 {
8302 default_encode_section_info (decl, rtl, first);
8303
8304 if (TREE_CODE (decl) == FUNCTION_DECL)
8305 {
8306 rtx symbol = XEXP (rtl, 0);
8307 tree type = TREE_TYPE (decl);
8308
8309 /* Encode whether the symbol is short or long. */
8310 if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
8311 || mips_far_type_p (type))
8312 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
8313 }
8314 }
8315
8316 /* Implement TARGET_SELECT_RTX_SECTION. */
8317
8318 static section *
8319 mips_select_rtx_section (enum machine_mode mode, rtx x,
8320 unsigned HOST_WIDE_INT align)
8321 {
8322 /* ??? Consider using mergeable small data sections. */
8323 if (mips_rtx_constant_in_small_data_p (mode))
8324 return get_named_section (NULL, ".sdata", 0);
8325
8326 return default_elf_select_rtx_section (mode, x, align);
8327 }
8328
8329 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
8330
8331 The complication here is that, with the combination TARGET_ABICALLS
8332 && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
8333 absolute addresses, and should therefore not be included in the
8334 read-only part of a DSO. Handle such cases by selecting a normal
8335 data section instead of a read-only one. The logic apes that in
8336 default_function_rodata_section. */
8337
8338 static section *
8339 mips_function_rodata_section (tree decl)
8340 {
8341 if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
8342 return default_function_rodata_section (decl);
8343
8344 if (decl && DECL_SECTION_NAME (decl))
8345 {
8346 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8347 if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
8348 {
8349 char *rname = ASTRDUP (name);
8350 rname[14] = 'd';
8351 return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
8352 }
8353 else if (flag_function_sections
8354 && flag_data_sections
8355 && strncmp (name, ".text.", 6) == 0)
8356 {
8357 char *rname = ASTRDUP (name);
8358 memcpy (rname + 1, "data", 4);
8359 return get_section (rname, SECTION_WRITE, decl);
8360 }
8361 }
8362 return data_section;
8363 }
8364
8365 /* Implement TARGET_IN_SMALL_DATA_P. */
8366
8367 static bool
8368 mips_in_small_data_p (const_tree decl)
8369 {
8370 unsigned HOST_WIDE_INT size;
8371
8372 if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8373 return false;
8374
8375 /* We don't yet generate small-data references for -mabicalls
8376 or VxWorks RTP code. See the related -G handling in
8377 mips_option_override. */
8378 if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8379 return false;
8380
8381 if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8382 {
8383 const char *name;
8384
8385 /* Reject anything that isn't in a known small-data section. */
8386 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8387 if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8388 return false;
8389
8390 /* If a symbol is defined externally, the assembler will use the
8391 usual -G rules when deciding how to implement macros. */
8392 if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
8393 return true;
8394 }
8395 else if (TARGET_EMBEDDED_DATA)
8396 {
8397 /* Don't put constants into the small data section: we want them
8398 to be in ROM rather than RAM. */
8399 if (TREE_CODE (decl) != VAR_DECL)
8400 return false;
8401
8402 if (TREE_READONLY (decl)
8403 && !TREE_SIDE_EFFECTS (decl)
8404 && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8405 return false;
8406 }
8407
8408 /* Enforce -mlocal-sdata. */
8409 if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
8410 return false;
8411
8412 /* Enforce -mextern-sdata. */
8413 if (!TARGET_EXTERN_SDATA && DECL_P (decl))
8414 {
8415 if (DECL_EXTERNAL (decl))
8416 return false;
8417 if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
8418 return false;
8419 }
8420
8421 /* We have traditionally not treated zero-sized objects as small data,
8422 so this is now effectively part of the ABI. */
8423 size = int_size_in_bytes (TREE_TYPE (decl));
8424 return size > 0 && size <= mips_small_data_threshold;
8425 }
8426
8427 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use
8428 anchors for small data: the GP register acts as an anchor in that
8429 case. We also don't want to use them for PC-relative accesses,
8430 where the PC acts as an anchor. */
8431
8432 static bool
8433 mips_use_anchors_for_symbol_p (const_rtx symbol)
8434 {
8435 switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
8436 {
8437 case SYMBOL_PC_RELATIVE:
8438 case SYMBOL_GP_RELATIVE:
8439 return false;
8440
8441 default:
8442 return default_use_anchors_for_symbol_p (symbol);
8443 }
8444 }
8445 \f
8446 /* The MIPS debug format wants all automatic variables and arguments
8447 to be in terms of the virtual frame pointer (stack pointer before
8448 any adjustment in the function), while the MIPS 3.0 linker wants
8449 the frame pointer to be the stack pointer after the initial
8450 adjustment. So, we do the adjustment here. The arg pointer (which
8451 is eliminated) points to the virtual frame pointer, while the frame
8452 pointer (which may be eliminated) points to the stack pointer after
8453 the initial adjustments. */
8454
8455 HOST_WIDE_INT
8456 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
8457 {
8458 rtx offset2 = const0_rtx;
8459 rtx reg = eliminate_constant_term (addr, &offset2);
8460
8461 if (offset == 0)
8462 offset = INTVAL (offset2);
8463
8464 if (reg == stack_pointer_rtx
8465 || reg == frame_pointer_rtx
8466 || reg == hard_frame_pointer_rtx)
8467 {
8468 offset -= cfun->machine->frame.total_size;
8469 if (reg == hard_frame_pointer_rtx)
8470 offset += cfun->machine->frame.hard_frame_pointer_offset;
8471 }
8472
8473 return offset;
8474 }
8475 \f
8476 /* Implement ASM_OUTPUT_EXTERNAL. */
8477
8478 void
8479 mips_output_external (FILE *file, tree decl, const char *name)
8480 {
8481 default_elf_asm_output_external (file, decl, name);
8482
8483 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
8484 set in order to avoid putting out names that are never really
8485 used. */
8486 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
8487 {
8488 if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
8489 {
8490 /* When using assembler macros, emit .extern directives for
8491 all small-data externs so that the assembler knows how
8492 big they are.
8493
8494 In most cases it would be safe (though pointless) to emit
8495 .externs for other symbols too. One exception is when an
8496 object is within the -G limit but declared by the user to
8497 be in a section other than .sbss or .sdata. */
8498 fputs ("\t.extern\t", file);
8499 assemble_name (file, name);
8500 fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
8501 int_size_in_bytes (TREE_TYPE (decl)));
8502 }
8503 }
8504 }
8505
8506 /* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME. */
8507
8508 static void
8509 mips_output_filename (FILE *stream, const char *name)
8510 {
8511 /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
8512 directives. */
8513 if (write_symbols == DWARF2_DEBUG)
8514 return;
8515 else if (mips_output_filename_first_time)
8516 {
8517 mips_output_filename_first_time = 0;
8518 num_source_filenames += 1;
8519 current_function_file = name;
8520 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8521 output_quoted_string (stream, name);
8522 putc ('\n', stream);
8523 }
8524 /* If we are emitting stabs, let dbxout.c handle this (except for
8525 the mips_output_filename_first_time case). */
8526 else if (write_symbols == DBX_DEBUG)
8527 return;
8528 else if (name != current_function_file
8529 && strcmp (name, current_function_file) != 0)
8530 {
8531 num_source_filenames += 1;
8532 current_function_file = name;
8533 fprintf (stream, "\t.file\t%d ", num_source_filenames);
8534 output_quoted_string (stream, name);
8535 putc ('\n', stream);
8536 }
8537 }
8538
8539 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL. */
8540
8541 static void ATTRIBUTE_UNUSED
8542 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
8543 {
8544 switch (size)
8545 {
8546 case 4:
8547 fputs ("\t.dtprelword\t", file);
8548 break;
8549
8550 case 8:
8551 fputs ("\t.dtpreldword\t", file);
8552 break;
8553
8554 default:
8555 gcc_unreachable ();
8556 }
8557 output_addr_const (file, x);
8558 fputs ("+0x8000", file);
8559 }
8560
8561 /* Implement TARGET_DWARF_REGISTER_SPAN. */
8562
8563 static rtx
8564 mips_dwarf_register_span (rtx reg)
8565 {
8566 rtx high, low;
8567 enum machine_mode mode;
8568
8569 /* By default, GCC maps increasing register numbers to increasing
8570 memory locations, but paired FPRs are always little-endian,
8571 regardless of the prevailing endianness. */
8572 mode = GET_MODE (reg);
8573 if (FP_REG_P (REGNO (reg))
8574 && TARGET_BIG_ENDIAN
8575 && MAX_FPRS_PER_FMT > 1
8576 && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8577 {
8578 gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8579 high = mips_subword (reg, true);
8580 low = mips_subword (reg, false);
8581 return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8582 }
8583
8584 return NULL_RTX;
8585 }
8586
8587 /* DSP ALU can bypass data with no delays for the following pairs. */
8588 enum insn_code dspalu_bypass_table[][2] =
8589 {
8590 {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
8591 {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
8592 {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
8593 {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
8594 {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
8595 {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
8596 {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
8597 {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
8598 };
8599
8600 int
8601 mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
8602 {
8603 int i;
8604 int num_bypass = ARRAY_SIZE (dspalu_bypass_table);
8605 enum insn_code out_icode = (enum insn_code) INSN_CODE (out_insn);
8606 enum insn_code in_icode = (enum insn_code) INSN_CODE (in_insn);
8607
8608 for (i = 0; i < num_bypass; i++)
8609 {
8610 if (out_icode == dspalu_bypass_table[i][0]
8611 && in_icode == dspalu_bypass_table[i][1])
8612 return true;
8613 }
8614
8615 return false;
8616 }
8617 /* Implement ASM_OUTPUT_ASCII. */
8618
8619 void
8620 mips_output_ascii (FILE *stream, const char *string, size_t len)
8621 {
8622 size_t i;
8623 int cur_pos;
8624
8625 cur_pos = 17;
8626 fprintf (stream, "\t.ascii\t\"");
8627 for (i = 0; i < len; i++)
8628 {
8629 int c;
8630
8631 c = (unsigned char) string[i];
8632 if (ISPRINT (c))
8633 {
8634 if (c == '\\' || c == '\"')
8635 {
8636 putc ('\\', stream);
8637 cur_pos++;
8638 }
8639 putc (c, stream);
8640 cur_pos++;
8641 }
8642 else
8643 {
8644 fprintf (stream, "\\%03o", c);
8645 cur_pos += 4;
8646 }
8647
8648 if (cur_pos > 72 && i+1 < len)
8649 {
8650 cur_pos = 17;
8651 fprintf (stream, "\"\n\t.ascii\t\"");
8652 }
8653 }
8654 fprintf (stream, "\"\n");
8655 }
8656
8657 /* Return the pseudo-op for full SYMBOL_(D)TPREL address *ADDR.
8658 Update *ADDR with the operand that should be printed. */
8659
8660 const char *
8661 mips_output_tls_reloc_directive (rtx *addr)
8662 {
8663 enum mips_symbol_type type;
8664
8665 type = mips_classify_symbolic_expression (*addr, SYMBOL_CONTEXT_LEA);
8666 *addr = mips_strip_unspec_address (*addr);
8667 switch (type)
8668 {
8669 case SYMBOL_DTPREL:
8670 return Pmode == SImode ? ".dtprelword\t%0" : ".dtpreldword\t%0";
8671
8672 case SYMBOL_TPREL:
8673 return Pmode == SImode ? ".tprelword\t%0" : ".tpreldword\t%0";
8674
8675 default:
8676 gcc_unreachable ();
8677 }
8678 }
8679
8680 /* Emit either a label, .comm, or .lcomm directive. When using assembler
8681 macros, mark the symbol as written so that mips_asm_output_external
8682 won't emit an .extern for it. STREAM is the output file, NAME is the
8683 name of the symbol, INIT_STRING is the string that should be written
8684 before the symbol and FINAL_STRING is the string that should be
8685 written after it. FINAL_STRING is a printf format that consumes the
8686 remaining arguments. */
8687
8688 void
8689 mips_declare_object (FILE *stream, const char *name, const char *init_string,
8690 const char *final_string, ...)
8691 {
8692 va_list ap;
8693
8694 fputs (init_string, stream);
8695 assemble_name (stream, name);
8696 va_start (ap, final_string);
8697 vfprintf (stream, final_string, ap);
8698 va_end (ap);
8699
8700 if (!TARGET_EXPLICIT_RELOCS)
8701 {
8702 tree name_tree = get_identifier (name);
8703 TREE_ASM_WRITTEN (name_tree) = 1;
8704 }
8705 }
8706
8707 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8708 NAME is the name of the object and ALIGN is the required alignment
8709 in bytes. TAKES_ALIGNMENT_P is true if the directive takes a third
8710 alignment argument. */
8711
8712 void
8713 mips_declare_common_object (FILE *stream, const char *name,
8714 const char *init_string,
8715 unsigned HOST_WIDE_INT size,
8716 unsigned int align, bool takes_alignment_p)
8717 {
8718 if (!takes_alignment_p)
8719 {
8720 size += (align / BITS_PER_UNIT) - 1;
8721 size -= size % (align / BITS_PER_UNIT);
8722 mips_declare_object (stream, name, init_string,
8723 "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8724 }
8725 else
8726 mips_declare_object (stream, name, init_string,
8727 "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8728 size, align / BITS_PER_UNIT);
8729 }
8730
8731 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This is usually the same as the
8732 elfos.h version, but we also need to handle -muninit-const-in-rodata. */
8733
8734 void
8735 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8736 unsigned HOST_WIDE_INT size,
8737 unsigned int align)
8738 {
8739 /* If the target wants uninitialized const declarations in
8740 .rdata then don't put them in .comm. */
8741 if (TARGET_EMBEDDED_DATA
8742 && TARGET_UNINIT_CONST_IN_RODATA
8743 && TREE_CODE (decl) == VAR_DECL
8744 && TREE_READONLY (decl)
8745 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8746 {
8747 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8748 targetm.asm_out.globalize_label (stream, name);
8749
8750 switch_to_section (readonly_data_section);
8751 ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8752 mips_declare_object (stream, name, "",
8753 ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8754 size);
8755 }
8756 else
8757 mips_declare_common_object (stream, name, "\n\t.comm\t",
8758 size, align, true);
8759 }
8760
8761 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8762 extern int size_directive_output;
8763
8764 /* Implement ASM_DECLARE_OBJECT_NAME. This is like most of the standard ELF
8765 definitions except that it uses mips_declare_object to emit the label. */
8766
8767 void
8768 mips_declare_object_name (FILE *stream, const char *name,
8769 tree decl ATTRIBUTE_UNUSED)
8770 {
8771 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8772 ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8773 #endif
8774
8775 size_directive_output = 0;
8776 if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8777 {
8778 HOST_WIDE_INT size;
8779
8780 size_directive_output = 1;
8781 size = int_size_in_bytes (TREE_TYPE (decl));
8782 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8783 }
8784
8785 mips_declare_object (stream, name, "", ":\n");
8786 }
8787
8788 /* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
8789
8790 void
8791 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8792 {
8793 const char *name;
8794
8795 name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8796 if (!flag_inhibit_size_directive
8797 && DECL_SIZE (decl) != 0
8798 && !at_end
8799 && top_level
8800 && DECL_INITIAL (decl) == error_mark_node
8801 && !size_directive_output)
8802 {
8803 HOST_WIDE_INT size;
8804
8805 size_directive_output = 1;
8806 size = int_size_in_bytes (TREE_TYPE (decl));
8807 ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8808 }
8809 }
8810 #endif
8811 \f
8812 /* Return the FOO in the name of the ".mdebug.FOO" section associated
8813 with the current ABI. */
8814
8815 static const char *
8816 mips_mdebug_abi_name (void)
8817 {
8818 switch (mips_abi)
8819 {
8820 case ABI_32:
8821 return "abi32";
8822 case ABI_O64:
8823 return "abiO64";
8824 case ABI_N32:
8825 return "abiN32";
8826 case ABI_64:
8827 return "abi64";
8828 case ABI_EABI:
8829 return TARGET_64BIT ? "eabi64" : "eabi32";
8830 default:
8831 gcc_unreachable ();
8832 }
8833 }
8834
8835 /* Implement TARGET_ASM_FILE_START. */
8836
8837 static void
8838 mips_file_start (void)
8839 {
8840 default_file_start ();
8841
8842 /* Generate a special section to describe the ABI switches used to
8843 produce the resultant binary. */
8844
8845 /* Record the ABI itself. Modern versions of binutils encode
8846 this information in the ELF header flags, but GDB needs the
8847 information in order to correctly debug binaries produced by
8848 older binutils. See the function mips_gdbarch_init in
8849 gdb/mips-tdep.c. */
8850 fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8851 mips_mdebug_abi_name ());
8852
8853 /* There is no ELF header flag to distinguish long32 forms of the
8854 EABI from long64 forms. Emit a special section to help tools
8855 such as GDB. Do the same for o64, which is sometimes used with
8856 -mlong64. */
8857 if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8858 fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8859 "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8860
8861 /* Record the NaN encoding. */
8862 if (HAVE_AS_NAN || mips_nan != MIPS_IEEE_754_DEFAULT)
8863 fprintf (asm_out_file, "\t.nan\t%s\n",
8864 mips_nan == MIPS_IEEE_754_2008 ? "2008" : "legacy");
8865
8866 #ifdef HAVE_AS_GNU_ATTRIBUTE
8867 {
8868 int attr;
8869
8870 /* No floating-point operations, -mno-float. */
8871 if (TARGET_NO_FLOAT)
8872 attr = 0;
8873 /* Soft-float code, -msoft-float. */
8874 else if (!TARGET_HARD_FLOAT_ABI)
8875 attr = 3;
8876 /* Single-float code, -msingle-float. */
8877 else if (!TARGET_DOUBLE_FLOAT)
8878 attr = 2;
8879 /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64. */
8880 else if (!TARGET_64BIT && TARGET_FLOAT64)
8881 attr = 4;
8882 /* Regular FP code, FP regs same size as GP regs, -mdouble-float. */
8883 else
8884 attr = 1;
8885
8886 fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
8887 }
8888 #endif
8889
8890 /* If TARGET_ABICALLS, tell GAS to generate -KPIC code. */
8891 if (TARGET_ABICALLS)
8892 {
8893 fprintf (asm_out_file, "\t.abicalls\n");
8894 if (TARGET_ABICALLS_PIC0)
8895 fprintf (asm_out_file, "\t.option\tpic0\n");
8896 }
8897
8898 if (flag_verbose_asm)
8899 fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
8900 ASM_COMMENT_START,
8901 mips_small_data_threshold, mips_arch_info->name, mips_isa);
8902 }
8903
8904 /* Implement TARGET_ASM_CODE_END. */
8905
8906 static void
8907 mips_code_end (void)
8908 {
8909 if (mips_need_mips16_rdhwr_p)
8910 mips_output_mips16_rdhwr ();
8911 }
8912 \f
8913 /* Make the last instruction frame-related and note that it performs
8914 the operation described by FRAME_PATTERN. */
8915
8916 static void
8917 mips_set_frame_expr (rtx frame_pattern)
8918 {
8919 rtx insn;
8920
8921 insn = get_last_insn ();
8922 RTX_FRAME_RELATED_P (insn) = 1;
8923 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8924 frame_pattern,
8925 REG_NOTES (insn));
8926 }
8927
8928 /* Return a frame-related rtx that stores REG at MEM.
8929 REG must be a single register. */
8930
8931 static rtx
8932 mips_frame_set (rtx mem, rtx reg)
8933 {
8934 rtx set;
8935
8936 set = gen_rtx_SET (VOIDmode, mem, reg);
8937 RTX_FRAME_RELATED_P (set) = 1;
8938
8939 return set;
8940 }
8941
8942 /* Record that the epilogue has restored call-saved register REG. */
8943
8944 static void
8945 mips_add_cfa_restore (rtx reg)
8946 {
8947 mips_epilogue.cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
8948 mips_epilogue.cfa_restores);
8949 }
8950 \f
8951 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
8952 mips16e_s2_s8_regs[X], it must also save the registers in indexes
8953 X + 1 onwards. Likewise mips16e_a0_a3_regs. */
8954 static const unsigned char mips16e_s2_s8_regs[] = {
8955 30, 23, 22, 21, 20, 19, 18
8956 };
8957 static const unsigned char mips16e_a0_a3_regs[] = {
8958 4, 5, 6, 7
8959 };
8960
8961 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
8962 ordered from the uppermost in memory to the lowest in memory. */
8963 static const unsigned char mips16e_save_restore_regs[] = {
8964 31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
8965 };
8966
8967 /* Return the index of the lowest X in the range [0, SIZE) for which
8968 bit REGS[X] is set in MASK. Return SIZE if there is no such X. */
8969
8970 static unsigned int
8971 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
8972 unsigned int size)
8973 {
8974 unsigned int i;
8975
8976 for (i = 0; i < size; i++)
8977 if (BITSET_P (mask, regs[i]))
8978 break;
8979
8980 return i;
8981 }
8982
8983 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
8984 is the number of set bits. If *MASK_PTR contains REGS[X] for some X
8985 in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
8986 is true for all indexes (X, SIZE). */
8987
8988 static void
8989 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
8990 unsigned int size, unsigned int *num_regs_ptr)
8991 {
8992 unsigned int i;
8993
8994 i = mips16e_find_first_register (*mask_ptr, regs, size);
8995 for (i++; i < size; i++)
8996 if (!BITSET_P (*mask_ptr, regs[i]))
8997 {
8998 *num_regs_ptr += 1;
8999 *mask_ptr |= 1 << regs[i];
9000 }
9001 }
9002
9003 /* Return a simplified form of X using the register values in REG_VALUES.
9004 REG_VALUES[R] is the last value assigned to hard register R, or null
9005 if R has not been modified.
9006
9007 This function is rather limited, but is good enough for our purposes. */
9008
9009 static rtx
9010 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
9011 {
9012 x = avoid_constant_pool_reference (x);
9013
9014 if (UNARY_P (x))
9015 {
9016 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9017 return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
9018 x0, GET_MODE (XEXP (x, 0)));
9019 }
9020
9021 if (ARITHMETIC_P (x))
9022 {
9023 rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9024 rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
9025 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
9026 }
9027
9028 if (REG_P (x)
9029 && reg_values[REGNO (x)]
9030 && !rtx_unstable_p (reg_values[REGNO (x)]))
9031 return reg_values[REGNO (x)];
9032
9033 return x;
9034 }
9035
9036 /* Return true if (set DEST SRC) stores an argument register into its
9037 caller-allocated save slot, storing the number of that argument
9038 register in *REGNO_PTR if so. REG_VALUES is as for
9039 mips16e_collect_propagate_value. */
9040
9041 static bool
9042 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
9043 unsigned int *regno_ptr)
9044 {
9045 unsigned int argno, regno;
9046 HOST_WIDE_INT offset, required_offset;
9047 rtx addr, base;
9048
9049 /* Check that this is a word-mode store. */
9050 if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
9051 return false;
9052
9053 /* Check that the register being saved is an unmodified argument
9054 register. */
9055 regno = REGNO (src);
9056 if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
9057 return false;
9058 argno = regno - GP_ARG_FIRST;
9059
9060 /* Check whether the address is an appropriate stack-pointer or
9061 frame-pointer access. */
9062 addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
9063 mips_split_plus (addr, &base, &offset);
9064 required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
9065 if (base == hard_frame_pointer_rtx)
9066 required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
9067 else if (base != stack_pointer_rtx)
9068 return false;
9069 if (offset != required_offset)
9070 return false;
9071
9072 *regno_ptr = regno;
9073 return true;
9074 }
9075
9076 /* A subroutine of mips_expand_prologue, called only when generating
9077 MIPS16e SAVE instructions. Search the start of the function for any
9078 instructions that save argument registers into their caller-allocated
9079 save slots. Delete such instructions and return a value N such that
9080 saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
9081 instructions redundant. */
9082
9083 static unsigned int
9084 mips16e_collect_argument_saves (void)
9085 {
9086 rtx reg_values[FIRST_PSEUDO_REGISTER];
9087 rtx insn, next, set, dest, src;
9088 unsigned int nargs, regno;
9089
9090 push_topmost_sequence ();
9091 nargs = 0;
9092 memset (reg_values, 0, sizeof (reg_values));
9093 for (insn = get_insns (); insn; insn = next)
9094 {
9095 next = NEXT_INSN (insn);
9096 if (NOTE_P (insn) || DEBUG_INSN_P (insn))
9097 continue;
9098
9099 if (!INSN_P (insn))
9100 break;
9101
9102 set = PATTERN (insn);
9103 if (GET_CODE (set) != SET)
9104 break;
9105
9106 dest = SET_DEST (set);
9107 src = SET_SRC (set);
9108 if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
9109 {
9110 if (!BITSET_P (cfun->machine->frame.mask, regno))
9111 {
9112 delete_insn (insn);
9113 nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
9114 }
9115 }
9116 else if (REG_P (dest) && GET_MODE (dest) == word_mode)
9117 reg_values[REGNO (dest)]
9118 = mips16e_collect_propagate_value (src, reg_values);
9119 else
9120 break;
9121 }
9122 pop_topmost_sequence ();
9123
9124 return nargs;
9125 }
9126
9127 /* Return a move between register REGNO and memory location SP + OFFSET.
9128 REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
9129 Make the move a load if RESTORE_P, otherwise make it a store. */
9130
9131 static rtx
9132 mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
9133 HOST_WIDE_INT offset, unsigned int regno)
9134 {
9135 rtx reg, mem;
9136
9137 mem = gen_frame_mem (SImode, plus_constant (Pmode, stack_pointer_rtx,
9138 offset));
9139 reg = gen_rtx_REG (SImode, regno);
9140 if (restore_p)
9141 {
9142 mips_add_cfa_restore (reg);
9143 return gen_rtx_SET (VOIDmode, reg, mem);
9144 }
9145 if (reg_parm_p)
9146 return gen_rtx_SET (VOIDmode, mem, reg);
9147 return mips_frame_set (mem, reg);
9148 }
9149
9150 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
9151 The instruction must:
9152
9153 - Allocate or deallocate SIZE bytes in total; SIZE is known
9154 to be nonzero.
9155
9156 - Save or restore as many registers in *MASK_PTR as possible.
9157 The instruction saves the first registers at the top of the
9158 allocated area, with the other registers below it.
9159
9160 - Save NARGS argument registers above the allocated area.
9161
9162 (NARGS is always zero if RESTORE_P.)
9163
9164 The SAVE and RESTORE instructions cannot save and restore all general
9165 registers, so there may be some registers left over for the caller to
9166 handle. Destructively modify *MASK_PTR so that it contains the registers
9167 that still need to be saved or restored. The caller can save these
9168 registers in the memory immediately below *OFFSET_PTR, which is a
9169 byte offset from the bottom of the allocated stack area. */
9170
9171 static rtx
9172 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
9173 HOST_WIDE_INT *offset_ptr, unsigned int nargs,
9174 HOST_WIDE_INT size)
9175 {
9176 rtx pattern, set;
9177 HOST_WIDE_INT offset, top_offset;
9178 unsigned int i, regno;
9179 int n;
9180
9181 gcc_assert (cfun->machine->frame.num_fp == 0);
9182
9183 /* Calculate the number of elements in the PARALLEL. We need one element
9184 for the stack adjustment, one for each argument register save, and one
9185 for each additional register move. */
9186 n = 1 + nargs;
9187 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9188 if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
9189 n++;
9190
9191 /* Create the final PARALLEL. */
9192 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
9193 n = 0;
9194
9195 /* Add the stack pointer adjustment. */
9196 set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9197 plus_constant (Pmode, stack_pointer_rtx,
9198 restore_p ? size : -size));
9199 RTX_FRAME_RELATED_P (set) = 1;
9200 XVECEXP (pattern, 0, n++) = set;
9201
9202 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9203 top_offset = restore_p ? size : 0;
9204
9205 /* Save the arguments. */
9206 for (i = 0; i < nargs; i++)
9207 {
9208 offset = top_offset + i * UNITS_PER_WORD;
9209 set = mips16e_save_restore_reg (restore_p, true, offset,
9210 GP_ARG_FIRST + i);
9211 XVECEXP (pattern, 0, n++) = set;
9212 }
9213
9214 /* Then fill in the other register moves. */
9215 offset = top_offset;
9216 for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9217 {
9218 regno = mips16e_save_restore_regs[i];
9219 if (BITSET_P (*mask_ptr, regno))
9220 {
9221 offset -= UNITS_PER_WORD;
9222 set = mips16e_save_restore_reg (restore_p, false, offset, regno);
9223 XVECEXP (pattern, 0, n++) = set;
9224 *mask_ptr &= ~(1 << regno);
9225 }
9226 }
9227
9228 /* Tell the caller what offset it should use for the remaining registers. */
9229 *offset_ptr = size + (offset - top_offset);
9230
9231 gcc_assert (n == XVECLEN (pattern, 0));
9232
9233 return pattern;
9234 }
9235
9236 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
9237 pointer. Return true if PATTERN matches the kind of instruction
9238 generated by mips16e_build_save_restore. If INFO is nonnull,
9239 initialize it when returning true. */
9240
9241 bool
9242 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
9243 struct mips16e_save_restore_info *info)
9244 {
9245 unsigned int i, nargs, mask, extra;
9246 HOST_WIDE_INT top_offset, save_offset, offset;
9247 rtx set, reg, mem, base;
9248 int n;
9249
9250 if (!GENERATE_MIPS16E_SAVE_RESTORE)
9251 return false;
9252
9253 /* Stack offsets in the PARALLEL are relative to the old stack pointer. */
9254 top_offset = adjust > 0 ? adjust : 0;
9255
9256 /* Interpret all other members of the PARALLEL. */
9257 save_offset = top_offset - UNITS_PER_WORD;
9258 mask = 0;
9259 nargs = 0;
9260 i = 0;
9261 for (n = 1; n < XVECLEN (pattern, 0); n++)
9262 {
9263 /* Check that we have a SET. */
9264 set = XVECEXP (pattern, 0, n);
9265 if (GET_CODE (set) != SET)
9266 return false;
9267
9268 /* Check that the SET is a load (if restoring) or a store
9269 (if saving). */
9270 mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
9271 if (!MEM_P (mem))
9272 return false;
9273
9274 /* Check that the address is the sum of the stack pointer and a
9275 possibly-zero constant offset. */
9276 mips_split_plus (XEXP (mem, 0), &base, &offset);
9277 if (base != stack_pointer_rtx)
9278 return false;
9279
9280 /* Check that SET's other operand is a register. */
9281 reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
9282 if (!REG_P (reg))
9283 return false;
9284
9285 /* Check for argument saves. */
9286 if (offset == top_offset + nargs * UNITS_PER_WORD
9287 && REGNO (reg) == GP_ARG_FIRST + nargs)
9288 nargs++;
9289 else if (offset == save_offset)
9290 {
9291 while (mips16e_save_restore_regs[i++] != REGNO (reg))
9292 if (i == ARRAY_SIZE (mips16e_save_restore_regs))
9293 return false;
9294
9295 mask |= 1 << REGNO (reg);
9296 save_offset -= UNITS_PER_WORD;
9297 }
9298 else
9299 return false;
9300 }
9301
9302 /* Check that the restrictions on register ranges are met. */
9303 extra = 0;
9304 mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
9305 ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
9306 mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
9307 ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
9308 if (extra != 0)
9309 return false;
9310
9311 /* Make sure that the topmost argument register is not saved twice.
9312 The checks above ensure that the same is then true for the other
9313 argument registers. */
9314 if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
9315 return false;
9316
9317 /* Pass back information, if requested. */
9318 if (info)
9319 {
9320 info->nargs = nargs;
9321 info->mask = mask;
9322 info->size = (adjust > 0 ? adjust : -adjust);
9323 }
9324
9325 return true;
9326 }
9327
9328 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
9329 for the register range [MIN_REG, MAX_REG]. Return a pointer to
9330 the null terminator. */
9331
9332 static char *
9333 mips16e_add_register_range (char *s, unsigned int min_reg,
9334 unsigned int max_reg)
9335 {
9336 if (min_reg != max_reg)
9337 s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
9338 else
9339 s += sprintf (s, ",%s", reg_names[min_reg]);
9340 return s;
9341 }
9342
9343 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
9344 PATTERN and ADJUST are as for mips16e_save_restore_pattern_p. */
9345
9346 const char *
9347 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
9348 {
9349 static char buffer[300];
9350
9351 struct mips16e_save_restore_info info;
9352 unsigned int i, end;
9353 char *s;
9354
9355 /* Parse the pattern. */
9356 if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
9357 gcc_unreachable ();
9358
9359 /* Add the mnemonic. */
9360 s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
9361 s += strlen (s);
9362
9363 /* Save the arguments. */
9364 if (info.nargs > 1)
9365 s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
9366 reg_names[GP_ARG_FIRST + info.nargs - 1]);
9367 else if (info.nargs == 1)
9368 s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
9369
9370 /* Emit the amount of stack space to allocate or deallocate. */
9371 s += sprintf (s, "%d", (int) info.size);
9372
9373 /* Save or restore $16. */
9374 if (BITSET_P (info.mask, 16))
9375 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
9376
9377 /* Save or restore $17. */
9378 if (BITSET_P (info.mask, 17))
9379 s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
9380
9381 /* Save or restore registers in the range $s2...$s8, which
9382 mips16e_s2_s8_regs lists in decreasing order. Note that this
9383 is a software register range; the hardware registers are not
9384 numbered consecutively. */
9385 end = ARRAY_SIZE (mips16e_s2_s8_regs);
9386 i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
9387 if (i < end)
9388 s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
9389 mips16e_s2_s8_regs[i]);
9390
9391 /* Save or restore registers in the range $a0...$a3. */
9392 end = ARRAY_SIZE (mips16e_a0_a3_regs);
9393 i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
9394 if (i < end)
9395 s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
9396 mips16e_a0_a3_regs[end - 1]);
9397
9398 /* Save or restore $31. */
9399 if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
9400 s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
9401
9402 return buffer;
9403 }
9404 \f
9405 /* Return true if the current function returns its value in a floating-point
9406 register in MIPS16 mode. */
9407
9408 static bool
9409 mips16_cfun_returns_in_fpr_p (void)
9410 {
9411 tree return_type = DECL_RESULT (current_function_decl);
9412 return (TARGET_MIPS16
9413 && TARGET_HARD_FLOAT_ABI
9414 && !aggregate_value_p (return_type, current_function_decl)
9415 && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
9416 }
9417
9418 /* Return true if predicate PRED is true for at least one instruction.
9419 Cache the result in *CACHE, and assume that the result is true
9420 if *CACHE is already true. */
9421
9422 static bool
9423 mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
9424 {
9425 rtx insn;
9426
9427 if (!*cache)
9428 {
9429 push_topmost_sequence ();
9430 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9431 if (USEFUL_INSN_P (insn) && pred (insn))
9432 {
9433 *cache = true;
9434 break;
9435 }
9436 pop_topmost_sequence ();
9437 }
9438 return *cache;
9439 }
9440
9441 /* Return true if INSN refers to the global pointer in an "inflexible" way.
9442 See mips_cfun_has_inflexible_gp_ref_p for details. */
9443
9444 static bool
9445 mips_insn_has_inflexible_gp_ref_p (rtx insn)
9446 {
9447 /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
9448 indicate that the target could be a traditional MIPS
9449 lazily-binding stub. */
9450 return find_reg_fusage (insn, USE, pic_offset_table_rtx);
9451 }
9452
9453 /* Return true if the current function refers to the global pointer
9454 in a way that forces $28 to be valid. This means that we can't
9455 change the choice of global pointer, even for NewABI code.
9456
9457 One example of this (and one which needs several checks) is that
9458 $28 must be valid when calling traditional MIPS lazy-binding stubs.
9459 (This restriction does not apply to PLTs.) */
9460
9461 static bool
9462 mips_cfun_has_inflexible_gp_ref_p (void)
9463 {
9464 /* If the function has a nonlocal goto, $28 must hold the correct
9465 global pointer for the target function. That is, the target
9466 of the goto implicitly uses $28. */
9467 if (crtl->has_nonlocal_goto)
9468 return true;
9469
9470 if (TARGET_ABICALLS_PIC2)
9471 {
9472 /* Symbolic accesses implicitly use the global pointer unless
9473 -mexplicit-relocs is in effect. JAL macros to symbolic addresses
9474 might go to traditional MIPS lazy-binding stubs. */
9475 if (!TARGET_EXPLICIT_RELOCS)
9476 return true;
9477
9478 /* FUNCTION_PROFILER includes a JAL to _mcount, which again
9479 can be lazily-bound. */
9480 if (crtl->profile)
9481 return true;
9482
9483 /* MIPS16 functions that return in FPRs need to call an
9484 external libgcc routine. This call is only made explict
9485 during mips_expand_epilogue, and it too might be lazily bound. */
9486 if (mips16_cfun_returns_in_fpr_p ())
9487 return true;
9488 }
9489
9490 return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
9491 mips_insn_has_inflexible_gp_ref_p);
9492 }
9493
9494 /* Return true if INSN refers to the global pointer in a "flexible" way.
9495 See mips_cfun_has_flexible_gp_ref_p for details. */
9496
9497 static bool
9498 mips_insn_has_flexible_gp_ref_p (rtx insn)
9499 {
9500 return (get_attr_got (insn) != GOT_UNSET
9501 || mips_small_data_pattern_p (PATTERN (insn))
9502 || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
9503 }
9504
9505 /* Return true if the current function references the global pointer,
9506 but if those references do not inherently require the global pointer
9507 to be $28. Assume !mips_cfun_has_inflexible_gp_ref_p (). */
9508
9509 static bool
9510 mips_cfun_has_flexible_gp_ref_p (void)
9511 {
9512 /* Reload can sometimes introduce constant pool references
9513 into a function that otherwise didn't need them. For example,
9514 suppose we have an instruction like:
9515
9516 (set (reg:DF R1) (float:DF (reg:SI R2)))
9517
9518 If R2 turns out to be a constant such as 1, the instruction may
9519 have a REG_EQUAL note saying that R1 == 1.0. Reload then has
9520 the option of using this constant if R2 doesn't get allocated
9521 to a register.
9522
9523 In cases like these, reload will have added the constant to the
9524 pool but no instruction will yet refer to it. */
9525 if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
9526 return true;
9527
9528 return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
9529 mips_insn_has_flexible_gp_ref_p);
9530 }
9531
9532 /* Return the register that should be used as the global pointer
9533 within this function. Return INVALID_REGNUM if the function
9534 doesn't need a global pointer. */
9535
9536 static unsigned int
9537 mips_global_pointer (void)
9538 {
9539 unsigned int regno;
9540
9541 /* $gp is always available unless we're using a GOT. */
9542 if (!TARGET_USE_GOT)
9543 return GLOBAL_POINTER_REGNUM;
9544
9545 /* If there are inflexible references to $gp, we must use the
9546 standard register. */
9547 if (mips_cfun_has_inflexible_gp_ref_p ())
9548 return GLOBAL_POINTER_REGNUM;
9549
9550 /* If there are no current references to $gp, then the only uses
9551 we can introduce later are those involved in long branches. */
9552 if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
9553 return INVALID_REGNUM;
9554
9555 /* If the global pointer is call-saved, try to use a call-clobbered
9556 alternative. */
9557 if (TARGET_CALL_SAVED_GP && crtl->is_leaf)
9558 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9559 if (!df_regs_ever_live_p (regno)
9560 && call_really_used_regs[regno]
9561 && !fixed_regs[regno]
9562 && regno != PIC_FUNCTION_ADDR_REGNUM)
9563 return regno;
9564
9565 return GLOBAL_POINTER_REGNUM;
9566 }
9567
9568 /* Return true if the current function's prologue must load the global
9569 pointer value into pic_offset_table_rtx and store the same value in
9570 the function's cprestore slot (if any).
9571
9572 One problem we have to deal with is that, when emitting GOT-based
9573 position independent code, long-branch sequences will need to load
9574 the address of the branch target from the GOT. We don't know until
9575 the very end of compilation whether (and where) the function needs
9576 long branches, so we must ensure that _any_ branch can access the
9577 global pointer in some form. However, we do not want to pessimize
9578 the usual case in which all branches are short.
9579
9580 We handle this as follows:
9581
9582 (1) During reload, we set cfun->machine->global_pointer to
9583 INVALID_REGNUM if we _know_ that the current function
9584 doesn't need a global pointer. This is only valid if
9585 long branches don't need the GOT.
9586
9587 Otherwise, we assume that we might need a global pointer
9588 and pick an appropriate register.
9589
9590 (2) If cfun->machine->global_pointer != INVALID_REGNUM,
9591 we ensure that the global pointer is available at every
9592 block boundary bar entry and exit. We do this in one of two ways:
9593
9594 - If the function has a cprestore slot, we ensure that this
9595 slot is valid at every branch. However, as explained in
9596 point (6) below, there is no guarantee that pic_offset_table_rtx
9597 itself is valid if new uses of the global pointer are introduced
9598 after the first post-epilogue split.
9599
9600 We guarantee that the cprestore slot is valid by loading it
9601 into a fake register, CPRESTORE_SLOT_REGNUM. We then make
9602 this register live at every block boundary bar function entry
9603 and exit. It is then invalid to move the load (and thus the
9604 preceding store) across a block boundary.
9605
9606 - If the function has no cprestore slot, we guarantee that
9607 pic_offset_table_rtx itself is valid at every branch.
9608
9609 See mips_eh_uses for the handling of the register liveness.
9610
9611 (3) During prologue and epilogue generation, we emit "ghost"
9612 placeholder instructions to manipulate the global pointer.
9613
9614 (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
9615 and cfun->machine->must_restore_gp_when_clobbered_p if we already know
9616 that the function needs a global pointer. (There is no need to set
9617 them earlier than this, and doing it as late as possible leads to
9618 fewer false positives.)
9619
9620 (5) If cfun->machine->must_initialize_gp_p is true during a
9621 split_insns pass, we split the ghost instructions into real
9622 instructions. These split instructions can then be optimized in
9623 the usual way. Otherwise, we keep the ghost instructions intact,
9624 and optimize for the case where they aren't needed. We still
9625 have the option of splitting them later, if we need to introduce
9626 new uses of the global pointer.
9627
9628 For example, the scheduler ignores a ghost instruction that
9629 stores $28 to the stack, but it handles the split form of
9630 the ghost instruction as an ordinary store.
9631
9632 (6) [OldABI only.] If cfun->machine->must_restore_gp_when_clobbered_p
9633 is true during the first post-epilogue split_insns pass, we split
9634 calls and restore_gp patterns into instructions that explicitly
9635 load pic_offset_table_rtx from the cprestore slot. Otherwise,
9636 we split these patterns into instructions that _don't_ load from
9637 the cprestore slot.
9638
9639 If cfun->machine->must_restore_gp_when_clobbered_p is true at the
9640 time of the split, then any instructions that exist at that time
9641 can make free use of pic_offset_table_rtx. However, if we want
9642 to introduce new uses of the global pointer after the split,
9643 we must explicitly load the value from the cprestore slot, since
9644 pic_offset_table_rtx itself might not be valid at a given point
9645 in the function.
9646
9647 The idea is that we want to be able to delete redundant
9648 loads from the cprestore slot in the usual case where no
9649 long branches are needed.
9650
9651 (7) If cfun->machine->must_initialize_gp_p is still false at the end
9652 of md_reorg, we decide whether the global pointer is needed for
9653 long branches. If so, we set cfun->machine->must_initialize_gp_p
9654 to true and split the ghost instructions into real instructions
9655 at that stage.
9656
9657 Note that the ghost instructions must have a zero length for three reasons:
9658
9659 - Giving the length of the underlying $gp sequence might cause
9660 us to use long branches in cases where they aren't really needed.
9661
9662 - They would perturb things like alignment calculations.
9663
9664 - More importantly, the hazard detection in md_reorg relies on
9665 empty instructions having a zero length.
9666
9667 If we find a long branch and split the ghost instructions at the
9668 end of md_reorg, the split could introduce more long branches.
9669 That isn't a problem though, because we still do the split before
9670 the final shorten_branches pass.
9671
9672 This is extremely ugly, but it seems like the best compromise between
9673 correctness and efficiency. */
9674
9675 bool
9676 mips_must_initialize_gp_p (void)
9677 {
9678 return cfun->machine->must_initialize_gp_p;
9679 }
9680
9681 /* Return true if REGNO is a register that is ordinarily call-clobbered
9682 but must nevertheless be preserved by an interrupt handler. */
9683
9684 static bool
9685 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
9686 {
9687 if (MD_REG_P (regno))
9688 return true;
9689
9690 if (TARGET_DSP && DSP_ACC_REG_P (regno))
9691 return true;
9692
9693 if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
9694 {
9695 /* $0 is hard-wired. */
9696 if (regno == GP_REG_FIRST)
9697 return false;
9698
9699 /* The interrupt handler can treat kernel registers as
9700 scratch registers. */
9701 if (KERNEL_REG_P (regno))
9702 return false;
9703
9704 /* The function will return the stack pointer to its original value
9705 anyway. */
9706 if (regno == STACK_POINTER_REGNUM)
9707 return false;
9708
9709 /* Otherwise, return true for registers that aren't ordinarily
9710 call-clobbered. */
9711 return call_really_used_regs[regno];
9712 }
9713
9714 return false;
9715 }
9716
9717 /* Return true if the current function should treat register REGNO
9718 as call-saved. */
9719
9720 static bool
9721 mips_cfun_call_saved_reg_p (unsigned int regno)
9722 {
9723 /* If the user makes an ordinarily-call-saved register global,
9724 that register is no longer call-saved. */
9725 if (global_regs[regno])
9726 return false;
9727
9728 /* Interrupt handlers need to save extra registers. */
9729 if (cfun->machine->interrupt_handler_p
9730 && mips_interrupt_extra_call_saved_reg_p (regno))
9731 return true;
9732
9733 /* call_insns preserve $28 unless they explicitly say otherwise,
9734 so call_really_used_regs[] treats $28 as call-saved. However,
9735 we want the ABI property rather than the default call_insn
9736 property here. */
9737 return (regno == GLOBAL_POINTER_REGNUM
9738 ? TARGET_CALL_SAVED_GP
9739 : !call_really_used_regs[regno]);
9740 }
9741
9742 /* Return true if the function body might clobber register REGNO.
9743 We know that REGNO is call-saved. */
9744
9745 static bool
9746 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9747 {
9748 /* Some functions should be treated as clobbering all call-saved
9749 registers. */
9750 if (crtl->saves_all_registers)
9751 return true;
9752
9753 /* DF handles cases where a register is explicitly referenced in
9754 the rtl. Incoming values are passed in call-clobbered registers,
9755 so we can assume that any live call-saved register is set within
9756 the function. */
9757 if (df_regs_ever_live_p (regno))
9758 return true;
9759
9760 /* Check for registers that are clobbered by FUNCTION_PROFILER.
9761 These clobbers are not explicit in the rtl. */
9762 if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9763 return true;
9764
9765 /* If we're using a call-saved global pointer, the function's
9766 prologue will need to set it up. */
9767 if (cfun->machine->global_pointer == regno)
9768 return true;
9769
9770 /* The function's prologue will need to set the frame pointer if
9771 frame_pointer_needed. */
9772 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9773 return true;
9774
9775 /* If a MIPS16 function returns a value in FPRs, its epilogue
9776 will need to call an external libgcc routine. This yet-to-be
9777 generated call_insn will clobber $31. */
9778 if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9779 return true;
9780
9781 /* If REGNO is ordinarily call-clobbered, we must assume that any
9782 called function could modify it. */
9783 if (cfun->machine->interrupt_handler_p
9784 && !crtl->is_leaf
9785 && mips_interrupt_extra_call_saved_reg_p (regno))
9786 return true;
9787
9788 return false;
9789 }
9790
9791 /* Return true if the current function must save register REGNO. */
9792
9793 static bool
9794 mips_save_reg_p (unsigned int regno)
9795 {
9796 if (mips_cfun_call_saved_reg_p (regno))
9797 {
9798 if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9799 return true;
9800
9801 /* Save both registers in an FPR pair if either one is used. This is
9802 needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9803 register to be used without the even register. */
9804 if (FP_REG_P (regno)
9805 && MAX_FPRS_PER_FMT == 2
9806 && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9807 return true;
9808 }
9809
9810 /* We need to save the incoming return address if __builtin_eh_return
9811 is being used to set a different return address. */
9812 if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9813 return true;
9814
9815 return false;
9816 }
9817
9818 /* Populate the current function's mips_frame_info structure.
9819
9820 MIPS stack frames look like:
9821
9822 +-------------------------------+
9823 | |
9824 | incoming stack arguments |
9825 | |
9826 +-------------------------------+
9827 | |
9828 | caller-allocated save area |
9829 A | for register arguments |
9830 | |
9831 +-------------------------------+ <-- incoming stack pointer
9832 | |
9833 | callee-allocated save area |
9834 B | for arguments that are |
9835 | split between registers and |
9836 | the stack |
9837 | |
9838 +-------------------------------+ <-- arg_pointer_rtx
9839 | |
9840 C | callee-allocated save area |
9841 | for register varargs |
9842 | |
9843 +-------------------------------+ <-- frame_pointer_rtx
9844 | | + cop0_sp_offset
9845 | COP0 reg save area | + UNITS_PER_WORD
9846 | |
9847 +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9848 | | + UNITS_PER_WORD
9849 | accumulator save area |
9850 | |
9851 +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9852 | | + UNITS_PER_HWFPVALUE
9853 | FPR save area |
9854 | |
9855 +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9856 | | + UNITS_PER_WORD
9857 | GPR save area |
9858 | |
9859 +-------------------------------+ <-- frame_pointer_rtx with
9860 | | \ -fstack-protector
9861 | local variables | | var_size
9862 | | /
9863 +-------------------------------+
9864 | | \
9865 | $gp save area | | cprestore_size
9866 | | /
9867 P +-------------------------------+ <-- hard_frame_pointer_rtx for
9868 | | \ MIPS16 code
9869 | outgoing stack arguments | |
9870 | | |
9871 +-------------------------------+ | args_size
9872 | | |
9873 | caller-allocated save area | |
9874 | for register arguments | |
9875 | | /
9876 +-------------------------------+ <-- stack_pointer_rtx
9877 frame_pointer_rtx without
9878 -fstack-protector
9879 hard_frame_pointer_rtx for
9880 non-MIPS16 code.
9881
9882 At least two of A, B and C will be empty.
9883
9884 Dynamic stack allocations such as alloca insert data at point P.
9885 They decrease stack_pointer_rtx but leave frame_pointer_rtx and
9886 hard_frame_pointer_rtx unchanged. */
9887
9888 static void
9889 mips_compute_frame_info (void)
9890 {
9891 struct mips_frame_info *frame;
9892 HOST_WIDE_INT offset, size;
9893 unsigned int regno, i;
9894
9895 /* Set this function's interrupt properties. */
9896 if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
9897 {
9898 if (!ISA_MIPS32R2)
9899 error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
9900 else if (TARGET_HARD_FLOAT)
9901 error ("the %<interrupt%> attribute requires %<-msoft-float%>");
9902 else if (TARGET_MIPS16)
9903 error ("interrupt handlers cannot be MIPS16 functions");
9904 else
9905 {
9906 cfun->machine->interrupt_handler_p = true;
9907 cfun->machine->use_shadow_register_set_p =
9908 mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
9909 cfun->machine->keep_interrupts_masked_p =
9910 mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
9911 cfun->machine->use_debug_exception_return_p =
9912 mips_use_debug_exception_return_p (TREE_TYPE
9913 (current_function_decl));
9914 }
9915 }
9916
9917 frame = &cfun->machine->frame;
9918 memset (frame, 0, sizeof (*frame));
9919 size = get_frame_size ();
9920
9921 cfun->machine->global_pointer = mips_global_pointer ();
9922
9923 /* The first two blocks contain the outgoing argument area and the $gp save
9924 slot. This area isn't needed in leaf functions, but if the
9925 target-independent frame size is nonzero, we have already committed to
9926 allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD. */
9927 if ((size == 0 || FRAME_GROWS_DOWNWARD) && crtl->is_leaf)
9928 {
9929 /* The MIPS 3.0 linker does not like functions that dynamically
9930 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
9931 looks like we are trying to create a second frame pointer to the
9932 function, so allocate some stack space to make it happy. */
9933 if (cfun->calls_alloca)
9934 frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
9935 else
9936 frame->args_size = 0;
9937 frame->cprestore_size = 0;
9938 }
9939 else
9940 {
9941 frame->args_size = crtl->outgoing_args_size;
9942 frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
9943 }
9944 offset = frame->args_size + frame->cprestore_size;
9945
9946 /* Move above the local variables. */
9947 frame->var_size = MIPS_STACK_ALIGN (size);
9948 offset += frame->var_size;
9949
9950 /* Find out which GPRs we need to save. */
9951 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9952 if (mips_save_reg_p (regno))
9953 {
9954 frame->num_gp++;
9955 frame->mask |= 1 << (regno - GP_REG_FIRST);
9956 }
9957
9958 /* If this function calls eh_return, we must also save and restore the
9959 EH data registers. */
9960 if (crtl->calls_eh_return)
9961 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
9962 {
9963 frame->num_gp++;
9964 frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
9965 }
9966
9967 /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
9968 $a3-$a0 and $s2-$s8. If we save one register in the range, we must
9969 save all later registers too. */
9970 if (GENERATE_MIPS16E_SAVE_RESTORE)
9971 {
9972 mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
9973 ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
9974 mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
9975 ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
9976 }
9977
9978 /* Move above the GPR save area. */
9979 if (frame->num_gp > 0)
9980 {
9981 offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
9982 frame->gp_sp_offset = offset - UNITS_PER_WORD;
9983 }
9984
9985 /* Find out which FPRs we need to save. This loop must iterate over
9986 the same space as its companion in mips_for_each_saved_gpr_and_fpr. */
9987 if (TARGET_HARD_FLOAT)
9988 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
9989 if (mips_save_reg_p (regno))
9990 {
9991 frame->num_fp += MAX_FPRS_PER_FMT;
9992 frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
9993 }
9994
9995 /* Move above the FPR save area. */
9996 if (frame->num_fp > 0)
9997 {
9998 offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
9999 frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
10000 }
10001
10002 /* Add in space for the interrupt context information. */
10003 if (cfun->machine->interrupt_handler_p)
10004 {
10005 /* Check HI/LO. */
10006 if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
10007 {
10008 frame->num_acc++;
10009 frame->acc_mask |= (1 << 0);
10010 }
10011
10012 /* Check accumulators 1, 2, 3. */
10013 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
10014 if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
10015 {
10016 frame->num_acc++;
10017 frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
10018 }
10019
10020 /* All interrupt context functions need space to preserve STATUS. */
10021 frame->num_cop0_regs++;
10022
10023 /* If we don't keep interrupts masked, we need to save EPC. */
10024 if (!cfun->machine->keep_interrupts_masked_p)
10025 frame->num_cop0_regs++;
10026 }
10027
10028 /* Move above the accumulator save area. */
10029 if (frame->num_acc > 0)
10030 {
10031 /* Each accumulator needs 2 words. */
10032 offset += frame->num_acc * 2 * UNITS_PER_WORD;
10033 frame->acc_sp_offset = offset - UNITS_PER_WORD;
10034 }
10035
10036 /* Move above the COP0 register save area. */
10037 if (frame->num_cop0_regs > 0)
10038 {
10039 offset += frame->num_cop0_regs * UNITS_PER_WORD;
10040 frame->cop0_sp_offset = offset - UNITS_PER_WORD;
10041 }
10042
10043 /* Move above the callee-allocated varargs save area. */
10044 offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
10045 frame->arg_pointer_offset = offset;
10046
10047 /* Move above the callee-allocated area for pretend stack arguments. */
10048 offset += crtl->args.pretend_args_size;
10049 frame->total_size = offset;
10050
10051 /* Work out the offsets of the save areas from the top of the frame. */
10052 if (frame->gp_sp_offset > 0)
10053 frame->gp_save_offset = frame->gp_sp_offset - offset;
10054 if (frame->fp_sp_offset > 0)
10055 frame->fp_save_offset = frame->fp_sp_offset - offset;
10056 if (frame->acc_sp_offset > 0)
10057 frame->acc_save_offset = frame->acc_sp_offset - offset;
10058 if (frame->num_cop0_regs > 0)
10059 frame->cop0_save_offset = frame->cop0_sp_offset - offset;
10060
10061 /* MIPS16 code offsets the frame pointer by the size of the outgoing
10062 arguments. This tends to increase the chances of using unextended
10063 instructions for local variables and incoming arguments. */
10064 if (TARGET_MIPS16)
10065 frame->hard_frame_pointer_offset = frame->args_size;
10066 }
10067
10068 /* Return the style of GP load sequence that is being used for the
10069 current function. */
10070
10071 enum mips_loadgp_style
10072 mips_current_loadgp_style (void)
10073 {
10074 if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
10075 return LOADGP_NONE;
10076
10077 if (TARGET_RTP_PIC)
10078 return LOADGP_RTP;
10079
10080 if (TARGET_ABSOLUTE_ABICALLS)
10081 return LOADGP_ABSOLUTE;
10082
10083 return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
10084 }
10085
10086 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
10087
10088 static bool
10089 mips_frame_pointer_required (void)
10090 {
10091 /* If the function contains dynamic stack allocations, we need to
10092 use the frame pointer to access the static parts of the frame. */
10093 if (cfun->calls_alloca)
10094 return true;
10095
10096 /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
10097 reload may be unable to compute the address of a local variable,
10098 since there is no way to add a large constant to the stack pointer
10099 without using a second temporary register. */
10100 if (TARGET_MIPS16)
10101 {
10102 mips_compute_frame_info ();
10103 if (!SMALL_OPERAND (cfun->machine->frame.total_size))
10104 return true;
10105 }
10106
10107 return false;
10108 }
10109
10110 /* Make sure that we're not trying to eliminate to the wrong hard frame
10111 pointer. */
10112
10113 static bool
10114 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
10115 {
10116 return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
10117 }
10118
10119 /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame pointer
10120 or argument pointer. TO is either the stack pointer or hard frame
10121 pointer. */
10122
10123 HOST_WIDE_INT
10124 mips_initial_elimination_offset (int from, int to)
10125 {
10126 HOST_WIDE_INT offset;
10127
10128 mips_compute_frame_info ();
10129
10130 /* Set OFFSET to the offset from the end-of-prologue stack pointer. */
10131 switch (from)
10132 {
10133 case FRAME_POINTER_REGNUM:
10134 if (FRAME_GROWS_DOWNWARD)
10135 offset = (cfun->machine->frame.args_size
10136 + cfun->machine->frame.cprestore_size
10137 + cfun->machine->frame.var_size);
10138 else
10139 offset = 0;
10140 break;
10141
10142 case ARG_POINTER_REGNUM:
10143 offset = cfun->machine->frame.arg_pointer_offset;
10144 break;
10145
10146 default:
10147 gcc_unreachable ();
10148 }
10149
10150 if (to == HARD_FRAME_POINTER_REGNUM)
10151 offset -= cfun->machine->frame.hard_frame_pointer_offset;
10152
10153 return offset;
10154 }
10155 \f
10156 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY. */
10157
10158 static void
10159 mips_extra_live_on_entry (bitmap regs)
10160 {
10161 if (TARGET_USE_GOT)
10162 {
10163 /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
10164 the global pointer. */
10165 if (!TARGET_ABSOLUTE_ABICALLS)
10166 bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
10167
10168 /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
10169 the global pointer. */
10170 if (TARGET_MIPS16)
10171 bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
10172
10173 /* See the comment above load_call<mode> for details. */
10174 bitmap_set_bit (regs, GOT_VERSION_REGNUM);
10175 }
10176 }
10177
10178 /* Implement RETURN_ADDR_RTX. We do not support moving back to a
10179 previous frame. */
10180
10181 rtx
10182 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
10183 {
10184 if (count != 0)
10185 return const0_rtx;
10186
10187 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
10188 }
10189
10190 /* Emit code to change the current function's return address to
10191 ADDRESS. SCRATCH is available as a scratch register, if needed.
10192 ADDRESS and SCRATCH are both word-mode GPRs. */
10193
10194 void
10195 mips_set_return_address (rtx address, rtx scratch)
10196 {
10197 rtx slot_address;
10198
10199 gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
10200 slot_address = mips_add_offset (scratch, stack_pointer_rtx,
10201 cfun->machine->frame.gp_sp_offset);
10202 mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
10203 }
10204
10205 /* Return true if the current function has a cprestore slot. */
10206
10207 bool
10208 mips_cfun_has_cprestore_slot_p (void)
10209 {
10210 return (cfun->machine->global_pointer != INVALID_REGNUM
10211 && cfun->machine->frame.cprestore_size > 0);
10212 }
10213
10214 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
10215 cprestore slot. LOAD_P is true if the caller wants to load from
10216 the cprestore slot; it is false if the caller wants to store to
10217 the slot. */
10218
10219 static void
10220 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
10221 bool load_p)
10222 {
10223 const struct mips_frame_info *frame;
10224
10225 frame = &cfun->machine->frame;
10226 /* .cprestore always uses the stack pointer instead of the frame pointer.
10227 We have a free choice for direct stores for non-MIPS16 functions,
10228 and for MIPS16 functions whose cprestore slot is in range of the
10229 stack pointer. Using the stack pointer would sometimes give more
10230 (early) scheduling freedom, but using the frame pointer would
10231 sometimes give more (late) scheduling freedom. It's hard to
10232 predict which applies to a given function, so let's keep things
10233 simple.
10234
10235 Loads must always use the frame pointer in functions that call
10236 alloca, and there's little benefit to using the stack pointer
10237 otherwise. */
10238 if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
10239 {
10240 *base = hard_frame_pointer_rtx;
10241 *offset = frame->args_size - frame->hard_frame_pointer_offset;
10242 }
10243 else
10244 {
10245 *base = stack_pointer_rtx;
10246 *offset = frame->args_size;
10247 }
10248 }
10249
10250 /* Return true if X is the load or store address of the cprestore slot;
10251 LOAD_P says which. */
10252
10253 bool
10254 mips_cprestore_address_p (rtx x, bool load_p)
10255 {
10256 rtx given_base, required_base;
10257 HOST_WIDE_INT given_offset, required_offset;
10258
10259 mips_split_plus (x, &given_base, &given_offset);
10260 mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
10261 return given_base == required_base && given_offset == required_offset;
10262 }
10263
10264 /* Return a MEM rtx for the cprestore slot. LOAD_P is true if we are
10265 going to load from it, false if we are going to store to it.
10266 Use TEMP as a temporary register if need be. */
10267
10268 static rtx
10269 mips_cprestore_slot (rtx temp, bool load_p)
10270 {
10271 rtx base;
10272 HOST_WIDE_INT offset;
10273
10274 mips_get_cprestore_base_and_offset (&base, &offset, load_p);
10275 return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
10276 }
10277
10278 /* Emit instructions to save global pointer value GP into cprestore
10279 slot MEM. OFFSET is the offset that MEM applies to the base register.
10280
10281 MEM may not be a legitimate address. If it isn't, TEMP is a
10282 temporary register that can be used, otherwise it is a SCRATCH. */
10283
10284 void
10285 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
10286 {
10287 if (TARGET_CPRESTORE_DIRECTIVE)
10288 {
10289 gcc_assert (gp == pic_offset_table_rtx);
10290 emit_insn (PMODE_INSN (gen_cprestore, (mem, offset)));
10291 }
10292 else
10293 mips_emit_move (mips_cprestore_slot (temp, false), gp);
10294 }
10295
10296 /* Restore $gp from its save slot, using TEMP as a temporary base register
10297 if need be. This function is for o32 and o64 abicalls only.
10298
10299 See mips_must_initialize_gp_p for details about how we manage the
10300 global pointer. */
10301
10302 void
10303 mips_restore_gp_from_cprestore_slot (rtx temp)
10304 {
10305 gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
10306
10307 if (!cfun->machine->must_restore_gp_when_clobbered_p)
10308 {
10309 emit_note (NOTE_INSN_DELETED);
10310 return;
10311 }
10312
10313 if (TARGET_MIPS16)
10314 {
10315 mips_emit_move (temp, mips_cprestore_slot (temp, true));
10316 mips_emit_move (pic_offset_table_rtx, temp);
10317 }
10318 else
10319 mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
10320 if (!TARGET_EXPLICIT_RELOCS)
10321 emit_insn (gen_blockage ());
10322 }
10323 \f
10324 /* A function to save or store a register. The first argument is the
10325 register and the second is the stack slot. */
10326 typedef void (*mips_save_restore_fn) (rtx, rtx);
10327
10328 /* Use FN to save or restore register REGNO. MODE is the register's
10329 mode and OFFSET is the offset of its save slot from the current
10330 stack pointer. */
10331
10332 static void
10333 mips_save_restore_reg (enum machine_mode mode, int regno,
10334 HOST_WIDE_INT offset, mips_save_restore_fn fn)
10335 {
10336 rtx mem;
10337
10338 mem = gen_frame_mem (mode, plus_constant (Pmode, stack_pointer_rtx,
10339 offset));
10340 fn (gen_rtx_REG (mode, regno), mem);
10341 }
10342
10343 /* Call FN for each accumlator that is saved by the current function.
10344 SP_OFFSET is the offset of the current stack pointer from the start
10345 of the frame. */
10346
10347 static void
10348 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
10349 {
10350 HOST_WIDE_INT offset;
10351 int regno;
10352
10353 offset = cfun->machine->frame.acc_sp_offset - sp_offset;
10354 if (BITSET_P (cfun->machine->frame.acc_mask, 0))
10355 {
10356 mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
10357 offset -= UNITS_PER_WORD;
10358 mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
10359 offset -= UNITS_PER_WORD;
10360 }
10361
10362 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
10363 if (BITSET_P (cfun->machine->frame.acc_mask,
10364 ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
10365 {
10366 mips_save_restore_reg (word_mode, regno, offset, fn);
10367 offset -= UNITS_PER_WORD;
10368 }
10369 }
10370
10371 /* Save register REG to MEM. Make the instruction frame-related. */
10372
10373 static void
10374 mips_save_reg (rtx reg, rtx mem)
10375 {
10376 if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
10377 {
10378 rtx x1, x2;
10379
10380 mips_emit_move_or_split (mem, reg, SPLIT_IF_NECESSARY);
10381
10382 x1 = mips_frame_set (mips_subword (mem, false),
10383 mips_subword (reg, false));
10384 x2 = mips_frame_set (mips_subword (mem, true),
10385 mips_subword (reg, true));
10386 mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10387 }
10388 else
10389 mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10390 }
10391
10392 /* Capture the register combinations that are allowed in a SWM or LWM
10393 instruction. The entries are ordered by number of registers set in
10394 the mask. We also ignore the single register encodings because a
10395 normal SW/LW is preferred. */
10396
10397 static const unsigned int umips_swm_mask[17] = {
10398 0xc0ff0000, 0x80ff0000, 0x40ff0000, 0x807f0000,
10399 0x00ff0000, 0x803f0000, 0x007f0000, 0x801f0000,
10400 0x003f0000, 0x800f0000, 0x001f0000, 0x80070000,
10401 0x000f0000, 0x80030000, 0x00070000, 0x80010000,
10402 0x00030000
10403 };
10404
10405 static const unsigned int umips_swm_encoding[17] = {
10406 25, 24, 9, 23, 8, 22, 7, 21, 6, 20, 5, 19, 4, 18, 3, 17, 2
10407 };
10408
10409 /* Try to use a microMIPS LWM or SWM instruction to save or restore
10410 as many GPRs in *MASK as possible. *OFFSET is the offset from the
10411 stack pointer of the topmost save slot.
10412
10413 Remove from *MASK all registers that were handled using LWM and SWM.
10414 Update *OFFSET so that it points to the first unused save slot. */
10415
10416 static bool
10417 umips_build_save_restore (mips_save_restore_fn fn,
10418 unsigned *mask, HOST_WIDE_INT *offset)
10419 {
10420 int nregs;
10421 unsigned int i, j;
10422 rtx pattern, set, reg, mem;
10423 HOST_WIDE_INT this_offset;
10424 rtx this_base;
10425
10426 /* Try matching $16 to $31 (s0 to ra). */
10427 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
10428 if ((*mask & 0xffff0000) == umips_swm_mask[i])
10429 break;
10430
10431 if (i == ARRAY_SIZE (umips_swm_mask))
10432 return false;
10433
10434 /* Get the offset of the lowest save slot. */
10435 nregs = (umips_swm_encoding[i] & 0xf) + (umips_swm_encoding[i] >> 4);
10436 this_offset = *offset - UNITS_PER_WORD * (nregs - 1);
10437
10438 /* LWM/SWM can only support offsets from -2048 to 2047. */
10439 if (!UMIPS_12BIT_OFFSET_P (this_offset))
10440 return false;
10441
10442 /* Create the final PARALLEL. */
10443 pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
10444 this_base = stack_pointer_rtx;
10445
10446 /* For registers $16-$23 and $30. */
10447 for (j = 0; j < (umips_swm_encoding[i] & 0xf); j++)
10448 {
10449 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10450 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10451 unsigned int regno = (j != 8) ? 16 + j : 30;
10452 *mask &= ~(1 << regno);
10453 reg = gen_rtx_REG (SImode, regno);
10454 if (fn == mips_save_reg)
10455 set = mips_frame_set (mem, reg);
10456 else
10457 {
10458 set = gen_rtx_SET (VOIDmode, reg, mem);
10459 mips_add_cfa_restore (reg);
10460 }
10461 XVECEXP (pattern, 0, j) = set;
10462 }
10463
10464 /* For register $31. */
10465 if (umips_swm_encoding[i] >> 4)
10466 {
10467 HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10468 *mask &= ~(1 << 31);
10469 mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10470 reg = gen_rtx_REG (SImode, 31);
10471 if (fn == mips_save_reg)
10472 set = mips_frame_set (mem, reg);
10473 else
10474 {
10475 set = gen_rtx_SET (VOIDmode, reg, mem);
10476 mips_add_cfa_restore (reg);
10477 }
10478 XVECEXP (pattern, 0, j) = set;
10479 }
10480
10481 pattern = emit_insn (pattern);
10482 if (fn == mips_save_reg)
10483 RTX_FRAME_RELATED_P (pattern) = 1;
10484
10485 /* Adjust the last offset. */
10486 *offset -= UNITS_PER_WORD * nregs;
10487
10488 return true;
10489 }
10490
10491 /* Call FN for each register that is saved by the current function.
10492 SP_OFFSET is the offset of the current stack pointer from the start
10493 of the frame. */
10494
10495 static void
10496 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
10497 mips_save_restore_fn fn)
10498 {
10499 enum machine_mode fpr_mode;
10500 int regno;
10501 const struct mips_frame_info *frame = &cfun->machine->frame;
10502 HOST_WIDE_INT offset;
10503 unsigned int mask;
10504
10505 /* Save registers starting from high to low. The debuggers prefer at least
10506 the return register be stored at func+4, and also it allows us not to
10507 need a nop in the epilogue if at least one register is reloaded in
10508 addition to return address. */
10509 offset = frame->gp_sp_offset - sp_offset;
10510 mask = frame->mask;
10511
10512 if (TARGET_MICROMIPS)
10513 umips_build_save_restore (fn, &mask, &offset);
10514
10515 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
10516 if (BITSET_P (mask, regno - GP_REG_FIRST))
10517 {
10518 /* Record the ra offset for use by mips_function_profiler. */
10519 if (regno == RETURN_ADDR_REGNUM)
10520 cfun->machine->frame.ra_fp_offset = offset + sp_offset;
10521 mips_save_restore_reg (word_mode, regno, offset, fn);
10522 offset -= UNITS_PER_WORD;
10523 }
10524
10525 /* This loop must iterate over the same space as its companion in
10526 mips_compute_frame_info. */
10527 offset = cfun->machine->frame.fp_sp_offset - sp_offset;
10528 fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
10529 for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
10530 regno >= FP_REG_FIRST;
10531 regno -= MAX_FPRS_PER_FMT)
10532 if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
10533 {
10534 mips_save_restore_reg (fpr_mode, regno, offset, fn);
10535 offset -= GET_MODE_SIZE (fpr_mode);
10536 }
10537 }
10538
10539 /* Return true if a move between register REGNO and its save slot (MEM)
10540 can be done in a single move. LOAD_P is true if we are loading
10541 from the slot, false if we are storing to it. */
10542
10543 static bool
10544 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
10545 {
10546 /* There is a specific MIPS16 instruction for saving $31 to the stack. */
10547 if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
10548 return false;
10549
10550 return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
10551 GET_MODE (mem), mem, load_p) == NO_REGS;
10552 }
10553
10554 /* Emit a move from SRC to DEST, given that one of them is a register
10555 save slot and that the other is a register. TEMP is a temporary
10556 GPR of the same mode that is available if need be. */
10557
10558 void
10559 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
10560 {
10561 unsigned int regno;
10562 rtx mem;
10563
10564 if (REG_P (src))
10565 {
10566 regno = REGNO (src);
10567 mem = dest;
10568 }
10569 else
10570 {
10571 regno = REGNO (dest);
10572 mem = src;
10573 }
10574
10575 if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
10576 {
10577 /* We don't yet know whether we'll need this instruction or not.
10578 Postpone the decision by emitting a ghost move. This move
10579 is specifically not frame-related; only the split version is. */
10580 if (TARGET_64BIT)
10581 emit_insn (gen_move_gpdi (dest, src));
10582 else
10583 emit_insn (gen_move_gpsi (dest, src));
10584 return;
10585 }
10586
10587 if (regno == HI_REGNUM)
10588 {
10589 if (REG_P (dest))
10590 {
10591 mips_emit_move (temp, src);
10592 if (TARGET_64BIT)
10593 emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
10594 temp, gen_rtx_REG (DImode, LO_REGNUM)));
10595 else
10596 emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
10597 temp, gen_rtx_REG (SImode, LO_REGNUM)));
10598 }
10599 else
10600 {
10601 if (TARGET_64BIT)
10602 emit_insn (gen_mfhidi_ti (temp,
10603 gen_rtx_REG (TImode, MD_REG_FIRST)));
10604 else
10605 emit_insn (gen_mfhisi_di (temp,
10606 gen_rtx_REG (DImode, MD_REG_FIRST)));
10607 mips_emit_move (dest, temp);
10608 }
10609 }
10610 else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
10611 mips_emit_move (dest, src);
10612 else
10613 {
10614 gcc_assert (!reg_overlap_mentioned_p (dest, temp));
10615 mips_emit_move (temp, src);
10616 mips_emit_move (dest, temp);
10617 }
10618 if (MEM_P (dest))
10619 mips_set_frame_expr (mips_frame_set (dest, src));
10620 }
10621 \f
10622 /* If we're generating n32 or n64 abicalls, and the current function
10623 does not use $28 as its global pointer, emit a cplocal directive.
10624 Use pic_offset_table_rtx as the argument to the directive. */
10625
10626 static void
10627 mips_output_cplocal (void)
10628 {
10629 if (!TARGET_EXPLICIT_RELOCS
10630 && mips_must_initialize_gp_p ()
10631 && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
10632 output_asm_insn (".cplocal %+", 0);
10633 }
10634
10635 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE. */
10636
10637 static void
10638 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10639 {
10640 const char *fnname;
10641
10642 /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
10643 floating-point arguments. */
10644 if (TARGET_MIPS16
10645 && TARGET_HARD_FLOAT_ABI
10646 && crtl->args.info.fp_code != 0)
10647 mips16_build_function_stub ();
10648
10649 /* Get the function name the same way that toplev.c does before calling
10650 assemble_start_function. This is needed so that the name used here
10651 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
10652 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10653 mips_start_function_definition (fnname, TARGET_MIPS16);
10654
10655 /* Output MIPS-specific frame information. */
10656 if (!flag_inhibit_size_directive)
10657 {
10658 const struct mips_frame_info *frame;
10659
10660 frame = &cfun->machine->frame;
10661
10662 /* .frame FRAMEREG, FRAMESIZE, RETREG. */
10663 fprintf (file,
10664 "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
10665 "# vars= " HOST_WIDE_INT_PRINT_DEC
10666 ", regs= %d/%d"
10667 ", args= " HOST_WIDE_INT_PRINT_DEC
10668 ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
10669 reg_names[frame_pointer_needed
10670 ? HARD_FRAME_POINTER_REGNUM
10671 : STACK_POINTER_REGNUM],
10672 (frame_pointer_needed
10673 ? frame->total_size - frame->hard_frame_pointer_offset
10674 : frame->total_size),
10675 reg_names[RETURN_ADDR_REGNUM],
10676 frame->var_size,
10677 frame->num_gp, frame->num_fp,
10678 frame->args_size,
10679 frame->cprestore_size);
10680
10681 /* .mask MASK, OFFSET. */
10682 fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10683 frame->mask, frame->gp_save_offset);
10684
10685 /* .fmask MASK, OFFSET. */
10686 fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10687 frame->fmask, frame->fp_save_offset);
10688 }
10689
10690 /* Handle the initialization of $gp for SVR4 PIC, if applicable.
10691 Also emit the ".set noreorder; .set nomacro" sequence for functions
10692 that need it. */
10693 if (mips_must_initialize_gp_p ()
10694 && mips_current_loadgp_style () == LOADGP_OLDABI)
10695 {
10696 if (TARGET_MIPS16)
10697 {
10698 /* This is a fixed-form sequence. The position of the
10699 first two instructions is important because of the
10700 way _gp_disp is defined. */
10701 output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
10702 output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
10703 output_asm_insn ("sll\t$2,16", 0);
10704 output_asm_insn ("addu\t$2,$3", 0);
10705 }
10706 else
10707 {
10708 /* .cpload must be in a .set noreorder but not a
10709 .set nomacro block. */
10710 mips_push_asm_switch (&mips_noreorder);
10711 output_asm_insn (".cpload\t%^", 0);
10712 if (!cfun->machine->all_noreorder_p)
10713 mips_pop_asm_switch (&mips_noreorder);
10714 else
10715 mips_push_asm_switch (&mips_nomacro);
10716 }
10717 }
10718 else if (cfun->machine->all_noreorder_p)
10719 {
10720 mips_push_asm_switch (&mips_noreorder);
10721 mips_push_asm_switch (&mips_nomacro);
10722 }
10723
10724 /* Tell the assembler which register we're using as the global
10725 pointer. This is needed for thunks, since they can use either
10726 explicit relocs or assembler macros. */
10727 mips_output_cplocal ();
10728 }
10729
10730 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE. */
10731
10732 static void
10733 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
10734 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10735 {
10736 const char *fnname;
10737
10738 /* Reinstate the normal $gp. */
10739 SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
10740 mips_output_cplocal ();
10741
10742 if (cfun->machine->all_noreorder_p)
10743 {
10744 mips_pop_asm_switch (&mips_nomacro);
10745 mips_pop_asm_switch (&mips_noreorder);
10746 }
10747
10748 /* Get the function name the same way that toplev.c does before calling
10749 assemble_start_function. This is needed so that the name used here
10750 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
10751 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10752 mips_end_function_definition (fnname);
10753 }
10754 \f
10755 /* Emit an optimisation barrier for accesses to the current frame. */
10756
10757 static void
10758 mips_frame_barrier (void)
10759 {
10760 emit_clobber (gen_frame_mem (BLKmode, stack_pointer_rtx));
10761 }
10762
10763
10764 /* The __gnu_local_gp symbol. */
10765
10766 static GTY(()) rtx mips_gnu_local_gp;
10767
10768 /* If we're generating n32 or n64 abicalls, emit instructions
10769 to set up the global pointer. */
10770
10771 static void
10772 mips_emit_loadgp (void)
10773 {
10774 rtx addr, offset, incoming_address, base, index, pic_reg;
10775
10776 pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10777 switch (mips_current_loadgp_style ())
10778 {
10779 case LOADGP_ABSOLUTE:
10780 if (mips_gnu_local_gp == NULL)
10781 {
10782 mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
10783 SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
10784 }
10785 emit_insn (PMODE_INSN (gen_loadgp_absolute,
10786 (pic_reg, mips_gnu_local_gp)));
10787 break;
10788
10789 case LOADGP_OLDABI:
10790 /* Added by mips_output_function_prologue. */
10791 break;
10792
10793 case LOADGP_NEWABI:
10794 addr = XEXP (DECL_RTL (current_function_decl), 0);
10795 offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
10796 incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
10797 emit_insn (PMODE_INSN (gen_loadgp_newabi,
10798 (pic_reg, offset, incoming_address)));
10799 break;
10800
10801 case LOADGP_RTP:
10802 base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
10803 index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
10804 emit_insn (PMODE_INSN (gen_loadgp_rtp, (pic_reg, base, index)));
10805 break;
10806
10807 default:
10808 return;
10809 }
10810
10811 if (TARGET_MIPS16)
10812 emit_insn (PMODE_INSN (gen_copygp_mips16,
10813 (pic_offset_table_rtx, pic_reg)));
10814
10815 /* Emit a blockage if there are implicit uses of the GP register.
10816 This includes profiled functions, because FUNCTION_PROFILE uses
10817 a jal macro. */
10818 if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
10819 emit_insn (gen_loadgp_blockage ());
10820 }
10821
10822 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
10823
10824 #if PROBE_INTERVAL > 32768
10825 #error Cannot use indexed addressing mode for stack probing
10826 #endif
10827
10828 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
10829 inclusive. These are offsets from the current stack pointer. */
10830
10831 static void
10832 mips_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
10833 {
10834 if (TARGET_MIPS16)
10835 sorry ("-fstack-check=specific not implemented for MIPS16");
10836
10837 /* See if we have a constant small number of probes to generate. If so,
10838 that's the easy case. */
10839 if (first + size <= 32768)
10840 {
10841 HOST_WIDE_INT i;
10842
10843 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
10844 it exceeds SIZE. If only one probe is needed, this will not
10845 generate any code. Then probe at FIRST + SIZE. */
10846 for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10847 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
10848 -(first + i)));
10849
10850 emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
10851 -(first + size)));
10852 }
10853
10854 /* Otherwise, do the same as above, but in a loop. Note that we must be
10855 extra careful with variables wrapping around because we might be at
10856 the very top (or the very bottom) of the address space and we have
10857 to be able to handle this case properly; in particular, we use an
10858 equality test for the loop condition. */
10859 else
10860 {
10861 HOST_WIDE_INT rounded_size;
10862 rtx r3 = MIPS_PROLOGUE_TEMP (Pmode);
10863 rtx r12 = MIPS_PROLOGUE_TEMP2 (Pmode);
10864
10865 /* Sanity check for the addressing mode we're going to use. */
10866 gcc_assert (first <= 32768);
10867
10868
10869 /* Step 1: round SIZE to the previous multiple of the interval. */
10870
10871 rounded_size = size & -PROBE_INTERVAL;
10872
10873
10874 /* Step 2: compute initial and final value of the loop counter. */
10875
10876 /* TEST_ADDR = SP + FIRST. */
10877 emit_insn (gen_rtx_SET (VOIDmode, r3,
10878 plus_constant (Pmode, stack_pointer_rtx,
10879 -first)));
10880
10881 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
10882 if (rounded_size > 32768)
10883 {
10884 emit_move_insn (r12, GEN_INT (rounded_size));
10885 emit_insn (gen_rtx_SET (VOIDmode, r12,
10886 gen_rtx_MINUS (Pmode, r3, r12)));
10887 }
10888 else
10889 emit_insn (gen_rtx_SET (VOIDmode, r12,
10890 plus_constant (Pmode, r3, -rounded_size)));
10891
10892
10893 /* Step 3: the loop
10894
10895 while (TEST_ADDR != LAST_ADDR)
10896 {
10897 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
10898 probe at TEST_ADDR
10899 }
10900
10901 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
10902 until it is equal to ROUNDED_SIZE. */
10903
10904 emit_insn (PMODE_INSN (gen_probe_stack_range, (r3, r3, r12)));
10905
10906
10907 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
10908 that SIZE is equal to ROUNDED_SIZE. */
10909
10910 if (size != rounded_size)
10911 emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
10912 }
10913
10914 /* Make sure nothing is scheduled before we are done. */
10915 emit_insn (gen_blockage ());
10916 }
10917
10918 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
10919 absolute addresses. */
10920
10921 const char *
10922 mips_output_probe_stack_range (rtx reg1, rtx reg2)
10923 {
10924 static int labelno = 0;
10925 char loop_lab[32], end_lab[32], tmp[64];
10926 rtx xops[2];
10927
10928 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
10929 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
10930
10931 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
10932
10933 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
10934 xops[0] = reg1;
10935 xops[1] = reg2;
10936 strcpy (tmp, "%(%<beq\t%0,%1,");
10937 output_asm_insn (strcat (tmp, &end_lab[1]), xops);
10938
10939 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
10940 xops[1] = GEN_INT (-PROBE_INTERVAL);
10941 if (TARGET_64BIT && TARGET_LONG64)
10942 output_asm_insn ("daddiu\t%0,%0,%1", xops);
10943 else
10944 output_asm_insn ("addiu\t%0,%0,%1", xops);
10945
10946 /* Probe at TEST_ADDR and branch. */
10947 fprintf (asm_out_file, "\tb\t");
10948 assemble_name_raw (asm_out_file, loop_lab);
10949 fputc ('\n', asm_out_file);
10950 if (TARGET_64BIT)
10951 output_asm_insn ("sd\t$0,0(%0)%)", xops);
10952 else
10953 output_asm_insn ("sw\t$0,0(%0)%)", xops);
10954
10955 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
10956
10957 return "";
10958 }
10959
10960 /* A for_each_rtx callback. Stop the search if *X is a kernel register. */
10961
10962 static int
10963 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
10964 {
10965 return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
10966 }
10967
10968 /* Expand the "prologue" pattern. */
10969
10970 void
10971 mips_expand_prologue (void)
10972 {
10973 const struct mips_frame_info *frame;
10974 HOST_WIDE_INT size;
10975 unsigned int nargs;
10976 rtx insn;
10977
10978 if (cfun->machine->global_pointer != INVALID_REGNUM)
10979 {
10980 /* Check whether an insn uses pic_offset_table_rtx, either explicitly
10981 or implicitly. If so, we can commit to using a global pointer
10982 straight away, otherwise we need to defer the decision. */
10983 if (mips_cfun_has_inflexible_gp_ref_p ()
10984 || mips_cfun_has_flexible_gp_ref_p ())
10985 {
10986 cfun->machine->must_initialize_gp_p = true;
10987 cfun->machine->must_restore_gp_when_clobbered_p = true;
10988 }
10989
10990 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
10991 }
10992
10993 frame = &cfun->machine->frame;
10994 size = frame->total_size;
10995
10996 if (flag_stack_usage_info)
10997 current_function_static_stack_size = size;
10998
10999 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
11000 {
11001 if (crtl->is_leaf && !cfun->calls_alloca)
11002 {
11003 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
11004 mips_emit_probe_stack_range (STACK_CHECK_PROTECT,
11005 size - STACK_CHECK_PROTECT);
11006 }
11007 else if (size > 0)
11008 mips_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
11009 }
11010
11011 /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
11012 bytes beforehand; this is enough to cover the register save area
11013 without going out of range. */
11014 if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
11015 || frame->num_cop0_regs > 0)
11016 {
11017 HOST_WIDE_INT step1;
11018
11019 step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
11020 if (GENERATE_MIPS16E_SAVE_RESTORE)
11021 {
11022 HOST_WIDE_INT offset;
11023 unsigned int mask, regno;
11024
11025 /* Try to merge argument stores into the save instruction. */
11026 nargs = mips16e_collect_argument_saves ();
11027
11028 /* Build the save instruction. */
11029 mask = frame->mask;
11030 insn = mips16e_build_save_restore (false, &mask, &offset,
11031 nargs, step1);
11032 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11033 mips_frame_barrier ();
11034 size -= step1;
11035
11036 /* Check if we need to save other registers. */
11037 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11038 if (BITSET_P (mask, regno - GP_REG_FIRST))
11039 {
11040 offset -= UNITS_PER_WORD;
11041 mips_save_restore_reg (word_mode, regno,
11042 offset, mips_save_reg);
11043 }
11044 }
11045 else
11046 {
11047 if (cfun->machine->interrupt_handler_p)
11048 {
11049 HOST_WIDE_INT offset;
11050 rtx mem;
11051
11052 /* If this interrupt is using a shadow register set, we need to
11053 get the stack pointer from the previous register set. */
11054 if (cfun->machine->use_shadow_register_set_p)
11055 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
11056 stack_pointer_rtx));
11057
11058 if (!cfun->machine->keep_interrupts_masked_p)
11059 {
11060 /* Move from COP0 Cause to K0. */
11061 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
11062 gen_rtx_REG (SImode,
11063 COP0_CAUSE_REG_NUM)));
11064 /* Move from COP0 EPC to K1. */
11065 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11066 gen_rtx_REG (SImode,
11067 COP0_EPC_REG_NUM)));
11068 }
11069
11070 /* Allocate the first part of the frame. */
11071 insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
11072 GEN_INT (-step1));
11073 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11074 mips_frame_barrier ();
11075 size -= step1;
11076
11077 /* Start at the uppermost location for saving. */
11078 offset = frame->cop0_sp_offset - size;
11079 if (!cfun->machine->keep_interrupts_masked_p)
11080 {
11081 /* Push EPC into its stack slot. */
11082 mem = gen_frame_mem (word_mode,
11083 plus_constant (Pmode, stack_pointer_rtx,
11084 offset));
11085 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11086 offset -= UNITS_PER_WORD;
11087 }
11088
11089 /* Move from COP0 Status to K1. */
11090 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11091 gen_rtx_REG (SImode,
11092 COP0_STATUS_REG_NUM)));
11093
11094 /* Right justify the RIPL in k0. */
11095 if (!cfun->machine->keep_interrupts_masked_p)
11096 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
11097 gen_rtx_REG (SImode, K0_REG_NUM),
11098 GEN_INT (CAUSE_IPL)));
11099
11100 /* Push Status into its stack slot. */
11101 mem = gen_frame_mem (word_mode,
11102 plus_constant (Pmode, stack_pointer_rtx,
11103 offset));
11104 mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11105 offset -= UNITS_PER_WORD;
11106
11107 /* Insert the RIPL into our copy of SR (k1) as the new IPL. */
11108 if (!cfun->machine->keep_interrupts_masked_p)
11109 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11110 GEN_INT (6),
11111 GEN_INT (SR_IPL),
11112 gen_rtx_REG (SImode, K0_REG_NUM)));
11113
11114 if (!cfun->machine->keep_interrupts_masked_p)
11115 /* Enable interrupts by clearing the KSU ERL and EXL bits.
11116 IE is already the correct value, so we don't have to do
11117 anything explicit. */
11118 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11119 GEN_INT (4),
11120 GEN_INT (SR_EXL),
11121 gen_rtx_REG (SImode, GP_REG_FIRST)));
11122 else
11123 /* Disable interrupts by clearing the KSU, ERL, EXL,
11124 and IE bits. */
11125 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11126 GEN_INT (5),
11127 GEN_INT (SR_IE),
11128 gen_rtx_REG (SImode, GP_REG_FIRST)));
11129 }
11130 else
11131 {
11132 insn = gen_add3_insn (stack_pointer_rtx,
11133 stack_pointer_rtx,
11134 GEN_INT (-step1));
11135 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11136 mips_frame_barrier ();
11137 size -= step1;
11138 }
11139 mips_for_each_saved_acc (size, mips_save_reg);
11140 mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
11141 }
11142 }
11143
11144 /* Allocate the rest of the frame. */
11145 if (size > 0)
11146 {
11147 if (SMALL_OPERAND (-size))
11148 RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
11149 stack_pointer_rtx,
11150 GEN_INT (-size)))) = 1;
11151 else
11152 {
11153 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
11154 if (TARGET_MIPS16)
11155 {
11156 /* There are no instructions to add or subtract registers
11157 from the stack pointer, so use the frame pointer as a
11158 temporary. We should always be using a frame pointer
11159 in this case anyway. */
11160 gcc_assert (frame_pointer_needed);
11161 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11162 emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
11163 hard_frame_pointer_rtx,
11164 MIPS_PROLOGUE_TEMP (Pmode)));
11165 mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
11166 }
11167 else
11168 emit_insn (gen_sub3_insn (stack_pointer_rtx,
11169 stack_pointer_rtx,
11170 MIPS_PROLOGUE_TEMP (Pmode)));
11171
11172 /* Describe the combined effect of the previous instructions. */
11173 mips_set_frame_expr
11174 (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
11175 plus_constant (Pmode, stack_pointer_rtx, -size)));
11176 }
11177 mips_frame_barrier ();
11178 }
11179
11180 /* Set up the frame pointer, if we're using one. */
11181 if (frame_pointer_needed)
11182 {
11183 HOST_WIDE_INT offset;
11184
11185 offset = frame->hard_frame_pointer_offset;
11186 if (offset == 0)
11187 {
11188 insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11189 RTX_FRAME_RELATED_P (insn) = 1;
11190 }
11191 else if (SMALL_OPERAND (offset))
11192 {
11193 insn = gen_add3_insn (hard_frame_pointer_rtx,
11194 stack_pointer_rtx, GEN_INT (offset));
11195 RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11196 }
11197 else
11198 {
11199 mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
11200 mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11201 emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
11202 hard_frame_pointer_rtx,
11203 MIPS_PROLOGUE_TEMP (Pmode)));
11204 mips_set_frame_expr
11205 (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
11206 plus_constant (Pmode, stack_pointer_rtx, offset)));
11207 }
11208 }
11209
11210 mips_emit_loadgp ();
11211
11212 /* Initialize the $gp save slot. */
11213 if (mips_cfun_has_cprestore_slot_p ())
11214 {
11215 rtx base, mem, gp, temp;
11216 HOST_WIDE_INT offset;
11217
11218 mips_get_cprestore_base_and_offset (&base, &offset, false);
11219 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11220 gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11221 temp = (SMALL_OPERAND (offset)
11222 ? gen_rtx_SCRATCH (Pmode)
11223 : MIPS_PROLOGUE_TEMP (Pmode));
11224 emit_insn (PMODE_INSN (gen_potential_cprestore,
11225 (mem, GEN_INT (offset), gp, temp)));
11226
11227 mips_get_cprestore_base_and_offset (&base, &offset, true);
11228 mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11229 emit_insn (PMODE_INSN (gen_use_cprestore, (mem)));
11230 }
11231
11232 /* We need to search back to the last use of K0 or K1. */
11233 if (cfun->machine->interrupt_handler_p)
11234 {
11235 for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
11236 if (INSN_P (insn)
11237 && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
11238 break;
11239 /* Emit a move from K1 to COP0 Status after insn. */
11240 gcc_assert (insn != NULL_RTX);
11241 emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11242 gen_rtx_REG (SImode, K1_REG_NUM)),
11243 insn);
11244 }
11245
11246 /* If we are profiling, make sure no instructions are scheduled before
11247 the call to mcount. */
11248 if (crtl->profile)
11249 emit_insn (gen_blockage ());
11250 }
11251 \f
11252 /* Attach all pending register saves to the previous instruction.
11253 Return that instruction. */
11254
11255 static rtx
11256 mips_epilogue_emit_cfa_restores (void)
11257 {
11258 rtx insn;
11259
11260 insn = get_last_insn ();
11261 gcc_assert (insn && !REG_NOTES (insn));
11262 if (mips_epilogue.cfa_restores)
11263 {
11264 RTX_FRAME_RELATED_P (insn) = 1;
11265 REG_NOTES (insn) = mips_epilogue.cfa_restores;
11266 mips_epilogue.cfa_restores = 0;
11267 }
11268 return insn;
11269 }
11270
11271 /* Like mips_epilogue_emit_cfa_restores, but also record that the CFA is
11272 now at REG + OFFSET. */
11273
11274 static void
11275 mips_epilogue_set_cfa (rtx reg, HOST_WIDE_INT offset)
11276 {
11277 rtx insn;
11278
11279 insn = mips_epilogue_emit_cfa_restores ();
11280 if (reg != mips_epilogue.cfa_reg || offset != mips_epilogue.cfa_offset)
11281 {
11282 RTX_FRAME_RELATED_P (insn) = 1;
11283 REG_NOTES (insn) = alloc_reg_note (REG_CFA_DEF_CFA,
11284 plus_constant (Pmode, reg, offset),
11285 REG_NOTES (insn));
11286 mips_epilogue.cfa_reg = reg;
11287 mips_epilogue.cfa_offset = offset;
11288 }
11289 }
11290
11291 /* Emit instructions to restore register REG from slot MEM. Also update
11292 the cfa_restores list. */
11293
11294 static void
11295 mips_restore_reg (rtx reg, rtx mem)
11296 {
11297 /* There's no MIPS16 instruction to load $31 directly. Load into
11298 $7 instead and adjust the return insn appropriately. */
11299 if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
11300 reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
11301 else if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
11302 {
11303 mips_add_cfa_restore (mips_subword (reg, true));
11304 mips_add_cfa_restore (mips_subword (reg, false));
11305 }
11306 else
11307 mips_add_cfa_restore (reg);
11308
11309 mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
11310 if (REGNO (reg) == REGNO (mips_epilogue.cfa_reg))
11311 /* The CFA is currently defined in terms of the register whose
11312 value we have just restored. Redefine the CFA in terms of
11313 the stack pointer. */
11314 mips_epilogue_set_cfa (stack_pointer_rtx,
11315 mips_epilogue.cfa_restore_sp_offset);
11316 }
11317
11318 /* Emit code to set the stack pointer to BASE + OFFSET, given that
11319 BASE + OFFSET is NEW_FRAME_SIZE bytes below the top of the frame.
11320 BASE, if not the stack pointer, is available as a temporary. */
11321
11322 static void
11323 mips_deallocate_stack (rtx base, rtx offset, HOST_WIDE_INT new_frame_size)
11324 {
11325 if (base == stack_pointer_rtx && offset == const0_rtx)
11326 return;
11327
11328 mips_frame_barrier ();
11329 if (offset == const0_rtx)
11330 {
11331 emit_move_insn (stack_pointer_rtx, base);
11332 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11333 }
11334 else if (TARGET_MIPS16 && base != stack_pointer_rtx)
11335 {
11336 emit_insn (gen_add3_insn (base, base, offset));
11337 mips_epilogue_set_cfa (base, new_frame_size);
11338 emit_move_insn (stack_pointer_rtx, base);
11339 }
11340 else
11341 {
11342 emit_insn (gen_add3_insn (stack_pointer_rtx, base, offset));
11343 mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11344 }
11345 }
11346
11347 /* Emit any instructions needed before a return. */
11348
11349 void
11350 mips_expand_before_return (void)
11351 {
11352 /* When using a call-clobbered gp, we start out with unified call
11353 insns that include instructions to restore the gp. We then split
11354 these unified calls after reload. These split calls explicitly
11355 clobber gp, so there is no need to define
11356 PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
11357
11358 For consistency, we should also insert an explicit clobber of $28
11359 before return insns, so that the post-reload optimizers know that
11360 the register is not live on exit. */
11361 if (TARGET_CALL_CLOBBERED_GP)
11362 emit_clobber (pic_offset_table_rtx);
11363 }
11364
11365 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
11366 says which. */
11367
11368 void
11369 mips_expand_epilogue (bool sibcall_p)
11370 {
11371 const struct mips_frame_info *frame;
11372 HOST_WIDE_INT step1, step2;
11373 rtx base, adjust, insn;
11374 bool use_jraddiusp_p = false;
11375
11376 if (!sibcall_p && mips_can_use_return_insn ())
11377 {
11378 emit_jump_insn (gen_return ());
11379 return;
11380 }
11381
11382 /* In MIPS16 mode, if the return value should go into a floating-point
11383 register, we need to call a helper routine to copy it over. */
11384 if (mips16_cfun_returns_in_fpr_p ())
11385 mips16_copy_fpr_return_value ();
11386
11387 /* Split the frame into two. STEP1 is the amount of stack we should
11388 deallocate before restoring the registers. STEP2 is the amount we
11389 should deallocate afterwards.
11390
11391 Start off by assuming that no registers need to be restored. */
11392 frame = &cfun->machine->frame;
11393 step1 = frame->total_size;
11394 step2 = 0;
11395
11396 /* Work out which register holds the frame address. */
11397 if (!frame_pointer_needed)
11398 base = stack_pointer_rtx;
11399 else
11400 {
11401 base = hard_frame_pointer_rtx;
11402 step1 -= frame->hard_frame_pointer_offset;
11403 }
11404 mips_epilogue.cfa_reg = base;
11405 mips_epilogue.cfa_offset = step1;
11406 mips_epilogue.cfa_restores = NULL_RTX;
11407
11408 /* If we need to restore registers, deallocate as much stack as
11409 possible in the second step without going out of range. */
11410 if ((frame->mask | frame->fmask | frame->acc_mask) != 0
11411 || frame->num_cop0_regs > 0)
11412 {
11413 step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
11414 step1 -= step2;
11415 }
11416
11417 /* Get an rtx for STEP1 that we can add to BASE. */
11418 adjust = GEN_INT (step1);
11419 if (!SMALL_OPERAND (step1))
11420 {
11421 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
11422 adjust = MIPS_EPILOGUE_TEMP (Pmode);
11423 }
11424 mips_deallocate_stack (base, adjust, step2);
11425
11426 /* If we're using addressing macros, $gp is implicitly used by all
11427 SYMBOL_REFs. We must emit a blockage insn before restoring $gp
11428 from the stack. */
11429 if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
11430 emit_insn (gen_blockage ());
11431
11432 mips_epilogue.cfa_restore_sp_offset = step2;
11433 if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
11434 {
11435 unsigned int regno, mask;
11436 HOST_WIDE_INT offset;
11437 rtx restore;
11438
11439 /* Generate the restore instruction. */
11440 mask = frame->mask;
11441 restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
11442
11443 /* Restore any other registers manually. */
11444 for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11445 if (BITSET_P (mask, regno - GP_REG_FIRST))
11446 {
11447 offset -= UNITS_PER_WORD;
11448 mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
11449 }
11450
11451 /* Restore the remaining registers and deallocate the final bit
11452 of the frame. */
11453 mips_frame_barrier ();
11454 emit_insn (restore);
11455 mips_epilogue_set_cfa (stack_pointer_rtx, 0);
11456 }
11457 else
11458 {
11459 /* Restore the registers. */
11460 mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
11461 mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
11462 mips_restore_reg);
11463
11464 if (cfun->machine->interrupt_handler_p)
11465 {
11466 HOST_WIDE_INT offset;
11467 rtx mem;
11468
11469 offset = frame->cop0_sp_offset - (frame->total_size - step2);
11470 if (!cfun->machine->keep_interrupts_masked_p)
11471 {
11472 /* Restore the original EPC. */
11473 mem = gen_frame_mem (word_mode,
11474 plus_constant (Pmode, stack_pointer_rtx,
11475 offset));
11476 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11477 offset -= UNITS_PER_WORD;
11478
11479 /* Move to COP0 EPC. */
11480 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
11481 gen_rtx_REG (SImode, K0_REG_NUM)));
11482 }
11483
11484 /* Restore the original Status. */
11485 mem = gen_frame_mem (word_mode,
11486 plus_constant (Pmode, stack_pointer_rtx,
11487 offset));
11488 mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11489 offset -= UNITS_PER_WORD;
11490
11491 /* If we don't use shadow register set, we need to update SP. */
11492 if (!cfun->machine->use_shadow_register_set_p)
11493 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11494 else
11495 /* The choice of position is somewhat arbitrary in this case. */
11496 mips_epilogue_emit_cfa_restores ();
11497
11498 /* Move to COP0 Status. */
11499 emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11500 gen_rtx_REG (SImode, K0_REG_NUM)));
11501 }
11502 else if (TARGET_MICROMIPS
11503 && !crtl->calls_eh_return
11504 && !sibcall_p
11505 && step2 > 0
11506 && mips_unsigned_immediate_p (step2, 5, 2))
11507 use_jraddiusp_p = true;
11508 else
11509 /* Deallocate the final bit of the frame. */
11510 mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11511 }
11512
11513 if (!use_jraddiusp_p)
11514 gcc_assert (!mips_epilogue.cfa_restores);
11515
11516 /* Add in the __builtin_eh_return stack adjustment. We need to
11517 use a temporary in MIPS16 code. */
11518 if (crtl->calls_eh_return)
11519 {
11520 if (TARGET_MIPS16)
11521 {
11522 mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
11523 emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
11524 MIPS_EPILOGUE_TEMP (Pmode),
11525 EH_RETURN_STACKADJ_RTX));
11526 mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
11527 }
11528 else
11529 emit_insn (gen_add3_insn (stack_pointer_rtx,
11530 stack_pointer_rtx,
11531 EH_RETURN_STACKADJ_RTX));
11532 }
11533
11534 if (!sibcall_p)
11535 {
11536 mips_expand_before_return ();
11537 if (cfun->machine->interrupt_handler_p)
11538 {
11539 /* Interrupt handlers generate eret or deret. */
11540 if (cfun->machine->use_debug_exception_return_p)
11541 emit_jump_insn (gen_mips_deret ());
11542 else
11543 emit_jump_insn (gen_mips_eret ());
11544 }
11545 else
11546 {
11547 rtx pat;
11548
11549 /* When generating MIPS16 code, the normal
11550 mips_for_each_saved_gpr_and_fpr path will restore the return
11551 address into $7 rather than $31. */
11552 if (TARGET_MIPS16
11553 && !GENERATE_MIPS16E_SAVE_RESTORE
11554 && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
11555 {
11556 /* simple_returns cannot rely on values that are only available
11557 on paths through the epilogue (because return paths that do
11558 not pass through the epilogue may nevertheless reuse a
11559 simple_return that occurs at the end of the epilogue).
11560 Use a normal return here instead. */
11561 rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
11562 pat = gen_return_internal (reg);
11563 }
11564 else if (use_jraddiusp_p)
11565 pat = gen_jraddiusp (GEN_INT (step2));
11566 else
11567 {
11568 rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
11569 pat = gen_simple_return_internal (reg);
11570 }
11571 emit_jump_insn (pat);
11572 if (use_jraddiusp_p)
11573 mips_epilogue_set_cfa (stack_pointer_rtx, step2);
11574 }
11575 }
11576
11577 /* Search from the beginning to the first use of K0 or K1. */
11578 if (cfun->machine->interrupt_handler_p
11579 && !cfun->machine->keep_interrupts_masked_p)
11580 {
11581 for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
11582 if (INSN_P (insn)
11583 && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
11584 break;
11585 gcc_assert (insn != NULL_RTX);
11586 /* Insert disable interrupts before the first use of K0 or K1. */
11587 emit_insn_before (gen_mips_di (), insn);
11588 emit_insn_before (gen_mips_ehb (), insn);
11589 }
11590 }
11591 \f
11592 /* Return nonzero if this function is known to have a null epilogue.
11593 This allows the optimizer to omit jumps to jumps if no stack
11594 was created. */
11595
11596 bool
11597 mips_can_use_return_insn (void)
11598 {
11599 /* Interrupt handlers need to go through the epilogue. */
11600 if (cfun->machine->interrupt_handler_p)
11601 return false;
11602
11603 if (!reload_completed)
11604 return false;
11605
11606 if (crtl->profile)
11607 return false;
11608
11609 /* In MIPS16 mode, a function that returns a floating-point value
11610 needs to arrange to copy the return value into the floating-point
11611 registers. */
11612 if (mips16_cfun_returns_in_fpr_p ())
11613 return false;
11614
11615 return cfun->machine->frame.total_size == 0;
11616 }
11617 \f
11618 /* Return true if register REGNO can store a value of mode MODE.
11619 The result of this function is cached in mips_hard_regno_mode_ok. */
11620
11621 static bool
11622 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
11623 {
11624 unsigned int size;
11625 enum mode_class mclass;
11626
11627 if (mode == CCV2mode)
11628 return (ISA_HAS_8CC
11629 && ST_REG_P (regno)
11630 && (regno - ST_REG_FIRST) % 2 == 0);
11631
11632 if (mode == CCV4mode)
11633 return (ISA_HAS_8CC
11634 && ST_REG_P (regno)
11635 && (regno - ST_REG_FIRST) % 4 == 0);
11636
11637 if (mode == CCmode)
11638 return ISA_HAS_8CC ? ST_REG_P (regno) : regno == FPSW_REGNUM;
11639
11640 size = GET_MODE_SIZE (mode);
11641 mclass = GET_MODE_CLASS (mode);
11642
11643 if (GP_REG_P (regno))
11644 return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
11645
11646 if (FP_REG_P (regno)
11647 && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
11648 || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
11649 {
11650 /* Allow 64-bit vector modes for Loongson-2E/2F. */
11651 if (TARGET_LOONGSON_VECTORS
11652 && (mode == V2SImode
11653 || mode == V4HImode
11654 || mode == V8QImode
11655 || mode == DImode))
11656 return true;
11657
11658 if (mclass == MODE_FLOAT
11659 || mclass == MODE_COMPLEX_FLOAT
11660 || mclass == MODE_VECTOR_FLOAT)
11661 return size <= UNITS_PER_FPVALUE;
11662
11663 /* Allow integer modes that fit into a single register. We need
11664 to put integers into FPRs when using instructions like CVT
11665 and TRUNC. There's no point allowing sizes smaller than a word,
11666 because the FPU has no appropriate load/store instructions. */
11667 if (mclass == MODE_INT)
11668 return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
11669 }
11670
11671 if (ACC_REG_P (regno)
11672 && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
11673 {
11674 if (MD_REG_P (regno))
11675 {
11676 /* After a multiplication or division, clobbering HI makes
11677 the value of LO unpredictable, and vice versa. This means
11678 that, for all interesting cases, HI and LO are effectively
11679 a single register.
11680
11681 We model this by requiring that any value that uses HI
11682 also uses LO. */
11683 if (size <= UNITS_PER_WORD * 2)
11684 return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
11685 }
11686 else
11687 {
11688 /* DSP accumulators do not have the same restrictions as
11689 HI and LO, so we can treat them as normal doubleword
11690 registers. */
11691 if (size <= UNITS_PER_WORD)
11692 return true;
11693
11694 if (size <= UNITS_PER_WORD * 2
11695 && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
11696 return true;
11697 }
11698 }
11699
11700 if (ALL_COP_REG_P (regno))
11701 return mclass == MODE_INT && size <= UNITS_PER_WORD;
11702
11703 if (regno == GOT_VERSION_REGNUM)
11704 return mode == SImode;
11705
11706 return false;
11707 }
11708
11709 /* Implement HARD_REGNO_NREGS. */
11710
11711 unsigned int
11712 mips_hard_regno_nregs (int regno, enum machine_mode mode)
11713 {
11714 if (ST_REG_P (regno))
11715 /* The size of FP status registers is always 4, because they only hold
11716 CCmode values, and CCmode is always considered to be 4 bytes wide. */
11717 return (GET_MODE_SIZE (mode) + 3) / 4;
11718
11719 if (FP_REG_P (regno))
11720 return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
11721
11722 /* All other registers are word-sized. */
11723 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
11724 }
11725
11726 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
11727 in mips_hard_regno_nregs. */
11728
11729 int
11730 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
11731 {
11732 int size;
11733 HARD_REG_SET left;
11734
11735 size = 0x8000;
11736 COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
11737 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
11738 {
11739 if (HARD_REGNO_MODE_OK (ST_REG_FIRST, mode))
11740 size = MIN (size, 4);
11741 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
11742 }
11743 if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
11744 {
11745 if (HARD_REGNO_MODE_OK (FP_REG_FIRST, mode))
11746 size = MIN (size, UNITS_PER_FPREG);
11747 AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
11748 }
11749 if (!hard_reg_set_empty_p (left))
11750 size = MIN (size, UNITS_PER_WORD);
11751 return (GET_MODE_SIZE (mode) + size - 1) / size;
11752 }
11753
11754 /* Implement CANNOT_CHANGE_MODE_CLASS. */
11755
11756 bool
11757 mips_cannot_change_mode_class (enum machine_mode from,
11758 enum machine_mode to,
11759 enum reg_class rclass)
11760 {
11761 /* Allow conversions between different Loongson integer vectors,
11762 and between those vectors and DImode. */
11763 if (GET_MODE_SIZE (from) == 8 && GET_MODE_SIZE (to) == 8
11764 && INTEGRAL_MODE_P (from) && INTEGRAL_MODE_P (to))
11765 return false;
11766
11767 /* Otherwise, there are several problems with changing the modes of
11768 values in floating-point registers:
11769
11770 - When a multi-word value is stored in paired floating-point
11771 registers, the first register always holds the low word. We
11772 therefore can't allow FPRs to change between single-word and
11773 multi-word modes on big-endian targets.
11774
11775 - GCC assumes that each word of a multiword register can be
11776 accessed individually using SUBREGs. This is not true for
11777 floating-point registers if they are bigger than a word.
11778
11779 - Loading a 32-bit value into a 64-bit floating-point register
11780 will not sign-extend the value, despite what LOAD_EXTEND_OP
11781 says. We can't allow FPRs to change from SImode to a wider
11782 mode on 64-bit targets.
11783
11784 - If the FPU has already interpreted a value in one format, we
11785 must not ask it to treat the value as having a different
11786 format.
11787
11788 We therefore disallow all mode changes involving FPRs. */
11789
11790 return reg_classes_intersect_p (FP_REGS, rclass);
11791 }
11792
11793 /* Implement target hook small_register_classes_for_mode_p. */
11794
11795 static bool
11796 mips_small_register_classes_for_mode_p (enum machine_mode mode
11797 ATTRIBUTE_UNUSED)
11798 {
11799 return TARGET_MIPS16;
11800 }
11801
11802 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction. */
11803
11804 static bool
11805 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
11806 {
11807 switch (mode)
11808 {
11809 case SFmode:
11810 return TARGET_HARD_FLOAT;
11811
11812 case DFmode:
11813 return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
11814
11815 case V2SFmode:
11816 return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
11817
11818 default:
11819 return false;
11820 }
11821 }
11822
11823 /* Implement MODES_TIEABLE_P. */
11824
11825 bool
11826 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
11827 {
11828 /* FPRs allow no mode punning, so it's not worth tying modes if we'd
11829 prefer to put one of them in FPRs. */
11830 return (mode1 == mode2
11831 || (!mips_mode_ok_for_mov_fmt_p (mode1)
11832 && !mips_mode_ok_for_mov_fmt_p (mode2)));
11833 }
11834
11835 /* Implement TARGET_PREFERRED_RELOAD_CLASS. */
11836
11837 static reg_class_t
11838 mips_preferred_reload_class (rtx x, reg_class_t rclass)
11839 {
11840 if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
11841 return LEA_REGS;
11842
11843 if (reg_class_subset_p (FP_REGS, rclass)
11844 && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
11845 return FP_REGS;
11846
11847 if (reg_class_subset_p (GR_REGS, rclass))
11848 rclass = GR_REGS;
11849
11850 if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
11851 rclass = M16_REGS;
11852
11853 return rclass;
11854 }
11855
11856 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
11857 Return a "canonical" class to represent it in later calculations. */
11858
11859 static reg_class_t
11860 mips_canonicalize_move_class (reg_class_t rclass)
11861 {
11862 /* All moves involving accumulator registers have the same cost. */
11863 if (reg_class_subset_p (rclass, ACC_REGS))
11864 rclass = ACC_REGS;
11865
11866 /* Likewise promote subclasses of general registers to the most
11867 interesting containing class. */
11868 if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
11869 rclass = M16_REGS;
11870 else if (reg_class_subset_p (rclass, GENERAL_REGS))
11871 rclass = GENERAL_REGS;
11872
11873 return rclass;
11874 }
11875
11876 /* Return the cost of moving a value of mode MODE from a register of
11877 class FROM to a GPR. Return 0 for classes that are unions of other
11878 classes handled by this function. */
11879
11880 static int
11881 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
11882 reg_class_t from)
11883 {
11884 switch (from)
11885 {
11886 case M16_REGS:
11887 case GENERAL_REGS:
11888 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
11889 return 2;
11890
11891 case ACC_REGS:
11892 /* MFLO and MFHI. */
11893 return 6;
11894
11895 case FP_REGS:
11896 /* MFC1, etc. */
11897 return 4;
11898
11899 case ST_REGS:
11900 /* LUI followed by MOVF. */
11901 return 4;
11902
11903 case COP0_REGS:
11904 case COP2_REGS:
11905 case COP3_REGS:
11906 /* This choice of value is historical. */
11907 return 5;
11908
11909 default:
11910 return 0;
11911 }
11912 }
11913
11914 /* Return the cost of moving a value of mode MODE from a GPR to a
11915 register of class TO. Return 0 for classes that are unions of
11916 other classes handled by this function. */
11917
11918 static int
11919 mips_move_from_gpr_cost (enum machine_mode mode, reg_class_t to)
11920 {
11921 switch (to)
11922 {
11923 case M16_REGS:
11924 case GENERAL_REGS:
11925 /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro. */
11926 return 2;
11927
11928 case ACC_REGS:
11929 /* MTLO and MTHI. */
11930 return 6;
11931
11932 case FP_REGS:
11933 /* MTC1, etc. */
11934 return 4;
11935
11936 case ST_REGS:
11937 /* A secondary reload through an FPR scratch. */
11938 return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
11939 + mips_register_move_cost (mode, FP_REGS, ST_REGS));
11940
11941 case COP0_REGS:
11942 case COP2_REGS:
11943 case COP3_REGS:
11944 /* This choice of value is historical. */
11945 return 5;
11946
11947 default:
11948 return 0;
11949 }
11950 }
11951
11952 /* Implement TARGET_REGISTER_MOVE_COST. Return 0 for classes that are the
11953 maximum of the move costs for subclasses; regclass will work out
11954 the maximum for us. */
11955
11956 static int
11957 mips_register_move_cost (enum machine_mode mode,
11958 reg_class_t from, reg_class_t to)
11959 {
11960 reg_class_t dregs;
11961 int cost1, cost2;
11962
11963 from = mips_canonicalize_move_class (from);
11964 to = mips_canonicalize_move_class (to);
11965
11966 /* Handle moves that can be done without using general-purpose registers. */
11967 if (from == FP_REGS)
11968 {
11969 if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
11970 /* MOV.FMT. */
11971 return 4;
11972 if (to == ST_REGS)
11973 /* The sequence generated by mips_expand_fcc_reload. */
11974 return 8;
11975 }
11976
11977 /* Handle cases in which only one class deviates from the ideal. */
11978 dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
11979 if (from == dregs)
11980 return mips_move_from_gpr_cost (mode, to);
11981 if (to == dregs)
11982 return mips_move_to_gpr_cost (mode, from);
11983
11984 /* Handles cases that require a GPR temporary. */
11985 cost1 = mips_move_to_gpr_cost (mode, from);
11986 if (cost1 != 0)
11987 {
11988 cost2 = mips_move_from_gpr_cost (mode, to);
11989 if (cost2 != 0)
11990 return cost1 + cost2;
11991 }
11992
11993 return 0;
11994 }
11995
11996 /* Implement TARGET_MEMORY_MOVE_COST. */
11997
11998 static int
11999 mips_memory_move_cost (enum machine_mode mode, reg_class_t rclass, bool in)
12000 {
12001 return (mips_cost->memory_latency
12002 + memory_move_secondary_cost (mode, rclass, in));
12003 }
12004
12005 /* Return the register class required for a secondary register when
12006 copying between one of the registers in RCLASS and value X, which
12007 has mode MODE. X is the source of the move if IN_P, otherwise it
12008 is the destination. Return NO_REGS if no secondary register is
12009 needed. */
12010
12011 enum reg_class
12012 mips_secondary_reload_class (enum reg_class rclass,
12013 enum machine_mode mode, rtx x, bool in_p)
12014 {
12015 int regno;
12016
12017 /* If X is a constant that cannot be loaded into $25, it must be loaded
12018 into some other GPR. No other register class allows a direct move. */
12019 if (mips_dangerous_for_la25_p (x))
12020 return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
12021
12022 regno = true_regnum (x);
12023 if (TARGET_MIPS16)
12024 {
12025 /* In MIPS16 mode, every move must involve a member of M16_REGS. */
12026 if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
12027 return M16_REGS;
12028
12029 return NO_REGS;
12030 }
12031
12032 /* Copying from accumulator registers to anywhere other than a general
12033 register requires a temporary general register. */
12034 if (reg_class_subset_p (rclass, ACC_REGS))
12035 return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12036 if (ACC_REG_P (regno))
12037 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12038
12039 /* We can only copy a value to a condition code register from a
12040 floating-point register, and even then we require a scratch
12041 floating-point register. We can only copy a value out of a
12042 condition-code register into a general register. */
12043 if (reg_class_subset_p (rclass, ST_REGS))
12044 {
12045 if (in_p)
12046 return FP_REGS;
12047 return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12048 }
12049 if (ST_REG_P (regno))
12050 {
12051 if (!in_p)
12052 return FP_REGS;
12053 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12054 }
12055
12056 if (reg_class_subset_p (rclass, FP_REGS))
12057 {
12058 if (MEM_P (x)
12059 && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
12060 /* In this case we can use lwc1, swc1, ldc1 or sdc1. We'll use
12061 pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported. */
12062 return NO_REGS;
12063
12064 if (GP_REG_P (regno) || x == CONST0_RTX (mode))
12065 /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
12066 return NO_REGS;
12067
12068 if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (mode, x))
12069 /* We can force the constant to memory and use lwc1
12070 and ldc1. As above, we will use pairs of lwc1s if
12071 ldc1 is not supported. */
12072 return NO_REGS;
12073
12074 if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
12075 /* In this case we can use mov.fmt. */
12076 return NO_REGS;
12077
12078 /* Otherwise, we need to reload through an integer register. */
12079 return GR_REGS;
12080 }
12081 if (FP_REG_P (regno))
12082 return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12083
12084 return NO_REGS;
12085 }
12086
12087 /* Implement TARGET_MODE_REP_EXTENDED. */
12088
12089 static int
12090 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
12091 {
12092 /* On 64-bit targets, SImode register values are sign-extended to DImode. */
12093 if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
12094 return SIGN_EXTEND;
12095
12096 return UNKNOWN;
12097 }
12098 \f
12099 /* Implement TARGET_VALID_POINTER_MODE. */
12100
12101 static bool
12102 mips_valid_pointer_mode (enum machine_mode mode)
12103 {
12104 return mode == SImode || (TARGET_64BIT && mode == DImode);
12105 }
12106
12107 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P. */
12108
12109 static bool
12110 mips_vector_mode_supported_p (enum machine_mode mode)
12111 {
12112 switch (mode)
12113 {
12114 case V2SFmode:
12115 return TARGET_PAIRED_SINGLE_FLOAT;
12116
12117 case V2HImode:
12118 case V4QImode:
12119 case V2HQmode:
12120 case V2UHQmode:
12121 case V2HAmode:
12122 case V2UHAmode:
12123 case V4QQmode:
12124 case V4UQQmode:
12125 return TARGET_DSP;
12126
12127 case V2SImode:
12128 case V4HImode:
12129 case V8QImode:
12130 return TARGET_LOONGSON_VECTORS;
12131
12132 default:
12133 return false;
12134 }
12135 }
12136
12137 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P. */
12138
12139 static bool
12140 mips_scalar_mode_supported_p (enum machine_mode mode)
12141 {
12142 if (ALL_FIXED_POINT_MODE_P (mode)
12143 && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
12144 return true;
12145
12146 return default_scalar_mode_supported_p (mode);
12147 }
12148 \f
12149 /* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE. */
12150
12151 static enum machine_mode
12152 mips_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED)
12153 {
12154 if (TARGET_PAIRED_SINGLE_FLOAT
12155 && mode == SFmode)
12156 return V2SFmode;
12157 return word_mode;
12158 }
12159
12160 /* Implement TARGET_INIT_LIBFUNCS. */
12161
12162 static void
12163 mips_init_libfuncs (void)
12164 {
12165 if (TARGET_FIX_VR4120)
12166 {
12167 /* Register the special divsi3 and modsi3 functions needed to work
12168 around VR4120 division errata. */
12169 set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
12170 set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
12171 }
12172
12173 if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
12174 {
12175 /* Register the MIPS16 -mhard-float stubs. */
12176 set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
12177 set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
12178 set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
12179 set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
12180
12181 set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
12182 set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
12183 set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
12184 set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
12185 set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
12186 set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
12187 set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
12188
12189 set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
12190 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
12191 set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
12192
12193 if (TARGET_DOUBLE_FLOAT)
12194 {
12195 set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
12196 set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
12197 set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
12198 set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
12199
12200 set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
12201 set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
12202 set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
12203 set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
12204 set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
12205 set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
12206 set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
12207
12208 set_conv_libfunc (sext_optab, DFmode, SFmode,
12209 "__mips16_extendsfdf2");
12210 set_conv_libfunc (trunc_optab, SFmode, DFmode,
12211 "__mips16_truncdfsf2");
12212 set_conv_libfunc (sfix_optab, SImode, DFmode,
12213 "__mips16_fix_truncdfsi");
12214 set_conv_libfunc (sfloat_optab, DFmode, SImode,
12215 "__mips16_floatsidf");
12216 set_conv_libfunc (ufloat_optab, DFmode, SImode,
12217 "__mips16_floatunsidf");
12218 }
12219 }
12220
12221 /* The MIPS16 ISA does not have an encoding for "sync", so we rely
12222 on an external non-MIPS16 routine to implement __sync_synchronize.
12223 Similarly for the rest of the ll/sc libfuncs. */
12224 if (TARGET_MIPS16)
12225 {
12226 synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
12227 init_sync_libfuncs (UNITS_PER_WORD);
12228 }
12229 }
12230
12231 /* Build up a multi-insn sequence that loads label TARGET into $AT. */
12232
12233 static void
12234 mips_process_load_label (rtx target)
12235 {
12236 rtx base, gp, intop;
12237 HOST_WIDE_INT offset;
12238
12239 mips_multi_start ();
12240 switch (mips_abi)
12241 {
12242 case ABI_N32:
12243 mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
12244 mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
12245 break;
12246
12247 case ABI_64:
12248 mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
12249 mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
12250 break;
12251
12252 default:
12253 gp = pic_offset_table_rtx;
12254 if (mips_cfun_has_cprestore_slot_p ())
12255 {
12256 gp = gen_rtx_REG (Pmode, AT_REGNUM);
12257 mips_get_cprestore_base_and_offset (&base, &offset, true);
12258 if (!SMALL_OPERAND (offset))
12259 {
12260 intop = GEN_INT (CONST_HIGH_PART (offset));
12261 mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
12262 mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
12263
12264 base = gp;
12265 offset = CONST_LOW_PART (offset);
12266 }
12267 intop = GEN_INT (offset);
12268 if (ISA_HAS_LOAD_DELAY)
12269 mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
12270 else
12271 mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
12272 }
12273 if (ISA_HAS_LOAD_DELAY)
12274 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
12275 else
12276 mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
12277 mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
12278 break;
12279 }
12280 }
12281
12282 /* Return the number of instructions needed to load a label into $AT. */
12283
12284 static unsigned int
12285 mips_load_label_num_insns (void)
12286 {
12287 if (cfun->machine->load_label_num_insns == 0)
12288 {
12289 mips_process_load_label (pc_rtx);
12290 cfun->machine->load_label_num_insns = mips_multi_num_insns;
12291 }
12292 return cfun->machine->load_label_num_insns;
12293 }
12294
12295 /* Emit an asm sequence to start a noat block and load the address
12296 of a label into $1. */
12297
12298 void
12299 mips_output_load_label (rtx target)
12300 {
12301 mips_push_asm_switch (&mips_noat);
12302 if (TARGET_EXPLICIT_RELOCS)
12303 {
12304 mips_process_load_label (target);
12305 mips_multi_write ();
12306 }
12307 else
12308 {
12309 if (Pmode == DImode)
12310 output_asm_insn ("dla\t%@,%0", &target);
12311 else
12312 output_asm_insn ("la\t%@,%0", &target);
12313 }
12314 }
12315
12316 /* Return the length of INSN. LENGTH is the initial length computed by
12317 attributes in the machine-description file. */
12318
12319 int
12320 mips_adjust_insn_length (rtx insn, int length)
12321 {
12322 /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
12323 of a PIC long-branch sequence. Substitute the correct value. */
12324 if (length == MAX_PIC_BRANCH_LENGTH
12325 && JUMP_P (insn)
12326 && INSN_CODE (insn) >= 0
12327 && get_attr_type (insn) == TYPE_BRANCH)
12328 {
12329 /* Add the branch-over instruction and its delay slot, if this
12330 is a conditional branch. */
12331 length = simplejump_p (insn) ? 0 : 8;
12332
12333 /* Add the size of a load into $AT. */
12334 length += BASE_INSN_LENGTH * mips_load_label_num_insns ();
12335
12336 /* Add the length of an indirect jump, ignoring the delay slot. */
12337 length += TARGET_COMPRESSION ? 2 : 4;
12338 }
12339
12340 /* A unconditional jump has an unfilled delay slot if it is not part
12341 of a sequence. A conditional jump normally has a delay slot, but
12342 does not on MIPS16. */
12343 if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
12344 length += TARGET_MIPS16 ? 2 : 4;
12345
12346 /* See how many nops might be needed to avoid hardware hazards. */
12347 if (!cfun->machine->ignore_hazard_length_p
12348 && INSN_P (insn)
12349 && INSN_CODE (insn) >= 0)
12350 switch (get_attr_hazard (insn))
12351 {
12352 case HAZARD_NONE:
12353 break;
12354
12355 case HAZARD_DELAY:
12356 length += NOP_INSN_LENGTH;
12357 break;
12358
12359 case HAZARD_HILO:
12360 length += NOP_INSN_LENGTH * 2;
12361 break;
12362 }
12363
12364 return length;
12365 }
12366
12367 /* Return the assembly code for INSN, which has the operands given by
12368 OPERANDS, and which branches to OPERANDS[0] if some condition is true.
12369 BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
12370 is in range of a direct branch. BRANCH_IF_FALSE is an inverted
12371 version of BRANCH_IF_TRUE. */
12372
12373 const char *
12374 mips_output_conditional_branch (rtx insn, rtx *operands,
12375 const char *branch_if_true,
12376 const char *branch_if_false)
12377 {
12378 unsigned int length;
12379 rtx taken, not_taken;
12380
12381 gcc_assert (LABEL_P (operands[0]));
12382
12383 length = get_attr_length (insn);
12384 if (length <= 8)
12385 {
12386 /* Just a simple conditional branch. */
12387 mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
12388 return branch_if_true;
12389 }
12390
12391 /* Generate a reversed branch around a direct jump. This fallback does
12392 not use branch-likely instructions. */
12393 mips_branch_likely = false;
12394 not_taken = gen_label_rtx ();
12395 taken = operands[0];
12396
12397 /* Generate the reversed branch to NOT_TAKEN. */
12398 operands[0] = not_taken;
12399 output_asm_insn (branch_if_false, operands);
12400
12401 /* If INSN has a delay slot, we must provide delay slots for both the
12402 branch to NOT_TAKEN and the conditional jump. We must also ensure
12403 that INSN's delay slot is executed in the appropriate cases. */
12404 if (final_sequence)
12405 {
12406 /* This first delay slot will always be executed, so use INSN's
12407 delay slot if is not annulled. */
12408 if (!INSN_ANNULLED_BRANCH_P (insn))
12409 {
12410 final_scan_insn (XVECEXP (final_sequence, 0, 1),
12411 asm_out_file, optimize, 1, NULL);
12412 INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
12413 }
12414 else
12415 output_asm_insn ("nop", 0);
12416 fprintf (asm_out_file, "\n");
12417 }
12418
12419 /* Output the unconditional branch to TAKEN. */
12420 if (TARGET_ABSOLUTE_JUMPS)
12421 output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
12422 else
12423 {
12424 mips_output_load_label (taken);
12425 output_asm_insn ("jr\t%@%]%/", 0);
12426 }
12427
12428 /* Now deal with its delay slot; see above. */
12429 if (final_sequence)
12430 {
12431 /* This delay slot will only be executed if the branch is taken.
12432 Use INSN's delay slot if is annulled. */
12433 if (INSN_ANNULLED_BRANCH_P (insn))
12434 {
12435 final_scan_insn (XVECEXP (final_sequence, 0, 1),
12436 asm_out_file, optimize, 1, NULL);
12437 INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
12438 }
12439 else
12440 output_asm_insn ("nop", 0);
12441 fprintf (asm_out_file, "\n");
12442 }
12443
12444 /* Output NOT_TAKEN. */
12445 targetm.asm_out.internal_label (asm_out_file, "L",
12446 CODE_LABEL_NUMBER (not_taken));
12447 return "";
12448 }
12449
12450 /* Return the assembly code for INSN, which branches to OPERANDS[0]
12451 if some ordering condition is true. The condition is given by
12452 OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
12453 OPERANDS[1]. OPERANDS[2] is the comparison's first operand;
12454 its second is always zero. */
12455
12456 const char *
12457 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
12458 {
12459 const char *branch[2];
12460
12461 /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
12462 Make BRANCH[0] branch on the inverse condition. */
12463 switch (GET_CODE (operands[1]))
12464 {
12465 /* These cases are equivalent to comparisons against zero. */
12466 case LEU:
12467 inverted_p = !inverted_p;
12468 /* Fall through. */
12469 case GTU:
12470 branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
12471 branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
12472 break;
12473
12474 /* These cases are always true or always false. */
12475 case LTU:
12476 inverted_p = !inverted_p;
12477 /* Fall through. */
12478 case GEU:
12479 branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
12480 branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
12481 break;
12482
12483 default:
12484 branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
12485 branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
12486 break;
12487 }
12488 return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
12489 }
12490 \f
12491 /* Start a block of code that needs access to the LL, SC and SYNC
12492 instructions. */
12493
12494 static void
12495 mips_start_ll_sc_sync_block (void)
12496 {
12497 if (!ISA_HAS_LL_SC)
12498 {
12499 output_asm_insn (".set\tpush", 0);
12500 if (TARGET_64BIT)
12501 output_asm_insn (".set\tmips3", 0);
12502 else
12503 output_asm_insn (".set\tmips2", 0);
12504 }
12505 }
12506
12507 /* End a block started by mips_start_ll_sc_sync_block. */
12508
12509 static void
12510 mips_end_ll_sc_sync_block (void)
12511 {
12512 if (!ISA_HAS_LL_SC)
12513 output_asm_insn (".set\tpop", 0);
12514 }
12515
12516 /* Output and/or return the asm template for a sync instruction. */
12517
12518 const char *
12519 mips_output_sync (void)
12520 {
12521 mips_start_ll_sc_sync_block ();
12522 output_asm_insn ("sync", 0);
12523 mips_end_ll_sc_sync_block ();
12524 return "";
12525 }
12526
12527 /* Return the asm template associated with sync_insn1 value TYPE.
12528 IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation. */
12529
12530 static const char *
12531 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
12532 {
12533 switch (type)
12534 {
12535 case SYNC_INSN1_MOVE:
12536 return "move\t%0,%z2";
12537 case SYNC_INSN1_LI:
12538 return "li\t%0,%2";
12539 case SYNC_INSN1_ADDU:
12540 return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
12541 case SYNC_INSN1_ADDIU:
12542 return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
12543 case SYNC_INSN1_SUBU:
12544 return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
12545 case SYNC_INSN1_AND:
12546 return "and\t%0,%1,%z2";
12547 case SYNC_INSN1_ANDI:
12548 return "andi\t%0,%1,%2";
12549 case SYNC_INSN1_OR:
12550 return "or\t%0,%1,%z2";
12551 case SYNC_INSN1_ORI:
12552 return "ori\t%0,%1,%2";
12553 case SYNC_INSN1_XOR:
12554 return "xor\t%0,%1,%z2";
12555 case SYNC_INSN1_XORI:
12556 return "xori\t%0,%1,%2";
12557 }
12558 gcc_unreachable ();
12559 }
12560
12561 /* Return the asm template associated with sync_insn2 value TYPE. */
12562
12563 static const char *
12564 mips_sync_insn2_template (enum attr_sync_insn2 type)
12565 {
12566 switch (type)
12567 {
12568 case SYNC_INSN2_NOP:
12569 gcc_unreachable ();
12570 case SYNC_INSN2_AND:
12571 return "and\t%0,%1,%z2";
12572 case SYNC_INSN2_XOR:
12573 return "xor\t%0,%1,%z2";
12574 case SYNC_INSN2_NOT:
12575 return "nor\t%0,%1,%.";
12576 }
12577 gcc_unreachable ();
12578 }
12579
12580 /* OPERANDS are the operands to a sync loop instruction and INDEX is
12581 the value of the one of the sync_* attributes. Return the operand
12582 referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
12583 have the associated attribute. */
12584
12585 static rtx
12586 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
12587 {
12588 if (index > 0)
12589 default_value = operands[index - 1];
12590 return default_value;
12591 }
12592
12593 /* INSN is a sync loop with operands OPERANDS. Build up a multi-insn
12594 sequence for it. */
12595
12596 static void
12597 mips_process_sync_loop (rtx insn, rtx *operands)
12598 {
12599 rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
12600 rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3, cmp;
12601 unsigned int tmp3_insn;
12602 enum attr_sync_insn1 insn1;
12603 enum attr_sync_insn2 insn2;
12604 bool is_64bit_p;
12605 int memmodel_attr;
12606 enum memmodel model;
12607
12608 /* Read an operand from the sync_WHAT attribute and store it in
12609 variable WHAT. DEFAULT is the default value if no attribute
12610 is specified. */
12611 #define READ_OPERAND(WHAT, DEFAULT) \
12612 WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
12613 DEFAULT)
12614
12615 /* Read the memory. */
12616 READ_OPERAND (mem, 0);
12617 gcc_assert (mem);
12618 is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
12619
12620 /* Read the other attributes. */
12621 at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
12622 READ_OPERAND (oldval, at);
12623 READ_OPERAND (cmp, 0);
12624 READ_OPERAND (newval, at);
12625 READ_OPERAND (inclusive_mask, 0);
12626 READ_OPERAND (exclusive_mask, 0);
12627 READ_OPERAND (required_oldval, 0);
12628 READ_OPERAND (insn1_op2, 0);
12629 insn1 = get_attr_sync_insn1 (insn);
12630 insn2 = get_attr_sync_insn2 (insn);
12631
12632 /* Don't bother setting CMP result that is never used. */
12633 if (cmp && find_reg_note (insn, REG_UNUSED, cmp))
12634 cmp = 0;
12635
12636 memmodel_attr = get_attr_sync_memmodel (insn);
12637 switch (memmodel_attr)
12638 {
12639 case 10:
12640 model = MEMMODEL_ACQ_REL;
12641 break;
12642 case 11:
12643 model = MEMMODEL_ACQUIRE;
12644 break;
12645 default:
12646 model = (enum memmodel) INTVAL (operands[memmodel_attr]);
12647 }
12648
12649 mips_multi_start ();
12650
12651 /* Output the release side of the memory barrier. */
12652 if (need_atomic_barrier_p (model, true))
12653 {
12654 if (required_oldval == 0 && TARGET_OCTEON)
12655 {
12656 /* Octeon doesn't reorder reads, so a full barrier can be
12657 created by using SYNCW to order writes combined with the
12658 write from the following SC. When the SC successfully
12659 completes, we know that all preceding writes are also
12660 committed to the coherent memory system. It is possible
12661 for a single SYNCW to fail, but a pair of them will never
12662 fail, so we use two. */
12663 mips_multi_add_insn ("syncw", NULL);
12664 mips_multi_add_insn ("syncw", NULL);
12665 }
12666 else
12667 mips_multi_add_insn ("sync", NULL);
12668 }
12669
12670 /* Output the branch-back label. */
12671 mips_multi_add_label ("1:");
12672
12673 /* OLDVAL = *MEM. */
12674 mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
12675 oldval, mem, NULL);
12676
12677 /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2. */
12678 if (required_oldval)
12679 {
12680 if (inclusive_mask == 0)
12681 tmp1 = oldval;
12682 else
12683 {
12684 gcc_assert (oldval != at);
12685 mips_multi_add_insn ("and\t%0,%1,%2",
12686 at, oldval, inclusive_mask, NULL);
12687 tmp1 = at;
12688 }
12689 mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
12690
12691 /* CMP = 0 [delay slot]. */
12692 if (cmp)
12693 mips_multi_add_insn ("li\t%0,0", cmp, NULL);
12694 }
12695
12696 /* $TMP1 = OLDVAL & EXCLUSIVE_MASK. */
12697 if (exclusive_mask == 0)
12698 tmp1 = const0_rtx;
12699 else
12700 {
12701 gcc_assert (oldval != at);
12702 mips_multi_add_insn ("and\t%0,%1,%z2",
12703 at, oldval, exclusive_mask, NULL);
12704 tmp1 = at;
12705 }
12706
12707 /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
12708
12709 We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
12710 at least one instruction in that case. */
12711 if (insn1 == SYNC_INSN1_MOVE
12712 && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
12713 tmp2 = insn1_op2;
12714 else
12715 {
12716 mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
12717 newval, oldval, insn1_op2, NULL);
12718 tmp2 = newval;
12719 }
12720
12721 /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK). */
12722 if (insn2 == SYNC_INSN2_NOP)
12723 tmp3 = tmp2;
12724 else
12725 {
12726 mips_multi_add_insn (mips_sync_insn2_template (insn2),
12727 newval, tmp2, inclusive_mask, NULL);
12728 tmp3 = newval;
12729 }
12730 tmp3_insn = mips_multi_last_index ();
12731
12732 /* $AT = $TMP1 | $TMP3. */
12733 if (tmp1 == const0_rtx || tmp3 == const0_rtx)
12734 {
12735 mips_multi_set_operand (tmp3_insn, 0, at);
12736 tmp3 = at;
12737 }
12738 else
12739 {
12740 gcc_assert (tmp1 != tmp3);
12741 mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
12742 }
12743
12744 /* if (!commit (*MEM = $AT)) goto 1.
12745
12746 This will sometimes be a delayed branch; see the write code below
12747 for details. */
12748 mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
12749 mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
12750
12751 /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot]. */
12752 if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
12753 {
12754 mips_multi_copy_insn (tmp3_insn);
12755 mips_multi_set_operand (mips_multi_last_index (), 0, newval);
12756 }
12757 else if (!(required_oldval && cmp))
12758 mips_multi_add_insn ("nop", NULL);
12759
12760 /* CMP = 1 -- either standalone or in a delay slot. */
12761 if (required_oldval && cmp)
12762 mips_multi_add_insn ("li\t%0,1", cmp, NULL);
12763
12764 /* Output the acquire side of the memory barrier. */
12765 if (TARGET_SYNC_AFTER_SC && need_atomic_barrier_p (model, false))
12766 mips_multi_add_insn ("sync", NULL);
12767
12768 /* Output the exit label, if needed. */
12769 if (required_oldval)
12770 mips_multi_add_label ("2:");
12771
12772 #undef READ_OPERAND
12773 }
12774
12775 /* Output and/or return the asm template for sync loop INSN, which has
12776 the operands given by OPERANDS. */
12777
12778 const char *
12779 mips_output_sync_loop (rtx insn, rtx *operands)
12780 {
12781 mips_process_sync_loop (insn, operands);
12782
12783 /* Use branch-likely instructions to work around the LL/SC R10000
12784 errata. */
12785 mips_branch_likely = TARGET_FIX_R10000;
12786
12787 mips_push_asm_switch (&mips_noreorder);
12788 mips_push_asm_switch (&mips_nomacro);
12789 mips_push_asm_switch (&mips_noat);
12790 mips_start_ll_sc_sync_block ();
12791
12792 mips_multi_write ();
12793
12794 mips_end_ll_sc_sync_block ();
12795 mips_pop_asm_switch (&mips_noat);
12796 mips_pop_asm_switch (&mips_nomacro);
12797 mips_pop_asm_switch (&mips_noreorder);
12798
12799 return "";
12800 }
12801
12802 /* Return the number of individual instructions in sync loop INSN,
12803 which has the operands given by OPERANDS. */
12804
12805 unsigned int
12806 mips_sync_loop_insns (rtx insn, rtx *operands)
12807 {
12808 mips_process_sync_loop (insn, operands);
12809 return mips_multi_num_insns;
12810 }
12811 \f
12812 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
12813 the operands given by OPERANDS. Add in a divide-by-zero check if needed.
12814
12815 When working around R4000 and R4400 errata, we need to make sure that
12816 the division is not immediately followed by a shift[1][2]. We also
12817 need to stop the division from being put into a branch delay slot[3].
12818 The easiest way to avoid both problems is to add a nop after the
12819 division. When a divide-by-zero check is needed, this nop can be
12820 used to fill the branch delay slot.
12821
12822 [1] If a double-word or a variable shift executes immediately
12823 after starting an integer division, the shift may give an
12824 incorrect result. See quotations of errata #16 and #28 from
12825 "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12826 in mips.md for details.
12827
12828 [2] A similar bug to [1] exists for all revisions of the
12829 R4000 and the R4400 when run in an MC configuration.
12830 From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
12831
12832 "19. In this following sequence:
12833
12834 ddiv (or ddivu or div or divu)
12835 dsll32 (or dsrl32, dsra32)
12836
12837 if an MPT stall occurs, while the divide is slipping the cpu
12838 pipeline, then the following double shift would end up with an
12839 incorrect result.
12840
12841 Workaround: The compiler needs to avoid generating any
12842 sequence with divide followed by extended double shift."
12843
12844 This erratum is also present in "MIPS R4400MC Errata, Processor
12845 Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
12846 & 3.0" as errata #10 and #4, respectively.
12847
12848 [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12849 (also valid for MIPS R4000MC processors):
12850
12851 "52. R4000SC: This bug does not apply for the R4000PC.
12852
12853 There are two flavors of this bug:
12854
12855 1) If the instruction just after divide takes an RF exception
12856 (tlb-refill, tlb-invalid) and gets an instruction cache
12857 miss (both primary and secondary) and the line which is
12858 currently in secondary cache at this index had the first
12859 data word, where the bits 5..2 are set, then R4000 would
12860 get a wrong result for the div.
12861
12862 ##1
12863 nop
12864 div r8, r9
12865 ------------------- # end-of page. -tlb-refill
12866 nop
12867 ##2
12868 nop
12869 div r8, r9
12870 ------------------- # end-of page. -tlb-invalid
12871 nop
12872
12873 2) If the divide is in the taken branch delay slot, where the
12874 target takes RF exception and gets an I-cache miss for the
12875 exception vector or where I-cache miss occurs for the
12876 target address, under the above mentioned scenarios, the
12877 div would get wrong results.
12878
12879 ##1
12880 j r2 # to next page mapped or unmapped
12881 div r8,r9 # this bug would be there as long
12882 # as there is an ICache miss and
12883 nop # the "data pattern" is present
12884
12885 ##2
12886 beq r0, r0, NextPage # to Next page
12887 div r8,r9
12888 nop
12889
12890 This bug is present for div, divu, ddiv, and ddivu
12891 instructions.
12892
12893 Workaround: For item 1), OS could make sure that the next page
12894 after the divide instruction is also mapped. For item 2), the
12895 compiler could make sure that the divide instruction is not in
12896 the branch delay slot."
12897
12898 These processors have PRId values of 0x00004220 and 0x00004300 for
12899 the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400. */
12900
12901 const char *
12902 mips_output_division (const char *division, rtx *operands)
12903 {
12904 const char *s;
12905
12906 s = division;
12907 if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
12908 {
12909 output_asm_insn (s, operands);
12910 s = "nop";
12911 }
12912 if (TARGET_CHECK_ZERO_DIV)
12913 {
12914 if (TARGET_MIPS16)
12915 {
12916 output_asm_insn (s, operands);
12917 s = "bnez\t%2,1f\n\tbreak\t7\n1:";
12918 }
12919 else if (GENERATE_DIVIDE_TRAPS)
12920 {
12921 /* Avoid long replay penalty on load miss by putting the trap before
12922 the divide. */
12923 if (TUNE_74K)
12924 output_asm_insn ("teq\t%2,%.,7", operands);
12925 else
12926 {
12927 output_asm_insn (s, operands);
12928 s = "teq\t%2,%.,7";
12929 }
12930 }
12931 else
12932 {
12933 output_asm_insn ("%(bne\t%2,%.,1f", operands);
12934 output_asm_insn (s, operands);
12935 s = "break\t7%)\n1:";
12936 }
12937 }
12938 return s;
12939 }
12940 \f
12941 /* Return true if IN_INSN is a multiply-add or multiply-subtract
12942 instruction and if OUT_INSN assigns to the accumulator operand. */
12943
12944 bool
12945 mips_linked_madd_p (rtx out_insn, rtx in_insn)
12946 {
12947 enum attr_accum_in accum_in;
12948 int accum_in_opnum;
12949 rtx accum_in_op;
12950
12951 if (recog_memoized (in_insn) < 0)
12952 return false;
12953
12954 accum_in = get_attr_accum_in (in_insn);
12955 if (accum_in == ACCUM_IN_NONE)
12956 return false;
12957
12958 accum_in_opnum = accum_in - ACCUM_IN_0;
12959
12960 extract_insn (in_insn);
12961 gcc_assert (accum_in_opnum < recog_data.n_operands);
12962 accum_in_op = recog_data.operand[accum_in_opnum];
12963
12964 return reg_set_p (accum_in_op, out_insn);
12965 }
12966
12967 /* True if the dependency between OUT_INSN and IN_INSN is on the store
12968 data rather than the address. We need this because the cprestore
12969 pattern is type "store", but is defined using an UNSPEC_VOLATILE,
12970 which causes the default routine to abort. We just return false
12971 for that case. */
12972
12973 bool
12974 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
12975 {
12976 if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
12977 return false;
12978
12979 return !store_data_bypass_p (out_insn, in_insn);
12980 }
12981 \f
12982
12983 /* Variables and flags used in scheduler hooks when tuning for
12984 Loongson 2E/2F. */
12985 static struct
12986 {
12987 /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
12988 strategy. */
12989
12990 /* If true, then next ALU1/2 instruction will go to ALU1. */
12991 bool alu1_turn_p;
12992
12993 /* If true, then next FALU1/2 unstruction will go to FALU1. */
12994 bool falu1_turn_p;
12995
12996 /* Codes to query if [f]alu{1,2}_core units are subscribed or not. */
12997 int alu1_core_unit_code;
12998 int alu2_core_unit_code;
12999 int falu1_core_unit_code;
13000 int falu2_core_unit_code;
13001
13002 /* True if current cycle has a multi instruction.
13003 This flag is used in mips_ls2_dfa_post_advance_cycle. */
13004 bool cycle_has_multi_p;
13005
13006 /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
13007 These are used in mips_ls2_dfa_post_advance_cycle to initialize
13008 DFA state.
13009 E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
13010 instruction to go ALU1. */
13011 rtx alu1_turn_enabled_insn;
13012 rtx alu2_turn_enabled_insn;
13013 rtx falu1_turn_enabled_insn;
13014 rtx falu2_turn_enabled_insn;
13015 } mips_ls2;
13016
13017 /* Implement TARGET_SCHED_ADJUST_COST. We assume that anti and output
13018 dependencies have no cost, except on the 20Kc where output-dependence
13019 is treated like input-dependence. */
13020
13021 static int
13022 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
13023 rtx dep ATTRIBUTE_UNUSED, int cost)
13024 {
13025 if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
13026 && TUNE_20KC)
13027 return cost;
13028 if (REG_NOTE_KIND (link) != 0)
13029 return 0;
13030 return cost;
13031 }
13032
13033 /* Return the number of instructions that can be issued per cycle. */
13034
13035 static int
13036 mips_issue_rate (void)
13037 {
13038 switch (mips_tune)
13039 {
13040 case PROCESSOR_74KC:
13041 case PROCESSOR_74KF2_1:
13042 case PROCESSOR_74KF1_1:
13043 case PROCESSOR_74KF3_2:
13044 /* The 74k is not strictly quad-issue cpu, but can be seen as one
13045 by the scheduler. It can issue 1 ALU, 1 AGEN and 2 FPU insns,
13046 but in reality only a maximum of 3 insns can be issued as
13047 floating-point loads and stores also require a slot in the
13048 AGEN pipe. */
13049 case PROCESSOR_R10000:
13050 /* All R10K Processors are quad-issue (being the first MIPS
13051 processors to support this feature). */
13052 return 4;
13053
13054 case PROCESSOR_20KC:
13055 case PROCESSOR_R4130:
13056 case PROCESSOR_R5400:
13057 case PROCESSOR_R5500:
13058 case PROCESSOR_R5900:
13059 case PROCESSOR_R7000:
13060 case PROCESSOR_R9000:
13061 case PROCESSOR_OCTEON:
13062 case PROCESSOR_OCTEON2:
13063 return 2;
13064
13065 case PROCESSOR_SB1:
13066 case PROCESSOR_SB1A:
13067 /* This is actually 4, but we get better performance if we claim 3.
13068 This is partly because of unwanted speculative code motion with the
13069 larger number, and partly because in most common cases we can't
13070 reach the theoretical max of 4. */
13071 return 3;
13072
13073 case PROCESSOR_LOONGSON_2E:
13074 case PROCESSOR_LOONGSON_2F:
13075 case PROCESSOR_LOONGSON_3A:
13076 return 4;
13077
13078 case PROCESSOR_XLP:
13079 return (reload_completed ? 4 : 3);
13080
13081 default:
13082 return 1;
13083 }
13084 }
13085
13086 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2. */
13087
13088 static void
13089 mips_ls2_init_dfa_post_cycle_insn (void)
13090 {
13091 start_sequence ();
13092 emit_insn (gen_ls2_alu1_turn_enabled_insn ());
13093 mips_ls2.alu1_turn_enabled_insn = get_insns ();
13094 end_sequence ();
13095
13096 start_sequence ();
13097 emit_insn (gen_ls2_alu2_turn_enabled_insn ());
13098 mips_ls2.alu2_turn_enabled_insn = get_insns ();
13099 end_sequence ();
13100
13101 start_sequence ();
13102 emit_insn (gen_ls2_falu1_turn_enabled_insn ());
13103 mips_ls2.falu1_turn_enabled_insn = get_insns ();
13104 end_sequence ();
13105
13106 start_sequence ();
13107 emit_insn (gen_ls2_falu2_turn_enabled_insn ());
13108 mips_ls2.falu2_turn_enabled_insn = get_insns ();
13109 end_sequence ();
13110
13111 mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
13112 mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
13113 mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
13114 mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
13115 }
13116
13117 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
13118 Init data used in mips_dfa_post_advance_cycle. */
13119
13120 static void
13121 mips_init_dfa_post_cycle_insn (void)
13122 {
13123 if (TUNE_LOONGSON_2EF)
13124 mips_ls2_init_dfa_post_cycle_insn ();
13125 }
13126
13127 /* Initialize STATE when scheduling for Loongson 2E/2F.
13128 Support round-robin dispatch scheme by enabling only one of
13129 ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
13130 respectively. */
13131
13132 static void
13133 mips_ls2_dfa_post_advance_cycle (state_t state)
13134 {
13135 if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
13136 {
13137 /* Though there are no non-pipelined ALU1 insns,
13138 we can get an instruction of type 'multi' before reload. */
13139 gcc_assert (mips_ls2.cycle_has_multi_p);
13140 mips_ls2.alu1_turn_p = false;
13141 }
13142
13143 mips_ls2.cycle_has_multi_p = false;
13144
13145 if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
13146 /* We have a non-pipelined alu instruction in the core,
13147 adjust round-robin counter. */
13148 mips_ls2.alu1_turn_p = true;
13149
13150 if (mips_ls2.alu1_turn_p)
13151 {
13152 if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
13153 gcc_unreachable ();
13154 }
13155 else
13156 {
13157 if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
13158 gcc_unreachable ();
13159 }
13160
13161 if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
13162 {
13163 /* There are no non-pipelined FALU1 insns. */
13164 gcc_unreachable ();
13165 mips_ls2.falu1_turn_p = false;
13166 }
13167
13168 if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
13169 /* We have a non-pipelined falu instruction in the core,
13170 adjust round-robin counter. */
13171 mips_ls2.falu1_turn_p = true;
13172
13173 if (mips_ls2.falu1_turn_p)
13174 {
13175 if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
13176 gcc_unreachable ();
13177 }
13178 else
13179 {
13180 if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
13181 gcc_unreachable ();
13182 }
13183 }
13184
13185 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
13186 This hook is being called at the start of each cycle. */
13187
13188 static void
13189 mips_dfa_post_advance_cycle (void)
13190 {
13191 if (TUNE_LOONGSON_2EF)
13192 mips_ls2_dfa_post_advance_cycle (curr_state);
13193 }
13194
13195 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD. This should
13196 be as wide as the scheduling freedom in the DFA. */
13197
13198 static int
13199 mips_multipass_dfa_lookahead (void)
13200 {
13201 /* Can schedule up to 4 of the 6 function units in any one cycle. */
13202 if (TUNE_SB1)
13203 return 4;
13204
13205 if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
13206 return 4;
13207
13208 if (TUNE_OCTEON)
13209 return 2;
13210
13211 return 0;
13212 }
13213 \f
13214 /* Remove the instruction at index LOWER from ready queue READY and
13215 reinsert it in front of the instruction at index HIGHER. LOWER must
13216 be <= HIGHER. */
13217
13218 static void
13219 mips_promote_ready (rtx *ready, int lower, int higher)
13220 {
13221 rtx new_head;
13222 int i;
13223
13224 new_head = ready[lower];
13225 for (i = lower; i < higher; i++)
13226 ready[i] = ready[i + 1];
13227 ready[i] = new_head;
13228 }
13229
13230 /* If the priority of the instruction at POS2 in the ready queue READY
13231 is within LIMIT units of that of the instruction at POS1, swap the
13232 instructions if POS2 is not already less than POS1. */
13233
13234 static void
13235 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
13236 {
13237 if (pos1 < pos2
13238 && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
13239 {
13240 rtx temp;
13241
13242 temp = ready[pos1];
13243 ready[pos1] = ready[pos2];
13244 ready[pos2] = temp;
13245 }
13246 }
13247 \f
13248 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
13249 that may clobber hi or lo. */
13250 static rtx mips_macc_chains_last_hilo;
13251
13252 /* A TUNE_MACC_CHAINS helper function. Record that instruction INSN has
13253 been scheduled, updating mips_macc_chains_last_hilo appropriately. */
13254
13255 static void
13256 mips_macc_chains_record (rtx insn)
13257 {
13258 if (get_attr_may_clobber_hilo (insn))
13259 mips_macc_chains_last_hilo = insn;
13260 }
13261
13262 /* A TUNE_MACC_CHAINS helper function. Search ready queue READY, which
13263 has NREADY elements, looking for a multiply-add or multiply-subtract
13264 instruction that is cumulative with mips_macc_chains_last_hilo.
13265 If there is one, promote it ahead of anything else that might
13266 clobber hi or lo. */
13267
13268 static void
13269 mips_macc_chains_reorder (rtx *ready, int nready)
13270 {
13271 int i, j;
13272
13273 if (mips_macc_chains_last_hilo != 0)
13274 for (i = nready - 1; i >= 0; i--)
13275 if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
13276 {
13277 for (j = nready - 1; j > i; j--)
13278 if (recog_memoized (ready[j]) >= 0
13279 && get_attr_may_clobber_hilo (ready[j]))
13280 {
13281 mips_promote_ready (ready, i, j);
13282 break;
13283 }
13284 break;
13285 }
13286 }
13287 \f
13288 /* The last instruction to be scheduled. */
13289 static rtx vr4130_last_insn;
13290
13291 /* A note_stores callback used by vr4130_true_reg_dependence_p. DATA
13292 points to an rtx that is initially an instruction. Nullify the rtx
13293 if the instruction uses the value of register X. */
13294
13295 static void
13296 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13297 void *data)
13298 {
13299 rtx *insn_ptr;
13300
13301 insn_ptr = (rtx *) data;
13302 if (REG_P (x)
13303 && *insn_ptr != 0
13304 && reg_referenced_p (x, PATTERN (*insn_ptr)))
13305 *insn_ptr = 0;
13306 }
13307
13308 /* Return true if there is true register dependence between vr4130_last_insn
13309 and INSN. */
13310
13311 static bool
13312 vr4130_true_reg_dependence_p (rtx insn)
13313 {
13314 note_stores (PATTERN (vr4130_last_insn),
13315 vr4130_true_reg_dependence_p_1, &insn);
13316 return insn == 0;
13317 }
13318
13319 /* A TUNE_MIPS4130 helper function. Given that INSN1 is at the head of
13320 the ready queue and that INSN2 is the instruction after it, return
13321 true if it is worth promoting INSN2 ahead of INSN1. Look for cases
13322 in which INSN1 and INSN2 can probably issue in parallel, but for
13323 which (INSN2, INSN1) should be less sensitive to instruction
13324 alignment than (INSN1, INSN2). See 4130.md for more details. */
13325
13326 static bool
13327 vr4130_swap_insns_p (rtx insn1, rtx insn2)
13328 {
13329 sd_iterator_def sd_it;
13330 dep_t dep;
13331
13332 /* Check for the following case:
13333
13334 1) there is some other instruction X with an anti dependence on INSN1;
13335 2) X has a higher priority than INSN2; and
13336 3) X is an arithmetic instruction (and thus has no unit restrictions).
13337
13338 If INSN1 is the last instruction blocking X, it would better to
13339 choose (INSN1, X) over (INSN2, INSN1). */
13340 FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
13341 if (DEP_TYPE (dep) == REG_DEP_ANTI
13342 && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
13343 && recog_memoized (DEP_CON (dep)) >= 0
13344 && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
13345 return false;
13346
13347 if (vr4130_last_insn != 0
13348 && recog_memoized (insn1) >= 0
13349 && recog_memoized (insn2) >= 0)
13350 {
13351 /* See whether INSN1 and INSN2 use different execution units,
13352 or if they are both ALU-type instructions. If so, they can
13353 probably execute in parallel. */
13354 enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
13355 enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
13356 if (class1 != class2 || class1 == VR4130_CLASS_ALU)
13357 {
13358 /* If only one of the instructions has a dependence on
13359 vr4130_last_insn, prefer to schedule the other one first. */
13360 bool dep1_p = vr4130_true_reg_dependence_p (insn1);
13361 bool dep2_p = vr4130_true_reg_dependence_p (insn2);
13362 if (dep1_p != dep2_p)
13363 return dep1_p;
13364
13365 /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
13366 is not an ALU-type instruction and if INSN1 uses the same
13367 execution unit. (Note that if this condition holds, we already
13368 know that INSN2 uses a different execution unit.) */
13369 if (class1 != VR4130_CLASS_ALU
13370 && recog_memoized (vr4130_last_insn) >= 0
13371 && class1 == get_attr_vr4130_class (vr4130_last_insn))
13372 return true;
13373 }
13374 }
13375 return false;
13376 }
13377
13378 /* A TUNE_MIPS4130 helper function. (READY, NREADY) describes a ready
13379 queue with at least two instructions. Swap the first two if
13380 vr4130_swap_insns_p says that it could be worthwhile. */
13381
13382 static void
13383 vr4130_reorder (rtx *ready, int nready)
13384 {
13385 if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
13386 mips_promote_ready (ready, nready - 2, nready - 1);
13387 }
13388 \f
13389 /* Record whether last 74k AGEN instruction was a load or store. */
13390 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
13391
13392 /* Initialize mips_last_74k_agen_insn from INSN. A null argument
13393 resets to TYPE_UNKNOWN state. */
13394
13395 static void
13396 mips_74k_agen_init (rtx insn)
13397 {
13398 if (!insn || CALL_P (insn) || JUMP_P (insn))
13399 mips_last_74k_agen_insn = TYPE_UNKNOWN;
13400 else
13401 {
13402 enum attr_type type = get_attr_type (insn);
13403 if (type == TYPE_LOAD || type == TYPE_STORE)
13404 mips_last_74k_agen_insn = type;
13405 }
13406 }
13407
13408 /* A TUNE_74K helper function. The 74K AGEN pipeline likes multiple
13409 loads to be grouped together, and multiple stores to be grouped
13410 together. Swap things around in the ready queue to make this happen. */
13411
13412 static void
13413 mips_74k_agen_reorder (rtx *ready, int nready)
13414 {
13415 int i;
13416 int store_pos, load_pos;
13417
13418 store_pos = -1;
13419 load_pos = -1;
13420
13421 for (i = nready - 1; i >= 0; i--)
13422 {
13423 rtx insn = ready[i];
13424 if (USEFUL_INSN_P (insn))
13425 switch (get_attr_type (insn))
13426 {
13427 case TYPE_STORE:
13428 if (store_pos == -1)
13429 store_pos = i;
13430 break;
13431
13432 case TYPE_LOAD:
13433 if (load_pos == -1)
13434 load_pos = i;
13435 break;
13436
13437 default:
13438 break;
13439 }
13440 }
13441
13442 if (load_pos == -1 || store_pos == -1)
13443 return;
13444
13445 switch (mips_last_74k_agen_insn)
13446 {
13447 case TYPE_UNKNOWN:
13448 /* Prefer to schedule loads since they have a higher latency. */
13449 case TYPE_LOAD:
13450 /* Swap loads to the front of the queue. */
13451 mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
13452 break;
13453 case TYPE_STORE:
13454 /* Swap stores to the front of the queue. */
13455 mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
13456 break;
13457 default:
13458 break;
13459 }
13460 }
13461 \f
13462 /* Implement TARGET_SCHED_INIT. */
13463
13464 static void
13465 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13466 int max_ready ATTRIBUTE_UNUSED)
13467 {
13468 mips_macc_chains_last_hilo = 0;
13469 vr4130_last_insn = 0;
13470 mips_74k_agen_init (NULL_RTX);
13471
13472 /* When scheduling for Loongson2, branch instructions go to ALU1,
13473 therefore basic block is most likely to start with round-robin counter
13474 pointed to ALU2. */
13475 mips_ls2.alu1_turn_p = false;
13476 mips_ls2.falu1_turn_p = true;
13477 }
13478
13479 /* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2. */
13480
13481 static void
13482 mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13483 rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13484 {
13485 if (!reload_completed
13486 && TUNE_MACC_CHAINS
13487 && *nreadyp > 0)
13488 mips_macc_chains_reorder (ready, *nreadyp);
13489
13490 if (reload_completed
13491 && TUNE_MIPS4130
13492 && !TARGET_VR4130_ALIGN
13493 && *nreadyp > 1)
13494 vr4130_reorder (ready, *nreadyp);
13495
13496 if (TUNE_74K)
13497 mips_74k_agen_reorder (ready, *nreadyp);
13498 }
13499
13500 /* Implement TARGET_SCHED_REORDER. */
13501
13502 static int
13503 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13504 rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13505 {
13506 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13507 return mips_issue_rate ();
13508 }
13509
13510 /* Implement TARGET_SCHED_REORDER2. */
13511
13512 static int
13513 mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13514 rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13515 {
13516 mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13517 return cached_can_issue_more;
13518 }
13519
13520 /* Update round-robin counters for ALU1/2 and FALU1/2. */
13521
13522 static void
13523 mips_ls2_variable_issue (rtx insn)
13524 {
13525 if (mips_ls2.alu1_turn_p)
13526 {
13527 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
13528 mips_ls2.alu1_turn_p = false;
13529 }
13530 else
13531 {
13532 if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
13533 mips_ls2.alu1_turn_p = true;
13534 }
13535
13536 if (mips_ls2.falu1_turn_p)
13537 {
13538 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
13539 mips_ls2.falu1_turn_p = false;
13540 }
13541 else
13542 {
13543 if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
13544 mips_ls2.falu1_turn_p = true;
13545 }
13546
13547 if (recog_memoized (insn) >= 0)
13548 mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
13549 }
13550
13551 /* Implement TARGET_SCHED_VARIABLE_ISSUE. */
13552
13553 static int
13554 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13555 rtx insn, int more)
13556 {
13557 /* Ignore USEs and CLOBBERs; don't count them against the issue rate. */
13558 if (USEFUL_INSN_P (insn))
13559 {
13560 if (get_attr_type (insn) != TYPE_GHOST)
13561 more--;
13562 if (!reload_completed && TUNE_MACC_CHAINS)
13563 mips_macc_chains_record (insn);
13564 vr4130_last_insn = insn;
13565 if (TUNE_74K)
13566 mips_74k_agen_init (insn);
13567 else if (TUNE_LOONGSON_2EF)
13568 mips_ls2_variable_issue (insn);
13569 }
13570
13571 /* Instructions of type 'multi' should all be split before
13572 the second scheduling pass. */
13573 gcc_assert (!reload_completed
13574 || recog_memoized (insn) < 0
13575 || get_attr_type (insn) != TYPE_MULTI);
13576
13577 cached_can_issue_more = more;
13578 return more;
13579 }
13580 \f
13581 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
13582 return the first operand of the associated PREF or PREFX insn. */
13583
13584 rtx
13585 mips_prefetch_cookie (rtx write, rtx locality)
13586 {
13587 /* store_streamed / load_streamed. */
13588 if (INTVAL (locality) <= 0)
13589 return GEN_INT (INTVAL (write) + 4);
13590
13591 /* store / load. */
13592 if (INTVAL (locality) <= 2)
13593 return write;
13594
13595 /* store_retained / load_retained. */
13596 return GEN_INT (INTVAL (write) + 6);
13597 }
13598 \f
13599 /* Flags that indicate when a built-in function is available.
13600
13601 BUILTIN_AVAIL_NON_MIPS16
13602 The function is available on the current target, but only
13603 in non-MIPS16 mode. */
13604 #define BUILTIN_AVAIL_NON_MIPS16 1
13605
13606 /* Declare an availability predicate for built-in functions that
13607 require non-MIPS16 mode and also require COND to be true.
13608 NAME is the main part of the predicate's name. */
13609 #define AVAIL_NON_MIPS16(NAME, COND) \
13610 static unsigned int \
13611 mips_builtin_avail_##NAME (void) \
13612 { \
13613 return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0; \
13614 }
13615
13616 /* This structure describes a single built-in function. */
13617 struct mips_builtin_description {
13618 /* The code of the main .md file instruction. See mips_builtin_type
13619 for more information. */
13620 enum insn_code icode;
13621
13622 /* The floating-point comparison code to use with ICODE, if any. */
13623 enum mips_fp_condition cond;
13624
13625 /* The name of the built-in function. */
13626 const char *name;
13627
13628 /* Specifies how the function should be expanded. */
13629 enum mips_builtin_type builtin_type;
13630
13631 /* The function's prototype. */
13632 enum mips_function_type function_type;
13633
13634 /* Whether the function is available. */
13635 unsigned int (*avail) (void);
13636 };
13637
13638 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
13639 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
13640 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
13641 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
13642 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
13643 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
13644 AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
13645 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
13646 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
13647 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
13648
13649 /* Construct a mips_builtin_description from the given arguments.
13650
13651 INSN is the name of the associated instruction pattern, without the
13652 leading CODE_FOR_mips_.
13653
13654 CODE is the floating-point condition code associated with the
13655 function. It can be 'f' if the field is not applicable.
13656
13657 NAME is the name of the function itself, without the leading
13658 "__builtin_mips_".
13659
13660 BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
13661
13662 AVAIL is the name of the availability predicate, without the leading
13663 mips_builtin_avail_. */
13664 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE, \
13665 FUNCTION_TYPE, AVAIL) \
13666 { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND, \
13667 "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE, \
13668 mips_builtin_avail_ ## AVAIL }
13669
13670 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
13671 mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE and AVAIL
13672 are as for MIPS_BUILTIN. */
13673 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
13674 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
13675
13676 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
13677 are subject to mips_builtin_avail_<AVAIL>. */
13678 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL) \
13679 MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s", \
13680 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL), \
13681 MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d", \
13682 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
13683
13684 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
13685 The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
13686 while the any and all forms are subject to mips_builtin_avail_mips3d. */
13687 #define CMP_PS_BUILTINS(INSN, COND, AVAIL) \
13688 MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps", \
13689 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, \
13690 mips3d), \
13691 MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps", \
13692 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, \
13693 mips3d), \
13694 MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
13695 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, \
13696 AVAIL), \
13697 MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
13698 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, \
13699 AVAIL)
13700
13701 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s. The functions
13702 are subject to mips_builtin_avail_mips3d. */
13703 #define CMP_4S_BUILTINS(INSN, COND) \
13704 MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s", \
13705 MIPS_BUILTIN_CMP_ANY, \
13706 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d), \
13707 MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s", \
13708 MIPS_BUILTIN_CMP_ALL, \
13709 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
13710
13711 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps. The comparison
13712 instruction requires mips_builtin_avail_<AVAIL>. */
13713 #define MOVTF_BUILTINS(INSN, COND, AVAIL) \
13714 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps", \
13715 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13716 AVAIL), \
13717 MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps", \
13718 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13719 AVAIL)
13720
13721 /* Define all the built-in functions related to C.cond.fmt condition COND. */
13722 #define CMP_BUILTINS(COND) \
13723 MOVTF_BUILTINS (c, COND, paired_single), \
13724 MOVTF_BUILTINS (cabs, COND, mips3d), \
13725 CMP_SCALAR_BUILTINS (cabs, COND, mips3d), \
13726 CMP_PS_BUILTINS (c, COND, paired_single), \
13727 CMP_PS_BUILTINS (cabs, COND, mips3d), \
13728 CMP_4S_BUILTINS (c, COND), \
13729 CMP_4S_BUILTINS (cabs, COND)
13730
13731 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
13732 function mapped to instruction CODE_FOR_mips_<INSN>, FUNCTION_TYPE
13733 and AVAIL are as for MIPS_BUILTIN. */
13734 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL) \
13735 MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET, \
13736 FUNCTION_TYPE, AVAIL)
13737
13738 /* Define __builtin_mips_bposge<VALUE>. <VALUE> is 32 for the MIPS32 DSP
13739 branch instruction. AVAIL is as for MIPS_BUILTIN. */
13740 #define BPOSGE_BUILTIN(VALUE, AVAIL) \
13741 MIPS_BUILTIN (bposge, f, "bposge" #VALUE, \
13742 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
13743
13744 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
13745 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
13746 builtin_description field. */
13747 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE) \
13748 { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f, \
13749 "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT, \
13750 FUNCTION_TYPE, mips_builtin_avail_loongson }
13751
13752 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
13753 for instruction CODE_FOR_loongson_<INSN>. FUNCTION_TYPE is a
13754 builtin_description field. */
13755 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE) \
13756 LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
13757
13758 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
13759 We use functions of this form when the same insn can be usefully applied
13760 to more than one datatype. */
13761 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE) \
13762 LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
13763
13764 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
13765 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
13766 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
13767 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
13768 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
13769 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
13770 #define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
13771 #define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
13772
13773 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
13774 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
13775 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
13776 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
13777 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
13778 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
13779 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
13780 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
13781 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
13782 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
13783 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
13784 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
13785 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
13786 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
13787 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
13788 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
13789 #define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
13790 #define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
13791 #define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
13792 #define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
13793 #define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
13794 #define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
13795 #define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
13796 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
13797 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
13798 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
13799 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
13800 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
13801 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
13802 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
13803
13804 static const struct mips_builtin_description mips_builtins[] = {
13805 DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13806 DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13807 DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13808 DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13809 DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
13810 DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
13811 DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
13812 DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
13813
13814 DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
13815 DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13816 DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13817 DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13818 DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
13819
13820 DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
13821 DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
13822 DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13823 DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13824 DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13825 DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13826
13827 DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
13828 DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
13829 DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13830 DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13831 DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13832 DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13833
13834 MIPS_FP_CONDITIONS (CMP_BUILTINS),
13835
13836 /* Built-in functions for the SB-1 processor. */
13837 DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
13838
13839 /* Built-in functions for the DSP ASE (32-bit and 64-bit). */
13840 DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13841 DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13842 DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13843 DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13844 DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13845 DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13846 DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13847 DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13848 DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13849 DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13850 DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
13851 DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
13852 DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
13853 DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
13854 DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
13855 DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
13856 DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
13857 DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
13858 DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
13859 DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
13860 DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
13861 DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
13862 DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
13863 DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
13864 DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
13865 DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
13866 DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
13867 DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
13868 DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
13869 DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
13870 DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
13871 DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13872 DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13873 DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13874 DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
13875 DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13876 DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
13877 DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
13878 DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
13879 DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
13880 DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13881 DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
13882 DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
13883 DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
13884 DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
13885 DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
13886 DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
13887 DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13888 DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13889 DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
13890 DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13891 DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13892 DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
13893 DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13894 DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13895 DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
13896 DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13897 DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13898 DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13899 DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
13900 DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
13901 DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
13902 DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
13903 DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
13904 BPOSGE_BUILTIN (32, dsp),
13905
13906 /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit). */
13907 DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
13908 DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13909 DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13910 DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13911 DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13912 DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13913 DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13914 DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13915 DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13916 DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
13917 DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13918 DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13919 DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13920 DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13921 DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13922 DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
13923 DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
13924 DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
13925 DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
13926 DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
13927 DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
13928 DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
13929 DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13930 DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13931 DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13932 DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
13933 DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13934 DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13935 DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13936 DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13937 DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13938 DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
13939 DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13940 DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
13941
13942 /* Built-in functions for the DSP ASE (32-bit only). */
13943 DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13944 DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13945 DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13946 DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
13947 DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13948 DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13949 DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13950 DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13951 DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13952 DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13953 DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13954 DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13955 DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
13956 DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13957 DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13958 DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
13959 DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
13960 DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
13961 DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
13962 DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
13963 DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
13964 DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13965 DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
13966 DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
13967 DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
13968 DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
13969 DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
13970
13971 /* Built-in functions for the DSP ASE (64-bit only). */
13972 DIRECT_BUILTIN (ldx, MIPS_DI_FTYPE_POINTER_SI, dsp_64),
13973
13974 /* The following are for the MIPS DSP ASE REV 2 (32-bit only). */
13975 DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13976 DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13977 DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13978 DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13979 DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13980 DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13981 DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13982 DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13983 DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
13984
13985 /* Builtin functions for ST Microelectronics Loongson-2E/2F cores. */
13986 LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
13987 LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
13988 LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
13989 LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
13990 LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
13991 LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
13992 LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
13993 LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
13994 LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
13995 LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
13996 LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
13997 LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
13998 LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
13999 LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14000 LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14001 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
14002 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14003 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14004 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14005 LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
14006 LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
14007 LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14008 LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14009 LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14010 LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14011 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14012 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14013 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14014 LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14015 LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14016 LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14017 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14018 LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14019 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14020 LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14021 LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14022 LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14023 LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
14024 LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
14025 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14026 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14027 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14028 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14029 LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14030 LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14031 LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14032 LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14033 LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
14034 LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14035 LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14036 LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14037 LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14038 LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
14039 LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
14040 LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14041 LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14042 LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14043 LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
14044 LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14045 LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
14046 LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
14047 LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14048 LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14049 LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14050 LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14051 LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14052 LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14053 LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14054 LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14055 LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14056 LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14057 LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14058 LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14059 LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14060 LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14061 LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14062 LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14063 LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14064 LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14065 LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14066 LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14067 LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
14068 LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
14069 LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14070 LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14071 LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14072 LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14073 LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14074 LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14075 LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14076 LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14077 LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14078 LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14079 LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14080 LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14081 LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14082 LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14083 LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14084 LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14085
14086 /* Sundry other built-in functions. */
14087 DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
14088 };
14089
14090 /* Index I is the function declaration for mips_builtins[I], or null if the
14091 function isn't defined on this target. */
14092 static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
14093
14094 /* MODE is a vector mode whose elements have type TYPE. Return the type
14095 of the vector itself. */
14096
14097 static tree
14098 mips_builtin_vector_type (tree type, enum machine_mode mode)
14099 {
14100 static tree types[2 * (int) MAX_MACHINE_MODE];
14101 int mode_index;
14102
14103 mode_index = (int) mode;
14104
14105 if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
14106 mode_index += MAX_MACHINE_MODE;
14107
14108 if (types[mode_index] == NULL_TREE)
14109 types[mode_index] = build_vector_type_for_mode (type, mode);
14110 return types[mode_index];
14111 }
14112
14113 /* Return a type for 'const volatile void *'. */
14114
14115 static tree
14116 mips_build_cvpointer_type (void)
14117 {
14118 static tree cache;
14119
14120 if (cache == NULL_TREE)
14121 cache = build_pointer_type (build_qualified_type
14122 (void_type_node,
14123 TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
14124 return cache;
14125 }
14126
14127 /* Source-level argument types. */
14128 #define MIPS_ATYPE_VOID void_type_node
14129 #define MIPS_ATYPE_INT integer_type_node
14130 #define MIPS_ATYPE_POINTER ptr_type_node
14131 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
14132
14133 /* Standard mode-based argument types. */
14134 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
14135 #define MIPS_ATYPE_SI intSI_type_node
14136 #define MIPS_ATYPE_USI unsigned_intSI_type_node
14137 #define MIPS_ATYPE_DI intDI_type_node
14138 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
14139 #define MIPS_ATYPE_SF float_type_node
14140 #define MIPS_ATYPE_DF double_type_node
14141
14142 /* Vector argument types. */
14143 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
14144 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
14145 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
14146 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
14147 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
14148 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
14149 #define MIPS_ATYPE_UV2SI \
14150 mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
14151 #define MIPS_ATYPE_UV4HI \
14152 mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
14153 #define MIPS_ATYPE_UV8QI \
14154 mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
14155
14156 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
14157 their associated MIPS_ATYPEs. */
14158 #define MIPS_FTYPE_ATYPES1(A, B) \
14159 MIPS_ATYPE_##A, MIPS_ATYPE_##B
14160
14161 #define MIPS_FTYPE_ATYPES2(A, B, C) \
14162 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
14163
14164 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
14165 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
14166
14167 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
14168 MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
14169 MIPS_ATYPE_##E
14170
14171 /* Return the function type associated with function prototype TYPE. */
14172
14173 static tree
14174 mips_build_function_type (enum mips_function_type type)
14175 {
14176 static tree types[(int) MIPS_MAX_FTYPE_MAX];
14177
14178 if (types[(int) type] == NULL_TREE)
14179 switch (type)
14180 {
14181 #define DEF_MIPS_FTYPE(NUM, ARGS) \
14182 case MIPS_FTYPE_NAME##NUM ARGS: \
14183 types[(int) type] \
14184 = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS, \
14185 NULL_TREE); \
14186 break;
14187 #include "config/mips/mips-ftypes.def"
14188 #undef DEF_MIPS_FTYPE
14189 default:
14190 gcc_unreachable ();
14191 }
14192
14193 return types[(int) type];
14194 }
14195
14196 /* Implement TARGET_INIT_BUILTINS. */
14197
14198 static void
14199 mips_init_builtins (void)
14200 {
14201 const struct mips_builtin_description *d;
14202 unsigned int i;
14203
14204 /* Iterate through all of the bdesc arrays, initializing all of the
14205 builtin functions. */
14206 for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
14207 {
14208 d = &mips_builtins[i];
14209 if (d->avail ())
14210 mips_builtin_decls[i]
14211 = add_builtin_function (d->name,
14212 mips_build_function_type (d->function_type),
14213 i, BUILT_IN_MD, NULL, NULL);
14214 }
14215 }
14216
14217 /* Implement TARGET_BUILTIN_DECL. */
14218
14219 static tree
14220 mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
14221 {
14222 if (code >= ARRAY_SIZE (mips_builtins))
14223 return error_mark_node;
14224 return mips_builtin_decls[code];
14225 }
14226
14227 /* Take argument ARGNO from EXP's argument list and convert it into
14228 an expand operand. Store the operand in *OP. */
14229
14230 static void
14231 mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
14232 unsigned int argno)
14233 {
14234 tree arg;
14235 rtx value;
14236
14237 arg = CALL_EXPR_ARG (exp, argno);
14238 value = expand_normal (arg);
14239 create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
14240 }
14241
14242 /* Expand instruction ICODE as part of a built-in function sequence.
14243 Use the first NOPS elements of OPS as the instruction's operands.
14244 HAS_TARGET_P is true if operand 0 is a target; it is false if the
14245 instruction has no target.
14246
14247 Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx. */
14248
14249 static rtx
14250 mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
14251 struct expand_operand *ops, bool has_target_p)
14252 {
14253 if (!maybe_expand_insn (icode, nops, ops))
14254 {
14255 error ("invalid argument to built-in function");
14256 return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
14257 }
14258 return has_target_p ? ops[0].value : const0_rtx;
14259 }
14260
14261 /* Expand a floating-point comparison for built-in function call EXP.
14262 The first NARGS arguments are the values to be compared. ICODE is
14263 the .md pattern that does the comparison and COND is the condition
14264 that is being tested. Return an rtx for the result. */
14265
14266 static rtx
14267 mips_expand_builtin_compare_1 (enum insn_code icode,
14268 enum mips_fp_condition cond,
14269 tree exp, int nargs)
14270 {
14271 struct expand_operand ops[MAX_RECOG_OPERANDS];
14272 rtx output;
14273 int opno, argno;
14274
14275 /* The instruction should have a target operand, an operand for each
14276 argument, and an operand for COND. */
14277 gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args);
14278
14279 output = mips_allocate_fcc (insn_data[(int) icode].operand[0].mode);
14280 opno = 0;
14281 create_fixed_operand (&ops[opno++], output);
14282 for (argno = 0; argno < nargs; argno++)
14283 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14284 create_integer_operand (&ops[opno++], (int) cond);
14285 return mips_expand_builtin_insn (icode, opno, ops, true);
14286 }
14287
14288 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
14289 HAS_TARGET_P says which. EXP is the CALL_EXPR that calls the function
14290 and ICODE is the code of the associated .md pattern. TARGET, if nonnull,
14291 suggests a good place to put the result. */
14292
14293 static rtx
14294 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
14295 bool has_target_p)
14296 {
14297 struct expand_operand ops[MAX_RECOG_OPERANDS];
14298 int opno, argno;
14299
14300 /* Map any target to operand 0. */
14301 opno = 0;
14302 if (has_target_p)
14303 create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
14304
14305 /* Map the arguments to the other operands. */
14306 gcc_assert (opno + call_expr_nargs (exp)
14307 == insn_data[icode].n_generator_args);
14308 for (argno = 0; argno < call_expr_nargs (exp); argno++)
14309 mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14310
14311 return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
14312 }
14313
14314 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
14315 function; TYPE says which. EXP is the CALL_EXPR that calls the
14316 function, ICODE is the instruction that should be used to compare
14317 the first two arguments, and COND is the condition it should test.
14318 TARGET, if nonnull, suggests a good place to put the result. */
14319
14320 static rtx
14321 mips_expand_builtin_movtf (enum mips_builtin_type type,
14322 enum insn_code icode, enum mips_fp_condition cond,
14323 rtx target, tree exp)
14324 {
14325 struct expand_operand ops[4];
14326 rtx cmp_result;
14327
14328 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
14329 create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
14330 if (type == MIPS_BUILTIN_MOVT)
14331 {
14332 mips_prepare_builtin_arg (&ops[2], exp, 2);
14333 mips_prepare_builtin_arg (&ops[1], exp, 3);
14334 }
14335 else
14336 {
14337 mips_prepare_builtin_arg (&ops[1], exp, 2);
14338 mips_prepare_builtin_arg (&ops[2], exp, 3);
14339 }
14340 create_fixed_operand (&ops[3], cmp_result);
14341 return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
14342 4, ops, true);
14343 }
14344
14345 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
14346 into TARGET otherwise. Return TARGET. */
14347
14348 static rtx
14349 mips_builtin_branch_and_move (rtx condition, rtx target,
14350 rtx value_if_true, rtx value_if_false)
14351 {
14352 rtx true_label, done_label;
14353
14354 true_label = gen_label_rtx ();
14355 done_label = gen_label_rtx ();
14356
14357 /* First assume that CONDITION is false. */
14358 mips_emit_move (target, value_if_false);
14359
14360 /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise. */
14361 emit_jump_insn (gen_condjump (condition, true_label));
14362 emit_jump_insn (gen_jump (done_label));
14363 emit_barrier ();
14364
14365 /* Fix TARGET if CONDITION is true. */
14366 emit_label (true_label);
14367 mips_emit_move (target, value_if_true);
14368
14369 emit_label (done_label);
14370 return target;
14371 }
14372
14373 /* Expand a comparison built-in function of type BUILTIN_TYPE. EXP is
14374 the CALL_EXPR that calls the function, ICODE is the code of the
14375 comparison instruction, and COND is the condition it should test.
14376 TARGET, if nonnull, suggests a good place to put the boolean result. */
14377
14378 static rtx
14379 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
14380 enum insn_code icode, enum mips_fp_condition cond,
14381 rtx target, tree exp)
14382 {
14383 rtx offset, condition, cmp_result;
14384
14385 if (target == 0 || GET_MODE (target) != SImode)
14386 target = gen_reg_rtx (SImode);
14387 cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
14388 call_expr_nargs (exp));
14389
14390 /* If the comparison sets more than one register, we define the result
14391 to be 0 if all registers are false and -1 if all registers are true.
14392 The value of the complete result is indeterminate otherwise. */
14393 switch (builtin_type)
14394 {
14395 case MIPS_BUILTIN_CMP_ALL:
14396 condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
14397 return mips_builtin_branch_and_move (condition, target,
14398 const0_rtx, const1_rtx);
14399
14400 case MIPS_BUILTIN_CMP_UPPER:
14401 case MIPS_BUILTIN_CMP_LOWER:
14402 offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
14403 condition = gen_single_cc (cmp_result, offset);
14404 return mips_builtin_branch_and_move (condition, target,
14405 const1_rtx, const0_rtx);
14406
14407 default:
14408 condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
14409 return mips_builtin_branch_and_move (condition, target,
14410 const1_rtx, const0_rtx);
14411 }
14412 }
14413
14414 /* Expand a bposge built-in function of type BUILTIN_TYPE. TARGET,
14415 if nonnull, suggests a good place to put the boolean result. */
14416
14417 static rtx
14418 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
14419 {
14420 rtx condition, cmp_result;
14421 int cmp_value;
14422
14423 if (target == 0 || GET_MODE (target) != SImode)
14424 target = gen_reg_rtx (SImode);
14425
14426 cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
14427
14428 if (builtin_type == MIPS_BUILTIN_BPOSGE32)
14429 cmp_value = 32;
14430 else
14431 gcc_assert (0);
14432
14433 condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
14434 return mips_builtin_branch_and_move (condition, target,
14435 const1_rtx, const0_rtx);
14436 }
14437
14438 /* Implement TARGET_EXPAND_BUILTIN. */
14439
14440 static rtx
14441 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
14442 enum machine_mode mode, int ignore)
14443 {
14444 tree fndecl;
14445 unsigned int fcode, avail;
14446 const struct mips_builtin_description *d;
14447
14448 fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14449 fcode = DECL_FUNCTION_CODE (fndecl);
14450 gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
14451 d = &mips_builtins[fcode];
14452 avail = d->avail ();
14453 gcc_assert (avail != 0);
14454 if (TARGET_MIPS16)
14455 {
14456 error ("built-in function %qE not supported for MIPS16",
14457 DECL_NAME (fndecl));
14458 return ignore ? const0_rtx : CONST0_RTX (mode);
14459 }
14460 switch (d->builtin_type)
14461 {
14462 case MIPS_BUILTIN_DIRECT:
14463 return mips_expand_builtin_direct (d->icode, target, exp, true);
14464
14465 case MIPS_BUILTIN_DIRECT_NO_TARGET:
14466 return mips_expand_builtin_direct (d->icode, target, exp, false);
14467
14468 case MIPS_BUILTIN_MOVT:
14469 case MIPS_BUILTIN_MOVF:
14470 return mips_expand_builtin_movtf (d->builtin_type, d->icode,
14471 d->cond, target, exp);
14472
14473 case MIPS_BUILTIN_CMP_ANY:
14474 case MIPS_BUILTIN_CMP_ALL:
14475 case MIPS_BUILTIN_CMP_UPPER:
14476 case MIPS_BUILTIN_CMP_LOWER:
14477 case MIPS_BUILTIN_CMP_SINGLE:
14478 return mips_expand_builtin_compare (d->builtin_type, d->icode,
14479 d->cond, target, exp);
14480
14481 case MIPS_BUILTIN_BPOSGE32:
14482 return mips_expand_builtin_bposge (d->builtin_type, target);
14483 }
14484 gcc_unreachable ();
14485 }
14486 \f
14487 /* An entry in the MIPS16 constant pool. VALUE is the pool constant,
14488 MODE is its mode, and LABEL is the CODE_LABEL associated with it. */
14489 struct mips16_constant {
14490 struct mips16_constant *next;
14491 rtx value;
14492 rtx label;
14493 enum machine_mode mode;
14494 };
14495
14496 /* Information about an incomplete MIPS16 constant pool. FIRST is the
14497 first constant, HIGHEST_ADDRESS is the highest address that the first
14498 byte of the pool can have, and INSN_ADDRESS is the current instruction
14499 address. */
14500 struct mips16_constant_pool {
14501 struct mips16_constant *first;
14502 int highest_address;
14503 int insn_address;
14504 };
14505
14506 /* Add constant VALUE to POOL and return its label. MODE is the
14507 value's mode (used for CONST_INTs, etc.). */
14508
14509 static rtx
14510 mips16_add_constant (struct mips16_constant_pool *pool,
14511 rtx value, enum machine_mode mode)
14512 {
14513 struct mips16_constant **p, *c;
14514 bool first_of_size_p;
14515
14516 /* See whether the constant is already in the pool. If so, return the
14517 existing label, otherwise leave P pointing to the place where the
14518 constant should be added.
14519
14520 Keep the pool sorted in increasing order of mode size so that we can
14521 reduce the number of alignments needed. */
14522 first_of_size_p = true;
14523 for (p = &pool->first; *p != 0; p = &(*p)->next)
14524 {
14525 if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
14526 return (*p)->label;
14527 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
14528 break;
14529 if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
14530 first_of_size_p = false;
14531 }
14532
14533 /* In the worst case, the constant needed by the earliest instruction
14534 will end up at the end of the pool. The entire pool must then be
14535 accessible from that instruction.
14536
14537 When adding the first constant, set the pool's highest address to
14538 the address of the first out-of-range byte. Adjust this address
14539 downwards each time a new constant is added. */
14540 if (pool->first == 0)
14541 /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
14542 of the instruction with the lowest two bits clear. The base PC
14543 value for LDPC has the lowest three bits clear. Assume the worst
14544 case here; namely that the PC-relative instruction occupies the
14545 last 2 bytes in an aligned word. */
14546 pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
14547 pool->highest_address -= GET_MODE_SIZE (mode);
14548 if (first_of_size_p)
14549 /* Take into account the worst possible padding due to alignment. */
14550 pool->highest_address -= GET_MODE_SIZE (mode) - 1;
14551
14552 /* Create a new entry. */
14553 c = XNEW (struct mips16_constant);
14554 c->value = value;
14555 c->mode = mode;
14556 c->label = gen_label_rtx ();
14557 c->next = *p;
14558 *p = c;
14559
14560 return c->label;
14561 }
14562
14563 /* Output constant VALUE after instruction INSN and return the last
14564 instruction emitted. MODE is the mode of the constant. */
14565
14566 static rtx
14567 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
14568 {
14569 if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
14570 {
14571 rtx size = GEN_INT (GET_MODE_SIZE (mode));
14572 return emit_insn_after (gen_consttable_int (value, size), insn);
14573 }
14574
14575 if (SCALAR_FLOAT_MODE_P (mode))
14576 return emit_insn_after (gen_consttable_float (value), insn);
14577
14578 if (VECTOR_MODE_P (mode))
14579 {
14580 int i;
14581
14582 for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
14583 insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
14584 CONST_VECTOR_ELT (value, i), insn);
14585 return insn;
14586 }
14587
14588 gcc_unreachable ();
14589 }
14590
14591 /* Dump out the constants in CONSTANTS after INSN. */
14592
14593 static void
14594 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
14595 {
14596 struct mips16_constant *c, *next;
14597 int align;
14598
14599 align = 0;
14600 for (c = constants; c != NULL; c = next)
14601 {
14602 /* If necessary, increase the alignment of PC. */
14603 if (align < GET_MODE_SIZE (c->mode))
14604 {
14605 int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
14606 insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
14607 }
14608 align = GET_MODE_SIZE (c->mode);
14609
14610 insn = emit_label_after (c->label, insn);
14611 insn = mips16_emit_constants_1 (c->mode, c->value, insn);
14612
14613 next = c->next;
14614 free (c);
14615 }
14616
14617 emit_barrier_after (insn);
14618 }
14619
14620 /* Return the length of instruction INSN. */
14621
14622 static int
14623 mips16_insn_length (rtx insn)
14624 {
14625 if (JUMP_TABLE_DATA_P (insn))
14626 {
14627 rtx body = PATTERN (insn);
14628 if (GET_CODE (body) == ADDR_VEC)
14629 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
14630 else if (GET_CODE (body) == ADDR_DIFF_VEC)
14631 return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
14632 else
14633 gcc_unreachable ();
14634 }
14635 return get_attr_length (insn);
14636 }
14637
14638 /* If *X is a symbolic constant that refers to the constant pool, add
14639 the constant to POOL and rewrite *X to use the constant's label. */
14640
14641 static void
14642 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
14643 {
14644 rtx base, offset, label;
14645
14646 split_const (*x, &base, &offset);
14647 if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
14648 {
14649 label = mips16_add_constant (pool, copy_rtx (get_pool_constant (base)),
14650 get_pool_mode (base));
14651 base = gen_rtx_LABEL_REF (Pmode, label);
14652 *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
14653 }
14654 }
14655
14656 /* This structure is used to communicate with mips16_rewrite_pool_refs.
14657 INSN is the instruction we're rewriting and POOL points to the current
14658 constant pool. */
14659 struct mips16_rewrite_pool_refs_info {
14660 rtx insn;
14661 struct mips16_constant_pool *pool;
14662 };
14663
14664 /* Rewrite *X so that constant pool references refer to the constant's
14665 label instead. DATA points to a mips16_rewrite_pool_refs_info
14666 structure. */
14667
14668 static int
14669 mips16_rewrite_pool_refs (rtx *x, void *data)
14670 {
14671 struct mips16_rewrite_pool_refs_info *info =
14672 (struct mips16_rewrite_pool_refs_info *) data;
14673
14674 if (force_to_mem_operand (*x, Pmode))
14675 {
14676 rtx mem = force_const_mem (GET_MODE (*x), *x);
14677 validate_change (info->insn, x, mem, false);
14678 }
14679
14680 if (MEM_P (*x))
14681 {
14682 mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
14683 return -1;
14684 }
14685
14686 /* Don't rewrite the __mips16_rdwr symbol. */
14687 if (GET_CODE (*x) == UNSPEC && XINT (*x, 1) == UNSPEC_TLS_GET_TP)
14688 return -1;
14689
14690 if (TARGET_MIPS16_TEXT_LOADS)
14691 mips16_rewrite_pool_constant (info->pool, x);
14692
14693 return GET_CODE (*x) == CONST ? -1 : 0;
14694 }
14695
14696 /* Return whether CFG is used in mips_reorg. */
14697
14698 static bool
14699 mips_cfg_in_reorg (void)
14700 {
14701 return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
14702 || TARGET_RELAX_PIC_CALLS);
14703 }
14704
14705 /* Build MIPS16 constant pools. Split the instructions if SPLIT_P,
14706 otherwise assume that they are already split. */
14707
14708 static void
14709 mips16_lay_out_constants (bool split_p)
14710 {
14711 struct mips16_constant_pool pool;
14712 struct mips16_rewrite_pool_refs_info info;
14713 rtx insn, barrier;
14714
14715 if (!TARGET_MIPS16_PCREL_LOADS)
14716 return;
14717
14718 if (split_p)
14719 {
14720 if (mips_cfg_in_reorg ())
14721 split_all_insns ();
14722 else
14723 split_all_insns_noflow ();
14724 }
14725 barrier = 0;
14726 memset (&pool, 0, sizeof (pool));
14727 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14728 {
14729 /* Rewrite constant pool references in INSN. */
14730 if (USEFUL_INSN_P (insn))
14731 {
14732 info.insn = insn;
14733 info.pool = &pool;
14734 for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
14735 }
14736
14737 pool.insn_address += mips16_insn_length (insn);
14738
14739 if (pool.first != NULL)
14740 {
14741 /* If there are no natural barriers between the first user of
14742 the pool and the highest acceptable address, we'll need to
14743 create a new instruction to jump around the constant pool.
14744 In the worst case, this instruction will be 4 bytes long.
14745
14746 If it's too late to do this transformation after INSN,
14747 do it immediately before INSN. */
14748 if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
14749 {
14750 rtx label, jump;
14751
14752 label = gen_label_rtx ();
14753
14754 jump = emit_jump_insn_before (gen_jump (label), insn);
14755 JUMP_LABEL (jump) = label;
14756 LABEL_NUSES (label) = 1;
14757 barrier = emit_barrier_after (jump);
14758
14759 emit_label_after (label, barrier);
14760 pool.insn_address += 4;
14761 }
14762
14763 /* See whether the constant pool is now out of range of the first
14764 user. If so, output the constants after the previous barrier.
14765 Note that any instructions between BARRIER and INSN (inclusive)
14766 will use negative offsets to refer to the pool. */
14767 if (pool.insn_address > pool.highest_address)
14768 {
14769 mips16_emit_constants (pool.first, barrier);
14770 pool.first = NULL;
14771 barrier = 0;
14772 }
14773 else if (BARRIER_P (insn))
14774 barrier = insn;
14775 }
14776 }
14777 mips16_emit_constants (pool.first, get_last_insn ());
14778 }
14779 \f
14780 /* Return true if it is worth r10k_simplify_address's while replacing
14781 an address with X. We are looking for constants, and for addresses
14782 at a known offset from the incoming stack pointer. */
14783
14784 static bool
14785 r10k_simplified_address_p (rtx x)
14786 {
14787 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
14788 x = XEXP (x, 0);
14789 return x == virtual_incoming_args_rtx || CONSTANT_P (x);
14790 }
14791
14792 /* X is an expression that appears in INSN. Try to use the UD chains
14793 to simplify it, returning the simplified form on success and the
14794 original form otherwise. Replace the incoming value of $sp with
14795 virtual_incoming_args_rtx (which should never occur in X otherwise). */
14796
14797 static rtx
14798 r10k_simplify_address (rtx x, rtx insn)
14799 {
14800 rtx newx, op0, op1, set, def_insn, note;
14801 df_ref use, def;
14802 struct df_link *defs;
14803
14804 newx = NULL_RTX;
14805 if (UNARY_P (x))
14806 {
14807 op0 = r10k_simplify_address (XEXP (x, 0), insn);
14808 if (op0 != XEXP (x, 0))
14809 newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
14810 op0, GET_MODE (XEXP (x, 0)));
14811 }
14812 else if (BINARY_P (x))
14813 {
14814 op0 = r10k_simplify_address (XEXP (x, 0), insn);
14815 op1 = r10k_simplify_address (XEXP (x, 1), insn);
14816 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
14817 newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
14818 }
14819 else if (GET_CODE (x) == LO_SUM)
14820 {
14821 /* LO_SUMs can be offset from HIGHs, if we know they won't
14822 overflow. See mips_classify_address for the rationale behind
14823 the lax check. */
14824 op0 = r10k_simplify_address (XEXP (x, 0), insn);
14825 if (GET_CODE (op0) == HIGH)
14826 newx = XEXP (x, 1);
14827 }
14828 else if (REG_P (x))
14829 {
14830 /* Uses are recorded by regno_reg_rtx, not X itself. */
14831 use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
14832 gcc_assert (use);
14833 defs = DF_REF_CHAIN (use);
14834
14835 /* Require a single definition. */
14836 if (defs && defs->next == NULL)
14837 {
14838 def = defs->ref;
14839 if (DF_REF_IS_ARTIFICIAL (def))
14840 {
14841 /* Replace the incoming value of $sp with
14842 virtual_incoming_args_rtx. */
14843 if (x == stack_pointer_rtx
14844 && DF_REF_BB (def) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
14845 newx = virtual_incoming_args_rtx;
14846 }
14847 else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
14848 DF_REF_BB (def)))
14849 {
14850 /* Make sure that DEF_INSN is a single set of REG. */
14851 def_insn = DF_REF_INSN (def);
14852 if (NONJUMP_INSN_P (def_insn))
14853 {
14854 set = single_set (def_insn);
14855 if (set && rtx_equal_p (SET_DEST (set), x))
14856 {
14857 /* Prefer to use notes, since the def-use chains
14858 are often shorter. */
14859 note = find_reg_equal_equiv_note (def_insn);
14860 if (note)
14861 newx = XEXP (note, 0);
14862 else
14863 newx = SET_SRC (set);
14864 newx = r10k_simplify_address (newx, def_insn);
14865 }
14866 }
14867 }
14868 }
14869 }
14870 if (newx && r10k_simplified_address_p (newx))
14871 return newx;
14872 return x;
14873 }
14874
14875 /* Return true if ADDRESS is known to be an uncached address
14876 on R10K systems. */
14877
14878 static bool
14879 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
14880 {
14881 unsigned HOST_WIDE_INT upper;
14882
14883 /* Check for KSEG1. */
14884 if (address + 0x60000000 < 0x20000000)
14885 return true;
14886
14887 /* Check for uncached XKPHYS addresses. */
14888 if (Pmode == DImode)
14889 {
14890 upper = (address >> 40) & 0xf9ffff;
14891 if (upper == 0x900000 || upper == 0xb80000)
14892 return true;
14893 }
14894 return false;
14895 }
14896
14897 /* Return true if we can prove that an access to address X in instruction
14898 INSN would be safe from R10K speculation. This X is a general
14899 expression; it might not be a legitimate address. */
14900
14901 static bool
14902 r10k_safe_address_p (rtx x, rtx insn)
14903 {
14904 rtx base, offset;
14905 HOST_WIDE_INT offset_val;
14906
14907 x = r10k_simplify_address (x, insn);
14908
14909 /* Check for references to the stack frame. It doesn't really matter
14910 how much of the frame has been allocated at INSN; -mr10k-cache-barrier
14911 allows us to assume that accesses to any part of the eventual frame
14912 is safe from speculation at any point in the function. */
14913 mips_split_plus (x, &base, &offset_val);
14914 if (base == virtual_incoming_args_rtx
14915 && offset_val >= -cfun->machine->frame.total_size
14916 && offset_val < cfun->machine->frame.args_size)
14917 return true;
14918
14919 /* Check for uncached addresses. */
14920 if (CONST_INT_P (x))
14921 return r10k_uncached_address_p (INTVAL (x));
14922
14923 /* Check for accesses to a static object. */
14924 split_const (x, &base, &offset);
14925 return offset_within_block_p (base, INTVAL (offset));
14926 }
14927
14928 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
14929 an in-range access to an automatic variable, or to an object with
14930 a link-time-constant address. */
14931
14932 static bool
14933 r10k_safe_mem_expr_p (tree expr, unsigned HOST_WIDE_INT offset)
14934 {
14935 HOST_WIDE_INT bitoffset, bitsize;
14936 tree inner, var_offset;
14937 enum machine_mode mode;
14938 int unsigned_p, volatile_p;
14939
14940 inner = get_inner_reference (expr, &bitsize, &bitoffset, &var_offset, &mode,
14941 &unsigned_p, &volatile_p, false);
14942 if (!DECL_P (inner) || !DECL_SIZE_UNIT (inner) || var_offset)
14943 return false;
14944
14945 offset += bitoffset / BITS_PER_UNIT;
14946 return offset < tree_to_uhwi (DECL_SIZE_UNIT (inner));
14947 }
14948
14949 /* A for_each_rtx callback for which DATA points to the instruction
14950 containing *X. Stop the search if we find a MEM that is not safe
14951 from R10K speculation. */
14952
14953 static int
14954 r10k_needs_protection_p_1 (rtx *loc, void *data)
14955 {
14956 rtx mem;
14957
14958 mem = *loc;
14959 if (!MEM_P (mem))
14960 return 0;
14961
14962 if (MEM_EXPR (mem)
14963 && MEM_OFFSET_KNOWN_P (mem)
14964 && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
14965 return -1;
14966
14967 if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
14968 return -1;
14969
14970 return 1;
14971 }
14972
14973 /* A note_stores callback for which DATA points to an instruction pointer.
14974 If *DATA is nonnull, make it null if it X contains a MEM that is not
14975 safe from R10K speculation. */
14976
14977 static void
14978 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
14979 void *data)
14980 {
14981 rtx *insn_ptr;
14982
14983 insn_ptr = (rtx *) data;
14984 if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
14985 *insn_ptr = NULL_RTX;
14986 }
14987
14988 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
14989 Return nonzero if the call is not to a declared function. */
14990
14991 static int
14992 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
14993 {
14994 rtx x;
14995
14996 x = *loc;
14997 if (!MEM_P (x))
14998 return 0;
14999
15000 x = XEXP (x, 0);
15001 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
15002 return -1;
15003
15004 return 1;
15005 }
15006
15007 /* Return true if instruction INSN needs to be protected by an R10K
15008 cache barrier. */
15009
15010 static bool
15011 r10k_needs_protection_p (rtx insn)
15012 {
15013 if (CALL_P (insn))
15014 return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
15015
15016 if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
15017 {
15018 note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
15019 return insn == NULL_RTX;
15020 }
15021
15022 return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
15023 }
15024
15025 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
15026 edge is unconditional. */
15027
15028 static bool
15029 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
15030 {
15031 edge_iterator ei;
15032 edge e;
15033
15034 FOR_EACH_EDGE (e, ei, bb->preds)
15035 if (!single_succ_p (e->src)
15036 || !bitmap_bit_p (protected_bbs, e->src->index)
15037 || (e->flags & EDGE_COMPLEX) != 0)
15038 return false;
15039 return true;
15040 }
15041
15042 /* Implement -mr10k-cache-barrier= for the current function. */
15043
15044 static void
15045 r10k_insert_cache_barriers (void)
15046 {
15047 int *rev_post_order;
15048 unsigned int i, n;
15049 basic_block bb;
15050 sbitmap protected_bbs;
15051 rtx insn, end, unprotected_region;
15052
15053 if (TARGET_MIPS16)
15054 {
15055 sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
15056 return;
15057 }
15058
15059 /* Calculate dominators. */
15060 calculate_dominance_info (CDI_DOMINATORS);
15061
15062 /* Bit X of PROTECTED_BBS is set if the last operation in basic block
15063 X is protected by a cache barrier. */
15064 protected_bbs = sbitmap_alloc (last_basic_block_for_fn (cfun));
15065 bitmap_clear (protected_bbs);
15066
15067 /* Iterate over the basic blocks in reverse post-order. */
15068 rev_post_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
15069 n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
15070 for (i = 0; i < n; i++)
15071 {
15072 bb = BASIC_BLOCK_FOR_FN (cfun, rev_post_order[i]);
15073
15074 /* If this block is only reached by unconditional edges, and if the
15075 source of every edge is protected, the beginning of the block is
15076 also protected. */
15077 if (r10k_protected_bb_p (bb, protected_bbs))
15078 unprotected_region = NULL_RTX;
15079 else
15080 unprotected_region = pc_rtx;
15081 end = NEXT_INSN (BB_END (bb));
15082
15083 /* UNPROTECTED_REGION is:
15084
15085 - null if we are processing a protected region,
15086 - pc_rtx if we are processing an unprotected region but have
15087 not yet found the first instruction in it
15088 - the first instruction in an unprotected region otherwise. */
15089 for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
15090 {
15091 if (unprotected_region && USEFUL_INSN_P (insn))
15092 {
15093 if (recog_memoized (insn) == CODE_FOR_mips_cache)
15094 /* This CACHE instruction protects the following code. */
15095 unprotected_region = NULL_RTX;
15096 else
15097 {
15098 /* See if INSN is the first instruction in this
15099 unprotected region. */
15100 if (unprotected_region == pc_rtx)
15101 unprotected_region = insn;
15102
15103 /* See if INSN needs to be protected. If so,
15104 we must insert a cache barrier somewhere between
15105 PREV_INSN (UNPROTECTED_REGION) and INSN. It isn't
15106 clear which position is better performance-wise,
15107 but as a tie-breaker, we assume that it is better
15108 to allow delay slots to be back-filled where
15109 possible, and that it is better not to insert
15110 barriers in the middle of already-scheduled code.
15111 We therefore insert the barrier at the beginning
15112 of the region. */
15113 if (r10k_needs_protection_p (insn))
15114 {
15115 emit_insn_before (gen_r10k_cache_barrier (),
15116 unprotected_region);
15117 unprotected_region = NULL_RTX;
15118 }
15119 }
15120 }
15121
15122 if (CALL_P (insn))
15123 /* The called function is not required to protect the exit path.
15124 The code that follows a call is therefore unprotected. */
15125 unprotected_region = pc_rtx;
15126 }
15127
15128 /* Record whether the end of this block is protected. */
15129 if (unprotected_region == NULL_RTX)
15130 bitmap_set_bit (protected_bbs, bb->index);
15131 }
15132 XDELETEVEC (rev_post_order);
15133
15134 sbitmap_free (protected_bbs);
15135
15136 free_dominance_info (CDI_DOMINATORS);
15137 }
15138 \f
15139 /* If INSN is a call, return the underlying CALL expr. Return NULL_RTX
15140 otherwise. If INSN has two call rtx, then store the second one in
15141 SECOND_CALL. */
15142
15143 static rtx
15144 mips_call_expr_from_insn (rtx insn, rtx *second_call)
15145 {
15146 rtx x;
15147 rtx x2;
15148
15149 if (!CALL_P (insn))
15150 return NULL_RTX;
15151
15152 x = PATTERN (insn);
15153 if (GET_CODE (x) == PARALLEL)
15154 {
15155 /* Calls returning complex values have two CALL rtx. Look for the second
15156 one here, and return it via the SECOND_CALL arg. */
15157 x2 = XVECEXP (x, 0, 1);
15158 if (GET_CODE (x2) == SET)
15159 x2 = XEXP (x2, 1);
15160 if (GET_CODE (x2) == CALL)
15161 *second_call = x2;
15162
15163 x = XVECEXP (x, 0, 0);
15164 }
15165 if (GET_CODE (x) == SET)
15166 x = XEXP (x, 1);
15167 gcc_assert (GET_CODE (x) == CALL);
15168
15169 return x;
15170 }
15171
15172 /* REG is set in DEF. See if the definition is one of the ways we load a
15173 register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
15174 If it is, return the symbol reference of the function, otherwise return
15175 NULL_RTX.
15176
15177 If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
15178 the values of source registers, otherwise treat such registers as
15179 having an unknown value. */
15180
15181 static rtx
15182 mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
15183 {
15184 rtx def_insn, set;
15185
15186 if (DF_REF_IS_ARTIFICIAL (def))
15187 return NULL_RTX;
15188
15189 def_insn = DF_REF_INSN (def);
15190 set = single_set (def_insn);
15191 if (set && rtx_equal_p (SET_DEST (set), reg))
15192 {
15193 rtx note, src, symbol;
15194
15195 /* First see whether the source is a plain symbol. This is used
15196 when calling symbols that are not lazily bound. */
15197 src = SET_SRC (set);
15198 if (GET_CODE (src) == SYMBOL_REF)
15199 return src;
15200
15201 /* Handle %call16 references. */
15202 symbol = mips_strip_unspec_call (src);
15203 if (symbol)
15204 {
15205 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15206 return symbol;
15207 }
15208
15209 /* If we have something more complicated, look for a
15210 REG_EQUAL or REG_EQUIV note. */
15211 note = find_reg_equal_equiv_note (def_insn);
15212 if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
15213 return XEXP (note, 0);
15214
15215 /* Follow at most one simple register copy. Such copies are
15216 interesting in cases like:
15217
15218 for (...)
15219 {
15220 locally_binding_fn (...);
15221 }
15222
15223 and:
15224
15225 locally_binding_fn (...);
15226 ...
15227 locally_binding_fn (...);
15228
15229 where the load of locally_binding_fn can legitimately be
15230 hoisted or shared. However, we do not expect to see complex
15231 chains of copies, so a full worklist solution to the problem
15232 would probably be overkill. */
15233 if (recurse_p && REG_P (src))
15234 return mips_find_pic_call_symbol (def_insn, src, false);
15235 }
15236
15237 return NULL_RTX;
15238 }
15239
15240 /* Find the definition of the use of REG in INSN. See if the definition
15241 is one of the ways we load a register with a symbol address for a
15242 mips_use_pic_fn_addr_reg_p call. If it is return the symbol reference
15243 of the function, otherwise return NULL_RTX. RECURSE_P is as for
15244 mips_pic_call_symbol_from_set. */
15245
15246 static rtx
15247 mips_find_pic_call_symbol (rtx insn, rtx reg, bool recurse_p)
15248 {
15249 df_ref use;
15250 struct df_link *defs;
15251 rtx symbol;
15252
15253 use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
15254 if (!use)
15255 return NULL_RTX;
15256 defs = DF_REF_CHAIN (use);
15257 if (!defs)
15258 return NULL_RTX;
15259 symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15260 if (!symbol)
15261 return NULL_RTX;
15262
15263 /* If we have more than one definition, they need to be identical. */
15264 for (defs = defs->next; defs; defs = defs->next)
15265 {
15266 rtx other;
15267
15268 other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15269 if (!rtx_equal_p (symbol, other))
15270 return NULL_RTX;
15271 }
15272
15273 return symbol;
15274 }
15275
15276 /* Replace the args_size operand of the call expression CALL with the
15277 call-attribute UNSPEC and fill in SYMBOL as the function symbol. */
15278
15279 static void
15280 mips_annotate_pic_call_expr (rtx call, rtx symbol)
15281 {
15282 rtx args_size;
15283
15284 args_size = XEXP (call, 1);
15285 XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
15286 gen_rtvec (2, args_size, symbol),
15287 UNSPEC_CALL_ATTR);
15288 }
15289
15290 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression. See
15291 if instead of the arg_size argument it contains the call attributes. If
15292 yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
15293 symbol from the call attributes. Also return false if ARGS_SIZE_OPNO is
15294 -1. */
15295
15296 bool
15297 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
15298 {
15299 rtx args_size, symbol;
15300
15301 if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
15302 return false;
15303
15304 args_size = operands[args_size_opno];
15305 if (GET_CODE (args_size) != UNSPEC)
15306 return false;
15307 gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
15308
15309 symbol = XVECEXP (args_size, 0, 1);
15310 gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15311
15312 operands[args_size_opno] = symbol;
15313 return true;
15314 }
15315
15316 /* Use DF to annotate PIC indirect calls with the function symbol they
15317 dispatch to. */
15318
15319 static void
15320 mips_annotate_pic_calls (void)
15321 {
15322 basic_block bb;
15323 rtx insn;
15324
15325 FOR_EACH_BB_FN (bb, cfun)
15326 FOR_BB_INSNS (bb, insn)
15327 {
15328 rtx call, reg, symbol, second_call;
15329
15330 second_call = 0;
15331 call = mips_call_expr_from_insn (insn, &second_call);
15332 if (!call)
15333 continue;
15334 gcc_assert (MEM_P (XEXP (call, 0)));
15335 reg = XEXP (XEXP (call, 0), 0);
15336 if (!REG_P (reg))
15337 continue;
15338
15339 symbol = mips_find_pic_call_symbol (insn, reg, true);
15340 if (symbol)
15341 {
15342 mips_annotate_pic_call_expr (call, symbol);
15343 if (second_call)
15344 mips_annotate_pic_call_expr (second_call, symbol);
15345 }
15346 }
15347 }
15348 \f
15349 /* A temporary variable used by for_each_rtx callbacks, etc. */
15350 static rtx mips_sim_insn;
15351
15352 /* A structure representing the state of the processor pipeline.
15353 Used by the mips_sim_* family of functions. */
15354 struct mips_sim {
15355 /* The maximum number of instructions that can be issued in a cycle.
15356 (Caches mips_issue_rate.) */
15357 unsigned int issue_rate;
15358
15359 /* The current simulation time. */
15360 unsigned int time;
15361
15362 /* How many more instructions can be issued in the current cycle. */
15363 unsigned int insns_left;
15364
15365 /* LAST_SET[X].INSN is the last instruction to set register X.
15366 LAST_SET[X].TIME is the time at which that instruction was issued.
15367 INSN is null if no instruction has yet set register X. */
15368 struct {
15369 rtx insn;
15370 unsigned int time;
15371 } last_set[FIRST_PSEUDO_REGISTER];
15372
15373 /* The pipeline's current DFA state. */
15374 state_t dfa_state;
15375 };
15376
15377 /* Reset STATE to the initial simulation state. */
15378
15379 static void
15380 mips_sim_reset (struct mips_sim *state)
15381 {
15382 curr_state = state->dfa_state;
15383
15384 state->time = 0;
15385 state->insns_left = state->issue_rate;
15386 memset (&state->last_set, 0, sizeof (state->last_set));
15387 state_reset (curr_state);
15388
15389 targetm.sched.init (0, false, 0);
15390 advance_state (curr_state);
15391 }
15392
15393 /* Initialize STATE before its first use. DFA_STATE points to an
15394 allocated but uninitialized DFA state. */
15395
15396 static void
15397 mips_sim_init (struct mips_sim *state, state_t dfa_state)
15398 {
15399 if (targetm.sched.init_dfa_pre_cycle_insn)
15400 targetm.sched.init_dfa_pre_cycle_insn ();
15401
15402 if (targetm.sched.init_dfa_post_cycle_insn)
15403 targetm.sched.init_dfa_post_cycle_insn ();
15404
15405 state->issue_rate = mips_issue_rate ();
15406 state->dfa_state = dfa_state;
15407 mips_sim_reset (state);
15408 }
15409
15410 /* Advance STATE by one clock cycle. */
15411
15412 static void
15413 mips_sim_next_cycle (struct mips_sim *state)
15414 {
15415 curr_state = state->dfa_state;
15416
15417 state->time++;
15418 state->insns_left = state->issue_rate;
15419 advance_state (curr_state);
15420 }
15421
15422 /* Advance simulation state STATE until instruction INSN can read
15423 register REG. */
15424
15425 static void
15426 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
15427 {
15428 unsigned int regno, end_regno;
15429
15430 end_regno = END_REGNO (reg);
15431 for (regno = REGNO (reg); regno < end_regno; regno++)
15432 if (state->last_set[regno].insn != 0)
15433 {
15434 unsigned int t;
15435
15436 t = (state->last_set[regno].time
15437 + insn_latency (state->last_set[regno].insn, insn));
15438 while (state->time < t)
15439 mips_sim_next_cycle (state);
15440 }
15441 }
15442
15443 /* A for_each_rtx callback. If *X is a register, advance simulation state
15444 DATA until mips_sim_insn can read the register's value. */
15445
15446 static int
15447 mips_sim_wait_regs_2 (rtx *x, void *data)
15448 {
15449 if (REG_P (*x))
15450 mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
15451 return 0;
15452 }
15453
15454 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X. */
15455
15456 static void
15457 mips_sim_wait_regs_1 (rtx *x, void *data)
15458 {
15459 for_each_rtx (x, mips_sim_wait_regs_2, data);
15460 }
15461
15462 /* Advance simulation state STATE until all of INSN's register
15463 dependencies are satisfied. */
15464
15465 static void
15466 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
15467 {
15468 mips_sim_insn = insn;
15469 note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
15470 }
15471
15472 /* Advance simulation state STATE until the units required by
15473 instruction INSN are available. */
15474
15475 static void
15476 mips_sim_wait_units (struct mips_sim *state, rtx insn)
15477 {
15478 state_t tmp_state;
15479
15480 tmp_state = alloca (state_size ());
15481 while (state->insns_left == 0
15482 || (memcpy (tmp_state, state->dfa_state, state_size ()),
15483 state_transition (tmp_state, insn) >= 0))
15484 mips_sim_next_cycle (state);
15485 }
15486
15487 /* Advance simulation state STATE until INSN is ready to issue. */
15488
15489 static void
15490 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
15491 {
15492 mips_sim_wait_regs (state, insn);
15493 mips_sim_wait_units (state, insn);
15494 }
15495
15496 /* mips_sim_insn has just set X. Update the LAST_SET array
15497 in simulation state DATA. */
15498
15499 static void
15500 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
15501 {
15502 struct mips_sim *state;
15503
15504 state = (struct mips_sim *) data;
15505 if (REG_P (x))
15506 {
15507 unsigned int regno, end_regno;
15508
15509 end_regno = END_REGNO (x);
15510 for (regno = REGNO (x); regno < end_regno; regno++)
15511 {
15512 state->last_set[regno].insn = mips_sim_insn;
15513 state->last_set[regno].time = state->time;
15514 }
15515 }
15516 }
15517
15518 /* Issue instruction INSN in scheduler state STATE. Assume that INSN
15519 can issue immediately (i.e., that mips_sim_wait_insn has already
15520 been called). */
15521
15522 static void
15523 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
15524 {
15525 curr_state = state->dfa_state;
15526
15527 state_transition (curr_state, insn);
15528 state->insns_left = targetm.sched.variable_issue (0, false, insn,
15529 state->insns_left);
15530
15531 mips_sim_insn = insn;
15532 note_stores (PATTERN (insn), mips_sim_record_set, state);
15533 }
15534
15535 /* Simulate issuing a NOP in state STATE. */
15536
15537 static void
15538 mips_sim_issue_nop (struct mips_sim *state)
15539 {
15540 if (state->insns_left == 0)
15541 mips_sim_next_cycle (state);
15542 state->insns_left--;
15543 }
15544
15545 /* Update simulation state STATE so that it's ready to accept the instruction
15546 after INSN. INSN should be part of the main rtl chain, not a member of a
15547 SEQUENCE. */
15548
15549 static void
15550 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
15551 {
15552 /* If INSN is a jump with an implicit delay slot, simulate a nop. */
15553 if (JUMP_P (insn))
15554 mips_sim_issue_nop (state);
15555
15556 switch (GET_CODE (SEQ_BEGIN (insn)))
15557 {
15558 case CODE_LABEL:
15559 case CALL_INSN:
15560 /* We can't predict the processor state after a call or label. */
15561 mips_sim_reset (state);
15562 break;
15563
15564 case JUMP_INSN:
15565 /* The delay slots of branch likely instructions are only executed
15566 when the branch is taken. Therefore, if the caller has simulated
15567 the delay slot instruction, STATE does not really reflect the state
15568 of the pipeline for the instruction after the delay slot. Also,
15569 branch likely instructions tend to incur a penalty when not taken,
15570 so there will probably be an extra delay between the branch and
15571 the instruction after the delay slot. */
15572 if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
15573 mips_sim_reset (state);
15574 break;
15575
15576 default:
15577 break;
15578 }
15579 }
15580
15581 /* Use simulator state STATE to calculate the execution time of
15582 instruction sequence SEQ. */
15583
15584 static unsigned int
15585 mips_seq_time (struct mips_sim *state, rtx seq)
15586 {
15587 mips_sim_reset (state);
15588 for (rtx insn = seq; insn; insn = NEXT_INSN (insn))
15589 {
15590 mips_sim_wait_insn (state, insn);
15591 mips_sim_issue_insn (state, insn);
15592 }
15593 return state->time;
15594 }
15595 \f
15596 /* Return the execution-time cost of mips_tuning_info.fast_mult_zero_zero_p
15597 setting SETTING, using STATE to simulate instruction sequences. */
15598
15599 static unsigned int
15600 mips_mult_zero_zero_cost (struct mips_sim *state, bool setting)
15601 {
15602 mips_tuning_info.fast_mult_zero_zero_p = setting;
15603 start_sequence ();
15604
15605 enum machine_mode dword_mode = TARGET_64BIT ? TImode : DImode;
15606 rtx hilo = gen_rtx_REG (dword_mode, MD_REG_FIRST);
15607 mips_emit_move_or_split (hilo, const0_rtx, SPLIT_FOR_SPEED);
15608
15609 /* If the target provides mulsidi3_32bit then that's the most likely
15610 consumer of the result. Test for bypasses. */
15611 if (dword_mode == DImode && HAVE_maddsidi4)
15612 {
15613 rtx gpr = gen_rtx_REG (SImode, GP_REG_FIRST + 4);
15614 emit_insn (gen_maddsidi4 (hilo, gpr, gpr, hilo));
15615 }
15616
15617 unsigned int time = mips_seq_time (state, get_insns ());
15618 end_sequence ();
15619 return time;
15620 }
15621
15622 /* Check the relative speeds of "MULT $0,$0" and "MTLO $0; MTHI $0"
15623 and set up mips_tuning_info.fast_mult_zero_zero_p accordingly.
15624 Prefer MULT -- which is shorter -- in the event of a tie. */
15625
15626 static void
15627 mips_set_fast_mult_zero_zero_p (struct mips_sim *state)
15628 {
15629 if (TARGET_MIPS16)
15630 /* No MTLO or MTHI available. */
15631 mips_tuning_info.fast_mult_zero_zero_p = true;
15632 else
15633 {
15634 unsigned int true_time = mips_mult_zero_zero_cost (state, true);
15635 unsigned int false_time = mips_mult_zero_zero_cost (state, false);
15636 mips_tuning_info.fast_mult_zero_zero_p = (true_time <= false_time);
15637 }
15638 }
15639
15640 /* Set up costs based on the current architecture and tuning settings. */
15641
15642 static void
15643 mips_set_tuning_info (void)
15644 {
15645 if (mips_tuning_info.initialized_p
15646 && mips_tuning_info.arch == mips_arch
15647 && mips_tuning_info.tune == mips_tune
15648 && mips_tuning_info.mips16_p == TARGET_MIPS16)
15649 return;
15650
15651 mips_tuning_info.arch = mips_arch;
15652 mips_tuning_info.tune = mips_tune;
15653 mips_tuning_info.mips16_p = TARGET_MIPS16;
15654 mips_tuning_info.initialized_p = true;
15655
15656 dfa_start ();
15657
15658 struct mips_sim state;
15659 mips_sim_init (&state, alloca (state_size ()));
15660
15661 mips_set_fast_mult_zero_zero_p (&state);
15662
15663 dfa_finish ();
15664 }
15665
15666 /* Implement TARGET_EXPAND_TO_RTL_HOOK. */
15667
15668 static void
15669 mips_expand_to_rtl_hook (void)
15670 {
15671 /* We need to call this at a point where we can safely create sequences
15672 of instructions, so TARGET_OVERRIDE_OPTIONS is too early. We also
15673 need to call it at a point where the DFA infrastructure is not
15674 already in use, so we can't just call it lazily on demand.
15675
15676 At present, mips_tuning_info is only needed during post-expand
15677 RTL passes such as split_insns, so this hook should be early enough.
15678 We may need to move the call elsewhere if mips_tuning_info starts
15679 to be used for other things (such as rtx_costs, or expanders that
15680 could be called during gimple optimization). */
15681 mips_set_tuning_info ();
15682 }
15683 \f
15684 /* The VR4130 pipeline issues aligned pairs of instructions together,
15685 but it stalls the second instruction if it depends on the first.
15686 In order to cut down the amount of logic required, this dependence
15687 check is not based on a full instruction decode. Instead, any non-SPECIAL
15688 instruction is assumed to modify the register specified by bits 20-16
15689 (which is usually the "rt" field).
15690
15691 In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
15692 input, so we can end up with a false dependence between the branch
15693 and its delay slot. If this situation occurs in instruction INSN,
15694 try to avoid it by swapping rs and rt. */
15695
15696 static void
15697 vr4130_avoid_branch_rt_conflict (rtx insn)
15698 {
15699 rtx first, second;
15700
15701 first = SEQ_BEGIN (insn);
15702 second = SEQ_END (insn);
15703 if (JUMP_P (first)
15704 && NONJUMP_INSN_P (second)
15705 && GET_CODE (PATTERN (first)) == SET
15706 && GET_CODE (SET_DEST (PATTERN (first))) == PC
15707 && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
15708 {
15709 /* Check for the right kind of condition. */
15710 rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
15711 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
15712 && REG_P (XEXP (cond, 0))
15713 && REG_P (XEXP (cond, 1))
15714 && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
15715 && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
15716 {
15717 /* SECOND mentions the rt register but not the rs register. */
15718 rtx tmp = XEXP (cond, 0);
15719 XEXP (cond, 0) = XEXP (cond, 1);
15720 XEXP (cond, 1) = tmp;
15721 }
15722 }
15723 }
15724
15725 /* Implement -mvr4130-align. Go through each basic block and simulate the
15726 processor pipeline. If we find that a pair of instructions could execute
15727 in parallel, and the first of those instructions is not 8-byte aligned,
15728 insert a nop to make it aligned. */
15729
15730 static void
15731 vr4130_align_insns (void)
15732 {
15733 struct mips_sim state;
15734 rtx insn, subinsn, last, last2, next;
15735 bool aligned_p;
15736
15737 dfa_start ();
15738
15739 /* LAST is the last instruction before INSN to have a nonzero length.
15740 LAST2 is the last such instruction before LAST. */
15741 last = 0;
15742 last2 = 0;
15743
15744 /* ALIGNED_P is true if INSN is known to be at an aligned address. */
15745 aligned_p = true;
15746
15747 mips_sim_init (&state, alloca (state_size ()));
15748 for (insn = get_insns (); insn != 0; insn = next)
15749 {
15750 unsigned int length;
15751
15752 next = NEXT_INSN (insn);
15753
15754 /* See the comment above vr4130_avoid_branch_rt_conflict for details.
15755 This isn't really related to the alignment pass, but we do it on
15756 the fly to avoid a separate instruction walk. */
15757 vr4130_avoid_branch_rt_conflict (insn);
15758
15759 length = get_attr_length (insn);
15760 if (length > 0 && USEFUL_INSN_P (insn))
15761 FOR_EACH_SUBINSN (subinsn, insn)
15762 {
15763 mips_sim_wait_insn (&state, subinsn);
15764
15765 /* If we want this instruction to issue in parallel with the
15766 previous one, make sure that the previous instruction is
15767 aligned. There are several reasons why this isn't worthwhile
15768 when the second instruction is a call:
15769
15770 - Calls are less likely to be performance critical,
15771 - There's a good chance that the delay slot can execute
15772 in parallel with the call.
15773 - The return address would then be unaligned.
15774
15775 In general, if we're going to insert a nop between instructions
15776 X and Y, it's better to insert it immediately after X. That
15777 way, if the nop makes Y aligned, it will also align any labels
15778 between X and Y. */
15779 if (state.insns_left != state.issue_rate
15780 && !CALL_P (subinsn))
15781 {
15782 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
15783 {
15784 /* SUBINSN is the first instruction in INSN and INSN is
15785 aligned. We want to align the previous instruction
15786 instead, so insert a nop between LAST2 and LAST.
15787
15788 Note that LAST could be either a single instruction
15789 or a branch with a delay slot. In the latter case,
15790 LAST, like INSN, is already aligned, but the delay
15791 slot must have some extra delay that stops it from
15792 issuing at the same time as the branch. We therefore
15793 insert a nop before the branch in order to align its
15794 delay slot. */
15795 gcc_assert (last2);
15796 emit_insn_after (gen_nop (), last2);
15797 aligned_p = false;
15798 }
15799 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
15800 {
15801 /* SUBINSN is the delay slot of INSN, but INSN is
15802 currently unaligned. Insert a nop between
15803 LAST and INSN to align it. */
15804 gcc_assert (last);
15805 emit_insn_after (gen_nop (), last);
15806 aligned_p = true;
15807 }
15808 }
15809 mips_sim_issue_insn (&state, subinsn);
15810 }
15811 mips_sim_finish_insn (&state, insn);
15812
15813 /* Update LAST, LAST2 and ALIGNED_P for the next instruction. */
15814 length = get_attr_length (insn);
15815 if (length > 0)
15816 {
15817 /* If the instruction is an asm statement or multi-instruction
15818 mips.md patern, the length is only an estimate. Insert an
15819 8 byte alignment after it so that the following instructions
15820 can be handled correctly. */
15821 if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
15822 && (recog_memoized (insn) < 0 || length >= 8))
15823 {
15824 next = emit_insn_after (gen_align (GEN_INT (3)), insn);
15825 next = NEXT_INSN (next);
15826 mips_sim_next_cycle (&state);
15827 aligned_p = true;
15828 }
15829 else if (length & 4)
15830 aligned_p = !aligned_p;
15831 last2 = last;
15832 last = insn;
15833 }
15834
15835 /* See whether INSN is an aligned label. */
15836 if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
15837 aligned_p = true;
15838 }
15839 dfa_finish ();
15840 }
15841 \f
15842 /* This structure records that the current function has a LO_SUM
15843 involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
15844 the largest offset applied to BASE by all such LO_SUMs. */
15845 struct mips_lo_sum_offset {
15846 rtx base;
15847 HOST_WIDE_INT offset;
15848 };
15849
15850 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE. */
15851
15852 static hashval_t
15853 mips_hash_base (rtx base)
15854 {
15855 int do_not_record_p;
15856
15857 return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
15858 }
15859
15860 /* Hashtable helpers. */
15861
15862 struct mips_lo_sum_offset_hasher : typed_free_remove <mips_lo_sum_offset>
15863 {
15864 typedef mips_lo_sum_offset value_type;
15865 typedef rtx_def compare_type;
15866 static inline hashval_t hash (const value_type *);
15867 static inline bool equal (const value_type *, const compare_type *);
15868 };
15869
15870 /* Hash-table callbacks for mips_lo_sum_offsets. */
15871
15872 inline hashval_t
15873 mips_lo_sum_offset_hasher::hash (const value_type *entry)
15874 {
15875 return mips_hash_base (entry->base);
15876 }
15877
15878 inline bool
15879 mips_lo_sum_offset_hasher::equal (const value_type *entry,
15880 const compare_type *value)
15881 {
15882 return rtx_equal_p (entry->base, value);
15883 }
15884
15885 typedef hash_table <mips_lo_sum_offset_hasher> mips_offset_table;
15886
15887 /* Look up symbolic constant X in HTAB, which is a hash table of
15888 mips_lo_sum_offsets. If OPTION is NO_INSERT, return true if X can be
15889 paired with a recorded LO_SUM, otherwise record X in the table. */
15890
15891 static bool
15892 mips_lo_sum_offset_lookup (mips_offset_table htab, rtx x,
15893 enum insert_option option)
15894 {
15895 rtx base, offset;
15896 mips_lo_sum_offset **slot;
15897 struct mips_lo_sum_offset *entry;
15898
15899 /* Split X into a base and offset. */
15900 split_const (x, &base, &offset);
15901 if (UNSPEC_ADDRESS_P (base))
15902 base = UNSPEC_ADDRESS (base);
15903
15904 /* Look up the base in the hash table. */
15905 slot = htab.find_slot_with_hash (base, mips_hash_base (base), option);
15906 if (slot == NULL)
15907 return false;
15908
15909 entry = (struct mips_lo_sum_offset *) *slot;
15910 if (option == INSERT)
15911 {
15912 if (entry == NULL)
15913 {
15914 entry = XNEW (struct mips_lo_sum_offset);
15915 entry->base = base;
15916 entry->offset = INTVAL (offset);
15917 *slot = entry;
15918 }
15919 else
15920 {
15921 if (INTVAL (offset) > entry->offset)
15922 entry->offset = INTVAL (offset);
15923 }
15924 }
15925 return INTVAL (offset) <= entry->offset;
15926 }
15927
15928 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
15929 Record every LO_SUM in *LOC. */
15930
15931 static int
15932 mips_record_lo_sum (rtx *loc, void *data)
15933 {
15934 if (GET_CODE (*loc) == LO_SUM)
15935 mips_lo_sum_offset_lookup (*(mips_offset_table*) data,
15936 XEXP (*loc, 1), INSERT);
15937 return 0;
15938 }
15939
15940 /* Return true if INSN is a SET of an orphaned high-part relocation.
15941 HTAB is a hash table of mips_lo_sum_offsets that describes all the
15942 LO_SUMs in the current function. */
15943
15944 static bool
15945 mips_orphaned_high_part_p (mips_offset_table htab, rtx insn)
15946 {
15947 enum mips_symbol_type type;
15948 rtx x, set;
15949
15950 set = single_set (insn);
15951 if (set)
15952 {
15953 /* Check for %his. */
15954 x = SET_SRC (set);
15955 if (GET_CODE (x) == HIGH
15956 && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
15957 return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
15958
15959 /* Check for local %gots (and %got_pages, which is redundant but OK). */
15960 if (GET_CODE (x) == UNSPEC
15961 && XINT (x, 1) == UNSPEC_LOAD_GOT
15962 && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
15963 SYMBOL_CONTEXT_LEA, &type)
15964 && type == SYMBOL_GOTOFF_PAGE)
15965 return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
15966 }
15967 return false;
15968 }
15969
15970 /* Subroutine of mips_reorg_process_insns. If there is a hazard between
15971 INSN and a previous instruction, avoid it by inserting nops after
15972 instruction AFTER.
15973
15974 *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
15975 this point. If *DELAYED_REG is non-null, INSN must wait a cycle
15976 before using the value of that register. *HILO_DELAY counts the
15977 number of instructions since the last hilo hazard (that is,
15978 the number of instructions since the last MFLO or MFHI).
15979
15980 After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
15981 for the next instruction.
15982
15983 LO_REG is an rtx for the LO register, used in dependence checking. */
15984
15985 static void
15986 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
15987 rtx *delayed_reg, rtx lo_reg)
15988 {
15989 rtx pattern, set;
15990 int nops, ninsns;
15991
15992 pattern = PATTERN (insn);
15993
15994 /* Do not put the whole function in .set noreorder if it contains
15995 an asm statement. We don't know whether there will be hazards
15996 between the asm statement and the gcc-generated code. */
15997 if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
15998 cfun->machine->all_noreorder_p = false;
15999
16000 /* Ignore zero-length instructions (barriers and the like). */
16001 ninsns = get_attr_length (insn) / 4;
16002 if (ninsns == 0)
16003 return;
16004
16005 /* Work out how many nops are needed. Note that we only care about
16006 registers that are explicitly mentioned in the instruction's pattern.
16007 It doesn't matter that calls use the argument registers or that they
16008 clobber hi and lo. */
16009 if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
16010 nops = 2 - *hilo_delay;
16011 else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
16012 nops = 1;
16013 else
16014 nops = 0;
16015
16016 /* Insert the nops between this instruction and the previous one.
16017 Each new nop takes us further from the last hilo hazard. */
16018 *hilo_delay += nops;
16019 while (nops-- > 0)
16020 emit_insn_after (gen_hazard_nop (), after);
16021
16022 /* Set up the state for the next instruction. */
16023 *hilo_delay += ninsns;
16024 *delayed_reg = 0;
16025 if (INSN_CODE (insn) >= 0)
16026 switch (get_attr_hazard (insn))
16027 {
16028 case HAZARD_NONE:
16029 break;
16030
16031 case HAZARD_HILO:
16032 *hilo_delay = 0;
16033 break;
16034
16035 case HAZARD_DELAY:
16036 set = single_set (insn);
16037 gcc_assert (set);
16038 *delayed_reg = SET_DEST (set);
16039 break;
16040 }
16041 }
16042
16043 /* Go through the instruction stream and insert nops where necessary.
16044 Also delete any high-part relocations whose partnering low parts
16045 are now all dead. See if the whole function can then be put into
16046 .set noreorder and .set nomacro. */
16047
16048 static void
16049 mips_reorg_process_insns (void)
16050 {
16051 rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
16052 int hilo_delay;
16053 mips_offset_table htab;
16054
16055 /* Force all instructions to be split into their final form. */
16056 split_all_insns_noflow ();
16057
16058 /* Recalculate instruction lengths without taking nops into account. */
16059 cfun->machine->ignore_hazard_length_p = true;
16060 shorten_branches (get_insns ());
16061
16062 cfun->machine->all_noreorder_p = true;
16063
16064 /* We don't track MIPS16 PC-relative offsets closely enough to make
16065 a good job of "set .noreorder" code in MIPS16 mode. */
16066 if (TARGET_MIPS16)
16067 cfun->machine->all_noreorder_p = false;
16068
16069 /* Code that doesn't use explicit relocs can't be ".set nomacro". */
16070 if (!TARGET_EXPLICIT_RELOCS)
16071 cfun->machine->all_noreorder_p = false;
16072
16073 /* Profiled functions can't be all noreorder because the profiler
16074 support uses assembler macros. */
16075 if (crtl->profile)
16076 cfun->machine->all_noreorder_p = false;
16077
16078 /* Code compiled with -mfix-vr4120, -mfix-rm7000 or -mfix-24k can't be
16079 all noreorder because we rely on the assembler to work around some
16080 errata. The R5900 too has several bugs. */
16081 if (TARGET_FIX_VR4120
16082 || TARGET_FIX_RM7000
16083 || TARGET_FIX_24K
16084 || TARGET_MIPS5900)
16085 cfun->machine->all_noreorder_p = false;
16086
16087 /* The same is true for -mfix-vr4130 if we might generate MFLO or
16088 MFHI instructions. Note that we avoid using MFLO and MFHI if
16089 the VR4130 MACC and DMACC instructions are available instead;
16090 see the *mfhilo_{si,di}_macc patterns. */
16091 if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
16092 cfun->machine->all_noreorder_p = false;
16093
16094 htab.create (37);
16095
16096 /* Make a first pass over the instructions, recording all the LO_SUMs. */
16097 for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16098 FOR_EACH_SUBINSN (subinsn, insn)
16099 if (USEFUL_INSN_P (subinsn))
16100 {
16101 rtx body = PATTERN (insn);
16102 int noperands = asm_noperands (body);
16103 if (noperands >= 0)
16104 {
16105 rtx *ops = XALLOCAVEC (rtx, noperands);
16106 bool *used = XALLOCAVEC (bool, noperands);
16107 const char *string = decode_asm_operands (body, ops, NULL, NULL,
16108 NULL, NULL);
16109 get_referenced_operands (string, used, noperands);
16110 for (int i = 0; i < noperands; ++i)
16111 if (used[i])
16112 for_each_rtx (&ops[i], mips_record_lo_sum, &htab);
16113 }
16114 else
16115 for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, &htab);
16116 }
16117
16118 last_insn = 0;
16119 hilo_delay = 2;
16120 delayed_reg = 0;
16121 lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
16122
16123 /* Make a second pass over the instructions. Delete orphaned
16124 high-part relocations or turn them into NOPs. Avoid hazards
16125 by inserting NOPs. */
16126 for (insn = get_insns (); insn != 0; insn = next_insn)
16127 {
16128 next_insn = NEXT_INSN (insn);
16129 if (USEFUL_INSN_P (insn))
16130 {
16131 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
16132 {
16133 /* If we find an orphaned high-part relocation in a delay
16134 slot, it's easier to turn that instruction into a NOP than
16135 to delete it. The delay slot will be a NOP either way. */
16136 FOR_EACH_SUBINSN (subinsn, insn)
16137 if (INSN_P (subinsn))
16138 {
16139 if (mips_orphaned_high_part_p (htab, subinsn))
16140 {
16141 PATTERN (subinsn) = gen_nop ();
16142 INSN_CODE (subinsn) = CODE_FOR_nop;
16143 }
16144 mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
16145 &delayed_reg, lo_reg);
16146 }
16147 last_insn = insn;
16148 }
16149 else
16150 {
16151 /* INSN is a single instruction. Delete it if it's an
16152 orphaned high-part relocation. */
16153 if (mips_orphaned_high_part_p (htab, insn))
16154 delete_insn (insn);
16155 /* Also delete cache barriers if the last instruction
16156 was an annulled branch. INSN will not be speculatively
16157 executed. */
16158 else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
16159 && last_insn
16160 && JUMP_P (SEQ_BEGIN (last_insn))
16161 && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
16162 delete_insn (insn);
16163 else
16164 {
16165 mips_avoid_hazard (last_insn, insn, &hilo_delay,
16166 &delayed_reg, lo_reg);
16167 last_insn = insn;
16168 }
16169 }
16170 }
16171 }
16172
16173 htab.dispose ();
16174 }
16175
16176 /* Return true if the function has a long branch instruction. */
16177
16178 static bool
16179 mips_has_long_branch_p (void)
16180 {
16181 rtx insn, subinsn;
16182 int normal_length;
16183
16184 /* We need up-to-date instruction lengths. */
16185 shorten_branches (get_insns ());
16186
16187 /* Look for a branch that is longer than normal. The normal length for
16188 non-MIPS16 branches is 8, because the length includes the delay slot.
16189 It is 4 for MIPS16, because MIPS16 branches are extended instructions,
16190 but they have no delay slot. */
16191 normal_length = (TARGET_MIPS16 ? 4 : 8);
16192 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16193 FOR_EACH_SUBINSN (subinsn, insn)
16194 if (JUMP_P (subinsn)
16195 && get_attr_length (subinsn) > normal_length
16196 && (any_condjump_p (subinsn) || any_uncondjump_p (subinsn)))
16197 return true;
16198
16199 return false;
16200 }
16201
16202 /* If we are using a GOT, but have not decided to use a global pointer yet,
16203 see whether we need one to implement long branches. Convert the ghost
16204 global-pointer instructions into real ones if so. */
16205
16206 static bool
16207 mips_expand_ghost_gp_insns (void)
16208 {
16209 /* Quick exit if we already know that we will or won't need a
16210 global pointer. */
16211 if (!TARGET_USE_GOT
16212 || cfun->machine->global_pointer == INVALID_REGNUM
16213 || mips_must_initialize_gp_p ())
16214 return false;
16215
16216 /* Run a full check for long branches. */
16217 if (!mips_has_long_branch_p ())
16218 return false;
16219
16220 /* We've now established that we need $gp. */
16221 cfun->machine->must_initialize_gp_p = true;
16222 split_all_insns_noflow ();
16223
16224 return true;
16225 }
16226
16227 /* Subroutine of mips_reorg to manage passes that require DF. */
16228
16229 static void
16230 mips_df_reorg (void)
16231 {
16232 /* Create def-use chains. */
16233 df_set_flags (DF_EQ_NOTES);
16234 df_chain_add_problem (DF_UD_CHAIN);
16235 df_analyze ();
16236
16237 if (TARGET_RELAX_PIC_CALLS)
16238 mips_annotate_pic_calls ();
16239
16240 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
16241 r10k_insert_cache_barriers ();
16242
16243 df_finish_pass (false);
16244 }
16245
16246 /* Emit code to load LABEL_REF SRC into MIPS16 register DEST. This is
16247 called very late in mips_reorg, but the caller is required to run
16248 mips16_lay_out_constants on the result. */
16249
16250 static void
16251 mips16_load_branch_target (rtx dest, rtx src)
16252 {
16253 if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
16254 {
16255 rtx page, low;
16256
16257 if (mips_cfun_has_cprestore_slot_p ())
16258 mips_emit_move (dest, mips_cprestore_slot (dest, true));
16259 else
16260 mips_emit_move (dest, pic_offset_table_rtx);
16261 page = mips_unspec_address (src, SYMBOL_GOTOFF_PAGE);
16262 low = mips_unspec_address (src, SYMBOL_GOT_PAGE_OFST);
16263 emit_insn (gen_rtx_SET (VOIDmode, dest,
16264 PMODE_INSN (gen_unspec_got, (dest, page))));
16265 emit_insn (gen_rtx_SET (VOIDmode, dest,
16266 gen_rtx_LO_SUM (Pmode, dest, low)));
16267 }
16268 else
16269 {
16270 src = mips_unspec_address (src, SYMBOL_ABSOLUTE);
16271 mips_emit_move (dest, src);
16272 }
16273 }
16274
16275 /* If we're compiling a MIPS16 function, look for and split any long branches.
16276 This must be called after all other instruction modifications in
16277 mips_reorg. */
16278
16279 static void
16280 mips16_split_long_branches (void)
16281 {
16282 bool something_changed;
16283
16284 if (!TARGET_MIPS16)
16285 return;
16286
16287 /* Loop until the alignments for all targets are sufficient. */
16288 do
16289 {
16290 rtx insn;
16291
16292 shorten_branches (get_insns ());
16293 something_changed = false;
16294 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16295 if (JUMP_P (insn)
16296 && get_attr_length (insn) > 4
16297 && (any_condjump_p (insn) || any_uncondjump_p (insn)))
16298 {
16299 rtx old_label, new_label, temp, saved_temp;
16300 rtx target, jump, jump_sequence;
16301
16302 start_sequence ();
16303
16304 /* Free up a MIPS16 register by saving it in $1. */
16305 saved_temp = gen_rtx_REG (Pmode, AT_REGNUM);
16306 temp = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
16307 emit_move_insn (saved_temp, temp);
16308
16309 /* Load the branch target into TEMP. */
16310 old_label = JUMP_LABEL (insn);
16311 target = gen_rtx_LABEL_REF (Pmode, old_label);
16312 mips16_load_branch_target (temp, target);
16313
16314 /* Jump to the target and restore the register's
16315 original value. */
16316 jump = emit_jump_insn (PMODE_INSN (gen_indirect_jump_and_restore,
16317 (temp, temp, saved_temp)));
16318 JUMP_LABEL (jump) = old_label;
16319 LABEL_NUSES (old_label)++;
16320
16321 /* Rewrite any symbolic references that are supposed to use
16322 a PC-relative constant pool. */
16323 mips16_lay_out_constants (false);
16324
16325 if (simplejump_p (insn))
16326 /* We're going to replace INSN with a longer form. */
16327 new_label = NULL_RTX;
16328 else
16329 {
16330 /* Create a branch-around label for the original
16331 instruction. */
16332 new_label = gen_label_rtx ();
16333 emit_label (new_label);
16334 }
16335
16336 jump_sequence = get_insns ();
16337 end_sequence ();
16338
16339 emit_insn_after (jump_sequence, insn);
16340 if (new_label)
16341 invert_jump (insn, new_label, false);
16342 else
16343 delete_insn (insn);
16344 something_changed = true;
16345 }
16346 }
16347 while (something_changed);
16348 }
16349
16350 /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
16351
16352 static void
16353 mips_reorg (void)
16354 {
16355 /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF. Also during
16356 insn splitting in mips16_lay_out_constants, DF insn info is only kept up
16357 to date if the CFG is available. */
16358 if (mips_cfg_in_reorg ())
16359 compute_bb_for_insn ();
16360 mips16_lay_out_constants (true);
16361 if (mips_cfg_in_reorg ())
16362 {
16363 mips_df_reorg ();
16364 free_bb_for_insn ();
16365 }
16366 }
16367
16368 /* We use a machine specific pass to do a second machine dependent reorg
16369 pass after delay branch scheduling. */
16370
16371 static unsigned int
16372 mips_machine_reorg2 (void)
16373 {
16374 mips_reorg_process_insns ();
16375 if (!TARGET_MIPS16
16376 && TARGET_EXPLICIT_RELOCS
16377 && TUNE_MIPS4130
16378 && TARGET_VR4130_ALIGN)
16379 vr4130_align_insns ();
16380 if (mips_expand_ghost_gp_insns ())
16381 /* The expansion could invalidate some of the VR4130 alignment
16382 optimizations, but this should be an extremely rare case anyhow. */
16383 mips_reorg_process_insns ();
16384 mips16_split_long_branches ();
16385 return 0;
16386 }
16387
16388 namespace {
16389
16390 const pass_data pass_data_mips_machine_reorg2 =
16391 {
16392 RTL_PASS, /* type */
16393 "mach2", /* name */
16394 OPTGROUP_NONE, /* optinfo_flags */
16395 false, /* has_gate */
16396 true, /* has_execute */
16397 TV_MACH_DEP, /* tv_id */
16398 0, /* properties_required */
16399 0, /* properties_provided */
16400 0, /* properties_destroyed */
16401 0, /* todo_flags_start */
16402 TODO_verify_rtl_sharing, /* todo_flags_finish */
16403 };
16404
16405 class pass_mips_machine_reorg2 : public rtl_opt_pass
16406 {
16407 public:
16408 pass_mips_machine_reorg2(gcc::context *ctxt)
16409 : rtl_opt_pass(pass_data_mips_machine_reorg2, ctxt)
16410 {}
16411
16412 /* opt_pass methods: */
16413 unsigned int execute () { return mips_machine_reorg2 (); }
16414
16415 }; // class pass_mips_machine_reorg2
16416
16417 } // anon namespace
16418
16419 rtl_opt_pass *
16420 make_pass_mips_machine_reorg2 (gcc::context *ctxt)
16421 {
16422 return new pass_mips_machine_reorg2 (ctxt);
16423 }
16424
16425 \f
16426 /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
16427 in order to avoid duplicating too much logic from elsewhere. */
16428
16429 static void
16430 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
16431 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
16432 tree function)
16433 {
16434 rtx this_rtx, temp1, temp2, insn, fnaddr;
16435 bool use_sibcall_p;
16436
16437 /* Pretend to be a post-reload pass while generating rtl. */
16438 reload_completed = 1;
16439
16440 /* Mark the end of the (empty) prologue. */
16441 emit_note (NOTE_INSN_PROLOGUE_END);
16442
16443 /* Determine if we can use a sibcall to call FUNCTION directly. */
16444 fnaddr = XEXP (DECL_RTL (function), 0);
16445 use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
16446 && const_call_insn_operand (fnaddr, Pmode));
16447
16448 /* Determine if we need to load FNADDR from the GOT. */
16449 if (!use_sibcall_p
16450 && (mips_got_symbol_type_p
16451 (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
16452 {
16453 /* Pick a global pointer. Use a call-clobbered register if
16454 TARGET_CALL_SAVED_GP. */
16455 cfun->machine->global_pointer
16456 = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
16457 cfun->machine->must_initialize_gp_p = true;
16458 SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
16459
16460 /* Set up the global pointer for n32 or n64 abicalls. */
16461 mips_emit_loadgp ();
16462 }
16463
16464 /* We need two temporary registers in some cases. */
16465 temp1 = gen_rtx_REG (Pmode, 2);
16466 temp2 = gen_rtx_REG (Pmode, 3);
16467
16468 /* Find out which register contains the "this" pointer. */
16469 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
16470 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
16471 else
16472 this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
16473
16474 /* Add DELTA to THIS_RTX. */
16475 if (delta != 0)
16476 {
16477 rtx offset = GEN_INT (delta);
16478 if (!SMALL_OPERAND (delta))
16479 {
16480 mips_emit_move (temp1, offset);
16481 offset = temp1;
16482 }
16483 emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
16484 }
16485
16486 /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX. */
16487 if (vcall_offset != 0)
16488 {
16489 rtx addr;
16490
16491 /* Set TEMP1 to *THIS_RTX. */
16492 mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
16493
16494 /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET. */
16495 addr = mips_add_offset (temp2, temp1, vcall_offset);
16496
16497 /* Load the offset and add it to THIS_RTX. */
16498 mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
16499 emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
16500 }
16501
16502 /* Jump to the target function. Use a sibcall if direct jumps are
16503 allowed, otherwise load the address into a register first. */
16504 if (use_sibcall_p)
16505 {
16506 insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
16507 SIBLING_CALL_P (insn) = 1;
16508 }
16509 else
16510 {
16511 /* This is messy. GAS treats "la $25,foo" as part of a call
16512 sequence and may allow a global "foo" to be lazily bound.
16513 The general move patterns therefore reject this combination.
16514
16515 In this context, lazy binding would actually be OK
16516 for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
16517 TARGET_CALL_SAVED_GP; see mips_load_call_address.
16518 We must therefore load the address via a temporary
16519 register if mips_dangerous_for_la25_p.
16520
16521 If we jump to the temporary register rather than $25,
16522 the assembler can use the move insn to fill the jump's
16523 delay slot.
16524
16525 We can use the same technique for MIPS16 code, where $25
16526 is not a valid JR register. */
16527 if (TARGET_USE_PIC_FN_ADDR_REG
16528 && !TARGET_MIPS16
16529 && !mips_dangerous_for_la25_p (fnaddr))
16530 temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
16531 mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
16532
16533 if (TARGET_USE_PIC_FN_ADDR_REG
16534 && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
16535 mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
16536 emit_jump_insn (gen_indirect_jump (temp1));
16537 }
16538
16539 /* Run just enough of rest_of_compilation. This sequence was
16540 "borrowed" from alpha.c. */
16541 insn = get_insns ();
16542 split_all_insns_noflow ();
16543 mips16_lay_out_constants (true);
16544 shorten_branches (insn);
16545 final_start_function (insn, file, 1);
16546 final (insn, file, 1);
16547 final_end_function ();
16548
16549 /* Clean up the vars set above. Note that final_end_function resets
16550 the global pointer for us. */
16551 reload_completed = 0;
16552 }
16553 \f
16554
16555 /* The last argument passed to mips_set_compression_mode,
16556 or negative if the function hasn't been called yet. */
16557 static unsigned int old_compression_mode = -1;
16558
16559 /* Set up the target-dependent global state for ISA mode COMPRESSION_MODE,
16560 which is either MASK_MIPS16 or MASK_MICROMIPS. */
16561
16562 static void
16563 mips_set_compression_mode (unsigned int compression_mode)
16564 {
16565
16566 if (compression_mode == old_compression_mode)
16567 return;
16568
16569 /* Restore base settings of various flags. */
16570 target_flags = mips_base_target_flags;
16571 flag_schedule_insns = mips_base_schedule_insns;
16572 flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
16573 flag_move_loop_invariants = mips_base_move_loop_invariants;
16574 align_loops = mips_base_align_loops;
16575 align_jumps = mips_base_align_jumps;
16576 align_functions = mips_base_align_functions;
16577 target_flags &= ~(MASK_MIPS16 | MASK_MICROMIPS);
16578 target_flags |= compression_mode;
16579
16580 if (compression_mode & MASK_MIPS16)
16581 {
16582 /* Switch to MIPS16 mode. */
16583 target_flags |= MASK_MIPS16;
16584
16585 /* Turn off SYNCI if it was on, MIPS16 doesn't support it. */
16586 target_flags &= ~MASK_SYNCI;
16587
16588 /* Don't run the scheduler before reload, since it tends to
16589 increase register pressure. */
16590 flag_schedule_insns = 0;
16591
16592 /* Don't do hot/cold partitioning. mips16_lay_out_constants expects
16593 the whole function to be in a single section. */
16594 flag_reorder_blocks_and_partition = 0;
16595
16596 /* Don't move loop invariants, because it tends to increase
16597 register pressure. It also introduces an extra move in cases
16598 where the constant is the first operand in a two-operand binary
16599 instruction, or when it forms a register argument to a functon
16600 call. */
16601 flag_move_loop_invariants = 0;
16602
16603 target_flags |= MASK_EXPLICIT_RELOCS;
16604
16605 /* Experiments suggest we get the best overall section-anchor
16606 results from using the range of an unextended LW or SW. Code
16607 that makes heavy use of byte or short accesses can do better
16608 with ranges of 0...31 and 0...63 respectively, but most code is
16609 sensitive to the range of LW and SW instead. */
16610 targetm.min_anchor_offset = 0;
16611 targetm.max_anchor_offset = 127;
16612
16613 targetm.const_anchor = 0;
16614
16615 /* MIPS16 has no BAL instruction. */
16616 target_flags &= ~MASK_RELAX_PIC_CALLS;
16617
16618 /* The R4000 errata don't apply to any known MIPS16 cores.
16619 It's simpler to make the R4000 fixes and MIPS16 mode
16620 mutually exclusive. */
16621 target_flags &= ~MASK_FIX_R4000;
16622
16623 if (flag_pic && !TARGET_OLDABI)
16624 sorry ("MIPS16 PIC for ABIs other than o32 and o64");
16625
16626 if (TARGET_XGOT)
16627 sorry ("MIPS16 -mxgot code");
16628
16629 if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
16630 sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
16631 }
16632 else
16633 {
16634 /* Switch to microMIPS or the standard encoding. */
16635
16636 if (TARGET_MICROMIPS)
16637 /* Avoid branch likely. */
16638 target_flags &= ~MASK_BRANCHLIKELY;
16639
16640 /* Provide default values for align_* for 64-bit targets. */
16641 if (TARGET_64BIT)
16642 {
16643 if (align_loops == 0)
16644 align_loops = 8;
16645 if (align_jumps == 0)
16646 align_jumps = 8;
16647 if (align_functions == 0)
16648 align_functions = 8;
16649 }
16650
16651 targetm.min_anchor_offset = -32768;
16652 targetm.max_anchor_offset = 32767;
16653
16654 targetm.const_anchor = 0x8000;
16655 }
16656
16657 /* (Re)initialize MIPS target internals for new ISA. */
16658 mips_init_relocs ();
16659
16660 if (compression_mode & MASK_MIPS16)
16661 {
16662 if (!mips16_globals)
16663 mips16_globals = save_target_globals_default_opts ();
16664 else
16665 restore_target_globals (mips16_globals);
16666 }
16667 else
16668 restore_target_globals (&default_target_globals);
16669
16670 old_compression_mode = compression_mode;
16671 }
16672
16673 /* Implement TARGET_SET_CURRENT_FUNCTION. Decide whether the current
16674 function should use the MIPS16 or microMIPS ISA and switch modes
16675 accordingly. */
16676
16677 static void
16678 mips_set_current_function (tree fndecl)
16679 {
16680 mips_set_compression_mode (mips_get_compress_mode (fndecl));
16681 }
16682 \f
16683 /* Allocate a chunk of memory for per-function machine-dependent data. */
16684
16685 static struct machine_function *
16686 mips_init_machine_status (void)
16687 {
16688 return ggc_alloc_cleared_machine_function ();
16689 }
16690
16691 /* Return the processor associated with the given ISA level, or null
16692 if the ISA isn't valid. */
16693
16694 static const struct mips_cpu_info *
16695 mips_cpu_info_from_isa (int isa)
16696 {
16697 unsigned int i;
16698
16699 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
16700 if (mips_cpu_info_table[i].isa == isa)
16701 return mips_cpu_info_table + i;
16702
16703 return NULL;
16704 }
16705
16706 /* Return a mips_cpu_info entry determined by an option valued
16707 OPT. */
16708
16709 static const struct mips_cpu_info *
16710 mips_cpu_info_from_opt (int opt)
16711 {
16712 switch (opt)
16713 {
16714 case MIPS_ARCH_OPTION_FROM_ABI:
16715 /* 'from-abi' selects the most compatible architecture for the
16716 given ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit
16717 ABIs. For the EABIs, we have to decide whether we're using
16718 the 32-bit or 64-bit version. */
16719 return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
16720 : ABI_NEEDS_64BIT_REGS ? 3
16721 : (TARGET_64BIT ? 3 : 1));
16722
16723 case MIPS_ARCH_OPTION_NATIVE:
16724 gcc_unreachable ();
16725
16726 default:
16727 return &mips_cpu_info_table[opt];
16728 }
16729 }
16730
16731 /* Return a default mips_cpu_info entry, given that no -march= option
16732 was explicitly specified. */
16733
16734 static const struct mips_cpu_info *
16735 mips_default_arch (void)
16736 {
16737 #if defined (MIPS_CPU_STRING_DEFAULT)
16738 unsigned int i;
16739 for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
16740 if (strcmp (mips_cpu_info_table[i].name, MIPS_CPU_STRING_DEFAULT) == 0)
16741 return mips_cpu_info_table + i;
16742 gcc_unreachable ();
16743 #elif defined (MIPS_ISA_DEFAULT)
16744 return mips_cpu_info_from_isa (MIPS_ISA_DEFAULT);
16745 #else
16746 /* 'from-abi' makes a good default: you get whatever the ABI
16747 requires. */
16748 return mips_cpu_info_from_opt (MIPS_ARCH_OPTION_FROM_ABI);
16749 #endif
16750 }
16751
16752 /* Set up globals to generate code for the ISA or processor
16753 described by INFO. */
16754
16755 static void
16756 mips_set_architecture (const struct mips_cpu_info *info)
16757 {
16758 if (info != 0)
16759 {
16760 mips_arch_info = info;
16761 mips_arch = info->cpu;
16762 mips_isa = info->isa;
16763 }
16764 }
16765
16766 /* Likewise for tuning. */
16767
16768 static void
16769 mips_set_tune (const struct mips_cpu_info *info)
16770 {
16771 if (info != 0)
16772 {
16773 mips_tune_info = info;
16774 mips_tune = info->cpu;
16775 }
16776 }
16777
16778 /* Implement TARGET_OPTION_OVERRIDE. */
16779
16780 static void
16781 mips_option_override (void)
16782 {
16783 int i, start, regno, mode;
16784
16785 if (global_options_set.x_mips_isa_option)
16786 mips_isa_option_info = &mips_cpu_info_table[mips_isa_option];
16787
16788 #ifdef SUBTARGET_OVERRIDE_OPTIONS
16789 SUBTARGET_OVERRIDE_OPTIONS;
16790 #endif
16791
16792 /* MIPS16 and microMIPS cannot coexist. */
16793 if (TARGET_MICROMIPS && TARGET_MIPS16)
16794 error ("unsupported combination: %s", "-mips16 -mmicromips");
16795
16796 /* Save the base compression state and process flags as though we
16797 were generating uncompressed code. */
16798 mips_base_compression_flags = TARGET_COMPRESSION;
16799 target_flags &= ~TARGET_COMPRESSION;
16800
16801 /* -mno-float overrides -mhard-float and -msoft-float. */
16802 if (TARGET_NO_FLOAT)
16803 {
16804 target_flags |= MASK_SOFT_FLOAT_ABI;
16805 target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
16806 }
16807
16808 if (TARGET_FLIP_MIPS16)
16809 TARGET_INTERLINK_COMPRESSED = 1;
16810
16811 /* Set the small data limit. */
16812 mips_small_data_threshold = (global_options_set.x_g_switch_value
16813 ? g_switch_value
16814 : MIPS_DEFAULT_GVALUE);
16815
16816 /* The following code determines the architecture and register size.
16817 Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
16818 The GAS and GCC code should be kept in sync as much as possible. */
16819
16820 if (global_options_set.x_mips_arch_option)
16821 mips_set_architecture (mips_cpu_info_from_opt (mips_arch_option));
16822
16823 if (mips_isa_option_info != 0)
16824 {
16825 if (mips_arch_info == 0)
16826 mips_set_architecture (mips_isa_option_info);
16827 else if (mips_arch_info->isa != mips_isa_option_info->isa)
16828 error ("%<-%s%> conflicts with the other architecture options, "
16829 "which specify a %s processor",
16830 mips_isa_option_info->name,
16831 mips_cpu_info_from_isa (mips_arch_info->isa)->name);
16832 }
16833
16834 if (mips_arch_info == 0)
16835 mips_set_architecture (mips_default_arch ());
16836
16837 if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
16838 error ("%<-march=%s%> is not compatible with the selected ABI",
16839 mips_arch_info->name);
16840
16841 /* Optimize for mips_arch, unless -mtune selects a different processor. */
16842 if (global_options_set.x_mips_tune_option)
16843 mips_set_tune (mips_cpu_info_from_opt (mips_tune_option));
16844
16845 if (mips_tune_info == 0)
16846 mips_set_tune (mips_arch_info);
16847
16848 if ((target_flags_explicit & MASK_64BIT) != 0)
16849 {
16850 /* The user specified the size of the integer registers. Make sure
16851 it agrees with the ABI and ISA. */
16852 if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
16853 error ("%<-mgp64%> used with a 32-bit processor");
16854 else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
16855 error ("%<-mgp32%> used with a 64-bit ABI");
16856 else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
16857 error ("%<-mgp64%> used with a 32-bit ABI");
16858 }
16859 else
16860 {
16861 /* Infer the integer register size from the ABI and processor.
16862 Restrict ourselves to 32-bit registers if that's all the
16863 processor has, or if the ABI cannot handle 64-bit registers. */
16864 if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
16865 target_flags &= ~MASK_64BIT;
16866 else
16867 target_flags |= MASK_64BIT;
16868 }
16869
16870 if ((target_flags_explicit & MASK_FLOAT64) != 0)
16871 {
16872 if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
16873 error ("unsupported combination: %s", "-mfp64 -msingle-float");
16874 else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
16875 error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
16876 else if (!TARGET_64BIT && TARGET_FLOAT64)
16877 {
16878 if (!ISA_HAS_MXHC1)
16879 error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
16880 " the target supports the mfhc1 and mthc1 instructions");
16881 else if (mips_abi != ABI_32)
16882 error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
16883 " the o32 ABI");
16884 }
16885 }
16886 else
16887 {
16888 /* -msingle-float selects 32-bit float registers. Otherwise the
16889 float registers should be the same size as the integer ones. */
16890 if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
16891 target_flags |= MASK_FLOAT64;
16892 else
16893 target_flags &= ~MASK_FLOAT64;
16894 }
16895
16896 /* End of code shared with GAS. */
16897
16898 /* The R5900 FPU only supports single precision. */
16899 if (TARGET_MIPS5900 && TARGET_HARD_FLOAT_ABI && TARGET_DOUBLE_FLOAT)
16900 error ("unsupported combination: %s",
16901 "-march=r5900 -mhard-float -mdouble-float");
16902
16903 /* If a -mlong* option was given, check that it matches the ABI,
16904 otherwise infer the -mlong* setting from the other options. */
16905 if ((target_flags_explicit & MASK_LONG64) != 0)
16906 {
16907 if (TARGET_LONG64)
16908 {
16909 if (mips_abi == ABI_N32)
16910 error ("%qs is incompatible with %qs", "-mabi=n32", "-mlong64");
16911 else if (mips_abi == ABI_32)
16912 error ("%qs is incompatible with %qs", "-mabi=32", "-mlong64");
16913 else if (mips_abi == ABI_O64 && TARGET_ABICALLS)
16914 /* We have traditionally allowed non-abicalls code to use
16915 an LP64 form of o64. However, it would take a bit more
16916 effort to support the combination of 32-bit GOT entries
16917 and 64-bit pointers, so we treat the abicalls case as
16918 an error. */
16919 error ("the combination of %qs and %qs is incompatible with %qs",
16920 "-mabi=o64", "-mabicalls", "-mlong64");
16921 }
16922 else
16923 {
16924 if (mips_abi == ABI_64)
16925 error ("%qs is incompatible with %qs", "-mabi=64", "-mlong32");
16926 }
16927 }
16928 else
16929 {
16930 if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
16931 target_flags |= MASK_LONG64;
16932 else
16933 target_flags &= ~MASK_LONG64;
16934 }
16935
16936 if (!TARGET_OLDABI)
16937 flag_pcc_struct_return = 0;
16938
16939 /* Decide which rtx_costs structure to use. */
16940 if (optimize_size)
16941 mips_cost = &mips_rtx_cost_optimize_size;
16942 else
16943 mips_cost = &mips_rtx_cost_data[mips_tune];
16944
16945 /* If the user hasn't specified a branch cost, use the processor's
16946 default. */
16947 if (mips_branch_cost == 0)
16948 mips_branch_cost = mips_cost->branch_cost;
16949
16950 /* If neither -mbranch-likely nor -mno-branch-likely was given
16951 on the command line, set MASK_BRANCHLIKELY based on the target
16952 architecture and tuning flags. Annulled delay slots are a
16953 size win, so we only consider the processor-specific tuning
16954 for !optimize_size. */
16955 if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
16956 {
16957 if (ISA_HAS_BRANCHLIKELY
16958 && (optimize_size
16959 || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
16960 target_flags |= MASK_BRANCHLIKELY;
16961 else
16962 target_flags &= ~MASK_BRANCHLIKELY;
16963 }
16964 else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
16965 warning (0, "the %qs architecture does not support branch-likely"
16966 " instructions", mips_arch_info->name);
16967
16968 /* If the user hasn't specified -mimadd or -mno-imadd set
16969 MASK_IMADD based on the target architecture and tuning
16970 flags. */
16971 if ((target_flags_explicit & MASK_IMADD) == 0)
16972 {
16973 if (ISA_HAS_MADD_MSUB &&
16974 (mips_tune_info->tune_flags & PTF_AVOID_IMADD) == 0)
16975 target_flags |= MASK_IMADD;
16976 else
16977 target_flags &= ~MASK_IMADD;
16978 }
16979 else if (TARGET_IMADD && !ISA_HAS_MADD_MSUB)
16980 warning (0, "the %qs architecture does not support madd or msub"
16981 " instructions", mips_arch_info->name);
16982
16983 /* The effect of -mabicalls isn't defined for the EABI. */
16984 if (mips_abi == ABI_EABI && TARGET_ABICALLS)
16985 {
16986 error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
16987 target_flags &= ~MASK_ABICALLS;
16988 }
16989
16990 /* PIC requires -mabicalls. */
16991 if (flag_pic)
16992 {
16993 if (mips_abi == ABI_EABI)
16994 error ("cannot generate position-independent code for %qs",
16995 "-mabi=eabi");
16996 else if (!TARGET_ABICALLS)
16997 error ("position-independent code requires %qs", "-mabicalls");
16998 }
16999
17000 if (TARGET_ABICALLS_PIC2)
17001 /* We need to set flag_pic for executables as well as DSOs
17002 because we may reference symbols that are not defined in
17003 the final executable. (MIPS does not use things like
17004 copy relocs, for example.)
17005
17006 There is a body of code that uses __PIC__ to distinguish
17007 between -mabicalls and -mno-abicalls code. The non-__PIC__
17008 variant is usually appropriate for TARGET_ABICALLS_PIC0, as
17009 long as any indirect jumps use $25. */
17010 flag_pic = 1;
17011
17012 /* -mvr4130-align is a "speed over size" optimization: it usually produces
17013 faster code, but at the expense of more nops. Enable it at -O3 and
17014 above. */
17015 if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
17016 target_flags |= MASK_VR4130_ALIGN;
17017
17018 /* Prefer a call to memcpy over inline code when optimizing for size,
17019 though see MOVE_RATIO in mips.h. */
17020 if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
17021 target_flags |= MASK_MEMCPY;
17022
17023 /* If we have a nonzero small-data limit, check that the -mgpopt
17024 setting is consistent with the other target flags. */
17025 if (mips_small_data_threshold > 0)
17026 {
17027 if (!TARGET_GPOPT)
17028 {
17029 if (!TARGET_EXPLICIT_RELOCS)
17030 error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
17031
17032 TARGET_LOCAL_SDATA = false;
17033 TARGET_EXTERN_SDATA = false;
17034 }
17035 else
17036 {
17037 if (TARGET_VXWORKS_RTP)
17038 warning (0, "cannot use small-data accesses for %qs", "-mrtp");
17039
17040 if (TARGET_ABICALLS)
17041 warning (0, "cannot use small-data accesses for %qs",
17042 "-mabicalls");
17043 }
17044 }
17045
17046 /* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
17047 for all its floating point. */
17048 if (mips_nan != MIPS_IEEE_754_2008)
17049 {
17050 REAL_MODE_FORMAT (SFmode) = &mips_single_format;
17051 REAL_MODE_FORMAT (DFmode) = &mips_double_format;
17052 REAL_MODE_FORMAT (TFmode) = &mips_quad_format;
17053 }
17054
17055 /* Make sure that the user didn't turn off paired single support when
17056 MIPS-3D support is requested. */
17057 if (TARGET_MIPS3D
17058 && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
17059 && !TARGET_PAIRED_SINGLE_FLOAT)
17060 error ("%<-mips3d%> requires %<-mpaired-single%>");
17061
17062 /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT. */
17063 if (TARGET_MIPS3D)
17064 target_flags |= MASK_PAIRED_SINGLE_FLOAT;
17065
17066 /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
17067 and TARGET_HARD_FLOAT_ABI are both true. */
17068 if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
17069 error ("%qs must be used with %qs",
17070 TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
17071 TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
17072
17073 /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
17074 enabled. */
17075 if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
17076 warning (0, "the %qs architecture does not support paired-single"
17077 " instructions", mips_arch_info->name);
17078
17079 if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
17080 && !TARGET_CACHE_BUILTIN)
17081 {
17082 error ("%qs requires a target that provides the %qs instruction",
17083 "-mr10k-cache-barrier", "cache");
17084 mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
17085 }
17086
17087 /* If TARGET_DSPR2, enable MASK_DSP. */
17088 if (TARGET_DSPR2)
17089 target_flags |= MASK_DSP;
17090
17091 /* .eh_frame addresses should be the same width as a C pointer.
17092 Most MIPS ABIs support only one pointer size, so the assembler
17093 will usually know exactly how big an .eh_frame address is.
17094
17095 Unfortunately, this is not true of the 64-bit EABI. The ABI was
17096 originally defined to use 64-bit pointers (i.e. it is LP64), and
17097 this is still the default mode. However, we also support an n32-like
17098 ILP32 mode, which is selected by -mlong32. The problem is that the
17099 assembler has traditionally not had an -mlong option, so it has
17100 traditionally not known whether we're using the ILP32 or LP64 form.
17101
17102 As it happens, gas versions up to and including 2.19 use _32-bit_
17103 addresses for EABI64 .cfi_* directives. This is wrong for the
17104 default LP64 mode, so we can't use the directives by default.
17105 Moreover, since gas's current behavior is at odds with gcc's
17106 default behavior, it seems unwise to rely on future versions
17107 of gas behaving the same way. We therefore avoid using .cfi
17108 directives for -mlong32 as well. */
17109 if (mips_abi == ABI_EABI && TARGET_64BIT)
17110 flag_dwarf2_cfi_asm = 0;
17111
17112 /* .cfi_* directives generate a read-only section, so fall back on
17113 manual .eh_frame creation if we need the section to be writable. */
17114 if (TARGET_WRITABLE_EH_FRAME)
17115 flag_dwarf2_cfi_asm = 0;
17116
17117 mips_init_print_operand_punct ();
17118
17119 /* Set up array to map GCC register number to debug register number.
17120 Ignore the special purpose register numbers. */
17121
17122 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17123 {
17124 mips_dbx_regno[i] = IGNORED_DWARF_REGNUM;
17125 if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
17126 mips_dwarf_regno[i] = i;
17127 else
17128 mips_dwarf_regno[i] = INVALID_REGNUM;
17129 }
17130
17131 start = GP_DBX_FIRST - GP_REG_FIRST;
17132 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
17133 mips_dbx_regno[i] = i + start;
17134
17135 start = FP_DBX_FIRST - FP_REG_FIRST;
17136 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
17137 mips_dbx_regno[i] = i + start;
17138
17139 /* Accumulator debug registers use big-endian ordering. */
17140 mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
17141 mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
17142 mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
17143 mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
17144 for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
17145 {
17146 mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
17147 mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
17148 }
17149
17150 /* Set up mips_hard_regno_mode_ok. */
17151 for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
17152 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
17153 mips_hard_regno_mode_ok[mode][regno]
17154 = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
17155
17156 /* Function to allocate machine-dependent function status. */
17157 init_machine_status = &mips_init_machine_status;
17158
17159 /* Default to working around R4000 errata only if the processor
17160 was selected explicitly. */
17161 if ((target_flags_explicit & MASK_FIX_R4000) == 0
17162 && strcmp (mips_arch_info->name, "r4000") == 0)
17163 target_flags |= MASK_FIX_R4000;
17164
17165 /* Default to working around R4400 errata only if the processor
17166 was selected explicitly. */
17167 if ((target_flags_explicit & MASK_FIX_R4400) == 0
17168 && strcmp (mips_arch_info->name, "r4400") == 0)
17169 target_flags |= MASK_FIX_R4400;
17170
17171 /* Default to working around R10000 errata only if the processor
17172 was selected explicitly. */
17173 if ((target_flags_explicit & MASK_FIX_R10000) == 0
17174 && strcmp (mips_arch_info->name, "r10000") == 0)
17175 target_flags |= MASK_FIX_R10000;
17176
17177 /* Make sure that branch-likely instructions available when using
17178 -mfix-r10000. The instructions are not available if either:
17179
17180 1. -mno-branch-likely was passed.
17181 2. The selected ISA does not support branch-likely and
17182 the command line does not include -mbranch-likely. */
17183 if (TARGET_FIX_R10000
17184 && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
17185 ? !ISA_HAS_BRANCHLIKELY
17186 : !TARGET_BRANCHLIKELY))
17187 sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
17188
17189 if (TARGET_SYNCI && !ISA_HAS_SYNCI)
17190 {
17191 warning (0, "the %qs architecture does not support the synci "
17192 "instruction", mips_arch_info->name);
17193 target_flags &= ~MASK_SYNCI;
17194 }
17195
17196 /* Only optimize PIC indirect calls if they are actually required. */
17197 if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
17198 target_flags &= ~MASK_RELAX_PIC_CALLS;
17199
17200 /* Save base state of options. */
17201 mips_base_target_flags = target_flags;
17202 mips_base_schedule_insns = flag_schedule_insns;
17203 mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
17204 mips_base_move_loop_invariants = flag_move_loop_invariants;
17205 mips_base_align_loops = align_loops;
17206 mips_base_align_jumps = align_jumps;
17207 mips_base_align_functions = align_functions;
17208
17209 /* Now select the ISA mode.
17210
17211 Do all CPP-sensitive stuff in uncompressed mode; we'll switch modes
17212 later if required. */
17213 mips_set_compression_mode (0);
17214
17215 /* We register a second machine specific reorg pass after delay slot
17216 filling. Registering the pass must be done at start up. It's
17217 convenient to do it here. */
17218 opt_pass *new_pass = make_pass_mips_machine_reorg2 (g);
17219 struct register_pass_info insert_pass_mips_machine_reorg2 =
17220 {
17221 new_pass, /* pass */
17222 "dbr", /* reference_pass_name */
17223 1, /* ref_pass_instance_number */
17224 PASS_POS_INSERT_AFTER /* po_op */
17225 };
17226 register_pass (&insert_pass_mips_machine_reorg2);
17227
17228 if (TARGET_HARD_FLOAT_ABI && TARGET_MIPS5900)
17229 REAL_MODE_FORMAT (SFmode) = &spu_single_format;
17230 }
17231
17232 /* Swap the register information for registers I and I + 1, which
17233 currently have the wrong endianness. Note that the registers'
17234 fixedness and call-clobberedness might have been set on the
17235 command line. */
17236
17237 static void
17238 mips_swap_registers (unsigned int i)
17239 {
17240 int tmpi;
17241 const char *tmps;
17242
17243 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
17244 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
17245
17246 SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
17247 SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
17248 SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
17249 SWAP_STRING (reg_names[i], reg_names[i + 1]);
17250
17251 #undef SWAP_STRING
17252 #undef SWAP_INT
17253 }
17254
17255 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
17256
17257 static void
17258 mips_conditional_register_usage (void)
17259 {
17260
17261 if (ISA_HAS_DSP)
17262 {
17263 /* These DSP control register fields are global. */
17264 global_regs[CCDSP_PO_REGNUM] = 1;
17265 global_regs[CCDSP_SC_REGNUM] = 1;
17266 }
17267 else
17268 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17269 reg_class_contents[(int) DSP_ACC_REGS]);
17270
17271 if (!TARGET_HARD_FLOAT)
17272 {
17273 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17274 reg_class_contents[(int) FP_REGS]);
17275 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17276 reg_class_contents[(int) ST_REGS]);
17277 }
17278 else if (!ISA_HAS_8CC)
17279 {
17280 /* We only have a single condition-code register. We implement
17281 this by fixing all the condition-code registers and generating
17282 RTL that refers directly to ST_REG_FIRST. */
17283 AND_COMPL_HARD_REG_SET (accessible_reg_set,
17284 reg_class_contents[(int) ST_REGS]);
17285 SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
17286 fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
17287 }
17288 if (TARGET_MIPS16)
17289 {
17290 /* In MIPS16 mode, we prohibit the unused $s registers, since they
17291 are call-saved, and saving them via a MIPS16 register would
17292 probably waste more time than just reloading the value.
17293
17294 We permit the $t temporary registers when optimizing for speed
17295 but not when optimizing for space because using them results in
17296 code that is larger (but faster) then not using them. We do
17297 allow $24 (t8) because it is used in CMP and CMPI instructions
17298 and $25 (t9) because it is used as the function call address in
17299 SVR4 PIC code. */
17300
17301 fixed_regs[18] = call_used_regs[18] = 1;
17302 fixed_regs[19] = call_used_regs[19] = 1;
17303 fixed_regs[20] = call_used_regs[20] = 1;
17304 fixed_regs[21] = call_used_regs[21] = 1;
17305 fixed_regs[22] = call_used_regs[22] = 1;
17306 fixed_regs[23] = call_used_regs[23] = 1;
17307 fixed_regs[26] = call_used_regs[26] = 1;
17308 fixed_regs[27] = call_used_regs[27] = 1;
17309 fixed_regs[30] = call_used_regs[30] = 1;
17310 if (optimize_size)
17311 {
17312 fixed_regs[8] = call_used_regs[8] = 1;
17313 fixed_regs[9] = call_used_regs[9] = 1;
17314 fixed_regs[10] = call_used_regs[10] = 1;
17315 fixed_regs[11] = call_used_regs[11] = 1;
17316 fixed_regs[12] = call_used_regs[12] = 1;
17317 fixed_regs[13] = call_used_regs[13] = 1;
17318 fixed_regs[14] = call_used_regs[14] = 1;
17319 fixed_regs[15] = call_used_regs[15] = 1;
17320 }
17321
17322 /* Do not allow HI and LO to be treated as register operands.
17323 There are no MTHI or MTLO instructions (or any real need
17324 for them) and one-way registers cannot easily be reloaded. */
17325 AND_COMPL_HARD_REG_SET (operand_reg_set,
17326 reg_class_contents[(int) MD_REGS]);
17327 }
17328 /* $f20-$f23 are call-clobbered for n64. */
17329 if (mips_abi == ABI_64)
17330 {
17331 int regno;
17332 for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
17333 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17334 }
17335 /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
17336 for n32. */
17337 if (mips_abi == ABI_N32)
17338 {
17339 int regno;
17340 for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
17341 call_really_used_regs[regno] = call_used_regs[regno] = 1;
17342 }
17343 /* Make sure that double-register accumulator values are correctly
17344 ordered for the current endianness. */
17345 if (TARGET_LITTLE_ENDIAN)
17346 {
17347 unsigned int regno;
17348
17349 mips_swap_registers (MD_REG_FIRST);
17350 for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
17351 mips_swap_registers (regno);
17352 }
17353 }
17354
17355 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
17356 other registers for instructions for which it is possible. This
17357 encourages the compiler to use CMP in cases where an XOR would
17358 require some register shuffling. */
17359
17360 void
17361 mips_order_regs_for_local_alloc (void)
17362 {
17363 int i;
17364
17365 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17366 reg_alloc_order[i] = i;
17367
17368 if (TARGET_MIPS16)
17369 {
17370 /* It really doesn't matter where we put register 0, since it is
17371 a fixed register anyhow. */
17372 reg_alloc_order[0] = 24;
17373 reg_alloc_order[24] = 0;
17374 }
17375 }
17376
17377 /* Implement EH_USES. */
17378
17379 bool
17380 mips_eh_uses (unsigned int regno)
17381 {
17382 if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
17383 {
17384 /* We need to force certain registers to be live in order to handle
17385 PIC long branches correctly. See mips_must_initialize_gp_p for
17386 details. */
17387 if (mips_cfun_has_cprestore_slot_p ())
17388 {
17389 if (regno == CPRESTORE_SLOT_REGNUM)
17390 return true;
17391 }
17392 else
17393 {
17394 if (cfun->machine->global_pointer == regno)
17395 return true;
17396 }
17397 }
17398
17399 return false;
17400 }
17401
17402 /* Implement EPILOGUE_USES. */
17403
17404 bool
17405 mips_epilogue_uses (unsigned int regno)
17406 {
17407 /* Say that the epilogue uses the return address register. Note that
17408 in the case of sibcalls, the values "used by the epilogue" are
17409 considered live at the start of the called function. */
17410 if (regno == RETURN_ADDR_REGNUM)
17411 return true;
17412
17413 /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
17414 See the comment above load_call<mode> for details. */
17415 if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
17416 return true;
17417
17418 /* An interrupt handler must preserve some registers that are
17419 ordinarily call-clobbered. */
17420 if (cfun->machine->interrupt_handler_p
17421 && mips_interrupt_extra_call_saved_reg_p (regno))
17422 return true;
17423
17424 return false;
17425 }
17426
17427 /* A for_each_rtx callback. Stop the search if *X is an AT register. */
17428
17429 static int
17430 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
17431 {
17432 return REG_P (*x) && REGNO (*x) == AT_REGNUM;
17433 }
17434
17435 /* Return true if INSN needs to be wrapped in ".set noat".
17436 INSN has NOPERANDS operands, stored in OPVEC. */
17437
17438 static bool
17439 mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
17440 {
17441 int i;
17442
17443 if (recog_memoized (insn) >= 0)
17444 for (i = 0; i < noperands; i++)
17445 if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
17446 return true;
17447 return false;
17448 }
17449
17450 /* Implement FINAL_PRESCAN_INSN. */
17451
17452 void
17453 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
17454 {
17455 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17456 mips_push_asm_switch (&mips_noat);
17457 }
17458
17459 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN. */
17460
17461 static void
17462 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
17463 rtx *opvec, int noperands)
17464 {
17465 if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17466 mips_pop_asm_switch (&mips_noat);
17467 }
17468
17469 /* Return the function that is used to expand the <u>mulsidi3 pattern.
17470 EXT_CODE is the code of the extension used. Return NULL if widening
17471 multiplication shouldn't be used. */
17472
17473 mulsidi3_gen_fn
17474 mips_mulsidi3_gen_fn (enum rtx_code ext_code)
17475 {
17476 bool signed_p;
17477
17478 signed_p = ext_code == SIGN_EXTEND;
17479 if (TARGET_64BIT)
17480 {
17481 /* Don't use widening multiplication with MULT when we have DMUL. Even
17482 with the extension of its input operands DMUL is faster. Note that
17483 the extension is not needed for signed multiplication. In order to
17484 ensure that we always remove the redundant sign-extension in this
17485 case we still expand mulsidi3 for DMUL. */
17486 if (ISA_HAS_DMUL3)
17487 return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
17488 if (TARGET_MIPS16)
17489 return (signed_p
17490 ? gen_mulsidi3_64bit_mips16
17491 : gen_umulsidi3_64bit_mips16);
17492 if (TARGET_FIX_R4000)
17493 return NULL;
17494 return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
17495 }
17496 else
17497 {
17498 if (TARGET_MIPS16)
17499 return (signed_p
17500 ? gen_mulsidi3_32bit_mips16
17501 : gen_umulsidi3_32bit_mips16);
17502 if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
17503 return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
17504 return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
17505 }
17506 }
17507
17508 /* Return true if PATTERN matches the kind of instruction generated by
17509 umips_build_save_restore. SAVE_P is true for store. */
17510
17511 bool
17512 umips_save_restore_pattern_p (bool save_p, rtx pattern)
17513 {
17514 int n;
17515 unsigned int i;
17516 HOST_WIDE_INT first_offset = 0;
17517 rtx first_base = 0;
17518 unsigned int regmask = 0;
17519
17520 for (n = 0; n < XVECLEN (pattern, 0); n++)
17521 {
17522 rtx set, reg, mem, this_base;
17523 HOST_WIDE_INT this_offset;
17524
17525 /* Check that we have a SET. */
17526 set = XVECEXP (pattern, 0, n);
17527 if (GET_CODE (set) != SET)
17528 return false;
17529
17530 /* Check that the SET is a load (if restoring) or a store
17531 (if saving). */
17532 mem = save_p ? SET_DEST (set) : SET_SRC (set);
17533 if (!MEM_P (mem) || MEM_VOLATILE_P (mem))
17534 return false;
17535
17536 /* Check that the address is the sum of base and a possibly-zero
17537 constant offset. Determine if the offset is in range. */
17538 mips_split_plus (XEXP (mem, 0), &this_base, &this_offset);
17539 if (!REG_P (this_base))
17540 return false;
17541
17542 if (n == 0)
17543 {
17544 if (!UMIPS_12BIT_OFFSET_P (this_offset))
17545 return false;
17546 first_base = this_base;
17547 first_offset = this_offset;
17548 }
17549 else
17550 {
17551 /* Check that the save slots are consecutive. */
17552 if (REGNO (this_base) != REGNO (first_base)
17553 || this_offset != first_offset + UNITS_PER_WORD * n)
17554 return false;
17555 }
17556
17557 /* Check that SET's other operand is a register. */
17558 reg = save_p ? SET_SRC (set) : SET_DEST (set);
17559 if (!REG_P (reg))
17560 return false;
17561
17562 regmask |= 1 << REGNO (reg);
17563 }
17564
17565 for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
17566 if (regmask == umips_swm_mask[i])
17567 return true;
17568
17569 return false;
17570 }
17571
17572 /* Return the assembly instruction for microMIPS LWM or SWM.
17573 SAVE_P and PATTERN are as for umips_save_restore_pattern_p. */
17574
17575 const char *
17576 umips_output_save_restore (bool save_p, rtx pattern)
17577 {
17578 static char buffer[300];
17579 char *s;
17580 int n;
17581 HOST_WIDE_INT offset;
17582 rtx base, mem, set, last_set, last_reg;
17583
17584 /* Parse the pattern. */
17585 gcc_assert (umips_save_restore_pattern_p (save_p, pattern));
17586
17587 s = strcpy (buffer, save_p ? "swm\t" : "lwm\t");
17588 s += strlen (s);
17589 n = XVECLEN (pattern, 0);
17590
17591 set = XVECEXP (pattern, 0, 0);
17592 mem = save_p ? SET_DEST (set) : SET_SRC (set);
17593 mips_split_plus (XEXP (mem, 0), &base, &offset);
17594
17595 last_set = XVECEXP (pattern, 0, n - 1);
17596 last_reg = save_p ? SET_SRC (last_set) : SET_DEST (last_set);
17597
17598 if (REGNO (last_reg) == 31)
17599 n--;
17600
17601 gcc_assert (n <= 9);
17602 if (n == 0)
17603 ;
17604 else if (n == 1)
17605 s += sprintf (s, "%s,", reg_names[16]);
17606 else if (n < 9)
17607 s += sprintf (s, "%s-%s,", reg_names[16], reg_names[15 + n]);
17608 else if (n == 9)
17609 s += sprintf (s, "%s-%s,%s,", reg_names[16], reg_names[23],
17610 reg_names[30]);
17611
17612 if (REGNO (last_reg) == 31)
17613 s += sprintf (s, "%s,", reg_names[31]);
17614
17615 s += sprintf (s, "%d(%s)", (int)offset, reg_names[REGNO (base)]);
17616 return buffer;
17617 }
17618
17619 /* Return true if MEM1 and MEM2 use the same base register, and the
17620 offset of MEM2 equals the offset of MEM1 plus 4. FIRST_REG is the
17621 register into (from) which the contents of MEM1 will be loaded
17622 (stored), depending on the value of LOAD_P.
17623 SWAP_P is true when the 1st and 2nd instructions are swapped. */
17624
17625 static bool
17626 umips_load_store_pair_p_1 (bool load_p, bool swap_p,
17627 rtx first_reg, rtx mem1, rtx mem2)
17628 {
17629 rtx base1, base2;
17630 HOST_WIDE_INT offset1, offset2;
17631
17632 if (!MEM_P (mem1) || !MEM_P (mem2))
17633 return false;
17634
17635 mips_split_plus (XEXP (mem1, 0), &base1, &offset1);
17636 mips_split_plus (XEXP (mem2, 0), &base2, &offset2);
17637
17638 if (!REG_P (base1) || !rtx_equal_p (base1, base2))
17639 return false;
17640
17641 /* Avoid invalid load pair instructions. */
17642 if (load_p && REGNO (first_reg) == REGNO (base1))
17643 return false;
17644
17645 /* We must avoid this case for anti-dependence.
17646 Ex: lw $3, 4($3)
17647 lw $2, 0($3)
17648 first_reg is $2, but the base is $3. */
17649 if (load_p
17650 && swap_p
17651 && REGNO (first_reg) + 1 == REGNO (base1))
17652 return false;
17653
17654 if (offset2 != offset1 + 4)
17655 return false;
17656
17657 if (!UMIPS_12BIT_OFFSET_P (offset1))
17658 return false;
17659
17660 return true;
17661 }
17662
17663 /* OPERANDS describes the operands to a pair of SETs, in the order
17664 dest1, src1, dest2, src2. Return true if the operands can be used
17665 in an LWP or SWP instruction; LOAD_P says which. */
17666
17667 bool
17668 umips_load_store_pair_p (bool load_p, rtx *operands)
17669 {
17670 rtx reg1, reg2, mem1, mem2;
17671
17672 if (load_p)
17673 {
17674 reg1 = operands[0];
17675 reg2 = operands[2];
17676 mem1 = operands[1];
17677 mem2 = operands[3];
17678 }
17679 else
17680 {
17681 reg1 = operands[1];
17682 reg2 = operands[3];
17683 mem1 = operands[0];
17684 mem2 = operands[2];
17685 }
17686
17687 if (REGNO (reg2) == REGNO (reg1) + 1)
17688 return umips_load_store_pair_p_1 (load_p, false, reg1, mem1, mem2);
17689
17690 if (REGNO (reg1) == REGNO (reg2) + 1)
17691 return umips_load_store_pair_p_1 (load_p, true, reg2, mem2, mem1);
17692
17693 return false;
17694 }
17695
17696 /* Return the assembly instruction for a microMIPS LWP or SWP in which
17697 the first register is REG and the first memory slot is MEM.
17698 LOAD_P is true for LWP. */
17699
17700 static void
17701 umips_output_load_store_pair_1 (bool load_p, rtx reg, rtx mem)
17702 {
17703 rtx ops[] = {reg, mem};
17704
17705 if (load_p)
17706 output_asm_insn ("lwp\t%0,%1", ops);
17707 else
17708 output_asm_insn ("swp\t%0,%1", ops);
17709 }
17710
17711 /* Output the assembly instruction for a microMIPS LWP or SWP instruction.
17712 LOAD_P and OPERANDS are as for umips_load_store_pair_p. */
17713
17714 void
17715 umips_output_load_store_pair (bool load_p, rtx *operands)
17716 {
17717 rtx reg1, reg2, mem1, mem2;
17718 if (load_p)
17719 {
17720 reg1 = operands[0];
17721 reg2 = operands[2];
17722 mem1 = operands[1];
17723 mem2 = operands[3];
17724 }
17725 else
17726 {
17727 reg1 = operands[1];
17728 reg2 = operands[3];
17729 mem1 = operands[0];
17730 mem2 = operands[2];
17731 }
17732
17733 if (REGNO (reg2) == REGNO (reg1) + 1)
17734 {
17735 umips_output_load_store_pair_1 (load_p, reg1, mem1);
17736 return;
17737 }
17738
17739 gcc_assert (REGNO (reg1) == REGNO (reg2) + 1);
17740 umips_output_load_store_pair_1 (load_p, reg2, mem2);
17741 }
17742
17743 /* Return true if REG1 and REG2 match the criteria for a movep insn. */
17744
17745 bool
17746 umips_movep_target_p (rtx reg1, rtx reg2)
17747 {
17748 int regno1, regno2, pair;
17749 unsigned int i;
17750 static const int match[8] = {
17751 0x00000060, /* 5, 6 */
17752 0x000000a0, /* 5, 7 */
17753 0x000000c0, /* 6, 7 */
17754 0x00200010, /* 4, 21 */
17755 0x00400010, /* 4, 22 */
17756 0x00000030, /* 4, 5 */
17757 0x00000050, /* 4, 6 */
17758 0x00000090 /* 4, 7 */
17759 };
17760
17761 if (!REG_P (reg1) || !REG_P (reg2))
17762 return false;
17763
17764 regno1 = REGNO (reg1);
17765 regno2 = REGNO (reg2);
17766
17767 if (!GP_REG_P (regno1) || !GP_REG_P (regno2))
17768 return false;
17769
17770 pair = (1 << regno1) | (1 << regno2);
17771
17772 for (i = 0; i < ARRAY_SIZE (match); i++)
17773 if (pair == match[i])
17774 return true;
17775
17776 return false;
17777 }
17778 \f
17779 /* Return the size in bytes of the trampoline code, padded to
17780 TRAMPOLINE_ALIGNMENT bits. The static chain pointer and target
17781 function address immediately follow. */
17782
17783 int
17784 mips_trampoline_code_size (void)
17785 {
17786 if (TARGET_USE_PIC_FN_ADDR_REG)
17787 return 4 * 4;
17788 else if (ptr_mode == DImode)
17789 return 8 * 4;
17790 else if (ISA_HAS_LOAD_DELAY)
17791 return 6 * 4;
17792 else
17793 return 4 * 4;
17794 }
17795
17796 /* Implement TARGET_TRAMPOLINE_INIT. */
17797
17798 static void
17799 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
17800 {
17801 rtx addr, end_addr, high, low, opcode, mem;
17802 rtx trampoline[8];
17803 unsigned int i, j;
17804 HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
17805
17806 /* Work out the offsets of the pointers from the start of the
17807 trampoline code. */
17808 end_addr_offset = mips_trampoline_code_size ();
17809 static_chain_offset = end_addr_offset;
17810 target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
17811
17812 /* Get pointers to the beginning and end of the code block. */
17813 addr = force_reg (Pmode, XEXP (m_tramp, 0));
17814 end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
17815
17816 #define OP(X) gen_int_mode (X, SImode)
17817
17818 /* Build up the code in TRAMPOLINE. */
17819 i = 0;
17820 if (TARGET_USE_PIC_FN_ADDR_REG)
17821 {
17822 /* $25 contains the address of the trampoline. Emit code of the form:
17823
17824 l[wd] $1, target_function_offset($25)
17825 l[wd] $static_chain, static_chain_offset($25)
17826 jr $1
17827 move $25,$1. */
17828 trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
17829 target_function_offset,
17830 PIC_FUNCTION_ADDR_REGNUM));
17831 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
17832 static_chain_offset,
17833 PIC_FUNCTION_ADDR_REGNUM));
17834 trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
17835 trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
17836 }
17837 else if (ptr_mode == DImode)
17838 {
17839 /* It's too cumbersome to create the full 64-bit address, so let's
17840 instead use:
17841
17842 move $1, $31
17843 bal 1f
17844 nop
17845 1: l[wd] $25, target_function_offset - 12($31)
17846 l[wd] $static_chain, static_chain_offset - 12($31)
17847 jr $25
17848 move $31, $1
17849
17850 where 12 is the offset of "1:" from the start of the code block. */
17851 trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
17852 trampoline[i++] = OP (MIPS_BAL (1));
17853 trampoline[i++] = OP (MIPS_NOP);
17854 trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
17855 target_function_offset - 12,
17856 RETURN_ADDR_REGNUM));
17857 trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
17858 static_chain_offset - 12,
17859 RETURN_ADDR_REGNUM));
17860 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
17861 trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
17862 }
17863 else
17864 {
17865 /* If the target has load delays, emit:
17866
17867 lui $1, %hi(end_addr)
17868 lw $25, %lo(end_addr + ...)($1)
17869 lw $static_chain, %lo(end_addr + ...)($1)
17870 jr $25
17871 nop
17872
17873 Otherwise emit:
17874
17875 lui $1, %hi(end_addr)
17876 lw $25, %lo(end_addr + ...)($1)
17877 jr $25
17878 lw $static_chain, %lo(end_addr + ...)($1). */
17879
17880 /* Split END_ADDR into %hi and %lo values. Trampolines are aligned
17881 to 64 bits, so the %lo value will have the bottom 3 bits clear. */
17882 high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
17883 NULL, false, OPTAB_WIDEN);
17884 high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
17885 NULL, false, OPTAB_WIDEN);
17886 low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
17887
17888 /* Emit the LUI. */
17889 opcode = OP (MIPS_LUI (AT_REGNUM, 0));
17890 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
17891 NULL, false, OPTAB_WIDEN);
17892
17893 /* Emit the load of the target function. */
17894 opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
17895 target_function_offset - end_addr_offset,
17896 AT_REGNUM));
17897 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
17898 NULL, false, OPTAB_WIDEN);
17899
17900 /* Emit the JR here, if we can. */
17901 if (!ISA_HAS_LOAD_DELAY)
17902 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
17903
17904 /* Emit the load of the static chain register. */
17905 opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
17906 static_chain_offset - end_addr_offset,
17907 AT_REGNUM));
17908 trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
17909 NULL, false, OPTAB_WIDEN);
17910
17911 /* Emit the JR, if we couldn't above. */
17912 if (ISA_HAS_LOAD_DELAY)
17913 {
17914 trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
17915 trampoline[i++] = OP (MIPS_NOP);
17916 }
17917 }
17918
17919 #undef OP
17920
17921 /* Copy the trampoline code. Leave any padding uninitialized. */
17922 for (j = 0; j < i; j++)
17923 {
17924 mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
17925 mips_emit_move (mem, trampoline[j]);
17926 }
17927
17928 /* Set up the static chain pointer field. */
17929 mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
17930 mips_emit_move (mem, chain_value);
17931
17932 /* Set up the target function field. */
17933 mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
17934 mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
17935
17936 /* Flush the code part of the trampoline. */
17937 emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
17938 emit_insn (gen_clear_cache (addr, end_addr));
17939 }
17940
17941 /* Implement FUNCTION_PROFILER. */
17942
17943 void mips_function_profiler (FILE *file)
17944 {
17945 if (TARGET_MIPS16)
17946 sorry ("mips16 function profiling");
17947 if (TARGET_LONG_CALLS)
17948 {
17949 /* For TARGET_LONG_CALLS use $3 for the address of _mcount. */
17950 if (Pmode == DImode)
17951 fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
17952 else
17953 fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
17954 }
17955 mips_push_asm_switch (&mips_noat);
17956 fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
17957 reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
17958 /* _mcount treats $2 as the static chain register. */
17959 if (cfun->static_chain_decl != NULL)
17960 fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
17961 reg_names[STATIC_CHAIN_REGNUM]);
17962 if (TARGET_MCOUNT_RA_ADDRESS)
17963 {
17964 /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
17965 ra save location. */
17966 if (cfun->machine->frame.ra_fp_offset == 0)
17967 /* ra not saved, pass zero. */
17968 fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
17969 else
17970 fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
17971 Pmode == DImode ? "dla" : "la", reg_names[12],
17972 cfun->machine->frame.ra_fp_offset,
17973 reg_names[STACK_POINTER_REGNUM]);
17974 }
17975 if (!TARGET_NEWABI)
17976 fprintf (file,
17977 "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from stack\n",
17978 TARGET_64BIT ? "dsubu" : "subu",
17979 reg_names[STACK_POINTER_REGNUM],
17980 reg_names[STACK_POINTER_REGNUM],
17981 Pmode == DImode ? 16 : 8);
17982
17983 if (TARGET_LONG_CALLS)
17984 fprintf (file, "\tjalr\t%s\n", reg_names[3]);
17985 else
17986 fprintf (file, "\tjal\t_mcount\n");
17987 mips_pop_asm_switch (&mips_noat);
17988 /* _mcount treats $2 as the static chain register. */
17989 if (cfun->static_chain_decl != NULL)
17990 fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
17991 reg_names[2]);
17992 }
17993
17994 /* Implement TARGET_SHIFT_TRUNCATION_MASK. We want to keep the default
17995 behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
17996 when TARGET_LOONGSON_VECTORS is true. */
17997
17998 static unsigned HOST_WIDE_INT
17999 mips_shift_truncation_mask (enum machine_mode mode)
18000 {
18001 if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
18002 return 0;
18003
18004 return GET_MODE_BITSIZE (mode) - 1;
18005 }
18006
18007 /* Implement TARGET_PREPARE_PCH_SAVE. */
18008
18009 static void
18010 mips_prepare_pch_save (void)
18011 {
18012 /* We are called in a context where the current MIPS16 vs. non-MIPS16
18013 setting should be irrelevant. The question then is: which setting
18014 makes most sense at load time?
18015
18016 The PCH is loaded before the first token is read. We should never
18017 have switched into MIPS16 mode by that point, and thus should not
18018 have populated mips16_globals. Nor can we load the entire contents
18019 of mips16_globals from the PCH file, because mips16_globals contains
18020 a combination of GGC and non-GGC data.
18021
18022 There is therefore no point in trying save the GGC part of
18023 mips16_globals to the PCH file, or to preserve MIPS16ness across
18024 the PCH save and load. The loading compiler would not have access
18025 to the non-GGC parts of mips16_globals (either from the PCH file,
18026 or from a copy that the loading compiler generated itself) and would
18027 have to call target_reinit anyway.
18028
18029 It therefore seems best to switch back to non-MIPS16 mode at
18030 save time, and to ensure that mips16_globals remains null after
18031 a PCH load. */
18032 mips_set_compression_mode (0);
18033 mips16_globals = 0;
18034 }
18035 \f
18036 /* Generate or test for an insn that supports a constant permutation. */
18037
18038 #define MAX_VECT_LEN 8
18039
18040 struct expand_vec_perm_d
18041 {
18042 rtx target, op0, op1;
18043 unsigned char perm[MAX_VECT_LEN];
18044 enum machine_mode vmode;
18045 unsigned char nelt;
18046 bool one_vector_p;
18047 bool testing_p;
18048 };
18049
18050 /* Construct (set target (vec_select op0 (parallel perm))) and
18051 return true if that's a valid instruction in the active ISA. */
18052
18053 static bool
18054 mips_expand_vselect (rtx target, rtx op0,
18055 const unsigned char *perm, unsigned nelt)
18056 {
18057 rtx rperm[MAX_VECT_LEN], x;
18058 unsigned i;
18059
18060 for (i = 0; i < nelt; ++i)
18061 rperm[i] = GEN_INT (perm[i]);
18062
18063 x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
18064 x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
18065 x = gen_rtx_SET (VOIDmode, target, x);
18066
18067 x = emit_insn (x);
18068 if (recog_memoized (x) < 0)
18069 {
18070 remove_insn (x);
18071 return false;
18072 }
18073 return true;
18074 }
18075
18076 /* Similar, but generate a vec_concat from op0 and op1 as well. */
18077
18078 static bool
18079 mips_expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
18080 const unsigned char *perm, unsigned nelt)
18081 {
18082 enum machine_mode v2mode;
18083 rtx x;
18084
18085 v2mode = GET_MODE_2XWIDER_MODE (GET_MODE (op0));
18086 x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
18087 return mips_expand_vselect (target, x, perm, nelt);
18088 }
18089
18090 /* Recognize patterns for even-odd extraction. */
18091
18092 static bool
18093 mips_expand_vpc_loongson_even_odd (struct expand_vec_perm_d *d)
18094 {
18095 unsigned i, odd, nelt = d->nelt;
18096 rtx t0, t1, t2, t3;
18097
18098 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18099 return false;
18100 /* Even-odd for V2SI/V2SFmode is matched by interleave directly. */
18101 if (nelt < 4)
18102 return false;
18103
18104 odd = d->perm[0];
18105 if (odd > 1)
18106 return false;
18107 for (i = 1; i < nelt; ++i)
18108 if (d->perm[i] != i * 2 + odd)
18109 return false;
18110
18111 if (d->testing_p)
18112 return true;
18113
18114 /* We need 2*log2(N)-1 operations to achieve odd/even with interleave. */
18115 t0 = gen_reg_rtx (d->vmode);
18116 t1 = gen_reg_rtx (d->vmode);
18117 switch (d->vmode)
18118 {
18119 case V4HImode:
18120 emit_insn (gen_loongson_punpckhhw (t0, d->op0, d->op1));
18121 emit_insn (gen_loongson_punpcklhw (t1, d->op0, d->op1));
18122 if (odd)
18123 emit_insn (gen_loongson_punpckhhw (d->target, t1, t0));
18124 else
18125 emit_insn (gen_loongson_punpcklhw (d->target, t1, t0));
18126 break;
18127
18128 case V8QImode:
18129 t2 = gen_reg_rtx (d->vmode);
18130 t3 = gen_reg_rtx (d->vmode);
18131 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op1));
18132 emit_insn (gen_loongson_punpcklbh (t1, d->op0, d->op1));
18133 emit_insn (gen_loongson_punpckhbh (t2, t1, t0));
18134 emit_insn (gen_loongson_punpcklbh (t3, t1, t0));
18135 if (odd)
18136 emit_insn (gen_loongson_punpckhbh (d->target, t3, t2));
18137 else
18138 emit_insn (gen_loongson_punpcklbh (d->target, t3, t2));
18139 break;
18140
18141 default:
18142 gcc_unreachable ();
18143 }
18144 return true;
18145 }
18146
18147 /* Recognize patterns for the Loongson PSHUFH instruction. */
18148
18149 static bool
18150 mips_expand_vpc_loongson_pshufh (struct expand_vec_perm_d *d)
18151 {
18152 unsigned i, mask;
18153 rtx rmask;
18154
18155 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18156 return false;
18157 if (d->vmode != V4HImode)
18158 return false;
18159 if (d->testing_p)
18160 return true;
18161
18162 /* Convert the selector into the packed 8-bit form for pshufh. */
18163 /* Recall that loongson is little-endian only. No big-endian
18164 adjustment required. */
18165 for (i = mask = 0; i < 4; i++)
18166 mask |= (d->perm[i] & 3) << (i * 2);
18167 rmask = force_reg (SImode, GEN_INT (mask));
18168
18169 if (d->one_vector_p)
18170 emit_insn (gen_loongson_pshufh (d->target, d->op0, rmask));
18171 else
18172 {
18173 rtx t0, t1, x, merge, rmerge[4];
18174
18175 t0 = gen_reg_rtx (V4HImode);
18176 t1 = gen_reg_rtx (V4HImode);
18177 emit_insn (gen_loongson_pshufh (t1, d->op1, rmask));
18178 emit_insn (gen_loongson_pshufh (t0, d->op0, rmask));
18179
18180 for (i = 0; i < 4; ++i)
18181 rmerge[i] = (d->perm[i] & 4 ? constm1_rtx : const0_rtx);
18182 merge = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmerge));
18183 merge = force_reg (V4HImode, merge);
18184
18185 x = gen_rtx_AND (V4HImode, merge, t1);
18186 emit_insn (gen_rtx_SET (VOIDmode, t1, x));
18187
18188 x = gen_rtx_NOT (V4HImode, merge);
18189 x = gen_rtx_AND (V4HImode, x, t0);
18190 emit_insn (gen_rtx_SET (VOIDmode, t0, x));
18191
18192 x = gen_rtx_IOR (V4HImode, t0, t1);
18193 emit_insn (gen_rtx_SET (VOIDmode, d->target, x));
18194 }
18195
18196 return true;
18197 }
18198
18199 /* Recognize broadcast patterns for the Loongson. */
18200
18201 static bool
18202 mips_expand_vpc_loongson_bcast (struct expand_vec_perm_d *d)
18203 {
18204 unsigned i, elt;
18205 rtx t0, t1;
18206
18207 if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18208 return false;
18209 /* Note that we've already matched V2SI via punpck and V4HI via pshufh. */
18210 if (d->vmode != V8QImode)
18211 return false;
18212 if (!d->one_vector_p)
18213 return false;
18214
18215 elt = d->perm[0];
18216 for (i = 1; i < 8; ++i)
18217 if (d->perm[i] != elt)
18218 return false;
18219
18220 if (d->testing_p)
18221 return true;
18222
18223 /* With one interleave we put two of the desired element adjacent. */
18224 t0 = gen_reg_rtx (V8QImode);
18225 if (elt < 4)
18226 emit_insn (gen_loongson_punpcklbh (t0, d->op0, d->op0));
18227 else
18228 emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op0));
18229
18230 /* Shuffle that one HImode element into all locations. */
18231 elt &= 3;
18232 elt *= 0x55;
18233 t1 = gen_reg_rtx (V4HImode);
18234 emit_insn (gen_loongson_pshufh (t1, gen_lowpart (V4HImode, t0),
18235 force_reg (SImode, GEN_INT (elt))));
18236
18237 emit_move_insn (d->target, gen_lowpart (V8QImode, t1));
18238 return true;
18239 }
18240
18241 static bool
18242 mips_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
18243 {
18244 unsigned int i, nelt = d->nelt;
18245 unsigned char perm2[MAX_VECT_LEN];
18246
18247 if (d->one_vector_p)
18248 {
18249 /* Try interleave with alternating operands. */
18250 memcpy (perm2, d->perm, sizeof(perm2));
18251 for (i = 1; i < nelt; i += 2)
18252 perm2[i] += nelt;
18253 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1, perm2, nelt))
18254 return true;
18255 }
18256 else
18257 {
18258 if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1,
18259 d->perm, nelt))
18260 return true;
18261
18262 /* Try again with swapped operands. */
18263 for (i = 0; i < nelt; ++i)
18264 perm2[i] = (d->perm[i] + nelt) & (2 * nelt - 1);
18265 if (mips_expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
18266 return true;
18267 }
18268
18269 if (mips_expand_vpc_loongson_even_odd (d))
18270 return true;
18271 if (mips_expand_vpc_loongson_pshufh (d))
18272 return true;
18273 if (mips_expand_vpc_loongson_bcast (d))
18274 return true;
18275 return false;
18276 }
18277
18278 /* Expand a vec_perm_const pattern. */
18279
18280 bool
18281 mips_expand_vec_perm_const (rtx operands[4])
18282 {
18283 struct expand_vec_perm_d d;
18284 int i, nelt, which;
18285 unsigned char orig_perm[MAX_VECT_LEN];
18286 rtx sel;
18287 bool ok;
18288
18289 d.target = operands[0];
18290 d.op0 = operands[1];
18291 d.op1 = operands[2];
18292 sel = operands[3];
18293
18294 d.vmode = GET_MODE (d.target);
18295 gcc_assert (VECTOR_MODE_P (d.vmode));
18296 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18297 d.testing_p = false;
18298
18299 for (i = which = 0; i < nelt; ++i)
18300 {
18301 rtx e = XVECEXP (sel, 0, i);
18302 int ei = INTVAL (e) & (2 * nelt - 1);
18303 which |= (ei < nelt ? 1 : 2);
18304 orig_perm[i] = ei;
18305 }
18306 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18307
18308 switch (which)
18309 {
18310 default:
18311 gcc_unreachable();
18312
18313 case 3:
18314 d.one_vector_p = false;
18315 if (!rtx_equal_p (d.op0, d.op1))
18316 break;
18317 /* FALLTHRU */
18318
18319 case 2:
18320 for (i = 0; i < nelt; ++i)
18321 d.perm[i] &= nelt - 1;
18322 d.op0 = d.op1;
18323 d.one_vector_p = true;
18324 break;
18325
18326 case 1:
18327 d.op1 = d.op0;
18328 d.one_vector_p = true;
18329 break;
18330 }
18331
18332 ok = mips_expand_vec_perm_const_1 (&d);
18333
18334 /* If we were given a two-vector permutation which just happened to
18335 have both input vectors equal, we folded this into a one-vector
18336 permutation. There are several loongson patterns that are matched
18337 via direct vec_select+vec_concat expansion, but we do not have
18338 support in mips_expand_vec_perm_const_1 to guess the adjustment
18339 that should be made for a single operand. Just try again with
18340 the original permutation. */
18341 if (!ok && which == 3)
18342 {
18343 d.op0 = operands[1];
18344 d.op1 = operands[2];
18345 d.one_vector_p = false;
18346 memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18347 ok = mips_expand_vec_perm_const_1 (&d);
18348 }
18349
18350 return ok;
18351 }
18352
18353 /* Implement TARGET_VECTORIZE_VEC_PERM_CONST_OK. */
18354
18355 static bool
18356 mips_vectorize_vec_perm_const_ok (enum machine_mode vmode,
18357 const unsigned char *sel)
18358 {
18359 struct expand_vec_perm_d d;
18360 unsigned int i, nelt, which;
18361 bool ret;
18362
18363 d.vmode = vmode;
18364 d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18365 d.testing_p = true;
18366 memcpy (d.perm, sel, nelt);
18367
18368 /* Categorize the set of elements in the selector. */
18369 for (i = which = 0; i < nelt; ++i)
18370 {
18371 unsigned char e = d.perm[i];
18372 gcc_assert (e < 2 * nelt);
18373 which |= (e < nelt ? 1 : 2);
18374 }
18375
18376 /* For all elements from second vector, fold the elements to first. */
18377 if (which == 2)
18378 for (i = 0; i < nelt; ++i)
18379 d.perm[i] -= nelt;
18380
18381 /* Check whether the mask can be applied to the vector type. */
18382 d.one_vector_p = (which != 3);
18383
18384 d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
18385 d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
18386 if (!d.one_vector_p)
18387 d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
18388
18389 start_sequence ();
18390 ret = mips_expand_vec_perm_const_1 (&d);
18391 end_sequence ();
18392
18393 return ret;
18394 }
18395
18396 /* Expand an integral vector unpack operation. */
18397
18398 void
18399 mips_expand_vec_unpack (rtx operands[2], bool unsigned_p, bool high_p)
18400 {
18401 enum machine_mode imode = GET_MODE (operands[1]);
18402 rtx (*unpack) (rtx, rtx, rtx);
18403 rtx (*cmpgt) (rtx, rtx, rtx);
18404 rtx tmp, dest, zero;
18405
18406 switch (imode)
18407 {
18408 case V8QImode:
18409 if (high_p)
18410 unpack = gen_loongson_punpckhbh;
18411 else
18412 unpack = gen_loongson_punpcklbh;
18413 cmpgt = gen_loongson_pcmpgtb;
18414 break;
18415 case V4HImode:
18416 if (high_p)
18417 unpack = gen_loongson_punpckhhw;
18418 else
18419 unpack = gen_loongson_punpcklhw;
18420 cmpgt = gen_loongson_pcmpgth;
18421 break;
18422 default:
18423 gcc_unreachable ();
18424 }
18425
18426 zero = force_reg (imode, CONST0_RTX (imode));
18427 if (unsigned_p)
18428 tmp = zero;
18429 else
18430 {
18431 tmp = gen_reg_rtx (imode);
18432 emit_insn (cmpgt (tmp, zero, operands[1]));
18433 }
18434
18435 dest = gen_reg_rtx (imode);
18436 emit_insn (unpack (dest, operands[1], tmp));
18437
18438 emit_move_insn (operands[0], gen_lowpart (GET_MODE (operands[0]), dest));
18439 }
18440
18441 /* A subroutine of mips_expand_vec_init, match constant vector elements. */
18442
18443 static inline bool
18444 mips_constant_elt_p (rtx x)
18445 {
18446 return CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE;
18447 }
18448
18449 /* A subroutine of mips_expand_vec_init, expand via broadcast. */
18450
18451 static void
18452 mips_expand_vi_broadcast (enum machine_mode vmode, rtx target, rtx elt)
18453 {
18454 struct expand_vec_perm_d d;
18455 rtx t1;
18456 bool ok;
18457
18458 if (elt != const0_rtx)
18459 elt = force_reg (GET_MODE_INNER (vmode), elt);
18460 if (REG_P (elt))
18461 elt = gen_lowpart (DImode, elt);
18462
18463 t1 = gen_reg_rtx (vmode);
18464 switch (vmode)
18465 {
18466 case V8QImode:
18467 emit_insn (gen_loongson_vec_init1_v8qi (t1, elt));
18468 break;
18469 case V4HImode:
18470 emit_insn (gen_loongson_vec_init1_v4hi (t1, elt));
18471 break;
18472 default:
18473 gcc_unreachable ();
18474 }
18475
18476 memset (&d, 0, sizeof (d));
18477 d.target = target;
18478 d.op0 = t1;
18479 d.op1 = t1;
18480 d.vmode = vmode;
18481 d.nelt = GET_MODE_NUNITS (vmode);
18482 d.one_vector_p = true;
18483
18484 ok = mips_expand_vec_perm_const_1 (&d);
18485 gcc_assert (ok);
18486 }
18487
18488 /* A subroutine of mips_expand_vec_init, replacing all of the non-constant
18489 elements of VALS with zeros, copy the constant vector to TARGET. */
18490
18491 static void
18492 mips_expand_vi_constant (enum machine_mode vmode, unsigned nelt,
18493 rtx target, rtx vals)
18494 {
18495 rtvec vec = shallow_copy_rtvec (XVEC (vals, 0));
18496 unsigned i;
18497
18498 for (i = 0; i < nelt; ++i)
18499 {
18500 if (!mips_constant_elt_p (RTVEC_ELT (vec, i)))
18501 RTVEC_ELT (vec, i) = const0_rtx;
18502 }
18503
18504 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, vec));
18505 }
18506
18507
18508 /* A subroutine of mips_expand_vec_init, expand via pinsrh. */
18509
18510 static void
18511 mips_expand_vi_loongson_one_pinsrh (rtx target, rtx vals, unsigned one_var)
18512 {
18513 mips_expand_vi_constant (V4HImode, 4, target, vals);
18514
18515 emit_insn (gen_vec_setv4hi (target, target, XVECEXP (vals, 0, one_var),
18516 GEN_INT (one_var)));
18517 }
18518
18519 /* A subroutine of mips_expand_vec_init, expand anything via memory. */
18520
18521 static void
18522 mips_expand_vi_general (enum machine_mode vmode, enum machine_mode imode,
18523 unsigned nelt, unsigned nvar, rtx target, rtx vals)
18524 {
18525 rtx mem = assign_stack_temp (vmode, GET_MODE_SIZE (vmode));
18526 unsigned int i, isize = GET_MODE_SIZE (imode);
18527
18528 if (nvar < nelt)
18529 mips_expand_vi_constant (vmode, nelt, mem, vals);
18530
18531 for (i = 0; i < nelt; ++i)
18532 {
18533 rtx x = XVECEXP (vals, 0, i);
18534 if (!mips_constant_elt_p (x))
18535 emit_move_insn (adjust_address (mem, imode, i * isize), x);
18536 }
18537
18538 emit_move_insn (target, mem);
18539 }
18540
18541 /* Expand a vector initialization. */
18542
18543 void
18544 mips_expand_vector_init (rtx target, rtx vals)
18545 {
18546 enum machine_mode vmode = GET_MODE (target);
18547 enum machine_mode imode = GET_MODE_INNER (vmode);
18548 unsigned i, nelt = GET_MODE_NUNITS (vmode);
18549 unsigned nvar = 0, one_var = -1u;
18550 bool all_same = true;
18551 rtx x;
18552
18553 for (i = 0; i < nelt; ++i)
18554 {
18555 x = XVECEXP (vals, 0, i);
18556 if (!mips_constant_elt_p (x))
18557 nvar++, one_var = i;
18558 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
18559 all_same = false;
18560 }
18561
18562 /* Load constants from the pool, or whatever's handy. */
18563 if (nvar == 0)
18564 {
18565 emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)));
18566 return;
18567 }
18568
18569 /* For two-part initialization, always use CONCAT. */
18570 if (nelt == 2)
18571 {
18572 rtx op0 = force_reg (imode, XVECEXP (vals, 0, 0));
18573 rtx op1 = force_reg (imode, XVECEXP (vals, 0, 1));
18574 x = gen_rtx_VEC_CONCAT (vmode, op0, op1);
18575 emit_insn (gen_rtx_SET (VOIDmode, target, x));
18576 return;
18577 }
18578
18579 /* Loongson is the only cpu with vectors with more elements. */
18580 gcc_assert (TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS);
18581
18582 /* If all values are identical, broadcast the value. */
18583 if (all_same)
18584 {
18585 mips_expand_vi_broadcast (vmode, target, XVECEXP (vals, 0, 0));
18586 return;
18587 }
18588
18589 /* If we've only got one non-variable V4HImode, use PINSRH. */
18590 if (nvar == 1 && vmode == V4HImode)
18591 {
18592 mips_expand_vi_loongson_one_pinsrh (target, vals, one_var);
18593 return;
18594 }
18595
18596 mips_expand_vi_general (vmode, imode, nelt, nvar, target, vals);
18597 }
18598
18599 /* Expand a vector reduction. */
18600
18601 void
18602 mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
18603 {
18604 enum machine_mode vmode = GET_MODE (in);
18605 unsigned char perm2[2];
18606 rtx last, next, fold, x;
18607 bool ok;
18608
18609 last = in;
18610 fold = gen_reg_rtx (vmode);
18611 switch (vmode)
18612 {
18613 case V2SFmode:
18614 /* Use PUL/PLU to produce { L, H } op { H, L }.
18615 By reversing the pair order, rather than a pure interleave high,
18616 we avoid erroneous exceptional conditions that we might otherwise
18617 produce from the computation of H op H. */
18618 perm2[0] = 1;
18619 perm2[1] = 2;
18620 ok = mips_expand_vselect_vconcat (fold, last, last, perm2, 2);
18621 gcc_assert (ok);
18622 break;
18623
18624 case V2SImode:
18625 /* Use interleave to produce { H, L } op { H, H }. */
18626 emit_insn (gen_loongson_punpckhwd (fold, last, last));
18627 break;
18628
18629 case V4HImode:
18630 /* Perform the first reduction with interleave,
18631 and subsequent reductions with shifts. */
18632 emit_insn (gen_loongson_punpckhwd_hi (fold, last, last));
18633
18634 next = gen_reg_rtx (vmode);
18635 emit_insn (gen (next, last, fold));
18636 last = next;
18637
18638 fold = gen_reg_rtx (vmode);
18639 x = force_reg (SImode, GEN_INT (16));
18640 emit_insn (gen_vec_shr_v4hi (fold, last, x));
18641 break;
18642
18643 case V8QImode:
18644 emit_insn (gen_loongson_punpckhwd_qi (fold, last, last));
18645
18646 next = gen_reg_rtx (vmode);
18647 emit_insn (gen (next, last, fold));
18648 last = next;
18649
18650 fold = gen_reg_rtx (vmode);
18651 x = force_reg (SImode, GEN_INT (16));
18652 emit_insn (gen_vec_shr_v8qi (fold, last, x));
18653
18654 next = gen_reg_rtx (vmode);
18655 emit_insn (gen (next, last, fold));
18656 last = next;
18657
18658 fold = gen_reg_rtx (vmode);
18659 x = force_reg (SImode, GEN_INT (8));
18660 emit_insn (gen_vec_shr_v8qi (fold, last, x));
18661 break;
18662
18663 default:
18664 gcc_unreachable ();
18665 }
18666
18667 emit_insn (gen (target, last, fold));
18668 }
18669
18670 /* Expand a vector minimum/maximum. */
18671
18672 void
18673 mips_expand_vec_minmax (rtx target, rtx op0, rtx op1,
18674 rtx (*cmp) (rtx, rtx, rtx), bool min_p)
18675 {
18676 enum machine_mode vmode = GET_MODE (target);
18677 rtx tc, t0, t1, x;
18678
18679 tc = gen_reg_rtx (vmode);
18680 t0 = gen_reg_rtx (vmode);
18681 t1 = gen_reg_rtx (vmode);
18682
18683 /* op0 > op1 */
18684 emit_insn (cmp (tc, op0, op1));
18685
18686 x = gen_rtx_AND (vmode, tc, (min_p ? op1 : op0));
18687 emit_insn (gen_rtx_SET (VOIDmode, t0, x));
18688
18689 x = gen_rtx_NOT (vmode, tc);
18690 x = gen_rtx_AND (vmode, x, (min_p ? op0 : op1));
18691 emit_insn (gen_rtx_SET (VOIDmode, t1, x));
18692
18693 x = gen_rtx_IOR (vmode, t0, t1);
18694 emit_insn (gen_rtx_SET (VOIDmode, target, x));
18695 }
18696
18697 /* Implement TARGET_CASE_VALUES_THRESHOLD. */
18698
18699 unsigned int
18700 mips_case_values_threshold (void)
18701 {
18702 /* In MIPS16 mode using a larger case threshold generates smaller code. */
18703 if (TARGET_MIPS16 && optimize_size)
18704 return 10;
18705 else
18706 return default_case_values_threshold ();
18707 }
18708 \f
18709 /* Initialize the GCC target structure. */
18710 #undef TARGET_ASM_ALIGNED_HI_OP
18711 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
18712 #undef TARGET_ASM_ALIGNED_SI_OP
18713 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
18714 #undef TARGET_ASM_ALIGNED_DI_OP
18715 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
18716
18717 #undef TARGET_OPTION_OVERRIDE
18718 #define TARGET_OPTION_OVERRIDE mips_option_override
18719
18720 #undef TARGET_LEGITIMIZE_ADDRESS
18721 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
18722
18723 #undef TARGET_ASM_FUNCTION_PROLOGUE
18724 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
18725 #undef TARGET_ASM_FUNCTION_EPILOGUE
18726 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
18727 #undef TARGET_ASM_SELECT_RTX_SECTION
18728 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
18729 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
18730 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
18731
18732 #undef TARGET_SCHED_INIT
18733 #define TARGET_SCHED_INIT mips_sched_init
18734 #undef TARGET_SCHED_REORDER
18735 #define TARGET_SCHED_REORDER mips_sched_reorder
18736 #undef TARGET_SCHED_REORDER2
18737 #define TARGET_SCHED_REORDER2 mips_sched_reorder2
18738 #undef TARGET_SCHED_VARIABLE_ISSUE
18739 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
18740 #undef TARGET_SCHED_ADJUST_COST
18741 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
18742 #undef TARGET_SCHED_ISSUE_RATE
18743 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
18744 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
18745 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
18746 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
18747 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
18748 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
18749 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
18750 mips_multipass_dfa_lookahead
18751 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
18752 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
18753 mips_small_register_classes_for_mode_p
18754
18755 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
18756 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
18757
18758 #undef TARGET_INSERT_ATTRIBUTES
18759 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
18760 #undef TARGET_MERGE_DECL_ATTRIBUTES
18761 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
18762 #undef TARGET_CAN_INLINE_P
18763 #define TARGET_CAN_INLINE_P mips_can_inline_p
18764 #undef TARGET_SET_CURRENT_FUNCTION
18765 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
18766
18767 #undef TARGET_VALID_POINTER_MODE
18768 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
18769 #undef TARGET_REGISTER_MOVE_COST
18770 #define TARGET_REGISTER_MOVE_COST mips_register_move_cost
18771 #undef TARGET_MEMORY_MOVE_COST
18772 #define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
18773 #undef TARGET_RTX_COSTS
18774 #define TARGET_RTX_COSTS mips_rtx_costs
18775 #undef TARGET_ADDRESS_COST
18776 #define TARGET_ADDRESS_COST mips_address_cost
18777
18778 #undef TARGET_IN_SMALL_DATA_P
18779 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
18780
18781 #undef TARGET_MACHINE_DEPENDENT_REORG
18782 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
18783
18784 #undef TARGET_PREFERRED_RELOAD_CLASS
18785 #define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
18786
18787 #undef TARGET_EXPAND_TO_RTL_HOOK
18788 #define TARGET_EXPAND_TO_RTL_HOOK mips_expand_to_rtl_hook
18789 #undef TARGET_ASM_FILE_START
18790 #define TARGET_ASM_FILE_START mips_file_start
18791 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
18792 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
18793 #undef TARGET_ASM_CODE_END
18794 #define TARGET_ASM_CODE_END mips_code_end
18795
18796 #undef TARGET_INIT_LIBFUNCS
18797 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
18798
18799 #undef TARGET_BUILD_BUILTIN_VA_LIST
18800 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
18801 #undef TARGET_EXPAND_BUILTIN_VA_START
18802 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
18803 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
18804 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
18805
18806 #undef TARGET_PROMOTE_FUNCTION_MODE
18807 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
18808 #undef TARGET_PROMOTE_PROTOTYPES
18809 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
18810
18811 #undef TARGET_FUNCTION_VALUE
18812 #define TARGET_FUNCTION_VALUE mips_function_value
18813 #undef TARGET_LIBCALL_VALUE
18814 #define TARGET_LIBCALL_VALUE mips_libcall_value
18815 #undef TARGET_FUNCTION_VALUE_REGNO_P
18816 #define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
18817 #undef TARGET_RETURN_IN_MEMORY
18818 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
18819 #undef TARGET_RETURN_IN_MSB
18820 #define TARGET_RETURN_IN_MSB mips_return_in_msb
18821
18822 #undef TARGET_ASM_OUTPUT_MI_THUNK
18823 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
18824 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
18825 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
18826
18827 #undef TARGET_PRINT_OPERAND
18828 #define TARGET_PRINT_OPERAND mips_print_operand
18829 #undef TARGET_PRINT_OPERAND_ADDRESS
18830 #define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
18831 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
18832 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
18833
18834 #undef TARGET_SETUP_INCOMING_VARARGS
18835 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
18836 #undef TARGET_STRICT_ARGUMENT_NAMING
18837 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
18838 #undef TARGET_MUST_PASS_IN_STACK
18839 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
18840 #undef TARGET_PASS_BY_REFERENCE
18841 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
18842 #undef TARGET_CALLEE_COPIES
18843 #define TARGET_CALLEE_COPIES mips_callee_copies
18844 #undef TARGET_ARG_PARTIAL_BYTES
18845 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
18846 #undef TARGET_FUNCTION_ARG
18847 #define TARGET_FUNCTION_ARG mips_function_arg
18848 #undef TARGET_FUNCTION_ARG_ADVANCE
18849 #define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
18850 #undef TARGET_FUNCTION_ARG_BOUNDARY
18851 #define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
18852
18853 #undef TARGET_MODE_REP_EXTENDED
18854 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
18855
18856 #undef TARGET_VECTOR_MODE_SUPPORTED_P
18857 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
18858
18859 #undef TARGET_SCALAR_MODE_SUPPORTED_P
18860 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
18861
18862 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
18863 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
18864
18865 #undef TARGET_INIT_BUILTINS
18866 #define TARGET_INIT_BUILTINS mips_init_builtins
18867 #undef TARGET_BUILTIN_DECL
18868 #define TARGET_BUILTIN_DECL mips_builtin_decl
18869 #undef TARGET_EXPAND_BUILTIN
18870 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
18871
18872 #undef TARGET_HAVE_TLS
18873 #define TARGET_HAVE_TLS HAVE_AS_TLS
18874
18875 #undef TARGET_CANNOT_FORCE_CONST_MEM
18876 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
18877
18878 #undef TARGET_LEGITIMATE_CONSTANT_P
18879 #define TARGET_LEGITIMATE_CONSTANT_P mips_legitimate_constant_p
18880
18881 #undef TARGET_ENCODE_SECTION_INFO
18882 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
18883
18884 #undef TARGET_ATTRIBUTE_TABLE
18885 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
18886 /* All our function attributes are related to how out-of-line copies should
18887 be compiled or called. They don't in themselves prevent inlining. */
18888 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
18889 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
18890
18891 #undef TARGET_EXTRA_LIVE_ON_ENTRY
18892 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
18893
18894 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
18895 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
18896 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
18897 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
18898
18899 #undef TARGET_COMP_TYPE_ATTRIBUTES
18900 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
18901
18902 #ifdef HAVE_AS_DTPRELWORD
18903 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
18904 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
18905 #endif
18906 #undef TARGET_DWARF_REGISTER_SPAN
18907 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
18908
18909 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
18910 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
18911
18912 #undef TARGET_LEGITIMATE_ADDRESS_P
18913 #define TARGET_LEGITIMATE_ADDRESS_P mips_legitimate_address_p
18914
18915 #undef TARGET_FRAME_POINTER_REQUIRED
18916 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
18917
18918 #undef TARGET_CAN_ELIMINATE
18919 #define TARGET_CAN_ELIMINATE mips_can_eliminate
18920
18921 #undef TARGET_CONDITIONAL_REGISTER_USAGE
18922 #define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
18923
18924 #undef TARGET_TRAMPOLINE_INIT
18925 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
18926
18927 #undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
18928 #define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
18929
18930 #undef TARGET_SHIFT_TRUNCATION_MASK
18931 #define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
18932
18933 #undef TARGET_PREPARE_PCH_SAVE
18934 #define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
18935
18936 #undef TARGET_VECTORIZE_VEC_PERM_CONST_OK
18937 #define TARGET_VECTORIZE_VEC_PERM_CONST_OK mips_vectorize_vec_perm_const_ok
18938
18939 #undef TARGET_CASE_VALUES_THRESHOLD
18940 #define TARGET_CASE_VALUES_THRESHOLD mips_case_values_threshold
18941
18942 struct gcc_target targetm = TARGET_INITIALIZER;
18943 \f
18944 #include "gt-mips.h"