1 /* Subroutines for insn-output.c for Hitachi H8/300.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003 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 GNU CC.
9 GNU CC 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)
14 GNU CC 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 GNU CC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
26 #include "coretypes.h"
31 #include "hard-reg-set.h"
33 #include "insn-config.h"
34 #include "conditions.h"
36 #include "insn-attr.h"
46 #include "target-def.h"
48 /* Forward declarations. */
49 static const char *byte_reg PARAMS ((rtx, int));
50 static int h8300_interrupt_function_p PARAMS ((tree));
51 static int h8300_monitor_function_p PARAMS ((tree));
52 static int h8300_os_task_function_p PARAMS ((tree));
53 static void dosize PARAMS ((int, unsigned int));
54 static int round_frame_size PARAMS ((int));
55 static unsigned int compute_saved_regs PARAMS ((void));
56 static void push PARAMS ((int));
57 static void pop PARAMS ((int));
58 static const char *cond_string PARAMS ((enum rtx_code));
59 static unsigned int h8300_asm_insn_count PARAMS ((const char *));
60 const struct attribute_spec h8300_attribute_table[];
61 static tree h8300_handle_fndecl_attribute PARAMS ((tree *, tree, tree, int, bool *));
62 static tree h8300_handle_eightbit_data_attribute PARAMS ((tree *, tree, tree, int, bool *));
63 static tree h8300_handle_tiny_data_attribute PARAMS ((tree *, tree, tree, int, bool *));
64 static void h8300_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
65 static void h8300_insert_attributes PARAMS ((tree, tree *));
66 #ifndef OBJECT_FORMAT_ELF
67 static void h8300_asm_named_section PARAMS ((const char *, unsigned int));
69 static void h8300_encode_label PARAMS ((tree));
70 static void h8300_encode_section_info PARAMS ((tree, int));
71 static const char *h8300_strip_name_encoding PARAMS ((const char *));
73 /* CPU_TYPE, says what cpu we're compiling for. */
76 /* True if a #pragma interrupt has been seen for the current function. */
77 static int pragma_interrupt;
79 /* True if a #pragma saveall has been seen for the current function. */
80 static int pragma_saveall;
82 static const char *const names_big[] =
83 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" };
85 static const char *const names_extended[] =
86 { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7" };
88 static const char *const names_upper_extended[] =
89 { "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7" };
91 /* Points to one of the above. */
92 /* ??? The above could be put in an array indexed by CPU_TYPE. */
93 const char * const *h8_reg_names;
95 /* Various operations needed by the following, indexed by CPU_TYPE. */
97 const char *h8_push_op, *h8_pop_op, *h8_mov_op;
99 /* Initialize the GCC target structure. */
100 #undef TARGET_ATTRIBUTE_TABLE
101 #define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
103 #undef TARGET_ASM_ALIGNED_HI_OP
104 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
106 #undef TARGET_ASM_FUNCTION_EPILOGUE
107 #define TARGET_ASM_FUNCTION_EPILOGUE h8300_output_function_epilogue
108 #undef TARGET_ENCODE_SECTION_INFO
109 #define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
110 #undef TARGET_STRIP_NAME_ENCODING
111 #define TARGET_STRIP_NAME_ENCODING h8300_strip_name_encoding
113 #undef TARGET_INSERT_ATTRIBUTES
114 #define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
116 struct gcc_target targetm = TARGET_INITIALIZER;
118 /* See below where shifts are handled for explanation of this enum. */
128 /* Symbols of the various shifts which can be used as indices. */
132 SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
135 /* Macros to keep the shift algorithm tables small. */
136 #define INL SHIFT_INLINE
137 #define ROT SHIFT_ROT_AND
138 #define LOP SHIFT_LOOP
139 #define SPC SHIFT_SPECIAL
141 /* The shift algorithms for each machine, mode, shift type, and shift
142 count are defined below. The three tables below correspond to
143 QImode, HImode, and SImode, respectively. Each table is organized
144 by, in the order of indices, machine, shift type, and shift count. */
146 static enum shift_alg shift_alg_qi[3][3][8] = {
149 /* 0 1 2 3 4 5 6 7 */
150 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
151 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
152 { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
156 /* 0 1 2 3 4 5 6 7 */
157 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
158 { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
159 { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
163 /* 0 1 2 3 4 5 6 7 */
164 { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT */
165 { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
166 { INL, INL, INL, INL, INL, INL, INL, SPC } /* SHIFT_ASHIFTRT */
170 static enum shift_alg shift_alg_hi[3][3][16] = {
173 /* 0 1 2 3 4 5 6 7 */
174 /* 8 9 10 11 12 13 14 15 */
175 { INL, INL, INL, INL, INL, INL, INL, SPC,
176 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
177 { INL, INL, INL, INL, INL, LOP, LOP, SPC,
178 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
179 { INL, INL, INL, INL, INL, LOP, LOP, SPC,
180 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
184 /* 0 1 2 3 4 5 6 7 */
185 /* 8 9 10 11 12 13 14 15 */
186 { INL, INL, INL, INL, INL, INL, INL, SPC,
187 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
188 { INL, INL, INL, INL, INL, INL, INL, SPC,
189 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
190 { INL, INL, INL, INL, INL, INL, INL, SPC,
191 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
195 /* 0 1 2 3 4 5 6 7 */
196 /* 8 9 10 11 12 13 14 15 */
197 { INL, INL, INL, INL, INL, INL, INL, INL,
198 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
199 { INL, INL, INL, INL, INL, INL, INL, INL,
200 SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
201 { INL, INL, INL, INL, INL, INL, INL, INL,
202 SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
206 static enum shift_alg shift_alg_si[3][3][32] = {
209 /* 0 1 2 3 4 5 6 7 */
210 /* 8 9 10 11 12 13 14 15 */
211 /* 16 17 18 19 20 21 22 23 */
212 /* 24 25 26 27 28 29 30 31 */
213 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
214 SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
215 SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
216 SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT */
217 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
218 SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
219 SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
220 SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
221 { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
222 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
223 SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
224 SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
228 /* 0 1 2 3 4 5 6 7 */
229 /* 8 9 10 11 12 13 14 15 */
230 /* 16 17 18 19 20 21 22 23 */
231 /* 24 25 26 27 28 29 30 31 */
232 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
233 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
234 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
235 SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
236 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
237 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
238 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
239 SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
240 { INL, INL, INL, INL, INL, LOP, LOP, LOP,
241 SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
242 SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
243 SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
247 /* 0 1 2 3 4 5 6 7 */
248 /* 8 9 10 11 12 13 14 15 */
249 /* 16 17 18 19 20 21 22 23 */
250 /* 24 25 26 27 28 29 30 31 */
251 { INL, INL, INL, INL, INL, INL, INL, INL,
252 INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
253 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
254 SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
255 { INL, INL, INL, INL, INL, INL, INL, INL,
256 INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
257 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
258 SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
259 { INL, INL, INL, INL, INL, INL, INL, INL,
260 INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
261 SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
262 SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
278 /* Initialize various cpu specific globals at start up. */
283 static const char *const h8_push_ops[2] = { "push" , "push.l" };
284 static const char *const h8_pop_ops[2] = { "pop" , "pop.l" };
285 static const char *const h8_mov_ops[2] = { "mov.w", "mov.l" };
289 cpu_type = (int) CPU_H8300;
290 h8_reg_names = names_big;
294 /* For this we treat the H8/300H and H8S the same. */
295 cpu_type = (int) CPU_H8300H;
296 h8_reg_names = names_extended;
298 h8_push_op = h8_push_ops[cpu_type];
299 h8_pop_op = h8_pop_ops[cpu_type];
300 h8_mov_op = h8_mov_ops[cpu_type];
302 if (!TARGET_H8300S && TARGET_MAC)
304 error ("-ms2600 is used without -ms");
305 target_flags |= MASK_H8300S;
308 if (TARGET_H8300 && TARGET_NORMAL_MODE)
310 error ("-mn is used without -mh or -ms");
311 target_flags ^= MASK_NORMAL_MODE;
314 /* Some of the shifts are optimized for speed by default.
315 See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
316 If optimizing for size, change shift_alg for those shift to
321 shift_alg_hi[H8_300][SHIFT_ASHIFT][5] = SHIFT_LOOP;
322 shift_alg_hi[H8_300][SHIFT_ASHIFT][6] = SHIFT_LOOP;
323 shift_alg_hi[H8_300][SHIFT_ASHIFT][13] = SHIFT_LOOP;
324 shift_alg_hi[H8_300][SHIFT_ASHIFT][14] = SHIFT_LOOP;
326 shift_alg_hi[H8_300][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
327 shift_alg_hi[H8_300][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
329 shift_alg_hi[H8_300][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
330 shift_alg_hi[H8_300][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
333 shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
334 shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
336 shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
337 shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
339 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
340 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
341 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
342 shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
345 shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
354 static const char *const names_small[] = {
355 "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
356 "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
359 return names_small[REGNO (x) * 2 + b];
362 /* REGNO must be saved/restored across calls if this macro is true. */
364 #define WORD_REG_USED(regno) \
366 /* No need to save registers if this function will not return. */ \
367 && ! TREE_THIS_VOLATILE (current_function_decl) \
369 /* Save any call saved register that was used. */ \
370 || (regs_ever_live[regno] && !call_used_regs[regno]) \
371 /* Save the frame pointer if it was used. */ \
372 || (regno == FRAME_POINTER_REGNUM && regs_ever_live[regno]) \
373 /* Save any register used in an interrupt handler. */ \
374 || (h8300_current_function_interrupt_function_p () \
375 && regs_ever_live[regno]) \
376 /* Save call clobbered registers in non-leaf interrupt \
378 || (h8300_current_function_interrupt_function_p () \
379 && call_used_regs[regno] \
380 && !current_function_is_leaf)))
382 /* Output assembly language to FILE for the operation OP with operand size
383 SIZE to adjust the stack pointer. */
390 /* H8/300 cannot add/subtract a large constant with a single
391 instruction. If a temporary register is available, load the
392 constant to it and then do the addition. */
395 && !h8300_current_function_interrupt_function_p ()
396 && !(current_function_needs_context && sign < 0))
399 rtx r3 = gen_rtx_REG (Pmode, 3);
400 emit_insn (gen_rtx_SET (Pmode, r3, GEN_INT (sign * size)));
401 new_sp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, r3);
402 emit_insn (gen_rtx_SET (Pmode, stack_pointer_rtx, new_sp));
406 /* The stack adjustment made here is further optimized by the
407 splitter. In case of H8/300, the splitter always splits the
408 addition emitted here to make the adjustment
410 rtx new_sp = plus_constant (stack_pointer_rtx, sign * size);
411 emit_insn (gen_rtx_SET (Pmode, stack_pointer_rtx, new_sp));
415 /* Round up frame size SIZE. */
418 round_frame_size (size)
421 return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
422 & -STACK_BOUNDARY / BITS_PER_UNIT);
425 /* Compute which registers to push/pop.
426 Return a bit vector of registers. */
429 compute_saved_regs ()
431 unsigned int saved_regs = 0;
434 /* Construct a bit vector of registers to be pushed/popped. */
435 for (regno = 0; regno <= FRAME_POINTER_REGNUM; regno++)
437 if (WORD_REG_USED (regno))
438 saved_regs |= 1 << regno;
441 /* Don't push/pop the frame pointer as it is treated separately. */
442 if (frame_pointer_needed)
443 saved_regs &= ~(1 << FRAME_POINTER_REGNUM);
448 /* Emit an insn to push register RN. */
454 rtx reg = gen_rtx_REG (word_mode, rn);
458 x = gen_push_h8300 (reg);
460 x = gen_push_h8300hs (reg);
462 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
465 /* Emit an insn to pop register RN. */
471 rtx reg = gen_rtx_REG (word_mode, rn);
475 x = gen_pop_h8300 (reg);
477 x = gen_pop_h8300hs (reg);
479 REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
482 /* This is what the stack looks like after the prolog of
483 a function with a frame has been set up:
489 <saved registers> <- sp
491 This is what the stack looks like after the prolog of
492 a function which doesn't have a frame:
497 <saved registers> <- sp
500 /* Generate RTL code for the function prologue. */
503 h8300_expand_prologue ()
509 /* If the current function has the OS_Task attribute set, then
510 we have a naked prologue. */
511 if (h8300_os_task_function_p (current_function_decl))
514 if (h8300_monitor_function_p (current_function_decl))
515 /* My understanding of monitor functions is they act just like
516 interrupt functions, except the prologue must mask
518 emit_insn (gen_monitor_prologue ());
520 if (frame_pointer_needed)
523 push (FRAME_POINTER_REGNUM);
524 emit_insn (gen_rtx_SET (Pmode, frame_pointer_rtx, stack_pointer_rtx));
527 /* Leave room for locals. */
528 dosize (-1, round_frame_size (get_frame_size ()));
530 /* Push the rest of the registers in ascending order. */
531 saved_regs = compute_saved_regs ();
532 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno += n_regs)
535 if (saved_regs & (1 << regno))
539 /* See how many registers we can push at the same time. */
540 if ((regno == 0 || regno == 4)
541 && ((saved_regs >> regno) & 0x0f) == 0x0f)
544 else if ((regno == 0 || regno == 4)
545 && ((saved_regs >> regno) & 0x07) == 0x07)
548 else if ((regno == 0 || regno == 2 || regno == 4 || regno == 6)
549 && ((saved_regs >> regno) & 0x03) == 0x03)
559 emit_insn (gen_stm_h8300s_2 (gen_rtx_REG (SImode, regno),
560 gen_rtx_REG (SImode, regno + 1)));
563 emit_insn (gen_stm_h8300s_3 (gen_rtx_REG (SImode, regno),
564 gen_rtx_REG (SImode, regno + 1),
565 gen_rtx_REG (SImode, regno + 2)));
568 emit_insn (gen_stm_h8300s_4 (gen_rtx_REG (SImode, regno),
569 gen_rtx_REG (SImode, regno + 1),
570 gen_rtx_REG (SImode, regno + 2),
571 gen_rtx_REG (SImode, regno + 3)));
581 h8300_can_use_return_insn_p ()
583 return (reload_completed
584 && !frame_pointer_needed
585 && get_frame_size () == 0
586 && compute_saved_regs () == 0);
589 /* Generate RTL code for the function epilogue. */
592 h8300_expand_epilogue ()
598 if (h8300_os_task_function_p (current_function_decl))
599 /* OS_Task epilogues are nearly naked -- they just have an
603 /* Pop the saved registers in descending order. */
604 saved_regs = compute_saved_regs ();
605 for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno -= n_regs)
608 if (saved_regs & (1 << regno))
612 /* See how many registers we can pop at the same time. */
613 if ((regno == 7 || regno == 3)
614 && ((saved_regs >> (regno - 3)) & 0x0f) == 0x0f)
617 else if ((regno == 6 || regno == 2)
618 && ((saved_regs >> (regno - 2)) & 0x07) == 0x07)
621 else if ((regno == 7 || regno == 5 || regno == 3 || regno == 1)
622 && ((saved_regs >> (regno - 1)) & 0x03) == 0x03)
632 emit_insn (gen_ldm_h8300s_2 (gen_rtx_REG (SImode, regno - 1),
633 gen_rtx_REG (SImode, regno)));
636 emit_insn (gen_ldm_h8300s_3 (gen_rtx_REG (SImode, regno - 2),
637 gen_rtx_REG (SImode, regno - 1),
638 gen_rtx_REG (SImode, regno)));
641 emit_insn (gen_ldm_h8300s_4 (gen_rtx_REG (SImode, regno - 3),
642 gen_rtx_REG (SImode, regno - 2),
643 gen_rtx_REG (SImode, regno - 1),
644 gen_rtx_REG (SImode, regno)));
652 /* Deallocate locals. */
653 dosize (1, round_frame_size (get_frame_size ()));
655 /* Pop frame pointer if we had one. */
656 if (frame_pointer_needed)
657 pop (FRAME_POINTER_REGNUM);
660 /* Output assembly language code for the function epilogue. */
663 h8300_output_function_epilogue (file, size)
664 FILE *file ATTRIBUTE_UNUSED;
665 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
670 /* Return nonzero if the current function is an interrupt
674 h8300_current_function_interrupt_function_p ()
676 return (h8300_interrupt_function_p (current_function_decl)
677 || h8300_monitor_function_p (current_function_decl));
680 /* Output assembly code for the start of the file. */
683 asm_file_start (file)
686 fprintf (file, ";\tGCC For the Hitachi H8/300\n");
687 fprintf (file, ";\tBy Hitachi America Ltd and Cygnus Support\n");
690 fprintf (file, "; -Os\n");
692 fprintf (file, "; -O%d\n", optimize);
694 fprintf (file, "\n\t.h8300h\n");
695 else if (TARGET_H8300S)
696 fprintf (file, "\n\t.h8300s\n");
698 fprintf (file, "\n\n");
699 output_file_directive (file, main_input_filename);
702 /* Output assembly language code for the end of file. */
708 fprintf (file, "\t.end\n");
711 /* Return true if OP is a valid source operand for an integer move
715 general_operand_src (op, mode)
717 enum machine_mode mode;
719 if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC)
721 return general_operand (op, mode);
724 /* Return true if OP is a valid destination operand for an integer move
728 general_operand_dst (op, mode)
730 enum machine_mode mode;
732 if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == PRE_DEC)
734 return general_operand (op, mode);
737 /* Return true if OP is a constant that contains only one 1 in its
738 binary representation. */
741 single_one_operand (operand, mode)
743 enum machine_mode mode ATTRIBUTE_UNUSED;
745 if (GET_CODE (operand) == CONST_INT)
747 /* We really need to do this masking because 0x80 in QImode is
748 represented as -128 for example. */
749 unsigned HOST_WIDE_INT mask =
750 (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
751 ? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
752 : ~(unsigned HOST_WIDE_INT) 0;
753 unsigned HOST_WIDE_INT value = INTVAL (operand);
755 if (exact_log2 (value & mask) >= 0)
762 /* Return true if OP is a constant that contains only one 0 in its
763 binary representation. */
766 single_zero_operand (operand, mode)
768 enum machine_mode mode ATTRIBUTE_UNUSED;
770 if (GET_CODE (operand) == CONST_INT)
772 /* We really need to do this masking because 0x80 in QImode is
773 represented as -128 for example. */
774 unsigned HOST_WIDE_INT mask =
775 (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
776 ? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
777 : ~(unsigned HOST_WIDE_INT) 0;
778 unsigned HOST_WIDE_INT value = INTVAL (operand);
780 if (exact_log2 (~value & mask) >= 0)
787 /* Return true if OP is a valid call operand. */
790 call_insn_operand (op, mode)
792 enum machine_mode mode ATTRIBUTE_UNUSED;
794 if (GET_CODE (op) == MEM)
796 rtx inside = XEXP (op, 0);
797 if (register_operand (inside, Pmode))
799 if (CONSTANT_ADDRESS_P (inside))
805 /* Return 1 if an addition/subtraction of a constant integer can be
806 transformed into two consecutive adds/subs that are faster than the
807 straightforward way. Otherwise, return 0. */
810 two_insn_adds_subs_operand (op, mode)
812 enum machine_mode mode;
814 if (GET_CODE (op) == CONST_INT)
816 HOST_WIDE_INT value = INTVAL (op);
818 /* Force VALUE to be positive so that we do not have to consider
819 the negative case. */
822 if (TARGET_H8300H || TARGET_H8300S)
824 /* A constant addition/subtraction takes 2 states in QImode,
825 4 states in HImode, and 6 states in SImode. Thus, the
826 only case we can win is when SImode is used, in which
827 case, two adds/subs are used, taking 4 states. */
837 /* We do not profit directly by splitting addition or
838 subtraction of 3 and 4. However, since these are
839 implemented as a sequence of adds or subs, they do not
840 clobber (cc0) unlike a sequence of add.b and add.x. */
851 /* Split an add of a small constant into two adds/subs insns.
853 If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
854 instead of adds/subs. */
857 split_adds_subs (mode, operands, use_incdec_p)
858 enum machine_mode mode;
862 HOST_WIDE_INT val = INTVAL (operands[1]);
863 rtx reg = operands[0];
864 HOST_WIDE_INT sign = 1;
865 HOST_WIDE_INT amount;
866 rtx (*gen_last) (rtx, rtx, rtx);
867 rtx (*gen_normal) (rtx, rtx, rtx);
869 /* Force VAL to be positive so that we do not have to consider the
880 gen_normal = gen_addhi3;
881 gen_last = gen_addhi3_incdec;
885 gen_normal = gen_addsi3;
886 gen_last = gen_addsi3_incdec;
893 /* Try different amounts in descending order. */
894 for (amount = (TARGET_H8300H || TARGET_H8300S) ? 4 : 2;
898 for (; val >= amount; val -= amount)
900 /* If requested, generate the last insn using inc/dec. */
901 if (use_incdec_p && amount <= 2 && val == amount)
902 emit_insn (gen_last (reg, reg, GEN_INT (sign * amount)));
904 emit_insn (gen_normal (reg, reg, GEN_INT (sign * amount)));
911 /* Return true if OP is a valid call operand, and OP represents
912 an operand for a small call (4 bytes instead of 6 bytes). */
915 small_call_insn_operand (op, mode)
917 enum machine_mode mode ATTRIBUTE_UNUSED;
919 if (GET_CODE (op) == MEM)
921 rtx inside = XEXP (op, 0);
923 /* Register indirect is a small call. */
924 if (register_operand (inside, Pmode))
927 /* A call through the function vector is a small
929 if (GET_CODE (inside) == SYMBOL_REF
930 && SYMBOL_REF_FLAG (inside))
933 /* Otherwise it's a large call. */
937 /* Return true if OP is a valid jump operand. */
940 jump_address_operand (op, mode)
942 enum machine_mode mode;
944 if (GET_CODE (op) == REG)
945 return mode == Pmode;
947 if (GET_CODE (op) == MEM)
949 rtx inside = XEXP (op, 0);
950 if (register_operand (inside, Pmode))
952 if (CONSTANT_ADDRESS_P (inside))
958 /* Recognize valid operands for bit-field instructions. */
960 extern int rtx_equal_function_value_matters;
963 bit_operand (op, mode)
965 enum machine_mode mode;
967 /* We can accept any general operand, except that MEM operands must
968 be limited to those that use addresses valid for the 'U' constraint. */
969 if (!general_operand (op, mode))
972 /* Accept any mem during RTL generation. Otherwise, the code that does
973 insv and extzv will think that we can not handle memory. However,
974 to avoid reload problems, we only accept 'U' MEM operands after RTL
975 generation. This means that any named pattern which uses this predicate
976 must force its operands to match 'U' before emitting RTL. */
978 if (GET_CODE (op) == REG)
980 if (GET_CODE (op) == SUBREG)
982 if (!rtx_equal_function_value_matters)
983 /* We're building rtl. */
984 return GET_CODE (op) == MEM;
986 return (GET_CODE (op) == MEM
987 && EXTRA_CONSTRAINT (op, 'U'));
991 bit_memory_operand (op, mode)
993 enum machine_mode mode ATTRIBUTE_UNUSED;
995 return (GET_CODE (op) == MEM
996 && EXTRA_CONSTRAINT (op, 'U'));
999 /* Handle machine specific pragmas for compatibility with existing
1000 compilers for the H8/300.
1002 pragma saveall generates prologue/epilogue code which saves and
1003 restores all the registers on function entry.
1005 pragma interrupt saves and restores all registers, and exits with
1006 an rte instruction rather than an rts. A pointer to a function
1007 with this attribute may be safely used in an interrupt vector. */
1010 h8300_pr_interrupt (pfile)
1011 struct cpp_reader *pfile ATTRIBUTE_UNUSED;
1013 pragma_interrupt = 1;
1017 h8300_pr_saveall (pfile)
1018 struct cpp_reader *pfile ATTRIBUTE_UNUSED;
1023 /* If the next function argument with MODE and TYPE is to be passed in
1024 a register, return a reg RTX for the hard register in which to pass
1025 the argument. CUM represents the state after the last argument.
1026 If the argument is to be pushed, NULL_RTX is returned. */
1029 function_arg (cum, mode, type, named)
1030 CUMULATIVE_ARGS *cum;
1031 enum machine_mode mode;
1035 static const char *const hand_list[] = {
1054 rtx result = NULL_RTX;
1058 /* Never pass unnamed arguments in registers. */
1062 /* Pass 3 regs worth of data in regs when user asked on the command line. */
1063 if (TARGET_QUICKCALL)
1066 /* If calling hand written assembler, use 4 regs of args. */
1069 const char * const *p;
1071 fname = XSTR (cum->libcall, 0);
1073 /* See if this libcall is one of the hand coded ones. */
1074 for (p = hand_list; *p && strcmp (*p, fname) != 0; p++)
1085 if (mode == BLKmode)
1086 size = int_size_in_bytes (type);
1088 size = GET_MODE_SIZE (mode);
1090 if (size + cum->nbytes <= regpass * UNITS_PER_WORD
1091 && cum->nbytes / UNITS_PER_WORD <= 3)
1092 result = gen_rtx_REG (mode, cum->nbytes / UNITS_PER_WORD);
1098 /* Return the cost of the rtx R with code CODE. */
1101 const_costs (r, c, outer_code)
1104 enum rtx_code outer_code;
1117 return 0 + (outer_code == SET);
1120 if (TARGET_H8300H || TARGET_H8300S)
1121 return 0 + (outer_code == SET);
1147 if (GET_MODE (x) == QImode)
1150 if (GET_MODE (x) != HImode
1151 && GET_MODE (x) != SImode)
1156 operands[2] = XEXP (x, 1);
1158 return compute_logical_op_length (GET_MODE (x), operands);
1162 h8300_shift_costs (x)
1167 if (GET_MODE (x) != QImode
1168 && GET_MODE (x) != HImode
1169 && GET_MODE (x) != SImode)
1174 operands[2] = XEXP (x, 1);
1176 return compute_a_shift_length (NULL, operands);
1179 /* Documentation for the machine specific operand escapes:
1181 'E' like s but negative.
1182 'F' like t but negative.
1183 'G' constant just the negative
1184 'R' print operand as a byte:8 address if appropriate, else fall back to
1186 'S' print operand as a long word
1187 'T' print operand as a word
1188 'V' find the set bit, and print its number.
1189 'W' find the clear bit, and print its number.
1190 'X' print operand as a byte
1191 'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
1192 If this operand isn't a register, fall back to 'R' handling.
1194 'b' print the bit opcode
1195 'e' first word of 32 bit value - if reg, then least reg. if mem
1196 then least. if const then most sig word
1197 'f' second word of 32 bit value - if reg, then biggest reg. if mem
1198 then +2. if const then least sig word
1199 'j' print operand as condition code.
1200 'k' print operand as reverse condition code.
1201 's' print as low byte of 16 bit value
1202 't' print as high byte of 16 bit value
1203 'w' print as low byte of 32 bit value
1204 'x' print as 2nd byte of 32 bit value
1205 'y' print as 3rd byte of 32 bit value
1206 'z' print as msb of 32 bit value
1209 /* Return assembly language string which identifies a comparison type. */
1242 /* Print operand X using operand code CODE to assembly language output file
1246 print_operand (file, x, code)
1251 /* This is used for communication between codes V,W,Z and Y. */
1257 switch (GET_CODE (x))
1260 fprintf (file, "%sl", names_big[REGNO (x)]);
1263 fprintf (file, "#%ld", (-INTVAL (x)) & 0xff);
1270 switch (GET_CODE (x))
1273 fprintf (file, "%sh", names_big[REGNO (x)]);
1276 fprintf (file, "#%ld", ((-INTVAL (x)) & 0xff00) >> 8);
1283 if (GET_CODE (x) != CONST_INT)
1285 fprintf (file, "#%ld", 0xff & (-INTVAL (x)));
1288 if (GET_CODE (x) == REG)
1289 fprintf (file, "%s", names_extended[REGNO (x)]);
1294 if (GET_CODE (x) == REG)
1295 fprintf (file, "%s", names_big[REGNO (x)]);
1300 bitint = exact_log2 (INTVAL (x) & 0xff);
1303 fprintf (file, "#%d", bitint);
1306 bitint = exact_log2 ((~INTVAL (x)) & 0xff);
1309 fprintf (file, "#%d", bitint);
1313 if (GET_CODE (x) == REG)
1314 fprintf (file, "%s", byte_reg (x, 0));
1321 if (GET_CODE (x) == REG)
1322 fprintf (file, "%s%c", names_big[REGNO (x)], bitint > 7 ? 'h' : 'l');
1324 print_operand (file, x, 'R');
1328 bitint = INTVAL (x);
1329 fprintf (file, "#%d", bitint & 7);
1332 switch (GET_CODE (x))
1335 fprintf (file, "bor");
1338 fprintf (file, "bxor");
1341 fprintf (file, "band");
1348 switch (GET_CODE (x))
1352 fprintf (file, "%s", names_big[REGNO (x)]);
1354 fprintf (file, "%s", names_upper_extended[REGNO (x)]);
1357 print_operand (file, x, 0);
1360 fprintf (file, "#%ld", ((INTVAL (x) >> 16) & 0xffff));
1366 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1367 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1368 fprintf (file, "#%ld", ((val >> 16) & 0xffff));
1377 switch (GET_CODE (x))
1381 fprintf (file, "%s", names_big[REGNO (x) + 1]);
1383 fprintf (file, "%s", names_big[REGNO (x)]);
1386 x = adjust_address (x, HImode, 2);
1387 print_operand (file, x, 0);
1390 fprintf (file, "#%ld", INTVAL (x) & 0xffff);
1396 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1397 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1398 fprintf (file, "#%ld", (val & 0xffff));
1406 fputs (cond_string (GET_CODE (x)), file);
1409 fputs (cond_string (reverse_condition (GET_CODE (x))), file);
1412 if (GET_CODE (x) == CONST_INT)
1413 fprintf (file, "#%ld", (INTVAL (x)) & 0xff);
1415 fprintf (file, "%s", byte_reg (x, 0));
1418 if (GET_CODE (x) == CONST_INT)
1419 fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1421 fprintf (file, "%s", byte_reg (x, 1));
1424 if (GET_CODE (x) != CONST_INT)
1426 fprintf (file, "%ld", INTVAL (x));
1429 if (GET_CODE (x) == CONST_INT)
1430 fprintf (file, "#%ld", INTVAL (x) & 0xff);
1432 fprintf (file, "%s",
1433 byte_reg (x, TARGET_H8300 ? 2 : 0));
1436 if (GET_CODE (x) == CONST_INT)
1437 fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1439 fprintf (file, "%s",
1440 byte_reg (x, TARGET_H8300 ? 3 : 1));
1443 if (GET_CODE (x) == CONST_INT)
1444 fprintf (file, "#%ld", (INTVAL (x) >> 16) & 0xff);
1446 fprintf (file, "%s", byte_reg (x, 0));
1449 if (GET_CODE (x) == CONST_INT)
1450 fprintf (file, "#%ld", (INTVAL (x) >> 24) & 0xff);
1452 fprintf (file, "%s", byte_reg (x, 1));
1457 switch (GET_CODE (x))
1460 switch (GET_MODE (x))
1463 #if 0 /* Is it asm ("mov.b %0,r2l", ...) */
1464 fprintf (file, "%s", byte_reg (x, 0));
1465 #else /* ... or is it asm ("mov.b %0l,r2l", ...) */
1466 fprintf (file, "%s", names_big[REGNO (x)]);
1470 fprintf (file, "%s", names_big[REGNO (x)]);
1474 fprintf (file, "%s", names_extended[REGNO (x)]);
1483 rtx addr = XEXP (x, 0);
1485 fprintf (file, "@");
1486 output_address (addr);
1488 /* We fall back from smaller addressing to larger
1489 addressing in various ways depending on CODE. */
1493 /* Used for mov.b and bit operations. */
1494 if (h8300_eightbit_constant_address_p (addr))
1496 fprintf (file, ":8");
1500 /* Fall through. We should not get here if we are
1501 processing bit operations on H8/300 or H8/300H
1502 because 'U' constraint does not allow bit
1503 operations on the tiny area on these machines. */
1507 /* Used for mov.w and mov.l. */
1508 if (h8300_tiny_constant_address_p (addr))
1509 fprintf (file, ":16");
1521 fprintf (file, "#");
1522 print_operand_address (file, x);
1528 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
1529 REAL_VALUE_TO_TARGET_SINGLE (rv, val);
1530 fprintf (file, "#%ld", val);
1539 /* Output assembly language output for the address ADDR to FILE. */
1542 print_operand_address (file, addr)
1546 switch (GET_CODE (addr))
1549 fprintf (file, "%s", h8_reg_names[REGNO (addr)]);
1553 fprintf (file, "-%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1557 fprintf (file, "%s+", h8_reg_names[REGNO (XEXP (addr, 0))]);
1561 fprintf (file, "(");
1562 if (GET_CODE (XEXP (addr, 0)) == REG)
1565 print_operand_address (file, XEXP (addr, 1));
1566 fprintf (file, ",");
1567 print_operand_address (file, XEXP (addr, 0));
1572 print_operand_address (file, XEXP (addr, 0));
1573 fprintf (file, "+");
1574 print_operand_address (file, XEXP (addr, 1));
1576 fprintf (file, ")");
1581 /* Since the H8/300 only has 16 bit pointers, negative values are also
1582 those >= 32768. This happens for example with pointer minus a
1583 constant. We don't want to turn (char *p - 2) into
1584 (char *p + 65534) because loop unrolling can build upon this
1585 (IE: char *p + 131068). */
1586 int n = INTVAL (addr);
1588 n = (int) (short) n;
1589 fprintf (file, "%d", n);
1594 output_addr_const (file, addr);
1599 /* Output all insn addresses and their sizes into the assembly language
1600 output file. This is helpful for debugging whether the length attributes
1601 in the md file are correct. This is not meant to be a user selectable
1605 final_prescan_insn (insn, operand, num_operands)
1606 rtx insn, *operand ATTRIBUTE_UNUSED;
1607 int num_operands ATTRIBUTE_UNUSED;
1609 /* This holds the last insn address. */
1610 static int last_insn_address = 0;
1612 const int uid = INSN_UID (insn);
1614 if (TARGET_RTL_DUMP)
1616 fprintf (asm_out_file, "\n****************");
1617 print_rtl (asm_out_file, PATTERN (insn));
1618 fprintf (asm_out_file, "\n");
1621 if (TARGET_ADDRESSES)
1623 fprintf (asm_out_file, "; 0x%x %d\n", INSN_ADDRESSES (uid),
1624 INSN_ADDRESSES (uid) - last_insn_address);
1625 last_insn_address = INSN_ADDRESSES (uid);
1629 /* Prepare for an SI sized move. */
1635 rtx src = operands[1];
1636 rtx dst = operands[0];
1637 if (!reload_in_progress && !reload_completed)
1639 if (!register_operand (dst, GET_MODE (dst)))
1641 rtx tmp = gen_reg_rtx (GET_MODE (dst));
1642 emit_move_insn (tmp, src);
1649 /* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
1650 Define the offset between two registers, one to be eliminated, and
1651 the other its replacement, at the start of a routine. */
1654 h8300_initial_elimination_offset (from, to)
1659 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
1660 offset = UNITS_PER_WORD + frame_pointer_needed * UNITS_PER_WORD;
1661 else if (from == RETURN_ADDRESS_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
1662 offset = frame_pointer_needed * UNITS_PER_WORD;
1667 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1668 if (WORD_REG_USED (regno))
1669 offset += UNITS_PER_WORD;
1671 /* See the comments for get_frame_size. We need to round it up to
1674 offset += round_frame_size (get_frame_size ());
1676 if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1677 offset += UNITS_PER_WORD; /* Skip saved PC */
1680 if ((TARGET_H8300H || TARGET_H8300S) && TARGET_NORMAL_MODE)
1687 h8300_return_addr_rtx (count, frame)
1694 ret = gen_rtx_MEM (Pmode,
1695 gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM));
1696 else if (flag_omit_frame_pointer)
1699 ret = gen_rtx_MEM (Pmode,
1700 memory_address (Pmode,
1701 plus_constant (frame, UNITS_PER_WORD)));
1702 set_mem_alias_set (ret, get_frame_alias_set ());
1706 /* Update the condition code from the insn. */
1709 notice_update_cc (body, insn)
1713 switch (get_attr_cc (insn))
1716 /* Insn does not affect CC at all. */
1720 /* Insn does not change CC, but the 0'th operand has been changed. */
1721 if (cc_status.value1 != 0
1722 && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value1))
1723 cc_status.value1 = 0;
1724 if (cc_status.value2 != 0
1725 && reg_overlap_mentioned_p (recog_data.operand[0], cc_status.value2))
1726 cc_status.value2 = 0;
1730 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
1731 The V flag is unusable. The C flag may or may not be known but
1732 that's ok because alter_cond will change tests to use EQ/NE. */
1734 cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY;
1735 cc_status.value1 = recog_data.operand[0];
1739 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
1740 The C flag may or may not be known but that's ok because
1741 alter_cond will change tests to use EQ/NE. */
1743 cc_status.flags |= CC_NO_CARRY;
1744 cc_status.value1 = recog_data.operand[0];
1745 if (GET_CODE (body) == SET && REG_P (SET_SRC (body)))
1746 cc_status.value2 = SET_SRC (body);
1750 /* The insn is a compare instruction. */
1752 cc_status.value1 = SET_SRC (body);
1756 /* Insn doesn't leave CC in a usable state. */
1762 /* Return nonzero if X is a stack pointer. */
1765 stack_pointer_operand (x, mode)
1767 enum machine_mode mode ATTRIBUTE_UNUSED;
1769 return x == stack_pointer_rtx;
1772 /* Return nonzero if X is a constant whose absolute value is no
1776 const_int_le_2_operand (x, mode)
1778 enum machine_mode mode ATTRIBUTE_UNUSED;
1780 return (GET_CODE (x) == CONST_INT
1781 && abs (INTVAL (x)) <= 2);
1784 /* Return nonzero if X is a constant whose absolute value is no
1788 const_int_le_6_operand (x, mode)
1790 enum machine_mode mode ATTRIBUTE_UNUSED;
1792 return (GET_CODE (x) == CONST_INT
1793 && abs (INTVAL (x)) <= 6);
1796 /* Return nonzero if X is a constant whose absolute value is greater
1800 const_int_gt_2_operand (x, mode)
1802 enum machine_mode mode ATTRIBUTE_UNUSED;
1804 return (GET_CODE (x) == CONST_INT
1805 && abs (INTVAL (x)) > 2);
1808 /* Return nonzero if X is a constant whose absolute value is no
1812 const_int_ge_8_operand (x, mode)
1814 enum machine_mode mode ATTRIBUTE_UNUSED;
1816 return (GET_CODE (x) == CONST_INT
1817 && abs (INTVAL (x)) >= 8);
1820 /* Return nonzero if X is a constant expressible in QImode. */
1823 const_int_qi_operand (x, mode)
1825 enum machine_mode mode ATTRIBUTE_UNUSED;
1827 return (GET_CODE (x) == CONST_INT
1828 && (INTVAL (x) & 0xff) == INTVAL (x));
1831 /* Return nonzero if X is a constant expressible in HImode. */
1834 const_int_hi_operand (x, mode)
1836 enum machine_mode mode ATTRIBUTE_UNUSED;
1838 return (GET_CODE (x) == CONST_INT
1839 && (INTVAL (x) & 0xffff) == INTVAL (x));
1842 /* Return nonzero if X is a constant suitable for inc/dec. */
1845 incdec_operand (x, mode)
1847 enum machine_mode mode ATTRIBUTE_UNUSED;
1849 return (GET_CODE (x) == CONST_INT
1850 && (CONST_OK_FOR_M (INTVAL (x))
1851 || CONST_OK_FOR_O (INTVAL (x))));
1854 /* Return nonzero if X is either EQ or NE. */
1857 eqne_operator (x, mode)
1859 enum machine_mode mode ATTRIBUTE_UNUSED;
1861 enum rtx_code code = GET_CODE (x);
1863 return (code == EQ || code == NE);
1866 /* Recognize valid operators for bit instructions. */
1869 bit_operator (x, mode)
1871 enum machine_mode mode ATTRIBUTE_UNUSED;
1873 enum rtx_code code = GET_CODE (x);
1881 output_plussi (operands)
1884 enum machine_mode mode = GET_MODE (operands[0]);
1891 /* Currently we do not support H8/300 here yet. */
1896 if (GET_CODE (operands[2]) == REG)
1897 return "add.l\t%S2,%S0";
1899 if (GET_CODE (operands[2]) == CONST_INT)
1901 HOST_WIDE_INT intval = INTVAL (operands[2]);
1903 /* See if we can finish with 2 bytes. */
1905 switch (intval & 0xffffffff)
1910 return "adds\t%2,%S0";
1915 return "subs\t%G2,%S0";
1919 operands[2] = GEN_INT (intval >> 16);
1920 return "inc.w\t%2,%e0";
1924 operands[2] = GEN_INT (intval >> 16);
1925 return "dec.w\t%G2,%e0";
1928 /* See if we can finish with 4 bytes. */
1929 if ((intval & 0xffff) == 0)
1931 operands[2] = GEN_INT (intval >> 16);
1932 return "add.w\t%2,%e0";
1936 return "add.l\t%S2,%S0";
1941 compute_plussi_length (operands)
1944 enum machine_mode mode = GET_MODE (operands[0]);
1951 /* Currently we do not support H8/300 here yet. */
1956 if (GET_CODE (operands[2]) == REG)
1959 if (GET_CODE (operands[2]) == CONST_INT)
1961 HOST_WIDE_INT intval = INTVAL (operands[2]);
1963 /* See if we can finish with 2 bytes. */
1965 switch (intval & 0xffffffff)
1986 /* See if we can finish with 4 bytes. */
1987 if ((intval & 0xffff) == 0)
1996 compute_plussi_cc (operands)
1999 enum machine_mode mode = GET_MODE (operands[0]);
2006 /* Currently we do not support H8/300 here yet. */
2011 if (GET_CODE (operands[2]) == REG)
2014 if (GET_CODE (operands[2]) == CONST_INT)
2016 HOST_WIDE_INT intval = INTVAL (operands[2]);
2018 /* See if we can finish with 2 bytes. */
2020 switch (intval & 0xffffffff)
2025 return CC_NONE_0HIT;
2030 return CC_NONE_0HIT;
2041 /* See if we can finish with 4 bytes. */
2042 if ((intval & 0xffff) == 0)
2051 output_logical_op (mode, operands)
2052 enum machine_mode mode;
2055 /* Figure out the logical op that we need to perform. */
2056 enum rtx_code code = GET_CODE (operands[3]);
2057 /* Pretend that every byte is affected if both operands are registers. */
2058 const unsigned HOST_WIDE_INT intval =
2059 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
2060 ? INTVAL (operands[2]) : 0x55555555);
2061 /* The determinant of the algorithm. If we perform an AND, 0
2062 affects a bit. Otherwise, 1 affects a bit. */
2063 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
2064 /* The name of an insn. */
2086 /* First, see if we can finish with one insn. */
2087 if ((TARGET_H8300H || TARGET_H8300S)
2088 && ((det & 0x00ff) != 0)
2089 && ((det & 0xff00) != 0))
2091 sprintf (insn_buf, "%s.w\t%%T2,%%T0", opname);
2092 output_asm_insn (insn_buf, operands);
2096 /* Take care of the lower byte. */
2097 if ((det & 0x00ff) != 0)
2099 sprintf (insn_buf, "%s\t%%s2,%%s0", opname);
2100 output_asm_insn (insn_buf, operands);
2102 /* Take care of the upper byte. */
2103 if ((det & 0xff00) != 0)
2105 sprintf (insn_buf, "%s\t%%t2,%%t0", opname);
2106 output_asm_insn (insn_buf, operands);
2111 /* First, see if we can finish with one insn.
2113 If code is either AND or XOR, we exclude two special cases,
2114 0xffffff00 and 0xffff00ff, because insns like sub.w or not.w
2115 can do a better job. */
2116 if ((TARGET_H8300H || TARGET_H8300S)
2117 && ((det & 0x0000ffff) != 0)
2118 && ((det & 0xffff0000) != 0)
2119 && (code == IOR || det != 0xffffff00)
2120 && (code == IOR || det != 0xffff00ff)
2122 && (det == 0xff00ffff
2123 || (det & 0xffff00ff) == 0xff000000
2124 || (det & 0xffffff00) == 0xff000000)))
2126 sprintf (insn_buf, "%s.l\t%%S2,%%S0", opname);
2127 output_asm_insn (insn_buf, operands);
2131 /* Take care of the lower and upper words individually. For
2132 each word, we try different methods in the order of
2134 1) the special insn (in case of AND or XOR),
2135 2) the word-wise insn, and
2136 3) The byte-wise insn. */
2137 if ((det & 0x0000ffff) == 0x0000ffff
2138 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
2139 output_asm_insn ((code == AND)
2140 ? "sub.w\t%f0,%f0" : "not.w\t%f0",
2142 else if ((TARGET_H8300H || TARGET_H8300S)
2143 && ((det & 0x000000ff) != 0)
2144 && ((det & 0x0000ff00) != 0))
2146 sprintf (insn_buf, "%s.w\t%%f2,%%f0", opname);
2147 output_asm_insn (insn_buf, operands);
2151 if ((det & 0x000000ff) != 0)
2153 sprintf (insn_buf, "%s\t%%w2,%%w0", opname);
2154 output_asm_insn (insn_buf, operands);
2156 if ((det & 0x0000ff00) != 0)
2158 sprintf (insn_buf, "%s\t%%x2,%%x0", opname);
2159 output_asm_insn (insn_buf, operands);
2163 if ((det & 0xffff0000) == 0xffff0000
2164 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
2165 output_asm_insn ((code == AND)
2166 ? "sub.w\t%e0,%e0" : "not.w\t%e0",
2168 else if ((TARGET_H8300H || TARGET_H8300S)
2170 && (det & 0xffff0000) == 0xff000000)
2172 output_asm_insn ("extu.w\t%e0", operands);
2174 else if (TARGET_H8300H || TARGET_H8300S)
2176 if ((det & 0xffff0000) != 0)
2178 sprintf (insn_buf, "%s.w\t%%e2,%%e0", opname);
2179 output_asm_insn (insn_buf, operands);
2184 if ((det & 0x00ff0000) != 0)
2186 sprintf (insn_buf, "%s\t%%y2,%%y0", opname);
2187 output_asm_insn (insn_buf, operands);
2189 if ((det & 0xff000000) != 0)
2191 sprintf (insn_buf, "%s\t%%z2,%%z0", opname);
2192 output_asm_insn (insn_buf, operands);
2204 compute_logical_op_length (mode, operands)
2205 enum machine_mode mode;
2208 /* Figure out the logical op that we need to perform. */
2209 enum rtx_code code = GET_CODE (operands[3]);
2210 /* Pretend that every byte is affected if both operands are registers. */
2211 const unsigned HOST_WIDE_INT intval =
2212 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
2213 ? INTVAL (operands[2]) : 0x55555555);
2214 /* The determinant of the algorithm. If we perform an AND, 0
2215 affects a bit. Otherwise, 1 affects a bit. */
2216 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
2218 unsigned int length = 0;
2223 /* First, see if we can finish with one insn. */
2224 if ((TARGET_H8300H || TARGET_H8300S)
2225 && ((det & 0x00ff) != 0)
2226 && ((det & 0xff00) != 0))
2228 if (REG_P (operands[2]))
2235 /* Take care of the lower byte. */
2236 if ((det & 0x00ff) != 0)
2239 /* Take care of the upper byte. */
2240 if ((det & 0xff00) != 0)
2245 /* First, see if we can finish with one insn.
2247 If code is either AND or XOR, we exclude two special cases,
2248 0xffffff00 and 0xffff00ff, because insns like sub.w or not.w
2249 can do a better job. */
2250 if ((TARGET_H8300H || TARGET_H8300S)
2251 && ((det & 0x0000ffff) != 0)
2252 && ((det & 0xffff0000) != 0)
2253 && (code == IOR || det != 0xffffff00)
2254 && (code == IOR || det != 0xffff00ff)
2256 && (det == 0xff00ffff
2257 || (det & 0xffff00ff) == 0xff000000
2258 || (det & 0xffffff00) == 0xff000000)))
2260 if (REG_P (operands[2]))
2267 /* Take care of the lower and upper words individually. For
2268 each word, we try different methods in the order of
2270 1) the special insn (in case of AND or XOR),
2271 2) the word-wise insn, and
2272 3) The byte-wise insn. */
2273 if ((det & 0x0000ffff) == 0x0000ffff
2274 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
2278 else if ((TARGET_H8300H || TARGET_H8300S)
2279 && ((det & 0x000000ff) != 0)
2280 && ((det & 0x0000ff00) != 0))
2286 if ((det & 0x000000ff) != 0)
2289 if ((det & 0x0000ff00) != 0)
2293 if ((det & 0xffff0000) == 0xffff0000
2294 && (TARGET_H8300 ? (code == AND) : (code != IOR)))
2298 else if ((TARGET_H8300H || TARGET_H8300S)
2300 && (det & 0xffff0000) == 0xff000000)
2304 else if (TARGET_H8300H || TARGET_H8300S)
2306 if ((det & 0xffff0000) != 0)
2311 if ((det & 0x00ff0000) != 0)
2314 if ((det & 0xff000000) != 0)
2326 compute_logical_op_cc (mode, operands)
2327 enum machine_mode mode;
2330 /* Figure out the logical op that we need to perform. */
2331 enum rtx_code code = GET_CODE (operands[3]);
2332 /* Pretend that every byte is affected if both operands are registers. */
2333 const unsigned HOST_WIDE_INT intval =
2334 (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
2335 ? INTVAL (operands[2]) : 0x55555555);
2336 /* The determinant of the algorithm. If we perform an AND, 0
2337 affects a bit. Otherwise, 1 affects a bit. */
2338 const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
2339 /* Condition code. */
2340 enum attr_cc cc = CC_CLOBBER;
2345 /* First, see if we can finish with one insn. */
2346 if ((TARGET_H8300H || TARGET_H8300S)
2347 && ((det & 0x00ff) != 0)
2348 && ((det & 0xff00) != 0))
2354 /* First, see if we can finish with one insn.
2356 If code is either AND or XOR, we exclude two special cases,
2357 0xffffff00 and 0xffff00ff, because insns like sub.w or not.w
2358 can do a better job. */
2359 if ((TARGET_H8300H || TARGET_H8300S)
2360 && ((det & 0x0000ffff) != 0)
2361 && ((det & 0xffff0000) != 0)
2362 && (code == IOR || det != 0xffffff00)
2363 && (code == IOR || det != 0xffff00ff)
2365 && (det == 0xff00ffff
2366 || (det & 0xffff00ff) == 0xff000000
2367 || (det & 0xffffff00) == 0xff000000)))
2380 We devote a fair bit of code to getting efficient shifts since we
2381 can only shift one bit at a time on the H8/300 and H8/300H and only
2382 one or two bits at a time on the H8S.
2384 All shift code falls into one of the following ways of
2387 o SHIFT_INLINE: Emit straight line code for the shift; this is used
2388 when a straight line shift is about the same size or smaller than
2391 o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
2392 off the bits we don't need. This is used when only a few of the
2393 bits in the original value will survive in the shifted value.
2395 o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
2396 simulate a shift by 8, 16, or 24 bits. Once moved, a few inline
2397 shifts can be added if the shift count is slightly more than 8 or
2398 16. This case also includes other oddballs that are not worth
2401 o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
2403 For each shift count, we try to use code that has no trade-off
2404 between code size and speed whenever possible.
2406 If the trade-off is unavoidable, we try to be reasonable.
2407 Specifically, the fastest version is one instruction longer than
2408 the shortest version, we take the fastest version. We also provide
2409 the use a way to switch back to the shortest version with -Os.
2411 For the details of the shift algorithms for various shift counts,
2412 refer to shift_alg_[qhs]i. */
2415 nshift_operator (x, mode)
2417 enum machine_mode mode ATTRIBUTE_UNUSED;
2419 switch (GET_CODE (x))
2431 /* Emit code to do shifts. */
2434 expand_a_shift (mode, code, operands)
2435 enum machine_mode mode;
2439 emit_move_insn (operands[0], operands[1]);
2441 /* Need a loop to get all the bits we want - we generate the
2442 code at emit time, but need to allocate a scratch reg now. */
2444 emit_insn (gen_rtx_PARALLEL
2447 gen_rtx_SET (VOIDmode, operands[0],
2448 gen_rtx (code, mode, operands[0],
2450 gen_rtx_CLOBBER (VOIDmode,
2451 gen_rtx_SCRATCH (QImode)))));
2454 /* Symbols of the various modes which can be used as indices. */
2458 QIshift, HIshift, SIshift
2461 /* For single bit shift insns, record assembler and what bits of the
2462 condition code are valid afterwards (represented as various CC_FOO
2463 bits, 0 means CC isn't left in a usable state). */
2467 const char *const assembler;
2471 /* Assembler instruction shift table.
2473 These tables are used to look up the basic shifts.
2474 They are indexed by cpu, shift_type, and mode. */
2476 static const struct shift_insn shift_one[2][3][3] =
2482 { "shll\t%X0", CC_NO_CARRY },
2483 { "add.w\t%T0,%T0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2484 { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", 0 }
2486 /* SHIFT_LSHIFTRT */
2488 { "shlr\t%X0", CC_NO_CARRY },
2489 { "shlr\t%t0\n\trotxr\t%s0", 0 },
2490 { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", 0 }
2492 /* SHIFT_ASHIFTRT */
2494 { "shar\t%X0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2495 { "shar\t%t0\n\trotxr\t%s0", 0 },
2496 { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", 0 }
2503 { "shll.b\t%X0", CC_NO_CARRY },
2504 { "shll.w\t%T0", CC_NO_CARRY },
2505 { "shll.l\t%S0", CC_NO_CARRY }
2507 /* SHIFT_LSHIFTRT */
2509 { "shlr.b\t%X0", CC_NO_CARRY },
2510 { "shlr.w\t%T0", CC_NO_CARRY },
2511 { "shlr.l\t%S0", CC_NO_CARRY }
2513 /* SHIFT_ASHIFTRT */
2515 { "shar.b\t%X0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2516 { "shar.w\t%T0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2517 { "shar.l\t%S0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY }
2522 static const struct shift_insn shift_two[3][3] =
2526 { "shll.b\t#2,%X0", CC_NO_CARRY },
2527 { "shll.w\t#2,%T0", CC_NO_CARRY },
2528 { "shll.l\t#2,%S0", CC_NO_CARRY }
2530 /* SHIFT_LSHIFTRT */
2532 { "shlr.b\t#2,%X0", CC_NO_CARRY },
2533 { "shlr.w\t#2,%T0", CC_NO_CARRY },
2534 { "shlr.l\t#2,%S0", CC_NO_CARRY }
2536 /* SHIFT_ASHIFTRT */
2538 { "shar.b\t#2,%X0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2539 { "shar.w\t#2,%T0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY },
2540 { "shar.l\t#2,%S0", CC_OVERFLOW_UNUSABLE | CC_NO_CARRY }
2544 /* Rotates are organized by which shift they'll be used in implementing.
2545 There's no need to record whether the cc is valid afterwards because
2546 it is the AND insn that will decide this. */
2548 static const char *const rotate_one[2][3][3] =
2555 "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
2558 /* SHIFT_LSHIFTRT */
2561 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
2564 /* SHIFT_ASHIFTRT */
2567 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
2579 /* SHIFT_LSHIFTRT */
2585 /* SHIFT_ASHIFTRT */
2594 static const char *const rotate_two[3][3] =
2602 /* SHIFT_LSHIFTRT */
2608 /* SHIFT_ASHIFTRT */
2617 /* Shift algorithm. */
2620 /* The number of bits to be shifted by shift1 and shift2. Valid
2621 when ALG is SHIFT_SPECIAL. */
2622 unsigned int remainder;
2624 /* Special insn for a shift. Valid when ALG is SHIFT_SPECIAL. */
2625 const char *special;
2627 /* Insn for a one-bit shift. Valid when ALG is either SHIFT_INLINE
2628 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
2631 /* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
2632 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
2635 /* Valid CC flags. */
2639 static void get_shift_alg PARAMS ((enum shift_type,
2640 enum shift_mode, unsigned int,
2641 struct shift_info *));
2643 /* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
2644 best algorithm for doing the shift. The assembler code is stored
2645 in the pointers in INFO. We achieve the maximum efficiency in most
2646 cases when !TARGET_H8300. In case of TARGET_H8300, shifts in
2647 SImode in particular have a lot of room to optimize.
2649 We first determine the strategy of the shift algorithm by a table
2650 lookup. If that tells us to use a hand crafted assembly code, we
2651 go into the big switch statement to find what that is. Otherwise,
2652 we resort to a generic way, such as inlining. In either case, the
2653 result is returned through INFO. */
2656 get_shift_alg (shift_type, shift_mode, count, info)
2657 enum shift_type shift_type;
2658 enum shift_mode shift_mode;
2660 struct shift_info *info;
2664 /* Find the target CPU. */
2667 else if (TARGET_H8300H)
2672 /* Find the shift algorithm. */
2673 info->alg = SHIFT_LOOP;
2677 if (count < GET_MODE_BITSIZE (QImode))
2678 info->alg = shift_alg_qi[cpu][shift_type][count];
2682 if (count < GET_MODE_BITSIZE (HImode))
2683 info->alg = shift_alg_hi[cpu][shift_type][count];
2687 if (count < GET_MODE_BITSIZE (SImode))
2688 info->alg = shift_alg_si[cpu][shift_type][count];
2695 /* Fill in INFO. Return unless we have SHIFT_SPECIAL. */
2699 info->remainder = count;
2703 /* It is up to the caller to know that looping clobbers cc. */
2704 info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
2705 info->shift2 = shift_two[shift_type][shift_mode].assembler;
2706 info->cc_valid_p = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
2710 info->shift1 = rotate_one[cpu_type][shift_type][shift_mode];
2711 info->shift2 = rotate_two[shift_type][shift_mode];
2712 info->cc_valid_p = 0;
2716 /* REMAINDER is 0 for most cases, so initialize it to 0. */
2717 info->remainder = 0;
2718 info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
2719 info->shift2 = shift_two[shift_type][shift_mode].assembler;
2720 info->cc_valid_p = 0;
2724 /* Here we only deal with SHIFT_SPECIAL. */
2728 /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
2729 through the entire value. */
2730 if (shift_type == SHIFT_ASHIFTRT && count == 7)
2732 info->special = "shll\t%X0\n\tsubx\t%X0,%X0";
2744 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";
2746 info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
2748 case SHIFT_LSHIFTRT:
2750 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";
2752 info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
2754 case SHIFT_ASHIFTRT:
2755 info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
2759 else if (8 <= count && count <= 13)
2761 info->remainder = count - 8;
2766 info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
2768 case SHIFT_LSHIFTRT:
2771 info->special = "mov.b\t%t0,%s0\n\tsub.b\t%t0,%t0";
2772 info->shift1 = "shlr.b\t%s0";
2776 info->special = "mov.b\t%t0,%s0\n\textu.w\t%T0";
2779 case SHIFT_ASHIFTRT:
2782 info->special = "mov.b\t%t0,%s0\n\tbld\t#7,%s0\n\tsubx\t%t0,%t0";
2783 info->shift1 = "shar.b\t%s0";
2784 info->shift2 = "shar.b\t#2,%s0";
2788 info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0";
2793 else if (count == 14)
2799 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";
2801 case SHIFT_LSHIFTRT:
2803 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";
2805 case SHIFT_ASHIFTRT:
2807 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";
2808 else if (TARGET_H8300H)
2809 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";
2810 else /* TARGET_H8300S */
2811 info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0";
2815 else if (count == 15)
2820 info->special = "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
2822 case SHIFT_LSHIFTRT:
2823 info->special = "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
2825 case SHIFT_ASHIFTRT:
2826 info->special = "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
2833 if (TARGET_H8300 && 8 <= count && count <= 9)
2835 info->remainder = count - 8;
2840 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";
2842 case SHIFT_LSHIFTRT:
2843 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";
2844 info->shift1 = "shlr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0";
2846 case SHIFT_ASHIFTRT:
2847 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";
2851 else if (count == 8 && !TARGET_H8300)
2856 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";
2858 case SHIFT_LSHIFTRT:
2859 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";
2861 case SHIFT_ASHIFTRT:
2862 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";
2866 else if (count == 15 && TARGET_H8300)
2872 case SHIFT_LSHIFTRT:
2873 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,%w0\n\trotxl\t%x0,%x0\n\trotxl\t%y0,%y0";
2875 case SHIFT_ASHIFTRT:
2876 info->special = "bld\t#7,%z0\n\tmov.w\t%e0,%f0\n\trotxl\t%w0,%w0\n\trotxl\t%x0,%x0\n\tsubx\t%y0,%y0\n\tsubx\t%z0,%z0";
2880 else if (count == 15 && !TARGET_H8300)
2885 info->special = "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
2887 case SHIFT_LSHIFTRT:
2888 info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
2890 case SHIFT_ASHIFTRT:
2894 else if ((TARGET_H8300 && 16 <= count && count <= 20)
2895 || (TARGET_H8300H && 16 <= count && count <= 19)
2896 || (TARGET_H8300S && 16 <= count && count <= 21))
2898 info->remainder = count - 16;
2903 info->special = "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
2906 info->shift1 = "add.w\t%e0,%e0";
2910 info->shift1 = "shll.l\t%S0";
2911 info->shift2 = "shll.l\t#2,%S0";
2914 case SHIFT_LSHIFTRT:
2917 info->special = "mov.w\t%e0,%f0\n\tsub.w\t%e0,%e0";
2918 info->shift1 = "shlr\t%x0\n\trotxr\t%w0";
2922 info->special = "mov.w\t%e0,%f0\n\textu.l\t%S0";
2925 case SHIFT_ASHIFTRT:
2928 info->special = "mov.w\t%e0,%f0\n\tshll\t%z0\n\tsubx\t%z0,%z0\n\tmov.b\t%z0,%y0";
2929 info->shift1 = "shar\t%x0\n\trotxr\t%w0";
2933 info->special = "mov.w\t%e0,%f0\n\texts.l\t%S0";
2938 else if (TARGET_H8300 && 24 <= count && count <= 28)
2940 info->remainder = count - 24;
2945 info->special = "mov.b\t%w0,%z0\n\tsub.b\t%y0,%y0\n\tsub.w\t%f0,%f0";
2946 info->shift1 = "shll.b\t%z0";
2948 case SHIFT_LSHIFTRT:
2949 info->special = "mov.b\t%z0,%w0\n\tsub.b\t%x0,%x0\n\tsub.w\t%e0,%e0";
2950 info->shift1 = "shlr.b\t%w0";
2952 case SHIFT_ASHIFTRT:
2953 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";
2954 info->shift1 = "shar.b\t%w0";
2958 else if ((TARGET_H8300H && count == 24)
2959 || (TARGET_H8300S && 24 <= count && count <= 25))
2961 info->remainder = count - 24;
2966 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";
2967 info->shift1 = "shll.l\t%S0";
2968 info->shift2 = "shll.l\t#2,%S0";
2970 case SHIFT_LSHIFTRT:
2971 info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
2972 info->shift1 = "shlr.l\t%S0";
2973 info->shift2 = "shlr.l\t#2,%S0";
2975 case SHIFT_ASHIFTRT:
2976 info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
2977 info->shift1 = "shar.l\t%S0";
2978 info->shift2 = "shar.l\t#2,%S0";
2982 else if (!TARGET_H8300 && count == 28)
2988 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";
2990 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";
2994 case SHIFT_LSHIFTRT:
2996 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";
2998 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
3002 case SHIFT_ASHIFTRT:
3006 else if (!TARGET_H8300 && count == 29)
3012 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";
3014 info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
3018 case SHIFT_LSHIFTRT:
3020 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";
3022 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
3026 case SHIFT_ASHIFTRT:
3030 else if (!TARGET_H8300 && count == 30)
3036 info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
3038 info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
3042 case SHIFT_LSHIFTRT:
3044 info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
3046 info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
3050 case SHIFT_ASHIFTRT:
3054 else if (count == 31)
3061 info->special = "sub.w\t%e0,%e0\n\tshlr\t%w0\n\tmov.w\t%e0,%f0\n\trotxr\t%z0";
3063 case SHIFT_LSHIFTRT:
3064 info->special = "sub.w\t%f0,%f0\n\tshll\t%z0\n\tmov.w\t%f0,%e0\n\trotxl\t%w0";
3066 case SHIFT_ASHIFTRT:
3067 info->special = "shll\t%z0\n\tsubx\t%w0,%w0\n\tmov.b\t%w0,%x0\n\tmov.w\t%f0,%e0";
3076 info->special = "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
3078 case SHIFT_LSHIFTRT:
3079 info->special = "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
3081 case SHIFT_ASHIFTRT:
3082 info->special = "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
3095 info->shift2 = NULL;
3098 /* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
3099 needed for some shift with COUNT and MODE. Return 0 otherwise. */
3102 h8300_shift_needs_scratch_p (count, mode)
3104 enum machine_mode mode;
3109 if (GET_MODE_BITSIZE (mode) <= count)
3112 /* Find out the target CPU. */
3115 else if (TARGET_H8300H)
3120 /* Find the shift algorithm. */
3124 a = shift_alg_qi[cpu][SHIFT_ASHIFT][count];
3125 lr = shift_alg_qi[cpu][SHIFT_LSHIFTRT][count];
3126 ar = shift_alg_qi[cpu][SHIFT_ASHIFTRT][count];
3130 a = shift_alg_hi[cpu][SHIFT_ASHIFT][count];
3131 lr = shift_alg_hi[cpu][SHIFT_LSHIFTRT][count];
3132 ar = shift_alg_hi[cpu][SHIFT_ASHIFTRT][count];
3136 a = shift_alg_si[cpu][SHIFT_ASHIFT][count];
3137 lr = shift_alg_si[cpu][SHIFT_LSHIFTRT][count];
3138 ar = shift_alg_si[cpu][SHIFT_ASHIFTRT][count];
3145 /* On H8/300H and H8S, count == 8 uses the scratch register. */
3146 return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
3147 || (!TARGET_H8300 && mode == SImode && count == 8));
3150 /* Emit the assembler code for doing shifts. */
3153 output_a_shift (operands)
3156 static int loopend_lab;
3157 rtx shift = operands[3];
3158 enum machine_mode mode = GET_MODE (shift);
3159 enum rtx_code code = GET_CODE (shift);
3160 enum shift_type shift_type;
3161 enum shift_mode shift_mode;
3162 struct shift_info info;
3169 shift_mode = QIshift;
3172 shift_mode = HIshift;
3175 shift_mode = SIshift;
3184 shift_type = SHIFT_ASHIFTRT;
3187 shift_type = SHIFT_LSHIFTRT;
3190 shift_type = SHIFT_ASHIFT;
3196 if (GET_CODE (operands[2]) != CONST_INT)
3198 /* This case must be taken care of by one of the two splitters
3199 that convert a variable shift into a loop. */
3204 int n = INTVAL (operands[2]);
3206 /* If the count is negative, make it 0. */
3209 /* If the count is too big, truncate it.
3210 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
3211 do the intuitive thing. */
3212 else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
3213 n = GET_MODE_BITSIZE (mode);
3215 get_shift_alg (shift_type, shift_mode, n, &info);
3220 output_asm_insn (info.special, operands);
3226 /* Emit two bit shifts first. */
3227 if (info.shift2 != NULL)
3229 for (; n > 1; n -= 2)
3230 output_asm_insn (info.shift2, operands);
3233 /* Now emit one bit shifts for any residual. */
3235 output_asm_insn (info.shift1, operands);
3237 /* Keep track of CC. */
3238 if (info.cc_valid_p)
3240 cc_status.value1 = operands[0];
3241 cc_status.flags |= info.cc_valid_p;
3247 int m = GET_MODE_BITSIZE (mode) - n;
3248 const int mask = (shift_type == SHIFT_ASHIFT
3249 ? ((1 << m) - 1) << n
3253 /* Not all possibilities of rotate are supported. They shouldn't
3254 be generated, but let's watch for 'em. */
3255 if (info.shift1 == 0)
3258 /* Emit two bit rotates first. */
3259 if (info.shift2 != NULL)
3261 for (; m > 1; m -= 2)
3262 output_asm_insn (info.shift2, operands);
3265 /* Now single bit rotates for any residual. */
3267 output_asm_insn (info.shift1, operands);
3269 /* Now mask off the high bits. */
3271 sprintf (insn_buf, "and\t#%d,%%X0", mask);
3272 else if (mode == HImode && (TARGET_H8300H || TARGET_H8300S))
3273 sprintf (insn_buf, "and.w\t#%d,%%T0", mask);
3277 cc_status.value1 = operands[0];
3278 cc_status.flags |= CC_NO_CARRY;
3279 output_asm_insn (insn_buf, operands);
3284 /* A loop to shift by a "large" constant value.
3285 If we have shift-by-2 insns, use them. */
3286 if (info.shift2 != NULL)
3288 fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n / 2,
3289 names_big[REGNO (operands[4])]);
3290 fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
3291 output_asm_insn (info.shift2, operands);
3292 output_asm_insn ("add #0xff,%X4", operands);
3293 fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
3295 output_asm_insn (info.shift1, operands);
3299 fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n,
3300 names_big[REGNO (operands[4])]);
3301 fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
3302 output_asm_insn (info.shift1, operands);
3303 output_asm_insn ("add #0xff,%X4", operands);
3304 fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
3315 h8300_asm_insn_count (template)
3316 const char *template;
3318 unsigned int count = 1;
3320 for (; *template; template++)
3321 if (*template == '\n')
3328 compute_a_shift_length (insn, operands)
3329 rtx insn ATTRIBUTE_UNUSED;
3332 rtx shift = operands[3];
3333 enum machine_mode mode = GET_MODE (shift);
3334 enum rtx_code code = GET_CODE (shift);
3335 enum shift_type shift_type;
3336 enum shift_mode shift_mode;
3337 struct shift_info info;
3338 unsigned int wlength = 0;
3343 shift_mode = QIshift;
3346 shift_mode = HIshift;
3349 shift_mode = SIshift;
3358 shift_type = SHIFT_ASHIFTRT;
3361 shift_type = SHIFT_LSHIFTRT;
3364 shift_type = SHIFT_ASHIFT;
3370 if (GET_CODE (operands[2]) != CONST_INT)
3372 /* Get the assembler code to do one shift. */
3373 get_shift_alg (shift_type, shift_mode, 1, &info);
3375 return (4 + h8300_asm_insn_count (info.shift1)) * 2;
3379 int n = INTVAL (operands[2]);
3381 /* If the count is negative, make it 0. */
3384 /* If the count is too big, truncate it.
3385 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
3386 do the intuitive thing. */
3387 else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
3388 n = GET_MODE_BITSIZE (mode);
3390 get_shift_alg (shift_type, shift_mode, n, &info);
3395 wlength += h8300_asm_insn_count (info.special);
3397 /* Every assembly instruction used in SHIFT_SPECIAL case
3398 takes 2 bytes except xor.l, which takes 4 bytes, so if we
3399 see xor.l, we just pretend that xor.l counts as two insns
3400 so that the insn length will be computed correctly. */
3401 if (strstr (info.special, "xor.l") != NULL)
3409 if (info.shift2 != NULL)
3411 wlength += h8300_asm_insn_count (info.shift2) * (n / 2);
3415 wlength += h8300_asm_insn_count (info.shift1) * n;
3421 int m = GET_MODE_BITSIZE (mode) - n;
3423 /* Not all possibilities of rotate are supported. They shouldn't
3424 be generated, but let's watch for 'em. */
3425 if (info.shift1 == 0)
3428 if (info.shift2 != NULL)
3430 wlength += h8300_asm_insn_count (info.shift2) * (m / 2);
3434 wlength += h8300_asm_insn_count (info.shift1) * m;
3436 /* Now mask off the high bits. */
3457 /* A loop to shift by a "large" constant value.
3458 If we have shift-by-2 insns, use them. */
3459 if (info.shift2 != NULL)
3461 wlength += 3 + h8300_asm_insn_count (info.shift2);
3463 wlength += h8300_asm_insn_count (info.shift1);
3467 wlength += 3 + h8300_asm_insn_count (info.shift1);
3477 /* A rotation by a non-constant will cause a loop to be generated, in
3478 which a rotation by one bit is used. A rotation by a constant,
3479 including the one in the loop, will be taken care of by
3480 emit_a_rotate () at the insn emit time. */
3483 expand_a_rotate (code, operands)
3487 rtx dst = operands[0];
3488 rtx src = operands[1];
3489 rtx rotate_amount = operands[2];
3490 enum machine_mode mode = GET_MODE (dst);
3493 /* We rotate in place. */
3494 emit_move_insn (dst, src);
3496 if (GET_CODE (rotate_amount) != CONST_INT)
3498 rtx counter = gen_reg_rtx (QImode);
3499 rtx start_label = gen_label_rtx ();
3500 rtx end_label = gen_label_rtx ();
3502 /* If the rotate amount is less than or equal to 0,
3503 we go out of the loop. */
3504 emit_cmp_and_jump_insns (rotate_amount, GEN_INT (0), LE, NULL_RTX,
3505 QImode, 0, end_label);
3507 /* Initialize the loop counter. */
3508 emit_move_insn (counter, rotate_amount);
3510 emit_label (start_label);
3512 /* Rotate by one bit. */
3513 tmp = gen_rtx (code, mode, dst, GEN_INT (1));
3514 emit_insn (gen_rtx_SET (mode, dst, tmp));
3516 /* Decrement the counter by 1. */
3517 tmp = gen_rtx_PLUS (QImode, counter, GEN_INT (-1));
3518 emit_insn (gen_rtx_SET (VOIDmode, counter, tmp));
3520 /* If the loop counter is nonzero, we go back to the beginning
3522 emit_cmp_and_jump_insns (counter, GEN_INT (0), NE, NULL_RTX, QImode, 1,
3525 emit_label (end_label);
3529 /* Rotate by AMOUNT bits. */
3530 tmp = gen_rtx (code, mode, dst, rotate_amount);
3531 emit_insn (gen_rtx_SET (mode, dst, tmp));
3537 /* Emit rotate insns. */
3540 emit_a_rotate (code, operands)
3544 rtx dst = operands[0];
3545 rtx rotate_amount = operands[2];
3546 enum shift_mode rotate_mode;
3547 enum shift_type rotate_type;
3548 const char *insn_buf;
3551 enum machine_mode mode = GET_MODE (dst);
3553 if (GET_CODE (rotate_amount) != CONST_INT)
3559 rotate_mode = QIshift;
3562 rotate_mode = HIshift;
3565 rotate_mode = SIshift;
3574 rotate_type = SHIFT_ASHIFT;
3577 rotate_type = SHIFT_LSHIFTRT;
3583 amount = INTVAL (rotate_amount);
3585 /* Clean up AMOUNT. */
3588 if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
3589 amount = GET_MODE_BITSIZE (mode);
3591 /* Determine the faster direction. After this phase, amount will be
3592 at most a half of GET_MODE_BITSIZE (mode). */
3593 if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
3595 /* Flip the direction. */
3596 amount = GET_MODE_BITSIZE (mode) - amount;
3598 (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
3601 /* See if a byte swap (in HImode) or a word swap (in SImode) can
3602 boost up the rotation. */
3603 if ((mode == HImode && TARGET_H8300 && amount >= 5)
3604 || (mode == HImode && TARGET_H8300H && amount >= 6)
3605 || (mode == HImode && TARGET_H8300S && amount == 8)
3606 || (mode == SImode && TARGET_H8300H && amount >= 10)
3607 || (mode == SImode && TARGET_H8300S && amount >= 13))
3612 /* This code works on any family. */
3613 insn_buf = "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
3614 output_asm_insn (insn_buf, operands);
3618 /* This code works on the H8/300H and H8S. */
3619 insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
3620 output_asm_insn (insn_buf, operands);
3627 /* Adjust AMOUNT and flip the direction. */
3628 amount = GET_MODE_BITSIZE (mode) / 2 - amount;
3630 (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
3633 /* Emit rotate insns. */
3634 for (bits = TARGET_H8300S ? 2 : 1; bits > 0; bits /= 2)
3637 insn_buf = rotate_two[rotate_type][rotate_mode];
3639 insn_buf = rotate_one[cpu_type][rotate_type][rotate_mode];
3641 for (; amount >= bits; amount -= bits)
3642 output_asm_insn (insn_buf, operands);
3648 /* Fix the operands of a gen_xxx so that it could become a bit
3652 fix_bit_operand (operands, what, type)
3657 /* The bit_operand predicate accepts any memory during RTL generation, but
3658 only 'U' memory afterwards, so if this is a MEM operand, we must force
3659 it to be valid for 'U' by reloading the address. */
3661 if ((what == 0 && single_zero_operand (operands[2], QImode))
3662 || (what == 1 && single_one_operand (operands[2], QImode)))
3664 /* OK to have a memory dest. */
3665 if (GET_CODE (operands[0]) == MEM
3666 && !EXTRA_CONSTRAINT (operands[0], 'U'))
3668 rtx mem = gen_rtx_MEM (GET_MODE (operands[0]),
3669 copy_to_mode_reg (Pmode,
3670 XEXP (operands[0], 0)));
3671 MEM_COPY_ATTRIBUTES (mem, operands[0]);
3675 if (GET_CODE (operands[1]) == MEM
3676 && !EXTRA_CONSTRAINT (operands[1], 'U'))
3678 rtx mem = gen_rtx_MEM (GET_MODE (operands[1]),
3679 copy_to_mode_reg (Pmode,
3680 XEXP (operands[1], 0)));
3681 MEM_COPY_ATTRIBUTES (mem, operands[0]);
3687 /* Dest and src op must be register. */
3689 operands[1] = force_reg (QImode, operands[1]);
3691 rtx res = gen_reg_rtx (QImode);
3692 emit_insn (gen_rtx_SET (VOIDmode, res,
3693 gen_rtx (type, QImode, operands[1], operands[2])));
3694 emit_insn (gen_rtx_SET (VOIDmode, operands[0], res));
3699 /* Return nonzero if FUNC is an interrupt function as specified
3700 by the "interrupt" attribute. */
3703 h8300_interrupt_function_p (func)
3708 if (TREE_CODE (func) != FUNCTION_DECL)
3711 a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
3712 return a != NULL_TREE;
3715 /* Return nonzero if FUNC is an OS_Task function as specified
3716 by the "OS_Task" attribute. */
3719 h8300_os_task_function_p (func)
3724 if (TREE_CODE (func) != FUNCTION_DECL)
3727 a = lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func));
3728 return a != NULL_TREE;
3731 /* Return nonzero if FUNC is a monitor function as specified
3732 by the "monitor" attribute. */
3735 h8300_monitor_function_p (func)
3740 if (TREE_CODE (func) != FUNCTION_DECL)
3743 a = lookup_attribute ("monitor", DECL_ATTRIBUTES (func));
3744 return a != NULL_TREE;
3747 /* Return nonzero if FUNC is a function that should be called
3748 through the function vector. */
3751 h8300_funcvec_function_p (func)
3756 if (TREE_CODE (func) != FUNCTION_DECL)
3759 a = lookup_attribute ("function_vector", DECL_ATTRIBUTES (func));
3760 return a != NULL_TREE;
3763 /* Return nonzero if DECL is a variable that's in the eight bit
3767 h8300_eightbit_data_p (decl)
3772 if (TREE_CODE (decl) != VAR_DECL)
3775 a = lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl));
3776 return a != NULL_TREE;
3779 /* Return nonzero if DECL is a variable that's in the tiny
3783 h8300_tiny_data_p (decl)
3788 if (TREE_CODE (decl) != VAR_DECL)
3791 a = lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl));
3792 return a != NULL_TREE;
3795 /* Generate an 'interrupt_handler' attribute for decls. */
3798 h8300_insert_attributes (node, attributes)
3802 if (!pragma_interrupt
3803 || TREE_CODE (node) != FUNCTION_DECL)
3806 pragma_interrupt = 0;
3808 /* Add an 'interrupt_handler' attribute. */
3809 *attributes = tree_cons (get_identifier ("interrupt_handler"),
3813 /* Supported attributes:
3815 interrupt_handler: output a prologue and epilogue suitable for an
3818 function_vector: This function should be called through the
3821 eightbit_data: This variable lives in the 8-bit data area and can
3822 be referenced with 8-bit absolute memory addresses.
3824 tiny_data: This variable lives in the tiny data area and can be
3825 referenced with 16-bit absolute memory references. */
3827 const struct attribute_spec h8300_attribute_table[] =
3829 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
3830 { "interrupt_handler", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
3831 { "OS_Task", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
3832 { "monitor", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
3833 { "function_vector", 0, 0, true, false, false, h8300_handle_fndecl_attribute },
3834 { "eightbit_data", 0, 0, true, false, false, h8300_handle_eightbit_data_attribute },
3835 { "tiny_data", 0, 0, true, false, false, h8300_handle_tiny_data_attribute },
3836 { NULL, 0, 0, false, false, false, NULL }
3840 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
3841 struct attribute_spec.handler. */
3843 h8300_handle_fndecl_attribute (node, name, args, flags, no_add_attrs)
3846 tree args ATTRIBUTE_UNUSED;
3847 int flags ATTRIBUTE_UNUSED;
3850 if (TREE_CODE (*node) != FUNCTION_DECL)
3852 warning ("`%s' attribute only applies to functions",
3853 IDENTIFIER_POINTER (name));
3854 *no_add_attrs = true;
3860 /* Handle an "eightbit_data" attribute; arguments as in
3861 struct attribute_spec.handler. */
3863 h8300_handle_eightbit_data_attribute (node, name, args, flags, no_add_attrs)
3866 tree args ATTRIBUTE_UNUSED;
3867 int flags ATTRIBUTE_UNUSED;
3872 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
3874 DECL_SECTION_NAME (decl) = build_string (7, ".eight");
3878 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
3879 *no_add_attrs = true;
3885 /* Handle an "tiny_data" attribute; arguments as in
3886 struct attribute_spec.handler. */
3888 h8300_handle_tiny_data_attribute (node, name, args, flags, no_add_attrs)
3891 tree args ATTRIBUTE_UNUSED;
3892 int flags ATTRIBUTE_UNUSED;
3897 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
3899 DECL_SECTION_NAME (decl) = build_string (6, ".tiny");
3903 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
3904 *no_add_attrs = true;
3911 h8300_encode_label (decl)
3914 const char *str = XSTR (XEXP (DECL_RTL (decl), 0), 0);
3915 const int len = strlen (str);
3916 char *newstr = alloca (len + 2);
3919 strcpy (&newstr[1], str);
3921 XSTR (XEXP (DECL_RTL (decl), 0), 0) =
3922 ggc_alloc_string (newstr, len + 1);
3925 /* If we are referencing a function that is supposed to be called
3926 through the function vector, the SYMBOL_REF_FLAG in the rtl
3927 so the call patterns can generate the correct code. */
3930 h8300_encode_section_info (decl, first)
3934 if (TREE_CODE (decl) == FUNCTION_DECL
3935 && h8300_funcvec_function_p (decl))
3936 SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
3937 else if (TREE_CODE (decl) == VAR_DECL
3938 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
3940 if (h8300_eightbit_data_p (decl))
3941 SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
3942 else if (first && h8300_tiny_data_p (decl))
3943 h8300_encode_label (decl);
3947 /* Undo the effects of the above. */
3950 h8300_strip_name_encoding (str)
3953 return str + (*str == '*' || *str == '@' || *str == '&');
3957 output_simode_bld (bild, operands)
3963 /* Clear the destination register. */
3964 output_asm_insn ("sub.w\t%e0,%e0\n\tsub.w\t%f0,%f0", operands);
3966 /* Now output the bit load or bit inverse load, and store it in
3969 output_asm_insn ("bild\t%Z2,%Y1", operands);
3971 output_asm_insn ("bld\t%Z2,%Y1", operands);
3973 output_asm_insn ("bst\t#0,%w0", operands);
3977 /* Output the bit load or bit inverse load. */
3979 output_asm_insn ("bild\t%Z2,%Y1", operands);
3981 output_asm_insn ("bld\t%Z2,%Y1", operands);
3983 /* Clear the destination register and perform the bit store. */
3984 output_asm_insn ("xor.l\t%S0,%S0\n\tbst\t#0,%w0", operands);
3991 /* Given INSN and its current length LENGTH, return the adjustment
3992 (in bytes) to correctly compute INSN's length.
3994 We use this to get the lengths of various memory references correct. */
3997 h8300_adjust_insn_length (insn, length)
3999 int length ATTRIBUTE_UNUSED;
4001 rtx pat = PATTERN (insn);
4003 /* We must filter these out before calling get_attr_adjust_length. */
4004 if (GET_CODE (pat) == USE
4005 || GET_CODE (pat) == CLOBBER
4006 || GET_CODE (pat) == SEQUENCE
4007 || GET_CODE (pat) == ADDR_VEC
4008 || GET_CODE (pat) == ADDR_DIFF_VEC)
4011 if (get_attr_adjust_length (insn) == ADJUST_LENGTH_NO)
4014 /* Adjust length for reg->mem and mem->reg copies. */
4015 if (GET_CODE (pat) == SET
4016 && (GET_CODE (SET_SRC (pat)) == MEM
4017 || GET_CODE (SET_DEST (pat)) == MEM))
4019 /* This insn might need a length adjustment. */
4022 if (GET_CODE (SET_SRC (pat)) == MEM)
4023 addr = XEXP (SET_SRC (pat), 0);
4025 addr = XEXP (SET_DEST (pat), 0);
4029 /* On the H8/300, we subtract the difference between the
4030 actual length and the longest one, which is @(d:16,ERs). */
4032 /* @Rs is 2 bytes shorter than the longest. */
4033 if (GET_CODE (addr) == REG)
4036 /* @aa:8 is 2 bytes shorter than the longest. */
4037 if (GET_MODE (SET_SRC (pat)) == QImode
4038 && h8300_eightbit_constant_address_p (addr))
4043 /* On the H8/300H and H8S, we subtract the difference
4044 between the actual length and the longest one, which is
4047 /* @ERs is 6 bytes shorter than the longest. */
4048 if (GET_CODE (addr) == REG)
4051 /* @(d:16,ERs) is 6 bytes shorter than the longest. */
4052 if (GET_CODE (addr) == PLUS
4053 && GET_CODE (XEXP (addr, 0)) == REG
4054 && GET_CODE (XEXP (addr, 1)) == CONST_INT
4055 && INTVAL (XEXP (addr, 1)) > -32768
4056 && INTVAL (XEXP (addr, 1)) < 32767)
4059 /* @aa:8 is 6 bytes shorter than the longest. */
4060 if (GET_MODE (SET_SRC (pat)) == QImode
4061 && h8300_eightbit_constant_address_p (addr))
4064 /* @aa:16 is 4 bytes shorter than the longest. */
4065 if (h8300_tiny_constant_address_p (addr))
4068 /* @aa:24 is 2 bytes shorter than the longest. */
4069 if (GET_CODE (addr) == CONST_INT)
4074 /* Loading some constants needs adjustment. */
4075 if (GET_CODE (pat) == SET
4076 && GET_CODE (SET_SRC (pat)) == CONST_INT
4077 && GET_MODE (SET_DEST (pat)) == SImode
4078 && INTVAL (SET_SRC (pat)) != 0)
4080 int val = INTVAL (SET_SRC (pat));
4083 && ((val & 0xffff) == 0
4084 || ((val >> 16) & 0xffff) == 0))
4087 if (TARGET_H8300H || TARGET_H8300S)
4089 if (val == (val & 0xff)
4090 || val == (val & 0xff00))
4093 switch (val & 0xffffffff)
4109 /* Rotations need various adjustments. */
4110 if (GET_CODE (pat) == SET
4111 && (GET_CODE (SET_SRC (pat)) == ROTATE
4112 || GET_CODE (SET_SRC (pat)) == ROTATERT))
4114 rtx src = SET_SRC (pat);
4115 enum machine_mode mode = GET_MODE (src);
4119 if (GET_CODE (XEXP (src, 1)) != CONST_INT)
4122 amount = INTVAL (XEXP (src, 1));
4124 /* Clean up AMOUNT. */
4127 if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4128 amount = GET_MODE_BITSIZE (mode);
4130 /* Determine the faster direction. After this phase, amount
4131 will be at most a half of GET_MODE_BITSIZE (mode). */
4132 if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
4133 /* Flip the direction. */
4134 amount = GET_MODE_BITSIZE (mode) - amount;
4136 /* See if a byte swap (in HImode) or a word swap (in SImode) can
4137 boost up the rotation. */
4138 if ((mode == HImode && TARGET_H8300 && amount >= 5)
4139 || (mode == HImode && TARGET_H8300H && amount >= 6)
4140 || (mode == HImode && TARGET_H8300S && amount == 8)
4141 || (mode == SImode && TARGET_H8300H && amount >= 10)
4142 || (mode == SImode && TARGET_H8300S && amount >= 13))
4144 /* Adjust AMOUNT and flip the direction. */
4145 amount = GET_MODE_BITSIZE (mode) / 2 - amount;
4149 /* We use 2-bit rotations on the H8S. */
4151 amount = amount / 2 + amount % 2;
4153 /* The H8/300 uses three insns to rotate one bit, taking 6
4155 states += amount * ((TARGET_H8300 && mode == HImode) ? 6 : 2);
4157 return -(20 - states);
4163 #ifndef OBJECT_FORMAT_ELF
4165 h8300_asm_named_section (name, flags)
4167 unsigned int flags ATTRIBUTE_UNUSED;
4169 /* ??? Perhaps we should be using default_coff_asm_named_section. */
4170 fprintf (asm_out_file, "\t.section %s\n", name);
4172 #endif /* ! OBJECT_FORMAT_ELF */
4174 /* Nonzero if X is a constant address suitable as an 8-bit absolute,
4175 which is a special case of the 'R' operand. */
4178 h8300_eightbit_constant_address_p (x)
4181 /* The ranges of the 8-bit area. */
4182 const unsigned HOST_WIDE_INT n1 = trunc_int_for_mode (0xff00, HImode);
4183 const unsigned HOST_WIDE_INT n2 = trunc_int_for_mode (0xffff, HImode);
4184 const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00ffff00, SImode);
4185 const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00ffffff, SImode);
4186 const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0xffffff00, SImode);
4187 const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0xffffffff, SImode);
4189 unsigned HOST_WIDE_INT addr;
4191 /* We accept symbols declared with eightbit_data. */
4192 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FLAG (x))
4195 if (GET_CODE (x) != CONST_INT)
4201 || ((TARGET_H8300 || TARGET_NORMAL_MODE) && IN_RANGE (addr, n1, n2))
4202 || (TARGET_H8300H && IN_RANGE (addr, h1, h2))
4203 || (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
4206 /* Nonzero if X is a constant address suitable as an 16-bit absolute
4207 on H8/300H and H8S. */
4210 h8300_tiny_constant_address_p (x)
4213 /* The ranges of the 16-bit area. */
4214 const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00000000, SImode);
4215 const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00007fff, SImode);
4216 const unsigned HOST_WIDE_INT h3 = trunc_int_for_mode (0x00ff8000, SImode);
4217 const unsigned HOST_WIDE_INT h4 = trunc_int_for_mode (0x00ffffff, SImode);
4218 const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0x00000000, SImode);
4219 const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0x00007fff, SImode);
4220 const unsigned HOST_WIDE_INT s3 = trunc_int_for_mode (0xffff8000, SImode);
4221 const unsigned HOST_WIDE_INT s4 = trunc_int_for_mode (0xffffffff, SImode);
4223 unsigned HOST_WIDE_INT addr;
4225 /* We accept symbols declared with tiny_data. */
4226 if (GET_CODE (x) == SYMBOL_REF && TINY_DATA_NAME_P (XSTR (x, 0)))
4229 if (GET_CODE (x) != CONST_INT)
4235 || ((TARGET_H8300H && !TARGET_NORMAL_MODE)
4236 && (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
4237 || ((TARGET_H8300S && !TARGET_NORMAL_MODE)
4238 && (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));