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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [config/] [h8300/] [h8300.c] - Blame information for rev 826

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 282 jeremybenn
/* Subroutines for insn-output.c for Renesas H8/300.
2
   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3
   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
   Contributed by Steve Chamberlain (sac@cygnus.com),
6
   Jim Wilson (wilson@cygnus.com), and Doug Evans (dje@cygnus.com).
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify
11
it under the terms of the GNU General Public License as published by
12
the Free Software Foundation; either version 3, or (at your option)
13
any later version.
14
 
15
GCC is distributed in the hope that it will be useful,
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
GNU General Public License for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING3.  If not see
22
<http://www.gnu.org/licenses/>.  */
23
 
24
#include "config.h"
25
#include "system.h"
26
#include "coretypes.h"
27
#include "tm.h"
28
#include "rtl.h"
29
#include "tree.h"
30
#include "regs.h"
31
#include "hard-reg-set.h"
32
#include "real.h"
33
#include "insn-config.h"
34
#include "conditions.h"
35
#include "output.h"
36
#include "insn-attr.h"
37
#include "flags.h"
38
#include "recog.h"
39
#include "expr.h"
40
#include "function.h"
41
#include "optabs.h"
42
#include "toplev.h"
43
#include "c-pragma.h"
44
#include "tm_p.h"
45
#include "ggc.h"
46
#include "target.h"
47
#include "target-def.h"
48
 
49
/* Classifies a h8300_src_operand or h8300_dst_operand.
50
 
51
   H8OP_IMMEDIATE
52
        A constant operand of some sort.
53
 
54
   H8OP_REGISTER
55
        An ordinary register.
56
 
57
   H8OP_MEM_ABSOLUTE
58
        A memory reference with a constant address.
59
 
60
   H8OP_MEM_BASE
61
        A memory reference with a register as its address.
62
 
63
   H8OP_MEM_COMPLEX
64
        Some other kind of memory reference.  */
65
enum h8300_operand_class
66
{
67
  H8OP_IMMEDIATE,
68
  H8OP_REGISTER,
69
  H8OP_MEM_ABSOLUTE,
70
  H8OP_MEM_BASE,
71
  H8OP_MEM_COMPLEX,
72
  NUM_H8OPS
73
};
74
 
75
/* For a general two-operand instruction, element [X][Y] gives
76
   the length of the opcode fields when the first operand has class
77
   (X + 1) and the second has class Y.  */
78
typedef unsigned char h8300_length_table[NUM_H8OPS - 1][NUM_H8OPS];
79
 
80
/* Forward declarations.  */
81
static const char *byte_reg (rtx, int);
82
static int h8300_interrupt_function_p (tree);
83
static int h8300_saveall_function_p (tree);
84
static int h8300_monitor_function_p (tree);
85
static int h8300_os_task_function_p (tree);
86
static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT, bool);
87
static HOST_WIDE_INT round_frame_size (HOST_WIDE_INT);
88
static unsigned int compute_saved_regs (void);
89
static void push (int);
90
static void pop (int);
91
static const char *cond_string (enum rtx_code);
92
static unsigned int h8300_asm_insn_count (const char *);
93
static tree h8300_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
94
static tree h8300_handle_eightbit_data_attribute (tree *, tree, tree, int, bool *);
95
static tree h8300_handle_tiny_data_attribute (tree *, tree, tree, int, bool *);
96
#ifndef OBJECT_FORMAT_ELF
97
static void h8300_asm_named_section (const char *, unsigned int, tree);
98
#endif
99
static int h8300_and_costs (rtx);
100
static int h8300_shift_costs (rtx);
101
static void          h8300_push_pop               (int, int, bool, bool);
102
static int           h8300_stack_offset_p         (rtx, int);
103
static int           h8300_ldm_stm_regno          (rtx, int, int, int);
104
static void          h8300_reorg                  (void);
105
static unsigned int  h8300_constant_length        (rtx);
106
static unsigned int  h8300_displacement_length    (rtx, int);
107
static unsigned int  h8300_classify_operand       (rtx, int, enum h8300_operand_class *);
108
static unsigned int  h8300_length_from_table      (rtx, rtx, const h8300_length_table *);
109
static unsigned int  h8300_unary_length           (rtx);
110
static unsigned int  h8300_short_immediate_length (rtx);
111
static unsigned int  h8300_bitfield_length        (rtx, rtx);
112
static unsigned int  h8300_binary_length          (rtx, const h8300_length_table *);
113
static bool          h8300_short_move_mem_p       (rtx, enum rtx_code);
114
static unsigned int  h8300_move_length            (rtx *, const h8300_length_table *);
115
static bool          h8300_hard_regno_scratch_ok  (unsigned int);
116
 
117
/* CPU_TYPE, says what cpu we're compiling for.  */
118
int cpu_type;
119
 
120
/* True if a #pragma interrupt has been seen for the current function.  */
121
static int pragma_interrupt;
122
 
123
/* True if a #pragma saveall has been seen for the current function.  */
124
static int pragma_saveall;
125
 
