x
[gcc.git] / gcc / config / mips / mips.c
1 /* Subroutines for insn-output.c for MIPS
2 Copyright (C) 1989, 90, 91, 93-95, 1996 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 GNU CC.
9
10 GNU CC 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 2, or (at your option)
13 any later version.
14
15 GNU CC 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 GNU CC; see the file COPYING. If not, write to
22 the Free Software Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24
25 /* ??? The TARGET_FP_CALL_32 macros are intended to simulate a 32 bit
26 calling convention in 64 bit mode. It doesn't work though, and should
27 be replaced with something better designed. */
28
29 #include "config.h"
30 #include "rtl.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "insn-flags.h"
37 #include "insn-attr.h"
38 #include "insn-codes.h"
39 #include "recog.h"
40 #include "output.h"
41
42 #undef MAX /* sys/param.h may also define these */
43 #undef MIN
44
45 #include <stdio.h>
46 #include <signal.h>
47 #include <sys/types.h>
48 #include <sys/file.h>
49 #include <ctype.h>
50 #include "tree.h"
51 #include "expr.h"
52 #include "flags.h"
53
54 #ifndef R_OK
55 #define R_OK 4
56 #define W_OK 2
57 #define X_OK 1
58 #endif
59
60 #if defined(USG) || defined(NO_STAB_H)
61 #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
62 #else
63 #include <stab.h> /* On BSD, use the system's stab.h. */
64 #endif /* not USG */
65
66 #ifdef __GNU_STAB__
67 #define STAB_CODE_TYPE enum __stab_debug_code
68 #else
69 #define STAB_CODE_TYPE int
70 #endif
71
72 extern void abort ();
73 extern int atoi ();
74 extern char *getenv ();
75 extern char *mktemp ();
76
77 extern rtx adj_offsettable_operand ();
78 extern rtx copy_to_reg ();
79 extern void error ();
80 extern void fatal ();
81 extern tree lookup_name ();
82 extern void pfatal_with_name ();
83 extern void warning ();
84
85 extern FILE *asm_out_file;
86
87 /* Enumeration for all of the relational tests, so that we can build
88 arrays indexed by the test type, and not worry about the order
89 of EQ, NE, etc. */
90
91 enum internal_test {
92 ITEST_EQ,
93 ITEST_NE,
94 ITEST_GT,
95 ITEST_GE,
96 ITEST_LT,
97 ITEST_LE,
98 ITEST_GTU,
99 ITEST_GEU,
100 ITEST_LTU,
101 ITEST_LEU,
102 ITEST_MAX
103 };
104
105 /* Global variables for machine-dependent things. */
106
107 /* Threshold for data being put into the small data/bss area, instead
108 of the normal data area (references to the small data/bss area take
109 1 instruction, and use the global pointer, references to the normal
110 data area takes 2 instructions). */
111 int mips_section_threshold = -1;
112
113 /* Count the number of .file directives, so that .loc is up to date. */
114 int num_source_filenames = 0;
115
116 /* Count the number of sdb related labels are generated (to find block
117 start and end boundaries). */
118 int sdb_label_count = 0;
119
120 /* Next label # for each statement for Silicon Graphics IRIS systems. */
121 int sym_lineno = 0;
122
123 /* Non-zero if inside of a function, because the stupid MIPS asm can't
124 handle .files inside of functions. */
125 int inside_function = 0;
126
127 /* Files to separate the text and the data output, so that all of the data
128 can be emitted before the text, which will mean that the assembler will
129 generate smaller code, based on the global pointer. */
130 FILE *asm_out_data_file;
131 FILE *asm_out_text_file;
132
133 /* Linked list of all externals that are to be emitted when optimizing
134 for the global pointer if they haven't been declared by the end of
135 the program with an appropriate .comm or initialization. */
136
137 struct extern_list {
138 struct extern_list *next; /* next external */
139 char *name; /* name of the external */
140 int size; /* size in bytes */
141 } *extern_head = 0;
142
143 /* Name of the file containing the current function. */
144 char *current_function_file = "";
145
146 /* Warning given that Mips ECOFF can't support changing files
147 within a function. */
148 int file_in_function_warning = FALSE;
149
150 /* Whether to suppress issuing .loc's because the user attempted
151 to change the filename within a function. */
152 int ignore_line_number = FALSE;
153
154 /* Number of nested .set noreorder, noat, nomacro, and volatile requests. */
155 int set_noreorder;
156 int set_noat;
157 int set_nomacro;
158 int set_volatile;
159
160 /* The next branch instruction is a branch likely, not branch normal. */
161 int mips_branch_likely;
162
163 /* Count of delay slots and how many are filled. */
164 int dslots_load_total;
165 int dslots_load_filled;
166 int dslots_jump_total;
167 int dslots_jump_filled;
168
169 /* # of nops needed by previous insn */
170 int dslots_number_nops;
171
172 /* Number of 1/2/3 word references to data items (ie, not jal's). */
173 int num_refs[3];
174
175 /* registers to check for load delay */
176 rtx mips_load_reg, mips_load_reg2, mips_load_reg3, mips_load_reg4;
177
178 /* Cached operands, and operator to compare for use in set/branch on
179 condition codes. */
180 rtx branch_cmp[2];
181
182 /* what type of branch to use */
183 enum cmp_type branch_type;
184
185 /* Number of previously seen half-pic pointers and references. */
186 static int prev_half_pic_ptrs = 0;
187 static int prev_half_pic_refs = 0;
188
189 /* which cpu are we scheduling for */
190 enum processor_type mips_cpu;
191
192 /* which instruction set architecture to use. */
193 int mips_isa;
194
195 #ifdef MIPS_ABI_DEFAULT
196 /* which ABI to use. This is defined to a constant in mips.h if the target
197 doesn't support multiple ABIs. */
198 enum mips_abi_type mips_abi;
199 #endif
200
201 /* Strings to hold which cpu and instruction set architecture to use. */
202 char *mips_cpu_string; /* for -mcpu=<xxx> */
203 char *mips_isa_string; /* for -mips{1,2,3,4} */
204 char *mips_abi_string; /* for -mabi={o32,32,n32,n64,64,eabi} */
205
206 /* If TRUE, we split addresses into their high and low parts in the RTL. */
207 int mips_split_addresses;
208
209 /* Generating calls to position independent functions? */
210 enum mips_abicalls_type mips_abicalls;
211
212 /* High and low marks for floating point values which we will accept
213 as legitimate constants for LEGITIMATE_CONSTANT_P. These are
214 initialized in override_options. */
215 REAL_VALUE_TYPE dfhigh, dflow, sfhigh, sflow;
216
217 /* Array giving truth value on whether or not a given hard register
218 can support a given mode. */
219 char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
220
221 /* Current frame information calculated by compute_frame_size. */
222 struct mips_frame_info current_frame_info;
223
224 /* Zero structure to initialize current_frame_info. */
225 struct mips_frame_info zero_frame_info;
226
227 /* Temporary filename used to buffer .text until end of program
228 for -mgpopt. */
229 static char *temp_filename;
230
231 /* Pseudo-reg holding the address of the current function when
232 generating embedded PIC code. Created by LEGITIMIZE_ADDRESS, used
233 by mips_finalize_pic if it was created. */
234 rtx embedded_pic_fnaddr_rtx;
235
236 /* List of all MIPS punctuation characters used by print_operand. */
237 char mips_print_operand_punct[256];
238
239 /* Map GCC register number to debugger register number. */
240 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
241
242 /* Buffer to use to enclose a load/store operation with %{ %} to
243 turn on .set volatile. */
244 static char volatile_buffer[60];
245
246 /* Hardware names for the registers. If -mrnames is used, this
247 will be overwritten with mips_sw_reg_names. */
248
249 char mips_reg_names[][8] =
250 {
251 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
252 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
253 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
254 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
255 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
256 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
257 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
258 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
259 "hi", "lo", "accum","$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
260 "$fcc5","$fcc6","$fcc7","$rap"
261 };
262
263 /* Mips software names for the registers, used to overwrite the
264 mips_reg_names array. */
265
266 char mips_sw_reg_names[][8] =
267 {
268 "$zero","$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3",
269 "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
270 "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7",
271 "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra",
272 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
273 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
274 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
275 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
276 "hi", "lo", "accum","$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
277 "$fcc5","$fcc6","$fcc7","$rap"
278 };
279
280 /* Map hard register number to register class */
281 enum reg_class mips_regno_to_class[] =
282 {
283 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
284 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
285 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
286 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
287 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
288 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
289 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
290 GR_REGS, GR_REGS, GR_REGS, GR_REGS,
291 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
292 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
293 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
294 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
295 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
296 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
297 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
298 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
299 HI_REG, LO_REG, HILO_REG, ST_REGS,
300 ST_REGS, ST_REGS, ST_REGS, ST_REGS,
301 ST_REGS, ST_REGS, ST_REGS, GR_REGS
302 };
303
304 /* Map register constraint character to register class. */
305 enum reg_class mips_char_to_class[256] =
306 {
307 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
308 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
309 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
310 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
311 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
312 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
313 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
314 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
315 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
316 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
317 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
318 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
319 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
320 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
321 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
322 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
323 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
324 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
325 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
326 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
327 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
328 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
329 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
330 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
331 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
332 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
333 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
334 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
335 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
336 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
337 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
338 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
339 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
340 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
341 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
342 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
343 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
344 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
345 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
346 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
347 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
348 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
349 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
350 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
351 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
352 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
353 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
354 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
355 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
356 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
357 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
358 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
359 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
360 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
361 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
362 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
363 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
364 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
365 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
366 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
367 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
368 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
369 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
370 NO_REGS, NO_REGS, NO_REGS, NO_REGS,
371 };
372
373 \f
374 /* Return truth value of whether OP can be used as an operands
375 where a register or 16 bit unsigned integer is needed. */
376
377 int
378 uns_arith_operand (op, mode)
379 rtx op;
380 enum machine_mode mode;
381 {
382 if (GET_CODE (op) == CONST_INT && SMALL_INT_UNSIGNED (op))
383 return TRUE;
384
385 return register_operand (op, mode);
386 }
387
388 /* Return truth value of whether OP can be used as an operands
389 where a 16 bit integer is needed */
390
391 int
392 arith_operand (op, mode)
393 rtx op;
394 enum machine_mode mode;
395 {
396 if (GET_CODE (op) == CONST_INT && SMALL_INT (op))
397 return TRUE;
398
399 return register_operand (op, mode);
400 }
401
402 /* Return truth value of whether OP can be used as an operand in a two
403 address arithmetic insn (such as set 123456,%o4) of mode MODE. */
404
405 int
406 arith32_operand (op, mode)
407 rtx op;
408 enum machine_mode mode;
409 {
410 if (GET_CODE (op) == CONST_INT)
411 return TRUE;
412
413 return register_operand (op, mode);
414 }
415
416 /* Return truth value of whether OP is a integer which fits in 16 bits */
417
418 int
419 small_int (op, mode)
420 rtx op;
421 enum machine_mode mode;
422 {
423 return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
424 }
425
426 /* Return truth value of whether OP is a 32 bit integer which is too big to
427 be loaded with one instruction. */
428
429 int
430 large_int (op, mode)
431 rtx op;
432 enum machine_mode mode;
433 {
434 HOST_WIDE_INT value;
435
436 if (GET_CODE (op) != CONST_INT)
437 return FALSE;
438
439 value = INTVAL (op);
440 if ((value & ~0x0000ffff) == 0) /* ior reg,$r0,value */
441 return FALSE;
442
443 if (((unsigned long)(value + 32768)) <= 32767) /* subu reg,$r0,value */
444 return FALSE;
445
446 if ((value & 0x0000ffff) == 0) /* lui reg,value>>16 */
447 return FALSE;
448
449 return TRUE;
450 }
451
452 /* Return truth value of whether OP is a register or the constant 0. */
453
454 int
455 reg_or_0_operand (op, mode)
456 rtx op;
457 enum machine_mode mode;
458 {
459 switch (GET_CODE (op))
460 {
461 default:
462 break;
463
464 case CONST_INT:
465 return (INTVAL (op) == 0);
466
467 case CONST_DOUBLE:
468 if (op != CONST0_RTX (mode))
469 return FALSE;
470
471 return TRUE;
472
473 case REG:
474 case SUBREG:
475 return register_operand (op, mode);
476 }
477
478 return FALSE;
479 }
480
481 /* Return truth value if a CONST_DOUBLE is ok to be a legitimate constant. */
482
483 int
484 mips_const_double_ok (op, mode)
485 rtx op;
486 enum machine_mode mode;
487 {
488 REAL_VALUE_TYPE d;
489
490 if (GET_CODE (op) != CONST_DOUBLE)
491 return FALSE;
492
493 if (mode == VOIDmode)
494 return TRUE;
495
496 if (mode != SFmode && mode != DFmode)
497 return FALSE;
498
499 if (op == CONST0_RTX (mode))
500 return TRUE;
501
502 /* ??? li.s does not work right with SGI's Irix 6 assembler. */
503 if (mips_abi != ABI_32 && mips_abi != ABI_EABI)
504 return FALSE;
505
506 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
507
508 if (REAL_VALUE_ISNAN (d))
509 return FALSE;
510
511 if (REAL_VALUE_NEGATIVE (d))
512 d = REAL_VALUE_NEGATE (d);
513
514 if (mode == DFmode)
515 {
516 if (REAL_VALUES_LESS (d, dfhigh)
517 && REAL_VALUES_LESS (dflow, d))
518 return TRUE;
519 }
520 else
521 {
522 if (REAL_VALUES_LESS (d, sfhigh)
523 && REAL_VALUES_LESS (sflow, d))
524 return TRUE;
525 }
526
527 return FALSE;
528 }
529
530 /* Accept the floating point constant 1 in the appropriate mode. */
531
532 int
533 const_float_1_operand (op, mode)
534 rtx op;
535 enum machine_mode mode;
536 {
537 REAL_VALUE_TYPE d;
538 static REAL_VALUE_TYPE onedf;
539 static REAL_VALUE_TYPE onesf;
540 static int one_initialized;
541
542 if (GET_CODE (op) != CONST_DOUBLE
543 || mode != GET_MODE (op)
544 || (mode != DFmode && mode != SFmode))
545 return FALSE;
546
547 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
548
549 /* We only initialize these values if we need them, since we will
550 never get called unless mips_isa >= 4. */
551 if (! one_initialized)
552 {
553 onedf = REAL_VALUE_ATOF ("1.0", DFmode);
554 onesf = REAL_VALUE_ATOF ("1.0", SFmode);
555 one_initialized = TRUE;
556 }
557
558 if (mode == DFmode)
559 return REAL_VALUES_EQUAL (d, onedf);
560 else
561 return REAL_VALUES_EQUAL (d, onesf);
562 }
563
564 /* Return truth value if a memory operand fits in a single instruction
565 (ie, register + small offset). */
566
567 int
568 simple_memory_operand (op, mode)
569 rtx op;
570 enum machine_mode mode;
571 {
572 rtx addr, plus0, plus1;
573
574 /* Eliminate non-memory operations */
575 if (GET_CODE (op) != MEM)
576 return FALSE;
577
578 /* dword operations really put out 2 instructions, so eliminate them. */
579 /* ??? This isn't strictly correct. It is OK to accept multiword modes
580 here, since the length attributes are being set correctly, but only
581 if the address is offsettable. LO_SUM is not offsettable. */
582 if (GET_MODE_SIZE (GET_MODE (op)) > UNITS_PER_WORD)
583 return FALSE;
584
585 /* Decode the address now. */
586 addr = XEXP (op, 0);
587 switch (GET_CODE (addr))
588 {
589 default:
590 break;
591
592 case REG:
593 case LO_SUM:
594 return TRUE;
595
596 case CONST_INT:
597 return SMALL_INT (op);
598
599 case PLUS:
600 plus0 = XEXP (addr, 0);
601 plus1 = XEXP (addr, 1);
602 if (GET_CODE (plus0) == REG
603 && GET_CODE (plus1) == CONST_INT
604 && SMALL_INT (plus1))
605 return TRUE;
606
607 else if (GET_CODE (plus1) == REG
608 && GET_CODE (plus0) == CONST_INT
609 && SMALL_INT (plus0))
610 return TRUE;
611
612 else
613 return FALSE;
614
615 #if 0
616 /* We used to allow small symbol refs here (ie, stuff in .sdata
617 or .sbss), but this causes some bugs in G++. Also, it won't
618 interfere if the MIPS linker rewrites the store instruction
619 because the function is PIC. */
620
621 case LABEL_REF: /* never gp relative */
622 break;
623
624 case CONST:
625 /* If -G 0, we can never have a GP relative memory operation.
626 Also, save some time if not optimizing. */
627 if (!TARGET_GP_OPT)
628 return FALSE;
629
630 {
631 rtx offset = const0_rtx;
632 addr = eliminate_constant_term (XEXP (addr, 0), &offset);
633 if (GET_CODE (op) != SYMBOL_REF)
634 return FALSE;
635
636 /* let's be paranoid.... */
637 if (! SMALL_INT (offset))
638 return FALSE;
639 }
640 /* fall through */
641
642 case SYMBOL_REF:
643 return SYMBOL_REF_FLAG (addr);
644 #endif
645 }
646
647 return FALSE;
648 }
649
650 /* Return true if the code of this rtx pattern is EQ or NE. */
651
652 int
653 equality_op (op, mode)
654 rtx op;
655 enum machine_mode mode;
656 {
657 if (mode != GET_MODE (op))
658 return FALSE;
659
660 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
661 }
662
663 /* Return true if the code is a relational operations (EQ, LE, etc.) */
664
665 int
666 cmp_op (op, mode)
667 rtx op;
668 enum machine_mode mode;
669 {
670 if (mode != GET_MODE (op))
671 return FALSE;
672
673 return (GET_RTX_CLASS (GET_CODE (op)) == '<');
674 }
675
676 /* Return true if the operand is either the PC or a label_ref. */
677
678 int
679 pc_or_label_operand (op, mode)
680 rtx op;
681 enum machine_mode mode;
682 {
683 if (op == pc_rtx)
684 return TRUE;
685
686 if (GET_CODE (op) == LABEL_REF)
687 return TRUE;
688
689 return FALSE;
690 }
691
692 /* Test for a valid operand for a call instruction.
693 Don't allow the arg pointer register or virtual regs
694 since they may change into reg + const, which the patterns
695 can't handle yet. */
696
697 int
698 call_insn_operand (op, mode)
699 rtx op;
700 enum machine_mode mode;
701 {
702 if (CONSTANT_ADDRESS_P (op)
703 || (GET_CODE (op) == REG && op != arg_pointer_rtx
704 && ! (REGNO (op) >= FIRST_PSEUDO_REGISTER
705 && REGNO (op) <= LAST_VIRTUAL_REGISTER)))
706 return 1;
707 return 0;
708 }
709
710 /* Return true if OPERAND is valid as a source operand for a move
711 instruction. */
712
713 int
714 move_operand (op, mode)
715 rtx op;
716 enum machine_mode mode;
717 {
718 return (general_operand (op, mode)
719 && ! (mips_split_addresses && mips_check_split (op, mode)));
720 }
721
722 /* Return true if OPERAND is valid as a source operand for movdi.
723 This accepts not only general_operand, but also sign extended
724 constants and registers. We need to accept sign extended constants
725 in case a sign extended register which is used in an expression,
726 and is equivalent to a constant, is spilled. */
727
728 int
729 movdi_operand (op, mode)
730 rtx op;
731 enum machine_mode mode;
732 {
733 if (TARGET_64BIT
734 && mode == DImode
735 && GET_CODE (op) == SIGN_EXTEND
736 && GET_MODE (op) == DImode
737 && (GET_MODE (XEXP (op, 0)) == SImode
738 || (GET_CODE (XEXP (op, 0)) == CONST_INT
739 && GET_MODE (XEXP (op, 0)) == VOIDmode))
740 && (register_operand (XEXP (op, 0), SImode)
741 || immediate_operand (XEXP (op, 0), SImode)))
742 return 1;
743
744 return general_operand (op, mode);
745 }
746
747 /* Like register_operand, but when in 64 bit mode also accept a sign
748 extend of a 32 bit register, since the value is known to be already
749 sign extended. */
750
751 int
752 se_register_operand (op, mode)
753 rtx op;
754 enum machine_mode mode;
755 {
756 if (TARGET_64BIT
757 && mode == DImode
758 && GET_CODE (op) == SIGN_EXTEND
759 && GET_MODE (op) == DImode
760 && GET_MODE (XEXP (op, 0)) == SImode
761 && register_operand (XEXP (op, 0), SImode))
762 return 1;
763
764 return register_operand (op, mode);
765 }
766
767 /* Like reg_or_0_operand, but when in 64 bit mode also accept a sign
768 extend of a 32 bit register, since the value is known to be already
769 sign extended. */
770
771 int
772 se_reg_or_0_operand (op, mode)
773 rtx op;
774 enum machine_mode mode;
775 {
776 if (TARGET_64BIT
777 && mode == DImode
778 && GET_CODE (op) == SIGN_EXTEND
779 && GET_MODE (op) == DImode
780 && GET_MODE (XEXP (op, 0)) == SImode
781 && register_operand (XEXP (op, 0), SImode))
782 return 1;
783
784 return reg_or_0_operand (op, mode);
785 }
786
787 /* Like uns_arith_operand, but when in 64 bit mode also accept a sign
788 extend of a 32 bit register, since the value is known to be already
789 sign extended. */
790
791 int
792 se_uns_arith_operand (op, mode)
793 rtx op;
794 enum machine_mode mode;
795 {
796 if (TARGET_64BIT
797 && mode == DImode
798 && GET_CODE (op) == SIGN_EXTEND
799 && GET_MODE (op) == DImode
800 && GET_MODE (XEXP (op, 0)) == SImode
801 && register_operand (XEXP (op, 0), SImode))
802 return 1;
803
804 return uns_arith_operand (op, mode);
805 }
806
807 /* Like arith_operand, but when in 64 bit mode also accept a sign
808 extend of a 32 bit register, since the value is known to be already
809 sign extended. */
810
811 int
812 se_arith_operand (op, mode)
813 rtx op;
814 enum machine_mode mode;
815 {
816 if (TARGET_64BIT
817 && mode == DImode
818 && GET_CODE (op) == SIGN_EXTEND
819 && GET_MODE (op) == DImode
820 && GET_MODE (XEXP (op, 0)) == SImode
821 && register_operand (XEXP (op, 0), SImode))
822 return 1;
823
824 return arith_operand (op, mode);
825 }
826
827 /* Like nonmemory_operand, but when in 64 bit mode also accept a sign
828 extend of a 32 bit register, since the value is known to be already
829 sign extended. */
830
831 int
832 se_nonmemory_operand (op, mode)
833 rtx op;
834 enum machine_mode mode;
835 {
836 if (TARGET_64BIT
837 && mode == DImode
838 && GET_CODE (op) == SIGN_EXTEND
839 && GET_MODE (op) == DImode
840 && GET_MODE (XEXP (op, 0)) == SImode
841 && register_operand (XEXP (op, 0), SImode))
842 return 1;
843
844 return nonmemory_operand (op, mode);
845 }
846
847 /* Like nonimmediate_operand, but when in 64 bit mode also accept a
848 sign extend of a 32 bit register, since the value is known to be
849 already sign extended. */
850
851 int
852 se_nonimmediate_operand (op, mode)
853 rtx op;
854 enum machine_mode mode;
855 {
856 if (TARGET_64BIT
857 && mode == DImode
858 && GET_CODE (op) == SIGN_EXTEND
859 && GET_MODE (op) == DImode
860 && GET_MODE (XEXP (op, 0)) == SImode
861 && register_operand (XEXP (op, 0), SImode))
862 return 1;
863
864 return nonimmediate_operand (op, mode);
865 }
866
867 /* Return true if we split the address into high and low parts. */
868
869 /* ??? We should also handle reg+array somewhere. We get four
870 instructions currently, lui %hi/addui %lo/addui reg/lw. Better is
871 lui %hi/addui reg/lw %lo. Fixing GO_IF_LEGITIMATE_ADDRESS to accept
872 (plus (reg) (symbol_ref)) doesn't work because the SYMBOL_REF is broken
873 out of the address, then we have 4 instructions to combine. Perhaps
874 add a 3->2 define_split for combine. */
875
876 /* ??? We could also split a CONST_INT here if it is a large_int().
877 However, it doesn't seem to be very useful to have %hi(constant).
878 We would be better off by doing the masking ourselves and then putting
879 the explicit high part of the constant in the RTL. This will give better
880 optimization. Also, %hi(constant) needs assembler changes to work.
881 There is already a define_split that does this. */
882
883 int
884 mips_check_split (address, mode)
885 rtx address;
886 enum machine_mode mode;
887 {
888 /* ??? This is the same check used in simple_memory_operand.
889 We use it here because LO_SUM is not offsettable. */
890 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
891 return 0;
892
893 if ((GET_CODE (address) == SYMBOL_REF && ! SYMBOL_REF_FLAG (address))
894 || (GET_CODE (address) == CONST
895 && GET_CODE (XEXP (XEXP (address, 0), 0)) == SYMBOL_REF
896 && ! SYMBOL_REF_FLAG (XEXP (XEXP (address, 0), 0)))
897 || GET_CODE (address) == LABEL_REF)
898 return 1;
899
900 return 0;
901 }
902 \f
903 /* Returns an operand string for the given instruction's delay slot,
904 after updating filled delay slot statistics.
905
906 We assume that operands[0] is the target register that is set.
907
908 In order to check the next insn, most of this functionality is moved
909 to FINAL_PRESCAN_INSN, and we just set the global variables that
910 it needs. */
911
912 /* ??? This function no longer does anything useful, because final_prescan_insn
913 now will never emit a nop. */
914
915 char *
916 mips_fill_delay_slot (ret, type, operands, cur_insn)
917 char *ret; /* normal string to return */
918 enum delay_type type; /* type of delay */
919 rtx operands[]; /* operands to use */
920 rtx cur_insn; /* current insn */
921 {
922 register rtx set_reg;
923 register enum machine_mode mode;
924 register rtx next_insn = (cur_insn) ? NEXT_INSN (cur_insn) : (rtx)0;
925 register int num_nops;
926
927 if (type == DELAY_LOAD || type == DELAY_FCMP)
928 num_nops = 1;
929
930 else if (type == DELAY_HILO)
931 num_nops = 2;
932
933 else
934 num_nops = 0;
935
936 /* Make sure that we don't put nop's after labels. */
937 next_insn = NEXT_INSN (cur_insn);
938 while (next_insn != (rtx)0 && GET_CODE (next_insn) == NOTE)
939 next_insn = NEXT_INSN (next_insn);
940
941 dslots_load_total += num_nops;
942 if (TARGET_DEBUG_F_MODE
943 || !optimize
944 || type == DELAY_NONE
945 || operands == (rtx *)0
946 || cur_insn == (rtx)0
947 || next_insn == (rtx)0
948 || GET_CODE (next_insn) == CODE_LABEL
949 || (set_reg = operands[0]) == (rtx)0)
950 {
951 dslots_number_nops = 0;
952 mips_load_reg = (rtx)0;
953 mips_load_reg2 = (rtx)0;
954 mips_load_reg3 = (rtx)0;
955 mips_load_reg4 = (rtx)0;
956 return ret;
957 }
958
959 set_reg = operands[0];
960 if (set_reg == (rtx)0)
961 return ret;
962
963 while (GET_CODE (set_reg) == SUBREG)
964 set_reg = SUBREG_REG (set_reg);
965
966 mode = GET_MODE (set_reg);
967 dslots_number_nops = num_nops;
968 mips_load_reg = set_reg;
969 if (GET_MODE_SIZE (mode)
970 > (FP_REG_P (REGNO (set_reg)) ? UNITS_PER_FPREG : UNITS_PER_WORD))
971 mips_load_reg2 = gen_rtx (REG, SImode, REGNO (set_reg) + 1);
972 else
973 mips_load_reg2 = 0;
974
975 if (type == DELAY_HILO)
976 {
977 mips_load_reg3 = gen_rtx (REG, SImode, MD_REG_FIRST);
978 mips_load_reg4 = gen_rtx (REG, SImode, MD_REG_FIRST+1);
979 }
980 else
981 {
982 mips_load_reg3 = 0;
983 mips_load_reg4 = 0;
984 }
985
986 return ret;
987 }
988
989 \f
990 /* Determine whether a memory reference takes one (based off of the GP pointer),
991 two (normal), or three (label + reg) instructions, and bump the appropriate
992 counter for -mstats. */
993
994 void
995 mips_count_memory_refs (op, num)
996 rtx op;
997 int num;
998 {
999 int additional = 0;
1000 int n_words = 0;
1001 rtx addr, plus0, plus1;
1002 enum rtx_code code0, code1;
1003 int looping;
1004
1005 if (TARGET_DEBUG_B_MODE)
1006 {
1007 fprintf (stderr, "\n========== mips_count_memory_refs:\n");
1008 debug_rtx (op);
1009 }
1010
1011 /* Skip MEM if passed, otherwise handle movsi of address. */
1012 addr = (GET_CODE (op) != MEM) ? op : XEXP (op, 0);
1013
1014 /* Loop, going through the address RTL */
1015 do
1016 {
1017 looping = FALSE;
1018 switch (GET_CODE (addr))
1019 {
1020 default:
1021 break;
1022
1023 case REG:
1024 case CONST_INT:
1025 case LO_SUM:
1026 break;
1027
1028 case PLUS:
1029 plus0 = XEXP (addr, 0);
1030 plus1 = XEXP (addr, 1);
1031 code0 = GET_CODE (plus0);
1032 code1 = GET_CODE (plus1);
1033
1034 if (code0 == REG)
1035 {
1036 additional++;
1037 addr = plus1;
1038 looping = TRUE;
1039 continue;
1040 }
1041
1042 if (code0 == CONST_INT)
1043 {
1044 addr = plus1;
1045 looping = TRUE;
1046 continue;
1047 }
1048
1049 if (code1 == REG)
1050 {
1051 additional++;
1052 addr = plus0;
1053 looping = TRUE;
1054 continue;
1055 }
1056
1057 if (code1 == CONST_INT)
1058 {
1059 addr = plus0;
1060 looping = TRUE;
1061 continue;
1062 }
1063
1064 if (code0 == SYMBOL_REF || code0 == LABEL_REF || code0 == CONST)
1065 {
1066 addr = plus0;
1067 looping = TRUE;
1068 continue;
1069 }
1070
1071 if (code1 == SYMBOL_REF || code1 == LABEL_REF || code1 == CONST)
1072 {
1073 addr = plus1;
1074 looping = TRUE;
1075 continue;
1076 }
1077
1078 break;
1079
1080 case LABEL_REF:
1081 n_words = 2; /* always 2 words */
1082 break;
1083
1084 case CONST:
1085 addr = XEXP (addr, 0);
1086 looping = TRUE;
1087 continue;
1088
1089 case SYMBOL_REF:
1090 n_words = SYMBOL_REF_FLAG (addr) ? 1 : 2;
1091 break;
1092 }
1093 }
1094 while (looping);
1095
1096 if (n_words == 0)
1097 return;
1098
1099 n_words += additional;
1100 if (n_words > 3)
1101 n_words = 3;
1102
1103 num_refs[n_words-1] += num;
1104 }
1105
1106 \f
1107 /* Return RTL for the offset from the current function to the
1108 argument. */
1109
1110 rtx
1111 embedded_pic_offset (x)
1112 rtx x;
1113 {
1114 if (embedded_pic_fnaddr_rtx == NULL)
1115 {
1116 rtx seq;
1117
1118 embedded_pic_fnaddr_rtx = gen_reg_rtx (Pmode);
1119
1120 /* Output code at function start to initialize the pseudo-reg. */
1121 /* ??? We used to do this in FINALIZE_PIC, but that does not work for
1122 inline functions, because it is called after RTL for the function
1123 has been copied. The pseudo-reg in embedded_pic_fnaddr_rtx however
1124 does not get copied, and ends up not matching the rest of the RTL.
1125 This solution works, but means that we get unnecessary code to
1126 initialize this value every time a function is inlined into another
1127 function. */
1128 start_sequence ();
1129 emit_insn (gen_get_fnaddr (embedded_pic_fnaddr_rtx,
1130 XEXP (DECL_RTL (current_function_decl), 0)));
1131 seq = gen_sequence ();
1132 end_sequence ();
1133 push_topmost_sequence ();
1134 emit_insn_after (seq, get_insns ());
1135 pop_topmost_sequence ();
1136 }
1137
1138 return gen_rtx (CONST, Pmode,
1139 gen_rtx (MINUS, Pmode, x,
1140 XEXP (DECL_RTL (current_function_decl), 0)));
1141 }
1142
1143 /* Return the appropriate instructions to move one operand to another. */
1144
1145 char *
1146 mips_move_1word (operands, insn, unsignedp)
1147 rtx operands[];
1148 rtx insn;
1149 int unsignedp;
1150 {
1151 char *ret = 0;
1152 rtx op0 = operands[0];
1153 rtx op1 = operands[1];
1154 enum rtx_code code0 = GET_CODE (op0);
1155 enum rtx_code code1 = GET_CODE (op1);
1156 enum machine_mode mode = GET_MODE (op0);
1157 int subreg_word0 = 0;
1158 int subreg_word1 = 0;
1159 enum delay_type delay = DELAY_NONE;
1160
1161 while (code0 == SUBREG)
1162 {
1163 subreg_word0 += SUBREG_WORD (op0);
1164 op0 = SUBREG_REG (op0);
1165 code0 = GET_CODE (op0);
1166 }
1167
1168 while (code1 == SUBREG)
1169 {
1170 subreg_word1 += SUBREG_WORD (op1);
1171 op1 = SUBREG_REG (op1);
1172 code1 = GET_CODE (op1);
1173 }
1174
1175 /* For our purposes, a condition code mode is the same as SImode. */
1176 if (mode == CCmode)
1177 mode = SImode;
1178
1179 if (code0 == REG)
1180 {
1181 int regno0 = REGNO (op0) + subreg_word0;
1182
1183 if (code1 == REG)
1184 {
1185 int regno1 = REGNO (op1) + subreg_word1;
1186
1187 /* Just in case, don't do anything for assigning a register
1188 to itself, unless we are filling a delay slot. */
1189 if (regno0 == regno1 && set_nomacro == 0)
1190 ret = "";
1191
1192 else if (GP_REG_P (regno0))
1193 {
1194 if (GP_REG_P (regno1))
1195 ret = "move\t%0,%1";
1196
1197 else if (MD_REG_P (regno1))
1198 {
1199 delay = DELAY_HILO;
1200 if (regno1 != HILO_REGNUM)
1201 ret = "mf%1\t%0";
1202 else
1203 ret = "mflo\t%0";
1204 }
1205
1206 else if (ST_REG_P (regno1) && mips_isa >= 4)
1207 ret = "li\t%0,1\n\tmovf\t%0,%.,%1";
1208
1209 else
1210 {
1211 delay = DELAY_LOAD;
1212 if (FP_REG_P (regno1))
1213 ret = "mfc1\t%0,%1";
1214
1215 else if (regno1 == FPSW_REGNUM && mips_isa < 4)
1216 ret = "cfc1\t%0,$31";
1217 }
1218 }
1219
1220 else if (FP_REG_P (regno0))
1221 {
1222 if (GP_REG_P (regno1))
1223 {
1224 delay = DELAY_LOAD;
1225 ret = "mtc1\t%1,%0";
1226 }
1227
1228 if (FP_REG_P (regno1))
1229 ret = "mov.s\t%0,%1";
1230 }
1231
1232 else if (MD_REG_P (regno0))
1233 {
1234 if (GP_REG_P (regno1))
1235 {
1236 delay = DELAY_HILO;
1237 if (regno0 != HILO_REGNUM)
1238 ret = "mt%0\t%1";
1239 }
1240 }
1241
1242 else if (regno0 == FPSW_REGNUM && mips_isa < 4)
1243 {
1244 if (GP_REG_P (regno1))
1245 {
1246 delay = DELAY_LOAD;
1247 ret = "ctc1\t%0,$31";
1248 }
1249 }
1250 }
1251
1252 else if (code1 == MEM)
1253 {
1254 delay = DELAY_LOAD;
1255
1256 if (TARGET_STATS)
1257 mips_count_memory_refs (op1, 1);
1258
1259 if (GP_REG_P (regno0))
1260 {
1261 /* For loads, use the mode of the memory item, instead of the
1262 target, so zero/sign extend can use this code as well. */
1263 switch (GET_MODE (op1))
1264 {
1265 default:
1266 break;
1267 case SFmode:
1268 ret = "lw\t%0,%1";
1269 break;
1270 case SImode:
1271 case CCmode:
1272 ret = ((unsignedp && TARGET_64BIT)
1273 ? "lwu\t%0,%1"
1274 : "lw\t%0,%1");
1275 break;
1276 case HImode:
1277 ret = (unsignedp) ? "lhu\t%0,%1" : "lh\t%0,%1";
1278 break;
1279 case QImode:
1280 ret = (unsignedp) ? "lbu\t%0,%1" : "lb\t%0,%1";
1281 break;
1282 }
1283 }
1284
1285 else if (FP_REG_P (regno0) && (mode == SImode || mode == SFmode))
1286 ret = "l.s\t%0,%1";
1287
1288 if (ret != (char *)0 && MEM_VOLATILE_P (op1))
1289 {
1290 int i = strlen (ret);
1291 if (i > sizeof (volatile_buffer) - sizeof ("%{%}"))
1292 abort ();
1293
1294 sprintf (volatile_buffer, "%%{%s%%}", ret);
1295 ret = volatile_buffer;
1296 }
1297 }
1298
1299 else if (code1 == CONST_INT
1300 || (code1 == CONST_DOUBLE
1301 && GET_MODE (op1) == VOIDmode))
1302 {
1303 if (code1 == CONST_DOUBLE)
1304 {
1305 /* This can happen when storing constants into long long
1306 bitfields. Just store the least significant word of
1307 the value. */
1308 operands[1] = op1 = GEN_INT (CONST_DOUBLE_LOW (op1));
1309 }
1310
1311 if (INTVAL (op1) == 0)
1312 {
1313 if (GP_REG_P (regno0))
1314 ret = "move\t%0,%z1";
1315
1316 else if (FP_REG_P (regno0))
1317 {
1318 delay = DELAY_LOAD;
1319 ret = "mtc1\t%z1,%0";
1320 }
1321
1322 else if (MD_REG_P (regno0))
1323 {
1324 delay = DELAY_HILO;
1325 ret = "mt%0\t%.";
1326 }
1327 }
1328
1329 else if (GP_REG_P (regno0))
1330 /* Don't use X format, because that will give out of range
1331 numbers for 64 bit host and 32 bit target. */
1332 ret = "li\t%0,%1\t\t\t# %X1";
1333 }
1334
1335 else if (code1 == CONST_DOUBLE && mode == SFmode)
1336 {
1337 if (op1 == CONST0_RTX (SFmode))
1338 {
1339 if (GP_REG_P (regno0))
1340 ret = "move\t%0,%.";
1341
1342 else if (FP_REG_P (regno0))
1343 {
1344 delay = DELAY_LOAD;
1345 ret = "mtc1\t%.,%0";
1346 }
1347 }
1348
1349 else
1350 {
1351 delay = DELAY_LOAD;
1352 ret = "li.s\t%0,%1";
1353 }
1354 }
1355
1356 else if (code1 == LABEL_REF)
1357 {
1358 if (TARGET_STATS)
1359 mips_count_memory_refs (op1, 1);
1360
1361 ret = "la\t%0,%a1";
1362 }
1363
1364 else if (code1 == SYMBOL_REF || code1 == CONST)
1365 {
1366 if (HALF_PIC_P () && CONSTANT_P (op1) && HALF_PIC_ADDRESS_P (op1))
1367 {
1368 rtx offset = const0_rtx;
1369
1370 if (GET_CODE (op1) == CONST)
1371 op1 = eliminate_constant_term (XEXP (op1, 0), &offset);
1372
1373 if (GET_CODE (op1) == SYMBOL_REF)
1374 {
1375 operands[2] = HALF_PIC_PTR (op1);
1376
1377 if (TARGET_STATS)
1378 mips_count_memory_refs (operands[2], 1);
1379
1380 if (INTVAL (offset) == 0)
1381 {
1382 delay = DELAY_LOAD;
1383 ret = (unsignedp && TARGET_64BIT
1384 ? "lwu\t%0,%2"
1385 : "lw\t%0,%2");
1386 }
1387 else
1388 {
1389 dslots_load_total++;
1390 operands[3] = offset;
1391 if (unsignedp && TARGET_64BIT)
1392 ret = (SMALL_INT (offset))
1393 ? "lwu\t%0,%2%#\n\tadd\t%0,%0,%3"
1394 : "lwu\t%0,%2%#\n\t%[li\t%@,%3\n\tadd\t%0,%0,%@%]";
1395 else
1396 ret = (SMALL_INT (offset))
1397 ? "lw\t%0,%2%#\n\tadd\t%0,%0,%3"
1398 : "lw\t%0,%2%#\n\t%[li\t%@,%3\n\tadd\t%0,%0,%@%]";
1399 }
1400 }
1401 }
1402 else
1403 {
1404 if (TARGET_STATS)
1405 mips_count_memory_refs (op1, 1);
1406
1407 ret = "la\t%0,%a1";
1408 }
1409 }
1410
1411 else if (code1 == PLUS)
1412 {
1413 rtx add_op0 = XEXP (op1, 0);
1414 rtx add_op1 = XEXP (op1, 1);
1415
1416 if (GET_CODE (XEXP (op1, 1)) == REG && GET_CODE (XEXP (op1, 0)) == CONST_INT)
1417 {
1418 add_op0 = XEXP (op1, 1); /* reverse operands */
1419 add_op1 = XEXP (op1, 0);
1420 }
1421
1422 operands[2] = add_op0;
1423 operands[3] = add_op1;
1424 ret = "add%:\t%0,%2,%3";
1425 }
1426
1427 else if (code1 == HIGH)
1428 {
1429 operands[1] = XEXP (op1, 0);
1430 ret = "lui\t%0,%%hi(%1)";
1431 }
1432 }
1433
1434 else if (code0 == MEM)
1435 {
1436 if (TARGET_STATS)
1437 mips_count_memory_refs (op0, 1);
1438
1439 if (code1 == REG)
1440 {
1441 int regno1 = REGNO (op1) + subreg_word1;
1442
1443 if (GP_REG_P (regno1))
1444 {
1445 switch (mode)
1446 {
1447 default: break;
1448 case SFmode: ret = "sw\t%1,%0"; break;
1449 case SImode: ret = "sw\t%1,%0"; break;
1450 case HImode: ret = "sh\t%1,%0"; break;
1451 case QImode: ret = "sb\t%1,%0"; break;
1452 }
1453 }
1454
1455 else if (FP_REG_P (regno1) && (mode == SImode || mode == SFmode))
1456 ret = "s.s\t%1,%0";
1457 }
1458
1459 else if (code1 == CONST_INT && INTVAL (op1) == 0)
1460 {
1461 switch (mode)
1462 {
1463 default: break;
1464 case SFmode: ret = "sw\t%z1,%0"; break;
1465 case SImode: ret = "sw\t%z1,%0"; break;
1466 case HImode: ret = "sh\t%z1,%0"; break;
1467 case QImode: ret = "sb\t%z1,%0"; break;
1468 }
1469 }
1470
1471 else if (code1 == CONST_DOUBLE && op1 == CONST0_RTX (mode))
1472 {
1473 switch (mode)
1474 {
1475 default: break;
1476 case SFmode: ret = "sw\t%.,%0"; break;
1477 case SImode: ret = "sw\t%.,%0"; break;
1478 case HImode: ret = "sh\t%.,%0"; break;
1479 case QImode: ret = "sb\t%.,%0"; break;
1480 }
1481 }
1482
1483 if (ret != (char *)0 && MEM_VOLATILE_P (op0))
1484 {
1485 int i = strlen (ret);
1486 if (i > sizeof (volatile_buffer) - sizeof ("%{%}"))
1487 abort ();
1488
1489 sprintf (volatile_buffer, "%%{%s%%}", ret);
1490 ret = volatile_buffer;
1491 }
1492 }
1493
1494 if (ret == (char *)0)
1495 {
1496 abort_with_insn (insn, "Bad move");
1497 return 0;
1498 }
1499
1500 if (delay != DELAY_NONE)
1501 return mips_fill_delay_slot (ret, delay, operands, insn);
1502
1503 return ret;
1504 }
1505
1506 \f
1507 /* Return the appropriate instructions to move 2 words */
1508
1509 char *
1510 mips_move_2words (operands, insn)
1511 rtx operands[];
1512 rtx insn;
1513 {
1514 char *ret = 0;
1515 rtx op0 = operands[0];
1516 rtx op1 = operands[1];
1517 enum rtx_code code0 = GET_CODE (operands[0]);
1518 enum rtx_code code1 = GET_CODE (operands[1]);
1519 int subreg_word0 = 0;
1520 int subreg_word1 = 0;
1521 enum delay_type delay = DELAY_NONE;
1522
1523 while (code0 == SUBREG)
1524 {
1525 subreg_word0 += SUBREG_WORD (op0);
1526 op0 = SUBREG_REG (op0);
1527 code0 = GET_CODE (op0);
1528 }
1529
1530 if (code1 == SIGN_EXTEND)
1531 {
1532 op1 = XEXP (op1, 0);
1533 code1 = GET_CODE (op1);
1534 }
1535
1536 while (code1 == SUBREG)
1537 {
1538 subreg_word1 += SUBREG_WORD (op1);
1539 op1 = SUBREG_REG (op1);
1540 code1 = GET_CODE (op1);
1541 }
1542
1543 /* Sanity check. */
1544 if (GET_CODE (operands[1]) == SIGN_EXTEND
1545 && code1 != REG
1546 && code1 != CONST_INT)
1547 abort ();
1548
1549 if (code0 == REG)
1550 {
1551 int regno0 = REGNO (op0) + subreg_word0;
1552
1553 if (code1 == REG)
1554 {
1555 int regno1 = REGNO (op1) + subreg_word1;
1556
1557 /* Just in case, don't do anything for assigning a register
1558 to itself, unless we are filling a delay slot. */
1559 if (regno0 == regno1 && set_nomacro == 0)
1560 ret = "";
1561
1562 else if (FP_REG_P (regno0))
1563 {
1564 if (FP_REG_P (regno1))
1565 ret = "mov.d\t%0,%1";
1566
1567 else
1568 {
1569 delay = DELAY_LOAD;
1570 if (TARGET_FLOAT64)
1571 {
1572 if (!TARGET_64BIT)
1573 abort_with_insn (insn, "Bad move");
1574 #ifdef TARGET_FP_CALL_32
1575 if (FP_CALL_GP_REG_P (regno1))
1576 ret = "dsll\t%1,32\n\tor\t%1,%D1\n\tdmtc1\t%1,%0";
1577 else
1578 #endif
1579 ret = "dmtc1\t%1,%0";
1580 }
1581 else
1582 ret = "mtc1\t%L1,%0\n\tmtc1\t%M1,%D0";
1583 }
1584 }
1585
1586 else if (FP_REG_P (regno1))
1587 {
1588 delay = DELAY_LOAD;
1589 if (TARGET_FLOAT64)
1590 {
1591 if (!TARGET_64BIT)
1592 abort_with_insn (insn, "Bad move");
1593 #ifdef TARGET_FP_CALL_32
1594 if (FP_CALL_GP_REG_P (regno0))
1595 ret = "dmfc1\t%0,%1\n\tmfc1\t%D0,%1\n\tdsrl\t%0,32";
1596 else
1597 #endif
1598 ret = "dmfc1\t%0,%1";
1599 }
1600 else
1601 ret = "mfc1\t%L0,%1\n\tmfc1\t%M0,%D1";
1602 }
1603
1604 else if (MD_REG_P (regno0) && GP_REG_P (regno1))
1605 {
1606 delay = DELAY_HILO;
1607 if (TARGET_64BIT)
1608 {
1609 if (regno0 != HILO_REGNUM)
1610 ret = "mt%0\t%1";
1611 else if (regno1 == 0)
1612 ret = "mtlo\t%.\n\tmthi\t%.";
1613 }
1614 else
1615 ret = "mthi\t%M1\n\tmtlo\t%L1";
1616 }
1617
1618 else if (GP_REG_P (regno0) && MD_REG_P (regno1))
1619 {
1620 delay = DELAY_HILO;
1621 if (TARGET_64BIT)
1622 {
1623 if (regno1 != HILO_REGNUM)
1624 ret = "mf%1\t%0";
1625 }
1626 else
1627 ret = "mfhi\t%M0\n\tmflo\t%L0";
1628 }
1629
1630 else if (TARGET_64BIT)
1631 ret = "move\t%0,%1";
1632
1633 else if (regno0 != (regno1+1))
1634 ret = "move\t%0,%1\n\tmove\t%D0,%D1";
1635
1636 else
1637 ret = "move\t%D0,%D1\n\tmove\t%0,%1";
1638 }
1639
1640 else if (code1 == CONST_DOUBLE)
1641 {
1642 /* Move zero from $0 unless !TARGET_64BIT and recipient
1643 is 64-bit fp reg, in which case generate a constant. */
1644 if (op1 != CONST0_RTX (GET_MODE (op1))
1645 || (TARGET_FLOAT64 && !TARGET_64BIT && FP_REG_P (regno0)))
1646 {
1647 if (GET_MODE (op1) == DFmode)
1648 {
1649 delay = DELAY_LOAD;
1650 #ifdef TARGET_FP_CALL_32
1651 if (FP_CALL_GP_REG_P (regno0))
1652 {
1653 if (TARGET_FLOAT64 && !TARGET_64BIT)
1654 {
1655 split_double (op1, operands + 2, operands + 3);
1656 ret = "li\t%0,%2\n\tli\t%D0,%3";
1657 }
1658 else
1659 ret = "li.d\t%0,%1\n\tdsll\t%D0,%0,32\n\tdsrl\t%D0,32\n\tdsrl\t%0,32";
1660 }
1661 else
1662 #endif
1663 ret = "li.d\t%0,%1";
1664 }
1665
1666 else if (TARGET_64BIT)
1667 ret = "dli\t%0,%1";
1668
1669 else
1670 {
1671 split_double (op1, operands + 2, operands + 3);
1672 ret = "li\t%0,%2\n\tli\t%D0,%3";
1673 }
1674 }
1675
1676 else
1677 {
1678 if (GP_REG_P (regno0))
1679 ret = (TARGET_64BIT
1680 #ifdef TARGET_FP_CALL_32
1681 && ! FP_CALL_GP_REG_P (regno0)
1682 #endif
1683 )
1684 ? "move\t%0,%."
1685 : "move\t%0,%.\n\tmove\t%D0,%.";
1686
1687 else if (FP_REG_P (regno0))
1688 {
1689 delay = DELAY_LOAD;
1690 ret = (TARGET_64BIT)
1691 ? "dmtc1\t%.,%0"
1692 : "mtc1\t%.,%0\n\tmtc1\t%.,%D0";
1693 }
1694 }
1695 }
1696
1697 else if (code1 == CONST_INT && INTVAL (op1) == 0)
1698 {
1699 if (GP_REG_P (regno0))
1700 ret = (TARGET_64BIT)
1701 ? "move\t%0,%."
1702 : "move\t%0,%.\n\tmove\t%D0,%.";
1703
1704 else if (FP_REG_P (regno0))
1705 {
1706 delay = DELAY_LOAD;
1707 ret = (TARGET_64BIT)
1708 ? "dmtc1\t%.,%0"
1709 : (TARGET_FLOAT64
1710 ? "li.d\t%0,%1"
1711 : "mtc1\t%.,%0\n\tmtc1\t%.,%D0");
1712 }
1713 else if (MD_REG_P (regno0))
1714 {
1715 delay = DELAY_HILO;
1716 if (regno0 != HILO_REGNUM)
1717 ret = "mt%0\t%.\n";
1718 else
1719 ret = "mtlo\t%.\n\tmthi\t%.";
1720 }
1721 }
1722
1723 else if (code1 == CONST_INT && GET_MODE (op0) == DImode && GP_REG_P (regno0))
1724 {
1725 if (TARGET_64BIT)
1726 {
1727 if (GET_CODE (operands[1]) == SIGN_EXTEND)
1728 ret = "li\t%0,%1\t\t# %X1";
1729 else if (HOST_BITS_PER_WIDE_INT < 64)
1730 /* We can't use 'X' for negative numbers, because then we won't
1731 get the right value for the upper 32 bits. */
1732 ret = ((INTVAL (op1) < 0) ? "dli\t%0,%1\t\t\t# %X1"
1733 : "dli\t%0,%X1\t\t# %1");
1734 else
1735 /* We must use 'X', because otherwise LONG_MIN will print as
1736 a number that the assembler won't accept. */
1737 ret = "dli\t%0,%X1\t\t# %1";
1738 }
1739 else if (HOST_BITS_PER_WIDE_INT < 64)
1740 {
1741 operands[2] = GEN_INT (INTVAL (operands[1]) >= 0 ? 0 : -1);
1742 ret = "li\t%M0,%2\n\tli\t%L0,%1";
1743 }
1744 else
1745 {
1746 /* We use multiple shifts here, to avoid warnings about out
1747 of range shifts on 32 bit hosts. */
1748 operands[2] = GEN_INT (INTVAL (operands[1]) >> 16 >> 16);
1749 operands[1] = GEN_INT (INTVAL (operands[1]) << 16 << 16 >> 16 >> 16);
1750 ret = "li\t%M0,%2\n\tli\t%L0,%1";
1751 }
1752 }
1753
1754 else if (code1 == MEM)
1755 {
1756 delay = DELAY_LOAD;
1757
1758 if (TARGET_STATS)
1759 mips_count_memory_refs (op1, 2);
1760
1761 if (FP_REG_P (regno0))
1762 ret = "l.d\t%0,%1";
1763
1764 else if (TARGET_64BIT)
1765 {
1766 #ifdef TARGET_FP_CALL_32
1767 if (FP_CALL_GP_REG_P (regno0))
1768 {
1769 if (offsettable_address_p (FALSE, SImode, op1))
1770 ret = "lwu\t%0,%1\n\tlwu\t%D0,4+%1";
1771 else
1772 ret = "ld\t%0,%1\n\tdsll\t%D0,%0,32\n\tdsrl\t%D0,32\n\tdsrl\t%0,32";
1773 }
1774 else
1775 #endif
1776 ret = "ld\t%0,%1";
1777 }
1778
1779 else if (offsettable_address_p (1, DFmode, XEXP (op1, 0)))
1780 {
1781 operands[2] = adj_offsettable_operand (op1, 4);
1782 if (reg_mentioned_p (op0, op1))
1783 ret = "lw\t%D0,%2\n\tlw\t%0,%1";
1784 else
1785 ret = "lw\t%0,%1\n\tlw\t%D0,%2";
1786 }
1787
1788 if (ret != (char *)0 && MEM_VOLATILE_P (op1))
1789 {
1790 int i = strlen (ret);
1791 if (i > sizeof (volatile_buffer) - sizeof ("%{%}"))
1792 abort ();
1793
1794 sprintf (volatile_buffer, "%%{%s%%}", ret);
1795 ret = volatile_buffer;
1796 }
1797 }
1798
1799 else if (code1 == LABEL_REF
1800 || code1 == SYMBOL_REF
1801 || code1 == CONST)
1802 {
1803 if (TARGET_STATS)
1804 mips_count_memory_refs (op1, 2);
1805
1806 ret = "dla\t%0,%a1";
1807 }
1808 }
1809
1810 else if (code0 == MEM)
1811 {
1812 if (code1 == REG)
1813 {
1814 int regno1 = REGNO (op1) + subreg_word1;
1815
1816 if (FP_REG_P (regno1))
1817 ret = "s.d\t%1,%0";
1818
1819 else if (TARGET_64BIT)
1820 {
1821 #ifdef TARGET_FP_CALL_32
1822 if (FP_CALL_GP_REG_P (regno1))
1823 ret = "dsll\t%1,32\n\tor\t%1,%D1\n\tsd\t%1,%0";
1824 else
1825 #endif
1826 ret = "sd\t%1,%0";
1827 }
1828
1829 else if (offsettable_address_p (1, DFmode, XEXP (op0, 0)))
1830 {
1831 operands[2] = adj_offsettable_operand (op0, 4);
1832 ret = "sw\t%1,%0\n\tsw\t%D1,%2";
1833 }
1834 }
1835
1836 else if (((code1 == CONST_INT && INTVAL (op1) == 0)
1837 || (code1 == CONST_DOUBLE
1838 && op1 == CONST0_RTX (GET_MODE (op1))))
1839 && (TARGET_64BIT
1840 || offsettable_address_p (1, DFmode, XEXP (op0, 0))))
1841 {
1842 if (TARGET_64BIT)
1843 ret = "sd\t%.,%0";
1844 else
1845 {
1846 operands[2] = adj_offsettable_operand (op0, 4);
1847 ret = "sw\t%.,%0\n\tsw\t%.,%2";
1848 }
1849 }
1850
1851 if (TARGET_STATS)
1852 mips_count_memory_refs (op0, 2);
1853
1854 if (ret != (char *)0 && MEM_VOLATILE_P (op0))
1855 {
1856 int i = strlen (ret);
1857 if (i > sizeof (volatile_buffer) - sizeof ("%{%}"))
1858 abort ();
1859
1860 sprintf (volatile_buffer, "%%{%s%%}", ret);
1861 ret = volatile_buffer;
1862 }
1863 }
1864
1865 if (ret == (char *)0)
1866 {
1867 abort_with_insn (insn, "Bad move");
1868 return 0;
1869 }
1870
1871 if (delay != DELAY_NONE)
1872 return mips_fill_delay_slot (ret, delay, operands, insn);
1873
1874 return ret;
1875 }
1876
1877 \f
1878 /* Provide the costs of an addressing mode that contains ADDR.
1879 If ADDR is not a valid address, its cost is irrelevant. */
1880
1881 int
1882 mips_address_cost (addr)
1883 rtx addr;
1884 {
1885 switch (GET_CODE (addr))
1886 {
1887 default:
1888 break;
1889
1890 case LO_SUM:
1891 return 1;
1892
1893 case LABEL_REF:
1894 return 2;
1895
1896 case CONST:
1897 {
1898 rtx offset = const0_rtx;
1899 addr = eliminate_constant_term (XEXP (addr, 0), &offset);
1900 if (GET_CODE (addr) == LABEL_REF)
1901 return 2;
1902
1903 if (GET_CODE (addr) != SYMBOL_REF)
1904 return 4;
1905
1906 if (! SMALL_INT (offset))
1907 return 2;
1908 }
1909 /* fall through */
1910
1911 case SYMBOL_REF:
1912 return SYMBOL_REF_FLAG (addr) ? 1 : 2;
1913
1914 case PLUS:
1915 {
1916 register rtx plus0 = XEXP (addr, 0);
1917 register rtx plus1 = XEXP (addr, 1);
1918
1919 if (GET_CODE (plus0) != REG && GET_CODE (plus1) == REG)
1920 {
1921 plus0 = XEXP (addr, 1);
1922 plus1 = XEXP (addr, 0);
1923 }
1924
1925 if (GET_CODE (plus0) != REG)
1926 break;
1927
1928 switch (GET_CODE (plus1))
1929 {
1930 default:
1931 break;
1932
1933 case CONST_INT:
1934 return (SMALL_INT (plus1) ? 1 : 2);
1935
1936 case CONST:
1937 case SYMBOL_REF:
1938 case LABEL_REF:
1939 case HIGH:
1940 case LO_SUM:
1941 return mips_address_cost (plus1) + 1;
1942 }
1943 }
1944 }
1945
1946 return 4;
1947 }
1948
1949 /* Return true if X is an address which needs a temporary register when
1950 reloaded while generating PIC code. */
1951
1952 int
1953 pic_address_needs_scratch (x)
1954 rtx x;
1955 {
1956 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
1957 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
1958 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1959 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1960 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
1961 return 1;
1962
1963 return 0;
1964 }
1965 \f
1966 /* Make normal rtx_code into something we can index from an array */
1967
1968 static enum internal_test
1969 map_test_to_internal_test (test_code)
1970 enum rtx_code test_code;
1971 {
1972 enum internal_test test = ITEST_MAX;
1973
1974 switch (test_code)
1975 {
1976 default: break;
1977 case EQ: test = ITEST_EQ; break;
1978 case NE: test = ITEST_NE; break;
1979 case GT: test = ITEST_GT; break;
1980 case GE: test = ITEST_GE; break;
1981 case LT: test = ITEST_LT; break;
1982 case LE: test = ITEST_LE; break;
1983 case GTU: test = ITEST_GTU; break;
1984 case GEU: test = ITEST_GEU; break;
1985 case LTU: test = ITEST_LTU; break;
1986 case LEU: test = ITEST_LEU; break;
1987 }
1988
1989 return test;
1990 }
1991
1992 \f
1993 /* Generate the code to compare two integer values. The return value is:
1994 (reg:SI xx) The pseudo register the comparison is in
1995 (rtx)0 No register, generate a simple branch.
1996
1997 ??? This is called with result nonzero by the Scond patterns in
1998 mips.md. These patterns are called with a target in the mode of
1999 the Scond instruction pattern. Since this must be a constant, we
2000 must use SImode. This means that if RESULT is non-zero, it will
2001 always be an SImode register, even if TARGET_64BIT is true. We
2002 cope with this by calling convert_move rather than emit_move_insn.
2003 This will sometimes lead to an unnecessary extension of the result;
2004 for example:
2005
2006 long long
2007 foo (long long i)
2008 {
2009 return i < 5;
2010 }
2011
2012 */
2013
2014 rtx
2015 gen_int_relational (test_code, result, cmp0, cmp1, p_invert)
2016 enum rtx_code test_code; /* relational test (EQ, etc) */
2017 rtx result; /* result to store comp. or 0 if branch */
2018 rtx cmp0; /* first operand to compare */
2019 rtx cmp1; /* second operand to compare */
2020 int *p_invert; /* NULL or ptr to hold whether branch needs */
2021 /* to reverse its test */
2022 {
2023 struct cmp_info {
2024 enum rtx_code test_code; /* code to use in instruction (LT vs. LTU) */
2025 int const_low; /* low bound of constant we can accept */
2026 int const_high; /* high bound of constant we can accept */
2027 int const_add; /* constant to add (convert LE -> LT) */
2028 int reverse_regs; /* reverse registers in test */
2029 int invert_const; /* != 0 if invert value if cmp1 is constant */
2030 int invert_reg; /* != 0 if invert value if cmp1 is register */
2031 int unsignedp; /* != 0 for unsigned comparisons. */
2032 };
2033
2034 static struct cmp_info info[ (int)ITEST_MAX ] = {
2035
2036 { XOR, 0, 65535, 0, 0, 0, 0, 0 }, /* EQ */
2037 { XOR, 0, 65535, 0, 0, 1, 1, 0 }, /* NE */
2038 { LT, -32769, 32766, 1, 1, 1, 0, 0 }, /* GT */
2039 { LT, -32768, 32767, 0, 0, 1, 1, 0 }, /* GE */
2040 { LT, -32768, 32767, 0, 0, 0, 0, 0 }, /* LT */
2041 { LT, -32769, 32766, 1, 1, 0, 1, 0 }, /* LE */
2042 { LTU, -32769, 32766, 1, 1, 1, 0, 1 }, /* GTU */
2043 { LTU, -32768, 32767, 0, 0, 1, 1, 1 }, /* GEU */
2044 { LTU, -32768, 32767, 0, 0, 0, 0, 1 }, /* LTU */
2045 { LTU, -32769, 32766, 1, 1, 0, 1, 1 }, /* LEU */
2046 };
2047
2048 enum internal_test test;
2049 enum machine_mode mode;
2050 struct cmp_info *p_info;
2051 int branch_p;
2052 int eqne_p;
2053 int invert;
2054 rtx reg;
2055 rtx reg2;
2056
2057 test = map_test_to_internal_test (test_code);
2058 if (test == ITEST_MAX)
2059 abort ();
2060
2061 p_info = &info[ (int)test ];
2062 eqne_p = (p_info->test_code == XOR);
2063
2064 mode = GET_MODE (cmp0);
2065 if (mode == VOIDmode)
2066 mode = GET_MODE (cmp1);
2067
2068 /* Eliminate simple branches */
2069 branch_p = (result == (rtx)0);
2070 if (branch_p)
2071 {
2072 if (GET_CODE (cmp0) == REG || GET_CODE (cmp0) == SUBREG)
2073 {
2074 /* Comparisons against zero are simple branches */
2075 if (GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) == 0)
2076 return (rtx)0;
2077
2078 /* Test for beq/bne. */
2079 if (eqne_p)
2080 return (rtx)0;
2081 }
2082
2083 /* allocate a pseudo to calculate the value in. */
2084 result = gen_reg_rtx (mode);
2085 }
2086
2087 /* Make sure we can handle any constants given to us. */
2088 if (GET_CODE (cmp0) == CONST_INT)
2089 cmp0 = force_reg (mode, cmp0);
2090
2091 if (GET_CODE (cmp1) == CONST_INT)
2092 {
2093 HOST_WIDE_INT value = INTVAL (cmp1);
2094 if (value < p_info->const_low
2095 || value > p_info->const_high
2096 /* ??? Why? And why wasn't the similar code below modified too? */
2097 || (TARGET_64BIT
2098 && HOST_BITS_PER_WIDE_INT < 64
2099 && p_info->const_add != 0
2100 && ((p_info->unsignedp
2101 ? ((unsigned HOST_WIDE_INT) (value + p_info->const_add)
2102 > INTVAL (cmp1))
2103 : (value + p_info->const_add) > INTVAL (cmp1))
2104 != (p_info->const_add > 0))))
2105 cmp1 = force_reg (mode, cmp1);
2106 }
2107
2108 /* See if we need to invert the result. */
2109 invert = (GET_CODE (cmp1) == CONST_INT)
2110 ? p_info->invert_const
2111 : p_info->invert_reg;
2112
2113 if (p_invert != (int *)0)
2114 {
2115 *p_invert = invert;
2116 invert = FALSE;
2117 }
2118
2119 /* Comparison to constants, may involve adding 1 to change a LT into LE.
2120 Comparison between two registers, may involve switching operands. */
2121 if (GET_CODE (cmp1) == CONST_INT)
2122 {
2123 if (p_info->const_add != 0)
2124 {
2125 HOST_WIDE_INT new = INTVAL (cmp1) + p_info->const_add;
2126 /* If modification of cmp1 caused overflow,
2127 we would get the wrong answer if we follow the usual path;
2128 thus, x > 0xffffffffU would turn into x > 0U. */
2129 if ((p_info->unsignedp
2130 ? (unsigned HOST_WIDE_INT) new > INTVAL (cmp1)
2131 : new > INTVAL (cmp1))
2132 != (p_info->const_add > 0))
2133 {
2134 /* This test is always true, but if INVERT is true then
2135 the result of the test needs to be inverted so 0 should
2136 be returned instead. */
2137 emit_move_insn (result, invert ? const0_rtx : const_true_rtx);
2138 return result;
2139 }
2140 else
2141 cmp1 = GEN_INT (new);
2142 }
2143 }
2144 else if (p_info->reverse_regs)
2145 {
2146 rtx temp = cmp0;
2147 cmp0 = cmp1;
2148 cmp1 = temp;
2149 }
2150
2151 if (test == ITEST_NE && GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) == 0)
2152 reg = cmp0;
2153 else
2154 {
2155 reg = (invert || eqne_p) ? gen_reg_rtx (mode) : result;
2156 convert_move (reg, gen_rtx (p_info->test_code, mode, cmp0, cmp1), 0);
2157 }
2158
2159 if (test == ITEST_NE)
2160 {
2161 convert_move (result, gen_rtx (GTU, mode, reg, const0_rtx), 0);
2162 invert = FALSE;
2163 }
2164
2165 else if (test == ITEST_EQ)
2166 {
2167 reg2 = (invert) ? gen_reg_rtx (mode) : result;
2168 convert_move (reg2, gen_rtx (LTU, mode, reg, const1_rtx), 0);
2169 reg = reg2;
2170 }
2171
2172 if (invert)
2173 convert_move (result, gen_rtx (XOR, mode, reg, const1_rtx), 0);
2174
2175 return result;
2176 }
2177
2178 \f
2179 /* Emit the common code for doing conditional branches.
2180 operand[0] is the label to jump to.
2181 The comparison operands are saved away by cmp{si,di,sf,df}. */
2182
2183 void
2184 gen_conditional_branch (operands, test_code)
2185 rtx operands[];
2186 enum rtx_code test_code;
2187 {
2188 enum cmp_type type = branch_type;
2189 rtx cmp0 = branch_cmp[0];
2190 rtx cmp1 = branch_cmp[1];
2191 enum machine_mode mode;
2192 rtx reg;
2193 int invert;
2194 rtx label1, label2;
2195
2196 switch (type)
2197 {
2198 default:
2199 abort_with_insn (gen_rtx (test_code, VOIDmode, cmp0, cmp1), "bad test");
2200
2201 case CMP_SI:
2202 case CMP_DI:
2203 mode = type == CMP_SI ? SImode : DImode;
2204 invert = FALSE;
2205 reg = gen_int_relational (test_code, NULL_RTX, cmp0, cmp1, &invert);
2206 if (reg)
2207 {
2208 cmp0 = reg;
2209 cmp1 = const0_rtx;
2210 test_code = NE;
2211 }
2212 else if (GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) != 0)
2213 {
2214 /* We don't want to build a comparison against a non-zero
2215 constant. */
2216 cmp1 = force_reg (mode, cmp1);
2217 }
2218 break;
2219
2220 case CMP_SF:
2221 case CMP_DF:
2222 if (mips_isa < 4)
2223 reg = gen_rtx (REG, CCmode, FPSW_REGNUM);
2224 else
2225 reg = gen_reg_rtx (CCmode);
2226
2227 /* For cmp0 != cmp1, build cmp0 == cmp1, and test for result ==
2228 0 in the instruction built below. The MIPS FPU handles
2229 inequality testing by testing for equality and looking for a
2230 false result. */
2231 emit_insn (gen_rtx (SET, VOIDmode,
2232 reg,
2233 gen_rtx (test_code == NE ? EQ : test_code,
2234 CCmode, cmp0, cmp1)));
2235
2236 test_code = test_code == NE ? EQ : NE;
2237 mode = CCmode;
2238 cmp0 = reg;
2239 cmp1 = const0_rtx;
2240 invert = FALSE;
2241 break;
2242 }
2243
2244 /* Generate the branch. */
2245
2246 label1 = gen_rtx (LABEL_REF, VOIDmode, operands[0]);
2247 label2 = pc_rtx;
2248
2249 if (invert)
2250 {
2251 label2 = label1;
2252 label1 = pc_rtx;
2253 }
2254
2255 emit_jump_insn (gen_rtx (SET, VOIDmode,
2256 pc_rtx,
2257 gen_rtx (IF_THEN_ELSE, VOIDmode,
2258 gen_rtx (test_code, mode, cmp0, cmp1),
2259 label1,
2260 label2)));
2261 }
2262
2263 /* Emit the common code for conditional moves. OPERANDS is the array
2264 of operands passed to the conditional move defined_expand. */
2265
2266 void
2267 gen_conditional_move (operands)
2268 rtx *operands;
2269 {
2270 rtx op0 = branch_cmp[0];
2271 rtx op1 = branch_cmp[1];
2272 enum machine_mode mode = GET_MODE (branch_cmp[0]);
2273 enum rtx_code cmp_code = GET_CODE (operands[1]);
2274 enum rtx_code move_code = NE;
2275 enum machine_mode op_mode = GET_MODE (operands[0]);
2276 enum machine_mode cmp_mode;
2277 rtx cmp_reg;
2278
2279 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
2280 {
2281 switch (cmp_code)
2282 {
2283 case EQ:
2284 cmp_code = XOR;
2285 move_code = EQ;
2286 break;
2287 case NE:
2288 cmp_code = XOR;
2289 break;
2290 case LT:
2291 break;
2292 case GE:
2293 cmp_code = LT;
2294 move_code = EQ;
2295 break;
2296 case GT:
2297 cmp_code = LT;
2298 op0 = force_reg (mode, branch_cmp[1]);
2299 op1 = branch_cmp[0];
2300 break;
2301 case LE:
2302 cmp_code = LT;
2303 op0 = force_reg (mode, branch_cmp[1]);
2304 op1 = branch_cmp[0];
2305 move_code = EQ;
2306 break;
2307 case LTU:
2308 break;
2309 case GEU:
2310 cmp_code = LTU;
2311 move_code = EQ;
2312 break;
2313 case GTU:
2314 cmp_code = LTU;
2315 op0 = force_reg (mode, branch_cmp[1]);
2316 op1 = branch_cmp[0];
2317 break;
2318 case LEU:
2319 cmp_code = LTU;
2320 op0 = force_reg (mode, branch_cmp[1]);
2321 op1 = branch_cmp[0];
2322 move_code = EQ;
2323 break;
2324 default:
2325 abort ();
2326 }
2327 }
2328 else
2329 {
2330 if (cmp_code == NE)
2331 {
2332 cmp_code = EQ;
2333 move_code = EQ;
2334 }
2335 }
2336
2337 if (mode == SImode || mode == DImode)
2338 cmp_mode = mode;
2339 else if (mode == SFmode || mode == DFmode)
2340 cmp_mode = CCmode;
2341 else
2342 abort ();
2343
2344 cmp_reg = gen_reg_rtx (cmp_mode);
2345 emit_insn (gen_rtx (SET, cmp_mode,
2346 cmp_reg,
2347 gen_rtx (cmp_code, cmp_mode, op0, op1)));
2348 emit_insn (gen_rtx (SET, op_mode,
2349 operands[0],
2350 gen_rtx (IF_THEN_ELSE, op_mode,
2351 gen_rtx (move_code, VOIDmode,
2352 cmp_reg,
2353 CONST0_RTX (SImode)),
2354 operands[2],
2355 operands[3])));
2356 }
2357 \f
2358 /* Write a loop to move a constant number of bytes. Generate load/stores as follows:
2359
2360 do {
2361 temp1 = src[0];
2362 temp2 = src[1];
2363 ...
2364 temp<last> = src[MAX_MOVE_REGS-1];
2365 dest[0] = temp1;
2366 dest[1] = temp2;
2367 ...
2368 dest[MAX_MOVE_REGS-1] = temp<last>;
2369 src += MAX_MOVE_REGS;
2370 dest += MAX_MOVE_REGS;
2371 } while (src != final);
2372
2373 This way, no NOP's are needed, and only MAX_MOVE_REGS+3 temp
2374 registers are needed.
2375
2376 Aligned moves move MAX_MOVE_REGS*4 bytes every (2*MAX_MOVE_REGS)+3
2377 cycles, unaligned moves move MAX_MOVE_REGS*4 bytes every
2378 (4*MAX_MOVE_REGS)+3 cycles, assuming no cache misses. */
2379
2380 #define MAX_MOVE_REGS 4
2381 #define MAX_MOVE_BYTES (MAX_MOVE_REGS * UNITS_PER_WORD)
2382
2383 static void
2384 block_move_loop (dest_reg, src_reg, bytes, align, orig_dest, orig_src)
2385 rtx dest_reg; /* register holding destination address */
2386 rtx src_reg; /* register holding source address */
2387 int bytes; /* # bytes to move */
2388 int align; /* alignment */
2389 rtx orig_dest; /* original dest for change_address */
2390 rtx orig_src; /* original source for making a reg note */
2391 {
2392 rtx dest_mem = change_address (orig_dest, BLKmode, dest_reg);
2393 rtx src_mem = change_address (orig_src, BLKmode, src_reg);
2394 rtx align_rtx = GEN_INT (align);
2395 rtx label;
2396 rtx final_src;
2397 rtx bytes_rtx;
2398 int leftover;
2399
2400 if (bytes < 2*MAX_MOVE_BYTES)
2401 abort ();
2402
2403 leftover = bytes % MAX_MOVE_BYTES;
2404 bytes -= leftover;
2405
2406 label = gen_label_rtx ();
2407 final_src = gen_reg_rtx (Pmode);
2408 bytes_rtx = GEN_INT (bytes);
2409
2410 if (bytes > 0x7fff)
2411 {
2412 if (TARGET_LONG64)
2413 {
2414 emit_insn (gen_movdi (final_src, bytes_rtx));
2415 emit_insn (gen_adddi3 (final_src, final_src, src_reg));
2416 }
2417 else
2418 {
2419 emit_insn (gen_movsi (final_src, bytes_rtx));
2420 emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2421 }
2422 }
2423 else
2424 {
2425 if (TARGET_LONG64)
2426 emit_insn (gen_adddi3 (final_src, src_reg, bytes_rtx));
2427 else
2428 emit_insn (gen_addsi3 (final_src, src_reg, bytes_rtx));
2429 }
2430
2431 emit_label (label);
2432
2433 bytes_rtx = GEN_INT (MAX_MOVE_BYTES);
2434 emit_insn (gen_movstrsi_internal (dest_mem, src_mem, bytes_rtx, align_rtx));
2435 if (TARGET_LONG64)
2436 {
2437 emit_insn (gen_adddi3 (src_reg, src_reg, bytes_rtx));
2438 emit_insn (gen_adddi3 (dest_reg, dest_reg, bytes_rtx));
2439 emit_insn (gen_cmpdi (src_reg, final_src));
2440 }
2441 else
2442 {
2443 emit_insn (gen_addsi3 (src_reg, src_reg, bytes_rtx));
2444 emit_insn (gen_addsi3 (dest_reg, dest_reg, bytes_rtx));
2445 emit_insn (gen_cmpsi (src_reg, final_src));
2446 }
2447 emit_jump_insn (gen_bne (label));
2448
2449 if (leftover)
2450 emit_insn (gen_movstrsi_internal (dest_mem, src_mem,
2451 GEN_INT (leftover),
2452 align_rtx));
2453 }
2454 \f
2455 /* Use a library function to move some bytes. */
2456
2457 static void
2458 block_move_call (dest_reg, src_reg, bytes_rtx)
2459 rtx dest_reg;
2460 rtx src_reg;
2461 rtx bytes_rtx;
2462 {
2463 /* We want to pass the size as Pmode, which will normally be SImode
2464 but will be DImode if we are using 64 bit longs and pointers. */
2465 if (GET_MODE (bytes_rtx) != VOIDmode
2466 && GET_MODE (bytes_rtx) != Pmode)
2467 bytes_rtx = convert_to_mode (Pmode, bytes_rtx, TRUE);
2468
2469 #ifdef TARGET_MEM_FUNCTIONS
2470 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "memcpy"), 0,
2471 VOIDmode, 3,
2472 dest_reg, Pmode,
2473 src_reg, Pmode,
2474 convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2475 TREE_UNSIGNED (sizetype)),
2476 TYPE_MODE (sizetype));
2477 #else
2478 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "bcopy"), 0,
2479 VOIDmode, 3,
2480 src_reg, Pmode,
2481 dest_reg, Pmode,
2482 convert_to_mode (TYPE_MODE (integer_type_node),
2483 bytes_rtx,
2484 TREE_UNSIGNED (integer_type_node)),
2485 TYPE_MODE (integer_type_node));
2486 #endif
2487 }
2488
2489 \f
2490 /* Expand string/block move operations.
2491
2492 operands[0] is the pointer to the destination.
2493 operands[1] is the pointer to the source.
2494 operands[2] is the number of bytes to move.
2495 operands[3] is the alignment. */
2496
2497 void
2498 expand_block_move (operands)
2499 rtx operands[];
2500 {
2501 rtx bytes_rtx = operands[2];
2502 rtx align_rtx = operands[3];
2503 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2504 int bytes = (constp ? INTVAL (bytes_rtx) : 0);
2505 int align = INTVAL (align_rtx);
2506 rtx orig_src = operands[1];
2507 rtx orig_dest = operands[0];
2508 rtx src_reg;
2509 rtx dest_reg;
2510
2511 if (constp && bytes <= 0)
2512 return;
2513
2514 if (align > UNITS_PER_WORD)
2515 align = UNITS_PER_WORD;
2516
2517 /* Move the address into scratch registers. */
2518 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2519 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2520
2521 if (TARGET_MEMCPY)
2522 block_move_call (dest_reg, src_reg, bytes_rtx);
2523
2524 else if (constp && bytes <= 2*MAX_MOVE_BYTES)
2525 emit_insn (gen_movstrsi_internal (change_address (orig_dest, BLKmode,
2526 dest_reg),
2527 change_address (orig_src, BLKmode,
2528 src_reg),
2529 bytes_rtx, align_rtx));
2530
2531 else if (constp && align >= UNITS_PER_WORD && optimize)
2532 block_move_loop (dest_reg, src_reg, bytes, align, orig_dest, orig_src);
2533
2534 else if (constp && optimize)
2535 {
2536 /* If the alignment is not word aligned, generate a test at
2537 runtime, to see whether things wound up aligned, and we
2538 can use the faster lw/sw instead ulw/usw. */
2539
2540 rtx temp = gen_reg_rtx (Pmode);
2541 rtx aligned_label = gen_label_rtx ();
2542 rtx join_label = gen_label_rtx ();
2543 int leftover = bytes % MAX_MOVE_BYTES;
2544
2545 bytes -= leftover;
2546
2547 if (TARGET_LONG64)
2548 {
2549 emit_insn (gen_iordi3 (temp, src_reg, dest_reg));
2550 emit_insn (gen_anddi3 (temp, temp, GEN_INT (UNITS_PER_WORD-1)));
2551 emit_insn (gen_cmpdi (temp, const0_rtx));
2552 }
2553 else
2554 {
2555 emit_insn (gen_iorsi3 (temp, src_reg, dest_reg));
2556 emit_insn (gen_andsi3 (temp, temp, GEN_INT (UNITS_PER_WORD-1)));
2557 emit_insn (gen_cmpsi (temp, const0_rtx));
2558 }
2559 emit_jump_insn (gen_beq (aligned_label));
2560
2561 /* Unaligned loop. */
2562 block_move_loop (dest_reg, src_reg, bytes, 1, orig_dest, orig_src);
2563 emit_jump_insn (gen_jump (join_label));
2564 emit_barrier ();
2565
2566 /* Aligned loop. */
2567 emit_label (aligned_label);
2568 block_move_loop (dest_reg, src_reg, bytes, UNITS_PER_WORD, orig_dest,
2569 orig_src);
2570 emit_label (join_label);
2571
2572 /* Bytes at the end of the loop. */
2573 if (leftover)
2574 emit_insn (gen_movstrsi_internal (change_address (orig_dest, BLKmode,
2575 dest_reg),
2576 change_address (orig_src, BLKmode,
2577 src_reg),
2578 GEN_INT (leftover),
2579 GEN_INT (align)));
2580 }
2581
2582 else
2583 block_move_call (dest_reg, src_reg, bytes_rtx);
2584 }
2585
2586 \f
2587 /* Emit load/stores for a small constant block_move.
2588
2589 operands[0] is the memory address of the destination.
2590 operands[1] is the memory address of the source.
2591 operands[2] is the number of bytes to move.
2592 operands[3] is the alignment.
2593 operands[4] is a temp register.
2594 operands[5] is a temp register.
2595 ...
2596 operands[3+num_regs] is the last temp register.
2597
2598 The block move type can be one of the following:
2599 BLOCK_MOVE_NORMAL Do all of the block move.
2600 BLOCK_MOVE_NOT_LAST Do all but the last store.
2601 BLOCK_MOVE_LAST Do just the last store. */
2602
2603 char *
2604 output_block_move (insn, operands, num_regs, move_type)
2605 rtx insn;
2606 rtx operands[];
2607 int num_regs;
2608 enum block_move_type move_type;
2609 {
2610 rtx dest_reg = XEXP (operands[0], 0);
2611 rtx src_reg = XEXP (operands[1], 0);
2612 int bytes = INTVAL (operands[2]);
2613 int align = INTVAL (operands[3]);
2614 int num = 0;
2615 int offset = 0;
2616 int use_lwl_lwr = FALSE;
2617 int last_operand = num_regs+4;
2618 int safe_regs = 4;
2619 int i;
2620 rtx xoperands[10];
2621
2622 struct {
2623 char *load; /* load insn without nop */
2624 char *load_nop; /* load insn with trailing nop */
2625 char *store; /* store insn */
2626 char *final; /* if last_store used: NULL or swr */
2627 char *last_store; /* last store instruction */
2628 int offset; /* current offset */
2629 enum machine_mode mode; /* mode to use on (MEM) */
2630 } load_store[4];
2631
2632 /* Detect a bug in GCC, where it can give us a register
2633 the same as one of the addressing registers and reduce
2634 the number of registers available. */
2635 for (i = 4;
2636 i < last_operand && safe_regs < (sizeof(xoperands) / sizeof(xoperands[0]));
2637 i++)
2638 {
2639 if (!reg_mentioned_p (operands[i], operands[0])
2640 && !reg_mentioned_p (operands[i], operands[1]))
2641
2642 xoperands[safe_regs++] = operands[i];
2643 }
2644
2645 if (safe_regs < last_operand)
2646 {
2647 xoperands[0] = operands[0];
2648 xoperands[1] = operands[1];
2649 xoperands[2] = operands[2];
2650 xoperands[3] = operands[3];
2651 return output_block_move (insn, xoperands, safe_regs-4, move_type);
2652 }
2653
2654 /* If we are given global or static addresses, and we would be
2655 emitting a few instructions, try to save time by using a
2656 temporary register for the pointer. */
2657 if (num_regs > 2 && (bytes > 2*align || move_type != BLOCK_MOVE_NORMAL))
2658 {
2659 if (CONSTANT_P (src_reg))
2660 {
2661 if (TARGET_STATS)
2662 mips_count_memory_refs (operands[1], 1);
2663
2664 src_reg = operands[ 3 + num_regs-- ];
2665 if (move_type != BLOCK_MOVE_LAST)
2666 {
2667 xoperands[1] = operands[1];
2668 xoperands[0] = src_reg;
2669 if (Pmode == DImode)
2670 output_asm_insn ("dla\t%0,%1", xoperands);
2671 else
2672 output_asm_insn ("la\t%0,%1", xoperands);
2673 }
2674 }
2675
2676 if (CONSTANT_P (dest_reg))
2677 {
2678 if (TARGET_STATS)
2679 mips_count_memory_refs (operands[0], 1);
2680
2681 dest_reg = operands[ 3 + num_regs-- ];
2682 if (move_type != BLOCK_MOVE_LAST)
2683 {
2684 xoperands[1] = operands[0];
2685 xoperands[0] = dest_reg;
2686 if (Pmode == DImode)
2687 output_asm_insn ("dla\t%0,%1", xoperands);
2688 else
2689 output_asm_insn ("la\t%0,%1", xoperands);
2690 }
2691 }
2692 }
2693
2694 /* ??? We really shouldn't get any LO_SUM addresses here, because they
2695 are not offsettable, however, offsettable_address_p says they are
2696 offsettable. I think this is a bug in offsettable_address_p.
2697 For expediency, we fix this by just loading the address into a register
2698 if we happen to get one. */
2699
2700 if (GET_CODE (src_reg) == LO_SUM)
2701 {
2702 src_reg = operands[ 3 + num_regs-- ];
2703 if (move_type != BLOCK_MOVE_LAST)
2704 {
2705 xoperands[2] = XEXP (XEXP (operands[1], 0), 1);
2706 xoperands[1] = XEXP (XEXP (operands[1], 0), 0);
2707 xoperands[0] = src_reg;
2708 if (Pmode == DImode)
2709 output_asm_insn ("daddiu\t%0,%1,%%lo(%2)", xoperands);
2710 else
2711 output_asm_insn ("addiu\t%0,%1,%%lo(%2)", xoperands);
2712 }
2713 }
2714
2715 if (GET_CODE (dest_reg) == LO_SUM)
2716 {
2717 dest_reg = operands[ 3 + num_regs-- ];
2718 if (move_type != BLOCK_MOVE_LAST)
2719 {
2720 xoperands[2] = XEXP (XEXP (operands[0], 0), 1);
2721 xoperands[1] = XEXP (XEXP (operands[0], 0), 0);
2722 xoperands[0] = dest_reg;
2723 if (Pmode == DImode)
2724 output_asm_insn ("daddiu\t%0,%1,%%lo(%2)", xoperands);
2725 else
2726 output_asm_insn ("addiu\t%0,%1,%%lo(%2)", xoperands);
2727 }
2728 }
2729
2730 if (num_regs > (sizeof (load_store) / sizeof (load_store[0])))
2731 num_regs = (sizeof (load_store) / sizeof (load_store[0]));
2732
2733 else if (num_regs < 1)
2734 abort_with_insn (insn, "Cannot do block move, not enough scratch registers");
2735
2736 while (bytes > 0)
2737 {
2738 load_store[num].offset = offset;
2739
2740 if (TARGET_64BIT && bytes >= 8 && align >= 8)
2741 {
2742 load_store[num].load = "ld\t%0,%1";
2743 load_store[num].load_nop = "ld\t%0,%1%#";
2744 load_store[num].store = "sd\t%0,%1";
2745 load_store[num].last_store = "sd\t%0,%1";
2746 load_store[num].final = (char *)0;
2747 load_store[num].mode = DImode;
2748 offset += 8;
2749 bytes -= 8;
2750 }
2751
2752 /* ??? Fails because of a MIPS assembler bug? */
2753 else if (TARGET_64BIT && bytes >= 8)
2754 {
2755 if (BYTES_BIG_ENDIAN)
2756 {
2757 load_store[num].load = "ldl\t%0,%1\n\tldr\t%0,%2";
2758 load_store[num].load_nop = "ldl\t%0,%1\n\tldr\t%0,%2%#";
2759 load_store[num].store = "sdl\t%0,%1\n\tsdr\t%0,%2";
2760 load_store[num].last_store = "sdr\t%0,%2";
2761 load_store[num].final = "sdl\t%0,%1";
2762 }
2763 else
2764 {
2765 load_store[num].load = "ldl\t%0,%2\n\tldr\t%0,%1";
2766 load_store[num].load_nop = "ldl\t%0,%2\n\tldr\t%0,%1%#";
2767 load_store[num].store = "sdl\t%0,%2\n\tsdr\t%0,%1";
2768 load_store[num].last_store = "sdr\t%0,%1";
2769 load_store[num].final = "sdl\t%0,%2";
2770 }
2771 load_store[num].mode = DImode;
2772 offset += 8;
2773 bytes -= 8;
2774 use_lwl_lwr = TRUE;
2775 }
2776
2777 else if (bytes >= 4 && align >= 4)
2778 {
2779 load_store[num].load = "lw\t%0,%1";
2780 load_store[num].load_nop = "lw\t%0,%1%#";
2781 load_store[num].store = "sw\t%0,%1";
2782 load_store[num].last_store = "sw\t%0,%1";
2783 load_store[num].final = (char *)0;
2784 load_store[num].mode = SImode;
2785 offset += 4;
2786 bytes -= 4;
2787 }
2788
2789 else if (bytes >= 4)
2790 {
2791 if (BYTES_BIG_ENDIAN)
2792 {
2793 load_store[num].load = "lwl\t%0,%1\n\tlwr\t%0,%2";
2794 load_store[num].load_nop = "lwl\t%0,%1\n\tlwr\t%0,%2%#";
2795 load_store[num].store = "swl\t%0,%1\n\tswr\t%0,%2";
2796 load_store[num].last_store = "swr\t%0,%2";
2797 load_store[num].final = "swl\t%0,%1";
2798 }
2799 else
2800 {
2801 load_store[num].load = "lwl\t%0,%2\n\tlwr\t%0,%1";
2802 load_store[num].load_nop = "lwl\t%0,%2\n\tlwr\t%0,%1%#";
2803 load_store[num].store = "swl\t%0,%2\n\tswr\t%0,%1";
2804 load_store[num].last_store = "swr\t%0,%1";
2805 load_store[num].final = "swl\t%0,%2";
2806 }
2807 load_store[num].mode = SImode;
2808 offset += 4;
2809 bytes -= 4;
2810 use_lwl_lwr = TRUE;
2811 }
2812
2813 else if (bytes >= 2 && align >= 2)
2814 {
2815 load_store[num].load = "lh\t%0,%1";
2816 load_store[num].load_nop = "lh\t%0,%1%#";
2817 load_store[num].store = "sh\t%0,%1";
2818 load_store[num].last_store = "sh\t%0,%1";
2819 load_store[num].final = (char *)0;
2820 load_store[num].mode = HImode;
2821 offset += 2;
2822 bytes -= 2;
2823 }
2824
2825 else
2826 {
2827 load_store[num].load = "lb\t%0,%1";
2828 load_store[num].load_nop = "lb\t%0,%1%#";
2829 load_store[num].store = "sb\t%0,%1";
2830 load_store[num].last_store = "sb\t%0,%1";
2831 load_store[num].final = (char *)0;
2832 load_store[num].mode = QImode;
2833 offset++;
2834 bytes--;
2835 }
2836
2837 if (TARGET_STATS && move_type != BLOCK_MOVE_LAST)
2838 {
2839 dslots_load_total++;
2840 dslots_load_filled++;
2841
2842 if (CONSTANT_P (src_reg))
2843 mips_count_memory_refs (src_reg, 1);
2844
2845 if (CONSTANT_P (dest_reg))
2846 mips_count_memory_refs (dest_reg, 1);
2847 }
2848
2849 /* Emit load/stores now if we have run out of registers or are
2850 at the end of the move. */
2851
2852 if (++num == num_regs || bytes == 0)
2853 {
2854 /* If only load/store, we need a NOP after the load. */
2855 if (num == 1)
2856 {
2857 load_store[0].load = load_store[0].load_nop;
2858 if (TARGET_STATS && move_type != BLOCK_MOVE_LAST)
2859 dslots_load_filled--;
2860 }
2861
2862 if (move_type != BLOCK_MOVE_LAST)
2863 {
2864 for (i = 0; i < num; i++)
2865 {
2866 int offset;
2867
2868 if (!operands[i+4])
2869 abort ();
2870
2871 if (GET_MODE (operands[i+4]) != load_store[i].mode)
2872 operands[i+4] = gen_rtx (REG, load_store[i].mode, REGNO (operands[i+4]));
2873
2874 offset = load_store[i].offset;
2875 xoperands[0] = operands[i+4];
2876 xoperands[1] = gen_rtx (MEM, load_store[i].mode,
2877 plus_constant (src_reg, offset));
2878
2879 if (use_lwl_lwr)
2880 {
2881 int extra_offset;
2882 extra_offset = GET_MODE_SIZE (load_store[i].mode) - 1;
2883 xoperands[2] = gen_rtx (MEM, load_store[i].mode,
2884 plus_constant (src_reg,
2885 extra_offset
2886 + offset));
2887 }
2888
2889 output_asm_insn (load_store[i].load, xoperands);
2890 }
2891 }
2892
2893 for (i = 0; i < num; i++)
2894 {
2895 int last_p = (i == num-1 && bytes == 0);
2896 int offset = load_store[i].offset;
2897
2898 xoperands[0] = operands[i+4];
2899 xoperands[1] = gen_rtx (MEM, load_store[i].mode,
2900 plus_constant (dest_reg, offset));
2901
2902
2903 if (use_lwl_lwr)
2904 {
2905 int extra_offset;
2906 extra_offset = GET_MODE_SIZE (load_store[i].mode) - 1;
2907 xoperands[2] = gen_rtx (MEM, load_store[i].mode,
2908 plus_constant (dest_reg,
2909 extra_offset
2910 + offset));
2911 }
2912
2913 if (move_type == BLOCK_MOVE_NORMAL)
2914 output_asm_insn (load_store[i].store, xoperands);
2915
2916 else if (move_type == BLOCK_MOVE_NOT_LAST)
2917 {
2918 if (!last_p)
2919 output_asm_insn (load_store[i].store, xoperands);
2920
2921 else if (load_store[i].final != (char *)0)
2922 output_asm_insn (load_store[i].final, xoperands);
2923 }
2924
2925 else if (last_p)
2926 output_asm_insn (load_store[i].last_store, xoperands);
2927 }
2928
2929 num = 0; /* reset load_store */
2930 use_lwl_lwr = FALSE;
2931 }
2932 }
2933
2934 return "";
2935 }
2936
2937 \f
2938 /* Argument support functions. */
2939
2940 /* Initialize CUMULATIVE_ARGS for a function. */
2941
2942 void
2943 init_cumulative_args (cum, fntype, libname)
2944 CUMULATIVE_ARGS *cum; /* argument info to initialize */
2945 tree fntype; /* tree ptr for function decl */
2946 rtx libname; /* SYMBOL_REF of library name or 0 */
2947 {
2948 static CUMULATIVE_ARGS zero_cum;
2949 tree param, next_param;
2950
2951 if (TARGET_DEBUG_E_MODE)
2952 {
2953 fprintf (stderr, "\ninit_cumulative_args, fntype = 0x%.8lx", (long)fntype);
2954 if (!fntype)
2955 fputc ('\n', stderr);
2956
2957 else
2958 {
2959 tree ret_type = TREE_TYPE (fntype);
2960 fprintf (stderr, ", fntype code = %s, ret code = %s\n",
2961 tree_code_name[ (int)TREE_CODE (fntype) ],
2962 tree_code_name[ (int)TREE_CODE (ret_type) ]);
2963 }
2964 }
2965
2966 *cum = zero_cum;
2967
2968 /* Determine if this function has variable arguments. This is
2969 indicated by the last argument being 'void_type_mode' if there
2970 are no variable arguments. The standard MIPS calling sequence
2971 passes all arguments in the general purpose registers in this
2972 case. */
2973
2974 for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0;
2975 param != (tree)0;
2976 param = next_param)
2977 {
2978 next_param = TREE_CHAIN (param);
2979 if (next_param == (tree)0 && TREE_VALUE (param) != void_type_node)
2980 cum->gp_reg_found = 1;
2981 }
2982 }
2983
2984 /* Advance the argument to the next argument position. */
2985
2986 void
2987 function_arg_advance (cum, mode, type, named)
2988 CUMULATIVE_ARGS *cum; /* current arg information */
2989 enum machine_mode mode; /* current arg mode */
2990 tree type; /* type of the argument or 0 if lib support */
2991 int named; /* whether or not the argument was named */
2992 {
2993 if (TARGET_DEBUG_E_MODE)
2994 fprintf (stderr,
2995 "function_adv( {gp reg found = %d, arg # = %2d, words = %2d}, %4s, 0x%.8x, %d )\n\n",
2996 cum->gp_reg_found, cum->arg_number, cum->arg_words, GET_MODE_NAME (mode),
2997 type, named);
2998
2999 cum->arg_number++;
3000 switch (mode)
3001 {
3002 case VOIDmode:
3003 break;
3004
3005 default:
3006 if (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
3007 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
3008 abort ();
3009 cum->gp_reg_found = 1;
3010 cum->arg_words += ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1)
3011 / UNITS_PER_WORD);
3012 break;
3013
3014 case BLKmode:
3015 cum->gp_reg_found = 1;
3016 cum->arg_words += ((int_size_in_bytes (type) + UNITS_PER_WORD - 1)
3017 / UNITS_PER_WORD);
3018 break;
3019
3020 case SFmode:
3021 if (mips_abi == ABI_EABI && ! TARGET_SOFT_FLOAT)
3022 cum->fp_arg_words++;
3023 else
3024 cum->arg_words++;
3025 break;
3026
3027 case DFmode:
3028 if (mips_abi == ABI_EABI && ! TARGET_SOFT_FLOAT && ! TARGET_SINGLE_FLOAT)
3029 cum->fp_arg_words += (TARGET_64BIT ? 1 : 2);
3030 else
3031 cum->arg_words += (TARGET_64BIT ? 1 : 2);
3032 break;
3033
3034 case DImode:
3035 cum->gp_reg_found = 1;
3036 cum->arg_words += (TARGET_64BIT ? 1 : 2);
3037 break;
3038
3039 case QImode:
3040 case HImode:
3041 case SImode:
3042 cum->gp_reg_found = 1;
3043 cum->arg_words++;
3044 break;
3045 }
3046 }
3047
3048 /* Return an RTL expression containing the register for the given mode,
3049 or 0 if the argument is to be passed on the stack. */
3050
3051 struct rtx_def *
3052 function_arg (cum, mode, type, named)
3053 CUMULATIVE_ARGS *cum; /* current arg information */
3054 enum machine_mode mode; /* current arg mode */
3055 tree type; /* type of the argument or 0 if lib support */
3056 int named; /* != 0 for normal args, == 0 for ... args */
3057 {
3058 rtx ret;
3059 int regbase = -1;
3060 int bias = 0;
3061 int *arg_words = &cum->arg_words;
3062 int struct_p = ((type != (tree)0)
3063 && (TREE_CODE (type) == RECORD_TYPE
3064 || TREE_CODE (type) == UNION_TYPE));
3065
3066 if (TARGET_DEBUG_E_MODE)
3067 fprintf (stderr,
3068 "function_arg( {gp reg found = %d, arg # = %2d, words = %2d}, %4s, 0x%.8x, %d ) = ",
3069 cum->gp_reg_found, cum->arg_number, cum->arg_words, GET_MODE_NAME (mode),
3070 type, named);
3071
3072 cum->last_arg_fp = 0;
3073 switch (mode)
3074 {
3075 case SFmode:
3076 if (mips_abi == ABI_32)
3077 {
3078 if (cum->gp_reg_found || cum->arg_number >= 2 || TARGET_SOFT_FLOAT)
3079 regbase = GP_ARG_FIRST;
3080 else
3081 {
3082 regbase = FP_ARG_FIRST;
3083 /* If the first arg was a float in a floating point register,
3084 then set bias to align this float arg properly. */
3085 if (cum->arg_words == 1)
3086 bias = 1;
3087 }
3088 }
3089 else if (mips_abi == ABI_EABI && ! TARGET_SOFT_FLOAT)
3090 {
3091 if (! TARGET_64BIT)
3092 cum->fp_arg_words += cum->fp_arg_words & 1;
3093 cum->last_arg_fp = 1;
3094 arg_words = &cum->fp_arg_words;
3095 regbase = FP_ARG_FIRST;
3096 }
3097 else
3098 regbase = (TARGET_SOFT_FLOAT || ! named ? GP_ARG_FIRST : FP_ARG_FIRST);
3099 break;
3100
3101 case DFmode:
3102 if (! TARGET_64BIT)
3103 {
3104 if (mips_abi == ABI_EABI
3105 && ! TARGET_SOFT_FLOAT
3106 && ! TARGET_SINGLE_FLOAT)
3107 cum->fp_arg_words += cum->fp_arg_words & 1;
3108 else
3109 cum->arg_words += cum->arg_words & 1;
3110 }
3111 if (mips_abi == ABI_32)
3112 regbase = ((cum->gp_reg_found
3113 || TARGET_SOFT_FLOAT
3114 || TARGET_SINGLE_FLOAT
3115 || cum->arg_number >= 2)
3116 ? GP_ARG_FIRST
3117 : FP_ARG_FIRST);
3118 else if (mips_abi == ABI_EABI
3119 && ! TARGET_SOFT_FLOAT
3120 && ! TARGET_SINGLE_FLOAT)
3121 {
3122 cum->last_arg_fp = 1;
3123 arg_words = &cum->fp_arg_words;
3124 regbase = FP_ARG_FIRST;
3125 }
3126 else
3127 regbase = (TARGET_SOFT_FLOAT || TARGET_SINGLE_FLOAT || ! named
3128 ? GP_ARG_FIRST : FP_ARG_FIRST);
3129 break;
3130
3131 default:
3132 if (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
3133 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
3134 abort ();
3135
3136 /* Drops through. */
3137 case BLKmode:
3138 if (type != (tree)0 && TYPE_ALIGN (type) > BITS_PER_WORD
3139 && ! TARGET_64BIT && mips_abi != ABI_EABI)
3140 cum->arg_words += (cum->arg_words & 1);
3141 regbase = GP_ARG_FIRST;
3142 break;
3143
3144 case VOIDmode:
3145 case QImode:
3146 case HImode:
3147 case SImode:
3148 regbase = GP_ARG_FIRST;
3149 break;
3150
3151 case DImode:
3152 if (! TARGET_64BIT)
3153 cum->arg_words += (cum->arg_words & 1);
3154 regbase = GP_ARG_FIRST;
3155 }
3156
3157 if (*arg_words >= MAX_ARGS_IN_REGISTERS)
3158 {
3159 if (TARGET_DEBUG_E_MODE)
3160 fprintf (stderr, "<stack>%s\n", struct_p ? ", [struct]" : "");
3161
3162 ret = (rtx)0;
3163 }
3164 else
3165 {
3166 if (regbase == -1)
3167 abort ();
3168
3169 if (! type || TREE_CODE (type) != RECORD_TYPE || mips_abi == ABI_32
3170 || mips_abi == ABI_EABI || ! named)
3171 ret = gen_rtx (REG, mode, regbase + *arg_words + bias);
3172 else
3173 {
3174 /* The Irix 6 n32/n64 ABIs say that if any 64 bit chunk of the
3175 structure contains a double in its entirety, then that 64 bit
3176 chunk is passed in a floating point register. */
3177 tree field;
3178
3179 /* First check to see if there is any such field. */
3180 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
3181 if (TREE_CODE (field) == FIELD_DECL
3182 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3183 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
3184 && (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
3185 % BITS_PER_WORD == 0))
3186 break;
3187
3188 if (! field)
3189 ret = gen_rtx (REG, mode, regbase + *arg_words + bias);
3190 else
3191 {
3192 /* Now handle the special case by returning a PARALLEL
3193 indicating where each 64 bit chunk goes. */
3194 int chunks;
3195 int bitpos;
3196 int regno;
3197 int i;
3198
3199 /* ??? If this is a packed structure, then the last hunk won't
3200 be 64 bits. */
3201
3202 /* ??? If this is a structure with a single double field,
3203 it would be more convenient to return (REG:DI %fX) than
3204 a parallel. However, we would have to modify the mips
3205 backend to allow DImode values in fp registers. */
3206
3207 chunks = TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_WORD;
3208 if (chunks + *arg_words + bias > MAX_ARGS_IN_REGISTERS)
3209 chunks = MAX_ARGS_IN_REGISTERS - *arg_words - bias;
3210
3211 /* assign_parms checks the mode of ENTRY_PARM, so we must
3212 use the actual mode here. */
3213 ret = gen_rtx (PARALLEL, mode, rtvec_alloc (chunks));
3214
3215 bitpos = 0;
3216 regno = regbase + *arg_words + bias;
3217 field = TYPE_FIELDS (type);
3218 for (i = 0; i < chunks; i++)
3219 {
3220 rtx reg;
3221
3222 for (; field; field = TREE_CHAIN (field))
3223 if (TREE_CODE (field) == FIELD_DECL
3224 && (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
3225 >= bitpos))
3226 break;
3227
3228 if (field
3229 && TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)) == bitpos
3230 && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3231 && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
3232 reg = gen_rtx (REG, DFmode,
3233 regno + FP_ARG_FIRST - GP_ARG_FIRST);
3234 else
3235 reg = gen_rtx (REG, word_mode, regno);
3236
3237 XVECEXP (ret, 0, i) = gen_rtx (EXPR_LIST, VOIDmode, reg,
3238 GEN_INT (bitpos / BITS_PER_UNIT));
3239
3240 bitpos += 64;
3241 regno++;
3242 }
3243 }
3244 }
3245
3246 if (TARGET_DEBUG_E_MODE)
3247 fprintf (stderr, "%s%s\n", reg_names[regbase + *arg_words + bias],
3248 struct_p ? ", [struct]" : "");
3249
3250 /* The following is a hack in order to pass 1 byte structures
3251 the same way that the MIPS compiler does (namely by passing
3252 the structure in the high byte or half word of the register).
3253 This also makes varargs work. If we have such a structure,
3254 we save the adjustment RTL, and the call define expands will
3255 emit them. For the VOIDmode argument (argument after the
3256 last real argument), pass back a parallel vector holding each
3257 of the adjustments. */
3258
3259 /* ??? function_arg can be called more than once for each argument.
3260 As a result, we compute more adjustments than we need here.
3261 See the CUMULATIVE_ARGS definition in mips.h. */
3262
3263 /* ??? This scheme requires everything smaller than the word size to
3264 shifted to the left, but when TARGET_64BIT and ! TARGET_INT64,
3265 that would mean every int needs to be shifted left, which is very
3266 inefficient. Let's not carry this compatibility to the 64 bit
3267 calling convention for now. */
3268
3269 if (struct_p && int_size_in_bytes (type) < UNITS_PER_WORD
3270 && ! TARGET_64BIT && mips_abi != ABI_EABI)
3271 {
3272 rtx amount = GEN_INT (BITS_PER_WORD
3273 - int_size_in_bytes (type) * BITS_PER_UNIT);
3274 rtx reg = gen_rtx (REG, word_mode, regbase + *arg_words + bias);
3275 if (TARGET_64BIT)
3276 cum->adjust[ cum->num_adjusts++ ] = gen_ashldi3 (reg, reg, amount);
3277 else
3278 cum->adjust[ cum->num_adjusts++ ] = gen_ashlsi3 (reg, reg, amount);
3279 }
3280 }
3281
3282 if (mode == VOIDmode && cum->num_adjusts > 0)
3283 ret = gen_rtx (PARALLEL, VOIDmode, gen_rtvec_v (cum->num_adjusts, cum->adjust));
3284
3285 return ret;
3286 }
3287
3288
3289 int
3290 function_arg_partial_nregs (cum, mode, type, named)
3291 CUMULATIVE_ARGS *cum; /* current arg information */
3292 enum machine_mode mode; /* current arg mode */
3293 tree type; /* type of the argument or 0 if lib support */
3294 int named; /* != 0 for normal args, == 0 for ... args */
3295 {
3296 if ((mode == BLKmode
3297 || GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
3298 || GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
3299 && cum->arg_words < MAX_ARGS_IN_REGISTERS
3300 && mips_abi != ABI_EABI)
3301 {
3302 int words;
3303 if (mode == BLKmode)
3304 words = ((int_size_in_bytes (type) + UNITS_PER_WORD - 1)
3305 / UNITS_PER_WORD);
3306 else
3307 words = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3308
3309 if (words + cum->arg_words <= MAX_ARGS_IN_REGISTERS)
3310 return 0; /* structure fits in registers */
3311
3312 if (TARGET_DEBUG_E_MODE)
3313 fprintf (stderr, "function_arg_partial_nregs = %d\n",
3314 MAX_ARGS_IN_REGISTERS - cum->arg_words);
3315
3316 return MAX_ARGS_IN_REGISTERS - cum->arg_words;
3317 }
3318
3319 else if (mode == DImode && cum->arg_words == MAX_ARGS_IN_REGISTERS-1
3320 && ! TARGET_64BIT
3321 && mips_abi != ABI_EABI)
3322 {
3323 if (TARGET_DEBUG_E_MODE)
3324 fprintf (stderr, "function_arg_partial_nregs = 1\n");
3325
3326 return 1;
3327 }
3328
3329 return 0;
3330 }
3331 \f
3332 /* Abort after printing out a specific insn. */
3333
3334 void
3335 abort_with_insn (insn, reason)
3336 rtx insn;
3337 char *reason;
3338 {
3339 error (reason);
3340 debug_rtx (insn);
3341 abort ();
3342 }
3343
3344 /* Write a message to stderr (for use in macros expanded in files that do not
3345 include stdio.h). */
3346
3347 void
3348 trace (s, s1, s2)
3349 char *s, *s1, *s2;
3350 {
3351 fprintf (stderr, s, s1, s2);
3352 }
3353
3354 \f
3355 #ifdef SIGINFO
3356
3357 static void
3358 siginfo (signo)
3359 int signo;
3360 {
3361 fprintf (stderr, "compiling '%s' in '%s'\n",
3362 (current_function_name != (char *)0) ? current_function_name : "<toplevel>",
3363 (current_function_file != (char *)0) ? current_function_file : "<no file>");
3364 fflush (stderr);
3365 }
3366 #endif /* SIGINFO */
3367
3368 \f
3369 /* Set up the threshold for data to go into the small data area, instead
3370 of the normal data area, and detect any conflicts in the switches. */
3371
3372 void
3373 override_options ()
3374 {
3375 register int i, start;
3376 register int regno;
3377 register enum machine_mode mode;
3378
3379 mips_section_threshold = (g_switch_set) ? g_switch_value : MIPS_DEFAULT_GVALUE;
3380
3381 if (mips_section_threshold <= 0)
3382 target_flags &= ~MASK_GPOPT;
3383 else if (optimize)
3384 target_flags |= MASK_GPOPT;
3385
3386 /* Get the architectural level. */
3387 if (mips_isa_string == (char *)0)
3388 {
3389 #ifdef MIPS_ISA_DEFAULT
3390 mips_isa = MIPS_ISA_DEFAULT;
3391 #else
3392 mips_isa = 1;
3393 #endif
3394 }
3395
3396 else if (isdigit (*mips_isa_string))
3397 {
3398 mips_isa = atoi (mips_isa_string);
3399 if (mips_isa < 1 || mips_isa > 4)
3400 {
3401 error ("-mips%d not supported", mips_isa);
3402 mips_isa = 1;
3403 }
3404 }
3405
3406 else
3407 {
3408 error ("bad value (%s) for -mips switch", mips_isa_string);
3409 mips_isa = 1;
3410 }
3411
3412 #ifdef MIPS_ABI_DEFAULT
3413 /* Get the ABI to use. Currently this code is only used for Irix 6. */
3414 if (mips_abi_string == (char *) 0)
3415 mips_abi = MIPS_ABI_DEFAULT;
3416 else if (! strcmp (mips_abi_string, "32")
3417 || ! strcmp (mips_abi_string, "o32"))
3418 mips_abi = ABI_32;
3419 else if (! strcmp (mips_abi_string, "n32"))
3420 mips_abi = ABI_N32;
3421 else if (! strcmp (mips_abi_string, "64")
3422 || ! strcmp (mips_abi_string, "n64"))
3423 mips_abi = ABI_64;
3424 else if (! strcmp (mips_abi_string, "eabi"))
3425 mips_abi = ABI_EABI;
3426 else
3427 error ("bad value (%s) for -mabi= switch", mips_abi_string);
3428
3429 /* A specified ISA defaults the ABI if it was not specified. */
3430 if (mips_abi_string == 0 && mips_isa_string && mips_abi != ABI_EABI)
3431 {
3432 if (mips_isa <= 2)
3433 mips_abi = ABI_32;
3434 else
3435 mips_abi = ABI_64;
3436 }
3437 /* A specified ABI defaults the ISA if it was not specified. */
3438 else if (mips_isa_string == 0 && mips_abi_string && mips_abi != ABI_EABI)
3439 {
3440 if (mips_abi == ABI_32)
3441 mips_isa = 1;
3442 else if (mips_abi == ABI_N32)
3443 mips_isa = 3;
3444 else
3445 mips_isa = 4;
3446 }
3447 /* If both ABI and ISA were specified, check for conflicts. */
3448 else if (mips_isa_string && mips_abi_string)
3449 {
3450 if ((mips_isa <= 2 && (mips_abi == ABI_N32 || mips_abi == ABI_64))
3451 || (mips_isa >= 3 && mips_abi == ABI_32))
3452 error ("-mabi=%s does not support -mips%d", mips_abi_string, mips_isa);
3453 }
3454
3455 /* Override TARGET_DEFAULT if necessary. */
3456 if (mips_abi == ABI_32)
3457 target_flags &= ~ (MASK_FLOAT64|MASK_64BIT);
3458
3459 /* In the EABI in 64 bit mode, longs and pointers are 64 bits. */
3460 if (mips_abi == ABI_EABI && TARGET_64BIT)
3461 target_flags |= MASK_LONG64;
3462
3463 /* ??? This doesn't work yet, so don't let people try to use it. */
3464 if (mips_abi == ABI_32)
3465 error ("The -mabi=32 support does not work yet.");
3466 #else
3467 if (mips_abi_string)
3468 error ("This target does not support the -mabi switch.");
3469 #endif
3470
3471 #ifdef MIPS_CPU_STRING_DEFAULT
3472 /* ??? There is a minor inconsistency here. If the user specifies an ISA
3473 greater than that supported by the default processor, then the user gets
3474 an error. Normally, the compiler will just default to the base level cpu
3475 for the indicated isa. */
3476 if (mips_cpu_string == (char *)0)
3477 mips_cpu_string = MIPS_CPU_STRING_DEFAULT;
3478 #endif
3479
3480 /* Identify the processor type */
3481 if (mips_cpu_string == (char *)0
3482 || !strcmp (mips_cpu_string, "default")
3483 || !strcmp (mips_cpu_string, "DEFAULT"))
3484 {
3485 switch (mips_isa)
3486 {
3487 default:
3488 mips_cpu_string = "3000";
3489 mips_cpu = PROCESSOR_R3000;
3490 break;
3491 case 2:
3492 mips_cpu_string = "6000";
3493 mips_cpu = PROCESSOR_R6000;
3494 break;
3495 case 3:
3496 mips_cpu_string = "4000";
3497 mips_cpu = PROCESSOR_R4000;
3498 break;
3499 case 4:
3500 mips_cpu_string = "8000";
3501 mips_cpu = PROCESSOR_R8000;
3502 break;
3503 }
3504 }
3505
3506 else
3507 {
3508 char *p = mips_cpu_string;
3509 int seen_v = FALSE;
3510
3511 /* We need to cope with the various "vr" prefixes for the NEC 4300
3512 and 4100 processors. */
3513 if (*p == 'v' || *p == 'V')
3514 {
3515 seen_v = TRUE;
3516 p++;
3517 }
3518 if (*p == 'r' || *p == 'R')
3519 p++;
3520
3521 /* Since there is no difference between a R2000 and R3000 in
3522 terms of the scheduler, we collapse them into just an R3000. */
3523
3524 mips_cpu = PROCESSOR_DEFAULT;
3525 switch (*p)
3526 {
3527 case '2':
3528 if (!strcmp (p, "2000") || !strcmp (p, "2k") || !strcmp (p, "2K"))
3529 mips_cpu = PROCESSOR_R3000;
3530 break;
3531
3532 case '3':
3533 if (!strcmp (p, "3000") || !strcmp (p, "3k") || !strcmp (p, "3K"))
3534 mips_cpu = PROCESSOR_R3000;
3535 break;
3536
3537 case '4':
3538 if (!strcmp (p, "4000") || !strcmp (p, "4k") || !strcmp (p, "4K"))
3539 mips_cpu = PROCESSOR_R4000;
3540 /* The vr4100 is a non-FP ISA III processor with some extra
3541 instructions. */
3542 else if (!strcmp (p, "4100")) {
3543 mips_cpu = PROCESSOR_R4100;
3544 target_flags |= MASK_SOFT_FLOAT ;
3545 }
3546 /* The vr4300 is a standard ISA III processor, but with a different
3547 pipeline. */
3548 else if (!strcmp (p, "4300"))
3549 mips_cpu = PROCESSOR_R4300;
3550 /* The r4400 is exactly the same as the r4000 from the compiler's
3551 viewpoint. */
3552 else if (!strcmp (p, "4400"))
3553 mips_cpu = PROCESSOR_R4000;
3554 else if (!strcmp (p, "4600"))
3555 mips_cpu = PROCESSOR_R4600;
3556 else if (!strcmp (p, "4650"))
3557 mips_cpu = PROCESSOR_R4650;
3558 break;
3559
3560 case '5':
3561 if (!strcmp (p, "5000") || !strcmp (p, "5k") || !strcmp (p, "5K"))
3562 mips_cpu = PROCESSOR_R5000;
3563 break;
3564
3565 case '6':
3566 if (!strcmp (p, "6000") || !strcmp (p, "6k") || !strcmp (p, "6K"))
3567 mips_cpu = PROCESSOR_R6000;
3568 break;
3569
3570 case '8':
3571 if (!strcmp (p, "8000"))
3572 mips_cpu = PROCESSOR_R8000;
3573 break;
3574
3575 case 'o':
3576 if (!strcmp (p, "orion"))
3577 mips_cpu = PROCESSOR_R4600;
3578 break;
3579 }
3580
3581 if (seen_v
3582 && mips_cpu != PROCESSOR_R4300
3583 && mips_cpu != PROCESSOR_R4100
3584 && mips_cpu != PROCESSOR_R5000)
3585 mips_cpu = PROCESSOR_DEFAULT;
3586
3587 if (mips_cpu == PROCESSOR_DEFAULT)
3588 {
3589 error ("bad value (%s) for -mcpu= switch", mips_cpu_string);
3590 mips_cpu_string = "default";
3591 }
3592 }
3593
3594 if ((mips_cpu == PROCESSOR_R3000 && mips_isa > 1)
3595 || (mips_cpu == PROCESSOR_R6000 && mips_isa > 2)
3596 || ((mips_cpu == PROCESSOR_R4000
3597 || mips_cpu == PROCESSOR_R4100
3598 || mips_cpu == PROCESSOR_R4300
3599 || mips_cpu == PROCESSOR_R4600
3600 || mips_cpu == PROCESSOR_R4650)
3601 && mips_isa > 3))
3602 error ("-mcpu=%s does not support -mips%d", mips_cpu_string, mips_isa);
3603
3604 /* make sure sizes of ints/longs/etc. are ok */
3605 if (mips_isa < 3)
3606 {
3607 if (TARGET_INT64)
3608 fatal ("Only MIPS-III or MIPS-IV CPUs can support 64 bit ints");
3609
3610 else if (TARGET_LONG64)
3611 fatal ("Only MIPS-III or MIPS-IV CPUs can support 64 bit longs");
3612
3613 else if (TARGET_FLOAT64)
3614 fatal ("Only MIPS-III or MIPS-IV CPUs can support 64 bit fp registers");
3615
3616 else if (TARGET_64BIT)
3617 fatal ("Only MIPS-III or MIPS-IV CPUs can support 64 bit gp registers");
3618 }
3619
3620 if (mips_abi != ABI_32)
3621 flag_pcc_struct_return = 0;
3622
3623 /* Tell halfpic.c that we have half-pic code if we do. */
3624 if (TARGET_HALF_PIC)
3625 HALF_PIC_INIT ();
3626
3627 /* -fpic (-KPIC) is the default when TARGET_ABICALLS is defined. We need
3628 to set flag_pic so that the LEGITIMATE_PIC_OPERAND_P macro will work. */
3629 /* ??? -non_shared turns off pic code generation, but this is not
3630 implemented. */
3631 if (TARGET_ABICALLS)
3632 {
3633 mips_abicalls = MIPS_ABICALLS_YES;
3634 flag_pic = 1;
3635 if (mips_section_threshold > 0)
3636 warning ("-G is incompatible with PIC code which is the default");
3637 }
3638 else
3639 mips_abicalls = MIPS_ABICALLS_NO;
3640
3641 /* -membedded-pic is a form of PIC code suitable for embedded
3642 systems. All calls are made using PC relative addressing, and
3643 all data is addressed using the $gp register. This requires gas,
3644 which does most of the work, and GNU ld, which automatically
3645 expands PC relative calls which are out of range into a longer
3646 instruction sequence. All gcc really does differently is
3647 generate a different sequence for a switch. */
3648 if (TARGET_EMBEDDED_PIC)
3649 {
3650 flag_pic = 1;
3651 if (TARGET_ABICALLS)
3652 warning ("-membedded-pic and -mabicalls are incompatible");
3653 if (g_switch_set)
3654 warning ("-G and -membedded-pic are incompatible");
3655 /* Setting mips_section_threshold is not required, because gas
3656 will force everything to be GP addressable anyhow, but
3657 setting it will cause gcc to make better estimates of the
3658 number of instructions required to access a particular data
3659 item. */
3660 mips_section_threshold = 0x7fffffff;
3661 }
3662
3663 /* ??? This does not work when target addresses are DImode.
3664 This is because we are missing DImode high/lo_sum patterns. */
3665
3666 if (TARGET_GAS && optimize && ! flag_pic && Pmode == SImode)
3667 mips_split_addresses = 1;
3668 else
3669 mips_split_addresses = 0;
3670
3671 /* -mrnames says to use the MIPS software convention for register
3672 names instead of the hardware names (ie, $a0 instead of $4).
3673 We do this by switching the names in mips_reg_names, which the
3674 reg_names points into via the REGISTER_NAMES macro. */
3675
3676 if (TARGET_NAME_REGS)
3677 bcopy ((char *) mips_sw_reg_names, (char *) mips_reg_names, sizeof (mips_reg_names));
3678
3679 /* If this is OSF/1, set up a SIGINFO handler so we can see what function
3680 is currently being compiled. */
3681 #ifdef SIGINFO
3682 if (getenv ("GCC_SIGINFO") != (char *)0)
3683 {
3684 struct sigaction action;
3685 action.sa_handler = siginfo;
3686 action.sa_mask = 0;
3687 action.sa_flags = SA_RESTART;
3688 sigaction (SIGINFO, &action, (struct sigaction *)0);
3689 }
3690 #endif
3691
3692 #if defined(_IOLBF)
3693 #if defined(ultrix) || defined(__ultrix) || defined(__OSF1__) || defined(__osf__) || defined(osf)
3694 /* If -mstats and -quiet, make stderr line buffered. */
3695 if (quiet_flag && TARGET_STATS)
3696 setvbuf (stderr, (char *)0, _IOLBF, BUFSIZ);
3697 #endif
3698 #endif
3699
3700 /* Initialize the high and low values for legitimate floating point
3701 constants. Rather than trying to get the accuracy down to the
3702 last bit, just use approximate ranges. */
3703 dfhigh = REAL_VALUE_ATOF ("1.0e300", DFmode);
3704 dflow = REAL_VALUE_ATOF ("1.0e-300", DFmode);
3705 sfhigh = REAL_VALUE_ATOF ("1.0e38", SFmode);
3706 sflow = REAL_VALUE_ATOF ("1.0e-38", SFmode);
3707
3708 mips_print_operand_punct['?'] = TRUE;
3709 mips_print_operand_punct['#'] = TRUE;
3710 mips_print_operand_punct['&'] = TRUE;
3711 mips_print_operand_punct['!'] = TRUE;
3712 mips_print_operand_punct['*'] = TRUE;
3713 mips_print_operand_punct['@'] = TRUE;
3714 mips_print_operand_punct['.'] = TRUE;
3715 mips_print_operand_punct['('] = TRUE;
3716 mips_print_operand_punct[')'] = TRUE;
3717 mips_print_operand_punct['['] = TRUE;
3718 mips_print_operand_punct[']'] = TRUE;
3719 mips_print_operand_punct['<'] = TRUE;
3720 mips_print_operand_punct['>'] = TRUE;
3721 mips_print_operand_punct['{'] = TRUE;
3722 mips_print_operand_punct['}'] = TRUE;
3723 mips_print_operand_punct['^'] = TRUE;
3724
3725 mips_char_to_class['d'] = GR_REGS;
3726 mips_char_to_class['f'] = ((TARGET_HARD_FLOAT) ? FP_REGS : NO_REGS);
3727 mips_char_to_class['h'] = HI_REG;
3728 mips_char_to_class['l'] = LO_REG;
3729 mips_char_to_class['a'] = HILO_REG;
3730 mips_char_to_class['x'] = MD_REGS;
3731 mips_char_to_class['b'] = ALL_REGS;
3732 mips_char_to_class['y'] = GR_REGS;
3733 mips_char_to_class['z'] = ST_REGS;
3734
3735 /* Set up array to map GCC register number to debug register number.
3736 Ignore the special purpose register numbers. */
3737
3738 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3739 mips_dbx_regno[i] = -1;
3740
3741 start = GP_DBX_FIRST - GP_REG_FIRST;
3742 for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
3743 mips_dbx_regno[i] = i + start;
3744
3745 start = FP_DBX_FIRST - FP_REG_FIRST;
3746 for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
3747 mips_dbx_regno[i] = i + start;
3748
3749 /* Set up array giving whether a given register can hold a given mode.
3750 At present, restrict ints from being in FP registers, because reload
3751 is a little enthusiastic about storing extra values in FP registers,
3752 and this is not good for things like OS kernels. Also, due to the
3753 mandatory delay, it is as fast to load from cached memory as to move
3754 from the FP register. */
3755
3756 for (mode = VOIDmode;
3757 mode != MAX_MACHINE_MODE;
3758 mode = (enum machine_mode)((int)mode + 1))
3759 {
3760 register int size = GET_MODE_SIZE (mode);
3761 register enum mode_class class = GET_MODE_CLASS (mode);
3762
3763 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
3764 {
3765 register int temp;
3766
3767 if (mode == CCmode)
3768 {
3769 if (mips_isa < 4)
3770 temp = (regno == FPSW_REGNUM);
3771 else
3772 temp = (ST_REG_P (regno)
3773 || GP_REG_P (regno)
3774 || FP_REG_P (regno));
3775 }
3776
3777 else if (GP_REG_P (regno))
3778 temp = ((regno & 1) == 0 || (size <= UNITS_PER_WORD));
3779
3780 else if (FP_REG_P (regno))
3781 temp = ((TARGET_FLOAT64 || ((regno & 1) == 0))
3782 && (class == MODE_FLOAT
3783 || class == MODE_COMPLEX_FLOAT
3784 || (TARGET_DEBUG_H_MODE && class == MODE_INT))
3785 && (! TARGET_SINGLE_FLOAT || size <= 4));
3786
3787 else if (MD_REG_P (regno))
3788 temp = (class == MODE_INT
3789 && (size <= UNITS_PER_WORD
3790 || (regno == MD_REG_FIRST && size == 2 * UNITS_PER_WORD)));
3791
3792 else
3793 temp = FALSE;
3794
3795 mips_hard_regno_mode_ok[(int)mode][regno] = temp;
3796 }
3797 }
3798 }
3799
3800 \f
3801 /*
3802 * The MIPS debug format wants all automatic variables and arguments
3803 * to be in terms of the virtual frame pointer (stack pointer before
3804 * any adjustment in the function), while the MIPS 3.0 linker wants
3805 * the frame pointer to be the stack pointer after the initial
3806 * adjustment. So, we do the adjustment here. The arg pointer (which
3807 * is eliminated) points to the virtual frame pointer, while the frame
3808 * pointer (which may be eliminated) points to the stack pointer after
3809 * the initial adjustments.
3810 */
3811
3812 int
3813 mips_debugger_offset (addr, offset)
3814 rtx addr;
3815 int offset;
3816 {
3817 rtx offset2 = const0_rtx;
3818 rtx reg = eliminate_constant_term (addr, &offset2);
3819
3820 if (!offset)
3821 offset = INTVAL (offset2);
3822
3823 if (reg == stack_pointer_rtx || reg == frame_pointer_rtx)
3824 {
3825 int frame_size = (!current_frame_info.initialized)
3826 ? compute_frame_size (get_frame_size ())
3827 : current_frame_info.total_size;
3828
3829 offset = offset - frame_size;
3830 }
3831 /* sdbout_parms does not want this to crash for unrecognized cases. */
3832 #if 0
3833 else if (reg != arg_pointer_rtx)
3834 abort_with_insn (addr, "mips_debugger_offset called with non stack/frame/arg pointer.");
3835 #endif
3836
3837 return offset;
3838 }
3839
3840 \f
3841 /* A C compound statement to output to stdio stream STREAM the
3842 assembler syntax for an instruction operand X. X is an RTL
3843 expression.
3844
3845 CODE is a value that can be used to specify one of several ways
3846 of printing the operand. It is used when identical operands
3847 must be printed differently depending on the context. CODE
3848 comes from the `%' specification that was used to request
3849 printing of the operand. If the specification was just `%DIGIT'
3850 then CODE is 0; if the specification was `%LTR DIGIT' then CODE
3851 is the ASCII code for LTR.
3852
3853 If X is a register, this macro should print the register's name.
3854 The names can be found in an array `reg_names' whose type is
3855 `char *[]'. `reg_names' is initialized from `REGISTER_NAMES'.
3856
3857 When the machine description has a specification `%PUNCT' (a `%'
3858 followed by a punctuation character), this macro is called with
3859 a null pointer for X and the punctuation character for CODE.
3860
3861 The MIPS specific codes are:
3862
3863 'X' X is CONST_INT, prints 32 bits in hexadecimal format = "0x%08x",
3864 'x' X is CONST_INT, prints 16 bits in hexadecimal format = "0x%04x",
3865 'd' output integer constant in decimal,
3866 'z' if the operand is 0, use $0 instead of normal operand.
3867 'D' print second register of double-word register operand.
3868 'L' print low-order register of double-word register operand.
3869 'M' print high-order register of double-word register operand.
3870 'C' print part of opcode for a branch condition.
3871 'N' print part of opcode for a branch condition, inverted.
3872 'S' X is CODE_LABEL, print with prefix of "LS" (for embedded switch).
3873 'B' print 'z' for EQ, 'n' for NE
3874 'b' print 'n' for EQ, 'z' for NE
3875 'T' print 'f' for EQ, 't' for NE
3876 't' print 't' for EQ, 'f' for NE
3877 'Z' print register and a comma, but print nothing for $fcc0
3878 '(' Turn on .set noreorder
3879 ')' Turn on .set reorder
3880 '[' Turn on .set noat
3881 ']' Turn on .set at
3882 '<' Turn on .set nomacro
3883 '>' Turn on .set macro
3884 '{' Turn on .set volatile (not GAS)
3885 '}' Turn on .set novolatile (not GAS)
3886 '&' Turn on .set noreorder if filling delay slots
3887 '*' Turn on both .set noreorder and .set nomacro if filling delay slots
3888 '!' Turn on .set nomacro if filling delay slots
3889 '#' Print nop if in a .set noreorder section.
3890 '?' Print 'l' if we are to use a branch likely instead of normal branch.
3891 '@' Print the name of the assembler temporary register (at or $1).
3892 '.' Print the name of the register with a hard-wired zero (zero or $0).
3893 '^' Print the name of the pic call-through register (t9 or $25). */
3894
3895 void
3896 print_operand (file, op, letter)
3897 FILE *file; /* file to write to */
3898 rtx op; /* operand to print */
3899 int letter; /* %<letter> or 0 */
3900 {
3901 register enum rtx_code code;
3902
3903 if (PRINT_OPERAND_PUNCT_VALID_P (letter))
3904 {
3905 switch (letter)
3906 {
3907 default:
3908 error ("PRINT_OPERAND: Unknown punctuation '%c'", letter);
3909 break;
3910
3911 case '?':
3912 if (mips_branch_likely)
3913 putc ('l', file);
3914 break;
3915
3916 case '@':
3917 fputs (reg_names [GP_REG_FIRST + 1], file);
3918 break;
3919
3920 case '^':
3921 fputs (reg_names [PIC_FUNCTION_ADDR_REGNUM], file);
3922 break;
3923
3924 case '.':
3925 fputs (reg_names [GP_REG_FIRST + 0], file);
3926 break;
3927
3928 case '&':
3929 if (final_sequence != 0 && set_noreorder++ == 0)
3930 fputs (".set\tnoreorder\n\t", file);
3931 break;
3932
3933 case '*':
3934 if (final_sequence != 0)
3935 {
3936 if (set_noreorder++ == 0)
3937 fputs (".set\tnoreorder\n\t", file);
3938
3939 if (set_nomacro++ == 0)
3940 fputs (".set\tnomacro\n\t", file);
3941 }
3942 break;
3943
3944 case '!':
3945 if (final_sequence != 0 && set_nomacro++ == 0)
3946 fputs ("\n\t.set\tnomacro", file);
3947 break;
3948
3949 case '#':
3950 if (set_noreorder != 0)
3951 fputs ("\n\tnop", file);
3952
3953 else if (TARGET_STATS)
3954 fputs ("\n\t#nop", file);
3955
3956 break;
3957
3958 case '(':
3959 if (set_noreorder++ == 0)
3960 fputs (".set\tnoreorder\n\t", file);
3961 break;
3962
3963 case ')':
3964 if (set_noreorder == 0)
3965 error ("internal error: %%) found without a %%( in assembler pattern");
3966
3967 else if (--set_noreorder == 0)
3968 fputs ("\n\t.set\treorder", file);
3969
3970 break;
3971
3972 case '[':
3973 if (set_noat++ == 0)
3974 fputs (".set\tnoat\n\t", file);
3975 break;
3976
3977 case ']':
3978 if (set_noat == 0)
3979 error ("internal error: %%] found without a %%[ in assembler pattern");
3980
3981 else if (--set_noat == 0)
3982 fputs ("\n\t.set\tat", file);
3983
3984 break;
3985
3986 case '<':
3987 if (set_nomacro++ == 0)
3988 fputs (".set\tnomacro\n\t", file);
3989 break;
3990
3991 case '>':
3992 if (set_nomacro == 0)
3993 error ("internal error: %%> found without a %%< in assembler pattern");
3994
3995 else if (--set_nomacro == 0)
3996 fputs ("\n\t.set\tmacro", file);
3997
3998 break;
3999
4000 case '{':
4001 if (set_volatile++ == 0)
4002 fprintf (file, "%s.set\tvolatile\n\t", (TARGET_MIPS_AS) ? "" : "#");
4003 break;
4004
4005 case '}':
4006 if (set_volatile == 0)
4007 error ("internal error: %%} found without a %%{ in assembler pattern");
4008
4009 else if (--set_volatile == 0)
4010 fprintf (file, "\n\t%s.set\tnovolatile", (TARGET_MIPS_AS) ? "" : "#");
4011
4012 break;
4013 }
4014 return;
4015 }
4016
4017 if (! op)
4018 {
4019 error ("PRINT_OPERAND null pointer");
4020 return;
4021 }
4022
4023 code = GET_CODE (op);
4024
4025 if (code == SIGN_EXTEND)
4026 {
4027 op = XEXP (op, 0);
4028 code = GET_CODE (op);
4029 }
4030
4031 if (letter == 'C')
4032 switch (code)
4033 {
4034 case EQ: fputs ("eq", file); break;
4035 case NE: fputs ("ne", file); break;
4036 case GT: fputs ("gt", file); break;
4037 case GE: fputs ("ge", file); break;
4038 case LT: fputs ("lt", file); break;
4039 case LE: fputs ("le", file); break;
4040 case GTU: fputs ("gtu", file); break;
4041 case GEU: fputs ("geu", file); break;
4042 case LTU: fputs ("ltu", file); break;
4043 case LEU: fputs ("leu", file); break;
4044
4045 default:
4046 abort_with_insn (op, "PRINT_OPERAND, invalid insn for %%C");
4047 }
4048
4049 else if (letter == 'N')
4050 switch (code)
4051 {
4052 case EQ: fputs ("ne", file); break;
4053 case NE: fputs ("eq", file); break;
4054 case GT: fputs ("le", file); break;
4055 case GE: fputs ("lt", file); break;
4056 case LT: fputs ("ge", file); break;
4057 case LE: fputs ("gt", file); break;
4058 case GTU: fputs ("leu", file); break;
4059 case GEU: fputs ("ltu", file); break;
4060 case LTU: fputs ("geu", file); break;
4061 case LEU: fputs ("gtu", file); break;
4062
4063 default:
4064 abort_with_insn (op, "PRINT_OPERAND, invalid insn for %%N");
4065 }
4066
4067 else if (letter == 'S')
4068 {
4069 char buffer[100];
4070
4071 ASM_GENERATE_INTERNAL_LABEL (buffer, "LS", CODE_LABEL_NUMBER (op));
4072 assemble_name (file, buffer);
4073 }
4074
4075 else if (letter == 'Z')
4076 {
4077 register int regnum;
4078
4079 if (code != REG)
4080 abort ();
4081 regnum = REGNO (op);
4082 if (! ST_REG_P (regnum))
4083 abort ();
4084 if (regnum != ST_REG_FIRST)
4085 fprintf (file, "%s,", reg_names[regnum]);
4086 }
4087
4088 else if (code == REG || code == SUBREG)
4089 {
4090 register int regnum;
4091
4092 if (code == REG)
4093 regnum = REGNO (op);
4094 else
4095 regnum = true_regnum (op);
4096
4097 if ((letter == 'M' && ! WORDS_BIG_ENDIAN)
4098 || (letter == 'L' && WORDS_BIG_ENDIAN)
4099 || letter == 'D')
4100 regnum++;
4101
4102 fprintf (file, "%s", reg_names[regnum]);
4103 }
4104
4105 else if (code == MEM)
4106 output_address (XEXP (op, 0));
4107
4108 else if (code == CONST_DOUBLE
4109 && GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT)
4110 {
4111 REAL_VALUE_TYPE d;
4112 char s[30];
4113
4114 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
4115 REAL_VALUE_TO_DECIMAL (d, "%.20e", s);
4116 fprintf (file, s);
4117 }
4118
4119 else if ((letter == 'x') && (GET_CODE(op) == CONST_INT))
4120 fprintf (file, "0x%04x", 0xffff & (INTVAL(op)));
4121
4122 else if ((letter == 'X') && (GET_CODE(op) == CONST_INT)
4123 && HOST_BITS_PER_WIDE_INT == 32)
4124 fprintf (file, "0x%08x", INTVAL(op));
4125
4126 else if ((letter == 'X') && (GET_CODE(op) == CONST_INT)
4127 && HOST_BITS_PER_WIDE_INT == 64)
4128 fprintf (file, "0x%016lx", INTVAL(op));
4129
4130 else if ((letter == 'd') && (GET_CODE(op) == CONST_INT))
4131 fprintf (file, "%d", (INTVAL(op)));
4132
4133 else if (letter == 'z'
4134 && (GET_CODE (op) == CONST_INT)
4135 && INTVAL (op) == 0)
4136 fputs (reg_names[GP_REG_FIRST], file);
4137
4138 else if (letter == 'd' || letter == 'x' || letter == 'X')
4139 fatal ("PRINT_OPERAND: letter %c was found & insn was not CONST_INT", letter);
4140
4141 else if (letter == 'B')
4142 fputs (code == EQ ? "z" : "n", file);
4143 else if (letter == 'b')
4144 fputs (code == EQ ? "n" : "z", file);
4145 else if (letter == 'T')
4146 fputs (code == EQ ? "f" : "t", file);
4147 else if (letter == 't')
4148 fputs (code == EQ ? "t" : "f", file);
4149
4150 else
4151 output_addr_const (file, op);
4152 }
4153
4154 \f
4155 /* A C compound statement to output to stdio stream STREAM the
4156 assembler syntax for an instruction operand that is a memory
4157 reference whose address is ADDR. ADDR is an RTL expression.
4158
4159 On some machines, the syntax for a symbolic address depends on
4160 the section that the address refers to. On these machines,
4161 define the macro `ENCODE_SECTION_INFO' to store the information
4162 into the `symbol_ref', and then check for it here. */
4163
4164 void
4165 print_operand_address (file, addr)
4166 FILE *file;
4167 rtx addr;
4168 {
4169 if (!addr)
4170 error ("PRINT_OPERAND_ADDRESS, null pointer");
4171
4172 else
4173 switch (GET_CODE (addr))
4174 {
4175 default:
4176 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, invalid insn #1");
4177 break;
4178
4179 case REG:
4180 if (REGNO (addr) == ARG_POINTER_REGNUM)
4181 abort_with_insn (addr, "Arg pointer not eliminated.");
4182
4183 fprintf (file, "0(%s)", reg_names [REGNO (addr)]);
4184 break;
4185
4186 case LO_SUM:
4187 {
4188 register rtx arg0 = XEXP (addr, 0);
4189 register rtx arg1 = XEXP (addr, 1);
4190
4191 if (! mips_split_addresses)
4192 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, Spurious LO_SUM.");
4193
4194 if (GET_CODE (arg0) != REG)
4195 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, LO_SUM with #1 not REG.");
4196
4197 fprintf (file, "%%lo(");
4198 print_operand_address (file, arg1);
4199 fprintf (file, ")(%s)", reg_names [REGNO (arg0)]);
4200 }
4201 break;
4202
4203 case PLUS:
4204 {
4205 register rtx reg = (rtx)0;
4206 register rtx offset = (rtx)0;
4207 register rtx arg0 = XEXP (addr, 0);
4208 register rtx arg1 = XEXP (addr, 1);
4209
4210 if (GET_CODE (arg0) == REG)
4211 {
4212 reg = arg0;
4213 offset = arg1;
4214 if (GET_CODE (offset) == REG)
4215 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, 2 regs");
4216 }
4217 else if (GET_CODE (arg1) == REG)
4218 {
4219 reg = arg1;
4220 offset = arg0;
4221 }
4222 else if (CONSTANT_P (arg0) && CONSTANT_P (arg1))
4223 {
4224 output_addr_const (file, addr);
4225 break;
4226 }
4227 else
4228 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, no regs");
4229
4230 if (!CONSTANT_P (offset))
4231 abort_with_insn (addr, "PRINT_OPERAND_ADDRESS, invalid insn #2");
4232
4233 if (REGNO (reg) == ARG_POINTER_REGNUM)
4234 abort_with_insn (addr, "Arg pointer not eliminated.");
4235
4236 output_addr_const (file, offset);
4237 fprintf (file, "(%s)", reg_names [REGNO (reg)]);
4238 }
4239 break;
4240
4241 case LABEL_REF:
4242 case SYMBOL_REF:
4243 case CONST_INT:
4244 case CONST:
4245 output_addr_const (file, addr);
4246 break;
4247 }
4248 }
4249
4250 \f
4251 /* If optimizing for the global pointer, keep track of all of
4252 the externs, so that at the end of the file, we can emit
4253 the appropriate .extern declaration for them, before writing
4254 out the text section. We assume that all names passed to
4255 us are in the permanent obstack, so that they will be valid
4256 at the end of the compilation.
4257
4258 If we have -G 0, or the extern size is unknown, don't bother
4259 emitting the .externs. */
4260
4261 int
4262 mips_output_external (file, decl, name)
4263 FILE *file;
4264 tree decl;
4265 char *name;
4266 {
4267 register struct extern_list *p;
4268 int len;
4269
4270 if (TARGET_GP_OPT
4271 && ((TREE_CODE (decl)) != FUNCTION_DECL)
4272 && ((len = int_size_in_bytes (TREE_TYPE (decl))) > 0))
4273 {
4274 p = (struct extern_list *)permalloc ((long) sizeof (struct extern_list));
4275 p->next = extern_head;
4276 p->name = name;
4277 p->size = len;
4278 extern_head = p;
4279 }
4280
4281 #ifdef ASM_OUTPUT_UNDEF_FUNCTION
4282 if (TREE_CODE (decl) == FUNCTION_DECL
4283 /* ??? Don't include alloca, since gcc will always expand it
4284 inline. If we don't do this, libg++ fails to build. */
4285 && strcmp (name, "alloca")
4286 /* ??? Don't include __builtin_next_arg, because then gcc will not
4287 bootstrap under Irix 5.1. */
4288 && strcmp (name, "__builtin_next_arg"))
4289 {
4290 p = (struct extern_list *)permalloc ((long) sizeof (struct extern_list));
4291 p->next = extern_head;
4292 p->name = name;
4293 p->size = -1;
4294 extern_head = p;
4295 }
4296 #endif
4297
4298 return 0;
4299 }
4300
4301 #ifdef ASM_OUTPUT_UNDEF_FUNCTION
4302 int
4303 mips_output_external_libcall (file, name)
4304 FILE *file;
4305 char *name;
4306 {
4307 register struct extern_list *p;
4308
4309 p = (struct extern_list *)permalloc ((long) sizeof (struct extern_list));
4310 p->next = extern_head;
4311 p->name = name;
4312 p->size = -1;
4313 extern_head = p;
4314
4315 return 0;
4316 }
4317 #endif
4318
4319 \f
4320 /* Compute a string to use as a temporary file name. */
4321
4322 /* On MSDOS, write temp files in current dir
4323 because there's no place else we can expect to use. */
4324 #if __MSDOS__
4325 #ifndef P_tmpdir
4326 #define P_tmpdir "./"
4327 #endif
4328 #endif
4329
4330 static FILE *
4331 make_temp_file ()
4332 {
4333 FILE *stream;
4334 char *base = getenv ("TMPDIR");
4335 int len;
4336
4337 if (base == (char *)0)
4338 {
4339 #ifdef P_tmpdir
4340 if (access (P_tmpdir, R_OK | W_OK) == 0)
4341 base = P_tmpdir;
4342 else
4343 #endif
4344 if (access ("/usr/tmp", R_OK | W_OK) == 0)
4345 base = "/usr/tmp/";
4346 else
4347 base = "/tmp/";
4348 }
4349
4350 len = strlen (base);
4351 /* temp_filename is global, so we must use malloc, not alloca. */
4352 temp_filename = (char *) xmalloc (len + sizeof("/ctXXXXXX"));
4353 strcpy (temp_filename, base);
4354 if (len > 0 && temp_filename[len-1] != '/')
4355 temp_filename[len++] = '/';
4356
4357 strcpy (temp_filename + len, "ctXXXXXX");
4358 mktemp (temp_filename);
4359
4360 stream = fopen (temp_filename, "w+");
4361 if (!stream)
4362 pfatal_with_name (temp_filename);
4363
4364 #ifndef __MSDOS__
4365 /* In MSDOS, we cannot unlink the temporary file until we are finished using
4366 it. Otherwise, we delete it now, so that it will be gone even if the
4367 compiler happens to crash. */
4368 unlink (temp_filename);
4369 #endif
4370 return stream;
4371 }
4372
4373 \f
4374 /* Emit a new filename to a stream. If this is MIPS ECOFF, watch out
4375 for .file's that start within a function. If we are smuggling stabs, try to
4376 put out a MIPS ECOFF file and a stab. */
4377
4378 void
4379 mips_output_filename (stream, name)
4380 FILE *stream;
4381 char *name;
4382 {
4383 static int first_time = TRUE;
4384 char ltext_label_name[100];
4385
4386 if (first_time)
4387 {
4388 first_time = FALSE;
4389 SET_FILE_NUMBER ();
4390 current_function_file = name;
4391 ASM_OUTPUT_FILENAME (stream, num_source_filenames, name);
4392 /* This tells mips-tfile that stabs will follow. */
4393 if (!TARGET_GAS && write_symbols == DBX_DEBUG)
4394 fprintf (stream, "\t#@stabs\n");
4395 }
4396
4397 else if (write_symbols == DBX_DEBUG)
4398 {
4399 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
4400 fprintf (stream, "%s ", ASM_STABS_OP);
4401 output_quoted_string (stream, name);
4402 fprintf (stream, ",%d,0,0,%s\n", N_SOL, &ltext_label_name[1]);
4403 }
4404
4405 else if (name != current_function_file
4406 && strcmp (name, current_function_file) != 0)
4407 {
4408 if (inside_function && !TARGET_GAS)
4409 {
4410 if (!file_in_function_warning)
4411 {
4412 file_in_function_warning = TRUE;
4413 ignore_line_number = TRUE;
4414 warning ("MIPS ECOFF format does not allow changing filenames within functions with #line");
4415 }
4416 }
4417 else
4418 {
4419 SET_FILE_NUMBER ();
4420 current_function_file = name;
4421 ASM_OUTPUT_FILENAME (stream, num_source_filenames, name);
4422 }
4423 }
4424 }
4425
4426 \f
4427 /* Emit a linenumber. For encapsulated stabs, we need to put out a stab
4428 as well as a .loc, since it is possible that MIPS ECOFF might not be
4429 able to represent the location for inlines that come from a different
4430 file. */
4431
4432 void
4433 mips_output_lineno (stream, line)
4434 FILE *stream;
4435 int line;
4436 {
4437 if (write_symbols == DBX_DEBUG)
4438 {
4439 ++sym_lineno;
4440 fprintf (stream, "%sLM%d:\n\t%s %d,0,%d,%sLM%d\n",
4441 LOCAL_LABEL_PREFIX, sym_lineno, ASM_STABN_OP, N_SLINE, line,
4442 LOCAL_LABEL_PREFIX, sym_lineno);
4443 }
4444
4445 else
4446 {
4447 fprintf (stream, "\n\t%s.loc\t%d %d\n",
4448 (ignore_line_number) ? "#" : "",
4449 num_source_filenames, line);
4450
4451 LABEL_AFTER_LOC (stream);
4452 }
4453 }
4454
4455 \f
4456 /* If defined, a C statement to be executed just prior to the
4457 output of assembler code for INSN, to modify the extracted
4458 operands so they will be output differently.
4459
4460 Here the argument OPVEC is the vector containing the operands
4461 extracted from INSN, and NOPERANDS is the number of elements of
4462 the vector which contain meaningful data for this insn. The
4463 contents of this vector are what will be used to convert the
4464 insn template into assembler code, so you can change the
4465 assembler output by changing the contents of the vector.
4466
4467 We use it to check if the current insn needs a nop in front of it
4468 because of load delays, and also to update the delay slot
4469 statistics. */
4470
4471 /* ??? There is no real need for this function, because it never actually
4472 emits a NOP anymore. */
4473
4474 void
4475 final_prescan_insn (insn, opvec, noperands)
4476 rtx insn;
4477 rtx opvec[];
4478 int noperands;
4479 {
4480 if (dslots_number_nops > 0)
4481 {
4482 rtx pattern = PATTERN (insn);
4483 int length = get_attr_length (insn);
4484
4485 /* Do we need to emit a NOP? */
4486 if (length == 0
4487 || (mips_load_reg != (rtx)0 && reg_mentioned_p (mips_load_reg, pattern))
4488 || (mips_load_reg2 != (rtx)0 && reg_mentioned_p (mips_load_reg2, pattern))
4489 || (mips_load_reg3 != (rtx)0 && reg_mentioned_p (mips_load_reg3, pattern))
4490 || (mips_load_reg4 != (rtx)0 && reg_mentioned_p (mips_load_reg4, pattern)))
4491 fputs ("\t#nop\n", asm_out_file);
4492
4493 else
4494 dslots_load_filled++;
4495
4496 while (--dslots_number_nops > 0)
4497 fputs ("\t#nop\n", asm_out_file);
4498
4499 mips_load_reg = (rtx)0;
4500 mips_load_reg2 = (rtx)0;
4501 mips_load_reg3 = (rtx)0;
4502 mips_load_reg4 = (rtx)0;
4503 }
4504
4505 if (TARGET_STATS)
4506 {
4507 enum rtx_code code = GET_CODE (insn);
4508 if (code == JUMP_INSN || code == CALL_INSN)
4509 dslots_jump_total++;
4510 }
4511 }
4512
4513 \f
4514 /* Output at beginning of assembler file.
4515 If we are optimizing to use the global pointer, create a temporary
4516 file to hold all of the text stuff, and write it out to the end.
4517 This is needed because the MIPS assembler is evidently one pass,
4518 and if it hasn't seen the relevant .comm/.lcomm/.extern/.sdata
4519 declaration when the code is processed, it generates a two
4520 instruction sequence. */
4521
4522 void
4523 mips_asm_file_start (stream)
4524 FILE *stream;
4525 {
4526 ASM_OUTPUT_SOURCE_FILENAME (stream, main_input_filename);
4527
4528 /* Versions of the MIPS assembler before 2.20 generate errors
4529 if a branch inside of a .set noreorder section jumps to a
4530 label outside of the .set noreorder section. Revision 2.20
4531 just set nobopt silently rather than fixing the bug. */
4532
4533 if (TARGET_MIPS_AS && optimize && flag_delayed_branch)
4534 fprintf (stream, "\t.set\tnobopt\n");
4535
4536 /* Generate the pseudo ops that System V.4 wants. */
4537 #ifndef ABICALLS_ASM_OP
4538 #define ABICALLS_ASM_OP ".abicalls"
4539 #endif
4540 if (TARGET_ABICALLS)
4541 /* ??? but do not want this (or want pic0) if -non-shared? */
4542 fprintf (stream, "\t%s\n", ABICALLS_ASM_OP);
4543
4544 /* Start a section, so that the first .popsection directive is guaranteed
4545 to have a previously defined section to pop back to. */
4546 if (mips_abi != ABI_32 && mips_abi != ABI_EABI)
4547 fprintf (stream, "\t.section\t.text\n");
4548
4549 /* This code exists so that we can put all externs before all symbol
4550 references. This is necessary for the assembler's global pointer
4551 optimizations to work. */
4552 /* ??? Current versions of gas do not require that externs occur before
4553 symbol references. This means that this code is unnecessary when
4554 gas is being used. This gas feature hasn't been well tested as yet
4555 though. */
4556 if (TARGET_GP_OPT)
4557 {
4558 asm_out_data_file = stream;
4559 asm_out_text_file = make_temp_file ();
4560 }
4561 else
4562 asm_out_data_file = asm_out_text_file = stream;
4563
4564 if (flag_verbose_asm)
4565 fprintf (stream, "\n%s -G value = %d, Cpu = %s, ISA = %d\n",
4566 ASM_COMMENT_START,
4567 mips_section_threshold, mips_cpu_string, mips_isa);
4568 }
4569
4570 \f
4571 /* If we are optimizing the global pointer, emit the text section now
4572 and any small externs which did not have .comm, etc that are
4573 needed. Also, give a warning if the data area is more than 32K and
4574 -pic because 3 instructions are needed to reference the data
4575 pointers. */
4576
4577 void
4578 mips_asm_file_end (file)
4579 FILE *file;
4580 {
4581 char buffer[8192];
4582 tree name_tree;
4583 struct extern_list *p;
4584 int len;
4585
4586 if (HALF_PIC_P ())
4587 HALF_PIC_FINISH (file);
4588
4589 if (extern_head)
4590 {
4591 fputs ("\n", file);
4592
4593 for (p = extern_head; p != 0; p = p->next)
4594 {
4595 name_tree = get_identifier (p->name);
4596
4597 /* Positively ensure only one .extern for any given symbol. */
4598 if (! TREE_ASM_WRITTEN (name_tree))
4599 {
4600 TREE_ASM_WRITTEN (name_tree) = 1;
4601 #ifdef ASM_OUTPUT_UNDEF_FUNCTION
4602 if (p->size == -1)
4603 ASM_OUTPUT_UNDEF_FUNCTION (file, p->name);
4604 else
4605 #endif
4606 {
4607 fputs ("\t.extern\t", file);
4608 assemble_name (file, p->name);
4609 fprintf (file, ", %d\n", p->size);
4610 }
4611 }
4612 }
4613 }
4614
4615 if (TARGET_GP_OPT)
4616 {
4617 fprintf (file, "\n\t.text\n");
4618 rewind (asm_out_text_file);
4619 if (ferror (asm_out_text_file))
4620 fatal_io_error (temp_filename);
4621
4622 while ((len = fread (buffer, 1, sizeof (buffer), asm_out_text_file)) > 0)
4623 if (fwrite (buffer, 1, len, file) != len)
4624 pfatal_with_name (asm_file_name);
4625
4626 if (len < 0)
4627 pfatal_with_name (temp_filename);
4628
4629 if (fclose (asm_out_text_file) != 0)
4630 pfatal_with_name (temp_filename);
4631
4632 #ifdef __MSDOS__
4633 unlink (temp_filename);
4634 #endif
4635 }
4636 }
4637
4638 \f
4639 /* Emit either a label, .comm, or .lcomm directive, and mark
4640 that the symbol is used, so that we don't emit an .extern
4641 for it in mips_asm_file_end. */
4642
4643 void
4644 mips_declare_object (stream, name, init_string, final_string, size)
4645 FILE *stream;
4646 char *name;
4647 char *init_string;
4648 char *final_string;
4649 int size;
4650 {
4651 fputs (init_string, stream); /* "", "\t.comm\t", or "\t.lcomm\t" */
4652 assemble_name (stream, name);
4653 fprintf (stream, final_string, size); /* ":\n", ",%u\n", ",%u\n" */
4654
4655 if (TARGET_GP_OPT)
4656 {
4657 tree name_tree = get_identifier (name);
4658 TREE_ASM_WRITTEN (name_tree) = 1;
4659 }
4660 }
4661
4662 \f
4663 /* Output a double precision value to the assembler. If both the
4664 host and target are IEEE, emit the values in hex. */
4665
4666 void
4667 mips_output_double (stream, value)
4668 FILE *stream;
4669 REAL_VALUE_TYPE value;
4670 {
4671 #ifdef REAL_VALUE_TO_TARGET_DOUBLE
4672 long value_long[2];
4673 REAL_VALUE_TO_TARGET_DOUBLE (value, value_long);
4674
4675 fprintf (stream, "\t.word\t0x%08lx\t\t# %.20g\n\t.word\t0x%08lx\n",
4676 value_long[0], value, value_long[1]);
4677 #else
4678 fprintf (stream, "\t.double\t%.20g\n", value);
4679 #endif
4680 }
4681
4682
4683 /* Output a single precision value to the assembler. If both the
4684 host and target are IEEE, emit the values in hex. */
4685
4686 void
4687 mips_output_float (stream, value)
4688 FILE *stream;
4689 REAL_VALUE_TYPE value;
4690 {
4691 #ifdef REAL_VALUE_TO_TARGET_SINGLE
4692 long value_long;
4693 REAL_VALUE_TO_TARGET_SINGLE (value, value_long);
4694
4695 fprintf (stream, "\t.word\t0x%08lx\t\t# %.12g (float)\n", value_long, value);
4696 #else
4697 fprintf (stream, "\t.float\t%.12g\n", value);
4698 #endif
4699 }
4700
4701 \f
4702 /* Return TRUE if any register used in the epilogue is used. This to insure
4703 any insn put into the epilogue delay slots is safe. */
4704
4705 int
4706 epilogue_reg_mentioned_p (insn)
4707 rtx insn;
4708 {
4709 register char *fmt;
4710 register int i;
4711 register enum rtx_code code;
4712 register int regno;
4713
4714 if (insn == (rtx)0)
4715 return 0;
4716
4717 if (GET_CODE (insn) == LABEL_REF)
4718 return 0;
4719
4720 code = GET_CODE (insn);
4721 switch (code)
4722 {
4723 case REG:
4724 regno = REGNO (insn);
4725 if (regno == STACK_POINTER_REGNUM)
4726 return 1;
4727
4728 if (regno == FRAME_POINTER_REGNUM && frame_pointer_needed)
4729 return 1;
4730
4731 if (!call_used_regs[regno])
4732 return 1;
4733
4734 if (regno != MIPS_TEMP1_REGNUM && regno != MIPS_TEMP2_REGNUM)
4735 return 0;
4736
4737 if (!current_frame_info.initialized)
4738 compute_frame_size (get_frame_size ());
4739
4740 return (current_frame_info.total_size >= 32768);
4741
4742 case SCRATCH:
4743 case CC0:
4744 case PC:
4745 case CONST_INT:
4746 case CONST_DOUBLE:
4747 return 0;
4748 }
4749
4750 fmt = GET_RTX_FORMAT (code);
4751 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4752 {
4753 if (fmt[i] == 'E')
4754 {
4755 register int j;
4756 for (j = XVECLEN (insn, i) - 1; j >= 0; j--)
4757 if (epilogue_reg_mentioned_p (XVECEXP (insn, i, j)))
4758 return 1;
4759 }
4760 else if (fmt[i] == 'e' && epilogue_reg_mentioned_p (XEXP (insn, i)))
4761 return 1;
4762 }
4763
4764 return 0;
4765 }
4766 \f
4767 /* Return the bytes needed to compute the frame pointer from the current
4768 stack pointer.
4769
4770 Mips stack frames look like:
4771
4772 Before call After call
4773 +-----------------------+ +-----------------------+
4774 high | | | |
4775 mem. | | | |
4776 | caller's temps. | | caller's temps. |
4777 | | | |
4778 +-----------------------+ +-----------------------+
4779 | | | |
4780 | arguments on stack. | | arguments on stack. |
4781 | | | |
4782 +-----------------------+ +-----------------------+
4783 | 4 words to save | | 4 words to save |
4784 | arguments passed | | arguments passed |
4785 | in registers, even | | in registers, even |
4786 SP->| if not passed. | VFP->| if not passed. |
4787 +-----------------------+ +-----------------------+
4788 | |
4789 | fp register save |
4790 | |
4791 +-----------------------+
4792 | |
4793 | gp register save |
4794 | |
4795 +-----------------------+
4796 | |
4797 | local variables |
4798 | |
4799 +-----------------------+
4800 | |
4801 | alloca allocations |
4802 | |
4803 +-----------------------+
4804 | |
4805 | GP save for V.4 abi |
4806 | |
4807 +-----------------------+
4808 | |
4809 | arguments on stack |
4810 | |
4811 +-----------------------+
4812 | 4 words to save |
4813 | arguments passed |
4814 | in registers, even |
4815 low SP->| if not passed. |
4816 memory +-----------------------+
4817
4818 */
4819
4820 long
4821 compute_frame_size (size)
4822 int size; /* # of var. bytes allocated */
4823 {
4824 int regno;
4825 long total_size; /* # bytes that the entire frame takes up */
4826 long var_size; /* # bytes that variables take up */
4827 long args_size; /* # bytes that outgoing arguments take up */
4828 long extra_size; /* # extra bytes */
4829 long gp_reg_rounded; /* # bytes needed to store gp after rounding */
4830 long gp_reg_size; /* # bytes needed to store gp regs */
4831 long fp_reg_size; /* # bytes needed to store fp regs */
4832 long mask; /* mask of saved gp registers */
4833 long fmask; /* mask of saved fp registers */
4834 int fp_inc; /* 1 or 2 depending on the size of fp regs */
4835 long fp_bits; /* bitmask to use for each fp register */
4836
4837 gp_reg_size = 0;
4838 fp_reg_size = 0;
4839 mask = 0;
4840 fmask = 0;
4841 extra_size = MIPS_STACK_ALIGN (((TARGET_ABICALLS) ? UNITS_PER_WORD : 0));
4842 var_size = MIPS_STACK_ALIGN (size);
4843 args_size = MIPS_STACK_ALIGN (current_function_outgoing_args_size);
4844
4845 /* The MIPS 3.0 linker does not like functions that dynamically
4846 allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
4847 looks like we are trying to create a second frame pointer to the
4848 function, so allocate some stack space to make it happy. */
4849
4850 if (args_size == 0 && current_function_calls_alloca)
4851 args_size = 4*UNITS_PER_WORD;
4852
4853 total_size = var_size + args_size + extra_size;
4854
4855 /* Calculate space needed for gp registers. */
4856 for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
4857 {
4858 if (MUST_SAVE_REGISTER (regno))
4859 {
4860 gp_reg_size += UNITS_PER_WORD;
4861 mask |= 1L << (regno - GP_REG_FIRST);
4862 }
4863 }
4864
4865 /* Calculate space needed for fp registers. */
4866 if (TARGET_FLOAT64 || TARGET_SINGLE_FLOAT)
4867 {
4868 fp_inc = 1;
4869 fp_bits = 1;
4870 }
4871 else
4872 {
4873 fp_inc = 2;
4874 fp_bits = 3;
4875 }
4876
4877 for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += fp_inc)
4878 {
4879 if (regs_ever_live[regno] && !call_used_regs[regno])
4880 {
4881 fp_reg_size += fp_inc * UNITS_PER_FPREG;
4882 fmask |= fp_bits << (regno - FP_REG_FIRST);
4883 }
4884 }
4885
4886 gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
4887 total_size += gp_reg_rounded + MIPS_STACK_ALIGN (fp_reg_size);
4888
4889 /* The gp reg is caller saved in the 32 bit ABI, so there is no need
4890 for leaf routines (total_size == extra_size) to save the gp reg.
4891 The gp reg is callee saved in the 64 bit ABI, so all routines must
4892 save the gp reg. */
4893 if (total_size == extra_size && (mips_abi == ABI_32 || mips_abi == ABI_EABI))
4894 total_size = extra_size = 0;
4895 else if (TARGET_ABICALLS)
4896 {
4897 /* Add the context-pointer to the saved registers. */
4898 gp_reg_size += UNITS_PER_WORD;
4899 mask |= 1L << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST);
4900 total_size -= gp_reg_rounded;
4901 gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
4902 total_size += gp_reg_rounded;
4903 }
4904
4905 /* Add in space reserved on the stack by the callee for storing arguments
4906 passed in registers. */
4907 if (mips_abi != ABI_32)
4908 total_size += MIPS_STACK_ALIGN (current_function_pretend_args_size);
4909
4910 /* Save other computed information. */
4911 current_frame_info.total_size = total_size;
4912 current_frame_info.var_size = var_size;
4913 current_frame_info.args_size = args_size;
4914 current_frame_info.extra_size = extra_size;
4915 current_frame_info.gp_reg_size = gp_reg_size;
4916 current_frame_info.fp_reg_size = fp_reg_size;
4917 current_frame_info.mask = mask;
4918 current_frame_info.fmask = fmask;
4919 current_frame_info.initialized = reload_completed;
4920 current_frame_info.num_gp = gp_reg_size / UNITS_PER_WORD;
4921 current_frame_info.num_fp = fp_reg_size / (fp_inc * UNITS_PER_FPREG);
4922
4923 if (mask)
4924 {
4925 unsigned long offset = (args_size + extra_size + var_size
4926 + gp_reg_size - UNITS_PER_WORD);
4927 current_frame_info.gp_sp_offset = offset;
4928 current_frame_info.gp_save_offset = offset - total_size;
4929 }
4930 else
4931 {
4932 current_frame_info.gp_sp_offset = 0;
4933 current_frame_info.gp_save_offset = 0;
4934 }
4935
4936
4937 if (fmask)
4938 {
4939 unsigned long offset = (args_size + extra_size + var_size
4940 + gp_reg_rounded + fp_reg_size
4941 - fp_inc * UNITS_PER_FPREG);
4942 current_frame_info.fp_sp_offset = offset;
4943 current_frame_info.fp_save_offset = offset - total_size;
4944 }
4945 else
4946 {
4947 current_frame_info.fp_sp_offset = 0;
4948 current_frame_info.fp_save_offset = 0;
4949 }
4950
4951 /* Ok, we're done. */
4952 return total_size;
4953 }
4954
4955 \f
4956 /* Common code to emit the insns (or to write the instructions to a file)
4957 to save/restore registers.
4958
4959 Other parts of the code assume that MIPS_TEMP1_REGNUM (aka large_reg)
4960 is not modified within save_restore_insns. */
4961
4962 #define BITSET_P(value,bit) (((value) & (1L << (bit))) != 0)
4963
4964 static void
4965 save_restore_insns (store_p, large_reg, large_offset, file)
4966 int store_p; /* true if this is prologue */
4967 rtx large_reg; /* register holding large offset constant or NULL */
4968 long large_offset; /* large constant offset value */
4969 FILE *file; /* file to write instructions to instead of making RTL */
4970 {
4971 long mask = current_frame_info.mask;
4972 long fmask = current_frame_info.fmask;
4973 int regno;
4974 rtx base_reg_rtx;
4975 long base_offset;
4976 long gp_offset;
4977 long fp_offset;
4978 long end_offset;
4979 rtx insn;
4980
4981 if (frame_pointer_needed && !BITSET_P (mask, FRAME_POINTER_REGNUM - GP_REG_FIRST))
4982 abort ();
4983
4984 if (mask == 0 && fmask == 0)
4985 return;
4986
4987 /* Save registers starting from high to low. The debuggers prefer
4988 at least the return register be stored at func+4, and also it
4989 allows us not to need a nop in the epilog if at least one
4990 register is reloaded in addition to return address. */
4991
4992 /* Save GP registers if needed. */
4993 if (mask)
4994 {
4995 /* Pick which pointer to use as a base register. For small
4996 frames, just use the stack pointer. Otherwise, use a
4997 temporary register. Save 2 cycles if the save area is near
4998 the end of a large frame, by reusing the constant created in
4999 the prologue/epilogue to adjust the stack frame. */
5000
5001 gp_offset = current_frame_info.gp_sp_offset;
5002 end_offset = gp_offset - (current_frame_info.gp_reg_size - UNITS_PER_WORD);
5003
5004 if (gp_offset < 0 || end_offset < 0)
5005 fatal ("gp_offset (%ld) or end_offset (%ld) is less than zero.",
5006 gp_offset, end_offset);
5007
5008 else if (gp_offset < 32768)
5009 {
5010 base_reg_rtx = stack_pointer_rtx;
5011 base_offset = 0;
5012 }
5013
5014 else if (large_reg != (rtx)0
5015 && (((unsigned long)(large_offset - gp_offset)) < 32768)
5016 && (((unsigned long)(large_offset - end_offset)) < 32768))
5017 {
5018 base_reg_rtx = gen_rtx (REG, Pmode, MIPS_TEMP2_REGNUM);
5019 base_offset = large_offset;
5020 if (file == (FILE *)0)
5021 {
5022 if (TARGET_LONG64)
5023 insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
5024 else
5025 insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
5026 RTX_FRAME_RELATED_P (insn) = 1;
5027 }
5028 else
5029 fprintf (file, "\t%s\t%s,%s,%s\n",
5030 TARGET_LONG64 ? "daddu" : "addu",
5031 reg_names[MIPS_TEMP2_REGNUM],
5032 reg_names[REGNO (large_reg)],
5033 reg_names[STACK_POINTER_REGNUM]);
5034 }
5035
5036 else
5037 {
5038 base_reg_rtx = gen_rtx (REG, Pmode, MIPS_TEMP2_REGNUM);
5039 base_offset = gp_offset;
5040 if (file == (FILE *)0)
5041 {
5042 insn = emit_move_insn (base_reg_rtx, GEN_INT (gp_offset));
5043 RTX_FRAME_RELATED_P (insn) = 1;
5044 if (TARGET_LONG64)
5045 insn = emit_insn (gen_adddi3 (base_reg_rtx, base_reg_rtx, stack_pointer_rtx));
5046 else
5047 insn = emit_insn (gen_addsi3 (base_reg_rtx, base_reg_rtx, stack_pointer_rtx));
5048 RTX_FRAME_RELATED_P (insn) = 1;
5049 }
5050 else
5051 fprintf (file, "\tli\t%s,0x%.08lx\t# %ld\n\t%s\t%s,%s,%s\n",
5052 reg_names[MIPS_TEMP2_REGNUM],
5053 (long)base_offset,
5054 (long)base_offset,
5055 TARGET_LONG64 ? "daddu" : "addu",
5056 reg_names[MIPS_TEMP2_REGNUM],
5057 reg_names[MIPS_TEMP2_REGNUM],
5058 reg_names[STACK_POINTER_REGNUM]);
5059 }
5060
5061 for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
5062 {
5063 if (BITSET_P (mask, regno - GP_REG_FIRST))
5064 {
5065 if (file == (FILE *)0)
5066 {
5067 rtx reg_rtx = gen_rtx (REG, word_mode, regno);
5068 rtx mem_rtx = gen_rtx (MEM, word_mode,
5069 gen_rtx (PLUS, Pmode, base_reg_rtx,
5070 GEN_INT (gp_offset - base_offset)));
5071
5072 if (store_p)
5073 {
5074 insn = emit_move_insn (mem_rtx, reg_rtx);
5075 RTX_FRAME_RELATED_P (insn) = 1;
5076 }
5077 else if (!TARGET_ABICALLS || mips_abi != ABI_32
5078 || regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
5079 emit_move_insn (reg_rtx, mem_rtx);
5080 }
5081 else
5082 {
5083 if (store_p || !TARGET_ABICALLS || mips_abi != ABI_32
5084 || regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
5085 fprintf (file, "\t%s\t%s,%ld(%s)\n",
5086 (TARGET_64BIT
5087 ? (store_p) ? "sd" : "ld"
5088 : (store_p) ? "sw" : "lw"),
5089 reg_names[regno],
5090 gp_offset - base_offset,
5091 reg_names[REGNO(base_reg_rtx)]);
5092
5093 }
5094 gp_offset -= UNITS_PER_WORD;
5095 }
5096 }
5097 }
5098 else
5099 {
5100 base_reg_rtx = (rtx)0; /* Make sure these are initialized */
5101 base_offset = 0;
5102 }
5103
5104 /* Save floating point registers if needed. */
5105 if (fmask)
5106 {
5107 int fp_inc = (TARGET_FLOAT64 || TARGET_SINGLE_FLOAT) ? 1 : 2;
5108 int fp_size = fp_inc * UNITS_PER_FPREG;
5109
5110 /* Pick which pointer to use as a base register. */
5111 fp_offset = current_frame_info.fp_sp_offset;
5112 end_offset = fp_offset - (current_frame_info.fp_reg_size - fp_size);
5113
5114 if (fp_offset < 0 || end_offset < 0)
5115 fatal ("fp_offset (%ld) or end_offset (%ld) is less than zero.",
5116 fp_offset, end_offset);
5117
5118 else if (fp_offset < 32768)
5119 {
5120 base_reg_rtx = stack_pointer_rtx;
5121 base_offset = 0;
5122 }
5123
5124 else if (base_reg_rtx != (rtx)0
5125 && (((unsigned long)(base_offset - fp_offset)) < 32768)
5126 && (((unsigned long)(base_offset - end_offset)) < 32768))
5127 {
5128 ; /* already set up for gp registers above */
5129 }
5130
5131 else if (large_reg != (rtx)0
5132 && (((unsigned long)(large_offset - fp_offset)) < 32768)
5133 && (((unsigned long)(large_offset - end_offset)) < 32768))
5134 {
5135 base_reg_rtx = gen_rtx (REG, Pmode, MIPS_TEMP2_REGNUM);
5136 base_offset = large_offset;
5137 if (file == (FILE *)0)
5138 {
5139 if (TARGET_LONG64)
5140 insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
5141 else
5142 insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
5143 RTX_FRAME_RELATED_P (insn) = 1;
5144 }
5145 else
5146 fprintf (file, "\t%s\t%s,%s,%s\n",
5147 TARGET_LONG64 ? "daddu" : "addu",
5148 reg_names[MIPS_TEMP2_REGNUM],
5149 reg_names[REGNO (large_reg)],
5150 reg_names[STACK_POINTER_REGNUM]);
5151 }
5152
5153 else
5154 {
5155 base_reg_rtx = gen_rtx (REG, Pmode, MIPS_TEMP2_REGNUM);
5156 base_offset = fp_offset;
5157 if (file == (FILE *)0)
5158 {
5159 insn = emit_move_insn (base_reg_rtx, GEN_INT (fp_offset));
5160 RTX_FRAME_RELATED_P (insn) = 1;
5161 if (TARGET_LONG64)
5162 insn = emit_insn (gen_adddi3 (base_reg_rtx, base_reg_rtx, stack_pointer_rtx));
5163 else
5164 insn = emit_insn (gen_addsi3 (base_reg_rtx, base_reg_rtx, stack_pointer_rtx));
5165 RTX_FRAME_RELATED_P (insn) = 1;
5166 }
5167 else
5168 fprintf (file, "\tli\t%s,0x%.08lx\t# %ld\n\t%s\t%s,%s,%s\n",
5169 reg_names[MIPS_TEMP2_REGNUM],
5170 (long)base_offset,
5171 (long)base_offset,
5172 TARGET_LONG64 ? "daddu" : "addu",
5173 reg_names[MIPS_TEMP2_REGNUM],
5174 reg_names[MIPS_TEMP2_REGNUM],
5175 reg_names[STACK_POINTER_REGNUM]);
5176 }
5177
5178 for (regno = FP_REG_LAST-1; regno >= FP_REG_FIRST; regno -= fp_inc)
5179 {
5180 if (BITSET_P (fmask, regno - FP_REG_FIRST))
5181 {
5182 if (file == (FILE *)0)
5183 {
5184 enum machine_mode sz =
5185 TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5186 rtx reg_rtx = gen_rtx (REG, sz, regno);
5187 rtx mem_rtx = gen_rtx (MEM, sz,
5188 gen_rtx (PLUS, Pmode, base_reg_rtx,
5189 GEN_INT (fp_offset - base_offset)));
5190
5191 if (store_p)
5192 {
5193 insn = emit_move_insn (mem_rtx, reg_rtx);
5194 RTX_FRAME_RELATED_P (insn) = 1;
5195 }
5196 else
5197 emit_move_insn (reg_rtx, mem_rtx);
5198 }
5199 else
5200 fprintf (file, "\t%s\t%s,%ld(%s)\n",
5201 (TARGET_SINGLE_FLOAT
5202 ? ((store_p) ? "s.s" : "l.s")
5203 : ((store_p) ? "s.d" : "l.d")),
5204 reg_names[regno],
5205 fp_offset - base_offset,
5206 reg_names[REGNO(base_reg_rtx)]);
5207
5208
5209 fp_offset -= fp_size;
5210 }
5211 }
5212 }
5213 }
5214
5215 \f
5216 /* Set up the stack and frame (if desired) for the function. */
5217
5218 void
5219 function_prologue (file, size)
5220 FILE *file;
5221 int size;
5222 {
5223 char *fnname;
5224 long tsize = current_frame_info.total_size;
5225
5226 ASM_OUTPUT_SOURCE_FILENAME (file, DECL_SOURCE_FILE (current_function_decl));
5227
5228 #ifdef SDB_DEBUGGING_INFO
5229 if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
5230 ASM_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
5231 #endif
5232
5233 inside_function = 1;
5234
5235 #ifndef FUNCTION_NAME_ALREADY_DECLARED
5236 /* Get the function name the same way that toplev.c does before calling
5237 assemble_start_function. This is needed so that the name used here
5238 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
5239 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
5240
5241 fputs ("\t.ent\t", file);
5242 assemble_name (file, fnname);
5243 fputs ("\n", file);
5244
5245 assemble_name (file, fnname);
5246 fputs (":\n", file);
5247 #endif
5248
5249 fprintf (file, "\t.frame\t%s,%d,%s\t\t# vars= %d, regs= %d/%d, args= %d, extra= %d\n",
5250 reg_names[ (frame_pointer_needed) ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM ],
5251 tsize,
5252 reg_names[31 + GP_REG_FIRST],
5253 current_frame_info.var_size,
5254 current_frame_info.num_gp,
5255 current_frame_info.num_fp,
5256 current_function_outgoing_args_size,
5257 current_frame_info.extra_size);
5258
5259 fprintf (file, "\t.mask\t0x%08lx,%d\n\t.fmask\t0x%08lx,%d\n",
5260 current_frame_info.mask,
5261 current_frame_info.gp_save_offset,
5262 current_frame_info.fmask,
5263 current_frame_info.fp_save_offset);
5264
5265 if (TARGET_ABICALLS && mips_abi == ABI_32)
5266 {
5267 char *sp_str = reg_names[STACK_POINTER_REGNUM];
5268
5269 fprintf (file, "\t.set\tnoreorder\n\t.cpload\t%s\n\t.set\treorder\n",
5270 reg_names[PIC_FUNCTION_ADDR_REGNUM]);
5271 if (tsize > 0)
5272 {
5273 fprintf (file, "\t%s\t%s,%s,%d\n",
5274 (TARGET_LONG64 ? "dsubu" : "subu"),
5275 sp_str, sp_str, tsize);
5276 fprintf (file, "\t.cprestore %d\n", current_frame_info.args_size);
5277 }
5278 }
5279 }
5280
5281 \f
5282 /* Expand the prologue into a bunch of separate insns. */
5283
5284 void
5285 mips_expand_prologue ()
5286 {
5287 int regno;
5288 long tsize;
5289 rtx tmp_rtx = (rtx)0;
5290 char *arg_name = (char *)0;
5291 tree fndecl = current_function_decl;
5292 tree fntype = TREE_TYPE (fndecl);
5293 tree fnargs = DECL_ARGUMENTS (fndecl);
5294 rtx next_arg_reg;
5295 int i;
5296 tree next_arg;
5297 tree cur_arg;
5298 CUMULATIVE_ARGS args_so_far;
5299
5300 /* If struct value address is treated as the first argument, make it so. */
5301 if (aggregate_value_p (DECL_RESULT (fndecl))
5302 && ! current_function_returns_pcc_struct
5303 && struct_value_incoming_rtx == 0)
5304 {
5305 tree type = build_pointer_type (fntype);
5306 tree function_result_decl = build_decl (PARM_DECL, NULL_TREE, type);
5307 DECL_ARG_TYPE (function_result_decl) = type;
5308 TREE_CHAIN (function_result_decl) = fnargs;
5309 fnargs = function_result_decl;
5310 }
5311
5312 /* Determine the last argument, and get its name. */
5313
5314 INIT_CUMULATIVE_ARGS (args_so_far, fntype, (rtx)0, 0);
5315 regno = GP_ARG_FIRST;
5316
5317 for (cur_arg = fnargs; cur_arg != (tree)0; cur_arg = next_arg)
5318 {
5319 tree passed_type = DECL_ARG_TYPE (cur_arg);
5320 enum machine_mode passed_mode = TYPE_MODE (passed_type);
5321 rtx entry_parm;
5322
5323 if (TREE_ADDRESSABLE (passed_type))
5324 {
5325 passed_type = build_pointer_type (passed_type);
5326 passed_mode = Pmode;
5327 }
5328
5329 entry_parm = FUNCTION_ARG (args_so_far, passed_mode, passed_type, 1);
5330
5331 if (entry_parm)
5332 {
5333 int words;
5334
5335 /* passed in a register, so will get homed automatically */
5336 if (GET_MODE (entry_parm) == BLKmode)
5337 words = (int_size_in_bytes (passed_type) + 3) / 4;
5338 else
5339 words = (GET_MODE_SIZE (GET_MODE (entry_parm)) + 3) / 4;
5340
5341 regno = REGNO (entry_parm) + words - 1;
5342 }
5343 else
5344 {
5345 regno = GP_ARG_LAST+1;
5346 break;
5347 }
5348
5349 FUNCTION_ARG_ADVANCE (args_so_far, passed_mode, passed_type, 1);
5350
5351 next_arg = TREE_CHAIN (cur_arg);
5352 if (next_arg == (tree)0)
5353 {
5354 if (DECL_NAME (cur_arg))
5355 arg_name = IDENTIFIER_POINTER (DECL_NAME (cur_arg));
5356
5357 break;
5358 }
5359 }
5360
5361 /* In order to pass small structures by value in registers
5362 compatibly with the MIPS compiler, we need to shift the value
5363 into the high part of the register. Function_arg has encoded a
5364 PARALLEL rtx, holding a vector of adjustments to be made as the
5365 next_arg_reg variable, so we split up the insns, and emit them
5366 separately. */
5367
5368 next_arg_reg = FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1);
5369 if (next_arg_reg != (rtx)0 && GET_CODE (next_arg_reg) == PARALLEL)
5370 {
5371 rtvec adjust = XVEC (next_arg_reg, 0);
5372 int num = GET_NUM_ELEM (adjust);
5373
5374 for (i = 0; i < num; i++)
5375 {
5376 rtx pattern = RTVEC_ELT (adjust, i);
5377 if (GET_CODE (pattern) != SET
5378 || GET_CODE (SET_SRC (pattern)) != ASHIFT)
5379 abort_with_insn (pattern, "Insn is not a shift");
5380
5381 PUT_CODE (SET_SRC (pattern), ASHIFTRT);
5382 emit_insn (pattern);
5383 }
5384 }
5385
5386 tsize = compute_frame_size (get_frame_size ());
5387
5388 /* If this function is a varargs function, store any registers that
5389 would normally hold arguments ($4 - $7) on the stack. */
5390 if (mips_abi == ABI_32
5391 && ((TYPE_ARG_TYPES (fntype) != 0
5392 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype))) != void_type_node))
5393 || (arg_name != (char *)0
5394 && ((arg_name[0] == '_' && strcmp (arg_name, "__builtin_va_alist") == 0)
5395 || (arg_name[0] == 'v' && strcmp (arg_name, "va_alist") == 0)))))
5396 {
5397 int offset = (regno - GP_ARG_FIRST) * UNITS_PER_WORD;
5398 rtx ptr = stack_pointer_rtx;
5399
5400 /* If we are doing svr4-abi, sp has already been decremented by tsize. */
5401 if (TARGET_ABICALLS)
5402 offset += tsize;
5403
5404 for (; regno <= GP_ARG_LAST; regno++)
5405 {
5406 if (offset != 0)
5407 ptr = gen_rtx (PLUS, Pmode, stack_pointer_rtx, GEN_INT (offset));
5408 emit_move_insn (gen_rtx (MEM, word_mode, ptr),
5409 gen_rtx (REG, word_mode, regno));
5410 offset += UNITS_PER_WORD;
5411 }
5412 }
5413
5414 if (tsize > 0)
5415 {
5416 rtx tsize_rtx = GEN_INT (tsize);
5417
5418 /* If we are doing svr4-abi, sp move is done by function_prologue. */
5419 if (!TARGET_ABICALLS || mips_abi != ABI_32)
5420 {
5421 rtx insn;
5422
5423 if (tsize > 32767)
5424 {
5425 tmp_rtx = gen_rtx (REG, Pmode, MIPS_TEMP1_REGNUM);
5426 insn = emit_move_insn (tmp_rtx, tsize_rtx);
5427 RTX_FRAME_RELATED_P (insn) = 1;
5428 tsize_rtx = tmp_rtx;
5429 }
5430
5431 if (TARGET_LONG64)
5432 insn = emit_insn (gen_subdi3 (stack_pointer_rtx, stack_pointer_rtx,
5433 tsize_rtx));
5434 else
5435 insn = emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx,
5436 tsize_rtx));
5437
5438 RTX_FRAME_RELATED_P (insn) = 1;
5439 }
5440
5441 save_restore_insns (TRUE, tmp_rtx, tsize, (FILE *)0);
5442
5443 if (frame_pointer_needed)
5444 {
5445 rtx insn;
5446
5447 if (TARGET_64BIT)
5448 insn= emit_insn (gen_movdi (frame_pointer_rtx, stack_pointer_rtx));
5449 else
5450 insn= emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
5451
5452 RTX_FRAME_RELATED_P (insn) = 1;
5453 }
5454
5455 if (TARGET_ABICALLS && mips_abi != ABI_32)
5456 emit_insn (gen_loadgp (XEXP (DECL_RTL (current_function_decl), 0)));
5457 }
5458
5459 /* If we are profiling, make sure no instructions are scheduled before
5460 the call to mcount. */
5461
5462 if (profile_flag || profile_block_flag)
5463 emit_insn (gen_blockage ());
5464 }
5465
5466 \f
5467 /* Do any necessary cleanup after a function to restore stack, frame, and regs. */
5468
5469 #define RA_MASK ((long) 0x80000000) /* 1 << 31 */
5470 #define PIC_OFFSET_TABLE_MASK (1 << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
5471
5472 void
5473 function_epilogue (file, size)
5474 FILE *file;
5475 int size;
5476 {
5477 char *fnname;
5478 long tsize;
5479 char *sp_str = reg_names[STACK_POINTER_REGNUM];
5480 char *t1_str = reg_names[MIPS_TEMP1_REGNUM];
5481 rtx epilogue_delay = current_function_epilogue_delay_list;
5482 int noreorder = (epilogue_delay != 0);
5483 int noepilogue = FALSE;
5484 int load_nop = FALSE;
5485 int load_only_r31;
5486 rtx tmp_rtx = (rtx)0;
5487 rtx restore_rtx;
5488 int i;
5489
5490 /* The epilogue does not depend on any registers, but the stack
5491 registers, so we assume that if we have 1 pending nop, it can be
5492 ignored, and 2 it must be filled (2 nops occur for integer
5493 multiply and divide). */
5494
5495 if (dslots_number_nops > 0)
5496 {
5497 if (dslots_number_nops == 1)
5498 {
5499 dslots_number_nops = 0;
5500 dslots_load_filled++;
5501 }
5502 else
5503 {
5504 while (--dslots_number_nops > 0)
5505 fputs ("\t#nop\n", asm_out_file);
5506 }
5507 }
5508
5509 if (set_noat != 0)
5510 {
5511 set_noat = 0;
5512 fputs ("\t.set\tat\n", file);
5513 error ("internal gcc error: .set noat left on in epilogue");
5514 }
5515
5516 if (set_nomacro != 0)
5517 {
5518 set_nomacro = 0;
5519 fputs ("\t.set\tmacro\n", file);
5520 error ("internal gcc error: .set nomacro left on in epilogue");
5521 }
5522
5523 if (set_noreorder != 0)
5524 {
5525 set_noreorder = 0;
5526 fputs ("\t.set\treorder\n", file);
5527 error ("internal gcc error: .set noreorder left on in epilogue");
5528 }
5529
5530 if (set_volatile != 0)
5531 {
5532 set_volatile = 0;
5533 fprintf (file, "\t%s.set\tnovolatile\n", (TARGET_MIPS_AS) ? "" : "#");
5534 error ("internal gcc error: .set volatile left on in epilogue");
5535 }
5536
5537 size = MIPS_STACK_ALIGN (size);
5538 tsize = (!current_frame_info.initialized)
5539 ? compute_frame_size (size)
5540 : current_frame_info.total_size;
5541
5542 if (tsize == 0 && epilogue_delay == 0)
5543 {
5544 rtx insn = get_last_insn ();
5545
5546 /* If the last insn was a BARRIER, we don't have to write any code
5547 because a jump (aka return) was put there. */
5548 if (GET_CODE (insn) == NOTE)
5549 insn = prev_nonnote_insn (insn);
5550 if (insn && GET_CODE (insn) == BARRIER)
5551 noepilogue = TRUE;
5552
5553 noreorder = FALSE;
5554 }
5555
5556 if (!noepilogue)
5557 {
5558 /* In the reload sequence, we don't need to fill the load delay
5559 slots for most of the loads, also see if we can fill the final
5560 delay slot if not otherwise filled by the reload sequence. */
5561
5562 if (noreorder)
5563 fprintf (file, "\t.set\tnoreorder\n");
5564
5565 if (tsize > 32767)
5566 {
5567 fprintf (file, "\tli\t%s,0x%.08lx\t# %ld\n", t1_str, (long)tsize, (long)tsize);
5568 tmp_rtx = gen_rtx (REG, Pmode, MIPS_TEMP1_REGNUM);
5569 }
5570
5571 if (frame_pointer_needed)
5572 fprintf (file, "\tmove\t%s,%s\t\t\t# sp not trusted here\n",
5573 sp_str, reg_names[FRAME_POINTER_REGNUM]);
5574
5575 save_restore_insns (FALSE, tmp_rtx, tsize, file);
5576
5577 load_only_r31 = (((current_frame_info.mask
5578 & ~ (TARGET_ABICALLS && mips_abi == ABI_32
5579 ? PIC_OFFSET_TABLE_MASK : 0))
5580 == RA_MASK)
5581 && current_frame_info.fmask == 0);
5582
5583 if (noreorder)
5584 {
5585 /* If the only register saved is the return address, we need a
5586 nop, unless we have an instruction to put into it. Otherwise
5587 we don't since reloading multiple registers doesn't reference
5588 the register being loaded. */
5589
5590 if (load_only_r31)
5591 {
5592 if (epilogue_delay)
5593 final_scan_insn (XEXP (epilogue_delay, 0),
5594 file,
5595 1, /* optimize */
5596 -2, /* prescan */
5597 1); /* nopeepholes */
5598 else
5599 {
5600 fprintf (file, "\tnop\n");
5601 load_nop = TRUE;
5602 }
5603 }
5604
5605 fprintf (file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 31]);
5606
5607 if (tsize > 32767)
5608 fprintf (file, "\t%s\t%s,%s,%s\n",
5609 TARGET_LONG64 ? "daddu" : "addu",
5610 sp_str, sp_str, t1_str);
5611
5612 else if (tsize > 0)
5613 fprintf (file, "\t%s\t%s,%s,%d\n",
5614 TARGET_LONG64 ? "daddu" : "addu",
5615 sp_str, sp_str, tsize);
5616
5617 else if (!load_only_r31 && epilogue_delay != 0)
5618 final_scan_insn (XEXP (epilogue_delay, 0),
5619 file,
5620 1, /* optimize */
5621 -2, /* prescan */
5622 1); /* nopeepholes */
5623
5624 fprintf (file, "\t.set\treorder\n");
5625 }
5626
5627 else
5628 {
5629 if (tsize > 32767)
5630 fprintf (file, "\t%s\t%s,%s,%s\n",
5631 TARGET_LONG64 ? "daddu" : "addu",
5632 sp_str, sp_str, t1_str);
5633
5634 else if (tsize > 0)
5635 fprintf (file, "\t%s\t%s,%s,%d\n",
5636 TARGET_LONG64 ? "daddu" : "addu",
5637 sp_str, sp_str, tsize);
5638
5639 fprintf (file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 31]);
5640 }
5641 }
5642
5643 #ifndef FUNCTION_NAME_ALREADY_DECLARED
5644 /* Get the function name the same way that toplev.c does before calling
5645 assemble_start_function. This is needed so that the name used here
5646 exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
5647 fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
5648
5649 fputs ("\t.end\t", file);
5650 assemble_name (file, fnname);
5651 fputs ("\n", file);
5652 #endif
5653
5654 if (TARGET_STATS)
5655 {
5656 int num_gp_regs = current_frame_info.gp_reg_size / 4;
5657 int num_fp_regs = current_frame_info.fp_reg_size / 8;
5658 int num_regs = num_gp_regs + num_fp_regs;
5659 char *name = fnname;
5660
5661 if (name[0] == '*')
5662 name++;
5663
5664 dslots_load_total += num_regs;
5665
5666 if (!noepilogue)
5667 dslots_jump_total++;
5668
5669 if (noreorder)
5670 {
5671 dslots_load_filled += num_regs;
5672
5673 /* If the only register saved is the return register, we
5674 can't fill this register's delay slot. */
5675
5676 if (load_only_r31 && epilogue_delay == 0)
5677 dslots_load_filled--;
5678
5679 if (tsize > 0 || (!load_only_r31 && epilogue_delay != 0))
5680 dslots_jump_filled++;
5681 }
5682
5683 fprintf (stderr,
5684 "%-20s fp=%c leaf=%c alloca=%c setjmp=%c stack=%4ld arg=%3ld reg=%2d/%d delay=%3d/%3dL %3d/%3dJ refs=%3d/%3d/%3d",
5685 name,
5686 (frame_pointer_needed) ? 'y' : 'n',
5687 ((current_frame_info.mask & RA_MASK) != 0) ? 'n' : 'y',
5688 (current_function_calls_alloca) ? 'y' : 'n',
5689 (current_function_calls_setjmp) ? 'y' : 'n',
5690 (long)current_frame_info.total_size,
5691 (long)current_function_outgoing_args_size,
5692 num_gp_regs, num_fp_regs,
5693 dslots_load_total, dslots_load_filled,
5694 dslots_jump_total, dslots_jump_filled,
5695 num_refs[0], num_refs[1], num_refs[2]);
5696
5697 if (HALF_PIC_NUMBER_PTRS > prev_half_pic_ptrs)
5698 {
5699 fprintf (stderr, " half-pic=%3d", HALF_PIC_NUMBER_PTRS - prev_half_pic_ptrs);
5700 prev_half_pic_ptrs = HALF_PIC_NUMBER_PTRS;
5701 }
5702
5703 if (HALF_PIC_NUMBER_REFS > prev_half_pic_refs)
5704 {
5705 fprintf (stderr, " pic-ref=%3d", HALF_PIC_NUMBER_REFS - prev_half_pic_refs);
5706 prev_half_pic_refs = HALF_PIC_NUMBER_REFS;
5707 }
5708
5709 fputc ('\n', stderr);
5710 }
5711
5712 /* Reset state info for each function. */
5713 inside_function = FALSE;
5714 ignore_line_number = FALSE;
5715 dslots_load_total = 0;
5716 dslots_jump_total = 0;
5717 dslots_load_filled = 0;
5718 dslots_jump_filled = 0;
5719 num_refs[0] = 0;
5720 num_refs[1] = 0;
5721 num_refs[2] = 0;
5722 mips_load_reg = (rtx)0;
5723 mips_load_reg2 = (rtx)0;
5724 current_frame_info = zero_frame_info;
5725
5726 /* Restore the output file if optimizing the GP (optimizing the GP causes
5727 the text to be diverted to a tempfile, so that data decls come before
5728 references to the data). */
5729
5730 if (TARGET_GP_OPT)
5731 asm_out_file = asm_out_data_file;
5732 }
5733
5734 \f
5735 /* Expand the epilogue into a bunch of separate insns. */
5736
5737 void
5738 mips_expand_epilogue ()
5739 {
5740 long tsize = current_frame_info.total_size;
5741 rtx tsize_rtx = GEN_INT (tsize);
5742 rtx tmp_rtx = (rtx)0;
5743
5744 if (tsize > 32767)
5745 {
5746 tmp_rtx = gen_rtx (REG, Pmode, MIPS_TEMP1_REGNUM);
5747 emit_move_insn (tmp_rtx, tsize_rtx);
5748 tsize_rtx = tmp_rtx;
5749 }
5750
5751 if (tsize > 0)
5752 {
5753 if (frame_pointer_needed)
5754 {
5755 if (TARGET_LONG64)
5756 emit_insn (gen_movdi (stack_pointer_rtx, frame_pointer_rtx));
5757 else
5758 emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
5759 }
5760
5761 save_restore_insns (FALSE, tmp_rtx, tsize, (FILE *)0);
5762
5763 if (TARGET_LONG64)
5764 emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
5765 tsize_rtx));
5766 else
5767 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
5768 tsize_rtx));
5769 }
5770
5771 emit_jump_insn (gen_return_internal (gen_rtx (REG, Pmode, GP_REG_FIRST+31)));
5772 }
5773
5774 \f
5775 /* Define the number of delay slots needed for the function epilogue.
5776
5777 On the mips, we need a slot if either no stack has been allocated,
5778 or the only register saved is the return register. */
5779
5780 int
5781 mips_epilogue_delay_slots ()
5782 {
5783 if (!current_frame_info.initialized)
5784 (void) compute_frame_size (get_frame_size ());
5785
5786 if (current_frame_info.total_size == 0)
5787 return 1;
5788
5789 if (current_frame_info.mask == RA_MASK && current_frame_info.fmask == 0)
5790 return 1;
5791
5792 return 0;
5793 }
5794
5795 \f
5796 /* Return true if this function is known to have a null epilogue.
5797 This allows the optimizer to omit jumps to jumps if no stack
5798 was created. */
5799
5800 int
5801 simple_epilogue_p ()
5802 {
5803 if (!reload_completed)
5804 return 0;
5805
5806 if (current_frame_info.initialized)
5807 return current_frame_info.total_size == 0;
5808
5809 return (compute_frame_size (get_frame_size ())) == 0;
5810 }
5811 \f
5812 /* Choose the section to use for the constant rtx expression X that has
5813 mode MODE. */
5814
5815 mips_select_rtx_section (mode, x)
5816 enum machine_mode mode;
5817 rtx x;
5818 {
5819 if (TARGET_EMBEDDED_DATA)
5820 {
5821 /* For embedded applications, always put constants in read-only data,
5822 in order to reduce RAM usage. */
5823 READONLY_DATA_SECTION ();
5824 }
5825 else
5826 {
5827 /* For hosted applications, always put constants in small data if
5828 possible, as this gives the best performance. */
5829
5830 if (GET_MODE_SIZE (mode) <= mips_section_threshold
5831 && mips_section_threshold > 0)
5832 SMALL_DATA_SECTION ();
5833 else
5834 READONLY_DATA_SECTION ();
5835 }
5836 }
5837
5838 /* Choose the section to use for DECL. RELOC is true if its value contains
5839 any relocatable expression. */
5840
5841 mips_select_section (decl, reloc)
5842 tree decl;
5843 int reloc;
5844 {
5845 int size = int_size_in_bytes (TREE_TYPE (decl));
5846
5847 if (TARGET_EMBEDDED_PIC
5848 && TREE_CODE (decl) == STRING_CST
5849 && !flag_writable_strings)
5850 {
5851 /* For embedded position independent code, put constant strings
5852 in the text section, because the data section is limited to
5853 64K in size. */
5854
5855 text_section ();
5856 }
5857 else if (TARGET_EMBEDDED_DATA)
5858 {
5859 /* For embedded applications, always put an object in read-only data
5860 if possible, in order to reduce RAM usage. */
5861
5862 if (((TREE_CODE (decl) == VAR_DECL
5863 && TREE_READONLY (decl) && !TREE_SIDE_EFFECTS (decl)
5864 && DECL_INITIAL (decl)
5865 && (DECL_INITIAL (decl) == error_mark_node
5866 || TREE_CONSTANT (DECL_INITIAL (decl))))
5867 /* Deal with calls from output_constant_def_contents. */
5868 || (TREE_CODE (decl) != VAR_DECL
5869 && (TREE_CODE (decl) != STRING_CST
5870 || !flag_writable_strings)))
5871 && ! (flag_pic && reloc))
5872 READONLY_DATA_SECTION ();
5873 else if (size > 0 && size <= mips_section_threshold)
5874 SMALL_DATA_SECTION ();
5875 else
5876 data_section ();
5877 }
5878 else
5879 {
5880 /* For hosted applications, always put an object in small data if
5881 possible, as this gives the best performance. */
5882
5883 if (size > 0 && size <= mips_section_threshold)
5884 SMALL_DATA_SECTION ();
5885 else if (((TREE_CODE (decl) == VAR_DECL
5886 && TREE_READONLY (decl) && !TREE_SIDE_EFFECTS (decl)
5887 && DECL_INITIAL (decl)
5888 && (DECL_INITIAL (decl) == error_mark_node
5889 || TREE_CONSTANT (DECL_INITIAL (decl))))
5890 /* Deal with calls from output_constant_def_contents. */
5891 || (TREE_CODE (decl) != VAR_DECL
5892 && (TREE_CODE (decl) != STRING_CST
5893 || !flag_writable_strings)))
5894 && ! (flag_pic && reloc))
5895 READONLY_DATA_SECTION ();
5896 else
5897 data_section ();
5898 }
5899 }
5900 \f
5901 #ifdef MIPS_ABI_DEFAULT
5902 /* Support functions for the 64 bit ABI. */
5903
5904 /* Return register to use for a function return value with VALTYPE for function
5905 FUNC. */
5906
5907 rtx
5908 mips_function_value (valtype, func)
5909 tree valtype;
5910 tree func;
5911 {
5912 int reg = GP_RETURN;
5913 enum machine_mode mode = TYPE_MODE (valtype);
5914 enum mode_class mclass = GET_MODE_CLASS (mode);
5915
5916 /* ??? How should we return complex float? */
5917 if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
5918 {
5919 if (TARGET_SINGLE_FLOAT
5920 && (mclass == MODE_FLOAT
5921 ? GET_MODE_SIZE (mode) > 4
5922 : GET_MODE_SIZE (mode) / 2 > 4))
5923 reg = GP_RETURN;
5924 else
5925 reg = FP_RETURN;
5926 }
5927 else if (TREE_CODE (valtype) == RECORD_TYPE
5928 && mips_abi != ABI_32 && mips_abi != ABI_EABI)
5929 {
5930 /* A struct with only one or two floating point fields is returned in
5931 the floating point registers. */
5932 tree field, fields[2];
5933 int i;
5934
5935 for (i = 0, field = TYPE_FIELDS (valtype); field;
5936 field = TREE_CHAIN (field))
5937 {
5938 if (TREE_CODE (field) != FIELD_DECL)
5939 continue;
5940 if (TREE_CODE (TREE_TYPE (field)) != REAL_TYPE || i >= 2)
5941 break;
5942
5943 fields[i++] = field;
5944 }
5945
5946 /* Must check i, so that we reject structures with no elements. */
5947 if (! field)
5948 {
5949 if (i == 1)
5950 {
5951 /* The structure has DImode, but we don't allow DImode values
5952 in FP registers, so we use a PARALLEL even though it isn't
5953 strictly necessary. */
5954 enum machine_mode field_mode = TYPE_MODE (TREE_TYPE (fields[0]));
5955
5956 return gen_rtx (PARALLEL, mode,
5957 gen_rtvec (1,
5958 gen_rtx (EXPR_LIST, VOIDmode,
5959 gen_rtx (REG, field_mode, FP_RETURN),
5960 const0_rtx)));
5961 }
5962 else if (i == 2)
5963 {
5964 enum machine_mode first_mode
5965 = TYPE_MODE (TREE_TYPE (fields[0]));
5966 enum machine_mode second_mode
5967 = TYPE_MODE (TREE_TYPE (fields[1]));
5968 int first_offset
5969 = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (fields[0]));
5970 int second_offset
5971 = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (fields[1]));
5972
5973 return gen_rtx (PARALLEL, mode,
5974 gen_rtvec (2,
5975 gen_rtx (EXPR_LIST, VOIDmode,
5976 gen_rtx (REG, first_mode, FP_RETURN),
5977 GEN_INT (first_offset / BITS_PER_UNIT)),
5978 gen_rtx (EXPR_LIST, VOIDmode,
5979 gen_rtx (REG, second_mode, FP_RETURN + 2),
5980 GEN_INT (second_offset / BITS_PER_UNIT))));
5981 }
5982 }
5983 }
5984
5985 return gen_rtx (REG, mode, reg);
5986 }
5987
5988 /* The implementation of FUNCTION_ARG_PASS_BY_REFERENCE. Return
5989 nonzero when an argument must be passed by reference. */
5990
5991 int
5992 function_arg_pass_by_reference (cum, mode, type, named)
5993 CUMULATIVE_ARGS *cum;
5994 enum machine_mode mode;
5995 tree type;
5996 int named;
5997 {
5998 int size;
5999
6000 if (mips_abi != ABI_EABI)
6001 return 0;
6002
6003 /* ??? How should SCmode be handled? */
6004 if (type == NULL_TREE || mode == DImode || mode == DFmode)
6005 return 0;
6006
6007 size = int_size_in_bytes (type);
6008 return size == -1 || size > UNITS_PER_WORD;
6009 }
6010
6011 #endif
6012
6013 /* This function returns the register class required for a secondary
6014 register when copying between one of the registers in CLASS, and X,
6015 using MODE. If IN_P is nonzero, the copy is going from X to the
6016 register, otherwise the register is the source. A return value of
6017 NO_REGS means that no secondary register is required. */
6018
6019 enum reg_class
6020 mips_secondary_reload_class (class, mode, x, in_p)
6021 enum reg_class class;
6022 enum machine_mode mode;
6023 rtx x;
6024 int in_p;
6025 {
6026 int regno = -1;
6027
6028 if (GET_CODE (x) == SIGN_EXTEND)
6029 {
6030 int off = 0;
6031
6032 x = XEXP (x, 0);
6033
6034 /* We may be called with reg_renumber NULL from regclass.
6035 ??? This is probably a bug. */
6036 if (reg_renumber)
6037 regno = true_regnum (x);
6038 else
6039 {
6040 while (GET_CODE (x) == SUBREG)
6041 {
6042 off += SUBREG_WORD (x);
6043 x = SUBREG_REG (x);
6044 }
6045 if (GET_CODE (x) == REG)
6046 regno = REGNO (x) + off;
6047 }
6048 }
6049 else if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
6050 regno = true_regnum (x);
6051
6052 /* We always require a general register when copying anything to
6053 HILO_REGNUM, except when copying an SImode value from HILO_REGNUM
6054 to a general register, or when copying from register 0. */
6055 if (class == HILO_REG && regno != GP_REG_FIRST + 0)
6056 {
6057 if (! in_p
6058 && GP_REG_P (regno)
6059 && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (SImode))
6060 return NO_REGS;
6061 return GR_REGS;
6062 }
6063 if (regno == HILO_REGNUM)
6064 {
6065 if (in_p
6066 && class == GR_REGS
6067 && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (SImode))
6068 return NO_REGS;
6069 return GR_REGS;
6070 }
6071
6072 /* Copying from HI or LO to anywhere other than a general register
6073 requires a general register. */
6074 if (class == HI_REG || class == LO_REG || class == MD_REGS)
6075 {
6076 if (GP_REG_P (regno))
6077 return NO_REGS;
6078 return GR_REGS;
6079 }
6080 if (MD_REG_P (regno))
6081 {
6082 if (class == GR_REGS)
6083 return NO_REGS;
6084 return GR_REGS;
6085 }
6086
6087 /* We can only copy a value to a condition code register from a
6088 floating point register, and even then we require a scratch
6089 floating point register. We can only copy a value out of a
6090 condition code register into a general register. */
6091 if (class == ST_REGS)
6092 {
6093 if (in_p)
6094 return FP_REGS;
6095 if (GP_REG_P (regno))
6096 return NO_REGS;
6097 return GR_REGS;
6098 }
6099 if (ST_REG_P (regno))
6100 {
6101 if (! in_p)
6102 return FP_REGS;
6103 if (class == GR_REGS)
6104 return NO_REGS;
6105 return GR_REGS;
6106 }
6107
6108 return NO_REGS;
6109 }