OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [config/] [mn10300/] [mn10300.c] - Blame information for rev 12

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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