]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/mn10300/mn10300.c
PR optimization/12147
[thirdparty/gcc.git] / gcc / config / mn10300 / mn10300.c
CommitLineData
29a404f9 1/* Subroutines for insn-output.c for Matsushita MN10300 series
f2d49d02 2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
6e31cc90 3 Free Software Foundation, Inc.
29a404f9 4 Contributed by Jeff Law (law@cygnus.com).
5
187b36cf 6This file is part of GCC.
29a404f9 7
187b36cf 8GCC is free software; you can redistribute it and/or modify
29a404f9 9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
187b36cf 13GCC is distributed in the hope that it will be useful,
29a404f9 14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
187b36cf 19along with GCC; see the file COPYING. If not, write to
29a404f9 20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
22
29a404f9 23#include "config.h"
7014838c 24#include "system.h"
805e22b2 25#include "coretypes.h"
26#include "tm.h"
29a404f9 27#include "rtl.h"
4faf81b8 28#include "tree.h"
29a404f9 29#include "regs.h"
30#include "hard-reg-set.h"
31#include "real.h"
32#include "insn-config.h"
33#include "conditions.h"
29a404f9 34#include "output.h"
35#include "insn-attr.h"
36#include "flags.h"
37#include "recog.h"
38#include "expr.h"
d8fc4d0b 39#include "optabs.h"
4faf81b8 40#include "function.h"
29a404f9 41#include "obstack.h"
59086782 42#include "toplev.h"
43#include "tm_p.h"
a767736d 44#include "target.h"
45#include "target-def.h"
29a404f9 46
b87a151a 47/* This is used by GOTaddr2picreg to uniquely identify
48 UNSPEC_INT_LABELs. */
49int mn10300_unspec_int_label_counter;
50
1acdfc69 51/* This is used in the am33_2.0-linux-gnu port, in which global symbol
52 names are not prefixed by underscores, to tell whether to prefix a
53 label with a plus sign or not, so that the assembler can tell
54 symbol names from register names. */
55int mn10300_protect_label;
56
8ecf154e 57/* The size of the callee register save area. Right now we save everything
58 on entry since it costs us nothing in code size. It does cost us from a
59 speed standpoint, so we want to optimize this sooner or later. */
3bcd7b00 60#define REG_SAVE_BYTES (4 * regs_ever_live[2] \
61 + 4 * regs_ever_live[3] \
911517ac 62 + 4 * regs_ever_live[6] \
63 + 4 * regs_ever_live[7] \
64 + 16 * (regs_ever_live[14] || regs_ever_live[15] \
65 || regs_ever_live[16] || regs_ever_live[17]))
fab7adbf 66
67
0792f2cf 68static int mn10300_address_cost_1 (rtx, int *);
69static int mn10300_address_cost (rtx);
70static bool mn10300_rtx_costs (rtx, int, int, int *);
71static void mn10300_file_start (void);
f2d49d02 72static bool mn10300_return_in_memory (tree, tree);
73static rtx mn10300_builtin_saveregs (void);
fab7adbf 74
a767736d 75\f
76/* Initialize the GCC target structure. */
58356836 77#undef TARGET_ASM_ALIGNED_HI_OP
78#define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
8ecf154e 79
fab7adbf 80#undef TARGET_RTX_COSTS
81#define TARGET_RTX_COSTS mn10300_rtx_costs
ec0457a8 82#undef TARGET_ADDRESS_COST
83#define TARGET_ADDRESS_COST mn10300_address_cost
fab7adbf 84
92c473b8 85#undef TARGET_ASM_FILE_START
86#define TARGET_ASM_FILE_START mn10300_file_start
87#undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
88#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
89
b87a151a 90#undef TARGET_ENCODE_SECTION_INFO
91#define TARGET_ENCODE_SECTION_INFO mn10300_encode_section_info
92
f2d49d02 93#undef TARGET_PROMOTE_PROTOTYPES
94#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
95
96#undef TARGET_STRUCT_VALUE_RTX
97#define TARGET_STRUCT_VALUE_RTX hook_rtx_tree_int_null
98#undef TARGET_RETURN_IN_MEMORY
99#define TARGET_RETURN_IN_MEMORY mn10300_return_in_memory
100
101#undef TARGET_EXPAND_BUILTIN_SAVEREGS
102#define TARGET_EXPAND_BUILTIN_SAVEREGS mn10300_builtin_saveregs
103
b87a151a 104static void mn10300_encode_section_info (tree, rtx, int);
57e4bbfb 105struct gcc_target targetm = TARGET_INITIALIZER;
a767736d 106\f
92c473b8 107static void
3285410a 108mn10300_file_start (void)
29a404f9 109{
92c473b8 110 default_file_start ();
911517ac 111
b166356e 112 if (TARGET_AM33_2)
113 fprintf (asm_out_file, "\t.am33_2\n");
114 else if (TARGET_AM33)
92c473b8 115 fprintf (asm_out_file, "\t.am33\n");
29a404f9 116}
117\f
118
29a404f9 119/* Print operand X using operand code CODE to assembly language output file
120 FILE. */
121
122void
3285410a 123print_operand (FILE *file, rtx x, int code)
29a404f9 124{
125 switch (code)
126 {
127 case 'b':
128 case 'B':
b166356e 129 if (cc_status.mdep.fpCC)
130 {
131 switch (code == 'b' ? GET_CODE (x)
132 : reverse_condition_maybe_unordered (GET_CODE (x)))
133 {
134 case NE:
135 fprintf (file, "ne");
136 break;
137 case EQ:
138 fprintf (file, "eq");
139 break;
140 case GE:
141 fprintf (file, "ge");
142 break;
143 case GT:
144 fprintf (file, "gt");
145 break;
146 case LE:
147 fprintf (file, "le");
148 break;
149 case LT:
150 fprintf (file, "lt");
151 break;
152 case ORDERED:
153 fprintf (file, "lge");
154 break;
155 case UNORDERED:
156 fprintf (file, "uo");
157 break;
158 case LTGT:
159 fprintf (file, "lg");
160 break;
161 case UNEQ:
162 fprintf (file, "ue");
163 break;
164 case UNGE:
165 fprintf (file, "uge");
166 break;
167 case UNGT:
168 fprintf (file, "ug");
169 break;
170 case UNLE:
171 fprintf (file, "ule");
172 break;
173 case UNLT:
174 fprintf (file, "ul");
175 break;
176 default:
177 abort ();
178 }
179 break;
180 }
29a404f9 181 /* These are normal and reversed branches. */
182 switch (code == 'b' ? GET_CODE (x) : reverse_condition (GET_CODE (x)))
183 {
184 case NE:
185 fprintf (file, "ne");
186 break;
187 case EQ:
188 fprintf (file, "eq");
189 break;
190 case GE:
191 fprintf (file, "ge");
192 break;
193 case GT:
194 fprintf (file, "gt");
195 break;
196 case LE:
197 fprintf (file, "le");
198 break;
199 case LT:
200 fprintf (file, "lt");
201 break;
202 case GEU:
203 fprintf (file, "cc");
204 break;
205 case GTU:
206 fprintf (file, "hi");
207 break;
208 case LEU:
209 fprintf (file, "ls");
210 break;
211 case LTU:
212 fprintf (file, "cs");
213 break;
214 default:
215 abort ();
216 }
217 break;
218 case 'C':
219 /* This is used for the operand to a call instruction;
220 if it's a REG, enclose it in parens, else output
221 the operand normally. */
222 if (GET_CODE (x) == REG)
223 {
224 fputc ('(', file);
225 print_operand (file, x, 0);
226 fputc (')', file);
227 }
228 else
229 print_operand (file, x, 0);
230 break;
231
b166356e 232 case 'D':
233 switch (GET_CODE (x))
234 {
235 case MEM:
236 fputc ('(', file);
237 output_address (XEXP (x, 0));
238 fputc (')', file);
239 break;
240
241 case REG:
242 fprintf (file, "fd%d", REGNO (x) - 18);
243 break;
244
245 default:
246 abort ();
247 }
248 break;
249
6ce19398 250 /* These are the least significant word in a 64bit value. */
251 case 'L':
252 switch (GET_CODE (x))
253 {
254 case MEM:
255 fputc ('(', file);
256 output_address (XEXP (x, 0));
257 fputc (')', file);
258 break;
259
260 case REG:
261 fprintf (file, "%s", reg_names[REGNO (x)]);
262 break;
263
264 case SUBREG:
701e46d0 265 fprintf (file, "%s", reg_names[subreg_regno (x)]);
6ce19398 266 break;
267
268 case CONST_DOUBLE:
269 {
270 long val[2];
271 REAL_VALUE_TYPE rv;
272
273 switch (GET_MODE (x))
274 {
275 case DFmode:
276 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
277 REAL_VALUE_TO_TARGET_DOUBLE (rv, val);
ad3c0f03 278 fprintf (file, "0x%lx", val[0]);
6ce19398 279 break;;
280 case SFmode:
281 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
282 REAL_VALUE_TO_TARGET_SINGLE (rv, val[0]);
ad3c0f03 283 fprintf (file, "0x%lx", val[0]);
6ce19398 284 break;;
285 case VOIDmode:
286 case DImode:
287 print_operand_address (file,
288 GEN_INT (CONST_DOUBLE_LOW (x)));
289 break;
59086782 290 default:
291 break;
6ce19398 292 }
293 break;
294 }
295
296 case CONST_INT:
964d057c 297 {
298 rtx low, high;
299 split_double (x, &low, &high);
300 fprintf (file, "%ld", (long)INTVAL (low));
301 break;
302 }
6ce19398 303
304 default:
305 abort ();
306 }
307 break;
308
309 /* Similarly, but for the most significant word. */
310 case 'H':
311 switch (GET_CODE (x))
312 {
313 case MEM:
314 fputc ('(', file);
eafc6604 315 x = adjust_address (x, SImode, 4);
6ce19398 316 output_address (XEXP (x, 0));
317 fputc (')', file);
318 break;
319
320 case REG:
321 fprintf (file, "%s", reg_names[REGNO (x) + 1]);
322 break;
323
324 case SUBREG:
701e46d0 325 fprintf (file, "%s", reg_names[subreg_regno (x) + 1]);
6ce19398 326 break;
327
328 case CONST_DOUBLE:
329 {
330 long val[2];
331 REAL_VALUE_TYPE rv;
332
333 switch (GET_MODE (x))
334 {
335 case DFmode:
336 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
337 REAL_VALUE_TO_TARGET_DOUBLE (rv, val);
ad3c0f03 338 fprintf (file, "0x%lx", val[1]);
6ce19398 339 break;;
340 case SFmode:
341 abort ();
342 case VOIDmode:
343 case DImode:
344 print_operand_address (file,
345 GEN_INT (CONST_DOUBLE_HIGH (x)));
346 break;
59086782 347 default:
348 break;
6ce19398 349 }
350 break;
351 }
352
353 case CONST_INT:
964d057c 354 {
355 rtx low, high;
356 split_double (x, &low, &high);
357 fprintf (file, "%ld", (long)INTVAL (high));
358 break;
359 }
360
6ce19398 361 default:
362 abort ();
363 }
364 break;
365
366 case 'A':
367 fputc ('(', file);
368 if (GET_CODE (XEXP (x, 0)) == REG)
7014838c 369 output_address (gen_rtx_PLUS (SImode, XEXP (x, 0), GEN_INT (0)));
6ce19398 370 else
371 output_address (XEXP (x, 0));
372 fputc (')', file);
373 break;
374
167fa942 375 case 'N':
058f71f0 376 if (INTVAL (x) < -128 || INTVAL (x) > 255)
377 abort ();
378 fprintf (file, "%d", (int)((~INTVAL (x)) & 0xff));
379 break;
380
381 case 'U':
382 if (INTVAL (x) < -128 || INTVAL (x) > 255)
383 abort ();
384 fprintf (file, "%d", (int)(INTVAL (x) & 0xff));
167fa942 385 break;
386
63e678f2 387 /* For shift counts. The hardware ignores the upper bits of
388 any immediate, but the assembler will flag an out of range
389 shift count as an error. So we mask off the high bits
390 of the immediate here. */
391 case 'S':
392 if (GET_CODE (x) == CONST_INT)
393 {
058f71f0 394 fprintf (file, "%d", (int)(INTVAL (x) & 0x1f));
63e678f2 395 break;
396 }
397 /* FALL THROUGH */
398
29a404f9 399 default:
400 switch (GET_CODE (x))
401 {
402 case MEM:
403 fputc ('(', file);
404 output_address (XEXP (x, 0));
405 fputc (')', file);
406 break;
407
6ce19398 408 case PLUS:
409 output_address (x);
410 break;
411
29a404f9 412 case REG:
413 fprintf (file, "%s", reg_names[REGNO (x)]);
414 break;
415
416 case SUBREG:
701e46d0 417 fprintf (file, "%s", reg_names[subreg_regno (x)]);
29a404f9 418 break;
419
6ce19398 420 /* This will only be single precision.... */
421 case CONST_DOUBLE:
422 {
423 unsigned long val;
424 REAL_VALUE_TYPE rv;
425
426 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
427 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
ad3c0f03 428 fprintf (file, "0x%lx", val);
6ce19398 429 break;
430 }
431
29a404f9 432 case CONST_INT:
433 case SYMBOL_REF:
434 case CONST:
435 case LABEL_REF:
436 case CODE_LABEL:
b87a151a 437 case UNSPEC:
29a404f9 438 print_operand_address (file, x);
439 break;
440 default:
441 abort ();
442 }
443 break;
444 }
445}
446
447/* Output assembly language output for the address ADDR to FILE. */
448
449void
3285410a 450print_operand_address (FILE *file, rtx addr)
29a404f9 451{
452 switch (GET_CODE (addr))
453 {
911517ac 454 case POST_INC:
455 print_operand_address (file, XEXP (addr, 0));
456 fputc ('+', file);
457 break;
29a404f9 458 case REG:
49fd1b62 459 print_operand (file, addr, 0);
29a404f9 460 break;
461 case PLUS:
462 {
463 rtx base, index;
464 if (REG_P (XEXP (addr, 0))
465 && REG_OK_FOR_BASE_P (XEXP (addr, 0)))
466 base = XEXP (addr, 0), index = XEXP (addr, 1);
467 else if (REG_P (XEXP (addr, 1))
468 && REG_OK_FOR_BASE_P (XEXP (addr, 1)))
469 base = XEXP (addr, 1), index = XEXP (addr, 0);
470 else
471 abort ();
472 print_operand (file, index, 0);
473 fputc (',', file);
474 print_operand (file, base, 0);;
475 break;
476 }
477 case SYMBOL_REF:
478 output_addr_const (file, addr);
479 break;
480 default:
481 output_addr_const (file, addr);
482 break;
483 }
484}
485
b166356e 486/* Count the number of FP registers that have to be saved. */
487static int
3285410a 488fp_regs_to_save (void)
b166356e 489{
490 int i, n = 0;
491
492 if (! TARGET_AM33_2)
493 return 0;
494
495 for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
496 if (regs_ever_live[i] && ! call_used_regs[i])
497 ++n;
498
499 return n;
500}
501
4caa3669 502/* Print a set of registers in the format required by "movm" and "ret".
503 Register K is saved if bit K of MASK is set. The data and address
504 registers can be stored individually, but the extended registers cannot.
505 We assume that the mask alread takes that into account. For instance,
09e5ce26 506 bits 14 to 17 must have the same value. */
4caa3669 507
508void
3285410a 509mn10300_print_reg_list (FILE *file, int mask)
4caa3669 510{
511 int need_comma;
512 int i;
513
514 need_comma = 0;
515 fputc ('[', file);
516
517 for (i = 0; i < FIRST_EXTENDED_REGNUM; i++)
518 if ((mask & (1 << i)) != 0)
519 {
520 if (need_comma)
521 fputc (',', file);
522 fputs (reg_names [i], file);
523 need_comma = 1;
524 }
525
526 if ((mask & 0x3c000) != 0)
527 {
528 if ((mask & 0x3c000) != 0x3c000)
529 abort();
530 if (need_comma)
531 fputc (',', file);
532 fputs ("exreg1", file);
533 need_comma = 1;
534 }
535
536 fputc (']', file);
537}
538
6ce19398 539int
3285410a 540can_use_return_insn (void)
6ce19398 541{
36ed4406 542 /* size includes the fixed stack space needed for function calls. */
543 int size = get_frame_size () + current_function_outgoing_args_size;
544
545 /* And space for the return pointer. */
546 size += current_function_outgoing_args_size ? 4 : 0;
6ce19398 547
548 return (reload_completed
549 && size == 0
550 && !regs_ever_live[2]
551 && !regs_ever_live[3]
552 && !regs_ever_live[6]
553 && !regs_ever_live[7]
911517ac 554 && !regs_ever_live[14]
555 && !regs_ever_live[15]
556 && !regs_ever_live[16]
557 && !regs_ever_live[17]
b166356e 558 && fp_regs_to_save () == 0
6ce19398 559 && !frame_pointer_needed);
560}
561
4caa3669 562/* Returns the set of live, callee-saved registers as a bitmask. The
563 callee-saved extended registers cannot be stored individually, so
09e5ce26 564 all of them will be included in the mask if any one of them is used. */
4caa3669 565
566int
3285410a 567mn10300_get_live_callee_saved_regs (void)
4caa3669 568{
569 int mask;
570 int i;
571
572 mask = 0;
b166356e 573 for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
4caa3669 574 if (regs_ever_live[i] && ! call_used_regs[i])
575 mask |= (1 << i);
576 if ((mask & 0x3c000) != 0)
577 mask |= 0x3c000;
578
579 return mask;
580}
581
582/* Generate an instruction that pushes several registers onto the stack.
583 Register K will be saved if bit K in MASK is set. The function does
584 nothing if MASK is zero.
585
586 To be compatible with the "movm" instruction, the lowest-numbered
587 register must be stored in the lowest slot. If MASK is the set
588 { R1,...,RN }, where R1...RN are ordered least first, the generated
589 instruction will have the form:
590
591 (parallel
592 (set (reg:SI 9) (plus:SI (reg:SI 9) (const_int -N*4)))
593 (set (mem:SI (plus:SI (reg:SI 9)
594 (const_int -1*4)))
595 (reg:SI RN))
596 ...
597 (set (mem:SI (plus:SI (reg:SI 9)
598 (const_int -N*4)))
599 (reg:SI R1))) */
600
601void
3285410a 602mn10300_gen_multiple_store (int mask)
4caa3669 603{
604 if (mask != 0)
605 {
606 int i;
607 int count;
608 rtx par;
609 int pari;
610
09e5ce26 611 /* Count how many registers need to be saved. */
4caa3669 612 count = 0;
b166356e 613 for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
4caa3669 614 if ((mask & (1 << i)) != 0)
615 count += 1;
616
617 /* We need one PARALLEL element to update the stack pointer and
09e5ce26 618 an additional element for each register that is stored. */
4caa3669 619 par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + 1));
620
09e5ce26 621 /* Create the instruction that updates the stack pointer. */
4caa3669 622 XVECEXP (par, 0, 0)
623 = gen_rtx_SET (SImode,
624 stack_pointer_rtx,
625 gen_rtx_PLUS (SImode,
626 stack_pointer_rtx,
627 GEN_INT (-count * 4)));
628
09e5ce26 629 /* Create each store. */
4caa3669 630 pari = 1;
b166356e 631 for (i = LAST_EXTENDED_REGNUM; i >= 0; i--)
4caa3669 632 if ((mask & (1 << i)) != 0)
633 {
634 rtx address = gen_rtx_PLUS (SImode,
635 stack_pointer_rtx,
636 GEN_INT (-pari * 4));
637 XVECEXP(par, 0, pari)
638 = gen_rtx_SET (VOIDmode,
639 gen_rtx_MEM (SImode, address),
640 gen_rtx_REG (SImode, i));
641 pari += 1;
642 }
643
644 par = emit_insn (par);
645 RTX_FRAME_RELATED_P (par) = 1;
646 }
647}
648
29a404f9 649void
3285410a 650expand_prologue (void)
29a404f9 651{
e3f95b40 652 HOST_WIDE_INT size;
f1899bff 653
f1899bff 654 /* SIZE includes the fixed stack space needed for function calls. */
36ed4406 655 size = get_frame_size () + current_function_outgoing_args_size;
656 size += (current_function_outgoing_args_size ? 4 : 0);
29a404f9 657
09e5ce26 658 /* If we use any of the callee-saved registers, save them now. */
4caa3669 659 mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
48cb86e3 660
b166356e 661 if (TARGET_AM33_2 && fp_regs_to_save ())
662 {
663 int num_regs_to_save = fp_regs_to_save (), i;
664 HOST_WIDE_INT xsize;
665 enum { save_sp_merge,
666 save_sp_no_merge,
667 save_sp_partial_merge,
668 save_a0_merge,
669 save_a0_no_merge } strategy;
670 unsigned int strategy_size = (unsigned)-1, this_strategy_size;
671 rtx reg;
672 rtx insn;
673
674 /* We have several different strategies to save FP registers.
675 We can store them using SP offsets, which is beneficial if
676 there are just a few registers to save, or we can use `a0' in
677 post-increment mode (`a0' is the only call-clobbered address
678 register that is never used to pass information to a
679 function). Furthermore, if we don't need a frame pointer, we
680 can merge the two SP adds into a single one, but this isn't
681 always beneficial; sometimes we can just split the two adds
682 so that we don't exceed a 16-bit constant size. The code
683 below will select which strategy to use, so as to generate
684 smallest code. Ties are broken in favor or shorter sequences
685 (in terms of number of instructions). */
686
687#define SIZE_ADD_AX(S) ((((S) >= (1 << 15)) || ((S) < -(1 << 15))) ? 6 \
688 : (((S) >= (1 << 7)) || ((S) < -(1 << 7))) ? 4 : 2)
689#define SIZE_ADD_SP(S) ((((S) >= (1 << 15)) || ((S) < -(1 << 15))) ? 6 \
690 : (((S) >= (1 << 7)) || ((S) < -(1 << 7))) ? 4 : 3)
691#define SIZE_FMOV_LIMIT(S,N,L,SIZE1,SIZE2,ELSE) \
692 (((S) >= (L)) ? (SIZE1) * (N) \
693 : ((S) + 4 * (N) >= (L)) ? (((L) - (S)) / 4 * (SIZE2) \
694 + ((S) + 4 * (N) - (L)) / 4 * (SIZE1)) \
695 : (ELSE))
696#define SIZE_FMOV_SP_(S,N) \
697 (SIZE_FMOV_LIMIT ((S), (N), (1 << 24), 7, 6, \
698 SIZE_FMOV_LIMIT ((S), (N), (1 << 8), 6, 4, \
699 (S) ? 4 * (N) : 3 + 4 * ((N) - 1))))
700#define SIZE_FMOV_SP(S,N) (SIZE_FMOV_SP_ ((unsigned HOST_WIDE_INT)(S), (N)))
701
702 /* Consider alternative save_sp_merge only if we don't need the
fa483857 703 frame pointer and size is nonzero. */
b166356e 704 if (! frame_pointer_needed && size)
705 {
706 /* Insn: add -(size + 4 * num_regs_to_save), sp. */
707 this_strategy_size = SIZE_ADD_SP (-(size + 4 * num_regs_to_save));
708 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
709 this_strategy_size += SIZE_FMOV_SP (size, num_regs_to_save);
710
711 if (this_strategy_size < strategy_size)
712 {
713 strategy = save_sp_merge;
714 strategy_size = this_strategy_size;
715 }
716 }
717
718 /* Consider alternative save_sp_no_merge unconditionally. */
719 /* Insn: add -4 * num_regs_to_save, sp. */
720 this_strategy_size = SIZE_ADD_SP (-4 * num_regs_to_save);
721 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
722 this_strategy_size += SIZE_FMOV_SP (0, num_regs_to_save);
723 if (size)
724 {
725 /* Insn: add -size, sp. */
726 this_strategy_size += SIZE_ADD_SP (-size);
727 }
728
729 if (this_strategy_size < strategy_size)
730 {
731 strategy = save_sp_no_merge;
732 strategy_size = this_strategy_size;
733 }
734
735 /* Consider alternative save_sp_partial_merge only if we don't
736 need a frame pointer and size is reasonably large. */
737 if (! frame_pointer_needed && size + 4 * num_regs_to_save > 128)
738 {
739 /* Insn: add -128, sp. */
740 this_strategy_size = SIZE_ADD_SP (-128);
741 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
742 this_strategy_size += SIZE_FMOV_SP (128 - 4 * num_regs_to_save,
743 num_regs_to_save);
744 if (size)
745 {
746 /* Insn: add 128-size, sp. */
747 this_strategy_size += SIZE_ADD_SP (128 - size);
748 }
749
750 if (this_strategy_size < strategy_size)
751 {
752 strategy = save_sp_partial_merge;
753 strategy_size = this_strategy_size;
754 }
755 }
756
757 /* Consider alternative save_a0_merge only if we don't need a
fa483857 758 frame pointer, size is nonzero and the user hasn't
b166356e 759 changed the calling conventions of a0. */
760 if (! frame_pointer_needed && size
761 && call_used_regs[FIRST_ADDRESS_REGNUM]
762 && ! fixed_regs[FIRST_ADDRESS_REGNUM])
763 {
764 /* Insn: add -(size + 4 * num_regs_to_save), sp. */
765 this_strategy_size = SIZE_ADD_SP (-(size + 4 * num_regs_to_save));
766 /* Insn: mov sp, a0. */
767 this_strategy_size++;
768 if (size)
769 {
770 /* Insn: add size, a0. */
771 this_strategy_size += SIZE_ADD_AX (size);
772 }
773 /* Insn: fmov fs#, (a0+), for each fs# to be saved. */
774 this_strategy_size += 3 * num_regs_to_save;
775
776 if (this_strategy_size < strategy_size)
777 {
778 strategy = save_a0_merge;
779 strategy_size = this_strategy_size;
780 }
781 }
782
783 /* Consider alternative save_a0_no_merge if the user hasn't
09e5ce26 784 changed the calling conventions of a0. */
b166356e 785 if (call_used_regs[FIRST_ADDRESS_REGNUM]
786 && ! fixed_regs[FIRST_ADDRESS_REGNUM])
787 {
788 /* Insn: add -4 * num_regs_to_save, sp. */
789 this_strategy_size = SIZE_ADD_SP (-4 * num_regs_to_save);
790 /* Insn: mov sp, a0. */
791 this_strategy_size++;
792 /* Insn: fmov fs#, (a0+), for each fs# to be saved. */
793 this_strategy_size += 3 * num_regs_to_save;
794 if (size)
795 {
796 /* Insn: add -size, sp. */
797 this_strategy_size += SIZE_ADD_SP (-size);
798 }
799
800 if (this_strategy_size < strategy_size)
801 {
802 strategy = save_a0_no_merge;
803 strategy_size = this_strategy_size;
804 }
805 }
806
807 /* Emit the initial SP add, common to all strategies. */
808 switch (strategy)
809 {
810 case save_sp_no_merge:
811 case save_a0_no_merge:
812 emit_insn (gen_addsi3 (stack_pointer_rtx,
813 stack_pointer_rtx,
814 GEN_INT (-4 * num_regs_to_save)));
815 xsize = 0;
816 break;
817
818 case save_sp_partial_merge:
819 emit_insn (gen_addsi3 (stack_pointer_rtx,
820 stack_pointer_rtx,
821 GEN_INT (-128)));
822 xsize = 128 - 4 * num_regs_to_save;
823 size -= xsize;
824 break;
825
826 case save_sp_merge:
827 case save_a0_merge:
828 emit_insn (gen_addsi3 (stack_pointer_rtx,
829 stack_pointer_rtx,
830 GEN_INT (-(size + 4 * num_regs_to_save))));
831 /* We'll have to adjust FP register saves according to the
09e5ce26 832 frame size. */
b166356e 833 xsize = size;
834 /* Since we've already created the stack frame, don't do it
09e5ce26 835 again at the end of the function. */
b166356e 836 size = 0;
837 break;
838
839 default:
840 abort ();
841 }
842
843 /* Now prepare register a0, if we have decided to use it. */
844 switch (strategy)
845 {
846 case save_sp_merge:
847 case save_sp_no_merge:
848 case save_sp_partial_merge:
849 reg = 0;
850 break;
851
852 case save_a0_merge:
853 case save_a0_no_merge:
854 reg = gen_rtx_REG (SImode, FIRST_ADDRESS_REGNUM);
855 emit_insn (gen_movsi (reg, stack_pointer_rtx));
856 if (xsize)
857 emit_insn (gen_addsi3 (reg, reg, GEN_INT (xsize)));
858 reg = gen_rtx_POST_INC (SImode, reg);
859 break;
860
861 default:
862 abort ();
863 }
864
865 /* Now actually save the FP registers. */
866 for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
867 if (regs_ever_live[i] && ! call_used_regs[i])
868 {
869 rtx addr;
870
871 if (reg)
872 addr = reg;
873 else
874 {
875 /* If we aren't using `a0', use an SP offset. */
876 if (xsize)
877 {
878 addr = gen_rtx_PLUS (SImode,
879 stack_pointer_rtx,
880 GEN_INT (xsize));
881 }
882 else
883 addr = stack_pointer_rtx;
884
885 xsize += 4;
886 }
887
888 insn = emit_insn (gen_movsi (gen_rtx_MEM (SImode, addr),
889 gen_rtx_REG (SImode, i)));
890
891 RTX_FRAME_RELATED_P (insn) = 1;
892 }
893 }
894
48cb86e3 895 /* Now put the frame pointer into the frame pointer register. */
29a404f9 896 if (frame_pointer_needed)
014546df 897 emit_move_insn (frame_pointer_rtx, stack_pointer_rtx);
29a404f9 898
48cb86e3 899 /* Allocate stack for this frame. */
29a404f9 900 if (size)
901 emit_insn (gen_addsi3 (stack_pointer_rtx,
902 stack_pointer_rtx,
903 GEN_INT (-size)));
b87a151a 904 if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
905 {
906 rtx insn = get_last_insn ();
907 rtx last = emit_insn (gen_GOTaddr2picreg ());
908
909 /* Mark these insns as possibly dead. Sometimes, flow2 may
910 delete all uses of the PIC register. In this case, let it
911 delete the initialization too. */
912 do
913 {
914 insn = NEXT_INSN (insn);
915
916 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
917 const0_rtx,
918 REG_NOTES (insn));
919 }
920 while (insn != last);
921 }
29a404f9 922}
923
924void
3285410a 925expand_epilogue (void)
29a404f9 926{
e3f95b40 927 HOST_WIDE_INT size;
f1899bff 928
f1899bff 929 /* SIZE includes the fixed stack space needed for function calls. */
36ed4406 930 size = get_frame_size () + current_function_outgoing_args_size;
931 size += (current_function_outgoing_args_size ? 4 : 0);
29a404f9 932
b166356e 933 if (TARGET_AM33_2 && fp_regs_to_save ())
934 {
935 int num_regs_to_save = fp_regs_to_save (), i;
936 rtx reg = 0;
937
938 /* We have several options to restore FP registers. We could
939 load them from SP offsets, but, if there are enough FP
940 registers to restore, we win if we use a post-increment
941 addressing mode. */
942
943 /* If we have a frame pointer, it's the best option, because we
944 already know it has the value we want. */
945 if (frame_pointer_needed)
946 reg = gen_rtx_REG (SImode, FRAME_POINTER_REGNUM);
947 /* Otherwise, we may use `a1', since it's call-clobbered and
948 it's never used for return values. But only do so if it's
949 smaller than using SP offsets. */
950 else
951 {
952 enum { restore_sp_post_adjust,
953 restore_sp_pre_adjust,
954 restore_sp_partial_adjust,
955 restore_a1 } strategy;
956 unsigned int this_strategy_size, strategy_size = (unsigned)-1;
957
958 /* Consider using sp offsets before adjusting sp. */
959 /* Insn: fmov (##,sp),fs#, for each fs# to be restored. */
960 this_strategy_size = SIZE_FMOV_SP (size, num_regs_to_save);
961 /* If size is too large, we'll have to adjust SP with an
962 add. */
963 if (size + 4 * num_regs_to_save + REG_SAVE_BYTES > 255)
964 {
965 /* Insn: add size + 4 * num_regs_to_save, sp. */
966 this_strategy_size += SIZE_ADD_SP (size + 4 * num_regs_to_save);
967 }
968 /* If we don't have to restore any non-FP registers,
969 we'll be able to save one byte by using rets. */
970 if (! REG_SAVE_BYTES)
971 this_strategy_size--;
972
973 if (this_strategy_size < strategy_size)
974 {
975 strategy = restore_sp_post_adjust;
976 strategy_size = this_strategy_size;
977 }
978
979 /* Consider using sp offsets after adjusting sp. */
980 /* Insn: add size, sp. */
981 this_strategy_size = SIZE_ADD_SP (size);
982 /* Insn: fmov (##,sp),fs#, for each fs# to be restored. */
983 this_strategy_size += SIZE_FMOV_SP (0, num_regs_to_save);
984 /* We're going to use ret to release the FP registers
09e5ce26 985 save area, so, no savings. */
b166356e 986
987 if (this_strategy_size < strategy_size)
988 {
989 strategy = restore_sp_pre_adjust;
990 strategy_size = this_strategy_size;
991 }
992
993 /* Consider using sp offsets after partially adjusting sp.
994 When size is close to 32Kb, we may be able to adjust SP
995 with an imm16 add instruction while still using fmov
996 (d8,sp). */
997 if (size + 4 * num_regs_to_save + REG_SAVE_BYTES > 255)
998 {
999 /* Insn: add size + 4 * num_regs_to_save
1000 + REG_SAVE_BYTES - 252,sp. */
1001 this_strategy_size = SIZE_ADD_SP (size + 4 * num_regs_to_save
1002 + REG_SAVE_BYTES - 252);
1003 /* Insn: fmov (##,sp),fs#, fo each fs# to be restored. */
1004 this_strategy_size += SIZE_FMOV_SP (252 - REG_SAVE_BYTES
1005 - 4 * num_regs_to_save,
1006 num_regs_to_save);
1007 /* We're going to use ret to release the FP registers
09e5ce26 1008 save area, so, no savings. */
b166356e 1009
1010 if (this_strategy_size < strategy_size)
1011 {
1012 strategy = restore_sp_partial_adjust;
1013 strategy_size = this_strategy_size;
1014 }
1015 }
1016
1017 /* Consider using a1 in post-increment mode, as long as the
1018 user hasn't changed the calling conventions of a1. */
1019 if (call_used_regs[FIRST_ADDRESS_REGNUM+1]
1020 && ! fixed_regs[FIRST_ADDRESS_REGNUM+1])
1021 {
1022 /* Insn: mov sp,a1. */
1023 this_strategy_size = 1;
1024 if (size)
1025 {
1026 /* Insn: add size,a1. */
1027 this_strategy_size += SIZE_ADD_AX (size);
1028 }
1029 /* Insn: fmov (a1+),fs#, for each fs# to be restored. */
1030 this_strategy_size += 3 * num_regs_to_save;
1031 /* If size is large enough, we may be able to save a
1032 couple of bytes. */
1033 if (size + 4 * num_regs_to_save + REG_SAVE_BYTES > 255)
1034 {
1035 /* Insn: mov a1,sp. */
1036 this_strategy_size += 2;
1037 }
1038 /* If we don't have to restore any non-FP registers,
1039 we'll be able to save one byte by using rets. */
1040 if (! REG_SAVE_BYTES)
1041 this_strategy_size--;
1042
1043 if (this_strategy_size < strategy_size)
1044 {
1045 strategy = restore_a1;
1046 strategy_size = this_strategy_size;
1047 }
1048 }
1049
1050 switch (strategy)
1051 {
1052 case restore_sp_post_adjust:
1053 break;
1054
1055 case restore_sp_pre_adjust:
1056 emit_insn (gen_addsi3 (stack_pointer_rtx,
1057 stack_pointer_rtx,
1058 GEN_INT (size)));
1059 size = 0;
1060 break;
1061
1062 case restore_sp_partial_adjust:
1063 emit_insn (gen_addsi3 (stack_pointer_rtx,
1064 stack_pointer_rtx,
1065 GEN_INT (size + 4 * num_regs_to_save
1066 + REG_SAVE_BYTES - 252)));
1067 size = 252 - REG_SAVE_BYTES - 4 * num_regs_to_save;
1068 break;
1069
1070 case restore_a1:
1071 reg = gen_rtx_REG (SImode, FIRST_ADDRESS_REGNUM + 1);
1072 emit_insn (gen_movsi (reg, stack_pointer_rtx));
1073 if (size)
1074 emit_insn (gen_addsi3 (reg, reg, GEN_INT (size)));
1075 break;
1076
1077 default:
1078 abort ();
1079 }
1080 }
1081
1082 /* Adjust the selected register, if any, for post-increment. */
1083 if (reg)
1084 reg = gen_rtx_POST_INC (SImode, reg);
1085
1086 for (i = FIRST_FP_REGNUM; i <= LAST_FP_REGNUM; ++i)
1087 if (regs_ever_live[i] && ! call_used_regs[i])
1088 {
1089 rtx addr;
1090
1091 if (reg)
1092 addr = reg;
1093 else if (size)
1094 {
1095 /* If we aren't using a post-increment register, use an
09e5ce26 1096 SP offset. */
b166356e 1097 addr = gen_rtx_PLUS (SImode,
1098 stack_pointer_rtx,
1099 GEN_INT (size));
1100 }
1101 else
1102 addr = stack_pointer_rtx;
1103
1104 size += 4;
1105
1106 emit_insn (gen_movsi (gen_rtx_REG (SImode, i),
1107 gen_rtx_MEM (SImode, addr)));
1108 }
1109
1110 /* If we were using the restore_a1 strategy and the number of
1111 bytes to be released won't fit in the `ret' byte, copy `a1'
1112 to `sp', to avoid having to use `add' to adjust it. */
1113 if (! frame_pointer_needed && reg && size + REG_SAVE_BYTES > 255)
1114 {
1115 emit_move_insn (stack_pointer_rtx, XEXP (reg, 0));
1116 size = 0;
1117 }
1118 }
1119
461cabcc 1120 /* Maybe cut back the stack, except for the register save area.
1121
1122 If the frame pointer exists, then use the frame pointer to
1123 cut back the stack.
1124
1125 If the stack size + register save area is more than 255 bytes,
1126 then the stack must be cut back here since the size + register
1127 save size is too big for a ret/retf instruction.
1128
1129 Else leave it alone, it will be cut back as part of the
1130 ret/retf instruction, or there wasn't any stack to begin with.
1131
dfd1079d 1132 Under no circumstances should the register save area be
461cabcc 1133 deallocated here, that would leave a window where an interrupt
1134 could occur and trash the register save area. */
29a404f9 1135 if (frame_pointer_needed)
1136 {
29a404f9 1137 emit_move_insn (stack_pointer_rtx, frame_pointer_rtx);
b21218d6 1138 size = 0;
1139 }
55daf463 1140 else if (size + REG_SAVE_BYTES > 255)
b21218d6 1141 {
1142 emit_insn (gen_addsi3 (stack_pointer_rtx,
1143 stack_pointer_rtx,
1144 GEN_INT (size)));
1145 size = 0;
29a404f9 1146 }
29a404f9 1147
55daf463 1148 /* Adjust the stack and restore callee-saved registers, if any. */
1149 if (size || regs_ever_live[2] || regs_ever_live[3]
48cb86e3 1150 || regs_ever_live[6] || regs_ever_live[7]
911517ac 1151 || regs_ever_live[14] || regs_ever_live[15]
1152 || regs_ever_live[16] || regs_ever_live[17]
48cb86e3 1153 || frame_pointer_needed)
55daf463 1154 emit_jump_insn (gen_return_internal_regs
1155 (GEN_INT (size + REG_SAVE_BYTES)));
48cb86e3 1156 else
55daf463 1157 emit_jump_insn (gen_return_internal ());
29a404f9 1158}
1159
1160/* Update the condition code from the insn. */
1161
1162void
3285410a 1163notice_update_cc (rtx body, rtx insn)
29a404f9 1164{
29a404f9 1165 switch (get_attr_cc (insn))
1166 {
1167 case CC_NONE:
1168 /* Insn does not affect CC at all. */
1169 break;
1170
1171 case CC_NONE_0HIT:
1172 /* Insn does not change CC, but the 0'th operand has been changed. */
1173 if (cc_status.value1 != 0
ed420a25 1174 && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value1))
29a404f9 1175 cc_status.value1 = 0;
1176 break;
1177
14058057 1178 case CC_SET_ZN:
ed420a25 1179 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
14058057 1180 V,C are unusable. */
29a404f9 1181 CC_STATUS_INIT;
14058057 1182 cc_status.flags |= CC_NO_CARRY | CC_OVERFLOW_UNUSABLE;
ed420a25 1183 cc_status.value1 = recog_data.operand[0];
29a404f9 1184 break;
1185
14058057 1186 case CC_SET_ZNV:
ed420a25 1187 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
14058057 1188 C is unusable. */
45e3d109 1189 CC_STATUS_INIT;
14058057 1190 cc_status.flags |= CC_NO_CARRY;
ed420a25 1191 cc_status.value1 = recog_data.operand[0];
45e3d109 1192 break;
1193
29a404f9 1194 case CC_COMPARE:
1195 /* The insn is a compare instruction. */
1196 CC_STATUS_INIT;
1197 cc_status.value1 = SET_SRC (body);
b166356e 1198 if (GET_CODE (cc_status.value1) == COMPARE
1199 && GET_MODE (XEXP (cc_status.value1, 0)) == SFmode)
1200 cc_status.mdep.fpCC = 1;
29a404f9 1201 break;
1202
952e42d8 1203 case CC_INVERT:
1204 /* The insn is a compare instruction. */
1205 CC_STATUS_INIT;
1206 cc_status.value1 = SET_SRC (body);
1207 cc_status.flags |= CC_INVERTED;
1208 break;
1209
29a404f9 1210 case CC_CLOBBER:
1211 /* Insn doesn't leave CC in a usable state. */
1212 CC_STATUS_INIT;
1213 break;
45e3d109 1214
1215 default:
1216 abort ();
29a404f9 1217 }
29a404f9 1218}
1219
a2f10574 1220/* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
4caa3669 1221 This function is for MATCH_PARALLEL and so assumes OP is known to be
1222 parallel. If OP is a multiple store, return a mask indicating which
1223 registers it saves. Return 0 otherwise. */
1224
1225int
3285410a 1226store_multiple_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4caa3669 1227{
1228 int count;
1229 int mask;
1230 int i;
1231 unsigned int last;
1232 rtx elt;
1233
1234 count = XVECLEN (op, 0);
1235 if (count < 2)
1236 return 0;
1237
1238 /* Check that first instruction has the form (set (sp) (plus A B)) */
1239 elt = XVECEXP (op, 0, 0);
1240 if (GET_CODE (elt) != SET
1241 || GET_CODE (SET_DEST (elt)) != REG
1242 || REGNO (SET_DEST (elt)) != STACK_POINTER_REGNUM
1243 || GET_CODE (SET_SRC (elt)) != PLUS)
1244 return 0;
1245
1246 /* Check that A is the stack pointer and B is the expected stack size.
1247 For OP to match, each subsequent instruction should push a word onto
1248 the stack. We therefore expect the first instruction to create
09e5ce26 1249 COUNT-1 stack slots. */
4caa3669 1250 elt = SET_SRC (elt);
1251 if (GET_CODE (XEXP (elt, 0)) != REG
1252 || REGNO (XEXP (elt, 0)) != STACK_POINTER_REGNUM
1253 || GET_CODE (XEXP (elt, 1)) != CONST_INT
1254 || INTVAL (XEXP (elt, 1)) != -(count - 1) * 4)
1255 return 0;
1256
1257 /* Now go through the rest of the vector elements. They must be
1258 ordered so that the first instruction stores the highest-numbered
1259 register to the highest stack slot and that subsequent instructions
1260 store a lower-numbered register to the slot below.
1261
1262 LAST keeps track of the smallest-numbered register stored so far.
09e5ce26 1263 MASK is the set of stored registers. */
b166356e 1264 last = LAST_EXTENDED_REGNUM + 1;
4caa3669 1265 mask = 0;
1266 for (i = 1; i < count; i++)
1267 {
09e5ce26 1268 /* Check that element i is a (set (mem M) R) and that R is valid. */
4caa3669 1269 elt = XVECEXP (op, 0, i);
1270 if (GET_CODE (elt) != SET
1271 || GET_CODE (SET_DEST (elt)) != MEM
1272 || GET_CODE (SET_SRC (elt)) != REG
1273 || REGNO (SET_SRC (elt)) >= last)
1274 return 0;
1275
1276 /* R was OK, so provisionally add it to MASK. We return 0 in any
09e5ce26 1277 case if the rest of the instruction has a flaw. */
4caa3669 1278 last = REGNO (SET_SRC (elt));
1279 mask |= (1 << last);
1280
1281 /* Check that M has the form (plus (sp) (const_int -I*4)) */
1282 elt = XEXP (SET_DEST (elt), 0);
1283 if (GET_CODE (elt) != PLUS
1284 || GET_CODE (XEXP (elt, 0)) != REG
1285 || REGNO (XEXP (elt, 0)) != STACK_POINTER_REGNUM
1286 || GET_CODE (XEXP (elt, 1)) != CONST_INT
1287 || INTVAL (XEXP (elt, 1)) != -i * 4)
1288 return 0;
1289 }
1290
09e5ce26 1291 /* All or none of the callee-saved extended registers must be in the set. */
4caa3669 1292 if ((mask & 0x3c000) != 0
1293 && (mask & 0x3c000) != 0x3c000)
1294 return 0;
1295
1296 return mask;
1297}
1298
29a404f9 1299/* Return true if OP is a valid call operand. */
1300
1301int
3285410a 1302call_address_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
29a404f9 1303{
b87a151a 1304 if (flag_pic)
1305 return (EXTRA_CONSTRAINT (op, 'S') || GET_CODE (op) == REG);
1306
29a404f9 1307 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == REG);
1308}
1309
1310/* What (if any) secondary registers are needed to move IN with mode
dc3d02df 1311 MODE into a register in register class CLASS.
29a404f9 1312
1313 We might be able to simplify this. */
1314enum reg_class
3285410a 1315secondary_reload_class (enum reg_class class, enum machine_mode mode, rtx in)
29a404f9 1316{
29a404f9 1317 /* Memory loads less than a full word wide can't have an
1318 address or stack pointer destination. They must use
1319 a data register as an intermediate register. */
79ea832f 1320 if ((GET_CODE (in) == MEM
1321 || (GET_CODE (in) == REG
1322 && REGNO (in) >= FIRST_PSEUDO_REGISTER)
1323 || (GET_CODE (in) == SUBREG
1324 && GET_CODE (SUBREG_REG (in)) == REG
1325 && REGNO (SUBREG_REG (in)) >= FIRST_PSEUDO_REGISTER))
29a404f9 1326 && (mode == QImode || mode == HImode)
79ea832f 1327 && (class == ADDRESS_REGS || class == SP_REGS
b0ba03a6 1328 || class == SP_OR_ADDRESS_REGS))
8ecf154e 1329 {
911517ac 1330 if (TARGET_AM33)
1331 return DATA_OR_EXTENDED_REGS;
8ecf154e 1332 return DATA_REGS;
1333 }
29a404f9 1334
1335 /* We can't directly load sp + const_int into a data register;
1336 we must use an address register as an intermediate. */
48cb86e3 1337 if (class != SP_REGS
1338 && class != ADDRESS_REGS
1339 && class != SP_OR_ADDRESS_REGS
911517ac 1340 && class != SP_OR_EXTENDED_REGS
1341 && class != ADDRESS_OR_EXTENDED_REGS
1342 && class != SP_OR_ADDRESS_OR_EXTENDED_REGS
29a404f9 1343 && (in == stack_pointer_rtx
1344 || (GET_CODE (in) == PLUS
48cb86e3 1345 && (XEXP (in, 0) == stack_pointer_rtx
1346 || XEXP (in, 1) == stack_pointer_rtx))))
29a404f9 1347 return ADDRESS_REGS;
1348
19de5de1 1349 if (GET_CODE (in) == PLUS
1350 && (XEXP (in, 0) == stack_pointer_rtx
1351 || XEXP (in, 1) == stack_pointer_rtx))
8ecf154e 1352 {
911517ac 1353 if (TARGET_AM33)
1354 return DATA_OR_EXTENDED_REGS;
8ecf154e 1355 return DATA_REGS;
1356 }
19de5de1 1357
b166356e 1358 if (TARGET_AM33_2 && class == FP_REGS
1359 && GET_CODE (in) == MEM && ! OK_FOR_Q (in))
1360 {
1361 if (TARGET_AM33)
1362 return DATA_OR_EXTENDED_REGS;
1363 return DATA_REGS;
1364 }
1365
48cb86e3 1366 /* Otherwise assume no secondary reloads are needed. */
1367 return NO_REGS;
1368}
1369
1370int
3285410a 1371initial_offset (int from, int to)
48cb86e3 1372{
f1899bff 1373 /* The difference between the argument pointer and the frame pointer
1374 is the size of the callee register save area. */
48cb86e3 1375 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
29a404f9 1376 {
48cb86e3 1377 if (regs_ever_live[2] || regs_ever_live[3]
1378 || regs_ever_live[6] || regs_ever_live[7]
911517ac 1379 || regs_ever_live[14] || regs_ever_live[15]
1380 || regs_ever_live[16] || regs_ever_live[17]
b166356e 1381 || fp_regs_to_save ()
48cb86e3 1382 || frame_pointer_needed)
b166356e 1383 return REG_SAVE_BYTES
1384 + 4 * fp_regs_to_save ();
48cb86e3 1385 else
bb4959a8 1386 return 0;
29a404f9 1387 }
1388
f1899bff 1389 /* The difference between the argument pointer and the stack pointer is
1390 the sum of the size of this function's frame, the callee register save
1391 area, and the fixed stack space needed for function calls (if any). */
48cb86e3 1392 if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1393 {
1394 if (regs_ever_live[2] || regs_ever_live[3]
1395 || regs_ever_live[6] || regs_ever_live[7]
911517ac 1396 || regs_ever_live[14] || regs_ever_live[15]
1397 || regs_ever_live[16] || regs_ever_live[17]
b166356e 1398 || fp_regs_to_save ()
48cb86e3 1399 || frame_pointer_needed)
8ecf154e 1400 return (get_frame_size () + REG_SAVE_BYTES
b166356e 1401 + 4 * fp_regs_to_save ()
36ed4406 1402 + (current_function_outgoing_args_size
1403 ? current_function_outgoing_args_size + 4 : 0));
48cb86e3 1404 else
36ed4406 1405 return (get_frame_size ()
1406 + (current_function_outgoing_args_size
1407 ? current_function_outgoing_args_size + 4 : 0));
48cb86e3 1408 }
29a404f9 1409
f1899bff 1410 /* The difference between the frame pointer and stack pointer is the sum
1411 of the size of this function's frame and the fixed stack space needed
1412 for function calls (if any). */
48cb86e3 1413 if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
36ed4406 1414 return (get_frame_size ()
1415 + (current_function_outgoing_args_size
1416 ? current_function_outgoing_args_size + 4 : 0));
48cb86e3 1417
1418 abort ();
29a404f9 1419}
bb4959a8 1420
f2d49d02 1421static bool
1422mn10300_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
1423{
1424 /* Return values > 8 bytes in length in memory. */
1425 return int_size_in_bytes (type) > 8 || TYPE_MODE (type) == BLKmode;
1426}
1427
bb4959a8 1428/* Flush the argument registers to the stack for a stdarg function;
1429 return the new argument pointer. */
f2d49d02 1430static rtx
3285410a 1431mn10300_builtin_saveregs (void)
bb4959a8 1432{
ed554036 1433 rtx offset, mem;
bb4959a8 1434 tree fntype = TREE_TYPE (current_function_decl);
1435 int argadj = ((!(TYPE_ARG_TYPES (fntype) != 0
1436 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
1437 != void_type_node)))
1438 ? UNITS_PER_WORD : 0);
ed554036 1439 int set = get_varargs_alias_set ();
bb4959a8 1440
1441 if (argadj)
1442 offset = plus_constant (current_function_arg_offset_rtx, argadj);
1443 else
1444 offset = current_function_arg_offset_rtx;
1445
ed554036 1446 mem = gen_rtx_MEM (SImode, current_function_internal_arg_pointer);
ab6ab77e 1447 set_mem_alias_set (mem, set);
ed554036 1448 emit_move_insn (mem, gen_rtx_REG (SImode, 0));
1449
1450 mem = gen_rtx_MEM (SImode,
1451 plus_constant (current_function_internal_arg_pointer, 4));
ab6ab77e 1452 set_mem_alias_set (mem, set);
ed554036 1453 emit_move_insn (mem, gen_rtx_REG (SImode, 1));
1454
bb4959a8 1455 return copy_to_reg (expand_binop (Pmode, add_optab,
1456 current_function_internal_arg_pointer,
1457 offset, 0, 0, OPTAB_LIB_WIDEN));
1458}
1459
ed554036 1460void
3285410a 1461mn10300_va_start (tree valist, rtx nextarg)
ed554036 1462{
7ccc713a 1463 nextarg = expand_builtin_saveregs ();
7df226a2 1464 std_expand_builtin_va_start (valist, nextarg);
ed554036 1465}
1466
1467rtx
3285410a 1468mn10300_va_arg (tree valist, tree type)
ed554036 1469{
1470 HOST_WIDE_INT align, rsize;
1471 tree t, ptr, pptr;
1472
1473 /* Compute the rounded size of the type. */
1474 align = PARM_BOUNDARY / BITS_PER_UNIT;
1475 rsize = (((int_size_in_bytes (type) + align - 1) / align) * align);
1476
1477 t = build (POSTINCREMENT_EXPR, TREE_TYPE (valist), valist,
1478 build_int_2 ((rsize > 8 ? 4 : rsize), 0));
1479 TREE_SIDE_EFFECTS (t) = 1;
1480
1481 ptr = build_pointer_type (type);
1482
1483 /* "Large" types are passed by reference. */
1484 if (rsize > 8)
1485 {
1486 pptr = build_pointer_type (ptr);
1487 t = build1 (NOP_EXPR, pptr, t);
1488 TREE_SIDE_EFFECTS (t) = 1;
1489
1490 t = build1 (INDIRECT_REF, ptr, t);
1491 TREE_SIDE_EFFECTS (t) = 1;
1492 }
1493 else
1494 {
1495 t = build1 (NOP_EXPR, ptr, t);
1496 TREE_SIDE_EFFECTS (t) = 1;
1497 }
1498
1499 /* Calculate! */
1500 return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
1501}
1502
bb4959a8 1503/* Return an RTX to represent where a value with mode MODE will be returned
1504 from a function. If the result is 0, the argument is pushed. */
1505
1506rtx
3285410a 1507function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1508 tree type, int named ATTRIBUTE_UNUSED)
bb4959a8 1509{
1510 rtx result = 0;
1511 int size, align;
1512
1513 /* We only support using 2 data registers as argument registers. */
1514 int nregs = 2;
1515
1516 /* Figure out the size of the object to be passed. */
1517 if (mode == BLKmode)
1518 size = int_size_in_bytes (type);
1519 else
1520 size = GET_MODE_SIZE (mode);
1521
1522 /* Figure out the alignment of the object to be passed. */
1523 align = size;
1524
1525 cum->nbytes = (cum->nbytes + 3) & ~3;
1526
1527 /* Don't pass this arg via a register if all the argument registers
1528 are used up. */
1529 if (cum->nbytes > nregs * UNITS_PER_WORD)
1530 return 0;
1531
1532 /* Don't pass this arg via a register if it would be split between
1533 registers and memory. */
1534 if (type == NULL_TREE
1535 && cum->nbytes + size > nregs * UNITS_PER_WORD)
1536 return 0;
1537
1538 switch (cum->nbytes / UNITS_PER_WORD)
1539 {
1540 case 0:
7014838c 1541 result = gen_rtx_REG (mode, 0);
bb4959a8 1542 break;
1543 case 1:
7014838c 1544 result = gen_rtx_REG (mode, 1);
bb4959a8 1545 break;
1546 default:
1547 result = 0;
1548 }
1549
1550 return result;
1551}
1552
1553/* Return the number of registers to use for an argument passed partially
1554 in registers and partially in memory. */
1555
1556int
3285410a 1557function_arg_partial_nregs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1558 tree type, int named ATTRIBUTE_UNUSED)
bb4959a8 1559{
1560 int size, align;
1561
1562 /* We only support using 2 data registers as argument registers. */
1563 int nregs = 2;
1564
1565 /* Figure out the size of the object to be passed. */
1566 if (mode == BLKmode)
1567 size = int_size_in_bytes (type);
1568 else
1569 size = GET_MODE_SIZE (mode);
1570
1571 /* Figure out the alignment of the object to be passed. */
1572 align = size;
1573
1574 cum->nbytes = (cum->nbytes + 3) & ~3;
1575
1576 /* Don't pass this arg via a register if all the argument registers
1577 are used up. */
1578 if (cum->nbytes > nregs * UNITS_PER_WORD)
1579 return 0;
1580
1581 if (cum->nbytes + size <= nregs * UNITS_PER_WORD)
1582 return 0;
1583
1584 /* Don't pass this arg via a register if it would be split between
1585 registers and memory. */
1586 if (type == NULL_TREE
1587 && cum->nbytes + size > nregs * UNITS_PER_WORD)
1588 return 0;
1589
1590 return (nregs * UNITS_PER_WORD - cum->nbytes) / UNITS_PER_WORD;
1591}
1592
1593/* Output a tst insn. */
feb9af9f 1594const char *
3285410a 1595output_tst (rtx operand, rtx insn)
bb4959a8 1596{
bb4959a8 1597 rtx temp;
1598 int past_call = 0;
1599
1600 /* We can save a byte if we can find a register which has the value
1601 zero in it. */
1602 temp = PREV_INSN (insn);
6e90c6cd 1603 while (optimize && temp)
bb4959a8 1604 {
1605 rtx set;
1606
1607 /* We allow the search to go through call insns. We record
1608 the fact that we've past a CALL_INSN and reject matches which
1609 use call clobbered registers. */
1610 if (GET_CODE (temp) == CODE_LABEL
1611 || GET_CODE (temp) == JUMP_INSN
1612 || GET_CODE (temp) == BARRIER)
1613 break;
1614
1615 if (GET_CODE (temp) == CALL_INSN)
1616 past_call = 1;
1617
1618 if (GET_CODE (temp) == NOTE)
1619 {
1620 temp = PREV_INSN (temp);
1621 continue;
1622 }
1623
09e5ce26 1624 /* It must be an insn, see if it is a simple set. */
bb4959a8 1625 set = single_set (temp);
1626 if (!set)
1627 {
1628 temp = PREV_INSN (temp);
1629 continue;
1630 }
1631
1632 /* Are we setting a data register to zero (this does not win for
1633 address registers)?
1634
1635 If it's a call clobbered register, have we past a call?
1636
1637 Make sure the register we find isn't the same as ourself;
8ecf154e 1638 the mn10300 can't encode that.
1639
1640 ??? reg_set_between_p return nonzero anytime we pass a CALL_INSN
1641 so the code to detect calls here isn't doing anything useful. */
bb4959a8 1642 if (REG_P (SET_DEST (set))
1643 && SET_SRC (set) == CONST0_RTX (GET_MODE (SET_DEST (set)))
1644 && !reg_set_between_p (SET_DEST (set), temp, insn)
6e90c6cd 1645 && (REGNO_REG_CLASS (REGNO (SET_DEST (set)))
1646 == REGNO_REG_CLASS (REGNO (operand)))
911517ac 1647 && REGNO_REG_CLASS (REGNO (SET_DEST (set))) != EXTENDED_REGS
1648 && REGNO (SET_DEST (set)) != REGNO (operand)
1649 && (!past_call
1650 || !call_used_regs[REGNO (SET_DEST (set))]))
1651 {
1652 rtx xoperands[2];
1653 xoperands[0] = operand;
1654 xoperands[1] = SET_DEST (set);
1655
1656 output_asm_insn ("cmp %1,%0", xoperands);
1657 return "";
1658 }
1659
1660 if (REGNO_REG_CLASS (REGNO (operand)) == EXTENDED_REGS
1661 && REG_P (SET_DEST (set))
1662 && SET_SRC (set) == CONST0_RTX (GET_MODE (SET_DEST (set)))
1663 && !reg_set_between_p (SET_DEST (set), temp, insn)
1664 && (REGNO_REG_CLASS (REGNO (SET_DEST (set)))
1665 != REGNO_REG_CLASS (REGNO (operand)))
1666 && REGNO_REG_CLASS (REGNO (SET_DEST (set))) == EXTENDED_REGS
bb4959a8 1667 && REGNO (SET_DEST (set)) != REGNO (operand)
1668 && (!past_call
1669 || !call_used_regs[REGNO (SET_DEST (set))]))
1670 {
1671 rtx xoperands[2];
1672 xoperands[0] = operand;
1673 xoperands[1] = SET_DEST (set);
1674
1675 output_asm_insn ("cmp %1,%0", xoperands);
1676 return "";
1677 }
1678 temp = PREV_INSN (temp);
1679 }
1680 return "cmp 0,%0";
1681}
36ed4406 1682
1683int
3285410a 1684impossible_plus_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
36ed4406 1685{
36ed4406 1686 if (GET_CODE (op) != PLUS)
1687 return 0;
1688
19de5de1 1689 if (XEXP (op, 0) == stack_pointer_rtx
1690 || XEXP (op, 1) == stack_pointer_rtx)
36ed4406 1691 return 1;
1692
36ed4406 1693 return 0;
1694}
c4cd8f6a 1695
9d3b5b5e 1696/* Return 1 if X is a CONST_INT that is only 8 bits wide. This is used
1697 for the btst insn which may examine memory or a register (the memory
1698 variant only allows an unsigned 8 bit integer). */
1699int
3285410a 1700const_8bit_operand (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
9d3b5b5e 1701{
1702 return (GET_CODE (op) == CONST_INT
1703 && INTVAL (op) >= 0
1704 && INTVAL (op) < 256);
1705}
1706
b166356e 1707/* Return true if the operand is the 1.0f constant. */
1708int
3285410a 1709const_1f_operand (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
b166356e 1710{
1711 return (op == CONST1_RTX (SFmode));
1712}
1713
9d3b5b5e 1714/* Similarly, but when using a zero_extract pattern for a btst where
1715 the source operand might end up in memory. */
1716int
3285410a 1717mask_ok_for_mem_btst (int len, int bit)
9d3b5b5e 1718{
805e22b2 1719 unsigned int mask = 0;
9d3b5b5e 1720
1721 while (len > 0)
1722 {
1723 mask |= (1 << bit);
1724 bit++;
1725 len--;
1726 }
1727
1728 /* MASK must bit into an 8bit value. */
1729 return (((mask & 0xff) == mask)
1730 || ((mask & 0xff00) == mask)
1731 || ((mask & 0xff0000) == mask)
1732 || ((mask & 0xff000000) == mask));
1733}
1734
c4cd8f6a 1735/* Return 1 if X contains a symbolic expression. We know these
1736 expressions will have one of a few well defined forms, so
1737 we need only check those forms. */
1738int
3285410a 1739symbolic_operand (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
c4cd8f6a 1740{
1741 switch (GET_CODE (op))
1742 {
1743 case SYMBOL_REF:
1744 case LABEL_REF:
1745 return 1;
1746 case CONST:
1747 op = XEXP (op, 0);
1748 return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
1749 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
1750 && GET_CODE (XEXP (op, 1)) == CONST_INT);
1751 default:
1752 return 0;
1753 }
1754}
1755
1756/* Try machine dependent ways of modifying an illegitimate address
1757 to be legitimate. If we find one, return the new valid address.
1758 This macro is used in only one place: `memory_address' in explow.c.
1759
1760 OLDX is the address as it was before break_out_memory_refs was called.
1761 In some cases it is useful to look at this to decide what needs to be done.
1762
1763 MODE and WIN are passed so that this macro can use
1764 GO_IF_LEGITIMATE_ADDRESS.
1765
1766 Normally it is always safe for this macro to do nothing. It exists to
1767 recognize opportunities to optimize the output.
1768
1769 But on a few ports with segmented architectures and indexed addressing
1770 (mn10300, hppa) it is used to rewrite certain problematical addresses. */
1771rtx
3285410a 1772legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
1773 enum machine_mode mode ATTRIBUTE_UNUSED)
c4cd8f6a 1774{
b87a151a 1775 if (flag_pic && ! legitimate_pic_operand_p (x))
1776 x = legitimize_pic_address (oldx, NULL_RTX);
1777
c4cd8f6a 1778 /* Uh-oh. We might have an address for x[n-100000]. This needs
1779 special handling to avoid creating an indexed memory address
1780 with x-100000 as the base. */
1781 if (GET_CODE (x) == PLUS
1782 && symbolic_operand (XEXP (x, 1), VOIDmode))
1783 {
1784 /* Ugly. We modify things here so that the address offset specified
1785 by the index expression is computed first, then added to x to form
1786 the entire address. */
1787
59086782 1788 rtx regx1, regy1, regy2, y;
c4cd8f6a 1789
1790 /* Strip off any CONST. */
1791 y = XEXP (x, 1);
1792 if (GET_CODE (y) == CONST)
1793 y = XEXP (y, 0);
1794
c927a8ab 1795 if (GET_CODE (y) == PLUS || GET_CODE (y) == MINUS)
1796 {
1797 regx1 = force_reg (Pmode, force_operand (XEXP (x, 0), 0));
1798 regy1 = force_reg (Pmode, force_operand (XEXP (y, 0), 0));
1799 regy2 = force_reg (Pmode, force_operand (XEXP (y, 1), 0));
1800 regx1 = force_reg (Pmode,
1801 gen_rtx (GET_CODE (y), Pmode, regx1, regy2));
7014838c 1802 return force_reg (Pmode, gen_rtx_PLUS (Pmode, regx1, regy1));
c927a8ab 1803 }
c4cd8f6a 1804 }
11b4605c 1805 return x;
c4cd8f6a 1806}
e2aead91 1807
b87a151a 1808/* Convert a non-PIC address in `orig' to a PIC address using @GOT or
09e5ce26 1809 @GOTOFF in `reg'. */
b87a151a 1810rtx
3285410a 1811legitimize_pic_address (rtx orig, rtx reg)
b87a151a 1812{
1813 if (GET_CODE (orig) == LABEL_REF
1814 || (GET_CODE (orig) == SYMBOL_REF
1815 && (CONSTANT_POOL_ADDRESS_P (orig)
1816 || ! MN10300_GLOBAL_P (orig))))
1817 {
1818 if (reg == 0)
1819 reg = gen_reg_rtx (Pmode);
1820
1821 emit_insn (gen_symGOTOFF2reg (reg, orig));
1822 return reg;
1823 }
1824 else if (GET_CODE (orig) == SYMBOL_REF)
1825 {
1826 if (reg == 0)
1827 reg = gen_reg_rtx (Pmode);
1828
1829 emit_insn (gen_symGOT2reg (reg, orig));
1830 return reg;
1831 }
1832 return orig;
1833}
1834
1835/* Return zero if X references a SYMBOL_REF or LABEL_REF whose symbol
fa483857 1836 isn't protected by a PIC unspec; nonzero otherwise. */
b87a151a 1837int
3285410a 1838legitimate_pic_operand_p (rtx x)
b87a151a 1839{
1840 register const char *fmt;
1841 register int i;
1842
1843 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1844 return 0;
1845
1846 if (GET_CODE (x) == UNSPEC
1847 && (XINT (x, 1) == UNSPEC_PIC
1848 || XINT (x, 1) == UNSPEC_GOT
1849 || XINT (x, 1) == UNSPEC_GOTOFF
1850 || XINT (x, 1) == UNSPEC_PLT))
1851 return 1;
1852
1853 if (GET_CODE (x) == QUEUED)
1854 return legitimate_pic_operand_p (QUEUED_VAR (x));
1855
1856 fmt = GET_RTX_FORMAT (GET_CODE (x));
1857 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
1858 {
1859 if (fmt[i] == 'E')
1860 {
1861 register int j;
1862
1863 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1864 if (! legitimate_pic_operand_p (XVECEXP (x, i, j)))
1865 return 0;
1866 }
1867 else if (fmt[i] == 'e' && ! legitimate_pic_operand_p (XEXP (x, i)))
1868 return 0;
1869 }
1870
1871 return 1;
1872}
1873
ec0457a8 1874static int
3285410a 1875mn10300_address_cost_1 (rtx x, int *unsig)
e2aead91 1876{
e2aead91 1877 switch (GET_CODE (x))
1878 {
1879 case REG:
1880 switch (REGNO_REG_CLASS (REGNO (x)))
1881 {
1882 case SP_REGS:
1883 *unsig = 1;
1884 return 0;
1885
1886 case ADDRESS_REGS:
1887 return 1;
1888
1889 case DATA_REGS:
1890 case EXTENDED_REGS:
b166356e 1891 case FP_REGS:
e2aead91 1892 return 3;
1893
1894 case NO_REGS:
1895 return 5;
1896
1897 default:
1898 abort ();
1899 }
1900
1901 case PLUS:
1902 case MINUS:
cbe23f2f 1903 case ASHIFT:
1904 case AND:
e2aead91 1905 case IOR:
ec0457a8 1906 return (mn10300_address_cost_1 (XEXP (x, 0), unsig)
1907 + mn10300_address_cost_1 (XEXP (x, 1), unsig));
e2aead91 1908
1909 case EXPR_LIST:
1910 case SUBREG:
1911 case MEM:
ec0457a8 1912 return mn10300_address_cost (XEXP (x, 0));
e2aead91 1913
1914 case ZERO_EXTEND:
1915 *unsig = 1;
ec0457a8 1916 return mn10300_address_cost_1 (XEXP (x, 0), unsig);
e2aead91 1917
1918 case CONST_INT:
1919 if (INTVAL (x) == 0)
1920 return 0;
1921 if (INTVAL (x) + (*unsig ? 0 : 0x80) < 0x100)
1922 return 1;
1923 if (INTVAL (x) + (*unsig ? 0 : 0x8000) < 0x10000)
1924 return 3;
1925 if (INTVAL (x) + (*unsig ? 0 : 0x800000) < 0x1000000)
1926 return 5;
1927 return 7;
1928
1929 case CONST:
1930 case SYMBOL_REF:
cbe23f2f 1931 case LABEL_REF:
e2aead91 1932 return 8;
1933
1934 case ADDRESSOF:
1935 switch (GET_CODE (XEXP (x, 0)))
1936 {
1937 case MEM:
ec0457a8 1938 return mn10300_address_cost (XEXP (x, 0));
e2aead91 1939
1940 case REG:
1941 return 1;
1942
1943 default:
1944 abort ();
1945 }
1946
1947 default:
1948 abort ();
1949
1950 }
1951}
fab7adbf 1952
ec0457a8 1953static int
3285410a 1954mn10300_address_cost (rtx x)
ec0457a8 1955{
1956 int s = 0;
1957 return mn10300_address_cost_1 (x, &s);
1958}
1959
fab7adbf 1960static bool
3285410a 1961mn10300_rtx_costs (rtx x, int code, int outer_code, int *total)
fab7adbf 1962{
1963 switch (code)
1964 {
1965 case CONST_INT:
1966 /* Zeros are extremely cheap. */
1967 if (INTVAL (x) == 0 && outer_code == SET)
1968 *total = 0;
1969 /* If it fits in 8 bits, then it's still relatively cheap. */
1970 else if (INT_8_BITS (INTVAL (x)))
1971 *total = 1;
1972 /* This is the "base" cost, includes constants where either the
1973 upper or lower 16bits are all zeros. */
1974 else if (INT_16_BITS (INTVAL (x))
1975 || (INTVAL (x) & 0xffff) == 0
1976 || (INTVAL (x) & 0xffff0000) == 0)
1977 *total = 2;
1978 else
1979 *total = 4;
1980 return true;
1981
1982 case CONST:
1983 case LABEL_REF:
1984 case SYMBOL_REF:
1985 /* These are more costly than a CONST_INT, but we can relax them,
1986 so they're less costly than a CONST_DOUBLE. */
1987 *total = 6;
1988 return true;
1989
1990 case CONST_DOUBLE:
1991 /* We don't optimize CONST_DOUBLEs well nor do we relax them well,
1992 so their cost is very high. */
1993 *total = 8;
1994 return true;
1995
1996 /* ??? This probably needs more work. */
1997 case MOD:
1998 case DIV:
1999 case MULT:
2000 *total = 8;
2001 return true;
2002
2003 default:
2004 return false;
2005 }
2006}
8935d57c 2007
2008/* Check whether a constant used to initialize a DImode or DFmode can
2009 use a clr instruction. The code here must be kept in sync with
2010 movdf and movdi. */
2011
2012bool
3285410a 2013mn10300_wide_const_load_uses_clr (rtx operands[2])
8935d57c 2014{
2015 long val[2];
2016
2017 if (GET_CODE (operands[0]) != REG
2018 || REGNO_REG_CLASS (REGNO (operands[0])) != DATA_REGS)
2019 return false;
2020
2021 switch (GET_CODE (operands[1]))
2022 {
2023 case CONST_INT:
2024 {
2025 rtx low, high;
2026 split_double (operands[1], &low, &high);
2027 val[0] = INTVAL (low);
2028 val[1] = INTVAL (high);
2029 }
2030 break;
2031
2032 case CONST_DOUBLE:
2033 if (GET_MODE (operands[1]) == DFmode)
2034 {
2035 REAL_VALUE_TYPE rv;
2036
2037 REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
2038 REAL_VALUE_TO_TARGET_DOUBLE (rv, val);
2039 }
2040 else if (GET_MODE (operands[1]) == VOIDmode
2041 || GET_MODE (operands[1]) == DImode)
2042 {
2043 val[0] = CONST_DOUBLE_LOW (operands[1]);
2044 val[1] = CONST_DOUBLE_HIGH (operands[1]);
2045 }
2046 break;
2047
2048 default:
2049 return false;
2050 }
2051
2052 return val[0] == 0 || val[1] == 0;
2053}
b87a151a 2054/* If using PIC, mark a SYMBOL_REF for a non-global symbol so that we
2055 may access it using GOTOFF instead of GOT. */
2056
2057static void
48ed5fc2 2058mn10300_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
b87a151a 2059{
2060 rtx symbol;
2061
2062 if (GET_CODE (rtl) != MEM)
2063 return;
2064 symbol = XEXP (rtl, 0);
2065 if (GET_CODE (symbol) != SYMBOL_REF)
2066 return;
2067
2068 if (flag_pic)
2069 SYMBOL_REF_FLAG (symbol) = (*targetm.binds_local_p) (decl);
2070}