xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/h8300/h8300.c (revision 49d8c9ecf4abd21261269266ef64939f71b3cd09)
1 /* 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       0
3866     },
3867 /* SHIFT_LSHIFTRT */
3868     {
3869       "rotl\t%X0",
3870       "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3871       0
3872     },
3873 /* SHIFT_ASHIFTRT */
3874     {
3875       "rotl\t%X0",
3876       "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3877       0
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;
5914