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)
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, 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, 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"
47 #include "target-def.h"
49 /* Classifies a h8300_src_operand or h8300_dst_operand.
52 A constant operand of some sort.
58 A memory reference with a constant address.
61 A memory reference with a register as its address.
64 Some other kind of memory reference. */
65 enum h8300_operand_class
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
);
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. */
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. */
155 /* Symbols of the various shifts which can be used as indices. */
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] = {
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 */
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 */
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] = {
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 */
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 */
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] = {
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 */
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 */
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 */
305 /* Initialize various cpu specific globals at start up. */
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" };
316 cpu_type
= (int) CPU_H8300
;
317 h8_reg_names
= names_big
;
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
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
;
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
;
372 shift_alg_hi
[H8_S
][SHIFT_ASHIFTRT
][14] = SHIFT_LOOP
;
375 /* Work out a value for MOVE_RATIO. */
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;
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
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
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
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
442 h8300_reg_class_from_letter (int c
)
453 if (!flag_omit_frame_pointer
&& !reload_completed
)
455 if (frame_pointer_needed
&& reload_in_progress
)
457 return DESTINATION_REGS
;
460 /* The meaning of a constraint shouldn't change dynamically, so
461 we can't make this 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. */
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) \
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 \
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. */
513 h8300_emit_stack_adjustment (int sign
, unsigned int size
)
515 /* If the frame size is 0, we don't have anything to do. */
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. */
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
));
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
539 emit_insn (gen_addhi3 (stack_pointer_rtx
,
540 stack_pointer_rtx
, GEN_INT (sign
* size
)));
542 emit_insn (gen_addsi3 (stack_pointer_rtx
,
543 stack_pointer_rtx
, GEN_INT (sign
* size
)));
547 /* Round up frame size SIZE. */
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. */
560 compute_saved_regs (void)
562 unsigned int saved_regs
= 0;
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
);
579 /* Emit an insn to push register RN. */
584 rtx reg
= gen_rtx_REG (word_mode
, rn
);
588 x
= gen_push_h8300 (reg
);
589 else if (!TARGET_NORMAL_MODE
)
590 x
= gen_push_h8300hs_advanced (reg
);
592 x
= gen_push_h8300hs_normal (reg
);
594 REG_NOTES (x
) = gen_rtx_EXPR_LIST (REG_INC
, stack_pointer_rtx
, 0);
597 /* Emit an insn to pop register RN. */
602 rtx reg
= gen_rtx_REG (word_mode
, rn
);
606 x
= gen_pop_h8300 (reg
);
607 else if (!TARGET_NORMAL_MODE
)
608 x
= gen_pop_h8300hs_advanced (reg
);
610 x
= gen_pop_h8300hs_normal (reg
);
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:
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)))] */
632 h8300_push_pop (int regno
, int nregs
, int pop_p
, int return_p
)
638 /* See whether we can use a simple push or pop. */
639 if (!return_p
&& nregs
== 1)
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
;
654 /* Add the return instruction. */
657 RTVEC_ELT (vec
, i
) = gen_rtx_RETURN (VOIDmode
);
661 /* Add the register moves. */
662 for (j
= 0; j
< nregs
; j
++)
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));
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. */
693 h8300_stack_offset_p (rtx x
, int offset
)
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,
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. */
715 h8300_ldm_stm_regno (rtx x
, int load_p
, int index
, int nregs
)
717 int regindex
, memindex
, offset
;
720 regindex
= 0, memindex
= 1, offset
= (nregs
- index
- 1) * 4;
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
));
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
)
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)
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)
756 /* 2-register h8s instructions must start with an even-numbered register.
757 3- and 4-register instructions must start with er0 or er4. */
760 if ((regno
& 1) != 0)
762 if (nregs
> 2 && (regno
& 3) != 0)
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
)
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:
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:
795 <saved registers> <- sp
798 /* Generate RTL code for the function prologue. */
801 h8300_expand_prologue (void)
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
))
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
816 emit_insn (gen_monitor_prologue ());
818 if (frame_pointer_needed
)
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
)
830 if (saved_regs
& (1 << regno
))
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)
839 else if ((!TARGET_H8300SX
|| (regno
& 3) == 0)
840 && ((saved_regs
>> regno
) & 0x07) == 0x07)
843 else if ((!TARGET_H8300SX
|| (regno
& 1) == 0)
844 && ((saved_regs
>> regno
) & 0x03) == 0x03)
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
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. */
871 h8300_expand_epilogue (void)
876 HOST_WIDE_INT frame_size
;
879 if (h8300_os_task_function_p (current_function_decl
))
880 /* OS_Task epilogues are nearly naked -- they just have an
884 frame_size
= round_frame_size (get_frame_size ());
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
)
895 if (saved_regs
& (1 << regno
))
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)
904 else if ((TARGET_H8300SX
|| (regno
& 3) == 2)
905 && ((saved_regs
<< 2 >> regno
) & 0x07) == 0x07)
908 else if ((TARGET_H8300SX
|| (regno
& 1) == 1)
909 && ((saved_regs
<< 1 >> regno
) & 0x03) == 0x03)
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. */
916 && !frame_pointer_needed
918 && (saved_regs
& ((1 << (regno
- n_regs
+ 1)) - 1)) == 0)
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
)
930 h8300_push_pop (HARD_FRAME_POINTER_REGNUM
, 1, 1, returned_p
);
934 emit_insn (gen_rtx_RETURN (VOIDmode
));
937 /* Return nonzero if the current function is an interrupt
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. */
950 h8300_file_start (void)
952 default_file_start ();
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. */
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. */
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
995 gen_add
= gen_addhi3
;
999 gen_add
= gen_addsi3
;
1006 /* Try different amounts in descending order. */
1007 for (amount
= (TARGET_H8300H
|| TARGET_H8300S
) ? 4 : 2;
1011 for (; val
>= amount
; val
-= amount
)
1012 emit_insn (gen_add (reg
, reg
, GEN_INT (sign
* amount
)));
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. */
1029 h8300_pr_interrupt (struct cpp_reader
*pfile ATTRIBUTE_UNUSED
)
1031 pragma_interrupt
= 1;
1035 h8300_pr_saveall (struct cpp_reader
*pfile ATTRIBUTE_UNUSED
)
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
[] = {
1068 rtx result
= NULL_RTX
;
1072 /* Never pass unnamed arguments in registers. */
1076 /* Pass 3 regs worth of data in regs when user asked on the command line. */
1077 if (TARGET_QUICKCALL
)
1080 /* If calling hand written assembler, use 4 regs of args. */
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
++)
1099 if (mode
== BLKmode
)
1100 size
= int_size_in_bytes (type
);
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
);
1112 /* Compute the cost of an and insn. */
1115 h8300_and_costs (rtx x
)
1119 if (GET_MODE (x
) == QImode
)
1122 if (GET_MODE (x
) != HImode
1123 && GET_MODE (x
) != SImode
)
1127 operands
[1] = XEXP (x
, 0);
1128 operands
[2] = XEXP (x
, 1);
1130 return compute_logical_op_length (GET_MODE (x
), operands
) / 2;
1133 /* Compute the cost of a shift insn. */
1136 h8300_shift_costs (rtx x
)
1140 if (GET_MODE (x
) != QImode
1141 && GET_MODE (x
) != HImode
1142 && GET_MODE (x
) != SImode
)
1147 operands
[2] = XEXP (x
, 1);
1149 return compute_a_shift_length (NULL
, operands
) / 2;
1152 /* Worker function for TARGET_RTX_COSTS. */
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
1161 if (register_operand (x
, VOIDmode
)
1162 || GET_CODE (x
) == POST_INC
1163 || GET_CODE (x
) == POST_DEC
1167 *total
= COSTS_N_INSNS (1);
1175 HOST_WIDE_INT n
= INTVAL (x
);
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. */
1186 if (-4 <= n
|| n
<= 4)
1197 *total
= 0 + (outer_code
== SET
);
1201 if (TARGET_H8300H
|| TARGET_H8300S
)
1202 *total
= 0 + (outer_code
== SET
);
1217 /* See comment for CONST_INT. */
1229 if (!h8300_dst_operand (XEXP (x
, 0), VOIDmode
)
1230 || !h8300_src_operand (XEXP (x
, 1), VOIDmode
))
1232 *total
= COSTS_N_INSNS (h8300_and_costs (x
));
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. */
1242 switch (GET_MODE (x
))
1246 *total
= COSTS_N_INSNS (optimize_size
? 4 : 10);
1250 *total
= COSTS_N_INSNS (optimize_size
? 4 : 18);
1256 *total
= COSTS_N_INSNS (12);
1261 switch (GET_MODE (x
))
1265 *total
= COSTS_N_INSNS (2);
1269 *total
= COSTS_N_INSNS (5);
1275 *total
= COSTS_N_INSNS (4);
1281 if (h8sx_binary_shift_operator (x
, VOIDmode
))
1283 *total
= COSTS_N_INSNS (2);
1286 else if (h8sx_unary_shift_operator (x
, VOIDmode
))
1288 *total
= COSTS_N_INSNS (1);
1291 *total
= COSTS_N_INSNS (h8300_shift_costs (x
));
1296 if (GET_MODE (x
) == HImode
)
1303 *total
= COSTS_N_INSNS (1);
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
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.
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. */
1343 cond_string (enum rtx_code code
)
1372 /* Print operand X using operand code CODE to assembly language output file
1376 print_operand (FILE *file
, rtx x
, int code
)
1378 /* This is used for communication between codes V,W,Z and Y. */
1384 switch (GET_CODE (x
))
1387 fprintf (file
, "%sl", names_big
[REGNO (x
)]);
1390 fprintf (file
, "#%ld", (-INTVAL (x
)) & 0xff);
1397 switch (GET_CODE (x
))
1400 fprintf (file
, "%sh", names_big
[REGNO (x
)]);
1403 fprintf (file
, "#%ld", ((-INTVAL (x
)) & 0xff00) >> 8);
1410 gcc_assert (GET_CODE (x
) == CONST_INT
);
1411 fprintf (file
, "#%ld", 0xff & (-INTVAL (x
)));
1414 if (GET_CODE (x
) == REG
)
1415 fprintf (file
, "%s", names_extended
[REGNO (x
)]);
1420 if (GET_CODE (x
) == REG
)
1421 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1426 bitint
= exact_log2 (INTVAL (x
) & 0xff);
1427 gcc_assert (bitint
>= 0);
1428 fprintf (file
, "#%d", bitint
);
1431 bitint
= exact_log2 ((~INTVAL (x
)) & 0xff);
1432 gcc_assert (bitint
>= 0);
1433 fprintf (file
, "#%d", bitint
);
1437 if (GET_CODE (x
) == REG
)
1438 fprintf (file
, "%s", byte_reg (x
, 0));
1443 gcc_assert (bitint
>= 0);
1444 if (GET_CODE (x
) == REG
)
1445 fprintf (file
, "%s%c", names_big
[REGNO (x
)], bitint
> 7 ? 'h' : 'l');
1447 print_operand (file
, x
, 'R');
1451 bitint
= INTVAL (x
);
1452 fprintf (file
, "#%d", bitint
& 7);
1455 switch (GET_CODE (x
))
1458 fprintf (file
, "or");
1461 fprintf (file
, "xor");
1464 fprintf (file
, "and");
1471 switch (GET_CODE (x
))
1475 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1477 fprintf (file
, "%s", names_upper_extended
[REGNO (x
)]);
1480 print_operand (file
, x
, 0);
1483 fprintf (file
, "#%ld", ((INTVAL (x
) >> 16) & 0xffff));
1489 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1490 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1491 fprintf (file
, "#%ld", ((val
>> 16) & 0xffff));
1500 switch (GET_CODE (x
))
1504 fprintf (file
, "%s", names_big
[REGNO (x
) + 1]);
1506 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1509 x
= adjust_address (x
, HImode
, 2);
1510 print_operand (file
, x
, 0);
1513 fprintf (file
, "#%ld", INTVAL (x
) & 0xffff);
1519 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1520 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1521 fprintf (file
, "#%ld", (val
& 0xffff));
1529 fputs (cond_string (GET_CODE (x
)), file
);
1532 fputs (cond_string (reverse_condition (GET_CODE (x
))), file
);
1535 gcc_assert (GET_CODE (x
) == CONST_INT
);
1555 print_operand_address (file
, x
);
1558 if (GET_CODE (x
) == CONST_INT
)
1559 fprintf (file
, "#%ld", (INTVAL (x
)) & 0xff);
1561 fprintf (file
, "%s", byte_reg (x
, 0));
1564 if (GET_CODE (x
) == CONST_INT
)
1565 fprintf (file
, "#%ld", (INTVAL (x
) >> 8) & 0xff);
1567 fprintf (file
, "%s", byte_reg (x
, 1));
1570 if (GET_CODE (x
) == CONST_INT
)
1571 fprintf (file
, "#%ld", INTVAL (x
) & 0xff);
1573 fprintf (file
, "%s",
1574 byte_reg (x
, TARGET_H8300
? 2 : 0));
1577 if (GET_CODE (x
) == CONST_INT
)
1578 fprintf (file
, "#%ld", (INTVAL (x
) >> 8) & 0xff);
1580 fprintf (file
, "%s",
1581 byte_reg (x
, TARGET_H8300
? 3 : 1));
1584 if (GET_CODE (x
) == CONST_INT
)
1585 fprintf (file
, "#%ld", (INTVAL (x
) >> 16) & 0xff);
1587 fprintf (file
, "%s", byte_reg (x
, 0));
1590 if (GET_CODE (x
) == CONST_INT
)
1591 fprintf (file
, "#%ld", (INTVAL (x
) >> 24) & 0xff);
1593 fprintf (file
, "%s", byte_reg (x
, 1));
1598 switch (GET_CODE (x
))
1601 switch (GET_MODE (x
))
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
)]);
1611 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1615 fprintf (file
, "%s", names_extended
[REGNO (x
)]);
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
))
1641 /* Used for mov.b and bit operations. */
1642 if (h8300_eightbit_constant_address_p (addr
))
1644 fprintf (file
, ":8");
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. */
1656 if (h8300_constant_length (addr
) == 2)
1657 fprintf (file
, ":16");
1659 fprintf (file
, ":32");
1671 fprintf (file
, "#");
1672 print_operand_address (file
, x
);
1678 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1679 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1680 fprintf (file
, "#%ld", val
);
1689 /* Output assembly language output for the address ADDR to FILE. */
1692 print_operand_address (FILE *file
, rtx addr
)
1697 switch (GET_CODE (addr
))
1700 fprintf (file
, "%s", h8_reg_names
[REGNO (addr
)]);
1704 fprintf (file
, "-%s", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1708 fprintf (file
, "%s+", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1712 fprintf (file
, "+%s", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1716 fprintf (file
, "%s-", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1720 fprintf (file
, "(");
1722 index
= h8300_get_index (XEXP (addr
, 0), VOIDmode
, &size
);
1723 if (GET_CODE (index
) == REG
)
1726 print_operand_address (file
, XEXP (addr
, 1));
1727 fprintf (file
, ",");
1731 print_operand_address (file
, index
);
1735 print_operand (file
, index
, 'X');
1740 print_operand (file
, index
, 'T');
1745 print_operand (file
, index
, 'S');
1749 /* print_operand_address (file, XEXP (addr, 0)); */
1754 print_operand_address (file
, XEXP (addr
, 0));
1755 fprintf (file
, "+");
1756 print_operand_address (file
, XEXP (addr
, 1));
1758 fprintf (file
, ")");
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
);
1770 n
= (int) (short) n
;
1771 fprintf (file
, "%d", n
);
1776 output_addr_const (file
, addr
);
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
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
);
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 ());
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
;
1854 case HARD_FRAME_POINTER_REGNUM
:
1857 case ARG_POINTER_REGNUM
:
1858 return pc_size
+ fp_size
;
1859 case RETURN_ADDRESS_POINTER_REGNUM
:
1861 case FRAME_POINTER_REGNUM
:
1862 return -saved_regs_size
;
1867 case STACK_POINTER_REGNUM
:
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
:
1886 /* Worker function for RETURN_ADDR_RTX. */
1889 h8300_return_addr_rtx (int count
, rtx frame
)
1894 ret
= gen_rtx_MEM (Pmode
,
1895 gen_rtx_REG (Pmode
, RETURN_ADDRESS_POINTER_REGNUM
));
1896 else if (flag_omit_frame_pointer
)
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 ());
1906 /* Update the condition code from the insn. */
1909 notice_update_cc (rtx body
, rtx insn
)
1913 switch (get_attr_cc (insn
))
1916 /* Insn does not affect CC at all. */
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;
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. */
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
);
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. */
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
1953 if (GET_CODE (SET_DEST (set
)) == STRICT_LOW_PART
)
1954 cc_status
.value2
= XEXP (SET_DEST (set
), 0);
1956 cc_status
.value2
= SET_DEST (set
);
1961 /* The insn is a compare instruction. */
1963 cc_status
.value1
= SET_SRC (body
);
1967 /* Insn doesn't leave CC in a usable state. */
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:
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
)
1997 factor
= (mode
== VOIDmode
? 0 : GET_MODE_SIZE (mode
));
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)));
2013 /* We're looking for addresses of the form:
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. */
2026 if (GET_CODE (x
) == AND
2027 && GET_CODE (XEXP (x
, 1)) == CONST_INT
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);
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);
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. */
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))
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
))
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
2133 h8300_displacement_length (rtx addr
, int size
)
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))
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. */
2155 h8300_classify_operand (rtx op
, int size
, enum h8300_operand_class
*class)
2157 enum h8300_operand_class dummy
;
2162 if (CONSTANT_P (op
))
2164 *class = H8OP_IMMEDIATE
;
2166 /* Byte-sized immediates are stored in the opcode fields. */
2170 /* If this is a 32-bit instruction, see whether the constant
2171 will fit into a 16-bit immediate field. */
2174 && GET_CODE (op
) == CONST_INT
2175 && IN_RANGE (INTVAL (op
), 0, 0xffff))
2180 else if (GET_CODE (op
) == MEM
)
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
;
2198 else if (register_operand (op
, VOIDmode
))
2200 *class = H8OP_MEM_BASE
;
2204 gcc_assert (register_operand (op
, VOIDmode
));
2205 *class = H8OP_REGISTER
;
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. */
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. */
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);
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;
2255 /* Likewise short immediate instructions such as add.w #xx:3,OP. */
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);
2272 case H8OP_MEM_ABSOLUTE
:
2273 case H8OP_MEM_COMPLEX
:
2274 return 4 + operand_length
;
2281 /* Likewise bitfield load and store instructions. */
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
)
2291 gcc_assert (GET_CODE (op
) != REG
);
2293 size
= GET_MODE_SIZE (GET_MODE (op
));
2294 operand_length
= h8300_classify_operand (op
, size
, &class);
2299 case H8OP_MEM_ABSOLUTE
:
2300 case H8OP_MEM_COMPLEX
:
2301 return 4 + operand_length
;
2308 /* Calculate the length of general binary instruction INSN using TABLE. */
2311 h8300_binary_length (rtx insn
, const h8300_length_table
*table
)
2315 set
= single_set (insn
);
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
);
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),
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. */
2335 h8300_short_move_mem_p (rtx op
, enum rtx_code inc_code
)
2340 if (GET_CODE (op
) != MEM
)
2343 addr
= XEXP (op
, 0);
2344 size
= GET_MODE_SIZE (GET_MODE (op
));
2345 if (size
!= 1 && size
!= 2)
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:
2363 are two bytes shorter than most other "mov Rs, @complex" or
2364 "mov @complex,Rd" combinations. */
2367 h8300_move_length (rtx
*operands
, const h8300_length_table
*table
)
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
))
2374 if (REG_P (operands
[1]) && h8300_short_move_mem_p (operands
[0], PRE_DEC
))
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. */
2384 h8300_mova_length (rtx dest
, rtx src
, rtx offset
)
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
))
2396 /* Compute the length of INSN based on its length_table attribute.
2397 OPERANDS is the array of its operands. */
2400 h8300_insn_length_from_table (rtx insn
, rtx
* operands
)
2402 switch (get_attr_length_table (insn
))
2404 case LENGTH_TABLE_NONE
:
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;
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. */
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
))
2484 /* Return true if OPERANDS[1] can be mapped to the same assembly
2485 operand as OPERANDS[0]. */
2488 h8300_operands_match_p (rtx
*operands
)
2490 if (register_operand (operands
[0], VOIDmode
)
2491 && register_operand (operands
[1], VOIDmode
))
2494 if (h8sx_mergeable_memrefs_p (operands
[0], operands
[1]))
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
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. */
2532 h8sx_emit_movmd (rtx dest
, rtx src
, rtx length
,
2533 HOST_WIDE_INT alignment
)
2535 if (!flag_omit_frame_pointer
&& optimize_size
)
2538 if (GET_CODE (length
) == CONST_INT
)
2540 rtx dest_reg
, src_reg
, first_dest
, first_src
;
2544 /* Use movmd.l if the alignment allows it, otherwise fall back
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)
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. */
2584 emit_move_insn (adjust_address (dest
, HImode
, 0),
2585 adjust_address (src
, HImode
, 0));
2587 emit_move_insn (adjust_address (dest
, QImode
, n
& 2),
2588 adjust_address (src
, QImode
, n
& 2));
2595 /* Move ADDR into er6 after pushing its old value onto the stack. */
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
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. */
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];
2633 if (GET_CODE (src
) == MEM
)
2634 addr
= XEXP (src
, 0);
2635 else if (GET_CODE (dest
) == MEM
)
2636 addr
= XEXP (dest
, 0);
2642 unsigned int base_length
;
2647 if (addr
== NULL_RTX
)
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
))
2659 if (addr
== NULL_RTX
)
2664 if (src
== const0_rtx
)
2674 if (addr
== NULL_RTX
)
2679 if (GET_CODE (src
) == CONST_INT
)
2681 if (src
== const0_rtx
)
2684 if ((INTVAL (src
) & 0xffff) == 0)
2687 if ((INTVAL (src
) & 0xffff) == 0)
2690 if ((INTVAL (src
) & 0xffff)
2691 == ((INTVAL (src
) >> 16) & 0xffff))
2701 if (addr
== NULL_RTX
)
2706 if (CONST_DOUBLE_OK_FOR_LETTER_P (src
, 'G'))
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;
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
2741 if (GET_CODE (addr
) == REG
)
2742 return base_length
- 2;
2748 unsigned int base_length
;
2753 if (addr
== NULL_RTX
)
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
))
2765 if (addr
== NULL_RTX
)
2770 if (src
== const0_rtx
)
2780 if (addr
== NULL_RTX
)
2784 if (REGNO (src
) == MAC_REG
|| REGNO (dest
) == MAC_REG
)
2790 if (GET_CODE (src
) == CONST_INT
)
2792 int val
= INTVAL (src
);
2797 if (val
== (val
& 0x00ff) || val
== (val
& 0xff00))
2800 switch (val
& 0xffffffff)
2821 if (addr
== NULL_RTX
)
2826 if (CONST_DOUBLE_OK_FOR_LETTER_P (src
, 'G'))
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
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;
2873 /* Output an addition insn. */
2876 output_plussi (rtx
*operands
)
2878 enum machine_mode mode
= GET_MODE (operands
[0]);
2880 gcc_assert (mode
== SImode
);
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";
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)
2920 return "adds\t%2,%S0";
2925 return "subs\t%G2,%S0";
2929 operands
[2] = GEN_INT (intval
>> 16);
2930 return "inc.w\t%2,%e0";
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. */
2960 compute_plussi_length (rtx
*operands
)
2962 enum machine_mode mode
= GET_MODE (operands
[0]);
2964 gcc_assert (mode
== SImode
);
2968 if (GET_CODE (operands
[2]) == REG
)
2971 if (GET_CODE (operands
[2]) == CONST_INT
)
2973 HOST_WIDE_INT n
= INTVAL (operands
[2]);
2975 if ((n
& 0xffffff) == 0)
2977 if ((n
& 0xffff) == 0)
2979 if ((n
& 0xff) == 0)
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))
2994 if (TARGET_H8300SX
&& (intval
>= -7 && intval
<= -1))
2997 /* See if we can finish with 2 bytes. */
2999 switch ((unsigned int) intval
& 0xffffffff)
3020 /* See if we can finish with 4 bytes. */
3021 if ((intval
& 0xffff) == 0)
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
);
3030 return h8300_length_from_table (operands
[0], operands
[2],
3031 &addl_length_table
);
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
);
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))
3058 if (TARGET_H8300SX
&& (intval
>= -7 && intval
<= -1))
3061 /* See if we can finish with 2 bytes. */
3063 switch ((unsigned int) intval
& 0xffffffff)
3068 return CC_NONE_0HIT
;
3073 return CC_NONE_0HIT
;
3084 /* See if we can finish with 4 bytes. */
3085 if ((intval
& 0xffff) == 0)
3093 /* Output a logical insn. */
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. */
3143 /* First, see if we can finish with one insn. */
3144 if ((TARGET_H8300H
|| TARGET_H8300S
)
3148 sprintf (insn_buf
, "%s.w\t%%T2,%%T0", opname
);
3149 output_asm_insn (insn_buf
, operands
);
3153 /* Take care of the lower byte. */
3156 sprintf (insn_buf
, "%s\t%%s2,%%s0", opname
);
3157 output_asm_insn (insn_buf
, operands
);
3159 /* Take care of the upper byte. */
3162 sprintf (insn_buf
, "%s\t%%t2,%%t0", opname
);
3163 output_asm_insn (insn_buf
, operands
);
3168 if (TARGET_H8300H
|| TARGET_H8300S
)
3170 /* Determine if the lower half can be taken care of in no more
3172 lower_half_easy_p
= (b0
== 0
3174 || (code
!= IOR
&& w0
== 0xffff));
3176 /* Determine if the upper half can be taken care of in no more
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
);
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. */
3202 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3203 output_asm_insn ((code
== AND
)
3204 ? "sub.w\t%f0,%f0" : "not.w\t%f0",
3206 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3210 sprintf (insn_buf
, "%s.w\t%%f2,%%f0", opname
);
3211 output_asm_insn (insn_buf
, operands
);
3217 sprintf (insn_buf
, "%s\t%%w2,%%w0", opname
);
3218 output_asm_insn (insn_buf
, operands
);
3222 sprintf (insn_buf
, "%s\t%%x2,%%x0", opname
);
3223 output_asm_insn (insn_buf
, operands
);
3228 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3229 output_asm_insn ((code
== AND
)
3230 ? "sub.w\t%e0,%e0" : "not.w\t%e0",
3232 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3235 && (w0
& 0x8000) != 0)
3237 output_asm_insn ("exts.l\t%S0", operands
);
3239 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3243 output_asm_insn ("extu.w\t%e0", operands
);
3245 else if (TARGET_H8300H
|| TARGET_H8300S
)
3249 sprintf (insn_buf
, "%s.w\t%%e2,%%e0", opname
);
3250 output_asm_insn (insn_buf
, operands
);
3257 sprintf (insn_buf
, "%s\t%%y2,%%y0", opname
);
3258 output_asm_insn (insn_buf
, operands
);
3262 sprintf (insn_buf
, "%s\t%%z2,%%z0", opname
);
3263 output_asm_insn (insn_buf
, operands
);
3274 /* Compute the length of a logical insn. */
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;
3303 unsigned int length
= 0;
3308 /* First, see if we can finish with one insn. */
3309 if ((TARGET_H8300H
|| TARGET_H8300S
)
3313 length
= h8300_length_from_table (operands
[1], operands
[2],
3314 &logicw_length_table
);
3318 /* Take care of the lower byte. */
3322 /* Take care of the upper byte. */
3328 if (TARGET_H8300H
|| TARGET_H8300S
)
3330 /* Determine if the lower half can be taken care of in no more
3332 lower_half_easy_p
= (b0
== 0
3334 || (code
!= IOR
&& w0
== 0xffff));
3336 /* Determine if the upper half can be taken care of in no more
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
);
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. */
3362 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3366 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3382 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3386 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3389 && (w0
& 0x8000) != 0)
3393 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3399 else if (TARGET_H8300H
|| TARGET_H8300S
)
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
;
3452 /* First, see if we can finish with one insn. */
3453 if ((TARGET_H8300H
|| TARGET_H8300S
)
3461 if (TARGET_H8300H
|| TARGET_H8300S
)
3463 /* Determine if the lower half can be taken care of in no more
3465 lower_half_easy_p
= (b0
== 0
3467 || (code
!= IOR
&& w0
== 0xffff));
3469 /* Determine if the upper half can be taken care of in no more
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
))
3487 if ((TARGET_H8300H
|| TARGET_H8300S
)
3490 && (w0
& 0x8000) != 0)
3502 /* Expand a conditional branch. */
3505 h8300_expand_branch (enum rtx_code code
, rtx label
)
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
),
3513 emit_jump_insn (gen_rtx_SET (VOIDmode
, pc_rtx
, tmp
));
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
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
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
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
;
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
;
3579 if (op
== const1_rtx
|| op
== const2_rtx
)
3580 return H8SX_SHIFT_UNARY
;
3581 return H8SX_SHIFT_NONE
;
3584 if (GET_CODE (op
) == CONST_INT
3585 && (INTVAL (op
) == 1
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
;
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. */
3604 output_h8sx_shift (rtx
*operands
, int suffix
, int optype
)
3606 static char buffer
[16];
3609 switch (GET_CODE (operands
[3]))
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]));
3637 if (operands
[2] == const1_rtx
)
3638 sprintf (buffer
, "%s.%c\t%%%c0", stem
, suffix
, optype
);
3640 sprintf (buffer
, "%s.%c\t%%X2,%%%c0", stem
, suffix
, optype
);
3644 /* Emit code to do shifts. */
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]);
3655 case H8SX_SHIFT_UNARY
:
3658 case H8SX_SHIFT_NONE
:
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
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
)))));
3678 /* Symbols of the various modes which can be used as indices. */
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). */
3691 const char *const assembler
;
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] =
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
}
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] =
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] =
3779 "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
3782 /* SHIFT_LSHIFTRT */
3785 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3788 /* SHIFT_ASHIFTRT */
3791 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3803 /* SHIFT_LSHIFTRT */
3809 /* SHIFT_ASHIFTRT */
3818 static const char *const rotate_two
[3][3] =
3826 /* SHIFT_LSHIFTRT */
3832 /* SHIFT_ASHIFTRT */
3841 /* Shift algorithm. */
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. */
3855 /* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
3856 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3859 /* CC status for SHIFT_INLINE. */
3862 /* CC status for SHIFT_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. */
3883 get_shift_alg (enum shift_type shift_type
, enum shift_mode shift_mode
,
3884 unsigned int count
, struct shift_info
*info
)
3888 /* Find the target CPU. */
3891 else if (TARGET_H8300H
)
3896 /* Find the shift algorithm. */
3897 info
->alg
= SHIFT_LOOP
;
3901 if (count
< GET_MODE_BITSIZE (QImode
))
3902 info
->alg
= shift_alg_qi
[cpu
][shift_type
][count
];
3906 if (count
< GET_MODE_BITSIZE (HImode
))
3907 info
->alg
= shift_alg_hi
[cpu
][shift_type
][count
];
3911 if (count
< GET_MODE_BITSIZE (SImode
))
3912 info
->alg
= shift_alg_si
[cpu
][shift_type
][count
];
3919 /* Fill in INFO. Return unless we have SHIFT_SPECIAL. */
3923 info
->remainder
= count
;
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
;
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
;
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
;
3949 /* Here we only deal with SHIFT_SPECIAL. */
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";
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";
3968 info
->special
= "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
3970 case SHIFT_LSHIFTRT
:
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";
3974 info
->special
= "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
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";
3981 else if ((8 <= count
&& count
<= 13)
3982 || (TARGET_H8300S
&& count
== 14))
3984 info
->remainder
= count
- 8;
3989 info
->special
= "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
3991 case SHIFT_LSHIFTRT
:
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
;
4000 info
->special
= "mov.b\t%t0,%s0\n\textu.w\t%T0";
4001 info
->cc_special
= CC_SET_ZNV
;
4004 case SHIFT_ASHIFTRT
:
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";
4012 info
->special
= "mov.b\t%t0,%s0\n\texts.w\t%T0";
4013 info
->cc_special
= CC_SET_ZNV
;
4018 else if (count
== 14)
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";
4026 case SHIFT_LSHIFTRT
:
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";
4030 case SHIFT_ASHIFTRT
:
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 */
4043 else if (count
== 15)
4048 info
->special
= "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
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";
4053 case SHIFT_ASHIFTRT
:
4054 info
->special
= "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
4061 if (TARGET_H8300
&& 8 <= count
&& count
<= 9)
4063 info
->remainder
= count
- 8;
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";
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";
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";
4079 else if (count
== 8 && !TARGET_H8300
)
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";
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";
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";
4094 else if (count
== 15 && TARGET_H8300
)
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";
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";
4108 else if (count
== 15 && !TARGET_H8300
)
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
;
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
;
4120 case SHIFT_ASHIFTRT
:
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;
4133 info
->special
= "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
4135 info
->shift1
= "add.w\t%e0,%e0";
4137 case SHIFT_LSHIFTRT
:
4140 info
->special
= "mov.w\t%e0,%f0\n\tsub.w\t%e0,%e0";
4141 info
->shift1
= "shlr\t%x0\n\trotxr\t%w0";
4145 info
->special
= "mov.w\t%e0,%f0\n\textu.l\t%S0";
4146 info
->cc_special
= CC_SET_ZNV
;
4149 case SHIFT_ASHIFTRT
:
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";
4157 info
->special
= "mov.w\t%e0,%f0\n\texts.l\t%S0";
4158 info
->cc_special
= CC_SET_ZNV
;
4163 else if (TARGET_H8300
&& 24 <= count
&& count
<= 28)
4165 info
->remainder
= count
- 24;
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
;
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
;
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
;
4186 else if ((TARGET_H8300H
&& count
== 24)
4187 || (TARGET_H8300S
&& 24 <= count
&& count
<= 25))
4189 info
->remainder
= count
- 24;
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";
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
;
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
;
4206 else if (!TARGET_H8300
&& count
== 28)
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";
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";
4216 case SHIFT_LSHIFTRT
:
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
;
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";
4225 case SHIFT_ASHIFTRT
:
4229 else if (!TARGET_H8300
&& count
== 29)
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";
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";
4239 case SHIFT_LSHIFTRT
:
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
;
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
;
4251 case SHIFT_ASHIFTRT
:
4255 else if (!TARGET_H8300
&& count
== 30)
4261 info
->special
= "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4263 info
->special
= "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
4265 case SHIFT_LSHIFTRT
:
4267 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4269 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4271 case SHIFT_ASHIFTRT
:
4275 else if (count
== 31)
4282 info
->special
= "sub.w\t%e0,%e0\n\tshlr\t%w0\n\tmov.w\t%e0,%f0\n\trotxr\t%z0";
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";
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";
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
;
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
;
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
;
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
)
4331 if (GET_MODE_BITSIZE (mode
) <= count
)
4334 /* Find out the target CPU. */
4337 else if (TARGET_H8300H
)
4342 /* Find the shift algorithm. */
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
];
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
];
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
];
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. */
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
;
4391 shift_mode
= QIshift
;
4394 shift_mode
= HIshift
;
4397 shift_mode
= SIshift
;
4406 shift_type
= SHIFT_ASHIFTRT
;
4409 shift_type
= SHIFT_LSHIFTRT
;
4412 shift_type
= SHIFT_ASHIFT
;
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. */
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
);
4438 output_asm_insn (info
.special
, operands
);
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. */
4453 output_asm_insn (info
.shift1
, operands
);
4458 int m
= GET_MODE_BITSIZE (mode
) - n
;
4459 const int mask
= (shift_type
== SHIFT_ASHIFT
4460 ? ((1 << m
) - 1) << n
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. */
4477 output_asm_insn (info
.shift1
, operands
);
4479 /* Now mask off the high bits. */
4483 sprintf (insn_buf
, "and\t#%d,%%X0", mask
);
4487 gcc_assert (TARGET_H8300H
|| TARGET_H8300S
);
4488 sprintf (insn_buf
, "and.w\t#%d,%%T0", mask
);
4495 output_asm_insn (insn_buf
, operands
);
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
);
4511 output_asm_insn (info
.shift1
, operands
);
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
);
4529 /* Count the number of assembly instructions in a string TEMPLATE. */
4532 h8300_asm_insn_count (const char *template)
4534 unsigned int count
= 1;
4536 for (; *template; template++)
4537 if (*template == '\n')
4543 /* Compute the length of a shift insn. */
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;
4559 shift_mode
= QIshift
;
4562 shift_mode
= HIshift
;
4565 shift_mode
= SIshift
;
4574 shift_type
= SHIFT_ASHIFTRT
;
4577 shift_type
= SHIFT_LSHIFTRT
;
4580 shift_type
= SHIFT_ASHIFT
;
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;
4595 int n
= INTVAL (operands
[2]);
4597 /* If the count is negative, make it 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
);
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
)
4625 if (info
.shift2
!= NULL
)
4627 wlength
+= h8300_asm_insn_count (info
.shift2
) * (n
/ 2);
4631 wlength
+= h8300_asm_insn_count (info
.shift1
) * n
;
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);
4649 wlength
+= h8300_asm_insn_count (info
.shift1
) * m
;
4651 /* Now mask off the high bits. */
4661 gcc_assert (!TARGET_H8300
);
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
);
4677 wlength
+= h8300_asm_insn_count (info
.shift1
);
4681 wlength
+= 3 + h8300_asm_insn_count (info
.shift1
);
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
;
4707 shift_mode
= QIshift
;
4710 shift_mode
= HIshift
;
4713 shift_mode
= SIshift
;
4722 shift_type
= SHIFT_ASHIFTRT
;
4725 shift_type
= SHIFT_LSHIFTRT
;
4728 shift_type
= SHIFT_ASHIFT
;
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. */
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
);
4754 if (info
.remainder
== 0)
4755 return info
.cc_special
;
4760 return info
.cc_inline
;
4763 /* This case always ends with an and instruction. */
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
)
4772 return info
.cc_inline
;
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
)
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. */
4820 emit_insn (gen_rotlqi3_1 (dst
, dst
, const1_rtx
));
4823 emit_insn (gen_rotlhi3_1 (dst
, dst
, const1_rtx
));
4826 emit_insn (gen_rotlsi3_1 (dst
, dst
, const1_rtx
));
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
4837 emit_cmp_and_jump_insns (counter
, const0_rtx
, NE
, NULL_RTX
, QImode
, 1,
4840 emit_label (end_label
);
4844 /* Rotate by AMOUNT bits. */
4848 emit_insn (gen_rotlqi3_1 (dst
, dst
, rotate_amount
));
4851 emit_insn (gen_rotlhi3_1 (dst
, dst
, rotate_amount
));
4854 emit_insn (gen_rotlsi3_1 (dst
, dst
, rotate_amount
));
4864 /* Output a rotate insn. */
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
;
4876 enum machine_mode mode
= GET_MODE (dst
);
4878 gcc_assert (GET_CODE (rotate_amount
) == CONST_INT
);
4883 rotate_mode
= QIshift
;
4886 rotate_mode
= HIshift
;
4889 rotate_mode
= SIshift
;
4898 rotate_type
= SHIFT_ASHIFT
;
4901 rotate_type
= SHIFT_LSHIFTRT
;
4907 amount
= INTVAL (rotate_amount
);
4909 /* Clean up AMOUNT. */
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
;
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))
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
);
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
);
4951 /* Adjust AMOUNT and flip the direction. */
4952 amount
= GET_MODE_BITSIZE (mode
) / 2 - amount
;
4954 (rotate_type
== SHIFT_ASHIFT
) ? SHIFT_LSHIFTRT
: SHIFT_ASHIFT
;
4957 /* Output rotate insns. */
4958 for (bits
= TARGET_H8300S
? 2 : 1; bits
> 0; bits
/= 2)
4961 insn_buf
= rotate_two
[rotate_type
][rotate_mode
];
4963 insn_buf
= rotate_one
[cpu_type
][rotate_type
][rotate_mode
];
4965 for (; amount
>= bits
; amount
-= bits
)
4966 output_asm_insn (insn_buf
, operands
);
4972 /* Compute the length of a rotate insn. */
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
);
4981 unsigned int length
= 0;
4983 gcc_assert (GET_CODE (amount_rtx
) == CONST_INT
);
4985 amount
= INTVAL (amount_rtx
);
4987 /* Clean up AMOUNT. */
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
;
5012 /* We use 2-bit rotations on the H8S. */
5014 amount
= amount
/ 2 + amount
% 2;
5016 /* The H8/300 uses three insns to rotate one bit, taking 6
5018 length
+= amount
* ((TARGET_H8300
&& mode
== HImode
) ? 6 : 2);
5023 /* Fix the operands of a gen_xxx so that it could become a bit
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. */
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]);
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]);
5060 /* Dest and src op must be register. */
5062 operands
[1] = force_reg (QImode
, operands
[1]);
5064 rtx res
= gen_reg_rtx (QImode
);
5068 emit_insn (gen_andqi3_1 (res
, operands
[1], operands
[2]));
5071 emit_insn (gen_iorqi3_1 (res
, operands
[1], operands
[2]));
5074 emit_insn (gen_xorqi3_1 (res
, operands
[1], operands
[2]));
5079 emit_insn (gen_movqi (operands
[0], res
));
5084 /* Return nonzero if FUNC is an interrupt function as specified
5085 by the "interrupt" attribute. */
5088 h8300_interrupt_function_p (tree func
)
5092 if (TREE_CODE (func
) != FUNCTION_DECL
)
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. */
5103 h8300_saveall_function_p (tree func
)
5107 if (TREE_CODE (func
) != FUNCTION_DECL
)
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. */
5118 h8300_os_task_function_p (tree func
)
5122 if (TREE_CODE (func
) != FUNCTION_DECL
)
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. */
5133 h8300_monitor_function_p (tree func
)
5137 if (TREE_CODE (func
) != FUNCTION_DECL
)
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
)
5152 if (TREE_CODE (func
) != FUNCTION_DECL
)
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
5163 h8300_eightbit_data_p (tree decl
)
5167 if (TREE_CODE (decl
) != VAR_DECL
)
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
5178 h8300_tiny_data_p (tree decl
)
5182 if (TREE_CODE (decl
) != VAR_DECL
)
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. */
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"),
5210 /* Add an 'saveall' attribute. */
5211 *attributes
= tree_cons (get_identifier ("saveall"),
5217 /* Supported attributes:
5219 interrupt_handler: output a prologue and epilogue suitable for an
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
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. */
5251 h8300_handle_fndecl_attribute (tree
*node
, tree name
,
5252 tree args ATTRIBUTE_UNUSED
,
5253 int flags ATTRIBUTE_UNUSED
,
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;
5266 /* Handle an "eightbit_data" attribute; arguments as in
5267 struct attribute_spec.handler. */
5269 h8300_handle_eightbit_data_attribute (tree
*node
, tree name
,
5270 tree args ATTRIBUTE_UNUSED
,
5271 int flags ATTRIBUTE_UNUSED
,
5276 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
))
5278 DECL_SECTION_NAME (decl
) = build_string (7, ".eight");
5282 warning (OPT_Wattributes
, "%qs attribute ignored",
5283 IDENTIFIER_POINTER (name
));
5284 *no_add_attrs
= true;
5290 /* Handle an "tiny_data" attribute; arguments as in
5291 struct attribute_spec.handler. */
5293 h8300_handle_tiny_data_attribute (tree
*node
, tree name
,
5294 tree args ATTRIBUTE_UNUSED
,
5295 int flags ATTRIBUTE_UNUSED
,
5300 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
))
5302 DECL_SECTION_NAME (decl
) = build_string (6, ".tiny");
5306 warning (OPT_Wattributes
, "%qs attribute ignored",
5307 IDENTIFIER_POINTER (name
));
5308 *no_add_attrs
= true;
5314 /* Mark function vectors, and various small data objects. */
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
;
5336 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= extra_flags
;
5339 /* Output a single-bit extraction. */
5342 output_simode_bld (int bild
, rtx operands
[])
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
5352 output_asm_insn ("bild\t%Z2,%Y1", operands
);
5354 output_asm_insn ("bld\t%Z2,%Y1", operands
);
5356 output_asm_insn ("bst\t#0,%w0", operands
);
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]));
5365 output_asm_insn ("sub.l\t%S0,%S0", operands
);
5367 /* Output the bit load or bit inverse load. */
5369 output_asm_insn ("bild\t%Z2,%Y1", operands
);
5371 output_asm_insn ("bld\t%Z2,%Y1", operands
);
5374 output_asm_insn ("xor.l\t%S0,%S0", operands
);
5376 /* Perform the bit store. */
5377 output_asm_insn ("rotxl.l\t%S0", operands
);
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. */
5391 if (flag_delayed_branch
)
5392 shorten_branches (get_insns ());
5395 #ifndef OBJECT_FORMAT_ELF
5397 h8300_asm_named_section (const char *name
, unsigned int flags ATTRIBUTE_UNUSED
,
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
)
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
))
5457 /* In the normal mode, any symbol fits in the 16-bit absolute
5458 address range. We also accept symbols declared with
5460 return (TARGET_NORMAL_MODE
5461 || (SYMBOL_REF_FLAGS (x
) & SYMBOL_FLAG_TINY_DATA
) != 0);
5465 return (TARGET_NORMAL_MODE
5467 && (IN_RANGE (addr
, h1
, h2
) || IN_RANGE (addr
, h3
, h4
)))
5469 && (IN_RANGE (addr
, s1
, s2
) || IN_RANGE (addr
, s3
, s4
))));
5472 return TARGET_NORMAL_MODE
;
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
;
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));
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));
5519 if (((reg1
== stack_pointer_rtx
&& reg2
== stack_pointer_rtx
)
5520 || (reg1
== frame_pointer_rtx
&& reg2
== frame_pointer_rtx
))
5522 && offset1
+ 1 == offset2
)
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
)
5536 /* Make sure we have a sequence of three insns. */
5537 i2
= prev_nonnote_insn (i3
);
5540 i1
= prev_nonnote_insn (i2
);
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
)
5556 /* Make sure we have a sequence of three insns. */
5557 i2
= next_nonnote_insn (i1
);
5560 i3
= next_nonnote_insn (i2
);
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
5573 h8300_regs_ok_for_stm (int n
, rtx operands
[])
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));
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));
5590 return (REGNO (operands
[0]) == 0
5591 && REGNO (operands
[1]) == 1
5592 && REGNO (operands
[2]) == 2
5593 && REGNO (operands
[3]) == 3);
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
5609 if (h8300_current_function_interrupt_function_p ()
5610 && !regs_ever_live
[new_reg
])
5616 /* Return nonzero if X is a legitimate constant. */
5619 h8300_legitimate_constant_p (rtx x ATTRIBUTE_UNUSED
)
5624 /* Return nonzero if X is a REG or SUBREG suitable as a base register. */
5627 h8300_rtx_ok_for_base_p (rtx x
, int strict
)
5629 /* Strip off SUBREG if any. */
5630 if (GET_CODE (x
) == SUBREG
)
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
))
5650 if (CONSTANT_ADDRESS_P (x
))
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
))
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),
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
)
5687 /* If an even reg, then anything goes. Otherwise the mode must be
5689 return ((regno
& 1) == 0) || (mode
== HImode
) || (mode
== QImode
);
5691 /* MAC register can only be of SImode. Otherwise, anything
5693 return regno
== MAC_REG
? mode
== SImode
: 1;
5696 /* Perform target dependent optabs initialization. */
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. */
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
;