126
static const char *const names_big[] =
127
{ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" };
128
 
129
static const char *const names_extended[] =
130
{ "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7" };
131
 
132
static const char *const names_upper_extended[] =
133
{ "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7" };
134
 
135
/* Points to one of the above.  */
136
/* ??? The above could be put in an array indexed by CPU_TYPE.  */
137
const char * const *h8_reg_names;
138
 
139
/* Various operations needed by the following, indexed by CPU_TYPE.  */
140
 
141
const char *h8_push_op, *h8_pop_op, *h8_mov_op;
142
 
143
/* Value of MOVE_RATIO.  */
144
int h8300_move_ratio;
145
 
146
/* See below where shifts are handled for explanation of this enum.  */
147
 
148
enum shift_alg
149
{
150
  SHIFT_INLINE,
151
  SHIFT_ROT_AND,
152
  SHIFT_SPECIAL,
153
  SHIFT_LOOP
154
};
155
 
156
/* Symbols of the various shifts which can be used as indices.  */
157
 
158
enum shift_type
159
{
160
  SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
161
};
162
 
163
/* Macros to keep the shift algorithm tables small.  */
164
#define INL SHIFT_INLINE
165
#define ROT SHIFT_ROT_AND
166
#define LOP SHIFT_LOOP
167
#define SPC SHIFT_SPECIAL
168
 
169
/* The shift algorithms for each machine, mode, shift type, and shift
170
   count are defined below.  The three tables below correspond to
171
   QImode, HImode, and SImode, respectively.  Each table is organized
172
   by, in the order of indices, machine, shift type, and shift count.  */
173
 
174
static enum shift_alg shift_alg_qi[3][3][8] = {
175
  {
176
    /* TARGET_H8300  */
177
    /* 0    1    2    3    4    5    6    7  */
178
    { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
179
    { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
180
    { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
181
  },
182
  {
183
    /* TARGET_H8300H  */
184
    /* 0    1    2    3    4    5    6    7  */
185
    { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
186
    { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
187
    { INL, INL, INL, INL, INL, LOP, LOP, SPC }  /* SHIFT_ASHIFTRT */
188
  },
189
  {
190
    /* TARGET_H8300S  */
191
    /*  0    1    2    3    4    5    6    7  */
192
    { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT   */
193
    { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
194
    { INL, INL, INL, INL, INL, INL, INL, SPC }  /* SHIFT_ASHIFTRT */
195
  }
196
};
197
 
198
static enum shift_alg shift_alg_hi[3][3][16] = {
199
  {
200
    /* TARGET_H8300  */
201
    /*  0    1    2    3    4    5    6    7  */
202
    /*  8    9   10   11   12   13   14   15  */
203
    { INL, INL, INL, INL, INL, INL, INL, SPC,
204
      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
205
    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
206
      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
207
    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
208
      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
209
  },
210
  {
211
    /* TARGET_H8300H  */
212
    /*  0    1    2    3    4    5    6    7  */
213
    /*  8    9   10   11   12   13   14   15  */
214
    { INL, INL, INL, INL, INL, INL, INL, SPC,
215
      SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
216
    { INL, INL, INL, INL, INL, INL, INL, SPC,
217
      SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
218
    { INL, INL, INL, INL, INL, INL, INL, SPC,
219
      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
220
  },
221
  {
222
    /* TARGET_H8300S  */
223
    /*  0    1    2    3    4    5    6    7  */
224
    /*  8    9   10   11   12   13   14   15  */
225
    { INL, INL, INL, INL, INL, INL, INL, INL,
226
      SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
227
    { INL, INL, INL, INL, INL, INL, INL, INL,
228
      SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
229
    { INL, INL, INL, INL, INL, INL, INL, INL,
230
      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
231
  }
232
};
233
 
234
static enum shift_alg shift_alg_si[3][3][32] = {
235
  {
236
    /* TARGET_H8300  */
237
    /*  0    1    2    3    4    5    6    7  */
238
    /*  8    9   10   11   12   13   14   15  */
239
    /* 16   17   18   19   20   21   22   23  */
240
    /* 24   25   26   27   28   29   30   31  */
241
    { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
242
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
243
      SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
244
      SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT   */
245
    { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
246
      SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
247
      SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
248
      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
249
    { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
250
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
251
      SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
252
      SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
253
  },
254
  {
255
    /* TARGET_H8300H  */
256
    /*  0    1    2    3    4    5    6    7  */
257
    /*  8    9   10   11   12   13   14   15  */
258
    /* 16   17   18   19   20   21   22   23  */
259
    /* 24   25   26   27   28   29   30   31  */
260
    { INL, INL, INL, INL, INL, LOP, LOP, LOP,
261
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
262
      SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
263
      SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
264
    { INL, INL, INL, INL, INL, LOP, LOP, LOP,
265
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
266
      SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
267
      SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
268
    { INL, INL, INL, INL, INL, LOP, LOP, LOP,
269
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
270
      SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
271
      SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
272
  },
273
  {
274
    /* TARGET_H8300S  */
275
    /*  0    1    2    3    4    5    6    7  */
276
    /*  8    9   10   11   12   13   14   15  */
277
    /* 16   17   18   19   20   21   22   23  */
278
    /* 24   25   26   27   28   29   30   31  */
279
    { INL, INL, INL, INL, INL, INL, INL, INL,
280
      INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
281
      SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
282
      SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
283
    { INL, INL, INL, INL, INL, INL, INL, INL,
284
      INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
285
      SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
286
      SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
287
    { INL, INL, INL, INL, INL, INL, INL, INL,
288
      INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
289
      SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
290
      SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
291
  }
292
};
293
 
294
#undef INL
295
#undef ROT
296
#undef LOP
297
#undef SPC
298
 
299
enum h8_cpu
300
{
301
  H8_300,
302
  H8_300H,
303
  H8_S
304
};
305
 
306
/* Initialize various cpu specific globals at start up.  */
307
 
308
void
309
h8300_init_once (void)
310
{
311
  static const char *const h8_push_ops[2] = { "push" , "push.l" };
312
  static const char *const h8_pop_ops[2]  = { "pop"  , "pop.l"  };
313
  static const char *const h8_mov_ops[2]  = { "mov.w", "mov.l"  };
314
 
315
  if (TARGET_H8300)
316
    {
317
      cpu_type = (int) CPU_H8300;
318
      h8_reg_names = names_big;
319
    }
320
  else
321
    {
322
      /* For this we treat the H8/300H and H8S the same.  */
323
      cpu_type = (int) CPU_H8300H;
324
      h8_reg_names = names_extended;
325
    }
326
  h8_push_op = h8_push_ops[cpu_type];
327
  h8_pop_op = h8_pop_ops[cpu_type];
328
  h8_mov_op = h8_mov_ops[cpu_type];
329
 
330
  if (!TARGET_H8300S && TARGET_MAC)
331
    {
332
      error ("-ms2600 is used without -ms");
333
      target_flags |= MASK_H8300S_1;
334
    }
335
 
336
  if (TARGET_H8300 && TARGET_NORMAL_MODE)
337
    {
338
      error ("-mn is used without -mh or -ms");
339
      target_flags ^= MASK_NORMAL_MODE;
340
    }
341
 
342
  /* Some of the shifts are optimized for speed by default.
343
     See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
344
     If optimizing for size, change shift_alg for those shift to
345
     SHIFT_LOOP.  */
346
  if (optimize_size)
347
    {
348
      /* H8/300 */
349
      shift_alg_hi[H8_300][SHIFT_ASHIFT][5] = SHIFT_LOOP;
350
      shift_alg_hi[H8_300][SHIFT_ASHIFT][6] = SHIFT_LOOP;
351
      shift_alg_hi[H8_300][SHIFT_ASHIFT][13] = SHIFT_LOOP;
352
      shift_alg_hi[H8_300][SHIFT_ASHIFT][14] = SHIFT_LOOP;
353
 
354
      shift_alg_hi[H8_300][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
355
      shift_alg_hi[H8_300][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
356
 
357
      shift_alg_hi[H8_300][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
358
      shift_alg_hi[H8_300][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
359
 
360
      /* H8/300H */
361
      shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
362
      shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
363
 
364
      shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
365
      shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
366
 
367
      shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
368
      shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
369
      shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
370
      shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
371
 
372
      /* H8S */
373
      shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
374
    }
375
 
376
  /* Work out a value for MOVE_RATIO.  */
377
  if (!TARGET_H8300SX)
378
    {
379
      /* Memory-memory moves are quite expensive without the
380
         h8sx instructions.  */
381
      h8300_move_ratio = 3;
382
    }
383
  else if (flag_omit_frame_pointer)
384
    {
385
      /* movmd sequences are fairly cheap when er6 isn't fixed.  They can
386
         sometimes be as short as two individual memory-to-memory moves,
387
         but since they use all the call-saved registers, it seems better
388
         to allow up to three moves here.  */
389
      h8300_move_ratio = 4;
390
    }
391
  else if (optimize_size)
392
    {
393
      /* In this case we don't use movmd sequences since they tend
394
         to be longer than calls to memcpy().  Memory-to-memory
395
         moves are cheaper than for !TARGET_H8300SX, so it makes
396
         sense to have a slightly higher threshold.  */
397
      h8300_move_ratio = 4;
398
    }
399
  else
400
    {
401
      /* We use movmd sequences for some moves since it can be quicker
402
         than calling memcpy().  The sequences will need to save and
403
         restore er6 though, so bump up the cost.  */
404
      h8300_move_ratio = 6;
405
    }
406
}
407
 
408
/* Implement REG_CLASS_FROM_LETTER.
409
 
410
   Some patterns need to use er6 as a scratch register.  This is
411
   difficult to arrange since er6 is the frame pointer and usually
412
   can't be spilled.
413
 
414
   Such patterns should define two alternatives, one which allows only
415
   er6 and one which allows any general register.  The former alternative
416
   should have a 'd' constraint while the latter should be disparaged and
417
   use 'D'.
418
 
419
   Normally, 'd' maps to DESTINATION_REGS and 'D' maps to GENERAL_REGS.
420
   However, there are cases where they should be NO_REGS:
421
 
422
     - 'd' should be NO_REGS when reloading a function that uses the
423
       frame pointer.  In this case, DESTINATION_REGS won't contain any
424
       spillable registers, so the first alternative can't be used.
425
 
426
     - -fno-omit-frame-pointer means that the frame pointer will
427
       always be in use.  It's therefore better to map 'd' to NO_REGS
428
       before reload so that register allocator will pick the second
429
       alternative.
430
 
431
     - we would like 'D' to be be NO_REGS when the frame pointer isn't
432
       live, but we the frame pointer may turn out to be needed after
433
       we start reload, and then we may have already decided we don't
434
       have a choice, so we can't do that.  Forcing the register
435
       allocator to use er6 if possible might produce better code for
436
       small functions: it's more efficient to save and restore er6 in
437
       the prologue & epilogue than to do it in a define_split.
438
       Hopefully disparaging 'D' will have a similar effect, without
439
       forcing a reload failure if the frame pointer is found to be
440
       needed too late.  */
441
 
442
enum reg_class
443
h8300_reg_class_from_letter (int c)
444
{
445
  switch (c)
446
    {
447
    case 'a':
448
      return MAC_REGS;
449
 
450
    case 'c':
451
      return COUNTER_REGS;
452
 
453
    case 'd':
454
      if (!flag_omit_frame_pointer && !reload_completed)
455
        return NO_REGS;
456
      if (frame_pointer_needed && reload_in_progress)
457
        return NO_REGS;
458
      return DESTINATION_REGS;
459
 
460
    case 'D':
461
      /* The meaning of a constraint shouldn't change dynamically, so
462
         we can't make this NO_REGS.  */
463
      return GENERAL_REGS;
464
 
465
    case 'f':
466
      return SOURCE_REGS;
467
 
468
    default:
469
      return NO_REGS;
470
    }
471
}
472
 
473
/* Return the byte register name for a register rtx X.  B should be 0
474
   if you want a lower byte register.  B should be 1 if you want an
475
   upper byte register.  */
476
 
477
static const char *
478
byte_reg (rtx x, int b)
479
{
480
  static const char *const names_small[] = {
481
    "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
482
    "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
483
  };
484
 
485
  gcc_assert (REG_P (x));
486
 
487
  return names_small[REGNO (x) * 2 + b];
488
}
489
 
490
/* REGNO must be saved/restored across calls if this macro is true.  */
491
 
492
#define WORD_REG_USED(regno)                                            \
493
  (regno < SP_REG                                                       \
494
   /* No need to save registers if this function will not return.  */   \
495
   && ! TREE_THIS_VOLATILE (current_function_decl)                      \
496
   && (h8300_saveall_function_p (current_function_decl)                 \
497
       /* Save any call saved register that was used.  */               \
498
       || (df_regs_ever_live_p (regno) && !call_used_regs[regno])       \
499
       /* Save the frame pointer if it was used.  */                    \
500
       || (regno == HARD_FRAME_POINTER_REGNUM && df_regs_ever_live_p (regno)) \
501
       /* Save any register used in an interrupt handler.  */           \
502
       || (h8300_current_function_interrupt_function_p ()               \
503
           && df_regs_ever_live_p (regno))                              \
504
       /* Save call clobbered registers in non-leaf interrupt           \
505
          handlers.  */                                                 \
506
       || (h8300_current_function_interrupt_function_p ()               \
507
           && call_used_regs[regno]                                     \
508
           && !current_function_is_leaf)))
509
 
510
/* We use this to wrap all emitted insns in the prologue.  */
511
static rtx
512
F (rtx x, bool set_it)
513
{
514
  if (set_it)
515
    RTX_FRAME_RELATED_P (x) = 1;
516
  return x;
517
}
518
 
519
/* Mark all the subexpressions of the PARALLEL rtx PAR as
520
   frame-related.  Return PAR.
521
 
522
   dwarf2out.c:dwarf2out_frame_debug_expr ignores sub-expressions of a
523
   PARALLEL rtx other than the first if they do not have the
524
   FRAME_RELATED flag set on them.  */
525
static rtx
526
Fpa (rtx par)
527
{
528
  int len = XVECLEN (par, 0);
529
  int i;
530
 
531
  for (i = 0; i < len; i++)
532
    F (XVECEXP (par, 0, i), true);
533
 
534
  return par;
535
}
536
 
537
/* Output assembly language to FILE for the operation OP with operand size
538
   SIZE to adjust the stack pointer.  */
539
 
540
static void
541
h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size, bool in_prologue)
542
{
543
  /* If the frame size is 0, we don't have anything to do.  */
544
  if (size == 0)
545
    return;
546
 
547
  /* H8/300 cannot add/subtract a large constant with a single
548
     instruction.  If a temporary register is available, load the
549
     constant to it and then do the addition.  */
550
  if (TARGET_H8300
551
      && size > 4
552
      && !h8300_current_function_interrupt_function_p ()
553
      && !(cfun->static_chain_decl != NULL && sign < 0))
554
    {
555
      rtx r3 = gen_rtx_REG (Pmode, 3);
556
      F (emit_insn (gen_movhi (r3, GEN_INT (sign * size))), in_prologue);
557
      F (emit_insn (gen_addhi3 (stack_pointer_rtx,
558
                                stack_pointer_rtx, r3)), in_prologue);
559
    }
560
  else
561
    {
562
      /* The stack adjustment made here is further optimized by the
563
         splitter.  In case of H8/300, the splitter always splits the
564
         addition emitted here to make the adjustment interrupt-safe.
565
         FIXME: We don't always tag those, because we don't know what
566
         the splitter will do.  */
567
      if (Pmode == HImode)
568
        {
569
          rtx x = emit_insn (gen_addhi3 (stack_pointer_rtx,
570
                                         stack_pointer_rtx, GEN_INT (sign * size)));
571
          if (size < 4)
572
            F (x, in_prologue);
573
        }
574
      else
575
        F (emit_insn (gen_addsi3 (stack_pointer_rtx,
576
                                  stack_pointer_rtx, GEN_INT (sign * size))), in_prologue);
577
    }
578
}
579
 
580
/* Round up frame size SIZE.  */
581
 
582
static HOST_WIDE_INT
583
round_frame_size (HOST_WIDE_INT size)
584
{
585
  return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
586
          & -STACK_BOUNDARY / BITS_PER_UNIT);
587
}
588
 
589
/* Compute which registers to push/pop.
590
   Return a bit vector of registers.  */
591
 
592
static unsigned int
593
compute_saved_regs (void)
594
{
595
  unsigned int saved_regs = 0;
596
  int regno;
597
 
598
  /* Construct a bit vector of registers to be pushed/popped.  */
599
  for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
600
    {
601
      if (WORD_REG_USED (regno))
602
        saved_regs |= 1 << regno;
603
    }
604
 
605
  /* Don't push/pop the frame pointer as it is treated separately.  */
606
  if (frame_pointer_needed)
607
    saved_regs &= ~(1 << HARD_FRAME_POINTER_REGNUM);
608
 
609
  return saved_regs;
610
}
611
 
612
/* Emit an insn to push register RN.  */
613
 
614
static void
615
push (int rn)
616
{
617
  rtx reg = gen_rtx_REG (word_mode, rn);
618
  rtx x;
619
 
620
  if (TARGET_H8300)
621
    x = gen_push_h8300 (reg);
622
  else if (!TARGET_NORMAL_MODE)
623
    x = gen_push_h8300hs_advanced (reg);
624
  else
625
    x = gen_push_h8300hs_normal (reg);
626
  x = F (emit_insn (x), true);
627
  REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
628
}
629
 
630
/* Emit an insn to pop register RN.  */
631
 
632
static void
633
pop (int rn)
634
{
635
  rtx reg = gen_rtx_REG (word_mode, rn);
636
  rtx x;
637
 
638
  if (TARGET_H8300)
639
    x = gen_pop_h8300 (reg);
640
  else if (!TARGET_NORMAL_MODE)
641
    x = gen_pop_h8300hs_advanced (reg);
642
  else
643
    x = gen_pop_h8300hs_normal (reg);
644
  x = emit_insn (x);
645
  REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
646
}
647
 
648
/* Emit an instruction to push or pop NREGS consecutive registers
649
   starting at register REGNO.  POP_P selects a pop rather than a
650
   push and RETURN_P is true if the instruction should return.
651
 
652
   It must be possible to do the requested operation in a single
653
   instruction.  If NREGS == 1 && !RETURN_P, use a normal push
654
   or pop insn.  Otherwise emit a parallel of the form:
655
 
656
     (parallel
657
       [(return)  ;; if RETURN_P
658
        (save or restore REGNO)
659
        (save or restore REGNO + 1)
660
        ...
661
        (save or restore REGNO + NREGS - 1)
662
        (set sp (plus sp (const_int adjust)))]  */
663
 
664
static void
665
h8300_push_pop (int regno, int nregs, bool pop_p, bool return_p)
666
{
667
  int i, j;
668
  rtvec vec;
669
  rtx sp, offset, x;
670
 
671
  /* See whether we can use a simple push or pop.  */
672
  if (!return_p && nregs == 1)
673
    {
674
      if (pop_p)
675
        pop (regno);
676
      else
677
        push (regno);
678
      return;
679
    }
680
 
681
  /* We need one element for the return insn, if present, one for each
682
     register, and one for stack adjustment.  */
683
  vec = rtvec_alloc ((return_p ? 1 : 0) + nregs + 1);
684
  sp = stack_pointer_rtx;
685
  i = 0;
686
 
687
  /* Add the return instruction.  */
688
  if (return_p)
689
    {
690
      RTVEC_ELT (vec, i) = gen_rtx_RETURN (VOIDmode);
691
      i++;
692
    }
693
 
694
  /* Add the register moves.  */
695
  for (j = 0; j < nregs; j++)
696
    {
697
      rtx lhs, rhs;
698
 
699
      if (pop_p)
700
        {
701
          /* Register REGNO + NREGS - 1 is popped first.  Before the
702
             stack adjustment, its slot is at address @sp.  */
703
          lhs = gen_rtx_REG (SImode, regno + j);
704
          rhs = gen_rtx_MEM (SImode, plus_constant (sp, (nregs - j - 1) * 4));
705
        }
706
      else
707
        {
708
          /* Register REGNO is pushed first and will be stored at @(-4,sp).  */
709
          lhs = gen_rtx_MEM (SImode, plus_constant (sp, (j + 1) * -4));
710
          rhs = gen_rtx_REG (SImode, regno + j);
711
        }
712
      RTVEC_ELT (vec, i + j) = gen_rtx_SET (VOIDmode, lhs, rhs);
713
    }
714
 
715
  /* Add the stack adjustment.  */
716
  offset = GEN_INT ((pop_p ? nregs : -nregs) * 4);
717
  RTVEC_ELT (vec, i + j) = gen_rtx_SET (VOIDmode, sp,
718
                                        gen_rtx_PLUS (Pmode, sp, offset));
719
 
720
  x = gen_rtx_PARALLEL (VOIDmode, vec);
721
  if (!pop_p)
722
    x = Fpa (x);
723
 
724
  if (return_p)
725
    emit_jump_insn (x);
726
  else
727
    emit_insn (x);
728
}
729
 
730
/* Return true if X has the value sp + OFFSET.  */
731
 
732
static int
733
h8300_stack_offset_p (rtx x, int offset)
734
{
735
  if (offset == 0)
736
    return x == stack_pointer_rtx;
737
 
738
  return (GET_CODE (x) == PLUS
739
          && XEXP (x, 0) == stack_pointer_rtx
740
          && GET_CODE (XEXP (x, 1)) == CONST_INT
741
          && INTVAL (XEXP (x, 1)) == offset);
742
}
743
 
744
/* A subroutine of h8300_ldm_stm_parallel.  X is one pattern in
745
   something that may be an ldm or stm instruction.  If it fits
746
   the required template, return the register it loads or stores,
747
   otherwise return -1.
748
 
749
   LOAD_P is true if X should be a load, false if it should be a store.
750
   NREGS is the number of registers that the whole instruction is expected
751
   to load or store.  INDEX is the index of the register that X should
752
   load or store, relative to the lowest-numbered register.  */
753
 
754
static int
755
h8300_ldm_stm_regno (rtx x, int load_p, int index, int nregs)
756
{
757
  int regindex, memindex, offset;
758
 
759
  if (load_p)
760
    regindex = 0, memindex = 1, offset = (nregs - index - 1) * 4;
761
  else
762
    memindex = 0, regindex = 1, offset = (index + 1) * -4;
763
 
764
  if (GET_CODE (x) == SET
765
      && GET_CODE (XEXP (x, regindex)) == REG
766
      && GET_CODE (XEXP (x, memindex)) == MEM
767
      && h8300_stack_offset_p (XEXP (XEXP (x, memindex), 0), offset))
768
    return REGNO (XEXP (x, regindex));
769
 
770
  return -1;
771
}
772
 
773
/* Return true if the elements of VEC starting at FIRST describe an
774
   ldm or stm instruction (LOAD_P says which).  */
775
 
776
int
777
h8300_ldm_stm_parallel (rtvec vec, int load_p, int first)
778
{
779
  rtx last;
780
  int nregs, i, regno, adjust;
781
 
782
  /* There must be a stack adjustment, a register move, and at least one
783
     other operation (a return or another register move).  */
784
  if (GET_NUM_ELEM (vec) < 3)
785
    return false;
786
 
787
  /* Get the range of registers to be pushed or popped.  */
788
  nregs = GET_NUM_ELEM (vec) - first - 1;
789
  regno = h8300_ldm_stm_regno (RTVEC_ELT (vec, first), load_p, 0, nregs);
790
 
791
  /* Check that the call to h8300_ldm_stm_regno succeeded and
792
     that we're only dealing with GPRs.  */
793
  if (regno < 0 || regno + nregs > 8)
794
    return false;
795
 
796
  /* 2-register h8s instructions must start with an even-numbered register.
797
     3- and 4-register instructions must start with er0 or er4.  */
798
  if (!TARGET_H8300SX)
799
    {
800
      if ((regno & 1) != 0)
801
        return false;
802
      if (nregs > 2 && (regno & 3) != 0)
803
        return false;
804
    }
805
 
806
  /* Check the other loads or stores.  */
807
  for (i = 1; i < nregs; i++)
808
    if (h8300_ldm_stm_regno (RTVEC_ELT (vec, first + i), load_p, i, nregs)
809
        != regno + i)
810
      return false;
811
 
812
  /* Check the stack adjustment.  */
813
  last = RTVEC_ELT (vec, first + nregs);
814
  adjust = (load_p ? nregs : -nregs) * 4;
815
  return (GET_CODE (last) == SET
816
          && SET_DEST (last) == stack_pointer_rtx
817
          && h8300_stack_offset_p (SET_SRC (last), adjust));
818
}
819
 
820
/* This is what the stack looks like after the prolog of
821
   a function with a frame has been set up:
822
 
823
   <args>
824
   PC
825
   FP                   <- fp
826
   <locals>
827
   <saved registers>    <- sp
828
 
829
   This is what the stack looks like after the prolog of
830
   a function which doesn't have a frame:
831
 
832
   <args>
833
   PC
834
   <locals>
835
   <saved registers>    <- sp
836
*/
837
 
838
/* Generate RTL code for the function prologue.  */
839
 
840
void
841
h8300_expand_prologue (void)
842
{
843
  int regno;
844
  int saved_regs;
845
  int n_regs;
846
 
847
  /* If the current function has the OS_Task attribute set, then
848
     we have a naked prologue.  */
849
  if (h8300_os_task_function_p (current_function_decl))
850
    return;
851
 
852
  if (h8300_monitor_function_p (current_function_decl))
853
    /* My understanding of monitor functions is they act just like
854
       interrupt functions, except the prologue must mask
855
       interrupts.  */
856
    emit_insn (gen_monitor_prologue ());
857
 
858
  if (frame_pointer_needed)
859
    {
860
      /* Push fp.  */
861
      push (HARD_FRAME_POINTER_REGNUM);
862
      F (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx), true);
863
    }
864
 
865
  /* Push the rest of the registers in ascending order.  */
866
  saved_regs = compute_saved_regs ();
867
  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno += n_regs)
868
    {
869
      n_regs = 1;
870
      if (saved_regs & (1 << regno))
871
        {
872
          if (TARGET_H8300S)
873
            {
874
              /* See how many registers we can push at the same time.  */
875
              if ((!TARGET_H8300SX || (regno & 3) == 0)
876
                  && ((saved_regs >> regno) & 0x0f) == 0x0f)
877
                n_regs = 4;
878
 
879
              else if ((!TARGET_H8300SX || (regno & 3) == 0)
880
                       && ((saved_regs >> regno) & 0x07) == 0x07)
881
                n_regs = 3;
882
 
883
              else if ((!TARGET_H8300SX || (regno & 1) == 0)
884
                       && ((saved_regs >> regno) & 0x03) == 0x03)
885
                n_regs = 2;
886
            }
887
 
888
          h8300_push_pop (regno, n_regs, false, false);
889
        }
890
    }
891
 
892
  /* Leave room for locals.  */
893
  h8300_emit_stack_adjustment (-1, round_frame_size (get_frame_size ()), true);
894
}
895
 
896
/* Return nonzero if we can use "rts" for the function currently being
897
   compiled.  */
898
 
899
int
900
h8300_can_use_return_insn_p (void)
901
{
902
  return (reload_completed
903
          && !frame_pointer_needed
904
          && get_frame_size () == 0
905
          && compute_saved_regs () == 0);
906
}
907
 
908
/* Generate RTL code for the function epilogue.  */
909
 
910
void
911
h8300_expand_epilogue (void)
912
{
913
  int regno;
914
  int saved_regs;
915
  int n_regs;
916
  HOST_WIDE_INT frame_size;
917
  bool returned_p;
918
 
919
  if (h8300_os_task_function_p (current_function_decl))
920
    /* OS_Task epilogues are nearly naked -- they just have an
921
       rts instruction.  */
922
    return;
923
 
924
  frame_size = round_frame_size (get_frame_size ());
925
  returned_p = false;
926
 
927
  /* Deallocate locals.  */
928
  h8300_emit_stack_adjustment (1, frame_size, false);
929
 
930
  /* Pop the saved registers in descending order.  */
931
  saved_regs = compute_saved_regs ();
932
  for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno -= n_regs)
933
    {
934
      n_regs = 1;
935
      if (saved_regs & (1 << regno))
936
        {
937
          if (TARGET_H8300S)
938
            {
939
              /* See how many registers we can pop at the same time.  */
940
              if ((TARGET_H8300SX || (regno & 3) == 3)
941
                  && ((saved_regs << 3 >> regno) & 0x0f) == 0x0f)
942
                n_regs = 4;
943
 
944
              else if ((TARGET_H8300SX || (regno & 3) == 2)
945
                       && ((saved_regs << 2 >> regno) & 0x07) == 0x07)
946
                n_regs = 3;
947
 
948
              else if ((TARGET_H8300SX || (regno & 1) == 1)
949
                       && ((saved_regs << 1 >> regno) & 0x03) == 0x03)
950
                n_regs = 2;
951
            }
952
 
953
          /* See if this pop would be the last insn before the return.
954
             If so, use rte/l or rts/l instead of pop or ldm.l.  */
955
          if (TARGET_H8300SX
956
              && !frame_pointer_needed
957
              && frame_size == 0
958
              && (saved_regs & ((1 << (regno - n_regs + 1)) - 1)) == 0)
959
            returned_p = true;
960
 
961
          h8300_push_pop (regno - n_regs + 1, n_regs, true, returned_p);
962
        }
963
    }
964
 
965
  /* Pop frame pointer if we had one.  */
966
  if (frame_pointer_needed)
967
    {
968
      if (TARGET_H8300SX)
969
        returned_p = true;
970
      h8300_push_pop (HARD_FRAME_POINTER_REGNUM, 1, true, returned_p);
971
    }
972
 
973
  if (!returned_p)
974
    emit_jump_insn (gen_rtx_RETURN (VOIDmode));
975
}
976
 
977
/* Return nonzero if the current function is an interrupt
978
   function.  */
979
 
980
int
981
h8300_current_function_interrupt_function_p (void)
982
{
983
  return (h8300_interrupt_function_p (current_function_decl)
984
          || h8300_monitor_function_p (current_function_decl));
985
}
986
 
987
/* Output assembly code for the start of the file.  */
988
 
989
static void
990
h8300_file_start (void)
991
{
992
  default_file_start ();
993
 
994
  if (TARGET_H8300H)
995
    fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
996
  else if (TARGET_H8300SX)
997
    fputs (TARGET_NORMAL_MODE ? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file);
998
  else if (TARGET_H8300S)
999
    fputs (TARGET_NORMAL_MODE ? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file);
1000
}
1001
 
1002
/* Output assembly language code for the end of file.  */
1003
 
1004
static void
1005
h8300_file_end (void)
1006
{
1007
  fputs ("\t.end\n", asm_out_file);
1008
}
1009
 
1010
/* Split an add of a small constant into two adds/subs insns.
1011
 
1012
   If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
1013
   instead of adds/subs.  */
1014
 
1015
void
1016
split_adds_subs (enum machine_mode mode, rtx *operands)
1017
{
1018
  HOST_WIDE_INT val = INTVAL (operands[1]);
1019
  rtx reg = operands[0];
1020
  HOST_WIDE_INT sign = 1;
1021
  HOST_WIDE_INT amount;
1022
  rtx (*gen_add) (rtx, rtx, rtx);
1023
 
1024
  /* Force VAL to be positive so that we do not have to consider the
1025
     sign.  */
1026
  if (val < 0)
1027
    {
1028
      val = -val;
1029
      sign = -1;
1030
    }
1031
 
1032
  switch (mode)
1033
    {
1034
    case HImode:
1035
      gen_add = gen_addhi3;
1036
      break;
1037
 
1038
    case SImode:
1039
      gen_add = gen_addsi3;
1040
      break;
1041
 
1042
    default:
1043
      gcc_unreachable ();
1044
    }
1045
 
1046
  /* Try different amounts in descending order.  */
1047
  for (amount = (TARGET_H8300H || TARGET_H8300S) ? 4 : 2;
1048
       amount > 0;
1049
       amount /= 2)
1050
    {
1051
      for (; val >= amount; val -= amount)
1052
        emit_insn (gen_add (reg, reg, GEN_INT (sign * amount)));
1053
    }
1054
 
1055
  return;
1056
}
1057
 
1058
/* Handle machine specific pragmas for compatibility with existing
1059
   compilers for the H8/300.
1060
 
1061
   pragma saveall generates prologue/epilogue code which saves and
1062
   restores all the registers on function entry.
1063
 
1064
   pragma interrupt saves and restores all registers, and exits with
1065
   an rte instruction rather than an rts.  A pointer to a function
1066
   with this attribute may be safely used in an interrupt vector.  */
1067
 
1068
void
1069
h8300_pr_interrupt (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1070
{
1071
  pragma_interrupt = 1;
1072
}
1073
 
1074
void
1075
h8300_pr_saveall (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1076
{
1077
  pragma_saveall = 1;
1078
}
1079
 
1080
/* If the next function argument with MODE and TYPE is to be passed in
1081
   a register, return a reg RTX for the hard register in which to pass
1082
   the argument.  CUM represents the state after the last argument.
1083
   If the argument is to be pushed, NULL_RTX is returned.  */
1084
 
1085
rtx
1086
function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1087
              tree type, int named)
1088
{
1089
  static const char *const hand_list[] = {
1090
    "__main",
1091
    "__cmpsi2",
1092
    "__divhi3",
1093
    "__modhi3",
1094
    "__udivhi3",
1095
    "__umodhi3",
1096
    "__divsi3",
1097
    "__modsi3",
1098
    "__udivsi3",
1099
    "__umodsi3",
1100
    "__mulhi3",
1101
    "__mulsi3",
1102
    "__reg_memcpy",
1103
    "__reg_memset",
1104
    "__ucmpsi2",
1105
    0,
1106
  };
1107
 
1108
  rtx result = NULL_RTX;
1109
  const char *fname;
1110
  int regpass = 0;
1111
 
1112
  /* Never pass unnamed arguments in registers.  */
1113
  if (!named)
1114
    return NULL_RTX;
1115
 
1116
  /* Pass 3 regs worth of data in regs when user asked on the command line.  */
1117
  if (TARGET_QUICKCALL)
1118
    regpass = 3;
1119
 
1120
  /* If calling hand written assembler, use 4 regs of args.  */
1121
  if (cum->libcall)
1122
    {
1123
      const char * const *p;
1124
 
1125
      fname = XSTR (cum->libcall, 0);
1126
 
1127
      /* See if this libcall is one of the hand coded ones.  */
1128
      for (p = hand_list; *p && strcmp (*p, fname) != 0; p++)
1129
        ;
1130
 
1131
      if (*p)
1132
        regpass = 4;
1133
    }
1134
 
1135
  if (regpass)
1136
    {
1137
      int size;
1138
 
1139
      if (mode == BLKmode)
1140
        size = int_size_in_bytes (type);
1141
      else
1142
        size = GET_MODE_SIZE (mode);
1143
 
1144
      if (size + cum->nbytes <= regpass * UNITS_PER_WORD
1145
          && cum->nbytes / UNITS_PER_WORD <= 3)
1146
        result = gen_rtx_REG (mode, cum->nbytes / UNITS_PER_WORD);
1147
    }
1148
 
1149
  return result;
1150
}
1151
 
1152
/* Compute the cost of an and insn.  */
1153
 
1154
static int
1155
h8300_and_costs (rtx x)
1156
{
1157
  rtx operands[4];
1158
 
1159
  if (GET_MODE (x) == QImode)
1160
    return 1;
1161
 
1162
  if (GET_MODE (x) != HImode
1163
      && GET_MODE (x) != SImode)
1164
    return 100;
1165
 
1166
  operands[0] = NULL;
1167
  operands[1] = XEXP (x, 0);
1168
  operands[2] = XEXP (x, 1);
1169
  operands[3] = x;
1170
  return compute_logical_op_length (GET_MODE (x), operands) / 2;
1171
}
1172
 
1173
/* Compute the cost of a shift insn.  */
1174
 
1175
static int
1176
h8300_shift_costs (rtx x)
1177
{
1178
  rtx operands[4];
1179
 
1180
  if (GET_MODE (x) != QImode
1181
      && GET_MODE (x) != HImode
1182
      && GET_MODE (x) != SImode)
1183
    return 100;
1184
 
1185
  operands[0] = NULL;
1186
  operands[1] = NULL;
1187
  operands[2] = XEXP (x, 1);
1188
  operands[3] = x;
1189
  return compute_a_shift_length (NULL, operands) / 2;
1190
}
1191
 
1192
/* Worker function for TARGET_RTX_COSTS.  */
1193
 
1194
static bool
1195
h8300_rtx_costs (rtx x, int code, int outer_code, int *total, bool speed)
1196
{
1197
  if (TARGET_H8300SX && outer_code == MEM)
1198
    {
1199
      /* Estimate the number of execution states needed to calculate
1200
         the address.  */
1201
      if (register_operand (x, VOIDmode)
1202
          || GET_CODE (x) == POST_INC
1203
          || GET_CODE (x) == POST_DEC
1204
          || CONSTANT_P (x))
1205
        *total = 0;
1206
      else
1207
        *total = COSTS_N_INSNS (1);
1208
      return true;
1209
    }
1210
 
1211
  switch (code)
1212
    {
1213
    case CONST_INT:
1214
      {
1215
        HOST_WIDE_INT n = INTVAL (x);
1216
 
1217
        if (TARGET_H8300SX)
1218
          {
1219
            /* Constant operands need the same number of processor
1220
               states as register operands.  Although we could try to
1221
               use a size-based cost for !speed, the lack of
1222
               of a mode makes the results very unpredictable.  */
1223
            *total = 0;
1224
            return true;
1225
          }
1226
        if (-4 <= n || n <= 4)
1227
          {
1228
            switch ((int) n)
1229
              {
1230
              case 0:
1231
                *total = 0;
1232
                return true;
1233
              case 1:
1234
              case 2:
1235
              case -1:
1236
              case -2:
1237
                *total = 0 + (outer_code == SET);
1238
                return true;
1239
              case 4:
1240
              case -4:
1241
                if (TARGET_H8300H || TARGET_H8300S)
1242
                  *total = 0 + (outer_code == SET);
1243
                else
1244
                  *total = 1;
1245
                return true;
1246
              }
1247
          }
1248
        *total = 1;
1249
        return true;
1250
      }
1251
 
1252
    case CONST:
1253
    case LABEL_REF:
1254
    case SYMBOL_REF:
1255
      if (TARGET_H8300SX)
1256
        {
1257
          /* See comment for CONST_INT.  */
1258
          *total = 0;
1259
          return true;
1260
        }
1261
      *total = 3;
1262
      return true;
1263
 
1264
    case CONST_DOUBLE:
1265
      *total = 20;
1266
      return true;
1267
 
1268
    case COMPARE:
1269
      if (XEXP (x, 1) == const0_rtx)
1270
        *total = 0;
1271
      return false;
1272
 
1273
    case AND:
1274
      if (!h8300_dst_operand (XEXP (x, 0), VOIDmode)
1275
          || !h8300_src_operand (XEXP (x, 1), VOIDmode))
1276
        return false;
1277
      *total = COSTS_N_INSNS (h8300_and_costs (x));
1278
      return true;
1279
 
1280
    /* We say that MOD and DIV are so expensive because otherwise we'll
1281
       generate some really horrible code for division of a power of two.  */
1282
    case MOD:
1283
    case DIV:
1284
    case UMOD:
1285
    case UDIV:
1286
      if (TARGET_H8300SX)
1287
        switch (GET_MODE (x))
1288
          {
1289
          case QImode:
1290
          case HImode:
1291
            *total = COSTS_N_INSNS (!speed ? 4 : 10);
1292
            return false;
1293
 
1294
          case SImode:
1295
            *total = COSTS_N_INSNS (!speed ? 4 : 18);
1296
            return false;
1297
 
1298
          default:
1299
            break;
1300
          }
1301
      *total = COSTS_N_INSNS (12);
1302
      return true;
1303
 
1304
    case MULT:
1305
      if (TARGET_H8300SX)
1306
        switch (GET_MODE (x))
1307
          {
1308
          case QImode:
1309
          case HImode:
1310
            *total = COSTS_N_INSNS (2);
1311
            return false;
1312
 
1313
          case SImode:
1314
            *total = COSTS_N_INSNS (5);
1315
            return false;
1316
 
1317
          default:
1318
            break;
1319
          }
1320
      *total = COSTS_N_INSNS (4);
1321
      return true;
1322
 
1323
    case ASHIFT:
1324
    case ASHIFTRT:
1325
    case LSHIFTRT:
1326
      if (h8sx_binary_shift_operator (x, VOIDmode))
1327
        {
1328
          *total = COSTS_N_INSNS (2);
1329
          return false;
1330
        }
1331
      else if (h8sx_unary_shift_operator (x, VOIDmode))
1332
        {
1333
          *total = COSTS_N_INSNS (1);
1334
          return false;
1335
        }
1336
      *total = COSTS_N_INSNS (h8300_shift_costs (x));
1337
      return true;
1338
 
1339
    case ROTATE:
1340
    case ROTATERT:
1341
      if (GET_MODE (x) == HImode)
1342
        *total = 2;
1343
      else
1344
        *total = 8;
1345
      return true;
1346
 
1347
    default:
1348
      *total = COSTS_N_INSNS (1);
1349
      return false;
1350
    }
1351
}
1352
 
1353
/* Documentation for the machine specific operand escapes:
1354
 
1355
   'E' like s but negative.
1356
   'F' like t but negative.
1357
   'G' constant just the negative
1358
   'R' print operand as a byte:8 address if appropriate, else fall back to
1359
       'X' handling.
1360
   'S' print operand as a long word
1361
   'T' print operand as a word
1362
   'V' find the set bit, and print its number.
1363
   'W' find the clear bit, and print its number.
1364
   'X' print operand as a byte
1365
   'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
1366
       If this operand isn't a register, fall back to 'R' handling.
1367
   'Z' print int & 7.
1368
   'c' print the opcode corresponding to rtl
1369
   'e' first word of 32-bit value - if reg, then least reg. if mem
1370
       then least. if const then most sig word
1371
   'f' second word of 32-bit value - if reg, then biggest reg. if mem
1372
       then +2. if const then least sig word
1373
   'j' print operand as condition code.
1374
   'k' print operand as reverse condition code.
1375
   'm' convert an integer operand to a size suffix (.b, .w or .l)
1376
   'o' print an integer without a leading '#'
1377
   's' print as low byte of 16-bit value
1378
   't' print as high byte of 16-bit value
1379
   'w' print as low byte of 32-bit value
1380
   'x' print as 2nd byte of 32-bit value
1381
   'y' print as 3rd byte of 32-bit value
1382
   'z' print as msb of 32-bit value
1383
*/
1384
 
1385
/* Return assembly language string which identifies a comparison type.  */
1386
 
1387
static const char *
1388
cond_string (enum rtx_code code)
1389
{
1390
  switch (code)
1391
    {
1392
    case NE:
1393
      return "ne";
1394
    case EQ:
1395
      return "eq";
1396
    case GE:
1397
      return "ge";
1398
    case GT:
1399
      return "gt";
1400
    case LE:
1401
      return "le";
1402
    case LT:
1403
      return "lt";
1404
    case GEU:
1405
      return "hs";
1406
    case GTU:
1407
      return "hi";
1408
    case LEU:
1409
      return "ls";
1410
    case LTU:
1411
      return "lo";
1412
    default:
1413
      gcc_unreachable ();
1414
    }
1415
}
1416
 
1417
/* Print operand X using operand code CODE to assembly language output file
1418
   FILE.  */
1419
 
1420
void
1421
print_operand (FILE *file, rtx x, int code)
1422
{
1423
  /* This is used for communication between codes V,W,Z and Y.  */
1424
  static int bitint;
1425
 
1426
  switch (code)
1427
    {
1428
    case 'E':
1429
      switch (GET_CODE (x))
1430
        {
1431
        case REG:
1432
          fprintf (file, "%sl", names_big[REGNO (x)]);
1433
          break;
1434
        case CONST_INT:
1435
          fprintf (file, "#%ld", (-INTVAL (x)) & 0xff);
1436
          break;
1437
        default:
1438
          gcc_unreachable ();
1439
        }
1440
      break;
1441
    case 'F':
1442
      switch (GET_CODE (x))
1443
        {
1444
        case REG:
1445
          fprintf (file, "%sh", names_big[REGNO (x)]);
1446
          break;
1447
        case CONST_INT:
1448
          fprintf (file, "#%ld", ((-INTVAL (x)) & 0xff00) >> 8);
1449
          break;
1450
        default:
1451
          gcc_unreachable ();
1452
        }
1453
      break;
1454
    case 'G':
1455
      gcc_assert (GET_CODE (x) == CONST_INT);
1456
      fprintf (file, "#%ld", 0xff & (-INTVAL (x)));
1457
      break;
1458
    case 'S':
1459
      if (GET_CODE (x) == REG)
1460
        fprintf (file, "%s", names_extended[REGNO (x)]);
1461
      else
1462
        goto def;
1463
      break;
1464
    case 'T':
1465
      if (GET_CODE (x) == REG)
1466
        fprintf (file, "%s", names_big[REGNO (x)]);
1467
      else
1468
        goto def;
1469
      break;
1470
    case 'V':
1471
      bitint = exact_log2 (INTVAL (x) & 0xff);
1472
      gcc_assert (bitint >= 0);
1473
      fprintf (file, "#%d", bitint);
1474
      break;
1475
    case 'W':
1476
      bitint = exact_log2 ((~INTVAL (x)) & 0xff);
1477
      gcc_assert (bitint >= 0);
1478
      fprintf (file, "#%d", bitint);
1479
      break;
1480
    case 'R':
1481
    case 'X':
1482
      if (GET_CODE (x) == REG)
1483
        fprintf (file, "%s", byte_reg (x, 0));
1484
      else
1485
        goto def;
1486
      break;
1487
    case 'Y':
1488
      gcc_assert (bitint >= 0);
1489
      if (GET_CODE (x) == REG)
1490
        fprintf (file, "%s%c", names_big[REGNO (x)], bitint > 7 ? 'h' : 'l');
1491
      else
1492
        print_operand (file, x, 'R');
1493
      bitint = -1;
1494
      break;
1495
    case 'Z':
1496
      bitint = INTVAL (x);
1497
      fprintf (file, "#%d", bitint & 7);
1498
      break;
1499
    case 'c':
1500
      switch (GET_CODE (x))
1501
        {
1502
        case IOR:
1503
          fprintf (file, "or");
1504
          break;
1505
        case XOR:
1506
          fprintf (file, "xor");
1507
          break;
1508
        case AND:
1509
          fprintf (file, "and");
1510
          break;
1511
        default:
1512
          break;
1513
        }
1514
      break;
1515
    case 'e':
1516
      switch (GET_CODE (x))
1517
        {
1518
        case REG:
1519
          if (TARGET_H8300)
1520
            fprintf (file, "%s", names_big[REGNO (x)]);
1521
          else
1522
            fprintf (file, "%s", names_upper_extended[REGNO (x)]);
1523
          break;
1524
        case MEM:
1525
          print_operand (file, x, 0);
1526
          break;
1527
        case CONST_INT:
1528
          fprintf (file, "#%ld", ((INTVAL (x) >> 16) & 0xffff));
1529
          break;
1530
        case CONST_DOUBLE:
1531
          {
1532
            long val;
1533
            REAL_VALUE_TYPE rv;
1534
            REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1535
            REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1536
            fprintf (file, "#%ld", ((val >> 16) & 0xffff));
1537
            break;
1538
          }
1539
        default:
1540
          gcc_unreachable ();
1541
          break;
1542
        }
1543
      break;
1544
    case 'f':
1545
      switch (GET_CODE (x))
1546
        {
1547
        case REG:
1548
          if (TARGET_H8300)
1549
            fprintf (file, "%s", names_big[REGNO (x) + 1]);
1550
          else
1551
            fprintf (file, "%s", names_big[REGNO (x)]);
1552
          break;
1553
        case MEM:
1554
          x = adjust_address (x, HImode, 2);
1555
          print_operand (file, x, 0);
1556
          break;
1557
        case CONST_INT:
1558
          fprintf (file, "#%ld", INTVAL (x) & 0xffff);
1559
          break;
1560
        case CONST_DOUBLE:
1561
          {
1562
            long val;
1563
            REAL_VALUE_TYPE rv;
1564
            REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1565
            REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1566
            fprintf (file, "#%ld", (val & 0xffff));
1567
            break;
1568
          }
1569
        default:
1570
          gcc_unreachable ();
1571
        }
1572
      break;
1573
    case 'j':
1574
      fputs (cond_string (GET_CODE (x)), file);
1575
      break;
1576
    case 'k':
1577
      fputs (cond_string (reverse_condition (GET_CODE (x))), file);
1578
      break;
1579
    case 'm':
1580
      gcc_assert (GET_CODE (x) == CONST_INT);
1581
      switch (INTVAL (x))
1582
        {
1583
        case 1:
1584
          fputs (".b", file);
1585
          break;
1586
 
1587
        case 2:
1588
          fputs (".w", file);
1589
          break;
1590
 
1591
        case 4:
1592
          fputs (".l", file);
1593
          break;
1594
 
1595
        default:
1596
          gcc_unreachable ();
1597
        }
1598
      break;
1599
    case 'o':
1600
      print_operand_address (file, x);
1601
      break;
1602
    case 's':
1603
      if (GET_CODE (x) == CONST_INT)
1604
        fprintf (file, "#%ld", (INTVAL (x)) & 0xff);
1605
      else
1606
        fprintf (file, "%s", byte_reg (x, 0));
1607
      break;
1608
    case 't':
1609
      if (GET_CODE (x) == CONST_INT)
1610
        fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1611
      else
1612
        fprintf (file, "%s", byte_reg (x, 1));
1613
      break;
1614
    case 'w':
1615
      if (GET_CODE (x) == CONST_INT)
1616
        fprintf (file, "#%ld", INTVAL (x) & 0xff);
1617
      else
1618
        fprintf (file, "%s",
1619
                 byte_reg (x, TARGET_H8300 ? 2 : 0));
1620
      break;
1621
    case 'x':
1622
      if (GET_CODE (x) == CONST_INT)
1623
        fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1624
      else
1625
        fprintf (file, "%s",
1626
                 byte_reg (x, TARGET_H8300 ? 3 : 1));
1627
      break;
1628
    case 'y':
1629
      if (GET_CODE (x) == CONST_INT)
1630
        fprintf (file, "#%ld", (INTVAL (x) >> 16) & 0xff);
1631
      else
1632
        fprintf (file, "%s", byte_reg (x, 0));
1633
      break;
1634
    case 'z':
1635
      if (GET_CODE (x) == CONST_INT)
1636
        fprintf (file, "#%ld", (INTVAL (x) >> 24) & 0xff);
1637
      else
1638
        fprintf (file, "%s", byte_reg (x, 1));
1639
      break;
1640
 
1641
    default:
1642
    def:
1643
      switch (GET_CODE (x))
1644
        {
1645
        case REG:
1646
          switch (GET_MODE (x))
1647
            {
1648
            case QImode:
1649
#if 0 /* Is it asm ("mov.b %0,r2l", ...) */
1650
              fprintf (file, "%s", byte_reg (x, 0));
1651
#else /* ... or is it asm ("mov.b %0l,r2l", ...) */
1652
              fprintf (file, "%s", names_big[REGNO (x)]);
1653
#endif
1654
              break;
1655
            case HImode:
1656
              fprintf (file, "%s", names_big[REGNO (x)]);
1657
              break;
1658
            case SImode:
1659
            case SFmode:
1660
              fprintf (file, "%s", names_extended[REGNO (x)]);
1661
              break;
1662
            default:
1663
              gcc_unreachable ();
1664
            }
1665
          break;
1666
 
1667
        case MEM:
1668
          {
1669
            rtx addr = XEXP (x, 0);
1670
 
1671
            fprintf (file, "@");
1672
            output_address (addr);
1673
 
1674
            /* Add a length suffix to constant addresses.  Although this
1675
               is often unnecessary, it helps to avoid ambiguity in the
1676
               syntax of mova.  If we wrote an insn like:
1677
 
1678
                    mova/w.l @(1,@foo.b),er0
1679
 
1680
               then .b would be considered part of the symbol name.
1681
               Adding a length after foo will avoid this.  */
1682
            if (CONSTANT_P (addr))
1683
              switch (code)
1684
                {
1685
                case 'R':
1686
                  /* Used for mov.b and bit operations.  */
1687
                  if (h8300_eightbit_constant_address_p (addr))
1688
                    {
1689
                      fprintf (file, ":8");
1690
                      break;
1691
                    }
1692
 
1693
                  /* Fall through.  We should not get here if we are
1694
                     processing bit operations on H8/300 or H8/300H
1695
                     because 'U' constraint does not allow bit
1696
                     operations on the tiny area on these machines.  */
1697
 
1698
                case 'X':
1699
                case 'T':
1700
                case 'S':
1701
                  if (h8300_constant_length (addr) == 2)
1702
                    fprintf (file, ":16");
1703
                  else
1704
                    fprintf (file, ":32");
1705
                  break;
1706
                default:
1707
                  break;
1708
                }
1709
          }
1710
          break;
1711
 
1712
        case CONST_INT:
1713
        case SYMBOL_REF:
1714
        case CONST:
1715
        case LABEL_REF:
1716
          fprintf (file, "#");
1717
          print_operand_address (file, x);
1718
          break;
1719
        case CONST_DOUBLE:
1720
          {
1721
            long val;
1722
            REAL_VALUE_TYPE rv;
1723
            REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1724
            REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1725
            fprintf (file, "#%ld", val);
1726
            break;
1727
          }
1728
        default:
1729
          break;
1730
        }
1731
    }
1732
}
1733
 
1734
/* Output assembly language output for the address ADDR to FILE.  */
1735
 
1736
void
1737
print_operand_address (FILE *file, rtx addr)
1738
{
1739
  rtx index;
1740
  int size;
1741
 
1742
  switch (GET_CODE (addr))
1743
    {
1744
    case REG:
1745
      fprintf (file, "%s", h8_reg_names[REGNO (addr)]);
1746
      break;
1747
 
1748
    case PRE_DEC:
1749
      fprintf (file, "-%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1750
      break;
1751
 
1752
    case POST_INC:
1753
      fprintf (file, "%s+", h8_reg_names[REGNO (XEXP (addr, 0))]);
1754
      break;
1755
 
1756
    case PRE_INC:
1757
      fprintf (file, "+%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1758
      break;
1759
 
1760
    case POST_DEC:
1761
      fprintf (file, "%s-", h8_reg_names[REGNO (XEXP (addr, 0))]);
1762
      break;
1763
 
1764
    case PLUS:
1765
      fprintf (file, "(");
1766
 
1767
      index = h8300_get_index (XEXP (addr, 0), VOIDmode, &size);
1768
      if (GET_CODE (index) == REG)
1769
        {
1770
          /* reg,foo */
1771
          print_operand_address (file, XEXP (addr, 1));
1772
          fprintf (file, ",");
1773
          switch (size)
1774
            {
1775
            case 0:
1776
              print_operand_address (file, index);
1777
              break;
1778
 
1779
            case 1:
1780
              print_operand (file, index, 'X');
1781
              fputs (".b", file);
1782
              break;
1783
 
1784
            case 2:
1785
              print_operand (file, index, 'T');
1786
              fputs (".w", file);
1787
              break;
1788
 
1789
            case 4:
1790
              print_operand (file, index, 'S');
1791
              fputs (".l", file);
1792
              break;
1793
            }
1794
          /* print_operand_address (file, XEXP (addr, 0)); */
1795
        }
1796
      else
1797
        {
1798
          /* foo+k */
1799
          print_operand_address (file, XEXP (addr, 0));
1800
          fprintf (file, "+");
1801
          print_operand_address (file, XEXP (addr, 1));
1802
        }
1803
      fprintf (file, ")");
1804
      break;
1805
 
1806
    case CONST_INT:
1807
      {
1808
        /* Since the H8/300 only has 16-bit pointers, negative values are also
1809
           those >= 32768.  This happens for example with pointer minus a
1810
           constant.  We don't want to turn (char *p - 2) into
1811
           (char *p + 65534) because loop unrolling can build upon this
1812
           (IE: char *p + 131068).  */
1813
        int n = INTVAL (addr);
1814
        if (TARGET_H8300)
1815
          n = (int) (short) n;
1816
        fprintf (file, "%d", n);
1817
        break;
1818
      }
1819
 
1820
    default:
1821
      output_addr_const (file, addr);
1822
      break;
1823
    }
1824
}
1825
 
1826
/* Output all insn addresses and their sizes into the assembly language
1827
   output file.  This is helpful for debugging whether the length attributes
1828
   in the md file are correct.  This is not meant to be a user selectable
1829
   option.  */
1830
 
1831
void
1832
final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
1833
                    int num_operands ATTRIBUTE_UNUSED)
1834
{
1835
  /* This holds the last insn address.  */
1836
  static int last_insn_address = 0;
1837
 
1838
  const int uid = INSN_UID (insn);
1839
 
1840
  if (TARGET_ADDRESSES)
1841
    {
1842
      fprintf (asm_out_file, "; 0x%x %d\n", INSN_ADDRESSES (uid),
1843
               INSN_ADDRESSES (uid) - last_insn_address);
1844
      last_insn_address = INSN_ADDRESSES (uid);
1845
    }
1846
}
1847
 
1848
/* Prepare for an SI sized move.  */
1849
 
1850
int
1851
h8300_expand_movsi (rtx operands[])
1852
{
1853
  rtx src = operands[1];
1854
  rtx dst = operands[0];
1855
  if (!reload_in_progress && !reload_completed)
1856
    {
1857
      if (!register_operand (dst, GET_MODE (dst)))
1858
        {
1859
          rtx tmp = gen_reg_rtx (GET_MODE (dst));
1860
          emit_move_insn (tmp, src);
1861
          operands[1] = tmp;
1862
        }
1863
    }
1864
  return 0;
1865
}
1866
 
1867
/* Given FROM and TO register numbers, say whether this elimination is allowed.
1868
   Frame pointer elimination is automatically handled.
1869
 
1870
   For the h8300, if frame pointer elimination is being done, we would like to
1871
   convert ap and rp into sp, not fp.
1872
 
1873
   All other eliminations are valid.  */
1874
 
1875
static bool
1876
h8300_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
1877
{
1878
  return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true);
1879
}
1880
 
1881
/* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
1882
   Define the offset between two registers, one to be eliminated, and
1883
   the other its replacement, at the start of a routine.  */
1884
 
1885
int
1886
h8300_initial_elimination_offset (int from, int to)
1887
{
1888
  /* The number of bytes that the return address takes on the stack.  */
1889
  int pc_size = POINTER_SIZE / BITS_PER_UNIT;
1890
 
1891
  /* The number of bytes that the saved frame pointer takes on the stack.  */
1892
  int fp_size = frame_pointer_needed * UNITS_PER_WORD;
1893
 
1894
  /* The number of bytes that the saved registers, excluding the frame
1895
     pointer, take on the stack.  */
1896
  int saved_regs_size = 0;
1897
 
1898
  /* The number of bytes that the locals takes on the stack.  */
1899
  int frame_size = round_frame_size (get_frame_size ());
1900
 
1901
  int regno;
1902
 
1903
  for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
1904
    if (WORD_REG_USED (regno))
1905
      saved_regs_size += UNITS_PER_WORD;
1906
 
1907
  /* Adjust saved_regs_size because the above loop took the frame
1908
     pointer int account.  */
1909
  saved_regs_size -= fp_size;
1910
 
1911
  switch (to)
1912
    {
1913
    case HARD_FRAME_POINTER_REGNUM:
1914
      switch (from)
1915
        {
1916
        case ARG_POINTER_REGNUM:
1917
          return pc_size + fp_size;
1918
        case RETURN_ADDRESS_POINTER_REGNUM:
1919
          return fp_size;
1920
        case FRAME_POINTER_REGNUM:
1921
          return -saved_regs_size;
1922
        default:
1923
          gcc_unreachable ();
1924
        }
1925
      break;
1926
    case STACK_POINTER_REGNUM:
1927
      switch (from)
1928
        {
1929
        case ARG_POINTER_REGNUM:
1930
          return pc_size + saved_regs_size + frame_size;
1931
        case RETURN_ADDRESS_POINTER_REGNUM:
1932
          return saved_regs_size + frame_size;
1933
        case FRAME_POINTER_REGNUM:
1934
          return frame_size;
1935
        default:
1936
          gcc_unreachable ();
1937
        }
1938
      break;
1939
    default:
1940
      gcc_unreachable ();
1941
    }
1942
  gcc_unreachable ();
1943
}
1944
 
1945
/* Worker function for RETURN_ADDR_RTX.  */
1946
 
1947
rtx
1948
h8300_return_addr_rtx (int count, rtx frame)
1949
{
1950
  rtx ret;
1951
 
1952
  if (count == 0)
1953
    ret = gen_rtx_MEM (Pmode,
1954
                       gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM));
1955
  else if (flag_omit_frame_pointer)
1956
    return (rtx) 0;
1957
  else
1958
    ret = gen_rtx_MEM (Pmode,
1959
                       memory_address (Pmode,
1960
                                       plus_constant (frame, UNITS_PER_WORD)));
1961
  set_mem_alias_set (ret, get_frame_alias_set ());
1962
  return ret;
1963
}
1964
 
1965
/* Update the condition code from the insn.  */
1966
 
1967
void
1968
notice_update_cc (rtx body, rtx insn)
1969
{
1970
  rtx set;
1971
 
1972
  switch (get_attr_cc (insn))
1973
    {
1974
    case CC_NONE:
1975
      /* Insn does not affect CC at all.  */
1976
      break;
1977
 
1978
    case CC_NONE_0HIT:
1979
      /* Insn does not change CC, but the 0'th operand has been changed.  */
1980
      if (cc_status.value1 != 0
1981
          && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value1))
1982
        cc_status.value1 = 0;
1983
      if (cc_status.value2 != 0
1984
          && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value2))
1985
        cc_status.value2 = 0;
1986
      break;
1987
 
1988
    case CC_SET_ZN:
1989
      /* Insn sets the Z,N flags of CC to recog_data.operand[0].
1990
         The V flag is unusable.  The C flag may or may not be known but
1991
         that's ok because alter_cond will change tests to use EQ/NE.  */
1992
      CC_STATUS_INIT;
1993
      cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY;
1994
      set = single_set (insn);
1995
      cc_status.value1 = SET_SRC (set);
1996
      if (SET_DEST (set) != cc0_rtx)
1997
        cc_status.value2 = SET_DEST (set);
1998
      break;
1999
 
2000
    case CC_SET_ZNV:
2001
      /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
2002
         The C flag may or may not be known but that's ok because
2003
         alter_cond will change tests to use EQ/NE.  */
2004
      CC_STATUS_INIT;
2005
      cc_status.flags |= CC_NO_CARRY;
2006
      set = single_set (insn);
2007
      cc_status.value1 = SET_SRC (set);
2008
      if (SET_DEST (set) != cc0_rtx)
2009
        {
2010
          /* If the destination is STRICT_LOW_PART, strip off
2011
             STRICT_LOW_PART.  */
2012
          if (GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
2013
            cc_status.value2 = XEXP (SET_DEST (set), 0);
2014
          else
2015
            cc_status.value2 = SET_DEST (set);
2016
        }
2017
      break;
2018
 
2019
    case CC_COMPARE:
2020
      /* The insn is a compare instruction.  */
2021
      CC_STATUS_INIT;
2022
      cc_status.value1 = SET_SRC (body);
2023
      break;
2024
 
2025
    case CC_CLOBBER:
2026
      /* Insn doesn't leave CC in a usable state.  */
2027
      CC_STATUS_INIT;
2028
      break;
2029
    }
2030
}
2031
 
2032
/* Given that X occurs in an address of the form (plus X constant),
2033
   return the part of X that is expected to be a register.  There are
2034
   four kinds of addressing mode to recognize:
2035
 
2036
        @(dd,Rn)
2037
        @(dd,RnL.b)
2038
        @(dd,Rn.w)
2039
        @(dd,ERn.l)
2040
 
2041
   If SIZE is nonnull, and the address is one of the last three forms,
2042
   set *SIZE to the index multiplication factor.  Set it to 0 for
2043
   plain @(dd,Rn) addresses.
2044
 
2045
   MODE is the mode of the value being accessed.  It can be VOIDmode
2046
   if the address is known to be valid, but its mode is unknown.  */
2047
 
2048
rtx
2049
h8300_get_index (rtx x, enum machine_mode mode, int *size)
2050
{
2051
  int dummy, factor;
2052
 
2053
  if (size == 0)
2054
    size = &dummy;
2055
 
2056
  factor = (mode == VOIDmode ? 0 : GET_MODE_SIZE (mode));
2057
  if (TARGET_H8300SX
2058
      && factor <= 4
2059
      && (mode == VOIDmode
2060
          || GET_MODE_CLASS (mode) == MODE_INT
2061
          || GET_MODE_CLASS (mode) == MODE_FLOAT))
2062
    {
2063
      if (factor <= 1 && GET_CODE (x) == ZERO_EXTEND)
2064
        {
2065
          /* When accessing byte-sized values, the index can be
2066
             a zero-extended QImode or HImode register.  */
2067
          *size = GET_MODE_SIZE (GET_MODE (XEXP (x, 0)));
2068
          return XEXP (x, 0);
2069
        }
2070
      else
2071
        {
2072
          /* We're looking for addresses of the form:
2073
 
2074
                 (mult X I)
2075
              or (mult (zero_extend X) I)
2076
 
2077
             where I is the size of the operand being accessed.
2078
             The canonical form of the second expression is:
2079
 
2080
                 (and (mult (subreg X) I) J)
2081
 
2082
             where J == GET_MODE_MASK (GET_MODE (X)) * I.  */
2083
          rtx index;
2084
 
2085
          if (GET_CODE (x) == AND
2086
              && GET_CODE (XEXP (x, 1)) == CONST_INT
2087
              && (factor == 0
2088
                  || INTVAL (XEXP (x, 1)) == 0xff * factor
2089
                  || INTVAL (XEXP (x, 1)) == 0xffff * factor))
2090
            {
2091
              index = XEXP (x, 0);
2092
              *size = (INTVAL (XEXP (x, 1)) >= 0xffff ? 2 : 1);
2093
            }
2094
          else
2095
            {
2096
              index = x;
2097
              *size = 4;
2098
            }
2099
 
2100
          if (GET_CODE (index) == MULT
2101
              && GET_CODE (XEXP (index, 1)) == CONST_INT
2102
              && (factor == 0 || factor == INTVAL (XEXP (index, 1))))
2103
            return XEXP (index, 0);
2104
        }
2105
    }
2106
  *size = 0;
2107
  return x;
2108
}
2109
 
2110
static const h8300_length_table addb_length_table =
2111
{
2112
  /* #xx  Rs   @aa  @Rs  @xx  */
2113
  {  2,   2,   4,   4,   4  }, /* add.b xx,Rd  */
2114
  {  4,   4,   4,   4,   6  }, /* add.b xx,@aa */
2115
  {  4,   4,   4,   4,   6  }, /* add.b xx,@Rd */
2116
  {  6,   4,   4,   4,   6  }  /* add.b xx,@xx */
2117
};
2118
 
2119
static const h8300_length_table addw_length_table =
2120
{
2121
  /* #xx  Rs   @aa  @Rs  @xx  */
2122
  {  2,   2,   4,   4,   4  }, /* add.w xx,Rd  */
2123
  {  4,   4,   4,   4,   6  }, /* add.w xx,@aa */
2124
  {  4,   4,   4,   4,   6  }, /* add.w xx,@Rd */
2125
  {  4,   4,   4,   4,   6  }  /* add.w xx,@xx */
2126
};
2127
 
2128
static const h8300_length_table addl_length_table =
2129
{
2130
  /* #xx  Rs   @aa  @Rs  @xx  */
2131
  {  2,   2,   4,   4,   4  }, /* add.l xx,Rd  */
2132
  {  4,   4,   6,   6,   6  }, /* add.l xx,@aa */
2133
  {  4,   4,   6,   6,   6  }, /* add.l xx,@Rd */
2134
  {  4,   4,   6,   6,   6  }  /* add.l xx,@xx */
2135
};
2136
 
2137
#define logicb_length_table addb_length_table
2138
#define logicw_length_table addw_length_table
2139
 
2140
static const h8300_length_table logicl_length_table =
2141
{
2142
  /* #xx  Rs   @aa  @Rs  @xx  */
2143
  {  2,   4,   4,   4,   4  }, /* and.l xx,Rd  */
2144
  {  4,   4,   6,   6,   6  }, /* and.l xx,@aa */
2145
  {  4,   4,   6,   6,   6  }, /* and.l xx,@Rd */
2146
  {  4,   4,   6,   6,   6  }  /* and.l xx,@xx */
2147
};
2148
 
2149
static const h8300_length_table movb_length_table =
2150
{
2151
  /* #xx  Rs   @aa  @Rs  @xx  */
2152
  {  2,   2,   2,   2,   4  }, /* mov.b xx,Rd  */
2153
  {  4,   2,   4,   4,   4  }, /* mov.b xx,@aa */
2154
  {  4,   2,   4,   4,   4  }, /* mov.b xx,@Rd */
2155
  {  4,   4,   4,   4,   4  }  /* mov.b xx,@xx */
2156
};
2157
 
2158
#define movw_length_table movb_length_table
2159
 
2160
static const h8300_length_table movl_length_table =
2161
{
2162
  /* #xx  Rs   @aa  @Rs  @xx  */
2163
  {  2,   2,   4,   4,   4  }, /* mov.l xx,Rd  */
2164
  {  4,   4,   4,   4,   4  }, /* mov.l xx,@aa */
2165
  {  4,   4,   4,   4,   4  }, /* mov.l xx,@Rd */
2166
  {  4,   4,   4,   4,   4  }  /* mov.l xx,@xx */
2167
};
2168
 
2169
/* Return the size of the given address or displacement constant.  */
2170
 
2171
static unsigned int
2172
h8300_constant_length (rtx constant)
2173
{
2174
  /* Check for (@d:16,Reg).  */
2175
  if (GET_CODE (constant) == CONST_INT
2176
      && IN_RANGE (INTVAL (constant), -0x8000, 0x7fff))
2177
    return 2;
2178
 
2179
  /* Check for (@d:16,Reg) in cases where the displacement is
2180
     an absolute address.  */
2181
  if (Pmode == HImode || h8300_tiny_constant_address_p (constant))
2182
    return 2;
2183
 
2184
  return 4;
2185
}
2186
 
2187
/* Return the size of a displacement field in address ADDR, which should
2188
   have the form (plus X constant).  SIZE is the number of bytes being
2189
   accessed.  */
2190
 
2191
static unsigned int
2192
h8300_displacement_length (rtx addr, int size)
2193
{
2194
  rtx offset;
2195
 
2196
  offset = XEXP (addr, 1);
2197
 
2198
  /* Check for @(d:2,Reg).  */
2199
  if (register_operand (XEXP (addr, 0), VOIDmode)
2200
      && GET_CODE (offset) == CONST_INT
2201
      && (INTVAL (offset) == size
2202
          || INTVAL (offset) == size * 2
2203
          || INTVAL (offset) == size * 3))
2204
    return 0;
2205
 
2206
  return h8300_constant_length (offset);
2207
}
2208
 
2209
/* Store the class of operand OP in *OPCLASS and return the length of any
2210
   extra operand fields.  SIZE is the number of bytes in OP.  OPCLASS
2211
   can be null if only the length is needed.  */
2212
 
2213
static unsigned int
2214
h8300_classify_operand (rtx op, int size, enum h8300_operand_class *opclass)
2215
{
2216
  enum h8300_operand_class dummy;
2217
 
2218
  if (opclass == 0)
2219
    opclass = &dummy;
2220
 
2221
  if (CONSTANT_P (op))
2222
    {
2223
      *opclass = H8OP_IMMEDIATE;
2224
 
2225
      /* Byte-sized immediates are stored in the opcode fields.  */
2226
      if (size == 1)
2227
        return 0;
2228
 
2229
      /* If this is a 32-bit instruction, see whether the constant
2230
         will fit into a 16-bit immediate field.  */
2231
      if (TARGET_H8300SX
2232
          && size == 4
2233
          && GET_CODE (op) == CONST_INT
2234
          && IN_RANGE (INTVAL (op), 0, 0xffff))
2235
        return 2;
2236
 
2237
      return size;
2238
    }
2239
  else if (GET_CODE (op) == MEM)
2240
    {
2241
      op = XEXP (op, 0);
2242
      if (CONSTANT_P (op))
2243
        {
2244
          *opclass = H8OP_MEM_ABSOLUTE;
2245
          return h8300_constant_length (op);
2246
        }
2247
      else if (GET_CODE (op) == PLUS && CONSTANT_P (XEXP (op, 1)))
2248
        {
2249
          *opclass = H8OP_MEM_COMPLEX;
2250
          return h8300_displacement_length (op, size);
2251
        }
2252
      else if (GET_RTX_CLASS (GET_CODE (op)) == RTX_AUTOINC)
2253
        {
2254
          *opclass = H8OP_MEM_COMPLEX;
2255
          return 0;
2256
        }
2257
      else if (register_operand (op, VOIDmode))
2258
        {
2259
          *opclass = H8OP_MEM_BASE;
2260
          return 0;
2261
        }
2262
    }
2263
  gcc_assert (register_operand (op, VOIDmode));
2264
  *opclass = H8OP_REGISTER;
2265
  return 0;
2266
}
2267
 
2268
/* Return the length of the instruction described by TABLE given that
2269
   its operands are OP1 and OP2.  OP1 must be an h8300_dst_operand
2270
   and OP2 must be an h8300_src_operand.  */
2271
 
2272
static unsigned int
2273
h8300_length_from_table (rtx op1, rtx op2, const h8300_length_table *table)
2274
{
2275
  enum h8300_operand_class op1_class, op2_class;
2276
  unsigned int size, immediate_length;
2277
 
2278
  size = GET_MODE_SIZE (GET_MODE (op1));
2279
  immediate_length = (h8300_classify_operand (op1, size, &op1_class)
2280
                      + h8300_classify_operand (op2, size, &op2_class));
2281
  return immediate_length + (*table)[op1_class - 1][op2_class];
2282
}
2283
 
2284
/* Return the length of a unary instruction such as neg or not given that
2285
   its operand is OP.  */
2286
 
2287
unsigned int
2288
h8300_unary_length (rtx op)
2289
{
2290
  enum h8300_operand_class opclass;
2291
  unsigned int size, operand_length;
2292
 
2293
  size = GET_MODE_SIZE (GET_MODE (op));
2294
  operand_length = h8300_classify_operand (op, size, &opclass);
2295
  switch (opclass)
2296
    {
2297
    case H8OP_REGISTER:
2298
      return 2;
2299
 
2300
    case H8OP_MEM_BASE:
2301
      return (size == 4 ? 6 : 4);
2302
 
2303
    case H8OP_MEM_ABSOLUTE:
2304
      return operand_length + (size == 4 ? 6 : 4);
2305
 
2306
    case H8OP_MEM_COMPLEX:
2307
      return operand_length + 6;
2308
 
2309
    default:
2310
      gcc_unreachable ();
2311
    }
2312
}
2313
 
2314
/* Likewise short immediate instructions such as add.w #xx:3,OP.  */
2315
 
2316
static unsigned int
2317
h8300_short_immediate_length (rtx op)
2318
{
2319
  enum h8300_operand_class opclass;
2320
  unsigned int size, operand_length;
2321
 
2322
  size = GET_MODE_SIZE (GET_MODE (op));
2323
  operand_length = h8300_classify_operand (op, size, &opclass);
2324
 
2325
  switch (opclass)
2326
    {
2327
    case H8OP_REGISTER:
2328
      return 2;
2329
 
2330
    case H8OP_MEM_BASE:
2331
    case H8OP_MEM_ABSOLUTE:
2332
    case H8OP_MEM_COMPLEX:
2333
      return 4 + operand_length;
2334
 
2335
    default:
2336
      gcc_unreachable ();
2337
    }
2338
}
2339
 
2340
/* Likewise bitfield load and store instructions.  */
2341
 
2342
static unsigned int
2343
h8300_bitfield_length (rtx op, rtx op2)
2344
{
2345
  enum h8300_operand_class opclass;
2346
  unsigned int size, operand_length;
2347
 
2348
  if (GET_CODE (op) == REG)
2349
    op = op2;
2350
  gcc_assert (GET_CODE (op) != REG);
2351
 
2352
  size = GET_MODE_SIZE (GET_MODE (op));
2353
  operand_length = h8300_classify_operand (op, size, &opclass);
2354
 
2355
  switch (opclass)
2356
    {
2357
    case H8OP_MEM_BASE:
2358
    case H8OP_MEM_ABSOLUTE:
2359
    case H8OP_MEM_COMPLEX:
2360
      return 4 + operand_length;
2361
 
2362
    default:
2363
      gcc_unreachable ();
2364
    }
2365
}
2366
 
2367
/* Calculate the length of general binary instruction INSN using TABLE.  */
2368
 
2369
static unsigned int
2370
h8300_binary_length (rtx insn, const h8300_length_table *table)
2371
{
2372
  rtx set;
2373
 
2374
  set = single_set (insn);
2375
  gcc_assert (set);
2376
 
2377
  if (BINARY_P (SET_SRC (set)))
2378
    return h8300_length_from_table (XEXP (SET_SRC (set), 0),
2379
                                    XEXP (SET_SRC (set), 1), table);
2380
  else
2381
    {
2382
      gcc_assert (GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == RTX_TERNARY);
2383
      return h8300_length_from_table (XEXP (XEXP (SET_SRC (set), 1), 0),
2384
                                      XEXP (XEXP (SET_SRC (set), 1), 1),
2385
                                      table);
2386
    }
2387
}
2388
 
2389
/* Subroutine of h8300_move_length.  Return true if OP is 1- or 2-byte
2390
   memory reference and either (1) it has the form @(d:16,Rn) or
2391
   (2) its address has the code given by INC_CODE.  */
2392
 
2393
static bool
2394
h8300_short_move_mem_p (rtx op, enum rtx_code inc_code)
2395
{
2396
  rtx addr;
2397
  unsigned int size;
2398
 
2399
  if (GET_CODE (op) != MEM)
2400
    return false;
2401
 
2402
  addr = XEXP (op, 0);
2403
  size = GET_MODE_SIZE (GET_MODE (op));
2404
  if (size != 1 && size != 2)
2405
    return false;
2406
 
2407
  return (GET_CODE (addr) == inc_code
2408
          || (GET_CODE (addr) == PLUS
2409
              && GET_CODE (XEXP (addr, 0)) == REG
2410
              && h8300_displacement_length (addr, size) == 2));
2411
}
2412
 
2413
/* Calculate the length of move instruction INSN using the given length
2414
   table.  Although the tables are correct for most cases, there is some
2415
   irregularity in the length of mov.b and mov.w.  The following forms:
2416
 
2417
        mov @ERs+, Rd
2418
        mov @(d:16,ERs), Rd
2419
        mov Rs, @-ERd
2420
        mov Rs, @(d:16,ERd)
2421
 
2422
   are two bytes shorter than most other "mov Rs, @complex" or
2423
   "mov @complex,Rd" combinations.  */
2424
 
2425
static unsigned int
2426
h8300_move_length (rtx *operands, const h8300_length_table *table)
2427
{
2428
  unsigned int size;
2429
 
2430
  size = h8300_length_from_table (operands[0], operands[1], table);
2431
  if (REG_P (operands[0]) && h8300_short_move_mem_p (operands[1], POST_INC))
2432
    size -= 2;
2433
  if (REG_P (operands[1]) && h8300_short_move_mem_p (operands[0], PRE_DEC))
2434
    size -= 2;
2435
  return size;
2436
}
2437
 
2438
/* Return the length of a mova instruction with the given operands.
2439
   DEST is the register destination, SRC is the source address and
2440
   OFFSET is the 16-bit or 32-bit displacement.  */
2441
 
2442
static unsigned int
2443
h8300_mova_length (rtx dest, rtx src, rtx offset)
2444
{
2445
  unsigned int size;
2446
 
2447
  size = (2
2448
          + h8300_constant_length (offset)
2449
          + h8300_classify_operand (src, GET_MODE_SIZE (GET_MODE (src)), 0));
2450
  if (!REG_P (dest) || !REG_P (src) || REGNO (src) != REGNO (dest))
2451
    size += 2;
2452
  return size;
2453
}
2454
 
2455
/* Compute the length of INSN based on its length_table attribute.
2456
   OPERANDS is the array of its operands.  */
2457
 
2458
unsigned int
2459
h8300_insn_length_from_table (rtx insn, rtx * operands)
2460
{
2461
  switch (get_attr_length_table (insn))
2462
    {
2463
    case LENGTH_TABLE_NONE:
2464
      gcc_unreachable ();
2465
 
2466
    case LENGTH_TABLE_ADDB:
2467
      return h8300_binary_length (insn, &addb_length_table);
2468
 
2469
    case LENGTH_TABLE_ADDW:
2470
      return h8300_binary_length (insn, &addw_length_table);
2471
 
2472
    case LENGTH_TABLE_ADDL:
2473
      return h8300_binary_length (insn, &addl_length_table);
2474
 
2475
    case LENGTH_TABLE_LOGICB:
2476
      return h8300_binary_length (insn, &logicb_length_table);
2477
 
2478
    case LENGTH_TABLE_MOVB:
2479
      return h8300_move_length (operands, &movb_length_table);
2480
 
2481
    case LENGTH_TABLE_MOVW:
2482
      return h8300_move_length (operands, &movw_length_table);
2483
 
2484
    case LENGTH_TABLE_MOVL:
2485
      return h8300_move_length (operands, &movl_length_table);
2486
 
2487
    case LENGTH_TABLE_MOVA:
2488
      return h8300_mova_length (operands[0], operands[1], operands[2]);
2489
 
2490
    case LENGTH_TABLE_MOVA_ZERO:
2491
      return h8300_mova_length (operands[0], operands[1], const0_rtx);
2492
 
2493
    case LENGTH_TABLE_UNARY:
2494
      return h8300_unary_length (operands[0]);
2495
 
2496
    case LENGTH_TABLE_MOV_IMM4:
2497
      return 2 + h8300_classify_operand (operands[0], 0, 0);
2498
 
2499
    case LENGTH_TABLE_SHORT_IMMEDIATE:
2500
      return h8300_short_immediate_length (operands[0]);
2501
 
2502
    case LENGTH_TABLE_BITFIELD:
2503
      return h8300_bitfield_length (operands[0], operands[1]);
2504
 
2505
    case LENGTH_TABLE_BITBRANCH:
2506
      return h8300_bitfield_length (operands[1], operands[2]) - 2;
2507
 
2508
    default:
2509
      gcc_unreachable ();
2510
    }
2511
}
2512
 
2513
/* Return true if LHS and RHS are memory references that can be mapped
2514
   to the same h8sx assembly operand.  LHS appears as the destination of
2515
   an instruction and RHS appears as a source.
2516
 
2517
   Three cases are allowed:
2518
 
2519
        - RHS is @+Rn or @-Rn, LHS is @Rn
2520
        - RHS is @Rn, LHS is @Rn+ or @Rn-
2521
        - RHS and LHS have the same address and neither has side effects.  */
2522
 
2523
bool
2524
h8sx_mergeable_memrefs_p (rtx lhs, rtx rhs)
2525
{
2526
  if (GET_CODE (rhs) == MEM && GET_CODE (lhs) == MEM)
2527
    {
2528
      rhs = XEXP (rhs, 0);
2529
      lhs = XEXP (lhs, 0);
2530
 
2531
      if (GET_CODE (rhs) == PRE_INC || GET_CODE (rhs) == PRE_DEC)
2532
        return rtx_equal_p (XEXP (rhs, 0), lhs);
2533
 
2534
      if (GET_CODE (lhs) == POST_INC || GET_CODE (lhs) == POST_DEC)
2535
        return rtx_equal_p (rhs, XEXP (lhs, 0));
2536
 
2537
      if (rtx_equal_p (rhs, lhs))
2538
        return true;
2539
    }
2540
  return false;
2541
}
2542
 
2543
/* Return true if OPERANDS[1] can be mapped to the same assembly
2544
   operand as OPERANDS[0].  */
2545
 
2546
bool
2547
h8300_operands_match_p (rtx *operands)
2548
{
2549
  if (register_operand (operands[0], VOIDmode)
2550
      && register_operand (operands[1], VOIDmode))
2551
    return true;
2552
 
2553
  if (h8sx_mergeable_memrefs_p (operands[0], operands[1]))
2554
    return true;
2555
 
2556
  return false;
2557
}
2558
 
2559
/* Try using movmd to move LENGTH bytes from memory region SRC to memory
2560
   region DEST.  The two regions do not overlap and have the common
2561
   alignment given by ALIGNMENT.  Return true on success.
2562
 
2563
   Using movmd for variable-length moves seems to involve some
2564
   complex trade-offs.  For instance:
2565
 
2566
      - Preparing for a movmd instruction is similar to preparing
2567
        for a memcpy.  The main difference is that the arguments
2568
        are moved into er4, er5 and er6 rather than er0, er1 and er2.
2569
 
2570
      - Since movmd clobbers the frame pointer, we need to save
2571
        and restore it somehow when frame_pointer_needed.  This can
2572
        sometimes make movmd sequences longer than calls to memcpy().
2573
 
2574
      - The counter register is 16 bits, so the instruction is only
2575
        suitable for variable-length moves when sizeof (size_t) == 2.
2576
        That's only true in normal mode.
2577
 
2578
      - We will often lack static alignment information.  Falling back
2579
        on movmd.b would likely be slower than calling memcpy(), at least
2580
        for big moves.
2581
 
2582
   This function therefore only uses movmd when the length is a
2583
   known constant, and only then if -fomit-frame-pointer is in
2584
   effect or if we're not optimizing for size.
2585
 
2586
   At the moment the function uses movmd for all in-range constants,
2587
   but it might be better to fall back on memcpy() for large moves
2588
   if ALIGNMENT == 1.  */
2589
 
2590
bool
2591
h8sx_emit_movmd (rtx dest, rtx src, rtx length,
2592
                 HOST_WIDE_INT alignment)
2593
{
2594
  if (!flag_omit_frame_pointer && optimize_size)
2595
    return false;
2596
 
2597
  if (GET_CODE (length) == CONST_INT)
2598
    {
2599
      rtx dest_reg, src_reg, first_dest, first_src;
2600
      HOST_WIDE_INT n;
2601
      int factor;
2602
 
2603
      /* Use movmd.l if the alignment allows it, otherwise fall back
2604
         on movmd.b.  */
2605
      factor = (alignment >= 2 ? 4 : 1);
2606
 
2607
      /* Make sure the length is within range.  We can handle counter
2608
         values up to 65536, although HImode truncation will make
2609
         the count appear negative in rtl dumps.  */
2610
      n = INTVAL (length);
2611
      if (n <= 0 || n / factor > 65536)
2612
        return false;
2613
 
2614
      /* Create temporary registers for the source and destination
2615
         pointers.  Initialize them to the start of each region.  */
2616
      dest_reg = copy_addr_to_reg (XEXP (dest, 0));
2617
      src_reg = copy_addr_to_reg (XEXP (src, 0));
2618
 
2619
      /* Create references to the movmd source and destination blocks.  */
2620
      first_dest = replace_equiv_address (dest, dest_reg);
2621
      first_src = replace_equiv_address (src, src_reg);
2622
 
2623
      set_mem_size (first_dest, GEN_INT (n & -factor));
2624
      set_mem_size (first_src, GEN_INT (n & -factor));
2625
 
2626
      length = copy_to_mode_reg (HImode, gen_int_mode (n / factor, HImode));
2627
      emit_insn (gen_movmd (first_dest, first_src, length, GEN_INT (factor)));
2628
 
2629
      if ((n & -factor) != n)
2630
        {
2631
          /* Move SRC and DEST past the region we just copied.
2632
             This is done to update the memory attributes.  */
2633
          dest = adjust_address (dest, BLKmode, n & -factor);
2634
          src = adjust_address (src, BLKmode, n & -factor);
2635
 
2636
          /* Replace the addresses with the source and destination
2637
             registers, which movmd has left with the right values.  */
2638
          dest = replace_equiv_address (dest, dest_reg);
2639
          src = replace_equiv_address (src, src_reg);
2640
 
2641
          /* Mop up the left-over bytes.  */
2642
          if (n & 2)
2643
            emit_move_insn (adjust_address (dest, HImode, 0),
2644
                            adjust_address (src, HImode, 0));
2645
          if (n & 1)
2646
            emit_move_insn (adjust_address (dest, QImode, n & 2),
2647
                            adjust_address (src, QImode, n & 2));
2648
        }
2649
      return true;
2650
    }
2651
  return false;
2652
}
2653
 
2654
/* Move ADDR into er6 after pushing its old value onto the stack.  */
2655
 
2656
void
2657
h8300_swap_into_er6 (rtx addr)
2658
{
2659
  push (HARD_FRAME_POINTER_REGNUM);
2660
  emit_move_insn (hard_frame_pointer_rtx, addr);
2661
  if (REGNO (addr) == SP_REG)
2662
    emit_move_insn (hard_frame_pointer_rtx,
2663
                    plus_constant (hard_frame_pointer_rtx,
2664
                                   GET_MODE_SIZE (word_mode)));
2665
}
2666
 
2667
/* Move the current value of er6 into ADDR and pop its old value
2668
   from the stack.  */
2669
 
2670
void
2671
h8300_swap_out_of_er6 (rtx addr)
2672
{
2673
  if (REGNO (addr) != SP_REG)
2674
    emit_move_insn (addr, hard_frame_pointer_rtx);
2675
  pop (HARD_FRAME_POINTER_REGNUM);
2676
}
2677
 
2678
/* Return the length of mov instruction.  */
2679
 
2680
unsigned int
2681
compute_mov_length (rtx *operands)
2682
{
2683
  /* If the mov instruction involves a memory operand, we compute the
2684
     length, assuming the largest addressing mode is used, and then
2685
     adjust later in the function.  Otherwise, we compute and return
2686
     the exact length in one step.  */
2687
  enum machine_mode mode = GET_MODE (operands[0]);
2688
  rtx dest = operands[0];
2689
  rtx src = operands[1];
2690
  rtx addr;
2691
 
2692
  if (GET_CODE (src) == MEM)
2693
    addr = XEXP (src, 0);
2694
  else if (GET_CODE (dest) == MEM)
2695
    addr = XEXP (dest, 0);
2696
  else
2697
    addr = NULL_RTX;
2698
 
2699
  if (TARGET_H8300)
2700
    {
2701
      unsigned int base_length;
2702
 
2703
      switch (mode)
2704
        {
2705
        case QImode:
2706
          if (addr == NULL_RTX)
2707
            return 2;
2708
 
2709
          /* The eightbit addressing is available only in QImode, so
2710
             go ahead and take care of it.  */
2711
          if (h8300_eightbit_constant_address_p (addr))
2712
            return 2;
2713
 
2714
          base_length = 4;
2715
          break;
2716
 
2717
        case HImode:
2718
          if (addr == NULL_RTX)
2719
            {
2720
              if (REG_P (src))
2721
                return 2;
2722
 
2723
              if (src == const0_rtx)
2724
                return 2;
2725
 
2726
              return 4;
2727
            }
2728
 
2729
          base_length = 4;
2730
          break;
2731
 
2732
        case SImode:
2733
          if (addr == NULL_RTX)
2734
            {
2735
              if (REG_P (src))
2736
                return 4;
2737
 
2738
              if (GET_CODE (src) == CONST_INT)
2739
                {
2740
                  if (src == const0_rtx)
2741
                    return 4;
2742
 
2743
                  if ((INTVAL (src) & 0xffff) == 0)
2744
                    return 6;
2745
 
2746
                  if ((INTVAL (src) & 0xffff) == 0)
2747
                    return 6;
2748
 
2749
                  if ((INTVAL (src) & 0xffff)
2750
                      == ((INTVAL (src) >> 16) & 0xffff))
2751
                    return 6;
2752
                }
2753
              return 8;
2754
            }
2755
 
2756
          base_length = 8;
2757
          break;
2758
 
2759
        case SFmode:
2760
          if (addr == NULL_RTX)
2761
            {
2762
              if (REG_P (src))
2763
                return 4;
2764
 
2765
              if (CONST_DOUBLE_OK_FOR_LETTER_P (src, 'G'))
2766
                return 4;
2767
 
2768
              return 8;
2769
            }
2770
 
2771
          base_length = 8;
2772
          break;
2773
 
2774
        default:
2775
          gcc_unreachable ();
2776
        }
2777
 
2778
      /* Adjust the length based on the addressing mode used.
2779
         Specifically, we subtract the difference between the actual
2780
         length and the longest one, which is @(d:16,Rs).  For SImode
2781
         and SFmode, we double the adjustment because two mov.w are
2782
         used to do the job.  */
2783
 
2784
      /* @Rs+ and @-Rd are 2 bytes shorter than the longest.  */
2785
      if (GET_CODE (addr) == PRE_DEC
2786
          || GET_CODE (addr) == POST_INC)
2787
        {
2788
          if (mode == QImode || mode == HImode)
2789
            return base_length - 2;
2790
          else
2791
            /* In SImode and SFmode, we use two mov.w instructions, so
2792
               double the adjustment.  */
2793
            return base_length - 4;
2794
        }
2795
 
2796
      /* @Rs and @Rd are 2 bytes shorter than the longest.  Note that
2797
         in SImode and SFmode, the second mov.w involves an address
2798
         with displacement, namely @(2,Rs) or @(2,Rd), so we subtract
2799
         only 2 bytes.  */
2800
      if (GET_CODE (addr) == REG)
2801
        return base_length - 2;
2802
 
2803
      return base_length;
2804
    }
2805
  else
2806
    {
2807
      unsigned int base_length;
2808
 
2809
      switch (mode)
2810
        {
2811
        case QImode:
2812
          if (addr == NULL_RTX)
2813
            return 2;
2814
 
2815
          /* The eightbit addressing is available only in QImode, so
2816
             go ahead and take care of it.  */
2817
          if (h8300_eightbit_constant_address_p (addr))
2818
            return 2;
2819
 
2820
          base_length = 8;
2821
          break;
2822
 
2823
        case HImode:
2824
          if (addr == NULL_RTX)
2825
            {
2826
              if (REG_P (src))
2827
                return 2;
2828
 
2829
              if (src == const0_rtx)
2830
                return 2;
2831
 
2832
              return 4;
2833
            }
2834
 
2835
          base_length = 8;
2836
          break;
2837
 
2838
        case SImode:
2839
          if (addr == NULL_RTX)
2840
            {
2841
              if (REG_P (src))
2842
                {
2843
                  if (REGNO (src) == MAC_REG || REGNO (dest) == MAC_REG)
2844
                    return 4;
2845
                  else
2846
                    return 2;
2847
                }
2848
 
2849
              if (GET_CODE (src) == CONST_INT)
2850
                {
2851
                  int val = INTVAL (src);
2852
 
2853
                  if (val == 0)
2854
                    return 2;
2855
 
2856
                  if (val == (val & 0x00ff) || val == (val & 0xff00))
2857
                    return 4;
2858
 
2859
                  switch (val & 0xffffffff)
2860
                    {
2861
                    case 0xffffffff:
2862
                    case 0xfffffffe:
2863
                    case 0xfffffffc:
2864
                    case 0x0000ffff:
2865
                    case 0x0000fffe:
2866
                    case 0xffff0000:
2867
                    case 0xfffe0000:
2868
                    case 0x00010000:
2869
                    case 0x00020000:
2870
                      return 4;
2871
                    }
2872
                }
2873
              return 6;
2874
            }
2875
 
2876
          base_length = 10;
2877
          break;
2878
 
2879
        case SFmode:
2880
          if (addr == NULL_RTX)
2881
            {
2882
              if (REG_P (src))
2883
                return 2;
2884
 
2885
              if (CONST_DOUBLE_OK_FOR_LETTER_P (src, 'G'))
2886
                return 2;
2887
 
2888
              return 6;
2889
            }
2890
 
2891
          base_length = 10;
2892
          break;
2893
 
2894
        default:
2895
          gcc_unreachable ();
2896
        }
2897
 
2898
      /* Adjust the length based on the addressing mode used.
2899
         Specifically, we subtract the difference between the actual
2900
         length and the longest one, which is @(d:24,ERs).  */
2901
 
2902
      /* @ERs+ and @-ERd are 6 bytes shorter than the longest.  */
2903
      if (GET_CODE (addr) == PRE_DEC
2904
          || GET_CODE (addr) == POST_INC)
2905
        return base_length - 6;
2906
 
2907
      /* @ERs and @ERd are 6 bytes shorter than the longest.  */
2908
      if (GET_CODE (addr) == REG)
2909
        return base_length - 6;
2910
 
2911
      /* @(d:16,ERs) and @(d:16,ERd) are 4 bytes shorter than the
2912
         longest.  */
2913
      if (GET_CODE (addr) == PLUS
2914
          && GET_CODE (XEXP (addr, 0)) == REG
2915
          && GET_CODE (XEXP (addr, 1)) == CONST_INT
2916
          && INTVAL (XEXP (addr, 1)) > -32768
2917
          && INTVAL (XEXP (addr, 1)) < 32767)
2918
        return base_length - 4;
2919
 
2920
      /* @aa:16 is 4 bytes shorter than the longest.  */
2921
      if (h8300_tiny_constant_address_p (addr))
2922
        return base_length - 4;
2923
 
2924
      /* @aa:24 is 2 bytes shorter than the longest.  */
2925
      if (CONSTANT_P (addr))
2926
        return base_length - 2;
2927
 
2928
      return base_length;
2929
    }
2930
}
2931
 
2932
/* Output an addition insn.  */
2933
 
2934
const char *
2935
output_plussi (rtx *operands)
2936
{
2937
  enum machine_mode mode = GET_MODE (operands[0]);
2938
 
2939
  gcc_assert (mode == SImode);
2940
 
2941
  if (TARGET_H8300)
2942
    {
2943
      if (GET_CODE (operands[2]) == REG)
2944
        return "add.w\t%f2,%f0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2945
 
2946
      if (GET_CODE (operands[2]) == CONST_INT)
2947
        {
2948
          HOST_WIDE_INT n = INTVAL (operands[2]);
2949
 
2950
          if ((n & 0xffffff) == 0)
2951
            return "add\t%z2,%z0";
2952
          if ((n & 0xffff) == 0)
2953
            return "add\t%y2,%y0\n\taddx\t%z2,%z0";
2954
          if ((n & 0xff) == 0)
2955
            return "add\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2956
        }
2957
 
2958
      return "add\t%w2,%w0\n\taddx\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2959
    }
2960
  else
2961
    {
2962
      if (GET_CODE (operands[2]) == CONST_INT
2963
          && register_operand (operands[1], VOIDmode))
2964
        {
2965
          HOST_WIDE_INT intval = INTVAL (operands[2]);
2966
 
2967
          if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2968
            return "add.l\t%S2,%S0";
2969
          if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2970
            return "sub.l\t%G2,%S0";
2971
 
2972
          /* See if we can finish with 2 bytes.  */
2973
 
2974
          switch ((unsigned int) intval & 0xffffffff)
2975
            {
2976
            case 0x00000001:
2977
            case 0x00000002:
2978
            case 0x00000004:
2979
              return "adds\t%2,%S0";
2980
 
2981
            case 0xffffffff:
2982
            case 0xfffffffe:
2983
            case 0xfffffffc:
2984
              return "subs\t%G2,%S0";
2985
 
2986
            case 0x00010000:
2987
            case 0x00020000:
2988
              operands[2] = GEN_INT (intval >> 16);
2989
              return "inc.w\t%2,%e0";
2990
 
2991
            case 0xffff0000:
2992
            case 0xfffe0000:
2993
              operands[2] = GEN_INT (intval >> 16);
2994
              return "dec.w\t%G2,%e0";
2995
            }
2996
 
2997
          /* See if we can finish with 4 bytes.  */
2998
          if ((intval & 0xffff) == 0)
2999
            {
3000
              operands[2] = GEN_INT (intval >> 16);
3001
              return "add.w\t%2,%e0";
3002
            }
3003
        }
3004
 
3005
      if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
3006
        {
3007
          operands[2] = GEN_INT (-INTVAL (operands[2]));
3008
          return "sub.l\t%S2,%S0";
3009
        }
3010
      return "add.l\t%S2,%S0";
3011
    }
3012
}
3013
 
3014
/* ??? It would be much easier to add the h8sx stuff if a single function
3015
   classified the addition as either inc/dec, adds/subs, add.w or add.l.  */
3016
/* Compute the length of an addition insn.  */
3017
 
3018
unsigned int
3019
compute_plussi_length (rtx *operands)
3020
{
3021
  enum machine_mode mode = GET_MODE (operands[0]);
3022
 
3023
  gcc_assert (mode == SImode);
3024
 
3025
  if (TARGET_H8300)
3026
    {
3027
      if (GET_CODE (operands[2]) == REG)
3028
        return 6;
3029
 
3030
      if (GET_CODE (operands[2]) == CONST_INT)
3031
        {
3032
          HOST_WIDE_INT n = INTVAL (operands[2]);
3033
 
3034
          if ((n & 0xffffff) == 0)
3035
            return 2;
3036
          if ((n & 0xffff) == 0)
3037
            return 4;
3038
          if ((n & 0xff) == 0)
3039
            return 6;
3040
        }
3041
 
3042
      return 8;
3043
    }
3044
  else
3045
    {
3046
      if (GET_CODE (operands[2]) == CONST_INT
3047
          && register_operand (operands[1], VOIDmode))
3048
        {
3049
          HOST_WIDE_INT intval = INTVAL (operands[2]);
3050
 
3051
          if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
3052
            return 2;
3053
          if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
3054
            return 2;
3055
 
3056
          /* See if we can finish with 2 bytes.  */
3057
 
3058
          switch ((unsigned int) intval & 0xffffffff)
3059
            {
3060
            case 0x00000001:
3061
            case 0x00000002:
3062
            case 0x00000004:
3063
              return 2;
3064
 
3065
            case 0xffffffff:
3066
            case 0xfffffffe:
3067
            case 0xfffffffc:
3068
              return 2;
3069
 
3070
            case 0x00010000:
3071
            case 0x00020000:
3072
              return 2;
3073
 
3074
            case 0xffff0000:
3075
            case 0xfffe0000:
3076
              return 2;
3077
            }
3078
 
3079
          /* See if we can finish with 4 bytes.  */
3080
          if ((intval & 0xffff) == 0)
3081
            return 4;
3082
        }
3083
 
3084
      if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
3085
        return h8300_length_from_table (operands[0],
3086
                                        GEN_INT (-INTVAL (operands[2])),
3087
                                        &addl_length_table);
3088
      else
3089
        return h8300_length_from_table (operands[0], operands[2],
3090
                                        &addl_length_table);
3091
      return 6;
3092
    }
3093
}
3094
 
3095
/* Compute which flag bits are valid after an addition insn.  */
3096
 
3097
int
3098
compute_plussi_cc (rtx *operands)
3099
{
3100
  enum machine_mode mode = GET_MODE (operands[0]);
3101
 
3102
  gcc_assert (mode == SImode);
3103
 
3104
  if (TARGET_H8300)
3105
    {
3106
      return CC_CLOBBER;
3107
    }
3108
  else
3109
    {
3110
      if (GET_CODE (operands[2]) == CONST_INT
3111
          && register_operand (operands[1], VOIDmode))
3112
        {
3113
          HOST_WIDE_INT intval = INTVAL (operands[2]);
3114
 
3115
          if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
3116
            return CC_SET_ZN;
3117
          if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
3118
            return CC_SET_ZN;
3119
 
3120
          /* See if we can finish with 2 bytes.  */
3121
 
3122
          switch ((unsigned int) intval & 0xffffffff)
3123
            {
3124
            case 0x00000001:
3125
            case 0x00000002:
3126
            case 0x00000004:
3127
              return CC_NONE_0HIT;
3128
 
3129
            case 0xffffffff:
3130
            case 0xfffffffe:
3131
            case 0xfffffffc:
3132
              return CC_NONE_0HIT;
3133
 
3134
            case 0x00010000:
3135
            case 0x00020000:
3136
              return CC_CLOBBER;
3137
 
3138
            case 0xffff0000:
3139
            case 0xfffe0000:
3140
              return CC_CLOBBER;
3141
            }
3142
 
3143
          /* See if we can finish with 4 bytes.  */
3144
          if ((intval & 0xffff) == 0)
3145
            return CC_CLOBBER;
3146
        }
3147
 
3148
      return CC_SET_ZN;
3149
    }
3150
}
3151
 
3152
/* Output a logical insn.  */
3153
 
3154
const char *
3155
output_logical_op (enum machine_mode mode, rtx *operands)
3156
{
3157
  /* Figure out the logical op that we need to perform.  */
3158
  enum rtx_code code = GET_CODE (operands[3]);
3159
  /* Pretend that every byte is affected if both operands are registers.  */
3160
  const unsigned HOST_WIDE_INT intval =
3161
    (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3162
                              /* Always use the full instruction if the
3163
                                 first operand is in memory.  It is better
3164
                                 to use define_splits to generate the shorter
3165
                                 sequence where valid.  */
3166
                              && register_operand (operands[1], VOIDmode)
3167
                              ? INTVAL (operands[2]) : 0x55555555);
3168
  /* The determinant of the algorithm.  If we perform an AND, 0
3169
     affects a bit.  Otherwise, 1 affects a bit.  */
3170
  const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3171
  /* Break up DET into pieces.  */
3172
  const unsigned HOST_WIDE_INT b0 = (det >>  0) & 0xff;
3173
  const unsigned HOST_WIDE_INT b1 = (det >>  8) & 0xff;
3174
  const unsigned HOST_WIDE_INT b2 = (det >> 16) & 0xff;
3175
  const unsigned HOST_WIDE_INT b3 = (det >> 24) & 0xff;
3176
  const unsigned HOST_WIDE_INT w0 = (det >>  0) & 0xffff;
3177
  const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3178
  int lower_half_easy_p = 0;
3179
  int upper_half_easy_p = 0;
3180
  /* The name of an insn.  */
3181
  const char *opname;
3182
  char insn_buf[100];
3183
 
3184
  switch (code)
3185
    {
3186
    case AND:
3187
      opname = "and";
3188
      break;
3189
    case IOR:
3190
      opname = "or";
3191
      break;
3192
    case XOR:
3193
      opname = "xor";
3194
      break;
3195
    default:
3196
      gcc_unreachable ();
3197
    }
3198
 
3199
  switch (mode)
3200
    {
3201
    case HImode:
3202
      /* First, see if we can finish with one insn.  */
3203
      if ((TARGET_H8300H || TARGET_H8300S)
3204
          && b0 != 0
3205
          && b1 != 0)
3206
        {
3207
          sprintf (insn_buf, "%s.w\t%%T2,%%T0", opname);
3208
          output_asm_insn (insn_buf, operands);
3209
        }
3210
      else
3211
        {
3212
          /* Take care of the lower byte.  */
3213
          if (b0 != 0)
3214
            {
3215
              sprintf (insn_buf, "%s\t%%s2,%%s0", opname);
3216
              output_asm_insn (insn_buf, operands);
3217
            }
3218
          /* Take care of the upper byte.  */
3219
          if (b1 != 0)
3220
            {
3221
              sprintf (insn_buf, "%s\t%%t2,%%t0", opname);
3222
              output_asm_insn (insn_buf, operands);
3223
            }
3224
        }
3225
      break;
3226
    case SImode:
3227
      if (TARGET_H8300H || TARGET_H8300S)
3228
        {
3229
          /* Determine if the lower half can be taken care of in no more
3230
             than two bytes.  */
3231
          lower_half_easy_p = (b0 == 0
3232
                               || b1 == 0
3233
                               || (code != IOR && w0 == 0xffff));
3234
 
3235
          /* Determine if the upper half can be taken care of in no more
3236
             than two bytes.  */
3237
          upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3238
                               || (code == AND && w1 == 0xff00));
3239
        }
3240
 
3241
      /* Check if doing everything with one insn is no worse than
3242
         using multiple insns.  */
3243
      if ((TARGET_H8300H || TARGET_H8300S)
3244
          && w0 != 0 && w1 != 0
3245
          && !(lower_half_easy_p && upper_half_easy_p)
3246
          && !(code == IOR && w1 == 0xffff
3247
               && (w0 & 0x8000) != 0 && lower_half_easy_p))
3248
        {
3249
          sprintf (insn_buf, "%s.l\t%%S2,%%S0", opname);
3250
          output_asm_insn (insn_buf, operands);
3251
        }
3252
      else
3253
        {
3254
          /* Take care of the lower and upper words individually.  For
3255
             each word, we try different methods in the order of
3256
 
3257
             1) the special insn (in case of AND or XOR),
3258
             2) the word-wise insn, and
3259
             3) The byte-wise insn.  */
3260
          if (w0 == 0xffff
3261
              && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3262
            output_asm_insn ((code == AND)
3263
                             ? "sub.w\t%f0,%f0" : "not.w\t%f0",
3264
                             operands);
3265
          else if ((TARGET_H8300H || TARGET_H8300S)
3266
                   && (b0 != 0)
3267
                   && (b1 != 0))
3268
            {
3269
              sprintf (insn_buf, "%s.w\t%%f2,%%f0", opname);
3270
              output_asm_insn (insn_buf, operands);
3271
            }
3272
          else
3273
            {
3274
              if (b0 != 0)
3275
                {
3276
                  sprintf (insn_buf, "%s\t%%w2,%%w0", opname);
3277
                  output_asm_insn (insn_buf, operands);
3278
                }
3279
              if (b1 != 0)
3280
                {
3281
                  sprintf (insn_buf, "%s\t%%x2,%%x0", opname);
3282
                  output_asm_insn (insn_buf, operands);
3283
                }
3284
            }
3285
 
3286
          if ((w1 == 0xffff)
3287
              && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3288
            output_asm_insn ((code == AND)
3289
                             ? "sub.w\t%e0,%e0" : "not.w\t%e0",
3290
                             operands);
3291
          else if ((TARGET_H8300H || TARGET_H8300S)
3292
                   && code == IOR
3293
                   && w1 == 0xffff
3294
                   && (w0 & 0x8000) != 0)
3295
            {
3296
              output_asm_insn ("exts.l\t%S0", operands);
3297
            }
3298
          else if ((TARGET_H8300H || TARGET_H8300S)
3299
                   && code == AND
3300
                   && w1 == 0xff00)
3301
            {
3302
              output_asm_insn ("extu.w\t%e0", operands);
3303
            }
3304
          else if (TARGET_H8300H || TARGET_H8300S)
3305
            {
3306
              if (w1 != 0)
3307
                {
3308
                  sprintf (insn_buf, "%s.w\t%%e2,%%e0", opname);
3309
                  output_asm_insn (insn_buf, operands);
3310
                }
3311
            }
3312
          else
3313
            {
3314
              if (b2 != 0)
3315
                {
3316
                  sprintf (insn_buf, "%s\t%%y2,%%y0", opname);
3317
                  output_asm_insn (insn_buf, operands);
3318
                }
3319
              if (b3 != 0)
3320
                {
3321
                  sprintf (insn_buf, "%s\t%%z2,%%z0", opname);
3322
                  output_asm_insn (insn_buf, operands);
3323
                }
3324
            }
3325
        }
3326
      break;
3327
    default:
3328
      gcc_unreachable ();
3329
    }
3330
  return "";
3331
}
3332
 
3333
/* Compute the length of a logical insn.  */
3334
 
3335
unsigned int
3336
compute_logical_op_length (enum machine_mode mode, rtx *operands)
3337
{
3338
  /* Figure out the logical op that we need to perform.  */
3339
  enum rtx_code code = GET_CODE (operands[3]);
3340
  /* Pretend that every byte is affected if both operands are registers.  */
3341
  const unsigned HOST_WIDE_INT intval =
3342
    (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3343
                              /* Always use the full instruction if the
3344
                                 first operand is in memory.  It is better
3345
                                 to use define_splits to generate the shorter
3346
                                 sequence where valid.  */
3347
                              && register_operand (operands[1], VOIDmode)
3348
                              ? INTVAL (operands[2]) : 0x55555555);
3349
  /* The determinant of the algorithm.  If we perform an AND, 0
3350
     affects a bit.  Otherwise, 1 affects a bit.  */
3351
  const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3352
  /* Break up DET into pieces.  */
3353
  const unsigned HOST_WIDE_INT b0 = (det >>  0) & 0xff;
3354
  const unsigned HOST_WIDE_INT b1 = (det >>  8) & 0xff;
3355
  const unsigned HOST_WIDE_INT b2 = (det >> 16) & 0xff;
3356
  const unsigned HOST_WIDE_INT b3 = (det >> 24) & 0xff;
3357
  const unsigned HOST_WIDE_INT w0 = (det >>  0) & 0xffff;
3358
  const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3359
  int lower_half_easy_p = 0;
3360
  int upper_half_easy_p = 0;
3361
  /* Insn length.  */
3362
  unsigned int length = 0;
3363
 
3364
  switch (mode)
3365
    {
3366
    case HImode:
3367
      /* First, see if we can finish with one insn.  */
3368
      if ((TARGET_H8300H || TARGET_H8300S)
3369
          && b0 != 0
3370
          && b1 != 0)
3371
        {
3372
          length = h8300_length_from_table (operands[1], operands[2],
3373
                                            &logicw_length_table);
3374
        }
3375
      else
3376
        {
3377
          /* Take care of the lower byte.  */
3378
          if (b0 != 0)
3379
            length += 2;
3380
 
3381
          /* Take care of the upper byte.  */
3382
          if (b1 != 0)
3383
            length += 2;
3384
        }
3385
      break;
3386
    case SImode:
3387
      if (TARGET_H8300H || TARGET_H8300S)
3388
        {
3389
          /* Determine if the lower half can be taken care of in no more
3390
             than two bytes.  */
3391
          lower_half_easy_p = (b0 == 0
3392
                               || b1 == 0
3393
                               || (code != IOR && w0 == 0xffff));
3394
 
3395
          /* Determine if the upper half can be taken care of in no more
3396
             than two bytes.  */
3397
          upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3398
                               || (code == AND && w1 == 0xff00));
3399
        }
3400
 
3401
      /* Check if doing everything with one insn is no worse than
3402
         using multiple insns.  */
3403
      if ((TARGET_H8300H || TARGET_H8300S)
3404
          && w0 != 0 && w1 != 0
3405
          && !(lower_half_easy_p && upper_half_easy_p)
3406
          && !(code == IOR && w1 == 0xffff
3407
               && (w0 & 0x8000) != 0 && lower_half_easy_p))
3408
        {
3409
          length = h8300_length_from_table (operands[1], operands[2],
3410
                                            &logicl_length_table);
3411
        }
3412
      else
3413
        {
3414
          /* Take care of the lower and upper words individually.  For
3415
             each word, we try different methods in the order of
3416
 
3417
             1) the special insn (in case of AND or XOR),
3418
             2) the word-wise insn, and
3419
             3) The byte-wise insn.  */
3420
          if (w0 == 0xffff
3421
              && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3422
            {
3423
              length += 2;
3424
            }
3425
          else if ((TARGET_H8300H || TARGET_H8300S)
3426
                   && (b0 != 0)
3427
                   && (b1 != 0))
3428
            {
3429
              length += 4;
3430
            }
3431
          else
3432
            {
3433
              if (b0 != 0)
3434
                length += 2;
3435
 
3436
              if (b1 != 0)
3437
                length += 2;
3438
            }
3439
 
3440
          if (w1 == 0xffff
3441
              && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3442
            {
3443
              length += 2;
3444
            }
3445
          else if ((TARGET_H8300H || TARGET_H8300S)
3446
                   && code == IOR
3447
                   && w1 == 0xffff
3448
                   && (w0 & 0x8000) != 0)
3449
            {
3450
              length += 2;
3451
            }
3452
          else if ((TARGET_H8300H || TARGET_H8300S)
3453
                   && code == AND
3454
                   && w1 == 0xff00)
3455
            {
3456
              length += 2;
3457
            }
3458
          else if (TARGET_H8300H || TARGET_H8300S)
3459
            {
3460
              if (w1 != 0)
3461
                length += 4;
3462
            }
3463
          else
3464
            {
3465
              if (b2 != 0)
3466
                length += 2;
3467
 
3468
              if (b3 != 0)
3469
                length += 2;
3470
            }
3471
        }
3472
      break;
3473
    default:
3474
      gcc_unreachable ();
3475
    }
3476
  return length;
3477
}
3478
 
3479
/* Compute which flag bits are valid after a logical insn.  */
3480
 
3481
int
3482
compute_logical_op_cc (enum machine_mode mode, rtx *operands)
3483
{
3484
  /* Figure out the logical op that we need to perform.  */
3485
  enum rtx_code code = GET_CODE (operands[3]);
3486
  /* Pretend that every byte is affected if both operands are registers.  */
3487
  const unsigned HOST_WIDE_INT intval =
3488
    (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3489
                              /* Always use the full instruction if the
3490
                                 first operand is in memory.  It is better
3491
                                 to use define_splits to generate the shorter
3492
                                 sequence where valid.  */
3493
                              && register_operand (operands[1], VOIDmode)
3494
                              ? INTVAL (operands[2]) : 0x55555555);
3495
  /* The determinant of the algorithm.  If we perform an AND, 0
3496
     affects a bit.  Otherwise, 1 affects a bit.  */
3497
  const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3498
  /* Break up DET into pieces.  */
3499
  const unsigned HOST_WIDE_INT b0 = (det >>  0) & 0xff;
3500
  const unsigned HOST_WIDE_INT b1 = (det >>  8) & 0xff;
3501
  const unsigned HOST_WIDE_INT w0 = (det >>  0) & 0xffff;
3502
  const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3503
  int lower_half_easy_p = 0;
3504
  int upper_half_easy_p = 0;
3505
  /* Condition code.  */
3506
  enum attr_cc cc = CC_CLOBBER;
3507
 
3508
  switch (mode)
3509
    {
3510
    case HImode:
3511
      /* First, see if we can finish with one insn.  */
3512
      if ((TARGET_H8300H || TARGET_H8300S)
3513
          && b0 != 0
3514
          && b1 != 0)
3515
        {
3516
          cc = CC_SET_ZNV;
3517
        }
3518
      break;
3519
    case SImode:
3520
      if (TARGET_H8300H || TARGET_H8300S)
3521
        {
3522
          /* Determine if the lower half can be taken care of in no more
3523
             than two bytes.  */
3524
          lower_half_easy_p = (b0 == 0
3525
                               || b1 == 0
3526
                               || (code != IOR && w0 == 0xffff));
3527
 
3528
          /* Determine if the upper half can be taken care of in no more
3529
             than two bytes.  */
3530
          upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3531
                               || (code == AND && w1 == 0xff00));
3532
        }
3533
 
3534
      /* Check if doing everything with one insn is no worse than
3535
         using multiple insns.  */
3536
      if ((TARGET_H8300H || TARGET_H8300S)
3537
          && w0 != 0 && w1 != 0
3538
          && !(lower_half_easy_p && upper_half_easy_p)
3539
          && !(code == IOR && w1 == 0xffff
3540
               && (w0 & 0x8000) != 0 && lower_half_easy_p))
3541
        {
3542
          cc = CC_SET_ZNV;
3543
        }
3544
      else
3545
        {
3546
          if ((TARGET_H8300H || TARGET_H8300S)
3547
              && code == IOR
3548
              && w1 == 0xffff
3549
              && (w0 & 0x8000) != 0)
3550
            {
3551
              cc = CC_SET_ZNV;
3552
            }
3553
        }
3554
      break;
3555
    default:
3556
      gcc_unreachable ();
3557
    }
3558
  return cc;
3559
}
3560
 
3561
/* Expand a conditional branch.  */
3562
 
3563
void
3564
h8300_expand_branch (rtx operands[])
3565
{
3566
  enum rtx_code code = GET_CODE (operands[0]);
3567
  rtx op0 = operands[1];
3568
  rtx op1 = operands[2];
3569
  rtx label = operands[3];
3570
  rtx tmp;
3571
 
3572
  tmp = gen_rtx_COMPARE (VOIDmode, op0, op1);
3573
  emit_insn (gen_rtx_SET (VOIDmode, cc0_rtx, tmp));
3574
 
3575
  tmp = gen_rtx_fmt_ee (code, VOIDmode, cc0_rtx, const0_rtx);
3576
  tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
3577
                              gen_rtx_LABEL_REF (VOIDmode, label),
3578
                              pc_rtx);
3579
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
3580
}
3581
 
3582
 
3583
/* Expand a conditional store.  */
3584
 
3585
void
3586
h8300_expand_store (rtx operands[])
3587
{
3588
  rtx dest = operands[0];
3589
  enum rtx_code code = GET_CODE (operands[1]);
3590
  rtx op0 = operands[2];
3591
  rtx op1 = operands[3];
3592
  rtx tmp;
3593
 
3594
  tmp = gen_rtx_COMPARE (VOIDmode, op0, op1);
3595
  emit_insn (gen_rtx_SET (VOIDmode, cc0_rtx, tmp));
3596
 
3597
  tmp = gen_rtx_fmt_ee (code, GET_MODE (dest), cc0_rtx, const0_rtx);
3598
  emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
3599
}
3600
 
3601
/* Shifts.
3602
 
3603
   We devote a fair bit of code to getting efficient shifts since we
3604
   can only shift one bit at a time on the H8/300 and H8/300H and only
3605
   one or two bits at a time on the H8S.
3606
 
3607
   All shift code falls into one of the following ways of
3608
   implementation:
3609
 
3610
   o SHIFT_INLINE: Emit straight line code for the shift; this is used
3611
     when a straight line shift is about the same size or smaller than
3612
     a loop.
3613
 
3614
   o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
3615
     off the bits we don't need.  This is used when only a few of the
3616
     bits in the original value will survive in the shifted value.
3617
 
3618
   o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
3619
     simulate a shift by 8, 16, or 24 bits.  Once moved, a few inline
3620
     shifts can be added if the shift count is slightly more than 8 or
3621
     16.  This case also includes other oddballs that are not worth
3622
     explaining here.
3623
 
3624
   o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
3625
 
3626
   For each shift count, we try to use code that has no trade-off
3627
   between code size and speed whenever possible.
3628
 
3629
   If the trade-off is unavoidable, we try to be reasonable.
3630
   Specifically, the fastest version is one instruction longer than
3631
   the shortest version, we take the fastest version.  We also provide
3632
   the use a way to switch back to the shortest version with -Os.
3633
 
3634
   For the details of the shift algorithms for various shift counts,
3635
   refer to shift_alg_[qhs]i.  */
3636
 
3637
/* Classify a shift with the given mode and code.  OP is the shift amount.  */
3638
 
3639
enum h8sx_shift_type
3640
h8sx_classify_shift (enum machine_mode mode, enum rtx_code code, rtx op)
3641
{
3642
  if (!TARGET_H8300SX)
3643
    return H8SX_SHIFT_NONE;
3644
 
3645
  switch (code)
3646
    {
3647
    case ASHIFT:
3648
    case LSHIFTRT:
3649
      /* Check for variable shifts (shll Rs,Rd and shlr Rs,Rd).  */
3650
      if (GET_CODE (op) != CONST_INT)
3651
        return H8SX_SHIFT_BINARY;
3652
 
3653
      /* Reject out-of-range shift amounts.  */
3654
      if (INTVAL (op) <= 0 || INTVAL (op) >= GET_MODE_BITSIZE (mode))
3655
        return H8SX_SHIFT_NONE;
3656
 
3657
      /* Power-of-2 shifts are effectively unary operations.  */
3658
      if (exact_log2 (INTVAL (op)) >= 0)
3659
        return H8SX_SHIFT_UNARY;
3660
 
3661
      return H8SX_SHIFT_BINARY;
3662
 
3663
    case ASHIFTRT:
3664
      if (op == const1_rtx || op == const2_rtx)
3665
        return H8SX_SHIFT_UNARY;
3666
      return H8SX_SHIFT_NONE;
3667
 
3668
    case ROTATE:
3669
      if (GET_CODE (op) == CONST_INT
3670
          && (INTVAL (op) == 1
3671
              || INTVAL (op) == 2
3672
              || INTVAL (op) == GET_MODE_BITSIZE (mode) - 2
3673
              || INTVAL (op) == GET_MODE_BITSIZE (mode) - 1))
3674
        return H8SX_SHIFT_UNARY;
3675
      return H8SX_SHIFT_NONE;
3676
 
3677
    default:
3678
      return H8SX_SHIFT_NONE;
3679
    }
3680
}
3681
 
3682
/* Return the asm template for a single h8sx shift instruction.
3683
   OPERANDS[0] and OPERANDS[1] are the destination, OPERANDS[2]
3684
   is the source and OPERANDS[3] is the shift.  SUFFIX is the
3685
   size suffix ('b', 'w' or 'l') and OPTYPE is the print_operand
3686
   prefix for the destination operand.  */
3687
 
3688
const char *
3689
output_h8sx_shift (rtx *operands, int suffix, int optype)
3690
{
3691
  static char buffer[16];
3692
  const char *stem;
3693
 
3694
  switch (GET_CODE (operands[3]))
3695
    {
3696
    case ASHIFT:
3697
      stem = "shll";
3698
      break;
3699
 
3700
    case ASHIFTRT:
3701
      stem = "shar";
3702
      break;
3703
 
3704
    case LSHIFTRT:
3705
      stem = "shlr";
3706
      break;
3707
 
3708
    case ROTATE:
3709
      stem = "rotl";
3710
      if (INTVAL (operands[2]) > 2)
3711
        {
3712
          /* This is really a right rotate.  */
3713
          operands[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands[0]))
3714
                                 - INTVAL (operands[2]));
3715
          stem = "rotr";
3716
        }
3717
      break;
3718
 
3719
    default:
3720
      gcc_unreachable ();
3721
    }
3722
  if (operands[2] == const1_rtx)
3723
    sprintf (buffer, "%s.%c\t%%%c0", stem, suffix, optype);
3724
  else
3725
    sprintf (buffer, "%s.%c\t%%X2,%%%c0", stem, suffix, optype);
3726
  return buffer;
3727
}
3728
 
3729
/* Emit code to do shifts.  */
3730
 
3731
bool
3732
expand_a_shift (enum machine_mode mode, int code, rtx operands[])
3733
{
3734
  switch (h8sx_classify_shift (mode, code, operands[2]))
3735
    {
3736
    case H8SX_SHIFT_BINARY:
3737
      operands[1] = force_reg (mode, operands[1]);
3738
      return false;
3739
 
3740
    case H8SX_SHIFT_UNARY:
3741
      return false;
3742
 
3743
    case H8SX_SHIFT_NONE:
3744
      break;
3745
    }
3746
 
3747
  emit_move_insn (copy_rtx (operands[0]), operands[1]);
3748
 
3749
  /* Need a loop to get all the bits we want  - we generate the
3750
     code at emit time, but need to allocate a scratch reg now.  */
3751
 
3752
  emit_insn (gen_rtx_PARALLEL
3753
             (VOIDmode,
3754
              gen_rtvec (2,
3755
                         gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
3756
                                      gen_rtx_fmt_ee (code, mode,
3757
                                                      copy_rtx (operands[0]), operands[2])),
3758
                         gen_rtx_CLOBBER (VOIDmode,
3759
                                          gen_rtx_SCRATCH (QImode)))));
3760
  return true;
3761
}
3762
 
3763
/* Symbols of the various modes which can be used as indices.  */
3764
 
3765
enum shift_mode
3766
{
3767
  QIshift, HIshift, SIshift
3768
};
3769
 
3770
/* For single bit shift insns, record assembler and what bits of the
3771
   condition code are valid afterwards (represented as various CC_FOO
3772
   bits, 0 means CC isn't left in a usable state).  */
3773
 
3774
struct shift_insn
3775
{
3776
  const char *const assembler;
3777
  const int cc_valid;
3778
};
3779
 
3780
/* Assembler instruction shift table.
3781
 
3782
   These tables are used to look up the basic shifts.
3783
   They are indexed by cpu, shift_type, and mode.  */
3784
 
3785
static const struct shift_insn shift_one[2][3][3] =
3786
{
3787
/* H8/300 */
3788
  {
3789
/* SHIFT_ASHIFT */
3790
    {
3791
      { "shll\t%X0", CC_SET_ZNV },
3792
      { "add.w\t%T0,%T0", CC_SET_ZN },
3793
      { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", CC_CLOBBER }
3794
    },
3795
/* SHIFT_LSHIFTRT */
3796
    {
3797
      { "shlr\t%X0", CC_SET_ZNV },
3798
      { "shlr\t%t0\n\trotxr\t%s0", CC_CLOBBER },
3799
      { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER }
3800
    },
3801
/* SHIFT_ASHIFTRT */
3802
    {
3803
      { "shar\t%X0", CC_SET_ZNV },
3804
      { "shar\t%t0\n\trotxr\t%s0", CC_CLOBBER },
3805
      { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER }
3806
    }
3807
  },
3808
/* H8/300H */
3809
  {
3810
/* SHIFT_ASHIFT */
3811
    {
3812
      { "shll.b\t%X0", CC_SET_ZNV },
3813
      { "shll.w\t%T0", CC_SET_ZNV },
3814
      { "shll.l\t%S0", CC_SET_ZNV }
3815
    },
3816
/* SHIFT_LSHIFTRT */
3817
    {
3818
      { "shlr.b\t%X0", CC_SET_ZNV },
3819
      { "shlr.w\t%T0", CC_SET_ZNV },
3820
      { "shlr.l\t%S0", CC_SET_ZNV }
3821
    },
3822
/* SHIFT_ASHIFTRT */
3823
    {
3824
      { "shar.b\t%X0", CC_SET_ZNV },
3825
      { "shar.w\t%T0", CC_SET_ZNV },
3826
      { "shar.l\t%S0", CC_SET_ZNV }
3827
    }
3828
  }
3829
};
3830
 
3831
static const struct shift_insn shift_two[3][3] =
3832
{
3833
/* SHIFT_ASHIFT */
3834
    {
3835
      { "shll.b\t#2,%X0", CC_SET_ZNV },
3836
      { "shll.w\t#2,%T0", CC_SET_ZNV },
3837
      { "shll.l\t#2,%S0", CC_SET_ZNV }
3838
    },
3839
/* SHIFT_LSHIFTRT */
3840
    {
3841
      { "shlr.b\t#2,%X0", CC_SET_ZNV },
3842
      { "shlr.w\t#2,%T0", CC_SET_ZNV },
3843
      { "shlr.l\t#2,%S0", CC_SET_ZNV }
3844
    },
3845
/* SHIFT_ASHIFTRT */
3846
    {
3847
      { "shar.b\t#2,%X0", CC_SET_ZNV },
3848
      { "shar.w\t#2,%T0", CC_SET_ZNV },
3849
      { "shar.l\t#2,%S0", CC_SET_ZNV }
3850
    }
3851
};
3852
 
3853
/* Rotates are organized by which shift they'll be used in implementing.
3854
   There's no need to record whether the cc is valid afterwards because
3855
   it is the AND insn that will decide this.  */
3856
 
3857
static const char *const rotate_one[2][3][3] =
3858
{
3859
/* H8/300 */
3860
  {
3861
/* SHIFT_ASHIFT */
3862
    {
3863
      "rotr\t%X0",
3864
      "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
3865
 
3866
    },
3867
/* SHIFT_LSHIFTRT */
3868
    {
3869
      "rotl\t%X0",
3870
      "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3871
 
3872
    },
3873
/* SHIFT_ASHIFTRT */
3874
    {
3875
      "rotl\t%X0",
3876
      "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3877
 
3878
    }
3879
  },
3880
/* H8/300H */
3881
  {
3882
/* SHIFT_ASHIFT */
3883
    {
3884
      "rotr.b\t%X0",
3885
      "rotr.w\t%T0",
3886
      "rotr.l\t%S0"
3887
    },
3888
/* SHIFT_LSHIFTRT */
3889
    {
3890
      "rotl.b\t%X0",
3891
      "rotl.w\t%T0",
3892
      "rotl.l\t%S0"
3893
    },
3894
/* SHIFT_ASHIFTRT */
3895
    {
3896
      "rotl.b\t%X0",
3897
      "rotl.w\t%T0",
3898
      "rotl.l\t%S0"
3899
    }
3900
  }
3901
};
3902
 
3903
static const char *const rotate_two[3][3] =
3904
{
3905
/* SHIFT_ASHIFT */
3906
    {
3907
      "rotr.b\t#2,%X0",
3908
      "rotr.w\t#2,%T0",
3909
      "rotr.l\t#2,%S0"
3910
    },
3911
/* SHIFT_LSHIFTRT */
3912
    {
3913
      "rotl.b\t#2,%X0",
3914
      "rotl.w\t#2,%T0",
3915
      "rotl.l\t#2,%S0"
3916
    },
3917
/* SHIFT_ASHIFTRT */
3918
    {
3919
      "rotl.b\t#2,%X0",
3920
      "rotl.w\t#2,%T0",
3921
      "rotl.l\t#2,%S0"
3922
    }
3923
};
3924
 
3925
struct shift_info {
3926
  /* Shift algorithm.  */
3927
  enum shift_alg alg;
3928
 
3929
  /* The number of bits to be shifted by shift1 and shift2.  Valid
3930
     when ALG is SHIFT_SPECIAL.  */
3931
  unsigned int remainder;
3932
 
3933
  /* Special insn for a shift.  Valid when ALG is SHIFT_SPECIAL.  */
3934
  const char *special;
3935
 
3936
  /* Insn for a one-bit shift.  Valid when ALG is either SHIFT_INLINE
3937
     or SHIFT_SPECIAL, and REMAINDER is nonzero.  */
3938
  const char *shift1;
3939
 
3940
  /* Insn for a two-bit shift.  Valid when ALG is either SHIFT_INLINE
3941
     or SHIFT_SPECIAL, and REMAINDER is nonzero.  */
3942
  const char *shift2;
3943
 
3944
  /* CC status for SHIFT_INLINE.  */
3945
  int cc_inline;
3946
 
3947
  /* CC status  for SHIFT_SPECIAL.  */
3948
  int cc_special;
3949
};
3950
 
3951
static void get_shift_alg (enum shift_type,
3952
                           enum shift_mode, unsigned int,
3953
                           struct shift_info *);
3954
 
3955
/* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
3956
   best algorithm for doing the shift.  The assembler code is stored
3957
   in the pointers in INFO.  We achieve the maximum efficiency in most
3958
   cases when !TARGET_H8300.  In case of TARGET_H8300, shifts in
3959
   SImode in particular have a lot of room to optimize.
3960
 
3961
   We first determine the strategy of the shift algorithm by a table
3962
   lookup.  If that tells us to use a hand crafted assembly code, we
3963
   go into the big switch statement to find what that is.  Otherwise,
3964
   we resort to a generic way, such as inlining.  In either case, the
3965
   result is returned through INFO.  */
3966
 
3967
static void
3968
get_shift_alg (enum shift_type shift_type, enum shift_mode shift_mode,
3969
               unsigned int count, struct shift_info *info)
3970
{
3971
  enum h8_cpu cpu;
3972
 
3973
  /* Find the target CPU.  */
3974
  if (TARGET_H8300)
3975
    cpu = H8_300;
3976
  else if (TARGET_H8300H)
3977
    cpu = H8_300H;
3978
  else
3979
    cpu = H8_S;
3980
 
3981
  /* Find the shift algorithm.  */
3982
  info->alg = SHIFT_LOOP;
3983
  switch (shift_mode)
3984
    {
3985
    case QIshift:
3986
      if (count < GET_MODE_BITSIZE (QImode))
3987
        info->alg = shift_alg_qi[cpu][shift_type][count];
3988
      break;
3989
 
3990
    case HIshift:
3991
      if (count < GET_MODE_BITSIZE (HImode))
3992
        info->alg = shift_alg_hi[cpu][shift_type][count];
3993
      break;
3994
 
3995
    case SIshift:
3996
      if (count < GET_MODE_BITSIZE (SImode))
3997
        info->alg = shift_alg_si[cpu][shift_type][count];
3998
      break;
3999
 
4000
    default:
4001
      gcc_unreachable ();
4002
    }
4003
 
4004
  /* Fill in INFO.  Return unless we have SHIFT_SPECIAL.  */
4005
  switch (info->alg)
4006
    {
4007
    case SHIFT_INLINE:
4008
      info->remainder = count;
4009
      /* Fall through.  */
4010
 
4011
    case SHIFT_LOOP:
4012
      /* It is up to the caller to know that looping clobbers cc.  */
4013
      info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
4014
      info->shift2 = shift_two[shift_type][shift_mode].assembler;
4015
      info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
4016
      goto end;
4017
 
4018
    case SHIFT_ROT_AND:
4019
      info->shift1 = rotate_one[cpu_type][shift_type][shift_mode];
4020
      info->shift2 = rotate_two[shift_type][shift_mode];
4021
      info->cc_inline = CC_CLOBBER;
4022
      goto end;
4023
 
4024
    case SHIFT_SPECIAL:
4025
      /* REMAINDER is 0 for most cases, so initialize it to 0.  */
4026
      info->remainder = 0;
4027
      info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
4028
      info->shift2 = shift_two[shift_type][shift_mode].assembler;
4029
      info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
4030
      info->cc_special = CC_CLOBBER;
4031
      break;
4032
    }
4033
 
4034
  /* Here we only deal with SHIFT_SPECIAL.  */
4035
  switch (shift_mode)
4036
    {
4037
    case QIshift:
4038
      /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
4039
         through the entire value.  */
4040
      gcc_assert (shift_type == SHIFT_ASHIFTRT && count == 7);
4041
      info->special = "shll\t%X0\n\tsubx\t%X0,%X0";
4042
      goto end;
4043
 
4044
    case HIshift:
4045
      if (count == 7)
4046
        {
4047
          switch (shift_type)
4048
            {
4049
            case SHIFT_ASHIFT:
4050
              if (TARGET_H8300)
4051
                info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.b\t%t0\n\trotr.b\t%s0\n\tand.b\t#0x80,%s0";
4052
              else
4053
                info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
4054
              goto end;
4055
            case SHIFT_LSHIFTRT:
4056
              if (TARGET_H8300)
4057
                info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\trotl.b\t%t0\n\tand.b\t#0x01,%t0";
4058
              else
4059
                info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
4060
              goto end;
4061
            case SHIFT_ASHIFTRT:
4062
              info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
4063
              goto end;
4064
            }
4065
        }
4066
      else if ((8 <= count && count <= 13)
4067
               || (TARGET_H8300S && count == 14))
4068
        {
4069
          info->remainder = count - 8;
4070
 
4071
          switch (shift_type)
4072
            {
4073
            case SHIFT_ASHIFT:
4074
              info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
4075
              goto end;
4076
            case SHIFT_LSHIFTRT:
4077
              if (TARGET_H8300)
4078
                {
4079
                  info->special = "mov.b\t%t0,%s0\n\tsub.b\t%t0,%t0";
4080
                  info->shift1  = "shlr.b\t%s0";
4081
                  info->cc_inline = CC_SET_ZNV;
4082
                }
4083
              else
4084
                {
4085
                  info->special = "mov.b\t%t0,%s0\n\textu.w\t%T0";
4086
                  info->cc_special = CC_SET_ZNV;
4087
                }
4088
              goto end;
4089
            case SHIFT_ASHIFTRT:
4090
              if (TARGET_H8300)
4091
                {
4092
                  info->special = "mov.b\t%t0,%s0\n\tbld\t#7,%s0\n\tsubx\t%t0,%t0";
4093
                  info->shift1  = "shar.b\t%s0";
4094
                }
4095
              else
4096
                {
4097
                  info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0";
4098
                  info->cc_special = CC_SET_ZNV;
4099
                }
4100
              goto end;
4101
            }
4102
        }
4103
      else if (count == 14)
4104
        {
4105
          switch (shift_type)
4106
            {
4107
            case SHIFT_ASHIFT:
4108
              if (TARGET_H8300)
4109
                info->special = "mov.b\t%s0,%t0\n\trotr.b\t%t0\n\trotr.b\t%t0\n\tand.b\t#0xC0,%t0\n\tsub.b\t%s0,%s0";
4110
              goto end;
4111
            case SHIFT_LSHIFTRT:
4112
              if (TARGET_H8300)
4113
                info->special = "mov.b\t%t0,%s0\n\trotl.b\t%s0\n\trotl.b\t%s0\n\tand.b\t#3,%s0\n\tsub.b\t%t0,%t0";
4114
              goto end;
4115
            case SHIFT_ASHIFTRT:
4116
              if (TARGET_H8300)
4117
                info->special = "mov.b\t%t0,%s0\n\tshll.b\t%s0\n\tsubx.b\t%t0,%t0\n\tshll.b\t%s0\n\tmov.b\t%t0,%s0\n\tbst.b\t#0,%s0";
4118
              else if (TARGET_H8300H)
4119
                {
4120
                  info->special = "shll.b\t%t0\n\tsubx.b\t%s0,%s0\n\tshll.b\t%t0\n\trotxl.b\t%s0\n\texts.w\t%T0";
4121
                  info->cc_special = CC_SET_ZNV;
4122
                }
4123
              else /* TARGET_H8300S */
4124
                gcc_unreachable ();
4125
              goto end;
4126
            }
4127
        }
4128
      else if (count == 15)
4129
        {
4130
          switch (shift_type)
4131
            {
4132
            case SHIFT_ASHIFT:
4133
              info->special = "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
4134
              goto end;
4135
            case SHIFT_LSHIFTRT:
4136
              info->special = "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
4137
              goto end;
4138
            case SHIFT_ASHIFTRT:
4139
              info->special = "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
4140
              goto end;
4141
            }
4142
        }
4143
      gcc_unreachable ();
4144
 
4145
    case SIshift:
4146
      if (TARGET_H8300 && 8 <= count && count <= 9)
4147
        {
4148
          info->remainder = count - 8;
4149
 
4150
          switch (shift_type)
4151
            {
4152
            case SHIFT_ASHIFT:
4153
              info->special = "mov.b\t%y0,%z0\n\tmov.b\t%x0,%y0\n\tmov.b\t%w0,%x0\n\tsub.b\t%w0,%w0";
4154
              goto end;
4155
            case SHIFT_LSHIFTRT:
4156
              info->special = "mov.b\t%x0,%w0\n\tmov.b\t%y0,%x0\n\tmov.b\t%z0,%y0\n\tsub.b\t%z0,%z0";
4157
              info->shift1  = "shlr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0";
4158
              goto end;
4159
            case SHIFT_ASHIFTRT:
4160
              info->special = "mov.b\t%x0,%w0\n\tmov.b\t%y0,%x0\n\tmov.b\t%z0,%y0\n\tshll\t%z0\n\tsubx\t%z0,%z0";
4161
              goto end;
4162
            }
4163
        }
4164
      else if (count == 8 && !TARGET_H8300)
4165
        {
4166
          switch (shift_type)
4167
            {
4168
            case SHIFT_ASHIFT:
4169
              info->special = "mov.w\t%e0,%f4\n\tmov.b\t%s4,%t4\n\tmov.b\t%t0,%s4\n\tmov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f4,%e0";
4170
              goto end;
4171
            case SHIFT_LSHIFTRT:
4172
              info->special = "mov.w\t%e0,%f4\n\tmov.b\t%t0,%s0\n\tmov.b\t%s4,%t0\n\tmov.b\t%t4,%s4\n\textu.w\t%f4\n\tmov.w\t%f4,%e0";
4173
              goto end;
4174
            case SHIFT_ASHIFTRT:
4175
              info->special = "mov.w\t%e0,%f4\n\tmov.b\t%t0,%s0\n\tmov.b\t%s4,%t0\n\tmov.b\t%t4,%s4\n\texts.w\t%f4\n\tmov.w\t%f4,%e0";
4176
              goto end;
4177
            }
4178
        }
4179
      else if (count == 15 && TARGET_H8300)
4180
        {
4181
          switch (shift_type)
4182
            {
4183
            case SHIFT_ASHIFT:
4184
              gcc_unreachable ();
4185
            case SHIFT_LSHIFTRT:
4186
              info->special = "bld\t#7,%z0\n\tmov.w\t%e0,%f0\n\txor\t%y0,%y0\n\txor\t%z0,%z0\n\trotxl\t%w0\n\trotxl\t%x0\n\trotxl\t%y0";
4187
              goto end;
4188
            case SHIFT_ASHIFTRT:
4189
              info->special = "bld\t#7,%z0\n\tmov.w\t%e0,%f0\n\trotxl\t%w0\n\trotxl\t%x0\n\tsubx\t%y0,%y0\n\tsubx\t%z0,%z0";
4190
              goto end;
4191
            }
4192
        }
4193
      else if (count == 15 && !TARGET_H8300)
4194
        {
4195
          switch (shift_type)
4196
            {
4197
            case SHIFT_ASHIFT:
4198
              info->special = "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
4199
              info->cc_special = CC_SET_ZNV;
4200
              goto end;
4201
            case SHIFT_LSHIFTRT:
4202
              info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
4203
              info->cc_special = CC_SET_ZNV;
4204
              goto end;
4205
            case SHIFT_ASHIFTRT:
4206
              gcc_unreachable ();
4207
            }
4208
        }
4209
      else if ((TARGET_H8300 && 16 <= count && count <= 20)
4210
               || (TARGET_H8300H && 16 <= count && count <= 19)
4211
               || (TARGET_H8300S && 16 <= count && count <= 21))
4212
        {
4213
          info->remainder = count - 16;
4214
 
4215
          switch (shift_type)
4216
            {
4217
            case SHIFT_ASHIFT:
4218
              info->special = "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
4219
              if (TARGET_H8300)
4220
                info->shift1 = "add.w\t%e0,%e0";
4221
              goto end;
4222
            case SHIFT_LSHIFTRT:
4223
              if (TARGET_H8300)
4224
                {
4225
                  info->special = "mov.w\t%e0,%f0\n\tsub.w\t%e0,%e0";
4226
                  info->shift1  = "shlr\t%x0\n\trotxr\t%w0";
4227
                }
4228
              else
4229
                {
4230
                  info->special = "mov.w\t%e0,%f0\n\textu.l\t%S0";
4231
                  info->cc_special = CC_SET_ZNV;
4232
                }
4233
              goto end;
4234
            case SHIFT_ASHIFTRT:
4235
              if (TARGET_H8300)
4236
                {
4237
                  info->special = "mov.w\t%e0,%f0\n\tshll\t%z0\n\tsubx\t%z0,%z0\n\tmov.b\t%z0,%y0";
4238
                  info->shift1  = "shar\t%x0\n\trotxr\t%w0";
4239
                }
4240
              else
4241
                {
4242
                  info->special = "mov.w\t%e0,%f0\n\texts.l\t%S0";
4243
                  info->cc_special = CC_SET_ZNV;
4244
                }
4245
              goto end;
4246
            }
4247
        }
4248
      else if (TARGET_H8300 && 24 <= count && count <= 28)
4249
        {
4250
          info->remainder = count - 24;
4251
 
4252
          switch (shift_type)
4253
            {
4254
            case SHIFT_ASHIFT:
4255
              info->special = "mov.b\t%w0,%z0\n\tsub.b\t%y0,%y0\n\tsub.w\t%f0,%f0";
4256
              info->shift1  = "shll.b\t%z0";
4257
              info->cc_inline = CC_SET_ZNV;
4258
              goto end;
4259
            case SHIFT_LSHIFTRT:
4260
              info->special = "mov.b\t%z0,%w0\n\tsub.b\t%x0,%x0\n\tsub.w\t%e0,%e0";
4261
              info->shift1  = "shlr.b\t%w0";
4262
              info->cc_inline = CC_SET_ZNV;
4263
              goto end;
4264
            case SHIFT_ASHIFTRT:
4265
              info->special = "mov.b\t%z0,%w0\n\tbld\t#7,%w0\n\tsubx\t%x0,%x0\n\tsubx\t%x0,%x0\n\tsubx\t%x0,%x0";
4266
              info->shift1  = "shar.b\t%w0";
4267
              info->cc_inline = CC_SET_ZNV;
4268
              goto end;
4269
            }
4270
        }
4271
      else if ((TARGET_H8300H && count == 24)
4272
               || (TARGET_H8300S && 24 <= count && count <= 25))
4273
        {
4274
          info->remainder = count - 24;
4275
 
4276
          switch (shift_type)
4277
            {
4278
            case SHIFT_ASHIFT:
4279
              info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
4280
              goto end;
4281
            case SHIFT_LSHIFTRT:
4282
              info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
4283
              info->cc_special = CC_SET_ZNV;
4284
              goto end;
4285
            case SHIFT_ASHIFTRT:
4286
              info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
4287
              info->cc_special = CC_SET_ZNV;
4288
              goto end;
4289
            }
4290
        }
4291
      else if (!TARGET_H8300 && count == 28)
4292
        {
4293
          switch (shift_type)
4294
            {
4295
            case SHIFT_ASHIFT:
4296
              if (TARGET_H8300H)
4297
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4298
              else
4299
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
4300
              goto end;
4301
            case SHIFT_LSHIFTRT:
4302
              if (TARGET_H8300H)
4303
                {
4304
                  info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4305
                  info->cc_special = CC_SET_ZNV;
4306
                }
4307
              else
4308
                info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4309
              goto end;
4310
            case SHIFT_ASHIFTRT:
4311
              gcc_unreachable ();
4312
            }
4313
        }
4314
      else if (!TARGET_H8300 && count == 29)
4315
        {
4316
          switch (shift_type)
4317
            {
4318
            case SHIFT_ASHIFT:
4319
              if (TARGET_H8300H)
4320
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4321
              else
4322
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4323
              goto end;
4324
            case SHIFT_LSHIFTRT:
4325
              if (TARGET_H8300H)
4326
                {
4327
                  info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4328
                  info->cc_special = CC_SET_ZNV;
4329
                }
4330
              else
4331
                {
4332
                  info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4333
                  info->cc_special = CC_SET_ZNV;
4334
                }
4335
              goto end;
4336
            case SHIFT_ASHIFTRT:
4337
              gcc_unreachable ();
4338
            }
4339
        }
4340
      else if (!TARGET_H8300 && count == 30)
4341
        {
4342
          switch (shift_type)
4343
            {
4344
            case SHIFT_ASHIFT:
4345
              if (TARGET_H8300H)
4346
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4347
              else
4348
                info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
4349
              goto end;
4350
            case SHIFT_LSHIFTRT:
4351
              if (TARGET_H8300H)
4352
                info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4353
              else
4354
                info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4355
              goto end;
4356
            case SHIFT_ASHIFTRT:
4357
              gcc_unreachable ();
4358
            }
4359
        }
4360
      else if (count == 31)
4361
        {
4362
          if (TARGET_H8300)
4363
            {
4364
              switch (shift_type)
4365
                {
4366
                case SHIFT_ASHIFT:
4367
                  info->special = "sub.w\t%e0,%e0\n\tshlr\t%w0\n\tmov.w\t%e0,%f0\n\trotxr\t%z0";
4368
                  goto end;
4369
                case SHIFT_LSHIFTRT:
4370
                  info->special = "sub.w\t%f0,%f0\n\tshll\t%z0\n\tmov.w\t%f0,%e0\n\trotxl\t%w0";
4371
                  goto end;
4372
                case SHIFT_ASHIFTRT:
4373
                  info->special = "shll\t%z0\n\tsubx\t%w0,%w0\n\tmov.b\t%w0,%x0\n\tmov.w\t%f0,%e0";
4374
                  goto end;
4375
                }
4376
            }
4377
          else
4378
            {
4379
              switch (shift_type)
4380
                {
4381
                case SHIFT_ASHIFT:
4382
                  info->special = "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
4383
                  info->cc_special = CC_SET_ZNV;
4384
                  goto end;
4385
                case SHIFT_LSHIFTRT:
4386
                  info->special = "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
4387
                  info->cc_special = CC_SET_ZNV;
4388
                  goto end;
4389
                case SHIFT_ASHIFTRT:
4390
                  info->special = "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
4391
                  info->cc_special = CC_SET_ZNV;
4392
                  goto end;
4393
                }
4394
            }
4395
        }
4396
      gcc_unreachable ();
4397
 
4398
    default:
4399
      gcc_unreachable ();
4400
    }
4401
 
4402
 end:
4403
  if (!TARGET_H8300S)
4404
    info->shift2 = NULL;
4405
}
4406
 
4407
/* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
4408
   needed for some shift with COUNT and MODE.  Return 0 otherwise.  */
4409
 
4410
int
4411
h8300_shift_needs_scratch_p (int count, enum machine_mode mode)
4412
{
4413
  enum h8_cpu cpu;
4414
  int a, lr, ar;
4415
 
4416
  if (GET_MODE_BITSIZE (mode) <= count)
4417
    return 1;
4418
 
4419
  /* Find out the target CPU.  */
4420
  if (TARGET_H8300)
4421
    cpu = H8_300;
4422
  else if (TARGET_H8300H)
4423
    cpu = H8_300H;
4424
  else
4425
    cpu = H8_S;
4426
 
4427
  /* Find the shift algorithm.  */
4428
  switch (mode)
4429
    {
4430
    case QImode:
4431
      a  = shift_alg_qi[cpu][SHIFT_ASHIFT][count];
4432
      lr = shift_alg_qi[cpu][SHIFT_LSHIFTRT][count];
4433
      ar = shift_alg_qi[cpu][SHIFT_ASHIFTRT][count];
4434
      break;
4435
 
4436
    case HImode:
4437
      a  = shift_alg_hi[cpu][SHIFT_ASHIFT][count];
4438
      lr = shift_alg_hi[cpu][SHIFT_LSHIFTRT][count];
4439
      ar = shift_alg_hi[cpu][SHIFT_ASHIFTRT][count];
4440
      break;
4441
 
4442
    case SImode:
4443
      a  = shift_alg_si[cpu][SHIFT_ASHIFT][count];
4444
      lr = shift_alg_si[cpu][SHIFT_LSHIFTRT][count];
4445
      ar = shift_alg_si[cpu][SHIFT_ASHIFTRT][count];
4446
      break;
4447
 
4448
    default:
4449
      gcc_unreachable ();
4450
    }
4451
 
4452
  /* On H8/300H, count == 8 uses a scratch register.  */
4453
  return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
4454
          || (TARGET_H8300H && mode == SImode && count == 8));
4455
}
4456
 
4457
/* Output the assembler code for doing shifts.  */
4458
 
4459
const char *
4460
output_a_shift (rtx *operands)
4461
{
4462
  static int loopend_lab;
4463
  rtx shift = operands[3];
4464
  enum machine_mode mode = GET_MODE (shift);
4465
  enum rtx_code code = GET_CODE (shift);
4466
  enum shift_type shift_type;
4467
  enum shift_mode shift_mode;
4468
  struct shift_info info;
4469
  int n;
4470
 
4471
  loopend_lab++;
4472
 
4473
  switch (mode)
4474
    {
4475
    case QImode:
4476
      shift_mode = QIshift;
4477
      break;
4478
    case HImode:
4479
      shift_mode = HIshift;
4480
      break;
4481
    case SImode:
4482
      shift_mode = SIshift;
4483
      break;
4484
    default:
4485
      gcc_unreachable ();
4486
    }
4487
 
4488
  switch (code)
4489
    {
4490
    case ASHIFTRT:
4491
      shift_type = SHIFT_ASHIFTRT;
4492
      break;
4493
    case LSHIFTRT:
4494
      shift_type = SHIFT_LSHIFTRT;
4495
      break;
4496
    case ASHIFT:
4497
      shift_type = SHIFT_ASHIFT;
4498
      break;
4499
    default:
4500
      gcc_unreachable ();
4501
    }
4502
 
4503
  /* This case must be taken care of by one of the two splitters
4504
     that convert a variable shift into a loop.  */
4505
  gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4506
 
4507
  n = INTVAL (operands[2]);
4508
 
4509
  /* If the count is negative, make it 0.  */
4510
  if (n < 0)
4511
    n = 0;
4512
  /* If the count is too big, truncate it.
4513
     ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4514
     do the intuitive thing.  */
4515
  else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4516
    n = GET_MODE_BITSIZE (mode);
4517
 
4518
  get_shift_alg (shift_type, shift_mode, n, &info);
4519
 
4520
  switch (info.alg)
4521
    {
4522
    case SHIFT_SPECIAL:
4523
      output_asm_insn (info.special, operands);
4524
      /* Fall through.  */
4525
 
4526
    case SHIFT_INLINE:
4527
      n = info.remainder;
4528
 
4529
      /* Emit two bit shifts first.  */
4530
      if (info.shift2 != NULL)
4531
        {
4532
          for (; n > 1; n -= 2)
4533
            output_asm_insn (info.shift2, operands);
4534
        }
4535
 
4536
      /* Now emit one bit shifts for any residual.  */
4537
      for (; n > 0; n--)
4538
        output_asm_insn (info.shift1, operands);
4539
      return "";
4540
 
4541
    case SHIFT_ROT_AND:
4542
      {
4543
        int m = GET_MODE_BITSIZE (mode) - n;
4544
        const int mask = (shift_type == SHIFT_ASHIFT
4545
                          ? ((1 << m) - 1) << n
4546
                          : (1 << m) - 1);
4547
        char insn_buf[200];
4548
 
4549
        /* Not all possibilities of rotate are supported.  They shouldn't
4550
           be generated, but let's watch for 'em.  */
4551
        gcc_assert (info.shift1);
4552
 
4553
        /* Emit two bit rotates first.  */
4554
        if (info.shift2 != NULL)
4555
          {
4556
            for (; m > 1; m -= 2)
4557
              output_asm_insn (info.shift2, operands);
4558
          }
4559
 
4560
        /* Now single bit rotates for any residual.  */
4561
        for (; m > 0; m--)
4562
          output_asm_insn (info.shift1, operands);
4563
 
4564
        /* Now mask off the high bits.  */
4565
        switch (mode)
4566
          {
4567
          case QImode:
4568
            sprintf (insn_buf, "and\t#%d,%%X0", mask);
4569
            break;
4570
 
4571
          case HImode:
4572
            gcc_assert (TARGET_H8300H || TARGET_H8300S);
4573
            sprintf (insn_buf, "and.w\t#%d,%%T0", mask);
4574
            break;
4575
 
4576
          default:
4577
            gcc_unreachable ();
4578
          }
4579
 
4580
        output_asm_insn (insn_buf, operands);
4581
        return "";
4582
      }
4583
 
4584
    case SHIFT_LOOP:
4585
      /* A loop to shift by a "large" constant value.
4586
         If we have shift-by-2 insns, use them.  */
4587
      if (info.shift2 != NULL)
4588
        {
4589
          fprintf (asm_out_file, "\tmov.b       #%d,%sl\n", n / 2,
4590
                   names_big[REGNO (operands[4])]);
4591
          fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4592
          output_asm_insn (info.shift2, operands);
4593
          output_asm_insn ("add #0xff,%X4", operands);
4594
          fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4595
          if (n % 2)
4596
            output_asm_insn (info.shift1, operands);
4597
        }
4598
      else
4599
        {
4600
          fprintf (asm_out_file, "\tmov.b       #%d,%sl\n", n,
4601
                   names_big[REGNO (operands[4])]);
4602
          fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4603
          output_asm_insn (info.shift1, operands);
4604
          output_asm_insn ("add #0xff,%X4", operands);
4605
          fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4606
        }
4607
      return "";
4608
 
4609
    default:
4610
      gcc_unreachable ();
4611
    }
4612
}
4613
 
4614
/* Count the number of assembly instructions in a string TEMPL.  */
4615
 
4616
static unsigned int
4617
h8300_asm_insn_count (const char *templ)
4618
{
4619
  unsigned int count = 1;
4620
 
4621
  for (; *templ; templ++)
4622
    if (*templ == '\n')
4623
      count++;
4624
 
4625
  return count;
4626
}
4627
 
4628
/* Compute the length of a shift insn.  */
4629
 
4630
unsigned int
4631
compute_a_shift_length (rtx insn ATTRIBUTE_UNUSED, rtx *operands)
4632
{
4633
  rtx shift = operands[3];
4634
  enum machine_mode mode = GET_MODE (shift);
4635
  enum rtx_code code = GET_CODE (shift);
4636
  enum shift_type shift_type;
4637
  enum shift_mode shift_mode;
4638
  struct shift_info info;
4639
  unsigned int wlength = 0;
4640
 
4641
  switch (mode)
4642
    {
4643
    case QImode:
4644
      shift_mode = QIshift;
4645
      break;
4646
    case HImode:
4647
      shift_mode = HIshift;
4648
      break;
4649
    case SImode:
4650
      shift_mode = SIshift;
4651
      break;
4652
    default:
4653
      gcc_unreachable ();
4654
    }
4655
 
4656
  switch (code)
4657
    {
4658
    case ASHIFTRT:
4659
      shift_type = SHIFT_ASHIFTRT;
4660
      break;
4661
    case LSHIFTRT:
4662
      shift_type = SHIFT_LSHIFTRT;
4663
      break;
4664
    case ASHIFT:
4665
      shift_type = SHIFT_ASHIFT;
4666
      break;
4667
    default:
4668
      gcc_unreachable ();
4669
    }
4670
 
4671
  if (GET_CODE (operands[2]) != CONST_INT)
4672
    {
4673
      /* Get the assembler code to do one shift.  */
4674
      get_shift_alg (shift_type, shift_mode, 1, &info);
4675
 
4676
      return (4 + h8300_asm_insn_count (info.shift1)) * 2;
4677
    }
4678
  else
4679
    {
4680
      int n = INTVAL (operands[2]);
4681
 
4682
      /* If the count is negative, make it 0.  */
4683
      if (n < 0)
4684
        n = 0;
4685
      /* If the count is too big, truncate it.
4686
         ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4687
         do the intuitive thing.  */
4688
      else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4689
        n = GET_MODE_BITSIZE (mode);
4690
 
4691
      get_shift_alg (shift_type, shift_mode, n, &info);
4692
 
4693
      switch (info.alg)
4694
        {
4695
        case SHIFT_SPECIAL:
4696
          wlength += h8300_asm_insn_count (info.special);
4697
 
4698
          /* Every assembly instruction used in SHIFT_SPECIAL case
4699
             takes 2 bytes except xor.l, which takes 4 bytes, so if we
4700
             see xor.l, we just pretend that xor.l counts as two insns
4701
             so that the insn length will be computed correctly.  */
4702
          if (strstr (info.special, "xor.l") != NULL)
4703
            wlength++;
4704
 
4705
          /* Fall through.  */
4706
 
4707
        case SHIFT_INLINE:
4708
          n = info.remainder;
4709
 
4710
          if (info.shift2 != NULL)
4711
            {
4712
              wlength += h8300_asm_insn_count (info.shift2) * (n / 2);
4713
              n = n % 2;
4714
            }
4715
 
4716
          wlength += h8300_asm_insn_count (info.shift1) * n;
4717
 
4718
          return 2 * wlength;
4719
 
4720
        case SHIFT_ROT_AND:
4721
          {
4722
            int m = GET_MODE_BITSIZE (mode) - n;
4723
 
4724
            /* Not all possibilities of rotate are supported.  They shouldn't
4725
               be generated, but let's watch for 'em.  */
4726
            gcc_assert (info.shift1);
4727
 
4728
            if (info.shift2 != NULL)
4729
              {
4730
                wlength += h8300_asm_insn_count (info.shift2) * (m / 2);
4731
                m = m % 2;
4732
              }
4733
 
4734
            wlength += h8300_asm_insn_count (info.shift1) * m;
4735
 
4736
            /* Now mask off the high bits.  */
4737
            switch (mode)
4738
              {
4739
              case QImode:
4740
                wlength += 1;
4741
                break;
4742
              case HImode:
4743
                wlength += 2;
4744
                break;
4745
              case SImode:
4746
                gcc_assert (!TARGET_H8300);
4747
                wlength += 3;
4748
                break;
4749
              default:
4750
                gcc_unreachable ();
4751
              }
4752
            return 2 * wlength;
4753
          }
4754
 
4755
        case SHIFT_LOOP:
4756
          /* A loop to shift by a "large" constant value.
4757
             If we have shift-by-2 insns, use them.  */
4758
          if (info.shift2 != NULL)
4759
            {
4760
              wlength += 3 + h8300_asm_insn_count (info.shift2);
4761
              if (n % 2)
4762
                wlength += h8300_asm_insn_count (info.shift1);
4763
            }
4764
          else
4765
            {
4766
              wlength += 3 + h8300_asm_insn_count (info.shift1);
4767
            }
4768
          return 2 * wlength;
4769
 
4770
        default:
4771
          gcc_unreachable ();
4772
        }
4773
    }
4774
}
4775
 
4776
/* Compute which flag bits are valid after a shift insn.  */
4777
 
4778
int
4779
compute_a_shift_cc (rtx insn ATTRIBUTE_UNUSED, rtx *operands)
4780
{
4781
  rtx shift = operands[3];
4782
  enum machine_mode mode = GET_MODE (shift);
4783
  enum rtx_code code = GET_CODE (shift);
4784
  enum shift_type shift_type;
4785
  enum shift_mode shift_mode;
4786
  struct shift_info info;
4787
  int n;
4788
 
4789
  switch (mode)
4790
    {
4791
    case QImode:
4792
      shift_mode = QIshift;
4793
      break;
4794
    case HImode:
4795
      shift_mode = HIshift;
4796
      break;
4797
    case SImode:
4798
      shift_mode = SIshift;
4799
      break;
4800
    default:
4801
      gcc_unreachable ();
4802
    }
4803
 
4804
  switch (code)
4805
    {
4806
    case ASHIFTRT:
4807
      shift_type = SHIFT_ASHIFTRT;
4808
      break;
4809
    case LSHIFTRT:
4810
      shift_type = SHIFT_LSHIFTRT;
4811
      break;
4812
    case ASHIFT:
4813
      shift_type = SHIFT_ASHIFT;
4814
      break;
4815
    default:
4816
      gcc_unreachable ();
4817
    }
4818
 
4819
  /* This case must be taken care of by one of the two splitters
4820
     that convert a variable shift into a loop.  */
4821
  gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4822
 
4823
  n = INTVAL (operands[2]);
4824
 
4825
  /* If the count is negative, make it 0.  */
4826
  if (n < 0)
4827
    n = 0;
4828
  /* If the count is too big, truncate it.
4829
     ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4830
     do the intuitive thing.  */
4831
  else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4832
    n = GET_MODE_BITSIZE (mode);
4833
 
4834
  get_shift_alg (shift_type, shift_mode, n, &info);
4835
 
4836
  switch (info.alg)
4837
    {
4838
    case SHIFT_SPECIAL:
4839
      if (info.remainder == 0)
4840
        return info.cc_special;
4841
 
4842
      /* Fall through.  */
4843
 
4844
    case SHIFT_INLINE:
4845
      return info.cc_inline;
4846
 
4847
    case SHIFT_ROT_AND:
4848
      /* This case always ends with an and instruction.  */
4849
      return CC_SET_ZNV;
4850
 
4851
    case SHIFT_LOOP:
4852
      /* A loop to shift by a "large" constant value.
4853
         If we have shift-by-2 insns, use them.  */
4854
      if (info.shift2 != NULL)
4855
        {
4856
          if (n % 2)
4857
            return info.cc_inline;
4858
        }
4859
      return CC_CLOBBER;
4860
 
4861
    default:
4862
      gcc_unreachable ();
4863
    }
4864
}
4865
 
4866
/* A rotation by a non-constant will cause a loop to be generated, in
4867
   which a rotation by one bit is used.  A rotation by a constant,
4868
   including the one in the loop, will be taken care of by
4869
   output_a_rotate () at the insn emit time.  */
4870
 
4871
int
4872
expand_a_rotate (rtx operands[])
4873
{
4874
  rtx dst = operands[0];
4875
  rtx src = operands[1];
4876
  rtx rotate_amount = operands[2];
4877
  enum machine_mode mode = GET_MODE (dst);
4878
 
4879
  if (h8sx_classify_shift (mode, ROTATE, rotate_amount) == H8SX_SHIFT_UNARY)
4880
    return false;
4881
 
4882
  /* We rotate in place.  */
4883
  emit_move_insn (dst, src);
4884
 
4885
  if (GET_CODE (rotate_amount) != CONST_INT)
4886
    {
4887
      rtx counter = gen_reg_rtx (QImode);
4888
      rtx start_label = gen_label_rtx ();
4889
      rtx end_label = gen_label_rtx ();
4890
 
4891
      /* If the rotate amount is less than or equal to 0,
4892
         we go out of the loop.  */
4893
      emit_cmp_and_jump_insns (rotate_amount, const0_rtx, LE, NULL_RTX,
4894
                               QImode, 0, end_label);
4895
 
4896
      /* Initialize the loop counter.  */
4897
      emit_move_insn (counter, rotate_amount);
4898
 
4899
      emit_label (start_label);
4900
 
4901
      /* Rotate by one bit.  */
4902
      switch (mode)
4903
        {
4904
        case QImode:
4905
          emit_insn (gen_rotlqi3_1 (dst, dst, const1_rtx));
4906
          break;
4907
        case HImode:
4908
          emit_insn (gen_rotlhi3_1 (dst, dst, const1_rtx));
4909
          break;
4910
        case SImode:
4911
          emit_insn (gen_rotlsi3_1 (dst, dst, const1_rtx));
4912
          break;
4913
        default:
4914
          gcc_unreachable ();
4915
        }
4916
 
4917
      /* Decrement the counter by 1.  */
4918
      emit_insn (gen_addqi3 (counter, counter, constm1_rtx));
4919
 
4920
      /* If the loop counter is nonzero, we go back to the beginning
4921
         of the loop.  */
4922
      emit_cmp_and_jump_insns (counter, const0_rtx, NE, NULL_RTX, QImode, 1,
4923
                               start_label);
4924
 
4925
      emit_label (end_label);
4926
    }
4927
  else
4928
    {
4929
      /* Rotate by AMOUNT bits.  */
4930
      switch (mode)
4931
        {
4932
        case QImode:
4933
          emit_insn (gen_rotlqi3_1 (dst, dst, rotate_amount));
4934
          break;
4935
        case HImode:
4936
          emit_insn (gen_rotlhi3_1 (dst, dst, rotate_amount));
4937
          break;
4938
        case SImode:
4939
          emit_insn (gen_rotlsi3_1 (dst, dst, rotate_amount));
4940
          break;
4941
        default:
4942
          gcc_unreachable ();
4943
        }
4944
    }
4945
 
4946
  return 1;
4947
}
4948
 
4949
/* Output a rotate insn.  */
4950
 
4951
const char *
4952
output_a_rotate (enum rtx_code code, rtx *operands)
4953
{
4954
  rtx dst = operands[0];
4955
  rtx rotate_amount = operands[2];
4956
  enum shift_mode rotate_mode;
4957
  enum shift_type rotate_type;
4958
  const char *insn_buf;
4959
  int bits;
4960
  int amount;
4961
  enum machine_mode mode = GET_MODE (dst);
4962
 
4963
  gcc_assert (GET_CODE (rotate_amount) == CONST_INT);
4964
 
4965
  switch (mode)
4966
    {
4967
    case QImode:
4968
      rotate_mode = QIshift;
4969
      break;
4970
    case HImode:
4971
      rotate_mode = HIshift;
4972
      break;
4973
    case SImode:
4974
      rotate_mode = SIshift;
4975
      break;
4976
    default:
4977
      gcc_unreachable ();
4978
    }
4979
 
4980
  switch (code)
4981
    {
4982
    case ROTATERT:
4983
      rotate_type = SHIFT_ASHIFT;
4984
      break;
4985
    case ROTATE:
4986
      rotate_type = SHIFT_LSHIFTRT;
4987
      break;
4988
    default:
4989
      gcc_unreachable ();
4990
    }
4991
 
4992
  amount = INTVAL (rotate_amount);
4993
 
4994
  /* Clean up AMOUNT.  */
4995
  if (amount < 0)
4996
    amount = 0;
4997
  if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4998
    amount = GET_MODE_BITSIZE (mode);
4999
 
5000
  /* Determine the faster direction.  After this phase, amount will be
5001
     at most a half of GET_MODE_BITSIZE (mode).  */
5002
  if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
5003
    {
5004
      /* Flip the direction.  */
5005
      amount = GET_MODE_BITSIZE (mode) - amount;
5006
      rotate_type =
5007
        (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
5008
    }
5009
 
5010
  /* See if a byte swap (in HImode) or a word swap (in SImode) can
5011
     boost up the rotation.  */
5012
  if ((mode == HImode && TARGET_H8300 && amount >= 5)
5013
      || (mode == HImode && TARGET_H8300H && amount >= 6)
5014
      || (mode == HImode && TARGET_H8300S && amount == 8)
5015
      || (mode == SImode && TARGET_H8300H && amount >= 10)
5016
      || (mode == SImode && TARGET_H8300S && amount >= 13))
5017
    {
5018
      switch (mode)
5019
        {
5020
        case HImode:
5021
          /* This code works on any family.  */
5022
          insn_buf = "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
5023
          output_asm_insn (insn_buf, operands);
5024
          break;
5025
 
5026
        case SImode:
5027
          /* This code works on the H8/300H and H8S.  */
5028
          insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
5029
          output_asm_insn (insn_buf, operands);
5030
          break;
5031
 
5032
        default:
5033
          gcc_unreachable ();
5034
        }
5035
 
5036
      /* Adjust AMOUNT and flip the direction.  */
5037
      amount = GET_MODE_BITSIZE (mode) / 2 - amount;
5038
      rotate_type =
5039
        (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
5040
    }
5041
 
5042
  /* Output rotate insns.  */
5043
  for (bits = TARGET_H8300S ? 2 : 1; bits > 0; bits /= 2)
5044
    {
5045
      if (bits == 2)
5046
        insn_buf = rotate_two[rotate_type][rotate_mode];
5047
      else
5048
        insn_buf = rotate_one[cpu_type][rotate_type][rotate_mode];
5049
 
5050
      for (; amount >= bits; amount -= bits)
5051
        output_asm_insn (insn_buf, operands);
5052
    }
5053
 
5054
  return "";
5055
}
5056
 
5057
/* Compute the length of a rotate insn.  */
5058
 
5059
unsigned int
5060
compute_a_rotate_length (rtx *operands)
5061
{
5062
  rtx src = operands[1];
5063
  rtx amount_rtx = operands[2];
5064
  enum machine_mode mode = GET_MODE (src);
5065
  int amount;
5066
  unsigned int length = 0;
5067
 
5068
  gcc_assert (GET_CODE (amount_rtx) == CONST_INT);
5069
 
5070
  amount = INTVAL (amount_rtx);
5071
 
5072
  /* Clean up AMOUNT.  */
5073
  if (amount < 0)
5074
    amount = 0;
5075
  if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
5076
    amount = GET_MODE_BITSIZE (mode);
5077
 
5078
  /* Determine the faster direction.  After this phase, amount
5079
     will be at most a half of GET_MODE_BITSIZE (mode).  */
5080
  if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
5081
    /* Flip the direction.  */
5082
    amount = GET_MODE_BITSIZE (mode) - amount;
5083
 
5084
  /* See if a byte swap (in HImode) or a word swap (in SImode) can
5085
     boost up the rotation.  */
5086
  if ((mode == HImode && TARGET_H8300 && amount >= 5)
5087
      || (mode == HImode && TARGET_H8300H && amount >= 6)
5088
      || (mode == HImode && TARGET_H8300S && amount == 8)
5089
      || (mode == SImode && TARGET_H8300H && amount >= 10)
5090
      || (mode == SImode && TARGET_H8300S && amount >= 13))
5091
    {
5092
      /* Adjust AMOUNT and flip the direction.  */
5093
      amount = GET_MODE_BITSIZE (mode) / 2 - amount;
5094
      length += 6;
5095
    }
5096
 
5097
  /* We use 2-bit rotations on the H8S.  */
5098
  if (TARGET_H8300S)
5099
    amount = amount / 2 + amount % 2;
5100
 
5101
  /* The H8/300 uses three insns to rotate one bit, taking 6
5102
     length.  */
5103
  length += amount * ((TARGET_H8300 && mode == HImode) ? 6 : 2);
5104
 
5105
  return length;
5106
}
5107
 
5108
/* Fix the operands of a gen_xxx so that it could become a bit
5109
   operating insn.  */
5110
 
5111
int
5112
fix_bit_operand (rtx *operands, enum rtx_code code)
5113
{
5114
  /* The bit_operand predicate accepts any memory during RTL generation, but
5115
     only 'U' memory afterwards, so if this is a MEM operand, we must force
5116
     it to be valid for 'U' by reloading the address.  */
5117
 
5118
  if (code == AND
5119
      ? single_zero_operand (operands[2], QImode)
5120
      : single_one_operand (operands[2], QImode))
5121
    {
5122
      /* OK to have a memory dest.  */
5123
      if (GET_CODE (operands[0]) == MEM
5124
          && !OK_FOR_U (operands[0]))
5125
        {
5126
          rtx mem = gen_rtx_MEM (GET_MODE (operands[0]),
5127
                                 copy_to_mode_reg (Pmode,
5128
                                                   XEXP (operands[0], 0)));
5129
          MEM_COPY_ATTRIBUTES (mem, operands[0]);
5130
          operands[0] = mem;
5131
        }
5132
 
5133
      if (GET_CODE (operands[1]) == MEM
5134
          && !OK_FOR_U (operands[1]))
5135
        {
5136
          rtx mem = gen_rtx_MEM (GET_MODE (operands[1]),
5137
                                 copy_to_mode_reg (Pmode,
5138
                                                   XEXP (operands[1], 0)));
5139
          MEM_COPY_ATTRIBUTES (mem, operands[0]);
5140
          operands[1] = mem;
5141
        }
5142
      return 0;
5143
    }
5144
 
5145
  /* Dest and src op must be register.  */
5146
 
5147
  operands[1] = force_reg (QImode, operands[1]);
5148
  {
5149
    rtx res = gen_reg_rtx (QImode);
5150
    switch (code)
5151
      {
5152
      case AND:
5153
        emit_insn (gen_andqi3_1 (res, operands[1], operands[2]));
5154
        break;
5155
      case IOR:
5156
        emit_insn (gen_iorqi3_1 (res, operands[1], operands[2]));
5157
        break;
5158
      case XOR:
5159
        emit_insn (gen_xorqi3_1 (res, operands[1], operands[2]));
5160
        break;
5161
      default:
5162
        gcc_unreachable ();
5163
      }
5164
    emit_insn (gen_movqi (operands[0], res));
5165
  }
5166
  return 1;
5167
}
5168
 
5169
/* Return nonzero if FUNC is an interrupt function as specified
5170
   by the "interrupt" attribute.  */
5171
 
5172
static int
5173
h8300_interrupt_function_p (tree func)
5174
{
5175
  tree a;
5176
 
5177
  if (TREE_CODE (func) != FUNCTION_DECL)
5178
    return 0;
5179
 
5180
  a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
5181
  return a != NULL_TREE;
5182
}
5183
 
5184
/* Return nonzero if FUNC is a saveall function as specified by the
5185
   "saveall" attribute.  */
5186
 
5187
static int
5188
h8300_saveall_function_p (tree func)
5189
{
5190
  tree a;
5191
 
5192
  if (TREE_CODE (func) != FUNCTION_DECL)
5193
    return 0;
5194
 
5195
  a = lookup_attribute ("saveall", DECL_ATTRIBUTES (func));
5196
  return a != NULL_TREE;
5197
}
5198
 
5199
/* Return nonzero if FUNC is an OS_Task function as specified
5200
   by the "OS_Task" attribute.  */
5201
 
5202
static int
5203
h8300_os_task_function_p (tree func)
5204
{
5205
  tree a;
5206
 
5207
  if (TREE_CODE (func) != FUNCTION_DECL)
5208
    return 0;
5209
 
5210
  a = lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func));
5211
  return a != NULL_TREE;
5212
}
5213
 
5214
/* Return nonzero if FUNC is a monitor function as specified
5215
   by the "monitor" attribute.  */
5216
 
5217
static int
5218
h8300_monitor_function_p (tree func)
5219
{
5220
  tree a;
5221
 
5222
  if (TREE_CODE (func) != FUNCTION_DECL)
5223
    return 0;
5224
 
5225
  a = lookup_attribute ("monitor", DECL_ATTRIBUTES (func));
5226
  return a != NULL_TREE;
5227
}
5228
 
5229
/* Return nonzero if FUNC is a function that should be called
5230
   through the function vector.  */
5231
 
5232
int
5233
h8300_funcvec_function_p (tree func)
5234
{
5235
  tree a;
5236
 
5237
  if (TREE_CODE (func) != FUNCTION_DECL)
5238
    return 0;
5239
 
5240
  a = lookup_attribute ("function_vector", DECL_ATTRIBUTES (func));
5241
  return a != NULL_TREE;
5242
}
5243
 
5244
/* Return nonzero if DECL is a variable that's in the eight bit
5245
   data area.  */
5246
 
5247
int
5248
h8300_eightbit_data_p (tree decl)
5249
{
5250
  tree a;
5251
 
5252
  if (TREE_CODE (decl) != VAR_DECL)
5253
    return 0;
5254
 
5255
  a = lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl));
5256
  return a != NULL_TREE;
5257
}
5258
 
5259
/* Return nonzero if DECL is a variable that's in the tiny
5260
   data area.  */
5261
 
5262
int
5263
h8300_tiny_data_p (tree decl)
5264
{
5265
  tree a;
5266
 
5267
  if (TREE_CODE (decl) != VAR_DECL)
5268
    return 0;
5269
 
5270
  a = lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl));
5271
  return a != NULL_TREE;
5272
}
5273
 
5274
/* Generate an 'interrupt_handler' attribute for decls.  We convert
5275
   all the pragmas to corresponding attributes.  */
5276
 
5277
static void
5278
h8300_insert_attributes (tree node, tree *attributes)
5279
{
5280
  if (TREE_CODE (node) == FUNCTION_DECL)
5281
    {
5282
      if (pragma_interrupt)
5283
        {
5284
          pragma_interrupt = 0;
5285
 
5286
          /* Add an 'interrupt_handler' attribute.  */
5287
          *attributes = tree_cons (get_identifier ("interrupt_handler"),
5288
                                   NULL, *attributes);
5289
        }
5290
 
5291
      if (pragma_saveall)
5292
        {
5293
          pragma_saveall = 0;
5294
 
5295
          /* Add an 'saveall' attribute.  */
5296
          *attributes = tree_cons (get_identifier ("saveall"),
5297
                                   NULL, *attributes);
5298
        }
5299
    }
5300
}
5301
 
5302
/* Supported attributes:
5303
 
5304
   interrupt_handler: output a prologue and epilogue suitable for an
5305
   interrupt handler.
5306
 
5307
   saveall: output a prologue and epilogue that saves and restores
5308
   all registers except the stack pointer.
5309
 
5310
   function_vector: This function should be called through the
5311
   function vector.
5312
 
5313
   eightbit_data: This variable lives in the 8-bit data area and can
5314
   be referenced with 8-bit absolute memory addresses.
5315
 
5316
   tiny_data: This variable lives in the tiny data area and can be
5317
   referenced with 16-bit absolute memory references.  */
5318
 
5319
static const struct attribute_spec h8300_attribute_table[] =
5320
{
5321
  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
5322
  { "interrupt_handler", 0, 0, true,  false, false, h8300_handle_fndecl_attribute },
5323
  { "saveall",           0, 0, true,  false, false, h8300_handle_fndecl_attribute },
5324
  { "OS_Task",           0, 0, true,  false, false, h8300_handle_fndecl_attribute },
5325
  { "monitor",           0, 0, true,  false, false, h8300_handle_fndecl_attribute },
5326
  { "function_vector",   0, 0, true,  false, false, h8300_handle_fndecl_attribute },
5327
  { "eightbit_data",     0, 0, true,  false, false, h8300_handle_eightbit_data_attribute },
5328
  { "tiny_data",         0, 0, true,  false, false, h8300_handle_tiny_data_attribute },
5329
  { NULL,                0, 0, false, false, false, NULL }
5330
};
5331
 
5332
 
5333
/* Handle an attribute requiring a FUNCTION_DECL; arguments as in
5334
   struct attribute_spec.handler.  */
5335
static tree
5336
h8300_handle_fndecl_attribute (tree *node, tree name,
5337
                               tree args ATTRIBUTE_UNUSED,
5338
                               int flags ATTRIBUTE_UNUSED,
5339
                               bool *no_add_attrs)
5340
{
5341
  if (TREE_CODE (*node) != FUNCTION_DECL)
5342
    {
5343
      warning (OPT_Wattributes, "%qE attribute only applies to functions",
5344
               name);
5345
      *no_add_attrs = true;
5346
    }
5347
 
5348
  return NULL_TREE;
5349
}
5350
 
5351
/* Handle an "eightbit_data" attribute; arguments as in
5352
   struct attribute_spec.handler.  */
5353
static tree
5354
h8300_handle_eightbit_data_attribute (tree *node, tree name,
5355
                                      tree args ATTRIBUTE_UNUSED,
5356
                                      int flags ATTRIBUTE_UNUSED,
5357
                                      bool *no_add_attrs)
5358
{
5359
  tree decl = *node;
5360
 
5361
  if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
5362
    {
5363
      DECL_SECTION_NAME (decl) = build_string (7, ".eight");
5364
    }
5365
  else
5366
    {
5367
      warning (OPT_Wattributes, "%qE attribute ignored",
5368
               name);
5369
      *no_add_attrs = true;
5370
    }
5371
 
5372
  return NULL_TREE;
5373
}
5374
 
5375
/* Handle an "tiny_data" attribute; arguments as in
5376
   struct attribute_spec.handler.  */
5377
static tree
5378
h8300_handle_tiny_data_attribute (tree *node, tree name,
5379
                                  tree args ATTRIBUTE_UNUSED,
5380
                                  int flags ATTRIBUTE_UNUSED,
5381
                                  bool *no_add_attrs)
5382
{
5383
  tree decl = *node;
5384
 
5385
  if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
5386
    {
5387
      DECL_SECTION_NAME (decl) = build_string (6, ".tiny");
5388
    }
5389
  else
5390
    {
5391
      warning (OPT_Wattributes, "%qE attribute ignored",
5392
               name);
5393
      *no_add_attrs = true;
5394
    }
5395
 
5396
  return NULL_TREE;
5397
}
5398
 
5399
/* Mark function vectors, and various small data objects.  */
5400
 
5401
static void
5402
h8300_encode_section_info (tree decl, rtx rtl, int first)
5403
{
5404
  int extra_flags = 0;
5405
 
5406
  default_encode_section_info (decl, rtl, first);
5407
 
5408
  if (TREE_CODE (decl) == FUNCTION_DECL
5409
      && h8300_funcvec_function_p (decl))
5410
    extra_flags = SYMBOL_FLAG_FUNCVEC_FUNCTION;
5411
  else if (TREE_CODE (decl) == VAR_DECL
5412
           && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
5413
    {
5414
      if (h8300_eightbit_data_p (decl))
5415
        extra_flags = SYMBOL_FLAG_EIGHTBIT_DATA;
5416
      else if (first && h8300_tiny_data_p (decl))
5417
        extra_flags = SYMBOL_FLAG_TINY_DATA;
5418
    }
5419
 
5420
  if (extra_flags)
5421
    SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
5422
}
5423
 
5424
/* Output a single-bit extraction.  */
5425
 
5426
const char *
5427
output_simode_bld (int bild, rtx operands[])
5428
{
5429
  if (TARGET_H8300)
5430
    {
5431
      /* Clear the destination register.  */
5432
      output_asm_insn ("sub.w\t%e0,%e0\n\tsub.w\t%f0,%f0", operands);
5433
 
5434
      /* Now output the bit load or bit inverse load, and store it in
5435
         the destination.  */
5436
      if (bild)
5437
        output_asm_insn ("bild\t%Z2,%Y1", operands);
5438
      else
5439
        output_asm_insn ("bld\t%Z2,%Y1", operands);
5440
 
5441
      output_asm_insn ("bst\t#0,%w0", operands);
5442
    }
5443
  else
5444
    {
5445
      /* Determine if we can clear the destination first.  */
5446
      int clear_first = (REG_P (operands[0]) && REG_P (operands[1])
5447
                         && REGNO (operands[0]) != REGNO (operands[1]));
5448
 
5449
      if (clear_first)
5450
        output_asm_insn ("sub.l\t%S0,%S0", operands);
5451
 
5452
      /* Output the bit load or bit inverse load.  */
5453
      if (bild)
5454
        output_asm_insn ("bild\t%Z2,%Y1", operands);
5455
      else
5456
        output_asm_insn ("bld\t%Z2,%Y1", operands);
5457
 
5458
      if (!clear_first)
5459
        output_asm_insn ("xor.l\t%S0,%S0", operands);
5460
 
5461
      /* Perform the bit store.  */
5462
      output_asm_insn ("rotxl.l\t%S0", operands);
5463
    }
5464
 
5465
  /* All done.  */
5466
  return "";
5467
}
5468
 
5469
/* Delayed-branch scheduling is more effective if we have some idea
5470
   how long each instruction will be.  Use a shorten_branches pass
5471
   to get an initial estimate.  */
5472
 
5473
static void
5474
h8300_reorg (void)
5475
{
5476
  if (flag_delayed_branch)
5477
    shorten_branches (get_insns ());
5478
}
5479
 
5480
#ifndef OBJECT_FORMAT_ELF
5481
static void
5482
h8300_asm_named_section (const char *name, unsigned int flags ATTRIBUTE_UNUSED,
5483
                         tree decl)
5484
{
5485
  /* ??? Perhaps we should be using default_coff_asm_named_section.  */
5486
  fprintf (asm_out_file, "\t.section %s\n", name);
5487
}
5488
#endif /* ! OBJECT_FORMAT_ELF */
5489
 
5490
/* Nonzero if X is a constant address suitable as an 8-bit absolute,
5491
   which is a special case of the 'R' operand.  */
5492
 
5493
int
5494
h8300_eightbit_constant_address_p (rtx x)
5495
{
5496
  /* The ranges of the 8-bit area.  */
5497
  const unsigned HOST_WIDE_INT n1 = trunc_int_for_mode (0xff00, HImode);
5498
  const unsigned HOST_WIDE_INT n2 = trunc_int_for_mode (0xffff, HImode);
5499
  const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00ffff00, SImode);
5500
  const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00ffffff, SImode);
5501
  const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0xffffff00, SImode);
5502
  const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0xffffffff, SImode);
5503
 
5504
  unsigned HOST_WIDE_INT addr;
5505
 
5506
  /* We accept symbols declared with eightbit_data.  */
5507
  if (GET_CODE (x) == SYMBOL_REF)
5508
    return (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0;
5509
 
5510
  if (GET_CODE (x) != CONST_INT)
5511
    return 0;
5512
 
5513
  addr = INTVAL (x);
5514
 
5515
  return (0
5516
          || ((TARGET_H8300 || TARGET_NORMAL_MODE) && IN_RANGE (addr, n1, n2))
5517
          || (TARGET_H8300H && IN_RANGE (addr, h1, h2))
5518
          || (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
5519
}
5520
 
5521
/* Nonzero if X is a constant address suitable as an 16-bit absolute
5522
   on H8/300H and H8S.  */
5523
 
5524
int
5525
h8300_tiny_constant_address_p (rtx x)
5526
{
5527
  /* The ranges of the 16-bit area.  */
5528
  const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00000000, SImode);
5529
  const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00007fff, SImode);
5530
  const unsigned HOST_WIDE_INT h3 = trunc_int_for_mode (0x00ff8000, SImode);
5531
  const unsigned HOST_WIDE_INT h4 = trunc_int_for_mode (0x00ffffff, SImode);
5532
  const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0x00000000, SImode);
5533
  const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0x00007fff, SImode);
5534
  const unsigned HOST_WIDE_INT s3 = trunc_int_for_mode (0xffff8000, SImode);
5535
  const unsigned HOST_WIDE_INT s4 = trunc_int_for_mode (0xffffffff, SImode);
5536
 
5537
  unsigned HOST_WIDE_INT addr;
5538
 
5539
  switch (GET_CODE (x))
5540
    {
5541
    case SYMBOL_REF:
5542
      /* In the normal mode, any symbol fits in the 16-bit absolute
5543
         address range.  We also accept symbols declared with
5544
         tiny_data.  */
5545
      return (TARGET_NORMAL_MODE
5546
              || (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_TINY_DATA) != 0);
5547
 
5548
    case CONST_INT:
5549
      addr = INTVAL (x);
5550
      return (TARGET_NORMAL_MODE
5551
              || (TARGET_H8300H
5552
                  && (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
5553
              || (TARGET_H8300S
5554
                  && (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));
5555
 
5556
    case CONST:
5557
      return TARGET_NORMAL_MODE;
5558
 
5559
    default:
5560
      return 0;
5561
    }
5562
 
5563
}
5564
 
5565
/* Return nonzero if ADDR1 and ADDR2 point to consecutive memory
5566
   locations that can be accessed as a 16-bit word.  */
5567
 
5568
int
5569
byte_accesses_mergeable_p (rtx addr1, rtx addr2)
5570
{
5571
  HOST_WIDE_INT offset1, offset2;
5572
  rtx reg1, reg2;
5573
 
5574
  if (REG_P (addr1))
5575
    {
5576
      reg1 = addr1;
5577
      offset1 = 0;
5578
    }
5579
  else if (GET_CODE (addr1) == PLUS
5580
           && REG_P (XEXP (addr1, 0))
5581
           && GET_CODE (XEXP (addr1, 1)) == CONST_INT)
5582
    {
5583
      reg1 = XEXP (addr1, 0);
5584
      offset1 = INTVAL (XEXP (addr1, 1));
5585
    }
5586
  else
5587
    return 0;
5588
 
5589
  if (REG_P (addr2))
5590
    {
5591
      reg2 = addr2;
5592
      offset2 = 0;
5593
    }
5594
  else if (GET_CODE (addr2) == PLUS
5595
           && REG_P (XEXP (addr2, 0))
5596
           && GET_CODE (XEXP (addr2, 1)) == CONST_INT)
5597
    {
5598
      reg2 = XEXP (addr2, 0);
5599
      offset2 = INTVAL (XEXP (addr2, 1));
5600
    }
5601
  else
5602
    return 0;
5603
 
5604
  if (((reg1 == stack_pointer_rtx && reg2 == stack_pointer_rtx)
5605
       || (reg1 == frame_pointer_rtx && reg2 == frame_pointer_rtx))
5606
      && offset1 % 2 == 0
5607
      && offset1 + 1 == offset2)
5608
    return 1;
5609
 
5610
  return 0;
5611
}
5612
 
5613
/* Return nonzero if we have the same comparison insn as I3 two insns
5614
   before I3.  I3 is assumed to be a comparison insn.  */
5615
 
5616
int
5617
same_cmp_preceding_p (rtx i3)
5618
{
5619
  rtx i1, i2;
5620
 
5621
  /* Make sure we have a sequence of three insns.  */
5622
  i2 = prev_nonnote_insn (i3);
5623
  if (i2 == NULL_RTX)
5624
    return 0;
5625
  i1 = prev_nonnote_insn (i2);
5626
  if (i1 == NULL_RTX)
5627
    return 0;
5628
 
5629
  return (INSN_P (i1) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5630
          && any_condjump_p (i2) && onlyjump_p (i2));
5631
}
5632
 
5633
/* Return nonzero if we have the same comparison insn as I1 two insns
5634
   after I1.  I1 is assumed to be a comparison insn.  */
5635
 
5636
int
5637
same_cmp_following_p (rtx i1)
5638
{
5639
  rtx i2, i3;
5640
 
5641
  /* Make sure we have a sequence of three insns.  */
5642
  i2 = next_nonnote_insn (i1);
5643
  if (i2 == NULL_RTX)
5644
    return 0;
5645
  i3 = next_nonnote_insn (i2);
5646
  if (i3 == NULL_RTX)
5647
    return 0;
5648
 
5649
  return (INSN_P (i3) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5650
          && any_condjump_p (i2) && onlyjump_p (i2));
5651
}
5652
 
5653
/* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
5654
   (or pops) N registers.  OPERANDS are assumed to be an array of
5655
   registers.  */
5656
 
5657
int
5658
h8300_regs_ok_for_stm (int n, rtx operands[])
5659
{
5660
  switch (n)
5661
    {
5662
    case 2:
5663
      return ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
5664
              || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
5665
              || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5));
5666
    case 3:
5667
      return ((REGNO (operands[0]) == 0
5668
               && REGNO (operands[1]) == 1
5669
               && REGNO (operands[2]) == 2)
5670
              || (REGNO (operands[0]) == 4
5671
                  && REGNO (operands[1]) == 5
5672
                  && REGNO (operands[2]) == 6));
5673
 
5674
    case 4:
5675
      return (REGNO (operands[0]) == 0
5676
              && REGNO (operands[1]) == 1
5677
              && REGNO (operands[2]) == 2
5678
              && REGNO (operands[3]) == 3);
5679
    default:
5680
      gcc_unreachable ();
5681
    }
5682
}
5683
 
5684
/* Return nonzero if register OLD_REG can be renamed to register NEW_REG.  */
5685
 
5686
int
5687
h8300_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
5688
                            unsigned int new_reg)
5689
{
5690
  /* Interrupt functions can only use registers that have already been
5691
     saved by the prologue, even if they would normally be
5692
     call-clobbered.  */
5693
 
5694
  if (h8300_current_function_interrupt_function_p ()
5695
      && !df_regs_ever_live_p (new_reg))
5696
    return 0;
5697
 
5698
  return 1;
5699
}
5700
 
5701
/* Returns true if register REGNO is safe to be allocated as a scratch
5702
   register in the current function.  */
5703
 
5704
static bool
5705
h8300_hard_regno_scratch_ok (unsigned int regno)
5706
{
5707
  if (h8300_current_function_interrupt_function_p ()
5708
      && ! WORD_REG_USED (regno))
5709
    return false;
5710
 
5711
  return true;
5712
}
5713
 
5714
 
5715
/* Return nonzero if X is a legitimate constant.  */
5716
 
5717
int
5718
h8300_legitimate_constant_p (rtx x ATTRIBUTE_UNUSED)
5719
{
5720
  return 1;
5721
}
5722
 
5723
/* Return nonzero if X is a REG or SUBREG suitable as a base register.  */
5724
 
5725
static int
5726
h8300_rtx_ok_for_base_p (rtx x, int strict)
5727
{
5728
  /* Strip off SUBREG if any.  */
5729
  if (GET_CODE (x) == SUBREG)
5730
    x = SUBREG_REG (x);
5731
 
5732
  return (REG_P (x)
5733
          && (strict
5734
              ? REG_OK_FOR_BASE_STRICT_P (x)
5735
              : REG_OK_FOR_BASE_NONSTRICT_P (x)));
5736
}
5737
 
5738
/* Return nozero if X is a legitimate address.  On the H8/300, a
5739
   legitimate address has the form REG, REG+CONSTANT_ADDRESS or
5740
   CONSTANT_ADDRESS.  */
5741
 
5742
static bool
5743
h8300_legitimate_address_p (enum machine_mode mode, rtx x, bool strict)
5744
{
5745
  /* The register indirect addresses like @er0 is always valid.  */
5746
  if (h8300_rtx_ok_for_base_p (x, strict))
5747
    return 1;
5748
 
5749
  if (CONSTANT_ADDRESS_P (x))
5750
    return 1;
5751
 
5752
  if (TARGET_H8300SX
5753
      && (   GET_CODE (x) == PRE_INC
5754
          || GET_CODE (x) == PRE_DEC
5755
          || GET_CODE (x) == POST_INC
5756
          || GET_CODE (x) == POST_DEC)
5757
      && h8300_rtx_ok_for_base_p (XEXP (x, 0), strict))
5758
    return 1;
5759
 
5760
  if (GET_CODE (x) == PLUS
5761
      && CONSTANT_ADDRESS_P (XEXP (x, 1))
5762
      && h8300_rtx_ok_for_base_p (h8300_get_index (XEXP (x, 0),
5763
                                                   mode, 0), strict))
5764
    return 1;
5765
 
5766
  return 0;
5767
}
5768
 
5769
/* Worker function for HARD_REGNO_NREGS.
5770
 
5771
   We pretend the MAC register is 32bits -- we don't have any data
5772
   types on the H8 series to handle more than 32bits.  */
5773
 
5774
int
5775
h8300_hard_regno_nregs (int regno ATTRIBUTE_UNUSED, enum machine_mode mode)
5776
{
5777
  return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5778
}
5779
 
5780
/* Worker function for HARD_REGNO_MODE_OK.  */
5781
 
5782
int
5783
h8300_hard_regno_mode_ok (int regno, enum machine_mode mode)
5784
{
5785
  if (TARGET_H8300)
5786
    /* If an even reg, then anything goes.  Otherwise the mode must be
5787
       QI or HI.  */
5788
    return ((regno & 1) == 0) || (mode == HImode) || (mode == QImode);
5789
  else
5790
    /* MAC register can only be of SImode.  Otherwise, anything
5791
       goes.  */
5792
    return regno == MAC_REG ? mode == SImode : 1;
5793
}
5794
 
5795
/* Perform target dependent optabs initialization.  */
5796
static void
5797
h8300_init_libfuncs (void)
5798
{
5799
  set_optab_libfunc (smul_optab, HImode, "__mulhi3");
5800
  set_optab_libfunc (sdiv_optab, HImode, "__divhi3");
5801
  set_optab_libfunc (udiv_optab, HImode, "__udivhi3");
5802
  set_optab_libfunc (smod_optab, HImode, "__modhi3");
5803
  set_optab_libfunc (umod_optab, HImode, "__umodhi3");
5804
}
5805
 
5806
/* Worker function for TARGET_RETURN_IN_MEMORY.  */
5807
 
5808
static bool
5809
h8300_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
5810
{
5811
  return (TYPE_MODE (type) == BLKmode
5812
          || GET_MODE_SIZE (TYPE_MODE (type)) > (TARGET_H8300 ? 4 : 8));
5813
}
5814
 
5815
/* We emit the entire trampoline here.  Depending on the pointer size,
5816
   we use a different trampoline.
5817
 
5818
   Pmode == HImode
5819
              vvvv context
5820
   1 0000 7903xxxx              mov.w   #0x1234,r3
5821
   2 0004 5A00xxxx              jmp     @0x1234
5822
              ^^^^ function
5823
 
5824
   Pmode == SImode
5825
              vvvvvvvv context
5826
   2 0000 7A03xxxxxxxx          mov.l   #0x12345678,er3
5827
   3 0006 5Axxxxxx              jmp     @0x123456
5828
            ^^^^^^ function
5829
*/
5830
 
5831
static void
5832
h8300_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
5833
{
5834
  rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
5835
  rtx mem;
5836
 
5837
  if (Pmode == HImode)
5838
    {
5839
      mem = adjust_address (m_tramp, HImode, 0);
5840
      emit_move_insn (mem, GEN_INT (0x7903));
5841
      mem = adjust_address (m_tramp, Pmode, 2);
5842
      emit_move_insn (mem, cxt);
5843
      mem = adjust_address (m_tramp, HImode, 4);
5844
      emit_move_insn (mem, GEN_INT (0x5a00));
5845
      mem = adjust_address (m_tramp, Pmode, 6);
5846
      emit_move_insn (mem, fnaddr);
5847
    }
5848
  else
5849
    {
5850
      rtx tem;
5851
 
5852
      mem = adjust_address (m_tramp, HImode, 0);
5853
      emit_move_insn (mem, GEN_INT (0x7a03));
5854
      mem = adjust_address (m_tramp, Pmode, 2);
5855
      emit_move_insn (mem, cxt);
5856
 
5857
      tem = copy_to_reg (fnaddr);
5858
      emit_insn (gen_andsi3 (tem, tem, GEN_INT (0x00ffffff)));
5859
      emit_insn (gen_iorsi3 (tem, tem, GEN_INT (0x5a000000)));
5860
      mem = adjust_address (m_tramp, SImode, 6);
5861
      emit_move_insn (mem, tem);
5862
    }
5863
}
5864
 
5865
/* Initialize the GCC target structure.  */
5866
#undef TARGET_ATTRIBUTE_TABLE
5867
#define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
5868
 
5869
#undef TARGET_ASM_ALIGNED_HI_OP
5870
#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
5871
 
5872
#undef TARGET_ASM_FILE_START
5873
#define TARGET_ASM_FILE_START h8300_file_start
5874
#undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
5875
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
5876
 
5877
#undef TARGET_ASM_FILE_END
5878
#define TARGET_ASM_FILE_END h8300_file_end
5879
 
5880
#undef TARGET_ENCODE_SECTION_INFO
5881
#define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
5882
 
5883
#undef TARGET_INSERT_ATTRIBUTES
5884
#define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
5885
 
5886
#undef TARGET_RTX_COSTS
5887
#define TARGET_RTX_COSTS h8300_rtx_costs
5888
 
5889
#undef TARGET_INIT_LIBFUNCS
5890
#define TARGET_INIT_LIBFUNCS h8300_init_libfuncs
5891
 
5892
#undef TARGET_RETURN_IN_MEMORY
5893
#define TARGET_RETURN_IN_MEMORY h8300_return_in_memory
5894
 
5895
#undef  TARGET_MACHINE_DEPENDENT_REORG
5896
#define TARGET_MACHINE_DEPENDENT_REORG h8300_reorg
5897
 
5898
#undef TARGET_HARD_REGNO_SCRATCH_OK
5899
#define TARGET_HARD_REGNO_SCRATCH_OK h8300_hard_regno_scratch_ok
5900
 
5901
#undef TARGET_LEGITIMATE_ADDRESS_P
5902
#define TARGET_LEGITIMATE_ADDRESS_P     h8300_legitimate_address_p
5903
 
5904
#undef TARGET_DEFAULT_TARGET_FLAGS
5905
#define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT
5906
 
5907
#undef TARGET_CAN_ELIMINATE
5908
#define TARGET_CAN_ELIMINATE h8300_can_eliminate
5909
 
5910
#undef TARGET_TRAMPOLINE_INIT
5911
#define TARGET_TRAMPOLINE_INIT h8300_trampoline_init
5912
 
5913
struct gcc_target targetm = TARGET_INITIALIZER;

powered by: WebSVN 2.1.0

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