* common.opt (-Wattributes): New. Default true.
[official-gcc.git] / gcc / config / h8300 / h8300.c
blob45fb514f2266d0b62d0f0d7b7a94db54c0b24f08
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 Free Software Foundation, Inc.
4 Contributed by Steve Chamberlain (sac@cygnus.com),
5 Jim Wilson (wilson@cygnus.com), and Doug Evans (dje@cygnus.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
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"
49 /* Classifies a h8300_src_operand or h8300_dst_operand.
51 H8OP_IMMEDIATE
52 A constant operand of some sort.
54 H8OP_REGISTER
55 An ordinary register.
57 H8OP_MEM_ABSOLUTE
58 A memory reference with a constant address.
60 H8OP_MEM_BASE
61 A memory reference with a register as its address.
63 H8OP_MEM_COMPLEX
64 Some other kind of memory reference. */
65 enum h8300_operand_class
67 H8OP_IMMEDIATE,
68 H8OP_REGISTER,
69 H8OP_MEM_ABSOLUTE,
70 H8OP_MEM_BASE,
71 H8OP_MEM_COMPLEX,
72 NUM_H8OPS
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];
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, unsigned int);
87 static int round_frame_size (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, int, int);
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 *);
116 /* CPU_TYPE, says what cpu we're compiling for. */
117 int cpu_type;
119 /* True if a #pragma interrupt has been seen for the current function. */
120 static int pragma_interrupt;
122 /* True if a #pragma saveall has been seen for the current function. */
123 static int pragma_saveall;
125 static const char *const names_big[] =
126 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" };
128 static const char *const names_extended[] =
129 { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7" };
131 static const char *const names_upper_extended[] =
132 { "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7" };
134 /* Points to one of the above. */
135 /* ??? The above could be put in an array indexed by CPU_TYPE. */
136 const char * const *h8_reg_names;
138 /* Various operations needed by the following, indexed by CPU_TYPE. */
140 const char *h8_push_op, *h8_pop_op, *h8_mov_op;
142 /* Value of MOVE_RATIO. */
143 int h8300_move_ratio;
145 /* See below where shifts are handled for explanation of this enum. */
147 enum shift_alg
149 SHIFT_INLINE,
150 SHIFT_ROT_AND,
151 SHIFT_SPECIAL,
152 SHIFT_LOOP
155 /* Symbols of the various shifts which can be used as indices. */
157 enum shift_type
159 SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
162 /* Macros to keep the shift algorithm tables small. */
163 #define INL SHIFT_INLINE
164 #define ROT SHIFT_ROT_AND
165 #define LOP SHIFT_LOOP
166 #define SPC SHIFT_SPECIAL
168 /* The shift algorithms for each machine, mode, shift type, and shift
169 count are defined below. The three tables below correspond to
170 QImode, HImode, and SImode, respectively. Each table is organized
171 by, in the order of indices, machine, shift type, and shift count. */
173 static enum shift_alg shift_alg_qi[3][3][8] = {
175 /* TARGET_H8300 */
176 /* 0 1 2 3 4 5 6 7 */
177 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
178 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
179 { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
182 /* TARGET_H8300H */
183 /* 0 1 2 3 4 5 6 7 */
184 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
185 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
186 { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
189 /* TARGET_H8300S */
190 /* 0 1 2 3 4 5 6 7 */
191 { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT */
192 { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
193 { INL, INL, INL, INL, INL, INL, INL, SPC } /* SHIFT_ASHIFTRT */
197 static enum shift_alg shift_alg_hi[3][3][16] = {
199 /* TARGET_H8300 */
200 /* 0 1 2 3 4 5 6 7 */
201 /* 8 9 10 11 12 13 14 15 */
202 { INL, INL, INL, INL, INL, INL, INL, SPC,
203 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
204 { INL, INL, INL, INL, INL, LOP, LOP, SPC,
205 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
206 { INL, INL, INL, INL, INL, LOP, LOP, SPC,
207 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
210 /* TARGET_H8300H */
211 /* 0 1 2 3 4 5 6 7 */
212 /* 8 9 10 11 12 13 14 15 */
213 { INL, INL, INL, INL, INL, INL, INL, SPC,
214 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
215 { INL, INL, INL, INL, INL, INL, INL, SPC,
216 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
217 { INL, INL, INL, INL, INL, INL, INL, SPC,
218 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
221 /* TARGET_H8300S */
222 /* 0 1 2 3 4 5 6 7 */
223 /* 8 9 10 11 12 13 14 15 */
224 { INL, INL, INL, INL, INL, INL, INL, INL,
225 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
226 { INL, INL, INL, INL, INL, INL, INL, INL,
227 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
228 { INL, INL, INL, INL, INL, INL, INL, INL,
229 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
233 static enum shift_alg shift_alg_si[3][3][32] = {
235 /* TARGET_H8300 */
236 /* 0 1 2 3 4 5 6 7 */
237 /* 8 9 10 11 12 13 14 15 */
238 /* 16 17 18 19 20 21 22 23 */
239 /* 24 25 26 27 28 29 30 31 */
240 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
241 SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
242 SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
243 SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT */
244 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
245 SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
246 SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
247 SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
248 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
249 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
250 SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
251 SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
254 /* TARGET_H8300H */
255 /* 0 1 2 3 4 5 6 7 */
256 /* 8 9 10 11 12 13 14 15 */
257 /* 16 17 18 19 20 21 22 23 */
258 /* 24 25 26 27 28 29 30 31 */
259 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
260 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
261 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
262 SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
263 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
264 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
265 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
266 SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
267 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
268 SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
269 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
270 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
273 /* TARGET_H8300S */
274 /* 0 1 2 3 4 5 6 7 */
275 /* 8 9 10 11 12 13 14 15 */
276 /* 16 17 18 19 20 21 22 23 */
277 /* 24 25 26 27 28 29 30 31 */
278 { INL, INL, INL, INL, INL, INL, INL, INL,
279 INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
280 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
281 SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
282 { INL, INL, INL, INL, INL, INL, INL, INL,
283 INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
284 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
285 SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
286 { INL, INL, INL, INL, INL, INL, INL, INL,
287 INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
288 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
289 SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
293 #undef INL
294 #undef ROT
295 #undef LOP
296 #undef SPC
298 enum h8_cpu
300 H8_300,
301 H8_300H,
302 H8_S
305 /* Initialize various cpu specific globals at start up. */
307 void
308 h8300_init_once (void)
310 static const char *const h8_push_ops[2] = { "push" , "push.l" };
311 static const char *const h8_pop_ops[2] = { "pop" , "pop.l" };
312 static const char *const h8_mov_ops[2] = { "mov.w", "mov.l" };
314 if (TARGET_H8300)
316 cpu_type = (int) CPU_H8300;
317 h8_reg_names = names_big;
319 else
321 /* For this we treat the H8/300H and H8S the same. */
322 cpu_type = (int) CPU_H8300H;
323 h8_reg_names = names_extended;
325 h8_push_op = h8_push_ops[cpu_type];
326 h8_pop_op = h8_pop_ops[cpu_type];
327 h8_mov_op = h8_mov_ops[cpu_type];
329 if (!TARGET_H8300S && TARGET_MAC)
331 error ("-ms2600 is used without -ms");
332 target_flags |= MASK_H8300S_1;
335 if (TARGET_H8300 && TARGET_NORMAL_MODE)
337 error ("-mn is used without -mh or -ms");
338 target_flags ^= MASK_NORMAL_MODE;
341 /* Some of the shifts are optimized for speed by default.
342 See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
343 If optimizing for size, change shift_alg for those shift to
344 SHIFT_LOOP. */
345 if (optimize_size)
347 /* H8/300 */
348 shift_alg_hi[H8_300][SHIFT_ASHIFT][5] = SHIFT_LOOP;
349 shift_alg_hi[H8_300][SHIFT_ASHIFT][6] = SHIFT_LOOP;
350 shift_alg_hi[H8_300][SHIFT_ASHIFT][13] = SHIFT_LOOP;
351 shift_alg_hi[H8_300][SHIFT_ASHIFT][14] = SHIFT_LOOP;
353 shift_alg_hi[H8_300][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
354 shift_alg_hi[H8_300][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
356 shift_alg_hi[H8_300][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
357 shift_alg_hi[H8_300][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
359 /* H8/300H */
360 shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
361 shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
363 shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
364 shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
366 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
367 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
368 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
369 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
371 /* H8S */
372 shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
375 /* Work out a value for MOVE_RATIO. */
376 if (!TARGET_H8300SX)
378 /* Memory-memory moves are quite expensive without the
379 h8sx instructions. */
380 h8300_move_ratio = 3;
382 else if (flag_omit_frame_pointer)
384 /* movmd sequences are fairly cheap when er6 isn't fixed. They can
385 sometimes be as short as two individual memory-to-memory moves,
386 but since they use all the call-saved registers, it seems better
387 to allow up to three moves here. */
388 h8300_move_ratio = 4;
390 else if (optimize_size)
392 /* In this case we don't use movmd sequences since they tend
393 to be longer than calls to memcpy(). Memory-to-memory
394 moves are cheaper than for !TARGET_H8300SX, so it makes
395 sense to have a slightly higher threshold. */
396 h8300_move_ratio = 4;
398 else
400 /* We use movmd sequences for some moves since it can be quicker
401 than calling memcpy(). The sequences will need to save and
402 restore er6 though, so bump up the cost. */
403 h8300_move_ratio = 6;
407 /* Implement REG_CLASS_FROM_LETTER.
409 Some patterns need to use er6 as a scratch register. This is
410 difficult to arrange since er6 is the frame pointer and usually
411 can't be spilled.
413 Such patterns should define two alternatives, one which allows only
414 er6 and one which allows any general register. The former alternative
415 should have a 'd' constraint while the latter should be disparaged and
416 use 'D'.
418 Normally, 'd' maps to DESTINATION_REGS and 'D' maps to GENERAL_REGS.
419 However, there are cases where they should be NO_REGS:
421 - 'd' should be NO_REGS when reloading a function that uses the
422 frame pointer. In this case, DESTINATION_REGS won't contain any
423 spillable registers, so the first alternative can't be used.
425 - -fno-omit-frame-pointer means that the frame pointer will
426 always be in use. It's therefore better to map 'd' to NO_REGS
427 before reload so that register allocator will pick the second
428 alternative.
430 - we would like 'D' to be be NO_REGS when the frame pointer isn't
431 live, but we the frame pointer may turn out to be needed after
432 we start reload, and then we may have already decided we don't
433 have a choice, so we can't do that. Forcing the register
434 allocator to use er6 if possible might produce better code for
435 small functions: it's more efficient to save and restore er6 in
436 the prologue & epilogue than to do it in a define_split.
437 Hopefully disparaging 'D' will have a similar effect, without
438 forcing a reload failure if the frame pointer is found to be
439 needed too late. */
441 enum reg_class
442 h8300_reg_class_from_letter (int c)
444 switch (c)
446 case 'a':
447 return MAC_REGS;
449 case 'c':
450 return COUNTER_REGS;
452 case 'd':
453 if (!flag_omit_frame_pointer && !reload_completed)
454 return NO_REGS;
455 if (frame_pointer_needed && reload_in_progress)
456 return NO_REGS;
457 return DESTINATION_REGS;
459 case 'D':
460 /* The meaning of a constraint shouldn't change dynamically, so
461 we can't make this NO_REGS. */
462 return GENERAL_REGS;
464 case 'f':
465 return SOURCE_REGS;
467 default:
468 return NO_REGS;
472 /* Return the byte register name for a register rtx X. B should be 0
473 if you want a lower byte register. B should be 1 if you want an
474 upper byte register. */
476 static const char *
477 byte_reg (rtx x, int b)
479 static const char *const names_small[] = {
480 "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
481 "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
484 gcc_assert (REG_P (x));
486 return names_small[REGNO (x) * 2 + b];
489 /* REGNO must be saved/restored across calls if this macro is true. */
491 #define WORD_REG_USED(regno) \
492 (regno < SP_REG \
493 /* No need to save registers if this function will not return. */ \
494 && ! TREE_THIS_VOLATILE (current_function_decl) \
495 && (h8300_saveall_function_p (current_function_decl) \
496 /* Save any call saved register that was used. */ \
497 || (regs_ever_live[regno] && !call_used_regs[regno]) \
498 /* Save the frame pointer if it was used. */ \
499 || (regno == HARD_FRAME_POINTER_REGNUM && regs_ever_live[regno]) \
500 /* Save any register used in an interrupt handler. */ \
501 || (h8300_current_function_interrupt_function_p () \
502 && regs_ever_live[regno]) \
503 /* Save call clobbered registers in non-leaf interrupt \
504 handlers. */ \
505 || (h8300_current_function_interrupt_function_p () \
506 && call_used_regs[regno] \
507 && !current_function_is_leaf)))
509 /* Output assembly language to FILE for the operation OP with operand size
510 SIZE to adjust the stack pointer. */
512 static void
513 h8300_emit_stack_adjustment (int sign, unsigned int size)
515 /* If the frame size is 0, we don't have anything to do. */
516 if (size == 0)
517 return;
519 /* H8/300 cannot add/subtract a large constant with a single
520 instruction. If a temporary register is available, load the
521 constant to it and then do the addition. */
522 if (TARGET_H8300
523 && size > 4
524 && !h8300_current_function_interrupt_function_p ()
525 && !(cfun->static_chain_decl != NULL && sign < 0))
527 rtx r3 = gen_rtx_REG (Pmode, 3);
528 emit_insn (gen_movhi (r3, GEN_INT (sign * size)));
529 emit_insn (gen_addhi3 (stack_pointer_rtx,
530 stack_pointer_rtx, r3));
532 else
534 /* The stack adjustment made here is further optimized by the
535 splitter. In case of H8/300, the splitter always splits the
536 addition emitted here to make the adjustment
537 interrupt-safe. */
538 if (Pmode == HImode)
539 emit_insn (gen_addhi3 (stack_pointer_rtx,
540 stack_pointer_rtx, GEN_INT (sign * size)));
541 else
542 emit_insn (gen_addsi3 (stack_pointer_rtx,
543 stack_pointer_rtx, GEN_INT (sign * size)));
547 /* Round up frame size SIZE. */
549 static int
550 round_frame_size (int size)
552 return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
553 & -STACK_BOUNDARY / BITS_PER_UNIT);
556 /* Compute which registers to push/pop.
557 Return a bit vector of registers. */
559 static unsigned int
560 compute_saved_regs (void)
562 unsigned int saved_regs = 0;
563 int regno;
565 /* Construct a bit vector of registers to be pushed/popped. */
566 for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
568 if (WORD_REG_USED (regno))
569 saved_regs |= 1 << regno;
572 /* Don't push/pop the frame pointer as it is treated separately. */
573 if (frame_pointer_needed)
574 saved_regs &= ~(1 << HARD_FRAME_POINTER_REGNUM);
576 return saved_regs;
579 /* Emit an insn to push register RN. */
581 static void
582 push (int rn)
584 rtx reg = gen_rtx_REG (word_mode, rn);
585 rtx x;
587 if (TARGET_H8300)
588 x = gen_push_h8300 (reg);
589 else if (!TARGET_NORMAL_MODE)
590 x = gen_push_h8300hs_advanced (reg);
591 else
592 x = gen_push_h8300hs_normal (reg);
593 x = emit_insn (x);
594 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
597 /* Emit an insn to pop register RN. */
599 static void
600 pop (int rn)
602 rtx reg = gen_rtx_REG (word_mode, rn);
603 rtx x;
605 if (TARGET_H8300)
606 x = gen_pop_h8300 (reg);
607 else if (!TARGET_NORMAL_MODE)
608 x = gen_pop_h8300hs_advanced (reg);
609 else
610 x = gen_pop_h8300hs_normal (reg);
611 x = emit_insn (x);
612 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
615 /* Emit an instruction to push or pop NREGS consecutive registers
616 starting at register REGNO. POP_P selects a pop rather than a
617 push and RETURN_P is true if the instruction should return.
619 It must be possible to do the requested operation in a single
620 instruction. If NREGS == 1 && !RETURN_P, use a normal push
621 or pop insn. Otherwise emit a parallel of the form:
623 (parallel
624 [(return) ;; if RETURN_P
625 (save or restore REGNO)
626 (save or restore REGNO + 1)
628 (save or restore REGNO + NREGS - 1)
629 (set sp (plus sp (const_int adjust)))] */
631 static void
632 h8300_push_pop (int regno, int nregs, int pop_p, int return_p)
634 int i, j;
635 rtvec vec;
636 rtx sp, offset;
638 /* See whether we can use a simple push or pop. */
639 if (!return_p && nregs == 1)
641 if (pop_p)
642 pop (regno);
643 else
644 push (regno);
645 return;
648 /* We need one element for the return insn, if present, one for each
649 register, and one for stack adjustment. */
650 vec = rtvec_alloc ((return_p != 0) + nregs + 1);
651 sp = stack_pointer_rtx;
652 i = 0;
654 /* Add the return instruction. */
655 if (return_p)
657 RTVEC_ELT (vec, i) = gen_rtx_RETURN (VOIDmode);
658 i++;
661 /* Add the register moves. */
662 for (j = 0; j < nregs; j++)
664 rtx lhs, rhs;
666 if (pop_p)
668 /* Register REGNO + NREGS - 1 is popped first. Before the
669 stack adjustment, its slot is at address @sp. */
670 lhs = gen_rtx_REG (SImode, regno + j);
671 rhs = gen_rtx_MEM (SImode, plus_constant (sp, (nregs - j - 1) * 4));
673 else
675 /* Register REGNO is pushed first and will be stored at @(-4,sp). */
676 lhs = gen_rtx_MEM (SImode, plus_constant (sp, (j + 1) * -4));
677 rhs = gen_rtx_REG (SImode, regno + j);
679 RTVEC_ELT (vec, i + j) = gen_rtx_SET (VOIDmode, lhs, rhs);
682 /* Add the stack adjustment. */
683 offset = GEN_INT ((pop_p ? nregs : -nregs) * 4);
684 RTVEC_ELT (vec, i + j) = gen_rtx_SET (VOIDmode, sp,
685 gen_rtx_PLUS (Pmode, sp, offset));
687 emit_insn (gen_rtx_PARALLEL (VOIDmode, vec));
690 /* Return true if X has the value sp + OFFSET. */
692 static int
693 h8300_stack_offset_p (rtx x, int offset)
695 if (offset == 0)
696 return x == stack_pointer_rtx;
698 return (GET_CODE (x) == PLUS
699 && XEXP (x, 0) == stack_pointer_rtx
700 && GET_CODE (XEXP (x, 1)) == CONST_INT
701 && INTVAL (XEXP (x, 1)) == offset);
704 /* A subroutine of h8300_ldm_stm_parallel. X is one pattern in
705 something that may be an ldm or stm instruction. If it fits
706 the required template, return the register it loads or stores,
707 otherwise return -1.
709 LOAD_P is true if X should be a load, false if it should be a store.
710 NREGS is the number of registers that the whole instruction is expected
711 to load or store. INDEX is the index of the register that X should
712 load or store, relative to the lowest-numbered register. */
714 static int
715 h8300_ldm_stm_regno (rtx x, int load_p, int index, int nregs)
717 int regindex, memindex, offset;
719 if (load_p)
720 regindex = 0, memindex = 1, offset = (nregs - index - 1) * 4;
721 else
722 memindex = 0, regindex = 1, offset = (index + 1) * -4;
724 if (GET_CODE (x) == SET
725 && GET_CODE (XEXP (x, regindex)) == REG
726 && GET_CODE (XEXP (x, memindex)) == MEM
727 && h8300_stack_offset_p (XEXP (XEXP (x, memindex), 0), offset))
728 return REGNO (XEXP (x, regindex));
730 return -1;
733 /* Return true if the elements of VEC starting at FIRST describe an
734 ldm or stm instruction (LOAD_P says which). */
737 h8300_ldm_stm_parallel (rtvec vec, int load_p, int first)
739 rtx last;
740 int nregs, i, regno, adjust;
742 /* There must be a stack adjustment, a register move, and at least one
743 other operation (a return or another register move). */
744 if (GET_NUM_ELEM (vec) < 3)
745 return false;
747 /* Get the range of registers to be pushed or popped. */
748 nregs = GET_NUM_ELEM (vec) - first - 1;
749 regno = h8300_ldm_stm_regno (RTVEC_ELT (vec, first), load_p, 0, nregs);
751 /* Check that the call to h8300_ldm_stm_regno succeeded and
752 that we're only dealing with GPRs. */
753 if (regno < 0 || regno + nregs > 8)
754 return false;
756 /* 2-register h8s instructions must start with an even-numbered register.
757 3- and 4-register instructions must start with er0 or er4. */
758 if (!TARGET_H8300SX)
760 if ((regno & 1) != 0)
761 return false;
762 if (nregs > 2 && (regno & 3) != 0)
763 return false;
766 /* Check the other loads or stores. */
767 for (i = 1; i < nregs; i++)
768 if (h8300_ldm_stm_regno (RTVEC_ELT (vec, first + i), load_p, i, nregs)
769 != regno + i)
770 return false;
772 /* Check the stack adjustment. */
773 last = RTVEC_ELT (vec, first + nregs);
774 adjust = (load_p ? nregs : -nregs) * 4;
775 return (GET_CODE (last) == SET
776 && SET_DEST (last) == stack_pointer_rtx
777 && h8300_stack_offset_p (SET_SRC (last), adjust));
780 /* This is what the stack looks like after the prolog of
781 a function with a frame has been set up:
783 <args>
785 FP <- fp
786 <locals>
787 <saved registers> <- sp
789 This is what the stack looks like after the prolog of
790 a function which doesn't have a frame:
792 <args>
794 <locals>
795 <saved registers> <- sp
798 /* Generate RTL code for the function prologue. */
800 void
801 h8300_expand_prologue (void)
803 int regno;
804 int saved_regs;
805 int n_regs;
807 /* If the current function has the OS_Task attribute set, then
808 we have a naked prologue. */
809 if (h8300_os_task_function_p (current_function_decl))
810 return;
812 if (h8300_monitor_function_p (current_function_decl))
813 /* My understanding of monitor functions is they act just like
814 interrupt functions, except the prologue must mask
815 interrupts. */
816 emit_insn (gen_monitor_prologue ());
818 if (frame_pointer_needed)
820 /* Push fp. */
821 push (HARD_FRAME_POINTER_REGNUM);
822 emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
825 /* Push the rest of the registers in ascending order. */
826 saved_regs = compute_saved_regs ();
827 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno += n_regs)
829 n_regs = 1;
830 if (saved_regs & (1 << regno))
832 if (TARGET_H8300S)
834 /* See how many registers we can push at the same time. */
835 if ((!TARGET_H8300SX || (regno & 3) == 0)
836 && ((saved_regs >> regno) & 0x0f) == 0x0f)
837 n_regs = 4;
839 else if ((!TARGET_H8300SX || (regno & 3) == 0)
840 && ((saved_regs >> regno) & 0x07) == 0x07)
841 n_regs = 3;
843 else if ((!TARGET_H8300SX || (regno & 1) == 0)
844 && ((saved_regs >> regno) & 0x03) == 0x03)
845 n_regs = 2;
848 h8300_push_pop (regno, n_regs, 0, 0);
852 /* Leave room for locals. */
853 h8300_emit_stack_adjustment (-1, round_frame_size (get_frame_size ()));
856 /* Return nonzero if we can use "rts" for the function currently being
857 compiled. */
860 h8300_can_use_return_insn_p (void)
862 return (reload_completed
863 && !frame_pointer_needed
864 && get_frame_size () == 0
865 && compute_saved_regs () == 0);
868 /* Generate RTL code for the function epilogue. */
870 void
871 h8300_expand_epilogue (void)
873 int regno;
874 int saved_regs;
875 int n_regs;
876 HOST_WIDE_INT frame_size;
877 bool returned_p;
879 if (h8300_os_task_function_p (current_function_decl))
880 /* OS_Task epilogues are nearly naked -- they just have an
881 rts instruction. */
882 return;
884 frame_size = round_frame_size (get_frame_size ());
885 returned_p = false;
887 /* Deallocate locals. */
888 h8300_emit_stack_adjustment (1, frame_size);
890 /* Pop the saved registers in descending order. */
891 saved_regs = compute_saved_regs ();
892 for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno -= n_regs)
894 n_regs = 1;
895 if (saved_regs & (1 << regno))
897 if (TARGET_H8300S)
899 /* See how many registers we can pop at the same time. */
900 if ((TARGET_H8300SX || (regno & 3) == 3)
901 && ((saved_regs << 3 >> regno) & 0x0f) == 0x0f)
902 n_regs = 4;
904 else if ((TARGET_H8300SX || (regno & 3) == 2)
905 && ((saved_regs << 2 >> regno) & 0x07) == 0x07)
906 n_regs = 3;
908 else if ((TARGET_H8300SX || (regno & 1) == 1)
909 && ((saved_regs << 1 >> regno) & 0x03) == 0x03)
910 n_regs = 2;
913 /* See if this pop would be the last insn before the return.
914 If so, use rte/l or rts/l instead of pop or ldm.l. */
915 if (TARGET_H8300SX
916 && !frame_pointer_needed
917 && frame_size == 0
918 && (saved_regs & ((1 << (regno - n_regs + 1)) - 1)) == 0)
919 returned_p = true;
921 h8300_push_pop (regno - n_regs + 1, n_regs, 1, returned_p);
925 /* Pop frame pointer if we had one. */
926 if (frame_pointer_needed)
928 if (TARGET_H8300SX)
929 returned_p = true;
930 h8300_push_pop (HARD_FRAME_POINTER_REGNUM, 1, 1, returned_p);
933 if (!returned_p)
934 emit_insn (gen_rtx_RETURN (VOIDmode));
937 /* Return nonzero if the current function is an interrupt
938 function. */
941 h8300_current_function_interrupt_function_p (void)
943 return (h8300_interrupt_function_p (current_function_decl)
944 || h8300_monitor_function_p (current_function_decl));
947 /* Output assembly code for the start of the file. */
949 static void
950 h8300_file_start (void)
952 default_file_start ();
954 if (TARGET_H8300H)
955 fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
956 else if (TARGET_H8300SX)
957 fputs (TARGET_NORMAL_MODE ? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file);
958 else if (TARGET_H8300S)
959 fputs (TARGET_NORMAL_MODE ? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file);
962 /* Output assembly language code for the end of file. */
964 static void
965 h8300_file_end (void)
967 fputs ("\t.end\n", asm_out_file);
970 /* Split an add of a small constant into two adds/subs insns.
972 If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
973 instead of adds/subs. */
975 void
976 split_adds_subs (enum machine_mode mode, rtx *operands)
978 HOST_WIDE_INT val = INTVAL (operands[1]);
979 rtx reg = operands[0];
980 HOST_WIDE_INT sign = 1;
981 HOST_WIDE_INT amount;
982 rtx (*gen_add) (rtx, rtx, rtx);
984 /* Force VAL to be positive so that we do not have to consider the
985 sign. */
986 if (val < 0)
988 val = -val;
989 sign = -1;
992 switch (mode)
994 case HImode:
995 gen_add = gen_addhi3;
996 break;
998 case SImode:
999 gen_add = gen_addsi3;
1000 break;
1002 default:
1003 gcc_unreachable ();
1006 /* Try different amounts in descending order. */
1007 for (amount = (TARGET_H8300H || TARGET_H8300S) ? 4 : 2;
1008 amount > 0;
1009 amount /= 2)
1011 for (; val >= amount; val -= amount)
1012 emit_insn (gen_add (reg, reg, GEN_INT (sign * amount)));
1015 return;
1018 /* Handle machine specific pragmas for compatibility with existing
1019 compilers for the H8/300.
1021 pragma saveall generates prologue/epilogue code which saves and
1022 restores all the registers on function entry.
1024 pragma interrupt saves and restores all registers, and exits with
1025 an rte instruction rather than an rts. A pointer to a function
1026 with this attribute may be safely used in an interrupt vector. */
1028 void
1029 h8300_pr_interrupt (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1031 pragma_interrupt = 1;
1034 void
1035 h8300_pr_saveall (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1037 pragma_saveall = 1;
1040 /* If the next function argument with MODE and TYPE is to be passed in
1041 a register, return a reg RTX for the hard register in which to pass
1042 the argument. CUM represents the state after the last argument.
1043 If the argument is to be pushed, NULL_RTX is returned. */
1046 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1047 tree type, int named)
1049 static const char *const hand_list[] = {
1050 "__main",
1051 "__cmpsi2",
1052 "__divhi3",
1053 "__modhi3",
1054 "__udivhi3",
1055 "__umodhi3",
1056 "__divsi3",
1057 "__modsi3",
1058 "__udivsi3",
1059 "__umodsi3",
1060 "__mulhi3",
1061 "__mulsi3",
1062 "__reg_memcpy",
1063 "__reg_memset",
1064 "__ucmpsi2",
1068 rtx result = NULL_RTX;
1069 const char *fname;
1070 int regpass = 0;
1072 /* Never pass unnamed arguments in registers. */
1073 if (!named)
1074 return NULL_RTX;
1076 /* Pass 3 regs worth of data in regs when user asked on the command line. */
1077 if (TARGET_QUICKCALL)
1078 regpass = 3;
1080 /* If calling hand written assembler, use 4 regs of args. */
1081 if (cum->libcall)
1083 const char * const *p;
1085 fname = XSTR (cum->libcall, 0);
1087 /* See if this libcall is one of the hand coded ones. */
1088 for (p = hand_list; *p && strcmp (*p, fname) != 0; p++)
1091 if (*p)
1092 regpass = 4;
1095 if (regpass)
1097 int size;
1099 if (mode == BLKmode)
1100 size = int_size_in_bytes (type);
1101 else
1102 size = GET_MODE_SIZE (mode);
1104 if (size + cum->nbytes <= regpass * UNITS_PER_WORD
1105 && cum->nbytes / UNITS_PER_WORD <= 3)
1106 result = gen_rtx_REG (mode, cum->nbytes / UNITS_PER_WORD);
1109 return result;
1112 /* Compute the cost of an and insn. */
1114 static int
1115 h8300_and_costs (rtx x)
1117 rtx operands[4];
1119 if (GET_MODE (x) == QImode)
1120 return 1;
1122 if (GET_MODE (x) != HImode
1123 && GET_MODE (x) != SImode)
1124 return 100;
1126 operands[0] = NULL;
1127 operands[1] = XEXP (x, 0);
1128 operands[2] = XEXP (x, 1);
1129 operands[3] = x;
1130 return compute_logical_op_length (GET_MODE (x), operands) / 2;
1133 /* Compute the cost of a shift insn. */
1135 static int
1136 h8300_shift_costs (rtx x)
1138 rtx operands[4];
1140 if (GET_MODE (x) != QImode
1141 && GET_MODE (x) != HImode
1142 && GET_MODE (x) != SImode)
1143 return 100;
1145 operands[0] = NULL;
1146 operands[1] = NULL;
1147 operands[2] = XEXP (x, 1);
1148 operands[3] = x;
1149 return compute_a_shift_length (NULL, operands) / 2;
1152 /* Worker function for TARGET_RTX_COSTS. */
1154 static bool
1155 h8300_rtx_costs (rtx x, int code, int outer_code, int *total)
1157 if (TARGET_H8300SX && outer_code == MEM)
1159 /* Estimate the number of execution states needed to calculate
1160 the address. */
1161 if (register_operand (x, VOIDmode)
1162 || GET_CODE (x) == POST_INC
1163 || GET_CODE (x) == POST_DEC
1164 || CONSTANT_P (x))
1165 *total = 0;
1166 else
1167 *total = COSTS_N_INSNS (1);
1168 return true;
1171 switch (code)
1173 case CONST_INT:
1175 HOST_WIDE_INT n = INTVAL (x);
1177 if (TARGET_H8300SX)
1179 /* Constant operands need the same number of processor
1180 states as register operands. Although we could try to
1181 use a size-based cost for optimize_size, the lack of
1182 of a mode makes the results very unpredictable. */
1183 *total = 0;
1184 return true;
1186 if (-4 <= n || n <= 4)
1188 switch ((int) n)
1190 case 0:
1191 *total = 0;
1192 return true;
1193 case 1:
1194 case 2:
1195 case -1:
1196 case -2:
1197 *total = 0 + (outer_code == SET);
1198 return true;
1199 case 4:
1200 case -4:
1201 if (TARGET_H8300H || TARGET_H8300S)
1202 *total = 0 + (outer_code == SET);
1203 else
1204 *total = 1;
1205 return true;
1208 *total = 1;
1209 return true;
1212 case CONST:
1213 case LABEL_REF:
1214 case SYMBOL_REF:
1215 if (TARGET_H8300SX)
1217 /* See comment for CONST_INT. */
1218 *total = 0;
1219 return true;
1221 *total = 3;
1222 return true;
1224 case CONST_DOUBLE:
1225 *total = 20;
1226 return true;
1228 case AND:
1229 if (!h8300_dst_operand (XEXP (x, 0), VOIDmode)
1230 || !h8300_src_operand (XEXP (x, 1), VOIDmode))
1231 return false;
1232 *total = COSTS_N_INSNS (h8300_and_costs (x));
1233 return true;
1235 /* We say that MOD and DIV are so expensive because otherwise we'll
1236 generate some really horrible code for division of a power of two. */
1237 case MOD:
1238 case DIV:
1239 case UMOD:
1240 case UDIV:
1241 if (TARGET_H8300SX)
1242 switch (GET_MODE (x))
1244 case QImode:
1245 case HImode:
1246 *total = COSTS_N_INSNS (optimize_size ? 4 : 10);
1247 return false;
1249 case SImode:
1250 *total = COSTS_N_INSNS (optimize_size ? 4 : 18);
1251 return false;
1253 default:
1254 break;
1256 *total = COSTS_N_INSNS (12);
1257 return true;
1259 case MULT:
1260 if (TARGET_H8300SX)
1261 switch (GET_MODE (x))
1263 case QImode:
1264 case HImode:
1265 *total = COSTS_N_INSNS (2);
1266 return false;
1268 case SImode:
1269 *total = COSTS_N_INSNS (5);
1270 return false;
1272 default:
1273 break;
1275 *total = COSTS_N_INSNS (4);
1276 return true;
1278 case ASHIFT:
1279 case ASHIFTRT:
1280 case LSHIFTRT:
1281 if (h8sx_binary_shift_operator (x, VOIDmode))
1283 *total = COSTS_N_INSNS (2);
1284 return false;
1286 else if (h8sx_unary_shift_operator (x, VOIDmode))
1288 *total = COSTS_N_INSNS (1);
1289 return false;
1291 *total = COSTS_N_INSNS (h8300_shift_costs (x));
1292 return true;
1294 case ROTATE:
1295 case ROTATERT:
1296 if (GET_MODE (x) == HImode)
1297 *total = 2;
1298 else
1299 *total = 8;
1300 return true;
1302 default:
1303 *total = COSTS_N_INSNS (1);
1304 return false;
1308 /* Documentation for the machine specific operand escapes:
1310 'E' like s but negative.
1311 'F' like t but negative.
1312 'G' constant just the negative
1313 'R' print operand as a byte:8 address if appropriate, else fall back to
1314 'X' handling.
1315 'S' print operand as a long word
1316 'T' print operand as a word
1317 'V' find the set bit, and print its number.
1318 'W' find the clear bit, and print its number.
1319 'X' print operand as a byte
1320 'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
1321 If this operand isn't a register, fall back to 'R' handling.
1322 'Z' print int & 7.
1323 'c' print the opcode corresponding to rtl
1324 'e' first word of 32 bit value - if reg, then least reg. if mem
1325 then least. if const then most sig word
1326 'f' second word of 32 bit value - if reg, then biggest reg. if mem
1327 then +2. if const then least sig word
1328 'j' print operand as condition code.
1329 'k' print operand as reverse condition code.
1330 'm' convert an integer operand to a size suffix (.b, .w or .l)
1331 'o' print an integer without a leading '#'
1332 's' print as low byte of 16 bit value
1333 't' print as high byte of 16 bit value
1334 'w' print as low byte of 32 bit value
1335 'x' print as 2nd byte of 32 bit value
1336 'y' print as 3rd byte of 32 bit value
1337 'z' print as msb of 32 bit value
1340 /* Return assembly language string which identifies a comparison type. */
1342 static const char *
1343 cond_string (enum rtx_code code)
1345 switch (code)
1347 case NE:
1348 return "ne";
1349 case EQ:
1350 return "eq";
1351 case GE:
1352 return "ge";
1353 case GT:
1354 return "gt";
1355 case LE:
1356 return "le";
1357 case LT:
1358 return "lt";
1359 case GEU:
1360 return "hs";
1361 case GTU:
1362 return "hi";
1363 case LEU:
1364 return "ls";
1365 case LTU:
1366 return "lo";
1367 default:
1368 gcc_unreachable ();
1372 /* Print operand X using operand code CODE to assembly language output file
1373 FILE. */
1375 void
1376 print_operand (FILE *file, rtx x, int code)
1378 /* This is used for communication between codes V,W,Z and Y. */
1379 static int bitint;
1381 switch (code)
1383 case 'E':
1384 switch (GET_CODE (x))
1386 case REG:
1387 fprintf (file, "%sl", names_big[REGNO (x)]);
1388 break;
1389 case CONST_INT:
1390 fprintf (file, "#%ld", (-INTVAL (x)) & 0xff);
1391 break;
1392 default:
1393 gcc_unreachable ();
1395 break;
1396 case 'F':
1397 switch (GET_CODE (x))
1399 case REG:
1400 fprintf (file, "%sh", names_big[REGNO (x)]);
1401 break;
1402 case CONST_INT:
1403 fprintf (file, "#%ld", ((-INTVAL (x)) & 0xff00) >> 8);
1404 break;
1405 default:
1406 gcc_unreachable ();
1408 break;
1409 case 'G':
1410 gcc_assert (GET_CODE (x) == CONST_INT);
1411 fprintf (file, "#%ld", 0xff & (-INTVAL (x)));
1412 break;
1413 case 'S':
1414 if (GET_CODE (x) == REG)
1415 fprintf (file, "%s", names_extended[REGNO (x)]);
1416 else
1417 goto def;
1418 break;
1419 case 'T':
1420 if (GET_CODE (x) == REG)
1421 fprintf (file, "%s", names_big[REGNO (x)]);
1422 else
1423 goto def;
1424 break;
1425 case 'V':
1426 bitint = exact_log2 (INTVAL (x) & 0xff);
1427 gcc_assert (bitint >= 0);
1428 fprintf (file, "#%d", bitint);
1429 break;
1430 case 'W':
1431 bitint = exact_log2 ((~INTVAL (x)) & 0xff);
1432 gcc_assert (bitint >= 0);
1433 fprintf (file, "#%d", bitint);
1434 break;
1435 case 'R':
1436 case 'X':
1437 if (GET_CODE (x) == REG)
1438 fprintf (file, "%s", byte_reg (x, 0));
1439 else
1440 goto def;
1441 break;
1442 case 'Y':
1443 gcc_assert (bitint >= 0);
1444 if (GET_CODE (x) == REG)
1445 fprintf (file, "%s%c", names_big[REGNO (x)], bitint > 7 ? 'h' : 'l');
1446 else
1447 print_operand (file, x, 'R');
1448 bitint = -1;
1449 break;
1450 case 'Z':
1451 bitint = INTVAL (x);
1452 fprintf (file, "#%d", bitint & 7);
1453 break;
1454 case 'c':
1455 switch (GET_CODE (x))
1457 case IOR:
1458 fprintf (file, "or");
1459 break;
1460 case XOR:
1461 fprintf (file, "xor");
1462 break;
1463 case AND:
1464 fprintf (file, "and");
1465 break;
1466 default:
1467 break;
1469 break;
1470 case 'e':
1471 switch (GET_CODE (x))
1473 case REG:
1474 if (TARGET_H8300)
1475 fprintf (file, "%s", names_big[REGNO (x)]);
1476 else
1477 fprintf (file, "%s", names_upper_extended[REGNO (x)]);
1478 break;
1479 case MEM:
1480 print_operand (file, x, 0);
1481 break;
1482 case CONST_INT:
1483 fprintf (file, "#%ld", ((INTVAL (x) >> 16) & 0xffff));
1484 break;
1485 case CONST_DOUBLE:
1487 long val;
1488 REAL_VALUE_TYPE rv;
1489 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1490 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1491 fprintf (file, "#%ld", ((val >> 16) & 0xffff));
1492 break;
1494 default:
1495 gcc_unreachable ();
1496 break;
1498 break;
1499 case 'f':
1500 switch (GET_CODE (x))
1502 case REG:
1503 if (TARGET_H8300)
1504 fprintf (file, "%s", names_big[REGNO (x) + 1]);
1505 else
1506 fprintf (file, "%s", names_big[REGNO (x)]);
1507 break;
1508 case MEM:
1509 x = adjust_address (x, HImode, 2);
1510 print_operand (file, x, 0);
1511 break;
1512 case CONST_INT:
1513 fprintf (file, "#%ld", INTVAL (x) & 0xffff);
1514 break;
1515 case CONST_DOUBLE:
1517 long val;
1518 REAL_VALUE_TYPE rv;
1519 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1520 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1521 fprintf (file, "#%ld", (val & 0xffff));
1522 break;
1524 default:
1525 gcc_unreachable ();
1527 break;
1528 case 'j':
1529 fputs (cond_string (GET_CODE (x)), file);
1530 break;
1531 case 'k':
1532 fputs (cond_string (reverse_condition (GET_CODE (x))), file);
1533 break;
1534 case 'm':
1535 gcc_assert (GET_CODE (x) == CONST_INT);
1536 switch (INTVAL (x))
1538 case 1:
1539 fputs (".b", file);
1540 break;
1542 case 2:
1543 fputs (".w", file);
1544 break;
1546 case 4:
1547 fputs (".l", file);
1548 break;
1550 default:
1551 gcc_unreachable ();
1553 break;
1554 case 'o':
1555 print_operand_address (file, x);
1556 break;
1557 case 's':
1558 if (GET_CODE (x) == CONST_INT)
1559 fprintf (file, "#%ld", (INTVAL (x)) & 0xff);
1560 else
1561 fprintf (file, "%s", byte_reg (x, 0));
1562 break;
1563 case 't':
1564 if (GET_CODE (x) == CONST_INT)
1565 fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1566 else
1567 fprintf (file, "%s", byte_reg (x, 1));
1568 break;
1569 case 'w':
1570 if (GET_CODE (x) == CONST_INT)
1571 fprintf (file, "#%ld", INTVAL (x) & 0xff);
1572 else
1573 fprintf (file, "%s",
1574 byte_reg (x, TARGET_H8300 ? 2 : 0));
1575 break;
1576 case 'x':
1577 if (GET_CODE (x) == CONST_INT)
1578 fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1579 else
1580 fprintf (file, "%s",
1581 byte_reg (x, TARGET_H8300 ? 3 : 1));
1582 break;
1583 case 'y':
1584 if (GET_CODE (x) == CONST_INT)
1585 fprintf (file, "#%ld", (INTVAL (x) >> 16) & 0xff);
1586 else
1587 fprintf (file, "%s", byte_reg (x, 0));
1588 break;
1589 case 'z':
1590 if (GET_CODE (x) == CONST_INT)
1591 fprintf (file, "#%ld", (INTVAL (x) >> 24) & 0xff);
1592 else
1593 fprintf (file, "%s", byte_reg (x, 1));
1594 break;
1596 default:
1597 def:
1598 switch (GET_CODE (x))
1600 case REG:
1601 switch (GET_MODE (x))
1603 case QImode:
1604 #if 0 /* Is it asm ("mov.b %0,r2l", ...) */
1605 fprintf (file, "%s", byte_reg (x, 0));
1606 #else /* ... or is it asm ("mov.b %0l,r2l", ...) */
1607 fprintf (file, "%s", names_big[REGNO (x)]);
1608 #endif
1609 break;
1610 case HImode:
1611 fprintf (file, "%s", names_big[REGNO (x)]);
1612 break;
1613 case SImode:
1614 case SFmode:
1615 fprintf (file, "%s", names_extended[REGNO (x)]);
1616 break;
1617 default:
1618 gcc_unreachable ();
1620 break;
1622 case MEM:
1624 rtx addr = XEXP (x, 0);
1626 fprintf (file, "@");
1627 output_address (addr);
1629 /* Add a length suffix to constant addresses. Although this
1630 is often unnecessary, it helps to avoid ambiguity in the
1631 syntax of mova. If we wrote an insn like:
1633 mova/w.l @(1,@foo.b),er0
1635 then .b would be considered part of the symbol name.
1636 Adding a length after foo will avoid this. */
1637 if (CONSTANT_P (addr))
1638 switch (code)
1640 case 'R':
1641 /* Used for mov.b and bit operations. */
1642 if (h8300_eightbit_constant_address_p (addr))
1644 fprintf (file, ":8");
1645 break;
1648 /* Fall through. We should not get here if we are
1649 processing bit operations on H8/300 or H8/300H
1650 because 'U' constraint does not allow bit
1651 operations on the tiny area on these machines. */
1653 case 'X':
1654 case 'T':
1655 case 'S':
1656 if (h8300_constant_length (addr) == 2)
1657 fprintf (file, ":16");
1658 else
1659 fprintf (file, ":32");
1660 break;
1661 default:
1662 break;
1665 break;
1667 case CONST_INT:
1668 case SYMBOL_REF:
1669 case CONST:
1670 case LABEL_REF:
1671 fprintf (file, "#");
1672 print_operand_address (file, x);
1673 break;
1674 case CONST_DOUBLE:
1676 long val;
1677 REAL_VALUE_TYPE rv;
1678 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1679 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1680 fprintf (file, "#%ld", val);
1681 break;
1683 default:
1684 break;
1689 /* Output assembly language output for the address ADDR to FILE. */
1691 void
1692 print_operand_address (FILE *file, rtx addr)
1694 rtx index;
1695 int size;
1697 switch (GET_CODE (addr))
1699 case REG:
1700 fprintf (file, "%s", h8_reg_names[REGNO (addr)]);
1701 break;
1703 case PRE_DEC:
1704 fprintf (file, "-%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1705 break;
1707 case POST_INC:
1708 fprintf (file, "%s+", h8_reg_names[REGNO (XEXP (addr, 0))]);
1709 break;
1711 case PRE_INC:
1712 fprintf (file, "+%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1713 break;
1715 case POST_DEC:
1716 fprintf (file, "%s-", h8_reg_names[REGNO (XEXP (addr, 0))]);
1717 break;
1719 case PLUS:
1720 fprintf (file, "(");
1722 index = h8300_get_index (XEXP (addr, 0), VOIDmode, &size);
1723 if (GET_CODE (index) == REG)
1725 /* reg,foo */
1726 print_operand_address (file, XEXP (addr, 1));
1727 fprintf (file, ",");
1728 switch (size)
1730 case 0:
1731 print_operand_address (file, index);
1732 break;
1734 case 1:
1735 print_operand (file, index, 'X');
1736 fputs (".b", file);
1737 break;
1739 case 2:
1740 print_operand (file, index, 'T');
1741 fputs (".w", file);
1742 break;
1744 case 4:
1745 print_operand (file, index, 'S');
1746 fputs (".l", file);
1747 break;
1749 /* print_operand_address (file, XEXP (addr, 0)); */
1751 else
1753 /* foo+k */
1754 print_operand_address (file, XEXP (addr, 0));
1755 fprintf (file, "+");
1756 print_operand_address (file, XEXP (addr, 1));
1758 fprintf (file, ")");
1759 break;
1761 case CONST_INT:
1763 /* Since the H8/300 only has 16 bit pointers, negative values are also
1764 those >= 32768. This happens for example with pointer minus a
1765 constant. We don't want to turn (char *p - 2) into
1766 (char *p + 65534) because loop unrolling can build upon this
1767 (IE: char *p + 131068). */
1768 int n = INTVAL (addr);
1769 if (TARGET_H8300)
1770 n = (int) (short) n;
1771 fprintf (file, "%d", n);
1772 break;
1775 default:
1776 output_addr_const (file, addr);
1777 break;
1781 /* Output all insn addresses and their sizes into the assembly language
1782 output file. This is helpful for debugging whether the length attributes
1783 in the md file are correct. This is not meant to be a user selectable
1784 option. */
1786 void
1787 final_prescan_insn (rtx insn, rtx *operand ATTRIBUTE_UNUSED,
1788 int num_operands ATTRIBUTE_UNUSED)
1790 /* This holds the last insn address. */
1791 static int last_insn_address = 0;
1793 const int uid = INSN_UID (insn);
1795 if (TARGET_ADDRESSES)
1797 fprintf (asm_out_file, "; 0x%x %d\n", INSN_ADDRESSES (uid),
1798 INSN_ADDRESSES (uid) - last_insn_address);
1799 last_insn_address = INSN_ADDRESSES (uid);
1803 /* Prepare for an SI sized move. */
1806 h8300_expand_movsi (rtx operands[])
1808 rtx src = operands[1];
1809 rtx dst = operands[0];
1810 if (!reload_in_progress && !reload_completed)
1812 if (!register_operand (dst, GET_MODE (dst)))
1814 rtx tmp = gen_reg_rtx (GET_MODE (dst));
1815 emit_move_insn (tmp, src);
1816 operands[1] = tmp;
1819 return 0;
1822 /* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
1823 Define the offset between two registers, one to be eliminated, and
1824 the other its replacement, at the start of a routine. */
1827 h8300_initial_elimination_offset (int from, int to)
1829 /* The number of bytes that the return address takes on the stack. */
1830 int pc_size = POINTER_SIZE / BITS_PER_UNIT;
1832 /* The number of bytes that the saved frame pointer takes on the stack. */
1833 int fp_size = frame_pointer_needed * UNITS_PER_WORD;
1835 /* The number of bytes that the saved registers, excluding the frame
1836 pointer, take on the stack. */
1837 int saved_regs_size = 0;
1839 /* The number of bytes that the locals takes on the stack. */
1840 int frame_size = round_frame_size (get_frame_size ());
1842 int regno;
1844 for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
1845 if (WORD_REG_USED (regno))
1846 saved_regs_size += UNITS_PER_WORD;
1848 /* Adjust saved_regs_size because the above loop took the frame
1849 pointer int account. */
1850 saved_regs_size -= fp_size;
1852 switch (to)
1854 case HARD_FRAME_POINTER_REGNUM:
1855 switch (from)
1857 case ARG_POINTER_REGNUM:
1858 return pc_size + fp_size;
1859 case RETURN_ADDRESS_POINTER_REGNUM:
1860 return fp_size;
1861 case FRAME_POINTER_REGNUM:
1862 return -saved_regs_size;
1863 default:
1864 gcc_unreachable ();
1866 break;
1867 case STACK_POINTER_REGNUM:
1868 switch (from)
1870 case ARG_POINTER_REGNUM:
1871 return pc_size + saved_regs_size + frame_size;
1872 case RETURN_ADDRESS_POINTER_REGNUM:
1873 return saved_regs_size + frame_size;
1874 case FRAME_POINTER_REGNUM:
1875 return frame_size;
1876 default:
1877 gcc_unreachable ();
1879 break;
1880 default:
1881 gcc_unreachable ();
1883 gcc_unreachable ();
1886 /* Worker function for RETURN_ADDR_RTX. */
1889 h8300_return_addr_rtx (int count, rtx frame)
1891 rtx ret;
1893 if (count == 0)
1894 ret = gen_rtx_MEM (Pmode,
1895 gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM));
1896 else if (flag_omit_frame_pointer)
1897 return (rtx) 0;
1898 else
1899 ret = gen_rtx_MEM (Pmode,
1900 memory_address (Pmode,
1901 plus_constant (frame, UNITS_PER_WORD)));
1902 set_mem_alias_set (ret, get_frame_alias_set ());
1903 return ret;
1906 /* Update the condition code from the insn. */
1908 void
1909 notice_update_cc (rtx body, rtx insn)
1911 rtx set;
1913 switch (get_attr_cc (insn))
1915 case CC_NONE:
1916 /* Insn does not affect CC at all. */
1917 break;
1919 case CC_NONE_0HIT:
1920 /* Insn does not change CC, but the 0'th operand has been changed. */
1921 if (cc_status.value1 != 0
1922 && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value1))
1923 cc_status.value1 = 0;
1924 if (cc_status.value2 != 0
1925 && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value2))
1926 cc_status.value2 = 0;
1927 break;
1929 case CC_SET_ZN:
1930 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
1931 The V flag is unusable. The C flag may or may not be known but
1932 that's ok because alter_cond will change tests to use EQ/NE. */
1933 CC_STATUS_INIT;
1934 cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY;
1935 set = single_set (insn);
1936 cc_status.value1 = SET_SRC (set);
1937 if (SET_DEST (set) != cc0_rtx)
1938 cc_status.value2 = SET_DEST (set);
1939 break;
1941 case CC_SET_ZNV:
1942 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
1943 The C flag may or may not be known but that's ok because
1944 alter_cond will change tests to use EQ/NE. */
1945 CC_STATUS_INIT;
1946 cc_status.flags |= CC_NO_CARRY;
1947 set = single_set (insn);
1948 cc_status.value1 = SET_SRC (set);
1949 if (SET_DEST (set) != cc0_rtx)
1951 /* If the destination is STRICT_LOW_PART, strip off
1952 STRICT_LOW_PART. */
1953 if (GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
1954 cc_status.value2 = XEXP (SET_DEST (set), 0);
1955 else
1956 cc_status.value2 = SET_DEST (set);
1958 break;
1960 case CC_COMPARE:
1961 /* The insn is a compare instruction. */
1962 CC_STATUS_INIT;
1963 cc_status.value1 = SET_SRC (body);
1964 break;
1966 case CC_CLOBBER:
1967 /* Insn doesn't leave CC in a usable state. */
1968 CC_STATUS_INIT;
1969 break;
1973 /* Given that X occurs in an address of the form (plus X constant),
1974 return the part of X that is expected to be a register. There are
1975 four kinds of addressing mode to recognize:
1977 @(dd,Rn)
1978 @(dd,RnL.b)
1979 @(dd,Rn.w)
1980 @(dd,ERn.l)
1982 If SIZE is nonnull, and the address is one of the last three forms,
1983 set *SIZE to the index multiplication factor. Set it to 0 for
1984 plain @(dd,Rn) addresses.
1986 MODE is the mode of the value being accessed. It can be VOIDmode
1987 if the address is known to be valid, but its mode is unknown. */
1990 h8300_get_index (rtx x, enum machine_mode mode, int *size)
1992 int dummy, factor;
1994 if (size == 0)
1995 size = &dummy;
1997 factor = (mode == VOIDmode ? 0 : GET_MODE_SIZE (mode));
1998 if (TARGET_H8300SX
1999 && factor <= 4
2000 && (mode == VOIDmode
2001 || GET_MODE_CLASS (mode) == MODE_INT
2002 || GET_MODE_CLASS (mode) == MODE_FLOAT))
2004 if (factor <= 1 && GET_CODE (x) == ZERO_EXTEND)
2006 /* When accessing byte-sized values, the index can be
2007 a zero-extended QImode or HImode register. */
2008 *size = GET_MODE_SIZE (GET_MODE (XEXP (x, 0)));
2009 return XEXP (x, 0);
2011 else
2013 /* We're looking for addresses of the form:
2015 (mult X I)
2016 or (mult (zero_extend X) I)
2018 where I is the size of the operand being accessed.
2019 The canonical form of the second expression is:
2021 (and (mult (subreg X) I) J)
2023 where J == GET_MODE_MASK (GET_MODE (X)) * I. */
2024 rtx index;
2026 if (GET_CODE (x) == AND
2027 && GET_CODE (XEXP (x, 1)) == CONST_INT
2028 && (factor == 0
2029 || INTVAL (XEXP (x, 1)) == 0xff * factor
2030 || INTVAL (XEXP (x, 1)) == 0xffff * factor))
2032 index = XEXP (x, 0);
2033 *size = (INTVAL (XEXP (x, 1)) >= 0xffff ? 2 : 1);
2035 else
2037 index = x;
2038 *size = 4;
2041 if (GET_CODE (index) == MULT
2042 && GET_CODE (XEXP (index, 1)) == CONST_INT
2043 && (factor == 0 || factor == INTVAL (XEXP (index, 1))))
2044 return XEXP (index, 0);
2047 *size = 0;
2048 return x;
2051 static const h8300_length_table addb_length_table =
2053 /* #xx Rs @aa @Rs @xx */
2054 { 2, 2, 4, 4, 4 }, /* add.b xx,Rd */
2055 { 4, 4, 4, 4, 6 }, /* add.b xx,@aa */
2056 { 4, 4, 4, 4, 6 }, /* add.b xx,@Rd */
2057 { 6, 4, 4, 4, 6 } /* add.b xx,@xx */
2060 static const h8300_length_table addw_length_table =
2062 /* #xx Rs @aa @Rs @xx */
2063 { 2, 2, 4, 4, 4 }, /* add.w xx,Rd */
2064 { 4, 4, 4, 4, 6 }, /* add.w xx,@aa */
2065 { 4, 4, 4, 4, 6 }, /* add.w xx,@Rd */
2066 { 4, 4, 4, 4, 6 } /* add.w xx,@xx */
2069 static const h8300_length_table addl_length_table =
2071 /* #xx Rs @aa @Rs @xx */
2072 { 2, 2, 4, 4, 4 }, /* add.l xx,Rd */
2073 { 4, 4, 6, 6, 6 }, /* add.l xx,@aa */
2074 { 4, 4, 6, 6, 6 }, /* add.l xx,@Rd */
2075 { 4, 4, 6, 6, 6 } /* add.l xx,@xx */
2078 #define logicb_length_table addb_length_table
2079 #define logicw_length_table addw_length_table
2081 static const h8300_length_table logicl_length_table =
2083 /* #xx Rs @aa @Rs @xx */
2084 { 2, 4, 4, 4, 4 }, /* and.l xx,Rd */
2085 { 4, 4, 6, 6, 6 }, /* and.l xx,@aa */
2086 { 4, 4, 6, 6, 6 }, /* and.l xx,@Rd */
2087 { 4, 4, 6, 6, 6 } /* and.l xx,@xx */
2090 static const h8300_length_table movb_length_table =
2092 /* #xx Rs @aa @Rs @xx */
2093 { 2, 2, 2, 2, 4 }, /* mov.b xx,Rd */
2094 { 4, 2, 4, 4, 4 }, /* mov.b xx,@aa */
2095 { 4, 2, 4, 4, 4 }, /* mov.b xx,@Rd */
2096 { 4, 4, 4, 4, 4 } /* mov.b xx,@xx */
2099 #define movw_length_table movb_length_table
2101 static const h8300_length_table movl_length_table =
2103 /* #xx Rs @aa @Rs @xx */
2104 { 2, 2, 4, 4, 4 }, /* mov.l xx,Rd */
2105 { 4, 4, 4, 4, 4 }, /* mov.l xx,@aa */
2106 { 4, 4, 4, 4, 4 }, /* mov.l xx,@Rd */
2107 { 4, 4, 4, 4, 4 } /* mov.l xx,@xx */
2110 /* Return the size of the given address or displacement constant. */
2112 static unsigned int
2113 h8300_constant_length (rtx constant)
2115 /* Check for (@d:16,Reg). */
2116 if (GET_CODE (constant) == CONST_INT
2117 && IN_RANGE (INTVAL (constant), -0x8000, 0x7fff))
2118 return 2;
2120 /* Check for (@d:16,Reg) in cases where the displacement is
2121 an absolute address. */
2122 if (Pmode == HImode || h8300_tiny_constant_address_p (constant))
2123 return 2;
2125 return 4;
2128 /* Return the size of a displacement field in address ADDR, which should
2129 have the form (plus X constant). SIZE is the number of bytes being
2130 accessed. */
2132 static unsigned int
2133 h8300_displacement_length (rtx addr, int size)
2135 rtx offset;
2137 offset = XEXP (addr, 1);
2139 /* Check for @(d:2,Reg). */
2140 if (register_operand (XEXP (addr, 0), VOIDmode)
2141 && GET_CODE (offset) == CONST_INT
2142 && (INTVAL (offset) == size
2143 || INTVAL (offset) == size * 2
2144 || INTVAL (offset) == size * 3))
2145 return 0;
2147 return h8300_constant_length (offset);
2150 /* Store the class of operand OP in *CLASS and return the length of any
2151 extra operand fields. SIZE is the number of bytes in OP. CLASS
2152 can be null if only the length is needed. */
2154 static unsigned int
2155 h8300_classify_operand (rtx op, int size, enum h8300_operand_class *class)
2157 enum h8300_operand_class dummy;
2159 if (class == 0)
2160 class = &dummy;
2162 if (CONSTANT_P (op))
2164 *class = H8OP_IMMEDIATE;
2166 /* Byte-sized immediates are stored in the opcode fields. */
2167 if (size == 1)
2168 return 0;
2170 /* If this is a 32-bit instruction, see whether the constant
2171 will fit into a 16-bit immediate field. */
2172 if (TARGET_H8300SX
2173 && size == 4
2174 && GET_CODE (op) == CONST_INT
2175 && IN_RANGE (INTVAL (op), 0, 0xffff))
2176 return 2;
2178 return size;
2180 else if (GET_CODE (op) == MEM)
2182 op = XEXP (op, 0);
2183 if (CONSTANT_P (op))
2185 *class = H8OP_MEM_ABSOLUTE;
2186 return h8300_constant_length (op);
2188 else if (GET_CODE (op) == PLUS && CONSTANT_P (XEXP (op, 1)))
2190 *class = H8OP_MEM_COMPLEX;
2191 return h8300_displacement_length (op, size);
2193 else if (GET_RTX_CLASS (GET_CODE (op)) == RTX_AUTOINC)
2195 *class = H8OP_MEM_COMPLEX;
2196 return 0;
2198 else if (register_operand (op, VOIDmode))
2200 *class = H8OP_MEM_BASE;
2201 return 0;
2204 gcc_assert (register_operand (op, VOIDmode));
2205 *class = H8OP_REGISTER;
2206 return 0;
2209 /* Return the length of the instruction described by TABLE given that
2210 its operands are OP1 and OP2. OP1 must be an h8300_dst_operand
2211 and OP2 must be an h8300_src_operand. */
2213 static unsigned int
2214 h8300_length_from_table (rtx op1, rtx op2, const h8300_length_table *table)
2216 enum h8300_operand_class op1_class, op2_class;
2217 unsigned int size, immediate_length;
2219 size = GET_MODE_SIZE (GET_MODE (op1));
2220 immediate_length = (h8300_classify_operand (op1, size, &op1_class)
2221 + h8300_classify_operand (op2, size, &op2_class));
2222 return immediate_length + (*table)[op1_class - 1][op2_class];
2225 /* Return the length of a unary instruction such as neg or not given that
2226 its operand is OP. */
2228 unsigned int
2229 h8300_unary_length (rtx op)
2231 enum h8300_operand_class class;
2232 unsigned int size, operand_length;
2234 size = GET_MODE_SIZE (GET_MODE (op));
2235 operand_length = h8300_classify_operand (op, size, &class);
2236 switch (class)
2238 case H8OP_REGISTER:
2239 return 2;
2241 case H8OP_MEM_BASE:
2242 return (size == 4 ? 6 : 4);
2244 case H8OP_MEM_ABSOLUTE:
2245 return operand_length + (size == 4 ? 6 : 4);
2247 case H8OP_MEM_COMPLEX:
2248 return operand_length + 6;
2250 default:
2251 gcc_unreachable ();
2255 /* Likewise short immediate instructions such as add.w #xx:3,OP. */
2257 static unsigned int
2258 h8300_short_immediate_length (rtx op)
2260 enum h8300_operand_class class;
2261 unsigned int size, operand_length;
2263 size = GET_MODE_SIZE (GET_MODE (op));
2264 operand_length = h8300_classify_operand (op, size, &class);
2266 switch (class)
2268 case H8OP_REGISTER:
2269 return 2;
2271 case H8OP_MEM_BASE:
2272 case H8OP_MEM_ABSOLUTE:
2273 case H8OP_MEM_COMPLEX:
2274 return 4 + operand_length;
2276 default:
2277 gcc_unreachable ();
2281 /* Likewise bitfield load and store instructions. */
2283 static unsigned int
2284 h8300_bitfield_length (rtx op, rtx op2)
2286 enum h8300_operand_class class;
2287 unsigned int size, operand_length;
2289 if (GET_CODE (op) == REG)
2290 op = op2;
2291 gcc_assert (GET_CODE (op) != REG);
2293 size = GET_MODE_SIZE (GET_MODE (op));
2294 operand_length = h8300_classify_operand (op, size, &class);
2296 switch (class)
2298 case H8OP_MEM_BASE:
2299 case H8OP_MEM_ABSOLUTE:
2300 case H8OP_MEM_COMPLEX:
2301 return 4 + operand_length;
2303 default:
2304 gcc_unreachable ();
2308 /* Calculate the length of general binary instruction INSN using TABLE. */
2310 static unsigned int
2311 h8300_binary_length (rtx insn, const h8300_length_table *table)
2313 rtx set;
2315 set = single_set (insn);
2316 gcc_assert (set);
2318 if (BINARY_P (SET_SRC (set)))
2319 return h8300_length_from_table (XEXP (SET_SRC (set), 0),
2320 XEXP (SET_SRC (set), 1), table);
2321 else
2323 gcc_assert (GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == RTX_TERNARY);
2324 return h8300_length_from_table (XEXP (XEXP (SET_SRC (set), 1), 0),
2325 XEXP (XEXP (SET_SRC (set), 1), 1),
2326 table);
2330 /* Subroutine of h8300_move_length. Return true if OP is 1- or 2-byte
2331 memory reference and either (1) it has the form @(d:16,Rn) or
2332 (2) its address has the code given by INC_CODE. */
2334 static bool
2335 h8300_short_move_mem_p (rtx op, enum rtx_code inc_code)
2337 rtx addr;
2338 unsigned int size;
2340 if (GET_CODE (op) != MEM)
2341 return false;
2343 addr = XEXP (op, 0);
2344 size = GET_MODE_SIZE (GET_MODE (op));
2345 if (size != 1 && size != 2)
2346 return false;
2348 return (GET_CODE (addr) == inc_code
2349 || (GET_CODE (addr) == PLUS
2350 && GET_CODE (XEXP (addr, 0)) == REG
2351 && h8300_displacement_length (addr, size) == 2));
2354 /* Calculate the length of move instruction INSN using the given length
2355 table. Although the tables are correct for most cases, there is some
2356 irregularity in the length of mov.b and mov.w. The following forms:
2358 mov @ERs+, Rd
2359 mov @(d:16,ERs), Rd
2360 mov Rs, @-ERd
2361 mov Rs, @(d:16,ERd)
2363 are two bytes shorter than most other "mov Rs, @complex" or
2364 "mov @complex,Rd" combinations. */
2366 static unsigned int
2367 h8300_move_length (rtx *operands, const h8300_length_table *table)
2369 unsigned int size;
2371 size = h8300_length_from_table (operands[0], operands[1], table);
2372 if (REG_P (operands[0]) && h8300_short_move_mem_p (operands[1], POST_INC))
2373 size -= 2;
2374 if (REG_P (operands[1]) && h8300_short_move_mem_p (operands[0], PRE_DEC))
2375 size -= 2;
2376 return size;
2379 /* Return the length of a mova instruction with the given operands.
2380 DEST is the register destination, SRC is the source address and
2381 OFFSET is the 16-bit or 32-bit displacement. */
2383 static unsigned int
2384 h8300_mova_length (rtx dest, rtx src, rtx offset)
2386 unsigned int size;
2388 size = (2
2389 + h8300_constant_length (offset)
2390 + h8300_classify_operand (src, GET_MODE_SIZE (GET_MODE (src)), 0));
2391 if (!REG_P (dest) || !REG_P (src) || REGNO (src) != REGNO (dest))
2392 size += 2;
2393 return size;
2396 /* Compute the length of INSN based on its length_table attribute.
2397 OPERANDS is the array of its operands. */
2399 unsigned int
2400 h8300_insn_length_from_table (rtx insn, rtx * operands)
2402 switch (get_attr_length_table (insn))
2404 case LENGTH_TABLE_NONE:
2405 gcc_unreachable ();
2407 case LENGTH_TABLE_ADDB:
2408 return h8300_binary_length (insn, &addb_length_table);
2410 case LENGTH_TABLE_ADDW:
2411 return h8300_binary_length (insn, &addw_length_table);
2413 case LENGTH_TABLE_ADDL:
2414 return h8300_binary_length (insn, &addl_length_table);
2416 case LENGTH_TABLE_LOGICB:
2417 return h8300_binary_length (insn, &logicb_length_table);
2419 case LENGTH_TABLE_MOVB:
2420 return h8300_move_length (operands, &movb_length_table);
2422 case LENGTH_TABLE_MOVW:
2423 return h8300_move_length (operands, &movw_length_table);
2425 case LENGTH_TABLE_MOVL:
2426 return h8300_move_length (operands, &movl_length_table);
2428 case LENGTH_TABLE_MOVA:
2429 return h8300_mova_length (operands[0], operands[1], operands[2]);
2431 case LENGTH_TABLE_MOVA_ZERO:
2432 return h8300_mova_length (operands[0], operands[1], const0_rtx);
2434 case LENGTH_TABLE_UNARY:
2435 return h8300_unary_length (operands[0]);
2437 case LENGTH_TABLE_MOV_IMM4:
2438 return 2 + h8300_classify_operand (operands[0], 0, 0);
2440 case LENGTH_TABLE_SHORT_IMMEDIATE:
2441 return h8300_short_immediate_length (operands[0]);
2443 case LENGTH_TABLE_BITFIELD:
2444 return h8300_bitfield_length (operands[0], operands[1]);
2446 case LENGTH_TABLE_BITBRANCH:
2447 return h8300_bitfield_length (operands[1], operands[2]) - 2;
2449 default:
2450 gcc_unreachable ();
2454 /* Return true if LHS and RHS are memory references that can be mapped
2455 to the same h8sx assembly operand. LHS appears as the destination of
2456 an instruction and RHS appears as a source.
2458 Three cases are allowed:
2460 - RHS is @+Rn or @-Rn, LHS is @Rn
2461 - RHS is @Rn, LHS is @Rn+ or @Rn-
2462 - RHS and LHS have the same address and neither has side effects. */
2464 bool
2465 h8sx_mergeable_memrefs_p (rtx lhs, rtx rhs)
2467 if (GET_CODE (rhs) == MEM && GET_CODE (lhs) == MEM)
2469 rhs = XEXP (rhs, 0);
2470 lhs = XEXP (lhs, 0);
2472 if (GET_CODE (rhs) == PRE_INC || GET_CODE (rhs) == PRE_DEC)
2473 return rtx_equal_p (XEXP (rhs, 0), lhs);
2475 if (GET_CODE (lhs) == POST_INC || GET_CODE (lhs) == POST_DEC)
2476 return rtx_equal_p (rhs, XEXP (lhs, 0));
2478 if (rtx_equal_p (rhs, lhs))
2479 return true;
2481 return false;
2484 /* Return true if OPERANDS[1] can be mapped to the same assembly
2485 operand as OPERANDS[0]. */
2487 bool
2488 h8300_operands_match_p (rtx *operands)
2490 if (register_operand (operands[0], VOIDmode)
2491 && register_operand (operands[1], VOIDmode))
2492 return true;
2494 if (h8sx_mergeable_memrefs_p (operands[0], operands[1]))
2495 return true;
2497 return false;
2500 /* Try using movmd to move LENGTH bytes from memory region SRC to memory
2501 region DEST. The two regions do not overlap and have the common
2502 alignment given by ALIGNMENT. Return true on success.
2504 Using movmd for variable-length moves seems to involve some
2505 complex trade-offs. For instance:
2507 - Preparing for a movmd instruction is similar to preparing
2508 for a memcpy. The main difference is that the arguments
2509 are moved into er4, er5 and er6 rather than er0, er1 and er2.
2511 - Since movmd clobbers the frame pointer, we need to save
2512 and restore it somehow when frame_pointer_needed. This can
2513 sometimes make movmd sequences longer than calls to memcpy().
2515 - The counter register is 16 bits, so the instruction is only
2516 suitable for variable-length moves when sizeof (size_t) == 2.
2517 That's only true in normal mode.
2519 - We will often lack static alignment information. Falling back
2520 on movmd.b would likely be slower than calling memcpy(), at least
2521 for big moves.
2523 This function therefore only uses movmd when the length is a
2524 known constant, and only then if -fomit-frame-pointer is in
2525 effect or if we're not optimizing for size.
2527 At the moment the function uses movmd for all in-range constants,
2528 but it might be better to fall back on memcpy() for large moves
2529 if ALIGNMENT == 1. */
2531 bool
2532 h8sx_emit_movmd (rtx dest, rtx src, rtx length,
2533 HOST_WIDE_INT alignment)
2535 if (!flag_omit_frame_pointer && optimize_size)
2536 return false;
2538 if (GET_CODE (length) == CONST_INT)
2540 rtx dest_reg, src_reg, first_dest, first_src;
2541 HOST_WIDE_INT n;
2542 int factor;
2544 /* Use movmd.l if the alignment allows it, otherwise fall back
2545 on movmd.b. */
2546 factor = (alignment >= 2 ? 4 : 1);
2548 /* Make sure the length is within range. We can handle counter
2549 values up to 65536, although HImode truncation will make
2550 the count appear negative in rtl dumps. */
2551 n = INTVAL (length);
2552 if (n <= 0 || n / factor > 65536)
2553 return false;
2555 /* Create temporary registers for the source and destination
2556 pointers. Initialize them to the start of each region. */
2557 dest_reg = copy_addr_to_reg (XEXP (dest, 0));
2558 src_reg = copy_addr_to_reg (XEXP (src, 0));
2560 /* Create references to the movmd source and destination blocks. */
2561 first_dest = replace_equiv_address (dest, dest_reg);
2562 first_src = replace_equiv_address (src, src_reg);
2564 set_mem_size (first_dest, GEN_INT (n & -factor));
2565 set_mem_size (first_src, GEN_INT (n & -factor));
2567 length = copy_to_mode_reg (HImode, gen_int_mode (n / factor, HImode));
2568 emit_insn (gen_movmd (first_dest, first_src, length, GEN_INT (factor)));
2570 if ((n & -factor) != n)
2572 /* Move SRC and DEST past the region we just copied.
2573 This is done to update the memory attributes. */
2574 dest = adjust_address (dest, BLKmode, n & -factor);
2575 src = adjust_address (src, BLKmode, n & -factor);
2577 /* Replace the addresses with the source and destination
2578 registers, which movmd has left with the right values. */
2579 dest = replace_equiv_address (dest, dest_reg);
2580 src = replace_equiv_address (src, src_reg);
2582 /* Mop up the left-over bytes. */
2583 if (n & 2)
2584 emit_move_insn (adjust_address (dest, HImode, 0),
2585 adjust_address (src, HImode, 0));
2586 if (n & 1)
2587 emit_move_insn (adjust_address (dest, QImode, n & 2),
2588 adjust_address (src, QImode, n & 2));
2590 return true;
2592 return false;
2595 /* Move ADDR into er6 after pushing its old value onto the stack. */
2597 void
2598 h8300_swap_into_er6 (rtx addr)
2600 push (HARD_FRAME_POINTER_REGNUM);
2601 emit_move_insn (hard_frame_pointer_rtx, addr);
2602 if (REGNO (addr) == SP_REG)
2603 emit_move_insn (hard_frame_pointer_rtx,
2604 plus_constant (hard_frame_pointer_rtx,
2605 GET_MODE_SIZE (word_mode)));
2608 /* Move the current value of er6 into ADDR and pop its old value
2609 from the stack. */
2611 void
2612 h8300_swap_out_of_er6 (rtx addr)
2614 if (REGNO (addr) != SP_REG)
2615 emit_move_insn (addr, hard_frame_pointer_rtx);
2616 pop (HARD_FRAME_POINTER_REGNUM);
2619 /* Return the length of mov instruction. */
2621 unsigned int
2622 compute_mov_length (rtx *operands)
2624 /* If the mov instruction involves a memory operand, we compute the
2625 length, assuming the largest addressing mode is used, and then
2626 adjust later in the function. Otherwise, we compute and return
2627 the exact length in one step. */
2628 enum machine_mode mode = GET_MODE (operands[0]);
2629 rtx dest = operands[0];
2630 rtx src = operands[1];
2631 rtx addr;
2633 if (GET_CODE (src) == MEM)
2634 addr = XEXP (src, 0);
2635 else if (GET_CODE (dest) == MEM)
2636 addr = XEXP (dest, 0);
2637 else
2638 addr = NULL_RTX;
2640 if (TARGET_H8300)
2642 unsigned int base_length;
2644 switch (mode)
2646 case QImode:
2647 if (addr == NULL_RTX)
2648 return 2;
2650 /* The eightbit addressing is available only in QImode, so
2651 go ahead and take care of it. */
2652 if (h8300_eightbit_constant_address_p (addr))
2653 return 2;
2655 base_length = 4;
2656 break;
2658 case HImode:
2659 if (addr == NULL_RTX)
2661 if (REG_P (src))
2662 return 2;
2664 if (src == const0_rtx)
2665 return 2;
2667 return 4;
2670 base_length = 4;
2671 break;
2673 case SImode:
2674 if (addr == NULL_RTX)
2676 if (REG_P (src))
2677 return 4;
2679 if (GET_CODE (src) == CONST_INT)
2681 if (src == const0_rtx)
2682 return 4;
2684 if ((INTVAL (src) & 0xffff) == 0)
2685 return 6;
2687 if ((INTVAL (src) & 0xffff) == 0)
2688 return 6;
2690 if ((INTVAL (src) & 0xffff)
2691 == ((INTVAL (src) >> 16) & 0xffff))
2692 return 6;
2694 return 8;
2697 base_length = 8;
2698 break;
2700 case SFmode:
2701 if (addr == NULL_RTX)
2703 if (REG_P (src))
2704 return 4;
2706 if (CONST_DOUBLE_OK_FOR_LETTER_P (src, 'G'))
2707 return 4;
2709 return 8;
2712 base_length = 8;
2713 break;
2715 default:
2716 gcc_unreachable ();
2719 /* Adjust the length based on the addressing mode used.
2720 Specifically, we subtract the difference between the actual
2721 length and the longest one, which is @(d:16,Rs). For SImode
2722 and SFmode, we double the adjustment because two mov.w are
2723 used to do the job. */
2725 /* @Rs+ and @-Rd are 2 bytes shorter than the longest. */
2726 if (GET_CODE (addr) == PRE_DEC
2727 || GET_CODE (addr) == POST_INC)
2729 if (mode == QImode || mode == HImode)
2730 return base_length - 2;
2731 else
2732 /* In SImode and SFmode, we use two mov.w instructions, so
2733 double the adjustment. */
2734 return base_length - 4;
2737 /* @Rs and @Rd are 2 bytes shorter than the longest. Note that
2738 in SImode and SFmode, the second mov.w involves an address
2739 with displacement, namely @(2,Rs) or @(2,Rd), so we subtract
2740 only 2 bytes. */
2741 if (GET_CODE (addr) == REG)
2742 return base_length - 2;
2744 return base_length;
2746 else
2748 unsigned int base_length;
2750 switch (mode)
2752 case QImode:
2753 if (addr == NULL_RTX)
2754 return 2;
2756 /* The eightbit addressing is available only in QImode, so
2757 go ahead and take care of it. */
2758 if (h8300_eightbit_constant_address_p (addr))
2759 return 2;
2761 base_length = 8;
2762 break;
2764 case HImode:
2765 if (addr == NULL_RTX)
2767 if (REG_P (src))
2768 return 2;
2770 if (src == const0_rtx)
2771 return 2;
2773 return 4;
2776 base_length = 8;
2777 break;
2779 case SImode:
2780 if (addr == NULL_RTX)
2782 if (REG_P (src))
2784 if (REGNO (src) == MAC_REG || REGNO (dest) == MAC_REG)
2785 return 4;
2786 else
2787 return 2;
2790 if (GET_CODE (src) == CONST_INT)
2792 int val = INTVAL (src);
2794 if (val == 0)
2795 return 2;
2797 if (val == (val & 0x00ff) || val == (val & 0xff00))
2798 return 4;
2800 switch (val & 0xffffffff)
2802 case 0xffffffff:
2803 case 0xfffffffe:
2804 case 0xfffffffc:
2805 case 0x0000ffff:
2806 case 0x0000fffe:
2807 case 0xffff0000:
2808 case 0xfffe0000:
2809 case 0x00010000:
2810 case 0x00020000:
2811 return 4;
2814 return 6;
2817 base_length = 10;
2818 break;
2820 case SFmode:
2821 if (addr == NULL_RTX)
2823 if (REG_P (src))
2824 return 2;
2826 if (CONST_DOUBLE_OK_FOR_LETTER_P (src, 'G'))
2827 return 2;
2829 return 6;
2832 base_length = 10;
2833 break;
2835 default:
2836 gcc_unreachable ();
2839 /* Adjust the length based on the addressing mode used.
2840 Specifically, we subtract the difference between the actual
2841 length and the longest one, which is @(d:24,ERs). */
2843 /* @ERs+ and @-ERd are 6 bytes shorter than the longest. */
2844 if (GET_CODE (addr) == PRE_DEC
2845 || GET_CODE (addr) == POST_INC)
2846 return base_length - 6;
2848 /* @ERs and @ERd are 6 bytes shorter than the longest. */
2849 if (GET_CODE (addr) == REG)
2850 return base_length - 6;
2852 /* @(d:16,ERs) and @(d:16,ERd) are 4 bytes shorter than the
2853 longest. */
2854 if (GET_CODE (addr) == PLUS
2855 && GET_CODE (XEXP (addr, 0)) == REG
2856 && GET_CODE (XEXP (addr, 1)) == CONST_INT
2857 && INTVAL (XEXP (addr, 1)) > -32768
2858 && INTVAL (XEXP (addr, 1)) < 32767)
2859 return base_length - 4;
2861 /* @aa:16 is 4 bytes shorter than the longest. */
2862 if (h8300_tiny_constant_address_p (addr))
2863 return base_length - 4;
2865 /* @aa:24 is 2 bytes shorter than the longest. */
2866 if (CONSTANT_P (addr))
2867 return base_length - 2;
2869 return base_length;
2873 /* Output an addition insn. */
2875 const char *
2876 output_plussi (rtx *operands)
2878 enum machine_mode mode = GET_MODE (operands[0]);
2880 gcc_assert (mode == SImode);
2882 if (TARGET_H8300)
2884 if (GET_CODE (operands[2]) == REG)
2885 return "add.w\t%f2,%f0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2887 if (GET_CODE (operands[2]) == CONST_INT)
2889 HOST_WIDE_INT n = INTVAL (operands[2]);
2891 if ((n & 0xffffff) == 0)
2892 return "add\t%z2,%z0";
2893 if ((n & 0xffff) == 0)
2894 return "add\t%y2,%y0\n\taddx\t%z2,%z0";
2895 if ((n & 0xff) == 0)
2896 return "add\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2899 return "add\t%w2,%w0\n\taddx\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2901 else
2903 if (GET_CODE (operands[2]) == CONST_INT
2904 && register_operand (operands[1], VOIDmode))
2906 HOST_WIDE_INT intval = INTVAL (operands[2]);
2908 if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2909 return "add.l\t%S2,%S0";
2910 if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2911 return "sub.l\t%G2,%S0";
2913 /* See if we can finish with 2 bytes. */
2915 switch ((unsigned int) intval & 0xffffffff)
2917 case 0x00000001:
2918 case 0x00000002:
2919 case 0x00000004:
2920 return "adds\t%2,%S0";
2922 case 0xffffffff:
2923 case 0xfffffffe:
2924 case 0xfffffffc:
2925 return "subs\t%G2,%S0";
2927 case 0x00010000:
2928 case 0x00020000:
2929 operands[2] = GEN_INT (intval >> 16);
2930 return "inc.w\t%2,%e0";
2932 case 0xffff0000:
2933 case 0xfffe0000:
2934 operands[2] = GEN_INT (intval >> 16);
2935 return "dec.w\t%G2,%e0";
2938 /* See if we can finish with 4 bytes. */
2939 if ((intval & 0xffff) == 0)
2941 operands[2] = GEN_INT (intval >> 16);
2942 return "add.w\t%2,%e0";
2946 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
2948 operands[2] = GEN_INT (-INTVAL (operands[2]));
2949 return "sub.l\t%S2,%S0";
2951 return "add.l\t%S2,%S0";
2955 /* ??? It would be much easier to add the h8sx stuff if a single function
2956 classified the addition as either inc/dec, adds/subs, add.w or add.l. */
2957 /* Compute the length of an addition insn. */
2959 unsigned int
2960 compute_plussi_length (rtx *operands)
2962 enum machine_mode mode = GET_MODE (operands[0]);
2964 gcc_assert (mode == SImode);
2966 if (TARGET_H8300)
2968 if (GET_CODE (operands[2]) == REG)
2969 return 6;
2971 if (GET_CODE (operands[2]) == CONST_INT)
2973 HOST_WIDE_INT n = INTVAL (operands[2]);
2975 if ((n & 0xffffff) == 0)
2976 return 2;
2977 if ((n & 0xffff) == 0)
2978 return 4;
2979 if ((n & 0xff) == 0)
2980 return 6;
2983 return 8;
2985 else
2987 if (GET_CODE (operands[2]) == CONST_INT
2988 && register_operand (operands[1], VOIDmode))
2990 HOST_WIDE_INT intval = INTVAL (operands[2]);
2992 if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2993 return 2;
2994 if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2995 return 2;
2997 /* See if we can finish with 2 bytes. */
2999 switch ((unsigned int) intval & 0xffffffff)
3001 case 0x00000001:
3002 case 0x00000002:
3003 case 0x00000004:
3004 return 2;
3006 case 0xffffffff:
3007 case 0xfffffffe:
3008 case 0xfffffffc:
3009 return 2;
3011 case 0x00010000:
3012 case 0x00020000:
3013 return 2;
3015 case 0xffff0000:
3016 case 0xfffe0000:
3017 return 2;
3020 /* See if we can finish with 4 bytes. */
3021 if ((intval & 0xffff) == 0)
3022 return 4;
3025 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
3026 return h8300_length_from_table (operands[0],
3027 GEN_INT (-INTVAL (operands[2])),
3028 &addl_length_table);
3029 else
3030 return h8300_length_from_table (operands[0], operands[2],
3031 &addl_length_table);
3032 return 6;
3036 /* Compute which flag bits are valid after an addition insn. */
3039 compute_plussi_cc (rtx *operands)
3041 enum machine_mode mode = GET_MODE (operands[0]);
3043 gcc_assert (mode == SImode);
3045 if (TARGET_H8300)
3047 return CC_CLOBBER;
3049 else
3051 if (GET_CODE (operands[2]) == CONST_INT
3052 && register_operand (operands[1], VOIDmode))
3054 HOST_WIDE_INT intval = INTVAL (operands[2]);
3056 if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
3057 return CC_SET_ZN;
3058 if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
3059 return CC_SET_ZN;
3061 /* See if we can finish with 2 bytes. */
3063 switch ((unsigned int) intval & 0xffffffff)
3065 case 0x00000001:
3066 case 0x00000002:
3067 case 0x00000004:
3068 return CC_NONE_0HIT;
3070 case 0xffffffff:
3071 case 0xfffffffe:
3072 case 0xfffffffc:
3073 return CC_NONE_0HIT;
3075 case 0x00010000:
3076 case 0x00020000:
3077 return CC_CLOBBER;
3079 case 0xffff0000:
3080 case 0xfffe0000:
3081 return CC_CLOBBER;
3084 /* See if we can finish with 4 bytes. */
3085 if ((intval & 0xffff) == 0)
3086 return CC_CLOBBER;
3089 return CC_SET_ZN;
3093 /* Output a logical insn. */
3095 const char *
3096 output_logical_op (enum machine_mode mode, rtx *operands)
3098 /* Figure out the logical op that we need to perform. */
3099 enum rtx_code code = GET_CODE (operands[3]);
3100 /* Pretend that every byte is affected if both operands are registers. */
3101 const unsigned HOST_WIDE_INT intval =
3102 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3103 /* Always use the full instruction if the
3104 first operand is in memory. It is better
3105 to use define_splits to generate the shorter
3106 sequence where valid. */
3107 && register_operand (operands[1], VOIDmode)
3108 ? INTVAL (operands[2]) : 0x55555555);
3109 /* The determinant of the algorithm. If we perform an AND, 0
3110 affects a bit. Otherwise, 1 affects a bit. */
3111 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3112 /* Break up DET into pieces. */
3113 const unsigned HOST_WIDE_INT b0 = (det >> 0) & 0xff;
3114 const unsigned HOST_WIDE_INT b1 = (det >> 8) & 0xff;
3115 const unsigned HOST_WIDE_INT b2 = (det >> 16) & 0xff;
3116 const unsigned HOST_WIDE_INT b3 = (det >> 24) & 0xff;
3117 const unsigned HOST_WIDE_INT w0 = (det >> 0) & 0xffff;
3118 const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3119 int lower_half_easy_p = 0;
3120 int upper_half_easy_p = 0;
3121 /* The name of an insn. */
3122 const char *opname;
3123 char insn_buf[100];
3125 switch (code)
3127 case AND:
3128 opname = "and";
3129 break;
3130 case IOR:
3131 opname = "or";
3132 break;
3133 case XOR:
3134 opname = "xor";
3135 break;
3136 default:
3137 gcc_unreachable ();
3140 switch (mode)
3142 case HImode:
3143 /* First, see if we can finish with one insn. */
3144 if ((TARGET_H8300H || TARGET_H8300S)
3145 && b0 != 0
3146 && b1 != 0)
3148 sprintf (insn_buf, "%s.w\t%%T2,%%T0", opname);
3149 output_asm_insn (insn_buf, operands);
3151 else
3153 /* Take care of the lower byte. */
3154 if (b0 != 0)
3156 sprintf (insn_buf, "%s\t%%s2,%%s0", opname);
3157 output_asm_insn (insn_buf, operands);
3159 /* Take care of the upper byte. */
3160 if (b1 != 0)
3162 sprintf (insn_buf, "%s\t%%t2,%%t0", opname);
3163 output_asm_insn (insn_buf, operands);
3166 break;
3167 case SImode:
3168 if (TARGET_H8300H || TARGET_H8300S)
3170 /* Determine if the lower half can be taken care of in no more
3171 than two bytes. */
3172 lower_half_easy_p = (b0 == 0
3173 || b1 == 0
3174 || (code != IOR && w0 == 0xffff));
3176 /* Determine if the upper half can be taken care of in no more
3177 than two bytes. */
3178 upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3179 || (code == AND && w1 == 0xff00));
3182 /* Check if doing everything with one insn is no worse than
3183 using multiple insns. */
3184 if ((TARGET_H8300H || TARGET_H8300S)
3185 && w0 != 0 && w1 != 0
3186 && !(lower_half_easy_p && upper_half_easy_p)
3187 && !(code == IOR && w1 == 0xffff
3188 && (w0 & 0x8000) != 0 && lower_half_easy_p))
3190 sprintf (insn_buf, "%s.l\t%%S2,%%S0", opname);
3191 output_asm_insn (insn_buf, operands);
3193 else
3195 /* Take care of the lower and upper words individually. For
3196 each word, we try different methods in the order of
3198 1) the special insn (in case of AND or XOR),
3199 2) the word-wise insn, and
3200 3) The byte-wise insn. */
3201 if (w0 == 0xffff
3202 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3203 output_asm_insn ((code == AND)
3204 ? "sub.w\t%f0,%f0" : "not.w\t%f0",
3205 operands);
3206 else if ((TARGET_H8300H || TARGET_H8300S)
3207 && (b0 != 0)
3208 && (b1 != 0))
3210 sprintf (insn_buf, "%s.w\t%%f2,%%f0", opname);
3211 output_asm_insn (insn_buf, operands);
3213 else
3215 if (b0 != 0)
3217 sprintf (insn_buf, "%s\t%%w2,%%w0", opname);
3218 output_asm_insn (insn_buf, operands);
3220 if (b1 != 0)
3222 sprintf (insn_buf, "%s\t%%x2,%%x0", opname);
3223 output_asm_insn (insn_buf, operands);
3227 if ((w1 == 0xffff)
3228 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3229 output_asm_insn ((code == AND)
3230 ? "sub.w\t%e0,%e0" : "not.w\t%e0",
3231 operands);
3232 else if ((TARGET_H8300H || TARGET_H8300S)
3233 && code == IOR
3234 && w1 == 0xffff
3235 && (w0 & 0x8000) != 0)
3237 output_asm_insn ("exts.l\t%S0", operands);
3239 else if ((TARGET_H8300H || TARGET_H8300S)
3240 && code == AND
3241 && w1 == 0xff00)
3243 output_asm_insn ("extu.w\t%e0", operands);
3245 else if (TARGET_H8300H || TARGET_H8300S)
3247 if (w1 != 0)
3249 sprintf (insn_buf, "%s.w\t%%e2,%%e0", opname);
3250 output_asm_insn (insn_buf, operands);
3253 else
3255 if (b2 != 0)
3257 sprintf (insn_buf, "%s\t%%y2,%%y0", opname);
3258 output_asm_insn (insn_buf, operands);
3260 if (b3 != 0)
3262 sprintf (insn_buf, "%s\t%%z2,%%z0", opname);
3263 output_asm_insn (insn_buf, operands);
3267 break;
3268 default:
3269 gcc_unreachable ();
3271 return "";
3274 /* Compute the length of a logical insn. */
3276 unsigned int
3277 compute_logical_op_length (enum machine_mode mode, rtx *operands)
3279 /* Figure out the logical op that we need to perform. */
3280 enum rtx_code code = GET_CODE (operands[3]);
3281 /* Pretend that every byte is affected if both operands are registers. */
3282 const unsigned HOST_WIDE_INT intval =
3283 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3284 /* Always use the full instruction if the
3285 first operand is in memory. It is better
3286 to use define_splits to generate the shorter
3287 sequence where valid. */
3288 && register_operand (operands[1], VOIDmode)
3289 ? INTVAL (operands[2]) : 0x55555555);
3290 /* The determinant of the algorithm. If we perform an AND, 0
3291 affects a bit. Otherwise, 1 affects a bit. */
3292 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3293 /* Break up DET into pieces. */
3294 const unsigned HOST_WIDE_INT b0 = (det >> 0) & 0xff;
3295 const unsigned HOST_WIDE_INT b1 = (det >> 8) & 0xff;
3296 const unsigned HOST_WIDE_INT b2 = (det >> 16) & 0xff;
3297 const unsigned HOST_WIDE_INT b3 = (det >> 24) & 0xff;
3298 const unsigned HOST_WIDE_INT w0 = (det >> 0) & 0xffff;
3299 const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3300 int lower_half_easy_p = 0;
3301 int upper_half_easy_p = 0;
3302 /* Insn length. */
3303 unsigned int length = 0;
3305 switch (mode)
3307 case HImode:
3308 /* First, see if we can finish with one insn. */
3309 if ((TARGET_H8300H || TARGET_H8300S)
3310 && b0 != 0
3311 && b1 != 0)
3313 length = h8300_length_from_table (operands[1], operands[2],
3314 &logicw_length_table);
3316 else
3318 /* Take care of the lower byte. */
3319 if (b0 != 0)
3320 length += 2;
3322 /* Take care of the upper byte. */
3323 if (b1 != 0)
3324 length += 2;
3326 break;
3327 case SImode:
3328 if (TARGET_H8300H || TARGET_H8300S)
3330 /* Determine if the lower half can be taken care of in no more
3331 than two bytes. */
3332 lower_half_easy_p = (b0 == 0
3333 || b1 == 0
3334 || (code != IOR && w0 == 0xffff));
3336 /* Determine if the upper half can be taken care of in no more
3337 than two bytes. */
3338 upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3339 || (code == AND && w1 == 0xff00));
3342 /* Check if doing everything with one insn is no worse than
3343 using multiple insns. */
3344 if ((TARGET_H8300H || TARGET_H8300S)
3345 && w0 != 0 && w1 != 0
3346 && !(lower_half_easy_p && upper_half_easy_p)
3347 && !(code == IOR && w1 == 0xffff
3348 && (w0 & 0x8000) != 0 && lower_half_easy_p))
3350 length = h8300_length_from_table (operands[1], operands[2],
3351 &logicl_length_table);
3353 else
3355 /* Take care of the lower and upper words individually. For
3356 each word, we try different methods in the order of
3358 1) the special insn (in case of AND or XOR),
3359 2) the word-wise insn, and
3360 3) The byte-wise insn. */
3361 if (w0 == 0xffff
3362 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3364 length += 2;
3366 else if ((TARGET_H8300H || TARGET_H8300S)
3367 && (b0 != 0)
3368 && (b1 != 0))
3370 length += 4;
3372 else
3374 if (b0 != 0)
3375 length += 2;
3377 if (b1 != 0)
3378 length += 2;
3381 if (w1 == 0xffff
3382 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
3384 length += 2;
3386 else if ((TARGET_H8300H || TARGET_H8300S)
3387 && code == IOR
3388 && w1 == 0xffff
3389 && (w0 & 0x8000) != 0)
3391 length += 2;
3393 else if ((TARGET_H8300H || TARGET_H8300S)
3394 && code == AND
3395 && w1 == 0xff00)
3397 length += 2;
3399 else if (TARGET_H8300H || TARGET_H8300S)
3401 if (w1 != 0)
3402 length += 4;
3404 else
3406 if (b2 != 0)
3407 length += 2;
3409 if (b3 != 0)
3410 length += 2;
3413 break;
3414 default:
3415 gcc_unreachable ();
3417 return length;
3420 /* Compute which flag bits are valid after a logical insn. */
3423 compute_logical_op_cc (enum machine_mode mode, rtx *operands)
3425 /* Figure out the logical op that we need to perform. */
3426 enum rtx_code code = GET_CODE (operands[3]);
3427 /* Pretend that every byte is affected if both operands are registers. */
3428 const unsigned HOST_WIDE_INT intval =
3429 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3430 /* Always use the full instruction if the
3431 first operand is in memory. It is better
3432 to use define_splits to generate the shorter
3433 sequence where valid. */
3434 && register_operand (operands[1], VOIDmode)
3435 ? INTVAL (operands[2]) : 0x55555555);
3436 /* The determinant of the algorithm. If we perform an AND, 0
3437 affects a bit. Otherwise, 1 affects a bit. */
3438 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3439 /* Break up DET into pieces. */
3440 const unsigned HOST_WIDE_INT b0 = (det >> 0) & 0xff;
3441 const unsigned HOST_WIDE_INT b1 = (det >> 8) & 0xff;
3442 const unsigned HOST_WIDE_INT w0 = (det >> 0) & 0xffff;
3443 const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3444 int lower_half_easy_p = 0;
3445 int upper_half_easy_p = 0;
3446 /* Condition code. */
3447 enum attr_cc cc = CC_CLOBBER;
3449 switch (mode)
3451 case HImode:
3452 /* First, see if we can finish with one insn. */
3453 if ((TARGET_H8300H || TARGET_H8300S)
3454 && b0 != 0
3455 && b1 != 0)
3457 cc = CC_SET_ZNV;
3459 break;
3460 case SImode:
3461 if (TARGET_H8300H || TARGET_H8300S)
3463 /* Determine if the lower half can be taken care of in no more
3464 than two bytes. */
3465 lower_half_easy_p = (b0 == 0
3466 || b1 == 0
3467 || (code != IOR && w0 == 0xffff));
3469 /* Determine if the upper half can be taken care of in no more
3470 than two bytes. */
3471 upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3472 || (code == AND && w1 == 0xff00));
3475 /* Check if doing everything with one insn is no worse than
3476 using multiple insns. */
3477 if ((TARGET_H8300H || TARGET_H8300S)
3478 && w0 != 0 && w1 != 0
3479 && !(lower_half_easy_p && upper_half_easy_p)
3480 && !(code == IOR && w1 == 0xffff
3481 && (w0 & 0x8000) != 0 && lower_half_easy_p))
3483 cc = CC_SET_ZNV;
3485 else
3487 if ((TARGET_H8300H || TARGET_H8300S)
3488 && code == IOR
3489 && w1 == 0xffff
3490 && (w0 & 0x8000) != 0)
3492 cc = CC_SET_ZNV;
3495 break;
3496 default:
3497 gcc_unreachable ();
3499 return cc;
3502 /* Expand a conditional branch. */
3504 void
3505 h8300_expand_branch (enum rtx_code code, rtx label)
3507 rtx tmp;
3509 tmp = gen_rtx_fmt_ee (code, VOIDmode, cc0_rtx, const0_rtx);
3510 tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
3511 gen_rtx_LABEL_REF (VOIDmode, label),
3512 pc_rtx);
3513 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
3516 /* Shifts.
3518 We devote a fair bit of code to getting efficient shifts since we
3519 can only shift one bit at a time on the H8/300 and H8/300H and only
3520 one or two bits at a time on the H8S.
3522 All shift code falls into one of the following ways of
3523 implementation:
3525 o SHIFT_INLINE: Emit straight line code for the shift; this is used
3526 when a straight line shift is about the same size or smaller than
3527 a loop.
3529 o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
3530 off the bits we don't need. This is used when only a few of the
3531 bits in the original value will survive in the shifted value.
3533 o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
3534 simulate a shift by 8, 16, or 24 bits. Once moved, a few inline
3535 shifts can be added if the shift count is slightly more than 8 or
3536 16. This case also includes other oddballs that are not worth
3537 explaining here.
3539 o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
3541 For each shift count, we try to use code that has no trade-off
3542 between code size and speed whenever possible.
3544 If the trade-off is unavoidable, we try to be reasonable.
3545 Specifically, the fastest version is one instruction longer than
3546 the shortest version, we take the fastest version. We also provide
3547 the use a way to switch back to the shortest version with -Os.
3549 For the details of the shift algorithms for various shift counts,
3550 refer to shift_alg_[qhs]i. */
3552 /* Classify a shift with the given mode and code. OP is the shift amount. */
3554 enum h8sx_shift_type
3555 h8sx_classify_shift (enum machine_mode mode, enum rtx_code code, rtx op)
3557 if (!TARGET_H8300SX)
3558 return H8SX_SHIFT_NONE;
3560 switch (code)
3562 case ASHIFT:
3563 case LSHIFTRT:
3564 /* Check for variable shifts (shll Rs,Rd and shlr Rs,Rd). */
3565 if (GET_CODE (op) != CONST_INT)
3566 return H8SX_SHIFT_BINARY;
3568 /* Reject out-of-range shift amounts. */
3569 if (INTVAL (op) <= 0 || INTVAL (op) >= GET_MODE_BITSIZE (mode))
3570 return H8SX_SHIFT_NONE;
3572 /* Power-of-2 shifts are effectively unary operations. */
3573 if (exact_log2 (INTVAL (op)) >= 0)
3574 return H8SX_SHIFT_UNARY;
3576 return H8SX_SHIFT_BINARY;
3578 case ASHIFTRT:
3579 if (op == const1_rtx || op == const2_rtx)
3580 return H8SX_SHIFT_UNARY;
3581 return H8SX_SHIFT_NONE;
3583 case ROTATE:
3584 if (GET_CODE (op) == CONST_INT
3585 && (INTVAL (op) == 1
3586 || INTVAL (op) == 2
3587 || INTVAL (op) == GET_MODE_BITSIZE (mode) - 2
3588 || INTVAL (op) == GET_MODE_BITSIZE (mode) - 1))
3589 return H8SX_SHIFT_UNARY;
3590 return H8SX_SHIFT_NONE;
3592 default:
3593 return H8SX_SHIFT_NONE;
3597 /* Return the asm template for a single h8sx shift instruction.
3598 OPERANDS[0] and OPERANDS[1] are the destination, OPERANDS[2]
3599 is the source and OPERANDS[3] is the shift. SUFFIX is the
3600 size suffix ('b', 'w' or 'l') and OPTYPE is the print_operand
3601 prefix for the destination operand. */
3603 const char *
3604 output_h8sx_shift (rtx *operands, int suffix, int optype)
3606 static char buffer[16];
3607 const char *stem;
3609 switch (GET_CODE (operands[3]))
3611 case ASHIFT:
3612 stem = "shll";
3613 break;
3615 case ASHIFTRT:
3616 stem = "shar";
3617 break;
3619 case LSHIFTRT:
3620 stem = "shlr";
3621 break;
3623 case ROTATE:
3624 stem = "rotl";
3625 if (INTVAL (operands[2]) > 2)
3627 /* This is really a right rotate. */
3628 operands[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands[0]))
3629 - INTVAL (operands[2]));
3630 stem = "rotr";
3632 break;
3634 default:
3635 gcc_unreachable ();
3637 if (operands[2] == const1_rtx)
3638 sprintf (buffer, "%s.%c\t%%%c0", stem, suffix, optype);
3639 else
3640 sprintf (buffer, "%s.%c\t%%X2,%%%c0", stem, suffix, optype);
3641 return buffer;
3644 /* Emit code to do shifts. */
3646 bool
3647 expand_a_shift (enum machine_mode mode, int code, rtx operands[])
3649 switch (h8sx_classify_shift (mode, code, operands[2]))
3651 case H8SX_SHIFT_BINARY:
3652 operands[1] = force_reg (mode, operands[1]);
3653 return false;
3655 case H8SX_SHIFT_UNARY:
3656 return false;
3658 case H8SX_SHIFT_NONE:
3659 break;
3662 emit_move_insn (operands[0], operands[1]);
3664 /* Need a loop to get all the bits we want - we generate the
3665 code at emit time, but need to allocate a scratch reg now. */
3667 emit_insn (gen_rtx_PARALLEL
3668 (VOIDmode,
3669 gen_rtvec (2,
3670 gen_rtx_SET (VOIDmode, operands[0],
3671 gen_rtx_fmt_ee (code, mode,
3672 operands[0], operands[2])),
3673 gen_rtx_CLOBBER (VOIDmode,
3674 gen_rtx_SCRATCH (QImode)))));
3675 return true;
3678 /* Symbols of the various modes which can be used as indices. */
3680 enum shift_mode
3682 QIshift, HIshift, SIshift
3685 /* For single bit shift insns, record assembler and what bits of the
3686 condition code are valid afterwards (represented as various CC_FOO
3687 bits, 0 means CC isn't left in a usable state). */
3689 struct shift_insn
3691 const char *const assembler;
3692 const int cc_valid;
3695 /* Assembler instruction shift table.
3697 These tables are used to look up the basic shifts.
3698 They are indexed by cpu, shift_type, and mode. */
3700 static const struct shift_insn shift_one[2][3][3] =
3702 /* H8/300 */
3704 /* SHIFT_ASHIFT */
3706 { "shll\t%X0", CC_SET_ZNV },
3707 { "add.w\t%T0,%T0", CC_SET_ZN },
3708 { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", CC_CLOBBER }
3710 /* SHIFT_LSHIFTRT */
3712 { "shlr\t%X0", CC_SET_ZNV },
3713 { "shlr\t%t0\n\trotxr\t%s0", CC_CLOBBER },
3714 { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER }
3716 /* SHIFT_ASHIFTRT */
3718 { "shar\t%X0", CC_SET_ZNV },
3719 { "shar\t%t0\n\trotxr\t%s0", CC_CLOBBER },
3720 { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER }
3723 /* H8/300H */
3725 /* SHIFT_ASHIFT */
3727 { "shll.b\t%X0", CC_SET_ZNV },
3728 { "shll.w\t%T0", CC_SET_ZNV },
3729 { "shll.l\t%S0", CC_SET_ZNV }
3731 /* SHIFT_LSHIFTRT */
3733 { "shlr.b\t%X0", CC_SET_ZNV },
3734 { "shlr.w\t%T0", CC_SET_ZNV },
3735 { "shlr.l\t%S0", CC_SET_ZNV }
3737 /* SHIFT_ASHIFTRT */
3739 { "shar.b\t%X0", CC_SET_ZNV },
3740 { "shar.w\t%T0", CC_SET_ZNV },
3741 { "shar.l\t%S0", CC_SET_ZNV }
3746 static const struct shift_insn shift_two[3][3] =
3748 /* SHIFT_ASHIFT */
3750 { "shll.b\t#2,%X0", CC_SET_ZNV },
3751 { "shll.w\t#2,%T0", CC_SET_ZNV },
3752 { "shll.l\t#2,%S0", CC_SET_ZNV }
3754 /* SHIFT_LSHIFTRT */
3756 { "shlr.b\t#2,%X0", CC_SET_ZNV },
3757 { "shlr.w\t#2,%T0", CC_SET_ZNV },
3758 { "shlr.l\t#2,%S0", CC_SET_ZNV }
3760 /* SHIFT_ASHIFTRT */
3762 { "shar.b\t#2,%X0", CC_SET_ZNV },
3763 { "shar.w\t#2,%T0", CC_SET_ZNV },
3764 { "shar.l\t#2,%S0", CC_SET_ZNV }
3768 /* Rotates are organized by which shift they'll be used in implementing.
3769 There's no need to record whether the cc is valid afterwards because
3770 it is the AND insn that will decide this. */
3772 static const char *const rotate_one[2][3][3] =
3774 /* H8/300 */
3776 /* SHIFT_ASHIFT */
3778 "rotr\t%X0",
3779 "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
3782 /* SHIFT_LSHIFTRT */
3784 "rotl\t%X0",
3785 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3788 /* SHIFT_ASHIFTRT */
3790 "rotl\t%X0",
3791 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3795 /* H8/300H */
3797 /* SHIFT_ASHIFT */
3799 "rotr.b\t%X0",
3800 "rotr.w\t%T0",
3801 "rotr.l\t%S0"
3803 /* SHIFT_LSHIFTRT */
3805 "rotl.b\t%X0",
3806 "rotl.w\t%T0",
3807 "rotl.l\t%S0"
3809 /* SHIFT_ASHIFTRT */
3811 "rotl.b\t%X0",
3812 "rotl.w\t%T0",
3813 "rotl.l\t%S0"
3818 static const char *const rotate_two[3][3] =
3820 /* SHIFT_ASHIFT */
3822 "rotr.b\t#2,%X0",
3823 "rotr.w\t#2,%T0",
3824 "rotr.l\t#2,%S0"
3826 /* SHIFT_LSHIFTRT */
3828 "rotl.b\t#2,%X0",
3829 "rotl.w\t#2,%T0",
3830 "rotl.l\t#2,%S0"
3832 /* SHIFT_ASHIFTRT */
3834 "rotl.b\t#2,%X0",
3835 "rotl.w\t#2,%T0",
3836 "rotl.l\t#2,%S0"
3840 struct shift_info {
3841 /* Shift algorithm. */
3842 enum shift_alg alg;
3844 /* The number of bits to be shifted by shift1 and shift2. Valid
3845 when ALG is SHIFT_SPECIAL. */
3846 unsigned int remainder;
3848 /* Special insn for a shift. Valid when ALG is SHIFT_SPECIAL. */
3849 const char *special;
3851 /* Insn for a one-bit shift. Valid when ALG is either SHIFT_INLINE
3852 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3853 const char *shift1;
3855 /* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
3856 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3857 const char *shift2;
3859 /* CC status for SHIFT_INLINE. */
3860 int cc_inline;
3862 /* CC status for SHIFT_SPECIAL. */
3863 int cc_special;
3866 static void get_shift_alg (enum shift_type,
3867 enum shift_mode, unsigned int,
3868 struct shift_info *);
3870 /* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
3871 best algorithm for doing the shift. The assembler code is stored
3872 in the pointers in INFO. We achieve the maximum efficiency in most
3873 cases when !TARGET_H8300. In case of TARGET_H8300, shifts in
3874 SImode in particular have a lot of room to optimize.
3876 We first determine the strategy of the shift algorithm by a table
3877 lookup. If that tells us to use a hand crafted assembly code, we
3878 go into the big switch statement to find what that is. Otherwise,
3879 we resort to a generic way, such as inlining. In either case, the
3880 result is returned through INFO. */
3882 static void
3883 get_shift_alg (enum shift_type shift_type, enum shift_mode shift_mode,
3884 unsigned int count, struct shift_info *info)
3886 enum h8_cpu cpu;
3888 /* Find the target CPU. */
3889 if (TARGET_H8300)
3890 cpu = H8_300;
3891 else if (TARGET_H8300H)
3892 cpu = H8_300H;
3893 else
3894 cpu = H8_S;
3896 /* Find the shift algorithm. */
3897 info->alg = SHIFT_LOOP;
3898 switch (shift_mode)
3900 case QIshift:
3901 if (count < GET_MODE_BITSIZE (QImode))
3902 info->alg = shift_alg_qi[cpu][shift_type][count];
3903 break;
3905 case HIshift:
3906 if (count < GET_MODE_BITSIZE (HImode))
3907 info->alg = shift_alg_hi[cpu][shift_type][count];
3908 break;
3910 case SIshift:
3911 if (count < GET_MODE_BITSIZE (SImode))
3912 info->alg = shift_alg_si[cpu][shift_type][count];
3913 break;
3915 default:
3916 gcc_unreachable ();
3919 /* Fill in INFO. Return unless we have SHIFT_SPECIAL. */
3920 switch (info->alg)
3922 case SHIFT_INLINE:
3923 info->remainder = count;
3924 /* Fall through. */
3926 case SHIFT_LOOP:
3927 /* It is up to the caller to know that looping clobbers cc. */
3928 info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
3929 info->shift2 = shift_two[shift_type][shift_mode].assembler;
3930 info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
3931 goto end;
3933 case SHIFT_ROT_AND:
3934 info->shift1 = rotate_one[cpu_type][shift_type][shift_mode];
3935 info->shift2 = rotate_two[shift_type][shift_mode];
3936 info->cc_inline = CC_CLOBBER;
3937 goto end;
3939 case SHIFT_SPECIAL:
3940 /* REMAINDER is 0 for most cases, so initialize it to 0. */
3941 info->remainder = 0;
3942 info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
3943 info->shift2 = shift_two[shift_type][shift_mode].assembler;
3944 info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
3945 info->cc_special = CC_CLOBBER;
3946 break;
3949 /* Here we only deal with SHIFT_SPECIAL. */
3950 switch (shift_mode)
3952 case QIshift:
3953 /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
3954 through the entire value. */
3955 gcc_assert (shift_type == SHIFT_ASHIFTRT && count == 7);
3956 info->special = "shll\t%X0\n\tsubx\t%X0,%X0";
3957 goto end;
3959 case HIshift:
3960 if (count == 7)
3962 switch (shift_type)
3964 case SHIFT_ASHIFT:
3965 if (TARGET_H8300)
3966 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";
3967 else
3968 info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
3969 goto end;
3970 case SHIFT_LSHIFTRT:
3971 if (TARGET_H8300)
3972 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";
3973 else
3974 info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
3975 goto end;
3976 case SHIFT_ASHIFTRT:
3977 info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
3978 goto end;
3981 else if ((8 <= count && count <= 13)
3982 || (TARGET_H8300S && count == 14))
3984 info->remainder = count - 8;
3986 switch (shift_type)
3988 case SHIFT_ASHIFT:
3989 info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
3990 goto end;
3991 case SHIFT_LSHIFTRT:
3992 if (TARGET_H8300)
3994 info->special = "mov.b\t%t0,%s0\n\tsub.b\t%t0,%t0";
3995 info->shift1 = "shlr.b\t%s0";
3996 info->cc_inline = CC_SET_ZNV;
3998 else
4000 info->special = "mov.b\t%t0,%s0\n\textu.w\t%T0";
4001 info->cc_special = CC_SET_ZNV;
4003 goto end;
4004 case SHIFT_ASHIFTRT:
4005 if (TARGET_H8300)
4007 info->special = "mov.b\t%t0,%s0\n\tbld\t#7,%s0\n\tsubx\t%t0,%t0";
4008 info->shift1 = "shar.b\t%s0";
4010 else
4012 info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0";
4013 info->cc_special = CC_SET_ZNV;
4015 goto end;
4018 else if (count == 14)
4020 switch (shift_type)
4022 case SHIFT_ASHIFT:
4023 if (TARGET_H8300)
4024 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";
4025 goto end;
4026 case SHIFT_LSHIFTRT:
4027 if (TARGET_H8300)
4028 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";
4029 goto end;
4030 case SHIFT_ASHIFTRT:
4031 if (TARGET_H8300)
4032 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";
4033 else if (TARGET_H8300H)
4035 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";
4036 info->cc_special = CC_SET_ZNV;
4038 else /* TARGET_H8300S */
4039 gcc_unreachable ();
4040 goto end;
4043 else if (count == 15)
4045 switch (shift_type)
4047 case SHIFT_ASHIFT:
4048 info->special = "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
4049 goto end;
4050 case SHIFT_LSHIFTRT:
4051 info->special = "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
4052 goto end;
4053 case SHIFT_ASHIFTRT:
4054 info->special = "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
4055 goto end;
4058 gcc_unreachable ();
4060 case SIshift:
4061 if (TARGET_H8300 && 8 <= count && count <= 9)
4063 info->remainder = count - 8;
4065 switch (shift_type)
4067 case SHIFT_ASHIFT:
4068 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";
4069 goto end;
4070 case SHIFT_LSHIFTRT:
4071 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";
4072 info->shift1 = "shlr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0";
4073 goto end;
4074 case SHIFT_ASHIFTRT:
4075 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";
4076 goto end;
4079 else if (count == 8 && !TARGET_H8300)
4081 switch (shift_type)
4083 case SHIFT_ASHIFT:
4084 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";
4085 goto end;
4086 case SHIFT_LSHIFTRT:
4087 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";
4088 goto end;
4089 case SHIFT_ASHIFTRT:
4090 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";
4091 goto end;
4094 else if (count == 15 && TARGET_H8300)
4096 switch (shift_type)
4098 case SHIFT_ASHIFT:
4099 gcc_unreachable ();
4100 case SHIFT_LSHIFTRT:
4101 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";
4102 goto end;
4103 case SHIFT_ASHIFTRT:
4104 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";
4105 goto end;
4108 else if (count == 15 && !TARGET_H8300)
4110 switch (shift_type)
4112 case SHIFT_ASHIFT:
4113 info->special = "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
4114 info->cc_special = CC_SET_ZNV;
4115 goto end;
4116 case SHIFT_LSHIFTRT:
4117 info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
4118 info->cc_special = CC_SET_ZNV;
4119 goto end;
4120 case SHIFT_ASHIFTRT:
4121 gcc_unreachable ();
4124 else if ((TARGET_H8300 && 16 <= count && count <= 20)
4125 || (TARGET_H8300H && 16 <= count && count <= 19)
4126 || (TARGET_H8300S && 16 <= count && count <= 21))
4128 info->remainder = count - 16;
4130 switch (shift_type)
4132 case SHIFT_ASHIFT:
4133 info->special = "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
4134 if (TARGET_H8300)
4135 info->shift1 = "add.w\t%e0,%e0";
4136 goto end;
4137 case SHIFT_LSHIFTRT:
4138 if (TARGET_H8300)
4140 info->special = "mov.w\t%e0,%f0\n\tsub.w\t%e0,%e0";
4141 info->shift1 = "shlr\t%x0\n\trotxr\t%w0";
4143 else
4145 info->special = "mov.w\t%e0,%f0\n\textu.l\t%S0";
4146 info->cc_special = CC_SET_ZNV;
4148 goto end;
4149 case SHIFT_ASHIFTRT:
4150 if (TARGET_H8300)
4152 info->special = "mov.w\t%e0,%f0\n\tshll\t%z0\n\tsubx\t%z0,%z0\n\tmov.b\t%z0,%y0";
4153 info->shift1 = "shar\t%x0\n\trotxr\t%w0";
4155 else
4157 info->special = "mov.w\t%e0,%f0\n\texts.l\t%S0";
4158 info->cc_special = CC_SET_ZNV;
4160 goto end;
4163 else if (TARGET_H8300 && 24 <= count && count <= 28)
4165 info->remainder = count - 24;
4167 switch (shift_type)
4169 case SHIFT_ASHIFT:
4170 info->special = "mov.b\t%w0,%z0\n\tsub.b\t%y0,%y0\n\tsub.w\t%f0,%f0";
4171 info->shift1 = "shll.b\t%z0";
4172 info->cc_inline = CC_SET_ZNV;
4173 goto end;
4174 case SHIFT_LSHIFTRT:
4175 info->special = "mov.b\t%z0,%w0\n\tsub.b\t%x0,%x0\n\tsub.w\t%e0,%e0";
4176 info->shift1 = "shlr.b\t%w0";
4177 info->cc_inline = CC_SET_ZNV;
4178 goto end;
4179 case SHIFT_ASHIFTRT:
4180 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";
4181 info->shift1 = "shar.b\t%w0";
4182 info->cc_inline = CC_SET_ZNV;
4183 goto end;
4186 else if ((TARGET_H8300H && count == 24)
4187 || (TARGET_H8300S && 24 <= count && count <= 25))
4189 info->remainder = count - 24;
4191 switch (shift_type)
4193 case SHIFT_ASHIFT:
4194 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";
4195 goto end;
4196 case SHIFT_LSHIFTRT:
4197 info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
4198 info->cc_special = CC_SET_ZNV;
4199 goto end;
4200 case SHIFT_ASHIFTRT:
4201 info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
4202 info->cc_special = CC_SET_ZNV;
4203 goto end;
4206 else if (!TARGET_H8300 && count == 28)
4208 switch (shift_type)
4210 case SHIFT_ASHIFT:
4211 if (TARGET_H8300H)
4212 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";
4213 else
4214 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";
4215 goto end;
4216 case SHIFT_LSHIFTRT:
4217 if (TARGET_H8300H)
4219 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";
4220 info->cc_special = CC_SET_ZNV;
4222 else
4223 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4224 goto end;
4225 case SHIFT_ASHIFTRT:
4226 gcc_unreachable ();
4229 else if (!TARGET_H8300 && count == 29)
4231 switch (shift_type)
4233 case SHIFT_ASHIFT:
4234 if (TARGET_H8300H)
4235 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";
4236 else
4237 info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4238 goto end;
4239 case SHIFT_LSHIFTRT:
4240 if (TARGET_H8300H)
4242 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";
4243 info->cc_special = CC_SET_ZNV;
4245 else
4247 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4248 info->cc_special = CC_SET_ZNV;
4250 goto end;
4251 case SHIFT_ASHIFTRT:
4252 gcc_unreachable ();
4255 else if (!TARGET_H8300 && count == 30)
4257 switch (shift_type)
4259 case SHIFT_ASHIFT:
4260 if (TARGET_H8300H)
4261 info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4262 else
4263 info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
4264 goto end;
4265 case SHIFT_LSHIFTRT:
4266 if (TARGET_H8300H)
4267 info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4268 else
4269 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4270 goto end;
4271 case SHIFT_ASHIFTRT:
4272 gcc_unreachable ();
4275 else if (count == 31)
4277 if (TARGET_H8300)
4279 switch (shift_type)
4281 case SHIFT_ASHIFT:
4282 info->special = "sub.w\t%e0,%e0\n\tshlr\t%w0\n\tmov.w\t%e0,%f0\n\trotxr\t%z0";
4283 goto end;
4284 case SHIFT_LSHIFTRT:
4285 info->special = "sub.w\t%f0,%f0\n\tshll\t%z0\n\tmov.w\t%f0,%e0\n\trotxl\t%w0";
4286 goto end;
4287 case SHIFT_ASHIFTRT:
4288 info->special = "shll\t%z0\n\tsubx\t%w0,%w0\n\tmov.b\t%w0,%x0\n\tmov.w\t%f0,%e0";
4289 goto end;
4292 else
4294 switch (shift_type)
4296 case SHIFT_ASHIFT:
4297 info->special = "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
4298 info->cc_special = CC_SET_ZNV;
4299 goto end;
4300 case SHIFT_LSHIFTRT:
4301 info->special = "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
4302 info->cc_special = CC_SET_ZNV;
4303 goto end;
4304 case SHIFT_ASHIFTRT:
4305 info->special = "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
4306 info->cc_special = CC_SET_ZNV;
4307 goto end;
4311 gcc_unreachable ();
4313 default:
4314 gcc_unreachable ();
4317 end:
4318 if (!TARGET_H8300S)
4319 info->shift2 = NULL;
4322 /* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
4323 needed for some shift with COUNT and MODE. Return 0 otherwise. */
4326 h8300_shift_needs_scratch_p (int count, enum machine_mode mode)
4328 enum h8_cpu cpu;
4329 int a, lr, ar;
4331 if (GET_MODE_BITSIZE (mode) <= count)
4332 return 1;
4334 /* Find out the target CPU. */
4335 if (TARGET_H8300)
4336 cpu = H8_300;
4337 else if (TARGET_H8300H)
4338 cpu = H8_300H;
4339 else
4340 cpu = H8_S;
4342 /* Find the shift algorithm. */
4343 switch (mode)
4345 case QImode:
4346 a = shift_alg_qi[cpu][SHIFT_ASHIFT][count];
4347 lr = shift_alg_qi[cpu][SHIFT_LSHIFTRT][count];
4348 ar = shift_alg_qi[cpu][SHIFT_ASHIFTRT][count];
4349 break;
4351 case HImode:
4352 a = shift_alg_hi[cpu][SHIFT_ASHIFT][count];
4353 lr = shift_alg_hi[cpu][SHIFT_LSHIFTRT][count];
4354 ar = shift_alg_hi[cpu][SHIFT_ASHIFTRT][count];
4355 break;
4357 case SImode:
4358 a = shift_alg_si[cpu][SHIFT_ASHIFT][count];
4359 lr = shift_alg_si[cpu][SHIFT_LSHIFTRT][count];
4360 ar = shift_alg_si[cpu][SHIFT_ASHIFTRT][count];
4361 break;
4363 default:
4364 gcc_unreachable ();
4367 /* On H8/300H, count == 8 uses a scratch register. */
4368 return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
4369 || (TARGET_H8300H && mode == SImode && count == 8));
4372 /* Output the assembler code for doing shifts. */
4374 const char *
4375 output_a_shift (rtx *operands)
4377 static int loopend_lab;
4378 rtx shift = operands[3];
4379 enum machine_mode mode = GET_MODE (shift);
4380 enum rtx_code code = GET_CODE (shift);
4381 enum shift_type shift_type;
4382 enum shift_mode shift_mode;
4383 struct shift_info info;
4384 int n;
4386 loopend_lab++;
4388 switch (mode)
4390 case QImode:
4391 shift_mode = QIshift;
4392 break;
4393 case HImode:
4394 shift_mode = HIshift;
4395 break;
4396 case SImode:
4397 shift_mode = SIshift;
4398 break;
4399 default:
4400 gcc_unreachable ();
4403 switch (code)
4405 case ASHIFTRT:
4406 shift_type = SHIFT_ASHIFTRT;
4407 break;
4408 case LSHIFTRT:
4409 shift_type = SHIFT_LSHIFTRT;
4410 break;
4411 case ASHIFT:
4412 shift_type = SHIFT_ASHIFT;
4413 break;
4414 default:
4415 gcc_unreachable ();
4418 /* This case must be taken care of by one of the two splitters
4419 that convert a variable shift into a loop. */
4420 gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4422 n = INTVAL (operands[2]);
4424 /* If the count is negative, make it 0. */
4425 if (n < 0)
4426 n = 0;
4427 /* If the count is too big, truncate it.
4428 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4429 do the intuitive thing. */
4430 else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4431 n = GET_MODE_BITSIZE (mode);
4433 get_shift_alg (shift_type, shift_mode, n, &info);
4435 switch (info.alg)
4437 case SHIFT_SPECIAL:
4438 output_asm_insn (info.special, operands);
4439 /* Fall through. */
4441 case SHIFT_INLINE:
4442 n = info.remainder;
4444 /* Emit two bit shifts first. */
4445 if (info.shift2 != NULL)
4447 for (; n > 1; n -= 2)
4448 output_asm_insn (info.shift2, operands);
4451 /* Now emit one bit shifts for any residual. */
4452 for (; n > 0; n--)
4453 output_asm_insn (info.shift1, operands);
4454 return "";
4456 case SHIFT_ROT_AND:
4458 int m = GET_MODE_BITSIZE (mode) - n;
4459 const int mask = (shift_type == SHIFT_ASHIFT
4460 ? ((1 << m) - 1) << n
4461 : (1 << m) - 1);
4462 char insn_buf[200];
4464 /* Not all possibilities of rotate are supported. They shouldn't
4465 be generated, but let's watch for 'em. */
4466 gcc_assert (info.shift1);
4468 /* Emit two bit rotates first. */
4469 if (info.shift2 != NULL)
4471 for (; m > 1; m -= 2)
4472 output_asm_insn (info.shift2, operands);
4475 /* Now single bit rotates for any residual. */
4476 for (; m > 0; m--)
4477 output_asm_insn (info.shift1, operands);
4479 /* Now mask off the high bits. */
4480 switch (mode)
4482 case QImode:
4483 sprintf (insn_buf, "and\t#%d,%%X0", mask);
4484 break;
4486 case HImode:
4487 gcc_assert (TARGET_H8300H || TARGET_H8300S);
4488 sprintf (insn_buf, "and.w\t#%d,%%T0", mask);
4489 break;
4491 default:
4492 gcc_unreachable ();
4495 output_asm_insn (insn_buf, operands);
4496 return "";
4499 case SHIFT_LOOP:
4500 /* A loop to shift by a "large" constant value.
4501 If we have shift-by-2 insns, use them. */
4502 if (info.shift2 != NULL)
4504 fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n / 2,
4505 names_big[REGNO (operands[4])]);
4506 fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4507 output_asm_insn (info.shift2, operands);
4508 output_asm_insn ("add #0xff,%X4", operands);
4509 fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4510 if (n % 2)
4511 output_asm_insn (info.shift1, operands);
4513 else
4515 fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n,
4516 names_big[REGNO (operands[4])]);
4517 fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4518 output_asm_insn (info.shift1, operands);
4519 output_asm_insn ("add #0xff,%X4", operands);
4520 fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4522 return "";
4524 default:
4525 gcc_unreachable ();
4529 /* Count the number of assembly instructions in a string TEMPLATE. */
4531 static unsigned int
4532 h8300_asm_insn_count (const char *template)
4534 unsigned int count = 1;
4536 for (; *template; template++)
4537 if (*template == '\n')
4538 count++;
4540 return count;
4543 /* Compute the length of a shift insn. */
4545 unsigned int
4546 compute_a_shift_length (rtx insn ATTRIBUTE_UNUSED, rtx *operands)
4548 rtx shift = operands[3];
4549 enum machine_mode mode = GET_MODE (shift);
4550 enum rtx_code code = GET_CODE (shift);
4551 enum shift_type shift_type;
4552 enum shift_mode shift_mode;
4553 struct shift_info info;
4554 unsigned int wlength = 0;
4556 switch (mode)
4558 case QImode:
4559 shift_mode = QIshift;
4560 break;
4561 case HImode:
4562 shift_mode = HIshift;
4563 break;
4564 case SImode:
4565 shift_mode = SIshift;
4566 break;
4567 default:
4568 gcc_unreachable ();
4571 switch (code)
4573 case ASHIFTRT:
4574 shift_type = SHIFT_ASHIFTRT;
4575 break;
4576 case LSHIFTRT:
4577 shift_type = SHIFT_LSHIFTRT;
4578 break;
4579 case ASHIFT:
4580 shift_type = SHIFT_ASHIFT;
4581 break;
4582 default:
4583 gcc_unreachable ();
4586 if (GET_CODE (operands[2]) != CONST_INT)
4588 /* Get the assembler code to do one shift. */
4589 get_shift_alg (shift_type, shift_mode, 1, &info);
4591 return (4 + h8300_asm_insn_count (info.shift1)) * 2;
4593 else
4595 int n = INTVAL (operands[2]);
4597 /* If the count is negative, make it 0. */
4598 if (n < 0)
4599 n = 0;
4600 /* If the count is too big, truncate it.
4601 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4602 do the intuitive thing. */
4603 else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4604 n = GET_MODE_BITSIZE (mode);
4606 get_shift_alg (shift_type, shift_mode, n, &info);
4608 switch (info.alg)
4610 case SHIFT_SPECIAL:
4611 wlength += h8300_asm_insn_count (info.special);
4613 /* Every assembly instruction used in SHIFT_SPECIAL case
4614 takes 2 bytes except xor.l, which takes 4 bytes, so if we
4615 see xor.l, we just pretend that xor.l counts as two insns
4616 so that the insn length will be computed correctly. */
4617 if (strstr (info.special, "xor.l") != NULL)
4618 wlength++;
4620 /* Fall through. */
4622 case SHIFT_INLINE:
4623 n = info.remainder;
4625 if (info.shift2 != NULL)
4627 wlength += h8300_asm_insn_count (info.shift2) * (n / 2);
4628 n = n % 2;
4631 wlength += h8300_asm_insn_count (info.shift1) * n;
4633 return 2 * wlength;
4635 case SHIFT_ROT_AND:
4637 int m = GET_MODE_BITSIZE (mode) - n;
4639 /* Not all possibilities of rotate are supported. They shouldn't
4640 be generated, but let's watch for 'em. */
4641 gcc_assert (info.shift1);
4643 if (info.shift2 != NULL)
4645 wlength += h8300_asm_insn_count (info.shift2) * (m / 2);
4646 m = m % 2;
4649 wlength += h8300_asm_insn_count (info.shift1) * m;
4651 /* Now mask off the high bits. */
4652 switch (mode)
4654 case QImode:
4655 wlength += 1;
4656 break;
4657 case HImode:
4658 wlength += 2;
4659 break;
4660 case SImode:
4661 gcc_assert (!TARGET_H8300);
4662 wlength += 3;
4663 break;
4664 default:
4665 gcc_unreachable ();
4667 return 2 * wlength;
4670 case SHIFT_LOOP:
4671 /* A loop to shift by a "large" constant value.
4672 If we have shift-by-2 insns, use them. */
4673 if (info.shift2 != NULL)
4675 wlength += 3 + h8300_asm_insn_count (info.shift2);
4676 if (n % 2)
4677 wlength += h8300_asm_insn_count (info.shift1);
4679 else
4681 wlength += 3 + h8300_asm_insn_count (info.shift1);
4683 return 2 * wlength;
4685 default:
4686 gcc_unreachable ();
4691 /* Compute which flag bits are valid after a shift insn. */
4694 compute_a_shift_cc (rtx insn ATTRIBUTE_UNUSED, rtx *operands)
4696 rtx shift = operands[3];
4697 enum machine_mode mode = GET_MODE (shift);
4698 enum rtx_code code = GET_CODE (shift);
4699 enum shift_type shift_type;
4700 enum shift_mode shift_mode;
4701 struct shift_info info;
4702 int n;
4704 switch (mode)
4706 case QImode:
4707 shift_mode = QIshift;
4708 break;
4709 case HImode:
4710 shift_mode = HIshift;
4711 break;
4712 case SImode:
4713 shift_mode = SIshift;
4714 break;
4715 default:
4716 gcc_unreachable ();
4719 switch (code)
4721 case ASHIFTRT:
4722 shift_type = SHIFT_ASHIFTRT;
4723 break;
4724 case LSHIFTRT:
4725 shift_type = SHIFT_LSHIFTRT;
4726 break;
4727 case ASHIFT:
4728 shift_type = SHIFT_ASHIFT;
4729 break;
4730 default:
4731 gcc_unreachable ();
4734 /* This case must be taken care of by one of the two splitters
4735 that convert a variable shift into a loop. */
4736 gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4738 n = INTVAL (operands[2]);
4740 /* If the count is negative, make it 0. */
4741 if (n < 0)
4742 n = 0;
4743 /* If the count is too big, truncate it.
4744 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4745 do the intuitive thing. */
4746 else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4747 n = GET_MODE_BITSIZE (mode);
4749 get_shift_alg (shift_type, shift_mode, n, &info);
4751 switch (info.alg)
4753 case SHIFT_SPECIAL:
4754 if (info.remainder == 0)
4755 return info.cc_special;
4757 /* Fall through. */
4759 case SHIFT_INLINE:
4760 return info.cc_inline;
4762 case SHIFT_ROT_AND:
4763 /* This case always ends with an and instruction. */
4764 return CC_SET_ZNV;
4766 case SHIFT_LOOP:
4767 /* A loop to shift by a "large" constant value.
4768 If we have shift-by-2 insns, use them. */
4769 if (info.shift2 != NULL)
4771 if (n % 2)
4772 return info.cc_inline;
4774 return CC_CLOBBER;
4776 default:
4777 gcc_unreachable ();
4781 /* A rotation by a non-constant will cause a loop to be generated, in
4782 which a rotation by one bit is used. A rotation by a constant,
4783 including the one in the loop, will be taken care of by
4784 output_a_rotate () at the insn emit time. */
4787 expand_a_rotate (rtx operands[])
4789 rtx dst = operands[0];
4790 rtx src = operands[1];
4791 rtx rotate_amount = operands[2];
4792 enum machine_mode mode = GET_MODE (dst);
4794 if (h8sx_classify_shift (mode, ROTATE, rotate_amount) == H8SX_SHIFT_UNARY)
4795 return false;
4797 /* We rotate in place. */
4798 emit_move_insn (dst, src);
4800 if (GET_CODE (rotate_amount) != CONST_INT)
4802 rtx counter = gen_reg_rtx (QImode);
4803 rtx start_label = gen_label_rtx ();
4804 rtx end_label = gen_label_rtx ();
4806 /* If the rotate amount is less than or equal to 0,
4807 we go out of the loop. */
4808 emit_cmp_and_jump_insns (rotate_amount, const0_rtx, LE, NULL_RTX,
4809 QImode, 0, end_label);
4811 /* Initialize the loop counter. */
4812 emit_move_insn (counter, rotate_amount);
4814 emit_label (start_label);
4816 /* Rotate by one bit. */
4817 switch (mode)
4819 case QImode:
4820 emit_insn (gen_rotlqi3_1 (dst, dst, const1_rtx));
4821 break;
4822 case HImode:
4823 emit_insn (gen_rotlhi3_1 (dst, dst, const1_rtx));
4824 break;
4825 case SImode:
4826 emit_insn (gen_rotlsi3_1 (dst, dst, const1_rtx));
4827 break;
4828 default:
4829 gcc_unreachable ();
4832 /* Decrement the counter by 1. */
4833 emit_insn (gen_addqi3 (counter, counter, constm1_rtx));
4835 /* If the loop counter is nonzero, we go back to the beginning
4836 of the loop. */
4837 emit_cmp_and_jump_insns (counter, const0_rtx, NE, NULL_RTX, QImode, 1,
4838 start_label);
4840 emit_label (end_label);
4842 else
4844 /* Rotate by AMOUNT bits. */
4845 switch (mode)
4847 case QImode:
4848 emit_insn (gen_rotlqi3_1 (dst, dst, rotate_amount));
4849 break;
4850 case HImode:
4851 emit_insn (gen_rotlhi3_1 (dst, dst, rotate_amount));
4852 break;
4853 case SImode:
4854 emit_insn (gen_rotlsi3_1 (dst, dst, rotate_amount));
4855 break;
4856 default:
4857 gcc_unreachable ();
4861 return 1;
4864 /* Output a rotate insn. */
4866 const char *
4867 output_a_rotate (enum rtx_code code, rtx *operands)
4869 rtx dst = operands[0];
4870 rtx rotate_amount = operands[2];
4871 enum shift_mode rotate_mode;
4872 enum shift_type rotate_type;
4873 const char *insn_buf;
4874 int bits;
4875 int amount;
4876 enum machine_mode mode = GET_MODE (dst);
4878 gcc_assert (GET_CODE (rotate_amount) == CONST_INT);
4880 switch (mode)
4882 case QImode:
4883 rotate_mode = QIshift;
4884 break;
4885 case HImode:
4886 rotate_mode = HIshift;
4887 break;
4888 case SImode:
4889 rotate_mode = SIshift;
4890 break;
4891 default:
4892 gcc_unreachable ();
4895 switch (code)
4897 case ROTATERT:
4898 rotate_type = SHIFT_ASHIFT;
4899 break;
4900 case ROTATE:
4901 rotate_type = SHIFT_LSHIFTRT;
4902 break;
4903 default:
4904 gcc_unreachable ();
4907 amount = INTVAL (rotate_amount);
4909 /* Clean up AMOUNT. */
4910 if (amount < 0)
4911 amount = 0;
4912 if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4913 amount = GET_MODE_BITSIZE (mode);
4915 /* Determine the faster direction. After this phase, amount will be
4916 at most a half of GET_MODE_BITSIZE (mode). */
4917 if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
4919 /* Flip the direction. */
4920 amount = GET_MODE_BITSIZE (mode) - amount;
4921 rotate_type =
4922 (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
4925 /* See if a byte swap (in HImode) or a word swap (in SImode) can
4926 boost up the rotation. */
4927 if ((mode == HImode && TARGET_H8300 && amount >= 5)
4928 || (mode == HImode && TARGET_H8300H && amount >= 6)
4929 || (mode == HImode && TARGET_H8300S && amount == 8)
4930 || (mode == SImode && TARGET_H8300H && amount >= 10)
4931 || (mode == SImode && TARGET_H8300S && amount >= 13))
4933 switch (mode)
4935 case HImode:
4936 /* This code works on any family. */
4937 insn_buf = "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
4938 output_asm_insn (insn_buf, operands);
4939 break;
4941 case SImode:
4942 /* This code works on the H8/300H and H8S. */
4943 insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
4944 output_asm_insn (insn_buf, operands);
4945 break;
4947 default:
4948 gcc_unreachable ();
4951 /* Adjust AMOUNT and flip the direction. */
4952 amount = GET_MODE_BITSIZE (mode) / 2 - amount;
4953 rotate_type =
4954 (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
4957 /* Output rotate insns. */
4958 for (bits = TARGET_H8300S ? 2 : 1; bits > 0; bits /= 2)
4960 if (bits == 2)
4961 insn_buf = rotate_two[rotate_type][rotate_mode];
4962 else
4963 insn_buf = rotate_one[cpu_type][rotate_type][rotate_mode];
4965 for (; amount >= bits; amount -= bits)
4966 output_asm_insn (insn_buf, operands);
4969 return "";
4972 /* Compute the length of a rotate insn. */
4974 unsigned int
4975 compute_a_rotate_length (rtx *operands)
4977 rtx src = operands[1];
4978 rtx amount_rtx = operands[2];
4979 enum machine_mode mode = GET_MODE (src);
4980 int amount;
4981 unsigned int length = 0;
4983 gcc_assert (GET_CODE (amount_rtx) == CONST_INT);
4985 amount = INTVAL (amount_rtx);
4987 /* Clean up AMOUNT. */
4988 if (amount < 0)
4989 amount = 0;
4990 if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4991 amount = GET_MODE_BITSIZE (mode);
4993 /* Determine the faster direction. After this phase, amount
4994 will be at most a half of GET_MODE_BITSIZE (mode). */
4995 if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
4996 /* Flip the direction. */
4997 amount = GET_MODE_BITSIZE (mode) - amount;
4999 /* See if a byte swap (in HImode) or a word swap (in SImode) can
5000 boost up the rotation. */
5001 if ((mode == HImode && TARGET_H8300 && amount >= 5)
5002 || (mode == HImode && TARGET_H8300H && amount >= 6)
5003 || (mode == HImode && TARGET_H8300S && amount == 8)
5004 || (mode == SImode && TARGET_H8300H && amount >= 10)
5005 || (mode == SImode && TARGET_H8300S && amount >= 13))
5007 /* Adjust AMOUNT and flip the direction. */
5008 amount = GET_MODE_BITSIZE (mode) / 2 - amount;
5009 length += 6;
5012 /* We use 2-bit rotations on the H8S. */
5013 if (TARGET_H8300S)
5014 amount = amount / 2 + amount % 2;
5016 /* The H8/300 uses three insns to rotate one bit, taking 6
5017 length. */
5018 length += amount * ((TARGET_H8300 && mode == HImode) ? 6 : 2);
5020 return length;
5023 /* Fix the operands of a gen_xxx so that it could become a bit
5024 operating insn. */
5027 fix_bit_operand (rtx *operands, enum rtx_code code)
5029 /* The bit_operand predicate accepts any memory during RTL generation, but
5030 only 'U' memory afterwards, so if this is a MEM operand, we must force
5031 it to be valid for 'U' by reloading the address. */
5033 if (code == AND
5034 ? single_zero_operand (operands[2], QImode)
5035 : single_one_operand (operands[2], QImode))
5037 /* OK to have a memory dest. */
5038 if (GET_CODE (operands[0]) == MEM
5039 && !OK_FOR_U (operands[0]))
5041 rtx mem = gen_rtx_MEM (GET_MODE (operands[0]),
5042 copy_to_mode_reg (Pmode,
5043 XEXP (operands[0], 0)));
5044 MEM_COPY_ATTRIBUTES (mem, operands[0]);
5045 operands[0] = mem;
5048 if (GET_CODE (operands[1]) == MEM
5049 && !OK_FOR_U (operands[1]))
5051 rtx mem = gen_rtx_MEM (GET_MODE (operands[1]),
5052 copy_to_mode_reg (Pmode,
5053 XEXP (operands[1], 0)));
5054 MEM_COPY_ATTRIBUTES (mem, operands[0]);
5055 operands[1] = mem;
5057 return 0;
5060 /* Dest and src op must be register. */
5062 operands[1] = force_reg (QImode, operands[1]);
5064 rtx res = gen_reg_rtx (QImode);
5065 switch (code)
5067 case AND:
5068 emit_insn (gen_andqi3_1 (res, operands[1], operands[2]));
5069 break;
5070 case IOR:
5071 emit_insn (gen_iorqi3_1 (res, operands[1], operands[2]));
5072 break;
5073 case XOR:
5074 emit_insn (gen_xorqi3_1 (res, operands[1], operands[2]));
5075 break;
5076 default:
5077 gcc_unreachable ();
5079 emit_insn (gen_movqi (operands[0], res));
5081 return 1;
5084 /* Return nonzero if FUNC is an interrupt function as specified
5085 by the "interrupt" attribute. */
5087 static int
5088 h8300_interrupt_function_p (tree func)
5090 tree a;
5092 if (TREE_CODE (func) != FUNCTION_DECL)
5093 return 0;
5095 a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
5096 return a != NULL_TREE;
5099 /* Return nonzero if FUNC is a saveall function as specified by the
5100 "saveall" attribute. */
5102 static int
5103 h8300_saveall_function_p (tree func)
5105 tree a;
5107 if (TREE_CODE (func) != FUNCTION_DECL)
5108 return 0;
5110 a = lookup_attribute ("saveall", DECL_ATTRIBUTES (func));
5111 return a != NULL_TREE;
5114 /* Return nonzero if FUNC is an OS_Task function as specified
5115 by the "OS_Task" attribute. */
5117 static int
5118 h8300_os_task_function_p (tree func)
5120 tree a;
5122 if (TREE_CODE (func) != FUNCTION_DECL)
5123 return 0;
5125 a = lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func));
5126 return a != NULL_TREE;
5129 /* Return nonzero if FUNC is a monitor function as specified
5130 by the "monitor" attribute. */
5132 static int
5133 h8300_monitor_function_p (tree func)
5135 tree a;
5137 if (TREE_CODE (func) != FUNCTION_DECL)
5138 return 0;
5140 a = lookup_attribute ("monitor", DECL_ATTRIBUTES (func));
5141 return a != NULL_TREE;
5144 /* Return nonzero if FUNC is a function that should be called
5145 through the function vector. */
5148 h8300_funcvec_function_p (tree func)
5150 tree a;
5152 if (TREE_CODE (func) != FUNCTION_DECL)
5153 return 0;
5155 a = lookup_attribute ("function_vector", DECL_ATTRIBUTES (func));
5156 return a != NULL_TREE;
5159 /* Return nonzero if DECL is a variable that's in the eight bit
5160 data area. */
5163 h8300_eightbit_data_p (tree decl)
5165 tree a;
5167 if (TREE_CODE (decl) != VAR_DECL)
5168 return 0;
5170 a = lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl));
5171 return a != NULL_TREE;
5174 /* Return nonzero if DECL is a variable that's in the tiny
5175 data area. */
5178 h8300_tiny_data_p (tree decl)
5180 tree a;
5182 if (TREE_CODE (decl) != VAR_DECL)
5183 return 0;
5185 a = lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl));
5186 return a != NULL_TREE;
5189 /* Generate an 'interrupt_handler' attribute for decls. We convert
5190 all the pragmas to corresponding attributes. */
5192 static void
5193 h8300_insert_attributes (tree node, tree *attributes)
5195 if (TREE_CODE (node) == FUNCTION_DECL)
5197 if (pragma_interrupt)
5199 pragma_interrupt = 0;
5201 /* Add an 'interrupt_handler' attribute. */
5202 *attributes = tree_cons (get_identifier ("interrupt_handler"),
5203 NULL, *attributes);
5206 if (pragma_saveall)
5208 pragma_saveall = 0;
5210 /* Add an 'saveall' attribute. */
5211 *attributes = tree_cons (get_identifier ("saveall"),
5212 NULL, *attributes);
5217 /* Supported attributes:
5219 interrupt_handler: output a prologue and epilogue suitable for an
5220 interrupt handler.
5222 saveall: output a prologue and epilogue that saves and restores
5223 all registers except the stack pointer.
5225 function_vector: This function should be called through the
5226 function vector.
5228 eightbit_data: This variable lives in the 8-bit data area and can
5229 be referenced with 8-bit absolute memory addresses.
5231 tiny_data: This variable lives in the tiny data area and can be
5232 referenced with 16-bit absolute memory references. */
5234 const struct attribute_spec h8300_attribute_table[] =
5236 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
5237 { "interrupt_handler", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
5238 { "saveall", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
5239 { "OS_Task", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
5240 { "monitor", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
5241 { "function_vector", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
5242 { "eightbit_data", 0, 0, true, false, false, h8300_handle_eightbit_data_attribute },
5243 { "tiny_data", 0, 0, true, false, false, h8300_handle_tiny_data_attribute },
5244 { NULL, 0, 0, false, false, false, NULL }
5248 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
5249 struct attribute_spec.handler. */
5250 static tree
5251 h8300_handle_fndecl_attribute (tree *node, tree name,
5252 tree args ATTRIBUTE_UNUSED,
5253 int flags ATTRIBUTE_UNUSED,
5254 bool *no_add_attrs)
5256 if (TREE_CODE (*node) != FUNCTION_DECL)
5258 warning (OPT_Wattributes, "%qs attribute only applies to functions",
5259 IDENTIFIER_POINTER (name));
5260 *no_add_attrs = true;
5263 return NULL_TREE;
5266 /* Handle an "eightbit_data" attribute; arguments as in
5267 struct attribute_spec.handler. */
5268 static tree
5269 h8300_handle_eightbit_data_attribute (tree *node, tree name,
5270 tree args ATTRIBUTE_UNUSED,
5271 int flags ATTRIBUTE_UNUSED,
5272 bool *no_add_attrs)
5274 tree decl = *node;
5276 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
5278 DECL_SECTION_NAME (decl) = build_string (7, ".eight");
5280 else
5282 warning (OPT_Wattributes, "%qs attribute ignored",
5283 IDENTIFIER_POINTER (name));
5284 *no_add_attrs = true;
5287 return NULL_TREE;
5290 /* Handle an "tiny_data" attribute; arguments as in
5291 struct attribute_spec.handler. */
5292 static tree
5293 h8300_handle_tiny_data_attribute (tree *node, tree name,
5294 tree args ATTRIBUTE_UNUSED,
5295 int flags ATTRIBUTE_UNUSED,
5296 bool *no_add_attrs)
5298 tree decl = *node;
5300 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
5302 DECL_SECTION_NAME (decl) = build_string (6, ".tiny");
5304 else
5306 warning (OPT_Wattributes, "%qs attribute ignored",
5307 IDENTIFIER_POINTER (name));
5308 *no_add_attrs = true;
5311 return NULL_TREE;
5314 /* Mark function vectors, and various small data objects. */
5316 static void
5317 h8300_encode_section_info (tree decl, rtx rtl, int first)
5319 int extra_flags = 0;
5321 default_encode_section_info (decl, rtl, first);
5323 if (TREE_CODE (decl) == FUNCTION_DECL
5324 && h8300_funcvec_function_p (decl))
5325 extra_flags = SYMBOL_FLAG_FUNCVEC_FUNCTION;
5326 else if (TREE_CODE (decl) == VAR_DECL
5327 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
5329 if (h8300_eightbit_data_p (decl))
5330 extra_flags = SYMBOL_FLAG_EIGHTBIT_DATA;
5331 else if (first && h8300_tiny_data_p (decl))
5332 extra_flags = SYMBOL_FLAG_TINY_DATA;
5335 if (extra_flags)
5336 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
5339 /* Output a single-bit extraction. */
5341 const char *
5342 output_simode_bld (int bild, rtx operands[])
5344 if (TARGET_H8300)
5346 /* Clear the destination register. */
5347 output_asm_insn ("sub.w\t%e0,%e0\n\tsub.w\t%f0,%f0", operands);
5349 /* Now output the bit load or bit inverse load, and store it in
5350 the destination. */
5351 if (bild)
5352 output_asm_insn ("bild\t%Z2,%Y1", operands);
5353 else
5354 output_asm_insn ("bld\t%Z2,%Y1", operands);
5356 output_asm_insn ("bst\t#0,%w0", operands);
5358 else
5360 /* Determine if we can clear the destination first. */
5361 int clear_first = (REG_P (operands[0]) && REG_P (operands[1])
5362 && REGNO (operands[0]) != REGNO (operands[1]));
5364 if (clear_first)
5365 output_asm_insn ("sub.l\t%S0,%S0", operands);
5367 /* Output the bit load or bit inverse load. */
5368 if (bild)
5369 output_asm_insn ("bild\t%Z2,%Y1", operands);
5370 else
5371 output_asm_insn ("bld\t%Z2,%Y1", operands);
5373 if (!clear_first)
5374 output_asm_insn ("xor.l\t%S0,%S0", operands);
5376 /* Perform the bit store. */
5377 output_asm_insn ("rotxl.l\t%S0", operands);
5380 /* All done. */
5381 return "";
5384 /* Delayed-branch scheduling is more effective if we have some idea
5385 how long each instruction will be. Use a shorten_branches pass
5386 to get an initial estimate. */
5388 static void
5389 h8300_reorg (void)
5391 if (flag_delayed_branch)
5392 shorten_branches (get_insns ());
5395 #ifndef OBJECT_FORMAT_ELF
5396 static void
5397 h8300_asm_named_section (const char *name, unsigned int flags ATTRIBUTE_UNUSED,
5398 tree decl)
5400 /* ??? Perhaps we should be using default_coff_asm_named_section. */
5401 fprintf (asm_out_file, "\t.section %s\n", name);
5403 #endif /* ! OBJECT_FORMAT_ELF */
5405 /* Nonzero if X is a constant address suitable as an 8-bit absolute,
5406 which is a special case of the 'R' operand. */
5409 h8300_eightbit_constant_address_p (rtx x)
5411 /* The ranges of the 8-bit area. */
5412 const unsigned HOST_WIDE_INT n1 = trunc_int_for_mode (0xff00, HImode);
5413 const unsigned HOST_WIDE_INT n2 = trunc_int_for_mode (0xffff, HImode);
5414 const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00ffff00, SImode);
5415 const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00ffffff, SImode);
5416 const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0xffffff00, SImode);
5417 const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0xffffffff, SImode);
5419 unsigned HOST_WIDE_INT addr;
5421 /* We accept symbols declared with eightbit_data. */
5422 if (GET_CODE (x) == SYMBOL_REF)
5423 return (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0;
5425 if (GET_CODE (x) != CONST_INT)
5426 return 0;
5428 addr = INTVAL (x);
5430 return (0
5431 || ((TARGET_H8300 || TARGET_NORMAL_MODE) && IN_RANGE (addr, n1, n2))
5432 || (TARGET_H8300H && IN_RANGE (addr, h1, h2))
5433 || (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
5436 /* Nonzero if X is a constant address suitable as an 16-bit absolute
5437 on H8/300H and H8S. */
5440 h8300_tiny_constant_address_p (rtx x)
5442 /* The ranges of the 16-bit area. */
5443 const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00000000, SImode);
5444 const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00007fff, SImode);
5445 const unsigned HOST_WIDE_INT h3 = trunc_int_for_mode (0x00ff8000, SImode);
5446 const unsigned HOST_WIDE_INT h4 = trunc_int_for_mode (0x00ffffff, SImode);
5447 const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0x00000000, SImode);
5448 const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0x00007fff, SImode);
5449 const unsigned HOST_WIDE_INT s3 = trunc_int_for_mode (0xffff8000, SImode);
5450 const unsigned HOST_WIDE_INT s4 = trunc_int_for_mode (0xffffffff, SImode);
5452 unsigned HOST_WIDE_INT addr;
5454 switch (GET_CODE (x))
5456 case SYMBOL_REF:
5457 /* In the normal mode, any symbol fits in the 16-bit absolute
5458 address range. We also accept symbols declared with
5459 tiny_data. */
5460 return (TARGET_NORMAL_MODE
5461 || (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_TINY_DATA) != 0);
5463 case CONST_INT:
5464 addr = INTVAL (x);
5465 return (TARGET_NORMAL_MODE
5466 || (TARGET_H8300H
5467 && (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
5468 || (TARGET_H8300S
5469 && (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));
5471 case CONST:
5472 return TARGET_NORMAL_MODE;
5474 default:
5475 return 0;
5480 /* Return nonzero if ADDR1 and ADDR2 point to consecutive memory
5481 locations that can be accessed as a 16-bit word. */
5484 byte_accesses_mergeable_p (rtx addr1, rtx addr2)
5486 HOST_WIDE_INT offset1, offset2;
5487 rtx reg1, reg2;
5489 if (REG_P (addr1))
5491 reg1 = addr1;
5492 offset1 = 0;
5494 else if (GET_CODE (addr1) == PLUS
5495 && REG_P (XEXP (addr1, 0))
5496 && GET_CODE (XEXP (addr1, 1)) == CONST_INT)
5498 reg1 = XEXP (addr1, 0);
5499 offset1 = INTVAL (XEXP (addr1, 1));
5501 else
5502 return 0;
5504 if (REG_P (addr2))
5506 reg2 = addr2;
5507 offset2 = 0;
5509 else if (GET_CODE (addr2) == PLUS
5510 && REG_P (XEXP (addr2, 0))
5511 && GET_CODE (XEXP (addr2, 1)) == CONST_INT)
5513 reg2 = XEXP (addr2, 0);
5514 offset2 = INTVAL (XEXP (addr2, 1));
5516 else
5517 return 0;
5519 if (((reg1 == stack_pointer_rtx && reg2 == stack_pointer_rtx)
5520 || (reg1 == frame_pointer_rtx && reg2 == frame_pointer_rtx))
5521 && offset1 % 2 == 0
5522 && offset1 + 1 == offset2)
5523 return 1;
5525 return 0;
5528 /* Return nonzero if we have the same comparison insn as I3 two insns
5529 before I3. I3 is assumed to be a comparison insn. */
5532 same_cmp_preceding_p (rtx i3)
5534 rtx i1, i2;
5536 /* Make sure we have a sequence of three insns. */
5537 i2 = prev_nonnote_insn (i3);
5538 if (i2 == NULL_RTX)
5539 return 0;
5540 i1 = prev_nonnote_insn (i2);
5541 if (i1 == NULL_RTX)
5542 return 0;
5544 return (INSN_P (i1) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5545 && any_condjump_p (i2) && onlyjump_p (i2));
5548 /* Return nonzero if we have the same comparison insn as I1 two insns
5549 after I1. I1 is assumed to be a comparison insn. */
5552 same_cmp_following_p (rtx i1)
5554 rtx i2, i3;
5556 /* Make sure we have a sequence of three insns. */
5557 i2 = next_nonnote_insn (i1);
5558 if (i2 == NULL_RTX)
5559 return 0;
5560 i3 = next_nonnote_insn (i2);
5561 if (i3 == NULL_RTX)
5562 return 0;
5564 return (INSN_P (i3) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5565 && any_condjump_p (i2) && onlyjump_p (i2));
5568 /* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
5569 (or pops) N registers. OPERANDS are assumed to be an array of
5570 registers. */
5573 h8300_regs_ok_for_stm (int n, rtx operands[])
5575 switch (n)
5577 case 2:
5578 return ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
5579 || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
5580 || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5));
5581 case 3:
5582 return ((REGNO (operands[0]) == 0
5583 && REGNO (operands[1]) == 1
5584 && REGNO (operands[2]) == 2)
5585 || (REGNO (operands[0]) == 4
5586 && REGNO (operands[1]) == 5
5587 && REGNO (operands[2]) == 6));
5589 case 4:
5590 return (REGNO (operands[0]) == 0
5591 && REGNO (operands[1]) == 1
5592 && REGNO (operands[2]) == 2
5593 && REGNO (operands[3]) == 3);
5594 default:
5595 gcc_unreachable ();
5599 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
5602 h8300_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
5603 unsigned int new_reg)
5605 /* Interrupt functions can only use registers that have already been
5606 saved by the prologue, even if they would normally be
5607 call-clobbered. */
5609 if (h8300_current_function_interrupt_function_p ()
5610 && !regs_ever_live[new_reg])
5611 return 0;
5613 return 1;
5616 /* Return nonzero if X is a legitimate constant. */
5619 h8300_legitimate_constant_p (rtx x ATTRIBUTE_UNUSED)
5621 return 1;
5624 /* Return nonzero if X is a REG or SUBREG suitable as a base register. */
5626 static int
5627 h8300_rtx_ok_for_base_p (rtx x, int strict)
5629 /* Strip off SUBREG if any. */
5630 if (GET_CODE (x) == SUBREG)
5631 x = SUBREG_REG (x);
5633 return (REG_P (x)
5634 && (strict
5635 ? REG_OK_FOR_BASE_STRICT_P (x)
5636 : REG_OK_FOR_BASE_NONSTRICT_P (x)));
5639 /* Return nozero if X is a legitimate address. On the H8/300, a
5640 legitimate address has the form REG, REG+CONSTANT_ADDRESS or
5641 CONSTANT_ADDRESS. */
5644 h8300_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
5646 /* The register indirect addresses like @er0 is always valid. */
5647 if (h8300_rtx_ok_for_base_p (x, strict))
5648 return 1;
5650 if (CONSTANT_ADDRESS_P (x))
5651 return 1;
5653 if (TARGET_H8300SX
5654 && ( GET_CODE (x) == PRE_INC
5655 || GET_CODE (x) == PRE_DEC
5656 || GET_CODE (x) == POST_INC
5657 || GET_CODE (x) == POST_DEC)
5658 && h8300_rtx_ok_for_base_p (XEXP (x, 0), strict))
5659 return 1;
5661 if (GET_CODE (x) == PLUS
5662 && CONSTANT_ADDRESS_P (XEXP (x, 1))
5663 && h8300_rtx_ok_for_base_p (h8300_get_index (XEXP (x, 0),
5664 mode, 0), strict))
5665 return 1;
5667 return 0;
5670 /* Worker function for HARD_REGNO_NREGS.
5672 We pretend the MAC register is 32bits -- we don't have any data
5673 types on the H8 series to handle more than 32bits. */
5676 h8300_hard_regno_nregs (int regno ATTRIBUTE_UNUSED, enum machine_mode mode)
5678 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5681 /* Worker function for HARD_REGNO_MODE_OK. */
5684 h8300_hard_regno_mode_ok (int regno, enum machine_mode mode)
5686 if (TARGET_H8300)
5687 /* If an even reg, then anything goes. Otherwise the mode must be
5688 QI or HI. */
5689 return ((regno & 1) == 0) || (mode == HImode) || (mode == QImode);
5690 else
5691 /* MAC register can only be of SImode. Otherwise, anything
5692 goes. */
5693 return regno == MAC_REG ? mode == SImode : 1;
5696 /* Perform target dependent optabs initialization. */
5697 static void
5698 h8300_init_libfuncs (void)
5700 set_optab_libfunc (smul_optab, HImode, "__mulhi3");
5701 set_optab_libfunc (sdiv_optab, HImode, "__divhi3");
5702 set_optab_libfunc (udiv_optab, HImode, "__udivhi3");
5703 set_optab_libfunc (smod_optab, HImode, "__modhi3");
5704 set_optab_libfunc (umod_optab, HImode, "__umodhi3");
5707 /* Worker function for TARGET_RETURN_IN_MEMORY. */
5709 static bool
5710 h8300_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
5712 return (TYPE_MODE (type) == BLKmode
5713 || GET_MODE_SIZE (TYPE_MODE (type)) > (TARGET_H8300 ? 4 : 8));
5716 /* Initialize the GCC target structure. */
5717 #undef TARGET_ATTRIBUTE_TABLE
5718 #define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
5720 #undef TARGET_ASM_ALIGNED_HI_OP
5721 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
5723 #undef TARGET_ASM_FILE_START
5724 #define TARGET_ASM_FILE_START h8300_file_start
5725 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
5726 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
5728 #undef TARGET_ASM_FILE_END
5729 #define TARGET_ASM_FILE_END h8300_file_end
5731 #undef TARGET_ENCODE_SECTION_INFO
5732 #define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
5734 #undef TARGET_INSERT_ATTRIBUTES
5735 #define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
5737 #undef TARGET_RTX_COSTS
5738 #define TARGET_RTX_COSTS h8300_rtx_costs
5740 #undef TARGET_INIT_LIBFUNCS
5741 #define TARGET_INIT_LIBFUNCS h8300_init_libfuncs
5743 #undef TARGET_RETURN_IN_MEMORY
5744 #define TARGET_RETURN_IN_MEMORY h8300_return_in_memory
5746 #undef TARGET_MACHINE_DEPENDENT_REORG
5747 #define TARGET_MACHINE_DEPENDENT_REORG h8300_reorg
5749 struct gcc_target targetm = TARGET_INITIALIZER;