OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [tools/] [build_mips_toolchain/] [mips.c] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
/* 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
#undef DECLARE_MIPS_COND
279
 
280
/* Index X provides the string representation of MIPS_FP_COND_<X>.  */
281
#define STRINGIFY(X) #X
282
static const char *const mips_fp_conditions[] = {
283
  MIPS_FP_CONDITIONS (STRINGIFY)
284
};
285
#undef STRINGIFY
286
 
287
/* A class used to control a comdat-style stub that we output in each
288
   translation unit that needs it.  */
289
class mips_one_only_stub {
290
public:
291
  virtual ~mips_one_only_stub () {}
292
 
293
  /* Return the name of the stub.  */
294
  virtual const char *get_name () = 0;
295
 
296
  /* Output the body of the function to asm_out_file.  */
297
  virtual void output_body () = 0;
298
};
299
 
300
/* Tuning information that is automatically derived from other sources
301
   (such as the scheduler).  */
302
static struct {
303
  /* The architecture and tuning settings that this structure describes.  */
304
  enum processor arch;
305
  enum processor tune;
306
 
307
  /* True if this structure describes MIPS16 settings.  */
308
  bool mips16_p;
309
 
310
  /* True if the structure has been initialized.  */
311
  bool initialized_p;
312
 
313
  /* True if "MULT $0, $0" is preferable to "MTLO $0; MTHI $0"
314
     when optimizing for speed.  */
315
  bool fast_mult_zero_zero_p;
316
} mips_tuning_info;
317
 
318
/* Information about a function's frame layout.  */
319
struct GTY(())  mips_frame_info {
320
  /* The size of the frame in bytes.  */
321
  HOST_WIDE_INT total_size;
322
 
323
  /* The number of bytes allocated to variables.  */
324
  HOST_WIDE_INT var_size;
325
 
326
  /* The number of bytes allocated to outgoing function arguments.  */
327
  HOST_WIDE_INT args_size;
328
 
329
  /* The number of bytes allocated to the .cprestore slot, or 0 if there
330
     is no such slot.  */
331
  HOST_WIDE_INT cprestore_size;
332
 
333
  /* Bit X is set if the function saves or restores GPR X.  */
334
  unsigned int mask;
335
 
336
  /* Likewise FPR X.  */
337
  unsigned int fmask;
338
 
339
  /* Likewise doubleword accumulator X ($acX).  */
340
  unsigned int acc_mask;
341
 
342
  /* The number of GPRs, FPRs, doubleword accumulators and COP0
343
     registers saved.  */
344
  unsigned int num_gp;
345
  unsigned int num_fp;
346
  unsigned int num_acc;
347
  unsigned int num_cop0_regs;
348
 
349
  /* The offset of the topmost GPR, FPR, accumulator and COP0-register
350
     save slots from the top of the frame, or zero if no such slots are
351
     needed.  */
352
  HOST_WIDE_INT gp_save_offset;
353
  HOST_WIDE_INT fp_save_offset;
354
  HOST_WIDE_INT acc_save_offset;
355
  HOST_WIDE_INT cop0_save_offset;
356
 
357
  /* Likewise, but giving offsets from the bottom of the frame.  */
358
  HOST_WIDE_INT gp_sp_offset;
359
  HOST_WIDE_INT fp_sp_offset;
360
  HOST_WIDE_INT acc_sp_offset;
361
  HOST_WIDE_INT cop0_sp_offset;
362
 
363
  /* Similar, but the value passed to _mcount.  */
364
  HOST_WIDE_INT ra_fp_offset;
365
 
366
  /* The offset of arg_pointer_rtx from the bottom of the frame.  */
367
  HOST_WIDE_INT arg_pointer_offset;
368
 
369
  /* The offset of hard_frame_pointer_rtx from the bottom of the frame.  */
370
  HOST_WIDE_INT hard_frame_pointer_offset;
371
};
372
 
373
struct GTY(())  machine_function {
374
  /* The next floating-point condition-code register to allocate
375
     for ISA_HAS_8CC targets, relative to ST_REG_FIRST.  */
376
  unsigned int next_fcc;
377
 
378
  /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
379
  rtx mips16_gp_pseudo_rtx;
380
 
381
  /* The number of extra stack bytes taken up by register varargs.
382
     This area is allocated by the callee at the very top of the frame.  */
383
  int varargs_size;
384
 
385
  /* The current frame information, calculated by mips_compute_frame_info.  */
386
  struct mips_frame_info frame;
387
 
388
  /* The register to use as the function's global pointer, or INVALID_REGNUM
389
     if the function doesn't need one.  */
390
  unsigned int global_pointer;
391
 
392
  /* How many instructions it takes to load a label into $AT, or 0 if
393
     this property hasn't yet been calculated.  */
394
  unsigned int load_label_num_insns;
395
 
396
  /* True if mips_adjust_insn_length should ignore an instruction's
397
     hazard attribute.  */
398
  bool ignore_hazard_length_p;
399
 
400
  /* True if the whole function is suitable for .set noreorder and
401
     .set nomacro.  */
402
  bool all_noreorder_p;
403
 
404
  /* True if the function has "inflexible" and "flexible" references
405
     to the global pointer.  See mips_cfun_has_inflexible_gp_ref_p
406
     and mips_cfun_has_flexible_gp_ref_p for details.  */
407
  bool has_inflexible_gp_insn_p;
408
  bool has_flexible_gp_insn_p;
409
 
410
  /* True if the function's prologue must load the global pointer
411
     value into pic_offset_table_rtx and store the same value in
412
     the function's cprestore slot (if any).  Even if this value
413
     is currently false, we may decide to set it to true later;
414
     see mips_must_initialize_gp_p () for details.  */
415
  bool must_initialize_gp_p;
416
 
417
  /* True if the current function must restore $gp after any potential
418
     clobber.  This value is only meaningful during the first post-epilogue
419
     split_insns pass; see mips_must_initialize_gp_p () for details.  */
420
  bool must_restore_gp_when_clobbered_p;
421
 
422
  /* True if this is an interrupt handler.  */
423
  bool interrupt_handler_p;
424
 
425
  /* True if this is an interrupt handler that uses shadow registers.  */
426
  bool use_shadow_register_set_p;
427
 
428
  /* True if this is an interrupt handler that should keep interrupts
429
     masked.  */
430
  bool keep_interrupts_masked_p;
431
 
432
  /* True if this is an interrupt handler that should use DERET
433
     instead of ERET.  */
434
  bool use_debug_exception_return_p;
435
};
436
 
437
/* Information about a single argument.  */
438
struct mips_arg_info {
439
  /* True if the argument is passed in a floating-point register, or
440
     would have been if we hadn't run out of registers.  */
441
  bool fpr_p;
442
 
443
  /* The number of words passed in registers, rounded up.  */
444
  unsigned int reg_words;
445
 
446
  /* For EABI, the offset of the first register from GP_ARG_FIRST or
447
     FP_ARG_FIRST.  For other ABIs, the offset of the first register from
448
     the start of the ABI's argument structure (see the CUMULATIVE_ARGS
449
     comment for details).
450
 
451
     The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
452
     on the stack.  */
453
  unsigned int reg_offset;
454
 
455
  /* The number of words that must be passed on the stack, rounded up.  */
456
  unsigned int stack_words;
457
 
458
  /* The offset from the start of the stack overflow area of the argument's
459
     first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
460
  unsigned int stack_offset;
461
};
462
 
463
/* Information about an address described by mips_address_type.
464
 
465
   ADDRESS_CONST_INT
466
       No fields are used.
467
 
468
   ADDRESS_REG
469
       REG is the base register and OFFSET is the constant offset.
470
 
471
   ADDRESS_LO_SUM
472
       REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
473
       is the type of symbol it references.
474
 
475
   ADDRESS_SYMBOLIC
476
       SYMBOL_TYPE is the type of symbol that the address references.  */
477
struct mips_address_info {
478
  enum mips_address_type type;
479
  rtx reg;
480
  rtx offset;
481
  enum mips_symbol_type symbol_type;
482
};
483
 
484
/* One stage in a constant building sequence.  These sequences have
485
   the form:
486
 
487
        A = VALUE[0]
488
        A = A CODE[1] VALUE[1]
489
        A = A CODE[2] VALUE[2]
490
        ...
491
 
492
   where A is an accumulator, each CODE[i] is a binary rtl operation
493
   and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
494
struct mips_integer_op {
495
  enum rtx_code code;
496
  unsigned HOST_WIDE_INT value;
497
};
498
 
499
/* The largest number of operations needed to load an integer constant.
500
   The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
501
   When the lowest bit is clear, we can try, but reject a sequence with
502
   an extra SLL at the end.  */
503
#define MIPS_MAX_INTEGER_OPS 7
504
 
505
/* Information about a MIPS16e SAVE or RESTORE instruction.  */
506
struct mips16e_save_restore_info {
507
  /* The number of argument registers saved by a SAVE instruction.
508
 
509
  unsigned int nargs;
510
 
511
  /* Bit X is set if the instruction saves or restores GPR X.  */
512
  unsigned int mask;
513
 
514
  /* The total number of bytes to allocate.  */
515
  HOST_WIDE_INT size;
516
};
517
 
518
/* Costs of various operations on the different architectures.  */
519
 
520
struct mips_rtx_cost_data
521
{
522
  unsigned short fp_add;
523
  unsigned short fp_mult_sf;
524
  unsigned short fp_mult_df;
525
  unsigned short fp_div_sf;
526
  unsigned short fp_div_df;
527
  unsigned short int_mult_si;
528
  unsigned short int_mult_di;
529
  unsigned short int_div_si;
530
  unsigned short int_div_di;
531
  unsigned short branch_cost;
532
  unsigned short memory_latency;
533
};
534
 
535
/* Global variables for machine-dependent things.  */
536
 
537
/* The -G setting, or the configuration's default small-data limit if
538
   no -G option is given.  */
539
static unsigned int mips_small_data_threshold;
540
 
541
/* The number of file directives written by mips_output_filename.  */
542
int num_source_filenames;
543
 
544
/* The name that appeared in the last .file directive written by
545
   mips_output_filename, or "" if mips_output_filename hasn't
546
   written anything yet.  */
547
const char *current_function_file = "";
548
 
549
/* Arrays that map GCC register numbers to debugger register numbers.  */
550
int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
551
int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
552
 
553
/* Information about the current function's epilogue, used only while
554
   expanding it.  */
555
static struct {
556
  /* A list of queued REG_CFA_RESTORE notes.  */
557
  rtx cfa_restores;
558
 
559
  /* The CFA is currently defined as CFA_REG + CFA_OFFSET.  */
560
  rtx cfa_reg;
561
  HOST_WIDE_INT cfa_offset;
562
 
563
  /* The offset of the CFA from the stack pointer while restoring
564
     registers.  */
565
  HOST_WIDE_INT cfa_restore_sp_offset;
566
} mips_epilogue;
567
 
568
/* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
569
struct mips_asm_switch mips_noreorder = { "reorder", 0 };
570
struct mips_asm_switch mips_nomacro = { "macro", 0 };
571
struct mips_asm_switch mips_noat = { "at", 0 };
572
 
573
/* True if we're writing out a branch-likely instruction rather than a
574
   normal branch.  */
575
static bool mips_branch_likely;
576
 
577
/* The current instruction-set architecture.  */
578
enum processor mips_arch;
579
const struct mips_cpu_info *mips_arch_info;
580
 
581
/* The processor that we should tune the code for.  */
582
enum processor mips_tune;
583
const struct mips_cpu_info *mips_tune_info;
584
 
585
/* The ISA level associated with mips_arch.  */
586
int mips_isa;
587
 
588
/* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
589
static const struct mips_cpu_info *mips_isa_option_info;
590
 
591
/* Which cost information to use.  */
592
static const struct mips_rtx_cost_data *mips_cost;
593
 
594
/* The ambient target flags, excluding MASK_MIPS16.  */
595
static int mips_base_target_flags;
596
 
597
/* The default compression mode.  */
598
unsigned int mips_base_compression_flags;
599
 
600
/* The ambient values of other global variables.  */
601
static int mips_base_schedule_insns; /* flag_schedule_insns */
602
static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
603
static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
604
static int mips_base_align_loops; /* align_loops */
605
static int mips_base_align_jumps; /* align_jumps */
606
static int mips_base_align_functions; /* align_functions */
607
 
608
/* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
609
bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
610
 
611
/* Index C is true if character C is a valid PRINT_OPERAND punctation
612
   character.  */
613
static bool mips_print_operand_punct[256];
614
 
615
static GTY (()) int mips_output_filename_first_time = 1;
616
 
617
/* mips_split_p[X] is true if symbols of type X can be split by
618
   mips_split_symbol.  */
619
bool mips_split_p[NUM_SYMBOL_TYPES];
620
 
621
/* mips_split_hi_p[X] is true if the high parts of symbols of type X
622
   can be split by mips_split_symbol.  */
623
bool mips_split_hi_p[NUM_SYMBOL_TYPES];
624
 
625
/* mips_use_pcrel_pool_p[X] is true if symbols of type X should be
626
   forced into a PC-relative constant pool.  */
627
bool mips_use_pcrel_pool_p[NUM_SYMBOL_TYPES];
628
 
629
/* mips_lo_relocs[X] is the relocation to use when a symbol of type X
630
   appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
631
   if they are matched by a special .md file pattern.  */
632
const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
633
 
634
/* Likewise for HIGHs.  */
635
const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
636
 
637
/* Target state for MIPS16.  */
638
struct target_globals *mips16_globals;
639
 
640
/* Cached value of can_issue_more. This is cached in mips_variable_issue hook
641
   and returned from mips_sched_reorder2.  */
642
static int cached_can_issue_more;
643
 
644
/* The stubs for various MIPS16 support functions, if used.   */
645
static mips_one_only_stub *mips16_rdhwr_stub;
646
static mips_one_only_stub *mips16_get_fcsr_stub;
647
static mips_one_only_stub *mips16_set_fcsr_stub;
648
 
649
/* Index R is the smallest register class that contains register R.  */
650
const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
651
  LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
652
  M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
653
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
654
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
655
  M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
656
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
657
  T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
658
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
659
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
660
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
661
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
662
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
663
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
664
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
665
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
666
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
667
  MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
668
  ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
669
  ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
670
  NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
671
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
672
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
673
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
674
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
675
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
676
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
677
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
678
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
679
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
680
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
681
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
682
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
683
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
684
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
685
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
686
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
687
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
688
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
689
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
690
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
691
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
692
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
693
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
694
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
695
  DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
696
  DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
697
  ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
698
};
699
 
700
/* The value of TARGET_ATTRIBUTE_TABLE.  */
701
static const struct attribute_spec mips_attribute_table[] = {
702
  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
703
       om_diagnostic } */
704
  { "long_call",   0, 0, false, true,  true,  NULL, false },
705
  { "far",         0, 0, false, true,  true,  NULL, false },
706
  { "near",        0, 0, false, true,  true,  NULL, false },
707
  /* We would really like to treat "mips16" and "nomips16" as type
708
     attributes, but GCC doesn't provide the hooks we need to support
709
     the right conversion rules.  As declaration attributes, they affect
710
     code generation but don't carry other semantics.  */
711
  { "mips16",      0, 0, true,  false, false, NULL, false },
712
  { "nomips16",    0, 0, true,  false, false, NULL, false },
713
  { "micromips",   0, 0, true,  false, false, NULL, false },
714
  { "nomicromips", 0, 0, true,  false, false, NULL, false },
715
  { "nocompression", 0, 0, true,  false, false, NULL, false },
716
  /* Allow functions to be specified as interrupt handlers */
717
  { "interrupt",   0, 0, false, true,  true, NULL, false },
718
  { "use_shadow_register_set",  0, 0, false, true,  true, NULL, false },
719
  { "keep_interrupts_masked",   0, 0, false, true,  true, NULL, false },
720
  { "use_debug_exception_return", 0, 0, false, true,  true, NULL, false },
721
  { NULL,          0, 0, false, false, false, NULL, false }
722
};
723
 
724
/* A table describing all the processors GCC knows about; see
725
   mips-cpus.def for details.  */
726
static const struct mips_cpu_info mips_cpu_info_table[] = {
727
#define MIPS_CPU(NAME, CPU, ISA, FLAGS) \
728
  { NAME, CPU, ISA, FLAGS },
729
#include "mips-cpus.def"
730
#undef MIPS_CPU
731
};
732
 
733
/* Default costs.  If these are used for a processor we should look
734
   up the actual costs.  */
735
#define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
736
                      COSTS_N_INSNS (7),  /* fp_mult_sf */   \
737
                      COSTS_N_INSNS (8),  /* fp_mult_df */   \
738
                      COSTS_N_INSNS (23), /* fp_div_sf */    \
739
                      COSTS_N_INSNS (36), /* fp_div_df */    \
740
                      COSTS_N_INSNS (10), /* int_mult_si */  \
741
                      COSTS_N_INSNS (10), /* int_mult_di */  \
742
                      COSTS_N_INSNS (69), /* int_div_si */   \
743
                      COSTS_N_INSNS (69), /* int_div_di */   \
744
                                       2, /* branch_cost */  \
745
                                       4  /* memory_latency */
746
 
747
/* Floating-point costs for processors without an FPU.  Just assume that
748
   all floating-point libcalls are very expensive.  */
749
#define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
750
                      COSTS_N_INSNS (256), /* fp_mult_sf */   \
751
                      COSTS_N_INSNS (256), /* fp_mult_df */   \
752
                      COSTS_N_INSNS (256), /* fp_div_sf */    \
753
                      COSTS_N_INSNS (256)  /* fp_div_df */
754
 
755
/* Costs to use when optimizing for size.  */
756
static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
757
  COSTS_N_INSNS (1),            /* fp_add */
758
  COSTS_N_INSNS (1),            /* fp_mult_sf */
759
  COSTS_N_INSNS (1),            /* fp_mult_df */
760
  COSTS_N_INSNS (1),            /* fp_div_sf */
761
  COSTS_N_INSNS (1),            /* fp_div_df */
762
  COSTS_N_INSNS (1),            /* int_mult_si */
763
  COSTS_N_INSNS (1),            /* int_mult_di */
764
  COSTS_N_INSNS (1),            /* int_div_si */
765
  COSTS_N_INSNS (1),            /* int_div_di */
766
                   2,           /* branch_cost */
767
                   4            /* memory_latency */
768
};
769
 
770
/* Costs to use when optimizing for speed, indexed by processor.  */
771
static const struct mips_rtx_cost_data
772
  mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
773
  { /* R3000 */
774
    COSTS_N_INSNS (2),            /* fp_add */
775
    COSTS_N_INSNS (4),            /* fp_mult_sf */
776
    COSTS_N_INSNS (5),            /* fp_mult_df */
777
    COSTS_N_INSNS (12),           /* fp_div_sf */
778
    COSTS_N_INSNS (19),           /* fp_div_df */
779
    COSTS_N_INSNS (12),           /* int_mult_si */
780
    COSTS_N_INSNS (12),           /* int_mult_di */
781
    COSTS_N_INSNS (35),           /* int_div_si */
782
    COSTS_N_INSNS (35),           /* int_div_di */
783
                     1,           /* branch_cost */
784
                     4            /* memory_latency */
785
  },
786
  { /* 4KC */
787
    SOFT_FP_COSTS,
788
    COSTS_N_INSNS (6),            /* int_mult_si */
789
    COSTS_N_INSNS (6),            /* int_mult_di */
790
    COSTS_N_INSNS (36),           /* int_div_si */
791
    COSTS_N_INSNS (36),           /* int_div_di */
792
                     1,           /* branch_cost */
793
                     4            /* memory_latency */
794
  },
795
  { /* 4KP */
796
    SOFT_FP_COSTS,
797
    COSTS_N_INSNS (36),           /* int_mult_si */
798
    COSTS_N_INSNS (36),           /* int_mult_di */
799
    COSTS_N_INSNS (37),           /* int_div_si */
800
    COSTS_N_INSNS (37),           /* int_div_di */
801
                     1,           /* branch_cost */
802
                     4            /* memory_latency */
803
  },
804
  { /* 5KC */
805
    SOFT_FP_COSTS,
806
    COSTS_N_INSNS (4),            /* int_mult_si */
807
    COSTS_N_INSNS (11),           /* int_mult_di */
808
    COSTS_N_INSNS (36),           /* int_div_si */
809
    COSTS_N_INSNS (68),           /* int_div_di */
810
                     1,           /* branch_cost */
811
                     4            /* memory_latency */
812
  },
813
  { /* 5KF */
814
    COSTS_N_INSNS (4),            /* fp_add */
815
    COSTS_N_INSNS (4),            /* fp_mult_sf */
816
    COSTS_N_INSNS (5),            /* fp_mult_df */
817
    COSTS_N_INSNS (17),           /* fp_div_sf */
818
    COSTS_N_INSNS (32),           /* fp_div_df */
819
    COSTS_N_INSNS (4),            /* int_mult_si */
820
    COSTS_N_INSNS (11),           /* int_mult_di */
821
    COSTS_N_INSNS (36),           /* int_div_si */
822
    COSTS_N_INSNS (68),           /* int_div_di */
823
                     1,           /* branch_cost */
824
                     4            /* memory_latency */
825
  },
826
  { /* 20KC */
827
    COSTS_N_INSNS (4),            /* fp_add */
828
    COSTS_N_INSNS (4),            /* fp_mult_sf */
829
    COSTS_N_INSNS (5),            /* fp_mult_df */
830
    COSTS_N_INSNS (17),           /* fp_div_sf */
831
    COSTS_N_INSNS (32),           /* fp_div_df */
832
    COSTS_N_INSNS (4),            /* int_mult_si */
833
    COSTS_N_INSNS (7),            /* int_mult_di */
834
    COSTS_N_INSNS (42),           /* int_div_si */
835
    COSTS_N_INSNS (72),           /* int_div_di */
836
                     1,           /* branch_cost */
837
                     4            /* memory_latency */
838
  },
839
  { /* 24KC */
840
    SOFT_FP_COSTS,
841
    COSTS_N_INSNS (5),            /* int_mult_si */
842
    COSTS_N_INSNS (5),            /* int_mult_di */
843
    COSTS_N_INSNS (41),           /* int_div_si */
844
    COSTS_N_INSNS (41),           /* int_div_di */
845
                     1,           /* branch_cost */
846
                     4            /* memory_latency */
847
  },
848
  { /* 24KF2_1 */
849
    COSTS_N_INSNS (8),            /* fp_add */
850
    COSTS_N_INSNS (8),            /* fp_mult_sf */
851
    COSTS_N_INSNS (10),           /* fp_mult_df */
852
    COSTS_N_INSNS (34),           /* fp_div_sf */
853
    COSTS_N_INSNS (64),           /* fp_div_df */
854
    COSTS_N_INSNS (5),            /* int_mult_si */
855
    COSTS_N_INSNS (5),            /* int_mult_di */
856
    COSTS_N_INSNS (41),           /* int_div_si */
857
    COSTS_N_INSNS (41),           /* int_div_di */
858
                     1,           /* branch_cost */
859
                     4            /* memory_latency */
860
  },
861
  { /* 24KF1_1 */
862
    COSTS_N_INSNS (4),            /* fp_add */
863
    COSTS_N_INSNS (4),            /* fp_mult_sf */
864
    COSTS_N_INSNS (5),            /* fp_mult_df */
865
    COSTS_N_INSNS (17),           /* fp_div_sf */
866
    COSTS_N_INSNS (32),           /* fp_div_df */
867
    COSTS_N_INSNS (5),            /* int_mult_si */
868
    COSTS_N_INSNS (5),            /* int_mult_di */
869
    COSTS_N_INSNS (41),           /* int_div_si */
870
    COSTS_N_INSNS (41),           /* int_div_di */
871
                     1,           /* branch_cost */
872
                     4            /* memory_latency */
873
  },
874
  { /* 74KC */
875
    SOFT_FP_COSTS,
876
    COSTS_N_INSNS (5),            /* int_mult_si */
877
    COSTS_N_INSNS (5),            /* int_mult_di */
878
    COSTS_N_INSNS (41),           /* int_div_si */
879
    COSTS_N_INSNS (41),           /* int_div_di */
880
                     1,           /* branch_cost */
881
                     4            /* memory_latency */
882
  },
883
  { /* 74KF2_1 */
884
    COSTS_N_INSNS (8),            /* fp_add */
885
    COSTS_N_INSNS (8),            /* fp_mult_sf */
886
    COSTS_N_INSNS (10),           /* fp_mult_df */
887
    COSTS_N_INSNS (34),           /* fp_div_sf */
888
    COSTS_N_INSNS (64),           /* fp_div_df */
889
    COSTS_N_INSNS (5),            /* int_mult_si */
890
    COSTS_N_INSNS (5),            /* int_mult_di */
891
    COSTS_N_INSNS (41),           /* int_div_si */
892
    COSTS_N_INSNS (41),           /* int_div_di */
893
                     1,           /* branch_cost */
894
                     4            /* memory_latency */
895
  },
896
  { /* 74KF1_1 */
897
    COSTS_N_INSNS (4),            /* fp_add */
898
    COSTS_N_INSNS (4),            /* fp_mult_sf */
899
    COSTS_N_INSNS (5),            /* fp_mult_df */
900
    COSTS_N_INSNS (17),           /* fp_div_sf */
901
    COSTS_N_INSNS (32),           /* fp_div_df */
902
    COSTS_N_INSNS (5),            /* int_mult_si */
903
    COSTS_N_INSNS (5),            /* int_mult_di */
904
    COSTS_N_INSNS (41),           /* int_div_si */
905
    COSTS_N_INSNS (41),           /* int_div_di */
906
                     1,           /* branch_cost */
907
                     4            /* memory_latency */
908
  },
909
  { /* 74KF3_2 */
910
    COSTS_N_INSNS (6),            /* fp_add */
911
    COSTS_N_INSNS (6),            /* fp_mult_sf */
912
    COSTS_N_INSNS (7),            /* fp_mult_df */
913
    COSTS_N_INSNS (25),           /* fp_div_sf */
914
    COSTS_N_INSNS (48),           /* fp_div_df */
915
    COSTS_N_INSNS (5),            /* int_mult_si */
916
    COSTS_N_INSNS (5),            /* int_mult_di */
917
    COSTS_N_INSNS (41),           /* int_div_si */
918
    COSTS_N_INSNS (41),           /* int_div_di */
919
                     1,           /* branch_cost */
920
                     4            /* memory_latency */
921
  },
922
  { /* Loongson-2E */
923
    DEFAULT_COSTS
924
  },
925
  { /* Loongson-2F */
926
    DEFAULT_COSTS
927
  },
928
  { /* Loongson-3A */
929
    DEFAULT_COSTS
930
  },
931
  { /* M4k */
932
    DEFAULT_COSTS
933
  },
934
    /* Octeon */
935
  {
936
    SOFT_FP_COSTS,
937
    COSTS_N_INSNS (5),            /* int_mult_si */
938
    COSTS_N_INSNS (5),            /* int_mult_di */
939
    COSTS_N_INSNS (72),           /* int_div_si */
940
    COSTS_N_INSNS (72),           /* int_div_di */
941
                     1,           /* branch_cost */
942
                     4            /* memory_latency */
943
  },
944
    /* Octeon II */
945
  {
946
    SOFT_FP_COSTS,
947
    COSTS_N_INSNS (6),            /* int_mult_si */
948
    COSTS_N_INSNS (6),            /* int_mult_di */
949
    COSTS_N_INSNS (18),           /* int_div_si */
950
    COSTS_N_INSNS (35),           /* int_div_di */
951
                     4,           /* branch_cost */
952
                     4            /* memory_latency */
953
  },
954
  { /* R3900 */
955
    COSTS_N_INSNS (2),            /* fp_add */
956
    COSTS_N_INSNS (4),            /* fp_mult_sf */
957
    COSTS_N_INSNS (5),            /* fp_mult_df */
958
    COSTS_N_INSNS (12),           /* fp_div_sf */
959
    COSTS_N_INSNS (19),           /* fp_div_df */
960
    COSTS_N_INSNS (2),            /* int_mult_si */
961
    COSTS_N_INSNS (2),            /* int_mult_di */
962
    COSTS_N_INSNS (35),           /* int_div_si */
963
    COSTS_N_INSNS (35),           /* int_div_di */
964
                     1,           /* branch_cost */
965
                     4            /* memory_latency */
966
  },
967
  { /* R6000 */
968
    COSTS_N_INSNS (3),            /* fp_add */
969
    COSTS_N_INSNS (5),            /* fp_mult_sf */
970
    COSTS_N_INSNS (6),            /* fp_mult_df */
971
    COSTS_N_INSNS (15),           /* fp_div_sf */
972
    COSTS_N_INSNS (16),           /* fp_div_df */
973
    COSTS_N_INSNS (17),           /* int_mult_si */
974
    COSTS_N_INSNS (17),           /* int_mult_di */
975
    COSTS_N_INSNS (38),           /* int_div_si */
976
    COSTS_N_INSNS (38),           /* int_div_di */
977
                     2,           /* branch_cost */
978
                     6            /* memory_latency */
979
  },
980
  { /* R4000 */
981
     COSTS_N_INSNS (6),           /* fp_add */
982
     COSTS_N_INSNS (7),           /* fp_mult_sf */
983
     COSTS_N_INSNS (8),           /* fp_mult_df */
984
     COSTS_N_INSNS (23),          /* fp_div_sf */
985
     COSTS_N_INSNS (36),          /* fp_div_df */
986
     COSTS_N_INSNS (10),          /* int_mult_si */
987
     COSTS_N_INSNS (10),          /* int_mult_di */
988
     COSTS_N_INSNS (69),          /* int_div_si */
989
     COSTS_N_INSNS (69),          /* int_div_di */
990
                      2,          /* branch_cost */
991
                      6           /* memory_latency */
992
  },
993
  { /* R4100 */
994
    DEFAULT_COSTS
995
  },
996
  { /* R4111 */
997
    DEFAULT_COSTS
998
  },
999
  { /* R4120 */
1000
    DEFAULT_COSTS
1001
  },
1002
  { /* R4130 */
1003
    /* The only costs that appear to be updated here are
1004
       integer multiplication.  */
1005
    SOFT_FP_COSTS,
1006
    COSTS_N_INSNS (4),            /* int_mult_si */
1007
    COSTS_N_INSNS (6),            /* int_mult_di */
1008
    COSTS_N_INSNS (69),           /* int_div_si */
1009
    COSTS_N_INSNS (69),           /* int_div_di */
1010
                     1,           /* branch_cost */
1011
                     4            /* memory_latency */
1012
  },
1013
  { /* R4300 */
1014
    DEFAULT_COSTS
1015
  },
1016
  { /* R4600 */
1017
    DEFAULT_COSTS
1018
  },
1019
  { /* R4650 */
1020
    DEFAULT_COSTS
1021
  },
1022
  { /* R4700 */
1023
    DEFAULT_COSTS
1024
  },
1025
  { /* R5000 */
1026
    COSTS_N_INSNS (6),            /* fp_add */
1027
    COSTS_N_INSNS (4),            /* fp_mult_sf */
1028
    COSTS_N_INSNS (5),            /* fp_mult_df */
1029
    COSTS_N_INSNS (23),           /* fp_div_sf */
1030
    COSTS_N_INSNS (36),           /* fp_div_df */
1031
    COSTS_N_INSNS (5),            /* int_mult_si */
1032
    COSTS_N_INSNS (5),            /* int_mult_di */
1033
    COSTS_N_INSNS (36),           /* int_div_si */
1034
    COSTS_N_INSNS (36),           /* int_div_di */
1035
                     1,           /* branch_cost */
1036
                     4            /* memory_latency */
1037
  },
1038
  { /* R5400 */
1039
    COSTS_N_INSNS (6),            /* fp_add */
1040
    COSTS_N_INSNS (5),            /* fp_mult_sf */
1041
    COSTS_N_INSNS (6),            /* fp_mult_df */
1042
    COSTS_N_INSNS (30),           /* fp_div_sf */
1043
    COSTS_N_INSNS (59),           /* fp_div_df */
1044
    COSTS_N_INSNS (3),            /* int_mult_si */
1045
    COSTS_N_INSNS (4),            /* int_mult_di */
1046
    COSTS_N_INSNS (42),           /* int_div_si */
1047
    COSTS_N_INSNS (74),           /* int_div_di */
1048
                     1,           /* branch_cost */
1049
                     4            /* memory_latency */
1050
  },
1051
  { /* R5500 */
1052
    COSTS_N_INSNS (6),            /* fp_add */
1053
    COSTS_N_INSNS (5),            /* fp_mult_sf */
1054
    COSTS_N_INSNS (6),            /* fp_mult_df */
1055
    COSTS_N_INSNS (30),           /* fp_div_sf */
1056
    COSTS_N_INSNS (59),           /* fp_div_df */
1057
    COSTS_N_INSNS (5),            /* int_mult_si */
1058
    COSTS_N_INSNS (9),            /* int_mult_di */
1059
    COSTS_N_INSNS (42),           /* int_div_si */
1060
    COSTS_N_INSNS (74),           /* int_div_di */
1061
                     1,           /* branch_cost */
1062
                     4            /* memory_latency */
1063
  },
1064
  { /* R5900 */
1065
    COSTS_N_INSNS (4),            /* fp_add */
1066
    COSTS_N_INSNS (4),            /* fp_mult_sf */
1067
    COSTS_N_INSNS (256),          /* fp_mult_df */
1068
    COSTS_N_INSNS (8),            /* fp_div_sf */
1069
    COSTS_N_INSNS (256),          /* fp_div_df */
1070
    COSTS_N_INSNS (4),            /* int_mult_si */
1071
    COSTS_N_INSNS (256),          /* int_mult_di */
1072
    COSTS_N_INSNS (37),           /* int_div_si */
1073
    COSTS_N_INSNS (256),          /* int_div_di */
1074
                     1,           /* branch_cost */
1075
                     4            /* memory_latency */
1076
  },
1077
  { /* R7000 */
1078
    /* The only costs that are changed here are
1079
       integer multiplication.  */
1080
    COSTS_N_INSNS (6),            /* fp_add */
1081
    COSTS_N_INSNS (7),            /* fp_mult_sf */
1082
    COSTS_N_INSNS (8),            /* fp_mult_df */
1083
    COSTS_N_INSNS (23),           /* fp_div_sf */
1084
    COSTS_N_INSNS (36),           /* fp_div_df */
1085
    COSTS_N_INSNS (5),            /* int_mult_si */
1086
    COSTS_N_INSNS (9),            /* int_mult_di */
1087
    COSTS_N_INSNS (69),           /* int_div_si */
1088
    COSTS_N_INSNS (69),           /* int_div_di */
1089
                     1,           /* branch_cost */
1090
                     4            /* memory_latency */
1091
  },
1092
  { /* R8000 */
1093
    DEFAULT_COSTS
1094
  },
1095
  { /* R9000 */
1096
    /* The only costs that are changed here are
1097
       integer multiplication.  */
1098
    COSTS_N_INSNS (6),            /* fp_add */
1099
    COSTS_N_INSNS (7),            /* fp_mult_sf */
1100
    COSTS_N_INSNS (8),            /* fp_mult_df */
1101
    COSTS_N_INSNS (23),           /* fp_div_sf */
1102
    COSTS_N_INSNS (36),           /* fp_div_df */
1103
    COSTS_N_INSNS (3),            /* int_mult_si */
1104
    COSTS_N_INSNS (8),            /* int_mult_di */
1105
    COSTS_N_INSNS (69),           /* int_div_si */
1106
    COSTS_N_INSNS (69),           /* int_div_di */
1107
                     1,           /* branch_cost */
1108
                     4            /* memory_latency */
1109
  },
1110
  { /* R1x000 */
1111
    COSTS_N_INSNS (2),            /* fp_add */
1112
    COSTS_N_INSNS (2),            /* fp_mult_sf */
1113
    COSTS_N_INSNS (2),            /* fp_mult_df */
1114
    COSTS_N_INSNS (12),           /* fp_div_sf */
1115
    COSTS_N_INSNS (19),           /* fp_div_df */
1116
    COSTS_N_INSNS (5),            /* int_mult_si */
1117
    COSTS_N_INSNS (9),            /* int_mult_di */
1118
    COSTS_N_INSNS (34),           /* int_div_si */
1119
    COSTS_N_INSNS (66),           /* int_div_di */
1120
                     1,           /* branch_cost */
1121
                     4            /* memory_latency */
1122
  },
1123
  { /* SB1 */
1124
    /* These costs are the same as the SB-1A below.  */
1125
    COSTS_N_INSNS (4),            /* fp_add */
1126
    COSTS_N_INSNS (4),            /* fp_mult_sf */
1127
    COSTS_N_INSNS (4),            /* fp_mult_df */
1128
    COSTS_N_INSNS (24),           /* fp_div_sf */
1129
    COSTS_N_INSNS (32),           /* fp_div_df */
1130
    COSTS_N_INSNS (3),            /* int_mult_si */
1131
    COSTS_N_INSNS (4),            /* int_mult_di */
1132
    COSTS_N_INSNS (36),           /* int_div_si */
1133
    COSTS_N_INSNS (68),           /* int_div_di */
1134
                     1,           /* branch_cost */
1135
                     4            /* memory_latency */
1136
  },
1137
  { /* SB1-A */
1138
    /* These costs are the same as the SB-1 above.  */
1139
    COSTS_N_INSNS (4),            /* fp_add */
1140
    COSTS_N_INSNS (4),            /* fp_mult_sf */
1141
    COSTS_N_INSNS (4),            /* fp_mult_df */
1142
    COSTS_N_INSNS (24),           /* fp_div_sf */
1143
    COSTS_N_INSNS (32),           /* fp_div_df */
1144
    COSTS_N_INSNS (3),            /* int_mult_si */
1145
    COSTS_N_INSNS (4),            /* int_mult_di */
1146
    COSTS_N_INSNS (36),           /* int_div_si */
1147
    COSTS_N_INSNS (68),           /* int_div_di */
1148
                     1,           /* branch_cost */
1149
                     4            /* memory_latency */
1150
  },
1151
  { /* SR71000 */
1152
    DEFAULT_COSTS
1153
  },
1154
  { /* XLR */
1155
    SOFT_FP_COSTS,
1156
    COSTS_N_INSNS (8),            /* int_mult_si */
1157
    COSTS_N_INSNS (8),            /* int_mult_di */
1158
    COSTS_N_INSNS (72),           /* int_div_si */
1159
    COSTS_N_INSNS (72),           /* int_div_di */
1160
                     1,           /* branch_cost */
1161
                     4            /* memory_latency */
1162
  },
1163
  { /* XLP */
1164
    /* These costs are the same as 5KF above.  */
1165
    COSTS_N_INSNS (4),            /* fp_add */
1166
    COSTS_N_INSNS (4),            /* fp_mult_sf */
1167
    COSTS_N_INSNS (5),            /* fp_mult_df */
1168
    COSTS_N_INSNS (17),           /* fp_div_sf */
1169
    COSTS_N_INSNS (32),           /* fp_div_df */
1170
    COSTS_N_INSNS (4),            /* int_mult_si */
1171
    COSTS_N_INSNS (11),           /* int_mult_di */
1172
    COSTS_N_INSNS (36),           /* int_div_si */
1173
    COSTS_N_INSNS (68),           /* int_div_di */
1174
                     1,           /* branch_cost */
1175
                     4            /* memory_latency */
1176
  }
1177
};
1178
 
1179
static rtx mips_find_pic_call_symbol (rtx, rtx, bool);
1180
static int mips_register_move_cost (enum machine_mode, reg_class_t,
1181
                                    reg_class_t);
1182
static unsigned int mips_function_arg_boundary (enum machine_mode, const_tree);
1183
 
1184
/* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1185
   for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1186
struct GTY (())  mflip_mips16_entry {
1187
  const char *name;
1188
  bool mips16_p;
1189
};
1190
static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1191
 
1192
/* Hash table callbacks for mflip_mips16_htab.  */
1193
 
1194
static hashval_t
1195
mflip_mips16_htab_hash (const void *entry)
1196
{
1197
  return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1198
}
1199
 
1200
static int
1201
mflip_mips16_htab_eq (const void *entry, const void *name)
1202
{
1203
  return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1204
                 (const char *) name) == 0;
1205
}
1206
 
1207
/* True if -mflip-mips16 should next add an attribute for the default MIPS16
1208
   mode, false if it should next add an attribute for the opposite mode.  */
1209
static GTY(()) bool mips16_flipper;
1210
 
1211
/* DECL is a function that needs a default "mips16" or "nomips16" attribute
1212
   for -mflip-mips16.  Return true if it should use "mips16" and false if
1213
   it should use "nomips16".  */
1214
 
1215
static bool
1216
mflip_mips16_use_mips16_p (tree decl)
1217
{
1218
  struct mflip_mips16_entry *entry;
1219
  const char *name;
1220
  hashval_t hash;
1221
  void **slot;
1222
  bool base_is_mips16 = (mips_base_compression_flags & MASK_MIPS16) != 0;
1223
 
1224
  /* Use the opposite of the command-line setting for anonymous decls.  */
1225
  if (!DECL_NAME (decl))
1226
    return !base_is_mips16;
1227
 
1228
  if (!mflip_mips16_htab)
1229
    mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1230
                                         mflip_mips16_htab_eq, NULL);
1231
 
1232
  name = IDENTIFIER_POINTER (DECL_NAME (decl));
1233
  hash = htab_hash_string (name);
1234
  slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1235
  entry = (struct mflip_mips16_entry *) *slot;
1236
  if (!entry)
1237
    {
1238
      mips16_flipper = !mips16_flipper;
1239
      entry = ggc_alloc_mflip_mips16_entry ();
1240
      entry->name = name;
1241
      entry->mips16_p = mips16_flipper ? !base_is_mips16 : base_is_mips16;
1242
      *slot = entry;
1243
    }
1244
  return entry->mips16_p;
1245
}
1246
 
1247
/* Predicates to test for presence of "near" and "far"/"long_call"
1248
   attributes on the given TYPE.  */
1249
 
1250
static bool
1251
mips_near_type_p (const_tree type)
1252
{
1253
  return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1254
}
1255
 
1256
static bool
1257
mips_far_type_p (const_tree type)
1258
{
1259
  return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1260
          || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1261
}
1262
 
1263
 
1264
/* Check if the interrupt attribute is set for a function.  */
1265
 
1266
static bool
1267
mips_interrupt_type_p (tree type)
1268
{
1269
  return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1270
}
1271
 
1272
/* Check if the attribute to use shadow register set is set for a function.  */
1273
 
1274
static bool
1275
mips_use_shadow_register_set_p (tree type)
1276
{
1277
  return lookup_attribute ("use_shadow_register_set",
1278
                           TYPE_ATTRIBUTES (type)) != NULL;
1279
}
1280
 
1281
/* Check if the attribute to keep interrupts masked is set for a function.  */
1282
 
1283
static bool
1284
mips_keep_interrupts_masked_p (tree type)
1285
{
1286
  return lookup_attribute ("keep_interrupts_masked",
1287
                           TYPE_ATTRIBUTES (type)) != NULL;
1288
}
1289
 
1290
/* Check if the attribute to use debug exception return is set for
1291
   a function.  */
1292
 
1293
static bool
1294
mips_use_debug_exception_return_p (tree type)
1295
{
1296
  return lookup_attribute ("use_debug_exception_return",
1297
                           TYPE_ATTRIBUTES (type)) != NULL;
1298
}
1299
 
1300
/* Return the set of compression modes that are explicitly required
1301
   by the attributes in ATTRIBUTES.  */
1302
 
1303
static unsigned int
1304
mips_get_compress_on_flags (tree attributes)
1305
{
1306
  unsigned int flags = 0;
1307
 
1308
  if (lookup_attribute ("mips16", attributes) != NULL)
1309
    flags |= MASK_MIPS16;
1310
 
1311
  if (lookup_attribute ("micromips", attributes) != NULL)
1312
    flags |= MASK_MICROMIPS;
1313
 
1314
  return flags;
1315
}
1316
 
1317
/* Return the set of compression modes that are explicitly forbidden
1318
   by the attributes in ATTRIBUTES.  */
1319
 
1320
static unsigned int
1321
mips_get_compress_off_flags (tree attributes)
1322
{
1323
  unsigned int flags = 0;
1324
 
1325
  if (lookup_attribute ("nocompression", attributes) != NULL)
1326
    flags |= MASK_MIPS16 | MASK_MICROMIPS;
1327
 
1328
  if (lookup_attribute ("nomips16", attributes) != NULL)
1329
    flags |= MASK_MIPS16;
1330
 
1331
  if (lookup_attribute ("nomicromips", attributes) != NULL)
1332
    flags |= MASK_MICROMIPS;
1333
 
1334
  return flags;
1335
}
1336
 
1337
/* Return the compression mode that should be used for function DECL.
1338
   Return the ambient setting if DECL is null.  */
1339
 
1340
static unsigned int
1341
mips_get_compress_mode (tree decl)
1342
{
1343
  unsigned int flags, force_on;
1344
 
1345
  flags = mips_base_compression_flags;
1346
  if (decl)
1347
    {
1348
      /* Nested functions must use the same frame pointer as their
1349
         parent and must therefore use the same ISA mode.  */
1350
      tree parent = decl_function_context (decl);
1351
      if (parent)
1352
        decl = parent;
1353
      force_on = mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1354
      if (force_on)
1355
        return force_on;
1356
      flags &= ~mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1357
    }
1358
  return flags;
1359
}
1360
 
1361
/* Return the attribute name associated with MASK_MIPS16 and MASK_MICROMIPS
1362
   flags FLAGS.  */
1363
 
1364
static const char *
1365
mips_get_compress_on_name (unsigned int flags)
1366
{
1367
  if (flags == MASK_MIPS16)
1368
    return "mips16";
1369
  return "micromips";
1370
}
1371
 
1372
/* Return the attribute name that forbids MASK_MIPS16 and MASK_MICROMIPS
1373
   flags FLAGS.  */
1374
 
1375
static const char *
1376
mips_get_compress_off_name (unsigned int flags)
1377
{
1378
  if (flags == MASK_MIPS16)
1379
    return "nomips16";
1380
  if (flags == MASK_MICROMIPS)
1381
    return "nomicromips";
1382
  return "nocompression";
1383
}
1384
 
1385
/* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1386
 
1387
static int
1388
mips_comp_type_attributes (const_tree type1, const_tree type2)
1389
{
1390
  /* Disallow mixed near/far attributes.  */
1391
  if (mips_far_type_p (type1) && mips_near_type_p (type2))
1392
    return 0;
1393
  if (mips_near_type_p (type1) && mips_far_type_p (type2))
1394
    return 0;
1395
  return 1;
1396
}
1397
 
1398
/* Implement TARGET_INSERT_ATTRIBUTES.  */
1399
 
1400
static void
1401
mips_insert_attributes (tree decl, tree *attributes)
1402
{
1403
  const char *name;
1404
  unsigned int compression_flags, nocompression_flags;
1405
 
1406
  /* Check for "mips16" and "nomips16" attributes.  */
1407
  compression_flags = mips_get_compress_on_flags (*attributes);
1408
  nocompression_flags = mips_get_compress_off_flags (*attributes);
1409
 
1410
  if (TREE_CODE (decl) != FUNCTION_DECL)
1411
    {
1412
      if (nocompression_flags)
1413
        error ("%qs attribute only applies to functions",
1414
               mips_get_compress_off_name (nocompression_flags));
1415
 
1416
      if (compression_flags)
1417
        error ("%qs attribute only applies to functions",
1418
               mips_get_compress_on_name (nocompression_flags));
1419
    }
1420
  else
1421
    {
1422
      compression_flags |= mips_get_compress_on_flags (DECL_ATTRIBUTES (decl));
1423
      nocompression_flags |=
1424
        mips_get_compress_off_flags (DECL_ATTRIBUTES (decl));
1425
 
1426
      if (compression_flags && nocompression_flags)
1427
        error ("%qE cannot have both %qs and %qs attributes",
1428
               DECL_NAME (decl), mips_get_compress_on_name (compression_flags),
1429
               mips_get_compress_off_name (nocompression_flags));
1430
 
1431
      if (compression_flags & MASK_MIPS16
1432
          && compression_flags & MASK_MICROMIPS)
1433
        error ("%qE cannot have both %qs and %qs attributes",
1434
               DECL_NAME (decl), "mips16", "micromips");
1435
 
1436
      if (TARGET_FLIP_MIPS16
1437
          && !DECL_ARTIFICIAL (decl)
1438
          && compression_flags == 0
1439
          && nocompression_flags == 0)
1440
        {
1441
          /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1442
             "mips16" attribute, arbitrarily pick one.  We must pick the same
1443
             setting for duplicate declarations of a function.  */
1444
          name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1445
          *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1446
          name = "nomicromips";
1447
          *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1448
        }
1449
    }
1450
}
1451
 
1452
/* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1453
 
1454
static tree
1455
mips_merge_decl_attributes (tree olddecl, tree newdecl)
1456
{
1457
  unsigned int diff;
1458
 
1459
  diff = (mips_get_compress_on_flags (DECL_ATTRIBUTES (olddecl))
1460
          ^ mips_get_compress_on_flags (DECL_ATTRIBUTES (newdecl)));
1461
  if (diff)
1462
    error ("%qE redeclared with conflicting %qs attributes",
1463
           DECL_NAME (newdecl), mips_get_compress_on_name (diff));
1464
 
1465
  diff = (mips_get_compress_off_flags (DECL_ATTRIBUTES (olddecl))
1466
          ^ mips_get_compress_off_flags (DECL_ATTRIBUTES (newdecl)));
1467
  if (diff)
1468
    error ("%qE redeclared with conflicting %qs attributes",
1469
           DECL_NAME (newdecl), mips_get_compress_off_name (diff));
1470
 
1471
  return merge_attributes (DECL_ATTRIBUTES (olddecl),
1472
                           DECL_ATTRIBUTES (newdecl));
1473
}
1474
 
1475
/* Implement TARGET_CAN_INLINE_P.  */
1476
 
1477
static bool
1478
mips_can_inline_p (tree caller, tree callee)
1479
{
1480
  if (mips_get_compress_mode (callee) != mips_get_compress_mode (caller))
1481
    return false;
1482
  return default_target_can_inline_p (caller, callee);
1483
}
1484
 
1485
/* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1486
   and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1487
 
1488
static void
1489
mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1490
{
1491
  if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1492
    {
1493
      *base_ptr = XEXP (x, 0);
1494
      *offset_ptr = INTVAL (XEXP (x, 1));
1495
    }
1496
  else
1497
    {
1498
      *base_ptr = x;
1499
      *offset_ptr = 0;
1500
    }
1501
}
1502
 
1503
static unsigned int mips_build_integer (struct mips_integer_op *,
1504
                                        unsigned HOST_WIDE_INT);
1505
 
1506
/* A subroutine of mips_build_integer, with the same interface.
1507
   Assume that the final action in the sequence should be a left shift.  */
1508
 
1509
static unsigned int
1510
mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1511
{
1512
  unsigned int i, shift;
1513
 
1514
  /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1515
     since signed numbers are easier to load than unsigned ones.  */
1516
  shift = 0;
1517
  while ((value & 1) == 0)
1518
    value /= 2, shift++;
1519
 
1520
  i = mips_build_integer (codes, value);
1521
  codes[i].code = ASHIFT;
1522
  codes[i].value = shift;
1523
  return i + 1;
1524
}
1525
 
1526
/* As for mips_build_shift, but assume that the final action will be
1527
   an IOR or PLUS operation.  */
1528
 
1529
static unsigned int
1530
mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1531
{
1532
  unsigned HOST_WIDE_INT high;
1533
  unsigned int i;
1534
 
1535
  high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1536
  if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1537
    {
1538
      /* The constant is too complex to load with a simple LUI/ORI pair,
1539
         so we want to give the recursive call as many trailing zeros as
1540
         possible.  In this case, we know bit 16 is set and that the
1541
         low 16 bits form a negative number.  If we subtract that number
1542
         from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1543
      i = mips_build_integer (codes, CONST_HIGH_PART (value));
1544
      codes[i].code = PLUS;
1545
      codes[i].value = CONST_LOW_PART (value);
1546
    }
1547
  else
1548
    {
1549
      /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1550
         bits gives a value with at least 17 trailing zeros.  */
1551
      i = mips_build_integer (codes, high);
1552
      codes[i].code = IOR;
1553
      codes[i].value = value & 0xffff;
1554
    }
1555
  return i + 1;
1556
}
1557
 
1558
/* Fill CODES with a sequence of rtl operations to load VALUE.
1559
   Return the number of operations needed.  */
1560
 
1561
static unsigned int
1562
mips_build_integer (struct mips_integer_op *codes,
1563
                    unsigned HOST_WIDE_INT value)
1564
{
1565
  if (SMALL_OPERAND (value)
1566
      || SMALL_OPERAND_UNSIGNED (value)
1567
      || LUI_OPERAND (value))
1568
    {
1569
      /* The value can be loaded with a single instruction.  */
1570
      codes[0].code = UNKNOWN;
1571
      codes[0].value = value;
1572
      return 1;
1573
    }
1574
  else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1575
    {
1576
      /* Either the constant is a simple LUI/ORI combination or its
1577
         lowest bit is set.  We don't want to shift in this case.  */
1578
      return mips_build_lower (codes, value);
1579
    }
1580
  else if ((value & 0xffff) == 0)
1581
    {
1582
      /* The constant will need at least three actions.  The lowest
1583
         16 bits are clear, so the final action will be a shift.  */
1584
      return mips_build_shift (codes, value);
1585
    }
1586
  else
1587
    {
1588
      /* The final action could be a shift, add or inclusive OR.
1589
         Rather than use a complex condition to select the best
1590
         approach, try both mips_build_shift and mips_build_lower
1591
         and pick the one that gives the shortest sequence.
1592
         Note that this case is only used once per constant.  */
1593
      struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1594
      unsigned int cost, alt_cost;
1595
 
1596
      cost = mips_build_shift (codes, value);
1597
      alt_cost = mips_build_lower (alt_codes, value);
1598
      if (alt_cost < cost)
1599
        {
1600
          memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1601
          cost = alt_cost;
1602
        }
1603
      return cost;
1604
    }
1605
}
1606
 
1607
/* Implement TARGET_LEGITIMATE_CONSTANT_P.  */
1608
 
1609
static bool
1610
mips_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1611
{
1612
  return mips_const_insns (x) > 0;
1613
}
1614
 
1615
/* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
1616
 
1617
static rtx
1618
mips16_stub_function (const char *name)
1619
{
1620
  rtx x;
1621
 
1622
  x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
1623
  SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
1624
  return x;
1625
}
1626
 
1627
/* Return a legitimate call address for STUB, given that STUB is a MIPS16
1628
   support function.  */
1629
 
1630
static rtx
1631
mips16_stub_call_address (mips_one_only_stub *stub)
1632
{
1633
  rtx fn = mips16_stub_function (stub->get_name ());
1634
  SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_LOCAL;
1635
  if (!call_insn_operand (fn, VOIDmode))
1636
    fn = force_reg (Pmode, fn);
1637
  return fn;
1638
}
1639
 
1640
/* A stub for moving the thread pointer into TLS_GET_TP_REGNUM.  */
1641
 
1642
class mips16_rdhwr_one_only_stub : public mips_one_only_stub
1643
{
1644
  virtual const char *get_name ();
1645
  virtual void output_body ();
1646
};
1647
 
1648
const char *
1649
mips16_rdhwr_one_only_stub::get_name ()
1650
{
1651
  return "__mips16_rdhwr";
1652
}
1653
 
1654
void
1655
mips16_rdhwr_one_only_stub::output_body ()
1656
{
1657
  fprintf (asm_out_file,
1658
           "\t.set\tpush\n"
1659
           "\t.set\tmips32r2\n"
1660
           "\t.set\tnoreorder\n"
1661
           "\trdhwr\t$3,$29\n"
1662
           "\t.set\tpop\n"
1663
           "\tj\t$31\n");
1664
}
1665
 
1666
/* A stub for moving the FCSR into GET_FCSR_REGNUM.  */
1667
class mips16_get_fcsr_one_only_stub : public mips_one_only_stub
1668
{
1669
  virtual const char *get_name ();
1670
  virtual void output_body ();
1671
};
1672
 
1673
const char *
1674
mips16_get_fcsr_one_only_stub::get_name ()
1675
{
1676
  return "__mips16_get_fcsr";
1677
}
1678
 
1679
void
1680
mips16_get_fcsr_one_only_stub::output_body ()
1681
{
1682
  fprintf (asm_out_file,
1683
           "\tcfc1\t%s,$31\n"
1684
           "\tj\t$31\n", reg_names[GET_FCSR_REGNUM]);
1685
}
1686
 
1687
/* A stub for moving SET_FCSR_REGNUM into the FCSR.  */
1688
class mips16_set_fcsr_one_only_stub : public mips_one_only_stub
1689
{
1690
  virtual const char *get_name ();
1691
  virtual void output_body ();
1692
};
1693
 
1694
const char *
1695
mips16_set_fcsr_one_only_stub::get_name ()
1696
{
1697
  return "__mips16_set_fcsr";
1698
}
1699
 
1700
void
1701
mips16_set_fcsr_one_only_stub::output_body ()
1702
{
1703
  fprintf (asm_out_file,
1704
           "\tctc1\t%s,$31\n"
1705
           "\tj\t$31\n", reg_names[SET_FCSR_REGNUM]);
1706
}
1707
 
1708
/* Return true if symbols of type TYPE require a GOT access.  */
1709
 
1710
static bool
1711
mips_got_symbol_type_p (enum mips_symbol_type type)
1712
{
1713
  switch (type)
1714
    {
1715
    case SYMBOL_GOT_PAGE_OFST:
1716
    case SYMBOL_GOT_DISP:
1717
      return true;
1718
 
1719
    default:
1720
      return false;
1721
    }
1722
}
1723
 
1724
/* Return true if X is a thread-local symbol.  */
1725
 
1726
static bool
1727
mips_tls_symbol_p (rtx x)
1728
{
1729
  return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1730
}
1731
 
1732
/* Return true if SYMBOL_REF X is associated with a global symbol
1733
   (in the STB_GLOBAL sense).  */
1734
 
1735
static bool
1736
mips_global_symbol_p (const_rtx x)
1737
{
1738
  const_tree decl = SYMBOL_REF_DECL (x);
1739
 
1740
  if (!decl)
1741
    return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1742
 
1743
  /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1744
     or weak symbols.  Relocations in the object file will be against
1745
     the target symbol, so it's that symbol's binding that matters here.  */
1746
  return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1747
}
1748
 
1749
/* Return true if function X is a libgcc MIPS16 stub function.  */
1750
 
1751
static bool
1752
mips16_stub_function_p (const_rtx x)
1753
{
1754
  return (GET_CODE (x) == SYMBOL_REF
1755
          && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1756
}
1757
 
1758
/* Return true if function X is a locally-defined and locally-binding
1759
   MIPS16 function.  */
1760
 
1761
static bool
1762
mips16_local_function_p (const_rtx x)
1763
{
1764
  return (GET_CODE (x) == SYMBOL_REF
1765
          && SYMBOL_REF_LOCAL_P (x)
1766
          && !SYMBOL_REF_EXTERNAL_P (x)
1767
          && (mips_get_compress_mode (SYMBOL_REF_DECL (x)) & MASK_MIPS16));
1768
}
1769
 
1770
/* Return true if SYMBOL_REF X binds locally.  */
1771
 
1772
static bool
1773
mips_symbol_binds_local_p (const_rtx x)
1774
{
1775
  return (SYMBOL_REF_DECL (x)
1776
          ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1777
          : SYMBOL_REF_LOCAL_P (x));
1778
}
1779
 
1780
/* Return true if rtx constants of mode MODE should be put into a small
1781
   data section.  */
1782
 
1783
static bool
1784
mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1785
{
1786
  return (!TARGET_EMBEDDED_DATA
1787
          && TARGET_LOCAL_SDATA
1788
          && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1789
}
1790
 
1791
/* Return true if X should not be moved directly into register $25.
1792
   We need this because many versions of GAS will treat "la $25,foo" as
1793
   part of a call sequence and so allow a global "foo" to be lazily bound.  */
1794
 
1795
bool
1796
mips_dangerous_for_la25_p (rtx x)
1797
{
1798
  return (!TARGET_EXPLICIT_RELOCS
1799
          && TARGET_USE_GOT
1800
          && GET_CODE (x) == SYMBOL_REF
1801
          && mips_global_symbol_p (x));
1802
}
1803
 
1804
/* Return true if calls to X might need $25 to be valid on entry.  */
1805
 
1806
bool
1807
mips_use_pic_fn_addr_reg_p (const_rtx x)
1808
{
1809
  if (!TARGET_USE_PIC_FN_ADDR_REG)
1810
    return false;
1811
 
1812
  /* MIPS16 stub functions are guaranteed not to use $25.  */
1813
  if (mips16_stub_function_p (x))
1814
    return false;
1815
 
1816
  if (GET_CODE (x) == SYMBOL_REF)
1817
    {
1818
      /* If PLTs and copy relocations are available, the static linker
1819
         will make sure that $25 is valid on entry to the target function.  */
1820
      if (TARGET_ABICALLS_PIC0)
1821
        return false;
1822
 
1823
      /* Locally-defined functions use absolute accesses to set up
1824
         the global pointer.  */
1825
      if (TARGET_ABSOLUTE_ABICALLS
1826
          && mips_symbol_binds_local_p (x)
1827
          && !SYMBOL_REF_EXTERNAL_P (x))
1828
        return false;
1829
    }
1830
 
1831
  return true;
1832
}
1833
 
1834
/* Return the method that should be used to access SYMBOL_REF or
1835
   LABEL_REF X in context CONTEXT.  */
1836
 
1837
static enum mips_symbol_type
1838
mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1839
{
1840
  if (TARGET_RTP_PIC)
1841
    return SYMBOL_GOT_DISP;
1842
 
1843
  if (GET_CODE (x) == LABEL_REF)
1844
    {
1845
      /* Only return SYMBOL_PC_RELATIVE if we are generating MIPS16
1846
         code and if we know that the label is in the current function's
1847
         text section.  LABEL_REFs are used for jump tables as well as
1848
         text labels, so we must check whether jump tables live in the
1849
         text section.  */
1850
      if (TARGET_MIPS16_SHORT_JUMP_TABLES
1851
          && !LABEL_REF_NONLOCAL_P (x))
1852
        return SYMBOL_PC_RELATIVE;
1853
 
1854
      if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1855
        return SYMBOL_GOT_PAGE_OFST;
1856
 
1857
      return SYMBOL_ABSOLUTE;
1858
    }
1859
 
1860
  gcc_assert (GET_CODE (x) == SYMBOL_REF);
1861
 
1862
  if (SYMBOL_REF_TLS_MODEL (x))
1863
    return SYMBOL_TLS;
1864
 
1865
  if (CONSTANT_POOL_ADDRESS_P (x))
1866
    {
1867
      if (TARGET_MIPS16_TEXT_LOADS)
1868
        return SYMBOL_PC_RELATIVE;
1869
 
1870
      if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1871
        return SYMBOL_PC_RELATIVE;
1872
 
1873
      if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1874
        return SYMBOL_GP_RELATIVE;
1875
    }
1876
 
1877
  /* Do not use small-data accesses for weak symbols; they may end up
1878
     being zero.  */
1879
  if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1880
    return SYMBOL_GP_RELATIVE;
1881
 
1882
  /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1883
     is in effect.  */
1884
  if (TARGET_ABICALLS_PIC2
1885
      && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1886
    {
1887
      /* There are three cases to consider:
1888
 
1889
            - o32 PIC (either with or without explicit relocs)
1890
            - n32/n64 PIC without explicit relocs
1891
            - n32/n64 PIC with explicit relocs
1892
 
1893
         In the first case, both local and global accesses will use an
1894
         R_MIPS_GOT16 relocation.  We must correctly predict which of
1895
         the two semantics (local or global) the assembler and linker
1896
         will apply.  The choice depends on the symbol's binding rather
1897
         than its visibility.
1898
 
1899
         In the second case, the assembler will not use R_MIPS_GOT16
1900
         relocations, but it chooses between local and global accesses
1901
         in the same way as for o32 PIC.
1902
 
1903
         In the third case we have more freedom since both forms of
1904
         access will work for any kind of symbol.  However, there seems
1905
         little point in doing things differently.  */
1906
      if (mips_global_symbol_p (x))
1907
        return SYMBOL_GOT_DISP;
1908
 
1909
      return SYMBOL_GOT_PAGE_OFST;
1910
    }
1911
 
1912
  return SYMBOL_ABSOLUTE;
1913
}
1914
 
1915
/* Classify the base of symbolic expression X, given that X appears in
1916
   context CONTEXT.  */
1917
 
1918
static enum mips_symbol_type
1919
mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1920
{
1921
  rtx offset;
1922
 
1923
  split_const (x, &x, &offset);
1924
  if (UNSPEC_ADDRESS_P (x))
1925
    return UNSPEC_ADDRESS_TYPE (x);
1926
 
1927
  return mips_classify_symbol (x, context);
1928
}
1929
 
1930
/* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1931
   is the alignment in bytes of SYMBOL_REF X.  */
1932
 
1933
static bool
1934
mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1935
{
1936
  HOST_WIDE_INT align;
1937
 
1938
  align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1939
  return IN_RANGE (offset, 0, align - 1);
1940
}
1941
 
1942
/* Return true if X is a symbolic constant that can be used in context
1943
   CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1944
 
1945
bool
1946
mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1947
                          enum mips_symbol_type *symbol_type)
1948
{
1949
  rtx offset;
1950
 
1951
  split_const (x, &x, &offset);
1952
  if (UNSPEC_ADDRESS_P (x))
1953
    {
1954
      *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1955
      x = UNSPEC_ADDRESS (x);
1956
    }
1957
  else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1958
    {
1959
      *symbol_type = mips_classify_symbol (x, context);
1960
      if (*symbol_type == SYMBOL_TLS)
1961
        return false;
1962
    }
1963
  else
1964
    return false;
1965
 
1966
  if (offset == const0_rtx)
1967
    return true;
1968
 
1969
  /* Check whether a nonzero offset is valid for the underlying
1970
     relocations.  */
1971
  switch (*symbol_type)
1972
    {
1973
    case SYMBOL_ABSOLUTE:
1974
    case SYMBOL_64_HIGH:
1975
    case SYMBOL_64_MID:
1976
    case SYMBOL_64_LOW:
1977
      /* If the target has 64-bit pointers and the object file only
1978
         supports 32-bit symbols, the values of those symbols will be
1979
         sign-extended.  In this case we can't allow an arbitrary offset
1980
         in case the 32-bit value X + OFFSET has a different sign from X.  */
1981
      if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1982
        return offset_within_block_p (x, INTVAL (offset));
1983
 
1984
      /* In other cases the relocations can handle any offset.  */
1985
      return true;
1986
 
1987
    case SYMBOL_PC_RELATIVE:
1988
      /* Allow constant pool references to be converted to LABEL+CONSTANT.
1989
         In this case, we no longer have access to the underlying constant,
1990
         but the original symbol-based access was known to be valid.  */
1991
      if (GET_CODE (x) == LABEL_REF)
1992
        return true;
1993
 
1994
      /* Fall through.  */
1995
 
1996
    case SYMBOL_GP_RELATIVE:
1997
      /* Make sure that the offset refers to something within the
1998
         same object block.  This should guarantee that the final
1999
         PC- or GP-relative offset is within the 16-bit limit.  */
2000
      return offset_within_block_p (x, INTVAL (offset));
2001
 
2002
    case SYMBOL_GOT_PAGE_OFST:
2003
    case SYMBOL_GOTOFF_PAGE:
2004
      /* If the symbol is global, the GOT entry will contain the symbol's
2005
         address, and we will apply a 16-bit offset after loading it.
2006
         If the symbol is local, the linker should provide enough local
2007
         GOT entries for a 16-bit offset, but larger offsets may lead
2008
         to GOT overflow.  */
2009
      return SMALL_INT (offset);
2010
 
2011
    case SYMBOL_TPREL:
2012
    case SYMBOL_DTPREL:
2013
      /* There is no carry between the HI and LO REL relocations, so the
2014
         offset is only valid if we know it won't lead to such a carry.  */
2015
      return mips_offset_within_alignment_p (x, INTVAL (offset));
2016
 
2017
    case SYMBOL_GOT_DISP:
2018
    case SYMBOL_GOTOFF_DISP:
2019
    case SYMBOL_GOTOFF_CALL:
2020
    case SYMBOL_GOTOFF_LOADGP:
2021
    case SYMBOL_TLSGD:
2022
    case SYMBOL_TLSLDM:
2023
    case SYMBOL_GOTTPREL:
2024
    case SYMBOL_TLS:
2025
    case SYMBOL_HALF:
2026
      return false;
2027
    }
2028
  gcc_unreachable ();
2029
}
2030
 
2031
/* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
2032
   single instruction.  We rely on the fact that, in the worst case,
2033
   all instructions involved in a MIPS16 address calculation are usually
2034
   extended ones.  */
2035
 
2036
static int
2037
mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
2038
{
2039
  if (mips_use_pcrel_pool_p[(int) type])
2040
    {
2041
      if (mode == MAX_MACHINE_MODE)
2042
        /* LEAs will be converted into constant-pool references by
2043
           mips_reorg.  */
2044
        type = SYMBOL_PC_RELATIVE;
2045
      else
2046
        /* The constant must be loaded and then dereferenced.  */
2047
        return 0;
2048
    }
2049
 
2050
  switch (type)
2051
    {
2052
    case SYMBOL_ABSOLUTE:
2053
      /* When using 64-bit symbols, we need 5 preparatory instructions,
2054
         such as:
2055
 
2056
             lui     $at,%highest(symbol)
2057
             daddiu  $at,$at,%higher(symbol)
2058
             dsll    $at,$at,16
2059
             daddiu  $at,$at,%hi(symbol)
2060
             dsll    $at,$at,16
2061
 
2062
         The final address is then $at + %lo(symbol).  With 32-bit
2063
         symbols we just need a preparatory LUI for normal mode and
2064
         a preparatory LI and SLL for MIPS16.  */
2065
      return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
2066
 
2067
    case SYMBOL_GP_RELATIVE:
2068
      /* Treat GP-relative accesses as taking a single instruction on
2069
         MIPS16 too; the copy of $gp can often be shared.  */
2070
      return 1;
2071
 
2072
    case SYMBOL_PC_RELATIVE:
2073
      /* PC-relative constants can be only be used with ADDIUPC,
2074
         DADDIUPC, LWPC and LDPC.  */
2075
      if (mode == MAX_MACHINE_MODE
2076
          || GET_MODE_SIZE (mode) == 4
2077
          || GET_MODE_SIZE (mode) == 8)
2078
        return 1;
2079
 
2080
      /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
2081
      return 0;
2082
 
2083
    case SYMBOL_GOT_DISP:
2084
      /* The constant will have to be loaded from the GOT before it
2085
         is used in an address.  */
2086
      if (mode != MAX_MACHINE_MODE)
2087
        return 0;
2088
 
2089
      /* Fall through.  */
2090
 
2091
    case SYMBOL_GOT_PAGE_OFST:
2092
      /* Unless -funit-at-a-time is in effect, we can't be sure whether the
2093
         local/global classification is accurate.  The worst cases are:
2094
 
2095
         (1) For local symbols when generating o32 or o64 code.  The assembler
2096
             will use:
2097
 
2098
                 lw           $at,%got(symbol)
2099
                 nop
2100
 
2101
             ...and the final address will be $at + %lo(symbol).
2102
 
2103
         (2) For global symbols when -mxgot.  The assembler will use:
2104
 
2105
                 lui     $at,%got_hi(symbol)
2106
                 (d)addu $at,$at,$gp
2107
 
2108
             ...and the final address will be $at + %got_lo(symbol).  */
2109
      return 3;
2110
 
2111
    case SYMBOL_GOTOFF_PAGE:
2112
    case SYMBOL_GOTOFF_DISP:
2113
    case SYMBOL_GOTOFF_CALL:
2114
    case SYMBOL_GOTOFF_LOADGP:
2115
    case SYMBOL_64_HIGH:
2116
    case SYMBOL_64_MID:
2117
    case SYMBOL_64_LOW:
2118
    case SYMBOL_TLSGD:
2119
    case SYMBOL_TLSLDM:
2120
    case SYMBOL_DTPREL:
2121
    case SYMBOL_GOTTPREL:
2122
    case SYMBOL_TPREL:
2123
    case SYMBOL_HALF:
2124
      /* A 16-bit constant formed by a single relocation, or a 32-bit
2125
         constant formed from a high 16-bit relocation and a low 16-bit
2126
         relocation.  Use mips_split_p to determine which.  32-bit
2127
         constants need an "lui; addiu" sequence for normal mode and
2128
         an "li; sll; addiu" sequence for MIPS16 mode.  */
2129
      return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
2130
 
2131
    case SYMBOL_TLS:
2132
      /* We don't treat a bare TLS symbol as a constant.  */
2133
      return 0;
2134
    }
2135
  gcc_unreachable ();
2136
}
2137
 
2138
/* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
2139
   to load symbols of type TYPE into a register.  Return 0 if the given
2140
   type of symbol cannot be used as an immediate operand.
2141
 
2142
   Otherwise, return the number of instructions needed to load or store
2143
   values of mode MODE to or from addresses of type TYPE.  Return 0 if
2144
   the given type of symbol is not valid in addresses.
2145
 
2146
   In both cases, instruction counts are based off BASE_INSN_LENGTH.  */
2147
 
2148
static int
2149
mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
2150
{
2151
  return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
2152
}
2153
 
2154
/* A for_each_rtx callback.  Stop the search if *X references a
2155
   thread-local symbol.  */
2156
 
2157
static int
2158
mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
2159
{
2160
  return mips_tls_symbol_p (*x);
2161
}
2162
 
2163
/* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
2164
 
2165
static bool
2166
mips_cannot_force_const_mem (enum machine_mode mode, rtx x)
2167
{
2168
  enum mips_symbol_type type;
2169
  rtx base, offset;
2170
 
2171
  /* There is no assembler syntax for expressing an address-sized
2172
     high part.  */
2173
  if (GET_CODE (x) == HIGH)
2174
    return true;
2175
 
2176
  /* As an optimization, reject constants that mips_legitimize_move
2177
     can expand inline.
2178
 
2179
     Suppose we have a multi-instruction sequence that loads constant C
2180
     into register R.  If R does not get allocated a hard register, and
2181
     R is used in an operand that allows both registers and memory
2182
     references, reload will consider forcing C into memory and using
2183
     one of the instruction's memory alternatives.  Returning false
2184
     here will force it to use an input reload instead.  */
2185
  if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x))
2186
    return true;
2187
 
2188
  split_const (x, &base, &offset);
2189
  if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type))
2190
    {
2191
      /* See whether we explicitly want these symbols in the pool.  */
2192
      if (mips_use_pcrel_pool_p[(int) type])
2193
        return false;
2194
 
2195
      /* The same optimization as for CONST_INT.  */
2196
      if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
2197
        return true;
2198
 
2199
      /* If MIPS16 constant pools live in the text section, they should
2200
         not refer to anything that might need run-time relocation.  */
2201
      if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
2202
        return true;
2203
    }
2204
 
2205
  /* TLS symbols must be computed by mips_legitimize_move.  */
2206
  if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
2207
    return true;
2208
 
2209
  return false;
2210
}
2211
 
2212
/* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
2213
   constants when we're using a per-function constant pool.  */
2214
 
2215
static bool
2216
mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
2217
                                const_rtx x ATTRIBUTE_UNUSED)
2218
{
2219
  return !TARGET_MIPS16_PCREL_LOADS;
2220
}
2221
 
2222
/* Return true if register REGNO is a valid base register for mode MODE.
2223
   STRICT_P is true if REG_OK_STRICT is in effect.  */
2224
 
2225
int
2226
mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
2227
                               bool strict_p)
2228
{
2229
  if (!HARD_REGISTER_NUM_P (regno))
2230
    {
2231
      if (!strict_p)
2232
        return true;
2233
      regno = reg_renumber[regno];
2234
    }
2235
 
2236
  /* These fake registers will be eliminated to either the stack or
2237
     hard frame pointer, both of which are usually valid base registers.
2238
     Reload deals with the cases where the eliminated form isn't valid.  */
2239
  if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2240
    return true;
2241
 
2242
  /* In MIPS16 mode, the stack pointer can only address word and doubleword
2243
     values, nothing smaller.  There are two problems here:
2244
 
2245
       (a) Instantiating virtual registers can introduce new uses of the
2246
           stack pointer.  If these virtual registers are valid addresses,
2247
           the stack pointer should be too.
2248
 
2249
       (b) Most uses of the stack pointer are not made explicit until
2250
           FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2251
           We don't know until that stage whether we'll be eliminating to the
2252
           stack pointer (which needs the restriction) or the hard frame
2253
           pointer (which doesn't).
2254
 
2255
     All in all, it seems more consistent to only enforce this restriction
2256
     during and after reload.  */
2257
  if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2258
    return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2259
 
2260
  return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2261
}
2262
 
2263
/* Return true if X is a valid base register for mode MODE.
2264
   STRICT_P is true if REG_OK_STRICT is in effect.  */
2265
 
2266
static bool
2267
mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2268
{
2269
  if (!strict_p && GET_CODE (x) == SUBREG)
2270
    x = SUBREG_REG (x);
2271
 
2272
  return (REG_P (x)
2273
          && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2274
}
2275
 
2276
/* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2277
   can address a value of mode MODE.  */
2278
 
2279
static bool
2280
mips_valid_offset_p (rtx x, enum machine_mode mode)
2281
{
2282
  /* Check that X is a signed 16-bit number.  */
2283
  if (!const_arith_operand (x, Pmode))
2284
    return false;
2285
 
2286
  /* We may need to split multiword moves, so make sure that every word
2287
     is accessible.  */
2288
  if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2289
      && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2290
    return false;
2291
 
2292
  return true;
2293
}
2294
 
2295
/* Return true if a LO_SUM can address a value of mode MODE when the
2296
   LO_SUM symbol has type SYMBOL_TYPE.  */
2297
 
2298
static bool
2299
mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2300
{
2301
  /* Check that symbols of type SYMBOL_TYPE can be used to access values
2302
     of mode MODE.  */
2303
  if (mips_symbol_insns (symbol_type, mode) == 0)
2304
    return false;
2305
 
2306
  /* Check that there is a known low-part relocation.  */
2307
  if (mips_lo_relocs[symbol_type] == NULL)
2308
    return false;
2309
 
2310
  /* We may need to split multiword moves, so make sure that each word
2311
     can be accessed without inducing a carry.  This is mainly needed
2312
     for o64, which has historically only guaranteed 64-bit alignment
2313
     for 128-bit types.  */
2314
  if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2315
      && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2316
    return false;
2317
 
2318
  return true;
2319
}
2320
 
2321
/* Return true if X is a valid address for machine mode MODE.  If it is,
2322
   fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2323
   effect.  */
2324
 
2325
static bool
2326
mips_classify_address (struct mips_address_info *info, rtx x,
2327
                       enum machine_mode mode, bool strict_p)
2328
{
2329
  switch (GET_CODE (x))
2330
    {
2331
    case REG:
2332
    case SUBREG:
2333
      info->type = ADDRESS_REG;
2334
      info->reg = x;
2335
      info->offset = const0_rtx;
2336
      return mips_valid_base_register_p (info->reg, mode, strict_p);
2337
 
2338
    case PLUS:
2339
      info->type = ADDRESS_REG;
2340
      info->reg = XEXP (x, 0);
2341
      info->offset = XEXP (x, 1);
2342
      return (mips_valid_base_register_p (info->reg, mode, strict_p)
2343
              && mips_valid_offset_p (info->offset, mode));
2344
 
2345
    case LO_SUM:
2346
      info->type = ADDRESS_LO_SUM;
2347
      info->reg = XEXP (x, 0);
2348
      info->offset = XEXP (x, 1);
2349
      /* We have to trust the creator of the LO_SUM to do something vaguely
2350
         sane.  Target-independent code that creates a LO_SUM should also
2351
         create and verify the matching HIGH.  Target-independent code that
2352
         adds an offset to a LO_SUM must prove that the offset will not
2353
         induce a carry.  Failure to do either of these things would be
2354
         a bug, and we are not required to check for it here.  The MIPS
2355
         backend itself should only create LO_SUMs for valid symbolic
2356
         constants, with the high part being either a HIGH or a copy
2357
         of _gp. */
2358
      info->symbol_type
2359
        = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2360
      return (mips_valid_base_register_p (info->reg, mode, strict_p)
2361
              && mips_valid_lo_sum_p (info->symbol_type, mode));
2362
 
2363
    case CONST_INT:
2364
      /* Small-integer addresses don't occur very often, but they
2365
         are legitimate if $0 is a valid base register.  */
2366
      info->type = ADDRESS_CONST_INT;
2367
      return !TARGET_MIPS16 && SMALL_INT (x);
2368
 
2369
    case CONST:
2370
    case LABEL_REF:
2371
    case SYMBOL_REF:
2372
      info->type = ADDRESS_SYMBOLIC;
2373
      return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2374
                                        &info->symbol_type)
2375
              && mips_symbol_insns (info->symbol_type, mode) > 0
2376
              && !mips_split_p[info->symbol_type]);
2377
 
2378
    default:
2379
      return false;
2380
    }
2381
}
2382
 
2383
/* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
2384
 
2385
static bool
2386
mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2387
{
2388
  struct mips_address_info addr;
2389
 
2390
  return mips_classify_address (&addr, x, mode, strict_p);
2391
}
2392
 
2393
/* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2394
 
2395
bool
2396
mips_stack_address_p (rtx x, enum machine_mode mode)
2397
{
2398
  struct mips_address_info addr;
2399
 
2400
  return (mips_classify_address (&addr, x, mode, false)
2401
          && addr.type == ADDRESS_REG
2402
          && addr.reg == stack_pointer_rtx);
2403
}
2404
 
2405
/* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2406
   address instruction.  Note that such addresses are not considered
2407
   legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2408
   is so restricted.  */
2409
 
2410
static bool
2411
mips_lwxs_address_p (rtx addr)
2412
{
2413
  if (ISA_HAS_LWXS
2414
      && GET_CODE (addr) == PLUS
2415
      && REG_P (XEXP (addr, 1)))
2416
    {
2417
      rtx offset = XEXP (addr, 0);
2418
      if (GET_CODE (offset) == MULT
2419
          && REG_P (XEXP (offset, 0))
2420
          && CONST_INT_P (XEXP (offset, 1))
2421
          && INTVAL (XEXP (offset, 1)) == 4)
2422
        return true;
2423
    }
2424
  return false;
2425
}
2426
 
2427
/* Return true if ADDR matches the pattern for the L{B,H,W,D}{,U}X load
2428
   indexed address instruction.  Note that such addresses are
2429
   not considered legitimate in the TARGET_LEGITIMATE_ADDRESS_P
2430
   sense, because their use is so restricted.  */
2431
 
2432
static bool
2433
mips_lx_address_p (rtx addr, enum machine_mode mode)
2434
{
2435
  if (GET_CODE (addr) != PLUS
2436
      || !REG_P (XEXP (addr, 0))
2437
      || !REG_P (XEXP (addr, 1)))
2438
    return false;
2439
  if (ISA_HAS_LBX && mode == QImode)
2440
    return true;
2441
  if (ISA_HAS_LHX && mode == HImode)
2442
    return true;
2443
  if (ISA_HAS_LWX && mode == SImode)
2444
    return true;
2445
  if (ISA_HAS_LDX && mode == DImode)
2446
    return true;
2447
  return false;
2448
}
2449
 
2450
/* Return true if a value at OFFSET bytes from base register BASE can be
2451
   accessed using an unextended MIPS16 instruction.  MODE is the mode of
2452
   the value.
2453
 
2454
   Usually the offset in an unextended instruction is a 5-bit field.
2455
   The offset is unsigned and shifted left once for LH and SH, twice
2456
   for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2457
   an 8-bit immediate field that's shifted left twice.  */
2458
 
2459
static bool
2460
mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2461
                               unsigned HOST_WIDE_INT offset)
2462
{
2463
  if (mode != BLKmode && offset % GET_MODE_SIZE (mode) == 0)
2464
    {
2465
      if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2466
        return offset < 256U * GET_MODE_SIZE (mode);
2467
      return offset < 32U * GET_MODE_SIZE (mode);
2468
    }
2469
  return false;
2470
}
2471
 
2472
/* Return the number of instructions needed to load or store a value
2473
   of mode MODE at address X, assuming that BASE_INSN_LENGTH is the
2474
   length of one instruction.  Return 0 if X isn't valid for MODE.
2475
   Assume that multiword moves may need to be split into word moves
2476
   if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2477
   enough.  */
2478
 
2479
int
2480
mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2481
{
2482
  struct mips_address_info addr;
2483
  int factor;
2484
 
2485
  /* BLKmode is used for single unaligned loads and stores and should
2486
     not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2487
     meaningless, so we have to single it out as a special case one way
2488
     or the other.)  */
2489
  if (mode != BLKmode && might_split_p)
2490
    factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2491
  else
2492
    factor = 1;
2493
 
2494
  if (mips_classify_address (&addr, x, mode, false))
2495
    switch (addr.type)
2496
      {
2497
      case ADDRESS_REG:
2498
        if (TARGET_MIPS16
2499
            && !mips16_unextended_reference_p (mode, addr.reg,
2500
                                               UINTVAL (addr.offset)))
2501
          return factor * 2;
2502
        return factor;
2503
 
2504
      case ADDRESS_LO_SUM:
2505
        return TARGET_MIPS16 ? factor * 2 : factor;
2506
 
2507
      case ADDRESS_CONST_INT:
2508
        return factor;
2509
 
2510
      case ADDRESS_SYMBOLIC:
2511
        return factor * mips_symbol_insns (addr.symbol_type, mode);
2512
      }
2513
  return 0;
2514
}
2515
 
2516
/* Return true if X fits within an unsigned field of BITS bits that is
2517
   shifted left SHIFT bits before being used.  */
2518
 
2519
bool
2520
mips_unsigned_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2521
{
2522
  return (x & ((1 << shift) - 1)) == 0 && x < ((unsigned) 1 << (shift + bits));
2523
}
2524
 
2525
/* Return true if X fits within a signed field of BITS bits that is
2526
   shifted left SHIFT bits before being used.  */
2527
 
2528
bool
2529
mips_signed_immediate_p (unsigned HOST_WIDE_INT x, int bits, int shift = 0)
2530
{
2531
  x += 1 << (bits + shift - 1);
2532
  return mips_unsigned_immediate_p (x, bits, shift);
2533
}
2534
 
2535
/* Return true if X is legitimate for accessing values of mode MODE,
2536
   if it is based on a MIPS16 register, and if the offset satisfies
2537
   OFFSET_PREDICATE.  */
2538
 
2539
bool
2540
m16_based_address_p (rtx x, enum machine_mode mode,
2541
                     insn_operand_predicate_fn offset_predicate)
2542
{
2543
  struct mips_address_info addr;
2544
 
2545
  return (mips_classify_address (&addr, x, mode, false)
2546
          && addr.type == ADDRESS_REG
2547
          && M16_REG_P (REGNO (addr.reg))
2548
          && offset_predicate (addr.offset, mode));
2549
}
2550
 
2551
/* Return true if X is a legitimate address that conforms to the requirements
2552
   for a microMIPS LWSP or SWSP insn.  */
2553
 
2554
bool
2555
lwsp_swsp_address_p (rtx x, enum machine_mode mode)
2556
{
2557
  struct mips_address_info addr;
2558
 
2559
  return (mips_classify_address (&addr, x, mode, false)
2560
          && addr.type == ADDRESS_REG
2561
          && REGNO (addr.reg) == STACK_POINTER_REGNUM
2562
          && uw5_operand (addr.offset, mode));
2563
}
2564
 
2565
/* Return true if X is a legitimate address with a 12-bit offset.
2566
   MODE is the mode of the value being accessed.  */
2567
 
2568
bool
2569
umips_12bit_offset_address_p (rtx x, enum machine_mode mode)
2570
{
2571
  struct mips_address_info addr;
2572
 
2573
  return (mips_classify_address (&addr, x, mode, false)
2574
          && addr.type == ADDRESS_REG
2575
          && CONST_INT_P (addr.offset)
2576
          && UMIPS_12BIT_OFFSET_P (INTVAL (addr.offset)));
2577
}
2578
 
2579
/* Return the number of instructions needed to load constant X,
2580
   assuming that BASE_INSN_LENGTH is the length of one instruction.
2581
   Return 0 if X isn't a valid constant.  */
2582
 
2583
int
2584
mips_const_insns (rtx x)
2585
{
2586
  struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2587
  enum mips_symbol_type symbol_type;
2588
  rtx offset;
2589
 
2590
  switch (GET_CODE (x))
2591
    {
2592
    case HIGH:
2593
      if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2594
                                     &symbol_type)
2595
          || !mips_split_p[symbol_type])
2596
        return 0;
2597
 
2598
      /* This is simply an LUI for normal mode.  It is an extended
2599
         LI followed by an extended SLL for MIPS16.  */
2600
      return TARGET_MIPS16 ? 4 : 1;
2601
 
2602
    case CONST_INT:
2603
      if (TARGET_MIPS16)
2604
        /* Unsigned 8-bit constants can be loaded using an unextended
2605
           LI instruction.  Unsigned 16-bit constants can be loaded
2606
           using an extended LI.  Negative constants must be loaded
2607
           using LI and then negated.  */
2608
        return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2609
                : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2610
                : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2611
                : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2612
                : 0);
2613
 
2614
      return mips_build_integer (codes, INTVAL (x));
2615
 
2616
    case CONST_DOUBLE:
2617
    case CONST_VECTOR:
2618
      /* Allow zeros for normal mode, where we can use $0.  */
2619
      return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2620
 
2621
    case CONST:
2622
      if (CONST_GP_P (x))
2623
        return 1;
2624
 
2625
      /* See if we can refer to X directly.  */
2626
      if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2627
        return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2628
 
2629
      /* Otherwise try splitting the constant into a base and offset.
2630
         If the offset is a 16-bit value, we can load the base address
2631
         into a register and then use (D)ADDIU to add in the offset.
2632
         If the offset is larger, we can load the base and offset
2633
         into separate registers and add them together with (D)ADDU.
2634
         However, the latter is only possible before reload; during
2635
         and after reload, we must have the option of forcing the
2636
         constant into the pool instead.  */
2637
      split_const (x, &x, &offset);
2638
      if (offset != 0)
2639
        {
2640
          int n = mips_const_insns (x);
2641
          if (n != 0)
2642
            {
2643
              if (SMALL_INT (offset))
2644
                return n + 1;
2645
              else if (!targetm.cannot_force_const_mem (GET_MODE (x), x))
2646
                return n + 1 + mips_build_integer (codes, INTVAL (offset));
2647
            }
2648
        }
2649
      return 0;
2650
 
2651
    case SYMBOL_REF:
2652
    case LABEL_REF:
2653
      return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2654
                                MAX_MACHINE_MODE);
2655
 
2656
    default:
2657
      return 0;
2658
    }
2659
}
2660
 
2661
/* X is a doubleword constant that can be handled by splitting it into
2662
   two words and loading each word separately.  Return the number of
2663
   instructions required to do this, assuming that BASE_INSN_LENGTH
2664
   is the length of one instruction.  */
2665
 
2666
int
2667
mips_split_const_insns (rtx x)
2668
{
2669
  unsigned int low, high;
2670
 
2671
  low = mips_const_insns (mips_subword (x, false));
2672
  high = mips_const_insns (mips_subword (x, true));
2673
  gcc_assert (low > 0 && high > 0);
2674
  return low + high;
2675
}
2676
 
2677
/* Return the number of instructions needed to implement INSN,
2678
   given that it loads from or stores to MEM.  Assume that
2679
   BASE_INSN_LENGTH is the length of one instruction.  */
2680
 
2681
int
2682
mips_load_store_insns (rtx mem, rtx insn)
2683
{
2684
  enum machine_mode mode;
2685
  bool might_split_p;
2686
  rtx set;
2687
 
2688
  gcc_assert (MEM_P (mem));
2689
  mode = GET_MODE (mem);
2690
 
2691
  /* Try to prove that INSN does not need to be split.  */
2692
  might_split_p = GET_MODE_SIZE (mode) > UNITS_PER_WORD;
2693
  if (might_split_p)
2694
    {
2695
      set = single_set (insn);
2696
      if (set && !mips_split_move_insn_p (SET_DEST (set), SET_SRC (set), insn))
2697
        might_split_p = false;
2698
    }
2699
 
2700
  return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2701
}
2702
 
2703
/* Return the number of instructions needed for an integer division,
2704
   assuming that BASE_INSN_LENGTH is the length of one instruction.  */
2705
 
2706
int
2707
mips_idiv_insns (void)
2708
{
2709
  int count;
2710
 
2711
  count = 1;
2712
  if (TARGET_CHECK_ZERO_DIV)
2713
    {
2714
      if (GENERATE_DIVIDE_TRAPS)
2715
        count++;
2716
      else
2717
        count += 2;
2718
    }
2719
 
2720
  if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2721
    count++;
2722
  return count;
2723
}
2724
 
2725
/* Emit a move from SRC to DEST.  Assume that the move expanders can
2726
   handle all moves if !can_create_pseudo_p ().  The distinction is
2727
   important because, unlike emit_move_insn, the move expanders know
2728
   how to force Pmode objects into the constant pool even when the
2729
   constant pool address is not itself legitimate.  */
2730
 
2731
rtx
2732
mips_emit_move (rtx dest, rtx src)
2733
{
2734
  return (can_create_pseudo_p ()
2735
          ? emit_move_insn (dest, src)
2736
          : emit_move_insn_1 (dest, src));
2737
}
2738
 
2739
/* Emit a move from SRC to DEST, splitting compound moves into individual
2740
   instructions.  SPLIT_TYPE is the type of split to perform.  */
2741
 
2742
static void
2743
mips_emit_move_or_split (rtx dest, rtx src, enum mips_split_type split_type)
2744
{
2745
  if (mips_split_move_p (dest, src, split_type))
2746
    mips_split_move (dest, src, split_type);
2747
  else
2748
    mips_emit_move (dest, src);
2749
}
2750
 
2751
/* Emit an instruction of the form (set TARGET (CODE OP0)).  */
2752
 
2753
static void
2754
mips_emit_unary (enum rtx_code code, rtx target, rtx op0)
2755
{
2756
  emit_insn (gen_rtx_SET (VOIDmode, target,
2757
                          gen_rtx_fmt_e (code, GET_MODE (op0), op0)));
2758
}
2759
 
2760
/* Compute (CODE OP0) and store the result in a new register of mode MODE.
2761
   Return that new register.  */
2762
 
2763
static rtx
2764
mips_force_unary (enum machine_mode mode, enum rtx_code code, rtx op0)
2765
{
2766
  rtx reg;
2767
 
2768
  reg = gen_reg_rtx (mode);
2769
  mips_emit_unary (code, reg, op0);
2770
  return reg;
2771
}
2772
 
2773
/* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2774
 
2775
void
2776
mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2777
{
2778
  emit_insn (gen_rtx_SET (VOIDmode, target,
2779
                          gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2780
}
2781
 
2782
/* Compute (CODE OP0 OP1) and store the result in a new register
2783
   of mode MODE.  Return that new register.  */
2784
 
2785
static rtx
2786
mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2787
{
2788
  rtx reg;
2789
 
2790
  reg = gen_reg_rtx (mode);
2791
  mips_emit_binary (code, reg, op0, op1);
2792
  return reg;
2793
}
2794
 
2795
/* Copy VALUE to a register and return that register.  If new pseudos
2796
   are allowed, copy it into a new register, otherwise use DEST.  */
2797
 
2798
static rtx
2799
mips_force_temporary (rtx dest, rtx value)
2800
{
2801
  if (can_create_pseudo_p ())
2802
    return force_reg (Pmode, value);
2803
  else
2804
    {
2805
      mips_emit_move (dest, value);
2806
      return dest;
2807
    }
2808
}
2809
 
2810
/* Emit a call sequence with call pattern PATTERN and return the call
2811
   instruction itself (which is not necessarily the last instruction
2812
   emitted).  ORIG_ADDR is the original, unlegitimized address,
2813
   ADDR is the legitimized form, and LAZY_P is true if the call
2814
   address is lazily-bound.  */
2815
 
2816
static rtx
2817
mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2818
{
2819
  rtx insn, reg;
2820
 
2821
  insn = emit_call_insn (pattern);
2822
 
2823
  if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2824
    {
2825
      /* MIPS16 JALRs only take MIPS16 registers.  If the target
2826
         function requires $25 to be valid on entry, we must copy it
2827
         there separately.  The move instruction can be put in the
2828
         call's delay slot.  */
2829
      reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2830
      emit_insn_before (gen_move_insn (reg, addr), insn);
2831
      use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2832
    }
2833
 
2834
  if (lazy_p)
2835
    /* Lazy-binding stubs require $gp to be valid on entry.  */
2836
    use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2837
 
2838
  if (TARGET_USE_GOT)
2839
    {
2840
      /* See the comment above load_call<mode> for details.  */
2841
      use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2842
               gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2843
      emit_insn (gen_update_got_version ());
2844
    }
2845
  return insn;
2846
}
2847
 
2848
/* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2849
   then add CONST_INT OFFSET to the result.  */
2850
 
2851
static rtx
2852
mips_unspec_address_offset (rtx base, rtx offset,
2853
                            enum mips_symbol_type symbol_type)
2854
{
2855
  base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2856
                         UNSPEC_ADDRESS_FIRST + symbol_type);
2857
  if (offset != const0_rtx)
2858
    base = gen_rtx_PLUS (Pmode, base, offset);
2859
  return gen_rtx_CONST (Pmode, base);
2860
}
2861
 
2862
/* Return an UNSPEC address with underlying address ADDRESS and symbol
2863
   type SYMBOL_TYPE.  */
2864
 
2865
rtx
2866
mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2867
{
2868
  rtx base, offset;
2869
 
2870
  split_const (address, &base, &offset);
2871
  return mips_unspec_address_offset (base, offset, symbol_type);
2872
}
2873
 
2874
/* If OP is an UNSPEC address, return the address to which it refers,
2875
   otherwise return OP itself.  */
2876
 
2877
rtx
2878
mips_strip_unspec_address (rtx op)
2879
{
2880
  rtx base, offset;
2881
 
2882
  split_const (op, &base, &offset);
2883
  if (UNSPEC_ADDRESS_P (base))
2884
    op = plus_constant (Pmode, UNSPEC_ADDRESS (base), INTVAL (offset));
2885
  return op;
2886
}
2887
 
2888
/* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2889
   high part to BASE and return the result.  Just return BASE otherwise.
2890
   TEMP is as for mips_force_temporary.
2891
 
2892
   The returned expression can be used as the first operand to a LO_SUM.  */
2893
 
2894
static rtx
2895
mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2896
                         enum mips_symbol_type symbol_type)
2897
{
2898
  if (mips_split_p[symbol_type])
2899
    {
2900
      addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2901
      addr = mips_force_temporary (temp, addr);
2902
      base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2903
    }
2904
  return base;
2905
}
2906
 
2907
/* Return an instruction that copies $gp into register REG.  We want
2908
   GCC to treat the register's value as constant, so that its value
2909
   can be rematerialized on demand.  */
2910
 
2911
static rtx
2912
gen_load_const_gp (rtx reg)
2913
{
2914
  return PMODE_INSN (gen_load_const_gp, (reg));
2915
}
2916
 
2917
/* Return a pseudo register that contains the value of $gp throughout
2918
   the current function.  Such registers are needed by MIPS16 functions,
2919
   for which $gp itself is not a valid base register or addition operand.  */
2920
 
2921
static rtx
2922
mips16_gp_pseudo_reg (void)
2923
{
2924
  if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2925
    {
2926
      rtx insn, scan;
2927
 
2928
      cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2929
 
2930
      push_topmost_sequence ();
2931
 
2932
      scan = get_insns ();
2933
      while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2934
        scan = NEXT_INSN (scan);
2935
 
2936
      insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2937
      insn = emit_insn_after (insn, scan);
2938
      INSN_LOCATION (insn) = 0;
2939
 
2940
      pop_topmost_sequence ();
2941
    }
2942
 
2943
  return cfun->machine->mips16_gp_pseudo_rtx;
2944
}
2945
 
2946
/* Return a base register that holds pic_offset_table_rtx.
2947
   TEMP, if nonnull, is a scratch Pmode base register.  */
2948
 
2949
rtx
2950
mips_pic_base_register (rtx temp)
2951
{
2952
  if (!TARGET_MIPS16)
2953
    return pic_offset_table_rtx;
2954
 
2955
  if (currently_expanding_to_rtl)
2956
    return mips16_gp_pseudo_reg ();
2957
 
2958
  if (can_create_pseudo_p ())
2959
    temp = gen_reg_rtx (Pmode);
2960
 
2961
  if (TARGET_USE_GOT)
2962
    /* The first post-reload split exposes all references to $gp
2963
       (both uses and definitions).  All references must remain
2964
       explicit after that point.
2965
 
2966
       It is safe to introduce uses of $gp at any time, so for
2967
       simplicity, we do that before the split too.  */
2968
    mips_emit_move (temp, pic_offset_table_rtx);
2969
  else
2970
    emit_insn (gen_load_const_gp (temp));
2971
  return temp;
2972
}
2973
 
2974
/* Return the RHS of a load_call<mode> insn.  */
2975
 
2976
static rtx
2977
mips_unspec_call (rtx reg, rtx symbol)
2978
{
2979
  rtvec vec;
2980
 
2981
  vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2982
  return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2983
}
2984
 
2985
/* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2986
   reference.  Return NULL_RTX otherwise.  */
2987
 
2988
static rtx
2989
mips_strip_unspec_call (rtx src)
2990
{
2991
  if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2992
    return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2993
  return NULL_RTX;
2994
}
2995
 
2996
/* Create and return a GOT reference of type TYPE for address ADDR.
2997
   TEMP, if nonnull, is a scratch Pmode base register.  */
2998
 
2999
rtx
3000
mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
3001
{
3002
  rtx base, high, lo_sum_symbol;
3003
 
3004
  base = mips_pic_base_register (temp);
3005
 
3006
  /* If we used the temporary register to load $gp, we can't use
3007
     it for the high part as well.  */
3008
  if (temp != NULL && reg_overlap_mentioned_p (base, temp))
3009
    temp = NULL;
3010
 
3011
  high = mips_unspec_offset_high (temp, base, addr, type);
3012
  lo_sum_symbol = mips_unspec_address (addr, type);
3013
 
3014
  if (type == SYMBOL_GOTOFF_CALL)
3015
    return mips_unspec_call (high, lo_sum_symbol);
3016
  else
3017
    return PMODE_INSN (gen_unspec_got, (high, lo_sum_symbol));
3018
}
3019
 
3020
/* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
3021
   it appears in a MEM of that mode.  Return true if ADDR is a legitimate
3022
   constant in that context and can be split into high and low parts.
3023
   If so, and if LOW_OUT is nonnull, emit the high part and store the
3024
   low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
3025
 
3026
   TEMP is as for mips_force_temporary and is used to load the high
3027
   part into a register.
3028
 
3029
   When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
3030
   a legitimize SET_SRC for an .md pattern, otherwise the low part
3031
   is guaranteed to be a legitimate address for mode MODE.  */
3032
 
3033
bool
3034
mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
3035
{
3036
  enum mips_symbol_context context;
3037
  enum mips_symbol_type symbol_type;
3038
  rtx high;
3039
 
3040
  context = (mode == MAX_MACHINE_MODE
3041
             ? SYMBOL_CONTEXT_LEA
3042
             : SYMBOL_CONTEXT_MEM);
3043
  if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
3044
    {
3045
      addr = XEXP (addr, 0);
3046
      if (mips_symbolic_constant_p (addr, context, &symbol_type)
3047
          && mips_symbol_insns (symbol_type, mode) > 0
3048
          && mips_split_hi_p[symbol_type])
3049
        {
3050
          if (low_out)
3051
            switch (symbol_type)
3052
              {
3053
              case SYMBOL_GOT_PAGE_OFST:
3054
                /* The high part of a page/ofst pair is loaded from the GOT.  */
3055
                *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
3056
                break;
3057
 
3058
              default:
3059
                gcc_unreachable ();
3060
              }
3061
          return true;
3062
        }
3063
    }
3064
  else
3065
    {
3066
      if (mips_symbolic_constant_p (addr, context, &symbol_type)
3067
          && mips_symbol_insns (symbol_type, mode) > 0
3068
          && mips_split_p[symbol_type])
3069
        {
3070
          if (low_out)
3071
            switch (symbol_type)
3072
              {
3073
              case SYMBOL_GOT_DISP:
3074
                /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
3075
                *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
3076
                break;
3077
 
3078
              case SYMBOL_GP_RELATIVE:
3079
                high = mips_pic_base_register (temp);
3080
                *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3081
                break;
3082
 
3083
              default:
3084
                high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
3085
                high = mips_force_temporary (temp, high);
3086
                *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
3087
                break;
3088
              }
3089
          return true;
3090
        }
3091
    }
3092
  return false;
3093
}
3094
 
3095
/* Return a legitimate address for REG + OFFSET.  TEMP is as for
3096
   mips_force_temporary; it is only needed when OFFSET is not a
3097
   SMALL_OPERAND.  */
3098
 
3099
static rtx
3100
mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
3101
{
3102
  if (!SMALL_OPERAND (offset))
3103
    {
3104
      rtx high;
3105
 
3106
      if (TARGET_MIPS16)
3107
        {
3108
          /* Load the full offset into a register so that we can use
3109
             an unextended instruction for the address itself.  */
3110
          high = GEN_INT (offset);
3111
          offset = 0;
3112
        }
3113
      else
3114
        {
3115
          /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
3116
             The addition inside the macro CONST_HIGH_PART may cause an
3117
             overflow, so we need to force a sign-extension check.  */
3118
          high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
3119
          offset = CONST_LOW_PART (offset);
3120
        }
3121
      high = mips_force_temporary (temp, high);
3122
      reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
3123
    }
3124
  return plus_constant (Pmode, reg, offset);
3125
}
3126
 
3127
/* The __tls_get_attr symbol.  */
3128
static GTY(()) rtx mips_tls_symbol;
3129
 
3130
/* Return an instruction sequence that calls __tls_get_addr.  SYM is
3131
   the TLS symbol we are referencing and TYPE is the symbol type to use
3132
   (either global dynamic or local dynamic).  V0 is an RTX for the
3133
   return value location.  */
3134
 
3135
static rtx
3136
mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
3137
{
3138
  rtx insn, loc, a0;
3139
 
3140
  a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
3141
 
3142
  if (!mips_tls_symbol)
3143
    mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
3144
 
3145
  loc = mips_unspec_address (sym, type);
3146
 
3147
  start_sequence ();
3148
 
3149
  emit_insn (gen_rtx_SET (Pmode, a0,
3150
                          gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
3151
  insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
3152
                           const0_rtx, NULL_RTX, false);
3153
  RTL_CONST_CALL_P (insn) = 1;
3154
  use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
3155
  insn = get_insns ();
3156
 
3157
  end_sequence ();
3158
 
3159
  return insn;
3160
}
3161
 
3162
/* Return a pseudo register that contains the current thread pointer.  */
3163
 
3164
rtx
3165
mips_expand_thread_pointer (rtx tp)
3166
{
3167
  rtx fn;
3168
 
3169
  if (TARGET_MIPS16)
3170
    {
3171
      if (!mips16_rdhwr_stub)
3172
        mips16_rdhwr_stub = new mips16_rdhwr_one_only_stub ();
3173
      fn = mips16_stub_call_address (mips16_rdhwr_stub);
3174
      emit_insn (PMODE_INSN (gen_tls_get_tp_mips16, (tp, fn)));
3175
    }
3176
  else
3177
    emit_insn (PMODE_INSN (gen_tls_get_tp, (tp)));
3178
  return tp;
3179
}
3180
 
3181
static rtx
3182
mips_get_tp (void)
3183
{
3184
  return mips_expand_thread_pointer (gen_reg_rtx (Pmode));
3185
}
3186
 
3187
/* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
3188
   its address.  The return value will be both a valid address and a valid
3189
   SET_SRC (either a REG or a LO_SUM).  */
3190
 
3191
static rtx
3192
mips_legitimize_tls_address (rtx loc)
3193
{
3194
  rtx dest, insn, v0, tp, tmp1, tmp2, eqv, offset;
3195
  enum tls_model model;
3196
 
3197
  model = SYMBOL_REF_TLS_MODEL (loc);
3198
  /* Only TARGET_ABICALLS code can have more than one module; other
3199
     code must be be static and should not use a GOT.  All TLS models
3200
     reduce to local exec in this situation.  */
3201
  if (!TARGET_ABICALLS)
3202
    model = TLS_MODEL_LOCAL_EXEC;
3203
 
3204
  switch (model)
3205
    {
3206
    case TLS_MODEL_GLOBAL_DYNAMIC:
3207
      v0 = gen_rtx_REG (Pmode, GP_RETURN);
3208
      insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
3209
      dest = gen_reg_rtx (Pmode);
3210
      emit_libcall_block (insn, dest, v0, loc);
3211
      break;
3212
 
3213
    case TLS_MODEL_LOCAL_DYNAMIC:
3214
      v0 = gen_rtx_REG (Pmode, GP_RETURN);
3215
      insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
3216
      tmp1 = gen_reg_rtx (Pmode);
3217
 
3218
      /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
3219
         share the LDM result with other LD model accesses.  */
3220
      eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3221
                            UNSPEC_TLS_LDM);
3222
      emit_libcall_block (insn, tmp1, v0, eqv);
3223
 
3224
      offset = mips_unspec_address (loc, SYMBOL_DTPREL);
3225
      if (mips_split_p[SYMBOL_DTPREL])
3226
        {
3227
          tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
3228
          dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3229
        }
3230
      else
3231
        dest = expand_binop (Pmode, add_optab, tmp1, offset,
3232
                             0, 0, OPTAB_DIRECT);
3233
      break;
3234
 
3235
    case TLS_MODEL_INITIAL_EXEC:
3236
      tp = mips_get_tp ();
3237
      tmp1 = gen_reg_rtx (Pmode);
3238
      tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
3239
      if (Pmode == DImode)
3240
        emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
3241
      else
3242
        emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
3243
      dest = gen_reg_rtx (Pmode);
3244
      emit_insn (gen_add3_insn (dest, tmp1, tp));
3245
      break;
3246
 
3247
    case TLS_MODEL_LOCAL_EXEC:
3248
      tmp1 = mips_get_tp ();
3249
      offset = mips_unspec_address (loc, SYMBOL_TPREL);
3250
      if (mips_split_p[SYMBOL_TPREL])
3251
        {
3252
          tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_TPREL);
3253
          dest = gen_rtx_LO_SUM (Pmode, tmp2, offset);
3254
        }
3255
      else
3256
        dest = expand_binop (Pmode, add_optab, tmp1, offset,
3257
                             0, 0, OPTAB_DIRECT);
3258
      break;
3259
 
3260
    default:
3261
      gcc_unreachable ();
3262
    }
3263
  return dest;
3264
}
3265
 
3266
/* Implement "TARGET = __builtin_mips_get_fcsr ()" for MIPS16,
3267
   using a stub.  */
3268
 
3269
void
3270
mips16_expand_get_fcsr (rtx target)
3271
{
3272
  if (!mips16_get_fcsr_stub)
3273
    mips16_get_fcsr_stub = new mips16_get_fcsr_one_only_stub ();
3274
  rtx fn = mips16_stub_call_address (mips16_get_fcsr_stub);
3275
  emit_insn (PMODE_INSN (gen_mips_get_fcsr_mips16, (fn)));
3276
  emit_move_insn (target, gen_rtx_REG (SImode, GET_FCSR_REGNUM));
3277
}
3278
 
3279
/* Implement __builtin_mips_set_fcsr (TARGET) for MIPS16, using a stub.  */
3280
 
3281
void
3282
mips16_expand_set_fcsr (rtx newval)
3283
{
3284
  if (!mips16_set_fcsr_stub)
3285
    mips16_set_fcsr_stub = new mips16_set_fcsr_one_only_stub ();
3286
  rtx fn = mips16_stub_call_address (mips16_set_fcsr_stub);
3287
  emit_move_insn (gen_rtx_REG (SImode, SET_FCSR_REGNUM), newval);
3288
  emit_insn (PMODE_INSN (gen_mips_set_fcsr_mips16, (fn)));
3289
}
3290
 
3291
/* If X is not a valid address for mode MODE, force it into a register.  */
3292
 
3293
static rtx
3294
mips_force_address (rtx x, enum machine_mode mode)
3295
{
3296
  if (!mips_legitimate_address_p (mode, x, false))
3297
    x = force_reg (Pmode, x);
3298
  return x;
3299
}
3300
 
3301
/* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
3302
   be legitimized in a way that the generic machinery might not expect,
3303
   return a new address, otherwise return NULL.  MODE is the mode of
3304
   the memory being accessed.  */
3305
 
3306
static rtx
3307
mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3308
                         enum machine_mode mode)
3309
{
3310
  rtx base, addr;
3311
  HOST_WIDE_INT offset;
3312
 
3313
  if (mips_tls_symbol_p (x))
3314
    return mips_legitimize_tls_address (x);
3315
 
3316
  /* See if the address can split into a high part and a LO_SUM.  */
3317
  if (mips_split_symbol (NULL, x, mode, &addr))
3318
    return mips_force_address (addr, mode);
3319
 
3320
  /* Handle BASE + OFFSET using mips_add_offset.  */
3321
  mips_split_plus (x, &base, &offset);
3322
  if (offset != 0)
3323
    {
3324
      if (!mips_valid_base_register_p (base, mode, false))
3325
        base = copy_to_mode_reg (Pmode, base);
3326
      addr = mips_add_offset (NULL, base, offset);
3327
      return mips_force_address (addr, mode);
3328
    }
3329
 
3330
  return x;
3331
}
3332
 
3333
/* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
3334
 
3335
void
3336
mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
3337
{
3338
  struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
3339
  enum machine_mode mode;
3340
  unsigned int i, num_ops;
3341
  rtx x;
3342
 
3343
  mode = GET_MODE (dest);
3344
  num_ops = mips_build_integer (codes, value);
3345
 
3346
  /* Apply each binary operation to X.  Invariant: X is a legitimate
3347
     source operand for a SET pattern.  */
3348
  x = GEN_INT (codes[0].value);
3349
  for (i = 1; i < num_ops; i++)
3350
    {
3351
      if (!can_create_pseudo_p ())
3352
        {
3353
          emit_insn (gen_rtx_SET (VOIDmode, temp, x));
3354
          x = temp;
3355
        }
3356
      else
3357
        x = force_reg (mode, x);
3358
      x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
3359
    }
3360
 
3361
  emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3362
}
3363
 
3364
/* Subroutine of mips_legitimize_move.  Move constant SRC into register
3365
   DEST given that SRC satisfies immediate_operand but doesn't satisfy
3366
   move_operand.  */
3367
 
3368
static void
3369
mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3370
{
3371
  rtx base, offset;
3372
 
3373
  /* Split moves of big integers into smaller pieces.  */
3374
  if (splittable_const_int_operand (src, mode))
3375
    {
3376
      mips_move_integer (dest, dest, INTVAL (src));
3377
      return;
3378
    }
3379
 
3380
  /* Split moves of symbolic constants into high/low pairs.  */
3381
  if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3382
    {
3383
      emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3384
      return;
3385
    }
3386
 
3387
  /* Generate the appropriate access sequences for TLS symbols.  */
3388
  if (mips_tls_symbol_p (src))
3389
    {
3390
      mips_emit_move (dest, mips_legitimize_tls_address (src));
3391
      return;
3392
    }
3393
 
3394
  /* If we have (const (plus symbol offset)), and that expression cannot
3395
     be forced into memory, load the symbol first and add in the offset.
3396
     In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3397
     forced into memory, as it usually produces better code.  */
3398
  split_const (src, &base, &offset);
3399
  if (offset != const0_rtx
3400
      && (targetm.cannot_force_const_mem (mode, src)
3401
          || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3402
    {
3403
      base = mips_force_temporary (dest, base);
3404
      mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3405
      return;
3406
    }
3407
 
3408
  src = force_const_mem (mode, src);
3409
 
3410
  /* When using explicit relocs, constant pool references are sometimes
3411
     not legitimate addresses.  */
3412
  mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3413
  mips_emit_move (dest, src);
3414
}
3415
 
3416
/* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3417
   sequence that is valid.  */
3418
 
3419
bool
3420
mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3421
{
3422
  if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3423
    {
3424
      mips_emit_move (dest, force_reg (mode, src));
3425
      return true;
3426
    }
3427
 
3428
  /* We need to deal with constants that would be legitimate
3429
     immediate_operands but aren't legitimate move_operands.  */
3430
  if (CONSTANT_P (src) && !move_operand (src, mode))
3431
    {
3432
      mips_legitimize_const_move (mode, dest, src);
3433
      set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3434
      return true;
3435
    }
3436
  return false;
3437
}
3438
 
3439
/* Return true if value X in context CONTEXT is a small-data address
3440
   that can be rewritten as a LO_SUM.  */
3441
 
3442
static bool
3443
mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3444
{
3445
  enum mips_symbol_type symbol_type;
3446
 
3447
  return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3448
          && !mips_split_p[SYMBOL_GP_RELATIVE]
3449
          && mips_symbolic_constant_p (x, context, &symbol_type)
3450
          && symbol_type == SYMBOL_GP_RELATIVE);
3451
}
3452
 
3453
/* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3454
   containing MEM, or null if none.  */
3455
 
3456
static int
3457
mips_small_data_pattern_1 (rtx *loc, void *data)
3458
{
3459
  enum mips_symbol_context context;
3460
 
3461
  /* Ignore things like "g" constraints in asms.  We make no particular
3462
     guarantee about which symbolic constants are acceptable as asm operands
3463
     versus which must be forced into a GPR.  */
3464
  if (GET_CODE (*loc) == LO_SUM || GET_CODE (*loc) == ASM_OPERANDS)
3465
    return -1;
3466
 
3467
  if (MEM_P (*loc))
3468
    {
3469
      if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3470
        return 1;
3471
      return -1;
3472
    }
3473
 
3474
  context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3475
  return mips_rewrite_small_data_p (*loc, context);
3476
}
3477
 
3478
/* Return true if OP refers to small data symbols directly, not through
3479
   a LO_SUM.  */
3480
 
3481
bool
3482
mips_small_data_pattern_p (rtx op)
3483
{
3484
  return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3485
}
3486
 
3487
/* A for_each_rtx callback, used by mips_rewrite_small_data.
3488
   DATA is the containing MEM, or null if none.  */
3489
 
3490
static int
3491
mips_rewrite_small_data_1 (rtx *loc, void *data)
3492
{
3493
  enum mips_symbol_context context;
3494
 
3495
  if (MEM_P (*loc))
3496
    {
3497
      for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3498
      return -1;
3499
    }
3500
 
3501
  context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3502
  if (mips_rewrite_small_data_p (*loc, context))
3503
    *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3504
 
3505
  if (GET_CODE (*loc) == LO_SUM)
3506
    return -1;
3507
 
3508
  return 0;
3509
}
3510
 
3511
/* Rewrite instruction pattern PATTERN so that it refers to small data
3512
   using explicit relocations.  */
3513
 
3514
rtx
3515
mips_rewrite_small_data (rtx pattern)
3516
{
3517
  pattern = copy_insn (pattern);
3518
  for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3519
  return pattern;
3520
}
3521
 
3522
/* The cost of loading values from the constant pool.  It should be
3523
   larger than the cost of any constant we want to synthesize inline.  */
3524
#define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3525
 
3526
/* Return the cost of X when used as an operand to the MIPS16 instruction
3527
   that implements CODE.  Return -1 if there is no such instruction, or if
3528
   X is not a valid immediate operand for it.  */
3529
 
3530
static int
3531
mips16_constant_cost (int code, HOST_WIDE_INT x)
3532
{
3533
  switch (code)
3534
    {
3535
    case ASHIFT:
3536
    case ASHIFTRT:
3537
    case LSHIFTRT:
3538
      /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3539
         other shifts are extended.  The shift patterns truncate the shift
3540
         count to the right size, so there are no out-of-range values.  */
3541
      if (IN_RANGE (x, 1, 8))
3542
        return 0;
3543
      return COSTS_N_INSNS (1);
3544
 
3545
    case PLUS:
3546
      if (IN_RANGE (x, -128, 127))
3547
        return 0;
3548
      if (SMALL_OPERAND (x))
3549
        return COSTS_N_INSNS (1);
3550
      return -1;
3551
 
3552
    case LEU:
3553
      /* Like LE, but reject the always-true case.  */
3554
      if (x == -1)
3555
        return -1;
3556
    case LE:
3557
      /* We add 1 to the immediate and use SLT.  */
3558
      x += 1;
3559
    case XOR:
3560
      /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3561
    case LT:
3562
    case LTU:
3563
      if (IN_RANGE (x, 0, 255))
3564
        return 0;
3565
      if (SMALL_OPERAND_UNSIGNED (x))
3566
        return COSTS_N_INSNS (1);
3567
      return -1;
3568
 
3569
    case EQ:
3570
    case NE:
3571
      /* Equality comparisons with 0 are cheap.  */
3572
      if (x == 0)
3573
        return 0;
3574
      return -1;
3575
 
3576
    default:
3577
      return -1;
3578
    }
3579
}
3580
 
3581
/* Return true if there is a non-MIPS16 instruction that implements CODE
3582
   and if that instruction accepts X as an immediate operand.  */
3583
 
3584
static int
3585
mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3586
{
3587
  switch (code)
3588
    {
3589
    case ASHIFT:
3590
    case ASHIFTRT:
3591
    case LSHIFTRT:
3592
      /* All shift counts are truncated to a valid constant.  */
3593
      return true;
3594
 
3595
    case ROTATE:
3596
    case ROTATERT:
3597
      /* Likewise rotates, if the target supports rotates at all.  */
3598
      return ISA_HAS_ROR;
3599
 
3600
    case AND:
3601
    case IOR:
3602
    case XOR:
3603
      /* These instructions take 16-bit unsigned immediates.  */
3604
      return SMALL_OPERAND_UNSIGNED (x);
3605
 
3606
    case PLUS:
3607
    case LT:
3608
    case LTU:
3609
      /* These instructions take 16-bit signed immediates.  */
3610
      return SMALL_OPERAND (x);
3611
 
3612
    case EQ:
3613
    case NE:
3614
    case GT:
3615
    case GTU:
3616
      /* The "immediate" forms of these instructions are really
3617
         implemented as comparisons with register 0.  */
3618
      return x == 0;
3619
 
3620
    case GE:
3621
    case GEU:
3622
      /* Likewise, meaning that the only valid immediate operand is 1.  */
3623
      return x == 1;
3624
 
3625
    case LE:
3626
      /* We add 1 to the immediate and use SLT.  */
3627
      return SMALL_OPERAND (x + 1);
3628
 
3629
    case LEU:
3630
      /* Likewise SLTU, but reject the always-true case.  */
3631
      return SMALL_OPERAND (x + 1) && x + 1 != 0;
3632
 
3633
    case SIGN_EXTRACT:
3634
    case ZERO_EXTRACT:
3635
      /* The bit position and size are immediate operands.  */
3636
      return ISA_HAS_EXT_INS;
3637
 
3638
    default:
3639
      /* By default assume that $0 can be used for 0.  */
3640
      return x == 0;
3641
    }
3642
}
3643
 
3644
/* Return the cost of binary operation X, given that the instruction
3645
   sequence for a word-sized or smaller operation has cost SINGLE_COST
3646
   and that the sequence of a double-word operation has cost DOUBLE_COST.
3647
   If SPEED is true, optimize for speed otherwise optimize for size.  */
3648
 
3649
static int
3650
mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3651
{
3652
  int cost;
3653
 
3654
  if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3655
    cost = double_cost;
3656
  else
3657
    cost = single_cost;
3658
  return (cost
3659
          + set_src_cost (XEXP (x, 0), speed)
3660
          + rtx_cost (XEXP (x, 1), GET_CODE (x), 1, speed));
3661
}
3662
 
3663
/* Return the cost of floating-point multiplications of mode MODE.  */
3664
 
3665
static int
3666
mips_fp_mult_cost (enum machine_mode mode)
3667
{
3668
  return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3669
}
3670
 
3671
/* Return the cost of floating-point divisions of mode MODE.  */
3672
 
3673
static int
3674
mips_fp_div_cost (enum machine_mode mode)
3675
{
3676
  return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3677
}
3678
 
3679
/* Return the cost of sign-extending OP to mode MODE, not including the
3680
   cost of OP itself.  */
3681
 
3682
static int
3683
mips_sign_extend_cost (enum machine_mode mode, rtx op)
3684
{
3685
  if (MEM_P (op))
3686
    /* Extended loads are as cheap as unextended ones.  */
3687
    return 0;
3688
 
3689
  if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3690
    /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3691
    return 0;
3692
 
3693
  if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3694
    /* We can use SEB or SEH.  */
3695
    return COSTS_N_INSNS (1);
3696
 
3697
  /* We need to use a shift left and a shift right.  */
3698
  return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3699
}
3700
 
3701
/* Return the cost of zero-extending OP to mode MODE, not including the
3702
   cost of OP itself.  */
3703
 
3704
static int
3705
mips_zero_extend_cost (enum machine_mode mode, rtx op)
3706
{
3707
  if (MEM_P (op))
3708
    /* Extended loads are as cheap as unextended ones.  */
3709
    return 0;
3710
 
3711
  if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3712
    /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3713
    return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3714
 
3715
  if (GENERATE_MIPS16E)
3716
    /* We can use ZEB or ZEH.  */
3717
    return COSTS_N_INSNS (1);
3718
 
3719
  if (TARGET_MIPS16)
3720
    /* We need to load 0xff or 0xffff into a register and use AND.  */
3721
    return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3722
 
3723
  /* We can use ANDI.  */
3724
  return COSTS_N_INSNS (1);
3725
}
3726
 
3727
/* Return the cost of moving between two registers of mode MODE,
3728
   assuming that the move will be in pieces of at most UNITS bytes.  */
3729
 
3730
static int
3731
mips_set_reg_reg_piece_cost (enum machine_mode mode, unsigned int units)
3732
{
3733
  return COSTS_N_INSNS ((GET_MODE_SIZE (mode) + units - 1) / units);
3734
}
3735
 
3736
/* Return the cost of moving between two registers of mode MODE.  */
3737
 
3738
static int
3739
mips_set_reg_reg_cost (enum machine_mode mode)
3740
{
3741
  switch (GET_MODE_CLASS (mode))
3742
    {
3743
    case MODE_CC:
3744
      return mips_set_reg_reg_piece_cost (mode, GET_MODE_SIZE (CCmode));
3745
 
3746
    case MODE_FLOAT:
3747
    case MODE_COMPLEX_FLOAT:
3748
    case MODE_VECTOR_FLOAT:
3749
      if (TARGET_HARD_FLOAT)
3750
        return mips_set_reg_reg_piece_cost (mode, UNITS_PER_HWFPVALUE);
3751
      /* Fall through */
3752
 
3753
    default:
3754
      return mips_set_reg_reg_piece_cost (mode, UNITS_PER_WORD);
3755
    }
3756
}
3757
 
3758
/* Implement TARGET_RTX_COSTS.  */
3759
 
3760
static bool
3761
mips_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
3762
                int *total, bool speed)
3763
{
3764
  enum machine_mode mode = GET_MODE (x);
3765
  bool float_mode_p = FLOAT_MODE_P (mode);
3766
  int cost;
3767
  rtx addr;
3768
 
3769
  /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3770
     appear in the instruction stream, and the cost of a comparison is
3771
     really the cost of the branch or scc condition.  At the time of
3772
     writing, GCC only uses an explicit outer COMPARE code when optabs
3773
     is testing whether a constant is expensive enough to force into a
3774
     register.  We want optabs to pass such constants through the MIPS
3775
     expanders instead, so make all constants very cheap here.  */
3776
  if (outer_code == COMPARE)
3777
    {
3778
      gcc_assert (CONSTANT_P (x));
3779
      *total = 0;
3780
      return true;
3781
    }
3782
 
3783
  switch (code)
3784
    {
3785
    case CONST_INT:
3786
      /* Treat *clear_upper32-style ANDs as having zero cost in the
3787
         second operand.  The cost is entirely in the first operand.
3788
 
3789
         ??? This is needed because we would otherwise try to CSE
3790
         the constant operand.  Although that's the right thing for
3791
         instructions that continue to be a register operation throughout
3792
         compilation, it is disastrous for instructions that could
3793
         later be converted into a memory operation.  */
3794
      if (TARGET_64BIT
3795
          && outer_code == AND
3796
          && UINTVAL (x) == 0xffffffff)
3797
        {
3798
          *total = 0;
3799
          return true;
3800
        }
3801
 
3802
      if (TARGET_MIPS16)
3803
        {
3804
          cost = mips16_constant_cost (outer_code, INTVAL (x));
3805
          if (cost >= 0)
3806
            {
3807
              *total = cost;
3808
              return true;
3809
            }
3810
        }
3811
      else
3812
        {
3813
          /* When not optimizing for size, we care more about the cost
3814
             of hot code, and hot code is often in a loop.  If a constant
3815
             operand needs to be forced into a register, we will often be
3816
             able to hoist the constant load out of the loop, so the load
3817
             should not contribute to the cost.  */
3818
          if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3819
            {
3820
              *total = 0;
3821
              return true;
3822
            }
3823
        }
3824
      /* Fall through.  */
3825
 
3826
    case CONST:
3827
    case SYMBOL_REF:
3828
    case LABEL_REF:
3829
    case CONST_DOUBLE:
3830
      if (force_to_mem_operand (x, VOIDmode))
3831
        {
3832
          *total = COSTS_N_INSNS (1);
3833
          return true;
3834
        }
3835
      cost = mips_const_insns (x);
3836
      if (cost > 0)
3837
        {
3838
          /* If the constant is likely to be stored in a GPR, SETs of
3839
             single-insn constants are as cheap as register sets; we
3840
             never want to CSE them.
3841
 
3842
             Don't reduce the cost of storing a floating-point zero in
3843
             FPRs.  If we have a zero in an FPR for other reasons, we
3844
             can get better cfg-cleanup and delayed-branch results by
3845
             using it consistently, rather than using $0 sometimes and
3846
             an FPR at other times.  Also, moves between floating-point
3847
             registers are sometimes cheaper than (D)MTC1 $0.  */
3848
          if (cost == 1
3849
              && outer_code == SET
3850
              && !(float_mode_p && TARGET_HARD_FLOAT))
3851
            cost = 0;
3852
          /* When non-MIPS16 code loads a constant N>1 times, we rarely
3853
             want to CSE the constant itself.  It is usually better to
3854
             have N copies of the last operation in the sequence and one
3855
             shared copy of the other operations.  (Note that this is
3856
             not true for MIPS16 code, where the final operation in the
3857
             sequence is often an extended instruction.)
3858
 
3859
             Also, if we have a CONST_INT, we don't know whether it is
3860
             for a word or doubleword operation, so we cannot rely on
3861
             the result of mips_build_integer.  */
3862
          else if (!TARGET_MIPS16
3863
                   && (outer_code == SET || mode == VOIDmode))
3864
            cost = 1;
3865
          *total = COSTS_N_INSNS (cost);
3866
          return true;
3867
        }
3868
      /* The value will need to be fetched from the constant pool.  */
3869
      *total = CONSTANT_POOL_COST;
3870
      return true;
3871
 
3872
    case MEM:
3873
      /* If the address is legitimate, return the number of
3874
         instructions it needs.  */
3875
      addr = XEXP (x, 0);
3876
      cost = mips_address_insns (addr, mode, true);
3877
      if (cost > 0)
3878
        {
3879
          *total = COSTS_N_INSNS (cost + 1);
3880
          return true;
3881
        }
3882
      /* Check for a scaled indexed address.  */
3883
      if (mips_lwxs_address_p (addr)
3884
          || mips_lx_address_p (addr, mode))
3885
        {
3886
          *total = COSTS_N_INSNS (2);
3887
          return true;
3888
        }
3889
      /* Otherwise use the default handling.  */
3890
      return false;
3891
 
3892
    case FFS:
3893
      *total = COSTS_N_INSNS (6);
3894
      return false;
3895
 
3896
    case NOT:
3897
      *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3898
      return false;
3899
 
3900
    case AND:
3901
      /* Check for a *clear_upper32 pattern and treat it like a zero
3902
         extension.  See the pattern's comment for details.  */
3903
      if (TARGET_64BIT
3904
          && mode == DImode
3905
          && CONST_INT_P (XEXP (x, 1))
3906
          && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3907
        {
3908
          *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3909
                    + set_src_cost (XEXP (x, 0), speed));
3910
          return true;
3911
        }
3912
      if (ISA_HAS_CINS && CONST_INT_P (XEXP (x, 1)))
3913
        {
3914
          rtx op = XEXP (x, 0);
3915
          if (GET_CODE (op) == ASHIFT
3916
              && CONST_INT_P (XEXP (op, 1))
3917
              && mask_low_and_shift_p (mode, XEXP (x, 1), XEXP (op, 1), 32))
3918
            {
3919
              *total = COSTS_N_INSNS (1) + set_src_cost (XEXP (op, 0), speed);
3920
              return true;
3921
            }
3922
        }
3923
      /* (AND (NOT op0) (NOT op1) is a nor operation that can be done in
3924
         a single instruction.  */
3925
      if (!TARGET_MIPS16
3926
          && GET_CODE (XEXP (x, 0)) == NOT
3927
          && GET_CODE (XEXP (x, 1)) == NOT)
3928
        {
3929
          cost = GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1;
3930
          *total = (COSTS_N_INSNS (cost)
3931
                    + set_src_cost (XEXP (XEXP (x, 0), 0), speed)
3932
                    + set_src_cost (XEXP (XEXP (x, 1), 0), speed));
3933
          return true;
3934
        }
3935
 
3936
      /* Fall through.  */
3937
 
3938
    case IOR:
3939
    case XOR:
3940
      /* Double-word operations use two single-word operations.  */
3941
      *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3942
                                 speed);
3943
      return true;
3944
 
3945
    case ASHIFT:
3946
    case ASHIFTRT:
3947
    case LSHIFTRT:
3948
    case ROTATE:
3949
    case ROTATERT:
3950
      if (CONSTANT_P (XEXP (x, 1)))
3951
        *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3952
                                   speed);
3953
      else
3954
        *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3955
                                   speed);
3956
      return true;
3957
 
3958
    case ABS:
3959
      if (float_mode_p)
3960
        *total = mips_cost->fp_add;
3961
      else
3962
        *total = COSTS_N_INSNS (4);
3963
      return false;
3964
 
3965
    case LO_SUM:
3966
      /* Low-part immediates need an extended MIPS16 instruction.  */
3967
      *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3968
                + set_src_cost (XEXP (x, 0), speed));
3969
      return true;
3970
 
3971
    case LT:
3972
    case LTU:
3973
    case LE:
3974
    case LEU:
3975
    case GT:
3976
    case GTU:
3977
    case GE:
3978
    case GEU:
3979
    case EQ:
3980
    case NE:
3981
    case UNORDERED:
3982
    case LTGT:
3983
      /* Branch comparisons have VOIDmode, so use the first operand's
3984
         mode instead.  */
3985
      mode = GET_MODE (XEXP (x, 0));
3986
      if (FLOAT_MODE_P (mode))
3987
        {
3988
          *total = mips_cost->fp_add;
3989
          return false;
3990
        }
3991
      *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3992
                                 speed);
3993
      return true;
3994
 
3995
    case MINUS:
3996
      if (float_mode_p
3997
          && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
3998
          && TARGET_FUSED_MADD
3999
          && !HONOR_NANS (mode)
4000
          && !HONOR_SIGNED_ZEROS (mode))
4001
        {
4002
          /* See if we can use NMADD or NMSUB.  See mips.md for the
4003
             associated patterns.  */
4004
          rtx op0 = XEXP (x, 0);
4005
          rtx op1 = XEXP (x, 1);
4006
          if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
4007
            {
4008
              *total = (mips_fp_mult_cost (mode)
4009
                        + set_src_cost (XEXP (XEXP (op0, 0), 0), speed)
4010
                        + set_src_cost (XEXP (op0, 1), speed)
4011
                        + set_src_cost (op1, speed));
4012
              return true;
4013
            }
4014
          if (GET_CODE (op1) == MULT)
4015
            {
4016
              *total = (mips_fp_mult_cost (mode)
4017
                        + set_src_cost (op0, speed)
4018
                        + set_src_cost (XEXP (op1, 0), speed)
4019
                        + set_src_cost (XEXP (op1, 1), speed));
4020
              return true;
4021
            }
4022
        }
4023
      /* Fall through.  */
4024
 
4025
    case PLUS:
4026
      if (float_mode_p)
4027
        {
4028
          /* If this is part of a MADD or MSUB, treat the PLUS as
4029
             being free.  */
4030
          if ((ISA_HAS_FP_MADD4_MSUB4 || ISA_HAS_FP_MADD3_MSUB3)
4031
              && TARGET_FUSED_MADD
4032
              && GET_CODE (XEXP (x, 0)) == MULT)
4033
            *total = 0;
4034
          else
4035
            *total = mips_cost->fp_add;
4036
          return false;
4037
        }
4038
 
4039
      /* Double-word operations require three single-word operations and
4040
         an SLTU.  The MIPS16 version then needs to move the result of
4041
         the SLTU from $24 to a MIPS16 register.  */
4042
      *total = mips_binary_cost (x, COSTS_N_INSNS (1),
4043
                                 COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
4044
                                 speed);
4045
      return true;
4046
 
4047
    case NEG:
4048
      if (float_mode_p
4049
          && (ISA_HAS_NMADD4_NMSUB4 || ISA_HAS_NMADD3_NMSUB3)
4050
          && TARGET_FUSED_MADD
4051
          && !HONOR_NANS (mode)
4052
          && HONOR_SIGNED_ZEROS (mode))
4053
        {
4054
          /* See if we can use NMADD or NMSUB.  See mips.md for the
4055
             associated patterns.  */
4056
          rtx op = XEXP (x, 0);
4057
          if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
4058
              && GET_CODE (XEXP (op, 0)) == MULT)
4059
            {
4060
              *total = (mips_fp_mult_cost (mode)
4061
                        + set_src_cost (XEXP (XEXP (op, 0), 0), speed)
4062
                        + set_src_cost (XEXP (XEXP (op, 0), 1), speed)
4063
                        + set_src_cost (XEXP (op, 1), speed));
4064
              return true;
4065
            }
4066
        }
4067
 
4068
      if (float_mode_p)
4069
        *total = mips_cost->fp_add;
4070
      else
4071
        *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
4072
      return false;
4073
 
4074
    case MULT:
4075
      if (float_mode_p)
4076
        *total = mips_fp_mult_cost (mode);
4077
      else if (mode == DImode && !TARGET_64BIT)
4078
        /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
4079
           where the mulsidi3 always includes an MFHI and an MFLO.  */
4080
        *total = (speed
4081
                  ? mips_cost->int_mult_si * 3 + 6
4082
                  : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
4083
      else if (!speed)
4084
        *total = COSTS_N_INSNS (ISA_HAS_MUL3 ? 1 : 2) + 1;
4085
      else if (mode == DImode)
4086
        *total = mips_cost->int_mult_di;
4087
      else
4088
        *total = mips_cost->int_mult_si;
4089
      return false;
4090
 
4091
    case DIV:
4092
      /* Check for a reciprocal.  */
4093
      if (float_mode_p
4094
          && ISA_HAS_FP_RECIP_RSQRT (mode)
4095
          && flag_unsafe_math_optimizations
4096
          && XEXP (x, 0) == CONST1_RTX (mode))
4097
        {
4098
          if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
4099
            /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
4100
               division as being free.  */
4101
            *total = set_src_cost (XEXP (x, 1), speed);
4102
          else
4103
            *total = (mips_fp_div_cost (mode)
4104
                      + set_src_cost (XEXP (x, 1), speed));
4105
          return true;
4106
        }
4107
      /* Fall through.  */
4108
 
4109
    case SQRT:
4110
    case MOD:
4111
      if (float_mode_p)
4112
        {
4113
          *total = mips_fp_div_cost (mode);
4114
          return false;
4115
        }
4116
      /* Fall through.  */
4117
 
4118
    case UDIV:
4119
    case UMOD:
4120
      if (!speed)
4121
        {
4122
          /* It is our responsibility to make division by a power of 2
4123
             as cheap as 2 register additions if we want the division
4124
             expanders to be used for such operations; see the setting
4125
             of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
4126
             should always produce shorter code than using
4127
             expand_sdiv2_pow2.  */
4128
          if (TARGET_MIPS16
4129
              && CONST_INT_P (XEXP (x, 1))
4130
              && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
4131
            {
4132
              *total = COSTS_N_INSNS (2) + set_src_cost (XEXP (x, 0), speed);
4133
              return true;
4134
            }
4135
          *total = COSTS_N_INSNS (mips_idiv_insns ());
4136
        }
4137
      else if (mode == DImode)
4138
        *total = mips_cost->int_div_di;
4139
      else
4140
        *total = mips_cost->int_div_si;
4141
      return false;
4142
 
4143
    case SIGN_EXTEND:
4144
      *total = mips_sign_extend_cost (mode, XEXP (x, 0));
4145
      return false;
4146
 
4147
    case ZERO_EXTEND:
4148
      if (outer_code == SET
4149
          && ISA_HAS_BADDU
4150
          && (GET_CODE (XEXP (x, 0)) == TRUNCATE
4151
              || GET_CODE (XEXP (x, 0)) == SUBREG)
4152
          && GET_MODE (XEXP (x, 0)) == QImode
4153
          && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
4154
        {
4155
          *total = set_src_cost (XEXP (XEXP (x, 0), 0), speed);
4156
          return true;
4157
        }
4158
      *total = mips_zero_extend_cost (mode, XEXP (x, 0));
4159
      return false;
4160
 
4161
    case FLOAT:
4162
    case UNSIGNED_FLOAT:
4163
    case FIX:
4164
    case FLOAT_EXTEND:
4165
    case FLOAT_TRUNCATE:
4166
      *total = mips_cost->fp_add;
4167
      return false;
4168
 
4169
    case SET:
4170
      if (register_operand (SET_DEST (x), VOIDmode)
4171
          && reg_or_0_operand (SET_SRC (x), VOIDmode))
4172
        {
4173
          *total = mips_set_reg_reg_cost (GET_MODE (SET_DEST (x)));
4174
          return true;
4175
        }
4176
      return false;
4177
 
4178
    default:
4179
      return false;
4180
    }
4181
}
4182
 
4183
/* Implement TARGET_ADDRESS_COST.  */
4184
 
4185
static int
4186
mips_address_cost (rtx addr, enum machine_mode mode,
4187
                   addr_space_t as ATTRIBUTE_UNUSED,
4188
                   bool speed ATTRIBUTE_UNUSED)
4189
{
4190
  return mips_address_insns (addr, mode, false);
4191
}
4192
 
4193
/* Information about a single instruction in a multi-instruction
4194
   asm sequence.  */
4195
struct mips_multi_member {
4196
  /* True if this is a label, false if it is code.  */
4197
  bool is_label_p;
4198
 
4199
  /* The output_asm_insn format of the instruction.  */
4200
  const char *format;
4201
 
4202
  /* The operands to the instruction.  */
4203
  rtx operands[MAX_RECOG_OPERANDS];
4204
};
4205
typedef struct mips_multi_member mips_multi_member;
4206
 
4207
/* The instructions that make up the current multi-insn sequence.  */
4208
static vec<mips_multi_member> mips_multi_members;
4209
 
4210
/* How many instructions (as opposed to labels) are in the current
4211
   multi-insn sequence.  */
4212
static unsigned int mips_multi_num_insns;
4213
 
4214
/* Start a new multi-insn sequence.  */
4215
 
4216
static void
4217
mips_multi_start (void)
4218
{
4219
  mips_multi_members.truncate (0);
4220
  mips_multi_num_insns = 0;
4221
}
4222
 
4223
/* Add a new, uninitialized member to the current multi-insn sequence.  */
4224
 
4225
static struct mips_multi_member *
4226
mips_multi_add (void)
4227
{
4228
  mips_multi_member empty;
4229
  return mips_multi_members.safe_push (empty);
4230
}
4231
 
4232
/* Add a normal insn with the given asm format to the current multi-insn
4233
   sequence.  The other arguments are a null-terminated list of operands.  */
4234
 
4235
static void
4236
mips_multi_add_insn (const char *format, ...)
4237
{
4238
  struct mips_multi_member *member;
4239
  va_list ap;
4240
  unsigned int i;
4241
  rtx op;
4242
 
4243
  member = mips_multi_add ();
4244
  member->is_label_p = false;
4245
  member->format = format;
4246
  va_start (ap, format);
4247
  i = 0;
4248
  while ((op = va_arg (ap, rtx)))
4249
    member->operands[i++] = op;
4250
  va_end (ap);
4251
  mips_multi_num_insns++;
4252
}
4253
 
4254
/* Add the given label definition to the current multi-insn sequence.
4255
   The definition should include the colon.  */
4256
 
4257
static void
4258
mips_multi_add_label (const char *label)
4259
{
4260
  struct mips_multi_member *member;
4261
 
4262
  member = mips_multi_add ();
4263
  member->is_label_p = true;
4264
  member->format = label;
4265
}
4266
 
4267
/* Return the index of the last member of the current multi-insn sequence.  */
4268
 
4269
static unsigned int
4270
mips_multi_last_index (void)
4271
{
4272
  return mips_multi_members.length () - 1;
4273
}
4274
 
4275
/* Add a copy of an existing instruction to the current multi-insn
4276
   sequence.  I is the index of the instruction that should be copied.  */
4277
 
4278
static void
4279
mips_multi_copy_insn (unsigned int i)
4280
{
4281
  struct mips_multi_member *member;
4282
 
4283
  member = mips_multi_add ();
4284
  memcpy (member, &mips_multi_members[i], sizeof (*member));
4285
  gcc_assert (!member->is_label_p);
4286
}
4287
 
4288
/* Change the operand of an existing instruction in the current
4289
   multi-insn sequence.  I is the index of the instruction,
4290
   OP is the index of the operand, and X is the new value.  */
4291
 
4292
static void
4293
mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
4294
{
4295
  mips_multi_members[i].operands[op] = x;
4296
}
4297
 
4298
/* Write out the asm code for the current multi-insn sequence.  */
4299
 
4300
static void
4301
mips_multi_write (void)
4302
{
4303
  struct mips_multi_member *member;
4304
  unsigned int i;
4305
 
4306
  FOR_EACH_VEC_ELT (mips_multi_members, i, member)
4307
    if (member->is_label_p)
4308
      fprintf (asm_out_file, "%s\n", member->format);
4309
    else
4310
      output_asm_insn (member->format, member->operands);
4311
}
4312
 
4313
/* Return one word of double-word value OP, taking into account the fixed
4314
   endianness of certain registers.  HIGH_P is true to select the high part,
4315
   false to select the low part.  */
4316
 
4317
rtx
4318
mips_subword (rtx op, bool high_p)
4319
{
4320
  unsigned int byte, offset;
4321
  enum machine_mode mode;
4322
 
4323
  mode = GET_MODE (op);
4324
  if (mode == VOIDmode)
4325
    mode = TARGET_64BIT ? TImode : DImode;
4326
 
4327
  if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4328
    byte = UNITS_PER_WORD;
4329
  else
4330
    byte = 0;
4331
 
4332
  if (FP_REG_RTX_P (op))
4333
    {
4334
      /* Paired FPRs are always ordered little-endian.  */
4335
      offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4336
      return gen_rtx_REG (word_mode, REGNO (op) + offset);
4337
    }
4338
 
4339
  if (MEM_P (op))
4340
    return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4341
 
4342
  return simplify_gen_subreg (word_mode, op, mode, byte);
4343
}
4344
 
4345
/* Return true if SRC should be moved into DEST using "MULT $0, $0".
4346
   SPLIT_TYPE is the condition under which moves should be split.  */
4347
 
4348
static bool
4349
mips_mult_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4350
{
4351
  return ((split_type != SPLIT_FOR_SPEED
4352
           || mips_tuning_info.fast_mult_zero_zero_p)
4353
          && src == const0_rtx
4354
          && REG_P (dest)
4355
          && GET_MODE_SIZE (GET_MODE (dest)) == 2 * UNITS_PER_WORD
4356
          && (ISA_HAS_DSP_MULT
4357
              ? ACC_REG_P (REGNO (dest))
4358
              : MD_REG_P (REGNO (dest))));
4359
}
4360
 
4361
/* Return true if a move from SRC to DEST should be split into two.
4362
   SPLIT_TYPE describes the split condition.  */
4363
 
4364
bool
4365
mips_split_move_p (rtx dest, rtx src, enum mips_split_type split_type)
4366
{
4367
  /* Check whether the move can be done using some variant of MULT $0,$0.  */
4368
  if (mips_mult_move_p (dest, src, split_type))
4369
    return false;
4370
 
4371
  /* FPR-to-FPR moves can be done in a single instruction, if they're
4372
     allowed at all.  */
4373
  unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
4374
  if (size == 8 && FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4375
    return false;
4376
 
4377
  /* Check for floating-point loads and stores.  */
4378
  if (size == 8 && ISA_HAS_LDC1_SDC1)
4379
    {
4380
      if (FP_REG_RTX_P (dest) && MEM_P (src))
4381
        return false;
4382
      if (FP_REG_RTX_P (src) && MEM_P (dest))
4383
        return false;
4384
    }
4385
 
4386
  /* Otherwise split all multiword moves.  */
4387
  return size > UNITS_PER_WORD;
4388
}
4389
 
4390
/* Split a move from SRC to DEST, given that mips_split_move_p holds.
4391
   SPLIT_TYPE describes the split condition.  */
4392
 
4393
void
4394
mips_split_move (rtx dest, rtx src, enum mips_split_type split_type)
4395
{
4396
  rtx low_dest;
4397
 
4398
  gcc_checking_assert (mips_split_move_p (dest, src, split_type));
4399
  if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4400
    {
4401
      if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4402
        emit_insn (gen_move_doubleword_fprdi (dest, src));
4403
      else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4404
        emit_insn (gen_move_doubleword_fprdf (dest, src));
4405
      else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4406
        emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4407
      else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4408
        emit_insn (gen_move_doubleword_fprv2si (dest, src));
4409
      else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4410
        emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4411
      else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4412
        emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4413
      else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4414
        emit_insn (gen_move_doubleword_fprtf (dest, src));
4415
      else
4416
        gcc_unreachable ();
4417
    }
4418
  else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4419
    {
4420
      low_dest = mips_subword (dest, false);
4421
      mips_emit_move (low_dest, mips_subword (src, false));
4422
      if (TARGET_64BIT)
4423
        emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4424
      else
4425
        emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4426
    }
4427
  else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4428
    {
4429
      mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4430
      if (TARGET_64BIT)
4431
        emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4432
      else
4433
        emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4434
    }
4435
  else
4436
    {
4437
      /* The operation can be split into two normal moves.  Decide in
4438
         which order to do them.  */
4439
      low_dest = mips_subword (dest, false);
4440
      if (REG_P (low_dest)
4441
          && reg_overlap_mentioned_p (low_dest, src))
4442
        {
4443
          mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4444
          mips_emit_move (low_dest, mips_subword (src, false));
4445
        }
4446
      else
4447
        {
4448
          mips_emit_move (low_dest, mips_subword (src, false));
4449
          mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4450
        }
4451
    }
4452
}
4453
 
4454
/* Return the split type for instruction INSN.  */
4455
 
4456
static enum mips_split_type
4457
mips_insn_split_type (rtx insn)
4458
{
4459
  basic_block bb = BLOCK_FOR_INSN (insn);
4460
  if (bb)
4461
    {
4462
      if (optimize_bb_for_speed_p (bb))
4463
        return SPLIT_FOR_SPEED;
4464
      else
4465
        return SPLIT_FOR_SIZE;
4466
    }
4467
  /* Once CFG information has been removed, we should trust the optimization
4468
     decisions made by previous passes and only split where necessary.  */
4469
  return SPLIT_IF_NECESSARY;
4470
}
4471
 
4472
/* Return true if a move from SRC to DEST in INSN should be split.  */
4473
 
4474
bool
4475
mips_split_move_insn_p (rtx dest, rtx src, rtx insn)
4476
{
4477
  return mips_split_move_p (dest, src, mips_insn_split_type (insn));
4478
}
4479
 
4480
/* Split a move from SRC to DEST in INSN, given that mips_split_move_insn_p
4481
   holds.  */
4482
 
4483
void
4484
mips_split_move_insn (rtx dest, rtx src, rtx insn)
4485
{
4486
  mips_split_move (dest, src, mips_insn_split_type (insn));
4487
}
4488
 
4489
/* Return the appropriate instructions to move SRC into DEST.  Assume
4490
   that SRC is operand 1 and DEST is operand 0.  */
4491
 
4492
const char *
4493
mips_output_move (rtx dest, rtx src)
4494
{
4495
  enum rtx_code dest_code, src_code;
4496
  enum machine_mode mode;
4497
  enum mips_symbol_type symbol_type;
4498
  bool dbl_p;
4499
 
4500
  dest_code = GET_CODE (dest);
4501
  src_code = GET_CODE (src);
4502
  mode = GET_MODE (dest);
4503
  dbl_p = (GET_MODE_SIZE (mode) == 8);
4504
 
4505
  if (mips_split_move_p (dest, src, SPLIT_IF_NECESSARY))
4506
    return "#";
4507
 
4508
  if ((src_code == REG && GP_REG_P (REGNO (src)))
4509
      || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4510
    {
4511
      if (dest_code == REG)
4512
        {
4513
          if (GP_REG_P (REGNO (dest)))
4514
            return "move\t%0,%z1";
4515
 
4516
          if (mips_mult_move_p (dest, src, SPLIT_IF_NECESSARY))
4517
            {
4518
              if (ISA_HAS_DSP_MULT)
4519
                return "mult\t%q0,%.,%.";
4520
              else
4521
                return "mult\t%.,%.";
4522
            }
4523
 
4524
          /* Moves to HI are handled by special .md insns.  */
4525
          if (REGNO (dest) == LO_REGNUM)
4526
            return "mtlo\t%z1";
4527
 
4528
          if (DSP_ACC_REG_P (REGNO (dest)))
4529
            {
4530
              static char retval[] = "mt__\t%z1,%q0";
4531
 
4532
              retval[2] = reg_names[REGNO (dest)][4];
4533
              retval[3] = reg_names[REGNO (dest)][5];
4534
              return retval;
4535
            }
4536
 
4537
          if (FP_REG_P (REGNO (dest)))
4538
            return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4539
 
4540
          if (ALL_COP_REG_P (REGNO (dest)))
4541
            {
4542
              static char retval[] = "dmtc_\t%z1,%0";
4543
 
4544
              retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4545
              return dbl_p ? retval : retval + 1;
4546
            }
4547
        }
4548
      if (dest_code == MEM)
4549
        switch (GET_MODE_SIZE (mode))
4550
          {
4551
          case 1: return "sb\t%z1,%0";
4552
          case 2: return "sh\t%z1,%0";
4553
          case 4: return "sw\t%z1,%0";
4554
          case 8: return "sd\t%z1,%0";
4555
          }
4556
    }
4557
  if (dest_code == REG && GP_REG_P (REGNO (dest)))
4558
    {
4559
      if (src_code == REG)
4560
        {
4561
          /* Moves from HI are handled by special .md insns.  */
4562
          if (REGNO (src) == LO_REGNUM)
4563
            {
4564
              /* When generating VR4120 or VR4130 code, we use MACC and
4565
                 DMACC instead of MFLO.  This avoids both the normal
4566
                 MIPS III HI/LO hazards and the errata related to
4567
                 -mfix-vr4130.  */
4568
              if (ISA_HAS_MACCHI)
4569
                return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4570
              return "mflo\t%0";
4571
            }
4572
 
4573
          if (DSP_ACC_REG_P (REGNO (src)))
4574
            {
4575
              static char retval[] = "mf__\t%0,%q1";
4576
 
4577
              retval[2] = reg_names[REGNO (src)][4];
4578
              retval[3] = reg_names[REGNO (src)][5];
4579
              return retval;
4580
            }
4581
 
4582
          if (FP_REG_P (REGNO (src)))
4583
            return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4584
 
4585
          if (ALL_COP_REG_P (REGNO (src)))
4586
            {
4587
              static char retval[] = "dmfc_\t%0,%1";
4588
 
4589
              retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4590
              return dbl_p ? retval : retval + 1;
4591
            }
4592
        }
4593
 
4594
      if (src_code == MEM)
4595
        switch (GET_MODE_SIZE (mode))
4596
          {
4597
          case 1: return "lbu\t%0,%1";
4598
          case 2: return "lhu\t%0,%1";
4599
          case 4: return "lw\t%0,%1";
4600
          case 8: return "ld\t%0,%1";
4601
          }
4602
 
4603
      if (src_code == CONST_INT)
4604
        {
4605
          /* Don't use the X format for the operand itself, because that
4606
             will give out-of-range numbers for 64-bit hosts and 32-bit
4607
             targets.  */
4608
          if (!TARGET_MIPS16)
4609
            return "li\t%0,%1\t\t\t# %X1";
4610
 
4611
          if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4612
            return "li\t%0,%1";
4613
 
4614
          if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4615
            return "#";
4616
        }
4617
 
4618
      if (src_code == HIGH)
4619
        return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4620
 
4621
      if (CONST_GP_P (src))
4622
        return "move\t%0,%1";
4623
 
4624
      if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4625
          && mips_lo_relocs[symbol_type] != 0)
4626
        {
4627
          /* A signed 16-bit constant formed by applying a relocation
4628
             operator to a symbolic address.  */
4629
          gcc_assert (!mips_split_p[symbol_type]);
4630
          return "li\t%0,%R1";
4631
        }
4632
 
4633
      if (symbolic_operand (src, VOIDmode))
4634
        {
4635
          gcc_assert (TARGET_MIPS16
4636
                      ? TARGET_MIPS16_TEXT_LOADS
4637
                      : !TARGET_EXPLICIT_RELOCS);
4638
          return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4639
        }
4640
    }
4641
  if (src_code == REG && FP_REG_P (REGNO (src)))
4642
    {
4643
      if (dest_code == REG && FP_REG_P (REGNO (dest)))
4644
        {
4645
          if (GET_MODE (dest) == V2SFmode)
4646
            return "mov.ps\t%0,%1";
4647
          else
4648
            return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4649
        }
4650
 
4651
      if (dest_code == MEM)
4652
        return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4653
    }
4654
  if (dest_code == REG && FP_REG_P (REGNO (dest)))
4655
    {
4656
      if (src_code == MEM)
4657
        return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4658
    }
4659
  if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4660
    {
4661
      static char retval[] = "l_c_\t%0,%1";
4662
 
4663
      retval[1] = (dbl_p ? 'd' : 'w');
4664
      retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4665
      return retval;
4666
    }
4667
  if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4668
    {
4669
      static char retval[] = "s_c_\t%1,%0";
4670
 
4671
      retval[1] = (dbl_p ? 'd' : 'w');
4672
      retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4673
      return retval;
4674
    }
4675
  gcc_unreachable ();
4676
}
4677
 
4678
/* Return true if CMP1 is a suitable second operand for integer ordering
4679
   test CODE.  See also the *sCC patterns in mips.md.  */
4680
 
4681
static bool
4682
mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4683
{
4684
  switch (code)
4685
    {
4686
    case GT:
4687
    case GTU:
4688
      return reg_or_0_operand (cmp1, VOIDmode);
4689
 
4690
    case GE:
4691
    case GEU:
4692
      return !TARGET_MIPS16 && cmp1 == const1_rtx;
4693
 
4694
    case LT:
4695
    case LTU:
4696
      return arith_operand (cmp1, VOIDmode);
4697
 
4698
    case LE:
4699
      return sle_operand (cmp1, VOIDmode);
4700
 
4701
    case LEU:
4702
      return sleu_operand (cmp1, VOIDmode);
4703
 
4704
    default:
4705
      gcc_unreachable ();
4706
    }
4707
}
4708
 
4709
/* Return true if *CMP1 (of mode MODE) is a valid second operand for
4710
   integer ordering test *CODE, or if an equivalent combination can
4711
   be formed by adjusting *CODE and *CMP1.  When returning true, update
4712
   *CODE and *CMP1 with the chosen code and operand, otherwise leave
4713
   them alone.  */
4714
 
4715
static bool
4716
mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4717
                                  enum machine_mode mode)
4718
{
4719
  HOST_WIDE_INT plus_one;
4720
 
4721
  if (mips_int_order_operand_ok_p (*code, *cmp1))
4722
    return true;
4723
 
4724
  if (CONST_INT_P (*cmp1))
4725
    switch (*code)
4726
      {
4727
      case LE:
4728
        plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4729
        if (INTVAL (*cmp1) < plus_one)
4730
          {
4731
            *code = LT;
4732
            *cmp1 = force_reg (mode, GEN_INT (plus_one));
4733
            return true;
4734
          }
4735
        break;
4736
 
4737
      case LEU:
4738
        plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4739
        if (plus_one != 0)
4740
          {
4741
            *code = LTU;
4742
            *cmp1 = force_reg (mode, GEN_INT (plus_one));
4743
            return true;
4744
          }
4745
        break;
4746
 
4747
      default:
4748
        break;
4749
      }
4750
  return false;
4751
}
4752
 
4753
/* Compare CMP0 and CMP1 using ordering test CODE and store the result
4754
   in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4755
   is nonnull, it's OK to set TARGET to the inverse of the result and
4756
   flip *INVERT_PTR instead.  */
4757
 
4758
static void
4759
mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4760
                          rtx target, rtx cmp0, rtx cmp1)
4761
{
4762
  enum machine_mode mode;
4763
 
4764
  /* First see if there is a MIPS instruction that can do this operation.
4765
     If not, try doing the same for the inverse operation.  If that also
4766
     fails, force CMP1 into a register and try again.  */
4767
  mode = GET_MODE (cmp0);
4768
  if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4769
    mips_emit_binary (code, target, cmp0, cmp1);
4770
  else
4771
    {
4772
      enum rtx_code inv_code = reverse_condition (code);
4773
      if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4774
        {
4775
          cmp1 = force_reg (mode, cmp1);
4776
          mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4777
        }
4778
      else if (invert_ptr == 0)
4779
        {
4780
          rtx inv_target;
4781
 
4782
          inv_target = mips_force_binary (GET_MODE (target),
4783
                                          inv_code, cmp0, cmp1);
4784
          mips_emit_binary (XOR, target, inv_target, const1_rtx);
4785
        }
4786
      else
4787
        {
4788
          *invert_ptr = !*invert_ptr;
4789
          mips_emit_binary (inv_code, target, cmp0, cmp1);
4790
        }
4791
    }
4792
}
4793
 
4794
/* Return a register that is zero iff CMP0 and CMP1 are equal.
4795
   The register will have the same mode as CMP0.  */
4796
 
4797
static rtx
4798
mips_zero_if_equal (rtx cmp0, rtx cmp1)
4799
{
4800
  if (cmp1 == const0_rtx)
4801
    return cmp0;
4802
 
4803
  if (uns_arith_operand (cmp1, VOIDmode))
4804
    return expand_binop (GET_MODE (cmp0), xor_optab,
4805
                         cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4806
 
4807
  return expand_binop (GET_MODE (cmp0), sub_optab,
4808
                       cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4809
}
4810
 
4811
/* Convert *CODE into a code that can be used in a floating-point
4812
   scc instruction (C.cond.fmt).  Return true if the values of
4813
   the condition code registers will be inverted, with 0 indicating
4814
   that the condition holds.  */
4815
 
4816
static bool
4817
mips_reversed_fp_cond (enum rtx_code *code)
4818
{
4819
  switch (*code)
4820
    {
4821
    case NE:
4822
    case LTGT:
4823
    case ORDERED:
4824
      *code = reverse_condition_maybe_unordered (*code);
4825
      return true;
4826
 
4827
    default:
4828
      return false;
4829
    }
4830
}
4831
 
4832
/* Allocate a floating-point condition-code register of mode MODE.
4833
 
4834
   These condition code registers are used for certain kinds
4835
   of compound operation, such as compare and branches, vconds,
4836
   and built-in functions.  At expand time, their use is entirely
4837
   controlled by MIPS-specific code and is entirely internal
4838
   to these compound operations.
4839
 
4840
   We could (and did in the past) expose condition-code values
4841
   as pseudo registers and leave the register allocator to pick
4842
   appropriate registers.  The problem is that it is not practically
4843
   possible for the rtl optimizers to guarantee that no spills will
4844
   be needed, even when AVOID_CCMODE_COPIES is defined.  We would
4845
   therefore need spill and reload sequences to handle the worst case.
4846
 
4847
   Although such sequences do exist, they are very expensive and are
4848
   not something we'd want to use.  This is especially true of CCV2 and
4849
   CCV4, where all the shuffling would greatly outweigh whatever benefit
4850
   the vectorization itself provides.
4851
 
4852
   The main benefit of having more than one condition-code register
4853
   is to allow the pipelining of operations, especially those involving
4854
   comparisons and conditional moves.  We don't really expect the
4855
   registers to be live for long periods, and certainly never want
4856
   them to be live across calls.
4857
 
4858
   Also, there should be no penalty attached to using all the available
4859
   registers.  They are simply bits in the same underlying FPU control
4860
   register.
4861
 
4862
   We therefore expose the hardware registers from the outset and use
4863
   a simple round-robin allocation scheme.  */
4864
 
4865
static rtx
4866
mips_allocate_fcc (enum machine_mode mode)
4867
{
4868
  unsigned int regno, count;
4869
 
4870
  gcc_assert (TARGET_HARD_FLOAT && ISA_HAS_8CC);
4871
 
4872
  if (mode == CCmode)
4873
    count = 1;
4874
  else if (mode == CCV2mode)
4875
    count = 2;
4876
  else if (mode == CCV4mode)
4877
    count = 4;
4878
  else
4879
    gcc_unreachable ();
4880
 
4881
  cfun->machine->next_fcc += -cfun->machine->next_fcc & (count - 1);
4882
  if (cfun->machine->next_fcc > ST_REG_LAST - ST_REG_FIRST)
4883
    cfun->machine->next_fcc = 0;
4884
  regno = ST_REG_FIRST + cfun->machine->next_fcc;
4885
  cfun->machine->next_fcc += count;
4886
  return gen_rtx_REG (mode, regno);
4887
}
4888
 
4889
/* Convert a comparison into something that can be used in a branch or
4890
   conditional move.  On entry, *OP0 and *OP1 are the values being
4891
   compared and *CODE is the code used to compare them.
4892
 
4893
   Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4894
   If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4895
   otherwise any standard branch condition can be used.  The standard branch
4896
   conditions are:
4897
 
4898
      - EQ or NE between two registers.
4899
      - any comparison between a register and zero.  */
4900
 
4901
static void
4902
mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4903
{
4904
  rtx cmp_op0 = *op0;
4905
  rtx cmp_op1 = *op1;
4906
 
4907
  if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4908
    {
4909
      if (!need_eq_ne_p && *op1 == const0_rtx)
4910
        ;
4911
      else if (*code == EQ || *code == NE)
4912
        {
4913
          if (need_eq_ne_p)
4914
            {
4915
              *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4916
              *op1 = const0_rtx;
4917
            }
4918
          else
4919
            *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4920
        }
4921
      else
4922
        {
4923
          /* The comparison needs a separate scc instruction.  Store the
4924
             result of the scc in *OP0 and compare it against zero.  */
4925
          bool invert = false;
4926
          *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4927
          mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4928
          *code = (invert ? EQ : NE);
4929
          *op1 = const0_rtx;
4930
        }
4931
    }
4932
  else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4933
    {
4934
      *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4935
      mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4936
      *code = NE;
4937
      *op1 = const0_rtx;
4938
    }
4939
  else
4940
    {
4941
      enum rtx_code cmp_code;
4942
 
4943
      /* Floating-point tests use a separate C.cond.fmt comparison to
4944
         set a condition code register.  The branch or conditional move
4945
         will then compare that register against zero.
4946
 
4947
         Set CMP_CODE to the code of the comparison instruction and
4948
         *CODE to the code that the branch or move should use.  */
4949
      cmp_code = *code;
4950
      *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4951
      *op0 = (ISA_HAS_8CC
4952
              ? mips_allocate_fcc (CCmode)
4953
              : gen_rtx_REG (CCmode, FPSW_REGNUM));
4954
      *op1 = const0_rtx;
4955
      mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4956
    }
4957
}
4958
 
4959
/* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4960
   and OPERAND[3].  Store the result in OPERANDS[0].
4961
 
4962
   On 64-bit targets, the mode of the comparison and target will always be
4963
   SImode, thus possibly narrower than that of the comparison's operands.  */
4964
 
4965
void
4966
mips_expand_scc (rtx operands[])
4967
{
4968
  rtx target = operands[0];
4969
  enum rtx_code code = GET_CODE (operands[1]);
4970
  rtx op0 = operands[2];
4971
  rtx op1 = operands[3];
4972
 
4973
  gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4974
 
4975
  if (code == EQ || code == NE)
4976
    {
4977
      if (ISA_HAS_SEQ_SNE
4978
          && reg_imm10_operand (op1, GET_MODE (op1)))
4979
        mips_emit_binary (code, target, op0, op1);
4980
      else
4981
        {
4982
          rtx zie = mips_zero_if_equal (op0, op1);
4983
          mips_emit_binary (code, target, zie, const0_rtx);
4984
        }
4985
    }
4986
  else
4987
    mips_emit_int_order_test (code, 0, target, op0, op1);
4988
}
4989
 
4990
/* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4991
   CODE and jump to OPERANDS[3] if the condition holds.  */
4992
 
4993
void
4994
mips_expand_conditional_branch (rtx *operands)
4995
{
4996
  enum rtx_code code = GET_CODE (operands[0]);
4997
  rtx op0 = operands[1];
4998
  rtx op1 = operands[2];
4999
  rtx condition;
5000
 
5001
  mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
5002
  condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
5003
  emit_jump_insn (gen_condjump (condition, operands[3]));
5004
}
5005
 
5006
/* Implement:
5007
 
5008
   (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
5009
   (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
5010
 
5011
void
5012
mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
5013
                       enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
5014
{
5015
  rtx cmp_result;
5016
  bool reversed_p;
5017
 
5018
  reversed_p = mips_reversed_fp_cond (&cond);
5019
  cmp_result = mips_allocate_fcc (CCV2mode);
5020
  emit_insn (gen_scc_ps (cmp_result,
5021
                         gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
5022
  if (reversed_p)
5023
    emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
5024
                                         cmp_result));
5025
  else
5026
    emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
5027
                                         cmp_result));
5028
}
5029
 
5030
/* Perform the comparison in OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0]
5031
   if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
5032
 
5033
void
5034
mips_expand_conditional_move (rtx *operands)
5035
{
5036
  rtx cond;
5037
  enum rtx_code code = GET_CODE (operands[1]);
5038
  rtx op0 = XEXP (operands[1], 0);
5039
  rtx op1 = XEXP (operands[1], 1);
5040
 
5041
  mips_emit_compare (&code, &op0, &op1, true);
5042
  cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
5043
  emit_insn (gen_rtx_SET (VOIDmode, operands[0],
5044
                          gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
5045
                                                operands[2], operands[3])));
5046
}
5047
 
5048
/* Perform the comparison in COMPARISON, then trap if the condition holds.  */
5049
 
5050
void
5051
mips_expand_conditional_trap (rtx comparison)
5052
{
5053
  rtx op0, op1;
5054
  enum machine_mode mode;
5055
  enum rtx_code code;
5056
 
5057
  /* MIPS conditional trap instructions don't have GT or LE flavors,
5058
     so we must swap the operands and convert to LT and GE respectively.  */
5059
  code = GET_CODE (comparison);
5060
  switch (code)
5061
    {
5062
    case GT:
5063
    case LE:
5064
    case GTU:
5065
    case LEU:
5066
      code = swap_condition (code);
5067
      op0 = XEXP (comparison, 1);
5068
      op1 = XEXP (comparison, 0);
5069
      break;
5070
 
5071
    default:
5072
      op0 = XEXP (comparison, 0);
5073
      op1 = XEXP (comparison, 1);
5074
      break;
5075
    }
5076
 
5077
  mode = GET_MODE (XEXP (comparison, 0));
5078
  op0 = force_reg (mode, op0);
5079
  if (!arith_operand (op1, mode))
5080
    op1 = force_reg (mode, op1);
5081
 
5082
  emit_insn (gen_rtx_TRAP_IF (VOIDmode,
5083
                              gen_rtx_fmt_ee (code, mode, op0, op1),
5084
                              const0_rtx));
5085
}
5086
 
5087
/* Initialize *CUM for a call to a function of type FNTYPE.  */
5088
 
5089
void
5090
mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
5091
{
5092
  memset (cum, 0, sizeof (*cum));
5093
  cum->prototype = (fntype && prototype_p (fntype));
5094
  cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
5095
}
5096
 
5097
/* Fill INFO with information about a single argument.  CUM is the
5098
   cumulative state for earlier arguments.  MODE is the mode of this
5099
   argument and TYPE is its type (if known).  NAMED is true if this
5100
   is a named (fixed) argument rather than a variable one.  */
5101
 
5102
static void
5103
mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
5104
                   enum machine_mode mode, const_tree type, bool named)
5105
{
5106
  bool doubleword_aligned_p;
5107
  unsigned int num_bytes, num_words, max_regs;
5108
 
5109
  /* Work out the size of the argument.  */
5110
  num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5111
  num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5112
 
5113
  /* Decide whether it should go in a floating-point register, assuming
5114
     one is free.  Later code checks for availability.
5115
 
5116
     The checks against UNITS_PER_FPVALUE handle the soft-float and
5117
     single-float cases.  */
5118
  switch (mips_abi)
5119
    {
5120
    case ABI_EABI:
5121
      /* The EABI conventions have traditionally been defined in terms
5122
         of TYPE_MODE, regardless of the actual type.  */
5123
      info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
5124
                      || mode == V2SFmode)
5125
                     && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5126
      break;
5127
 
5128
    case ABI_32:
5129
    case ABI_O64:
5130
      /* Only leading floating-point scalars are passed in
5131
         floating-point registers.  We also handle vector floats the same
5132
         say, which is OK because they are not covered by the standard ABI.  */
5133
      info->fpr_p = (!cum->gp_reg_found
5134
                     && cum->arg_number < 2
5135
                     && (type == 0
5136
                         || SCALAR_FLOAT_TYPE_P (type)
5137
                         || VECTOR_FLOAT_TYPE_P (type))
5138
                     && (GET_MODE_CLASS (mode) == MODE_FLOAT
5139
                         || mode == V2SFmode)
5140
                     && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
5141
      break;
5142
 
5143
    case ABI_N32:
5144
    case ABI_64:
5145
      /* Scalar, complex and vector floating-point types are passed in
5146
         floating-point registers, as long as this is a named rather
5147
         than a variable argument.  */
5148
      info->fpr_p = (named
5149
                     && (type == 0 || FLOAT_TYPE_P (type))
5150
                     && (GET_MODE_CLASS (mode) == MODE_FLOAT
5151
                         || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5152
                         || mode == V2SFmode)
5153
                     && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
5154
 
5155
      /* ??? According to the ABI documentation, the real and imaginary
5156
         parts of complex floats should be passed in individual registers.
5157
         The real and imaginary parts of stack arguments are supposed
5158
         to be contiguous and there should be an extra word of padding
5159
         at the end.
5160
 
5161
         This has two problems.  First, it makes it impossible to use a
5162
         single "void *" va_list type, since register and stack arguments
5163
         are passed differently.  (At the time of writing, MIPSpro cannot
5164
         handle complex float varargs correctly.)  Second, it's unclear
5165
         what should happen when there is only one register free.
5166
 
5167
         For now, we assume that named complex floats should go into FPRs
5168
         if there are two FPRs free, otherwise they should be passed in the
5169
         same way as a struct containing two floats.  */
5170
      if (info->fpr_p
5171
          && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5172
          && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
5173
        {
5174
          if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
5175
            info->fpr_p = false;
5176
          else
5177
            num_words = 2;
5178
        }
5179
      break;
5180
 
5181
    default:
5182
      gcc_unreachable ();
5183
    }
5184
 
5185
  /* See whether the argument has doubleword alignment.  */
5186
  doubleword_aligned_p = (mips_function_arg_boundary (mode, type)
5187
                          > BITS_PER_WORD);
5188
 
5189
  /* Set REG_OFFSET to the register count we're interested in.
5190
     The EABI allocates the floating-point registers separately,
5191
     but the other ABIs allocate them like integer registers.  */
5192
  info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
5193
                      ? cum->num_fprs
5194
                      : cum->num_gprs);
5195
 
5196
  /* Advance to an even register if the argument is doubleword-aligned.  */
5197
  if (doubleword_aligned_p)
5198
    info->reg_offset += info->reg_offset & 1;
5199
 
5200
  /* Work out the offset of a stack argument.  */
5201
  info->stack_offset = cum->stack_words;
5202
  if (doubleword_aligned_p)
5203
    info->stack_offset += info->stack_offset & 1;
5204
 
5205
  max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
5206
 
5207
  /* Partition the argument between registers and stack.  */
5208
  info->reg_words = MIN (num_words, max_regs);
5209
  info->stack_words = num_words - info->reg_words;
5210
}
5211
 
5212
/* INFO describes a register argument that has the normal format for the
5213
   argument's mode.  Return the register it uses, assuming that FPRs are
5214
   available if HARD_FLOAT_P.  */
5215
 
5216
static unsigned int
5217
mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
5218
{
5219
  if (!info->fpr_p || !hard_float_p)
5220
    return GP_ARG_FIRST + info->reg_offset;
5221
  else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
5222
    /* In o32, the second argument is always passed in $f14
5223
       for TARGET_DOUBLE_FLOAT, regardless of whether the
5224
       first argument was a word or doubleword.  */
5225
    return FP_ARG_FIRST + 2;
5226
  else
5227
    return FP_ARG_FIRST + info->reg_offset;
5228
}
5229
 
5230
/* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
5231
 
5232
static bool
5233
mips_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
5234
{
5235
  return !TARGET_OLDABI;
5236
}
5237
 
5238
/* Implement TARGET_FUNCTION_ARG.  */
5239
 
5240
static rtx
5241
mips_function_arg (cumulative_args_t cum_v, enum machine_mode mode,
5242
                   const_tree type, bool named)
5243
{
5244
  CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5245
  struct mips_arg_info info;
5246
 
5247
  /* We will be called with a mode of VOIDmode after the last argument
5248
     has been seen.  Whatever we return will be passed to the call expander.
5249
     If we need a MIPS16 fp_code, return a REG with the code stored as
5250
     the mode.  */
5251
  if (mode == VOIDmode)
5252
    {
5253
      if (TARGET_MIPS16 && cum->fp_code != 0)
5254
        return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
5255
      else
5256
        return NULL;
5257
    }
5258
 
5259
  mips_get_arg_info (&info, cum, mode, type, named);
5260
 
5261
  /* Return straight away if the whole argument is passed on the stack.  */
5262
  if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
5263
    return NULL;
5264
 
5265
  /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
5266
     contains a double in its entirety, then that 64-bit chunk is passed
5267
     in a floating-point register.  */
5268
  if (TARGET_NEWABI
5269
      && TARGET_HARD_FLOAT
5270
      && named
5271
      && type != 0
5272
      && TREE_CODE (type) == RECORD_TYPE
5273
      && TYPE_SIZE_UNIT (type)
5274
      && tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
5275
    {
5276
      tree field;
5277
 
5278
      /* First check to see if there is any such field.  */
5279
      for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5280
        if (TREE_CODE (field) == FIELD_DECL
5281
            && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5282
            && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
5283
            && tree_fits_shwi_p (bit_position (field))
5284
            && int_bit_position (field) % BITS_PER_WORD == 0)
5285
          break;
5286
 
5287
      if (field != 0)
5288
        {
5289
          /* Now handle the special case by returning a PARALLEL
5290
             indicating where each 64-bit chunk goes.  INFO.REG_WORDS
5291
             chunks are passed in registers.  */
5292
          unsigned int i;
5293
          HOST_WIDE_INT bitpos;
5294
          rtx ret;
5295
 
5296
          /* assign_parms checks the mode of ENTRY_PARM, so we must
5297
             use the actual mode here.  */
5298
          ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
5299
 
5300
          bitpos = 0;
5301
          field = TYPE_FIELDS (type);
5302
          for (i = 0; i < info.reg_words; i++)
5303
            {
5304
              rtx reg;
5305
 
5306
              for (; field; field = DECL_CHAIN (field))
5307
                if (TREE_CODE (field) == FIELD_DECL
5308
                    && int_bit_position (field) >= bitpos)
5309
                  break;
5310
 
5311
              if (field
5312
                  && int_bit_position (field) == bitpos
5313
                  && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
5314
                  && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
5315
                reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
5316
              else
5317
                reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
5318
 
5319
              XVECEXP (ret, 0, i)
5320
                = gen_rtx_EXPR_LIST (VOIDmode, reg,
5321
                                     GEN_INT (bitpos / BITS_PER_UNIT));
5322
 
5323
              bitpos += BITS_PER_WORD;
5324
            }
5325
          return ret;
5326
        }
5327
    }
5328
 
5329
  /* Handle the n32/n64 conventions for passing complex floating-point
5330
     arguments in FPR pairs.  The real part goes in the lower register
5331
     and the imaginary part goes in the upper register.  */
5332
  if (TARGET_NEWABI
5333
      && info.fpr_p
5334
      && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5335
    {
5336
      rtx real, imag;
5337
      enum machine_mode inner;
5338
      unsigned int regno;
5339
 
5340
      inner = GET_MODE_INNER (mode);
5341
      regno = FP_ARG_FIRST + info.reg_offset;
5342
      if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
5343
        {
5344
          /* Real part in registers, imaginary part on stack.  */
5345
          gcc_assert (info.stack_words == info.reg_words);
5346
          return gen_rtx_REG (inner, regno);
5347
        }
5348
      else
5349
        {
5350
          gcc_assert (info.stack_words == 0);
5351
          real = gen_rtx_EXPR_LIST (VOIDmode,
5352
                                    gen_rtx_REG (inner, regno),
5353
                                    const0_rtx);
5354
          imag = gen_rtx_EXPR_LIST (VOIDmode,
5355
                                    gen_rtx_REG (inner,
5356
                                                 regno + info.reg_words / 2),
5357
                                    GEN_INT (GET_MODE_SIZE (inner)));
5358
          return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
5359
        }
5360
    }
5361
 
5362
  return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
5363
}
5364
 
5365
/* Implement TARGET_FUNCTION_ARG_ADVANCE.  */
5366
 
5367
static void
5368
mips_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
5369
                           const_tree type, bool named)
5370
{
5371
  CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5372
  struct mips_arg_info info;
5373
 
5374
  mips_get_arg_info (&info, cum, mode, type, named);
5375
 
5376
  if (!info.fpr_p)
5377
    cum->gp_reg_found = true;
5378
 
5379
  /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
5380
     an explanation of what this code does.  It assumes that we're using
5381
     either the o32 or the o64 ABI, both of which pass at most 2 arguments
5382
     in FPRs.  */
5383
  if (cum->arg_number < 2 && info.fpr_p)
5384
    cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
5385
 
5386
  /* Advance the register count.  This has the effect of setting
5387
     num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
5388
     argument required us to skip the final GPR and pass the whole
5389
     argument on the stack.  */
5390
  if (mips_abi != ABI_EABI || !info.fpr_p)
5391
    cum->num_gprs = info.reg_offset + info.reg_words;
5392
  else if (info.reg_words > 0)
5393
    cum->num_fprs += MAX_FPRS_PER_FMT;
5394
 
5395
  /* Advance the stack word count.  */
5396
  if (info.stack_words > 0)
5397
    cum->stack_words = info.stack_offset + info.stack_words;
5398
 
5399
  cum->arg_number++;
5400
}
5401
 
5402
/* Implement TARGET_ARG_PARTIAL_BYTES.  */
5403
 
5404
static int
5405
mips_arg_partial_bytes (cumulative_args_t cum,
5406
                        enum machine_mode mode, tree type, bool named)
5407
{
5408
  struct mips_arg_info info;
5409
 
5410
  mips_get_arg_info (&info, get_cumulative_args (cum), mode, type, named);
5411
  return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
5412
}
5413
 
5414
/* Implement TARGET_FUNCTION_ARG_BOUNDARY.  Every parameter gets at
5415
   least PARM_BOUNDARY bits of alignment, but will be given anything up
5416
   to STACK_BOUNDARY bits if the type requires it.  */
5417
 
5418
static unsigned int
5419
mips_function_arg_boundary (enum machine_mode mode, const_tree type)
5420
{
5421
  unsigned int alignment;
5422
 
5423
  alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
5424
  if (alignment < PARM_BOUNDARY)
5425
    alignment = PARM_BOUNDARY;
5426
  if (alignment > STACK_BOUNDARY)
5427
    alignment = STACK_BOUNDARY;
5428
  return alignment;
5429
}
5430
 
5431
/* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
5432
   upward rather than downward.  In other words, return true if the
5433
   first byte of the stack slot has useful data, false if the last
5434
   byte does.  */
5435
 
5436
bool
5437
mips_pad_arg_upward (enum machine_mode mode, const_tree type)
5438
{
5439
  /* On little-endian targets, the first byte of every stack argument
5440
     is passed in the first byte of the stack slot.  */
5441
  if (!BYTES_BIG_ENDIAN)
5442
    return true;
5443
 
5444
  /* Otherwise, integral types are padded downward: the last byte of a
5445
     stack argument is passed in the last byte of the stack slot.  */
5446
  if (type != 0
5447
      ? (INTEGRAL_TYPE_P (type)
5448
         || POINTER_TYPE_P (type)
5449
         || FIXED_POINT_TYPE_P (type))
5450
      : (SCALAR_INT_MODE_P (mode)
5451
         || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5452
    return false;
5453
 
5454
  /* Big-endian o64 pads floating-point arguments downward.  */
5455
  if (mips_abi == ABI_O64)
5456
    if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5457
      return false;
5458
 
5459
  /* Other types are padded upward for o32, o64, n32 and n64.  */
5460
  if (mips_abi != ABI_EABI)
5461
    return true;
5462
 
5463
  /* Arguments smaller than a stack slot are padded downward.  */
5464
  if (mode != BLKmode)
5465
    return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5466
  else
5467
    return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5468
}
5469
 
5470
/* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
5471
   if the least significant byte of the register has useful data.  Return
5472
   the opposite if the most significant byte does.  */
5473
 
5474
bool
5475
mips_pad_reg_upward (enum machine_mode mode, tree type)
5476
{
5477
  /* No shifting is required for floating-point arguments.  */
5478
  if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5479
    return !BYTES_BIG_ENDIAN;
5480
 
5481
  /* Otherwise, apply the same padding to register arguments as we do
5482
     to stack arguments.  */
5483
  return mips_pad_arg_upward (mode, type);
5484
}
5485
 
5486
/* Return nonzero when an argument must be passed by reference.  */
5487
 
5488
static bool
5489
mips_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
5490
                        enum machine_mode mode, const_tree type,
5491
                        bool named ATTRIBUTE_UNUSED)
5492
{
5493
  if (mips_abi == ABI_EABI)
5494
    {
5495
      int size;
5496
 
5497
      /* ??? How should SCmode be handled?  */
5498
      if (mode == DImode || mode == DFmode
5499
          || mode == DQmode || mode == UDQmode
5500
          || mode == DAmode || mode == UDAmode)
5501
        return 0;
5502
 
5503
      size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5504
      return size == -1 || size > UNITS_PER_WORD;
5505
    }
5506
  else
5507
    {
5508
      /* If we have a variable-sized parameter, we have no choice.  */
5509
      return targetm.calls.must_pass_in_stack (mode, type);
5510
    }
5511
}
5512
 
5513
/* Implement TARGET_CALLEE_COPIES.  */
5514
 
5515
static bool
5516
mips_callee_copies (cumulative_args_t cum ATTRIBUTE_UNUSED,
5517
                    enum machine_mode mode ATTRIBUTE_UNUSED,
5518
                    const_tree type ATTRIBUTE_UNUSED, bool named)
5519
{
5520
  return mips_abi == ABI_EABI && named;
5521
}
5522
 
5523
/* See whether VALTYPE is a record whose fields should be returned in
5524
   floating-point registers.  If so, return the number of fields and
5525
   list them in FIELDS (which should have two elements).  Return 0
5526
   otherwise.
5527
 
5528
   For n32 & n64, a structure with one or two fields is returned in
5529
   floating-point registers as long as every field has a floating-point
5530
   type.  */
5531
 
5532
static int
5533
mips_fpr_return_fields (const_tree valtype, tree *fields)
5534
{
5535
  tree field;
5536
  int i;
5537
 
5538
  if (!TARGET_NEWABI)
5539
    return 0;
5540
 
5541
  if (TREE_CODE (valtype) != RECORD_TYPE)
5542
    return 0;
5543
 
5544
  i = 0;
5545
  for (field = TYPE_FIELDS (valtype); field != 0; field = DECL_CHAIN (field))
5546
    {
5547
      if (TREE_CODE (field) != FIELD_DECL)
5548
        continue;
5549
 
5550
      if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5551
        return 0;
5552
 
5553
      if (i == 2)
5554
        return 0;
5555
 
5556
      fields[i++] = field;
5557
    }
5558
  return i;
5559
}
5560
 
5561
/* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
5562
   a value in the most significant part of $2/$3 if:
5563
 
5564
      - the target is big-endian;
5565
 
5566
      - the value has a structure or union type (we generalize this to
5567
        cover aggregates from other languages too); and
5568
 
5569
      - the structure is not returned in floating-point registers.  */
5570
 
5571
static bool
5572
mips_return_in_msb (const_tree valtype)
5573
{
5574
  tree fields[2];
5575
 
5576
  return (TARGET_NEWABI
5577
          && TARGET_BIG_ENDIAN
5578
          && AGGREGATE_TYPE_P (valtype)
5579
          && mips_fpr_return_fields (valtype, fields) == 0);
5580
}
5581
 
5582
/* Return true if the function return value MODE will get returned in a
5583
   floating-point register.  */
5584
 
5585
static bool
5586
mips_return_mode_in_fpr_p (enum machine_mode mode)
5587
{
5588
  return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5589
           || mode == V2SFmode
5590
           || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5591
          && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5592
}
5593
 
5594
/* Return the representation of an FPR return register when the
5595
   value being returned in FP_RETURN has mode VALUE_MODE and the
5596
   return type itself has mode TYPE_MODE.  On NewABI targets,
5597
   the two modes may be different for structures like:
5598
 
5599
       struct __attribute__((packed)) foo { float f; }
5600
 
5601
   where we return the SFmode value of "f" in FP_RETURN, but where
5602
   the structure itself has mode BLKmode.  */
5603
 
5604
static rtx
5605
mips_return_fpr_single (enum machine_mode type_mode,
5606
                        enum machine_mode value_mode)
5607
{
5608
  rtx x;
5609
 
5610
  x = gen_rtx_REG (value_mode, FP_RETURN);
5611
  if (type_mode != value_mode)
5612
    {
5613
      x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5614
      x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5615
    }
5616
  return x;
5617
}
5618
 
5619
/* Return a composite value in a pair of floating-point registers.
5620
   MODE1 and OFFSET1 are the mode and byte offset for the first value,
5621
   likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
5622
   complete value.
5623
 
5624
   For n32 & n64, $f0 always holds the first value and $f2 the second.
5625
   Otherwise the values are packed together as closely as possible.  */
5626
 
5627
static rtx
5628
mips_return_fpr_pair (enum machine_mode mode,
5629
                      enum machine_mode mode1, HOST_WIDE_INT offset1,
5630
                      enum machine_mode mode2, HOST_WIDE_INT offset2)
5631
{
5632
  int inc;
5633
 
5634
  inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5635
  return gen_rtx_PARALLEL
5636
    (mode,
5637
     gen_rtvec (2,
5638
                gen_rtx_EXPR_LIST (VOIDmode,
5639
                                   gen_rtx_REG (mode1, FP_RETURN),
5640
                                   GEN_INT (offset1)),
5641
                gen_rtx_EXPR_LIST (VOIDmode,
5642
                                   gen_rtx_REG (mode2, FP_RETURN + inc),
5643
                                   GEN_INT (offset2))));
5644
 
5645
}
5646
 
5647
/* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
5648
   For normal calls, VALTYPE is the return type and MODE is VOIDmode.
5649
   For libcalls, VALTYPE is null and MODE is the mode of the return value.  */
5650
 
5651
static rtx
5652
mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
5653
                       enum machine_mode mode)
5654
{
5655
  if (valtype)
5656
    {
5657
      tree fields[2];
5658
      int unsigned_p;
5659
      const_tree func;
5660
 
5661
      if (fn_decl_or_type && DECL_P (fn_decl_or_type))
5662
        func = fn_decl_or_type;
5663
      else
5664
        func = NULL;
5665
 
5666
      mode = TYPE_MODE (valtype);
5667
      unsigned_p = TYPE_UNSIGNED (valtype);
5668
 
5669
      /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5670
         return values, promote the mode here too.  */
5671
      mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5672
 
5673
      /* Handle structures whose fields are returned in $f0/$f2.  */
5674
      switch (mips_fpr_return_fields (valtype, fields))
5675
        {
5676
        case 1:
5677
          return mips_return_fpr_single (mode,
5678
                                         TYPE_MODE (TREE_TYPE (fields[0])));
5679
 
5680
        case 2:
5681
          return mips_return_fpr_pair (mode,
5682
                                       TYPE_MODE (TREE_TYPE (fields[0])),
5683
                                       int_byte_position (fields[0]),
5684
                                       TYPE_MODE (TREE_TYPE (fields[1])),
5685
                                       int_byte_position (fields[1]));
5686
        }
5687
 
5688
      /* If a value is passed in the most significant part of a register, see
5689
         whether we have to round the mode up to a whole number of words.  */
5690
      if (mips_return_in_msb (valtype))
5691
        {
5692
          HOST_WIDE_INT size = int_size_in_bytes (valtype);
5693
          if (size % UNITS_PER_WORD != 0)
5694
            {
5695
              size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5696
              mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5697
            }
5698
        }
5699
 
5700
      /* For EABI, the class of return register depends entirely on MODE.
5701
         For example, "struct { some_type x; }" and "union { some_type x; }"
5702
         are returned in the same way as a bare "some_type" would be.
5703
         Other ABIs only use FPRs for scalar, complex or vector types.  */
5704
      if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5705
        return gen_rtx_REG (mode, GP_RETURN);
5706
    }
5707
 
5708
  if (!TARGET_MIPS16)
5709
    {
5710
      /* Handle long doubles for n32 & n64.  */
5711
      if (mode == TFmode)
5712
        return mips_return_fpr_pair (mode,
5713
                                     DImode, 0,
5714
                                     DImode, GET_MODE_SIZE (mode) / 2);
5715
 
5716
      if (mips_return_mode_in_fpr_p (mode))
5717
        {
5718
          if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5719
            return mips_return_fpr_pair (mode,
5720
                                         GET_MODE_INNER (mode), 0,
5721
                                         GET_MODE_INNER (mode),
5722
                                         GET_MODE_SIZE (mode) / 2);
5723
          else
5724
            return gen_rtx_REG (mode, FP_RETURN);
5725
        }
5726
    }
5727
 
5728
  return gen_rtx_REG (mode, GP_RETURN);
5729
}
5730
 
5731
/* Implement TARGET_FUNCTION_VALUE.  */
5732
 
5733
static rtx
5734
mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
5735
                     bool outgoing ATTRIBUTE_UNUSED)
5736
{
5737
  return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
5738
}
5739
 
5740
/* Implement TARGET_LIBCALL_VALUE.  */
5741
 
5742
static rtx
5743
mips_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5744
{
5745
  return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
5746
}
5747
 
5748
/* Implement TARGET_FUNCTION_VALUE_REGNO_P.
5749
 
5750
   On the MIPS, R2 R3 and F0 F2 are the only register thus used.
5751
   Currently, R2 and F0 are only implemented here (C has no complex type).  */
5752
 
5753
static bool
5754
mips_function_value_regno_p (const unsigned int regno)
5755
{
5756
  if (regno == GP_RETURN
5757
      || regno == FP_RETURN
5758
      || (LONG_DOUBLE_TYPE_SIZE == 128
5759
          && FP_RETURN != GP_RETURN
5760
          && regno == FP_RETURN + 2))
5761
    return true;
5762
 
5763
  return false;
5764
}
5765
 
5766
/* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5767
   all BLKmode objects are returned in memory.  Under the n32, n64
5768
   and embedded ABIs, small structures are returned in a register.
5769
   Objects with varying size must still be returned in memory, of
5770
   course.  */
5771
 
5772
static bool
5773
mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5774
{
5775
  return (TARGET_OLDABI
5776
          ? TYPE_MODE (type) == BLKmode
5777
          : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5778
}
5779
 
5780
/* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5781
 
5782
static void
5783
mips_setup_incoming_varargs (cumulative_args_t cum, enum machine_mode mode,
5784
                             tree type, int *pretend_size ATTRIBUTE_UNUSED,
5785
                             int no_rtl)
5786
{
5787
  CUMULATIVE_ARGS local_cum;
5788
  int gp_saved, fp_saved;
5789
 
5790
  /* The caller has advanced CUM up to, but not beyond, the last named
5791
     argument.  Advance a local copy of CUM past the last "real" named
5792
     argument, to find out how many registers are left over.  */
5793
  local_cum = *get_cumulative_args (cum);
5794
  mips_function_arg_advance (pack_cumulative_args (&local_cum), mode, type,
5795
                             true);
5796
 
5797
  /* Found out how many registers we need to save.  */
5798
  gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5799
  fp_saved = (EABI_FLOAT_VARARGS_P
5800
              ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5801
              : 0);
5802
 
5803
  if (!no_rtl)
5804
    {
5805
      if (gp_saved > 0)
5806
        {
5807
          rtx ptr, mem;
5808
 
5809
          ptr = plus_constant (Pmode, virtual_incoming_args_rtx,
5810
                               REG_PARM_STACK_SPACE (cfun->decl)
5811
                               - gp_saved * UNITS_PER_WORD);
5812
          mem = gen_frame_mem (BLKmode, ptr);
5813
          set_mem_alias_set (mem, get_varargs_alias_set ());
5814
 
5815
          move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5816
                               mem, gp_saved);
5817
        }
5818
      if (fp_saved > 0)
5819
        {
5820
          /* We can't use move_block_from_reg, because it will use
5821
             the wrong mode.  */
5822
          enum machine_mode mode;
5823
          int off, i;
5824
 
5825
          /* Set OFF to the offset from virtual_incoming_args_rtx of
5826
             the first float register.  The FP save area lies below
5827
             the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5828
          off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5829
          off -= fp_saved * UNITS_PER_FPREG;
5830
 
5831
          mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5832
 
5833
          for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5834
               i += MAX_FPRS_PER_FMT)
5835
            {
5836
              rtx ptr, mem;
5837
 
5838
              ptr = plus_constant (Pmode, virtual_incoming_args_rtx, off);
5839
              mem = gen_frame_mem (mode, ptr);
5840
              set_mem_alias_set (mem, get_varargs_alias_set ());
5841
              mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5842
              off += UNITS_PER_HWFPVALUE;
5843
            }
5844
        }
5845
    }
5846
  if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5847
    cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5848
                                   + fp_saved * UNITS_PER_FPREG);
5849
}
5850
 
5851
/* Implement TARGET_BUILTIN_VA_LIST.  */
5852
 
5853
static tree
5854
mips_build_builtin_va_list (void)
5855
{
5856
  if (EABI_FLOAT_VARARGS_P)
5857
    {
5858
      /* We keep 3 pointers, and two offsets.
5859
 
5860
         Two pointers are to the overflow area, which starts at the CFA.
5861
         One of these is constant, for addressing into the GPR save area
5862
         below it.  The other is advanced up the stack through the
5863
         overflow region.
5864
 
5865
         The third pointer is to the bottom of the GPR save area.
5866
         Since the FPR save area is just below it, we can address
5867
         FPR slots off this pointer.
5868
 
5869
         We also keep two one-byte offsets, which are to be subtracted
5870
         from the constant pointers to yield addresses in the GPR and
5871
         FPR save areas.  These are downcounted as float or non-float
5872
         arguments are used, and when they get to zero, the argument
5873
         must be obtained from the overflow region.  */
5874
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5875
      tree array, index;
5876
 
5877
      record = lang_hooks.types.make_type (RECORD_TYPE);
5878
 
5879
      f_ovfl = build_decl (BUILTINS_LOCATION,
5880
                           FIELD_DECL, get_identifier ("__overflow_argptr"),
5881
                           ptr_type_node);
5882
      f_gtop = build_decl (BUILTINS_LOCATION,
5883
                           FIELD_DECL, get_identifier ("__gpr_top"),
5884
                           ptr_type_node);
5885
      f_ftop = build_decl (BUILTINS_LOCATION,
5886
                           FIELD_DECL, get_identifier ("__fpr_top"),
5887
                           ptr_type_node);
5888
      f_goff = build_decl (BUILTINS_LOCATION,
5889
                           FIELD_DECL, get_identifier ("__gpr_offset"),
5890
                           unsigned_char_type_node);
5891
      f_foff = build_decl (BUILTINS_LOCATION,
5892
                           FIELD_DECL, get_identifier ("__fpr_offset"),
5893
                           unsigned_char_type_node);
5894
      /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5895
         warn on every user file.  */
5896
      index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5897
      array = build_array_type (unsigned_char_type_node,
5898
                                build_index_type (index));
5899
      f_res = build_decl (BUILTINS_LOCATION,
5900
                          FIELD_DECL, get_identifier ("__reserved"), array);
5901
 
5902
      DECL_FIELD_CONTEXT (f_ovfl) = record;
5903
      DECL_FIELD_CONTEXT (f_gtop) = record;
5904
      DECL_FIELD_CONTEXT (f_ftop) = record;
5905
      DECL_FIELD_CONTEXT (f_goff) = record;
5906
      DECL_FIELD_CONTEXT (f_foff) = record;
5907
      DECL_FIELD_CONTEXT (f_res) = record;
5908
 
5909
      TYPE_FIELDS (record) = f_ovfl;
5910
      DECL_CHAIN (f_ovfl) = f_gtop;
5911
      DECL_CHAIN (f_gtop) = f_ftop;
5912
      DECL_CHAIN (f_ftop) = f_goff;
5913
      DECL_CHAIN (f_goff) = f_foff;
5914
      DECL_CHAIN (f_foff) = f_res;
5915
 
5916
      layout_type (record);
5917
      return record;
5918
    }
5919
  else
5920
    /* Otherwise, we use 'void *'.  */
5921
    return ptr_type_node;
5922
}
5923
 
5924
/* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5925
 
5926
static void
5927
mips_va_start (tree valist, rtx nextarg)
5928
{
5929
  if (EABI_FLOAT_VARARGS_P)
5930
    {
5931
      const CUMULATIVE_ARGS *cum;
5932
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5933
      tree ovfl, gtop, ftop, goff, foff;
5934
      tree t;
5935
      int gpr_save_area_size;
5936
      int fpr_save_area_size;
5937
      int fpr_offset;
5938
 
5939
      cum = &crtl->args.info;
5940
      gpr_save_area_size
5941
        = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5942
      fpr_save_area_size
5943
        = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5944
 
5945
      f_ovfl = TYPE_FIELDS (va_list_type_node);
5946
      f_gtop = DECL_CHAIN (f_ovfl);
5947
      f_ftop = DECL_CHAIN (f_gtop);
5948
      f_goff = DECL_CHAIN (f_ftop);
5949
      f_foff = DECL_CHAIN (f_goff);
5950
 
5951
      ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5952
                     NULL_TREE);
5953
      gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5954
                     NULL_TREE);
5955
      ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5956
                     NULL_TREE);
5957
      goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5958
                     NULL_TREE);
5959
      foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5960
                     NULL_TREE);
5961
 
5962
      /* Emit code to initialize OVFL, which points to the next varargs
5963
         stack argument.  CUM->STACK_WORDS gives the number of stack
5964
         words used by named arguments.  */
5965
      t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5966
      if (cum->stack_words > 0)
5967
        t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
5968
      t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5969
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5970
 
5971
      /* Emit code to initialize GTOP, the top of the GPR save area.  */
5972
      t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5973
      t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5974
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5975
 
5976
      /* Emit code to initialize FTOP, the top of the FPR save area.
5977
         This address is gpr_save_area_bytes below GTOP, rounded
5978
         down to the next fp-aligned boundary.  */
5979
      t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5980
      fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5981
      fpr_offset &= -UNITS_PER_FPVALUE;
5982
      if (fpr_offset)
5983
        t = fold_build_pointer_plus_hwi (t, -fpr_offset);
5984
      t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5985
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5986
 
5987
      /* Emit code to initialize GOFF, the offset from GTOP of the
5988
         next GPR argument.  */
5989
      t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5990
                  build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5991
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5992
 
5993
      /* Likewise emit code to initialize FOFF, the offset from FTOP
5994
         of the next FPR argument.  */
5995
      t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5996
                  build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5997
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5998
    }
5999
  else
6000
    {
6001
      nextarg = plus_constant (Pmode, nextarg, -cfun->machine->varargs_size);
6002
      std_expand_builtin_va_start (valist, nextarg);
6003
    }
6004
}
6005
 
6006
/* Like std_gimplify_va_arg_expr, but apply alignment to zero-sized
6007
   types as well.  */
6008
 
6009
static tree
6010
mips_std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6011
                               gimple_seq *post_p)
6012
{
6013
  tree addr, t, type_size, rounded_size, valist_tmp;
6014
  unsigned HOST_WIDE_INT align, boundary;
6015
  bool indirect;
6016
 
6017
  indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6018
  if (indirect)
6019
    type = build_pointer_type (type);
6020
 
6021
  align = PARM_BOUNDARY / BITS_PER_UNIT;
6022
  boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
6023
 
6024
  /* When we align parameter on stack for caller, if the parameter
6025
     alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
6026
     aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
6027
     here with caller.  */
6028
  if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
6029
    boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
6030
 
6031
  boundary /= BITS_PER_UNIT;
6032
 
6033
  /* Hoist the valist value into a temporary for the moment.  */
6034
  valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
6035
 
6036
  /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
6037
     requires greater alignment, we must perform dynamic alignment.  */
6038
  if (boundary > align)
6039
    {
6040
      t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6041
                  fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
6042
      gimplify_and_add (t, pre_p);
6043
 
6044
      t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
6045
                  fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
6046
                               valist_tmp,
6047
                               build_int_cst (TREE_TYPE (valist), -boundary)));
6048
      gimplify_and_add (t, pre_p);
6049
    }
6050
  else
6051
    boundary = align;
6052
 
6053
  /* If the actual alignment is less than the alignment of the type,
6054
     adjust the type accordingly so that we don't assume strict alignment
6055
     when dereferencing the pointer.  */
6056
  boundary *= BITS_PER_UNIT;
6057
  if (boundary < TYPE_ALIGN (type))
6058
    {
6059
      type = build_variant_type_copy (type);
6060
      TYPE_ALIGN (type) = boundary;
6061
    }
6062
 
6063
  /* Compute the rounded size of the type.  */
6064
  type_size = size_in_bytes (type);
6065
  rounded_size = round_up (type_size, align);
6066
 
6067
  /* Reduce rounded_size so it's sharable with the postqueue.  */
6068
  gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
6069
 
6070
  /* Get AP.  */
6071
  addr = valist_tmp;
6072
  if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
6073
    {
6074
      /* Small args are padded downward.  */
6075
      t = fold_build2_loc (input_location, GT_EXPR, sizetype,
6076
                       rounded_size, size_int (align));
6077
      t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
6078
                       size_binop (MINUS_EXPR, rounded_size, type_size));
6079
      addr = fold_build_pointer_plus (addr, t);
6080
    }
6081
 
6082
  /* Compute new value for AP.  */
6083
  t = fold_build_pointer_plus (valist_tmp, rounded_size);
6084
  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
6085
  gimplify_and_add (t, pre_p);
6086
 
6087
  addr = fold_convert (build_pointer_type (type), addr);
6088
 
6089
  if (indirect)
6090
    addr = build_va_arg_indirect_ref (addr);
6091
 
6092
  return build_va_arg_indirect_ref (addr);
6093
}
6094
 
6095
/* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
6096
 
6097
static tree
6098
mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6099
                           gimple_seq *post_p)
6100
{
6101
  tree addr;
6102
  bool indirect_p;
6103
 
6104
  indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
6105
  if (indirect_p)
6106
    type = build_pointer_type (type);
6107
 
6108
  if (!EABI_FLOAT_VARARGS_P)
6109
    addr = mips_std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6110
  else
6111
    {
6112
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
6113
      tree ovfl, top, off, align;
6114
      HOST_WIDE_INT size, rsize, osize;
6115
      tree t, u;
6116
 
6117
      f_ovfl = TYPE_FIELDS (va_list_type_node);
6118
      f_gtop = DECL_CHAIN (f_ovfl);
6119
      f_ftop = DECL_CHAIN (f_gtop);
6120
      f_goff = DECL_CHAIN (f_ftop);
6121
      f_foff = DECL_CHAIN (f_goff);
6122
 
6123
      /* Let:
6124
 
6125
         TOP be the top of the GPR or FPR save area;
6126
         OFF be the offset from TOP of the next register;
6127
         ADDR_RTX be the address of the argument;
6128
         SIZE be the number of bytes in the argument type;
6129
         RSIZE be the number of bytes used to store the argument
6130
           when it's in the register save area; and
6131
         OSIZE be the number of bytes used to store it when it's
6132
           in the stack overflow area.
6133
 
6134
         The code we want is:
6135
 
6136
         1: off &= -rsize;        // round down
6137
         2: if (off != 0)
6138
         3:   {
6139
         4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
6140
         5:     off -= rsize;
6141
         6:   }
6142
         7: else
6143
         8:   {
6144
         9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
6145
         10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
6146
         11:    ovfl += osize;
6147
         14:  }
6148
 
6149
         [1] and [9] can sometimes be optimized away.  */
6150
 
6151
      ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
6152
                     NULL_TREE);
6153
      size = int_size_in_bytes (type);
6154
 
6155
      if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
6156
          && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
6157
        {
6158
          top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
6159
                        unshare_expr (valist), f_ftop, NULL_TREE);
6160
          off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
6161
                        unshare_expr (valist), f_foff, NULL_TREE);
6162
 
6163
          /* When va_start saves FPR arguments to the stack, each slot
6164
             takes up UNITS_PER_HWFPVALUE bytes, regardless of the
6165
             argument's precision.  */
6166
          rsize = UNITS_PER_HWFPVALUE;
6167
 
6168
          /* Overflow arguments are padded to UNITS_PER_WORD bytes
6169
             (= PARM_BOUNDARY bits).  This can be different from RSIZE
6170
             in two cases:
6171
 
6172
             (1) On 32-bit targets when TYPE is a structure such as:
6173
 
6174
             struct s { float f; };
6175
 
6176
             Such structures are passed in paired FPRs, so RSIZE
6177
             will be 8 bytes.  However, the structure only takes
6178
             up 4 bytes of memory, so OSIZE will only be 4.
6179
 
6180
             (2) In combinations such as -mgp64 -msingle-float
6181
             -fshort-double.  Doubles passed in registers will then take
6182
             up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
6183
             stack take up UNITS_PER_WORD bytes.  */
6184
          osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
6185
        }
6186
      else
6187
        {
6188
          top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
6189
                        unshare_expr (valist), f_gtop, NULL_TREE);
6190
          off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
6191
                        unshare_expr (valist), f_goff, NULL_TREE);
6192
          rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6193
          if (rsize > UNITS_PER_WORD)
6194
            {
6195
              /* [1] Emit code for: off &= -rsize.      */
6196
              t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
6197
                          build_int_cst (TREE_TYPE (off), -rsize));
6198
              gimplify_assign (unshare_expr (off), t, pre_p);
6199
            }
6200
          osize = rsize;
6201
        }
6202
 
6203
      /* [2] Emit code to branch if off == 0.  */
6204
      t = build2 (NE_EXPR, boolean_type_node, unshare_expr (off),
6205
                  build_int_cst (TREE_TYPE (off), 0));
6206
      addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
6207
 
6208
      /* [5] Emit code for: off -= rsize.  We do this as a form of
6209
         post-decrement not available to C.  */
6210
      t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
6211
      t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
6212
 
6213
      /* [4] Emit code for:
6214
         addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
6215
      t = fold_convert (sizetype, t);
6216
      t = fold_build1 (NEGATE_EXPR, sizetype, t);
6217
      t = fold_build_pointer_plus (top, t);
6218
      if (BYTES_BIG_ENDIAN && rsize > size)
6219
        t = fold_build_pointer_plus_hwi (t, rsize - size);
6220
      COND_EXPR_THEN (addr) = t;
6221
 
6222
      if (osize > UNITS_PER_WORD)
6223
        {
6224
          /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
6225
          t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
6226
          u = build_int_cst (TREE_TYPE (t), -osize);
6227
          t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
6228
          align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
6229
                          unshare_expr (ovfl), t);
6230
        }
6231
      else
6232
        align = NULL;
6233
 
6234
      /* [10, 11] Emit code for:
6235
         addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
6236
         ovfl += osize.  */
6237
      u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
6238
      t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
6239
      if (BYTES_BIG_ENDIAN && osize > size)
6240
        t = fold_build_pointer_plus_hwi (t, osize - size);
6241
 
6242
      /* String [9] and [10, 11] together.  */
6243
      if (align)
6244
        t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
6245
      COND_EXPR_ELSE (addr) = t;
6246
 
6247
      addr = fold_convert (build_pointer_type (type), addr);
6248
      addr = build_va_arg_indirect_ref (addr);
6249
    }
6250
 
6251
  if (indirect_p)
6252
    addr = build_va_arg_indirect_ref (addr);
6253
 
6254
  return addr;
6255
}
6256
 
6257
/* Declare a unique, locally-binding function called NAME, then start
6258
   its definition.  */
6259
 
6260
static void
6261
mips_start_unique_function (const char *name)
6262
{
6263
  tree decl;
6264
 
6265
  decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
6266
                     get_identifier (name),
6267
                     build_function_type_list (void_type_node, NULL_TREE));
6268
  DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
6269
                                   NULL_TREE, void_type_node);
6270
  TREE_PUBLIC (decl) = 1;
6271
  TREE_STATIC (decl) = 1;
6272
 
6273
  DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
6274
 
6275
  targetm.asm_out.unique_section (decl, 0);
6276
  switch_to_section (get_named_section (decl, NULL, 0));
6277
 
6278
  targetm.asm_out.globalize_label (asm_out_file, name);
6279
  fputs ("\t.hidden\t", asm_out_file);
6280
  assemble_name (asm_out_file, name);
6281
  putc ('\n', asm_out_file);
6282
}
6283
 
6284
/* Start a definition of function NAME.  MIPS16_P indicates whether the
6285
   function contains MIPS16 code.  */
6286
 
6287
static void
6288
mips_start_function_definition (const char *name, bool mips16_p)
6289
{
6290
  if (mips16_p)
6291
    fprintf (asm_out_file, "\t.set\tmips16\n");
6292
  else
6293
    fprintf (asm_out_file, "\t.set\tnomips16\n");
6294
 
6295
  if (TARGET_MICROMIPS)
6296
    fprintf (asm_out_file, "\t.set\tmicromips\n");
6297
#ifdef HAVE_GAS_MICROMIPS
6298
  else
6299
    fprintf (asm_out_file, "\t.set\tnomicromips\n");
6300
#endif
6301
 
6302
  if (!flag_inhibit_size_directive)
6303
    {
6304
      fputs ("\t.ent\t", asm_out_file);
6305
      assemble_name (asm_out_file, name);
6306
      fputs ("\n", asm_out_file);
6307
    }
6308
 
6309
  ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
6310
 
6311
  /* Start the definition proper.  */
6312
  assemble_name (asm_out_file, name);
6313
  fputs (":\n", asm_out_file);
6314
}
6315
 
6316
/* End a function definition started by mips_start_function_definition.  */
6317
 
6318
static void
6319
mips_end_function_definition (const char *name)
6320
{
6321
  if (!flag_inhibit_size_directive)
6322
    {
6323
      fputs ("\t.end\t", asm_out_file);
6324
      assemble_name (asm_out_file, name);
6325
      fputs ("\n", asm_out_file);
6326
    }
6327
}
6328
 
6329
/* If *STUB_PTR points to a stub, output a comdat-style definition for it,
6330
   then free *STUB_PTR.  */
6331
 
6332
static void
6333
mips_finish_stub (mips_one_only_stub **stub_ptr)
6334
{
6335
  mips_one_only_stub *stub = *stub_ptr;
6336
  if (!stub)
6337
    return;
6338
 
6339
  const char *name = stub->get_name ();
6340
  mips_start_unique_function (name);
6341
  mips_start_function_definition (name, false);
6342
  stub->output_body ();
6343
  mips_end_function_definition (name);
6344
  delete stub;
6345
  *stub_ptr = 0;
6346
}
6347
 
6348
/* Return true if calls to X can use R_MIPS_CALL* relocations.  */
6349
 
6350
static bool
6351
mips_ok_for_lazy_binding_p (rtx x)
6352
{
6353
  return (TARGET_USE_GOT
6354
          && GET_CODE (x) == SYMBOL_REF
6355
          && !SYMBOL_REF_BIND_NOW_P (x)
6356
          && !mips_symbol_binds_local_p (x));
6357
}
6358
 
6359
/* Load function address ADDR into register DEST.  TYPE is as for
6360
   mips_expand_call.  Return true if we used an explicit lazy-binding
6361
   sequence.  */
6362
 
6363
static bool
6364
mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
6365
{
6366
  /* If we're generating PIC, and this call is to a global function,
6367
     try to allow its address to be resolved lazily.  This isn't
6368
     possible for sibcalls when $gp is call-saved because the value
6369
     of $gp on entry to the stub would be our caller's gp, not ours.  */
6370
  if (TARGET_EXPLICIT_RELOCS
6371
      && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
6372
      && mips_ok_for_lazy_binding_p (addr))
6373
    {
6374
      addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
6375
      emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
6376
      return true;
6377
    }
6378
  else
6379
    {
6380
      mips_emit_move (dest, addr);
6381
      return false;
6382
    }
6383
}
6384
 
6385
/* Each locally-defined hard-float MIPS16 function has a local symbol
6386
   associated with it.  This hash table maps the function symbol (FUNC)
6387
   to the local symbol (LOCAL). */
6388
struct GTY(()) mips16_local_alias {
6389
  rtx func;
6390
  rtx local;
6391
};
6392
static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
6393
 
6394
/* Hash table callbacks for mips16_local_aliases.  */
6395
 
6396
static hashval_t
6397
mips16_local_aliases_hash (const void *entry)
6398
{
6399
  const struct mips16_local_alias *alias;
6400
 
6401
  alias = (const struct mips16_local_alias *) entry;
6402
  return htab_hash_string (XSTR (alias->func, 0));
6403
}
6404
 
6405
static int
6406
mips16_local_aliases_eq (const void *entry1, const void *entry2)
6407
{
6408
  const struct mips16_local_alias *alias1, *alias2;
6409
 
6410
  alias1 = (const struct mips16_local_alias *) entry1;
6411
  alias2 = (const struct mips16_local_alias *) entry2;
6412
  return rtx_equal_p (alias1->func, alias2->func);
6413
}
6414
 
6415
/* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
6416
   Return a local alias for it, creating a new one if necessary.  */
6417
 
6418
static rtx
6419
mips16_local_alias (rtx func)
6420
{
6421
  struct mips16_local_alias *alias, tmp_alias;
6422
  void **slot;
6423
 
6424
  /* Create the hash table if this is the first call.  */
6425
  if (mips16_local_aliases == NULL)
6426
    mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
6427
                                            mips16_local_aliases_eq, NULL);
6428
 
6429
  /* Look up the function symbol, creating a new entry if need be.  */
6430
  tmp_alias.func = func;
6431
  slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
6432
  gcc_assert (slot != NULL);
6433
 
6434
  alias = (struct mips16_local_alias *) *slot;
6435
  if (alias == NULL)
6436
    {
6437
      const char *func_name, *local_name;
6438
      rtx local;
6439
 
6440
      /* Create a new SYMBOL_REF for the local symbol.  The choice of
6441
         __fn_local_* is based on the __fn_stub_* names that we've
6442
         traditionally used for the non-MIPS16 stub.  */
6443
      func_name = targetm.strip_name_encoding (XSTR (func, 0));
6444
      local_name = ACONCAT (("__fn_local_", func_name, NULL));
6445
      local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
6446
      SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
6447
 
6448
      /* Create a new structure to represent the mapping.  */
6449
      alias = ggc_alloc_mips16_local_alias ();
6450
      alias->func = func;
6451
      alias->local = local;
6452
      *slot = alias;
6453
    }
6454
  return alias->local;
6455
}
6456
 
6457
/* A chained list of functions for which mips16_build_call_stub has already
6458
   generated a stub.  NAME is the name of the function and FP_RET_P is true
6459
   if the function returns a value in floating-point registers.  */
6460
struct mips16_stub {
6461
  struct mips16_stub *next;
6462
  char *name;
6463
  bool fp_ret_p;
6464
};
6465
static struct mips16_stub *mips16_stubs;
6466
 
6467
/* Return the two-character string that identifies floating-point
6468
   return mode MODE in the name of a MIPS16 function stub.  */
6469
 
6470
static const char *
6471
mips16_call_stub_mode_suffix (enum machine_mode mode)
6472
{
6473
  if (mode == SFmode)
6474
    return "sf";
6475
  else if (mode == DFmode)
6476
    return "df";
6477
  else if (mode == SCmode)
6478
    return "sc";
6479
  else if (mode == DCmode)
6480
    return "dc";
6481
  else if (mode == V2SFmode)
6482
    return "df";
6483
  else
6484
    gcc_unreachable ();
6485
}
6486
 
6487
/* Write instructions to move a 32-bit value between general register
6488
   GPREG and floating-point register FPREG.  DIRECTION is 't' to move
6489
   from GPREG to FPREG and 'f' to move in the opposite direction.  */
6490
 
6491
static void
6492
mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6493
{
6494
  fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6495
           reg_names[gpreg], reg_names[fpreg]);
6496
}
6497
 
6498
/* Likewise for 64-bit values.  */
6499
 
6500
static void
6501
mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
6502
{
6503
  if (TARGET_64BIT)
6504
    fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
6505
             reg_names[gpreg], reg_names[fpreg]);
6506
  else if (TARGET_FLOAT64)
6507
    {
6508
      fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6509
               reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6510
      fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
6511
               reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
6512
    }
6513
  else
6514
    {
6515
      /* Move the least-significant word.  */
6516
      fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6517
               reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
6518
      /* ...then the most significant word.  */
6519
      fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
6520
               reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
6521
    }
6522
}
6523
 
6524
/* Write out code to move floating-point arguments into or out of
6525
   general registers.  FP_CODE is the code describing which arguments
6526
   are present (see the comment above the definition of CUMULATIVE_ARGS
6527
   in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
6528
 
6529
static void
6530
mips_output_args_xfer (int fp_code, char direction)
6531
{
6532
  unsigned int gparg, fparg, f;
6533
  CUMULATIVE_ARGS cum;
6534
 
6535
  /* This code only works for o32 and o64.  */
6536
  gcc_assert (TARGET_OLDABI);
6537
 
6538
  mips_init_cumulative_args (&cum, NULL);
6539
 
6540
  for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6541
    {
6542
      enum machine_mode mode;
6543
      struct mips_arg_info info;
6544
 
6545
      if ((f & 3) == 1)
6546
        mode = SFmode;
6547
      else if ((f & 3) == 2)
6548
        mode = DFmode;
6549
      else
6550
        gcc_unreachable ();
6551
 
6552
      mips_get_arg_info (&info, &cum, mode, NULL, true);
6553
      gparg = mips_arg_regno (&info, false);
6554
      fparg = mips_arg_regno (&info, true);
6555
 
6556
      if (mode == SFmode)
6557
        mips_output_32bit_xfer (direction, gparg, fparg);
6558
      else
6559
        mips_output_64bit_xfer (direction, gparg, fparg);
6560
 
6561
      mips_function_arg_advance (pack_cumulative_args (&cum), mode, NULL, true);
6562
    }
6563
}
6564
 
6565
/* Write a MIPS16 stub for the current function.  This stub is used
6566
   for functions which take arguments in the floating-point registers.
6567
   It is normal-mode code that moves the floating-point arguments
6568
   into the general registers and then jumps to the MIPS16 code.  */
6569
 
6570
static void
6571
mips16_build_function_stub (void)
6572
{
6573
  const char *fnname, *alias_name, *separator;
6574
  char *secname, *stubname;
6575
  tree stubdecl;
6576
  unsigned int f;
6577
  rtx symbol, alias;
6578
 
6579
  /* Create the name of the stub, and its unique section.  */
6580
  symbol = XEXP (DECL_RTL (current_function_decl), 0);
6581
  alias = mips16_local_alias (symbol);
6582
 
6583
  fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
6584
  alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
6585
  secname = ACONCAT ((".mips16.fn.", fnname, NULL));
6586
  stubname = ACONCAT (("__fn_stub_", fnname, NULL));
6587
 
6588
  /* Build a decl for the stub.  */
6589
  stubdecl = build_decl (BUILTINS_LOCATION,
6590
                         FUNCTION_DECL, get_identifier (stubname),
6591
                         build_function_type_list (void_type_node, NULL_TREE));
6592
  DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6593
  DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6594
                                       RESULT_DECL, NULL_TREE, void_type_node);
6595
 
6596
  /* Output a comment.  */
6597
  fprintf (asm_out_file, "\t# Stub function for %s (",
6598
           current_function_name ());
6599
  separator = "";
6600
  for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
6601
    {
6602
      fprintf (asm_out_file, "%s%s", separator,
6603
               (f & 3) == 1 ? "float" : "double");
6604
      separator = ", ";
6605
    }
6606
  fprintf (asm_out_file, ")\n");
6607
 
6608
  /* Start the function definition.  */
6609
  assemble_start_function (stubdecl, stubname);
6610
  mips_start_function_definition (stubname, false);
6611
 
6612
  /* If generating pic2 code, either set up the global pointer or
6613
     switch to pic0.  */
6614
  if (TARGET_ABICALLS_PIC2)
6615
    {
6616
      if (TARGET_ABSOLUTE_ABICALLS)
6617
        fprintf (asm_out_file, "\t.option\tpic0\n");
6618
      else
6619
        {
6620
          output_asm_insn ("%(.cpload\t%^%)", NULL);
6621
          /* Emit an R_MIPS_NONE relocation to tell the linker what the
6622
             target function is.  Use a local GOT access when loading the
6623
             symbol, to cut down on the number of unnecessary GOT entries
6624
             for stubs that aren't needed.  */
6625
          output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6626
          symbol = alias;
6627
        }
6628
    }
6629
 
6630
  /* Load the address of the MIPS16 function into $25.  Do this first so
6631
     that targets with coprocessor interlocks can use an MFC1 to fill the
6632
     delay slot.  */
6633
  output_asm_insn ("la\t%^,%0", &symbol);
6634
 
6635
  /* Move the arguments from floating-point registers to general registers.  */
6636
  mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6637
 
6638
  /* Jump to the MIPS16 function.  */
6639
  output_asm_insn ("jr\t%^", NULL);
6640
 
6641
  if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6642
    fprintf (asm_out_file, "\t.option\tpic2\n");
6643
 
6644
  mips_end_function_definition (stubname);
6645
 
6646
  /* If the linker needs to create a dynamic symbol for the target
6647
     function, it will associate the symbol with the stub (which,
6648
     unlike the target function, follows the proper calling conventions).
6649
     It is therefore useful to have a local alias for the target function,
6650
     so that it can still be identified as MIPS16 code.  As an optimization,
6651
     this symbol can also be used for indirect MIPS16 references from
6652
     within this file.  */
6653
  ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6654
 
6655
  switch_to_section (function_section (current_function_decl));
6656
}
6657
 
6658
/* The current function is a MIPS16 function that returns a value in an FPR.
6659
   Copy the return value from its soft-float to its hard-float location.
6660
   libgcc2 has special non-MIPS16 helper functions for each case.  */
6661
 
6662
static void
6663
mips16_copy_fpr_return_value (void)
6664
{
6665
  rtx fn, insn, retval;
6666
  tree return_type;
6667
  enum machine_mode return_mode;
6668
  const char *name;
6669
 
6670
  return_type = DECL_RESULT (current_function_decl);
6671
  return_mode = DECL_MODE (return_type);
6672
 
6673
  name = ACONCAT (("__mips16_ret_",
6674
                   mips16_call_stub_mode_suffix (return_mode),
6675
                   NULL));
6676
  fn = mips16_stub_function (name);
6677
 
6678
  /* The function takes arguments in $2 (and possibly $3), so calls
6679
     to it cannot be lazily bound.  */
6680
  SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6681
 
6682
  /* Model the call as something that takes the GPR return value as
6683
     argument and returns an "updated" value.  */
6684
  retval = gen_rtx_REG (return_mode, GP_RETURN);
6685
  insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6686
                           const0_rtx, NULL_RTX, false);
6687
  use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6688
}
6689
 
6690
/* Consider building a stub for a MIPS16 call to function *FN_PTR.
6691
   RETVAL is the location of the return value, or null if this is
6692
   a "call" rather than a "call_value".  ARGS_SIZE is the size of the
6693
   arguments and FP_CODE is the code built by mips_function_arg;
6694
   see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6695
 
6696
   There are three alternatives:
6697
 
6698
   - If a stub was needed, emit the call and return the call insn itself.
6699
 
6700
   - If we can avoid using a stub by redirecting the call, set *FN_PTR
6701
     to the new target and return null.
6702
 
6703
   - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6704
     unmodified.
6705
 
6706
   A stub is needed for calls to functions that, in normal mode,
6707
   receive arguments in FPRs or return values in FPRs.  The stub
6708
   copies the arguments from their soft-float positions to their
6709
   hard-float positions, calls the real function, then copies the
6710
   return value from its hard-float position to its soft-float
6711
   position.
6712
 
6713
   We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6714
   If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6715
   automatically redirects the JAL to the stub, otherwise the JAL
6716
   continues to call FN directly.  */
6717
 
6718
static rtx
6719
mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6720
{
6721
  const char *fnname;
6722
  bool fp_ret_p;
6723
  struct mips16_stub *l;
6724
  rtx insn, fn;
6725
 
6726
  /* We don't need to do anything if we aren't in MIPS16 mode, or if
6727
     we were invoked with the -msoft-float option.  */
6728
  if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6729
    return NULL_RTX;
6730
 
6731
  /* Figure out whether the value might come back in a floating-point
6732
     register.  */
6733
  fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6734
 
6735
  /* We don't need to do anything if there were no floating-point
6736
     arguments and the value will not be returned in a floating-point
6737
     register.  */
6738
  if (fp_code == 0 && !fp_ret_p)
6739
    return NULL_RTX;
6740
 
6741
  /* We don't need to do anything if this is a call to a special
6742
     MIPS16 support function.  */
6743
  fn = *fn_ptr;
6744
  if (mips16_stub_function_p (fn))
6745
    return NULL_RTX;
6746
 
6747
  /* If we're calling a locally-defined MIPS16 function, we know that
6748
     it will return values in both the "soft-float" and "hard-float"
6749
     registers.  There is no need to use a stub to move the latter
6750
     to the former.  */
6751
  if (fp_code == 0 && mips16_local_function_p (fn))
6752
    return NULL_RTX;
6753
 
6754
  /* This code will only work for o32 and o64 abis.  The other ABI's
6755
     require more sophisticated support.  */
6756
  gcc_assert (TARGET_OLDABI);
6757
 
6758
  /* If we're calling via a function pointer, use one of the magic
6759
     libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6760
     Each stub expects the function address to arrive in register $2.  */
6761
  if (GET_CODE (fn) != SYMBOL_REF
6762
      || !call_insn_operand (fn, VOIDmode))
6763
    {
6764
      char buf[30];
6765
      rtx stub_fn, insn, addr;
6766
      bool lazy_p;
6767
 
6768
      /* If this is a locally-defined and locally-binding function,
6769
         avoid the stub by calling the local alias directly.  */
6770
      if (mips16_local_function_p (fn))
6771
        {
6772
          *fn_ptr = mips16_local_alias (fn);
6773
          return NULL_RTX;
6774
        }
6775
 
6776
      /* Create a SYMBOL_REF for the libgcc.a function.  */
6777
      if (fp_ret_p)
6778
        sprintf (buf, "__mips16_call_stub_%s_%d",
6779
                 mips16_call_stub_mode_suffix (GET_MODE (retval)),
6780
                 fp_code);
6781
      else
6782
        sprintf (buf, "__mips16_call_stub_%d", fp_code);
6783
      stub_fn = mips16_stub_function (buf);
6784
 
6785
      /* The function uses $2 as an argument, so calls to it
6786
         cannot be lazily bound.  */
6787
      SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6788
 
6789
      /* Load the target function into $2.  */
6790
      addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6791
      lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6792
 
6793
      /* Emit the call.  */
6794
      insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6795
                               args_size, NULL_RTX, lazy_p);
6796
 
6797
      /* Tell GCC that this call does indeed use the value of $2.  */
6798
      use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6799
 
6800
      /* If we are handling a floating-point return value, we need to
6801
         save $18 in the function prologue.  Putting a note on the
6802
         call will mean that df_regs_ever_live_p ($18) will be true if the
6803
         call is not eliminated, and we can check that in the prologue
6804
         code.  */
6805
      if (fp_ret_p)
6806
        CALL_INSN_FUNCTION_USAGE (insn) =
6807
          gen_rtx_EXPR_LIST (VOIDmode,
6808
                             gen_rtx_CLOBBER (VOIDmode,
6809
                                              gen_rtx_REG (word_mode, 18)),
6810
                             CALL_INSN_FUNCTION_USAGE (insn));
6811
 
6812
      return insn;
6813
    }
6814
 
6815
  /* We know the function we are going to call.  If we have already
6816
     built a stub, we don't need to do anything further.  */
6817
  fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6818
  for (l = mips16_stubs; l != NULL; l = l->next)
6819
    if (strcmp (l->name, fnname) == 0)
6820
      break;
6821
 
6822
  if (l == NULL)
6823
    {
6824
      const char *separator;
6825
      char *secname, *stubname;
6826
      tree stubid, stubdecl;
6827
      unsigned int f;
6828
 
6829
      /* If the function does not return in FPRs, the special stub
6830
         section is named
6831
             .mips16.call.FNNAME
6832
 
6833
         If the function does return in FPRs, the stub section is named
6834
             .mips16.call.fp.FNNAME
6835
 
6836
         Build a decl for the stub.  */
6837
      secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6838
                          fnname, NULL));
6839
      stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6840
                           fnname, NULL));
6841
      stubid = get_identifier (stubname);
6842
      stubdecl = build_decl (BUILTINS_LOCATION,
6843
                             FUNCTION_DECL, stubid,
6844
                             build_function_type_list (void_type_node,
6845
                                                       NULL_TREE));
6846
      DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6847
      DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6848
                                           RESULT_DECL, NULL_TREE,
6849
                                           void_type_node);
6850
 
6851
      /* Output a comment.  */
6852
      fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6853
               (fp_ret_p
6854
                ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6855
                : ""),
6856
               fnname);
6857
      separator = "";
6858
      for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6859
        {
6860
          fprintf (asm_out_file, "%s%s", separator,
6861
                   (f & 3) == 1 ? "float" : "double");
6862
          separator = ", ";
6863
        }
6864
      fprintf (asm_out_file, ")\n");
6865
 
6866
      /* Start the function definition.  */
6867
      assemble_start_function (stubdecl, stubname);
6868
      mips_start_function_definition (stubname, false);
6869
 
6870
      if (fp_ret_p)
6871
        {
6872
          fprintf (asm_out_file, "\t.cfi_startproc\n");
6873
 
6874
          /* Create a fake CFA 4 bytes below the stack pointer.
6875
             This works around unwinders (like libgcc's) that expect
6876
             the CFA for non-signal frames to be unique.  */
6877
          fprintf (asm_out_file, "\t.cfi_def_cfa 29,-4\n");
6878
 
6879
          /* "Save" $sp in itself so we don't use the fake CFA.
6880
             This is: DW_CFA_val_expression r29, { DW_OP_reg29 }.  */
6881
          fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
6882
        }
6883
      else
6884
        {
6885
          /* Load the address of the MIPS16 function into $25.  Do this
6886
             first so that targets with coprocessor interlocks can use
6887
             an MFC1 to fill the delay slot.  */
6888
          if (TARGET_EXPLICIT_RELOCS)
6889
            {
6890
              output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6891
              output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6892
            }
6893
          else
6894
            output_asm_insn ("la\t%^,%0", &fn);
6895
        }
6896
 
6897
      /* Move the arguments from general registers to floating-point
6898
         registers.  */
6899
      mips_output_args_xfer (fp_code, 't');
6900
 
6901
      if (fp_ret_p)
6902
        {
6903
          /* Save the return address in $18 and call the non-MIPS16 function.
6904
             The stub's caller knows that $18 might be clobbered, even though
6905
             $18 is usually a call-saved register.  */
6906
          fprintf (asm_out_file, "\tmove\t%s,%s\n",
6907
                   reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6908
          output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6909
          fprintf (asm_out_file, "\t.cfi_register 31,18\n");
6910
 
6911
          /* Move the result from floating-point registers to
6912
             general registers.  */
6913
          switch (GET_MODE (retval))
6914
            {
6915
            case SCmode:
6916
              mips_output_32bit_xfer ('f', GP_RETURN + TARGET_BIG_ENDIAN,
6917
                                      TARGET_BIG_ENDIAN
6918
                                      ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6919
                                      : FP_REG_FIRST);
6920
              mips_output_32bit_xfer ('f', GP_RETURN + TARGET_LITTLE_ENDIAN,
6921
                                      TARGET_LITTLE_ENDIAN
6922
                                      ? FP_REG_FIRST + MAX_FPRS_PER_FMT
6923
                                      : FP_REG_FIRST);
6924
              if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6925
                {
6926
                  /* On 64-bit targets, complex floats are returned in
6927
                     a single GPR, such that "sd" on a suitably-aligned
6928
                     target would store the value correctly.  */
6929
                  fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6930
                           reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6931
                           reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6932
                  fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6933
                           reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6934
                           reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6935
                  fprintf (asm_out_file, "\tdsrl\t%s,%s,32\n",
6936
                           reg_names[GP_RETURN + TARGET_BIG_ENDIAN],
6937
                           reg_names[GP_RETURN + TARGET_BIG_ENDIAN]);
6938
                  fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6939
                           reg_names[GP_RETURN],
6940
                           reg_names[GP_RETURN],
6941
                           reg_names[GP_RETURN + 1]);
6942
                }
6943
              break;
6944
 
6945
            case SFmode:
6946
              mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6947
              break;
6948
 
6949
            case DCmode:
6950
              mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6951
                                      FP_REG_FIRST + MAX_FPRS_PER_FMT);
6952
              /* Fall though.  */
6953
            case DFmode:
6954
            case V2SFmode:
6955
              mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6956
              break;
6957
 
6958
            default:
6959
              gcc_unreachable ();
6960
            }
6961
          fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6962
          fprintf (asm_out_file, "\t.cfi_endproc\n");
6963
        }
6964
      else
6965
        {
6966
          /* Jump to the previously-loaded address.  */
6967
          output_asm_insn ("jr\t%^", NULL);
6968
        }
6969
 
6970
#ifdef ASM_DECLARE_FUNCTION_SIZE
6971
      ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6972
#endif
6973
 
6974
      mips_end_function_definition (stubname);
6975
 
6976
      /* Record this stub.  */
6977
      l = XNEW (struct mips16_stub);
6978
      l->name = xstrdup (fnname);
6979
      l->fp_ret_p = fp_ret_p;
6980
      l->next = mips16_stubs;
6981
      mips16_stubs = l;
6982
    }
6983
 
6984
  /* If we expect a floating-point return value, but we've built a
6985
     stub which does not expect one, then we're in trouble.  We can't
6986
     use the existing stub, because it won't handle the floating-point
6987
     value.  We can't build a new stub, because the linker won't know
6988
     which stub to use for the various calls in this object file.
6989
     Fortunately, this case is illegal, since it means that a function
6990
     was declared in two different ways in a single compilation.  */
6991
  if (fp_ret_p && !l->fp_ret_p)
6992
    error ("cannot handle inconsistent calls to %qs", fnname);
6993
 
6994
  if (retval == NULL_RTX)
6995
    insn = gen_call_internal_direct (fn, args_size);
6996
  else
6997
    insn = gen_call_value_internal_direct (retval, fn, args_size);
6998
  insn = mips_emit_call_insn (insn, fn, fn, false);
6999
 
7000
  /* If we are calling a stub which handles a floating-point return
7001
     value, we need to arrange to save $18 in the prologue.  We do this
7002
     by marking the function call as using the register.  The prologue
7003
     will later see that it is used, and emit code to save it.  */
7004
  if (fp_ret_p)
7005
    CALL_INSN_FUNCTION_USAGE (insn) =
7006
      gen_rtx_EXPR_LIST (VOIDmode,
7007
                         gen_rtx_CLOBBER (VOIDmode,
7008
                                          gen_rtx_REG (word_mode, 18)),
7009
                         CALL_INSN_FUNCTION_USAGE (insn));
7010
 
7011
  return insn;
7012
}
7013
 
7014
/* Expand a call of type TYPE.  RESULT is where the result will go (null
7015
   for "call"s and "sibcall"s), ADDR is the address of the function,
7016
   ARGS_SIZE is the size of the arguments and AUX is the value passed
7017
   to us by mips_function_arg.  LAZY_P is true if this call already
7018
   involves a lazily-bound function address (such as when calling
7019
   functions through a MIPS16 hard-float stub).
7020
 
7021
   Return the call itself.  */
7022
 
7023
rtx
7024
mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
7025
                  rtx args_size, rtx aux, bool lazy_p)
7026
{
7027
  rtx orig_addr, pattern, insn;
7028
  int fp_code;
7029
 
7030
  fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
7031
  insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
7032
  if (insn)
7033
    {
7034
      gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
7035
      return insn;
7036
    }
7037
 
7038
  orig_addr = addr;
7039
  if (!call_insn_operand (addr, VOIDmode))
7040
    {
7041
      if (type == MIPS_CALL_EPILOGUE)
7042
        addr = MIPS_EPILOGUE_TEMP (Pmode);
7043
      else
7044
        addr = gen_reg_rtx (Pmode);
7045
      lazy_p |= mips_load_call_address (type, addr, orig_addr);
7046
    }
7047
 
7048
  if (result == 0)
7049
    {
7050
      rtx (*fn) (rtx, rtx);
7051
 
7052
      if (type == MIPS_CALL_SIBCALL)
7053
        fn = gen_sibcall_internal;
7054
      else
7055
        fn = gen_call_internal;
7056
 
7057
      pattern = fn (addr, args_size);
7058
    }
7059
  else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
7060
    {
7061
      /* Handle return values created by mips_return_fpr_pair.  */
7062
      rtx (*fn) (rtx, rtx, rtx, rtx);
7063
      rtx reg1, reg2;
7064
 
7065
      if (type == MIPS_CALL_SIBCALL)
7066
        fn = gen_sibcall_value_multiple_internal;
7067
      else
7068
        fn = gen_call_value_multiple_internal;
7069
 
7070
      reg1 = XEXP (XVECEXP (result, 0, 0), 0);
7071
      reg2 = XEXP (XVECEXP (result, 0, 1), 0);
7072
      pattern = fn (reg1, addr, args_size, reg2);
7073
    }
7074
  else
7075
    {
7076
      rtx (*fn) (rtx, rtx, rtx);
7077
 
7078
      if (type == MIPS_CALL_SIBCALL)
7079
        fn = gen_sibcall_value_internal;
7080
      else
7081
        fn = gen_call_value_internal;
7082
 
7083
      /* Handle return values created by mips_return_fpr_single.  */
7084
      if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
7085
        result = XEXP (XVECEXP (result, 0, 0), 0);
7086
      pattern = fn (result, addr, args_size);
7087
    }
7088
 
7089
  return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
7090
}
7091
 
7092
/* Split call instruction INSN into a $gp-clobbering call and
7093
   (where necessary) an instruction to restore $gp from its save slot.
7094
   CALL_PATTERN is the pattern of the new call.  */
7095
 
7096
void
7097
mips_split_call (rtx insn, rtx call_pattern)
7098
{
7099
  emit_call_insn (call_pattern);
7100
  if (!find_reg_note (insn, REG_NORETURN, 0))
7101
    /* Pick a temporary register that is suitable for both MIPS16 and
7102
       non-MIPS16 code.  $4 and $5 are used for returning complex double
7103
       values in soft-float code, so $6 is the first suitable candidate.  */
7104
    mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
7105
}
7106
 
7107
/* Return true if a call to DECL may need to use JALX.  */
7108
 
7109
static bool
7110
mips_call_may_need_jalx_p (tree decl)
7111
{
7112
  /* If the current translation unit would use a different mode for DECL,
7113
     assume that the call needs JALX.  */
7114
  if (mips_get_compress_mode (decl) != TARGET_COMPRESSION)
7115
    return true;
7116
 
7117
  /* mips_get_compress_mode is always accurate for locally-binding
7118
     functions in the current translation unit.  */
7119
  if (!DECL_EXTERNAL (decl) && targetm.binds_local_p (decl))
7120
    return false;
7121
 
7122
  /* When -minterlink-compressed is in effect, assume that functions
7123
     could use a different encoding mode unless an attribute explicitly
7124
     tells us otherwise.  */
7125
  if (TARGET_INTERLINK_COMPRESSED)
7126
    {
7127
      if (!TARGET_COMPRESSION
7128
          && mips_get_compress_off_flags (DECL_ATTRIBUTES (decl)) ==0)
7129
        return true;
7130
      if (TARGET_COMPRESSION
7131
          && mips_get_compress_on_flags (DECL_ATTRIBUTES (decl)) == 0)
7132
        return true;
7133
    }
7134
 
7135
  return false;
7136
}
7137
 
7138
/* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
7139
 
7140
static bool
7141
mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
7142
{
7143
  if (!TARGET_SIBCALLS)
7144
    return false;
7145
 
7146
  /* Interrupt handlers need special epilogue code and therefore can't
7147
     use sibcalls.  */
7148
  if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
7149
    return false;
7150
 
7151
  /* Direct Js are only possible to functions that use the same ISA encoding.
7152
     There is no JX counterpoart of JALX.  */
7153
  if (decl
7154
      && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode)
7155
      && mips_call_may_need_jalx_p (decl))
7156
    return false;
7157
 
7158
  /* Sibling calls should not prevent lazy binding.  Lazy-binding stubs
7159
     require $gp to be valid on entry, so sibcalls can only use stubs
7160
     if $gp is call-clobbered.  */
7161
  if (decl
7162
      && TARGET_CALL_SAVED_GP
7163
      && !TARGET_ABICALLS_PIC0
7164
      && !targetm.binds_local_p (decl))
7165
    return false;
7166
 
7167
  /* Otherwise OK.  */
7168
  return true;
7169
}
7170
 
7171
/* Emit code to move general operand SRC into condition-code
7172
   register DEST given that SCRATCH is a scratch TFmode FPR.
7173
   The sequence is:
7174
 
7175
        FP1 = SRC
7176
        FP2 = 0.0f
7177
        DEST = FP2 < FP1
7178
 
7179
   where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
7180
 
7181
void
7182
mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
7183
{
7184
  rtx fp1, fp2;
7185
 
7186
  /* Change the source to SFmode.  */
7187
  if (MEM_P (src))
7188
    src = adjust_address (src, SFmode, 0);
7189
  else if (REG_P (src) || GET_CODE (src) == SUBREG)
7190
    src = gen_rtx_REG (SFmode, true_regnum (src));
7191
 
7192
  fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
7193
  fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
7194
 
7195
  mips_emit_move (copy_rtx (fp1), src);
7196
  mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
7197
  emit_insn (gen_slt_sf (dest, fp2, fp1));
7198
}
7199
 
7200
/* Implement MOVE_BY_PIECES_P.  */
7201
 
7202
bool
7203
mips_move_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7204
{
7205
  if (HAVE_movmemsi)
7206
    {
7207
      /* movmemsi is meant to generate code that is at least as good as
7208
         move_by_pieces.  However, movmemsi effectively uses a by-pieces
7209
         implementation both for moves smaller than a word and for
7210
         word-aligned moves of no more than MIPS_MAX_MOVE_BYTES_STRAIGHT
7211
         bytes.  We should allow the tree-level optimisers to do such
7212
         moves by pieces, as it often exposes other optimization
7213
         opportunities.  We might as well continue to use movmemsi at
7214
         the rtl level though, as it produces better code when
7215
         scheduling is disabled (such as at -O).  */
7216
      if (currently_expanding_to_rtl)
7217
        return false;
7218
      if (align < BITS_PER_WORD)
7219
        return size < UNITS_PER_WORD;
7220
      return size <= MIPS_MAX_MOVE_BYTES_STRAIGHT;
7221
    }
7222
  /* The default value.  If this becomes a target hook, we should
7223
     call the default definition instead.  */
7224
  return (move_by_pieces_ninsns (size, align, MOVE_MAX_PIECES + 1)
7225
          < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ()));
7226
}
7227
 
7228
/* Implement STORE_BY_PIECES_P.  */
7229
 
7230
bool
7231
mips_store_by_pieces_p (unsigned HOST_WIDE_INT size, unsigned int align)
7232
{
7233
  /* Storing by pieces involves moving constants into registers
7234
     of size MIN (ALIGN, BITS_PER_WORD), then storing them.
7235
     We need to decide whether it is cheaper to load the address of
7236
     constant data into a register and use a block move instead.  */
7237
 
7238
  /* If the data is only byte aligned, then:
7239
 
7240
     (a1) A block move of less than 4 bytes would involve three 3 LBs and
7241
          3 SBs.  We might as well use 3 single-instruction LIs and 3 SBs
7242
          instead.
7243
 
7244
     (a2) A block move of 4 bytes from aligned source data can use an
7245
          LW/SWL/SWR sequence.  This is often better than the 4 LIs and
7246
          4 SBs that we would generate when storing by pieces.  */
7247
  if (align <= BITS_PER_UNIT)
7248
    return size < 4;
7249
 
7250
  /* If the data is 2-byte aligned, then:
7251
 
7252
     (b1) A block move of less than 4 bytes would use a combination of LBs,
7253
          LHs, SBs and SHs.  We get better code by using single-instruction
7254
          LIs, SBs and SHs instead.
7255
 
7256
     (b2) A block move of 4 bytes from aligned source data would again use
7257
          an LW/SWL/SWR sequence.  In most cases, loading the address of
7258
          the source data would require at least one extra instruction.
7259
          It is often more efficient to use 2 single-instruction LIs and
7260
          2 SHs instead.
7261
 
7262
     (b3) A block move of up to 3 additional bytes would be like (b1).
7263
 
7264
     (b4) A block move of 8 bytes from aligned source data can use two
7265
          LW/SWL/SWR sequences or a single LD/SDL/SDR sequence.  Both
7266
          sequences are better than the 4 LIs and 4 SHs that we'd generate
7267
          when storing by pieces.
7268
 
7269
     The reasoning for higher alignments is similar:
7270
 
7271
     (c1) A block move of less than 4 bytes would be the same as (b1).
7272
 
7273
     (c2) A block move of 4 bytes would use an LW/SW sequence.  Again,
7274
          loading the address of the source data would typically require
7275
          at least one extra instruction.  It is generally better to use
7276
          LUI/ORI/SW instead.
7277
 
7278
     (c3) A block move of up to 3 additional bytes would be like (b1).
7279
 
7280
     (c4) A block move of 8 bytes can use two LW/SW sequences or a single
7281
          LD/SD sequence, and in these cases we've traditionally preferred
7282
          the memory copy over the more bulky constant moves.  */
7283
  return size < 8;
7284
}
7285
 
7286
/* Emit straight-line code to move LENGTH bytes from SRC to DEST.
7287
   Assume that the areas do not overlap.  */
7288
 
7289
static void
7290
mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
7291
{
7292
  HOST_WIDE_INT offset, delta;
7293
  unsigned HOST_WIDE_INT bits;
7294
  int i;
7295
  enum machine_mode mode;
7296
  rtx *regs;
7297
 
7298
  /* Work out how many bits to move at a time.  If both operands have
7299
     half-word alignment, it is usually better to move in half words.
7300
     For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
7301
     and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
7302
     Otherwise move word-sized chunks.  */
7303
  if (TARGET_PATFREE)
7304
          bits = MIN (MEM_ALIGN (src), MEM_ALIGN (dest));
7305
  else if (MEM_ALIGN (src) == BITS_PER_WORD / 2
7306
      && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
7307
    bits = BITS_PER_WORD / 2;
7308
  else
7309
    bits = BITS_PER_WORD;
7310
 
7311
  mode = mode_for_size (bits, MODE_INT, 0);
7312
  delta = bits / BITS_PER_UNIT;
7313
 
7314
  /* Allocate a buffer for the temporary registers.  */
7315
  regs = XALLOCAVEC (rtx, length / delta);
7316
 
7317
  /* Load as many BITS-sized chunks as possible.  Use a normal load if
7318
     the source has enough alignment, otherwise use left/right pairs.  */
7319
  for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7320
    {
7321
      regs[i] = gen_reg_rtx (mode);
7322
      if (MEM_ALIGN (src) >= bits)
7323
        mips_emit_move (regs[i], adjust_address (src, mode, offset));
7324
      else
7325
        {
7326
          rtx part = adjust_address (src, BLKmode, offset);
7327
          set_mem_size (part, delta);
7328
          if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0, 0))
7329
            gcc_unreachable ();
7330
        }
7331
    }
7332
 
7333
  /* Copy the chunks to the destination.  */
7334
  for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
7335
    if (MEM_ALIGN (dest) >= bits)
7336
      mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
7337
    else
7338
      {
7339
        rtx part = adjust_address (dest, BLKmode, offset);
7340
        set_mem_size (part, delta);
7341
        if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
7342
          gcc_unreachable ();
7343
      }
7344
 
7345
  /* Mop up any left-over bytes.  */
7346
  if (offset < length)
7347
    {
7348
      src = adjust_address (src, BLKmode, offset);
7349
      dest = adjust_address (dest, BLKmode, offset);
7350
      move_by_pieces (dest, src, length - offset,
7351
                      MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
7352
    }
7353
}
7354
 
7355
/* Helper function for doing a loop-based block operation on memory
7356
   reference MEM.  Each iteration of the loop will operate on LENGTH
7357
   bytes of MEM.
7358
 
7359
   Create a new base register for use within the loop and point it to
7360
   the start of MEM.  Create a new memory reference that uses this
7361
   register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
7362
 
7363
static void
7364
mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
7365
                       rtx *loop_reg, rtx *loop_mem)
7366
{
7367
  *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
7368
 
7369
  /* Although the new mem does not refer to a known location,
7370
     it does keep up to LENGTH bytes of alignment.  */
7371
  *loop_mem = change_address (mem, BLKmode, *loop_reg);
7372
  set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
7373
}
7374
 
7375
/* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
7376
   bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
7377
   the memory regions do not overlap.  */
7378
 
7379
static void
7380
mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
7381
                      HOST_WIDE_INT bytes_per_iter)
7382
{
7383
  rtx label, src_reg, dest_reg, final_src, test;
7384
  HOST_WIDE_INT leftover;
7385
 
7386
  leftover = length % bytes_per_iter;
7387
  length -= leftover;
7388
 
7389
  /* Create registers and memory references for use within the loop.  */
7390
  mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
7391
  mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
7392
 
7393
  /* Calculate the value that SRC_REG should have after the last iteration
7394
     of the loop.  */
7395
  final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
7396
                                   0, 0, OPTAB_WIDEN);
7397
 
7398
  /* Emit the start of the loop.  */
7399
  label = gen_label_rtx ();
7400
  emit_label (label);
7401
 
7402
  /* Emit the loop body.  */
7403
  mips_block_move_straight (dest, src, bytes_per_iter);
7404
 
7405
  /* Move on to the next block.  */
7406
  mips_emit_move (src_reg, plus_constant (Pmode, src_reg, bytes_per_iter));
7407
  mips_emit_move (dest_reg, plus_constant (Pmode, dest_reg, bytes_per_iter));
7408
 
7409
  /* Emit the loop condition.  */
7410
  test = gen_rtx_NE (VOIDmode, src_reg, final_src);
7411
  if (Pmode == DImode)
7412
    emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
7413
  else
7414
    emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
7415
 
7416
  /* Mop up any left-over bytes.  */
7417
  if (leftover)
7418
    mips_block_move_straight (dest, src, leftover);
7419
}
7420
 
7421
/* Expand a movmemsi instruction, which copies LENGTH bytes from
7422
   memory reference SRC to memory reference DEST.  */
7423
 
7424
bool
7425
mips_expand_block_move (rtx dest, rtx src, rtx length)
7426
{
7427
  if (CONST_INT_P (length))
7428
    {
7429
      if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
7430
        {
7431
          mips_block_move_straight (dest, src, INTVAL (length));
7432
          return true;
7433
        }
7434
      else if (optimize)
7435
        {
7436
          mips_block_move_loop (dest, src, INTVAL (length),
7437
                                MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
7438
          return true;
7439
        }
7440
    }
7441
  return false;
7442
}
7443
 
7444
/* Expand a loop of synci insns for the address range [BEGIN, END).  */
7445
 
7446
void
7447
mips_expand_synci_loop (rtx begin, rtx end)
7448
{
7449
  rtx inc, label, end_label, cmp_result, mask, length;
7450
 
7451
  /* Create end_label.  */
7452
  end_label = gen_label_rtx ();
7453
 
7454
  /* Check if begin equals end.  */
7455
  cmp_result = gen_rtx_EQ (VOIDmode, begin, end);
7456
  emit_jump_insn (gen_condjump (cmp_result, end_label));
7457
 
7458
  /* Load INC with the cache line size (rdhwr INC,$1).  */
7459
  inc = gen_reg_rtx (Pmode);
7460
  emit_insn (PMODE_INSN (gen_rdhwr_synci_step, (inc)));
7461
 
7462
  /* Check if inc is 0.  */
7463
  cmp_result = gen_rtx_EQ (VOIDmode, inc, const0_rtx);
7464
  emit_jump_insn (gen_condjump (cmp_result, end_label));
7465
 
7466
  /* Calculate mask.  */
7467
  mask = mips_force_unary (Pmode, NEG, inc);
7468
 
7469
  /* Mask out begin by mask.  */
7470
  begin = mips_force_binary (Pmode, AND, begin, mask);
7471
 
7472
  /* Calculate length.  */
7473
  length = mips_force_binary (Pmode, MINUS, end, begin);
7474
 
7475
  /* Loop back to here.  */
7476
  label = gen_label_rtx ();
7477
  emit_label (label);
7478
 
7479
  emit_insn (gen_synci (begin));
7480
 
7481
  /* Update length.  */
7482
  mips_emit_binary (MINUS, length, length, inc);
7483
 
7484
  /* Update begin.  */
7485
  mips_emit_binary (PLUS, begin, begin, inc);
7486
 
7487
  /* Check if length is greater than 0.  */
7488
  cmp_result = gen_rtx_GT (VOIDmode, length, const0_rtx);
7489
  emit_jump_insn (gen_condjump (cmp_result, label));
7490
 
7491
  emit_label (end_label);
7492
}
7493
 
7494
/* Expand a QI or HI mode atomic memory operation.
7495
 
7496
   GENERATOR contains a pointer to the gen_* function that generates
7497
   the SI mode underlying atomic operation using masks that we
7498
   calculate.
7499
 
7500
   RESULT is the return register for the operation.  Its value is NULL
7501
   if unused.
7502
 
7503
   MEM is the location of the atomic access.
7504
 
7505
   OLDVAL is the first operand for the operation.
7506
 
7507
   NEWVAL is the optional second operand for the operation.  Its value
7508
   is NULL if unused.  */
7509
 
7510
void
7511
mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
7512
                         rtx result, rtx mem, rtx oldval, rtx newval)
7513
{
7514
  rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
7515
  rtx unshifted_mask_reg, mask, inverted_mask, si_op;
7516
  rtx res = NULL;
7517
  enum machine_mode mode;
7518
 
7519
  mode = GET_MODE (mem);
7520
 
7521
  /* Compute the address of the containing SImode value.  */
7522
  orig_addr = force_reg (Pmode, XEXP (mem, 0));
7523
  memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
7524
                                  force_reg (Pmode, GEN_INT (-4)));
7525
 
7526
  /* Create a memory reference for it.  */
7527
  memsi = gen_rtx_MEM (SImode, memsi_addr);
7528
  set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
7529
  MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
7530
 
7531
  /* Work out the byte offset of the QImode or HImode value,
7532
     counting from the least significant byte.  */
7533
  shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
7534
  if (TARGET_BIG_ENDIAN)
7535
    mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
7536
 
7537
  /* Multiply by eight to convert the shift value from bytes to bits.  */
7538
  mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
7539
 
7540
  /* Make the final shift an SImode value, so that it can be used in
7541
     SImode operations.  */
7542
  shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
7543
 
7544
  /* Set MASK to an inclusive mask of the QImode or HImode value.  */
7545
  unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
7546
  unshifted_mask_reg = force_reg (SImode, unshifted_mask);
7547
  mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
7548
 
7549
  /* Compute the equivalent exclusive mask.  */
7550
  inverted_mask = gen_reg_rtx (SImode);
7551
  emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
7552
                          gen_rtx_NOT (SImode, mask)));
7553
 
7554
  /* Shift the old value into place.  */
7555
  if (oldval != const0_rtx)
7556
    {
7557
      oldval = convert_modes (SImode, mode, oldval, true);
7558
      oldval = force_reg (SImode, oldval);
7559
      oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
7560
    }
7561
 
7562
  /* Do the same for the new value.  */
7563
  if (newval && newval != const0_rtx)
7564
    {
7565
      newval = convert_modes (SImode, mode, newval, true);
7566
      newval = force_reg (SImode, newval);
7567
      newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
7568
    }
7569
 
7570
  /* Do the SImode atomic access.  */
7571
  if (result)
7572
    res = gen_reg_rtx (SImode);
7573
  if (newval)
7574
    si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
7575
  else if (result)
7576
    si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
7577
  else
7578
    si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
7579
 
7580
  emit_insn (si_op);
7581
 
7582
  if (result)
7583
    {
7584
      /* Shift and convert the result.  */
7585
      mips_emit_binary (AND, res, res, mask);
7586
      mips_emit_binary (LSHIFTRT, res, res, shiftsi);
7587
      mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
7588
    }
7589
}
7590
 
7591
/* Return true if it is possible to use left/right accesses for a
7592
   bitfield of WIDTH bits starting BITPOS bits into BLKmode memory OP.
7593
   When returning true, update *LEFT and *RIGHT as follows:
7594
 
7595
   *LEFT is a QImode reference to the first byte if big endian or
7596
   the last byte if little endian.  This address can be used in the
7597
   left-side instructions (LWL, SWL, LDL, SDL).
7598
 
7599
   *RIGHT is a QImode reference to the opposite end of the field and
7600
   can be used in the patterning right-side instruction.  */
7601
 
7602
static bool
7603
mips_get_unaligned_mem (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
7604
                        rtx *left, rtx *right)
7605
{
7606
  rtx first, last;
7607
 
7608
  /* Check that the size is valid.  */
7609
  if (width != 32 && (!TARGET_64BIT || width != 64))
7610
    return false;
7611
 
7612
  /* We can only access byte-aligned values.  Since we are always passed
7613
     a reference to the first byte of the field, it is not necessary to
7614
     do anything with BITPOS after this check.  */
7615
  if (bitpos % BITS_PER_UNIT != 0)
7616
    return false;
7617
 
7618
  /* Reject aligned bitfields: we want to use a normal load or store
7619
     instead of a left/right pair.  */
7620
  if (MEM_ALIGN (op) >= width)
7621
    return false;
7622
 
7623
  /* Get references to both ends of the field.  */
7624
  first = adjust_address (op, QImode, 0);
7625
  last = adjust_address (op, QImode, width / BITS_PER_UNIT - 1);
7626
 
7627
  /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
7628
     correspond to the MSB and RIGHT to the LSB.  */
7629
  if (TARGET_BIG_ENDIAN)
7630
    *left = first, *right = last;
7631
  else
7632
    *left = last, *right = first;
7633
 
7634
  return true;
7635
}
7636
 
7637
/* Try to use left/right loads to expand an "extv" or "extzv" pattern.
7638
   DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
7639
   the operation is the equivalent of:
7640
 
7641
      (set DEST (*_extract SRC WIDTH BITPOS))
7642
 
7643
   Return true on success.  */
7644
 
7645
bool
7646
mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
7647
                                   HOST_WIDE_INT bitpos, bool unsigned_p)
7648
{
7649
  rtx left, right, temp;
7650
  rtx dest1 = NULL_RTX;
7651
 
7652
  /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
7653
     be a DImode, create a new temp and emit a zero extend at the end.  */
7654
  if (GET_MODE (dest) == DImode
7655
      && REG_P (dest)
7656
      && GET_MODE_BITSIZE (SImode) == width)
7657
    {
7658
      dest1 = dest;
7659
      dest = gen_reg_rtx (SImode);
7660
    }
7661
 
7662
  if (!mips_get_unaligned_mem (src, width, bitpos, &left, &right))
7663
    return false;
7664
 
7665
  temp = gen_reg_rtx (GET_MODE (dest));
7666
  if (GET_MODE (dest) == DImode)
7667
    {
7668
      emit_insn (gen_mov_ldl (temp, src, left));
7669
      emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
7670
    }
7671
  else
7672
    {
7673
      emit_insn (gen_mov_lwl (temp, src, left));
7674
      emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
7675
    }
7676
 
7677
  /* If we were loading 32bits and the original register was DI then
7678
     sign/zero extend into the orignal dest.  */
7679
  if (dest1)
7680
    {
7681
      if (unsigned_p)
7682
        emit_insn (gen_zero_extendsidi2 (dest1, dest));
7683
      else
7684
        emit_insn (gen_extendsidi2 (dest1, dest));
7685
    }
7686
  return true;
7687
}
7688
 
7689
/* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
7690
   BITPOS and SRC are the operands passed to the expander; the operation
7691
   is the equivalent of:
7692
 
7693
       (set (zero_extract DEST WIDTH BITPOS) SRC)
7694
 
7695
   Return true on success.  */
7696
 
7697
bool
7698
mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
7699
                                    HOST_WIDE_INT bitpos)
7700
{
7701
  rtx left, right;
7702
  enum machine_mode mode;
7703
 
7704
  if (!mips_get_unaligned_mem (dest, width, bitpos, &left, &right))
7705
    return false;
7706
 
7707
  mode = mode_for_size (width, MODE_INT, 0);
7708
  src = gen_lowpart (mode, src);
7709
  if (mode == DImode)
7710
    {
7711
      emit_insn (gen_mov_sdl (dest, src, left));
7712
      emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
7713
    }
7714
  else
7715
    {
7716
      emit_insn (gen_mov_swl (dest, src, left));
7717
      emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
7718
    }
7719
  return true;
7720
}
7721
 
7722
/* Return true if X is a MEM with the same size as MODE.  */
7723
 
7724
bool
7725
mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
7726
{
7727
  return (MEM_P (x)
7728
          && MEM_SIZE_KNOWN_P (x)
7729
          && MEM_SIZE (x) == GET_MODE_SIZE (mode));
7730
}
7731
 
7732
/* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
7733
   source of an "ext" instruction or the destination of an "ins"
7734
   instruction.  OP must be a register operand and the following
7735
   conditions must hold:
7736
 
7737
 
7738
 
7739
 
7740
 
7741
   Also reject lengths equal to a word as they are better handled
7742
   by the move patterns.  */
7743
 
7744
bool
7745
mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
7746
{
7747
  if (!ISA_HAS_EXT_INS
7748
      || !register_operand (op, VOIDmode)
7749
      || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
7750
    return false;
7751
 
7752
  if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
7753
    return false;
7754
 
7755
  if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
7756
    return false;
7757
 
7758
  return true;
7759
}
7760
 
7761
/* Check if MASK and SHIFT are valid in mask-low-and-shift-left
7762
   operation if MAXLEN is the maxium length of consecutive bits that
7763
   can make up MASK.  MODE is the mode of the operation.  See
7764
   mask_low_and_shift_len for the actual definition.  */
7765
 
7766
bool
7767
mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
7768
{
7769
  return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7770
}
7771
 
7772
/* Return true iff OP1 and OP2 are valid operands together for the
7773
   *and<MODE>3 and *and<MODE>3_mips16 patterns.  For the cases to consider,
7774
   see the table in the comment before the pattern.  */
7775
 
7776
bool
7777
and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7778
{
7779
  return (memory_operand (op1, mode)
7780
          ? and_load_operand (op2, mode)
7781
          : and_reg_operand (op2, mode));
7782
}
7783
 
7784
/* The canonical form of a mask-low-and-shift-left operation is
7785
   (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7786
   cleared.  Thus we need to shift MASK to the right before checking if it
7787
   is a valid mask value.  MODE is the mode of the operation.  If true
7788
   return the length of the mask, otherwise return -1.  */
7789
 
7790
int
7791
mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7792
{
7793
  HOST_WIDE_INT shval;
7794
 
7795
  shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7796
  return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7797
}
7798
 
7799
/* Return true if -msplit-addresses is selected and should be honored.
7800
 
7801
   -msplit-addresses is a half-way house between explicit relocations
7802
   and the traditional assembler macros.  It can split absolute 32-bit
7803
   symbolic constants into a high/lo_sum pair but uses macros for other
7804
   sorts of access.
7805
 
7806
   Like explicit relocation support for REL targets, it relies
7807
   on GNU extensions in the assembler and the linker.
7808
 
7809
   Although this code should work for -O0, it has traditionally
7810
   been treated as an optimization.  */
7811
 
7812
static bool
7813
mips_split_addresses_p (void)
7814
{
7815
  return (TARGET_SPLIT_ADDRESSES
7816
          && optimize
7817
          && !TARGET_MIPS16
7818
          && !flag_pic
7819
          && !ABI_HAS_64BIT_SYMBOLS);
7820
}
7821
 
7822
/* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
7823
 
7824
static void
7825
mips_init_relocs (void)
7826
{
7827
  memset (mips_split_p, '\0', sizeof (mips_split_p));
7828
  memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7829
  memset (mips_use_pcrel_pool_p, '\0', sizeof (mips_use_pcrel_pool_p));
7830
  memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7831
  memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7832
 
7833
  if (TARGET_MIPS16_PCREL_LOADS)
7834
    mips_use_pcrel_pool_p[SYMBOL_ABSOLUTE] = true;
7835
  else
7836
    {
7837
      if (ABI_HAS_64BIT_SYMBOLS)
7838
        {
7839
          if (TARGET_EXPLICIT_RELOCS)
7840
            {
7841
              mips_split_p[SYMBOL_64_HIGH] = true;
7842
              mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7843
              mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7844
 
7845
              mips_split_p[SYMBOL_64_MID] = true;
7846
              mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7847
              mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7848
 
7849
              mips_split_p[SYMBOL_64_LOW] = true;
7850
              mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7851
              mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7852
 
7853
              mips_split_p[SYMBOL_ABSOLUTE] = true;
7854
              mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7855
            }
7856
        }
7857
      else
7858
        {
7859
          if (TARGET_EXPLICIT_RELOCS
7860
              || mips_split_addresses_p ()
7861
              || TARGET_MIPS16)
7862
            {
7863
              mips_split_p[SYMBOL_ABSOLUTE] = true;
7864
              mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7865
              mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7866
            }
7867
        }
7868
    }
7869
 
7870
  if (TARGET_MIPS16)
7871
    {
7872
      /* The high part is provided by a pseudo copy of $gp.  */
7873
      mips_split_p[SYMBOL_GP_RELATIVE] = true;
7874
      mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7875
    }
7876
  else if (TARGET_EXPLICIT_RELOCS)
7877
    /* Small data constants are kept whole until after reload,
7878
       then lowered by mips_rewrite_small_data.  */
7879
    mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7880
 
7881
  if (TARGET_EXPLICIT_RELOCS)
7882
    {
7883
      mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7884
      if (TARGET_NEWABI)
7885
        {
7886
          mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7887
          mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7888
        }
7889
      else
7890
        {
7891
          mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7892
          mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7893
        }
7894
      if (TARGET_MIPS16)
7895
        /* Expose the use of $28 as soon as possible.  */
7896
        mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7897
 
7898
      if (TARGET_XGOT)
7899
        {
7900
          /* The HIGH and LO_SUM are matched by special .md patterns.  */
7901
          mips_split_p[SYMBOL_GOT_DISP] = true;
7902
 
7903
          mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7904
          mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7905
          mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7906
 
7907
          mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7908
          mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7909
          mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7910
        }
7911
      else
7912
        {
7913
          if (TARGET_NEWABI)
7914
            mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7915
          else
7916
            mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7917
          mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7918
          if (TARGET_MIPS16)
7919
            /* Expose the use of $28 as soon as possible.  */
7920
            mips_split_p[SYMBOL_GOT_DISP] = true;
7921
        }
7922
    }
7923
 
7924
  if (TARGET_NEWABI)
7925
    {
7926
      mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7927
      mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7928
      mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7929
    }
7930
 
7931
  mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7932
  mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7933
 
7934
  if (TARGET_MIPS16_PCREL_LOADS)
7935
    {
7936
      mips_use_pcrel_pool_p[SYMBOL_DTPREL] = true;
7937
      mips_use_pcrel_pool_p[SYMBOL_TPREL] = true;
7938
    }
7939
  else
7940
    {
7941
      mips_split_p[SYMBOL_DTPREL] = true;
7942
      mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7943
      mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7944
 
7945
      mips_split_p[SYMBOL_TPREL] = true;
7946
      mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7947
      mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7948
    }
7949
 
7950
  mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7951
  mips_lo_relocs[SYMBOL_HALF] = "%half(";
7952
}
7953
 
7954
/* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7955
   in context CONTEXT.  RELOCS is the array of relocations to use.  */
7956
 
7957
static void
7958
mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7959
                          const char **relocs)
7960
{
7961
  enum mips_symbol_type symbol_type;
7962
  const char *p;
7963
 
7964
  symbol_type = mips_classify_symbolic_expression (op, context);
7965
  gcc_assert (relocs[symbol_type]);
7966
 
7967
  fputs (relocs[symbol_type], file);
7968
  output_addr_const (file, mips_strip_unspec_address (op));
7969
  for (p = relocs[symbol_type]; *p != 0; p++)
7970
    if (*p == '(')
7971
      fputc (')', file);
7972
}
7973
 
7974
/* Start a new block with the given asm switch enabled.  If we need
7975
   to print a directive, emit PREFIX before it and SUFFIX after it.  */
7976
 
7977
static void
7978
mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7979
                        const char *prefix, const char *suffix)
7980
{
7981
  if (asm_switch->nesting_level == 0)
7982
    fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7983
  asm_switch->nesting_level++;
7984
}
7985
 
7986
/* Likewise, but end a block.  */
7987
 
7988
static void
7989
mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7990
                       const char *prefix, const char *suffix)
7991
{
7992
  gcc_assert (asm_switch->nesting_level);
7993
  asm_switch->nesting_level--;
7994
  if (asm_switch->nesting_level == 0)
7995
    fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7996
}
7997
 
7998
/* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7999
   that either print a complete line or print nothing.  */
8000
 
8001
void
8002
mips_push_asm_switch (struct mips_asm_switch *asm_switch)
8003
{
8004
  mips_push_asm_switch_1 (asm_switch, "\t", "\n");
8005
}
8006
 
8007
void
8008
mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
8009
{
8010
  mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
8011
}
8012
 
8013
/* Print the text for PRINT_OPERAND punctation character CH to FILE.
8014
   The punctuation characters are:
8015
 
8016
   '('  Start a nested ".set noreorder" block.
8017
   ')'  End a nested ".set noreorder" block.
8018
   '['  Start a nested ".set noat" block.
8019
   ']'  End a nested ".set noat" block.
8020
   '<'  Start a nested ".set nomacro" block.
8021
   '>'  End a nested ".set nomacro" block.
8022
   '*'  Behave like %(%< if generating a delayed-branch sequence.
8023
   '#'  Print a nop if in a ".set noreorder" block.
8024
   '/'  Like '#', but do nothing within a delayed-branch sequence.
8025
   '?'  Print "l" if mips_branch_likely is true
8026
   '~'  Print a nop if mips_branch_likely is true
8027
   '.'  Print the name of the register with a hard-wired zero (zero or $0).
8028
   '@'  Print the name of the assembler temporary register (at or $1).
8029
   '^'  Print the name of the pic call-through register (t9 or $25).
8030
   '+'  Print the name of the gp register (usually gp or $28).
8031
   '$'  Print the name of the stack pointer register (sp or $29).
8032
   ':'  Print "c" to use the compact version if the delay slot is a nop.
8033
   '!'  Print "s" to use the short version if the delay slot contains a
8034
        16-bit instruction.
8035
 
8036
   See also mips_init_print_operand_pucnt.  */
8037
 
8038
static void
8039
mips_print_operand_punctuation (FILE *file, int ch)
8040
{
8041
  switch (ch)
8042
    {
8043
    case '(':
8044
      mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
8045
      break;
8046
 
8047
    case ')':
8048
      mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
8049
      break;
8050
 
8051
    case '[':
8052
      mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
8053
      break;
8054
 
8055
    case ']':
8056
      mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
8057
      break;
8058
 
8059
    case '<':
8060
      mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
8061
      break;
8062
 
8063
    case '>':
8064
      mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
8065
      break;
8066
 
8067
    case '*':
8068
      if (final_sequence != 0)
8069
        {
8070
          mips_print_operand_punctuation (file, '(');
8071
          mips_print_operand_punctuation (file, '<');
8072
        }
8073
      break;
8074
 
8075
    case '#':
8076
      if (mips_noreorder.nesting_level > 0)
8077
        fputs ("\n\tnop", file);
8078
      break;
8079
 
8080
    case '/':
8081
      /* Print an extra newline so that the delayed insn is separated
8082
         from the following ones.  This looks neater and is consistent
8083
         with non-nop delayed sequences.  */
8084
      if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
8085
        fputs ("\n\tnop\n", file);
8086
      break;
8087
 
8088
    case '?':
8089
      if (mips_branch_likely)
8090
        putc ('l', file);
8091
      break;
8092
 
8093
    case '~':
8094
      if (mips_branch_likely)
8095
        fputs ("\n\tnop", file);
8096
      break;
8097
 
8098
    case '.':
8099
      fputs (reg_names[GP_REG_FIRST + 0], file);
8100
      break;
8101
 
8102
    case '@':
8103
      fputs (reg_names[AT_REGNUM], file);
8104
      break;
8105
 
8106
    case '^':
8107
      fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
8108
      break;
8109
 
8110
    case '+':
8111
      fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
8112
      break;
8113
 
8114
    case '$':
8115
      fputs (reg_names[STACK_POINTER_REGNUM], file);
8116
      break;
8117
 
8118
    case ':':
8119
      /* When final_sequence is 0, the delay slot will be a nop.  We can
8120
         use the compact version for microMIPS.  */
8121
      if (final_sequence == 0)
8122
        putc ('c', file);
8123
      break;
8124
 
8125
    case '!':
8126
      /* If the delay slot instruction is short, then use the
8127
         compact version.  */
8128
      if (final_sequence == 0
8129
          || get_attr_length (XVECEXP (final_sequence, 0, 1)) == 2)
8130
        putc ('s', file);
8131
      break;
8132
 
8133
    default:
8134
      gcc_unreachable ();
8135
      break;
8136
    }
8137
}
8138
 
8139
/* Initialize mips_print_operand_punct.  */
8140
 
8141
static void
8142
mips_init_print_operand_punct (void)
8143
{
8144
  const char *p;
8145
 
8146
  for (p = "()[]<>*#/?~.@^+$:!"; *p; p++)
8147
    mips_print_operand_punct[(unsigned char) *p] = true;
8148
}
8149
 
8150
/* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
8151
   associated with condition CODE.  Print the condition part of the
8152
   opcode to FILE.  */
8153
 
8154
static void
8155
mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
8156
{
8157
  switch (code)
8158
    {
8159
    case EQ:
8160
    case NE:
8161
    case GT:
8162
    case GE:
8163
    case LT:
8164
    case LE:
8165
    case GTU:
8166
    case GEU:
8167
    case LTU:
8168
    case LEU:
8169
      /* Conveniently, the MIPS names for these conditions are the same
8170
         as their RTL equivalents.  */
8171
      fputs (GET_RTX_NAME (code), file);
8172
      break;
8173
 
8174
    default:
8175
      output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8176
      break;
8177
    }
8178
}
8179
 
8180
/* Likewise floating-point branches.  */
8181
 
8182
static void
8183
mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
8184
{
8185
  switch (code)
8186
    {
8187
    case EQ:
8188
      fputs ("c1f", file);
8189
      break;
8190
 
8191
    case NE:
8192
      fputs ("c1t", file);
8193
      break;
8194
 
8195
    default:
8196
      output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
8197
      break;
8198
    }
8199
}
8200
 
8201
/* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
8202
 
8203
static bool
8204
mips_print_operand_punct_valid_p (unsigned char code)
8205
{
8206
  return mips_print_operand_punct[code];
8207
}
8208
 
8209
/* Implement TARGET_PRINT_OPERAND.  The MIPS-specific operand codes are:
8210
 
8211
   'X'  Print CONST_INT OP in hexadecimal format.
8212
   'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
8213
   'd'  Print CONST_INT OP in decimal.
8214
   'm'  Print one less than CONST_INT OP in decimal.
8215
   'h'  Print the high-part relocation associated with OP, after stripping
8216
          any outermost HIGH.
8217
   'R'  Print the low-part relocation associated with OP.
8218
   'C'  Print the integer branch condition for comparison OP.
8219
   'N'  Print the inverse of the integer branch condition for comparison OP.
8220
   'F'  Print the FPU branch condition for comparison OP.
8221
   'W'  Print the inverse of the FPU branch condition for comparison OP.
8222
   'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
8223
              'z' for (eq:?I ...), 'n' for (ne:?I ...).
8224
   't'  Like 'T', but with the EQ/NE cases reversed
8225
   'Y'  Print mips_fp_conditions[INTVAL (OP)]
8226
   'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
8227
   'q'  Print a DSP accumulator register.
8228
   'D'  Print the second part of a double-word register or memory operand.
8229
   'L'  Print the low-order register in a double-word register operand.
8230
   'M'  Print high-order register in a double-word register operand.
8231
   'z'  Print $0 if OP is zero, otherwise print OP normally.
8232
   'b'  Print the address of a memory operand, without offset.  */
8233
 
8234
static void
8235
mips_print_operand (FILE *file, rtx op, int letter)
8236
{
8237
  enum rtx_code code;
8238
 
8239
  if (mips_print_operand_punct_valid_p (letter))
8240
    {
8241
      mips_print_operand_punctuation (file, letter);
8242
      return;
8243
    }
8244
 
8245
  gcc_assert (op);
8246
  code = GET_CODE (op);
8247
 
8248
  switch (letter)
8249
    {
8250
    case 'X':
8251
      if (CONST_INT_P (op))
8252
        fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
8253
      else
8254
        output_operand_lossage ("invalid use of '%%%c'", letter);
8255
      break;
8256
 
8257
    case 'x':
8258
      if (CONST_INT_P (op))
8259
        fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
8260
      else
8261
        output_operand_lossage ("invalid use of '%%%c'", letter);
8262
      break;
8263
 
8264
    case 'd':
8265
      if (CONST_INT_P (op))
8266
        fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
8267
      else
8268
        output_operand_lossage ("invalid use of '%%%c'", letter);
8269
      break;
8270
 
8271
    case 'm':
8272
      if (CONST_INT_P (op))
8273
        fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
8274
      else
8275
        output_operand_lossage ("invalid use of '%%%c'", letter);
8276
      break;
8277
 
8278
    case 'h':
8279
      if (code == HIGH)
8280
        op = XEXP (op, 0);
8281
      mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
8282
      break;
8283
 
8284
    case 'R':
8285
      mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
8286
      break;
8287
 
8288
    case 'C':
8289
      mips_print_int_branch_condition (file, code, letter);
8290
      break;
8291
 
8292
    case 'N':
8293
      mips_print_int_branch_condition (file, reverse_condition (code), letter);
8294
      break;
8295
 
8296
    case 'F':
8297
      mips_print_float_branch_condition (file, code, letter);
8298
      break;
8299
 
8300
    case 'W':
8301
      mips_print_float_branch_condition (file, reverse_condition (code),
8302
                                         letter);
8303
      break;
8304
 
8305
    case 'T':
8306
    case 't':
8307
      {
8308
        int truth = (code == NE) == (letter == 'T');
8309
        fputc ("zfnt"[truth * 2 + ST_REG_P (REGNO (XEXP (op, 0)))], file);
8310
      }
8311
      break;
8312
 
8313
    case 'Y':
8314
      if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
8315
        fputs (mips_fp_conditions[UINTVAL (op)], file);
8316
      else
8317
        output_operand_lossage ("'%%%c' is not a valid operand prefix",
8318
                                letter);
8319
      break;
8320
 
8321
    case 'Z':
8322
      if (ISA_HAS_8CC)
8323
        {
8324
          mips_print_operand (file, op, 0);
8325
          fputc (',', file);
8326
        }
8327
      break;
8328
 
8329
    case 'q':
8330
      if (code == REG && MD_REG_P (REGNO (op)))
8331
        fprintf (file, "$ac0");
8332
      else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
8333
        fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
8334
      else
8335
        output_operand_lossage ("invalid use of '%%%c'", letter);
8336
      break;
8337
 
8338
    default:
8339
      switch (code)
8340
        {
8341
        case REG:
8342
          {
8343
            unsigned int regno = REGNO (op);
8344
            if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
8345
                || (letter == 'L' && TARGET_BIG_ENDIAN)
8346
                || letter == 'D')
8347
              regno++;
8348
            else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
8349
              output_operand_lossage ("invalid use of '%%%c'", letter);
8350
            /* We need to print $0 .. $31 for COP0 registers.  */
8351
            if (COP0_REG_P (regno))
8352
              fprintf (file, "$%s", &reg_names[regno][4]);
8353
            else
8354
              fprintf (file, "%s", reg_names[regno]);
8355
          }
8356
          break;
8357
 
8358
        case MEM:
8359
          if (letter == 'D')
8360
            output_address (plus_constant (Pmode, XEXP (op, 0), 4));
8361
          else if (letter == 'b')
8362
            {
8363
              gcc_assert (REG_P (XEXP (op, 0)));
8364
              mips_print_operand (file, XEXP (op, 0), 0);
8365
            }
8366
          else if (letter && letter != 'z')
8367
            output_operand_lossage ("invalid use of '%%%c'", letter);
8368
          else
8369
            output_address (XEXP (op, 0));
8370
          break;
8371
 
8372
        default:
8373
          if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
8374
            fputs (reg_names[GP_REG_FIRST], file);
8375
          else if (letter && letter != 'z')
8376
            output_operand_lossage ("invalid use of '%%%c'", letter);
8377
          else if (CONST_GP_P (op))
8378
            fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
8379
          else
8380
            output_addr_const (file, mips_strip_unspec_address (op));
8381
          break;
8382
        }
8383
    }
8384
}
8385
 
8386
/* Implement TARGET_PRINT_OPERAND_ADDRESS.  */
8387
 
8388
static void
8389
mips_print_operand_address (FILE *file, rtx x)
8390
{
8391
  struct mips_address_info addr;
8392
 
8393
  if (mips_classify_address (&addr, x, word_mode, true))
8394
    switch (addr.type)
8395
      {
8396
      case ADDRESS_REG:
8397
        mips_print_operand (file, addr.offset, 0);
8398
        fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8399
        return;
8400
 
8401
      case ADDRESS_LO_SUM:
8402
        mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
8403
                                  mips_lo_relocs);
8404
        fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
8405
        return;
8406
 
8407
      case ADDRESS_CONST_INT:
8408
        output_addr_const (file, x);
8409
        fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
8410
        return;
8411
 
8412
      case ADDRESS_SYMBOLIC:
8413
        output_addr_const (file, mips_strip_unspec_address (x));
8414
        return;
8415
      }
8416
  gcc_unreachable ();
8417
}
8418
 
8419
/* Implement TARGET_ENCODE_SECTION_INFO.  */
8420
 
8421
static void
8422
mips_encode_section_info (tree decl, rtx rtl, int first)
8423
{
8424
  default_encode_section_info (decl, rtl, first);
8425
 
8426
  if (TREE_CODE (decl) == FUNCTION_DECL)
8427
    {
8428
      rtx symbol = XEXP (rtl, 0);
8429
      tree type = TREE_TYPE (decl);
8430
 
8431
      /* Encode whether the symbol is short or long.  */
8432
      if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
8433
          || mips_far_type_p (type))
8434
        SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
8435
    }
8436
}
8437
 
8438
/* Implement TARGET_SELECT_RTX_SECTION.  */
8439
 
8440
static section *
8441
mips_select_rtx_section (enum machine_mode mode, rtx x,
8442
                         unsigned HOST_WIDE_INT align)
8443
{
8444
  /* ??? Consider using mergeable small data sections.  */
8445
  if (mips_rtx_constant_in_small_data_p (mode))
8446
    return get_named_section (NULL, ".sdata", 0);
8447
 
8448
  return default_elf_select_rtx_section (mode, x, align);
8449
}
8450
 
8451
/* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
8452
 
8453
   The complication here is that, with the combination TARGET_ABICALLS
8454
   && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
8455
   absolute addresses, and should therefore not be included in the
8456
   read-only part of a DSO.  Handle such cases by selecting a normal
8457
   data section instead of a read-only one.  The logic apes that in
8458
   default_function_rodata_section.  */
8459
 
8460
static section *
8461
mips_function_rodata_section (tree decl)
8462
{
8463
  if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
8464
    return default_function_rodata_section (decl);
8465
 
8466
  if (decl && DECL_SECTION_NAME (decl))
8467
    {
8468
      const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8469
      if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
8470
        {
8471
          char *rname = ASTRDUP (name);
8472
          rname[14] = 'd';
8473
          return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
8474
        }
8475
      else if (flag_function_sections
8476
               && flag_data_sections
8477
               && strncmp (name, ".text.", 6) == 0)
8478
        {
8479
          char *rname = ASTRDUP (name);
8480
          memcpy (rname + 1, "data", 4);
8481
          return get_section (rname, SECTION_WRITE, decl);
8482
        }
8483
    }
8484
  return data_section;
8485
}
8486
 
8487
/* Implement TARGET_IN_SMALL_DATA_P.  */
8488
 
8489
static bool
8490
mips_in_small_data_p (const_tree decl)
8491
{
8492
  unsigned HOST_WIDE_INT size;
8493
 
8494
  if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
8495
    return false;
8496
 
8497
  /* We don't yet generate small-data references for -mabicalls
8498
     or VxWorks RTP code.  See the related -G handling in
8499
     mips_option_override.  */
8500
  if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
8501
    return false;
8502
 
8503
  if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
8504
    {
8505
      const char *name;
8506
 
8507
      /* Reject anything that isn't in a known small-data section.  */
8508
      name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
8509
      if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
8510
        return false;
8511
 
8512
      /* If a symbol is defined externally, the assembler will use the
8513
         usual -G rules when deciding how to implement macros.  */
8514
      if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
8515
        return true;
8516
    }
8517
  else if (TARGET_EMBEDDED_DATA)
8518
    {
8519
      /* Don't put constants into the small data section: we want them
8520
         to be in ROM rather than RAM.  */
8521
      if (TREE_CODE (decl) != VAR_DECL)
8522
        return false;
8523
 
8524
      if (TREE_READONLY (decl)
8525
          && !TREE_SIDE_EFFECTS (decl)
8526
          && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
8527
        return false;
8528
    }
8529
 
8530
  /* Enforce -mlocal-sdata.  */
8531
  if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
8532
    return false;
8533
 
8534
  /* Enforce -mextern-sdata.  */
8535
  if (!TARGET_EXTERN_SDATA && DECL_P (decl))
8536
    {
8537
      if (DECL_EXTERNAL (decl))
8538
        return false;
8539
      if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
8540
        return false;
8541
    }
8542
 
8543
  /* We have traditionally not treated zero-sized objects as small data,
8544
     so this is now effectively part of the ABI.  */
8545
  size = int_size_in_bytes (TREE_TYPE (decl));
8546
  return size > 0 && size <= mips_small_data_threshold;
8547
}
8548
 
8549
/* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
8550
   anchors for small data: the GP register acts as an anchor in that
8551
   case.  We also don't want to use them for PC-relative accesses,
8552
   where the PC acts as an anchor.  */
8553
 
8554
static bool
8555
mips_use_anchors_for_symbol_p (const_rtx symbol)
8556
{
8557
  switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
8558
    {
8559
    case SYMBOL_PC_RELATIVE:
8560
    case SYMBOL_GP_RELATIVE:
8561
      return false;
8562
 
8563
    default:
8564
      return default_use_anchors_for_symbol_p (symbol);
8565
    }
8566
}
8567
 
8568
/* The MIPS debug format wants all automatic variables and arguments
8569
   to be in terms of the virtual frame pointer (stack pointer before
8570
   any adjustment in the function), while the MIPS 3.0 linker wants
8571
   the frame pointer to be the stack pointer after the initial
8572
   adjustment.  So, we do the adjustment here.  The arg pointer (which
8573
   is eliminated) points to the virtual frame pointer, while the frame
8574
   pointer (which may be eliminated) points to the stack pointer after
8575
   the initial adjustments.  */
8576
 
8577
HOST_WIDE_INT
8578
mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
8579
{
8580
  rtx offset2 = const0_rtx;
8581
  rtx reg = eliminate_constant_term (addr, &offset2);
8582
 
8583
  if (offset == 0)
8584
    offset = INTVAL (offset2);
8585
 
8586
  if (reg == stack_pointer_rtx
8587
      || reg == frame_pointer_rtx
8588
      || reg == hard_frame_pointer_rtx)
8589
    {
8590
      offset -= cfun->machine->frame.total_size;
8591
      if (reg == hard_frame_pointer_rtx)
8592
        offset += cfun->machine->frame.hard_frame_pointer_offset;
8593
    }
8594
 
8595
  return offset;
8596
}
8597
 
8598
/* Implement ASM_OUTPUT_EXTERNAL.  */
8599
 
8600
void
8601
mips_output_external (FILE *file, tree decl, const char *name)
8602
{
8603
  default_elf_asm_output_external (file, decl, name);
8604
 
8605
  /* We output the name if and only if TREE_SYMBOL_REFERENCED is
8606
     set in order to avoid putting out names that are never really
8607
     used. */
8608
  if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
8609
    {
8610
      if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
8611
        {
8612
          /* When using assembler macros, emit .extern directives for
8613
             all small-data externs so that the assembler knows how
8614
             big they are.
8615
 
8616
             In most cases it would be safe (though pointless) to emit
8617
             .externs for other symbols too.  One exception is when an
8618
             object is within the -G limit but declared by the user to
8619
             be in a section other than .sbss or .sdata.  */
8620
          fputs ("\t.extern\t", file);
8621
          assemble_name (file, name);
8622
          fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
8623
                   int_size_in_bytes (TREE_TYPE (decl)));
8624
        }
8625
    }
8626
}
8627
 
8628
/* Implement TARGET_ASM_OUTPUT_SOURCE_FILENAME.  */
8629
 
8630
static void
8631
mips_output_filename (FILE *stream, const char *name)
8632
{
8633
  /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
8634
     directives.  */
8635
  if (write_symbols == DWARF2_DEBUG)
8636
    return;
8637
  else if (mips_output_filename_first_time)
8638
    {
8639
      mips_output_filename_first_time = 0;
8640
      num_source_filenames += 1;
8641
      current_function_file = name;
8642
      fprintf (stream, "\t.file\t%d ", num_source_filenames);
8643
      output_quoted_string (stream, name);
8644
      putc ('\n', stream);
8645
    }
8646
  /* If we are emitting stabs, let dbxout.c handle this (except for
8647
     the mips_output_filename_first_time case).  */
8648
  else if (write_symbols == DBX_DEBUG)
8649
    return;
8650
  else if (name != current_function_file
8651
           && strcmp (name, current_function_file) != 0)
8652
    {
8653
      num_source_filenames += 1;
8654
      current_function_file = name;
8655
      fprintf (stream, "\t.file\t%d ", num_source_filenames);
8656
      output_quoted_string (stream, name);
8657
      putc ('\n', stream);
8658
    }
8659
}
8660
 
8661
/* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
8662
 
8663
static void ATTRIBUTE_UNUSED
8664
mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
8665
{
8666
  switch (size)
8667
    {
8668
    case 4:
8669
      fputs ("\t.dtprelword\t", file);
8670
      break;
8671
 
8672
    case 8:
8673
      fputs ("\t.dtpreldword\t", file);
8674
      break;
8675
 
8676
    default:
8677
      gcc_unreachable ();
8678
    }
8679
  output_addr_const (file, x);
8680
  fputs ("+0x8000", file);
8681
}
8682
 
8683
/* Implement TARGET_DWARF_REGISTER_SPAN.  */
8684
 
8685
static rtx
8686
mips_dwarf_register_span (rtx reg)
8687
{
8688
  rtx high, low;
8689
  enum machine_mode mode;
8690
 
8691
  /* By default, GCC maps increasing register numbers to increasing
8692
     memory locations, but paired FPRs are always little-endian,
8693
     regardless of the prevailing endianness.  */
8694
  mode = GET_MODE (reg);
8695
  if (FP_REG_P (REGNO (reg))
8696
      && TARGET_BIG_ENDIAN
8697
      && MAX_FPRS_PER_FMT > 1
8698
      && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
8699
    {
8700
      gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
8701
      high = mips_subword (reg, true);
8702
      low = mips_subword (reg, false);
8703
      return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
8704
    }
8705
 
8706
  return NULL_RTX;
8707
}
8708
 
8709
/* DSP ALU can bypass data with no delays for the following pairs. */
8710
enum insn_code dspalu_bypass_table[][2] =
8711
{
8712
  {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
8713
  {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
8714
  {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
8715
  {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
8716
  {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
8717
  {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
8718
  {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
8719
  {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
8720
};
8721
 
8722
int
8723
mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
8724
{
8725
  int i;
8726
  int num_bypass = ARRAY_SIZE (dspalu_bypass_table);
8727
  enum insn_code out_icode = (enum insn_code) INSN_CODE (out_insn);
8728
  enum insn_code in_icode = (enum insn_code) INSN_CODE (in_insn);
8729
 
8730
  for (i = 0; i < num_bypass; i++)
8731
    {
8732
      if (out_icode == dspalu_bypass_table[i][0]
8733
          && in_icode == dspalu_bypass_table[i][1])
8734
       return true;
8735
    }
8736
 
8737
  return false;
8738
}
8739
/* Implement ASM_OUTPUT_ASCII.  */
8740
 
8741
void
8742
mips_output_ascii (FILE *stream, const char *string, size_t len)
8743
{
8744
  size_t i;
8745
  int cur_pos;
8746
 
8747
  cur_pos = 17;
8748
  fprintf (stream, "\t.ascii\t\"");
8749
  for (i = 0; i < len; i++)
8750
    {
8751
      int c;
8752
 
8753
      c = (unsigned char) string[i];
8754
      if (ISPRINT (c))
8755
        {
8756
          if (c == '\\' || c == '\"')
8757
            {
8758
              putc ('\\', stream);
8759
              cur_pos++;
8760
            }
8761
          putc (c, stream);
8762
          cur_pos++;
8763
        }
8764
      else
8765
        {
8766
          fprintf (stream, "\\%03o", c);
8767
          cur_pos += 4;
8768
        }
8769
 
8770
      if (cur_pos > 72 && i+1 < len)
8771
        {
8772
          cur_pos = 17;
8773
          fprintf (stream, "\"\n\t.ascii\t\"");
8774
        }
8775
    }
8776
  fprintf (stream, "\"\n");
8777
}
8778
 
8779
/* Return the pseudo-op for full SYMBOL_(D)TPREL address *ADDR.
8780
   Update *ADDR with the operand that should be printed.  */
8781
 
8782
const char *
8783
mips_output_tls_reloc_directive (rtx *addr)
8784
{
8785
  enum mips_symbol_type type;
8786
 
8787
  type = mips_classify_symbolic_expression (*addr, SYMBOL_CONTEXT_LEA);
8788
  *addr = mips_strip_unspec_address (*addr);
8789
  switch (type)
8790
    {
8791
    case SYMBOL_DTPREL:
8792
      return Pmode == SImode ? ".dtprelword\t%0" : ".dtpreldword\t%0";
8793
 
8794
    case SYMBOL_TPREL:
8795
      return Pmode == SImode ? ".tprelword\t%0" : ".tpreldword\t%0";
8796
 
8797
    default:
8798
      gcc_unreachable ();
8799
    }
8800
}
8801
 
8802
/* Emit either a label, .comm, or .lcomm directive.  When using assembler
8803
   macros, mark the symbol as written so that mips_asm_output_external
8804
   won't emit an .extern for it.  STREAM is the output file, NAME is the
8805
   name of the symbol, INIT_STRING is the string that should be written
8806
   before the symbol and FINAL_STRING is the string that should be
8807
   written after it.  FINAL_STRING is a printf format that consumes the
8808
   remaining arguments.  */
8809
 
8810
void
8811
mips_declare_object (FILE *stream, const char *name, const char *init_string,
8812
                     const char *final_string, ...)
8813
{
8814
  va_list ap;
8815
 
8816
  fputs (init_string, stream);
8817
  assemble_name (stream, name);
8818
  va_start (ap, final_string);
8819
  vfprintf (stream, final_string, ap);
8820
  va_end (ap);
8821
 
8822
  if (!TARGET_EXPLICIT_RELOCS)
8823
    {
8824
      tree name_tree = get_identifier (name);
8825
      TREE_ASM_WRITTEN (name_tree) = 1;
8826
    }
8827
}
8828
 
8829
/* Declare a common object of SIZE bytes using asm directive INIT_STRING.
8830
   NAME is the name of the object and ALIGN is the required alignment
8831
   in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
8832
   alignment argument.  */
8833
 
8834
void
8835
mips_declare_common_object (FILE *stream, const char *name,
8836
                            const char *init_string,
8837
                            unsigned HOST_WIDE_INT size,
8838
                            unsigned int align, bool takes_alignment_p)
8839
{
8840
  if (!takes_alignment_p)
8841
    {
8842
      size += (align / BITS_PER_UNIT) - 1;
8843
      size -= size % (align / BITS_PER_UNIT);
8844
      mips_declare_object (stream, name, init_string,
8845
                           "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
8846
    }
8847
  else
8848
    mips_declare_object (stream, name, init_string,
8849
                         "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8850
                         size, align / BITS_PER_UNIT);
8851
}
8852
 
8853
/* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
8854
   elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
8855
 
8856
void
8857
mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8858
                                 unsigned HOST_WIDE_INT size,
8859
                                 unsigned int align)
8860
{
8861
  /* If the target wants uninitialized const declarations in
8862
     .rdata then don't put them in .comm.  */
8863
  if (TARGET_EMBEDDED_DATA
8864
      && TARGET_UNINIT_CONST_IN_RODATA
8865
      && TREE_CODE (decl) == VAR_DECL
8866
      && TREE_READONLY (decl)
8867
      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8868
    {
8869
      if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8870
        targetm.asm_out.globalize_label (stream, name);
8871
 
8872
      switch_to_section (readonly_data_section);
8873
      ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8874
      mips_declare_object (stream, name, "",
8875
                           ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8876
                           size);
8877
    }
8878
  else
8879
    mips_declare_common_object (stream, name, "\n\t.comm\t",
8880
                                size, align, true);
8881
}
8882
 
8883
#ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8884
extern int size_directive_output;
8885
 
8886
/* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
8887
   definitions except that it uses mips_declare_object to emit the label.  */
8888
 
8889
void
8890
mips_declare_object_name (FILE *stream, const char *name,
8891
                          tree decl ATTRIBUTE_UNUSED)
8892
{
8893
#ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8894
  ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8895
#endif
8896
 
8897
  size_directive_output = 0;
8898
  if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8899
    {
8900
      HOST_WIDE_INT size;
8901
 
8902
      size_directive_output = 1;
8903
      size = int_size_in_bytes (TREE_TYPE (decl));
8904
      ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8905
    }
8906
 
8907
  mips_declare_object (stream, name, "", ":\n");
8908
}
8909
 
8910
/* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
8911
 
8912
void
8913
mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8914
{
8915
  const char *name;
8916
 
8917
  name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8918
  if (!flag_inhibit_size_directive
8919
      && DECL_SIZE (decl) != 0
8920
      && !at_end
8921
      && top_level
8922
      && DECL_INITIAL (decl) == error_mark_node
8923
      && !size_directive_output)
8924
    {
8925
      HOST_WIDE_INT size;
8926
 
8927
      size_directive_output = 1;
8928
      size = int_size_in_bytes (TREE_TYPE (decl));
8929
      ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8930
    }
8931
}
8932
#endif
8933
 
8934
/* Return the FOO in the name of the ".mdebug.FOO" section associated
8935
   with the current ABI.  */
8936
 
8937
static const char *
8938
mips_mdebug_abi_name (void)
8939
{
8940
  switch (mips_abi)
8941
    {
8942
    case ABI_32:
8943
      return "abi32";
8944
    case ABI_O64:
8945
      return "abiO64";
8946
    case ABI_N32:
8947
      return "abiN32";
8948
    case ABI_64:
8949
      return "abi64";
8950
    case ABI_EABI:
8951
      return TARGET_64BIT ? "eabi64" : "eabi32";
8952
    default:
8953
      gcc_unreachable ();
8954
    }
8955
}
8956
 
8957
/* Implement TARGET_ASM_FILE_START.  */
8958
 
8959
static void
8960
mips_file_start (void)
8961
{
8962
  default_file_start ();
8963
 
8964
  /* Generate a special section to describe the ABI switches used to
8965
     produce the resultant binary.  */
8966
 
8967
  /* Record the ABI itself.  Modern versions of binutils encode
8968
     this information in the ELF header flags, but GDB needs the
8969
     information in order to correctly debug binaries produced by
8970
     older binutils.  See the function mips_gdbarch_init in
8971
     gdb/mips-tdep.c.  */
8972
  fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8973
           mips_mdebug_abi_name ());
8974
 
8975
  /* There is no ELF header flag to distinguish long32 forms of the
8976
     EABI from long64 forms.  Emit a special section to help tools
8977
     such as GDB.  Do the same for o64, which is sometimes used with
8978
     -mlong64.  */
8979
  if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8980
    fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8981
             "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8982
 
8983
  /* Record the NaN encoding.  */
8984
  if (HAVE_AS_NAN || mips_nan != MIPS_IEEE_754_DEFAULT)
8985
    fprintf (asm_out_file, "\t.nan\t%s\n",
8986
             mips_nan == MIPS_IEEE_754_2008 ? "2008" : "legacy");
8987
 
8988
#ifdef HAVE_AS_GNU_ATTRIBUTE
8989
  {
8990
    int attr;
8991
 
8992
    /* No floating-point operations, -mno-float.  */
8993
    if (TARGET_NO_FLOAT)
8994
      attr = 0;
8995
    /* Soft-float code, -msoft-float.  */
8996
    else if (!TARGET_HARD_FLOAT_ABI)
8997
      attr = 3;
8998
    /* Single-float code, -msingle-float.  */
8999
    else if (!TARGET_DOUBLE_FLOAT)
9000
      attr = 2;
9001
    /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.  */
9002
    else if (!TARGET_64BIT && TARGET_FLOAT64)
9003
      attr = 4;
9004
    /* Regular FP code, FP regs same size as GP regs, -mdouble-float.  */
9005
    else
9006
      attr = 1;
9007
 
9008
    fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
9009
  }
9010
#endif
9011
 
9012
  /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
9013
  if (TARGET_ABICALLS)
9014
    {
9015
      fprintf (asm_out_file, "\t.abicalls\n");
9016
      if (TARGET_ABICALLS_PIC0)
9017
        fprintf (asm_out_file, "\t.option\tpic0\n");
9018
    }
9019
 
9020
  if (flag_verbose_asm)
9021
    fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
9022
             ASM_COMMENT_START,
9023
             mips_small_data_threshold, mips_arch_info->name, mips_isa);
9024
}
9025
 
9026
/* Implement TARGET_ASM_CODE_END.  */
9027
 
9028
static void
9029
mips_code_end (void)
9030
{
9031
  mips_finish_stub (&mips16_rdhwr_stub);
9032
  mips_finish_stub (&mips16_get_fcsr_stub);
9033
  mips_finish_stub (&mips16_set_fcsr_stub);
9034
}
9035
 
9036
/* Make the last instruction frame-related and note that it performs
9037
   the operation described by FRAME_PATTERN.  */
9038
 
9039
static void
9040
mips_set_frame_expr (rtx frame_pattern)
9041
{
9042
  rtx insn;
9043
 
9044
  insn = get_last_insn ();
9045
  RTX_FRAME_RELATED_P (insn) = 1;
9046
  REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
9047
                                      frame_pattern,
9048
                                      REG_NOTES (insn));
9049
}
9050
 
9051
/* Return a frame-related rtx that stores REG at MEM.
9052
   REG must be a single register.  */
9053
 
9054
static rtx
9055
mips_frame_set (rtx mem, rtx reg)
9056
{
9057
  rtx set;
9058
 
9059
  set = gen_rtx_SET (VOIDmode, mem, reg);
9060
  RTX_FRAME_RELATED_P (set) = 1;
9061
 
9062
  return set;
9063
}
9064
 
9065
/* Record that the epilogue has restored call-saved register REG.  */
9066
 
9067
static void
9068
mips_add_cfa_restore (rtx reg)
9069
{
9070
  mips_epilogue.cfa_restores = alloc_reg_note (REG_CFA_RESTORE, reg,
9071
                                               mips_epilogue.cfa_restores);
9072
}
9073
 
9074
/* If a MIPS16e SAVE or RESTORE instruction saves or restores register
9075
   mips16e_s2_s8_regs[X], it must also save the registers in indexes
9076
   X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
9077
static const unsigned char mips16e_s2_s8_regs[] = {
9078
  30, 23, 22, 21, 20, 19, 18
9079
};
9080
static const unsigned char mips16e_a0_a3_regs[] = {
9081
  4, 5, 6, 7
9082
};
9083
 
9084
/* A list of the registers that can be saved by the MIPS16e SAVE instruction,
9085
   ordered from the uppermost in memory to the lowest in memory.  */
9086
static const unsigned char mips16e_save_restore_regs[] = {
9087
  31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
9088
};
9089
 
9090
/* Return the index of the lowest X in the range [0, SIZE) for which
9091
   bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
9092
 
9093
static unsigned int
9094
mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
9095
                             unsigned int size)
9096
{
9097
  unsigned int i;
9098
 
9099
  for (i = 0; i < size; i++)
9100
    if (BITSET_P (mask, regs[i]))
9101
      break;
9102
 
9103
  return i;
9104
}
9105
 
9106
/* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
9107
   is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
9108
   in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
9109
   is true for all indexes (X, SIZE).  */
9110
 
9111
static void
9112
mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
9113
                        unsigned int size, unsigned int *num_regs_ptr)
9114
{
9115
  unsigned int i;
9116
 
9117
  i = mips16e_find_first_register (*mask_ptr, regs, size);
9118
  for (i++; i < size; i++)
9119
    if (!BITSET_P (*mask_ptr, regs[i]))
9120
      {
9121
        *num_regs_ptr += 1;
9122
        *mask_ptr |= 1 << regs[i];
9123
      }
9124
}
9125
 
9126
/* Return a simplified form of X using the register values in REG_VALUES.
9127
   REG_VALUES[R] is the last value assigned to hard register R, or null
9128
   if R has not been modified.
9129
 
9130
   This function is rather limited, but is good enough for our purposes.  */
9131
 
9132
static rtx
9133
mips16e_collect_propagate_value (rtx x, rtx *reg_values)
9134
{
9135
  x = avoid_constant_pool_reference (x);
9136
 
9137
  if (UNARY_P (x))
9138
    {
9139
      rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9140
      return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
9141
                                 x0, GET_MODE (XEXP (x, 0)));
9142
    }
9143
 
9144
  if (ARITHMETIC_P (x))
9145
    {
9146
      rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
9147
      rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
9148
      return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
9149
    }
9150
 
9151
  if (REG_P (x)
9152
      && reg_values[REGNO (x)]
9153
      && !rtx_unstable_p (reg_values[REGNO (x)]))
9154
    return reg_values[REGNO (x)];
9155
 
9156
  return x;
9157
}
9158
 
9159
/* Return true if (set DEST SRC) stores an argument register into its
9160
   caller-allocated save slot, storing the number of that argument
9161
   register in *REGNO_PTR if so.  REG_VALUES is as for
9162
   mips16e_collect_propagate_value.  */
9163
 
9164
static bool
9165
mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
9166
                                 unsigned int *regno_ptr)
9167
{
9168
  unsigned int argno, regno;
9169
  HOST_WIDE_INT offset, required_offset;
9170
  rtx addr, base;
9171
 
9172
  /* Check that this is a word-mode store.  */
9173
  if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
9174
    return false;
9175
 
9176
  /* Check that the register being saved is an unmodified argument
9177
     register.  */
9178
  regno = REGNO (src);
9179
  if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
9180
    return false;
9181
  argno = regno - GP_ARG_FIRST;
9182
 
9183
  /* Check whether the address is an appropriate stack-pointer or
9184
     frame-pointer access.  */
9185
  addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
9186
  mips_split_plus (addr, &base, &offset);
9187
  required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
9188
  if (base == hard_frame_pointer_rtx)
9189
    required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
9190
  else if (base != stack_pointer_rtx)
9191
    return false;
9192
  if (offset != required_offset)
9193
    return false;
9194
 
9195
  *regno_ptr = regno;
9196
  return true;
9197
}
9198
 
9199
/* A subroutine of mips_expand_prologue, called only when generating
9200
   MIPS16e SAVE instructions.  Search the start of the function for any
9201
   instructions that save argument registers into their caller-allocated
9202
   save slots.  Delete such instructions and return a value N such that
9203
   saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
9204
   instructions redundant.  */
9205
 
9206
static unsigned int
9207
mips16e_collect_argument_saves (void)
9208
{
9209
  rtx reg_values[FIRST_PSEUDO_REGISTER];
9210
  rtx insn, next, set, dest, src;
9211
  unsigned int nargs, regno;
9212
 
9213
  push_topmost_sequence ();
9214
  nargs = 0;
9215
  memset (reg_values, 0, sizeof (reg_values));
9216
  for (insn = get_insns (); insn; insn = next)
9217
    {
9218
      next = NEXT_INSN (insn);
9219
      if (NOTE_P (insn) || DEBUG_INSN_P (insn))
9220
        continue;
9221
 
9222
      if (!INSN_P (insn))
9223
        break;
9224
 
9225
      set = PATTERN (insn);
9226
      if (GET_CODE (set) != SET)
9227
        break;
9228
 
9229
      dest = SET_DEST (set);
9230
      src = SET_SRC (set);
9231
      if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
9232
        {
9233
          if (!BITSET_P (cfun->machine->frame.mask, regno))
9234
            {
9235
              delete_insn (insn);
9236
              nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
9237
            }
9238
        }
9239
      else if (REG_P (dest) && GET_MODE (dest) == word_mode)
9240
        reg_values[REGNO (dest)]
9241
          = mips16e_collect_propagate_value (src, reg_values);
9242
      else
9243
        break;
9244
    }
9245
  pop_topmost_sequence ();
9246
 
9247
  return nargs;
9248
}
9249
 
9250
/* Return a move between register REGNO and memory location SP + OFFSET.
9251
   REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
9252
   Make the move a load if RESTORE_P, otherwise make it a store.  */
9253
 
9254
static rtx
9255
mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
9256
                          HOST_WIDE_INT offset, unsigned int regno)
9257
{
9258
  rtx reg, mem;
9259
 
9260
  mem = gen_frame_mem (SImode, plus_constant (Pmode, stack_pointer_rtx,
9261
                                              offset));
9262
  reg = gen_rtx_REG (SImode, regno);
9263
  if (restore_p)
9264
    {
9265
      mips_add_cfa_restore (reg);
9266
      return gen_rtx_SET (VOIDmode, reg, mem);
9267
    }
9268
  if (reg_parm_p)
9269
    return gen_rtx_SET (VOIDmode, mem, reg);
9270
  return mips_frame_set (mem, reg);
9271
}
9272
 
9273
/* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
9274
   The instruction must:
9275
 
9276
     - Allocate or deallocate SIZE bytes in total; SIZE is known
9277
       to be nonzero.
9278
 
9279
     - Save or restore as many registers in *MASK_PTR as possible.
9280
       The instruction saves the first registers at the top of the
9281
       allocated area, with the other registers below it.
9282
 
9283
     - Save NARGS argument registers above the allocated area.
9284
 
9285
   (NARGS is always zero if RESTORE_P.)
9286
 
9287
   The SAVE and RESTORE instructions cannot save and restore all general
9288
   registers, so there may be some registers left over for the caller to
9289
   handle.  Destructively modify *MASK_PTR so that it contains the registers
9290
   that still need to be saved or restored.  The caller can save these
9291
   registers in the memory immediately below *OFFSET_PTR, which is a
9292
   byte offset from the bottom of the allocated stack area.  */
9293
 
9294
static rtx
9295
mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
9296
                            HOST_WIDE_INT *offset_ptr, unsigned int nargs,
9297
                            HOST_WIDE_INT size)
9298
{
9299
  rtx pattern, set;
9300
  HOST_WIDE_INT offset, top_offset;
9301
  unsigned int i, regno;
9302
  int n;
9303
 
9304
  gcc_assert (cfun->machine->frame.num_fp == 0);
9305
 
9306
  /* Calculate the number of elements in the PARALLEL.  We need one element
9307
     for the stack adjustment, one for each argument register save, and one
9308
     for each additional register move.  */
9309
  n = 1 + nargs;
9310
  for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9311
    if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
9312
      n++;
9313
 
9314
  /* Create the final PARALLEL.  */
9315
  pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
9316
  n = 0;
9317
 
9318
  /* Add the stack pointer adjustment.  */
9319
  set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
9320
                     plus_constant (Pmode, stack_pointer_rtx,
9321
                                    restore_p ? size : -size));
9322
  RTX_FRAME_RELATED_P (set) = 1;
9323
  XVECEXP (pattern, 0, n++) = set;
9324
 
9325
  /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
9326
  top_offset = restore_p ? size : 0;
9327
 
9328
  /* Save the arguments.  */
9329
  for (i = 0; i < nargs; i++)
9330
    {
9331
      offset = top_offset + i * UNITS_PER_WORD;
9332
      set = mips16e_save_restore_reg (restore_p, true, offset,
9333
                                      GP_ARG_FIRST + i);
9334
      XVECEXP (pattern, 0, n++) = set;
9335
    }
9336
 
9337
  /* Then fill in the other register moves.  */
9338
  offset = top_offset;
9339
  for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
9340
    {
9341
      regno = mips16e_save_restore_regs[i];
9342
      if (BITSET_P (*mask_ptr, regno))
9343
        {
9344
          offset -= UNITS_PER_WORD;
9345
          set = mips16e_save_restore_reg (restore_p, false, offset, regno);
9346
          XVECEXP (pattern, 0, n++) = set;
9347
          *mask_ptr &= ~(1 << regno);
9348
        }
9349
    }
9350
 
9351
  /* Tell the caller what offset it should use for the remaining registers.  */
9352
  *offset_ptr = size + (offset - top_offset);
9353
 
9354
  gcc_assert (n == XVECLEN (pattern, 0));
9355
 
9356
  return pattern;
9357
}
9358
 
9359
/* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
9360
   pointer.  Return true if PATTERN matches the kind of instruction
9361
   generated by mips16e_build_save_restore.  If INFO is nonnull,
9362
   initialize it when returning true.  */
9363
 
9364
bool
9365
mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
9366
                                struct mips16e_save_restore_info *info)
9367
{
9368
  unsigned int i, nargs, mask, extra;
9369
  HOST_WIDE_INT top_offset, save_offset, offset;
9370
  rtx set, reg, mem, base;
9371
  int n;
9372
 
9373
  if (!GENERATE_MIPS16E_SAVE_RESTORE)
9374
    return false;
9375
 
9376
  /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
9377
  top_offset = adjust > 0 ? adjust : 0;
9378
 
9379
  /* Interpret all other members of the PARALLEL.  */
9380
  save_offset = top_offset - UNITS_PER_WORD;
9381
  mask = 0;
9382
  nargs = 0;
9383
  i = 0;
9384
  for (n = 1; n < XVECLEN (pattern, 0); n++)
9385
    {
9386
      /* Check that we have a SET.  */
9387
      set = XVECEXP (pattern, 0, n);
9388
      if (GET_CODE (set) != SET)
9389
        return false;
9390
 
9391
      /* Check that the SET is a load (if restoring) or a store
9392
         (if saving).  */
9393
      mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
9394
      if (!MEM_P (mem))
9395
        return false;
9396
 
9397
      /* Check that the address is the sum of the stack pointer and a
9398
         possibly-zero constant offset.  */
9399
      mips_split_plus (XEXP (mem, 0), &base, &offset);
9400
      if (base != stack_pointer_rtx)
9401
        return false;
9402
 
9403
      /* Check that SET's other operand is a register.  */
9404
      reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
9405
      if (!REG_P (reg))
9406
        return false;
9407
 
9408
      /* Check for argument saves.  */
9409
      if (offset == top_offset + nargs * UNITS_PER_WORD
9410
          && REGNO (reg) == GP_ARG_FIRST + nargs)
9411
        nargs++;
9412
      else if (offset == save_offset)
9413
        {
9414
          while (mips16e_save_restore_regs[i++] != REGNO (reg))
9415
            if (i == ARRAY_SIZE (mips16e_save_restore_regs))
9416
              return false;
9417
 
9418
          mask |= 1 << REGNO (reg);
9419
          save_offset -= UNITS_PER_WORD;
9420
        }
9421
      else
9422
        return false;
9423
    }
9424
 
9425
  /* Check that the restrictions on register ranges are met.  */
9426
  extra = 0;
9427
  mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
9428
                          ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
9429
  mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
9430
                          ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
9431
  if (extra != 0)
9432
    return false;
9433
 
9434
  /* Make sure that the topmost argument register is not saved twice.
9435
     The checks above ensure that the same is then true for the other
9436
     argument registers.  */
9437
  if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
9438
    return false;
9439
 
9440
  /* Pass back information, if requested.  */
9441
  if (info)
9442
    {
9443
      info->nargs = nargs;
9444
      info->mask = mask;
9445
      info->size = (adjust > 0 ? adjust : -adjust);
9446
    }
9447
 
9448
  return true;
9449
}
9450
 
9451
/* Add a MIPS16e SAVE or RESTORE register-range argument to string S
9452
   for the register range [MIN_REG, MAX_REG].  Return a pointer to
9453
   the null terminator.  */
9454
 
9455
static char *
9456
mips16e_add_register_range (char *s, unsigned int min_reg,
9457
                            unsigned int max_reg)
9458
{
9459
  if (min_reg != max_reg)
9460
    s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
9461
  else
9462
    s += sprintf (s, ",%s", reg_names[min_reg]);
9463
  return s;
9464
}
9465
 
9466
/* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
9467
   PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
9468
 
9469
const char *
9470
mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
9471
{
9472
  static char buffer[300];
9473
 
9474
  struct mips16e_save_restore_info info;
9475
  unsigned int i, end;
9476
  char *s;
9477
 
9478
  /* Parse the pattern.  */
9479
  if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
9480
    gcc_unreachable ();
9481
 
9482
  /* Add the mnemonic.  */
9483
  s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
9484
  s += strlen (s);
9485
 
9486
  /* Save the arguments.  */
9487
  if (info.nargs > 1)
9488
    s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
9489
                  reg_names[GP_ARG_FIRST + info.nargs - 1]);
9490
  else if (info.nargs == 1)
9491
    s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
9492
 
9493
  /* Emit the amount of stack space to allocate or deallocate.  */
9494
  s += sprintf (s, "%d", (int) info.size);
9495
 
9496
  /* Save or restore $16.  */
9497
  if (BITSET_P (info.mask, 16))
9498
    s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
9499
 
9500
  /* Save or restore $17.  */
9501
  if (BITSET_P (info.mask, 17))
9502
    s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
9503
 
9504
  /* Save or restore registers in the range $s2...$s8, which
9505
     mips16e_s2_s8_regs lists in decreasing order.  Note that this
9506
     is a software register range; the hardware registers are not
9507
     numbered consecutively.  */
9508
  end = ARRAY_SIZE (mips16e_s2_s8_regs);
9509
  i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
9510
  if (i < end)
9511
    s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
9512
                                    mips16e_s2_s8_regs[i]);
9513
 
9514
  /* Save or restore registers in the range $a0...$a3.  */
9515
  end = ARRAY_SIZE (mips16e_a0_a3_regs);
9516
  i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
9517
  if (i < end)
9518
    s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
9519
                                    mips16e_a0_a3_regs[end - 1]);
9520
 
9521
  /* Save or restore $31.  */
9522
  if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
9523
    s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
9524
 
9525
  return buffer;
9526
}
9527
 
9528
/* Return true if the current function returns its value in a floating-point
9529
   register in MIPS16 mode.  */
9530
 
9531
static bool
9532
mips16_cfun_returns_in_fpr_p (void)
9533
{
9534
  tree return_type = DECL_RESULT (current_function_decl);
9535
  return (TARGET_MIPS16
9536
          && TARGET_HARD_FLOAT_ABI
9537
          && !aggregate_value_p (return_type, current_function_decl)
9538
          && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
9539
}
9540
 
9541
/* Return true if predicate PRED is true for at least one instruction.
9542
   Cache the result in *CACHE, and assume that the result is true
9543
   if *CACHE is already true.  */
9544
 
9545
static bool
9546
mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
9547
{
9548
  rtx insn;
9549
 
9550
  if (!*cache)
9551
    {
9552
      push_topmost_sequence ();
9553
      for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
9554
        if (USEFUL_INSN_P (insn) && pred (insn))
9555
          {
9556
            *cache = true;
9557
            break;
9558
          }
9559
      pop_topmost_sequence ();
9560
    }
9561
  return *cache;
9562
}
9563
 
9564
/* Return true if INSN refers to the global pointer in an "inflexible" way.
9565
   See mips_cfun_has_inflexible_gp_ref_p for details.  */
9566
 
9567
static bool
9568
mips_insn_has_inflexible_gp_ref_p (rtx insn)
9569
{
9570
  /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
9571
     indicate that the target could be a traditional MIPS
9572
     lazily-binding stub.  */
9573
  return find_reg_fusage (insn, USE, pic_offset_table_rtx);
9574
}
9575
 
9576
/* Return true if the current function refers to the global pointer
9577
   in a way that forces $28 to be valid.  This means that we can't
9578
   change the choice of global pointer, even for NewABI code.
9579
 
9580
   One example of this (and one which needs several checks) is that
9581
   $28 must be valid when calling traditional MIPS lazy-binding stubs.
9582
   (This restriction does not apply to PLTs.)  */
9583
 
9584
static bool
9585
mips_cfun_has_inflexible_gp_ref_p (void)
9586
{
9587
  /* If the function has a nonlocal goto, $28 must hold the correct
9588
     global pointer for the target function.  That is, the target
9589
     of the goto implicitly uses $28.  */
9590
  if (crtl->has_nonlocal_goto)
9591
    return true;
9592
 
9593
  if (TARGET_ABICALLS_PIC2)
9594
    {
9595
      /* Symbolic accesses implicitly use the global pointer unless
9596
         -mexplicit-relocs is in effect.  JAL macros to symbolic addresses
9597
         might go to traditional MIPS lazy-binding stubs.  */
9598
      if (!TARGET_EXPLICIT_RELOCS)
9599
        return true;
9600
 
9601
      /* FUNCTION_PROFILER includes a JAL to _mcount, which again
9602
         can be lazily-bound.  */
9603
      if (crtl->profile)
9604
        return true;
9605
 
9606
      /* MIPS16 functions that return in FPRs need to call an
9607
         external libgcc routine.  This call is only made explict
9608
         during mips_expand_epilogue, and it too might be lazily bound.  */
9609
      if (mips16_cfun_returns_in_fpr_p ())
9610
        return true;
9611
    }
9612
 
9613
  return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
9614
                           mips_insn_has_inflexible_gp_ref_p);
9615
}
9616
 
9617
/* Return true if INSN refers to the global pointer in a "flexible" way.
9618
   See mips_cfun_has_flexible_gp_ref_p for details.  */
9619
 
9620
static bool
9621
mips_insn_has_flexible_gp_ref_p (rtx insn)
9622
{
9623
  return (get_attr_got (insn) != GOT_UNSET
9624
          || mips_small_data_pattern_p (PATTERN (insn))
9625
          || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
9626
}
9627
 
9628
/* Return true if the current function references the global pointer,
9629
   but if those references do not inherently require the global pointer
9630
   to be $28.  Assume !mips_cfun_has_inflexible_gp_ref_p ().  */
9631
 
9632
static bool
9633
mips_cfun_has_flexible_gp_ref_p (void)
9634
{
9635
  /* Reload can sometimes introduce constant pool references
9636
     into a function that otherwise didn't need them.  For example,
9637
     suppose we have an instruction like:
9638
 
9639
        (set (reg:DF R1) (float:DF (reg:SI R2)))
9640
 
9641
     If R2 turns out to be a constant such as 1, the instruction may
9642
     have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
9643
     the option of using this constant if R2 doesn't get allocated
9644
     to a register.
9645
 
9646
     In cases like these, reload will have added the constant to the
9647
     pool but no instruction will yet refer to it.  */
9648
  if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
9649
    return true;
9650
 
9651
  return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
9652
                           mips_insn_has_flexible_gp_ref_p);
9653
}
9654
 
9655
/* Return the register that should be used as the global pointer
9656
   within this function.  Return INVALID_REGNUM if the function
9657
   doesn't need a global pointer.  */
9658
 
9659
static unsigned int
9660
mips_global_pointer (void)
9661
{
9662
  unsigned int regno;
9663
 
9664
  /* $gp is always available unless we're using a GOT.  */
9665
  if (!TARGET_USE_GOT)
9666
    return GLOBAL_POINTER_REGNUM;
9667
 
9668
  /* If there are inflexible references to $gp, we must use the
9669
     standard register.  */
9670
  if (mips_cfun_has_inflexible_gp_ref_p ())
9671
    return GLOBAL_POINTER_REGNUM;
9672
 
9673
  /* If there are no current references to $gp, then the only uses
9674
     we can introduce later are those involved in long branches.  */
9675
  if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
9676
    return INVALID_REGNUM;
9677
 
9678
  /* If the global pointer is call-saved, try to use a call-clobbered
9679
     alternative.  */
9680
  if (TARGET_CALL_SAVED_GP && crtl->is_leaf)
9681
    for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9682
      if (!df_regs_ever_live_p (regno)
9683
          && call_really_used_regs[regno]
9684
          && !fixed_regs[regno]
9685
          && regno != PIC_FUNCTION_ADDR_REGNUM)
9686
        return regno;
9687
 
9688
  return GLOBAL_POINTER_REGNUM;
9689
}
9690
 
9691
/* Return true if the current function's prologue must load the global
9692
   pointer value into pic_offset_table_rtx and store the same value in
9693
   the function's cprestore slot (if any).
9694
 
9695
   One problem we have to deal with is that, when emitting GOT-based
9696
   position independent code, long-branch sequences will need to load
9697
   the address of the branch target from the GOT.  We don't know until
9698
   the very end of compilation whether (and where) the function needs
9699
   long branches, so we must ensure that _any_ branch can access the
9700
   global pointer in some form.  However, we do not want to pessimize
9701
   the usual case in which all branches are short.
9702
 
9703
   We handle this as follows:
9704
 
9705
   (1) During reload, we set cfun->machine->global_pointer to
9706
       INVALID_REGNUM if we _know_ that the current function
9707
       doesn't need a global pointer.  This is only valid if
9708
       long branches don't need the GOT.
9709
 
9710
       Otherwise, we assume that we might need a global pointer
9711
       and pick an appropriate register.
9712
 
9713
   (2) If cfun->machine->global_pointer != INVALID_REGNUM,
9714
       we ensure that the global pointer is available at every
9715
       block boundary bar entry and exit.  We do this in one of two ways:
9716
 
9717
       - If the function has a cprestore slot, we ensure that this
9718
         slot is valid at every branch.  However, as explained in
9719
         point (6) below, there is no guarantee that pic_offset_table_rtx
9720
         itself is valid if new uses of the global pointer are introduced
9721
         after the first post-epilogue split.
9722
 
9723
         We guarantee that the cprestore slot is valid by loading it
9724
         into a fake register, CPRESTORE_SLOT_REGNUM.  We then make
9725
         this register live at every block boundary bar function entry
9726
         and exit.  It is then invalid to move the load (and thus the
9727
         preceding store) across a block boundary.
9728
 
9729
       - If the function has no cprestore slot, we guarantee that
9730
         pic_offset_table_rtx itself is valid at every branch.
9731
 
9732
       See mips_eh_uses for the handling of the register liveness.
9733
 
9734
   (3) During prologue and epilogue generation, we emit "ghost"
9735
       placeholder instructions to manipulate the global pointer.
9736
 
9737
   (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
9738
       and cfun->machine->must_restore_gp_when_clobbered_p if we already know
9739
       that the function needs a global pointer.  (There is no need to set
9740
       them earlier than this, and doing it as late as possible leads to
9741
       fewer false positives.)
9742
 
9743
   (5) If cfun->machine->must_initialize_gp_p is true during a
9744
       split_insns pass, we split the ghost instructions into real
9745
       instructions.  These split instructions can then be optimized in
9746
       the usual way.  Otherwise, we keep the ghost instructions intact,
9747
       and optimize for the case where they aren't needed.  We still
9748
       have the option of splitting them later, if we need to introduce
9749
       new uses of the global pointer.
9750
 
9751
       For example, the scheduler ignores a ghost instruction that
9752
       stores $28 to the stack, but it handles the split form of
9753
       the ghost instruction as an ordinary store.
9754
 
9755
   (6) [OldABI only.]  If cfun->machine->must_restore_gp_when_clobbered_p
9756
       is true during the first post-epilogue split_insns pass, we split
9757
       calls and restore_gp patterns into instructions that explicitly
9758
       load pic_offset_table_rtx from the cprestore slot.  Otherwise,
9759
       we split these patterns into instructions that _don't_ load from
9760
       the cprestore slot.
9761
 
9762
       If cfun->machine->must_restore_gp_when_clobbered_p is true at the
9763
       time of the split, then any instructions that exist at that time
9764
       can make free use of pic_offset_table_rtx.  However, if we want
9765
       to introduce new uses of the global pointer after the split,
9766
       we must explicitly load the value from the cprestore slot, since
9767
       pic_offset_table_rtx itself might not be valid at a given point
9768
       in the function.
9769
 
9770
       The idea is that we want to be able to delete redundant
9771
       loads from the cprestore slot in the usual case where no
9772
       long branches are needed.
9773
 
9774
   (7) If cfun->machine->must_initialize_gp_p is still false at the end
9775
       of md_reorg, we decide whether the global pointer is needed for
9776
       long branches.  If so, we set cfun->machine->must_initialize_gp_p
9777
       to true and split the ghost instructions into real instructions
9778
       at that stage.
9779
 
9780
   Note that the ghost instructions must have a zero length for three reasons:
9781
 
9782
   - Giving the length of the underlying $gp sequence might cause
9783
     us to use long branches in cases where they aren't really needed.
9784
 
9785
   - They would perturb things like alignment calculations.
9786
 
9787
   - More importantly, the hazard detection in md_reorg relies on
9788
     empty instructions having a zero length.
9789
 
9790
   If we find a long branch and split the ghost instructions at the
9791
   end of md_reorg, the split could introduce more long branches.
9792
   That isn't a problem though, because we still do the split before
9793
   the final shorten_branches pass.
9794
 
9795
   This is extremely ugly, but it seems like the best compromise between
9796
   correctness and efficiency.  */
9797
 
9798
bool
9799
mips_must_initialize_gp_p (void)
9800
{
9801
  return cfun->machine->must_initialize_gp_p;
9802
}
9803
 
9804
/* Return true if REGNO is a register that is ordinarily call-clobbered
9805
   but must nevertheless be preserved by an interrupt handler.  */
9806
 
9807
static bool
9808
mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
9809
{
9810
  if (MD_REG_P (regno))
9811
    return true;
9812
 
9813
  if (TARGET_DSP && DSP_ACC_REG_P (regno))
9814
    return true;
9815
 
9816
  if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
9817
    {
9818
      /* $0 is hard-wired.  */
9819
      if (regno == GP_REG_FIRST)
9820
        return false;
9821
 
9822
      /* The interrupt handler can treat kernel registers as
9823
         scratch registers.  */
9824
      if (KERNEL_REG_P (regno))
9825
        return false;
9826
 
9827
      /* The function will return the stack pointer to its original value
9828
         anyway.  */
9829
      if (regno == STACK_POINTER_REGNUM)
9830
        return false;
9831
 
9832
      /* Otherwise, return true for registers that aren't ordinarily
9833
         call-clobbered.  */
9834
      return call_really_used_regs[regno];
9835
    }
9836
 
9837
  return false;
9838
}
9839
 
9840
/* Return true if the current function should treat register REGNO
9841
   as call-saved.  */
9842
 
9843
static bool
9844
mips_cfun_call_saved_reg_p (unsigned int regno)
9845
{
9846
  /* If the user makes an ordinarily-call-saved register global,
9847
     that register is no longer call-saved.  */
9848
  if (global_regs[regno])
9849
    return false;
9850
 
9851
  /* Interrupt handlers need to save extra registers.  */
9852
  if (cfun->machine->interrupt_handler_p
9853
      && mips_interrupt_extra_call_saved_reg_p (regno))
9854
    return true;
9855
 
9856
  /* call_insns preserve $28 unless they explicitly say otherwise,
9857
     so call_really_used_regs[] treats $28 as call-saved.  However,
9858
     we want the ABI property rather than the default call_insn
9859
     property here.  */
9860
  return (regno == GLOBAL_POINTER_REGNUM
9861
          ? TARGET_CALL_SAVED_GP
9862
          : !call_really_used_regs[regno]);
9863
}
9864
 
9865
/* Return true if the function body might clobber register REGNO.
9866
   We know that REGNO is call-saved.  */
9867
 
9868
static bool
9869
mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
9870
{
9871
  /* Some functions should be treated as clobbering all call-saved
9872
     registers.  */
9873
  if (crtl->saves_all_registers)
9874
    return true;
9875
 
9876
  /* DF handles cases where a register is explicitly referenced in
9877
     the rtl.  Incoming values are passed in call-clobbered registers,
9878
     so we can assume that any live call-saved register is set within
9879
     the function.  */
9880
  if (df_regs_ever_live_p (regno))
9881
    return true;
9882
 
9883
  /* Check for registers that are clobbered by FUNCTION_PROFILER.
9884
     These clobbers are not explicit in the rtl.  */
9885
  if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
9886
    return true;
9887
 
9888
  /* If we're using a call-saved global pointer, the function's
9889
     prologue will need to set it up.  */
9890
  if (cfun->machine->global_pointer == regno)
9891
    return true;
9892
 
9893
  /* The function's prologue will need to set the frame pointer if
9894
     frame_pointer_needed.  */
9895
  if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9896
    return true;
9897
 
9898
  /* If a MIPS16 function returns a value in FPRs, its epilogue
9899
     will need to call an external libgcc routine.  This yet-to-be
9900
     generated call_insn will clobber $31.  */
9901
  if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9902
    return true;
9903
 
9904
  /* If REGNO is ordinarily call-clobbered, we must assume that any
9905
     called function could modify it.  */
9906
  if (cfun->machine->interrupt_handler_p
9907
      && !crtl->is_leaf
9908
      && mips_interrupt_extra_call_saved_reg_p (regno))
9909
    return true;
9910
 
9911
  return false;
9912
}
9913
 
9914
/* Return true if the current function must save register REGNO.  */
9915
 
9916
static bool
9917
mips_save_reg_p (unsigned int regno)
9918
{
9919
  if (mips_cfun_call_saved_reg_p (regno))
9920
    {
9921
      if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9922
        return true;
9923
 
9924
      /* Save both registers in an FPR pair if either one is used.  This is
9925
         needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9926
         register to be used without the even register.  */
9927
      if (FP_REG_P (regno)
9928
          && MAX_FPRS_PER_FMT == 2
9929
          && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9930
        return true;
9931
    }
9932
 
9933
  /* We need to save the incoming return address if __builtin_eh_return
9934
     is being used to set a different return address.  */
9935
  if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9936
    return true;
9937
 
9938
  return false;
9939
}
9940
 
9941
/* Populate the current function's mips_frame_info structure.
9942
 
9943
   MIPS stack frames look like:
9944
 
9945
        +-------------------------------+
9946
        |                               |
9947
        |  incoming stack arguments     |
9948
        |                               |
9949
        +-------------------------------+
9950
        |                               |
9951
        |  caller-allocated save area   |
9952
      A |  for register arguments       |
9953
        |                               |
9954
        +-------------------------------+ <-- incoming stack pointer
9955
        |                               |
9956
        |  callee-allocated save area   |
9957
      B |  for arguments that are       |
9958
        |  split between registers and  |
9959
        |  the stack                    |
9960
        |                               |
9961
        +-------------------------------+ <-- arg_pointer_rtx
9962
        |                               |
9963
      C |  callee-allocated save area   |
9964
        |  for register varargs         |
9965
        |                               |
9966
        +-------------------------------+ <-- frame_pointer_rtx
9967
        |                               |       + cop0_sp_offset
9968
        |  COP0 reg save area           |       + UNITS_PER_WORD
9969
        |                               |
9970
        +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9971
        |                               |       + UNITS_PER_WORD
9972
        |  accumulator save area        |
9973
        |                               |
9974
        +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9975
        |                               |       + UNITS_PER_HWFPVALUE
9976
        |  FPR save area                |
9977
        |                               |
9978
        +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9979
        |                               |       + UNITS_PER_WORD
9980
        |  GPR save area                |
9981
        |                               |
9982
        +-------------------------------+ <-- frame_pointer_rtx with
9983
        |                               | \     -fstack-protector
9984
        |  local variables              |  | var_size
9985
        |                               | /
9986
        +-------------------------------+
9987
        |                               | \
9988
        |  $gp save area                |  | cprestore_size
9989
        |                               | /
9990
      P +-------------------------------+ <-- hard_frame_pointer_rtx for
9991
        |                               | \     MIPS16 code
9992
        |  outgoing stack arguments     |  |
9993
        |                               |  |
9994
        +-------------------------------+  | args_size
9995
        |                               |  |
9996
        |  caller-allocated save area   |  |
9997
        |  for register arguments       |  |
9998
        |                               | /
9999
        +-------------------------------+ <-- stack_pointer_rtx
10000
                                              frame_pointer_rtx without
10001
                                                -fstack-protector
10002
                                              hard_frame_pointer_rtx for
10003
                                                non-MIPS16 code.
10004
 
10005
   At least two of A, B and C will be empty.
10006
 
10007
   Dynamic stack allocations such as alloca insert data at point P.
10008
   They decrease stack_pointer_rtx but leave frame_pointer_rtx and
10009
   hard_frame_pointer_rtx unchanged.  */
10010
 
10011
static void
10012
mips_compute_frame_info (void)
10013
{
10014
  struct mips_frame_info *frame;
10015
  HOST_WIDE_INT offset, size;
10016
  unsigned int regno, i;
10017
 
10018
  /* Set this function's interrupt properties.  */
10019
  if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
10020
    {
10021
      if (!ISA_MIPS32R2)
10022
        error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
10023
      else if (TARGET_HARD_FLOAT)
10024
        error ("the %<interrupt%> attribute requires %<-msoft-float%>");
10025
      else if (TARGET_MIPS16)
10026
        error ("interrupt handlers cannot be MIPS16 functions");
10027
      else
10028
        {
10029
          cfun->machine->interrupt_handler_p = true;
10030
          cfun->machine->use_shadow_register_set_p =
10031
            mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
10032
          cfun->machine->keep_interrupts_masked_p =
10033
            mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
10034
          cfun->machine->use_debug_exception_return_p =
10035
            mips_use_debug_exception_return_p (TREE_TYPE
10036
                                               (current_function_decl));
10037
        }
10038
    }
10039
 
10040
  frame = &cfun->machine->frame;
10041
  memset (frame, 0, sizeof (*frame));
10042
  size = get_frame_size ();
10043
 
10044
  cfun->machine->global_pointer = mips_global_pointer ();
10045
 
10046
  /* The first two blocks contain the outgoing argument area and the $gp save
10047
     slot.  This area isn't needed in leaf functions, but if the
10048
     target-independent frame size is nonzero, we have already committed to
10049
     allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
10050
  if ((size == 0 || FRAME_GROWS_DOWNWARD) && crtl->is_leaf)
10051
    {
10052
      /* The MIPS 3.0 linker does not like functions that dynamically
10053
         allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
10054
         looks like we are trying to create a second frame pointer to the
10055
         function, so allocate some stack space to make it happy.  */
10056
      if (cfun->calls_alloca)
10057
        frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
10058
      else
10059
        frame->args_size = 0;
10060
      frame->cprestore_size = 0;
10061
    }
10062
  else
10063
    {
10064
      frame->args_size = crtl->outgoing_args_size;
10065
      frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
10066
    }
10067
  offset = frame->args_size + frame->cprestore_size;
10068
 
10069
  /* Move above the local variables.  */
10070
  frame->var_size = MIPS_STACK_ALIGN (size);
10071
  offset += frame->var_size;
10072
 
10073
  /* Find out which GPRs we need to save.  */
10074
  for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
10075
    if (mips_save_reg_p (regno))
10076
      {
10077
        frame->num_gp++;
10078
        frame->mask |= 1 << (regno - GP_REG_FIRST);
10079
      }
10080
 
10081
  /* If this function calls eh_return, we must also save and restore the
10082
     EH data registers.  */
10083
  if (crtl->calls_eh_return)
10084
    for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
10085
      {
10086
        frame->num_gp++;
10087
        frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
10088
      }
10089
 
10090
  /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
10091
     $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
10092
     save all later registers too.  */
10093
  if (GENERATE_MIPS16E_SAVE_RESTORE)
10094
    {
10095
      mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
10096
                              ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
10097
      mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
10098
                              ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
10099
    }
10100
 
10101
  /* Move above the GPR save area.  */
10102
  if (frame->num_gp > 0)
10103
    {
10104
      offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
10105
      frame->gp_sp_offset = offset - UNITS_PER_WORD;
10106
    }
10107
 
10108
  /* Find out which FPRs we need to save.  This loop must iterate over
10109
     the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
10110
  if (TARGET_HARD_FLOAT)
10111
    for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
10112
      if (mips_save_reg_p (regno))
10113
        {
10114
          frame->num_fp += MAX_FPRS_PER_FMT;
10115
          frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
10116
        }
10117
 
10118
  /* Move above the FPR save area.  */
10119
  if (frame->num_fp > 0)
10120
    {
10121
      offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
10122
      frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
10123
    }
10124
 
10125
  /* Add in space for the interrupt context information.  */
10126
  if (cfun->machine->interrupt_handler_p)
10127
    {
10128
      /* Check HI/LO.  */
10129
      if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
10130
        {
10131
          frame->num_acc++;
10132
          frame->acc_mask |= (1 << 0);
10133
        }
10134
 
10135
      /* Check accumulators 1, 2, 3.  */
10136
      for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
10137
        if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
10138
          {
10139
            frame->num_acc++;
10140
            frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
10141
          }
10142
 
10143
      /* All interrupt context functions need space to preserve STATUS.  */
10144
      frame->num_cop0_regs++;
10145
 
10146
      /* If we don't keep interrupts masked, we need to save EPC.  */
10147
      if (!cfun->machine->keep_interrupts_masked_p)
10148
        frame->num_cop0_regs++;
10149
    }
10150
 
10151
  /* Move above the accumulator save area.  */
10152
  if (frame->num_acc > 0)
10153
    {
10154
      /* Each accumulator needs 2 words.  */
10155
      offset += frame->num_acc * 2 * UNITS_PER_WORD;
10156
      frame->acc_sp_offset = offset - UNITS_PER_WORD;
10157
    }
10158
 
10159
  /* Move above the COP0 register save area.  */
10160
  if (frame->num_cop0_regs > 0)
10161
    {
10162
      offset += frame->num_cop0_regs * UNITS_PER_WORD;
10163
      frame->cop0_sp_offset = offset - UNITS_PER_WORD;
10164
    }
10165
 
10166
  /* Move above the callee-allocated varargs save area.  */
10167
  offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
10168
  frame->arg_pointer_offset = offset;
10169
 
10170
  /* Move above the callee-allocated area for pretend stack arguments.  */
10171
  offset += crtl->args.pretend_args_size;
10172
  frame->total_size = offset;
10173
 
10174
  /* Work out the offsets of the save areas from the top of the frame.  */
10175
  if (frame->gp_sp_offset > 0)
10176
    frame->gp_save_offset = frame->gp_sp_offset - offset;
10177
  if (frame->fp_sp_offset > 0)
10178
    frame->fp_save_offset = frame->fp_sp_offset - offset;
10179
  if (frame->acc_sp_offset > 0)
10180
    frame->acc_save_offset = frame->acc_sp_offset - offset;
10181
  if (frame->num_cop0_regs > 0)
10182
    frame->cop0_save_offset = frame->cop0_sp_offset - offset;
10183
 
10184
  /* MIPS16 code offsets the frame pointer by the size of the outgoing
10185
     arguments.  This tends to increase the chances of using unextended
10186
     instructions for local variables and incoming arguments.  */
10187
  if (TARGET_MIPS16)
10188
    frame->hard_frame_pointer_offset = frame->args_size;
10189
}
10190
 
10191
/* Return the style of GP load sequence that is being used for the
10192
   current function.  */
10193
 
10194
enum mips_loadgp_style
10195
mips_current_loadgp_style (void)
10196
{
10197
  if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
10198
    return LOADGP_NONE;
10199
 
10200
  if (TARGET_RTP_PIC)
10201
    return LOADGP_RTP;
10202
 
10203
  if (TARGET_ABSOLUTE_ABICALLS)
10204
    return LOADGP_ABSOLUTE;
10205
 
10206
  return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
10207
}
10208
 
10209
/* Implement TARGET_FRAME_POINTER_REQUIRED.  */
10210
 
10211
static bool
10212
mips_frame_pointer_required (void)
10213
{
10214
  /* If the function contains dynamic stack allocations, we need to
10215
     use the frame pointer to access the static parts of the frame.  */
10216
  if (cfun->calls_alloca)
10217
    return true;
10218
 
10219
  /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
10220
     reload may be unable to compute the address of a local variable,
10221
     since there is no way to add a large constant to the stack pointer
10222
     without using a second temporary register.  */
10223
  if (TARGET_MIPS16)
10224
    {
10225
      mips_compute_frame_info ();
10226
      if (!SMALL_OPERAND (cfun->machine->frame.total_size))
10227
        return true;
10228
    }
10229
 
10230
  return false;
10231
}
10232
 
10233
/* Make sure that we're not trying to eliminate to the wrong hard frame
10234
   pointer.  */
10235
 
10236
static bool
10237
mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
10238
{
10239
  return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
10240
}
10241
 
10242
/* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
10243
   or argument pointer.  TO is either the stack pointer or hard frame
10244
   pointer.  */
10245
 
10246
HOST_WIDE_INT
10247
mips_initial_elimination_offset (int from, int to)
10248
{
10249
  HOST_WIDE_INT offset;
10250
 
10251
  mips_compute_frame_info ();
10252
 
10253
  /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
10254
  switch (from)
10255
    {
10256
    case FRAME_POINTER_REGNUM:
10257
      if (FRAME_GROWS_DOWNWARD)
10258
        offset = (cfun->machine->frame.args_size
10259
                  + cfun->machine->frame.cprestore_size
10260
                  + cfun->machine->frame.var_size);
10261
      else
10262
        offset = 0;
10263
      break;
10264
 
10265
    case ARG_POINTER_REGNUM:
10266
      offset = cfun->machine->frame.arg_pointer_offset;
10267
      break;
10268
 
10269
    default:
10270
      gcc_unreachable ();
10271
    }
10272
 
10273
  if (to == HARD_FRAME_POINTER_REGNUM)
10274
    offset -= cfun->machine->frame.hard_frame_pointer_offset;
10275
 
10276
  return offset;
10277
}
10278
 
10279
/* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
10280
 
10281
static void
10282
mips_extra_live_on_entry (bitmap regs)
10283
{
10284
  if (TARGET_USE_GOT)
10285
    {
10286
      /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
10287
         the global pointer.   */
10288
      if (!TARGET_ABSOLUTE_ABICALLS)
10289
        bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
10290
 
10291
      /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
10292
         the global pointer.  */
10293
      if (TARGET_MIPS16)
10294
        bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
10295
 
10296
      /* See the comment above load_call<mode> for details.  */
10297
      bitmap_set_bit (regs, GOT_VERSION_REGNUM);
10298
    }
10299
}
10300
 
10301
/* Implement RETURN_ADDR_RTX.  We do not support moving back to a
10302
   previous frame.  */
10303
 
10304
rtx
10305
mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
10306
{
10307
  if (count != 0)
10308
    return const0_rtx;
10309
 
10310
  return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
10311
}
10312
 
10313
/* Emit code to change the current function's return address to
10314
   ADDRESS.  SCRATCH is available as a scratch register, if needed.
10315
   ADDRESS and SCRATCH are both word-mode GPRs.  */
10316
 
10317
void
10318
mips_set_return_address (rtx address, rtx scratch)
10319
{
10320
  rtx slot_address;
10321
 
10322
  gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
10323
  slot_address = mips_add_offset (scratch, stack_pointer_rtx,
10324
                                  cfun->machine->frame.gp_sp_offset);
10325
  mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
10326
}
10327
 
10328
/* Return true if the current function has a cprestore slot.  */
10329
 
10330
bool
10331
mips_cfun_has_cprestore_slot_p (void)
10332
{
10333
  return (cfun->machine->global_pointer != INVALID_REGNUM
10334
          && cfun->machine->frame.cprestore_size > 0);
10335
}
10336
 
10337
/* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
10338
   cprestore slot.  LOAD_P is true if the caller wants to load from
10339
   the cprestore slot; it is false if the caller wants to store to
10340
   the slot.  */
10341
 
10342
static void
10343
mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
10344
                                    bool load_p)
10345
{
10346
  const struct mips_frame_info *frame;
10347
 
10348
  frame = &cfun->machine->frame;
10349
  /* .cprestore always uses the stack pointer instead of the frame pointer.
10350
     We have a free choice for direct stores for non-MIPS16 functions,
10351
     and for MIPS16 functions whose cprestore slot is in range of the
10352
     stack pointer.  Using the stack pointer would sometimes give more
10353
     (early) scheduling freedom, but using the frame pointer would
10354
     sometimes give more (late) scheduling freedom.  It's hard to
10355
     predict which applies to a given function, so let's keep things
10356
     simple.
10357
 
10358
     Loads must always use the frame pointer in functions that call
10359
     alloca, and there's little benefit to using the stack pointer
10360
     otherwise.  */
10361
  if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
10362
    {
10363
      *base = hard_frame_pointer_rtx;
10364
      *offset = frame->args_size - frame->hard_frame_pointer_offset;
10365
    }
10366
  else
10367
    {
10368
      *base = stack_pointer_rtx;
10369
      *offset = frame->args_size;
10370
    }
10371
}
10372
 
10373
/* Return true if X is the load or store address of the cprestore slot;
10374
   LOAD_P says which.  */
10375
 
10376
bool
10377
mips_cprestore_address_p (rtx x, bool load_p)
10378
{
10379
  rtx given_base, required_base;
10380
  HOST_WIDE_INT given_offset, required_offset;
10381
 
10382
  mips_split_plus (x, &given_base, &given_offset);
10383
  mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
10384
  return given_base == required_base && given_offset == required_offset;
10385
}
10386
 
10387
/* Return a MEM rtx for the cprestore slot.  LOAD_P is true if we are
10388
   going to load from it, false if we are going to store to it.
10389
   Use TEMP as a temporary register if need be.  */
10390
 
10391
static rtx
10392
mips_cprestore_slot (rtx temp, bool load_p)
10393
{
10394
  rtx base;
10395
  HOST_WIDE_INT offset;
10396
 
10397
  mips_get_cprestore_base_and_offset (&base, &offset, load_p);
10398
  return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
10399
}
10400
 
10401
/* Emit instructions to save global pointer value GP into cprestore
10402
   slot MEM.  OFFSET is the offset that MEM applies to the base register.
10403
 
10404
   MEM may not be a legitimate address.  If it isn't, TEMP is a
10405
   temporary register that can be used, otherwise it is a SCRATCH.  */
10406
 
10407
void
10408
mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
10409
{
10410
  if (TARGET_CPRESTORE_DIRECTIVE)
10411
    {
10412
      gcc_assert (gp == pic_offset_table_rtx);
10413
      emit_insn (PMODE_INSN (gen_cprestore, (mem, offset)));
10414
    }
10415
  else
10416
    mips_emit_move (mips_cprestore_slot (temp, false), gp);
10417
}
10418
 
10419
/* Restore $gp from its save slot, using TEMP as a temporary base register
10420
   if need be.  This function is for o32 and o64 abicalls only.
10421
 
10422
   See mips_must_initialize_gp_p for details about how we manage the
10423
   global pointer.  */
10424
 
10425
void
10426
mips_restore_gp_from_cprestore_slot (rtx temp)
10427
{
10428
  gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
10429
 
10430
  if (!cfun->machine->must_restore_gp_when_clobbered_p)
10431
    {
10432
      emit_note (NOTE_INSN_DELETED);
10433
      return;
10434
    }
10435
 
10436
  if (TARGET_MIPS16)
10437
    {
10438
      mips_emit_move (temp, mips_cprestore_slot (temp, true));
10439
      mips_emit_move (pic_offset_table_rtx, temp);
10440
    }
10441
  else
10442
    mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
10443
  if (!TARGET_EXPLICIT_RELOCS)
10444
    emit_insn (gen_blockage ());
10445
}
10446
 
10447
/* A function to save or store a register.  The first argument is the
10448
   register and the second is the stack slot.  */
10449
typedef void (*mips_save_restore_fn) (rtx, rtx);
10450
 
10451
/* Use FN to save or restore register REGNO.  MODE is the register's
10452
   mode and OFFSET is the offset of its save slot from the current
10453
   stack pointer.  */
10454
 
10455
static void
10456
mips_save_restore_reg (enum machine_mode mode, int regno,
10457
                       HOST_WIDE_INT offset, mips_save_restore_fn fn)
10458
{
10459
  rtx mem;
10460
 
10461
  mem = gen_frame_mem (mode, plus_constant (Pmode, stack_pointer_rtx,
10462
                                            offset));
10463
  fn (gen_rtx_REG (mode, regno), mem);
10464
}
10465
 
10466
/* Call FN for each accumlator that is saved by the current function.
10467
   SP_OFFSET is the offset of the current stack pointer from the start
10468
   of the frame.  */
10469
 
10470
static void
10471
mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
10472
{
10473
  HOST_WIDE_INT offset;
10474
  int regno;
10475
 
10476
  offset = cfun->machine->frame.acc_sp_offset - sp_offset;
10477
  if (BITSET_P (cfun->machine->frame.acc_mask, 0))
10478
    {
10479
      mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
10480
      offset -= UNITS_PER_WORD;
10481
      mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
10482
      offset -= UNITS_PER_WORD;
10483
    }
10484
 
10485
  for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
10486
    if (BITSET_P (cfun->machine->frame.acc_mask,
10487
                  ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
10488
      {
10489
        mips_save_restore_reg (word_mode, regno, offset, fn);
10490
        offset -= UNITS_PER_WORD;
10491
      }
10492
}
10493
 
10494
/* Save register REG to MEM.  Make the instruction frame-related.  */
10495
 
10496
static void
10497
mips_save_reg (rtx reg, rtx mem)
10498
{
10499
  if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
10500
    {
10501
      rtx x1, x2;
10502
 
10503
      mips_emit_move_or_split (mem, reg, SPLIT_IF_NECESSARY);
10504
 
10505
      x1 = mips_frame_set (mips_subword (mem, false),
10506
                           mips_subword (reg, false));
10507
      x2 = mips_frame_set (mips_subword (mem, true),
10508
                           mips_subword (reg, true));
10509
      mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
10510
    }
10511
  else
10512
    mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
10513
}
10514
 
10515
/* Capture the register combinations that are allowed in a SWM or LWM
10516
   instruction.  The entries are ordered by number of registers set in
10517
   the mask.  We also ignore the single register encodings because a
10518
   normal SW/LW is preferred.  */
10519
 
10520
static const unsigned int umips_swm_mask[17] = {
10521
  0xc0ff0000, 0x80ff0000, 0x40ff0000, 0x807f0000,
10522
  0x00ff0000, 0x803f0000, 0x007f0000, 0x801f0000,
10523
  0x003f0000, 0x800f0000, 0x001f0000, 0x80070000,
10524
  0x000f0000, 0x80030000, 0x00070000, 0x80010000,
10525
  0x00030000
10526
};
10527
 
10528
static const unsigned int umips_swm_encoding[17] = {
10529
  25, 24, 9, 23, 8, 22, 7, 21, 6, 20, 5, 19, 4, 18, 3, 17, 2
10530
};
10531
 
10532
/* Try to use a microMIPS LWM or SWM instruction to save or restore
10533
   as many GPRs in *MASK as possible.  *OFFSET is the offset from the
10534
   stack pointer of the topmost save slot.
10535
 
10536
   Remove from *MASK all registers that were handled using LWM and SWM.
10537
   Update *OFFSET so that it points to the first unused save slot.  */
10538
 
10539
static bool
10540
umips_build_save_restore (mips_save_restore_fn fn,
10541
                          unsigned *mask, HOST_WIDE_INT *offset)
10542
{
10543
  int nregs;
10544
  unsigned int i, j;
10545
  rtx pattern, set, reg, mem;
10546
  HOST_WIDE_INT this_offset;
10547
  rtx this_base;
10548
 
10549
  /* Try matching $16 to $31 (s0 to ra).  */
10550
  for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
10551
    if ((*mask & 0xffff0000) == umips_swm_mask[i])
10552
      break;
10553
 
10554
  if (i == ARRAY_SIZE (umips_swm_mask))
10555
    return false;
10556
 
10557
  /* Get the offset of the lowest save slot.  */
10558
  nregs = (umips_swm_encoding[i] & 0xf) + (umips_swm_encoding[i] >> 4);
10559
  this_offset = *offset - UNITS_PER_WORD * (nregs - 1);
10560
 
10561
  /* LWM/SWM can only support offsets from -2048 to 2047.  */
10562
  if (!UMIPS_12BIT_OFFSET_P (this_offset))
10563
    return false;
10564
 
10565
  /* Create the final PARALLEL.  */
10566
  pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
10567
  this_base = stack_pointer_rtx;
10568
 
10569
  /* For registers $16-$23 and $30.  */
10570
  for (j = 0; j < (umips_swm_encoding[i] & 0xf); j++)
10571
    {
10572
      HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10573
      mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10574
      unsigned int regno = (j != 8) ? 16 + j : 30;
10575
      *mask &= ~(1 << regno);
10576
      reg = gen_rtx_REG (SImode, regno);
10577
      if (fn == mips_save_reg)
10578
        set = mips_frame_set (mem, reg);
10579
      else
10580
        {
10581
          set = gen_rtx_SET (VOIDmode, reg, mem);
10582
          mips_add_cfa_restore (reg);
10583
        }
10584
      XVECEXP (pattern, 0, j) = set;
10585
    }
10586
 
10587
  /* For register $31.  */
10588
  if (umips_swm_encoding[i] >> 4)
10589
    {
10590
      HOST_WIDE_INT offset = this_offset + j * UNITS_PER_WORD;
10591
      *mask &= ~(1 << 31);
10592
      mem = gen_frame_mem (SImode, plus_constant (Pmode, this_base, offset));
10593
      reg = gen_rtx_REG (SImode, 31);
10594
      if (fn == mips_save_reg)
10595
        set = mips_frame_set (mem, reg);
10596
      else
10597
        {
10598
          set = gen_rtx_SET (VOIDmode, reg, mem);
10599
          mips_add_cfa_restore (reg);
10600
        }
10601
      XVECEXP (pattern, 0, j) = set;
10602
    }
10603
 
10604
  pattern = emit_insn (pattern);
10605
  if (fn == mips_save_reg)
10606
    RTX_FRAME_RELATED_P (pattern) = 1;
10607
 
10608
  /* Adjust the last offset.  */
10609
  *offset -= UNITS_PER_WORD * nregs;
10610
 
10611
  return true;
10612
}
10613
 
10614
/* Call FN for each register that is saved by the current function.
10615
   SP_OFFSET is the offset of the current stack pointer from the start
10616
   of the frame.  */
10617
 
10618
static void
10619
mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
10620
                                 mips_save_restore_fn fn)
10621
{
10622
  enum machine_mode fpr_mode;
10623
  int regno;
10624
  const struct mips_frame_info *frame = &cfun->machine->frame;
10625
  HOST_WIDE_INT offset;
10626
  unsigned int mask;
10627
 
10628
  /* Save registers starting from high to low.  The debuggers prefer at least
10629
     the return register be stored at func+4, and also it allows us not to
10630
     need a nop in the epilogue if at least one register is reloaded in
10631
     addition to return address.  */
10632
  offset = frame->gp_sp_offset - sp_offset;
10633
  mask = frame->mask;
10634
 
10635
  if (TARGET_MICROMIPS)
10636
    umips_build_save_restore (fn, &mask, &offset);
10637
 
10638
  for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
10639
    if (BITSET_P (mask, regno - GP_REG_FIRST))
10640
      {
10641
        /* Record the ra offset for use by mips_function_profiler.  */
10642
        if (regno == RETURN_ADDR_REGNUM)
10643
          cfun->machine->frame.ra_fp_offset = offset + sp_offset;
10644
        mips_save_restore_reg (word_mode, regno, offset, fn);
10645
        offset -= UNITS_PER_WORD;
10646
      }
10647
 
10648
  /* This loop must iterate over the same space as its companion in
10649
     mips_compute_frame_info.  */
10650
  offset = cfun->machine->frame.fp_sp_offset - sp_offset;
10651
  fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
10652
  for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
10653
       regno >= FP_REG_FIRST;
10654
       regno -= MAX_FPRS_PER_FMT)
10655
    if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
10656
      {
10657
        mips_save_restore_reg (fpr_mode, regno, offset, fn);
10658
        offset -= GET_MODE_SIZE (fpr_mode);
10659
      }
10660
}
10661
 
10662
/* Return true if a move between register REGNO and its save slot (MEM)
10663
   can be done in a single move.  LOAD_P is true if we are loading
10664
   from the slot, false if we are storing to it.  */
10665
 
10666
static bool
10667
mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
10668
{
10669
  /* There is a specific MIPS16 instruction for saving $31 to the stack.  */
10670
  if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
10671
    return false;
10672
 
10673
  return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
10674
                                      GET_MODE (mem), mem, load_p) == NO_REGS;
10675
}
10676
 
10677
/* Emit a move from SRC to DEST, given that one of them is a register
10678
   save slot and that the other is a register.  TEMP is a temporary
10679
   GPR of the same mode that is available if need be.  */
10680
 
10681
void
10682
mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
10683
{
10684
  unsigned int regno;
10685
  rtx mem;
10686
 
10687
  if (REG_P (src))
10688
    {
10689
      regno = REGNO (src);
10690
      mem = dest;
10691
    }
10692
  else
10693
    {
10694
      regno = REGNO (dest);
10695
      mem = src;
10696
    }
10697
 
10698
  if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
10699
    {
10700
      /* We don't yet know whether we'll need this instruction or not.
10701
         Postpone the decision by emitting a ghost move.  This move
10702
         is specifically not frame-related; only the split version is.  */
10703
      if (TARGET_64BIT)
10704
        emit_insn (gen_move_gpdi (dest, src));
10705
      else
10706
        emit_insn (gen_move_gpsi (dest, src));
10707
      return;
10708
    }
10709
 
10710
  if (regno == HI_REGNUM)
10711
    {
10712
      if (REG_P (dest))
10713
        {
10714
          mips_emit_move (temp, src);
10715
          if (TARGET_64BIT)
10716
            emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
10717
                                      temp, gen_rtx_REG (DImode, LO_REGNUM)));
10718
          else
10719
            emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
10720
                                      temp, gen_rtx_REG (SImode, LO_REGNUM)));
10721
        }
10722
      else
10723
        {
10724
          if (TARGET_64BIT)
10725
            emit_insn (gen_mfhidi_ti (temp,
10726
                                      gen_rtx_REG (TImode, MD_REG_FIRST)));
10727
          else
10728
            emit_insn (gen_mfhisi_di (temp,
10729
                                      gen_rtx_REG (DImode, MD_REG_FIRST)));
10730
          mips_emit_move (dest, temp);
10731
        }
10732
    }
10733
  else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
10734
    mips_emit_move (dest, src);
10735
  else
10736
    {
10737
      gcc_assert (!reg_overlap_mentioned_p (dest, temp));
10738
      mips_emit_move (temp, src);
10739
      mips_emit_move (dest, temp);
10740
    }
10741
  if (MEM_P (dest))
10742
    mips_set_frame_expr (mips_frame_set (dest, src));
10743
}
10744
 
10745
/* If we're generating n32 or n64 abicalls, and the current function
10746
   does not use $28 as its global pointer, emit a cplocal directive.
10747
   Use pic_offset_table_rtx as the argument to the directive.  */
10748
 
10749
static void
10750
mips_output_cplocal (void)
10751
{
10752
  if (!TARGET_EXPLICIT_RELOCS
10753
      && mips_must_initialize_gp_p ()
10754
      && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
10755
    output_asm_insn (".cplocal %+", 0);
10756
}
10757
 
10758
/* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
10759
 
10760
static void
10761
mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10762
{
10763
  const char *fnname;
10764
 
10765
  /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
10766
     floating-point arguments.  */
10767
  if (TARGET_MIPS16
10768
      && TARGET_HARD_FLOAT_ABI
10769
      && crtl->args.info.fp_code != 0)
10770
    mips16_build_function_stub ();
10771
 
10772
  /* Get the function name the same way that toplev.c does before calling
10773
     assemble_start_function.  This is needed so that the name used here
10774
     exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
10775
  fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10776
  mips_start_function_definition (fnname, TARGET_MIPS16);
10777
 
10778
  /* Output MIPS-specific frame information.  */
10779
  if (!flag_inhibit_size_directive)
10780
    {
10781
      const struct mips_frame_info *frame;
10782
 
10783
      frame = &cfun->machine->frame;
10784
 
10785
      /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
10786
      fprintf (file,
10787
               "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
10788
               "# vars= " HOST_WIDE_INT_PRINT_DEC
10789
               ", regs= %d/%d"
10790
               ", args= " HOST_WIDE_INT_PRINT_DEC
10791
               ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
10792
               reg_names[frame_pointer_needed
10793
                         ? HARD_FRAME_POINTER_REGNUM
10794
                         : STACK_POINTER_REGNUM],
10795
               (frame_pointer_needed
10796
                ? frame->total_size - frame->hard_frame_pointer_offset
10797
                : frame->total_size),
10798
               reg_names[RETURN_ADDR_REGNUM],
10799
               frame->var_size,
10800
               frame->num_gp, frame->num_fp,
10801
               frame->args_size,
10802
               frame->cprestore_size);
10803
 
10804
      /* .mask MASK, OFFSET.  */
10805
      fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10806
               frame->mask, frame->gp_save_offset);
10807
 
10808
      /* .fmask MASK, OFFSET.  */
10809
      fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
10810
               frame->fmask, frame->fp_save_offset);
10811
    }
10812
 
10813
  /* Handle the initialization of $gp for SVR4 PIC, if applicable.
10814
     Also emit the ".set noreorder; .set nomacro" sequence for functions
10815
     that need it.  */
10816
  if (mips_must_initialize_gp_p ()
10817
      && mips_current_loadgp_style () == LOADGP_OLDABI)
10818
    {
10819
      if (TARGET_MIPS16)
10820
        {
10821
          /* This is a fixed-form sequence.  The position of the
10822
             first two instructions is important because of the
10823
             way _gp_disp is defined.  */
10824
          output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
10825
          output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
10826
          output_asm_insn ("sll\t$2,16", 0);
10827
          output_asm_insn ("addu\t$2,$3", 0);
10828
        }
10829
      else
10830
        {
10831
          /* .cpload must be in a .set noreorder but not a
10832
             .set nomacro block.  */
10833
          mips_push_asm_switch (&mips_noreorder);
10834
          output_asm_insn (".cpload\t%^", 0);
10835
          if (!cfun->machine->all_noreorder_p)
10836
            mips_pop_asm_switch (&mips_noreorder);
10837
          else
10838
            mips_push_asm_switch (&mips_nomacro);
10839
        }
10840
    }
10841
  else if (cfun->machine->all_noreorder_p)
10842
    {
10843
      mips_push_asm_switch (&mips_noreorder);
10844
      mips_push_asm_switch (&mips_nomacro);
10845
    }
10846
 
10847
  /* Tell the assembler which register we're using as the global
10848
     pointer.  This is needed for thunks, since they can use either
10849
     explicit relocs or assembler macros.  */
10850
  mips_output_cplocal ();
10851
}
10852
 
10853
/* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
10854
 
10855
static void
10856
mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
10857
                               HOST_WIDE_INT size ATTRIBUTE_UNUSED)
10858
{
10859
  const char *fnname;
10860
 
10861
  /* Reinstate the normal $gp.  */
10862
  SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
10863
  mips_output_cplocal ();
10864
 
10865
  if (cfun->machine->all_noreorder_p)
10866
    {
10867
      mips_pop_asm_switch (&mips_nomacro);
10868
      mips_pop_asm_switch (&mips_noreorder);
10869
    }
10870
 
10871
  /* Get the function name the same way that toplev.c does before calling
10872
     assemble_start_function.  This is needed so that the name used here
10873
     exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
10874
  fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
10875
  mips_end_function_definition (fnname);
10876
}
10877
 
10878
/* Emit an optimisation barrier for accesses to the current frame.  */
10879
 
10880
static void
10881
mips_frame_barrier (void)
10882
{
10883
  emit_clobber (gen_frame_mem (BLKmode, stack_pointer_rtx));
10884
}
10885
 
10886
 
10887
/* The __gnu_local_gp symbol.  */
10888
 
10889
static GTY(()) rtx mips_gnu_local_gp;
10890
 
10891
/* If we're generating n32 or n64 abicalls, emit instructions
10892
   to set up the global pointer.  */
10893
 
10894
static void
10895
mips_emit_loadgp (void)
10896
{
10897
  rtx addr, offset, incoming_address, base, index, pic_reg;
10898
 
10899
  pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10900
  switch (mips_current_loadgp_style ())
10901
    {
10902
    case LOADGP_ABSOLUTE:
10903
      if (mips_gnu_local_gp == NULL)
10904
        {
10905
          mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
10906
          SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
10907
        }
10908
      emit_insn (PMODE_INSN (gen_loadgp_absolute,
10909
                             (pic_reg, mips_gnu_local_gp)));
10910
      break;
10911
 
10912
    case LOADGP_OLDABI:
10913
      /* Added by mips_output_function_prologue.  */
10914
      break;
10915
 
10916
    case LOADGP_NEWABI:
10917
      addr = XEXP (DECL_RTL (current_function_decl), 0);
10918
      offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
10919
      incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
10920
      emit_insn (PMODE_INSN (gen_loadgp_newabi,
10921
                             (pic_reg, offset, incoming_address)));
10922
      break;
10923
 
10924
    case LOADGP_RTP:
10925
      base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
10926
      index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
10927
      emit_insn (PMODE_INSN (gen_loadgp_rtp, (pic_reg, base, index)));
10928
      break;
10929
 
10930
    default:
10931
      return;
10932
    }
10933
 
10934
  if (TARGET_MIPS16)
10935
    emit_insn (PMODE_INSN (gen_copygp_mips16,
10936
                           (pic_offset_table_rtx, pic_reg)));
10937
 
10938
  /* Emit a blockage if there are implicit uses of the GP register.
10939
     This includes profiled functions, because FUNCTION_PROFILE uses
10940
     a jal macro.  */
10941
  if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
10942
    emit_insn (gen_loadgp_blockage ());
10943
}
10944
 
10945
#define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
10946
 
10947
#if PROBE_INTERVAL > 32768
10948
#error Cannot use indexed addressing mode for stack probing
10949
#endif
10950
 
10951
/* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
10952
   inclusive.  These are offsets from the current stack pointer.  */
10953
 
10954
static void
10955
mips_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
10956
{
10957
  if (TARGET_MIPS16)
10958
    sorry ("-fstack-check=specific not implemented for MIPS16");
10959
 
10960
  /* See if we have a constant small number of probes to generate.  If so,
10961
     that's the easy case.  */
10962
  if (first + size <= 32768)
10963
    {
10964
      HOST_WIDE_INT i;
10965
 
10966
      /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 1 until
10967
         it exceeds SIZE.  If only one probe is needed, this will not
10968
         generate any code.  Then probe at FIRST + SIZE.  */
10969
      for (i = PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
10970
        emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
10971
                                         -(first + i)));
10972
 
10973
      emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
10974
                                       -(first + size)));
10975
    }
10976
 
10977
  /* Otherwise, do the same as above, but in a loop.  Note that we must be
10978
     extra careful with variables wrapping around because we might be at
10979
     the very top (or the very bottom) of the address space and we have
10980
     to be able to handle this case properly; in particular, we use an
10981
     equality test for the loop condition.  */
10982
  else
10983
    {
10984
      HOST_WIDE_INT rounded_size;
10985
      rtx r3 = MIPS_PROLOGUE_TEMP (Pmode);
10986
      rtx r12 = MIPS_PROLOGUE_TEMP2 (Pmode);
10987
 
10988
      /* Sanity check for the addressing mode we're going to use.  */
10989
      gcc_assert (first <= 32768);
10990
 
10991
 
10992
      /* Step 1: round SIZE to the previous multiple of the interval.  */
10993
 
10994
      rounded_size = size & -PROBE_INTERVAL;
10995
 
10996
 
10997
      /* Step 2: compute initial and final value of the loop counter.  */
10998
 
10999
      /* TEST_ADDR = SP + FIRST.  */
11000
      emit_insn (gen_rtx_SET (VOIDmode, r3,
11001
                              plus_constant (Pmode, stack_pointer_rtx,
11002
                                             -first)));
11003
 
11004
      /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
11005
      if (rounded_size > 32768)
11006
        {
11007
          emit_move_insn (r12, GEN_INT (rounded_size));
11008
          emit_insn (gen_rtx_SET (VOIDmode, r12,
11009
                                  gen_rtx_MINUS (Pmode, r3, r12)));
11010
        }
11011
      else
11012
        emit_insn (gen_rtx_SET (VOIDmode, r12,
11013
                                plus_constant (Pmode, r3, -rounded_size)));
11014
 
11015
 
11016
      /* Step 3: the loop
11017
 
11018
        while (TEST_ADDR != LAST_ADDR)
11019
          {
11020
            TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
11021
            probe at TEST_ADDR
11022
          }
11023
 
11024
        probes at FIRST + N * PROBE_INTERVAL for values of N from 1
11025
        until it is equal to ROUNDED_SIZE.  */
11026
 
11027
      emit_insn (PMODE_INSN (gen_probe_stack_range, (r3, r3, r12)));
11028
 
11029
 
11030
      /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
11031
         that SIZE is equal to ROUNDED_SIZE.  */
11032
 
11033
      if (size != rounded_size)
11034
        emit_stack_probe (plus_constant (Pmode, r12, rounded_size - size));
11035
    }
11036
 
11037
  /* Make sure nothing is scheduled before we are done.  */
11038
  emit_insn (gen_blockage ());
11039
}
11040
 
11041
/* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
11042
   absolute addresses.  */
11043
 
11044
const char *
11045
mips_output_probe_stack_range (rtx reg1, rtx reg2)
11046
{
11047
  static int labelno = 0;
11048
  char loop_lab[32], end_lab[32], tmp[64];
11049
  rtx xops[2];
11050
 
11051
  ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
11052
  ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
11053
 
11054
  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
11055
 
11056
  /* Jump to END_LAB if TEST_ADDR == LAST_ADDR.  */
11057
  xops[0] = reg1;
11058
  xops[1] = reg2;
11059
  strcpy (tmp, "%(%<beq\t%0,%1,");
11060
  output_asm_insn (strcat (tmp, &end_lab[1]), xops);
11061
 
11062
  /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
11063
  xops[1] = GEN_INT (-PROBE_INTERVAL);
11064
  if (TARGET_64BIT && TARGET_LONG64)
11065
    output_asm_insn ("daddiu\t%0,%0,%1", xops);
11066
  else
11067
    output_asm_insn ("addiu\t%0,%0,%1", xops);
11068
 
11069
  /* Probe at TEST_ADDR and branch.  */
11070
  fprintf (asm_out_file, "\tb\t");
11071
  assemble_name_raw (asm_out_file, loop_lab);
11072
  fputc ('\n', asm_out_file);
11073
  if (TARGET_64BIT)
11074
    output_asm_insn ("sd\t$0,0(%0)%)", xops);
11075
  else
11076
    output_asm_insn ("sw\t$0,0(%0)%)", xops);
11077
 
11078
  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
11079
 
11080
  return "";
11081
}
11082
 
11083
/* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
11084
 
11085
static int
11086
mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
11087
{
11088
  return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
11089
}
11090
 
11091
/* Expand the "prologue" pattern.  */
11092
 
11093
void
11094
mips_expand_prologue (void)
11095
{
11096
  const struct mips_frame_info *frame;
11097
  HOST_WIDE_INT size;
11098
  unsigned int nargs;
11099
  rtx insn;
11100
 
11101
  if (cfun->machine->global_pointer != INVALID_REGNUM)
11102
    {
11103
      /* Check whether an insn uses pic_offset_table_rtx, either explicitly
11104
         or implicitly.  If so, we can commit to using a global pointer
11105
         straight away, otherwise we need to defer the decision.  */
11106
      if (mips_cfun_has_inflexible_gp_ref_p ()
11107
          || mips_cfun_has_flexible_gp_ref_p ())
11108
        {
11109
          cfun->machine->must_initialize_gp_p = true;
11110
          cfun->machine->must_restore_gp_when_clobbered_p = true;
11111
        }
11112
 
11113
      SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
11114
    }
11115
 
11116
  frame = &cfun->machine->frame;
11117
  size = frame->total_size;
11118
 
11119
  if (flag_stack_usage_info)
11120
    current_function_static_stack_size = size;
11121
 
11122
  if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
11123
    {
11124
      if (crtl->is_leaf && !cfun->calls_alloca)
11125
        {
11126
          if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
11127
            mips_emit_probe_stack_range (STACK_CHECK_PROTECT,
11128
                                         size - STACK_CHECK_PROTECT);
11129
        }
11130
      else if (size > 0)
11131
        mips_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
11132
    }
11133
 
11134
  /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
11135
     bytes beforehand; this is enough to cover the register save area
11136
     without going out of range.  */
11137
  if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
11138
      || frame->num_cop0_regs > 0)
11139
    {
11140
      HOST_WIDE_INT step1;
11141
 
11142
      step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
11143
      if (GENERATE_MIPS16E_SAVE_RESTORE)
11144
        {
11145
          HOST_WIDE_INT offset;
11146
          unsigned int mask, regno;
11147
 
11148
          /* Try to merge argument stores into the save instruction.  */
11149
          nargs = mips16e_collect_argument_saves ();
11150
 
11151
          /* Build the save instruction.  */
11152
          mask = frame->mask;
11153
          insn = mips16e_build_save_restore (false, &mask, &offset,
11154
                                             nargs, step1);
11155
          RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11156
          mips_frame_barrier ();
11157
          size -= step1;
11158
 
11159
          /* Check if we need to save other registers.  */
11160
          for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11161
            if (BITSET_P (mask, regno - GP_REG_FIRST))
11162
              {
11163
                offset -= UNITS_PER_WORD;
11164
                mips_save_restore_reg (word_mode, regno,
11165
                                       offset, mips_save_reg);
11166
              }
11167
        }
11168
      else
11169
        {
11170
          if (cfun->machine->interrupt_handler_p)
11171
            {
11172
              HOST_WIDE_INT offset;
11173
              rtx mem;
11174
 
11175
              /* If this interrupt is using a shadow register set, we need to
11176
                 get the stack pointer from the previous register set.  */
11177
              if (cfun->machine->use_shadow_register_set_p)
11178
                emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
11179
                                            stack_pointer_rtx));
11180
 
11181
              if (!cfun->machine->keep_interrupts_masked_p)
11182
                {
11183
                  /* Move from COP0 Cause to K0.  */
11184
                  emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
11185
                                            gen_rtx_REG (SImode,
11186
                                                         COP0_CAUSE_REG_NUM)));
11187
                  /* Move from COP0 EPC to K1.  */
11188
                  emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11189
                                            gen_rtx_REG (SImode,
11190
                                                         COP0_EPC_REG_NUM)));
11191
                }
11192
 
11193
              /* Allocate the first part of the frame.  */
11194
              insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
11195
                                    GEN_INT (-step1));
11196
              RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11197
              mips_frame_barrier ();
11198
              size -= step1;
11199
 
11200
              /* Start at the uppermost location for saving.  */
11201
              offset = frame->cop0_sp_offset - size;
11202
              if (!cfun->machine->keep_interrupts_masked_p)
11203
                {
11204
                  /* Push EPC into its stack slot.  */
11205
                  mem = gen_frame_mem (word_mode,
11206
                                       plus_constant (Pmode, stack_pointer_rtx,
11207
                                                      offset));
11208
                  mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11209
                  offset -= UNITS_PER_WORD;
11210
                }
11211
 
11212
              /* Move from COP0 Status to K1.  */
11213
              emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
11214
                                        gen_rtx_REG (SImode,
11215
                                                     COP0_STATUS_REG_NUM)));
11216
 
11217
              /* Right justify the RIPL in k0.  */
11218
              if (!cfun->machine->keep_interrupts_masked_p)
11219
                emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
11220
                                        gen_rtx_REG (SImode, K0_REG_NUM),
11221
                                        GEN_INT (CAUSE_IPL)));
11222
 
11223
              /* Push Status into its stack slot.  */
11224
              mem = gen_frame_mem (word_mode,
11225
                                   plus_constant (Pmode, stack_pointer_rtx,
11226
                                                  offset));
11227
              mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
11228
              offset -= UNITS_PER_WORD;
11229
 
11230
              /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
11231
              if (!cfun->machine->keep_interrupts_masked_p)
11232
                emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11233
                                       GEN_INT (6),
11234
                                       GEN_INT (SR_IPL),
11235
                                       gen_rtx_REG (SImode, K0_REG_NUM)));
11236
 
11237
              if (!cfun->machine->keep_interrupts_masked_p)
11238
                /* Enable interrupts by clearing the KSU ERL and EXL bits.
11239
                   IE is already the correct value, so we don't have to do
11240
                   anything explicit.  */
11241
                emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11242
                                       GEN_INT (4),
11243
                                       GEN_INT (SR_EXL),
11244
                                       gen_rtx_REG (SImode, GP_REG_FIRST)));
11245
              else
11246
                /* Disable interrupts by clearing the KSU, ERL, EXL,
11247
                   and IE bits.  */
11248
                emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
11249
                                       GEN_INT (5),
11250
                                       GEN_INT (SR_IE),
11251
                                       gen_rtx_REG (SImode, GP_REG_FIRST)));
11252
            }
11253
          else
11254
            {
11255
              insn = gen_add3_insn (stack_pointer_rtx,
11256
                                    stack_pointer_rtx,
11257
                                    GEN_INT (-step1));
11258
              RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11259
              mips_frame_barrier ();
11260
              size -= step1;
11261
            }
11262
          mips_for_each_saved_acc (size, mips_save_reg);
11263
          mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
11264
        }
11265
    }
11266
 
11267
  /* Allocate the rest of the frame.  */
11268
  if (size > 0)
11269
    {
11270
      if (SMALL_OPERAND (-size))
11271
        RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
11272
                                                       stack_pointer_rtx,
11273
                                                       GEN_INT (-size)))) = 1;
11274
      else
11275
        {
11276
          mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
11277
          if (TARGET_MIPS16)
11278
            {
11279
              /* There are no instructions to add or subtract registers
11280
                 from the stack pointer, so use the frame pointer as a
11281
                 temporary.  We should always be using a frame pointer
11282
                 in this case anyway.  */
11283
              gcc_assert (frame_pointer_needed);
11284
              mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11285
              emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
11286
                                        hard_frame_pointer_rtx,
11287
                                        MIPS_PROLOGUE_TEMP (Pmode)));
11288
              mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
11289
            }
11290
          else
11291
            emit_insn (gen_sub3_insn (stack_pointer_rtx,
11292
                                      stack_pointer_rtx,
11293
                                      MIPS_PROLOGUE_TEMP (Pmode)));
11294
 
11295
          /* Describe the combined effect of the previous instructions.  */
11296
          mips_set_frame_expr
11297
            (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
11298
                          plus_constant (Pmode, stack_pointer_rtx, -size)));
11299
        }
11300
      mips_frame_barrier ();
11301
    }
11302
 
11303
  /* Set up the frame pointer, if we're using one.  */
11304
  if (frame_pointer_needed)
11305
    {
11306
      HOST_WIDE_INT offset;
11307
 
11308
      offset = frame->hard_frame_pointer_offset;
11309
      if (offset == 0)
11310
        {
11311
          insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11312
          RTX_FRAME_RELATED_P (insn) = 1;
11313
        }
11314
      else if (SMALL_OPERAND (offset))
11315
        {
11316
          insn = gen_add3_insn (hard_frame_pointer_rtx,
11317
                                stack_pointer_rtx, GEN_INT (offset));
11318
          RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
11319
        }
11320
      else
11321
        {
11322
          mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
11323
          mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
11324
          emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
11325
                                    hard_frame_pointer_rtx,
11326
                                    MIPS_PROLOGUE_TEMP (Pmode)));
11327
          mips_set_frame_expr
11328
            (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
11329
                          plus_constant (Pmode, stack_pointer_rtx, offset)));
11330
        }
11331
    }
11332
 
11333
  mips_emit_loadgp ();
11334
 
11335
  /* Initialize the $gp save slot.  */
11336
  if (mips_cfun_has_cprestore_slot_p ())
11337
    {
11338
      rtx base, mem, gp, temp;
11339
      HOST_WIDE_INT offset;
11340
 
11341
      mips_get_cprestore_base_and_offset (&base, &offset, false);
11342
      mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11343
      gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
11344
      temp = (SMALL_OPERAND (offset)
11345
              ? gen_rtx_SCRATCH (Pmode)
11346
              : MIPS_PROLOGUE_TEMP (Pmode));
11347
      emit_insn (PMODE_INSN (gen_potential_cprestore,
11348
                             (mem, GEN_INT (offset), gp, temp)));
11349
 
11350
      mips_get_cprestore_base_and_offset (&base, &offset, true);
11351
      mem = gen_frame_mem (Pmode, plus_constant (Pmode, base, offset));
11352
      emit_insn (PMODE_INSN (gen_use_cprestore, (mem)));
11353
    }
11354
 
11355
  /* We need to search back to the last use of K0 or K1.  */
11356
  if (cfun->machine->interrupt_handler_p)
11357
    {
11358
      for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
11359
        if (INSN_P (insn)
11360
            && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
11361
          break;
11362
      /* Emit a move from K1 to COP0 Status after insn.  */
11363
      gcc_assert (insn != NULL_RTX);
11364
      emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11365
                                      gen_rtx_REG (SImode, K1_REG_NUM)),
11366
                       insn);
11367
    }
11368
 
11369
  /* If we are profiling, make sure no instructions are scheduled before
11370
     the call to mcount.  */
11371
  if (crtl->profile)
11372
    emit_insn (gen_blockage ());
11373
}
11374
 
11375
/* Attach all pending register saves to the previous instruction.
11376
   Return that instruction.  */
11377
 
11378
static rtx
11379
mips_epilogue_emit_cfa_restores (void)
11380
{
11381
  rtx insn;
11382
 
11383
  insn = get_last_insn ();
11384
  gcc_assert (insn && !REG_NOTES (insn));
11385
  if (mips_epilogue.cfa_restores)
11386
    {
11387
      RTX_FRAME_RELATED_P (insn) = 1;
11388
      REG_NOTES (insn) = mips_epilogue.cfa_restores;
11389
      mips_epilogue.cfa_restores = 0;
11390
    }
11391
  return insn;
11392
}
11393
 
11394
/* Like mips_epilogue_emit_cfa_restores, but also record that the CFA is
11395
   now at REG + OFFSET.  */
11396
 
11397
static void
11398
mips_epilogue_set_cfa (rtx reg, HOST_WIDE_INT offset)
11399
{
11400
  rtx insn;
11401
 
11402
  insn = mips_epilogue_emit_cfa_restores ();
11403
  if (reg != mips_epilogue.cfa_reg || offset != mips_epilogue.cfa_offset)
11404
    {
11405
      RTX_FRAME_RELATED_P (insn) = 1;
11406
      REG_NOTES (insn) = alloc_reg_note (REG_CFA_DEF_CFA,
11407
                                         plus_constant (Pmode, reg, offset),
11408
                                         REG_NOTES (insn));
11409
      mips_epilogue.cfa_reg = reg;
11410
      mips_epilogue.cfa_offset = offset;
11411
    }
11412
}
11413
 
11414
/* Emit instructions to restore register REG from slot MEM.  Also update
11415
   the cfa_restores list.  */
11416
 
11417
static void
11418
mips_restore_reg (rtx reg, rtx mem)
11419
{
11420
  /* There's no MIPS16 instruction to load $31 directly.  Load into
11421
     $7 instead and adjust the return insn appropriately.  */
11422
  if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
11423
    reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
11424
  else if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
11425
    {
11426
      mips_add_cfa_restore (mips_subword (reg, true));
11427
      mips_add_cfa_restore (mips_subword (reg, false));
11428
    }
11429
  else
11430
    mips_add_cfa_restore (reg);
11431
 
11432
  mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
11433
  if (REGNO (reg) == REGNO (mips_epilogue.cfa_reg))
11434
    /* The CFA is currently defined in terms of the register whose
11435
       value we have just restored.  Redefine the CFA in terms of
11436
       the stack pointer.  */
11437
    mips_epilogue_set_cfa (stack_pointer_rtx,
11438
                           mips_epilogue.cfa_restore_sp_offset);
11439
}
11440
 
11441
/* Emit code to set the stack pointer to BASE + OFFSET, given that
11442
   BASE + OFFSET is NEW_FRAME_SIZE bytes below the top of the frame.
11443
   BASE, if not the stack pointer, is available as a temporary.  */
11444
 
11445
static void
11446
mips_deallocate_stack (rtx base, rtx offset, HOST_WIDE_INT new_frame_size)
11447
{
11448
  if (base == stack_pointer_rtx && offset == const0_rtx)
11449
    return;
11450
 
11451
  mips_frame_barrier ();
11452
  if (offset == const0_rtx)
11453
    {
11454
      emit_move_insn (stack_pointer_rtx, base);
11455
      mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11456
    }
11457
  else if (TARGET_MIPS16 && base != stack_pointer_rtx)
11458
    {
11459
      emit_insn (gen_add3_insn (base, base, offset));
11460
      mips_epilogue_set_cfa (base, new_frame_size);
11461
      emit_move_insn (stack_pointer_rtx, base);
11462
    }
11463
  else
11464
    {
11465
      emit_insn (gen_add3_insn (stack_pointer_rtx, base, offset));
11466
      mips_epilogue_set_cfa (stack_pointer_rtx, new_frame_size);
11467
    }
11468
}
11469
 
11470
/* Emit any instructions needed before a return.  */
11471
 
11472
void
11473
mips_expand_before_return (void)
11474
{
11475
  /* When using a call-clobbered gp, we start out with unified call
11476
     insns that include instructions to restore the gp.  We then split
11477
     these unified calls after reload.  These split calls explicitly
11478
     clobber gp, so there is no need to define
11479
     PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
11480
 
11481
     For consistency, we should also insert an explicit clobber of $28
11482
     before return insns, so that the post-reload optimizers know that
11483
     the register is not live on exit.  */
11484
  if (TARGET_CALL_CLOBBERED_GP)
11485
    emit_clobber (pic_offset_table_rtx);
11486
}
11487
 
11488
/* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
11489
   says which.  */
11490
 
11491
void
11492
mips_expand_epilogue (bool sibcall_p)
11493
{
11494
  const struct mips_frame_info *frame;
11495
  HOST_WIDE_INT step1, step2;
11496
  rtx base, adjust, insn;
11497
  bool use_jraddiusp_p = false;
11498
 
11499
  if (!sibcall_p && mips_can_use_return_insn ())
11500
    {
11501
      emit_jump_insn (gen_return ());
11502
      return;
11503
    }
11504
 
11505
  /* In MIPS16 mode, if the return value should go into a floating-point
11506
     register, we need to call a helper routine to copy it over.  */
11507
  if (mips16_cfun_returns_in_fpr_p ())
11508
    mips16_copy_fpr_return_value ();
11509
 
11510
  /* Split the frame into two.  STEP1 is the amount of stack we should
11511
     deallocate before restoring the registers.  STEP2 is the amount we
11512
     should deallocate afterwards.
11513
 
11514
     Start off by assuming that no registers need to be restored.  */
11515
  frame = &cfun->machine->frame;
11516
  step1 = frame->total_size;
11517
  step2 = 0;
11518
 
11519
  /* Work out which register holds the frame address.  */
11520
  if (!frame_pointer_needed)
11521
    base = stack_pointer_rtx;
11522
  else
11523
    {
11524
      base = hard_frame_pointer_rtx;
11525
      step1 -= frame->hard_frame_pointer_offset;
11526
    }
11527
  mips_epilogue.cfa_reg = base;
11528
  mips_epilogue.cfa_offset = step1;
11529
  mips_epilogue.cfa_restores = NULL_RTX;
11530
 
11531
  /* If we need to restore registers, deallocate as much stack as
11532
     possible in the second step without going out of range.  */
11533
  if ((frame->mask | frame->fmask | frame->acc_mask) != 0
11534
      || frame->num_cop0_regs > 0)
11535
    {
11536
      step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
11537
      step1 -= step2;
11538
    }
11539
 
11540
  /* Get an rtx for STEP1 that we can add to BASE.  */
11541
  adjust = GEN_INT (step1);
11542
  if (!SMALL_OPERAND (step1))
11543
    {
11544
      mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
11545
      adjust = MIPS_EPILOGUE_TEMP (Pmode);
11546
    }
11547
  mips_deallocate_stack (base, adjust, step2);
11548
 
11549
  /* If we're using addressing macros, $gp is implicitly used by all
11550
     SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
11551
     from the stack.  */
11552
  if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
11553
    emit_insn (gen_blockage ());
11554
 
11555
  mips_epilogue.cfa_restore_sp_offset = step2;
11556
  if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
11557
    {
11558
      unsigned int regno, mask;
11559
      HOST_WIDE_INT offset;
11560
      rtx restore;
11561
 
11562
      /* Generate the restore instruction.  */
11563
      mask = frame->mask;
11564
      restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
11565
 
11566
      /* Restore any other registers manually.  */
11567
      for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
11568
        if (BITSET_P (mask, regno - GP_REG_FIRST))
11569
          {
11570
            offset -= UNITS_PER_WORD;
11571
            mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
11572
          }
11573
 
11574
      /* Restore the remaining registers and deallocate the final bit
11575
         of the frame.  */
11576
      mips_frame_barrier ();
11577
      emit_insn (restore);
11578
      mips_epilogue_set_cfa (stack_pointer_rtx, 0);
11579
    }
11580
  else
11581
    {
11582
      /* Restore the registers.  */
11583
      mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
11584
      mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
11585
                                       mips_restore_reg);
11586
 
11587
      if (cfun->machine->interrupt_handler_p)
11588
        {
11589
          HOST_WIDE_INT offset;
11590
          rtx mem;
11591
 
11592
          offset = frame->cop0_sp_offset - (frame->total_size - step2);
11593
          if (!cfun->machine->keep_interrupts_masked_p)
11594
            {
11595
              /* Restore the original EPC.  */
11596
              mem = gen_frame_mem (word_mode,
11597
                                   plus_constant (Pmode, stack_pointer_rtx,
11598
                                                  offset));
11599
              mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11600
              offset -= UNITS_PER_WORD;
11601
 
11602
              /* Move to COP0 EPC.  */
11603
              emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
11604
                                        gen_rtx_REG (SImode, K0_REG_NUM)));
11605
            }
11606
 
11607
          /* Restore the original Status.  */
11608
          mem = gen_frame_mem (word_mode,
11609
                               plus_constant (Pmode, stack_pointer_rtx,
11610
                                              offset));
11611
          mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
11612
          offset -= UNITS_PER_WORD;
11613
 
11614
          /* If we don't use shadow register set, we need to update SP.  */
11615
          if (!cfun->machine->use_shadow_register_set_p)
11616
            mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11617
          else
11618
            /* The choice of position is somewhat arbitrary in this case.  */
11619
            mips_epilogue_emit_cfa_restores ();
11620
 
11621
          /* Move to COP0 Status.  */
11622
          emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
11623
                                    gen_rtx_REG (SImode, K0_REG_NUM)));
11624
        }
11625
      else if (TARGET_MICROMIPS
11626
               && !crtl->calls_eh_return
11627
               && !sibcall_p
11628
               && step2 > 0
11629
               && mips_unsigned_immediate_p (step2, 5, 2))
11630
        use_jraddiusp_p = true;
11631
      else
11632
        /* Deallocate the final bit of the frame.  */
11633
        mips_deallocate_stack (stack_pointer_rtx, GEN_INT (step2), 0);
11634
    }
11635
 
11636
  if (!use_jraddiusp_p)
11637
    gcc_assert (!mips_epilogue.cfa_restores);
11638
 
11639
  /* Add in the __builtin_eh_return stack adjustment.  We need to
11640
     use a temporary in MIPS16 code.  */
11641
  if (crtl->calls_eh_return)
11642
    {
11643
      if (TARGET_MIPS16)
11644
        {
11645
          mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
11646
          emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
11647
                                    MIPS_EPILOGUE_TEMP (Pmode),
11648
                                    EH_RETURN_STACKADJ_RTX));
11649
          mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
11650
        }
11651
      else
11652
        emit_insn (gen_add3_insn (stack_pointer_rtx,
11653
                                  stack_pointer_rtx,
11654
                                  EH_RETURN_STACKADJ_RTX));
11655
    }
11656
 
11657
  if (!sibcall_p)
11658
    {
11659
      mips_expand_before_return ();
11660
      if (cfun->machine->interrupt_handler_p)
11661
        {
11662
          /* Interrupt handlers generate eret or deret.  */
11663
          if (cfun->machine->use_debug_exception_return_p)
11664
            emit_jump_insn (gen_mips_deret ());
11665
          else
11666
            emit_jump_insn (gen_mips_eret ());
11667
        }
11668
      else
11669
        {
11670
          rtx pat;
11671
 
11672
          /* When generating MIPS16 code, the normal
11673
             mips_for_each_saved_gpr_and_fpr path will restore the return
11674
             address into $7 rather than $31.  */
11675
          if (TARGET_MIPS16
11676
              && !GENERATE_MIPS16E_SAVE_RESTORE
11677
              && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
11678
            {
11679
              /* simple_returns cannot rely on values that are only available
11680
                 on paths through the epilogue (because return paths that do
11681
                 not pass through the epilogue may nevertheless reuse a
11682
                 simple_return that occurs at the end of the epilogue).
11683
                 Use a normal return here instead.  */
11684
              rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
11685
              pat = gen_return_internal (reg);
11686
            }
11687
          else if (use_jraddiusp_p)
11688
            pat = gen_jraddiusp (GEN_INT (step2));
11689
          else
11690
            {
11691
              rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
11692
              pat = gen_simple_return_internal (reg);
11693
            }
11694
          emit_jump_insn (pat);
11695
          if (use_jraddiusp_p)
11696
            mips_epilogue_set_cfa (stack_pointer_rtx, step2);
11697
        }
11698
    }
11699
 
11700
  /* Search from the beginning to the first use of K0 or K1.  */
11701
  if (cfun->machine->interrupt_handler_p
11702
      && !cfun->machine->keep_interrupts_masked_p)
11703
    {
11704
      for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
11705
        if (INSN_P (insn)
11706
            && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
11707
          break;
11708
      gcc_assert (insn != NULL_RTX);
11709
      /* Insert disable interrupts before the first use of K0 or K1.  */
11710
      emit_insn_before (gen_mips_di (), insn);
11711
      emit_insn_before (gen_mips_ehb (), insn);
11712
    }
11713
}
11714
 
11715
/* Return nonzero if this function is known to have a null epilogue.
11716
   This allows the optimizer to omit jumps to jumps if no stack
11717
   was created.  */
11718
 
11719
bool
11720
mips_can_use_return_insn (void)
11721
{
11722
  /* Interrupt handlers need to go through the epilogue.  */
11723
  if (cfun->machine->interrupt_handler_p)
11724
    return false;
11725
 
11726
  if (!reload_completed)
11727
    return false;
11728
 
11729
  if (crtl->profile)
11730
    return false;
11731
 
11732
  /* In MIPS16 mode, a function that returns a floating-point value
11733
     needs to arrange to copy the return value into the floating-point
11734
     registers.  */
11735
  if (mips16_cfun_returns_in_fpr_p ())
11736
    return false;
11737
 
11738
  return cfun->machine->frame.total_size == 0;
11739
}
11740
 
11741
/* Return true if register REGNO can store a value of mode MODE.
11742
   The result of this function is cached in mips_hard_regno_mode_ok.  */
11743
 
11744
static bool
11745
mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
11746
{
11747
  unsigned int size;
11748
  enum mode_class mclass;
11749
 
11750
  if (mode == CCV2mode)
11751
    return (ISA_HAS_8CC
11752
            && ST_REG_P (regno)
11753
            && (regno - ST_REG_FIRST) % 2 == 0);
11754
 
11755
  if (mode == CCV4mode)
11756
    return (ISA_HAS_8CC
11757
            && ST_REG_P (regno)
11758
            && (regno - ST_REG_FIRST) % 4 == 0);
11759
 
11760
  if (mode == CCmode)
11761
    return ISA_HAS_8CC ? ST_REG_P (regno) : regno == FPSW_REGNUM;
11762
 
11763
  size = GET_MODE_SIZE (mode);
11764
  mclass = GET_MODE_CLASS (mode);
11765
 
11766
  if (GP_REG_P (regno))
11767
    return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
11768
 
11769
  if (FP_REG_P (regno)
11770
      && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
11771
          || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
11772
    {
11773
      /* Allow 64-bit vector modes for Loongson-2E/2F.  */
11774
      if (TARGET_LOONGSON_VECTORS
11775
          && (mode == V2SImode
11776
              || mode == V4HImode
11777
              || mode == V8QImode
11778
              || mode == DImode))
11779
        return true;
11780
 
11781
      if (mclass == MODE_FLOAT
11782
          || mclass == MODE_COMPLEX_FLOAT
11783
          || mclass == MODE_VECTOR_FLOAT)
11784
        return size <= UNITS_PER_FPVALUE;
11785
 
11786
      /* Allow integer modes that fit into a single register.  We need
11787
         to put integers into FPRs when using instructions like CVT
11788
         and TRUNC.  There's no point allowing sizes smaller than a word,
11789
         because the FPU has no appropriate load/store instructions.  */
11790
      if (mclass == MODE_INT)
11791
        return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
11792
    }
11793
 
11794
  if (ACC_REG_P (regno)
11795
      && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
11796
    {
11797
      if (MD_REG_P (regno))
11798
        {
11799
          /* After a multiplication or division, clobbering HI makes
11800
             the value of LO unpredictable, and vice versa.  This means
11801
             that, for all interesting cases, HI and LO are effectively
11802
             a single register.
11803
 
11804
             We model this by requiring that any value that uses HI
11805
             also uses LO.  */
11806
          if (size <= UNITS_PER_WORD * 2)
11807
            return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
11808
        }
11809
      else
11810
        {
11811
          /* DSP accumulators do not have the same restrictions as
11812
             HI and LO, so we can treat them as normal doubleword
11813
             registers.  */
11814
          if (size <= UNITS_PER_WORD)
11815
            return true;
11816
 
11817
          if (size <= UNITS_PER_WORD * 2
11818
              && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
11819
            return true;
11820
        }
11821
    }
11822
 
11823
  if (ALL_COP_REG_P (regno))
11824
    return mclass == MODE_INT && size <= UNITS_PER_WORD;
11825
 
11826
  if (regno == GOT_VERSION_REGNUM)
11827
    return mode == SImode;
11828
 
11829
  return false;
11830
}
11831
 
11832
/* Implement HARD_REGNO_NREGS.  */
11833
 
11834
unsigned int
11835
mips_hard_regno_nregs (int regno, enum machine_mode mode)
11836
{
11837
  if (ST_REG_P (regno))
11838
    /* The size of FP status registers is always 4, because they only hold
11839
       CCmode values, and CCmode is always considered to be 4 bytes wide.  */
11840
    return (GET_MODE_SIZE (mode) + 3) / 4;
11841
 
11842
  if (FP_REG_P (regno))
11843
    return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
11844
 
11845
  /* All other registers are word-sized.  */
11846
  return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
11847
}
11848
 
11849
/* Implement CLASS_MAX_NREGS, taking the maximum of the cases
11850
   in mips_hard_regno_nregs.  */
11851
 
11852
int
11853
mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
11854
{
11855
  int size;
11856
  HARD_REG_SET left;
11857
 
11858
  size = 0x8000;
11859
  COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
11860
  if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
11861
    {
11862
      if (HARD_REGNO_MODE_OK (ST_REG_FIRST, mode))
11863
        size = MIN (size, 4);
11864
      AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
11865
    }
11866
  if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
11867
    {
11868
      if (HARD_REGNO_MODE_OK (FP_REG_FIRST, mode))
11869
        size = MIN (size, UNITS_PER_FPREG);
11870
      AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
11871
    }
11872
  if (!hard_reg_set_empty_p (left))
11873
    size = MIN (size, UNITS_PER_WORD);
11874
  return (GET_MODE_SIZE (mode) + size - 1) / size;
11875
}
11876
 
11877
/* Implement CANNOT_CHANGE_MODE_CLASS.  */
11878
 
11879
bool
11880
mips_cannot_change_mode_class (enum machine_mode from,
11881
                               enum machine_mode to,
11882
                               enum reg_class rclass)
11883
{
11884
  /* Allow conversions between different Loongson integer vectors,
11885
     and between those vectors and DImode.  */
11886
  if (GET_MODE_SIZE (from) == 8 && GET_MODE_SIZE (to) == 8
11887
      && INTEGRAL_MODE_P (from) && INTEGRAL_MODE_P (to))
11888
    return false;
11889
 
11890
  /* Otherwise, there are several problems with changing the modes of
11891
     values in floating-point registers:
11892
 
11893
     - When a multi-word value is stored in paired floating-point
11894
       registers, the first register always holds the low word.  We
11895
       therefore can't allow FPRs to change between single-word and
11896
       multi-word modes on big-endian targets.
11897
 
11898
     - GCC assumes that each word of a multiword register can be
11899
       accessed individually using SUBREGs.  This is not true for
11900
       floating-point registers if they are bigger than a word.
11901
 
11902
     - Loading a 32-bit value into a 64-bit floating-point register
11903
       will not sign-extend the value, despite what LOAD_EXTEND_OP
11904
       says.  We can't allow FPRs to change from SImode to a wider
11905
       mode on 64-bit targets.
11906
 
11907
     - If the FPU has already interpreted a value in one format, we
11908
       must not ask it to treat the value as having a different
11909
       format.
11910
 
11911
     We therefore disallow all mode changes involving FPRs.  */
11912
 
11913
  return reg_classes_intersect_p (FP_REGS, rclass);
11914
}
11915
 
11916
/* Implement target hook small_register_classes_for_mode_p.  */
11917
 
11918
static bool
11919
mips_small_register_classes_for_mode_p (enum machine_mode mode
11920
                                        ATTRIBUTE_UNUSED)
11921
{
11922
  return TARGET_MIPS16;
11923
}
11924
 
11925
/* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
11926
 
11927
static bool
11928
mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
11929
{
11930
  switch (mode)
11931
    {
11932
    case SFmode:
11933
      return TARGET_HARD_FLOAT;
11934
 
11935
    case DFmode:
11936
      return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
11937
 
11938
    case V2SFmode:
11939
      return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
11940
 
11941
    default:
11942
      return false;
11943
    }
11944
}
11945
 
11946
/* Implement MODES_TIEABLE_P.  */
11947
 
11948
bool
11949
mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
11950
{
11951
  /* FPRs allow no mode punning, so it's not worth tying modes if we'd
11952
     prefer to put one of them in FPRs.  */
11953
  return (mode1 == mode2
11954
          || (!mips_mode_ok_for_mov_fmt_p (mode1)
11955
              && !mips_mode_ok_for_mov_fmt_p (mode2)));
11956
}
11957
 
11958
/* Implement TARGET_PREFERRED_RELOAD_CLASS.  */
11959
 
11960
static reg_class_t
11961
mips_preferred_reload_class (rtx x, reg_class_t rclass)
11962
{
11963
  if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
11964
    return LEA_REGS;
11965
 
11966
  if (reg_class_subset_p (FP_REGS, rclass)
11967
      && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
11968
    return FP_REGS;
11969
 
11970
  if (reg_class_subset_p (GR_REGS, rclass))
11971
    rclass = GR_REGS;
11972
 
11973
  if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
11974
    rclass = M16_REGS;
11975
 
11976
  return rclass;
11977
}
11978
 
11979
/* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
11980
   Return a "canonical" class to represent it in later calculations.  */
11981
 
11982
static reg_class_t
11983
mips_canonicalize_move_class (reg_class_t rclass)
11984
{
11985
  /* All moves involving accumulator registers have the same cost.  */
11986
  if (reg_class_subset_p (rclass, ACC_REGS))
11987
    rclass = ACC_REGS;
11988
 
11989
  /* Likewise promote subclasses of general registers to the most
11990
     interesting containing class.  */
11991
  if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
11992
    rclass = M16_REGS;
11993
  else if (reg_class_subset_p (rclass, GENERAL_REGS))
11994
    rclass = GENERAL_REGS;
11995
 
11996
  return rclass;
11997
}
11998
 
11999
/* Return the cost of moving a value of mode MODE from a register of
12000
   class FROM to a GPR.  Return 0 for classes that are unions of other
12001
   classes handled by this function.  */
12002
 
12003
static int
12004
mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
12005
                       reg_class_t from)
12006
{
12007
  switch (from)
12008
    {
12009
    case M16_REGS:
12010
    case GENERAL_REGS:
12011
      /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
12012
      return 2;
12013
 
12014
    case ACC_REGS:
12015
      /* MFLO and MFHI.  */
12016
      return 6;
12017
 
12018
    case FP_REGS:
12019
      /* MFC1, etc.  */
12020
      return 4;
12021
 
12022
    case ST_REGS:
12023
      /* LUI followed by MOVF.  */
12024
      return 4;
12025
 
12026
    case COP0_REGS:
12027
    case COP2_REGS:
12028
    case COP3_REGS:
12029
      /* This choice of value is historical.  */
12030
      return 5;
12031
 
12032
    default:
12033
      return 0;
12034
    }
12035
}
12036
 
12037
/* Return the cost of moving a value of mode MODE from a GPR to a
12038
   register of class TO.  Return 0 for classes that are unions of
12039
   other classes handled by this function.  */
12040
 
12041
static int
12042
mips_move_from_gpr_cost (enum machine_mode mode, reg_class_t to)
12043
{
12044
  switch (to)
12045
    {
12046
    case M16_REGS:
12047
    case GENERAL_REGS:
12048
      /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
12049
      return 2;
12050
 
12051
    case ACC_REGS:
12052
      /* MTLO and MTHI.  */
12053
      return 6;
12054
 
12055
    case FP_REGS:
12056
      /* MTC1, etc.  */
12057
      return 4;
12058
 
12059
    case ST_REGS:
12060
      /* A secondary reload through an FPR scratch.  */
12061
      return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
12062
              + mips_register_move_cost (mode, FP_REGS, ST_REGS));
12063
 
12064
    case COP0_REGS:
12065
    case COP2_REGS:
12066
    case COP3_REGS:
12067
      /* This choice of value is historical.  */
12068
      return 5;
12069
 
12070
    default:
12071
      return 0;
12072
    }
12073
}
12074
 
12075
/* Implement TARGET_REGISTER_MOVE_COST.  Return 0 for classes that are the
12076
   maximum of the move costs for subclasses; regclass will work out
12077
   the maximum for us.  */
12078
 
12079
static int
12080
mips_register_move_cost (enum machine_mode mode,
12081
                         reg_class_t from, reg_class_t to)
12082
{
12083
  reg_class_t dregs;
12084
  int cost1, cost2;
12085
 
12086
  from = mips_canonicalize_move_class (from);
12087
  to = mips_canonicalize_move_class (to);
12088
 
12089
  /* Handle moves that can be done without using general-purpose registers.  */
12090
  if (from == FP_REGS)
12091
    {
12092
      if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
12093
        /* MOV.FMT.  */
12094
        return 4;
12095
      if (to == ST_REGS)
12096
        /* The sequence generated by mips_expand_fcc_reload.  */
12097
        return 8;
12098
    }
12099
 
12100
  /* Handle cases in which only one class deviates from the ideal.  */
12101
  dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
12102
  if (from == dregs)
12103
    return mips_move_from_gpr_cost (mode, to);
12104
  if (to == dregs)
12105
    return mips_move_to_gpr_cost (mode, from);
12106
 
12107
  /* Handles cases that require a GPR temporary.  */
12108
  cost1 = mips_move_to_gpr_cost (mode, from);
12109
  if (cost1 != 0)
12110
    {
12111
      cost2 = mips_move_from_gpr_cost (mode, to);
12112
      if (cost2 != 0)
12113
        return cost1 + cost2;
12114
    }
12115
 
12116
  return 0;
12117
}
12118
 
12119
/* Implement TARGET_MEMORY_MOVE_COST.  */
12120
 
12121
static int
12122
mips_memory_move_cost (enum machine_mode mode, reg_class_t rclass, bool in)
12123
{
12124
  return (mips_cost->memory_latency
12125
          + memory_move_secondary_cost (mode, rclass, in));
12126
}
12127
 
12128
/* Return the register class required for a secondary register when
12129
   copying between one of the registers in RCLASS and value X, which
12130
   has mode MODE.  X is the source of the move if IN_P, otherwise it
12131
   is the destination.  Return NO_REGS if no secondary register is
12132
   needed.  */
12133
 
12134
enum reg_class
12135
mips_secondary_reload_class (enum reg_class rclass,
12136
                             enum machine_mode mode, rtx x, bool in_p)
12137
{
12138
  int regno;
12139
 
12140
  /* If X is a constant that cannot be loaded into $25, it must be loaded
12141
     into some other GPR.  No other register class allows a direct move.  */
12142
  if (mips_dangerous_for_la25_p (x))
12143
    return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
12144
 
12145
  regno = true_regnum (x);
12146
  if (TARGET_MIPS16)
12147
    {
12148
      /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
12149
      if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
12150
        return M16_REGS;
12151
 
12152
      return NO_REGS;
12153
    }
12154
 
12155
  /* Copying from accumulator registers to anywhere other than a general
12156
     register requires a temporary general register.  */
12157
  if (reg_class_subset_p (rclass, ACC_REGS))
12158
    return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12159
  if (ACC_REG_P (regno))
12160
    return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12161
 
12162
  /* We can only copy a value to a condition code register from a
12163
     floating-point register, and even then we require a scratch
12164
     floating-point register.  We can only copy a value out of a
12165
     condition-code register into a general register.  */
12166
  if (reg_class_subset_p (rclass, ST_REGS))
12167
    {
12168
      if (in_p)
12169
        return FP_REGS;
12170
      return GP_REG_P (regno) ? NO_REGS : GR_REGS;
12171
    }
12172
  if (ST_REG_P (regno))
12173
    {
12174
      if (!in_p)
12175
        return FP_REGS;
12176
      return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12177
    }
12178
 
12179
  if (reg_class_subset_p (rclass, FP_REGS))
12180
    {
12181
      if (MEM_P (x)
12182
          && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
12183
        /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
12184
           pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
12185
        return NO_REGS;
12186
 
12187
      if (GP_REG_P (regno) || x == CONST0_RTX (mode))
12188
        /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
12189
        return NO_REGS;
12190
 
12191
      if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (mode, x))
12192
        /* We can force the constant to memory and use lwc1
12193
           and ldc1.  As above, we will use pairs of lwc1s if
12194
           ldc1 is not supported.  */
12195
        return NO_REGS;
12196
 
12197
      if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
12198
        /* In this case we can use mov.fmt.  */
12199
        return NO_REGS;
12200
 
12201
      /* Otherwise, we need to reload through an integer register.  */
12202
      return GR_REGS;
12203
    }
12204
  if (FP_REG_P (regno))
12205
    return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
12206
 
12207
  return NO_REGS;
12208
}
12209
 
12210
/* Implement TARGET_MODE_REP_EXTENDED.  */
12211
 
12212
static int
12213
mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
12214
{
12215
  /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
12216
  if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
12217
    return SIGN_EXTEND;
12218
 
12219
  return UNKNOWN;
12220
}
12221
 
12222
/* Implement TARGET_VALID_POINTER_MODE.  */
12223
 
12224
static bool
12225
mips_valid_pointer_mode (enum machine_mode mode)
12226
{
12227
  return mode == SImode || (TARGET_64BIT && mode == DImode);
12228
}
12229
 
12230
/* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
12231
 
12232
static bool
12233
mips_vector_mode_supported_p (enum machine_mode mode)
12234
{
12235
  switch (mode)
12236
    {
12237
    case V2SFmode:
12238
      return TARGET_PAIRED_SINGLE_FLOAT;
12239
 
12240
    case V2HImode:
12241
    case V4QImode:
12242
    case V2HQmode:
12243
    case V2UHQmode:
12244
    case V2HAmode:
12245
    case V2UHAmode:
12246
    case V4QQmode:
12247
    case V4UQQmode:
12248
      return TARGET_DSP;
12249
 
12250
    case V2SImode:
12251
    case V4HImode:
12252
    case V8QImode:
12253
      return TARGET_LOONGSON_VECTORS;
12254
 
12255
    default:
12256
      return false;
12257
    }
12258
}
12259
 
12260
/* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
12261
 
12262
static bool
12263
mips_scalar_mode_supported_p (enum machine_mode mode)
12264
{
12265
  if (ALL_FIXED_POINT_MODE_P (mode)
12266
      && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
12267
    return true;
12268
 
12269
  return default_scalar_mode_supported_p (mode);
12270
}
12271
 
12272
/* Implement TARGET_VECTORIZE_PREFERRED_SIMD_MODE.  */
12273
 
12274
static enum machine_mode
12275
mips_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED)
12276
{
12277
  if (TARGET_PAIRED_SINGLE_FLOAT
12278
      && mode == SFmode)
12279
    return V2SFmode;
12280
  return word_mode;
12281
}
12282
 
12283
/* Implement TARGET_INIT_LIBFUNCS.  */
12284
 
12285
static void
12286
mips_init_libfuncs (void)
12287
{
12288
  if (TARGET_FIX_VR4120)
12289
    {
12290
      /* Register the special divsi3 and modsi3 functions needed to work
12291
         around VR4120 division errata.  */
12292
      set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
12293
      set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
12294
    }
12295
 
12296
  if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
12297
    {
12298
      /* Register the MIPS16 -mhard-float stubs.  */
12299
      set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
12300
      set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
12301
      set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
12302
      set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
12303
 
12304
      set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
12305
      set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
12306
      set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
12307
      set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
12308
      set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
12309
      set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
12310
      set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
12311
 
12312
      set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
12313
      set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
12314
      set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
12315
 
12316
      if (TARGET_DOUBLE_FLOAT)
12317
        {
12318
          set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
12319
          set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
12320
          set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
12321
          set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
12322
 
12323
          set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
12324
          set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
12325
          set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
12326
          set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
12327
          set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
12328
          set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
12329
          set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
12330
 
12331
          set_conv_libfunc (sext_optab, DFmode, SFmode,
12332
                            "__mips16_extendsfdf2");
12333
          set_conv_libfunc (trunc_optab, SFmode, DFmode,
12334
                            "__mips16_truncdfsf2");
12335
          set_conv_libfunc (sfix_optab, SImode, DFmode,
12336
                            "__mips16_fix_truncdfsi");
12337
          set_conv_libfunc (sfloat_optab, DFmode, SImode,
12338
                            "__mips16_floatsidf");
12339
          set_conv_libfunc (ufloat_optab, DFmode, SImode,
12340
                            "__mips16_floatunsidf");
12341
        }
12342
    }
12343
 
12344
  /* The MIPS16 ISA does not have an encoding for "sync", so we rely
12345
     on an external non-MIPS16 routine to implement __sync_synchronize.
12346
     Similarly for the rest of the ll/sc libfuncs.  */
12347
  if (TARGET_MIPS16)
12348
    {
12349
      synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
12350
      init_sync_libfuncs (UNITS_PER_WORD);
12351
    }
12352
}
12353
 
12354
/* Build up a multi-insn sequence that loads label TARGET into $AT.  */
12355
 
12356
static void
12357
mips_process_load_label (rtx target)
12358
{
12359
  rtx base, gp, intop;
12360
  HOST_WIDE_INT offset;
12361
 
12362
  mips_multi_start ();
12363
  switch (mips_abi)
12364
    {
12365
    case ABI_N32:
12366
      mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
12367
      mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
12368
      break;
12369
 
12370
    case ABI_64:
12371
      mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
12372
      mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
12373
      break;
12374
 
12375
    default:
12376
      gp = pic_offset_table_rtx;
12377
      if (mips_cfun_has_cprestore_slot_p ())
12378
        {
12379
          gp = gen_rtx_REG (Pmode, AT_REGNUM);
12380
          mips_get_cprestore_base_and_offset (&base, &offset, true);
12381
          if (!SMALL_OPERAND (offset))
12382
            {
12383
              intop = GEN_INT (CONST_HIGH_PART (offset));
12384
              mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
12385
              mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
12386
 
12387
              base = gp;
12388
              offset = CONST_LOW_PART (offset);
12389
            }
12390
          intop = GEN_INT (offset);
12391
          if (ISA_HAS_LOAD_DELAY)
12392
            mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
12393
          else
12394
            mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
12395
        }
12396
      if (ISA_HAS_LOAD_DELAY)
12397
        mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
12398
      else
12399
        mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
12400
      mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
12401
      break;
12402
    }
12403
}
12404
 
12405
/* Return the number of instructions needed to load a label into $AT.  */
12406
 
12407
static unsigned int
12408
mips_load_label_num_insns (void)
12409
{
12410
  if (cfun->machine->load_label_num_insns == 0)
12411
    {
12412
      mips_process_load_label (pc_rtx);
12413
      cfun->machine->load_label_num_insns = mips_multi_num_insns;
12414
    }
12415
  return cfun->machine->load_label_num_insns;
12416
}
12417
 
12418
/* Emit an asm sequence to start a noat block and load the address
12419
   of a label into $1.  */
12420
 
12421
void
12422
mips_output_load_label (rtx target)
12423
{
12424
  mips_push_asm_switch (&mips_noat);
12425
  if (TARGET_EXPLICIT_RELOCS)
12426
    {
12427
      mips_process_load_label (target);
12428
      mips_multi_write ();
12429
    }
12430
  else
12431
    {
12432
      if (Pmode == DImode)
12433
        output_asm_insn ("dla\t%@,%0", &target);
12434
      else
12435
        output_asm_insn ("la\t%@,%0", &target);
12436
    }
12437
}
12438
 
12439
/* Return the length of INSN.  LENGTH is the initial length computed by
12440
   attributes in the machine-description file.  */
12441
 
12442
int
12443
mips_adjust_insn_length (rtx insn, int length)
12444
{
12445
  /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
12446
     of a PIC long-branch sequence.  Substitute the correct value.  */
12447
  if (length == MAX_PIC_BRANCH_LENGTH
12448
      && JUMP_P (insn)
12449
      && INSN_CODE (insn) >= 0
12450
      && get_attr_type (insn) == TYPE_BRANCH)
12451
    {
12452
      /* Add the branch-over instruction and its delay slot, if this
12453
         is a conditional branch.  */
12454
      length = simplejump_p (insn) ? 0 : 8;
12455
 
12456
      /* Add the size of a load into $AT.  */
12457
      length += BASE_INSN_LENGTH * mips_load_label_num_insns ();
12458
 
12459
      /* Add the length of an indirect jump, ignoring the delay slot.  */
12460
      length += TARGET_COMPRESSION ? 2 : 4;
12461
    }
12462
 
12463
  /* A unconditional jump has an unfilled delay slot if it is not part
12464
     of a sequence.  A conditional jump normally has a delay slot, but
12465
     does not on MIPS16.  */
12466
  if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
12467
    length += TARGET_MIPS16 ? 2 : 4;
12468
 
12469
  /* See how many nops might be needed to avoid hardware hazards.  */
12470
  if (!cfun->machine->ignore_hazard_length_p
12471
      && INSN_P (insn)
12472
      && INSN_CODE (insn) >= 0)
12473
    switch (get_attr_hazard (insn))
12474
      {
12475
      case HAZARD_NONE:
12476
        break;
12477
 
12478
      case HAZARD_DELAY:
12479
        length += NOP_INSN_LENGTH;
12480
        break;
12481
 
12482
      case HAZARD_HILO:
12483
        length += NOP_INSN_LENGTH * 2;
12484
        break;
12485
      }
12486
 
12487
  return length;
12488
}
12489
 
12490
/* Return the assembly code for INSN, which has the operands given by
12491
   OPERANDS, and which branches to OPERANDS[0] if some condition is true.
12492
   BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
12493
   is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
12494
   version of BRANCH_IF_TRUE.  */
12495
 
12496
const char *
12497
mips_output_conditional_branch (rtx insn, rtx *operands,
12498
                                const char *branch_if_true,
12499
                                const char *branch_if_false)
12500
{
12501
  unsigned int length;
12502
  rtx taken, not_taken;
12503
 
12504
  gcc_assert (LABEL_P (operands[0]));
12505
 
12506
  length = get_attr_length (insn);
12507
  if (length <= 8)
12508
    {
12509
      /* Just a simple conditional branch.  */
12510
      mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
12511
      return branch_if_true;
12512
    }
12513
 
12514
  /* Generate a reversed branch around a direct jump.  This fallback does
12515
     not use branch-likely instructions.  */
12516
  mips_branch_likely = false;
12517
  not_taken = gen_label_rtx ();
12518
  taken = operands[0];
12519
 
12520
  /* Generate the reversed branch to NOT_TAKEN.  */
12521
  operands[0] = not_taken;
12522
  output_asm_insn (branch_if_false, operands);
12523
 
12524
  /* If INSN has a delay slot, we must provide delay slots for both the
12525
     branch to NOT_TAKEN and the conditional jump.  We must also ensure
12526
     that INSN's delay slot is executed in the appropriate cases.  */
12527
  if (final_sequence)
12528
    {
12529
      /* This first delay slot will always be executed, so use INSN's
12530
         delay slot if is not annulled.  */
12531
      if (!INSN_ANNULLED_BRANCH_P (insn))
12532
        {
12533
          final_scan_insn (XVECEXP (final_sequence, 0, 1),
12534
                           asm_out_file, optimize, 1, NULL);
12535
          INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
12536
        }
12537
      else
12538
        output_asm_insn ("nop", 0);
12539
      fprintf (asm_out_file, "\n");
12540
    }
12541
 
12542
  /* Output the unconditional branch to TAKEN.  */
12543
  if (TARGET_ABSOLUTE_JUMPS)
12544
    output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
12545
  else
12546
    {
12547
      mips_output_load_label (taken);
12548
      output_asm_insn ("jr\t%@%]%/", 0);
12549
    }
12550
 
12551
  /* Now deal with its delay slot; see above.  */
12552
  if (final_sequence)
12553
    {
12554
      /* This delay slot will only be executed if the branch is taken.
12555
         Use INSN's delay slot if is annulled.  */
12556
      if (INSN_ANNULLED_BRANCH_P (insn))
12557
        {
12558
          final_scan_insn (XVECEXP (final_sequence, 0, 1),
12559
                           asm_out_file, optimize, 1, NULL);
12560
          INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
12561
        }
12562
      else
12563
        output_asm_insn ("nop", 0);
12564
      fprintf (asm_out_file, "\n");
12565
    }
12566
 
12567
  /* Output NOT_TAKEN.  */
12568
  targetm.asm_out.internal_label (asm_out_file, "L",
12569
                                  CODE_LABEL_NUMBER (not_taken));
12570
  return "";
12571
}
12572
 
12573
/* Return the assembly code for INSN, which branches to OPERANDS[0]
12574
   if some ordering condition is true.  The condition is given by
12575
   OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
12576
   OPERANDS[1].  OPERANDS[2] is the comparison's first operand;
12577
   its second is always zero.  */
12578
 
12579
const char *
12580
mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
12581
{
12582
  const char *branch[2];
12583
 
12584
  /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
12585
     Make BRANCH[0] branch on the inverse condition.  */
12586
  switch (GET_CODE (operands[1]))
12587
    {
12588
      /* These cases are equivalent to comparisons against zero.  */
12589
    case LEU:
12590
      inverted_p = !inverted_p;
12591
      /* Fall through.  */
12592
    case GTU:
12593
      branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
12594
      branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
12595
      break;
12596
 
12597
      /* These cases are always true or always false.  */
12598
    case LTU:
12599
      inverted_p = !inverted_p;
12600
      /* Fall through.  */
12601
    case GEU:
12602
      branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
12603
      branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
12604
      break;
12605
 
12606
    default:
12607
      branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
12608
      branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
12609
      break;
12610
    }
12611
  return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
12612
}
12613
 
12614
/* Start a block of code that needs access to the LL, SC and SYNC
12615
   instructions.  */
12616
 
12617
static void
12618
mips_start_ll_sc_sync_block (void)
12619
{
12620
  if (!ISA_HAS_LL_SC)
12621
    {
12622
      output_asm_insn (".set\tpush", 0);
12623
      if (TARGET_64BIT)
12624
        output_asm_insn (".set\tmips3", 0);
12625
      else
12626
        output_asm_insn (".set\tmips2", 0);
12627
    }
12628
}
12629
 
12630
/* End a block started by mips_start_ll_sc_sync_block.  */
12631
 
12632
static void
12633
mips_end_ll_sc_sync_block (void)
12634
{
12635
  if (!ISA_HAS_LL_SC)
12636
    output_asm_insn (".set\tpop", 0);
12637
}
12638
 
12639
/* Output and/or return the asm template for a sync instruction.  */
12640
 
12641
const char *
12642
mips_output_sync (void)
12643
{
12644
  mips_start_ll_sc_sync_block ();
12645
  output_asm_insn ("sync", 0);
12646
  mips_end_ll_sc_sync_block ();
12647
  return "";
12648
}
12649
 
12650
/* Return the asm template associated with sync_insn1 value TYPE.
12651
   IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation.  */
12652
 
12653
static const char *
12654
mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
12655
{
12656
  switch (type)
12657
    {
12658
    case SYNC_INSN1_MOVE:
12659
      return "move\t%0,%z2";
12660
    case SYNC_INSN1_LI:
12661
      return "li\t%0,%2";
12662
    case SYNC_INSN1_ADDU:
12663
      return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
12664
    case SYNC_INSN1_ADDIU:
12665
      return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
12666
    case SYNC_INSN1_SUBU:
12667
      return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
12668
    case SYNC_INSN1_AND:
12669
      return "and\t%0,%1,%z2";
12670
    case SYNC_INSN1_ANDI:
12671
      return "andi\t%0,%1,%2";
12672
    case SYNC_INSN1_OR:
12673
      return "or\t%0,%1,%z2";
12674
    case SYNC_INSN1_ORI:
12675
      return "ori\t%0,%1,%2";
12676
    case SYNC_INSN1_XOR:
12677
      return "xor\t%0,%1,%z2";
12678
    case SYNC_INSN1_XORI:
12679
      return "xori\t%0,%1,%2";
12680
    }
12681
  gcc_unreachable ();
12682
}
12683
 
12684
/* Return the asm template associated with sync_insn2 value TYPE.  */
12685
 
12686
static const char *
12687
mips_sync_insn2_template (enum attr_sync_insn2 type)
12688
{
12689
  switch (type)
12690
    {
12691
    case SYNC_INSN2_NOP:
12692
      gcc_unreachable ();
12693
    case SYNC_INSN2_AND:
12694
      return "and\t%0,%1,%z2";
12695
    case SYNC_INSN2_XOR:
12696
      return "xor\t%0,%1,%z2";
12697
    case SYNC_INSN2_NOT:
12698
      return "nor\t%0,%1,%.";
12699
    }
12700
  gcc_unreachable ();
12701
}
12702
 
12703
/* OPERANDS are the operands to a sync loop instruction and INDEX is
12704
   the value of the one of the sync_* attributes.  Return the operand
12705
   referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
12706
   have the associated attribute.  */
12707
 
12708
static rtx
12709
mips_get_sync_operand (rtx *operands, int index, rtx default_value)
12710
{
12711
  if (index > 0)
12712
    default_value = operands[index - 1];
12713
  return default_value;
12714
}
12715
 
12716
/* INSN is a sync loop with operands OPERANDS.  Build up a multi-insn
12717
   sequence for it.  */
12718
 
12719
static void
12720
mips_process_sync_loop (rtx insn, rtx *operands)
12721
{
12722
  rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
12723
  rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3, cmp;
12724
  unsigned int tmp3_insn;
12725
  enum attr_sync_insn1 insn1;
12726
  enum attr_sync_insn2 insn2;
12727
  bool is_64bit_p;
12728
  int memmodel_attr;
12729
  enum memmodel model;
12730
 
12731
  /* Read an operand from the sync_WHAT attribute and store it in
12732
     variable WHAT.  DEFAULT is the default value if no attribute
12733
     is specified.  */
12734
#define READ_OPERAND(WHAT, DEFAULT) \
12735
  WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
12736
                                DEFAULT)
12737
 
12738
  /* Read the memory.  */
12739
  READ_OPERAND (mem, 0);
12740
  gcc_assert (mem);
12741
  is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
12742
 
12743
  /* Read the other attributes.  */
12744
  at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
12745
  READ_OPERAND (oldval, at);
12746
  READ_OPERAND (cmp, 0);
12747
  READ_OPERAND (newval, at);
12748
  READ_OPERAND (inclusive_mask, 0);
12749
  READ_OPERAND (exclusive_mask, 0);
12750
  READ_OPERAND (required_oldval, 0);
12751
  READ_OPERAND (insn1_op2, 0);
12752
  insn1 = get_attr_sync_insn1 (insn);
12753
  insn2 = get_attr_sync_insn2 (insn);
12754
 
12755
  /* Don't bother setting CMP result that is never used.  */
12756
  if (cmp && find_reg_note (insn, REG_UNUSED, cmp))
12757
    cmp = 0;
12758
 
12759
  memmodel_attr = get_attr_sync_memmodel (insn);
12760
  switch (memmodel_attr)
12761
    {
12762
    case 10:
12763
      model = MEMMODEL_ACQ_REL;
12764
      break;
12765
    case 11:
12766
      model = MEMMODEL_ACQUIRE;
12767
      break;
12768
    default:
12769
      model = (enum memmodel) INTVAL (operands[memmodel_attr]);
12770
    }
12771
 
12772
  mips_multi_start ();
12773
 
12774
  /* Output the release side of the memory barrier.  */
12775
  if (need_atomic_barrier_p (model, true))
12776
    {
12777
      if (required_oldval == 0 && TARGET_OCTEON)
12778
        {
12779
          /* Octeon doesn't reorder reads, so a full barrier can be
12780
             created by using SYNCW to order writes combined with the
12781
             write from the following SC.  When the SC successfully
12782
             completes, we know that all preceding writes are also
12783
             committed to the coherent memory system.  It is possible
12784
             for a single SYNCW to fail, but a pair of them will never
12785
             fail, so we use two.  */
12786
          mips_multi_add_insn ("syncw", NULL);
12787
          mips_multi_add_insn ("syncw", NULL);
12788
        }
12789
      else
12790
        mips_multi_add_insn ("sync", NULL);
12791
    }
12792
 
12793
  /* Output the branch-back label.  */
12794
  mips_multi_add_label ("1:");
12795
 
12796
  /* OLDVAL = *MEM.  */
12797
  mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
12798
                       oldval, mem, NULL);
12799
 
12800
  /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2.  */
12801
  if (required_oldval)
12802
    {
12803
      if (inclusive_mask == 0)
12804
        tmp1 = oldval;
12805
      else
12806
        {
12807
          gcc_assert (oldval != at);
12808
          mips_multi_add_insn ("and\t%0,%1,%2",
12809
                               at, oldval, inclusive_mask, NULL);
12810
          tmp1 = at;
12811
        }
12812
      mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
12813
 
12814
      /* CMP = 0 [delay slot].  */
12815
      if (cmp)
12816
        mips_multi_add_insn ("li\t%0,0", cmp, NULL);
12817
    }
12818
 
12819
  /* $TMP1 = OLDVAL & EXCLUSIVE_MASK.  */
12820
  if (exclusive_mask == 0)
12821
    tmp1 = const0_rtx;
12822
  else
12823
    {
12824
      gcc_assert (oldval != at);
12825
      mips_multi_add_insn ("and\t%0,%1,%z2",
12826
                           at, oldval, exclusive_mask, NULL);
12827
      tmp1 = at;
12828
    }
12829
 
12830
  /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
12831
 
12832
     We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
12833
     at least one instruction in that case.  */
12834
  if (insn1 == SYNC_INSN1_MOVE
12835
      && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
12836
    tmp2 = insn1_op2;
12837
  else
12838
    {
12839
      mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
12840
                           newval, oldval, insn1_op2, NULL);
12841
      tmp2 = newval;
12842
    }
12843
 
12844
  /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK).  */
12845
  if (insn2 == SYNC_INSN2_NOP)
12846
    tmp3 = tmp2;
12847
  else
12848
    {
12849
      mips_multi_add_insn (mips_sync_insn2_template (insn2),
12850
                           newval, tmp2, inclusive_mask, NULL);
12851
      tmp3 = newval;
12852
    }
12853
  tmp3_insn = mips_multi_last_index ();
12854
 
12855
  /* $AT = $TMP1 | $TMP3.  */
12856
  if (tmp1 == const0_rtx || tmp3 == const0_rtx)
12857
    {
12858
      mips_multi_set_operand (tmp3_insn, 0, at);
12859
      tmp3 = at;
12860
    }
12861
  else
12862
    {
12863
      gcc_assert (tmp1 != tmp3);
12864
      mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
12865
    }
12866
 
12867
  /* if (!commit (*MEM = $AT)) goto 1.
12868
 
12869
     This will sometimes be a delayed branch; see the write code below
12870
     for details.  */
12871
  mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
12872
  mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
12873
 
12874
  /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot].  */
12875
  if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
12876
    {
12877
      mips_multi_copy_insn (tmp3_insn);
12878
      mips_multi_set_operand (mips_multi_last_index (), 0, newval);
12879
    }
12880
  else if (!(required_oldval && cmp))
12881
    mips_multi_add_insn ("nop", NULL);
12882
 
12883
  /* CMP = 1 -- either standalone or in a delay slot.  */
12884
  if (required_oldval && cmp)
12885
    mips_multi_add_insn ("li\t%0,1", cmp, NULL);
12886
 
12887
  /* Output the acquire side of the memory barrier.  */
12888
  if (TARGET_SYNC_AFTER_SC && need_atomic_barrier_p (model, false))
12889
    mips_multi_add_insn ("sync", NULL);
12890
 
12891
  /* Output the exit label, if needed.  */
12892
  if (required_oldval)
12893
    mips_multi_add_label ("2:");
12894
 
12895
#undef READ_OPERAND
12896
}
12897
 
12898
/* Output and/or return the asm template for sync loop INSN, which has
12899
   the operands given by OPERANDS.  */
12900
 
12901
const char *
12902
mips_output_sync_loop (rtx insn, rtx *operands)
12903
{
12904
  mips_process_sync_loop (insn, operands);
12905
 
12906
  /* Use branch-likely instructions to work around the LL/SC R10000
12907
     errata.  */
12908
  mips_branch_likely = TARGET_FIX_R10000;
12909
 
12910
  mips_push_asm_switch (&mips_noreorder);
12911
  mips_push_asm_switch (&mips_nomacro);
12912
  mips_push_asm_switch (&mips_noat);
12913
  mips_start_ll_sc_sync_block ();
12914
 
12915
  mips_multi_write ();
12916
 
12917
  mips_end_ll_sc_sync_block ();
12918
  mips_pop_asm_switch (&mips_noat);
12919
  mips_pop_asm_switch (&mips_nomacro);
12920
  mips_pop_asm_switch (&mips_noreorder);
12921
 
12922
  return "";
12923
}
12924
 
12925
/* Return the number of individual instructions in sync loop INSN,
12926
   which has the operands given by OPERANDS.  */
12927
 
12928
unsigned int
12929
mips_sync_loop_insns (rtx insn, rtx *operands)
12930
{
12931
  mips_process_sync_loop (insn, operands);
12932
  return mips_multi_num_insns;
12933
}
12934
 
12935
/* Return the assembly code for DIV or DDIV instruction DIVISION, which has
12936
   the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
12937
 
12938
   When working around R4000 and R4400 errata, we need to make sure that
12939
   the division is not immediately followed by a shift[1][2].  We also
12940
   need to stop the division from being put into a branch delay slot[3].
12941
   The easiest way to avoid both problems is to add a nop after the
12942
   division.  When a divide-by-zero check is needed, this nop can be
12943
   used to fill the branch delay slot.
12944
 
12945
   [1] If a double-word or a variable shift executes immediately
12946
       after starting an integer division, the shift may give an
12947
       incorrect result.  See quotations of errata #16 and #28 from
12948
       "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12949
       in mips.md for details.
12950
 
12951
   [2] A similar bug to [1] exists for all revisions of the
12952
       R4000 and the R4400 when run in an MC configuration.
12953
       From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
12954
 
12955
       "19. In this following sequence:
12956
 
12957
                    ddiv                (or ddivu or div or divu)
12958
                    dsll32              (or dsrl32, dsra32)
12959
 
12960
            if an MPT stall occurs, while the divide is slipping the cpu
12961
            pipeline, then the following double shift would end up with an
12962
            incorrect result.
12963
 
12964
            Workaround: The compiler needs to avoid generating any
12965
            sequence with divide followed by extended double shift."
12966
 
12967
       This erratum is also present in "MIPS R4400MC Errata, Processor
12968
       Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
12969
       & 3.0" as errata #10 and #4, respectively.
12970
 
12971
   [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
12972
       (also valid for MIPS R4000MC processors):
12973
 
12974
       "52. R4000SC: This bug does not apply for the R4000PC.
12975
 
12976
            There are two flavors of this bug:
12977
 
12978
            1) If the instruction just after divide takes an RF exception
12979
               (tlb-refill, tlb-invalid) and gets an instruction cache
12980
               miss (both primary and secondary) and the line which is
12981
               currently in secondary cache at this index had the first
12982
               data word, where the bits 5..2 are set, then R4000 would
12983
               get a wrong result for the div.
12984
 
12985
            ##1
12986
                    nop
12987
                    div r8, r9
12988
                    -------------------         # end-of page. -tlb-refill
12989
                    nop
12990
            ##2
12991
                    nop
12992
                    div r8, r9
12993
                    -------------------         # end-of page. -tlb-invalid
12994
                    nop
12995
 
12996
            2) If the divide is in the taken branch delay slot, where the
12997
               target takes RF exception and gets an I-cache miss for the
12998
               exception vector or where I-cache miss occurs for the
12999
               target address, under the above mentioned scenarios, the
13000
               div would get wrong results.
13001
 
13002
            ##1
13003
                    j   r2              # to next page mapped or unmapped
13004
                    div r8,r9           # this bug would be there as long
13005
                                        # as there is an ICache miss and
13006
                    nop                 # the "data pattern" is present
13007
 
13008
            ##2
13009
                    beq r0, r0, NextPage        # to Next page
13010
                    div r8,r9
13011
                    nop
13012
 
13013
            This bug is present for div, divu, ddiv, and ddivu
13014
            instructions.
13015
 
13016
            Workaround: For item 1), OS could make sure that the next page
13017
            after the divide instruction is also mapped.  For item 2), the
13018
            compiler could make sure that the divide instruction is not in
13019
            the branch delay slot."
13020
 
13021
       These processors have PRId values of 0x00004220 and 0x00004300 for
13022
       the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
13023
 
13024
const char *
13025
mips_output_division (const char *division, rtx *operands)
13026
{
13027
  const char *s;
13028
 
13029
  s = division;
13030
  if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
13031
    {
13032
      output_asm_insn (s, operands);
13033
      s = "nop";
13034
    }
13035
  if (TARGET_CHECK_ZERO_DIV)
13036
    {
13037
      if (TARGET_MIPS16)
13038
        {
13039
          output_asm_insn (s, operands);
13040
          s = "bnez\t%2,1f\n\tbreak\t7\n1:";
13041
        }
13042
      else if (GENERATE_DIVIDE_TRAPS)
13043
        {
13044
          /* Avoid long replay penalty on load miss by putting the trap before
13045
             the divide.  */
13046
          if (TUNE_74K)
13047
            output_asm_insn ("teq\t%2,%.,7", operands);
13048
          else
13049
            {
13050
              output_asm_insn (s, operands);
13051
              s = "teq\t%2,%.,7";
13052
            }
13053
        }
13054
      else
13055
        {
13056
          output_asm_insn ("%(bne\t%2,%.,1f", operands);
13057
          output_asm_insn (s, operands);
13058
          s = "break\t7%)\n1:";
13059
        }
13060
    }
13061
  return s;
13062
}
13063
 
13064
/* Return true if IN_INSN is a multiply-add or multiply-subtract
13065
   instruction and if OUT_INSN assigns to the accumulator operand.  */
13066
 
13067
bool
13068
mips_linked_madd_p (rtx out_insn, rtx in_insn)
13069
{
13070
  enum attr_accum_in accum_in;
13071
  int accum_in_opnum;
13072
  rtx accum_in_op;
13073
 
13074
  if (recog_memoized (in_insn) < 0)
13075
    return false;
13076
 
13077
  accum_in = get_attr_accum_in (in_insn);
13078
  if (accum_in == ACCUM_IN_NONE)
13079
    return false;
13080
 
13081
  accum_in_opnum = accum_in - ACCUM_IN_0;
13082
 
13083
  extract_insn (in_insn);
13084
  gcc_assert (accum_in_opnum < recog_data.n_operands);
13085
  accum_in_op = recog_data.operand[accum_in_opnum];
13086
 
13087
  return reg_set_p (accum_in_op, out_insn);
13088
}
13089
 
13090
/* True if the dependency between OUT_INSN and IN_INSN is on the store
13091
   data rather than the address.  We need this because the cprestore
13092
   pattern is type "store", but is defined using an UNSPEC_VOLATILE,
13093
   which causes the default routine to abort.  We just return false
13094
   for that case.  */
13095
 
13096
bool
13097
mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
13098
{
13099
  if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
13100
    return false;
13101
 
13102
  return !store_data_bypass_p (out_insn, in_insn);
13103
}
13104
 
13105
 
13106
/* Variables and flags used in scheduler hooks when tuning for
13107
   Loongson 2E/2F.  */
13108
static struct
13109
{
13110
  /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
13111
     strategy.  */
13112
 
13113
  /* If true, then next ALU1/2 instruction will go to ALU1.  */
13114
  bool alu1_turn_p;
13115
 
13116
  /* If true, then next FALU1/2 unstruction will go to FALU1.  */
13117
  bool falu1_turn_p;
13118
 
13119
  /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
13120
  int alu1_core_unit_code;
13121
  int alu2_core_unit_code;
13122
  int falu1_core_unit_code;
13123
  int falu2_core_unit_code;
13124
 
13125
  /* True if current cycle has a multi instruction.
13126
     This flag is used in mips_ls2_dfa_post_advance_cycle.  */
13127
  bool cycle_has_multi_p;
13128
 
13129
  /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
13130
     These are used in mips_ls2_dfa_post_advance_cycle to initialize
13131
     DFA state.
13132
     E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
13133
     instruction to go ALU1.  */
13134
  rtx alu1_turn_enabled_insn;
13135
  rtx alu2_turn_enabled_insn;
13136
  rtx falu1_turn_enabled_insn;
13137
  rtx falu2_turn_enabled_insn;
13138
} mips_ls2;
13139
 
13140
/* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
13141
   dependencies have no cost, except on the 20Kc where output-dependence
13142
   is treated like input-dependence.  */
13143
 
13144
static int
13145
mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
13146
                  rtx dep ATTRIBUTE_UNUSED, int cost)
13147
{
13148
  if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
13149
      && TUNE_20KC)
13150
    return cost;
13151
  if (REG_NOTE_KIND (link) != 0)
13152
    return 0;
13153
  return cost;
13154
}
13155
 
13156
/* Return the number of instructions that can be issued per cycle.  */
13157
 
13158
static int
13159
mips_issue_rate (void)
13160
{
13161
  switch (mips_tune)
13162
    {
13163
    case PROCESSOR_74KC:
13164
    case PROCESSOR_74KF2_1:
13165
    case PROCESSOR_74KF1_1:
13166
    case PROCESSOR_74KF3_2:
13167
      /* The 74k is not strictly quad-issue cpu, but can be seen as one
13168
         by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
13169
         but in reality only a maximum of 3 insns can be issued as
13170
         floating-point loads and stores also require a slot in the
13171
         AGEN pipe.  */
13172
    case PROCESSOR_R10000:
13173
      /* All R10K Processors are quad-issue (being the first MIPS
13174
         processors to support this feature). */
13175
      return 4;
13176
 
13177
    case PROCESSOR_20KC:
13178
    case PROCESSOR_R4130:
13179
    case PROCESSOR_R5400:
13180
    case PROCESSOR_R5500:
13181
    case PROCESSOR_R5900:
13182
    case PROCESSOR_R7000:
13183
    case PROCESSOR_R9000:
13184
    case PROCESSOR_OCTEON:
13185
    case PROCESSOR_OCTEON2:
13186
      return 2;
13187
 
13188
    case PROCESSOR_SB1:
13189
    case PROCESSOR_SB1A:
13190
      /* This is actually 4, but we get better performance if we claim 3.
13191
         This is partly because of unwanted speculative code motion with the
13192
         larger number, and partly because in most common cases we can't
13193
         reach the theoretical max of 4.  */
13194
      return 3;
13195
 
13196
    case PROCESSOR_LOONGSON_2E:
13197
    case PROCESSOR_LOONGSON_2F:
13198
    case PROCESSOR_LOONGSON_3A:
13199
      return 4;
13200
 
13201
    case PROCESSOR_XLP:
13202
      return (reload_completed ? 4 : 3);
13203
 
13204
    default:
13205
      return 1;
13206
    }
13207
}
13208
 
13209
/* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
13210
 
13211
static void
13212
mips_ls2_init_dfa_post_cycle_insn (void)
13213
{
13214
  start_sequence ();
13215
  emit_insn (gen_ls2_alu1_turn_enabled_insn ());
13216
  mips_ls2.alu1_turn_enabled_insn = get_insns ();
13217
  end_sequence ();
13218
 
13219
  start_sequence ();
13220
  emit_insn (gen_ls2_alu2_turn_enabled_insn ());
13221
  mips_ls2.alu2_turn_enabled_insn = get_insns ();
13222
  end_sequence ();
13223
 
13224
  start_sequence ();
13225
  emit_insn (gen_ls2_falu1_turn_enabled_insn ());
13226
  mips_ls2.falu1_turn_enabled_insn = get_insns ();
13227
  end_sequence ();
13228
 
13229
  start_sequence ();
13230
  emit_insn (gen_ls2_falu2_turn_enabled_insn ());
13231
  mips_ls2.falu2_turn_enabled_insn = get_insns ();
13232
  end_sequence ();
13233
 
13234
  mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
13235
  mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
13236
  mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
13237
  mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
13238
}
13239
 
13240
/* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
13241
   Init data used in mips_dfa_post_advance_cycle.  */
13242
 
13243
static void
13244
mips_init_dfa_post_cycle_insn (void)
13245
{
13246
  if (TUNE_LOONGSON_2EF)
13247
    mips_ls2_init_dfa_post_cycle_insn ();
13248
}
13249
 
13250
/* Initialize STATE when scheduling for Loongson 2E/2F.
13251
   Support round-robin dispatch scheme by enabling only one of
13252
   ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
13253
   respectively.  */
13254
 
13255
static void
13256
mips_ls2_dfa_post_advance_cycle (state_t state)
13257
{
13258
  if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
13259
    {
13260
      /* Though there are no non-pipelined ALU1 insns,
13261
         we can get an instruction of type 'multi' before reload.  */
13262
      gcc_assert (mips_ls2.cycle_has_multi_p);
13263
      mips_ls2.alu1_turn_p = false;
13264
    }
13265
 
13266
  mips_ls2.cycle_has_multi_p = false;
13267
 
13268
  if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
13269
    /* We have a non-pipelined alu instruction in the core,
13270
       adjust round-robin counter.  */
13271
    mips_ls2.alu1_turn_p = true;
13272
 
13273
  if (mips_ls2.alu1_turn_p)
13274
    {
13275
      if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
13276
        gcc_unreachable ();
13277
    }
13278
  else
13279
    {
13280
      if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
13281
        gcc_unreachable ();
13282
    }
13283
 
13284
  if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
13285
    {
13286
      /* There are no non-pipelined FALU1 insns.  */
13287
      gcc_unreachable ();
13288
      mips_ls2.falu1_turn_p = false;
13289
    }
13290
 
13291
  if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
13292
    /* We have a non-pipelined falu instruction in the core,
13293
       adjust round-robin counter.  */
13294
    mips_ls2.falu1_turn_p = true;
13295
 
13296
  if (mips_ls2.falu1_turn_p)
13297
    {
13298
      if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
13299
        gcc_unreachable ();
13300
    }
13301
  else
13302
    {
13303
      if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
13304
        gcc_unreachable ();
13305
    }
13306
}
13307
 
13308
/* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
13309
   This hook is being called at the start of each cycle.  */
13310
 
13311
static void
13312
mips_dfa_post_advance_cycle (void)
13313
{
13314
  if (TUNE_LOONGSON_2EF)
13315
    mips_ls2_dfa_post_advance_cycle (curr_state);
13316
}
13317
 
13318
/* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
13319
   be as wide as the scheduling freedom in the DFA.  */
13320
 
13321
static int
13322
mips_multipass_dfa_lookahead (void)
13323
{
13324
  /* Can schedule up to 4 of the 6 function units in any one cycle.  */
13325
  if (TUNE_SB1)
13326
    return 4;
13327
 
13328
  if (TUNE_LOONGSON_2EF || TUNE_LOONGSON_3A)
13329
    return 4;
13330
 
13331
  if (TUNE_OCTEON)
13332
    return 2;
13333
 
13334
  return 0;
13335
}
13336
 
13337
/* Remove the instruction at index LOWER from ready queue READY and
13338
   reinsert it in front of the instruction at index HIGHER.  LOWER must
13339
   be <= HIGHER.  */
13340
 
13341
static void
13342
mips_promote_ready (rtx *ready, int lower, int higher)
13343
{
13344
  rtx new_head;
13345
  int i;
13346
 
13347
  new_head = ready[lower];
13348
  for (i = lower; i < higher; i++)
13349
    ready[i] = ready[i + 1];
13350
  ready[i] = new_head;
13351
}
13352
 
13353
/* If the priority of the instruction at POS2 in the ready queue READY
13354
   is within LIMIT units of that of the instruction at POS1, swap the
13355
   instructions if POS2 is not already less than POS1.  */
13356
 
13357
static void
13358
mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
13359
{
13360
  if (pos1 < pos2
13361
      && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
13362
    {
13363
      rtx temp;
13364
 
13365
      temp = ready[pos1];
13366
      ready[pos1] = ready[pos2];
13367
      ready[pos2] = temp;
13368
    }
13369
}
13370
 
13371
/* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
13372
   that may clobber hi or lo.  */
13373
static rtx mips_macc_chains_last_hilo;
13374
 
13375
/* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
13376
   been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
13377
 
13378
static void
13379
mips_macc_chains_record (rtx insn)
13380
{
13381
  if (get_attr_may_clobber_hilo (insn))
13382
    mips_macc_chains_last_hilo = insn;
13383
}
13384
 
13385
/* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
13386
   has NREADY elements, looking for a multiply-add or multiply-subtract
13387
   instruction that is cumulative with mips_macc_chains_last_hilo.
13388
   If there is one, promote it ahead of anything else that might
13389
   clobber hi or lo.  */
13390
 
13391
static void
13392
mips_macc_chains_reorder (rtx *ready, int nready)
13393
{
13394
  int i, j;
13395
 
13396
  if (mips_macc_chains_last_hilo != 0)
13397
    for (i = nready - 1; i >= 0; i--)
13398
      if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
13399
        {
13400
          for (j = nready - 1; j > i; j--)
13401
            if (recog_memoized (ready[j]) >= 0
13402
                && get_attr_may_clobber_hilo (ready[j]))
13403
              {
13404
                mips_promote_ready (ready, i, j);
13405
                break;
13406
              }
13407
          break;
13408
        }
13409
}
13410
 
13411
/* The last instruction to be scheduled.  */
13412
static rtx vr4130_last_insn;
13413
 
13414
/* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
13415
   points to an rtx that is initially an instruction.  Nullify the rtx
13416
   if the instruction uses the value of register X.  */
13417
 
13418
static void
13419
vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13420
                                void *data)
13421
{
13422
  rtx *insn_ptr;
13423
 
13424
  insn_ptr = (rtx *) data;
13425
  if (REG_P (x)
13426
      && *insn_ptr != 0
13427
      && reg_referenced_p (x, PATTERN (*insn_ptr)))
13428
    *insn_ptr = 0;
13429
}
13430
 
13431
/* Return true if there is true register dependence between vr4130_last_insn
13432
   and INSN.  */
13433
 
13434
static bool
13435
vr4130_true_reg_dependence_p (rtx insn)
13436
{
13437
  note_stores (PATTERN (vr4130_last_insn),
13438
               vr4130_true_reg_dependence_p_1, &insn);
13439
  return insn == 0;
13440
}
13441
 
13442
/* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
13443
   the ready queue and that INSN2 is the instruction after it, return
13444
   true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
13445
   in which INSN1 and INSN2 can probably issue in parallel, but for
13446
   which (INSN2, INSN1) should be less sensitive to instruction
13447
   alignment than (INSN1, INSN2).  See 4130.md for more details.  */
13448
 
13449
static bool
13450
vr4130_swap_insns_p (rtx insn1, rtx insn2)
13451
{
13452
  sd_iterator_def sd_it;
13453
  dep_t dep;
13454
 
13455
  /* Check for the following case:
13456
 
13457
     1) there is some other instruction X with an anti dependence on INSN1;
13458
     2) X has a higher priority than INSN2; and
13459
     3) X is an arithmetic instruction (and thus has no unit restrictions).
13460
 
13461
     If INSN1 is the last instruction blocking X, it would better to
13462
     choose (INSN1, X) over (INSN2, INSN1).  */
13463
  FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
13464
    if (DEP_TYPE (dep) == REG_DEP_ANTI
13465
        && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
13466
        && recog_memoized (DEP_CON (dep)) >= 0
13467
        && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
13468
      return false;
13469
 
13470
  if (vr4130_last_insn != 0
13471
      && recog_memoized (insn1) >= 0
13472
      && recog_memoized (insn2) >= 0)
13473
    {
13474
      /* See whether INSN1 and INSN2 use different execution units,
13475
         or if they are both ALU-type instructions.  If so, they can
13476
         probably execute in parallel.  */
13477
      enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
13478
      enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
13479
      if (class1 != class2 || class1 == VR4130_CLASS_ALU)
13480
        {
13481
          /* If only one of the instructions has a dependence on
13482
             vr4130_last_insn, prefer to schedule the other one first.  */
13483
          bool dep1_p = vr4130_true_reg_dependence_p (insn1);
13484
          bool dep2_p = vr4130_true_reg_dependence_p (insn2);
13485
          if (dep1_p != dep2_p)
13486
            return dep1_p;
13487
 
13488
          /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
13489
             is not an ALU-type instruction and if INSN1 uses the same
13490
             execution unit.  (Note that if this condition holds, we already
13491
             know that INSN2 uses a different execution unit.)  */
13492
          if (class1 != VR4130_CLASS_ALU
13493
              && recog_memoized (vr4130_last_insn) >= 0
13494
              && class1 == get_attr_vr4130_class (vr4130_last_insn))
13495
            return true;
13496
        }
13497
    }
13498
  return false;
13499
}
13500
 
13501
/* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
13502
   queue with at least two instructions.  Swap the first two if
13503
   vr4130_swap_insns_p says that it could be worthwhile.  */
13504
 
13505
static void
13506
vr4130_reorder (rtx *ready, int nready)
13507
{
13508
  if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
13509
    mips_promote_ready (ready, nready - 2, nready - 1);
13510
}
13511
 
13512
/* Record whether last 74k AGEN instruction was a load or store.  */
13513
static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
13514
 
13515
/* Initialize mips_last_74k_agen_insn from INSN.  A null argument
13516
   resets to TYPE_UNKNOWN state.  */
13517
 
13518
static void
13519
mips_74k_agen_init (rtx insn)
13520
{
13521
  if (!insn || CALL_P (insn) || JUMP_P (insn))
13522
    mips_last_74k_agen_insn = TYPE_UNKNOWN;
13523
  else
13524
    {
13525
      enum attr_type type = get_attr_type (insn);
13526
      if (type == TYPE_LOAD || type == TYPE_STORE)
13527
        mips_last_74k_agen_insn = type;
13528
    }
13529
}
13530
 
13531
/* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
13532
   loads to be grouped together, and multiple stores to be grouped
13533
   together.  Swap things around in the ready queue to make this happen.  */
13534
 
13535
static void
13536
mips_74k_agen_reorder (rtx *ready, int nready)
13537
{
13538
  int i;
13539
  int store_pos, load_pos;
13540
 
13541
  store_pos = -1;
13542
  load_pos = -1;
13543
 
13544
  for (i = nready - 1; i >= 0; i--)
13545
    {
13546
      rtx insn = ready[i];
13547
      if (USEFUL_INSN_P (insn))
13548
        switch (get_attr_type (insn))
13549
          {
13550
          case TYPE_STORE:
13551
            if (store_pos == -1)
13552
              store_pos = i;
13553
            break;
13554
 
13555
          case TYPE_LOAD:
13556
            if (load_pos == -1)
13557
              load_pos = i;
13558
            break;
13559
 
13560
          default:
13561
            break;
13562
          }
13563
    }
13564
 
13565
  if (load_pos == -1 || store_pos == -1)
13566
    return;
13567
 
13568
  switch (mips_last_74k_agen_insn)
13569
    {
13570
    case TYPE_UNKNOWN:
13571
      /* Prefer to schedule loads since they have a higher latency.  */
13572
    case TYPE_LOAD:
13573
      /* Swap loads to the front of the queue.  */
13574
      mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
13575
      break;
13576
    case TYPE_STORE:
13577
      /* Swap stores to the front of the queue.  */
13578
      mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
13579
      break;
13580
    default:
13581
      break;
13582
    }
13583
}
13584
 
13585
/* Implement TARGET_SCHED_INIT.  */
13586
 
13587
static void
13588
mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13589
                 int max_ready ATTRIBUTE_UNUSED)
13590
{
13591
  mips_macc_chains_last_hilo = 0;
13592
  vr4130_last_insn = 0;
13593
  mips_74k_agen_init (NULL_RTX);
13594
 
13595
  /* When scheduling for Loongson2, branch instructions go to ALU1,
13596
     therefore basic block is most likely to start with round-robin counter
13597
     pointed to ALU2.  */
13598
  mips_ls2.alu1_turn_p = false;
13599
  mips_ls2.falu1_turn_p = true;
13600
}
13601
 
13602
/* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
13603
 
13604
static void
13605
mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13606
                      rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13607
{
13608
  if (!reload_completed
13609
      && TUNE_MACC_CHAINS
13610
      && *nreadyp > 0)
13611
    mips_macc_chains_reorder (ready, *nreadyp);
13612
 
13613
  if (reload_completed
13614
      && TUNE_MIPS4130
13615
      && !TARGET_VR4130_ALIGN
13616
      && *nreadyp > 1)
13617
    vr4130_reorder (ready, *nreadyp);
13618
 
13619
  if (TUNE_74K)
13620
    mips_74k_agen_reorder (ready, *nreadyp);
13621
}
13622
 
13623
/* Implement TARGET_SCHED_REORDER.  */
13624
 
13625
static int
13626
mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13627
                    rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13628
{
13629
  mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13630
  return mips_issue_rate ();
13631
}
13632
 
13633
/* Implement TARGET_SCHED_REORDER2.  */
13634
 
13635
static int
13636
mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13637
                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
13638
{
13639
  mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
13640
  return cached_can_issue_more;
13641
}
13642
 
13643
/* Update round-robin counters for ALU1/2 and FALU1/2.  */
13644
 
13645
static void
13646
mips_ls2_variable_issue (rtx insn)
13647
{
13648
  if (mips_ls2.alu1_turn_p)
13649
    {
13650
      if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
13651
        mips_ls2.alu1_turn_p = false;
13652
    }
13653
  else
13654
    {
13655
      if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
13656
        mips_ls2.alu1_turn_p = true;
13657
    }
13658
 
13659
  if (mips_ls2.falu1_turn_p)
13660
    {
13661
      if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
13662
        mips_ls2.falu1_turn_p = false;
13663
    }
13664
  else
13665
    {
13666
      if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
13667
        mips_ls2.falu1_turn_p = true;
13668
    }
13669
 
13670
  if (recog_memoized (insn) >= 0)
13671
    mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
13672
}
13673
 
13674
/* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
13675
 
13676
static int
13677
mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
13678
                     rtx insn, int more)
13679
{
13680
  /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
13681
  if (USEFUL_INSN_P (insn))
13682
    {
13683
      if (get_attr_type (insn) != TYPE_GHOST)
13684
        more--;
13685
      if (!reload_completed && TUNE_MACC_CHAINS)
13686
        mips_macc_chains_record (insn);
13687
      vr4130_last_insn = insn;
13688
      if (TUNE_74K)
13689
        mips_74k_agen_init (insn);
13690
      else if (TUNE_LOONGSON_2EF)
13691
        mips_ls2_variable_issue (insn);
13692
    }
13693
 
13694
  /* Instructions of type 'multi' should all be split before
13695
     the second scheduling pass.  */
13696
  gcc_assert (!reload_completed
13697
              || recog_memoized (insn) < 0
13698
              || get_attr_type (insn) != TYPE_MULTI);
13699
 
13700
  cached_can_issue_more = more;
13701
  return more;
13702
}
13703
 
13704
/* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
13705
   return the first operand of the associated PREF or PREFX insn.  */
13706
 
13707
rtx
13708
mips_prefetch_cookie (rtx write, rtx locality)
13709
{
13710
  /* store_streamed / load_streamed.  */
13711
  if (INTVAL (locality) <= 0)
13712
    return GEN_INT (INTVAL (write) + 4);
13713
 
13714
  /* store / load.  */
13715
  if (INTVAL (locality) <= 2)
13716
    return write;
13717
 
13718
  /* store_retained / load_retained.  */
13719
  return GEN_INT (INTVAL (write) + 6);
13720
}
13721
 
13722
/* Flags that indicate when a built-in function is available.
13723
 
13724
   BUILTIN_AVAIL_NON_MIPS16
13725
        The function is available on the current target if !TARGET_MIPS16.
13726
 
13727
   BUILTIN_AVAIL_MIPS16
13728
        The function is available on the current target if TARGET_MIPS16.  */
13729
#define BUILTIN_AVAIL_NON_MIPS16 1
13730
#define BUILTIN_AVAIL_MIPS16 2
13731
 
13732
/* Declare an availability predicate for built-in functions that
13733
   require non-MIPS16 mode and also require COND to be true.
13734
   NAME is the main part of the predicate's name.  */
13735
#define AVAIL_NON_MIPS16(NAME, COND)                                    \
13736
 static unsigned int                                                    \
13737
 mips_builtin_avail_##NAME (void)                                       \
13738
 {                                                                      \
13739
   return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                 \
13740
 }
13741
 
13742
/* Declare an availability predicate for built-in functions that
13743
   support both MIPS16 and non-MIPS16 code and also require COND
13744
   to be true.  NAME is the main part of the predicate's name.  */
13745
#define AVAIL_ALL(NAME, COND)                                           \
13746
 static unsigned int                                                    \
13747
 mips_builtin_avail_##NAME (void)                                       \
13748
 {                                                                      \
13749
   return (COND) ? BUILTIN_AVAIL_NON_MIPS16 | BUILTIN_AVAIL_MIPS16 : 0;  \
13750
 }
13751
 
13752
/* This structure describes a single built-in function.  */
13753
struct mips_builtin_description {
13754
  /* The code of the main .md file instruction.  See mips_builtin_type
13755
     for more information.  */
13756
  enum insn_code icode;
13757
 
13758
  /* The floating-point comparison code to use with ICODE, if any.  */
13759
  enum mips_fp_condition cond;
13760
 
13761
  /* The name of the built-in function.  */
13762
  const char *name;
13763
 
13764
  /* Specifies how the function should be expanded.  */
13765
  enum mips_builtin_type builtin_type;
13766
 
13767
  /* The function's prototype.  */
13768
  enum mips_function_type function_type;
13769
 
13770
  /* Whether the function is available.  */
13771
  unsigned int (*avail) (void);
13772
};
13773
 
13774
AVAIL_ALL (hard_float, TARGET_HARD_FLOAT_ABI)
13775
AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
13776
AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
13777
AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
13778
AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
13779
AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
13780
AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
13781
AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
13782
AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
13783
AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
13784
AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
13785
 
13786
/* Construct a mips_builtin_description from the given arguments.
13787
 
13788
   INSN is the name of the associated instruction pattern, without the
13789
   leading CODE_FOR_mips_.
13790
 
13791
   CODE is the floating-point condition code associated with the
13792
   function.  It can be 'f' if the field is not applicable.
13793
 
13794
   NAME is the name of the function itself, without the leading
13795
   "__builtin_mips_".
13796
 
13797
   BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
13798
 
13799
   AVAIL is the name of the availability predicate, without the leading
13800
   mips_builtin_avail_.  */
13801
#define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
13802
                     FUNCTION_TYPE, AVAIL)                              \
13803
  { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
13804
    "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
13805
    mips_builtin_avail_ ## AVAIL }
13806
 
13807
/* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
13808
   mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
13809
   are as for MIPS_BUILTIN.  */
13810
#define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
13811
  MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
13812
 
13813
/* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
13814
   are subject to mips_builtin_avail_<AVAIL>.  */
13815
#define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
13816
  MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
13817
                MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
13818
  MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
13819
                MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
13820
 
13821
/* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
13822
   The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
13823
   while the any and all forms are subject to mips_builtin_avail_mips3d.  */
13824
#define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
13825
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
13826
                MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
13827
                mips3d),                                                \
13828
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
13829
                MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
13830
                mips3d),                                                \
13831
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
13832
                MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
13833
                AVAIL),                                                 \
13834
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
13835
                MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
13836
                AVAIL)
13837
 
13838
/* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
13839
   are subject to mips_builtin_avail_mips3d.  */
13840
#define CMP_4S_BUILTINS(INSN, COND)                                     \
13841
  MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
13842
                MIPS_BUILTIN_CMP_ANY,                                   \
13843
                MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
13844
  MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
13845
                MIPS_BUILTIN_CMP_ALL,                                   \
13846
                MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
13847
 
13848
/* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
13849
   instruction requires mips_builtin_avail_<AVAIL>.  */
13850
#define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
13851
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
13852
                MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13853
                AVAIL),                                                 \
13854
  MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
13855
                MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
13856
                AVAIL)
13857
 
13858
/* Define all the built-in functions related to C.cond.fmt condition COND.  */
13859
#define CMP_BUILTINS(COND)                                              \
13860
  MOVTF_BUILTINS (c, COND, paired_single),                              \
13861
  MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
13862
  CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
13863
  CMP_PS_BUILTINS (c, COND, paired_single),                             \
13864
  CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
13865
  CMP_4S_BUILTINS (c, COND),                                            \
13866
  CMP_4S_BUILTINS (cabs, COND)
13867
 
13868
/* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
13869
   function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
13870
   and AVAIL are as for MIPS_BUILTIN.  */
13871
#define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
13872
  MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
13873
                FUNCTION_TYPE, AVAIL)
13874
 
13875
/* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
13876
   branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
13877
#define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
13878
  MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
13879
                MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
13880
 
13881
/* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
13882
   for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
13883
   builtin_description field.  */
13884
#define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
13885
  { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
13886
    "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
13887
    FUNCTION_TYPE, mips_builtin_avail_loongson }
13888
 
13889
/* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
13890
   for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
13891
   builtin_description field.  */
13892
#define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
13893
  LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
13894
 
13895
/* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
13896
   We use functions of this form when the same insn can be usefully applied
13897
   to more than one datatype.  */
13898
#define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
13899
  LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
13900
 
13901
#define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
13902
#define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
13903
#define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
13904
#define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
13905
#define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
13906
#define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
13907
#define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
13908
#define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
13909
 
13910
#define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
13911
#define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
13912
#define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
13913
#define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
13914
#define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
13915
#define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
13916
#define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
13917
#define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
13918
#define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
13919
#define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
13920
#define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
13921
#define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
13922
#define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
13923
#define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
13924
#define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
13925
#define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
13926
#define CODE_FOR_loongson_pmullh CODE_FOR_mulv4hi3
13927
#define CODE_FOR_loongson_psllh CODE_FOR_ashlv4hi3
13928
#define CODE_FOR_loongson_psllw CODE_FOR_ashlv2si3
13929
#define CODE_FOR_loongson_psrlh CODE_FOR_lshrv4hi3
13930
#define CODE_FOR_loongson_psrlw CODE_FOR_lshrv2si3
13931
#define CODE_FOR_loongson_psrah CODE_FOR_ashrv4hi3
13932
#define CODE_FOR_loongson_psraw CODE_FOR_ashrv2si3
13933
#define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
13934
#define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
13935
#define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
13936
#define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
13937
#define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
13938
#define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
13939
#define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
13940
 
13941
static const struct mips_builtin_description mips_builtins[] = {
13942
#define MIPS_GET_FCSR 0
13943
  DIRECT_BUILTIN (get_fcsr, MIPS_USI_FTYPE_VOID, hard_float),
13944
#define MIPS_SET_FCSR 1
13945
  DIRECT_NO_TARGET_BUILTIN (set_fcsr, MIPS_VOID_FTYPE_USI, hard_float),
13946
 
13947
  DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13948
  DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13949
  DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13950
  DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
13951
  DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
13952
  DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
13953
  DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
13954
  DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
13955
 
13956
  DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
13957
  DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13958
  DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13959
  DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13960
  DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
13961
 
13962
  DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
13963
  DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
13964
  DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13965
  DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13966
  DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13967
  DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13968
 
13969
  DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
13970
  DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
13971
  DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
13972
  DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
13973
  DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
13974
  DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
13975
 
13976
  MIPS_FP_CONDITIONS (CMP_BUILTINS),
13977
 
13978
  /* Built-in functions for the SB-1 processor.  */
13979
  DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
13980
 
13981
  /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
13982
  DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13983
  DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13984
  DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13985
  DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13986
  DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13987
  DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13988
  DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
13989
  DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
13990
  DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13991
  DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
13992
  DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
13993
  DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
13994
  DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
13995
  DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
13996
  DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
13997
  DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
13998
  DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
13999
  DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14000
  DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
14001
  DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
14002
  DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
14003
  DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
14004
  DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14005
  DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14006
  DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14007
  DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14008
  DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
14009
  DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
14010
  DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
14011
  DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
14012
  DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14013
  DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14014
  DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14015
  DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
14016
  DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
14017
  DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14018
  DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
14019
  DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
14020
  DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14021
  DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
14022
  DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14023
  DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14024
  DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
14025
  DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
14026
  DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
14027
  DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
14028
  DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
14029
  DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14030
  DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14031
  DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
14032
  DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14033
  DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14034
  DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
14035
  DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14036
  DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14037
  DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
14038
  DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
14039
  DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14040
  DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
14041
  DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
14042
  DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
14043
  DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
14044
  DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14045
  DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
14046
  BPOSGE_BUILTIN (32, dsp),
14047
 
14048
  /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
14049
  DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
14050
  DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14051
  DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14052
  DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14053
  DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14054
  DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14055
  DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14056
  DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14057
  DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14058
  DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
14059
  DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14060
  DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14061
  DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14062
  DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14063
  DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14064
  DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
14065
  DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14066
  DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
14067
  DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
14068
  DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14069
  DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
14070
  DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
14071
  DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14072
  DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14073
  DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14074
  DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
14075
  DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14076
  DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14077
  DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14078
  DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14079
  DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14080
  DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
14081
  DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14082
  DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
14083
 
14084
  /* Built-in functions for the DSP ASE (32-bit only).  */
14085
  DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14086
  DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14087
  DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14088
  DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
14089
  DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14090
  DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14091
  DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14092
  DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14093
  DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14094
  DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14095
  DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14096
  DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14097
  DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
14098
  DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14099
  DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14100
  DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
14101
  DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
14102
  DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14103
  DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
14104
  DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
14105
  DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
14106
  DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14107
  DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14108
  DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
14109
  DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
14110
  DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
14111
  DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
14112
 
14113
  /* Built-in functions for the DSP ASE (64-bit only).  */
14114
  DIRECT_BUILTIN (ldx, MIPS_DI_FTYPE_POINTER_SI, dsp_64),
14115
 
14116
  /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
14117
  DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14118
  DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14119
  DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14120
  DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14121
  DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14122
  DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14123
  DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14124
  DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14125
  DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
14126
 
14127
  /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
14128
  LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
14129
  LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
14130
  LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
14131
  LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14132
  LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14133
  LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14134
  LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14135
  LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14136
  LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14137
  LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
14138
  LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
14139
  LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14140
  LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14141
  LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14142
  LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14143
  LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
14144
  LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14145
  LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14146
  LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14147
  LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
14148
  LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
14149
  LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14150
  LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14151
  LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14152
  LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14153
  LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14154
  LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14155
  LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14156
  LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14157
  LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14158
  LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14159
  LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14160
  LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14161
  LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14162
  LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14163
  LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14164
  LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14165
  LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
14166
  LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
14167
  LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14168
  LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14169
  LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14170
  LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14171
  LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14172
  LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14173
  LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14174
  LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14175
  LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
14176
  LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14177
  LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14178
  LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14179
  LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14180
  LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
14181
  LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
14182
  LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14183
  LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14184
  LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14185
  LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
14186
  LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14187
  LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
14188
  LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
14189
  LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14190
  LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14191
  LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14192
  LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14193
  LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14194
  LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14195
  LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14196
  LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14197
  LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14198
  LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14199
  LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
14200
  LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
14201
  LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
14202
  LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
14203
  LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14204
  LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14205
  LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14206
  LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14207
  LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14208
  LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14209
  LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
14210
  LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
14211
  LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
14212
  LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
14213
  LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14214
  LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14215
  LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14216
  LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14217
  LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14218
  LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14219
  LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14220
  LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14221
  LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
14222
  LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
14223
  LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
14224
  LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
14225
  LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
14226
  LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
14227
 
14228
  /* Sundry other built-in functions.  */
14229
  DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
14230
};
14231
 
14232
/* Index I is the function declaration for mips_builtins[I], or null if the
14233
   function isn't defined on this target.  */
14234
static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
14235
 
14236
/* MODE is a vector mode whose elements have type TYPE.  Return the type
14237
   of the vector itself.  */
14238
 
14239
static tree
14240
mips_builtin_vector_type (tree type, enum machine_mode mode)
14241
{
14242
  static tree types[2 * (int) MAX_MACHINE_MODE];
14243
  int mode_index;
14244
 
14245
  mode_index = (int) mode;
14246
 
14247
  if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
14248
    mode_index += MAX_MACHINE_MODE;
14249
 
14250
  if (types[mode_index] == NULL_TREE)
14251
    types[mode_index] = build_vector_type_for_mode (type, mode);
14252
  return types[mode_index];
14253
}
14254
 
14255
/* Return a type for 'const volatile void *'.  */
14256
 
14257
static tree
14258
mips_build_cvpointer_type (void)
14259
{
14260
  static tree cache;
14261
 
14262
  if (cache == NULL_TREE)
14263
    cache = build_pointer_type (build_qualified_type
14264
                                (void_type_node,
14265
                                 TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
14266
  return cache;
14267
}
14268
 
14269
/* Source-level argument types.  */
14270
#define MIPS_ATYPE_VOID void_type_node
14271
#define MIPS_ATYPE_INT integer_type_node
14272
#define MIPS_ATYPE_POINTER ptr_type_node
14273
#define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
14274
 
14275
/* Standard mode-based argument types.  */
14276
#define MIPS_ATYPE_UQI unsigned_intQI_type_node
14277
#define MIPS_ATYPE_SI intSI_type_node
14278
#define MIPS_ATYPE_USI unsigned_intSI_type_node
14279
#define MIPS_ATYPE_DI intDI_type_node
14280
#define MIPS_ATYPE_UDI unsigned_intDI_type_node
14281
#define MIPS_ATYPE_SF float_type_node
14282
#define MIPS_ATYPE_DF double_type_node
14283
 
14284
/* Vector argument types.  */
14285
#define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
14286
#define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
14287
#define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
14288
#define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
14289
#define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
14290
#define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
14291
#define MIPS_ATYPE_UV2SI                                        \
14292
  mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
14293
#define MIPS_ATYPE_UV4HI                                        \
14294
  mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
14295
#define MIPS_ATYPE_UV8QI                                        \
14296
  mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
14297
 
14298
/* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
14299
   their associated MIPS_ATYPEs.  */
14300
#define MIPS_FTYPE_ATYPES1(A, B) \
14301
  MIPS_ATYPE_##A, MIPS_ATYPE_##B
14302
 
14303
#define MIPS_FTYPE_ATYPES2(A, B, C) \
14304
  MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
14305
 
14306
#define MIPS_FTYPE_ATYPES3(A, B, C, D) \
14307
  MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
14308
 
14309
#define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
14310
  MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
14311
  MIPS_ATYPE_##E
14312
 
14313
/* Return the function type associated with function prototype TYPE.  */
14314
 
14315
static tree
14316
mips_build_function_type (enum mips_function_type type)
14317
{
14318
  static tree types[(int) MIPS_MAX_FTYPE_MAX];
14319
 
14320
  if (types[(int) type] == NULL_TREE)
14321
    switch (type)
14322
      {
14323
#define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
14324
  case MIPS_FTYPE_NAME##NUM ARGS:                                       \
14325
    types[(int) type]                                                   \
14326
      = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
14327
                                  NULL_TREE);                           \
14328
    break;
14329
#include "config/mips/mips-ftypes.def"
14330
#undef DEF_MIPS_FTYPE
14331
      default:
14332
        gcc_unreachable ();
14333
      }
14334
 
14335
  return types[(int) type];
14336
}
14337
 
14338
/* Implement TARGET_INIT_BUILTINS.  */
14339
 
14340
static void
14341
mips_init_builtins (void)
14342
{
14343
  const struct mips_builtin_description *d;
14344
  unsigned int i;
14345
 
14346
  /* Iterate through all of the bdesc arrays, initializing all of the
14347
     builtin functions.  */
14348
  for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
14349
    {
14350
      d = &mips_builtins[i];
14351
      if (d->avail ())
14352
        mips_builtin_decls[i]
14353
          = add_builtin_function (d->name,
14354
                                  mips_build_function_type (d->function_type),
14355
                                  i, BUILT_IN_MD, NULL, NULL);
14356
    }
14357
}
14358
 
14359
/* Implement TARGET_BUILTIN_DECL.  */
14360
 
14361
static tree
14362
mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
14363
{
14364
  if (code >= ARRAY_SIZE (mips_builtins))
14365
    return error_mark_node;
14366
  return mips_builtin_decls[code];
14367
}
14368
 
14369
/* Take argument ARGNO from EXP's argument list and convert it into
14370
   an expand operand.  Store the operand in *OP.  */
14371
 
14372
static void
14373
mips_prepare_builtin_arg (struct expand_operand *op, tree exp,
14374
                          unsigned int argno)
14375
{
14376
  tree arg;
14377
  rtx value;
14378
 
14379
  arg = CALL_EXPR_ARG (exp, argno);
14380
  value = expand_normal (arg);
14381
  create_input_operand (op, value, TYPE_MODE (TREE_TYPE (arg)));
14382
}
14383
 
14384
/* Expand instruction ICODE as part of a built-in function sequence.
14385
   Use the first NOPS elements of OPS as the instruction's operands.
14386
   HAS_TARGET_P is true if operand 0 is a target; it is false if the
14387
   instruction has no target.
14388
 
14389
   Return the target rtx if HAS_TARGET_P, otherwise return const0_rtx.  */
14390
 
14391
static rtx
14392
mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
14393
                          struct expand_operand *ops, bool has_target_p)
14394
{
14395
  if (!maybe_expand_insn (icode, nops, ops))
14396
    {
14397
      error ("invalid argument to built-in function");
14398
      return has_target_p ? gen_reg_rtx (ops[0].mode) : const0_rtx;
14399
    }
14400
  return has_target_p ? ops[0].value : const0_rtx;
14401
}
14402
 
14403
/* Expand a floating-point comparison for built-in function call EXP.
14404
   The first NARGS arguments are the values to be compared.  ICODE is
14405
   the .md pattern that does the comparison and COND is the condition
14406
   that is being tested.  Return an rtx for the result.  */
14407
 
14408
static rtx
14409
mips_expand_builtin_compare_1 (enum insn_code icode,
14410
                               enum mips_fp_condition cond,
14411
                               tree exp, int nargs)
14412
{
14413
  struct expand_operand ops[MAX_RECOG_OPERANDS];
14414
  rtx output;
14415
  int opno, argno;
14416
 
14417
  /* The instruction should have a target operand, an operand for each
14418
     argument, and an operand for COND.  */
14419
  gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args);
14420
 
14421
  output = mips_allocate_fcc (insn_data[(int) icode].operand[0].mode);
14422
  opno = 0;
14423
  create_fixed_operand (&ops[opno++], output);
14424
  for (argno = 0; argno < nargs; argno++)
14425
    mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14426
  create_integer_operand (&ops[opno++], (int) cond);
14427
  return mips_expand_builtin_insn (icode, opno, ops, true);
14428
}
14429
 
14430
/* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
14431
   HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
14432
   and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
14433
   suggests a good place to put the result.  */
14434
 
14435
static rtx
14436
mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
14437
                            bool has_target_p)
14438
{
14439
  struct expand_operand ops[MAX_RECOG_OPERANDS];
14440
  int opno, argno;
14441
 
14442
  /* Map any target to operand 0.  */
14443
  opno = 0;
14444
  if (has_target_p)
14445
    create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp)));
14446
 
14447
  /* Map the arguments to the other operands.  */
14448
  gcc_assert (opno + call_expr_nargs (exp)
14449
              == insn_data[icode].n_generator_args);
14450
  for (argno = 0; argno < call_expr_nargs (exp); argno++)
14451
    mips_prepare_builtin_arg (&ops[opno++], exp, argno);
14452
 
14453
  return mips_expand_builtin_insn (icode, opno, ops, has_target_p);
14454
}
14455
 
14456
/* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
14457
   function; TYPE says which.  EXP is the CALL_EXPR that calls the
14458
   function, ICODE is the instruction that should be used to compare
14459
   the first two arguments, and COND is the condition it should test.
14460
   TARGET, if nonnull, suggests a good place to put the result.  */
14461
 
14462
static rtx
14463
mips_expand_builtin_movtf (enum mips_builtin_type type,
14464
                           enum insn_code icode, enum mips_fp_condition cond,
14465
                           rtx target, tree exp)
14466
{
14467
  struct expand_operand ops[4];
14468
  rtx cmp_result;
14469
 
14470
  cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp, 2);
14471
  create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
14472
  if (type == MIPS_BUILTIN_MOVT)
14473
    {
14474
      mips_prepare_builtin_arg (&ops[2], exp, 2);
14475
      mips_prepare_builtin_arg (&ops[1], exp, 3);
14476
    }
14477
  else
14478
    {
14479
      mips_prepare_builtin_arg (&ops[1], exp, 2);
14480
      mips_prepare_builtin_arg (&ops[2], exp, 3);
14481
    }
14482
  create_fixed_operand (&ops[3], cmp_result);
14483
  return mips_expand_builtin_insn (CODE_FOR_mips_cond_move_tf_ps,
14484
                                   4, ops, true);
14485
}
14486
 
14487
/* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
14488
   into TARGET otherwise.  Return TARGET.  */
14489
 
14490
static rtx
14491
mips_builtin_branch_and_move (rtx condition, rtx target,
14492
                              rtx value_if_true, rtx value_if_false)
14493
{
14494
  rtx true_label, done_label;
14495
 
14496
  true_label = gen_label_rtx ();
14497
  done_label = gen_label_rtx ();
14498
 
14499
  /* First assume that CONDITION is false.  */
14500
  mips_emit_move (target, value_if_false);
14501
 
14502
  /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
14503
  emit_jump_insn (gen_condjump (condition, true_label));
14504
  emit_jump_insn (gen_jump (done_label));
14505
  emit_barrier ();
14506
 
14507
  /* Fix TARGET if CONDITION is true.  */
14508
  emit_label (true_label);
14509
  mips_emit_move (target, value_if_true);
14510
 
14511
  emit_label (done_label);
14512
  return target;
14513
}
14514
 
14515
/* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
14516
   the CALL_EXPR that calls the function, ICODE is the code of the
14517
   comparison instruction, and COND is the condition it should test.
14518
   TARGET, if nonnull, suggests a good place to put the boolean result.  */
14519
 
14520
static rtx
14521
mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
14522
                             enum insn_code icode, enum mips_fp_condition cond,
14523
                             rtx target, tree exp)
14524
{
14525
  rtx offset, condition, cmp_result;
14526
 
14527
  if (target == 0 || GET_MODE (target) != SImode)
14528
    target = gen_reg_rtx (SImode);
14529
  cmp_result = mips_expand_builtin_compare_1 (icode, cond, exp,
14530
                                              call_expr_nargs (exp));
14531
 
14532
  /* If the comparison sets more than one register, we define the result
14533
     to be 0 if all registers are false and -1 if all registers are true.
14534
     The value of the complete result is indeterminate otherwise.  */
14535
  switch (builtin_type)
14536
    {
14537
    case MIPS_BUILTIN_CMP_ALL:
14538
      condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
14539
      return mips_builtin_branch_and_move (condition, target,
14540
                                           const0_rtx, const1_rtx);
14541
 
14542
    case MIPS_BUILTIN_CMP_UPPER:
14543
    case MIPS_BUILTIN_CMP_LOWER:
14544
      offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
14545
      condition = gen_single_cc (cmp_result, offset);
14546
      return mips_builtin_branch_and_move (condition, target,
14547
                                           const1_rtx, const0_rtx);
14548
 
14549
    default:
14550
      condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
14551
      return mips_builtin_branch_and_move (condition, target,
14552
                                           const1_rtx, const0_rtx);
14553
    }
14554
}
14555
 
14556
/* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
14557
   if nonnull, suggests a good place to put the boolean result.  */
14558
 
14559
static rtx
14560
mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
14561
{
14562
  rtx condition, cmp_result;
14563
  int cmp_value;
14564
 
14565
  if (target == 0 || GET_MODE (target) != SImode)
14566
    target = gen_reg_rtx (SImode);
14567
 
14568
  cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
14569
 
14570
  if (builtin_type == MIPS_BUILTIN_BPOSGE32)
14571
    cmp_value = 32;
14572
  else
14573
    gcc_assert (0);
14574
 
14575
  condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
14576
  return mips_builtin_branch_and_move (condition, target,
14577
                                       const1_rtx, const0_rtx);
14578
}
14579
 
14580
/* Implement TARGET_EXPAND_BUILTIN.  */
14581
 
14582
static rtx
14583
mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
14584
                     enum machine_mode mode, int ignore)
14585
{
14586
  tree fndecl;
14587
  unsigned int fcode, avail;
14588
  const struct mips_builtin_description *d;
14589
 
14590
  fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
14591
  fcode = DECL_FUNCTION_CODE (fndecl);
14592
  gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
14593
  d = &mips_builtins[fcode];
14594
  avail = d->avail ();
14595
  gcc_assert (avail != 0);
14596
  if (TARGET_MIPS16 && !(avail & BUILTIN_AVAIL_MIPS16))
14597
    {
14598
      error ("built-in function %qE not supported for MIPS16",
14599
             DECL_NAME (fndecl));
14600
      return ignore ? const0_rtx : CONST0_RTX (mode);
14601
    }
14602
  switch (d->builtin_type)
14603
    {
14604
    case MIPS_BUILTIN_DIRECT:
14605
      return mips_expand_builtin_direct (d->icode, target, exp, true);
14606
 
14607
    case MIPS_BUILTIN_DIRECT_NO_TARGET:
14608
      return mips_expand_builtin_direct (d->icode, target, exp, false);
14609
 
14610
    case MIPS_BUILTIN_MOVT:
14611
    case MIPS_BUILTIN_MOVF:
14612
      return mips_expand_builtin_movtf (d->builtin_type, d->icode,
14613
                                        d->cond, target, exp);
14614
 
14615
    case MIPS_BUILTIN_CMP_ANY:
14616
    case MIPS_BUILTIN_CMP_ALL:
14617
    case MIPS_BUILTIN_CMP_UPPER:
14618
    case MIPS_BUILTIN_CMP_LOWER:
14619
    case MIPS_BUILTIN_CMP_SINGLE:
14620
      return mips_expand_builtin_compare (d->builtin_type, d->icode,
14621
                                          d->cond, target, exp);
14622
 
14623
    case MIPS_BUILTIN_BPOSGE32:
14624
      return mips_expand_builtin_bposge (d->builtin_type, target);
14625
    }
14626
  gcc_unreachable ();
14627
}
14628
 
14629
/* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
14630
   MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
14631
struct mips16_constant {
14632
  struct mips16_constant *next;
14633
  rtx value;
14634
  rtx label;
14635
  enum machine_mode mode;
14636
};
14637
 
14638
/* Information about an incomplete MIPS16 constant pool.  FIRST is the
14639
   first constant, HIGHEST_ADDRESS is the highest address that the first
14640
   byte of the pool can have, and INSN_ADDRESS is the current instruction
14641
   address.  */
14642
struct mips16_constant_pool {
14643
  struct mips16_constant *first;
14644
  int highest_address;
14645
  int insn_address;
14646
};
14647
 
14648
/* Add constant VALUE to POOL and return its label.  MODE is the
14649
   value's mode (used for CONST_INTs, etc.).  */
14650
 
14651
static rtx
14652
mips16_add_constant (struct mips16_constant_pool *pool,
14653
                     rtx value, enum machine_mode mode)
14654
{
14655
  struct mips16_constant **p, *c;
14656
  bool first_of_size_p;
14657
 
14658
  /* See whether the constant is already in the pool.  If so, return the
14659
     existing label, otherwise leave P pointing to the place where the
14660
     constant should be added.
14661
 
14662
     Keep the pool sorted in increasing order of mode size so that we can
14663
     reduce the number of alignments needed.  */
14664
  first_of_size_p = true;
14665
  for (p = &pool->first; *p != 0; p = &(*p)->next)
14666
    {
14667
      if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
14668
        return (*p)->label;
14669
      if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
14670
        break;
14671
      if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
14672
        first_of_size_p = false;
14673
    }
14674
 
14675
  /* In the worst case, the constant needed by the earliest instruction
14676
     will end up at the end of the pool.  The entire pool must then be
14677
     accessible from that instruction.
14678
 
14679
     When adding the first constant, set the pool's highest address to
14680
     the address of the first out-of-range byte.  Adjust this address
14681
     downwards each time a new constant is added.  */
14682
  if (pool->first == 0)
14683
    /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
14684
       of the instruction with the lowest two bits clear.  The base PC
14685
       value for LDPC has the lowest three bits clear.  Assume the worst
14686
       case here; namely that the PC-relative instruction occupies the
14687
       last 2 bytes in an aligned word.  */
14688
    pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
14689
  pool->highest_address -= GET_MODE_SIZE (mode);
14690
  if (first_of_size_p)
14691
    /* Take into account the worst possible padding due to alignment.  */
14692
    pool->highest_address -= GET_MODE_SIZE (mode) - 1;
14693
 
14694
  /* Create a new entry.  */
14695
  c = XNEW (struct mips16_constant);
14696
  c->value = value;
14697
  c->mode = mode;
14698
  c->label = gen_label_rtx ();
14699
  c->next = *p;
14700
  *p = c;
14701
 
14702
  return c->label;
14703
}
14704
 
14705
/* Output constant VALUE after instruction INSN and return the last
14706
   instruction emitted.  MODE is the mode of the constant.  */
14707
 
14708
static rtx
14709
mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
14710
{
14711
  if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
14712
    {
14713
      rtx size = GEN_INT (GET_MODE_SIZE (mode));
14714
      return emit_insn_after (gen_consttable_int (value, size), insn);
14715
    }
14716
 
14717
  if (SCALAR_FLOAT_MODE_P (mode))
14718
    return emit_insn_after (gen_consttable_float (value), insn);
14719
 
14720
  if (VECTOR_MODE_P (mode))
14721
    {
14722
      int i;
14723
 
14724
      for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
14725
        insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
14726
                                        CONST_VECTOR_ELT (value, i), insn);
14727
      return insn;
14728
    }
14729
 
14730
  gcc_unreachable ();
14731
}
14732
 
14733
/* Dump out the constants in CONSTANTS after INSN.  */
14734
 
14735
static void
14736
mips16_emit_constants (struct mips16_constant *constants, rtx insn)
14737
{
14738
  struct mips16_constant *c, *next;
14739
  int align;
14740
 
14741
  align = 0;
14742
  for (c = constants; c != NULL; c = next)
14743
    {
14744
      /* If necessary, increase the alignment of PC.  */
14745
      if (align < GET_MODE_SIZE (c->mode))
14746
        {
14747
          int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
14748
          insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
14749
        }
14750
      align = GET_MODE_SIZE (c->mode);
14751
 
14752
      insn = emit_label_after (c->label, insn);
14753
      insn = mips16_emit_constants_1 (c->mode, c->value, insn);
14754
 
14755
      next = c->next;
14756
      free (c);
14757
    }
14758
 
14759
  emit_barrier_after (insn);
14760
}
14761
 
14762
/* Return the length of instruction INSN.  */
14763
 
14764
static int
14765
mips16_insn_length (rtx insn)
14766
{
14767
  if (JUMP_TABLE_DATA_P (insn))
14768
    {
14769
      rtx body = PATTERN (insn);
14770
      if (GET_CODE (body) == ADDR_VEC)
14771
        return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
14772
      else if (GET_CODE (body) == ADDR_DIFF_VEC)
14773
        return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
14774
      else
14775
        gcc_unreachable ();
14776
    }
14777
  return get_attr_length (insn);
14778
}
14779
 
14780
/* If *X is a symbolic constant that refers to the constant pool, add
14781
   the constant to POOL and rewrite *X to use the constant's label.  */
14782
 
14783
static void
14784
mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
14785
{
14786
  rtx base, offset, label;
14787
 
14788
  split_const (*x, &base, &offset);
14789
  if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
14790
    {
14791
      label = mips16_add_constant (pool, copy_rtx (get_pool_constant (base)),
14792
                                   get_pool_mode (base));
14793
      base = gen_rtx_LABEL_REF (Pmode, label);
14794
      *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
14795
    }
14796
}
14797
 
14798
/* This structure is used to communicate with mips16_rewrite_pool_refs.
14799
   INSN is the instruction we're rewriting and POOL points to the current
14800
   constant pool.  */
14801
struct mips16_rewrite_pool_refs_info {
14802
  rtx insn;
14803
  struct mips16_constant_pool *pool;
14804
};
14805
 
14806
/* Rewrite *X so that constant pool references refer to the constant's
14807
   label instead.  DATA points to a mips16_rewrite_pool_refs_info
14808
   structure.  */
14809
 
14810
static int
14811
mips16_rewrite_pool_refs (rtx *x, void *data)
14812
{
14813
  struct mips16_rewrite_pool_refs_info *info =
14814
    (struct mips16_rewrite_pool_refs_info *) data;
14815
 
14816
  if (force_to_mem_operand (*x, Pmode))
14817
    {
14818
      rtx mem = force_const_mem (GET_MODE (*x), *x);
14819
      validate_change (info->insn, x, mem, false);
14820
    }
14821
 
14822
  if (MEM_P (*x))
14823
    {
14824
      mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
14825
      return -1;
14826
    }
14827
 
14828
  /* Don't rewrite the __mips16_rdwr symbol.  */
14829
  if (GET_CODE (*x) == UNSPEC && XINT (*x, 1) == UNSPEC_TLS_GET_TP)
14830
    return -1;
14831
 
14832
  if (TARGET_MIPS16_TEXT_LOADS)
14833
    mips16_rewrite_pool_constant (info->pool, x);
14834
 
14835
  return GET_CODE (*x) == CONST ? -1 : 0;
14836
}
14837
 
14838
/* Return whether CFG is used in mips_reorg.  */
14839
 
14840
static bool
14841
mips_cfg_in_reorg (void)
14842
{
14843
  return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
14844
          || TARGET_RELAX_PIC_CALLS);
14845
}
14846
 
14847
/* Build MIPS16 constant pools.  Split the instructions if SPLIT_P,
14848
   otherwise assume that they are already split.  */
14849
 
14850
static void
14851
mips16_lay_out_constants (bool split_p)
14852
{
14853
  struct mips16_constant_pool pool;
14854
  struct mips16_rewrite_pool_refs_info info;
14855
  rtx insn, barrier;
14856
 
14857
  if (!TARGET_MIPS16_PCREL_LOADS)
14858
    return;
14859
 
14860
  if (split_p)
14861
    {
14862
      if (mips_cfg_in_reorg ())
14863
        split_all_insns ();
14864
      else
14865
        split_all_insns_noflow ();
14866
    }
14867
  barrier = 0;
14868
  memset (&pool, 0, sizeof (pool));
14869
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14870
    {
14871
      /* Rewrite constant pool references in INSN.  */
14872
      if (USEFUL_INSN_P (insn))
14873
        {
14874
          info.insn = insn;
14875
          info.pool = &pool;
14876
          for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
14877
        }
14878
 
14879
      pool.insn_address += mips16_insn_length (insn);
14880
 
14881
      if (pool.first != NULL)
14882
        {
14883
          /* If there are no natural barriers between the first user of
14884
             the pool and the highest acceptable address, we'll need to
14885
             create a new instruction to jump around the constant pool.
14886
             In the worst case, this instruction will be 4 bytes long.
14887
 
14888
             If it's too late to do this transformation after INSN,
14889
             do it immediately before INSN.  */
14890
          if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
14891
            {
14892
              rtx label, jump;
14893
 
14894
              label = gen_label_rtx ();
14895
 
14896
              jump = emit_jump_insn_before (gen_jump (label), insn);
14897
              JUMP_LABEL (jump) = label;
14898
              LABEL_NUSES (label) = 1;
14899
              barrier = emit_barrier_after (jump);
14900
 
14901
              emit_label_after (label, barrier);
14902
              pool.insn_address += 4;
14903
            }
14904
 
14905
          /* See whether the constant pool is now out of range of the first
14906
             user.  If so, output the constants after the previous barrier.
14907
             Note that any instructions between BARRIER and INSN (inclusive)
14908
             will use negative offsets to refer to the pool.  */
14909
          if (pool.insn_address > pool.highest_address)
14910
            {
14911
              mips16_emit_constants (pool.first, barrier);
14912
              pool.first = NULL;
14913
              barrier = 0;
14914
            }
14915
          else if (BARRIER_P (insn))
14916
            barrier = insn;
14917
        }
14918
    }
14919
  mips16_emit_constants (pool.first, get_last_insn ());
14920
}
14921
 
14922
/* Return true if it is worth r10k_simplify_address's while replacing
14923
   an address with X.  We are looking for constants, and for addresses
14924
   at a known offset from the incoming stack pointer.  */
14925
 
14926
static bool
14927
r10k_simplified_address_p (rtx x)
14928
{
14929
  if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
14930
    x = XEXP (x, 0);
14931
  return x == virtual_incoming_args_rtx || CONSTANT_P (x);
14932
}
14933
 
14934
/* X is an expression that appears in INSN.  Try to use the UD chains
14935
   to simplify it, returning the simplified form on success and the
14936
   original form otherwise.  Replace the incoming value of $sp with
14937
   virtual_incoming_args_rtx (which should never occur in X otherwise).  */
14938
 
14939
static rtx
14940
r10k_simplify_address (rtx x, rtx insn)
14941
{
14942
  rtx newx, op0, op1, set, def_insn, note;
14943
  df_ref use, def;
14944
  struct df_link *defs;
14945
 
14946
  newx = NULL_RTX;
14947
  if (UNARY_P (x))
14948
    {
14949
      op0 = r10k_simplify_address (XEXP (x, 0), insn);
14950
      if (op0 != XEXP (x, 0))
14951
        newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
14952
                                   op0, GET_MODE (XEXP (x, 0)));
14953
    }
14954
  else if (BINARY_P (x))
14955
    {
14956
      op0 = r10k_simplify_address (XEXP (x, 0), insn);
14957
      op1 = r10k_simplify_address (XEXP (x, 1), insn);
14958
      if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
14959
        newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
14960
    }
14961
  else if (GET_CODE (x) == LO_SUM)
14962
    {
14963
      /* LO_SUMs can be offset from HIGHs, if we know they won't
14964
         overflow.  See mips_classify_address for the rationale behind
14965
         the lax check.  */
14966
      op0 = r10k_simplify_address (XEXP (x, 0), insn);
14967
      if (GET_CODE (op0) == HIGH)
14968
        newx = XEXP (x, 1);
14969
    }
14970
  else if (REG_P (x))
14971
    {
14972
      /* Uses are recorded by regno_reg_rtx, not X itself.  */
14973
      use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
14974
      gcc_assert (use);
14975
      defs = DF_REF_CHAIN (use);
14976
 
14977
      /* Require a single definition.  */
14978
      if (defs && defs->next == NULL)
14979
        {
14980
          def = defs->ref;
14981
          if (DF_REF_IS_ARTIFICIAL (def))
14982
            {
14983
              /* Replace the incoming value of $sp with
14984
                 virtual_incoming_args_rtx.  */
14985
              if (x == stack_pointer_rtx
14986
                  && DF_REF_BB (def) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
14987
                newx = virtual_incoming_args_rtx;
14988
            }
14989
          else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
14990
                                   DF_REF_BB (def)))
14991
            {
14992
              /* Make sure that DEF_INSN is a single set of REG.  */
14993
              def_insn = DF_REF_INSN (def);
14994
              if (NONJUMP_INSN_P (def_insn))
14995
                {
14996
                  set = single_set (def_insn);
14997
                  if (set && rtx_equal_p (SET_DEST (set), x))
14998
                    {
14999
                      /* Prefer to use notes, since the def-use chains
15000
                         are often shorter.  */
15001
                      note = find_reg_equal_equiv_note (def_insn);
15002
                      if (note)
15003
                        newx = XEXP (note, 0);
15004
                      else
15005
                        newx = SET_SRC (set);
15006
                      newx = r10k_simplify_address (newx, def_insn);
15007
                    }
15008
                }
15009
            }
15010
        }
15011
    }
15012
  if (newx && r10k_simplified_address_p (newx))
15013
    return newx;
15014
  return x;
15015
}
15016
 
15017
/* Return true if ADDRESS is known to be an uncached address
15018
   on R10K systems.  */
15019
 
15020
static bool
15021
r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
15022
{
15023
  unsigned HOST_WIDE_INT upper;
15024
 
15025
  /* Check for KSEG1.  */
15026
  if (address + 0x60000000 < 0x20000000)
15027
    return true;
15028
 
15029
  /* Check for uncached XKPHYS addresses.  */
15030
  if (Pmode == DImode)
15031
    {
15032
      upper = (address >> 40) & 0xf9ffff;
15033
      if (upper == 0x900000 || upper == 0xb80000)
15034
        return true;
15035
    }
15036
  return false;
15037
}
15038
 
15039
/* Return true if we can prove that an access to address X in instruction
15040
   INSN would be safe from R10K speculation.  This X is a general
15041
   expression; it might not be a legitimate address.  */
15042
 
15043
static bool
15044
r10k_safe_address_p (rtx x, rtx insn)
15045
{
15046
  rtx base, offset;
15047
  HOST_WIDE_INT offset_val;
15048
 
15049
  x = r10k_simplify_address (x, insn);
15050
 
15051
  /* Check for references to the stack frame.  It doesn't really matter
15052
     how much of the frame has been allocated at INSN; -mr10k-cache-barrier
15053
     allows us to assume that accesses to any part of the eventual frame
15054
     is safe from speculation at any point in the function.  */
15055
  mips_split_plus (x, &base, &offset_val);
15056
  if (base == virtual_incoming_args_rtx
15057
      && offset_val >= -cfun->machine->frame.total_size
15058
      && offset_val < cfun->machine->frame.args_size)
15059
    return true;
15060
 
15061
  /* Check for uncached addresses.  */
15062
  if (CONST_INT_P (x))
15063
    return r10k_uncached_address_p (INTVAL (x));
15064
 
15065
  /* Check for accesses to a static object.  */
15066
  split_const (x, &base, &offset);
15067
  return offset_within_block_p (base, INTVAL (offset));
15068
}
15069
 
15070
/* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
15071
   an in-range access to an automatic variable, or to an object with
15072
   a link-time-constant address.  */
15073
 
15074
static bool
15075
r10k_safe_mem_expr_p (tree expr, unsigned HOST_WIDE_INT offset)
15076
{
15077
  HOST_WIDE_INT bitoffset, bitsize;
15078
  tree inner, var_offset;
15079
  enum machine_mode mode;
15080
  int unsigned_p, volatile_p;
15081
 
15082
  inner = get_inner_reference (expr, &bitsize, &bitoffset, &var_offset, &mode,
15083
                               &unsigned_p, &volatile_p, false);
15084
  if (!DECL_P (inner) || !DECL_SIZE_UNIT (inner) || var_offset)
15085
    return false;
15086
 
15087
  offset += bitoffset / BITS_PER_UNIT;
15088
  return offset < tree_to_uhwi (DECL_SIZE_UNIT (inner));
15089
}
15090
 
15091
/* A for_each_rtx callback for which DATA points to the instruction
15092
   containing *X.  Stop the search if we find a MEM that is not safe
15093
   from R10K speculation.  */
15094
 
15095
static int
15096
r10k_needs_protection_p_1 (rtx *loc, void *data)
15097
{
15098
  rtx mem;
15099
 
15100
  mem = *loc;
15101
  if (!MEM_P (mem))
15102
    return 0;
15103
 
15104
  if (MEM_EXPR (mem)
15105
      && MEM_OFFSET_KNOWN_P (mem)
15106
      && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
15107
    return -1;
15108
 
15109
  if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
15110
    return -1;
15111
 
15112
  return 1;
15113
}
15114
 
15115
/* A note_stores callback for which DATA points to an instruction pointer.
15116
   If *DATA is nonnull, make it null if it X contains a MEM that is not
15117
   safe from R10K speculation.  */
15118
 
15119
static void
15120
r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
15121
                               void *data)
15122
{
15123
  rtx *insn_ptr;
15124
 
15125
  insn_ptr = (rtx *) data;
15126
  if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
15127
    *insn_ptr = NULL_RTX;
15128
}
15129
 
15130
/* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
15131
   Return nonzero if the call is not to a declared function.  */
15132
 
15133
static int
15134
r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
15135
{
15136
  rtx x;
15137
 
15138
  x = *loc;
15139
  if (!MEM_P (x))
15140
    return 0;
15141
 
15142
  x = XEXP (x, 0);
15143
  if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
15144
    return -1;
15145
 
15146
  return 1;
15147
}
15148
 
15149
/* Return true if instruction INSN needs to be protected by an R10K
15150
   cache barrier.  */
15151
 
15152
static bool
15153
r10k_needs_protection_p (rtx insn)
15154
{
15155
  if (CALL_P (insn))
15156
    return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
15157
 
15158
  if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
15159
    {
15160
      note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
15161
      return insn == NULL_RTX;
15162
    }
15163
 
15164
  return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
15165
}
15166
 
15167
/* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
15168
   edge is unconditional.  */
15169
 
15170
static bool
15171
r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
15172
{
15173
  edge_iterator ei;
15174
  edge e;
15175
 
15176
  FOR_EACH_EDGE (e, ei, bb->preds)
15177
    if (!single_succ_p (e->src)
15178
        || !bitmap_bit_p (protected_bbs, e->src->index)
15179
        || (e->flags & EDGE_COMPLEX) != 0)
15180
      return false;
15181
  return true;
15182
}
15183
 
15184
/* Implement -mr10k-cache-barrier= for the current function.  */
15185
 
15186
static void
15187
r10k_insert_cache_barriers (void)
15188
{
15189
  int *rev_post_order;
15190
  unsigned int i, n;
15191
  basic_block bb;
15192
  sbitmap protected_bbs;
15193
  rtx insn, end, unprotected_region;
15194
 
15195
  if (TARGET_MIPS16)
15196
    {
15197
      sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
15198
      return;
15199
    }
15200
 
15201
  /* Calculate dominators.  */
15202
  calculate_dominance_info (CDI_DOMINATORS);
15203
 
15204
  /* Bit X of PROTECTED_BBS is set if the last operation in basic block
15205
     X is protected by a cache barrier.  */
15206
  protected_bbs = sbitmap_alloc (last_basic_block_for_fn (cfun));
15207
  bitmap_clear (protected_bbs);
15208
 
15209
  /* Iterate over the basic blocks in reverse post-order.  */
15210
  rev_post_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
15211
  n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
15212
  for (i = 0; i < n; i++)
15213
    {
15214
      bb = BASIC_BLOCK_FOR_FN (cfun, rev_post_order[i]);
15215
 
15216
      /* If this block is only reached by unconditional edges, and if the
15217
         source of every edge is protected, the beginning of the block is
15218
         also protected.  */
15219
      if (r10k_protected_bb_p (bb, protected_bbs))
15220
        unprotected_region = NULL_RTX;
15221
      else
15222
        unprotected_region = pc_rtx;
15223
      end = NEXT_INSN (BB_END (bb));
15224
 
15225
      /* UNPROTECTED_REGION is:
15226
 
15227
         - null if we are processing a protected region,
15228
         - pc_rtx if we are processing an unprotected region but have
15229
           not yet found the first instruction in it
15230
         - the first instruction in an unprotected region otherwise.  */
15231
      for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
15232
        {
15233
          if (unprotected_region && USEFUL_INSN_P (insn))
15234
            {
15235
              if (recog_memoized (insn) == CODE_FOR_mips_cache)
15236
                /* This CACHE instruction protects the following code.  */
15237
                unprotected_region = NULL_RTX;
15238
              else
15239
                {
15240
                  /* See if INSN is the first instruction in this
15241
                     unprotected region.  */
15242
                  if (unprotected_region == pc_rtx)
15243
                    unprotected_region = insn;
15244
 
15245
                  /* See if INSN needs to be protected.  If so,
15246
                     we must insert a cache barrier somewhere between
15247
                     PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
15248
                     clear which position is better performance-wise,
15249
                     but as a tie-breaker, we assume that it is better
15250
                     to allow delay slots to be back-filled where
15251
                     possible, and that it is better not to insert
15252
                     barriers in the middle of already-scheduled code.
15253
                     We therefore insert the barrier at the beginning
15254
                     of the region.  */
15255
                  if (r10k_needs_protection_p (insn))
15256
                    {
15257
                      emit_insn_before (gen_r10k_cache_barrier (),
15258
                                        unprotected_region);
15259
                      unprotected_region = NULL_RTX;
15260
                    }
15261
                }
15262
            }
15263
 
15264
          if (CALL_P (insn))
15265
            /* The called function is not required to protect the exit path.
15266
               The code that follows a call is therefore unprotected.  */
15267
            unprotected_region = pc_rtx;
15268
        }
15269
 
15270
      /* Record whether the end of this block is protected.  */
15271
      if (unprotected_region == NULL_RTX)
15272
        bitmap_set_bit (protected_bbs, bb->index);
15273
    }
15274
  XDELETEVEC (rev_post_order);
15275
 
15276
  sbitmap_free (protected_bbs);
15277
 
15278
  free_dominance_info (CDI_DOMINATORS);
15279
}
15280
 
15281
/* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
15282
   otherwise.  If INSN has two call rtx, then store the second one in
15283
   SECOND_CALL.  */
15284
 
15285
static rtx
15286
mips_call_expr_from_insn (rtx insn, rtx *second_call)
15287
{
15288
  rtx x;
15289
  rtx x2;
15290
 
15291
  if (!CALL_P (insn))
15292
    return NULL_RTX;
15293
 
15294
  x = PATTERN (insn);
15295
  if (GET_CODE (x) == PARALLEL)
15296
    {
15297
      /* Calls returning complex values have two CALL rtx.  Look for the second
15298
         one here, and return it via the SECOND_CALL arg.  */
15299
      x2 = XVECEXP (x, 0, 1);
15300
      if (GET_CODE (x2) == SET)
15301
        x2 = XEXP (x2, 1);
15302
      if (GET_CODE (x2) == CALL)
15303
        *second_call = x2;
15304
 
15305
      x = XVECEXP (x, 0, 0);
15306
    }
15307
  if (GET_CODE (x) == SET)
15308
    x = XEXP (x, 1);
15309
  gcc_assert (GET_CODE (x) == CALL);
15310
 
15311
  return x;
15312
}
15313
 
15314
/* REG is set in DEF.  See if the definition is one of the ways we load a
15315
   register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
15316
   If it is, return the symbol reference of the function, otherwise return
15317
   NULL_RTX.
15318
 
15319
   If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
15320
   the values of source registers, otherwise treat such registers as
15321
   having an unknown value.  */
15322
 
15323
static rtx
15324
mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
15325
{
15326
  rtx def_insn, set;
15327
 
15328
  if (DF_REF_IS_ARTIFICIAL (def))
15329
    return NULL_RTX;
15330
 
15331
  def_insn = DF_REF_INSN (def);
15332
  set = single_set (def_insn);
15333
  if (set && rtx_equal_p (SET_DEST (set), reg))
15334
    {
15335
      rtx note, src, symbol;
15336
 
15337
      /* First see whether the source is a plain symbol.  This is used
15338
         when calling symbols that are not lazily bound.  */
15339
      src = SET_SRC (set);
15340
      if (GET_CODE (src) == SYMBOL_REF)
15341
        return src;
15342
 
15343
      /* Handle %call16 references.  */
15344
      symbol = mips_strip_unspec_call (src);
15345
      if (symbol)
15346
        {
15347
          gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15348
          return symbol;
15349
        }
15350
 
15351
      /* If we have something more complicated, look for a
15352
         REG_EQUAL or REG_EQUIV note.  */
15353
      note = find_reg_equal_equiv_note (def_insn);
15354
      if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
15355
        return XEXP (note, 0);
15356
 
15357
      /* Follow at most one simple register copy.  Such copies are
15358
         interesting in cases like:
15359
 
15360
             for (...)
15361
               {
15362
                 locally_binding_fn (...);
15363
               }
15364
 
15365
         and:
15366
 
15367
             locally_binding_fn (...);
15368
             ...
15369
             locally_binding_fn (...);
15370
 
15371
         where the load of locally_binding_fn can legitimately be
15372
         hoisted or shared.  However, we do not expect to see complex
15373
         chains of copies, so a full worklist solution to the problem
15374
         would probably be overkill.  */
15375
      if (recurse_p && REG_P (src))
15376
        return mips_find_pic_call_symbol (def_insn, src, false);
15377
    }
15378
 
15379
  return NULL_RTX;
15380
}
15381
 
15382
/* Find the definition of the use of REG in INSN.  See if the definition
15383
   is one of the ways we load a register with a symbol address for a
15384
   mips_use_pic_fn_addr_reg_p call.  If it is return the symbol reference
15385
   of the function, otherwise return NULL_RTX.  RECURSE_P is as for
15386
   mips_pic_call_symbol_from_set.  */
15387
 
15388
static rtx
15389
mips_find_pic_call_symbol (rtx insn, rtx reg, bool recurse_p)
15390
{
15391
  df_ref use;
15392
  struct df_link *defs;
15393
  rtx symbol;
15394
 
15395
  use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
15396
  if (!use)
15397
    return NULL_RTX;
15398
  defs = DF_REF_CHAIN (use);
15399
  if (!defs)
15400
    return NULL_RTX;
15401
  symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15402
  if (!symbol)
15403
    return NULL_RTX;
15404
 
15405
  /* If we have more than one definition, they need to be identical.  */
15406
  for (defs = defs->next; defs; defs = defs->next)
15407
    {
15408
      rtx other;
15409
 
15410
      other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
15411
      if (!rtx_equal_p (symbol, other))
15412
        return NULL_RTX;
15413
    }
15414
 
15415
  return symbol;
15416
}
15417
 
15418
/* Replace the args_size operand of the call expression CALL with the
15419
   call-attribute UNSPEC and fill in SYMBOL as the function symbol.  */
15420
 
15421
static void
15422
mips_annotate_pic_call_expr (rtx call, rtx symbol)
15423
{
15424
  rtx args_size;
15425
 
15426
  args_size = XEXP (call, 1);
15427
  XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
15428
                                   gen_rtvec (2, args_size, symbol),
15429
                                   UNSPEC_CALL_ATTR);
15430
}
15431
 
15432
/* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression.  See
15433
   if instead of the arg_size argument it contains the call attributes.  If
15434
   yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
15435
   symbol from the call attributes.  Also return false if ARGS_SIZE_OPNO is
15436
   -1.  */
15437
 
15438
bool
15439
mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
15440
{
15441
  rtx args_size, symbol;
15442
 
15443
  if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
15444
    return false;
15445
 
15446
  args_size = operands[args_size_opno];
15447
  if (GET_CODE (args_size) != UNSPEC)
15448
    return false;
15449
  gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
15450
 
15451
  symbol = XVECEXP (args_size, 0, 1);
15452
  gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
15453
 
15454
  operands[args_size_opno] = symbol;
15455
  return true;
15456
}
15457
 
15458
/* Use DF to annotate PIC indirect calls with the function symbol they
15459
   dispatch to.  */
15460
 
15461
static void
15462
mips_annotate_pic_calls (void)
15463
{
15464
  basic_block bb;
15465
  rtx insn;
15466
 
15467
  FOR_EACH_BB_FN (bb, cfun)
15468
    FOR_BB_INSNS (bb, insn)
15469
    {
15470
      rtx call, reg, symbol, second_call;
15471
 
15472
      second_call = 0;
15473
      call = mips_call_expr_from_insn (insn, &second_call);
15474
      if (!call)
15475
        continue;
15476
      gcc_assert (MEM_P (XEXP (call, 0)));
15477
      reg = XEXP (XEXP (call, 0), 0);
15478
      if (!REG_P (reg))
15479
        continue;
15480
 
15481
      symbol = mips_find_pic_call_symbol (insn, reg, true);
15482
      if (symbol)
15483
        {
15484
          mips_annotate_pic_call_expr (call, symbol);
15485
          if (second_call)
15486
            mips_annotate_pic_call_expr (second_call, symbol);
15487
        }
15488
    }
15489
}
15490
 
15491
/* A temporary variable used by for_each_rtx callbacks, etc.  */
15492
static rtx mips_sim_insn;
15493
 
15494
/* A structure representing the state of the processor pipeline.
15495
   Used by the mips_sim_* family of functions.  */
15496
struct mips_sim {
15497
  /* The maximum number of instructions that can be issued in a cycle.
15498
     (Caches mips_issue_rate.)  */
15499
  unsigned int issue_rate;
15500
 
15501
  /* The current simulation time.  */
15502
  unsigned int time;
15503
 
15504
  /* How many more instructions can be issued in the current cycle.  */
15505
  unsigned int insns_left;
15506
 
15507
  /* LAST_SET[X].INSN is the last instruction to set register X.
15508
     LAST_SET[X].TIME is the time at which that instruction was issued.
15509
     INSN is null if no instruction has yet set register X.  */
15510
  struct {
15511
    rtx insn;
15512
    unsigned int time;
15513
  } last_set[FIRST_PSEUDO_REGISTER];
15514
 
15515
  /* The pipeline's current DFA state.  */
15516
  state_t dfa_state;
15517
};
15518
 
15519
/* Reset STATE to the initial simulation state.  */
15520
 
15521
static void
15522
mips_sim_reset (struct mips_sim *state)
15523
{
15524
  curr_state = state->dfa_state;
15525
 
15526
  state->time = 0;
15527
  state->insns_left = state->issue_rate;
15528
  memset (&state->last_set, 0, sizeof (state->last_set));
15529
  state_reset (curr_state);
15530
 
15531
  targetm.sched.init (0, false, 0);
15532
  advance_state (curr_state);
15533
}
15534
 
15535
/* Initialize STATE before its first use.  DFA_STATE points to an
15536
   allocated but uninitialized DFA state.  */
15537
 
15538
static void
15539
mips_sim_init (struct mips_sim *state, state_t dfa_state)
15540
{
15541
  if (targetm.sched.init_dfa_pre_cycle_insn)
15542
    targetm.sched.init_dfa_pre_cycle_insn ();
15543
 
15544
  if (targetm.sched.init_dfa_post_cycle_insn)
15545
    targetm.sched.init_dfa_post_cycle_insn ();
15546
 
15547
  state->issue_rate = mips_issue_rate ();
15548
  state->dfa_state = dfa_state;
15549
  mips_sim_reset (state);
15550
}
15551
 
15552
/* Advance STATE by one clock cycle.  */
15553
 
15554
static void
15555
mips_sim_next_cycle (struct mips_sim *state)
15556
{
15557
  curr_state = state->dfa_state;
15558
 
15559
  state->time++;
15560
  state->insns_left = state->issue_rate;
15561
  advance_state (curr_state);
15562
}
15563
 
15564
/* Advance simulation state STATE until instruction INSN can read
15565
   register REG.  */
15566
 
15567
static void
15568
mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
15569
{
15570
  unsigned int regno, end_regno;
15571
 
15572
  end_regno = END_REGNO (reg);
15573
  for (regno = REGNO (reg); regno < end_regno; regno++)
15574
    if (state->last_set[regno].insn != 0)
15575
      {
15576
        unsigned int t;
15577
 
15578
        t = (state->last_set[regno].time
15579
             + insn_latency (state->last_set[regno].insn, insn));
15580
        while (state->time < t)
15581
          mips_sim_next_cycle (state);
15582
    }
15583
}
15584
 
15585
/* A for_each_rtx callback.  If *X is a register, advance simulation state
15586
   DATA until mips_sim_insn can read the register's value.  */
15587
 
15588
static int
15589
mips_sim_wait_regs_2 (rtx *x, void *data)
15590
{
15591
  if (REG_P (*x))
15592
    mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
15593
  return 0;
15594
}
15595
 
15596
/* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
15597
 
15598
static void
15599
mips_sim_wait_regs_1 (rtx *x, void *data)
15600
{
15601
  for_each_rtx (x, mips_sim_wait_regs_2, data);
15602
}
15603
 
15604
/* Advance simulation state STATE until all of INSN's register
15605
   dependencies are satisfied.  */
15606
 
15607
static void
15608
mips_sim_wait_regs (struct mips_sim *state, rtx insn)
15609
{
15610
  mips_sim_insn = insn;
15611
  note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
15612
}
15613
 
15614
/* Advance simulation state STATE until the units required by
15615
   instruction INSN are available.  */
15616
 
15617
static void
15618
mips_sim_wait_units (struct mips_sim *state, rtx insn)
15619
{
15620
  state_t tmp_state;
15621
 
15622
  tmp_state = alloca (state_size ());
15623
  while (state->insns_left == 0
15624
         || (memcpy (tmp_state, state->dfa_state, state_size ()),
15625
             state_transition (tmp_state, insn) >= 0))
15626
    mips_sim_next_cycle (state);
15627
}
15628
 
15629
/* Advance simulation state STATE until INSN is ready to issue.  */
15630
 
15631
static void
15632
mips_sim_wait_insn (struct mips_sim *state, rtx insn)
15633
{
15634
  mips_sim_wait_regs (state, insn);
15635
  mips_sim_wait_units (state, insn);
15636
}
15637
 
15638
/* mips_sim_insn has just set X.  Update the LAST_SET array
15639
   in simulation state DATA.  */
15640
 
15641
static void
15642
mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
15643
{
15644
  struct mips_sim *state;
15645
 
15646
  state = (struct mips_sim *) data;
15647
  if (REG_P (x))
15648
    {
15649
      unsigned int regno, end_regno;
15650
 
15651
      end_regno = END_REGNO (x);
15652
      for (regno = REGNO (x); regno < end_regno; regno++)
15653
        {
15654
          state->last_set[regno].insn = mips_sim_insn;
15655
          state->last_set[regno].time = state->time;
15656
        }
15657
    }
15658
}
15659
 
15660
/* Issue instruction INSN in scheduler state STATE.  Assume that INSN
15661
   can issue immediately (i.e., that mips_sim_wait_insn has already
15662
   been called).  */
15663
 
15664
static void
15665
mips_sim_issue_insn (struct mips_sim *state, rtx insn)
15666
{
15667
  curr_state = state->dfa_state;
15668
 
15669
  state_transition (curr_state, insn);
15670
  state->insns_left = targetm.sched.variable_issue (0, false, insn,
15671
                                                    state->insns_left);
15672
 
15673
  mips_sim_insn = insn;
15674
  note_stores (PATTERN (insn), mips_sim_record_set, state);
15675
}
15676
 
15677
/* Simulate issuing a NOP in state STATE.  */
15678
 
15679
static void
15680
mips_sim_issue_nop (struct mips_sim *state)
15681
{
15682
  if (state->insns_left == 0)
15683
    mips_sim_next_cycle (state);
15684
  state->insns_left--;
15685
}
15686
 
15687
/* Update simulation state STATE so that it's ready to accept the instruction
15688
   after INSN.  INSN should be part of the main rtl chain, not a member of a
15689
   SEQUENCE.  */
15690
 
15691
static void
15692
mips_sim_finish_insn (struct mips_sim *state, rtx insn)
15693
{
15694
  /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
15695
  if (JUMP_P (insn))
15696
    mips_sim_issue_nop (state);
15697
 
15698
  switch (GET_CODE (SEQ_BEGIN (insn)))
15699
    {
15700
    case CODE_LABEL:
15701
    case CALL_INSN:
15702
      /* We can't predict the processor state after a call or label.  */
15703
      mips_sim_reset (state);
15704
      break;
15705
 
15706
    case JUMP_INSN:
15707
      /* The delay slots of branch likely instructions are only executed
15708
         when the branch is taken.  Therefore, if the caller has simulated
15709
         the delay slot instruction, STATE does not really reflect the state
15710
         of the pipeline for the instruction after the delay slot.  Also,
15711
         branch likely instructions tend to incur a penalty when not taken,
15712
         so there will probably be an extra delay between the branch and
15713
         the instruction after the delay slot.  */
15714
      if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
15715
        mips_sim_reset (state);
15716
      break;
15717
 
15718
    default:
15719
      break;
15720
    }
15721
}
15722
 
15723
/* Use simulator state STATE to calculate the execution time of
15724
   instruction sequence SEQ.  */
15725
 
15726
static unsigned int
15727
mips_seq_time (struct mips_sim *state, rtx seq)
15728
{
15729
  mips_sim_reset (state);
15730
  for (rtx insn = seq; insn; insn = NEXT_INSN (insn))
15731
    {
15732
      mips_sim_wait_insn (state, insn);
15733
      mips_sim_issue_insn (state, insn);
15734
    }
15735
  return state->time;
15736
}
15737
 
15738
/* Return the execution-time cost of mips_tuning_info.fast_mult_zero_zero_p
15739
   setting SETTING, using STATE to simulate instruction sequences.  */
15740
 
15741
static unsigned int
15742
mips_mult_zero_zero_cost (struct mips_sim *state, bool setting)
15743
{
15744
  mips_tuning_info.fast_mult_zero_zero_p = setting;
15745
  start_sequence ();
15746
 
15747
  enum machine_mode dword_mode = TARGET_64BIT ? TImode : DImode;
15748
  rtx hilo = gen_rtx_REG (dword_mode, MD_REG_FIRST);
15749
  mips_emit_move_or_split (hilo, const0_rtx, SPLIT_FOR_SPEED);
15750
 
15751
  /* If the target provides mulsidi3_32bit then that's the most likely
15752
     consumer of the result.  Test for bypasses.  */
15753
  if (dword_mode == DImode && HAVE_maddsidi4)
15754
    {
15755
      rtx gpr = gen_rtx_REG (SImode, GP_REG_FIRST + 4);
15756
      emit_insn (gen_maddsidi4 (hilo, gpr, gpr, hilo));
15757
    }
15758
 
15759
  unsigned int time = mips_seq_time (state, get_insns ());
15760
  end_sequence ();
15761
  return time;
15762
}
15763
 
15764
/* Check the relative speeds of "MULT $0,$0" and "MTLO $0; MTHI $0"
15765
   and set up mips_tuning_info.fast_mult_zero_zero_p accordingly.
15766
   Prefer MULT -- which is shorter -- in the event of a tie.  */
15767
 
15768
static void
15769
mips_set_fast_mult_zero_zero_p (struct mips_sim *state)
15770
{
15771
  if (TARGET_MIPS16)
15772
    /* No MTLO or MTHI available.  */
15773
    mips_tuning_info.fast_mult_zero_zero_p = true;
15774
  else
15775
    {
15776
      unsigned int true_time = mips_mult_zero_zero_cost (state, true);
15777
      unsigned int false_time = mips_mult_zero_zero_cost (state, false);
15778
      mips_tuning_info.fast_mult_zero_zero_p = (true_time <= false_time);
15779
    }
15780
}
15781
 
15782
/* Set up costs based on the current architecture and tuning settings.  */
15783
 
15784
static void
15785
mips_set_tuning_info (void)
15786
{
15787
  if (mips_tuning_info.initialized_p
15788
      && mips_tuning_info.arch == mips_arch
15789
      && mips_tuning_info.tune == mips_tune
15790
      && mips_tuning_info.mips16_p == TARGET_MIPS16)
15791
    return;
15792
 
15793
  mips_tuning_info.arch = mips_arch;
15794
  mips_tuning_info.tune = mips_tune;
15795
  mips_tuning_info.mips16_p = TARGET_MIPS16;
15796
  mips_tuning_info.initialized_p = true;
15797
 
15798
  dfa_start ();
15799
 
15800
  struct mips_sim state;
15801
  mips_sim_init (&state, alloca (state_size ()));
15802
 
15803
  mips_set_fast_mult_zero_zero_p (&state);
15804
 
15805
  dfa_finish ();
15806
}
15807
 
15808
/* Implement TARGET_EXPAND_TO_RTL_HOOK.  */
15809
 
15810
static void
15811
mips_expand_to_rtl_hook (void)
15812
{
15813
  /* We need to call this at a point where we can safely create sequences
15814
     of instructions, so TARGET_OVERRIDE_OPTIONS is too early.  We also
15815
     need to call it at a point where the DFA infrastructure is not
15816
     already in use, so we can't just call it lazily on demand.
15817
 
15818
     At present, mips_tuning_info is only needed during post-expand
15819
     RTL passes such as split_insns, so this hook should be early enough.
15820
     We may need to move the call elsewhere if mips_tuning_info starts
15821
     to be used for other things (such as rtx_costs, or expanders that
15822
     could be called during gimple optimization).  */
15823
  mips_set_tuning_info ();
15824
}
15825
 
15826
/* The VR4130 pipeline issues aligned pairs of instructions together,
15827
   but it stalls the second instruction if it depends on the first.
15828
   In order to cut down the amount of logic required, this dependence
15829
   check is not based on a full instruction decode.  Instead, any non-SPECIAL
15830
   instruction is assumed to modify the register specified by bits 20-16
15831
   (which is usually the "rt" field).
15832
 
15833
   In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
15834
   input, so we can end up with a false dependence between the branch
15835
   and its delay slot.  If this situation occurs in instruction INSN,
15836
   try to avoid it by swapping rs and rt.  */
15837
 
15838
static void
15839
vr4130_avoid_branch_rt_conflict (rtx insn)
15840
{
15841
  rtx first, second;
15842
 
15843
  first = SEQ_BEGIN (insn);
15844
  second = SEQ_END (insn);
15845
  if (JUMP_P (first)
15846
      && NONJUMP_INSN_P (second)
15847
      && GET_CODE (PATTERN (first)) == SET
15848
      && GET_CODE (SET_DEST (PATTERN (first))) == PC
15849
      && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
15850
    {
15851
      /* Check for the right kind of condition.  */
15852
      rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
15853
      if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
15854
          && REG_P (XEXP (cond, 0))
15855
          && REG_P (XEXP (cond, 1))
15856
          && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
15857
          && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
15858
        {
15859
          /* SECOND mentions the rt register but not the rs register.  */
15860
          rtx tmp = XEXP (cond, 0);
15861
          XEXP (cond, 0) = XEXP (cond, 1);
15862
          XEXP (cond, 1) = tmp;
15863
        }
15864
    }
15865
}
15866
 
15867
/* Implement -mvr4130-align.  Go through each basic block and simulate the
15868
   processor pipeline.  If we find that a pair of instructions could execute
15869
   in parallel, and the first of those instructions is not 8-byte aligned,
15870
   insert a nop to make it aligned.  */
15871
 
15872
static void
15873
vr4130_align_insns (void)
15874
{
15875
  struct mips_sim state;
15876
  rtx insn, subinsn, last, last2, next;
15877
  bool aligned_p;
15878
 
15879
  dfa_start ();
15880
 
15881
  /* LAST is the last instruction before INSN to have a nonzero length.
15882
     LAST2 is the last such instruction before LAST.  */
15883
  last = 0;
15884
  last2 = 0;
15885
 
15886
  /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
15887
  aligned_p = true;
15888
 
15889
  mips_sim_init (&state, alloca (state_size ()));
15890
  for (insn = get_insns (); insn != 0; insn = next)
15891
    {
15892
      unsigned int length;
15893
 
15894
      next = NEXT_INSN (insn);
15895
 
15896
      /* See the comment above vr4130_avoid_branch_rt_conflict for details.
15897
         This isn't really related to the alignment pass, but we do it on
15898
         the fly to avoid a separate instruction walk.  */
15899
      vr4130_avoid_branch_rt_conflict (insn);
15900
 
15901
      length = get_attr_length (insn);
15902
      if (length > 0 && USEFUL_INSN_P (insn))
15903
        FOR_EACH_SUBINSN (subinsn, insn)
15904
          {
15905
            mips_sim_wait_insn (&state, subinsn);
15906
 
15907
            /* If we want this instruction to issue in parallel with the
15908
               previous one, make sure that the previous instruction is
15909
               aligned.  There are several reasons why this isn't worthwhile
15910
               when the second instruction is a call:
15911
 
15912
                  - Calls are less likely to be performance critical,
15913
                  - There's a good chance that the delay slot can execute
15914
                    in parallel with the call.
15915
                  - The return address would then be unaligned.
15916
 
15917
               In general, if we're going to insert a nop between instructions
15918
               X and Y, it's better to insert it immediately after X.  That
15919
               way, if the nop makes Y aligned, it will also align any labels
15920
               between X and Y.  */
15921
            if (state.insns_left != state.issue_rate
15922
                && !CALL_P (subinsn))
15923
              {
15924
                if (subinsn == SEQ_BEGIN (insn) && aligned_p)
15925
                  {
15926
                    /* SUBINSN is the first instruction in INSN and INSN is
15927
                       aligned.  We want to align the previous instruction
15928
                       instead, so insert a nop between LAST2 and LAST.
15929
 
15930
                       Note that LAST could be either a single instruction
15931
                       or a branch with a delay slot.  In the latter case,
15932
                       LAST, like INSN, is already aligned, but the delay
15933
                       slot must have some extra delay that stops it from
15934
                       issuing at the same time as the branch.  We therefore
15935
                       insert a nop before the branch in order to align its
15936
                       delay slot.  */
15937
                    gcc_assert (last2);
15938
                    emit_insn_after (gen_nop (), last2);
15939
                    aligned_p = false;
15940
                  }
15941
                else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
15942
                  {
15943
                    /* SUBINSN is the delay slot of INSN, but INSN is
15944
                       currently unaligned.  Insert a nop between
15945
                       LAST and INSN to align it.  */
15946
                    gcc_assert (last);
15947
                    emit_insn_after (gen_nop (), last);
15948
                    aligned_p = true;
15949
                  }
15950
              }
15951
            mips_sim_issue_insn (&state, subinsn);
15952
          }
15953
      mips_sim_finish_insn (&state, insn);
15954
 
15955
      /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
15956
      length = get_attr_length (insn);
15957
      if (length > 0)
15958
        {
15959
          /* If the instruction is an asm statement or multi-instruction
15960
             mips.md patern, the length is only an estimate.  Insert an
15961
             8 byte alignment after it so that the following instructions
15962
             can be handled correctly.  */
15963
          if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
15964
              && (recog_memoized (insn) < 0 || length >= 8))
15965
            {
15966
              next = emit_insn_after (gen_align (GEN_INT (3)), insn);
15967
              next = NEXT_INSN (next);
15968
              mips_sim_next_cycle (&state);
15969
              aligned_p = true;
15970
            }
15971
          else if (length & 4)
15972
            aligned_p = !aligned_p;
15973
          last2 = last;
15974
          last = insn;
15975
        }
15976
 
15977
      /* See whether INSN is an aligned label.  */
15978
      if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
15979
        aligned_p = true;
15980
    }
15981
  dfa_finish ();
15982
}
15983
 
15984
/* This structure records that the current function has a LO_SUM
15985
   involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
15986
   the largest offset applied to BASE by all such LO_SUMs.  */
15987
struct mips_lo_sum_offset {
15988
  rtx base;
15989
  HOST_WIDE_INT offset;
15990
};
15991
 
15992
/* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
15993
 
15994
static hashval_t
15995
mips_hash_base (rtx base)
15996
{
15997
  int do_not_record_p;
15998
 
15999
  return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
16000
}
16001
 
16002
/* Hashtable helpers.  */
16003
 
16004
struct mips_lo_sum_offset_hasher : typed_free_remove <mips_lo_sum_offset>
16005
{
16006
  typedef mips_lo_sum_offset value_type;
16007
  typedef rtx_def compare_type;
16008
  static inline hashval_t hash (const value_type *);
16009
  static inline bool equal (const value_type *, const compare_type *);
16010
};
16011
 
16012
/* Hash-table callbacks for mips_lo_sum_offsets.  */
16013
 
16014
inline hashval_t
16015
mips_lo_sum_offset_hasher::hash (const value_type *entry)
16016
{
16017
  return mips_hash_base (entry->base);
16018
}
16019
 
16020
inline bool
16021
mips_lo_sum_offset_hasher::equal (const value_type *entry,
16022
                                  const compare_type *value)
16023
{
16024
  return rtx_equal_p (entry->base, value);
16025
}
16026
 
16027
typedef hash_table <mips_lo_sum_offset_hasher> mips_offset_table;
16028
 
16029
/* Look up symbolic constant X in HTAB, which is a hash table of
16030
   mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
16031
   paired with a recorded LO_SUM, otherwise record X in the table.  */
16032
 
16033
static bool
16034
mips_lo_sum_offset_lookup (mips_offset_table htab, rtx x,
16035
                           enum insert_option option)
16036
{
16037
  rtx base, offset;
16038
  mips_lo_sum_offset **slot;
16039
  struct mips_lo_sum_offset *entry;
16040
 
16041
  /* Split X into a base and offset.  */
16042
  split_const (x, &base, &offset);
16043
  if (UNSPEC_ADDRESS_P (base))
16044
    base = UNSPEC_ADDRESS (base);
16045
 
16046
  /* Look up the base in the hash table.  */
16047
  slot = htab.find_slot_with_hash (base, mips_hash_base (base), option);
16048
  if (slot == NULL)
16049
    return false;
16050
 
16051
  entry = (struct mips_lo_sum_offset *) *slot;
16052
  if (option == INSERT)
16053
    {
16054
      if (entry == NULL)
16055
        {
16056
          entry = XNEW (struct mips_lo_sum_offset);
16057
          entry->base = base;
16058
          entry->offset = INTVAL (offset);
16059
          *slot = entry;
16060
        }
16061
      else
16062
        {
16063
          if (INTVAL (offset) > entry->offset)
16064
            entry->offset = INTVAL (offset);
16065
        }
16066
    }
16067
  return INTVAL (offset) <= entry->offset;
16068
}
16069
 
16070
/* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
16071
   Record every LO_SUM in *LOC.  */
16072
 
16073
static int
16074
mips_record_lo_sum (rtx *loc, void *data)
16075
{
16076
  if (GET_CODE (*loc) == LO_SUM)
16077
    mips_lo_sum_offset_lookup (*(mips_offset_table*) data,
16078
                               XEXP (*loc, 1), INSERT);
16079
  return 0;
16080
}
16081
 
16082
/* Return true if INSN is a SET of an orphaned high-part relocation.
16083
   HTAB is a hash table of mips_lo_sum_offsets that describes all the
16084
   LO_SUMs in the current function.  */
16085
 
16086
static bool
16087
mips_orphaned_high_part_p (mips_offset_table htab, rtx insn)
16088
{
16089
  enum mips_symbol_type type;
16090
  rtx x, set;
16091
 
16092
  set = single_set (insn);
16093
  if (set)
16094
    {
16095
      /* Check for %his.  */
16096
      x = SET_SRC (set);
16097
      if (GET_CODE (x) == HIGH
16098
          && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
16099
        return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
16100
 
16101
      /* Check for local %gots (and %got_pages, which is redundant but OK).  */
16102
      if (GET_CODE (x) == UNSPEC
16103
          && XINT (x, 1) == UNSPEC_LOAD_GOT
16104
          && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
16105
                                       SYMBOL_CONTEXT_LEA, &type)
16106
          && type == SYMBOL_GOTOFF_PAGE)
16107
        return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
16108
    }
16109
  return false;
16110
}
16111
 
16112
/* Subroutine of mips_reorg_process_insns.  If there is a hazard between
16113
   INSN and a previous instruction, avoid it by inserting nops after
16114
   instruction AFTER.
16115
 
16116
   *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
16117
   this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
16118
   before using the value of that register.  *HILO_DELAY counts the
16119
   number of instructions since the last hilo hazard (that is,
16120
   the number of instructions since the last MFLO or MFHI).
16121
 
16122
   After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
16123
   for the next instruction.
16124
 
16125
   LO_REG is an rtx for the LO register, used in dependence checking.  */
16126
 
16127
static void
16128
mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
16129
                   rtx *delayed_reg, rtx lo_reg)
16130
{
16131
  rtx pattern, set;
16132
  int nops, ninsns;
16133
 
16134
  pattern = PATTERN (insn);
16135
 
16136
  /* Do not put the whole function in .set noreorder if it contains
16137
     an asm statement.  We don't know whether there will be hazards
16138
     between the asm statement and the gcc-generated code.  */
16139
  if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
16140
    cfun->machine->all_noreorder_p = false;
16141
 
16142
  /* Ignore zero-length instructions (barriers and the like).  */
16143
  ninsns = get_attr_length (insn) / 4;
16144
  if (ninsns == 0)
16145
    return;
16146
 
16147
  /* Work out how many nops are needed.  Note that we only care about
16148
     registers that are explicitly mentioned in the instruction's pattern.
16149
     It doesn't matter that calls use the argument registers or that they
16150
     clobber hi and lo.  */
16151
  if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
16152
    nops = 2 - *hilo_delay;
16153
  else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
16154
    nops = 1;
16155
  else
16156
    nops = 0;
16157
 
16158
  /* Insert the nops between this instruction and the previous one.
16159
     Each new nop takes us further from the last hilo hazard.  */
16160
  *hilo_delay += nops;
16161
  while (nops-- > 0)
16162
    emit_insn_after (gen_hazard_nop (), after);
16163
 
16164
  /* Set up the state for the next instruction.  */
16165
  *hilo_delay += ninsns;
16166
  *delayed_reg = 0;
16167
  if (INSN_CODE (insn) >= 0)
16168
    switch (get_attr_hazard (insn))
16169
      {
16170
      case HAZARD_NONE:
16171
        break;
16172
 
16173
      case HAZARD_HILO:
16174
        *hilo_delay = 0;
16175
        break;
16176
 
16177
      case HAZARD_DELAY:
16178
        set = single_set (insn);
16179
        gcc_assert (set);
16180
        *delayed_reg = SET_DEST (set);
16181
        break;
16182
      }
16183
}
16184
 
16185
/* Go through the instruction stream and insert nops where necessary.
16186
   Also delete any high-part relocations whose partnering low parts
16187
   are now all dead.  See if the whole function can then be put into
16188
   .set noreorder and .set nomacro.  */
16189
 
16190
static void
16191
mips_reorg_process_insns (void)
16192
{
16193
  rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
16194
  int hilo_delay;
16195
  mips_offset_table htab;
16196
 
16197
  /* Force all instructions to be split into their final form.  */
16198
  split_all_insns_noflow ();
16199
 
16200
  /* Recalculate instruction lengths without taking nops into account.  */
16201
  cfun->machine->ignore_hazard_length_p = true;
16202
  shorten_branches (get_insns ());
16203
 
16204
  cfun->machine->all_noreorder_p = true;
16205
 
16206
  /* We don't track MIPS16 PC-relative offsets closely enough to make
16207
     a good job of "set .noreorder" code in MIPS16 mode.  */
16208
  if (TARGET_MIPS16)
16209
    cfun->machine->all_noreorder_p = false;
16210
 
16211
  /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
16212
  if (!TARGET_EXPLICIT_RELOCS)
16213
    cfun->machine->all_noreorder_p = false;
16214
 
16215
  /* Profiled functions can't be all noreorder because the profiler
16216
     support uses assembler macros.  */
16217
  if (crtl->profile)
16218
    cfun->machine->all_noreorder_p = false;
16219
 
16220
  /* Code compiled with -mfix-vr4120, -mfix-rm7000 or -mfix-24k can't be
16221
     all noreorder because we rely on the assembler to work around some
16222
     errata.  The R5900 too has several bugs.  */
16223
  if (TARGET_FIX_VR4120
16224
      || TARGET_FIX_RM7000
16225
      || TARGET_FIX_24K
16226
      || TARGET_MIPS5900)
16227
    cfun->machine->all_noreorder_p = false;
16228
 
16229
  /* The same is true for -mfix-vr4130 if we might generate MFLO or
16230
     MFHI instructions.  Note that we avoid using MFLO and MFHI if
16231
     the VR4130 MACC and DMACC instructions are available instead;
16232
     see the *mfhilo_{si,di}_macc patterns.  */
16233
  if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
16234
    cfun->machine->all_noreorder_p = false;
16235
 
16236
  htab.create (37);
16237
 
16238
  /* Make a first pass over the instructions, recording all the LO_SUMs.  */
16239
  for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
16240
    FOR_EACH_SUBINSN (subinsn, insn)
16241
      if (USEFUL_INSN_P (subinsn))
16242
        {
16243
          rtx body = PATTERN (insn);
16244
          int noperands = asm_noperands (body);
16245
          if (noperands >= 0)
16246
            {
16247
              rtx *ops = XALLOCAVEC (rtx, noperands);
16248
              bool *used = XALLOCAVEC (bool, noperands);
16249
              const char *string = decode_asm_operands (body, ops, NULL, NULL,
16250
                                                        NULL, NULL);
16251
              get_referenced_operands (string, used, noperands);
16252
              for (int i = 0; i < noperands; ++i)
16253
                if (used[i])
16254
                  for_each_rtx (&ops[i], mips_record_lo_sum, &htab);
16255
            }
16256
          else
16257
            for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, &htab);
16258
        }
16259
 
16260
  last_insn = 0;
16261
  hilo_delay = 2;
16262
  delayed_reg = 0;
16263
  lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
16264
 
16265
  /* Make a second pass over the instructions.  Delete orphaned
16266
     high-part relocations or turn them into NOPs.  Avoid hazards
16267
     by inserting NOPs.  */
16268
  for (insn = get_insns (); insn != 0; insn = next_insn)
16269
    {
16270
      next_insn = NEXT_INSN (insn);
16271
      if (USEFUL_INSN_P (insn))
16272
        {
16273
          if (GET_CODE (PATTERN (insn)) == SEQUENCE)
16274
            {
16275
              /* If we find an orphaned high-part relocation in a delay
16276
                 slot, it's easier to turn that instruction into a NOP than
16277
                 to delete it.  The delay slot will be a NOP either way.  */
16278
              FOR_EACH_SUBINSN (subinsn, insn)
16279
                if (INSN_P (subinsn))
16280
                  {
16281
                    if (mips_orphaned_high_part_p (htab, subinsn))
16282
                      {
16283
                        PATTERN (subinsn) = gen_nop ();
16284
                        INSN_CODE (subinsn) = CODE_FOR_nop;
16285
                      }
16286
                    mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
16287
                                       &delayed_reg, lo_reg);
16288
                  }
16289
              last_insn = insn;
16290
            }
16291
          else
16292
            {
16293
              /* INSN is a single instruction.  Delete it if it's an
16294
                 orphaned high-part relocation.  */
16295
              if (mips_orphaned_high_part_p (htab, insn))
16296
                delete_insn (insn);
16297
              /* Also delete cache barriers if the last instruction
16298
                 was an annulled branch.  INSN will not be speculatively
16299
                 executed.  */
16300
              else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
16301
                       && last_insn
16302
                       && JUMP_P (SEQ_BEGIN (last_insn))
16303
                       && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
16304
                delete_insn (insn);
16305
              else
16306
                {
16307
                  mips_avoid_hazard (last_insn, insn, &hilo_delay,
16308
                                     &delayed_reg, lo_reg);
16309
                  last_insn = insn;
16310
                }
16311
            }
16312
        }
16313
    }
16314
 
16315
  htab.dispose ();
16316
}
16317
 
16318
/* Return true if the function has a long branch instruction.  */
16319
 
16320
static bool
16321
mips_has_long_branch_p (void)
16322
{
16323
  rtx insn, subinsn;
16324
  int normal_length;
16325
 
16326
  /* We need up-to-date instruction lengths.  */
16327
  shorten_branches (get_insns ());
16328
 
16329
  /* Look for a branch that is longer than normal.  The normal length for
16330
     non-MIPS16 branches is 8, because the length includes the delay slot.
16331
     It is 4 for MIPS16, because MIPS16 branches are extended instructions,
16332
     but they have no delay slot.  */
16333
  normal_length = (TARGET_MIPS16 ? 4 : 8);
16334
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16335
    FOR_EACH_SUBINSN (subinsn, insn)
16336
      if (JUMP_P (subinsn)
16337
          && get_attr_length (subinsn) > normal_length
16338
          && (any_condjump_p (subinsn) || any_uncondjump_p (subinsn)))
16339
        return true;
16340
 
16341
  return false;
16342
}
16343
 
16344
/* If we are using a GOT, but have not decided to use a global pointer yet,
16345
   see whether we need one to implement long branches.  Convert the ghost
16346
   global-pointer instructions into real ones if so.  */
16347
 
16348
static bool
16349
mips_expand_ghost_gp_insns (void)
16350
{
16351
  /* Quick exit if we already know that we will or won't need a
16352
     global pointer.  */
16353
  if (!TARGET_USE_GOT
16354
      || cfun->machine->global_pointer == INVALID_REGNUM
16355
      || mips_must_initialize_gp_p ())
16356
    return false;
16357
 
16358
  /* Run a full check for long branches.  */
16359
  if (!mips_has_long_branch_p ())
16360
    return false;
16361
 
16362
  /* We've now established that we need $gp.  */
16363
  cfun->machine->must_initialize_gp_p = true;
16364
  split_all_insns_noflow ();
16365
 
16366
  return true;
16367
}
16368
 
16369
/* Subroutine of mips_reorg to manage passes that require DF.  */
16370
 
16371
static void
16372
mips_df_reorg (void)
16373
{
16374
  /* Create def-use chains.  */
16375
  df_set_flags (DF_EQ_NOTES);
16376
  df_chain_add_problem (DF_UD_CHAIN);
16377
  df_analyze ();
16378
 
16379
  if (TARGET_RELAX_PIC_CALLS)
16380
    mips_annotate_pic_calls ();
16381
 
16382
  if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
16383
    r10k_insert_cache_barriers ();
16384
 
16385
  df_finish_pass (false);
16386
}
16387
 
16388
/* Emit code to load LABEL_REF SRC into MIPS16 register DEST.  This is
16389
   called very late in mips_reorg, but the caller is required to run
16390
   mips16_lay_out_constants on the result.  */
16391
 
16392
static void
16393
mips16_load_branch_target (rtx dest, rtx src)
16394
{
16395
  if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
16396
    {
16397
      rtx page, low;
16398
 
16399
      if (mips_cfun_has_cprestore_slot_p ())
16400
        mips_emit_move (dest, mips_cprestore_slot (dest, true));
16401
      else
16402
        mips_emit_move (dest, pic_offset_table_rtx);
16403
      page = mips_unspec_address (src, SYMBOL_GOTOFF_PAGE);
16404
      low = mips_unspec_address (src, SYMBOL_GOT_PAGE_OFST);
16405
      emit_insn (gen_rtx_SET (VOIDmode, dest,
16406
                              PMODE_INSN (gen_unspec_got, (dest, page))));
16407
      emit_insn (gen_rtx_SET (VOIDmode, dest,
16408
                              gen_rtx_LO_SUM (Pmode, dest, low)));
16409
    }
16410
  else
16411
    {
16412
      src = mips_unspec_address (src, SYMBOL_ABSOLUTE);
16413
      mips_emit_move (dest, src);
16414
    }
16415
}
16416
 
16417
/* If we're compiling a MIPS16 function, look for and split any long branches.
16418
   This must be called after all other instruction modifications in
16419
   mips_reorg.  */
16420
 
16421
static void
16422
mips16_split_long_branches (void)
16423
{
16424
  bool something_changed;
16425
 
16426
  if (!TARGET_MIPS16)
16427
    return;
16428
 
16429
  /* Loop until the alignments for all targets are sufficient.  */
16430
  do
16431
    {
16432
      rtx insn;
16433
 
16434
      shorten_branches (get_insns ());
16435
      something_changed = false;
16436
      for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
16437
        if (JUMP_P (insn)
16438
            && get_attr_length (insn) > 4
16439
            && (any_condjump_p (insn) || any_uncondjump_p (insn)))
16440
          {
16441
            rtx old_label, new_label, temp, saved_temp;
16442
            rtx target, jump, jump_sequence;
16443
 
16444
            start_sequence ();
16445
 
16446
            /* Free up a MIPS16 register by saving it in $1.  */
16447
            saved_temp = gen_rtx_REG (Pmode, AT_REGNUM);
16448
            temp = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
16449
            emit_move_insn (saved_temp, temp);
16450
 
16451
            /* Load the branch target into TEMP.  */
16452
            old_label = JUMP_LABEL (insn);
16453
            target = gen_rtx_LABEL_REF (Pmode, old_label);
16454
            mips16_load_branch_target (temp, target);
16455
 
16456
            /* Jump to the target and restore the register's
16457
               original value.  */
16458
            jump = emit_jump_insn (PMODE_INSN (gen_indirect_jump_and_restore,
16459
                                               (temp, temp, saved_temp)));
16460
            JUMP_LABEL (jump) = old_label;
16461
            LABEL_NUSES (old_label)++;
16462
 
16463
            /* Rewrite any symbolic references that are supposed to use
16464
               a PC-relative constant pool.  */
16465
            mips16_lay_out_constants (false);
16466
 
16467
            if (simplejump_p (insn))
16468
              /* We're going to replace INSN with a longer form.  */
16469
              new_label = NULL_RTX;
16470
            else
16471
              {
16472
                /* Create a branch-around label for the original
16473
                   instruction.  */
16474
                new_label = gen_label_rtx ();
16475
                emit_label (new_label);
16476
              }
16477
 
16478
            jump_sequence = get_insns ();
16479
            end_sequence ();
16480
 
16481
            emit_insn_after (jump_sequence, insn);
16482
            if (new_label)
16483
              invert_jump (insn, new_label, false);
16484
            else
16485
              delete_insn (insn);
16486
            something_changed = true;
16487
          }
16488
    }
16489
  while (something_changed);
16490
}
16491
 
16492
/* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
16493
 
16494
static void
16495
mips_reorg (void)
16496
{
16497
  /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  Also during
16498
     insn splitting in mips16_lay_out_constants, DF insn info is only kept up
16499
     to date if the CFG is available.  */
16500
  if (mips_cfg_in_reorg ())
16501
    compute_bb_for_insn ();
16502
  mips16_lay_out_constants (true);
16503
  if (mips_cfg_in_reorg ())
16504
    {
16505
      mips_df_reorg ();
16506
      free_bb_for_insn ();
16507
    }
16508
}
16509
 
16510
/* We use a machine specific pass to do a second machine dependent reorg
16511
   pass after delay branch scheduling.  */
16512
 
16513
static unsigned int
16514
mips_machine_reorg2 (void)
16515
{
16516
  mips_reorg_process_insns ();
16517
  if (!TARGET_MIPS16
16518
      && TARGET_EXPLICIT_RELOCS
16519
      && TUNE_MIPS4130
16520
      && TARGET_VR4130_ALIGN)
16521
    vr4130_align_insns ();
16522
  if (mips_expand_ghost_gp_insns ())
16523
    /* The expansion could invalidate some of the VR4130 alignment
16524
       optimizations, but this should be an extremely rare case anyhow.  */
16525
    mips_reorg_process_insns ();
16526
  mips16_split_long_branches ();
16527
  return 0;
16528
}
16529
 
16530
namespace {
16531
 
16532
const pass_data pass_data_mips_machine_reorg2 =
16533
{
16534
  RTL_PASS, /* type */
16535
  "mach2", /* name */
16536
  OPTGROUP_NONE, /* optinfo_flags */
16537
  false, /* has_gate */
16538
  true, /* has_execute */
16539
  TV_MACH_DEP, /* tv_id */
16540
  0, /* properties_required */
16541
  0, /* properties_provided */
16542
  0, /* properties_destroyed */
16543
  0, /* todo_flags_start */
16544
  TODO_verify_rtl_sharing, /* todo_flags_finish */
16545
};
16546
 
16547
class pass_mips_machine_reorg2 : public rtl_opt_pass
16548
{
16549
public:
16550
  pass_mips_machine_reorg2(gcc::context *ctxt)
16551
    : rtl_opt_pass(pass_data_mips_machine_reorg2, ctxt)
16552
  {}
16553
 
16554
  /* opt_pass methods: */
16555
  unsigned int execute () { return mips_machine_reorg2 (); }
16556
 
16557
}; // class pass_mips_machine_reorg2
16558
 
16559
} // anon namespace
16560
 
16561
rtl_opt_pass *
16562
make_pass_mips_machine_reorg2 (gcc::context *ctxt)
16563
{
16564
  return new pass_mips_machine_reorg2 (ctxt);
16565
}
16566
 
16567
 
16568
/* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
16569
   in order to avoid duplicating too much logic from elsewhere.  */
16570
 
16571
static void
16572
mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
16573
                      HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
16574
                      tree function)
16575
{
16576
  rtx this_rtx, temp1, temp2, insn, fnaddr;
16577
  bool use_sibcall_p;
16578
 
16579
  /* Pretend to be a post-reload pass while generating rtl.  */
16580
  reload_completed = 1;
16581
 
16582
  /* Mark the end of the (empty) prologue.  */
16583
  emit_note (NOTE_INSN_PROLOGUE_END);
16584
 
16585
  /* Determine if we can use a sibcall to call FUNCTION directly.  */
16586
  fnaddr = XEXP (DECL_RTL (function), 0);
16587
  use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
16588
                   && const_call_insn_operand (fnaddr, Pmode));
16589
 
16590
  /* Determine if we need to load FNADDR from the GOT.  */
16591
  if (!use_sibcall_p
16592
      && (mips_got_symbol_type_p
16593
          (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
16594
    {
16595
      /* Pick a global pointer.  Use a call-clobbered register if
16596
         TARGET_CALL_SAVED_GP.  */
16597
      cfun->machine->global_pointer
16598
        = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
16599
      cfun->machine->must_initialize_gp_p = true;
16600
      SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
16601
 
16602
      /* Set up the global pointer for n32 or n64 abicalls.  */
16603
      mips_emit_loadgp ();
16604
    }
16605
 
16606
  /* We need two temporary registers in some cases.  */
16607
  temp1 = gen_rtx_REG (Pmode, 2);
16608
  temp2 = gen_rtx_REG (Pmode, 3);
16609
 
16610
  /* Find out which register contains the "this" pointer.  */
16611
  if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
16612
    this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
16613
  else
16614
    this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
16615
 
16616
  /* Add DELTA to THIS_RTX.  */
16617
  if (delta != 0)
16618
    {
16619
      rtx offset = GEN_INT (delta);
16620
      if (!SMALL_OPERAND (delta))
16621
        {
16622
          mips_emit_move (temp1, offset);
16623
          offset = temp1;
16624
        }
16625
      emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
16626
    }
16627
 
16628
  /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
16629
  if (vcall_offset != 0)
16630
    {
16631
      rtx addr;
16632
 
16633
      /* Set TEMP1 to *THIS_RTX.  */
16634
      mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
16635
 
16636
      /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
16637
      addr = mips_add_offset (temp2, temp1, vcall_offset);
16638
 
16639
      /* Load the offset and add it to THIS_RTX.  */
16640
      mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
16641
      emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
16642
    }
16643
 
16644
  /* Jump to the target function.  Use a sibcall if direct jumps are
16645
     allowed, otherwise load the address into a register first.  */
16646
  if (use_sibcall_p)
16647
    {
16648
      insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
16649
      SIBLING_CALL_P (insn) = 1;
16650
    }
16651
  else
16652
    {
16653
      /* This is messy.  GAS treats "la $25,foo" as part of a call
16654
         sequence and may allow a global "foo" to be lazily bound.
16655
         The general move patterns therefore reject this combination.
16656
 
16657
         In this context, lazy binding would actually be OK
16658
         for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
16659
         TARGET_CALL_SAVED_GP; see mips_load_call_address.
16660
         We must therefore load the address via a temporary
16661
         register if mips_dangerous_for_la25_p.
16662
 
16663
         If we jump to the temporary register rather than $25,
16664
         the assembler can use the move insn to fill the jump's
16665
         delay slot.
16666
 
16667
         We can use the same technique for MIPS16 code, where $25
16668
         is not a valid JR register.  */
16669
      if (TARGET_USE_PIC_FN_ADDR_REG
16670
          && !TARGET_MIPS16
16671
          && !mips_dangerous_for_la25_p (fnaddr))
16672
        temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
16673
      mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
16674
 
16675
      if (TARGET_USE_PIC_FN_ADDR_REG
16676
          && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
16677
        mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
16678
      emit_jump_insn (gen_indirect_jump (temp1));
16679
    }
16680
 
16681
  /* Run just enough of rest_of_compilation.  This sequence was
16682
     "borrowed" from alpha.c.  */
16683
  insn = get_insns ();
16684
  split_all_insns_noflow ();
16685
  mips16_lay_out_constants (true);
16686
  shorten_branches (insn);
16687
  final_start_function (insn, file, 1);
16688
  final (insn, file, 1);
16689
  final_end_function ();
16690
 
16691
  /* Clean up the vars set above.  Note that final_end_function resets
16692
     the global pointer for us.  */
16693
  reload_completed = 0;
16694
}
16695
 
16696
 
16697
/* The last argument passed to mips_set_compression_mode,
16698
   or negative if the function hasn't been called yet.  */
16699
static unsigned int old_compression_mode = -1;
16700
 
16701
/* Set up the target-dependent global state for ISA mode COMPRESSION_MODE,
16702
   which is either MASK_MIPS16 or MASK_MICROMIPS.  */
16703
 
16704
static void
16705
mips_set_compression_mode (unsigned int compression_mode)
16706
{
16707
 
16708
  if (compression_mode == old_compression_mode)
16709
    return;
16710
 
16711
  /* Restore base settings of various flags.  */
16712
  target_flags = mips_base_target_flags;
16713
  flag_schedule_insns = mips_base_schedule_insns;
16714
  flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
16715
  flag_move_loop_invariants = mips_base_move_loop_invariants;
16716
  align_loops = mips_base_align_loops;
16717
  align_jumps = mips_base_align_jumps;
16718
  align_functions = mips_base_align_functions;
16719
  target_flags &= ~(MASK_MIPS16 | MASK_MICROMIPS);
16720
  target_flags |= compression_mode;
16721
 
16722
  if (compression_mode & MASK_MIPS16)
16723
    {
16724
      /* Switch to MIPS16 mode.  */
16725
      target_flags |= MASK_MIPS16;
16726
 
16727
      /* Turn off SYNCI if it was on, MIPS16 doesn't support it.  */
16728
      target_flags &= ~MASK_SYNCI;
16729
 
16730
      /* Don't run the scheduler before reload, since it tends to
16731
         increase register pressure.  */
16732
      flag_schedule_insns = 0;
16733
 
16734
      /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
16735
         the whole function to be in a single section.  */
16736
      flag_reorder_blocks_and_partition = 0;
16737
 
16738
      /* Don't move loop invariants, because it tends to increase
16739
         register pressure.  It also introduces an extra move in cases
16740
         where the constant is the first operand in a two-operand binary
16741
         instruction, or when it forms a register argument to a functon
16742
         call.  */
16743
      flag_move_loop_invariants = 0;
16744
 
16745
      target_flags |= MASK_EXPLICIT_RELOCS;
16746
 
16747
      /* Experiments suggest we get the best overall section-anchor
16748
         results from using the range of an unextended LW or SW.  Code
16749
         that makes heavy use of byte or short accesses can do better
16750
         with ranges of 0...31 and 0...63 respectively, but most code is
16751
         sensitive to the range of LW and SW instead.  */
16752
      targetm.min_anchor_offset = 0;
16753
      targetm.max_anchor_offset = 127;
16754
 
16755
      targetm.const_anchor = 0;
16756
 
16757
      /* MIPS16 has no BAL instruction.  */
16758
      target_flags &= ~MASK_RELAX_PIC_CALLS;
16759
 
16760
      /* The R4000 errata don't apply to any known MIPS16 cores.
16761
         It's simpler to make the R4000 fixes and MIPS16 mode
16762
         mutually exclusive.  */
16763
      target_flags &= ~MASK_FIX_R4000;
16764
 
16765
      if (flag_pic && !TARGET_OLDABI)
16766
        sorry ("MIPS16 PIC for ABIs other than o32 and o64");
16767
 
16768
      if (TARGET_XGOT)
16769
        sorry ("MIPS16 -mxgot code");
16770
 
16771
      if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
16772
        sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
16773
    }
16774
  else
16775
    {
16776
      /* Switch to microMIPS or the standard encoding.  */
16777
 
16778
      if (TARGET_MICROMIPS)
16779
        /* Avoid branch likely.  */
16780
        target_flags &= ~MASK_BRANCHLIKELY;
16781
 
16782
      /* Provide default values for align_* for 64-bit targets.  */
16783
      if (TARGET_64BIT)
16784
        {
16785
          if (align_loops == 0)
16786
            align_loops = 8;
16787
          if (align_jumps == 0)
16788
            align_jumps = 8;
16789
          if (align_functions == 0)
16790
            align_functions = 8;
16791
        }
16792
 
16793
      targetm.min_anchor_offset = -32768;
16794
      targetm.max_anchor_offset = 32767;
16795
 
16796
      targetm.const_anchor = 0x8000;
16797
    }
16798
 
16799
  /* (Re)initialize MIPS target internals for new ISA.  */
16800
  mips_init_relocs ();
16801
 
16802
  if (compression_mode & MASK_MIPS16)
16803
    {
16804
      if (!mips16_globals)
16805
        mips16_globals = save_target_globals_default_opts ();
16806
      else
16807
        restore_target_globals (mips16_globals);
16808
    }
16809
  else
16810
    restore_target_globals (&default_target_globals);
16811
 
16812
  old_compression_mode = compression_mode;
16813
}
16814
 
16815
/* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
16816
   function should use the MIPS16 or microMIPS ISA and switch modes
16817
   accordingly.  */
16818
 
16819
static void
16820
mips_set_current_function (tree fndecl)
16821
{
16822
  mips_set_compression_mode (mips_get_compress_mode (fndecl));
16823
}
16824
 
16825
/* Allocate a chunk of memory for per-function machine-dependent data.  */
16826
 
16827
static struct machine_function *
16828
mips_init_machine_status (void)
16829
{
16830
  return ggc_alloc_cleared_machine_function ();
16831
}
16832
 
16833
/* Return the processor associated with the given ISA level, or null
16834
   if the ISA isn't valid.  */
16835
 
16836
static const struct mips_cpu_info *
16837
mips_cpu_info_from_isa (int isa)
16838
{
16839
  unsigned int i;
16840
 
16841
  for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
16842
    if (mips_cpu_info_table[i].isa == isa)
16843
      return mips_cpu_info_table + i;
16844
 
16845
  return NULL;
16846
}
16847
 
16848
/* Return a mips_cpu_info entry determined by an option valued
16849
   OPT.  */
16850
 
16851
static const struct mips_cpu_info *
16852
mips_cpu_info_from_opt (int opt)
16853
{
16854
  switch (opt)
16855
    {
16856
    case MIPS_ARCH_OPTION_FROM_ABI:
16857
      /* 'from-abi' selects the most compatible architecture for the
16858
         given ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit
16859
         ABIs.  For the EABIs, we have to decide whether we're using
16860
         the 32-bit or 64-bit version.  */
16861
      return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
16862
                                     : ABI_NEEDS_64BIT_REGS ? 3
16863
                                     : (TARGET_64BIT ? 3 : 1));
16864
 
16865
    case MIPS_ARCH_OPTION_NATIVE:
16866
      gcc_unreachable ();
16867
 
16868
    default:
16869
      return &mips_cpu_info_table[opt];
16870
    }
16871
}
16872
 
16873
/* Return a default mips_cpu_info entry, given that no -march= option
16874
   was explicitly specified.  */
16875
 
16876
static const struct mips_cpu_info *
16877
mips_default_arch (void)
16878
{
16879
#if defined (MIPS_CPU_STRING_DEFAULT)
16880
  unsigned int i;
16881
  for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
16882
    if (strcmp (mips_cpu_info_table[i].name, MIPS_CPU_STRING_DEFAULT) == 0)
16883
      return mips_cpu_info_table + i;
16884
  gcc_unreachable ();
16885
#elif defined (MIPS_ISA_DEFAULT)
16886
  return mips_cpu_info_from_isa (MIPS_ISA_DEFAULT);
16887
#else
16888
  /* 'from-abi' makes a good default: you get whatever the ABI
16889
     requires.  */
16890
  return mips_cpu_info_from_opt (MIPS_ARCH_OPTION_FROM_ABI);
16891
#endif
16892
}
16893
 
16894
/* Set up globals to generate code for the ISA or processor
16895
   described by INFO.  */
16896
 
16897
static void
16898
mips_set_architecture (const struct mips_cpu_info *info)
16899
{
16900
  if (info != 0)
16901
    {
16902
      mips_arch_info = info;
16903
      mips_arch = info->cpu;
16904
      mips_isa = info->isa;
16905
    }
16906
}
16907
 
16908
/* Likewise for tuning.  */
16909
 
16910
static void
16911
mips_set_tune (const struct mips_cpu_info *info)
16912
{
16913
  if (info != 0)
16914
    {
16915
      mips_tune_info = info;
16916
      mips_tune = info->cpu;
16917
    }
16918
}
16919
 
16920
/* Implement TARGET_OPTION_OVERRIDE.  */
16921
 
16922
static void
16923
mips_option_override (void)
16924
{
16925
  int i, start, regno, mode;
16926
 
16927
  if (global_options_set.x_mips_isa_option)
16928
    mips_isa_option_info = &mips_cpu_info_table[mips_isa_option];
16929
 
16930
#ifdef SUBTARGET_OVERRIDE_OPTIONS
16931
  SUBTARGET_OVERRIDE_OPTIONS;
16932
#endif
16933
 
16934
  /* MIPS16 and microMIPS cannot coexist.  */
16935
  if (TARGET_MICROMIPS && TARGET_MIPS16)
16936
    error ("unsupported combination: %s", "-mips16 -mmicromips");
16937
 
16938
  /* Save the base compression state and process flags as though we
16939
     were generating uncompressed code.  */
16940
  mips_base_compression_flags = TARGET_COMPRESSION;
16941
  target_flags &= ~TARGET_COMPRESSION;
16942
 
16943
  /* -mno-float overrides -mhard-float and -msoft-float.  */
16944
  if (TARGET_NO_FLOAT)
16945
    {
16946
      target_flags |= MASK_SOFT_FLOAT_ABI;
16947
      target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
16948
    }
16949
 
16950
  if (TARGET_FLIP_MIPS16)
16951
    TARGET_INTERLINK_COMPRESSED = 1;
16952
 
16953
  /* Set the small data limit.  */
16954
  mips_small_data_threshold = (global_options_set.x_g_switch_value
16955
                               ? g_switch_value
16956
                               : MIPS_DEFAULT_GVALUE);
16957
 
16958
  /* The following code determines the architecture and register size.
16959
     Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
16960
     The GAS and GCC code should be kept in sync as much as possible.  */
16961
 
16962
  if (global_options_set.x_mips_arch_option)
16963
    mips_set_architecture (mips_cpu_info_from_opt (mips_arch_option));
16964
 
16965
  if (mips_isa_option_info != 0)
16966
    {
16967
      if (mips_arch_info == 0)
16968
        mips_set_architecture (mips_isa_option_info);
16969
      else if (mips_arch_info->isa != mips_isa_option_info->isa)
16970
        error ("%<-%s%> conflicts with the other architecture options, "
16971
               "which specify a %s processor",
16972
               mips_isa_option_info->name,
16973
               mips_cpu_info_from_isa (mips_arch_info->isa)->name);
16974
    }
16975
 
16976
  if (mips_arch_info == 0)
16977
    mips_set_architecture (mips_default_arch ());
16978
 
16979
  if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
16980
    error ("%<-march=%s%> is not compatible with the selected ABI",
16981
           mips_arch_info->name);
16982
 
16983
  /* Optimize for mips_arch, unless -mtune selects a different processor.  */
16984
  if (global_options_set.x_mips_tune_option)
16985
    mips_set_tune (mips_cpu_info_from_opt (mips_tune_option));
16986
 
16987
  if (mips_tune_info == 0)
16988
    mips_set_tune (mips_arch_info);
16989
 
16990
  if ((target_flags_explicit & MASK_64BIT) != 0)
16991
    {
16992
      /* The user specified the size of the integer registers.  Make sure
16993
         it agrees with the ABI and ISA.  */
16994
      if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
16995
        error ("%<-mgp64%> used with a 32-bit processor");
16996
      else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
16997
        error ("%<-mgp32%> used with a 64-bit ABI");
16998
      else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
16999
        error ("%<-mgp64%> used with a 32-bit ABI");
17000
    }
17001
  else
17002
    {
17003
      /* Infer the integer register size from the ABI and processor.
17004
         Restrict ourselves to 32-bit registers if that's all the
17005
         processor has, or if the ABI cannot handle 64-bit registers.  */
17006
      if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
17007
        target_flags &= ~MASK_64BIT;
17008
      else
17009
        target_flags |= MASK_64BIT;
17010
    }
17011
 
17012
  if ((target_flags_explicit & MASK_FLOAT64) != 0)
17013
    {
17014
      if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
17015
        error ("unsupported combination: %s", "-mfp64 -msingle-float");
17016
      else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
17017
        error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
17018
      else if (!TARGET_64BIT && TARGET_FLOAT64)
17019
        {
17020
          if (!ISA_HAS_MXHC1)
17021
            error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
17022
                   " the target supports the mfhc1 and mthc1 instructions");
17023
          else if (mips_abi != ABI_32)
17024
            error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
17025
                   " the o32 ABI");
17026
        }
17027
    }
17028
  else
17029
    {
17030
      /* -msingle-float selects 32-bit float registers.  Otherwise the
17031
         float registers should be the same size as the integer ones.  */
17032
      if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
17033
        target_flags |= MASK_FLOAT64;
17034
      else
17035
        target_flags &= ~MASK_FLOAT64;
17036
    }
17037
 
17038
  /* End of code shared with GAS.  */
17039
 
17040
  /* The R5900 FPU only supports single precision.  */
17041
  if (TARGET_MIPS5900 && TARGET_HARD_FLOAT_ABI && TARGET_DOUBLE_FLOAT)
17042
    error ("unsupported combination: %s",
17043
           "-march=r5900 -mhard-float -mdouble-float");
17044
 
17045
  /* If a -mlong* option was given, check that it matches the ABI,
17046
     otherwise infer the -mlong* setting from the other options.  */
17047
  if ((target_flags_explicit & MASK_LONG64) != 0)
17048
    {
17049
      if (TARGET_LONG64)
17050
        {
17051
          if (mips_abi == ABI_N32)
17052
            error ("%qs is incompatible with %qs", "-mabi=n32", "-mlong64");
17053
          else if (mips_abi == ABI_32)
17054
            error ("%qs is incompatible with %qs", "-mabi=32", "-mlong64");
17055
          else if (mips_abi == ABI_O64 && TARGET_ABICALLS)
17056
            /* We have traditionally allowed non-abicalls code to use
17057
               an LP64 form of o64.  However, it would take a bit more
17058
               effort to support the combination of 32-bit GOT entries
17059
               and 64-bit pointers, so we treat the abicalls case as
17060
               an error.  */
17061
            error ("the combination of %qs and %qs is incompatible with %qs",
17062
                   "-mabi=o64", "-mabicalls", "-mlong64");
17063
        }
17064
      else
17065
        {
17066
          if (mips_abi == ABI_64)
17067
            error ("%qs is incompatible with %qs", "-mabi=64", "-mlong32");
17068
        }
17069
    }
17070
  else
17071
    {
17072
      if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
17073
        target_flags |= MASK_LONG64;
17074
      else
17075
        target_flags &= ~MASK_LONG64;
17076
    }
17077
 
17078
  if (!TARGET_OLDABI)
17079
    flag_pcc_struct_return = 0;
17080
 
17081
  /* Decide which rtx_costs structure to use.  */
17082
  if (optimize_size)
17083
    mips_cost = &mips_rtx_cost_optimize_size;
17084
  else
17085
    mips_cost = &mips_rtx_cost_data[mips_tune];
17086
 
17087
  /* If the user hasn't specified a branch cost, use the processor's
17088
     default.  */
17089
  if (mips_branch_cost == 0)
17090
    mips_branch_cost = mips_cost->branch_cost;
17091
 
17092
  /* If neither -mbranch-likely nor -mno-branch-likely was given
17093
     on the command line, set MASK_BRANCHLIKELY based on the target
17094
     architecture and tuning flags.  Annulled delay slots are a
17095
     size win, so we only consider the processor-specific tuning
17096
     for !optimize_size.  */
17097
  if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
17098
    {
17099
      if (ISA_HAS_BRANCHLIKELY
17100
          && (optimize_size
17101
              || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
17102
        target_flags |= MASK_BRANCHLIKELY;
17103
      else
17104
        target_flags &= ~MASK_BRANCHLIKELY;
17105
    }
17106
  else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
17107
    warning (0, "the %qs architecture does not support branch-likely"
17108
             " instructions", mips_arch_info->name);
17109
 
17110
  /* If the user hasn't specified -mimadd or -mno-imadd set
17111
     MASK_IMADD based on the target architecture and tuning
17112
     flags.  */
17113
  if ((target_flags_explicit & MASK_IMADD) == 0)
17114
    {
17115
      if (ISA_HAS_MADD_MSUB &&
17116
          (mips_tune_info->tune_flags & PTF_AVOID_IMADD) == 0)
17117
        target_flags |= MASK_IMADD;
17118
      else
17119
        target_flags &= ~MASK_IMADD;
17120
    }
17121
  else if (TARGET_IMADD && !ISA_HAS_MADD_MSUB)
17122
    warning (0, "the %qs architecture does not support madd or msub"
17123
             " instructions", mips_arch_info->name);
17124
 
17125
  /* The effect of -mabicalls isn't defined for the EABI.  */
17126
  if (mips_abi == ABI_EABI && TARGET_ABICALLS)
17127
    {
17128
      error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
17129
      target_flags &= ~MASK_ABICALLS;
17130
    }
17131
 
17132
  /* PIC requires -mabicalls.  */
17133
  if (flag_pic)
17134
    {
17135
      if (mips_abi == ABI_EABI)
17136
        error ("cannot generate position-independent code for %qs",
17137
               "-mabi=eabi");
17138
      else if (!TARGET_ABICALLS)
17139
        error ("position-independent code requires %qs", "-mabicalls");
17140
    }
17141
 
17142
  if (TARGET_ABICALLS_PIC2)
17143
    /* We need to set flag_pic for executables as well as DSOs
17144
       because we may reference symbols that are not defined in
17145
       the final executable.  (MIPS does not use things like
17146
       copy relocs, for example.)
17147
 
17148
       There is a body of code that uses __PIC__ to distinguish
17149
       between -mabicalls and -mno-abicalls code.  The non-__PIC__
17150
       variant is usually appropriate for TARGET_ABICALLS_PIC0, as
17151
       long as any indirect jumps use $25.  */
17152
    flag_pic = 1;
17153
 
17154
  /* -mvr4130-align is a "speed over size" optimization: it usually produces
17155
     faster code, but at the expense of more nops.  Enable it at -O3 and
17156
     above.  */
17157
  if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
17158
    target_flags |= MASK_VR4130_ALIGN;
17159
 
17160
  /* Prefer a call to memcpy over inline code when optimizing for size,
17161
     though see MOVE_RATIO in mips.h.  */
17162
  if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
17163
    target_flags |= MASK_MEMCPY;
17164
 
17165
  /* If we have a nonzero small-data limit, check that the -mgpopt
17166
     setting is consistent with the other target flags.  */
17167
  if (mips_small_data_threshold > 0)
17168
    {
17169
      if (!TARGET_GPOPT)
17170
        {
17171
          if (!TARGET_EXPLICIT_RELOCS)
17172
            error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
17173
 
17174
          TARGET_LOCAL_SDATA = false;
17175
          TARGET_EXTERN_SDATA = false;
17176
        }
17177
      else
17178
        {
17179
          if (TARGET_VXWORKS_RTP)
17180
            warning (0, "cannot use small-data accesses for %qs", "-mrtp");
17181
 
17182
          if (TARGET_ABICALLS)
17183
            warning (0, "cannot use small-data accesses for %qs",
17184
                     "-mabicalls");
17185
        }
17186
    }
17187
 
17188
  /* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
17189
     for all its floating point.  */
17190
  if (mips_nan != MIPS_IEEE_754_2008)
17191
    {
17192
      REAL_MODE_FORMAT (SFmode) = &mips_single_format;
17193
      REAL_MODE_FORMAT (DFmode) = &mips_double_format;
17194
      REAL_MODE_FORMAT (TFmode) = &mips_quad_format;
17195
    }
17196
 
17197
  /* Make sure that the user didn't turn off paired single support when
17198
     MIPS-3D support is requested.  */
17199
  if (TARGET_MIPS3D
17200
      && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
17201
      && !TARGET_PAIRED_SINGLE_FLOAT)
17202
    error ("%<-mips3d%> requires %<-mpaired-single%>");
17203
 
17204
  /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
17205
  if (TARGET_MIPS3D)
17206
    target_flags |= MASK_PAIRED_SINGLE_FLOAT;
17207
 
17208
  /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
17209
     and TARGET_HARD_FLOAT_ABI are both true.  */
17210
  if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
17211
    {
17212
      error ("%qs must be used with %qs",
17213
             TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
17214
             TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
17215
      target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17216
      TARGET_MIPS3D = 0;
17217
    }
17218
 
17219
  /* Make sure that -mpaired-single is only used on ISAs that support it.
17220
     We must disable it otherwise since it relies on other ISA properties
17221
     like ISA_HAS_8CC having their normal values.  */
17222
  if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
17223
    {
17224
      error ("the %qs architecture does not support paired-single"
17225
             " instructions", mips_arch_info->name);
17226
      target_flags &= ~MASK_PAIRED_SINGLE_FLOAT;
17227
      TARGET_MIPS3D = 0;
17228
    }
17229
 
17230
  if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
17231
      && !TARGET_CACHE_BUILTIN)
17232
    {
17233
      error ("%qs requires a target that provides the %qs instruction",
17234
             "-mr10k-cache-barrier", "cache");
17235
      mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
17236
    }
17237
 
17238
  /* If TARGET_DSPR2, enable TARGET_DSP.  */
17239
  if (TARGET_DSPR2)
17240
    TARGET_DSP = true;
17241
 
17242
  /* .eh_frame addresses should be the same width as a C pointer.
17243
     Most MIPS ABIs support only one pointer size, so the assembler
17244
     will usually know exactly how big an .eh_frame address is.
17245
 
17246
     Unfortunately, this is not true of the 64-bit EABI.  The ABI was
17247
     originally defined to use 64-bit pointers (i.e. it is LP64), and
17248
     this is still the default mode.  However, we also support an n32-like
17249
     ILP32 mode, which is selected by -mlong32.  The problem is that the
17250
     assembler has traditionally not had an -mlong option, so it has
17251
     traditionally not known whether we're using the ILP32 or LP64 form.
17252
 
17253
     As it happens, gas versions up to and including 2.19 use _32-bit_
17254
     addresses for EABI64 .cfi_* directives.  This is wrong for the
17255
     default LP64 mode, so we can't use the directives by default.
17256
     Moreover, since gas's current behavior is at odds with gcc's
17257
     default behavior, it seems unwise to rely on future versions
17258
     of gas behaving the same way.  We therefore avoid using .cfi
17259
     directives for -mlong32 as well.  */
17260
  if (mips_abi == ABI_EABI && TARGET_64BIT)
17261
    flag_dwarf2_cfi_asm = 0;
17262
 
17263
  /* .cfi_* directives generate a read-only section, so fall back on
17264
     manual .eh_frame creation if we need the section to be writable.  */
17265
  if (TARGET_WRITABLE_EH_FRAME)
17266
    flag_dwarf2_cfi_asm = 0;
17267
 
17268
  mips_init_print_operand_punct ();
17269
 
17270
  /* Set up array to map GCC register number to debug register number.
17271
     Ignore the special purpose register numbers.  */
17272
 
17273
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17274
    {
17275
      mips_dbx_regno[i] = IGNORED_DWARF_REGNUM;
17276
      if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
17277
        mips_dwarf_regno[i] = i;
17278
      else
17279
        mips_dwarf_regno[i] = INVALID_REGNUM;
17280
    }
17281
 
17282
  start = GP_DBX_FIRST - GP_REG_FIRST;
17283
  for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
17284
    mips_dbx_regno[i] = i + start;
17285
 
17286
  start = FP_DBX_FIRST - FP_REG_FIRST;
17287
  for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
17288
    mips_dbx_regno[i] = i + start;
17289
 
17290
  /* Accumulator debug registers use big-endian ordering.  */
17291
  mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
17292
  mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
17293
  mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
17294
  mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
17295
  for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
17296
    {
17297
      mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
17298
      mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
17299
    }
17300
 
17301
  /* Set up mips_hard_regno_mode_ok.  */
17302
  for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
17303
    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
17304
      mips_hard_regno_mode_ok[mode][regno]
17305
        = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
17306
 
17307
  /* Function to allocate machine-dependent function status.  */
17308
  init_machine_status = &mips_init_machine_status;
17309
 
17310
  /* Default to working around R4000 errata only if the processor
17311
     was selected explicitly.  */
17312
  if ((target_flags_explicit & MASK_FIX_R4000) == 0
17313
      && strcmp (mips_arch_info->name, "r4000") == 0)
17314
    target_flags |= MASK_FIX_R4000;
17315
 
17316
  /* Default to working around R4400 errata only if the processor
17317
     was selected explicitly.  */
17318
  if ((target_flags_explicit & MASK_FIX_R4400) == 0
17319
      && strcmp (mips_arch_info->name, "r4400") == 0)
17320
    target_flags |= MASK_FIX_R4400;
17321
 
17322
  /* Default to working around R10000 errata only if the processor
17323
     was selected explicitly.  */
17324
  if ((target_flags_explicit & MASK_FIX_R10000) == 0
17325
      && strcmp (mips_arch_info->name, "r10000") == 0)
17326
    target_flags |= MASK_FIX_R10000;
17327
 
17328
  /* Make sure that branch-likely instructions available when using
17329
     -mfix-r10000.  The instructions are not available if either:
17330
 
17331
        1. -mno-branch-likely was passed.
17332
        2. The selected ISA does not support branch-likely and
17333
           the command line does not include -mbranch-likely.  */
17334
  if (TARGET_FIX_R10000
17335
      && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
17336
          ? !ISA_HAS_BRANCHLIKELY
17337
          : !TARGET_BRANCHLIKELY))
17338
    sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
17339
 
17340
  if (TARGET_SYNCI && !ISA_HAS_SYNCI)
17341
    {
17342
      warning (0, "the %qs architecture does not support the synci "
17343
               "instruction", mips_arch_info->name);
17344
      target_flags &= ~MASK_SYNCI;
17345
    }
17346
 
17347
  /* Only optimize PIC indirect calls if they are actually required.  */
17348
  if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
17349
    target_flags &= ~MASK_RELAX_PIC_CALLS;
17350
 
17351
  /* Save base state of options.  */
17352
  mips_base_target_flags = target_flags;
17353
  mips_base_schedule_insns = flag_schedule_insns;
17354
  mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
17355
  mips_base_move_loop_invariants = flag_move_loop_invariants;
17356
  mips_base_align_loops = align_loops;
17357
  mips_base_align_jumps = align_jumps;
17358
  mips_base_align_functions = align_functions;
17359
 
17360
  /* Now select the ISA mode.
17361
 
17362
     Do all CPP-sensitive stuff in uncompressed mode; we'll switch modes
17363
     later if required.  */
17364
  mips_set_compression_mode (0);
17365
 
17366
  /* We register a second machine specific reorg pass after delay slot
17367
     filling.  Registering the pass must be done at start up.  It's
17368
     convenient to do it here.  */
17369
  opt_pass *new_pass = make_pass_mips_machine_reorg2 (g);
17370
  struct register_pass_info insert_pass_mips_machine_reorg2 =
17371
    {
17372
      new_pass,         /* pass */
17373
      "dbr",                    /* reference_pass_name */
17374
      1,                        /* ref_pass_instance_number */
17375
      PASS_POS_INSERT_AFTER     /* po_op */
17376
    };
17377
  register_pass (&insert_pass_mips_machine_reorg2);
17378
 
17379
  if (TARGET_HARD_FLOAT_ABI && TARGET_MIPS5900)
17380
    REAL_MODE_FORMAT (SFmode) = &spu_single_format;
17381
}
17382
 
17383
/* Swap the register information for registers I and I + 1, which
17384
   currently have the wrong endianness.  Note that the registers'
17385
   fixedness and call-clobberedness might have been set on the
17386
   command line.  */
17387
 
17388
static void
17389
mips_swap_registers (unsigned int i)
17390
{
17391
  int tmpi;
17392
  const char *tmps;
17393
 
17394
#define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
17395
#define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
17396
 
17397
  SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
17398
  SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
17399
  SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
17400
  SWAP_STRING (reg_names[i], reg_names[i + 1]);
17401
 
17402
#undef SWAP_STRING
17403
#undef SWAP_INT
17404
}
17405
 
17406
/* Implement TARGET_CONDITIONAL_REGISTER_USAGE.  */
17407
 
17408
static void
17409
mips_conditional_register_usage (void)
17410
{
17411
 
17412
  if (ISA_HAS_DSP)
17413
    {
17414
      /* These DSP control register fields are global.  */
17415
      global_regs[CCDSP_PO_REGNUM] = 1;
17416
      global_regs[CCDSP_SC_REGNUM] = 1;
17417
    }
17418
  else
17419
    AND_COMPL_HARD_REG_SET (accessible_reg_set,
17420
                            reg_class_contents[(int) DSP_ACC_REGS]);
17421
 
17422
  if (!TARGET_HARD_FLOAT)
17423
    {
17424
      AND_COMPL_HARD_REG_SET (accessible_reg_set,
17425
                              reg_class_contents[(int) FP_REGS]);
17426
      AND_COMPL_HARD_REG_SET (accessible_reg_set,
17427
                              reg_class_contents[(int) ST_REGS]);
17428
    }
17429
  else if (!ISA_HAS_8CC)
17430
    {
17431
      /* We only have a single condition-code register.  We implement
17432
         this by fixing all the condition-code registers and generating
17433
         RTL that refers directly to ST_REG_FIRST.  */
17434
      AND_COMPL_HARD_REG_SET (accessible_reg_set,
17435
                              reg_class_contents[(int) ST_REGS]);
17436
      SET_HARD_REG_BIT (accessible_reg_set, FPSW_REGNUM);
17437
      fixed_regs[FPSW_REGNUM] = call_used_regs[FPSW_REGNUM] = 1;
17438
    }
17439
  if (TARGET_MIPS16)
17440
    {
17441
      /* In MIPS16 mode, we prohibit the unused $s registers, since they
17442
         are call-saved, and saving them via a MIPS16 register would
17443
         probably waste more time than just reloading the value.
17444
 
17445
         We permit the $t temporary registers when optimizing for speed
17446
         but not when optimizing for space because using them results in
17447
         code that is larger (but faster) then not using them.  We do
17448
         allow $24 (t8) because it is used in CMP and CMPI instructions
17449
         and $25 (t9) because it is used as the function call address in
17450
         SVR4 PIC code.  */
17451
 
17452
      fixed_regs[18] = call_used_regs[18] = 1;
17453
      fixed_regs[19] = call_used_regs[19] = 1;
17454
      fixed_regs[20] = call_used_regs[20] = 1;
17455
      fixed_regs[21] = call_used_regs[21] = 1;
17456
      fixed_regs[22] = call_used_regs[22] = 1;
17457
      fixed_regs[23] = call_used_regs[23] = 1;
17458
      fixed_regs[26] = call_used_regs[26] = 1;
17459
      fixed_regs[27] = call_used_regs[27] = 1;
17460
      fixed_regs[30] = call_used_regs[30] = 1;
17461
      if (optimize_size)
17462
        {
17463
          fixed_regs[8] = call_used_regs[8] = 1;
17464
          fixed_regs[9] = call_used_regs[9] = 1;
17465
          fixed_regs[10] = call_used_regs[10] = 1;
17466
          fixed_regs[11] = call_used_regs[11] = 1;
17467
          fixed_regs[12] = call_used_regs[12] = 1;
17468
          fixed_regs[13] = call_used_regs[13] = 1;
17469
          fixed_regs[14] = call_used_regs[14] = 1;
17470
          fixed_regs[15] = call_used_regs[15] = 1;
17471
        }
17472
 
17473
      /* Do not allow HI and LO to be treated as register operands.
17474
         There are no MTHI or MTLO instructions (or any real need
17475
         for them) and one-way registers cannot easily be reloaded.  */
17476
      AND_COMPL_HARD_REG_SET (operand_reg_set,
17477
                              reg_class_contents[(int) MD_REGS]);
17478
    }
17479
  /* $f20-$f23 are call-clobbered for n64.  */
17480
  if (mips_abi == ABI_64)
17481
    {
17482
      int regno;
17483
      for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
17484
        call_really_used_regs[regno] = call_used_regs[regno] = 1;
17485
    }
17486
  /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
17487
     for n32.  */
17488
  if (mips_abi == ABI_N32)
17489
    {
17490
      int regno;
17491
      for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
17492
        call_really_used_regs[regno] = call_used_regs[regno] = 1;
17493
    }
17494
  /* Make sure that double-register accumulator values are correctly
17495
     ordered for the current endianness.  */
17496
  if (TARGET_LITTLE_ENDIAN)
17497
    {
17498
      unsigned int regno;
17499
 
17500
      mips_swap_registers (MD_REG_FIRST);
17501
      for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
17502
        mips_swap_registers (regno);
17503
    }
17504
}
17505
 
17506
/* When generating MIPS16 code, we want to allocate $24 (T_REG) before
17507
   other registers for instructions for which it is possible.  This
17508
   encourages the compiler to use CMP in cases where an XOR would
17509
   require some register shuffling.  */
17510
 
17511
void
17512
mips_order_regs_for_local_alloc (void)
17513
{
17514
  int i;
17515
 
17516
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
17517
    reg_alloc_order[i] = i;
17518
 
17519
  if (TARGET_MIPS16)
17520
    {
17521
      /* It really doesn't matter where we put register 0, since it is
17522
         a fixed register anyhow.  */
17523
      reg_alloc_order[0] = 24;
17524
      reg_alloc_order[24] = 0;
17525
    }
17526
}
17527
 
17528
/* Implement EH_USES.  */
17529
 
17530
bool
17531
mips_eh_uses (unsigned int regno)
17532
{
17533
  if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
17534
    {
17535
      /* We need to force certain registers to be live in order to handle
17536
         PIC long branches correctly.  See mips_must_initialize_gp_p for
17537
         details.  */
17538
      if (mips_cfun_has_cprestore_slot_p ())
17539
        {
17540
          if (regno == CPRESTORE_SLOT_REGNUM)
17541
            return true;
17542
        }
17543
      else
17544
        {
17545
          if (cfun->machine->global_pointer == regno)
17546
            return true;
17547
        }
17548
    }
17549
 
17550
  return false;
17551
}
17552
 
17553
/* Implement EPILOGUE_USES.  */
17554
 
17555
bool
17556
mips_epilogue_uses (unsigned int regno)
17557
{
17558
  /* Say that the epilogue uses the return address register.  Note that
17559
     in the case of sibcalls, the values "used by the epilogue" are
17560
     considered live at the start of the called function.  */
17561
  if (regno == RETURN_ADDR_REGNUM)
17562
    return true;
17563
 
17564
  /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
17565
     See the comment above load_call<mode> for details.  */
17566
  if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
17567
    return true;
17568
 
17569
  /* An interrupt handler must preserve some registers that are
17570
     ordinarily call-clobbered.  */
17571
  if (cfun->machine->interrupt_handler_p
17572
      && mips_interrupt_extra_call_saved_reg_p (regno))
17573
    return true;
17574
 
17575
  return false;
17576
}
17577
 
17578
/* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
17579
 
17580
static int
17581
mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
17582
{
17583
  return REG_P (*x) && REGNO (*x) == AT_REGNUM;
17584
}
17585
 
17586
/* Return true if INSN needs to be wrapped in ".set noat".
17587
   INSN has NOPERANDS operands, stored in OPVEC.  */
17588
 
17589
static bool
17590
mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
17591
{
17592
  int i;
17593
 
17594
  if (recog_memoized (insn) >= 0)
17595
    for (i = 0; i < noperands; i++)
17596
      if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
17597
        return true;
17598
  return false;
17599
}
17600
 
17601
/* Implement FINAL_PRESCAN_INSN.  */
17602
 
17603
void
17604
mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
17605
{
17606
  if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17607
    mips_push_asm_switch (&mips_noat);
17608
}
17609
 
17610
/* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
17611
 
17612
static void
17613
mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
17614
                          rtx *opvec, int noperands)
17615
{
17616
  if (mips_need_noat_wrapper_p (insn, opvec, noperands))
17617
    mips_pop_asm_switch (&mips_noat);
17618
}
17619
 
17620
/* Return the function that is used to expand the <u>mulsidi3 pattern.
17621
   EXT_CODE is the code of the extension used.  Return NULL if widening
17622
   multiplication shouldn't be used.  */
17623
 
17624
mulsidi3_gen_fn
17625
mips_mulsidi3_gen_fn (enum rtx_code ext_code)
17626
{
17627
  bool signed_p;
17628
 
17629
  signed_p = ext_code == SIGN_EXTEND;
17630
  if (TARGET_64BIT)
17631
    {
17632
      /* Don't use widening multiplication with MULT when we have DMUL.  Even
17633
         with the extension of its input operands DMUL is faster.  Note that
17634
         the extension is not needed for signed multiplication.  In order to
17635
         ensure that we always remove the redundant sign-extension in this
17636
         case we still expand mulsidi3 for DMUL.  */
17637
      if (ISA_HAS_DMUL3)
17638
        return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
17639
      if (TARGET_MIPS16)
17640
        return (signed_p
17641
                ? gen_mulsidi3_64bit_mips16
17642
                : gen_umulsidi3_64bit_mips16);
17643
      if (TARGET_FIX_R4000)
17644
        return NULL;
17645
      return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
17646
    }
17647
  else
17648
    {
17649
      if (TARGET_MIPS16)
17650
        return (signed_p
17651
                ? gen_mulsidi3_32bit_mips16
17652
                : gen_umulsidi3_32bit_mips16);
17653
      if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
17654
        return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
17655
      return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
17656
    }
17657
}
17658
 
17659
/* Return true if PATTERN matches the kind of instruction generated by
17660
   umips_build_save_restore.  SAVE_P is true for store.  */
17661
 
17662
bool
17663
umips_save_restore_pattern_p (bool save_p, rtx pattern)
17664
{
17665
  int n;
17666
  unsigned int i;
17667
  HOST_WIDE_INT first_offset = 0;
17668
  rtx first_base = 0;
17669
  unsigned int regmask = 0;
17670
 
17671
  for (n = 0; n < XVECLEN (pattern, 0); n++)
17672
    {
17673
      rtx set, reg, mem, this_base;
17674
      HOST_WIDE_INT this_offset;
17675
 
17676
      /* Check that we have a SET.  */
17677
      set = XVECEXP (pattern, 0, n);
17678
      if (GET_CODE (set) != SET)
17679
        return false;
17680
 
17681
      /* Check that the SET is a load (if restoring) or a store
17682
         (if saving).  */
17683
      mem = save_p ? SET_DEST (set) : SET_SRC (set);
17684
      if (!MEM_P (mem) || MEM_VOLATILE_P (mem))
17685
        return false;
17686
 
17687
      /* Check that the address is the sum of base and a possibly-zero
17688
         constant offset.  Determine if the offset is in range.  */
17689
      mips_split_plus (XEXP (mem, 0), &this_base, &this_offset);
17690
      if (!REG_P (this_base))
17691
        return false;
17692
 
17693
      if (n == 0)
17694
        {
17695
          if (!UMIPS_12BIT_OFFSET_P (this_offset))
17696
            return false;
17697
          first_base = this_base;
17698
          first_offset = this_offset;
17699
        }
17700
      else
17701
        {
17702
          /* Check that the save slots are consecutive.  */
17703
          if (REGNO (this_base) != REGNO (first_base)
17704
              || this_offset != first_offset + UNITS_PER_WORD * n)
17705
            return false;
17706
        }
17707
 
17708
      /* Check that SET's other operand is a register.  */
17709
      reg = save_p ? SET_SRC (set) : SET_DEST (set);
17710
      if (!REG_P (reg))
17711
        return false;
17712
 
17713
      regmask |= 1 << REGNO (reg);
17714
    }
17715
 
17716
  for (i = 0; i < ARRAY_SIZE (umips_swm_mask); i++)
17717
    if (regmask == umips_swm_mask[i])
17718
      return true;
17719
 
17720
  return false;
17721
}
17722
 
17723
/* Return the assembly instruction for microMIPS LWM or SWM.
17724
   SAVE_P and PATTERN are as for umips_save_restore_pattern_p.  */
17725
 
17726
const char *
17727
umips_output_save_restore (bool save_p, rtx pattern)
17728
{
17729
  static char buffer[300];
17730
  char *s;
17731
  int n;
17732
  HOST_WIDE_INT offset;
17733
  rtx base, mem, set, last_set, last_reg;
17734
 
17735
  /* Parse the pattern.  */
17736
  gcc_assert (umips_save_restore_pattern_p (save_p, pattern));
17737
 
17738
  s = strcpy (buffer, save_p ? "swm\t" : "lwm\t");
17739
  s += strlen (s);
17740
  n = XVECLEN (pattern, 0);
17741
 
17742
  set = XVECEXP (pattern, 0, 0);
17743
  mem = save_p ? SET_DEST (set) : SET_SRC (set);
17744
  mips_split_plus (XEXP (mem, 0), &base, &offset);
17745
 
17746
  last_set = XVECEXP (pattern, 0, n - 1);
17747
  last_reg = save_p ? SET_SRC (last_set) : SET_DEST (last_set);
17748
 
17749
  if (REGNO (last_reg) == 31)
17750
    n--;
17751
 
17752
  gcc_assert (n <= 9);
17753
  if (n == 0)
17754
    ;
17755
  else if (n == 1)
17756
    s += sprintf (s, "%s,", reg_names[16]);
17757
  else if (n < 9)
17758
    s += sprintf (s, "%s-%s,", reg_names[16], reg_names[15 + n]);
17759
  else if (n == 9)
17760
    s += sprintf (s, "%s-%s,%s,", reg_names[16], reg_names[23],
17761
                  reg_names[30]);
17762
 
17763
  if (REGNO (last_reg) == 31)
17764
    s += sprintf (s, "%s,", reg_names[31]);
17765
 
17766
  s += sprintf (s, "%d(%s)", (int)offset, reg_names[REGNO (base)]);
17767
  return buffer;
17768
}
17769
 
17770
/* Return true if MEM1 and MEM2 use the same base register, and the
17771
   offset of MEM2 equals the offset of MEM1 plus 4.  FIRST_REG is the
17772
   register into (from) which the contents of MEM1 will be loaded
17773
   (stored), depending on the value of LOAD_P.
17774
   SWAP_P is true when the 1st and 2nd instructions are swapped.  */
17775
 
17776
static bool
17777
umips_load_store_pair_p_1 (bool load_p, bool swap_p,
17778
                           rtx first_reg, rtx mem1, rtx mem2)
17779
{
17780
  rtx base1, base2;
17781
  HOST_WIDE_INT offset1, offset2;
17782
 
17783
  if (!MEM_P (mem1) || !MEM_P (mem2))
17784
    return false;
17785
 
17786
  mips_split_plus (XEXP (mem1, 0), &base1, &offset1);
17787
  mips_split_plus (XEXP (mem2, 0), &base2, &offset2);
17788
 
17789
  if (!REG_P (base1) || !rtx_equal_p (base1, base2))
17790
    return false;
17791
 
17792
  /* Avoid invalid load pair instructions.  */
17793
  if (load_p && REGNO (first_reg) == REGNO (base1))
17794
    return false;
17795
 
17796
  /* We must avoid this case for anti-dependence.
17797
     Ex:  lw $3, 4($3)
17798
          lw $2, 0($3)
17799
     first_reg is $2, but the base is $3.  */
17800
  if (load_p
17801
      && swap_p
17802
      && REGNO (first_reg) + 1 == REGNO (base1))
17803
    return false;
17804
 
17805
  if (offset2 != offset1 + 4)
17806
    return false;
17807
 
17808
  if (!UMIPS_12BIT_OFFSET_P (offset1))
17809
    return false;
17810
 
17811
  return true;
17812
}
17813
 
17814
/* OPERANDS describes the operands to a pair of SETs, in the order
17815
   dest1, src1, dest2, src2.  Return true if the operands can be used
17816
   in an LWP or SWP instruction; LOAD_P says which.  */
17817
 
17818
bool
17819
umips_load_store_pair_p (bool load_p, rtx *operands)
17820
{
17821
  rtx reg1, reg2, mem1, mem2;
17822
 
17823
  if (load_p)
17824
    {
17825
      reg1 = operands[0];
17826
      reg2 = operands[2];
17827
      mem1 = operands[1];
17828
      mem2 = operands[3];
17829
    }
17830
  else
17831
    {
17832
      reg1 = operands[1];
17833
      reg2 = operands[3];
17834
      mem1 = operands[0];
17835
      mem2 = operands[2];
17836
    }
17837
 
17838
  if (REGNO (reg2) == REGNO (reg1) + 1)
17839
    return umips_load_store_pair_p_1 (load_p, false, reg1, mem1, mem2);
17840
 
17841
  if (REGNO (reg1) == REGNO (reg2) + 1)
17842
    return umips_load_store_pair_p_1 (load_p, true, reg2, mem2, mem1);
17843
 
17844
  return false;
17845
}
17846
 
17847
/* Return the assembly instruction for a microMIPS LWP or SWP in which
17848
   the first register is REG and the first memory slot is MEM.
17849
   LOAD_P is true for LWP.  */
17850
 
17851
static void
17852
umips_output_load_store_pair_1 (bool load_p, rtx reg, rtx mem)
17853
{
17854
  rtx ops[] = {reg, mem};
17855
 
17856
  if (load_p)
17857
    output_asm_insn ("lwp\t%0,%1", ops);
17858
  else
17859
    output_asm_insn ("swp\t%0,%1", ops);
17860
}
17861
 
17862
/* Output the assembly instruction for a microMIPS LWP or SWP instruction.
17863
   LOAD_P and OPERANDS are as for umips_load_store_pair_p.  */
17864
 
17865
void
17866
umips_output_load_store_pair (bool load_p, rtx *operands)
17867
{
17868
  rtx reg1, reg2, mem1, mem2;
17869
  if (load_p)
17870
    {
17871
      reg1 = operands[0];
17872
      reg2 = operands[2];
17873
      mem1 = operands[1];
17874
      mem2 = operands[3];
17875
    }
17876
  else
17877
    {
17878
      reg1 = operands[1];
17879
      reg2 = operands[3];
17880
      mem1 = operands[0];
17881
      mem2 = operands[2];
17882
    }
17883
 
17884
  if (REGNO (reg2) == REGNO (reg1) + 1)
17885
    {
17886
      umips_output_load_store_pair_1 (load_p, reg1, mem1);
17887
      return;
17888
    }
17889
 
17890
  gcc_assert (REGNO (reg1) == REGNO (reg2) + 1);
17891
  umips_output_load_store_pair_1 (load_p, reg2, mem2);
17892
}
17893
 
17894
/* Return true if REG1 and REG2 match the criteria for a movep insn.  */
17895
 
17896
bool
17897
umips_movep_target_p (rtx reg1, rtx reg2)
17898
{
17899
  int regno1, regno2, pair;
17900
  unsigned int i;
17901
  static const int match[8] = {
17902
    0x00000060, /* 5, 6 */
17903
    0x000000a0, /* 5, 7 */
17904
    0x000000c0, /* 6, 7 */
17905
    0x00200010, /* 4, 21 */
17906
    0x00400010, /* 4, 22 */
17907
    0x00000030, /* 4, 5 */
17908
    0x00000050, /* 4, 6 */
17909
    0x00000090  /* 4, 7 */
17910
  };
17911
 
17912
  if (!REG_P (reg1) || !REG_P (reg2))
17913
    return false;
17914
 
17915
  regno1 = REGNO (reg1);
17916
  regno2 = REGNO (reg2);
17917
 
17918
  if (!GP_REG_P (regno1) || !GP_REG_P (regno2))
17919
    return false;
17920
 
17921
  pair = (1 << regno1) | (1 << regno2);
17922
 
17923
  for (i = 0; i < ARRAY_SIZE (match); i++)
17924
    if (pair == match[i])
17925
      return true;
17926
 
17927
  return false;
17928
}
17929
 
17930
/* Return the size in bytes of the trampoline code, padded to
17931
   TRAMPOLINE_ALIGNMENT bits.  The static chain pointer and target
17932
   function address immediately follow.  */
17933
 
17934
int
17935
mips_trampoline_code_size (void)
17936
{
17937
  if (TARGET_USE_PIC_FN_ADDR_REG)
17938
    return 4 * 4;
17939
  else if (ptr_mode == DImode)
17940
    return 8 * 4;
17941
  else if (ISA_HAS_LOAD_DELAY)
17942
    return 6 * 4;
17943
  else
17944
    return 4 * 4;
17945
}
17946
 
17947
/* Implement TARGET_TRAMPOLINE_INIT.  */
17948
 
17949
static void
17950
mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
17951
{
17952
  rtx addr, end_addr, high, low, opcode, mem;
17953
  rtx trampoline[8];
17954
  unsigned int i, j;
17955
  HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
17956
 
17957
  /* Work out the offsets of the pointers from the start of the
17958
     trampoline code.  */
17959
  end_addr_offset = mips_trampoline_code_size ();
17960
  static_chain_offset = end_addr_offset;
17961
  target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
17962
 
17963
  /* Get pointers to the beginning and end of the code block.  */
17964
  addr = force_reg (Pmode, XEXP (m_tramp, 0));
17965
  end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
17966
 
17967
#define OP(X) gen_int_mode (X, SImode)
17968
 
17969
  /* Build up the code in TRAMPOLINE.  */
17970
  i = 0;
17971
  if (TARGET_USE_PIC_FN_ADDR_REG)
17972
    {
17973
      /* $25 contains the address of the trampoline.  Emit code of the form:
17974
 
17975
             l[wd]    $1, target_function_offset($25)
17976
             l[wd]    $static_chain, static_chain_offset($25)
17977
             jr       $1
17978
             move     $25,$1.  */
17979
      trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
17980
                                           target_function_offset,
17981
                                           PIC_FUNCTION_ADDR_REGNUM));
17982
      trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
17983
                                           static_chain_offset,
17984
                                           PIC_FUNCTION_ADDR_REGNUM));
17985
      trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
17986
      trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
17987
    }
17988
  else if (ptr_mode == DImode)
17989
    {
17990
      /* It's too cumbersome to create the full 64-bit address, so let's
17991
         instead use:
17992
 
17993
             move    $1, $31
17994
             bal     1f
17995
             nop
17996
         1:  l[wd]   $25, target_function_offset - 12($31)
17997
             l[wd]   $static_chain, static_chain_offset - 12($31)
17998
             jr      $25
17999
             move    $31, $1
18000
 
18001
        where 12 is the offset of "1:" from the start of the code block.  */
18002
      trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
18003
      trampoline[i++] = OP (MIPS_BAL (1));
18004
      trampoline[i++] = OP (MIPS_NOP);
18005
      trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18006
                                           target_function_offset - 12,
18007
                                           RETURN_ADDR_REGNUM));
18008
      trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18009
                                           static_chain_offset - 12,
18010
                                           RETURN_ADDR_REGNUM));
18011
      trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18012
      trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
18013
    }
18014
  else
18015
    {
18016
      /* If the target has load delays, emit:
18017
 
18018
             lui     $1, %hi(end_addr)
18019
             lw      $25, %lo(end_addr + ...)($1)
18020
             lw      $static_chain, %lo(end_addr + ...)($1)
18021
             jr      $25
18022
             nop
18023
 
18024
         Otherwise emit:
18025
 
18026
             lui     $1, %hi(end_addr)
18027
             lw      $25, %lo(end_addr + ...)($1)
18028
             jr      $25
18029
             lw      $static_chain, %lo(end_addr + ...)($1).  */
18030
 
18031
      /* Split END_ADDR into %hi and %lo values.  Trampolines are aligned
18032
         to 64 bits, so the %lo value will have the bottom 3 bits clear.  */
18033
      high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
18034
                                  NULL, false, OPTAB_WIDEN);
18035
      high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
18036
                                  NULL, false, OPTAB_WIDEN);
18037
      low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
18038
 
18039
      /* Emit the LUI.  */
18040
      opcode = OP (MIPS_LUI (AT_REGNUM, 0));
18041
      trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
18042
                                             NULL, false, OPTAB_WIDEN);
18043
 
18044
      /* Emit the load of the target function.  */
18045
      opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
18046
                                  target_function_offset - end_addr_offset,
18047
                                  AT_REGNUM));
18048
      trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18049
                                             NULL, false, OPTAB_WIDEN);
18050
 
18051
      /* Emit the JR here, if we can.  */
18052
      if (!ISA_HAS_LOAD_DELAY)
18053
        trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18054
 
18055
      /* Emit the load of the static chain register.  */
18056
      opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
18057
                                  static_chain_offset - end_addr_offset,
18058
                                  AT_REGNUM));
18059
      trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
18060
                                             NULL, false, OPTAB_WIDEN);
18061
 
18062
      /* Emit the JR, if we couldn't above.  */
18063
      if (ISA_HAS_LOAD_DELAY)
18064
        {
18065
          trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
18066
          trampoline[i++] = OP (MIPS_NOP);
18067
        }
18068
    }
18069
 
18070
#undef OP
18071
 
18072
  /* Copy the trampoline code.  Leave any padding uninitialized.  */
18073
  for (j = 0; j < i; j++)
18074
    {
18075
      mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
18076
      mips_emit_move (mem, trampoline[j]);
18077
    }
18078
 
18079
  /* Set up the static chain pointer field.  */
18080
  mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
18081
  mips_emit_move (mem, chain_value);
18082
 
18083
  /* Set up the target function field.  */
18084
  mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
18085
  mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
18086
 
18087
  /* Flush the code part of the trampoline.  */
18088
  emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
18089
  emit_insn (gen_clear_cache (addr, end_addr));
18090
}
18091
 
18092
/* Implement FUNCTION_PROFILER.  */
18093
 
18094
void mips_function_profiler (FILE *file)
18095
{
18096
  if (TARGET_MIPS16)
18097
    sorry ("mips16 function profiling");
18098
  if (TARGET_LONG_CALLS)
18099
    {
18100
      /* For TARGET_LONG_CALLS use $3 for the address of _mcount.  */
18101
      if (Pmode == DImode)
18102
        fprintf (file, "\tdla\t%s,_mcount\n", reg_names[3]);
18103
      else
18104
        fprintf (file, "\tla\t%s,_mcount\n", reg_names[3]);
18105
    }
18106
  mips_push_asm_switch (&mips_noat);
18107
  fprintf (file, "\tmove\t%s,%s\t\t# save current return address\n",
18108
           reg_names[AT_REGNUM], reg_names[RETURN_ADDR_REGNUM]);
18109
  /* _mcount treats $2 as the static chain register.  */
18110
  if (cfun->static_chain_decl != NULL)
18111
    fprintf (file, "\tmove\t%s,%s\n", reg_names[2],
18112
             reg_names[STATIC_CHAIN_REGNUM]);
18113
  if (TARGET_MCOUNT_RA_ADDRESS)
18114
    {
18115
      /* If TARGET_MCOUNT_RA_ADDRESS load $12 with the address of the
18116
         ra save location.  */
18117
      if (cfun->machine->frame.ra_fp_offset == 0)
18118
        /* ra not saved, pass zero.  */
18119
        fprintf (file, "\tmove\t%s,%s\n", reg_names[12], reg_names[0]);
18120
      else
18121
        fprintf (file, "\t%s\t%s," HOST_WIDE_INT_PRINT_DEC "(%s)\n",
18122
                 Pmode == DImode ? "dla" : "la", reg_names[12],
18123
                 cfun->machine->frame.ra_fp_offset,
18124
                 reg_names[STACK_POINTER_REGNUM]);
18125
    }
18126
  if (!TARGET_NEWABI)
18127
    fprintf (file,
18128
             "\t%s\t%s,%s,%d\t\t# _mcount pops 2 words from  stack\n",
18129
             TARGET_64BIT ? "dsubu" : "subu",
18130
             reg_names[STACK_POINTER_REGNUM],
18131
             reg_names[STACK_POINTER_REGNUM],
18132
             Pmode == DImode ? 16 : 8);
18133
 
18134
  if (TARGET_LONG_CALLS)
18135
    fprintf (file, "\tjalr\t%s\n", reg_names[3]);
18136
  else
18137
    fprintf (file, "\tjal\t_mcount\n");
18138
  mips_pop_asm_switch (&mips_noat);
18139
  /* _mcount treats $2 as the static chain register.  */
18140
  if (cfun->static_chain_decl != NULL)
18141
    fprintf (file, "\tmove\t%s,%s\n", reg_names[STATIC_CHAIN_REGNUM],
18142
             reg_names[2]);
18143
}
18144
 
18145
/* Implement TARGET_SHIFT_TRUNCATION_MASK.  We want to keep the default
18146
   behaviour of TARGET_SHIFT_TRUNCATION_MASK for non-vector modes even
18147
   when TARGET_LOONGSON_VECTORS is true.  */
18148
 
18149
static unsigned HOST_WIDE_INT
18150
mips_shift_truncation_mask (enum machine_mode mode)
18151
{
18152
  if (TARGET_LOONGSON_VECTORS && VECTOR_MODE_P (mode))
18153
    return 0;
18154
 
18155
  return GET_MODE_BITSIZE (mode) - 1;
18156
}
18157
 
18158
/* Implement TARGET_PREPARE_PCH_SAVE.  */
18159
 
18160
static void
18161
mips_prepare_pch_save (void)
18162
{
18163
  /* We are called in a context where the current MIPS16 vs. non-MIPS16
18164
     setting should be irrelevant.  The question then is: which setting
18165
     makes most sense at load time?
18166
 
18167
     The PCH is loaded before the first token is read.  We should never
18168
     have switched into MIPS16 mode by that point, and thus should not
18169
     have populated mips16_globals.  Nor can we load the entire contents
18170
     of mips16_globals from the PCH file, because mips16_globals contains
18171
     a combination of GGC and non-GGC data.
18172
 
18173
     There is therefore no point in trying save the GGC part of
18174
     mips16_globals to the PCH file, or to preserve MIPS16ness across
18175
     the PCH save and load.  The loading compiler would not have access
18176
     to the non-GGC parts of mips16_globals (either from the PCH file,
18177
     or from a copy that the loading compiler generated itself) and would
18178
     have to call target_reinit anyway.
18179
 
18180
     It therefore seems best to switch back to non-MIPS16 mode at
18181
     save time, and to ensure that mips16_globals remains null after
18182
     a PCH load.  */
18183
  mips_set_compression_mode (0);
18184
  mips16_globals = 0;
18185
}
18186
 
18187
/* Generate or test for an insn that supports a constant permutation.  */
18188
 
18189
#define MAX_VECT_LEN 8
18190
 
18191
struct expand_vec_perm_d
18192
{
18193
  rtx target, op0, op1;
18194
  unsigned char perm[MAX_VECT_LEN];
18195
  enum machine_mode vmode;
18196
  unsigned char nelt;
18197
  bool one_vector_p;
18198
  bool testing_p;
18199
};
18200
 
18201
/* Construct (set target (vec_select op0 (parallel perm))) and
18202
   return true if that's a valid instruction in the active ISA.  */
18203
 
18204
static bool
18205
mips_expand_vselect (rtx target, rtx op0,
18206
                     const unsigned char *perm, unsigned nelt)
18207
{
18208
  rtx rperm[MAX_VECT_LEN], x;
18209
  unsigned i;
18210
 
18211
  for (i = 0; i < nelt; ++i)
18212
    rperm[i] = GEN_INT (perm[i]);
18213
 
18214
  x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
18215
  x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
18216
  x = gen_rtx_SET (VOIDmode, target, x);
18217
 
18218
  x = emit_insn (x);
18219
  if (recog_memoized (x) < 0)
18220
    {
18221
      remove_insn (x);
18222
      return false;
18223
    }
18224
  return true;
18225
}
18226
 
18227
/* Similar, but generate a vec_concat from op0 and op1 as well.  */
18228
 
18229
static bool
18230
mips_expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
18231
                             const unsigned char *perm, unsigned nelt)
18232
{
18233
  enum machine_mode v2mode;
18234
  rtx x;
18235
 
18236
  v2mode = GET_MODE_2XWIDER_MODE (GET_MODE (op0));
18237
  x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
18238
  return mips_expand_vselect (target, x, perm, nelt);
18239
}
18240
 
18241
/* Recognize patterns for even-odd extraction.  */
18242
 
18243
static bool
18244
mips_expand_vpc_loongson_even_odd (struct expand_vec_perm_d *d)
18245
{
18246
  unsigned i, odd, nelt = d->nelt;
18247
  rtx t0, t1, t2, t3;
18248
 
18249
  if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18250
    return false;
18251
  /* Even-odd for V2SI/V2SFmode is matched by interleave directly.  */
18252
  if (nelt < 4)
18253
    return false;
18254
 
18255
  odd = d->perm[0];
18256
  if (odd > 1)
18257
    return false;
18258
  for (i = 1; i < nelt; ++i)
18259
    if (d->perm[i] != i * 2 + odd)
18260
      return false;
18261
 
18262
  if (d->testing_p)
18263
    return true;
18264
 
18265
  /* We need 2*log2(N)-1 operations to achieve odd/even with interleave. */
18266
  t0 = gen_reg_rtx (d->vmode);
18267
  t1 = gen_reg_rtx (d->vmode);
18268
  switch (d->vmode)
18269
    {
18270
    case V4HImode:
18271
      emit_insn (gen_loongson_punpckhhw (t0, d->op0, d->op1));
18272
      emit_insn (gen_loongson_punpcklhw (t1, d->op0, d->op1));
18273
      if (odd)
18274
        emit_insn (gen_loongson_punpckhhw (d->target, t1, t0));
18275
      else
18276
        emit_insn (gen_loongson_punpcklhw (d->target, t1, t0));
18277
      break;
18278
 
18279
    case V8QImode:
18280
      t2 = gen_reg_rtx (d->vmode);
18281
      t3 = gen_reg_rtx (d->vmode);
18282
      emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op1));
18283
      emit_insn (gen_loongson_punpcklbh (t1, d->op0, d->op1));
18284
      emit_insn (gen_loongson_punpckhbh (t2, t1, t0));
18285
      emit_insn (gen_loongson_punpcklbh (t3, t1, t0));
18286
      if (odd)
18287
        emit_insn (gen_loongson_punpckhbh (d->target, t3, t2));
18288
      else
18289
        emit_insn (gen_loongson_punpcklbh (d->target, t3, t2));
18290
      break;
18291
 
18292
    default:
18293
      gcc_unreachable ();
18294
    }
18295
  return true;
18296
}
18297
 
18298
/* Recognize patterns for the Loongson PSHUFH instruction.  */
18299
 
18300
static bool
18301
mips_expand_vpc_loongson_pshufh (struct expand_vec_perm_d *d)
18302
{
18303
  unsigned i, mask;
18304
  rtx rmask;
18305
 
18306
  if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18307
    return false;
18308
  if (d->vmode != V4HImode)
18309
    return false;
18310
  if (d->testing_p)
18311
    return true;
18312
 
18313
  /* Convert the selector into the packed 8-bit form for pshufh.  */
18314
  /* Recall that loongson is little-endian only.  No big-endian
18315
     adjustment required.  */
18316
  for (i = mask = 0; i < 4; i++)
18317
    mask |= (d->perm[i] & 3) << (i * 2);
18318
  rmask = force_reg (SImode, GEN_INT (mask));
18319
 
18320
  if (d->one_vector_p)
18321
    emit_insn (gen_loongson_pshufh (d->target, d->op0, rmask));
18322
  else
18323
    {
18324
      rtx t0, t1, x, merge, rmerge[4];
18325
 
18326
      t0 = gen_reg_rtx (V4HImode);
18327
      t1 = gen_reg_rtx (V4HImode);
18328
      emit_insn (gen_loongson_pshufh (t1, d->op1, rmask));
18329
      emit_insn (gen_loongson_pshufh (t0, d->op0, rmask));
18330
 
18331
      for (i = 0; i < 4; ++i)
18332
        rmerge[i] = (d->perm[i] & 4 ? constm1_rtx : const0_rtx);
18333
      merge = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmerge));
18334
      merge = force_reg (V4HImode, merge);
18335
 
18336
      x = gen_rtx_AND (V4HImode, merge, t1);
18337
      emit_insn (gen_rtx_SET (VOIDmode, t1, x));
18338
 
18339
      x = gen_rtx_NOT (V4HImode, merge);
18340
      x = gen_rtx_AND (V4HImode, x, t0);
18341
      emit_insn (gen_rtx_SET (VOIDmode, t0, x));
18342
 
18343
      x = gen_rtx_IOR (V4HImode, t0, t1);
18344
      emit_insn (gen_rtx_SET (VOIDmode, d->target, x));
18345
    }
18346
 
18347
  return true;
18348
}
18349
 
18350
/* Recognize broadcast patterns for the Loongson.  */
18351
 
18352
static bool
18353
mips_expand_vpc_loongson_bcast (struct expand_vec_perm_d *d)
18354
{
18355
  unsigned i, elt;
18356
  rtx t0, t1;
18357
 
18358
  if (!(TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS))
18359
    return false;
18360
  /* Note that we've already matched V2SI via punpck and V4HI via pshufh.  */
18361
  if (d->vmode != V8QImode)
18362
    return false;
18363
  if (!d->one_vector_p)
18364
    return false;
18365
 
18366
  elt = d->perm[0];
18367
  for (i = 1; i < 8; ++i)
18368
    if (d->perm[i] != elt)
18369
      return false;
18370
 
18371
  if (d->testing_p)
18372
    return true;
18373
 
18374
  /* With one interleave we put two of the desired element adjacent.  */
18375
  t0 = gen_reg_rtx (V8QImode);
18376
  if (elt < 4)
18377
    emit_insn (gen_loongson_punpcklbh (t0, d->op0, d->op0));
18378
  else
18379
    emit_insn (gen_loongson_punpckhbh (t0, d->op0, d->op0));
18380
 
18381
  /* Shuffle that one HImode element into all locations.  */
18382
  elt &= 3;
18383
  elt *= 0x55;
18384
  t1 = gen_reg_rtx (V4HImode);
18385
  emit_insn (gen_loongson_pshufh (t1, gen_lowpart (V4HImode, t0),
18386
                                  force_reg (SImode, GEN_INT (elt))));
18387
 
18388
  emit_move_insn (d->target, gen_lowpart (V8QImode, t1));
18389
  return true;
18390
}
18391
 
18392
static bool
18393
mips_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
18394
{
18395
  unsigned int i, nelt = d->nelt;
18396
  unsigned char perm2[MAX_VECT_LEN];
18397
 
18398
  if (d->one_vector_p)
18399
    {
18400
      /* Try interleave with alternating operands.  */
18401
      memcpy (perm2, d->perm, sizeof(perm2));
18402
      for (i = 1; i < nelt; i += 2)
18403
        perm2[i] += nelt;
18404
      if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1, perm2, nelt))
18405
        return true;
18406
    }
18407
  else
18408
    {
18409
      if (mips_expand_vselect_vconcat (d->target, d->op0, d->op1,
18410
                                       d->perm, nelt))
18411
        return true;
18412
 
18413
      /* Try again with swapped operands.  */
18414
      for (i = 0; i < nelt; ++i)
18415
        perm2[i] = (d->perm[i] + nelt) & (2 * nelt - 1);
18416
      if (mips_expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
18417
        return true;
18418
    }
18419
 
18420
  if (mips_expand_vpc_loongson_even_odd (d))
18421
    return true;
18422
  if (mips_expand_vpc_loongson_pshufh (d))
18423
    return true;
18424
  if (mips_expand_vpc_loongson_bcast (d))
18425
    return true;
18426
  return false;
18427
}
18428
 
18429
/* Expand a vec_perm_const pattern.  */
18430
 
18431
bool
18432
mips_expand_vec_perm_const (rtx operands[4])
18433
{
18434
  struct expand_vec_perm_d d;
18435
  int i, nelt, which;
18436
  unsigned char orig_perm[MAX_VECT_LEN];
18437
  rtx sel;
18438
  bool ok;
18439
 
18440
  d.target = operands[0];
18441
  d.op0 = operands[1];
18442
  d.op1 = operands[2];
18443
  sel = operands[3];
18444
 
18445
  d.vmode = GET_MODE (d.target);
18446
  gcc_assert (VECTOR_MODE_P (d.vmode));
18447
  d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18448
  d.testing_p = false;
18449
 
18450
  for (i = which = 0; i < nelt; ++i)
18451
    {
18452
      rtx e = XVECEXP (sel, 0, i);
18453
      int ei = INTVAL (e) & (2 * nelt - 1);
18454
      which |= (ei < nelt ? 1 : 2);
18455
      orig_perm[i] = ei;
18456
    }
18457
  memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18458
 
18459
  switch (which)
18460
    {
18461
    default:
18462
      gcc_unreachable();
18463
 
18464
    case 3:
18465
      d.one_vector_p = false;
18466
      if (!rtx_equal_p (d.op0, d.op1))
18467
        break;
18468
      /* FALLTHRU */
18469
 
18470
    case 2:
18471
      for (i = 0; i < nelt; ++i)
18472
        d.perm[i] &= nelt - 1;
18473
      d.op0 = d.op1;
18474
      d.one_vector_p = true;
18475
      break;
18476
 
18477
    case 1:
18478
      d.op1 = d.op0;
18479
      d.one_vector_p = true;
18480
      break;
18481
    }
18482
 
18483
  ok = mips_expand_vec_perm_const_1 (&d);
18484
 
18485
  /* If we were given a two-vector permutation which just happened to
18486
     have both input vectors equal, we folded this into a one-vector
18487
     permutation.  There are several loongson patterns that are matched
18488
     via direct vec_select+vec_concat expansion, but we do not have
18489
     support in mips_expand_vec_perm_const_1 to guess the adjustment
18490
     that should be made for a single operand.  Just try again with
18491
     the original permutation.  */
18492
  if (!ok && which == 3)
18493
    {
18494
      d.op0 = operands[1];
18495
      d.op1 = operands[2];
18496
      d.one_vector_p = false;
18497
      memcpy (d.perm, orig_perm, MAX_VECT_LEN);
18498
      ok = mips_expand_vec_perm_const_1 (&d);
18499
    }
18500
 
18501
  return ok;
18502
}
18503
 
18504
/* Implement TARGET_VECTORIZE_VEC_PERM_CONST_OK.  */
18505
 
18506
static bool
18507
mips_vectorize_vec_perm_const_ok (enum machine_mode vmode,
18508
                                  const unsigned char *sel)
18509
{
18510
  struct expand_vec_perm_d d;
18511
  unsigned int i, nelt, which;
18512
  bool ret;
18513
 
18514
  d.vmode = vmode;
18515
  d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
18516
  d.testing_p = true;
18517
  memcpy (d.perm, sel, nelt);
18518
 
18519
  /* Categorize the set of elements in the selector.  */
18520
  for (i = which = 0; i < nelt; ++i)
18521
    {
18522
      unsigned char e = d.perm[i];
18523
      gcc_assert (e < 2 * nelt);
18524
      which |= (e < nelt ? 1 : 2);
18525
    }
18526
 
18527
  /* For all elements from second vector, fold the elements to first.  */
18528
  if (which == 2)
18529
    for (i = 0; i < nelt; ++i)
18530
      d.perm[i] -= nelt;
18531
 
18532
  /* Check whether the mask can be applied to the vector type.  */
18533
  d.one_vector_p = (which != 3);
18534
 
18535
  d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
18536
  d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
18537
  if (!d.one_vector_p)
18538
    d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
18539
 
18540
  start_sequence ();
18541
  ret = mips_expand_vec_perm_const_1 (&d);
18542
  end_sequence ();
18543
 
18544
  return ret;
18545
}
18546
 
18547
/* Expand an integral vector unpack operation.  */
18548
 
18549
void
18550
mips_expand_vec_unpack (rtx operands[2], bool unsigned_p, bool high_p)
18551
{
18552
  enum machine_mode imode = GET_MODE (operands[1]);
18553
  rtx (*unpack) (rtx, rtx, rtx);
18554
  rtx (*cmpgt) (rtx, rtx, rtx);
18555
  rtx tmp, dest, zero;
18556
 
18557
  switch (imode)
18558
    {
18559
    case V8QImode:
18560
      if (high_p)
18561
        unpack = gen_loongson_punpckhbh;
18562
      else
18563
        unpack = gen_loongson_punpcklbh;
18564
      cmpgt = gen_loongson_pcmpgtb;
18565
      break;
18566
    case V4HImode:
18567
      if (high_p)
18568
        unpack = gen_loongson_punpckhhw;
18569
      else
18570
        unpack = gen_loongson_punpcklhw;
18571
      cmpgt = gen_loongson_pcmpgth;
18572
      break;
18573
    default:
18574
      gcc_unreachable ();
18575
    }
18576
 
18577
  zero = force_reg (imode, CONST0_RTX (imode));
18578
  if (unsigned_p)
18579
    tmp = zero;
18580
  else
18581
    {
18582
      tmp = gen_reg_rtx (imode);
18583
      emit_insn (cmpgt (tmp, zero, operands[1]));
18584
    }
18585
 
18586
  dest = gen_reg_rtx (imode);
18587
  emit_insn (unpack (dest, operands[1], tmp));
18588
 
18589
  emit_move_insn (operands[0], gen_lowpart (GET_MODE (operands[0]), dest));
18590
}
18591
 
18592
/* A subroutine of mips_expand_vec_init, match constant vector elements.  */
18593
 
18594
static inline bool
18595
mips_constant_elt_p (rtx x)
18596
{
18597
  return CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE;
18598
}
18599
 
18600
/* A subroutine of mips_expand_vec_init, expand via broadcast.  */
18601
 
18602
static void
18603
mips_expand_vi_broadcast (enum machine_mode vmode, rtx target, rtx elt)
18604
{
18605
  struct expand_vec_perm_d d;
18606
  rtx t1;
18607
  bool ok;
18608
 
18609
  if (elt != const0_rtx)
18610
    elt = force_reg (GET_MODE_INNER (vmode), elt);
18611
  if (REG_P (elt))
18612
    elt = gen_lowpart (DImode, elt);
18613
 
18614
  t1 = gen_reg_rtx (vmode);
18615
  switch (vmode)
18616
    {
18617
    case V8QImode:
18618
      emit_insn (gen_loongson_vec_init1_v8qi (t1, elt));
18619
      break;
18620
    case V4HImode:
18621
      emit_insn (gen_loongson_vec_init1_v4hi (t1, elt));
18622
      break;
18623
    default:
18624
      gcc_unreachable ();
18625
    }
18626
 
18627
  memset (&d, 0, sizeof (d));
18628
  d.target = target;
18629
  d.op0 = t1;
18630
  d.op1 = t1;
18631
  d.vmode = vmode;
18632
  d.nelt = GET_MODE_NUNITS (vmode);
18633
  d.one_vector_p = true;
18634
 
18635
  ok = mips_expand_vec_perm_const_1 (&d);
18636
  gcc_assert (ok);
18637
}
18638
 
18639
/* A subroutine of mips_expand_vec_init, replacing all of the non-constant
18640
   elements of VALS with zeros, copy the constant vector to TARGET.  */
18641
 
18642
static void
18643
mips_expand_vi_constant (enum machine_mode vmode, unsigned nelt,
18644
                         rtx target, rtx vals)
18645
{
18646
  rtvec vec = shallow_copy_rtvec (XVEC (vals, 0));
18647
  unsigned i;
18648
 
18649
  for (i = 0; i < nelt; ++i)
18650
    {
18651
      if (!mips_constant_elt_p (RTVEC_ELT (vec, i)))
18652
        RTVEC_ELT (vec, i) = const0_rtx;
18653
    }
18654
 
18655
  emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, vec));
18656
}
18657
 
18658
 
18659
/* A subroutine of mips_expand_vec_init, expand via pinsrh.  */
18660
 
18661
static void
18662
mips_expand_vi_loongson_one_pinsrh (rtx target, rtx vals, unsigned one_var)
18663
{
18664
  mips_expand_vi_constant (V4HImode, 4, target, vals);
18665
 
18666
  emit_insn (gen_vec_setv4hi (target, target, XVECEXP (vals, 0, one_var),
18667
                              GEN_INT (one_var)));
18668
}
18669
 
18670
/* A subroutine of mips_expand_vec_init, expand anything via memory.  */
18671
 
18672
static void
18673
mips_expand_vi_general (enum machine_mode vmode, enum machine_mode imode,
18674
                        unsigned nelt, unsigned nvar, rtx target, rtx vals)
18675
{
18676
  rtx mem = assign_stack_temp (vmode, GET_MODE_SIZE (vmode));
18677
  unsigned int i, isize = GET_MODE_SIZE (imode);
18678
 
18679
  if (nvar < nelt)
18680
    mips_expand_vi_constant (vmode, nelt, mem, vals);
18681
 
18682
  for (i = 0; i < nelt; ++i)
18683
    {
18684
      rtx x = XVECEXP (vals, 0, i);
18685
      if (!mips_constant_elt_p (x))
18686
        emit_move_insn (adjust_address (mem, imode, i * isize), x);
18687
    }
18688
 
18689
  emit_move_insn (target, mem);
18690
}
18691
 
18692
/* Expand a vector initialization.  */
18693
 
18694
void
18695
mips_expand_vector_init (rtx target, rtx vals)
18696
{
18697
  enum machine_mode vmode = GET_MODE (target);
18698
  enum machine_mode imode = GET_MODE_INNER (vmode);
18699
  unsigned i, nelt = GET_MODE_NUNITS (vmode);
18700
  unsigned nvar = 0, one_var = -1u;
18701
  bool all_same = true;
18702
  rtx x;
18703
 
18704
  for (i = 0; i < nelt; ++i)
18705
    {
18706
      x = XVECEXP (vals, 0, i);
18707
      if (!mips_constant_elt_p (x))
18708
        nvar++, one_var = i;
18709
      if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
18710
        all_same = false;
18711
    }
18712
 
18713
  /* Load constants from the pool, or whatever's handy.  */
18714
  if (nvar == 0)
18715
    {
18716
      emit_move_insn (target, gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)));
18717
      return;
18718
    }
18719
 
18720
  /* For two-part initialization, always use CONCAT.  */
18721
  if (nelt == 2)
18722
    {
18723
      rtx op0 = force_reg (imode, XVECEXP (vals, 0, 0));
18724
      rtx op1 = force_reg (imode, XVECEXP (vals, 0, 1));
18725
      x = gen_rtx_VEC_CONCAT (vmode, op0, op1);
18726
      emit_insn (gen_rtx_SET (VOIDmode, target, x));
18727
      return;
18728
    }
18729
 
18730
  /* Loongson is the only cpu with vectors with more elements.  */
18731
  gcc_assert (TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS);
18732
 
18733
  /* If all values are identical, broadcast the value.  */
18734
  if (all_same)
18735
    {
18736
      mips_expand_vi_broadcast (vmode, target, XVECEXP (vals, 0, 0));
18737
      return;
18738
    }
18739
 
18740
  /* If we've only got one non-variable V4HImode, use PINSRH.  */
18741
  if (nvar == 1 && vmode == V4HImode)
18742
    {
18743
      mips_expand_vi_loongson_one_pinsrh (target, vals, one_var);
18744
      return;
18745
    }
18746
 
18747
  mips_expand_vi_general (vmode, imode, nelt, nvar, target, vals);
18748
}
18749
 
18750
/* Expand a vector reduction.  */
18751
 
18752
void
18753
mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
18754
{
18755
  enum machine_mode vmode = GET_MODE (in);
18756
  unsigned char perm2[2];
18757
  rtx last, next, fold, x;
18758
  bool ok;
18759
 
18760
  last = in;
18761
  fold = gen_reg_rtx (vmode);
18762
  switch (vmode)
18763
    {
18764
    case V2SFmode:
18765
      /* Use PUL/PLU to produce { L, H } op { H, L }.
18766
         By reversing the pair order, rather than a pure interleave high,
18767
         we avoid erroneous exceptional conditions that we might otherwise
18768
         produce from the computation of H op H.  */
18769
      perm2[0] = 1;
18770
      perm2[1] = 2;
18771
      ok = mips_expand_vselect_vconcat (fold, last, last, perm2, 2);
18772
      gcc_assert (ok);
18773
      break;
18774
 
18775
    case V2SImode:
18776
      /* Use interleave to produce { H, L } op { H, H }.  */
18777
      emit_insn (gen_loongson_punpckhwd (fold, last, last));
18778
      break;
18779
 
18780
    case V4HImode:
18781
      /* Perform the first reduction with interleave,
18782
         and subsequent reductions with shifts.  */
18783
      emit_insn (gen_loongson_punpckhwd_hi (fold, last, last));
18784
 
18785
      next = gen_reg_rtx (vmode);
18786
      emit_insn (gen (next, last, fold));
18787
      last = next;
18788
 
18789
      fold = gen_reg_rtx (vmode);
18790
      x = force_reg (SImode, GEN_INT (16));
18791
      emit_insn (gen_vec_shr_v4hi (fold, last, x));
18792
      break;
18793
 
18794
    case V8QImode:
18795
      emit_insn (gen_loongson_punpckhwd_qi (fold, last, last));
18796
 
18797
      next = gen_reg_rtx (vmode);
18798
      emit_insn (gen (next, last, fold));
18799
      last = next;
18800
 
18801
      fold = gen_reg_rtx (vmode);
18802
      x = force_reg (SImode, GEN_INT (16));
18803
      emit_insn (gen_vec_shr_v8qi (fold, last, x));
18804
 
18805
      next = gen_reg_rtx (vmode);
18806
      emit_insn (gen (next, last, fold));
18807
      last = next;
18808
 
18809
      fold = gen_reg_rtx (vmode);
18810
      x = force_reg (SImode, GEN_INT (8));
18811
      emit_insn (gen_vec_shr_v8qi (fold, last, x));
18812
      break;
18813
 
18814
    default:
18815
      gcc_unreachable ();
18816
    }
18817
 
18818
  emit_insn (gen (target, last, fold));
18819
}
18820
 
18821
/* Expand a vector minimum/maximum.  */
18822
 
18823
void
18824
mips_expand_vec_minmax (rtx target, rtx op0, rtx op1,
18825
                        rtx (*cmp) (rtx, rtx, rtx), bool min_p)
18826
{
18827
  enum machine_mode vmode = GET_MODE (target);
18828
  rtx tc, t0, t1, x;
18829
 
18830
  tc = gen_reg_rtx (vmode);
18831
  t0 = gen_reg_rtx (vmode);
18832
  t1 = gen_reg_rtx (vmode);
18833
 
18834
  /* op0 > op1 */
18835
  emit_insn (cmp (tc, op0, op1));
18836
 
18837
  x = gen_rtx_AND (vmode, tc, (min_p ? op1 : op0));
18838
  emit_insn (gen_rtx_SET (VOIDmode, t0, x));
18839
 
18840
  x = gen_rtx_NOT (vmode, tc);
18841
  x = gen_rtx_AND (vmode, x, (min_p ? op0 : op1));
18842
  emit_insn (gen_rtx_SET (VOIDmode, t1, x));
18843
 
18844
  x = gen_rtx_IOR (vmode, t0, t1);
18845
  emit_insn (gen_rtx_SET (VOIDmode, target, x));
18846
}
18847
 
18848
/* Implement TARGET_CASE_VALUES_THRESHOLD.  */
18849
 
18850
unsigned int
18851
mips_case_values_threshold (void)
18852
{
18853
  /* In MIPS16 mode using a larger case threshold generates smaller code.  */
18854
  if (TARGET_MIPS16 && optimize_size)
18855
    return 10;
18856
  else
18857
    return default_case_values_threshold ();
18858
}
18859
 
18860
/* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV.  */
18861
 
18862
static void
18863
mips_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
18864
{
18865
  if (!TARGET_HARD_FLOAT_ABI)
18866
    return;
18867
  tree exceptions_var = create_tmp_var (MIPS_ATYPE_USI, NULL);
18868
  tree fcsr_orig_var = create_tmp_var (MIPS_ATYPE_USI, NULL);
18869
  tree fcsr_mod_var = create_tmp_var (MIPS_ATYPE_USI, NULL);
18870
  tree get_fcsr = mips_builtin_decls[MIPS_GET_FCSR];
18871
  tree set_fcsr = mips_builtin_decls[MIPS_SET_FCSR];
18872
  tree get_fcsr_hold_call = build_call_expr (get_fcsr, 0);
18873
  tree hold_assign_orig = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
18874
                                  fcsr_orig_var, get_fcsr_hold_call);
18875
  tree hold_mod_val = build2 (BIT_AND_EXPR, MIPS_ATYPE_USI, fcsr_orig_var,
18876
                              build_int_cst (MIPS_ATYPE_USI, 0xfffff003));
18877
  tree hold_assign_mod = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
18878
                                 fcsr_mod_var, hold_mod_val);
18879
  tree set_fcsr_hold_call = build_call_expr (set_fcsr, 1, fcsr_mod_var);
18880
  tree hold_all = build2 (COMPOUND_EXPR, MIPS_ATYPE_USI,
18881
                          hold_assign_orig, hold_assign_mod);
18882
  *hold = build2 (COMPOUND_EXPR, void_type_node, hold_all,
18883
                  set_fcsr_hold_call);
18884
 
18885
  *clear = build_call_expr (set_fcsr, 1, fcsr_mod_var);
18886
 
18887
  tree get_fcsr_update_call = build_call_expr (get_fcsr, 0);
18888
  *update = build2 (MODIFY_EXPR, MIPS_ATYPE_USI,
18889
                    exceptions_var, get_fcsr_update_call);
18890
  tree set_fcsr_update_call = build_call_expr (set_fcsr, 1, fcsr_orig_var);
18891
  *update = build2 (COMPOUND_EXPR, void_type_node, *update,
18892
                    set_fcsr_update_call);
18893
  tree atomic_feraiseexcept
18894
    = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
18895
  tree int_exceptions_var = fold_convert (integer_type_node,
18896
                                          exceptions_var);
18897
  tree atomic_feraiseexcept_call = build_call_expr (atomic_feraiseexcept,
18898
                                                    1, int_exceptions_var);
18899
  *update = build2 (COMPOUND_EXPR, void_type_node, *update,
18900
                    atomic_feraiseexcept_call);
18901
}
18902
 
18903
/* Initialize the GCC target structure.  */
18904
#undef TARGET_ASM_ALIGNED_HI_OP
18905
#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
18906
#undef TARGET_ASM_ALIGNED_SI_OP
18907
#define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
18908
#undef TARGET_ASM_ALIGNED_DI_OP
18909
#define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
18910
 
18911
#undef TARGET_OPTION_OVERRIDE
18912
#define TARGET_OPTION_OVERRIDE mips_option_override
18913
 
18914
#undef TARGET_LEGITIMIZE_ADDRESS
18915
#define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
18916
 
18917
#undef TARGET_ASM_FUNCTION_PROLOGUE
18918
#define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
18919
#undef TARGET_ASM_FUNCTION_EPILOGUE
18920
#define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
18921
#undef TARGET_ASM_SELECT_RTX_SECTION
18922
#define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
18923
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
18924
#define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
18925
 
18926
#undef TARGET_SCHED_INIT
18927
#define TARGET_SCHED_INIT mips_sched_init
18928
#undef TARGET_SCHED_REORDER
18929
#define TARGET_SCHED_REORDER mips_sched_reorder
18930
#undef TARGET_SCHED_REORDER2
18931
#define TARGET_SCHED_REORDER2 mips_sched_reorder2
18932
#undef TARGET_SCHED_VARIABLE_ISSUE
18933
#define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
18934
#undef TARGET_SCHED_ADJUST_COST
18935
#define TARGET_SCHED_ADJUST_COST mips_adjust_cost
18936
#undef TARGET_SCHED_ISSUE_RATE
18937
#define TARGET_SCHED_ISSUE_RATE mips_issue_rate
18938
#undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
18939
#define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
18940
#undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
18941
#define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
18942
#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
18943
#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
18944
  mips_multipass_dfa_lookahead
18945
#undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
18946
#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
18947
  mips_small_register_classes_for_mode_p
18948
 
18949
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
18950
#define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
18951
 
18952
#undef TARGET_INSERT_ATTRIBUTES
18953
#define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
18954
#undef TARGET_MERGE_DECL_ATTRIBUTES
18955
#define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
18956
#undef TARGET_CAN_INLINE_P
18957
#define TARGET_CAN_INLINE_P mips_can_inline_p
18958
#undef TARGET_SET_CURRENT_FUNCTION
18959
#define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
18960
 
18961
#undef TARGET_VALID_POINTER_MODE
18962
#define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
18963
#undef TARGET_REGISTER_MOVE_COST
18964
#define TARGET_REGISTER_MOVE_COST mips_register_move_cost
18965
#undef TARGET_MEMORY_MOVE_COST
18966
#define TARGET_MEMORY_MOVE_COST mips_memory_move_cost
18967
#undef TARGET_RTX_COSTS
18968
#define TARGET_RTX_COSTS mips_rtx_costs
18969
#undef TARGET_ADDRESS_COST
18970
#define TARGET_ADDRESS_COST mips_address_cost
18971
 
18972
#undef TARGET_IN_SMALL_DATA_P
18973
#define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
18974
 
18975
#undef TARGET_MACHINE_DEPENDENT_REORG
18976
#define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
18977
 
18978
#undef  TARGET_PREFERRED_RELOAD_CLASS
18979
#define TARGET_PREFERRED_RELOAD_CLASS mips_preferred_reload_class
18980
 
18981
#undef TARGET_EXPAND_TO_RTL_HOOK
18982
#define TARGET_EXPAND_TO_RTL_HOOK mips_expand_to_rtl_hook
18983
#undef TARGET_ASM_FILE_START
18984
#define TARGET_ASM_FILE_START mips_file_start
18985
#undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
18986
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
18987
#undef TARGET_ASM_CODE_END
18988
#define TARGET_ASM_CODE_END mips_code_end
18989
 
18990
#undef TARGET_INIT_LIBFUNCS
18991
#define TARGET_INIT_LIBFUNCS mips_init_libfuncs
18992
 
18993
#undef TARGET_BUILD_BUILTIN_VA_LIST
18994
#define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
18995
#undef TARGET_EXPAND_BUILTIN_VA_START
18996
#define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
18997
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
18998
#define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
18999
 
19000
#undef  TARGET_PROMOTE_FUNCTION_MODE
19001
#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
19002
#undef TARGET_PROMOTE_PROTOTYPES
19003
#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
19004
 
19005
#undef TARGET_FUNCTION_VALUE
19006
#define TARGET_FUNCTION_VALUE mips_function_value
19007
#undef TARGET_LIBCALL_VALUE
19008
#define TARGET_LIBCALL_VALUE mips_libcall_value
19009
#undef TARGET_FUNCTION_VALUE_REGNO_P
19010
#define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
19011
#undef TARGET_RETURN_IN_MEMORY
19012
#define TARGET_RETURN_IN_MEMORY mips_return_in_memory
19013
#undef TARGET_RETURN_IN_MSB
19014
#define TARGET_RETURN_IN_MSB mips_return_in_msb
19015
 
19016
#undef TARGET_ASM_OUTPUT_MI_THUNK
19017
#define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
19018
#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
19019
#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
19020
 
19021
#undef TARGET_PRINT_OPERAND
19022
#define TARGET_PRINT_OPERAND mips_print_operand
19023
#undef TARGET_PRINT_OPERAND_ADDRESS
19024
#define TARGET_PRINT_OPERAND_ADDRESS mips_print_operand_address
19025
#undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
19026
#define TARGET_PRINT_OPERAND_PUNCT_VALID_P mips_print_operand_punct_valid_p
19027
 
19028
#undef TARGET_SETUP_INCOMING_VARARGS
19029
#define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
19030
#undef TARGET_STRICT_ARGUMENT_NAMING
19031
#define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
19032
#undef TARGET_MUST_PASS_IN_STACK
19033
#define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
19034
#undef TARGET_PASS_BY_REFERENCE
19035
#define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
19036
#undef TARGET_CALLEE_COPIES
19037
#define TARGET_CALLEE_COPIES mips_callee_copies
19038
#undef TARGET_ARG_PARTIAL_BYTES
19039
#define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
19040
#undef TARGET_FUNCTION_ARG
19041
#define TARGET_FUNCTION_ARG mips_function_arg
19042
#undef TARGET_FUNCTION_ARG_ADVANCE
19043
#define TARGET_FUNCTION_ARG_ADVANCE mips_function_arg_advance
19044
#undef TARGET_FUNCTION_ARG_BOUNDARY
19045
#define TARGET_FUNCTION_ARG_BOUNDARY mips_function_arg_boundary
19046
 
19047
#undef TARGET_MODE_REP_EXTENDED
19048
#define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
19049
 
19050
#undef TARGET_VECTOR_MODE_SUPPORTED_P
19051
#define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
19052
 
19053
#undef TARGET_SCALAR_MODE_SUPPORTED_P
19054
#define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
19055
 
19056
#undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
19057
#define TARGET_VECTORIZE_PREFERRED_SIMD_MODE mips_preferred_simd_mode
19058
 
19059
#undef TARGET_INIT_BUILTINS
19060
#define TARGET_INIT_BUILTINS mips_init_builtins
19061
#undef TARGET_BUILTIN_DECL
19062
#define TARGET_BUILTIN_DECL mips_builtin_decl
19063
#undef TARGET_EXPAND_BUILTIN
19064
#define TARGET_EXPAND_BUILTIN mips_expand_builtin
19065
 
19066
#undef TARGET_HAVE_TLS
19067
#define TARGET_HAVE_TLS HAVE_AS_TLS
19068
 
19069
#undef TARGET_CANNOT_FORCE_CONST_MEM
19070
#define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
19071
 
19072
#undef TARGET_LEGITIMATE_CONSTANT_P
19073
#define TARGET_LEGITIMATE_CONSTANT_P mips_legitimate_constant_p
19074
 
19075
#undef TARGET_ENCODE_SECTION_INFO
19076
#define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
19077
 
19078
#undef TARGET_ATTRIBUTE_TABLE
19079
#define TARGET_ATTRIBUTE_TABLE mips_attribute_table
19080
/* All our function attributes are related to how out-of-line copies should
19081
   be compiled or called.  They don't in themselves prevent inlining.  */
19082
#undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
19083
#define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
19084
 
19085
#undef TARGET_EXTRA_LIVE_ON_ENTRY
19086
#define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
19087
 
19088
#undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
19089
#define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
19090
#undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
19091
#define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
19092
 
19093
#undef  TARGET_COMP_TYPE_ATTRIBUTES
19094
#define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
19095
 
19096
#ifdef HAVE_AS_DTPRELWORD
19097
#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
19098
#define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
19099
#endif
19100
#undef TARGET_DWARF_REGISTER_SPAN
19101
#define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
19102
 
19103
#undef TARGET_ASM_FINAL_POSTSCAN_INSN
19104
#define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
19105
 
19106
#undef TARGET_LEGITIMATE_ADDRESS_P
19107
#define TARGET_LEGITIMATE_ADDRESS_P     mips_legitimate_address_p
19108
 
19109
#undef TARGET_FRAME_POINTER_REQUIRED
19110
#define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
19111
 
19112
#undef TARGET_CAN_ELIMINATE
19113
#define TARGET_CAN_ELIMINATE mips_can_eliminate
19114
 
19115
#undef TARGET_CONDITIONAL_REGISTER_USAGE
19116
#define TARGET_CONDITIONAL_REGISTER_USAGE mips_conditional_register_usage
19117
 
19118
#undef TARGET_TRAMPOLINE_INIT
19119
#define TARGET_TRAMPOLINE_INIT mips_trampoline_init
19120
 
19121
#undef TARGET_ASM_OUTPUT_SOURCE_FILENAME
19122
#define TARGET_ASM_OUTPUT_SOURCE_FILENAME mips_output_filename
19123
 
19124
#undef TARGET_SHIFT_TRUNCATION_MASK
19125
#define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
19126
 
19127
#undef TARGET_PREPARE_PCH_SAVE
19128
#define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
19129
 
19130
#undef TARGET_VECTORIZE_VEC_PERM_CONST_OK
19131
#define TARGET_VECTORIZE_VEC_PERM_CONST_OK mips_vectorize_vec_perm_const_ok
19132
 
19133
#undef TARGET_CASE_VALUES_THRESHOLD
19134
#define TARGET_CASE_VALUES_THRESHOLD mips_case_values_threshold
19135
 
19136
#undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
19137
#define TARGET_ATOMIC_ASSIGN_EXPAND_FENV mips_atomic_assign_expand_fenv
19138
 
19139
struct gcc_target targetm = TARGET_INITIALIZER;
19140
 
19141
#include "gt-mips.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.