1 /* Subroutines for insn-output.c for Renesas H8/300.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5 Contributed by Steve Chamberlain (sac@cygnus.com),
6 Jim Wilson (wilson@cygnus.com), and Doug Evans (dje@cygnus.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
26 #include "coretypes.h"
31 #include "hard-reg-set.h"
32 #include "insn-config.h"
33 #include "conditions.h"
35 #include "insn-attr.h"
41 #include "diagnostic-core.h"
42 #include "c-family/c-pragma.h" /* ??? */
44 #include "tm-constrs.h"
47 #include "target-def.h"
50 /* Classifies a h8300_src_operand or h8300_dst_operand.
53 A constant operand of some sort.
59 A memory reference with a constant address.
62 A memory reference with a register as its address.
65 Some other kind of memory reference. */
66 enum h8300_operand_class
76 /* For a general two-operand instruction, element [X][Y] gives
77 the length of the opcode fields when the first operand has class
78 (X + 1) and the second has class Y. */
79 typedef unsigned char h8300_length_table
[NUM_H8OPS
- 1][NUM_H8OPS
];
81 /* Forward declarations. */
82 static const char *byte_reg (rtx
, int);
83 static int h8300_interrupt_function_p (tree
);
84 static int h8300_saveall_function_p (tree
);
85 static int h8300_monitor_function_p (tree
);
86 static int h8300_os_task_function_p (tree
);
87 static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT
, bool);
88 static HOST_WIDE_INT
round_frame_size (HOST_WIDE_INT
);
89 static unsigned int compute_saved_regs (void);
90 static void push (int);
91 static void pop (int);
92 static const char *cond_string (enum rtx_code
);
93 static unsigned int h8300_asm_insn_count (const char *);
94 static tree
h8300_handle_fndecl_attribute (tree
*, tree
, tree
, int, bool *);
95 static tree
h8300_handle_eightbit_data_attribute (tree
*, tree
, tree
, int, bool *);
96 static tree
h8300_handle_tiny_data_attribute (tree
*, tree
, tree
, int, bool *);
97 static void h8300_print_operand_address (FILE *, rtx
);
98 static void h8300_print_operand (FILE *, rtx
, int);
99 static bool h8300_print_operand_punct_valid_p (unsigned char code
);
100 #ifndef OBJECT_FORMAT_ELF
101 static void h8300_asm_named_section (const char *, unsigned int, tree
);
103 static int h8300_register_move_cost (enum machine_mode
, reg_class_t
, reg_class_t
);
104 static int h8300_and_costs (rtx
);
105 static int h8300_shift_costs (rtx
);
106 static void h8300_push_pop (int, int, bool, bool);
107 static int h8300_stack_offset_p (rtx
, int);
108 static int h8300_ldm_stm_regno (rtx
, int, int, int);
109 static void h8300_reorg (void);
110 static unsigned int h8300_constant_length (rtx
);
111 static unsigned int h8300_displacement_length (rtx
, int);
112 static unsigned int h8300_classify_operand (rtx
, int, enum h8300_operand_class
*);
113 static unsigned int h8300_length_from_table (rtx
, rtx
, const h8300_length_table
*);
114 static unsigned int h8300_unary_length (rtx
);
115 static unsigned int h8300_short_immediate_length (rtx
);
116 static unsigned int h8300_bitfield_length (rtx
, rtx
);
117 static unsigned int h8300_binary_length (rtx
, const h8300_length_table
*);
118 static bool h8300_short_move_mem_p (rtx
, enum rtx_code
);
119 static unsigned int h8300_move_length (rtx
*, const h8300_length_table
*);
120 static bool h8300_hard_regno_scratch_ok (unsigned int);
121 static rtx
h8300_get_index (rtx
, enum machine_mode mode
, int *);
123 /* CPU_TYPE, says what cpu we're compiling for. */
126 /* True if a #pragma interrupt has been seen for the current function. */
127 static int pragma_interrupt
;
129 /* True if a #pragma saveall has been seen for the current function. */
130 static int pragma_saveall
;
132 static const char *const names_big
[] =
133 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" };
135 static const char *const names_extended
[] =
136 { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7" };
138 static const char *const names_upper_extended
[] =
139 { "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7" };
141 /* Points to one of the above. */
142 /* ??? The above could be put in an array indexed by CPU_TYPE. */
143 const char * const *h8_reg_names
;
145 /* Various operations needed by the following, indexed by CPU_TYPE. */
147 const char *h8_push_op
, *h8_pop_op
, *h8_mov_op
;
149 /* Value of MOVE_RATIO. */
150 int h8300_move_ratio
;
152 /* See below where shifts are handled for explanation of this enum. */
162 /* Symbols of the various shifts which can be used as indices. */
166 SHIFT_ASHIFT
, SHIFT_LSHIFTRT
, SHIFT_ASHIFTRT
169 /* Macros to keep the shift algorithm tables small. */
170 #define INL SHIFT_INLINE
171 #define ROT SHIFT_ROT_AND
172 #define LOP SHIFT_LOOP
173 #define SPC SHIFT_SPECIAL
175 /* The shift algorithms for each machine, mode, shift type, and shift
176 count are defined below. The three tables below correspond to
177 QImode, HImode, and SImode, respectively. Each table is organized
178 by, in the order of indices, machine, shift type, and shift count. */
180 static enum shift_alg shift_alg_qi
[3][3][8] = {
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
, ROT
, ROT
, ROT
}, /* SHIFT_ASHIFT */
192 { INL
, INL
, INL
, INL
, INL
, ROT
, ROT
, ROT
}, /* SHIFT_LSHIFTRT */
193 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, SPC
} /* SHIFT_ASHIFTRT */
197 /* 0 1 2 3 4 5 6 7 */
198 { INL
, INL
, INL
, INL
, INL
, INL
, ROT
, ROT
}, /* SHIFT_ASHIFT */
199 { INL
, INL
, INL
, INL
, INL
, INL
, ROT
, ROT
}, /* SHIFT_LSHIFTRT */
200 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, SPC
} /* SHIFT_ASHIFTRT */
204 static enum shift_alg shift_alg_hi
[3][3][16] = {
207 /* 0 1 2 3 4 5 6 7 */
208 /* 8 9 10 11 12 13 14 15 */
209 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, SPC
,
210 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFT */
211 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, SPC
,
212 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_LSHIFTRT */
213 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, SPC
,
214 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFTRT */
218 /* 0 1 2 3 4 5 6 7 */
219 /* 8 9 10 11 12 13 14 15 */
220 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, SPC
,
221 SPC
, SPC
, SPC
, SPC
, SPC
, ROT
, ROT
, ROT
}, /* SHIFT_ASHIFT */
222 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, SPC
,
223 SPC
, SPC
, SPC
, SPC
, SPC
, ROT
, ROT
, ROT
}, /* SHIFT_LSHIFTRT */
224 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, SPC
,
225 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFTRT */
229 /* 0 1 2 3 4 5 6 7 */
230 /* 8 9 10 11 12 13 14 15 */
231 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
232 SPC
, SPC
, SPC
, SPC
, SPC
, ROT
, ROT
, ROT
}, /* SHIFT_ASHIFT */
233 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
234 SPC
, SPC
, SPC
, SPC
, SPC
, ROT
, ROT
, ROT
}, /* SHIFT_LSHIFTRT */
235 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
236 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFTRT */
240 static enum shift_alg shift_alg_si
[3][3][32] = {
243 /* 0 1 2 3 4 5 6 7 */
244 /* 8 9 10 11 12 13 14 15 */
245 /* 16 17 18 19 20 21 22 23 */
246 /* 24 25 26 27 28 29 30 31 */
247 { INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, LOP
,
248 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
,
249 SPC
, SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, LOP
,
250 SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, SPC
}, /* SHIFT_ASHIFT */
251 { INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, LOP
,
252 SPC
, SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
,
253 SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, LOP
, LOP
,
254 SPC
, SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, SPC
}, /* SHIFT_LSHIFTRT */
255 { INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, LOP
,
256 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
,
257 SPC
, SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
,
258 SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, LOP
, SPC
}, /* SHIFT_ASHIFTRT */
262 /* 0 1 2 3 4 5 6 7 */
263 /* 8 9 10 11 12 13 14 15 */
264 /* 16 17 18 19 20 21 22 23 */
265 /* 24 25 26 27 28 29 30 31 */
266 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, LOP
,
267 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
,
268 SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, LOP
,
269 SPC
, LOP
, LOP
, LOP
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFT */
270 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, LOP
,
271 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
,
272 SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, LOP
,
273 SPC
, LOP
, LOP
, LOP
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_LSHIFTRT */
274 { INL
, INL
, INL
, INL
, INL
, LOP
, LOP
, LOP
,
275 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
,
276 SPC
, SPC
, SPC
, SPC
, LOP
, LOP
, LOP
, LOP
,
277 SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
}, /* SHIFT_ASHIFTRT */
281 /* 0 1 2 3 4 5 6 7 */
282 /* 8 9 10 11 12 13 14 15 */
283 /* 16 17 18 19 20 21 22 23 */
284 /* 24 25 26 27 28 29 30 31 */
285 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
286 INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, SPC
,
287 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, LOP
, LOP
,
288 SPC
, SPC
, LOP
, LOP
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_ASHIFT */
289 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
290 INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, SPC
,
291 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, LOP
, LOP
,
292 SPC
, SPC
, LOP
, LOP
, SPC
, SPC
, SPC
, SPC
}, /* SHIFT_LSHIFTRT */
293 { INL
, INL
, INL
, INL
, INL
, INL
, INL
, INL
,
294 INL
, INL
, INL
, LOP
, LOP
, LOP
, LOP
, LOP
,
295 SPC
, SPC
, SPC
, SPC
, SPC
, SPC
, LOP
, LOP
,
296 SPC
, SPC
, LOP
, LOP
, LOP
, LOP
, LOP
, SPC
}, /* SHIFT_ASHIFTRT */
312 /* Initialize various cpu specific globals at start up. */
315 h8300_option_override (void)
317 static const char *const h8_push_ops
[2] = { "push" , "push.l" };
318 static const char *const h8_pop_ops
[2] = { "pop" , "pop.l" };
319 static const char *const h8_mov_ops
[2] = { "mov.w", "mov.l" };
323 cpu_type
= (int) CPU_H8300
;
324 h8_reg_names
= names_big
;
328 /* For this we treat the H8/300H and H8S the same. */
329 cpu_type
= (int) CPU_H8300H
;
330 h8_reg_names
= names_extended
;
332 h8_push_op
= h8_push_ops
[cpu_type
];
333 h8_pop_op
= h8_pop_ops
[cpu_type
];
334 h8_mov_op
= h8_mov_ops
[cpu_type
];
336 if (!TARGET_H8300S
&& TARGET_MAC
)
338 error ("-ms2600 is used without -ms");
339 target_flags
|= MASK_H8300S_1
;
342 if (TARGET_H8300
&& TARGET_NORMAL_MODE
)
344 error ("-mn is used without -mh or -ms");
345 target_flags
^= MASK_NORMAL_MODE
;
348 /* Some of the shifts are optimized for speed by default.
349 See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
350 If optimizing for size, change shift_alg for those shift to
355 shift_alg_hi
[H8_300
][SHIFT_ASHIFT
][5] = SHIFT_LOOP
;
356 shift_alg_hi
[H8_300
][SHIFT_ASHIFT
][6] = SHIFT_LOOP
;
357 shift_alg_hi
[H8_300
][SHIFT_ASHIFT
][13] = SHIFT_LOOP
;
358 shift_alg_hi
[H8_300
][SHIFT_ASHIFT
][14] = SHIFT_LOOP
;
360 shift_alg_hi
[H8_300
][SHIFT_LSHIFTRT
][13] = SHIFT_LOOP
;
361 shift_alg_hi
[H8_300
][SHIFT_LSHIFTRT
][14] = SHIFT_LOOP
;
363 shift_alg_hi
[H8_300
][SHIFT_ASHIFTRT
][13] = SHIFT_LOOP
;
364 shift_alg_hi
[H8_300
][SHIFT_ASHIFTRT
][14] = SHIFT_LOOP
;
367 shift_alg_hi
[H8_300H
][SHIFT_ASHIFT
][5] = SHIFT_LOOP
;
368 shift_alg_hi
[H8_300H
][SHIFT_ASHIFT
][6] = SHIFT_LOOP
;
370 shift_alg_hi
[H8_300H
][SHIFT_LSHIFTRT
][5] = SHIFT_LOOP
;
371 shift_alg_hi
[H8_300H
][SHIFT_LSHIFTRT
][6] = SHIFT_LOOP
;
373 shift_alg_hi
[H8_300H
][SHIFT_ASHIFTRT
][5] = SHIFT_LOOP
;
374 shift_alg_hi
[H8_300H
][SHIFT_ASHIFTRT
][6] = SHIFT_LOOP
;
375 shift_alg_hi
[H8_300H
][SHIFT_ASHIFTRT
][13] = SHIFT_LOOP
;
376 shift_alg_hi
[H8_300H
][SHIFT_ASHIFTRT
][14] = SHIFT_LOOP
;
379 shift_alg_hi
[H8_S
][SHIFT_ASHIFTRT
][14] = SHIFT_LOOP
;
382 /* Work out a value for MOVE_RATIO. */
385 /* Memory-memory moves are quite expensive without the
386 h8sx instructions. */
387 h8300_move_ratio
= 3;
389 else if (flag_omit_frame_pointer
)
391 /* movmd sequences are fairly cheap when er6 isn't fixed. They can
392 sometimes be as short as two individual memory-to-memory moves,
393 but since they use all the call-saved registers, it seems better
394 to allow up to three moves here. */
395 h8300_move_ratio
= 4;
397 else if (optimize_size
)
399 /* In this case we don't use movmd sequences since they tend
400 to be longer than calls to memcpy(). Memory-to-memory
401 moves are cheaper than for !TARGET_H8300SX, so it makes
402 sense to have a slightly higher threshold. */
403 h8300_move_ratio
= 4;
407 /* We use movmd sequences for some moves since it can be quicker
408 than calling memcpy(). The sequences will need to save and
409 restore er6 though, so bump up the cost. */
410 h8300_move_ratio
= 6;
413 /* This target defaults to strict volatile bitfields. */
414 if (flag_strict_volatile_bitfields
< 0)
415 flag_strict_volatile_bitfields
= 1;
418 /* Return the byte register name for a register rtx X. B should be 0
419 if you want a lower byte register. B should be 1 if you want an
420 upper byte register. */
423 byte_reg (rtx x
, int b
)
425 static const char *const names_small
[] = {
426 "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
427 "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
430 gcc_assert (REG_P (x
));
432 return names_small
[REGNO (x
) * 2 + b
];
435 /* REGNO must be saved/restored across calls if this macro is true. */
437 #define WORD_REG_USED(regno) \
439 /* No need to save registers if this function will not return. */ \
440 && ! TREE_THIS_VOLATILE (current_function_decl) \
441 && (h8300_saveall_function_p (current_function_decl) \
442 /* Save any call saved register that was used. */ \
443 || (df_regs_ever_live_p (regno) && !call_used_regs[regno]) \
444 /* Save the frame pointer if it was used. */ \
445 || (regno == HARD_FRAME_POINTER_REGNUM && df_regs_ever_live_p (regno)) \
446 /* Save any register used in an interrupt handler. */ \
447 || (h8300_current_function_interrupt_function_p () \
448 && df_regs_ever_live_p (regno)) \
449 /* Save call clobbered registers in non-leaf interrupt \
451 || (h8300_current_function_interrupt_function_p () \
452 && call_used_regs[regno] \
453 && !current_function_is_leaf)))
455 /* We use this to wrap all emitted insns in the prologue. */
457 F (rtx x
, bool set_it
)
460 RTX_FRAME_RELATED_P (x
) = 1;
464 /* Mark all the subexpressions of the PARALLEL rtx PAR as
465 frame-related. Return PAR.
467 dwarf2out.c:dwarf2out_frame_debug_expr ignores sub-expressions of a
468 PARALLEL rtx other than the first if they do not have the
469 FRAME_RELATED flag set on them. */
473 int len
= XVECLEN (par
, 0);
476 for (i
= 0; i
< len
; i
++)
477 F (XVECEXP (par
, 0, i
), true);
482 /* Output assembly language to FILE for the operation OP with operand size
483 SIZE to adjust the stack pointer. */
486 h8300_emit_stack_adjustment (int sign
, HOST_WIDE_INT size
, bool in_prologue
)
488 /* If the frame size is 0, we don't have anything to do. */
492 /* H8/300 cannot add/subtract a large constant with a single
493 instruction. If a temporary register is available, load the
494 constant to it and then do the addition. */
497 && !h8300_current_function_interrupt_function_p ()
498 && !(cfun
->static_chain_decl
!= NULL
&& sign
< 0))
500 rtx r3
= gen_rtx_REG (Pmode
, 3);
501 F (emit_insn (gen_movhi (r3
, GEN_INT (sign
* size
))), in_prologue
);
502 F (emit_insn (gen_addhi3 (stack_pointer_rtx
,
503 stack_pointer_rtx
, r3
)), in_prologue
);
507 /* The stack adjustment made here is further optimized by the
508 splitter. In case of H8/300, the splitter always splits the
509 addition emitted here to make the adjustment interrupt-safe.
510 FIXME: We don't always tag those, because we don't know what
511 the splitter will do. */
514 rtx x
= emit_insn (gen_addhi3 (stack_pointer_rtx
,
515 stack_pointer_rtx
, GEN_INT (sign
* size
)));
520 F (emit_insn (gen_addsi3 (stack_pointer_rtx
,
521 stack_pointer_rtx
, GEN_INT (sign
* size
))), in_prologue
);
525 /* Round up frame size SIZE. */
528 round_frame_size (HOST_WIDE_INT size
)
530 return ((size
+ STACK_BOUNDARY
/ BITS_PER_UNIT
- 1)
531 & -STACK_BOUNDARY
/ BITS_PER_UNIT
);
534 /* Compute which registers to push/pop.
535 Return a bit vector of registers. */
538 compute_saved_regs (void)
540 unsigned int saved_regs
= 0;
543 /* Construct a bit vector of registers to be pushed/popped. */
544 for (regno
= 0; regno
<= HARD_FRAME_POINTER_REGNUM
; regno
++)
546 if (WORD_REG_USED (regno
))
547 saved_regs
|= 1 << regno
;
550 /* Don't push/pop the frame pointer as it is treated separately. */
551 if (frame_pointer_needed
)
552 saved_regs
&= ~(1 << HARD_FRAME_POINTER_REGNUM
);
557 /* Emit an insn to push register RN. */
562 rtx reg
= gen_rtx_REG (word_mode
, rn
);
566 x
= gen_push_h8300 (reg
);
567 else if (!TARGET_NORMAL_MODE
)
568 x
= gen_push_h8300hs_advanced (reg
);
570 x
= gen_push_h8300hs_normal (reg
);
571 x
= F (emit_insn (x
), true);
572 add_reg_note (x
, REG_INC
, stack_pointer_rtx
);
575 /* Emit an insn to pop register RN. */
580 rtx reg
= gen_rtx_REG (word_mode
, rn
);
584 x
= gen_pop_h8300 (reg
);
585 else if (!TARGET_NORMAL_MODE
)
586 x
= gen_pop_h8300hs_advanced (reg
);
588 x
= gen_pop_h8300hs_normal (reg
);
590 add_reg_note (x
, REG_INC
, stack_pointer_rtx
);
593 /* Emit an instruction to push or pop NREGS consecutive registers
594 starting at register REGNO. POP_P selects a pop rather than a
595 push and RETURN_P is true if the instruction should return.
597 It must be possible to do the requested operation in a single
598 instruction. If NREGS == 1 && !RETURN_P, use a normal push
599 or pop insn. Otherwise emit a parallel of the form:
602 [(return) ;; if RETURN_P
603 (save or restore REGNO)
604 (save or restore REGNO + 1)
606 (save or restore REGNO + NREGS - 1)
607 (set sp (plus sp (const_int adjust)))] */
610 h8300_push_pop (int regno
, int nregs
, bool pop_p
, bool return_p
)
616 /* See whether we can use a simple push or pop. */
617 if (!return_p
&& nregs
== 1)
626 /* We need one element for the return insn, if present, one for each
627 register, and one for stack adjustment. */
628 vec
= rtvec_alloc ((return_p
? 1 : 0) + nregs
+ 1);
629 sp
= stack_pointer_rtx
;
632 /* Add the return instruction. */
635 RTVEC_ELT (vec
, i
) = ret_rtx
;
639 /* Add the register moves. */
640 for (j
= 0; j
< nregs
; j
++)
646 /* Register REGNO + NREGS - 1 is popped first. Before the
647 stack adjustment, its slot is at address @sp. */
648 lhs
= gen_rtx_REG (SImode
, regno
+ j
);
649 rhs
= gen_rtx_MEM (SImode
, plus_constant (sp
, (nregs
- j
- 1) * 4));
653 /* Register REGNO is pushed first and will be stored at @(-4,sp). */
654 lhs
= gen_rtx_MEM (SImode
, plus_constant (sp
, (j
+ 1) * -4));
655 rhs
= gen_rtx_REG (SImode
, regno
+ j
);
657 RTVEC_ELT (vec
, i
+ j
) = gen_rtx_SET (VOIDmode
, lhs
, rhs
);
660 /* Add the stack adjustment. */
661 offset
= GEN_INT ((pop_p
? nregs
: -nregs
) * 4);
662 RTVEC_ELT (vec
, i
+ j
) = gen_rtx_SET (VOIDmode
, sp
,
663 gen_rtx_PLUS (Pmode
, sp
, offset
));
665 x
= gen_rtx_PARALLEL (VOIDmode
, vec
);
675 /* Return true if X has the value sp + OFFSET. */
678 h8300_stack_offset_p (rtx x
, int offset
)
681 return x
== stack_pointer_rtx
;
683 return (GET_CODE (x
) == PLUS
684 && XEXP (x
, 0) == stack_pointer_rtx
685 && GET_CODE (XEXP (x
, 1)) == CONST_INT
686 && INTVAL (XEXP (x
, 1)) == offset
);
689 /* A subroutine of h8300_ldm_stm_parallel. X is one pattern in
690 something that may be an ldm or stm instruction. If it fits
691 the required template, return the register it loads or stores,
694 LOAD_P is true if X should be a load, false if it should be a store.
695 NREGS is the number of registers that the whole instruction is expected
696 to load or store. INDEX is the index of the register that X should
697 load or store, relative to the lowest-numbered register. */
700 h8300_ldm_stm_regno (rtx x
, int load_p
, int index
, int nregs
)
702 int regindex
, memindex
, offset
;
705 regindex
= 0, memindex
= 1, offset
= (nregs
- index
- 1) * 4;
707 memindex
= 0, regindex
= 1, offset
= (index
+ 1) * -4;
709 if (GET_CODE (x
) == SET
710 && GET_CODE (XEXP (x
, regindex
)) == REG
711 && GET_CODE (XEXP (x
, memindex
)) == MEM
712 && h8300_stack_offset_p (XEXP (XEXP (x
, memindex
), 0), offset
))
713 return REGNO (XEXP (x
, regindex
));
718 /* Return true if the elements of VEC starting at FIRST describe an
719 ldm or stm instruction (LOAD_P says which). */
722 h8300_ldm_stm_parallel (rtvec vec
, int load_p
, int first
)
725 int nregs
, i
, regno
, adjust
;
727 /* There must be a stack adjustment, a register move, and at least one
728 other operation (a return or another register move). */
729 if (GET_NUM_ELEM (vec
) < 3)
732 /* Get the range of registers to be pushed or popped. */
733 nregs
= GET_NUM_ELEM (vec
) - first
- 1;
734 regno
= h8300_ldm_stm_regno (RTVEC_ELT (vec
, first
), load_p
, 0, nregs
);
736 /* Check that the call to h8300_ldm_stm_regno succeeded and
737 that we're only dealing with GPRs. */
738 if (regno
< 0 || regno
+ nregs
> 8)
741 /* 2-register h8s instructions must start with an even-numbered register.
742 3- and 4-register instructions must start with er0 or er4. */
745 if ((regno
& 1) != 0)
747 if (nregs
> 2 && (regno
& 3) != 0)
751 /* Check the other loads or stores. */
752 for (i
= 1; i
< nregs
; i
++)
753 if (h8300_ldm_stm_regno (RTVEC_ELT (vec
, first
+ i
), load_p
, i
, nregs
)
757 /* Check the stack adjustment. */
758 last
= RTVEC_ELT (vec
, first
+ nregs
);
759 adjust
= (load_p
? nregs
: -nregs
) * 4;
760 return (GET_CODE (last
) == SET
761 && SET_DEST (last
) == stack_pointer_rtx
762 && h8300_stack_offset_p (SET_SRC (last
), adjust
));
765 /* This is what the stack looks like after the prolog of
766 a function with a frame has been set up:
772 <saved registers> <- sp
774 This is what the stack looks like after the prolog of
775 a function which doesn't have a frame:
780 <saved registers> <- sp
783 /* Generate RTL code for the function prologue. */
786 h8300_expand_prologue (void)
792 /* If the current function has the OS_Task attribute set, then
793 we have a naked prologue. */
794 if (h8300_os_task_function_p (current_function_decl
))
797 if (h8300_monitor_function_p (current_function_decl
))
798 /* My understanding of monitor functions is they act just like
799 interrupt functions, except the prologue must mask
801 emit_insn (gen_monitor_prologue ());
803 if (frame_pointer_needed
)
806 push (HARD_FRAME_POINTER_REGNUM
);
807 F (emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
), true);
810 /* Push the rest of the registers in ascending order. */
811 saved_regs
= compute_saved_regs ();
812 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
+= n_regs
)
815 if (saved_regs
& (1 << regno
))
819 /* See how many registers we can push at the same time. */
820 if ((!TARGET_H8300SX
|| (regno
& 3) == 0)
821 && ((saved_regs
>> regno
) & 0x0f) == 0x0f)
824 else if ((!TARGET_H8300SX
|| (regno
& 3) == 0)
825 && ((saved_regs
>> regno
) & 0x07) == 0x07)
828 else if ((!TARGET_H8300SX
|| (regno
& 1) == 0)
829 && ((saved_regs
>> regno
) & 0x03) == 0x03)
833 h8300_push_pop (regno
, n_regs
, false, false);
837 /* Leave room for locals. */
838 h8300_emit_stack_adjustment (-1, round_frame_size (get_frame_size ()), true);
841 /* Return nonzero if we can use "rts" for the function currently being
845 h8300_can_use_return_insn_p (void)
847 return (reload_completed
848 && !frame_pointer_needed
849 && get_frame_size () == 0
850 && compute_saved_regs () == 0);
853 /* Generate RTL code for the function epilogue. */
856 h8300_expand_epilogue (void)
861 HOST_WIDE_INT frame_size
;
864 if (h8300_os_task_function_p (current_function_decl
))
865 /* OS_Task epilogues are nearly naked -- they just have an
869 frame_size
= round_frame_size (get_frame_size ());
872 /* Deallocate locals. */
873 h8300_emit_stack_adjustment (1, frame_size
, false);
875 /* Pop the saved registers in descending order. */
876 saved_regs
= compute_saved_regs ();
877 for (regno
= FIRST_PSEUDO_REGISTER
- 1; regno
>= 0; regno
-= n_regs
)
880 if (saved_regs
& (1 << regno
))
884 /* See how many registers we can pop at the same time. */
885 if ((TARGET_H8300SX
|| (regno
& 3) == 3)
886 && ((saved_regs
<< 3 >> regno
) & 0x0f) == 0x0f)
889 else if ((TARGET_H8300SX
|| (regno
& 3) == 2)
890 && ((saved_regs
<< 2 >> regno
) & 0x07) == 0x07)
893 else if ((TARGET_H8300SX
|| (regno
& 1) == 1)
894 && ((saved_regs
<< 1 >> regno
) & 0x03) == 0x03)
898 /* See if this pop would be the last insn before the return.
899 If so, use rte/l or rts/l instead of pop or ldm.l. */
901 && !frame_pointer_needed
903 && (saved_regs
& ((1 << (regno
- n_regs
+ 1)) - 1)) == 0)
906 h8300_push_pop (regno
- n_regs
+ 1, n_regs
, true, returned_p
);
910 /* Pop frame pointer if we had one. */
911 if (frame_pointer_needed
)
915 h8300_push_pop (HARD_FRAME_POINTER_REGNUM
, 1, true, returned_p
);
919 emit_jump_insn (ret_rtx
);
922 /* Return nonzero if the current function is an interrupt
926 h8300_current_function_interrupt_function_p (void)
928 return (h8300_interrupt_function_p (current_function_decl
)
929 || h8300_monitor_function_p (current_function_decl
));
932 /* Output assembly code for the start of the file. */
935 h8300_file_start (void)
937 default_file_start ();
940 fputs (TARGET_NORMAL_MODE
? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file
);
941 else if (TARGET_H8300SX
)
942 fputs (TARGET_NORMAL_MODE
? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file
);
943 else if (TARGET_H8300S
)
944 fputs (TARGET_NORMAL_MODE
? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file
);
947 /* Output assembly language code for the end of file. */
950 h8300_file_end (void)
952 fputs ("\t.end\n", asm_out_file
);
955 /* Split an add of a small constant into two adds/subs insns.
957 If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
958 instead of adds/subs. */
961 split_adds_subs (enum machine_mode mode
, rtx
*operands
)
963 HOST_WIDE_INT val
= INTVAL (operands
[1]);
964 rtx reg
= operands
[0];
965 HOST_WIDE_INT sign
= 1;
966 HOST_WIDE_INT amount
;
967 rtx (*gen_add
) (rtx
, rtx
, rtx
);
969 /* Force VAL to be positive so that we do not have to consider the
980 gen_add
= gen_addhi3
;
984 gen_add
= gen_addsi3
;
991 /* Try different amounts in descending order. */
992 for (amount
= (TARGET_H8300H
|| TARGET_H8300S
) ? 4 : 2;
996 for (; val
>= amount
; val
-= amount
)
997 emit_insn (gen_add (reg
, reg
, GEN_INT (sign
* amount
)));
1003 /* Handle machine specific pragmas for compatibility with existing
1004 compilers for the H8/300.
1006 pragma saveall generates prologue/epilogue code which saves and
1007 restores all the registers on function entry.
1009 pragma interrupt saves and restores all registers, and exits with
1010 an rte instruction rather than an rts. A pointer to a function
1011 with this attribute may be safely used in an interrupt vector. */
1014 h8300_pr_interrupt (struct cpp_reader
*pfile ATTRIBUTE_UNUSED
)
1016 pragma_interrupt
= 1;
1020 h8300_pr_saveall (struct cpp_reader
*pfile ATTRIBUTE_UNUSED
)
1025 /* If the next function argument with MODE and TYPE is to be passed in
1026 a register, return a reg RTX for the hard register in which to pass
1027 the argument. CUM represents the state after the last argument.
1028 If the argument is to be pushed, NULL_RTX is returned.
1030 On the H8/300 all normal args are pushed, unless -mquickcall in which
1031 case the first 3 arguments are passed in registers. */
1034 h8300_function_arg (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
1035 const_tree type
, bool named
)
1037 static const char *const hand_list
[] = {
1056 rtx result
= NULL_RTX
;
1060 /* Never pass unnamed arguments in registers. */
1064 /* Pass 3 regs worth of data in regs when user asked on the command line. */
1065 if (TARGET_QUICKCALL
)
1068 /* If calling hand written assembler, use 4 regs of args. */
1071 const char * const *p
;
1073 fname
= XSTR (cum
->libcall
, 0);
1075 /* See if this libcall is one of the hand coded ones. */
1076 for (p
= hand_list
; *p
&& strcmp (*p
, fname
) != 0; p
++)
1087 if (mode
== BLKmode
)
1088 size
= int_size_in_bytes (type
);
1090 size
= GET_MODE_SIZE (mode
);
1092 if (size
+ cum
->nbytes
<= regpass
* UNITS_PER_WORD
1093 && cum
->nbytes
/ UNITS_PER_WORD
<= 3)
1094 result
= gen_rtx_REG (mode
, cum
->nbytes
/ UNITS_PER_WORD
);
1100 /* Update the data in CUM to advance over an argument
1101 of mode MODE and data type TYPE.
1102 (TYPE is null for libcalls where that information may not be available.) */
1105 h8300_function_arg_advance (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
1106 const_tree type
, bool named ATTRIBUTE_UNUSED
)
1108 cum
->nbytes
+= (mode
!= BLKmode
1109 ? (GET_MODE_SIZE (mode
) + UNITS_PER_WORD
- 1) & -UNITS_PER_WORD
1110 : (int_size_in_bytes (type
) + UNITS_PER_WORD
- 1) & -UNITS_PER_WORD
);
1114 /* Implements TARGET_REGISTER_MOVE_COST.
1116 Any SI register-to-register move may need to be reloaded,
1117 so inmplement h8300_register_move_cost to return > 2 so that reload never
1121 h8300_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED
,
1122 reg_class_t from
, reg_class_t to
)
1124 if (from
== MAC_REGS
|| to
== MAC_REG
)
1130 /* Compute the cost of an and insn. */
1133 h8300_and_costs (rtx x
)
1137 if (GET_MODE (x
) == QImode
)
1140 if (GET_MODE (x
) != HImode
1141 && GET_MODE (x
) != SImode
)
1145 operands
[1] = XEXP (x
, 0);
1146 operands
[2] = XEXP (x
, 1);
1148 return compute_logical_op_length (GET_MODE (x
), operands
) / 2;
1151 /* Compute the cost of a shift insn. */
1154 h8300_shift_costs (rtx x
)
1158 if (GET_MODE (x
) != QImode
1159 && GET_MODE (x
) != HImode
1160 && GET_MODE (x
) != SImode
)
1165 operands
[2] = XEXP (x
, 1);
1167 return compute_a_shift_length (NULL
, operands
) / 2;
1170 /* Worker function for TARGET_RTX_COSTS. */
1173 h8300_rtx_costs (rtx x
, int code
, int outer_code
, int *total
, bool speed
)
1175 if (TARGET_H8300SX
&& outer_code
== MEM
)
1177 /* Estimate the number of execution states needed to calculate
1179 if (register_operand (x
, VOIDmode
)
1180 || GET_CODE (x
) == POST_INC
1181 || GET_CODE (x
) == POST_DEC
1185 *total
= COSTS_N_INSNS (1);
1193 HOST_WIDE_INT n
= INTVAL (x
);
1197 /* Constant operands need the same number of processor
1198 states as register operands. Although we could try to
1199 use a size-based cost for !speed, the lack of
1200 of a mode makes the results very unpredictable. */
1204 if (-4 <= n
|| n
<= 4)
1215 *total
= 0 + (outer_code
== SET
);
1219 if (TARGET_H8300H
|| TARGET_H8300S
)
1220 *total
= 0 + (outer_code
== SET
);
1235 /* See comment for CONST_INT. */
1247 if (XEXP (x
, 1) == const0_rtx
)
1252 if (!h8300_dst_operand (XEXP (x
, 0), VOIDmode
)
1253 || !h8300_src_operand (XEXP (x
, 1), VOIDmode
))
1255 *total
= COSTS_N_INSNS (h8300_and_costs (x
));
1258 /* We say that MOD and DIV are so expensive because otherwise we'll
1259 generate some really horrible code for division of a power of two. */
1265 switch (GET_MODE (x
))
1269 *total
= COSTS_N_INSNS (!speed
? 4 : 10);
1273 *total
= COSTS_N_INSNS (!speed
? 4 : 18);
1279 *total
= COSTS_N_INSNS (12);
1284 switch (GET_MODE (x
))
1288 *total
= COSTS_N_INSNS (2);
1292 *total
= COSTS_N_INSNS (5);
1298 *total
= COSTS_N_INSNS (4);
1304 if (h8sx_binary_shift_operator (x
, VOIDmode
))
1306 *total
= COSTS_N_INSNS (2);
1309 else if (h8sx_unary_shift_operator (x
, VOIDmode
))
1311 *total
= COSTS_N_INSNS (1);
1314 *total
= COSTS_N_INSNS (h8300_shift_costs (x
));
1319 if (GET_MODE (x
) == HImode
)
1326 *total
= COSTS_N_INSNS (1);
1331 /* Documentation for the machine specific operand escapes:
1333 'E' like s but negative.
1334 'F' like t but negative.
1335 'G' constant just the negative
1336 'R' print operand as a byte:8 address if appropriate, else fall back to
1338 'S' print operand as a long word
1339 'T' print operand as a word
1340 'V' find the set bit, and print its number.
1341 'W' find the clear bit, and print its number.
1342 'X' print operand as a byte
1343 'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
1344 If this operand isn't a register, fall back to 'R' handling.
1346 'c' print the opcode corresponding to rtl
1347 'e' first word of 32-bit value - if reg, then least reg. if mem
1348 then least. if const then most sig word
1349 'f' second word of 32-bit value - if reg, then biggest reg. if mem
1350 then +2. if const then least sig word
1351 'j' print operand as condition code.
1352 'k' print operand as reverse condition code.
1353 'm' convert an integer operand to a size suffix (.b, .w or .l)
1354 'o' print an integer without a leading '#'
1355 's' print as low byte of 16-bit value
1356 't' print as high byte of 16-bit value
1357 'w' print as low byte of 32-bit value
1358 'x' print as 2nd byte of 32-bit value
1359 'y' print as 3rd byte of 32-bit value
1360 'z' print as msb of 32-bit value
1363 /* Return assembly language string which identifies a comparison type. */
1366 cond_string (enum rtx_code code
)
1395 /* Print operand X using operand code CODE to assembly language output file
1399 h8300_print_operand (FILE *file
, rtx x
, int code
)
1401 /* This is used for communication between codes V,W,Z and Y. */
1407 switch (GET_CODE (x
))
1410 fprintf (file
, "%sl", names_big
[REGNO (x
)]);
1413 fprintf (file
, "#%ld", (-INTVAL (x
)) & 0xff);
1420 switch (GET_CODE (x
))
1423 fprintf (file
, "%sh", names_big
[REGNO (x
)]);
1426 fprintf (file
, "#%ld", ((-INTVAL (x
)) & 0xff00) >> 8);
1433 gcc_assert (GET_CODE (x
) == CONST_INT
);
1434 fprintf (file
, "#%ld", 0xff & (-INTVAL (x
)));
1437 if (GET_CODE (x
) == REG
)
1438 fprintf (file
, "%s", names_extended
[REGNO (x
)]);
1443 if (GET_CODE (x
) == REG
)
1444 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1449 bitint
= (INTVAL (x
) & 0xffff);
1450 if ((exact_log2 ((bitint
>> 8) & 0xff)) == -1)
1451 bitint
= exact_log2 (bitint
& 0xff);
1453 bitint
= exact_log2 ((bitint
>> 8) & 0xff);
1454 gcc_assert (bitint
>= 0);
1455 fprintf (file
, "#%d", bitint
);
1458 bitint
= ((~INTVAL (x
)) & 0xffff);
1459 if ((exact_log2 ((bitint
>> 8) & 0xff)) == -1 )
1460 bitint
= exact_log2 (bitint
& 0xff);
1462 bitint
= (exact_log2 ((bitint
>> 8) & 0xff));
1463 gcc_assert (bitint
>= 0);
1464 fprintf (file
, "#%d", bitint
);
1468 if (GET_CODE (x
) == REG
)
1469 fprintf (file
, "%s", byte_reg (x
, 0));
1474 gcc_assert (bitint
>= 0);
1475 if (GET_CODE (x
) == REG
)
1476 fprintf (file
, "%s%c", names_big
[REGNO (x
)], bitint
> 7 ? 'h' : 'l');
1478 h8300_print_operand (file
, x
, 'R');
1482 bitint
= INTVAL (x
);
1483 fprintf (file
, "#%d", bitint
& 7);
1486 switch (GET_CODE (x
))
1489 fprintf (file
, "or");
1492 fprintf (file
, "xor");
1495 fprintf (file
, "and");
1502 switch (GET_CODE (x
))
1506 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1508 fprintf (file
, "%s", names_upper_extended
[REGNO (x
)]);
1511 h8300_print_operand (file
, x
, 0);
1514 fprintf (file
, "#%ld", ((INTVAL (x
) >> 16) & 0xffff));
1520 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1521 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1522 fprintf (file
, "#%ld", ((val
>> 16) & 0xffff));
1531 switch (GET_CODE (x
))
1535 fprintf (file
, "%s", names_big
[REGNO (x
) + 1]);
1537 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1540 x
= adjust_address (x
, HImode
, 2);
1541 h8300_print_operand (file
, x
, 0);
1544 fprintf (file
, "#%ld", INTVAL (x
) & 0xffff);
1550 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1551 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1552 fprintf (file
, "#%ld", (val
& 0xffff));
1560 fputs (cond_string (GET_CODE (x
)), file
);
1563 fputs (cond_string (reverse_condition (GET_CODE (x
))), file
);
1566 gcc_assert (GET_CODE (x
) == CONST_INT
);
1586 h8300_print_operand_address (file
, x
);
1589 if (GET_CODE (x
) == CONST_INT
)
1590 fprintf (file
, "#%ld", (INTVAL (x
)) & 0xff);
1592 fprintf (file
, "%s", byte_reg (x
, 0));
1595 if (GET_CODE (x
) == CONST_INT
)
1596 fprintf (file
, "#%ld", (INTVAL (x
) >> 8) & 0xff);
1598 fprintf (file
, "%s", byte_reg (x
, 1));
1601 if (GET_CODE (x
) == CONST_INT
)
1602 fprintf (file
, "#%ld", INTVAL (x
) & 0xff);
1604 fprintf (file
, "%s",
1605 byte_reg (x
, TARGET_H8300
? 2 : 0));
1608 if (GET_CODE (x
) == CONST_INT
)
1609 fprintf (file
, "#%ld", (INTVAL (x
) >> 8) & 0xff);
1611 fprintf (file
, "%s",
1612 byte_reg (x
, TARGET_H8300
? 3 : 1));
1615 if (GET_CODE (x
) == CONST_INT
)
1616 fprintf (file
, "#%ld", (INTVAL (x
) >> 16) & 0xff);
1618 fprintf (file
, "%s", byte_reg (x
, 0));
1621 if (GET_CODE (x
) == CONST_INT
)
1622 fprintf (file
, "#%ld", (INTVAL (x
) >> 24) & 0xff);
1624 fprintf (file
, "%s", byte_reg (x
, 1));
1629 switch (GET_CODE (x
))
1632 switch (GET_MODE (x
))
1635 #if 0 /* Is it asm ("mov.b %0,r2l", ...) */
1636 fprintf (file
, "%s", byte_reg (x
, 0));
1637 #else /* ... or is it asm ("mov.b %0l,r2l", ...) */
1638 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1642 fprintf (file
, "%s", names_big
[REGNO (x
)]);
1646 fprintf (file
, "%s", names_extended
[REGNO (x
)]);
1655 rtx addr
= XEXP (x
, 0);
1657 fprintf (file
, "@");
1658 output_address (addr
);
1660 /* Add a length suffix to constant addresses. Although this
1661 is often unnecessary, it helps to avoid ambiguity in the
1662 syntax of mova. If we wrote an insn like:
1664 mova/w.l @(1,@foo.b),er0
1666 then .b would be considered part of the symbol name.
1667 Adding a length after foo will avoid this. */
1668 if (CONSTANT_P (addr
))
1672 /* Used for mov.b and bit operations. */
1673 if (h8300_eightbit_constant_address_p (addr
))
1675 fprintf (file
, ":8");
1679 /* Fall through. We should not get here if we are
1680 processing bit operations on H8/300 or H8/300H
1681 because 'U' constraint does not allow bit
1682 operations on the tiny area on these machines. */
1687 if (h8300_constant_length (addr
) == 2)
1688 fprintf (file
, ":16");
1690 fprintf (file
, ":32");
1702 fprintf (file
, "#");
1703 h8300_print_operand_address (file
, x
);
1709 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
1710 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
1711 fprintf (file
, "#%ld", val
);
1720 /* Implements TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
1723 h8300_print_operand_punct_valid_p (unsigned char code
)
1725 return (code
== '#');
1728 /* Output assembly language output for the address ADDR to FILE. */
1731 h8300_print_operand_address (FILE *file
, rtx addr
)
1736 switch (GET_CODE (addr
))
1739 fprintf (file
, "%s", h8_reg_names
[REGNO (addr
)]);
1743 fprintf (file
, "-%s", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1747 fprintf (file
, "%s+", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1751 fprintf (file
, "+%s", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1755 fprintf (file
, "%s-", h8_reg_names
[REGNO (XEXP (addr
, 0))]);
1759 fprintf (file
, "(");
1761 index
= h8300_get_index (XEXP (addr
, 0), VOIDmode
, &size
);
1762 if (GET_CODE (index
) == REG
)
1765 h8300_print_operand_address (file
, XEXP (addr
, 1));
1766 fprintf (file
, ",");
1770 h8300_print_operand_address (file
, index
);
1774 h8300_print_operand (file
, index
, 'X');
1779 h8300_print_operand (file
, index
, 'T');
1784 h8300_print_operand (file
, index
, 'S');
1788 /* h8300_print_operand_address (file, XEXP (addr, 0)); */
1793 h8300_print_operand_address (file
, XEXP (addr
, 0));
1794 fprintf (file
, "+");
1795 h8300_print_operand_address (file
, XEXP (addr
, 1));
1797 fprintf (file
, ")");
1802 /* Since the H8/300 only has 16-bit pointers, negative values are also
1803 those >= 32768. This happens for example with pointer minus a
1804 constant. We don't want to turn (char *p - 2) into
1805 (char *p + 65534) because loop unrolling can build upon this
1806 (IE: char *p + 131068). */
1807 int n
= INTVAL (addr
);
1809 n
= (int) (short) n
;
1810 fprintf (file
, "%d", n
);
1815 output_addr_const (file
, addr
);
1820 /* Output all insn addresses and their sizes into the assembly language
1821 output file. This is helpful for debugging whether the length attributes
1822 in the md file are correct. This is not meant to be a user selectable
1826 final_prescan_insn (rtx insn
, rtx
*operand ATTRIBUTE_UNUSED
,
1827 int num_operands ATTRIBUTE_UNUSED
)
1829 /* This holds the last insn address. */
1830 static int last_insn_address
= 0;
1832 const int uid
= INSN_UID (insn
);
1834 if (TARGET_ADDRESSES
)
1836 fprintf (asm_out_file
, "; 0x%x %d\n", INSN_ADDRESSES (uid
),
1837 INSN_ADDRESSES (uid
) - last_insn_address
);
1838 last_insn_address
= INSN_ADDRESSES (uid
);
1842 /* Prepare for an SI sized move. */
1845 h8300_expand_movsi (rtx operands
[])
1847 rtx src
= operands
[1];
1848 rtx dst
= operands
[0];
1849 if (!reload_in_progress
&& !reload_completed
)
1851 if (!register_operand (dst
, GET_MODE (dst
)))
1853 rtx tmp
= gen_reg_rtx (GET_MODE (dst
));
1854 emit_move_insn (tmp
, src
);
1861 /* Given FROM and TO register numbers, say whether this elimination is allowed.
1862 Frame pointer elimination is automatically handled.
1864 For the h8300, if frame pointer elimination is being done, we would like to
1865 convert ap and rp into sp, not fp.
1867 All other eliminations are valid. */
1870 h8300_can_eliminate (const int from ATTRIBUTE_UNUSED
, const int to
)
1872 return (to
== STACK_POINTER_REGNUM
? ! frame_pointer_needed
: true);
1875 /* Conditionally modify register usage based on target flags. */
1878 h8300_conditional_register_usage (void)
1881 fixed_regs
[MAC_REG
] = call_used_regs
[MAC_REG
] = 1;
1884 /* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
1885 Define the offset between two registers, one to be eliminated, and
1886 the other its replacement, at the start of a routine. */
1889 h8300_initial_elimination_offset (int from
, int to
)
1891 /* The number of bytes that the return address takes on the stack. */
1892 int pc_size
= POINTER_SIZE
/ BITS_PER_UNIT
;
1894 /* The number of bytes that the saved frame pointer takes on the stack. */
1895 int fp_size
= frame_pointer_needed
* UNITS_PER_WORD
;
1897 /* The number of bytes that the saved registers, excluding the frame
1898 pointer, take on the stack. */
1899 int saved_regs_size
= 0;
1901 /* The number of bytes that the locals takes on the stack. */
1902 int frame_size
= round_frame_size (get_frame_size ());
1906 for (regno
= 0; regno
<= HARD_FRAME_POINTER_REGNUM
; regno
++)
1907 if (WORD_REG_USED (regno
))
1908 saved_regs_size
+= UNITS_PER_WORD
;
1910 /* Adjust saved_regs_size because the above loop took the frame
1911 pointer int account. */
1912 saved_regs_size
-= fp_size
;
1916 case HARD_FRAME_POINTER_REGNUM
:
1919 case ARG_POINTER_REGNUM
:
1920 return pc_size
+ fp_size
;
1921 case RETURN_ADDRESS_POINTER_REGNUM
:
1923 case FRAME_POINTER_REGNUM
:
1924 return -saved_regs_size
;
1929 case STACK_POINTER_REGNUM
:
1932 case ARG_POINTER_REGNUM
:
1933 return pc_size
+ saved_regs_size
+ frame_size
;
1934 case RETURN_ADDRESS_POINTER_REGNUM
:
1935 return saved_regs_size
+ frame_size
;
1936 case FRAME_POINTER_REGNUM
:
1948 /* Worker function for RETURN_ADDR_RTX. */
1951 h8300_return_addr_rtx (int count
, rtx frame
)
1956 ret
= gen_rtx_MEM (Pmode
,
1957 gen_rtx_REG (Pmode
, RETURN_ADDRESS_POINTER_REGNUM
));
1958 else if (flag_omit_frame_pointer
)
1961 ret
= gen_rtx_MEM (Pmode
,
1962 memory_address (Pmode
,
1963 plus_constant (frame
, UNITS_PER_WORD
)));
1964 set_mem_alias_set (ret
, get_frame_alias_set ());
1968 /* Update the condition code from the insn. */
1971 notice_update_cc (rtx body
, rtx insn
)
1975 switch (get_attr_cc (insn
))
1978 /* Insn does not affect CC at all. */
1982 /* Insn does not change CC, but the 0'th operand has been changed. */
1983 if (cc_status
.value1
!= 0
1984 && reg_overlap_mentioned_p (recog_data
.operand
[0], cc_status
.value1
))
1985 cc_status
.value1
= 0;
1986 if (cc_status
.value2
!= 0
1987 && reg_overlap_mentioned_p (recog_data
.operand
[0], cc_status
.value2
))
1988 cc_status
.value2
= 0;
1992 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
1993 The V flag is unusable. The C flag may or may not be known but
1994 that's ok because alter_cond will change tests to use EQ/NE. */
1996 cc_status
.flags
|= CC_OVERFLOW_UNUSABLE
| CC_NO_CARRY
;
1997 set
= single_set (insn
);
1998 cc_status
.value1
= SET_SRC (set
);
1999 if (SET_DEST (set
) != cc0_rtx
)
2000 cc_status
.value2
= SET_DEST (set
);
2004 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
2005 The C flag may or may not be known but that's ok because
2006 alter_cond will change tests to use EQ/NE. */
2008 cc_status
.flags
|= CC_NO_CARRY
;
2009 set
= single_set (insn
);
2010 cc_status
.value1
= SET_SRC (set
);
2011 if (SET_DEST (set
) != cc0_rtx
)
2013 /* If the destination is STRICT_LOW_PART, strip off
2015 if (GET_CODE (SET_DEST (set
)) == STRICT_LOW_PART
)
2016 cc_status
.value2
= XEXP (SET_DEST (set
), 0);
2018 cc_status
.value2
= SET_DEST (set
);
2023 /* The insn is a compare instruction. */
2025 cc_status
.value1
= SET_SRC (body
);
2029 /* Insn doesn't leave CC in a usable state. */
2035 /* Given that X occurs in an address of the form (plus X constant),
2036 return the part of X that is expected to be a register. There are
2037 four kinds of addressing mode to recognize:
2044 If SIZE is nonnull, and the address is one of the last three forms,
2045 set *SIZE to the index multiplication factor. Set it to 0 for
2046 plain @(dd,Rn) addresses.
2048 MODE is the mode of the value being accessed. It can be VOIDmode
2049 if the address is known to be valid, but its mode is unknown. */
2052 h8300_get_index (rtx x
, enum machine_mode mode
, int *size
)
2059 factor
= (mode
== VOIDmode
? 0 : GET_MODE_SIZE (mode
));
2062 && (mode
== VOIDmode
2063 || GET_MODE_CLASS (mode
) == MODE_INT
2064 || GET_MODE_CLASS (mode
) == MODE_FLOAT
))
2066 if (factor
<= 1 && GET_CODE (x
) == ZERO_EXTEND
)
2068 /* When accessing byte-sized values, the index can be
2069 a zero-extended QImode or HImode register. */
2070 *size
= GET_MODE_SIZE (GET_MODE (XEXP (x
, 0)));
2075 /* We're looking for addresses of the form:
2078 or (mult (zero_extend X) I)
2080 where I is the size of the operand being accessed.
2081 The canonical form of the second expression is:
2083 (and (mult (subreg X) I) J)
2085 where J == GET_MODE_MASK (GET_MODE (X)) * I. */
2088 if (GET_CODE (x
) == AND
2089 && GET_CODE (XEXP (x
, 1)) == CONST_INT
2091 || INTVAL (XEXP (x
, 1)) == 0xff * factor
2092 || INTVAL (XEXP (x
, 1)) == 0xffff * factor
))
2094 index
= XEXP (x
, 0);
2095 *size
= (INTVAL (XEXP (x
, 1)) >= 0xffff ? 2 : 1);
2103 if (GET_CODE (index
) == MULT
2104 && GET_CODE (XEXP (index
, 1)) == CONST_INT
2105 && (factor
== 0 || factor
== INTVAL (XEXP (index
, 1))))
2106 return XEXP (index
, 0);
2113 /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.
2115 On the H8/300, the predecrement and postincrement address depend thus
2116 (the amount of decrement or increment being the length of the operand). */
2119 h8300_mode_dependent_address_p (const_rtx addr
)
2121 if (GET_CODE (addr
) == PLUS
2122 && h8300_get_index (XEXP (addr
, 0), VOIDmode
, 0) != XEXP (addr
, 0))
2128 static const h8300_length_table addb_length_table
=
2130 /* #xx Rs @aa @Rs @xx */
2131 { 2, 2, 4, 4, 4 }, /* add.b xx,Rd */
2132 { 4, 4, 4, 4, 6 }, /* add.b xx,@aa */
2133 { 4, 4, 4, 4, 6 }, /* add.b xx,@Rd */
2134 { 6, 4, 4, 4, 6 } /* add.b xx,@xx */
2137 static const h8300_length_table addw_length_table
=
2139 /* #xx Rs @aa @Rs @xx */
2140 { 2, 2, 4, 4, 4 }, /* add.w xx,Rd */
2141 { 4, 4, 4, 4, 6 }, /* add.w xx,@aa */
2142 { 4, 4, 4, 4, 6 }, /* add.w xx,@Rd */
2143 { 4, 4, 4, 4, 6 } /* add.w xx,@xx */
2146 static const h8300_length_table addl_length_table
=
2148 /* #xx Rs @aa @Rs @xx */
2149 { 2, 2, 4, 4, 4 }, /* add.l xx,Rd */
2150 { 4, 4, 6, 6, 6 }, /* add.l xx,@aa */
2151 { 4, 4, 6, 6, 6 }, /* add.l xx,@Rd */
2152 { 4, 4, 6, 6, 6 } /* add.l xx,@xx */
2155 #define logicb_length_table addb_length_table
2156 #define logicw_length_table addw_length_table
2158 static const h8300_length_table logicl_length_table
=
2160 /* #xx Rs @aa @Rs @xx */
2161 { 2, 4, 4, 4, 4 }, /* and.l xx,Rd */
2162 { 4, 4, 6, 6, 6 }, /* and.l xx,@aa */
2163 { 4, 4, 6, 6, 6 }, /* and.l xx,@Rd */
2164 { 4, 4, 6, 6, 6 } /* and.l xx,@xx */
2167 static const h8300_length_table movb_length_table
=
2169 /* #xx Rs @aa @Rs @xx */
2170 { 2, 2, 2, 2, 4 }, /* mov.b xx,Rd */
2171 { 4, 2, 4, 4, 4 }, /* mov.b xx,@aa */
2172 { 4, 2, 4, 4, 4 }, /* mov.b xx,@Rd */
2173 { 4, 4, 4, 4, 4 } /* mov.b xx,@xx */
2176 #define movw_length_table movb_length_table
2178 static const h8300_length_table movl_length_table
=
2180 /* #xx Rs @aa @Rs @xx */
2181 { 2, 2, 4, 4, 4 }, /* mov.l xx,Rd */
2182 { 4, 4, 4, 4, 4 }, /* mov.l xx,@aa */
2183 { 4, 4, 4, 4, 4 }, /* mov.l xx,@Rd */
2184 { 4, 4, 4, 4, 4 } /* mov.l xx,@xx */
2187 /* Return the size of the given address or displacement constant. */
2190 h8300_constant_length (rtx constant
)
2192 /* Check for (@d:16,Reg). */
2193 if (GET_CODE (constant
) == CONST_INT
2194 && IN_RANGE (INTVAL (constant
), -0x8000, 0x7fff))
2197 /* Check for (@d:16,Reg) in cases where the displacement is
2198 an absolute address. */
2199 if (Pmode
== HImode
|| h8300_tiny_constant_address_p (constant
))
2205 /* Return the size of a displacement field in address ADDR, which should
2206 have the form (plus X constant). SIZE is the number of bytes being
2210 h8300_displacement_length (rtx addr
, int size
)
2214 offset
= XEXP (addr
, 1);
2216 /* Check for @(d:2,Reg). */
2217 if (register_operand (XEXP (addr
, 0), VOIDmode
)
2218 && GET_CODE (offset
) == CONST_INT
2219 && (INTVAL (offset
) == size
2220 || INTVAL (offset
) == size
* 2
2221 || INTVAL (offset
) == size
* 3))
2224 return h8300_constant_length (offset
);
2227 /* Store the class of operand OP in *OPCLASS and return the length of any
2228 extra operand fields. SIZE is the number of bytes in OP. OPCLASS
2229 can be null if only the length is needed. */
2232 h8300_classify_operand (rtx op
, int size
, enum h8300_operand_class
*opclass
)
2234 enum h8300_operand_class dummy
;
2239 if (CONSTANT_P (op
))
2241 *opclass
= H8OP_IMMEDIATE
;
2243 /* Byte-sized immediates are stored in the opcode fields. */
2247 /* If this is a 32-bit instruction, see whether the constant
2248 will fit into a 16-bit immediate field. */
2251 && GET_CODE (op
) == CONST_INT
2252 && IN_RANGE (INTVAL (op
), 0, 0xffff))
2257 else if (GET_CODE (op
) == MEM
)
2260 if (CONSTANT_P (op
))
2262 *opclass
= H8OP_MEM_ABSOLUTE
;
2263 return h8300_constant_length (op
);
2265 else if (GET_CODE (op
) == PLUS
&& CONSTANT_P (XEXP (op
, 1)))
2267 *opclass
= H8OP_MEM_COMPLEX
;
2268 return h8300_displacement_length (op
, size
);
2270 else if (GET_RTX_CLASS (GET_CODE (op
)) == RTX_AUTOINC
)
2272 *opclass
= H8OP_MEM_COMPLEX
;
2275 else if (register_operand (op
, VOIDmode
))
2277 *opclass
= H8OP_MEM_BASE
;
2281 gcc_assert (register_operand (op
, VOIDmode
));
2282 *opclass
= H8OP_REGISTER
;
2286 /* Return the length of the instruction described by TABLE given that
2287 its operands are OP1 and OP2. OP1 must be an h8300_dst_operand
2288 and OP2 must be an h8300_src_operand. */
2291 h8300_length_from_table (rtx op1
, rtx op2
, const h8300_length_table
*table
)
2293 enum h8300_operand_class op1_class
, op2_class
;
2294 unsigned int size
, immediate_length
;
2296 size
= GET_MODE_SIZE (GET_MODE (op1
));
2297 immediate_length
= (h8300_classify_operand (op1
, size
, &op1_class
)
2298 + h8300_classify_operand (op2
, size
, &op2_class
));
2299 return immediate_length
+ (*table
)[op1_class
- 1][op2_class
];
2302 /* Return the length of a unary instruction such as neg or not given that
2303 its operand is OP. */
2306 h8300_unary_length (rtx op
)
2308 enum h8300_operand_class opclass
;
2309 unsigned int size
, operand_length
;
2311 size
= GET_MODE_SIZE (GET_MODE (op
));
2312 operand_length
= h8300_classify_operand (op
, size
, &opclass
);
2319 return (size
== 4 ? 6 : 4);
2321 case H8OP_MEM_ABSOLUTE
:
2322 return operand_length
+ (size
== 4 ? 6 : 4);
2324 case H8OP_MEM_COMPLEX
:
2325 return operand_length
+ 6;
2332 /* Likewise short immediate instructions such as add.w #xx:3,OP. */
2335 h8300_short_immediate_length (rtx op
)
2337 enum h8300_operand_class opclass
;
2338 unsigned int size
, operand_length
;
2340 size
= GET_MODE_SIZE (GET_MODE (op
));
2341 operand_length
= h8300_classify_operand (op
, size
, &opclass
);
2349 case H8OP_MEM_ABSOLUTE
:
2350 case H8OP_MEM_COMPLEX
:
2351 return 4 + operand_length
;
2358 /* Likewise bitfield load and store instructions. */
2361 h8300_bitfield_length (rtx op
, rtx op2
)
2363 enum h8300_operand_class opclass
;
2364 unsigned int size
, operand_length
;
2366 if (GET_CODE (op
) == REG
)
2368 gcc_assert (GET_CODE (op
) != REG
);
2370 size
= GET_MODE_SIZE (GET_MODE (op
));
2371 operand_length
= h8300_classify_operand (op
, size
, &opclass
);
2376 case H8OP_MEM_ABSOLUTE
:
2377 case H8OP_MEM_COMPLEX
:
2378 return 4 + operand_length
;
2385 /* Calculate the length of general binary instruction INSN using TABLE. */
2388 h8300_binary_length (rtx insn
, const h8300_length_table
*table
)
2392 set
= single_set (insn
);
2395 if (BINARY_P (SET_SRC (set
)))
2396 return h8300_length_from_table (XEXP (SET_SRC (set
), 0),
2397 XEXP (SET_SRC (set
), 1), table
);
2400 gcc_assert (GET_RTX_CLASS (GET_CODE (SET_SRC (set
))) == RTX_TERNARY
);
2401 return h8300_length_from_table (XEXP (XEXP (SET_SRC (set
), 1), 0),
2402 XEXP (XEXP (SET_SRC (set
), 1), 1),
2407 /* Subroutine of h8300_move_length. Return true if OP is 1- or 2-byte
2408 memory reference and either (1) it has the form @(d:16,Rn) or
2409 (2) its address has the code given by INC_CODE. */
2412 h8300_short_move_mem_p (rtx op
, enum rtx_code inc_code
)
2417 if (GET_CODE (op
) != MEM
)
2420 addr
= XEXP (op
, 0);
2421 size
= GET_MODE_SIZE (GET_MODE (op
));
2422 if (size
!= 1 && size
!= 2)
2425 return (GET_CODE (addr
) == inc_code
2426 || (GET_CODE (addr
) == PLUS
2427 && GET_CODE (XEXP (addr
, 0)) == REG
2428 && h8300_displacement_length (addr
, size
) == 2));
2431 /* Calculate the length of move instruction INSN using the given length
2432 table. Although the tables are correct for most cases, there is some
2433 irregularity in the length of mov.b and mov.w. The following forms:
2440 are two bytes shorter than most other "mov Rs, @complex" or
2441 "mov @complex,Rd" combinations. */
2444 h8300_move_length (rtx
*operands
, const h8300_length_table
*table
)
2448 size
= h8300_length_from_table (operands
[0], operands
[1], table
);
2449 if (REG_P (operands
[0]) && h8300_short_move_mem_p (operands
[1], POST_INC
))
2451 if (REG_P (operands
[1]) && h8300_short_move_mem_p (operands
[0], PRE_DEC
))
2456 /* Return the length of a mova instruction with the given operands.
2457 DEST is the register destination, SRC is the source address and
2458 OFFSET is the 16-bit or 32-bit displacement. */
2461 h8300_mova_length (rtx dest
, rtx src
, rtx offset
)
2466 + h8300_constant_length (offset
)
2467 + h8300_classify_operand (src
, GET_MODE_SIZE (GET_MODE (src
)), 0));
2468 if (!REG_P (dest
) || !REG_P (src
) || REGNO (src
) != REGNO (dest
))
2473 /* Compute the length of INSN based on its length_table attribute.
2474 OPERANDS is the array of its operands. */
2477 h8300_insn_length_from_table (rtx insn
, rtx
* operands
)
2479 switch (get_attr_length_table (insn
))
2481 case LENGTH_TABLE_NONE
:
2484 case LENGTH_TABLE_ADDB
:
2485 return h8300_binary_length (insn
, &addb_length_table
);
2487 case LENGTH_TABLE_ADDW
:
2488 return h8300_binary_length (insn
, &addw_length_table
);
2490 case LENGTH_TABLE_ADDL
:
2491 return h8300_binary_length (insn
, &addl_length_table
);
2493 case LENGTH_TABLE_LOGICB
:
2494 return h8300_binary_length (insn
, &logicb_length_table
);
2496 case LENGTH_TABLE_MOVB
:
2497 return h8300_move_length (operands
, &movb_length_table
);
2499 case LENGTH_TABLE_MOVW
:
2500 return h8300_move_length (operands
, &movw_length_table
);
2502 case LENGTH_TABLE_MOVL
:
2503 return h8300_move_length (operands
, &movl_length_table
);
2505 case LENGTH_TABLE_MOVA
:
2506 return h8300_mova_length (operands
[0], operands
[1], operands
[2]);
2508 case LENGTH_TABLE_MOVA_ZERO
:
2509 return h8300_mova_length (operands
[0], operands
[1], const0_rtx
);
2511 case LENGTH_TABLE_UNARY
:
2512 return h8300_unary_length (operands
[0]);
2514 case LENGTH_TABLE_MOV_IMM4
:
2515 return 2 + h8300_classify_operand (operands
[0], 0, 0);
2517 case LENGTH_TABLE_SHORT_IMMEDIATE
:
2518 return h8300_short_immediate_length (operands
[0]);
2520 case LENGTH_TABLE_BITFIELD
:
2521 return h8300_bitfield_length (operands
[0], operands
[1]);
2523 case LENGTH_TABLE_BITBRANCH
:
2524 return h8300_bitfield_length (operands
[1], operands
[2]) - 2;
2531 /* Return true if LHS and RHS are memory references that can be mapped
2532 to the same h8sx assembly operand. LHS appears as the destination of
2533 an instruction and RHS appears as a source.
2535 Three cases are allowed:
2537 - RHS is @+Rn or @-Rn, LHS is @Rn
2538 - RHS is @Rn, LHS is @Rn+ or @Rn-
2539 - RHS and LHS have the same address and neither has side effects. */
2542 h8sx_mergeable_memrefs_p (rtx lhs
, rtx rhs
)
2544 if (GET_CODE (rhs
) == MEM
&& GET_CODE (lhs
) == MEM
)
2546 rhs
= XEXP (rhs
, 0);
2547 lhs
= XEXP (lhs
, 0);
2549 if (GET_CODE (rhs
) == PRE_INC
|| GET_CODE (rhs
) == PRE_DEC
)
2550 return rtx_equal_p (XEXP (rhs
, 0), lhs
);
2552 if (GET_CODE (lhs
) == POST_INC
|| GET_CODE (lhs
) == POST_DEC
)
2553 return rtx_equal_p (rhs
, XEXP (lhs
, 0));
2555 if (rtx_equal_p (rhs
, lhs
))
2561 /* Return true if OPERANDS[1] can be mapped to the same assembly
2562 operand as OPERANDS[0]. */
2565 h8300_operands_match_p (rtx
*operands
)
2567 if (register_operand (operands
[0], VOIDmode
)
2568 && register_operand (operands
[1], VOIDmode
))
2571 if (h8sx_mergeable_memrefs_p (operands
[0], operands
[1]))
2577 /* Try using movmd to move LENGTH bytes from memory region SRC to memory
2578 region DEST. The two regions do not overlap and have the common
2579 alignment given by ALIGNMENT. Return true on success.
2581 Using movmd for variable-length moves seems to involve some
2582 complex trade-offs. For instance:
2584 - Preparing for a movmd instruction is similar to preparing
2585 for a memcpy. The main difference is that the arguments
2586 are moved into er4, er5 and er6 rather than er0, er1 and er2.
2588 - Since movmd clobbers the frame pointer, we need to save
2589 and restore it somehow when frame_pointer_needed. This can
2590 sometimes make movmd sequences longer than calls to memcpy().
2592 - The counter register is 16 bits, so the instruction is only
2593 suitable for variable-length moves when sizeof (size_t) == 2.
2594 That's only true in normal mode.
2596 - We will often lack static alignment information. Falling back
2597 on movmd.b would likely be slower than calling memcpy(), at least
2600 This function therefore only uses movmd when the length is a
2601 known constant, and only then if -fomit-frame-pointer is in
2602 effect or if we're not optimizing for size.
2604 At the moment the function uses movmd for all in-range constants,
2605 but it might be better to fall back on memcpy() for large moves
2606 if ALIGNMENT == 1. */
2609 h8sx_emit_movmd (rtx dest
, rtx src
, rtx length
,
2610 HOST_WIDE_INT alignment
)
2612 if (!flag_omit_frame_pointer
&& optimize_size
)
2615 if (GET_CODE (length
) == CONST_INT
)
2617 rtx dest_reg
, src_reg
, first_dest
, first_src
;
2621 /* Use movmd.l if the alignment allows it, otherwise fall back
2623 factor
= (alignment
>= 2 ? 4 : 1);
2625 /* Make sure the length is within range. We can handle counter
2626 values up to 65536, although HImode truncation will make
2627 the count appear negative in rtl dumps. */
2628 n
= INTVAL (length
);
2629 if (n
<= 0 || n
/ factor
> 65536)
2632 /* Create temporary registers for the source and destination
2633 pointers. Initialize them to the start of each region. */
2634 dest_reg
= copy_addr_to_reg (XEXP (dest
, 0));
2635 src_reg
= copy_addr_to_reg (XEXP (src
, 0));
2637 /* Create references to the movmd source and destination blocks. */
2638 first_dest
= replace_equiv_address (dest
, dest_reg
);
2639 first_src
= replace_equiv_address (src
, src_reg
);
2641 set_mem_size (first_dest
, GEN_INT (n
& -factor
));
2642 set_mem_size (first_src
, GEN_INT (n
& -factor
));
2644 length
= copy_to_mode_reg (HImode
, gen_int_mode (n
/ factor
, HImode
));
2645 emit_insn (gen_movmd (first_dest
, first_src
, length
, GEN_INT (factor
)));
2647 if ((n
& -factor
) != n
)
2649 /* Move SRC and DEST past the region we just copied.
2650 This is done to update the memory attributes. */
2651 dest
= adjust_address (dest
, BLKmode
, n
& -factor
);
2652 src
= adjust_address (src
, BLKmode
, n
& -factor
);
2654 /* Replace the addresses with the source and destination
2655 registers, which movmd has left with the right values. */
2656 dest
= replace_equiv_address (dest
, dest_reg
);
2657 src
= replace_equiv_address (src
, src_reg
);
2659 /* Mop up the left-over bytes. */
2661 emit_move_insn (adjust_address (dest
, HImode
, 0),
2662 adjust_address (src
, HImode
, 0));
2664 emit_move_insn (adjust_address (dest
, QImode
, n
& 2),
2665 adjust_address (src
, QImode
, n
& 2));
2672 /* Move ADDR into er6 after pushing its old value onto the stack. */
2675 h8300_swap_into_er6 (rtx addr
)
2677 push (HARD_FRAME_POINTER_REGNUM
);
2678 emit_move_insn (hard_frame_pointer_rtx
, addr
);
2679 if (REGNO (addr
) == SP_REG
)
2680 emit_move_insn (hard_frame_pointer_rtx
,
2681 plus_constant (hard_frame_pointer_rtx
,
2682 GET_MODE_SIZE (word_mode
)));
2685 /* Move the current value of er6 into ADDR and pop its old value
2689 h8300_swap_out_of_er6 (rtx addr
)
2691 if (REGNO (addr
) != SP_REG
)
2692 emit_move_insn (addr
, hard_frame_pointer_rtx
);
2693 pop (HARD_FRAME_POINTER_REGNUM
);
2696 /* Return the length of mov instruction. */
2699 compute_mov_length (rtx
*operands
)
2701 /* If the mov instruction involves a memory operand, we compute the
2702 length, assuming the largest addressing mode is used, and then
2703 adjust later in the function. Otherwise, we compute and return
2704 the exact length in one step. */
2705 enum machine_mode mode
= GET_MODE (operands
[0]);
2706 rtx dest
= operands
[0];
2707 rtx src
= operands
[1];
2710 if (GET_CODE (src
) == MEM
)
2711 addr
= XEXP (src
, 0);
2712 else if (GET_CODE (dest
) == MEM
)
2713 addr
= XEXP (dest
, 0);
2719 unsigned int base_length
;
2724 if (addr
== NULL_RTX
)
2727 /* The eightbit addressing is available only in QImode, so
2728 go ahead and take care of it. */
2729 if (h8300_eightbit_constant_address_p (addr
))
2736 if (addr
== NULL_RTX
)
2741 if (src
== const0_rtx
)
2751 if (addr
== NULL_RTX
)
2756 if (GET_CODE (src
) == CONST_INT
)
2758 if (src
== const0_rtx
)
2761 if ((INTVAL (src
) & 0xffff) == 0)
2764 if ((INTVAL (src
) & 0xffff) == 0)
2767 if ((INTVAL (src
) & 0xffff)
2768 == ((INTVAL (src
) >> 16) & 0xffff))
2778 if (addr
== NULL_RTX
)
2783 if (satisfies_constraint_G (src
))
2796 /* Adjust the length based on the addressing mode used.
2797 Specifically, we subtract the difference between the actual
2798 length and the longest one, which is @(d:16,Rs). For SImode
2799 and SFmode, we double the adjustment because two mov.w are
2800 used to do the job. */
2802 /* @Rs+ and @-Rd are 2 bytes shorter than the longest. */
2803 if (GET_CODE (addr
) == PRE_DEC
2804 || GET_CODE (addr
) == POST_INC
)
2806 if (mode
== QImode
|| mode
== HImode
)
2807 return base_length
- 2;
2809 /* In SImode and SFmode, we use two mov.w instructions, so
2810 double the adjustment. */
2811 return base_length
- 4;
2814 /* @Rs and @Rd are 2 bytes shorter than the longest. Note that
2815 in SImode and SFmode, the second mov.w involves an address
2816 with displacement, namely @(2,Rs) or @(2,Rd), so we subtract
2818 if (GET_CODE (addr
) == REG
)
2819 return base_length
- 2;
2825 unsigned int base_length
;
2830 if (addr
== NULL_RTX
)
2833 /* The eightbit addressing is available only in QImode, so
2834 go ahead and take care of it. */
2835 if (h8300_eightbit_constant_address_p (addr
))
2842 if (addr
== NULL_RTX
)
2847 if (src
== const0_rtx
)
2857 if (addr
== NULL_RTX
)
2861 if (REGNO (src
) == MAC_REG
|| REGNO (dest
) == MAC_REG
)
2867 if (GET_CODE (src
) == CONST_INT
)
2869 int val
= INTVAL (src
);
2874 if (val
== (val
& 0x00ff) || val
== (val
& 0xff00))
2877 switch (val
& 0xffffffff)
2898 if (addr
== NULL_RTX
)
2903 if (satisfies_constraint_G (src
))
2916 /* Adjust the length based on the addressing mode used.
2917 Specifically, we subtract the difference between the actual
2918 length and the longest one, which is @(d:24,ERs). */
2920 /* @ERs+ and @-ERd are 6 bytes shorter than the longest. */
2921 if (GET_CODE (addr
) == PRE_DEC
2922 || GET_CODE (addr
) == POST_INC
)
2923 return base_length
- 6;
2925 /* @ERs and @ERd are 6 bytes shorter than the longest. */
2926 if (GET_CODE (addr
) == REG
)
2927 return base_length
- 6;
2929 /* @(d:16,ERs) and @(d:16,ERd) are 4 bytes shorter than the
2931 if (GET_CODE (addr
) == PLUS
2932 && GET_CODE (XEXP (addr
, 0)) == REG
2933 && GET_CODE (XEXP (addr
, 1)) == CONST_INT
2934 && INTVAL (XEXP (addr
, 1)) > -32768
2935 && INTVAL (XEXP (addr
, 1)) < 32767)
2936 return base_length
- 4;
2938 /* @aa:16 is 4 bytes shorter than the longest. */
2939 if (h8300_tiny_constant_address_p (addr
))
2940 return base_length
- 4;
2942 /* @aa:24 is 2 bytes shorter than the longest. */
2943 if (CONSTANT_P (addr
))
2944 return base_length
- 2;
2950 /* Output an addition insn. */
2953 output_plussi (rtx
*operands
)
2955 enum machine_mode mode
= GET_MODE (operands
[0]);
2957 gcc_assert (mode
== SImode
);
2961 if (GET_CODE (operands
[2]) == REG
)
2962 return "add.w\t%f2,%f0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2964 if (GET_CODE (operands
[2]) == CONST_INT
)
2966 HOST_WIDE_INT n
= INTVAL (operands
[2]);
2968 if ((n
& 0xffffff) == 0)
2969 return "add\t%z2,%z0";
2970 if ((n
& 0xffff) == 0)
2971 return "add\t%y2,%y0\n\taddx\t%z2,%z0";
2972 if ((n
& 0xff) == 0)
2973 return "add\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2976 return "add\t%w2,%w0\n\taddx\t%x2,%x0\n\taddx\t%y2,%y0\n\taddx\t%z2,%z0";
2980 if (GET_CODE (operands
[2]) == CONST_INT
2981 && register_operand (operands
[1], VOIDmode
))
2983 HOST_WIDE_INT intval
= INTVAL (operands
[2]);
2985 if (TARGET_H8300SX
&& (intval
>= 1 && intval
<= 7))
2986 return "add.l\t%S2,%S0";
2987 if (TARGET_H8300SX
&& (intval
>= -7 && intval
<= -1))
2988 return "sub.l\t%G2,%S0";
2990 /* See if we can finish with 2 bytes. */
2992 switch ((unsigned int) intval
& 0xffffffff)
2997 return "adds\t%2,%S0";
3002 return "subs\t%G2,%S0";
3006 operands
[2] = GEN_INT (intval
>> 16);
3007 return "inc.w\t%2,%e0";
3011 operands
[2] = GEN_INT (intval
>> 16);
3012 return "dec.w\t%G2,%e0";
3015 /* See if we can finish with 4 bytes. */
3016 if ((intval
& 0xffff) == 0)
3018 operands
[2] = GEN_INT (intval
>> 16);
3019 return "add.w\t%2,%e0";
3023 if (GET_CODE (operands
[2]) == CONST_INT
&& INTVAL (operands
[2]) < 0)
3025 operands
[2] = GEN_INT (-INTVAL (operands
[2]));
3026 return "sub.l\t%S2,%S0";
3028 return "add.l\t%S2,%S0";
3032 /* ??? It would be much easier to add the h8sx stuff if a single function
3033 classified the addition as either inc/dec, adds/subs, add.w or add.l. */
3034 /* Compute the length of an addition insn. */
3037 compute_plussi_length (rtx
*operands
)
3039 enum machine_mode mode
= GET_MODE (operands
[0]);
3041 gcc_assert (mode
== SImode
);
3045 if (GET_CODE (operands
[2]) == REG
)
3048 if (GET_CODE (operands
[2]) == CONST_INT
)
3050 HOST_WIDE_INT n
= INTVAL (operands
[2]);
3052 if ((n
& 0xffffff) == 0)
3054 if ((n
& 0xffff) == 0)
3056 if ((n
& 0xff) == 0)
3064 if (GET_CODE (operands
[2]) == CONST_INT
3065 && register_operand (operands
[1], VOIDmode
))
3067 HOST_WIDE_INT intval
= INTVAL (operands
[2]);
3069 if (TARGET_H8300SX
&& (intval
>= 1 && intval
<= 7))
3071 if (TARGET_H8300SX
&& (intval
>= -7 && intval
<= -1))
3074 /* See if we can finish with 2 bytes. */
3076 switch ((unsigned int) intval
& 0xffffffff)
3097 /* See if we can finish with 4 bytes. */
3098 if ((intval
& 0xffff) == 0)
3102 if (GET_CODE (operands
[2]) == CONST_INT
&& INTVAL (operands
[2]) < 0)
3103 return h8300_length_from_table (operands
[0],
3104 GEN_INT (-INTVAL (operands
[2])),
3105 &addl_length_table
);
3107 return h8300_length_from_table (operands
[0], operands
[2],
3108 &addl_length_table
);
3113 /* Compute which flag bits are valid after an addition insn. */
3116 compute_plussi_cc (rtx
*operands
)
3118 enum machine_mode mode
= GET_MODE (operands
[0]);
3120 gcc_assert (mode
== SImode
);
3128 if (GET_CODE (operands
[2]) == CONST_INT
3129 && register_operand (operands
[1], VOIDmode
))
3131 HOST_WIDE_INT intval
= INTVAL (operands
[2]);
3133 if (TARGET_H8300SX
&& (intval
>= 1 && intval
<= 7))
3135 if (TARGET_H8300SX
&& (intval
>= -7 && intval
<= -1))
3138 /* See if we can finish with 2 bytes. */
3140 switch ((unsigned int) intval
& 0xffffffff)
3145 return CC_NONE_0HIT
;
3150 return CC_NONE_0HIT
;
3161 /* See if we can finish with 4 bytes. */
3162 if ((intval
& 0xffff) == 0)
3170 /* Output a logical insn. */
3173 output_logical_op (enum machine_mode mode
, rtx
*operands
)
3175 /* Figure out the logical op that we need to perform. */
3176 enum rtx_code code
= GET_CODE (operands
[3]);
3177 /* Pretend that every byte is affected if both operands are registers. */
3178 const unsigned HOST_WIDE_INT intval
=
3179 (unsigned HOST_WIDE_INT
) ((GET_CODE (operands
[2]) == CONST_INT
)
3180 /* Always use the full instruction if the
3181 first operand is in memory. It is better
3182 to use define_splits to generate the shorter
3183 sequence where valid. */
3184 && register_operand (operands
[1], VOIDmode
)
3185 ? INTVAL (operands
[2]) : 0x55555555);
3186 /* The determinant of the algorithm. If we perform an AND, 0
3187 affects a bit. Otherwise, 1 affects a bit. */
3188 const unsigned HOST_WIDE_INT det
= (code
!= AND
) ? intval
: ~intval
;
3189 /* Break up DET into pieces. */
3190 const unsigned HOST_WIDE_INT b0
= (det
>> 0) & 0xff;
3191 const unsigned HOST_WIDE_INT b1
= (det
>> 8) & 0xff;
3192 const unsigned HOST_WIDE_INT b2
= (det
>> 16) & 0xff;
3193 const unsigned HOST_WIDE_INT b3
= (det
>> 24) & 0xff;
3194 const unsigned HOST_WIDE_INT w0
= (det
>> 0) & 0xffff;
3195 const unsigned HOST_WIDE_INT w1
= (det
>> 16) & 0xffff;
3196 int lower_half_easy_p
= 0;
3197 int upper_half_easy_p
= 0;
3198 /* The name of an insn. */
3220 /* First, see if we can finish with one insn. */
3221 if ((TARGET_H8300H
|| TARGET_H8300S
)
3225 sprintf (insn_buf
, "%s.w\t%%T2,%%T0", opname
);
3226 output_asm_insn (insn_buf
, operands
);
3230 /* Take care of the lower byte. */
3233 sprintf (insn_buf
, "%s\t%%s2,%%s0", opname
);
3234 output_asm_insn (insn_buf
, operands
);
3236 /* Take care of the upper byte. */
3239 sprintf (insn_buf
, "%s\t%%t2,%%t0", opname
);
3240 output_asm_insn (insn_buf
, operands
);
3245 if (TARGET_H8300H
|| TARGET_H8300S
)
3247 /* Determine if the lower half can be taken care of in no more
3249 lower_half_easy_p
= (b0
== 0
3251 || (code
!= IOR
&& w0
== 0xffff));
3253 /* Determine if the upper half can be taken care of in no more
3255 upper_half_easy_p
= ((code
!= IOR
&& w1
== 0xffff)
3256 || (code
== AND
&& w1
== 0xff00));
3259 /* Check if doing everything with one insn is no worse than
3260 using multiple insns. */
3261 if ((TARGET_H8300H
|| TARGET_H8300S
)
3262 && w0
!= 0 && w1
!= 0
3263 && !(lower_half_easy_p
&& upper_half_easy_p
)
3264 && !(code
== IOR
&& w1
== 0xffff
3265 && (w0
& 0x8000) != 0 && lower_half_easy_p
))
3267 sprintf (insn_buf
, "%s.l\t%%S2,%%S0", opname
);
3268 output_asm_insn (insn_buf
, operands
);
3272 /* Take care of the lower and upper words individually. For
3273 each word, we try different methods in the order of
3275 1) the special insn (in case of AND or XOR),
3276 2) the word-wise insn, and
3277 3) The byte-wise insn. */
3279 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3280 output_asm_insn ((code
== AND
)
3281 ? "sub.w\t%f0,%f0" : "not.w\t%f0",
3283 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3287 sprintf (insn_buf
, "%s.w\t%%f2,%%f0", opname
);
3288 output_asm_insn (insn_buf
, operands
);
3294 sprintf (insn_buf
, "%s\t%%w2,%%w0", opname
);
3295 output_asm_insn (insn_buf
, operands
);
3299 sprintf (insn_buf
, "%s\t%%x2,%%x0", opname
);
3300 output_asm_insn (insn_buf
, operands
);
3305 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3306 output_asm_insn ((code
== AND
)
3307 ? "sub.w\t%e0,%e0" : "not.w\t%e0",
3309 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3312 && (w0
& 0x8000) != 0)
3314 output_asm_insn ("exts.l\t%S0", operands
);
3316 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3320 output_asm_insn ("extu.w\t%e0", operands
);
3322 else if (TARGET_H8300H
|| TARGET_H8300S
)
3326 sprintf (insn_buf
, "%s.w\t%%e2,%%e0", opname
);
3327 output_asm_insn (insn_buf
, operands
);
3334 sprintf (insn_buf
, "%s\t%%y2,%%y0", opname
);
3335 output_asm_insn (insn_buf
, operands
);
3339 sprintf (insn_buf
, "%s\t%%z2,%%z0", opname
);
3340 output_asm_insn (insn_buf
, operands
);
3351 /* Compute the length of a logical insn. */
3354 compute_logical_op_length (enum machine_mode mode
, rtx
*operands
)
3356 /* Figure out the logical op that we need to perform. */
3357 enum rtx_code code
= GET_CODE (operands
[3]);
3358 /* Pretend that every byte is affected if both operands are registers. */
3359 const unsigned HOST_WIDE_INT intval
=
3360 (unsigned HOST_WIDE_INT
) ((GET_CODE (operands
[2]) == CONST_INT
)
3361 /* Always use the full instruction if the
3362 first operand is in memory. It is better
3363 to use define_splits to generate the shorter
3364 sequence where valid. */
3365 && register_operand (operands
[1], VOIDmode
)
3366 ? INTVAL (operands
[2]) : 0x55555555);
3367 /* The determinant of the algorithm. If we perform an AND, 0
3368 affects a bit. Otherwise, 1 affects a bit. */
3369 const unsigned HOST_WIDE_INT det
= (code
!= AND
) ? intval
: ~intval
;
3370 /* Break up DET into pieces. */
3371 const unsigned HOST_WIDE_INT b0
= (det
>> 0) & 0xff;
3372 const unsigned HOST_WIDE_INT b1
= (det
>> 8) & 0xff;
3373 const unsigned HOST_WIDE_INT b2
= (det
>> 16) & 0xff;
3374 const unsigned HOST_WIDE_INT b3
= (det
>> 24) & 0xff;
3375 const unsigned HOST_WIDE_INT w0
= (det
>> 0) & 0xffff;
3376 const unsigned HOST_WIDE_INT w1
= (det
>> 16) & 0xffff;
3377 int lower_half_easy_p
= 0;
3378 int upper_half_easy_p
= 0;
3380 unsigned int length
= 0;
3385 /* First, see if we can finish with one insn. */
3386 if ((TARGET_H8300H
|| TARGET_H8300S
)
3390 length
= h8300_length_from_table (operands
[1], operands
[2],
3391 &logicw_length_table
);
3395 /* Take care of the lower byte. */
3399 /* Take care of the upper byte. */
3405 if (TARGET_H8300H
|| TARGET_H8300S
)
3407 /* Determine if the lower half can be taken care of in no more
3409 lower_half_easy_p
= (b0
== 0
3411 || (code
!= IOR
&& w0
== 0xffff));
3413 /* Determine if the upper half can be taken care of in no more
3415 upper_half_easy_p
= ((code
!= IOR
&& w1
== 0xffff)
3416 || (code
== AND
&& w1
== 0xff00));
3419 /* Check if doing everything with one insn is no worse than
3420 using multiple insns. */
3421 if ((TARGET_H8300H
|| TARGET_H8300S
)
3422 && w0
!= 0 && w1
!= 0
3423 && !(lower_half_easy_p
&& upper_half_easy_p
)
3424 && !(code
== IOR
&& w1
== 0xffff
3425 && (w0
& 0x8000) != 0 && lower_half_easy_p
))
3427 length
= h8300_length_from_table (operands
[1], operands
[2],
3428 &logicl_length_table
);
3432 /* Take care of the lower and upper words individually. For
3433 each word, we try different methods in the order of
3435 1) the special insn (in case of AND or XOR),
3436 2) the word-wise insn, and
3437 3) The byte-wise insn. */
3439 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3443 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3459 && (TARGET_H8300
? (code
== AND
) : (code
!= IOR
)))
3463 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3466 && (w0
& 0x8000) != 0)
3470 else if ((TARGET_H8300H
|| TARGET_H8300S
)
3476 else if (TARGET_H8300H
|| TARGET_H8300S
)
3497 /* Compute which flag bits are valid after a logical insn. */
3500 compute_logical_op_cc (enum machine_mode mode
, rtx
*operands
)
3502 /* Figure out the logical op that we need to perform. */
3503 enum rtx_code code
= GET_CODE (operands
[3]);
3504 /* Pretend that every byte is affected if both operands are registers. */
3505 const unsigned HOST_WIDE_INT intval
=
3506 (unsigned HOST_WIDE_INT
) ((GET_CODE (operands
[2]) == CONST_INT
)
3507 /* Always use the full instruction if the
3508 first operand is in memory. It is better
3509 to use define_splits to generate the shorter
3510 sequence where valid. */
3511 && register_operand (operands
[1], VOIDmode
)
3512 ? INTVAL (operands
[2]) : 0x55555555);
3513 /* The determinant of the algorithm. If we perform an AND, 0
3514 affects a bit. Otherwise, 1 affects a bit. */
3515 const unsigned HOST_WIDE_INT det
= (code
!= AND
) ? intval
: ~intval
;
3516 /* Break up DET into pieces. */
3517 const unsigned HOST_WIDE_INT b0
= (det
>> 0) & 0xff;
3518 const unsigned HOST_WIDE_INT b1
= (det
>> 8) & 0xff;
3519 const unsigned HOST_WIDE_INT w0
= (det
>> 0) & 0xffff;
3520 const unsigned HOST_WIDE_INT w1
= (det
>> 16) & 0xffff;
3521 int lower_half_easy_p
= 0;
3522 int upper_half_easy_p
= 0;
3523 /* Condition code. */
3524 enum attr_cc cc
= CC_CLOBBER
;
3529 /* First, see if we can finish with one insn. */
3530 if ((TARGET_H8300H
|| TARGET_H8300S
)
3538 if (TARGET_H8300H
|| TARGET_H8300S
)
3540 /* Determine if the lower half can be taken care of in no more
3542 lower_half_easy_p
= (b0
== 0
3544 || (code
!= IOR
&& w0
== 0xffff));
3546 /* Determine if the upper half can be taken care of in no more
3548 upper_half_easy_p
= ((code
!= IOR
&& w1
== 0xffff)
3549 || (code
== AND
&& w1
== 0xff00));
3552 /* Check if doing everything with one insn is no worse than
3553 using multiple insns. */
3554 if ((TARGET_H8300H
|| TARGET_H8300S
)
3555 && w0
!= 0 && w1
!= 0
3556 && !(lower_half_easy_p
&& upper_half_easy_p
)
3557 && !(code
== IOR
&& w1
== 0xffff
3558 && (w0
& 0x8000) != 0 && lower_half_easy_p
))
3564 if ((TARGET_H8300H
|| TARGET_H8300S
)
3567 && (w0
& 0x8000) != 0)
3579 /* Expand a conditional branch. */
3582 h8300_expand_branch (rtx operands
[])
3584 enum rtx_code code
= GET_CODE (operands
[0]);
3585 rtx op0
= operands
[1];
3586 rtx op1
= operands
[2];
3587 rtx label
= operands
[3];
3590 tmp
= gen_rtx_COMPARE (VOIDmode
, op0
, op1
);
3591 emit_insn (gen_rtx_SET (VOIDmode
, cc0_rtx
, tmp
));
3593 tmp
= gen_rtx_fmt_ee (code
, VOIDmode
, cc0_rtx
, const0_rtx
);
3594 tmp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, tmp
,
3595 gen_rtx_LABEL_REF (VOIDmode
, label
),
3597 emit_jump_insn (gen_rtx_SET (VOIDmode
, pc_rtx
, tmp
));
3601 /* Expand a conditional store. */
3604 h8300_expand_store (rtx operands
[])
3606 rtx dest
= operands
[0];
3607 enum rtx_code code
= GET_CODE (operands
[1]);
3608 rtx op0
= operands
[2];
3609 rtx op1
= operands
[3];
3612 tmp
= gen_rtx_COMPARE (VOIDmode
, op0
, op1
);
3613 emit_insn (gen_rtx_SET (VOIDmode
, cc0_rtx
, tmp
));
3615 tmp
= gen_rtx_fmt_ee (code
, GET_MODE (dest
), cc0_rtx
, const0_rtx
);
3616 emit_insn (gen_rtx_SET (VOIDmode
, dest
, tmp
));
3621 We devote a fair bit of code to getting efficient shifts since we
3622 can only shift one bit at a time on the H8/300 and H8/300H and only
3623 one or two bits at a time on the H8S.
3625 All shift code falls into one of the following ways of
3628 o SHIFT_INLINE: Emit straight line code for the shift; this is used
3629 when a straight line shift is about the same size or smaller than
3632 o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
3633 off the bits we don't need. This is used when only a few of the
3634 bits in the original value will survive in the shifted value.
3636 o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
3637 simulate a shift by 8, 16, or 24 bits. Once moved, a few inline
3638 shifts can be added if the shift count is slightly more than 8 or
3639 16. This case also includes other oddballs that are not worth
3642 o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
3644 For each shift count, we try to use code that has no trade-off
3645 between code size and speed whenever possible.
3647 If the trade-off is unavoidable, we try to be reasonable.
3648 Specifically, the fastest version is one instruction longer than
3649 the shortest version, we take the fastest version. We also provide
3650 the use a way to switch back to the shortest version with -Os.
3652 For the details of the shift algorithms for various shift counts,
3653 refer to shift_alg_[qhs]i. */
3655 /* Classify a shift with the given mode and code. OP is the shift amount. */
3657 enum h8sx_shift_type
3658 h8sx_classify_shift (enum machine_mode mode
, enum rtx_code code
, rtx op
)
3660 if (!TARGET_H8300SX
)
3661 return H8SX_SHIFT_NONE
;
3667 /* Check for variable shifts (shll Rs,Rd and shlr Rs,Rd). */
3668 if (GET_CODE (op
) != CONST_INT
)
3669 return H8SX_SHIFT_BINARY
;
3671 /* Reject out-of-range shift amounts. */
3672 if (INTVAL (op
) <= 0 || INTVAL (op
) >= GET_MODE_BITSIZE (mode
))
3673 return H8SX_SHIFT_NONE
;
3675 /* Power-of-2 shifts are effectively unary operations. */
3676 if (exact_log2 (INTVAL (op
)) >= 0)
3677 return H8SX_SHIFT_UNARY
;
3679 return H8SX_SHIFT_BINARY
;
3682 if (op
== const1_rtx
|| op
== const2_rtx
)
3683 return H8SX_SHIFT_UNARY
;
3684 return H8SX_SHIFT_NONE
;
3687 if (GET_CODE (op
) == CONST_INT
3688 && (INTVAL (op
) == 1
3690 || INTVAL (op
) == GET_MODE_BITSIZE (mode
) - 2
3691 || INTVAL (op
) == GET_MODE_BITSIZE (mode
) - 1))
3692 return H8SX_SHIFT_UNARY
;
3693 return H8SX_SHIFT_NONE
;
3696 return H8SX_SHIFT_NONE
;
3700 /* Return the asm template for a single h8sx shift instruction.
3701 OPERANDS[0] and OPERANDS[1] are the destination, OPERANDS[2]
3702 is the source and OPERANDS[3] is the shift. SUFFIX is the
3703 size suffix ('b', 'w' or 'l') and OPTYPE is the h8300_print_operand
3704 prefix for the destination operand. */
3707 output_h8sx_shift (rtx
*operands
, int suffix
, int optype
)
3709 static char buffer
[16];
3712 switch (GET_CODE (operands
[3]))
3728 if (INTVAL (operands
[2]) > 2)
3730 /* This is really a right rotate. */
3731 operands
[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands
[0]))
3732 - INTVAL (operands
[2]));
3740 if (operands
[2] == const1_rtx
)
3741 sprintf (buffer
, "%s.%c\t%%%c0", stem
, suffix
, optype
);
3743 sprintf (buffer
, "%s.%c\t%%X2,%%%c0", stem
, suffix
, optype
);
3747 /* Emit code to do shifts. */
3750 expand_a_shift (enum machine_mode mode
, enum rtx_code code
, rtx operands
[])
3752 switch (h8sx_classify_shift (mode
, code
, operands
[2]))
3754 case H8SX_SHIFT_BINARY
:
3755 operands
[1] = force_reg (mode
, operands
[1]);
3758 case H8SX_SHIFT_UNARY
:
3761 case H8SX_SHIFT_NONE
:
3765 emit_move_insn (copy_rtx (operands
[0]), operands
[1]);
3767 /* Need a loop to get all the bits we want - we generate the
3768 code at emit time, but need to allocate a scratch reg now. */
3770 emit_insn (gen_rtx_PARALLEL
3773 gen_rtx_SET (VOIDmode
, copy_rtx (operands
[0]),
3774 gen_rtx_fmt_ee (code
, mode
,
3775 copy_rtx (operands
[0]), operands
[2])),
3776 gen_rtx_CLOBBER (VOIDmode
,
3777 gen_rtx_SCRATCH (QImode
)))));
3781 /* Symbols of the various modes which can be used as indices. */
3785 QIshift
, HIshift
, SIshift
3788 /* For single bit shift insns, record assembler and what bits of the
3789 condition code are valid afterwards (represented as various CC_FOO
3790 bits, 0 means CC isn't left in a usable state). */
3794 const char *const assembler
;
3795 const enum attr_cc cc_valid
;
3798 /* Assembler instruction shift table.
3800 These tables are used to look up the basic shifts.
3801 They are indexed by cpu, shift_type, and mode. */
3803 static const struct shift_insn shift_one
[2][3][3] =
3809 { "shll\t%X0", CC_SET_ZNV
},
3810 { "add.w\t%T0,%T0", CC_SET_ZN
},
3811 { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", CC_CLOBBER
}
3813 /* SHIFT_LSHIFTRT */
3815 { "shlr\t%X0", CC_SET_ZNV
},
3816 { "shlr\t%t0\n\trotxr\t%s0", CC_CLOBBER
},
3817 { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER
}
3819 /* SHIFT_ASHIFTRT */
3821 { "shar\t%X0", CC_SET_ZNV
},
3822 { "shar\t%t0\n\trotxr\t%s0", CC_CLOBBER
},
3823 { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", CC_CLOBBER
}
3830 { "shll.b\t%X0", CC_SET_ZNV
},
3831 { "shll.w\t%T0", CC_SET_ZNV
},
3832 { "shll.l\t%S0", CC_SET_ZNV
}
3834 /* SHIFT_LSHIFTRT */
3836 { "shlr.b\t%X0", CC_SET_ZNV
},
3837 { "shlr.w\t%T0", CC_SET_ZNV
},
3838 { "shlr.l\t%S0", CC_SET_ZNV
}
3840 /* SHIFT_ASHIFTRT */
3842 { "shar.b\t%X0", CC_SET_ZNV
},
3843 { "shar.w\t%T0", CC_SET_ZNV
},
3844 { "shar.l\t%S0", CC_SET_ZNV
}
3849 static const struct shift_insn shift_two
[3][3] =
3853 { "shll.b\t#2,%X0", CC_SET_ZNV
},
3854 { "shll.w\t#2,%T0", CC_SET_ZNV
},
3855 { "shll.l\t#2,%S0", CC_SET_ZNV
}
3857 /* SHIFT_LSHIFTRT */
3859 { "shlr.b\t#2,%X0", CC_SET_ZNV
},
3860 { "shlr.w\t#2,%T0", CC_SET_ZNV
},
3861 { "shlr.l\t#2,%S0", CC_SET_ZNV
}
3863 /* SHIFT_ASHIFTRT */
3865 { "shar.b\t#2,%X0", CC_SET_ZNV
},
3866 { "shar.w\t#2,%T0", CC_SET_ZNV
},
3867 { "shar.l\t#2,%S0", CC_SET_ZNV
}
3871 /* Rotates are organized by which shift they'll be used in implementing.
3872 There's no need to record whether the cc is valid afterwards because
3873 it is the AND insn that will decide this. */
3875 static const char *const rotate_one
[2][3][3] =
3882 "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
3885 /* SHIFT_LSHIFTRT */
3888 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3891 /* SHIFT_ASHIFTRT */
3894 "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3906 /* SHIFT_LSHIFTRT */
3912 /* SHIFT_ASHIFTRT */
3921 static const char *const rotate_two
[3][3] =
3929 /* SHIFT_LSHIFTRT */
3935 /* SHIFT_ASHIFTRT */
3944 /* Shift algorithm. */
3947 /* The number of bits to be shifted by shift1 and shift2. Valid
3948 when ALG is SHIFT_SPECIAL. */
3949 unsigned int remainder
;
3951 /* Special insn for a shift. Valid when ALG is SHIFT_SPECIAL. */
3952 const char *special
;
3954 /* Insn for a one-bit shift. Valid when ALG is either SHIFT_INLINE
3955 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3958 /* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
3959 or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3962 /* CC status for SHIFT_INLINE. */
3963 enum attr_cc cc_inline
;
3965 /* CC status for SHIFT_SPECIAL. */
3966 enum attr_cc cc_special
;
3969 static void get_shift_alg (enum shift_type
,
3970 enum shift_mode
, unsigned int,
3971 struct shift_info
*);
3973 /* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
3974 best algorithm for doing the shift. The assembler code is stored
3975 in the pointers in INFO. We achieve the maximum efficiency in most
3976 cases when !TARGET_H8300. In case of TARGET_H8300, shifts in
3977 SImode in particular have a lot of room to optimize.
3979 We first determine the strategy of the shift algorithm by a table
3980 lookup. If that tells us to use a hand crafted assembly code, we
3981 go into the big switch statement to find what that is. Otherwise,
3982 we resort to a generic way, such as inlining. In either case, the
3983 result is returned through INFO. */
3986 get_shift_alg (enum shift_type shift_type
, enum shift_mode shift_mode
,
3987 unsigned int count
, struct shift_info
*info
)
3991 /* Find the target CPU. */
3994 else if (TARGET_H8300H
)
3999 /* Find the shift algorithm. */
4000 info
->alg
= SHIFT_LOOP
;
4004 if (count
< GET_MODE_BITSIZE (QImode
))
4005 info
->alg
= shift_alg_qi
[cpu
][shift_type
][count
];
4009 if (count
< GET_MODE_BITSIZE (HImode
))
4010 info
->alg
= shift_alg_hi
[cpu
][shift_type
][count
];
4014 if (count
< GET_MODE_BITSIZE (SImode
))
4015 info
->alg
= shift_alg_si
[cpu
][shift_type
][count
];
4022 /* Fill in INFO. Return unless we have SHIFT_SPECIAL. */
4026 info
->remainder
= count
;
4030 /* It is up to the caller to know that looping clobbers cc. */
4031 info
->shift1
= shift_one
[cpu_type
][shift_type
][shift_mode
].assembler
;
4032 info
->shift2
= shift_two
[shift_type
][shift_mode
].assembler
;
4033 info
->cc_inline
= shift_one
[cpu_type
][shift_type
][shift_mode
].cc_valid
;
4037 info
->shift1
= rotate_one
[cpu_type
][shift_type
][shift_mode
];
4038 info
->shift2
= rotate_two
[shift_type
][shift_mode
];
4039 info
->cc_inline
= CC_CLOBBER
;
4043 /* REMAINDER is 0 for most cases, so initialize it to 0. */
4044 info
->remainder
= 0;
4045 info
->shift1
= shift_one
[cpu_type
][shift_type
][shift_mode
].assembler
;
4046 info
->shift2
= shift_two
[shift_type
][shift_mode
].assembler
;
4047 info
->cc_inline
= shift_one
[cpu_type
][shift_type
][shift_mode
].cc_valid
;
4048 info
->cc_special
= CC_CLOBBER
;
4052 /* Here we only deal with SHIFT_SPECIAL. */
4056 /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
4057 through the entire value. */
4058 gcc_assert (shift_type
== SHIFT_ASHIFTRT
&& count
== 7);
4059 info
->special
= "shll\t%X0\n\tsubx\t%X0,%X0";
4069 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";
4071 info
->special
= "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
4073 case SHIFT_LSHIFTRT
:
4075 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";
4077 info
->special
= "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
4079 case SHIFT_ASHIFTRT
:
4080 info
->special
= "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
4084 else if ((8 <= count
&& count
<= 13)
4085 || (TARGET_H8300S
&& count
== 14))
4087 info
->remainder
= count
- 8;
4092 info
->special
= "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
4094 case SHIFT_LSHIFTRT
:
4097 info
->special
= "mov.b\t%t0,%s0\n\tsub.b\t%t0,%t0";
4098 info
->shift1
= "shlr.b\t%s0";
4099 info
->cc_inline
= CC_SET_ZNV
;
4103 info
->special
= "mov.b\t%t0,%s0\n\textu.w\t%T0";
4104 info
->cc_special
= CC_SET_ZNV
;
4107 case SHIFT_ASHIFTRT
:
4110 info
->special
= "mov.b\t%t0,%s0\n\tbld\t#7,%s0\n\tsubx\t%t0,%t0";
4111 info
->shift1
= "shar.b\t%s0";
4115 info
->special
= "mov.b\t%t0,%s0\n\texts.w\t%T0";
4116 info
->cc_special
= CC_SET_ZNV
;
4121 else if (count
== 14)
4127 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";
4129 case SHIFT_LSHIFTRT
:
4131 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";
4133 case SHIFT_ASHIFTRT
:
4135 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";
4136 else if (TARGET_H8300H
)
4138 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";
4139 info
->cc_special
= CC_SET_ZNV
;
4141 else /* TARGET_H8300S */
4146 else if (count
== 15)
4151 info
->special
= "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
4153 case SHIFT_LSHIFTRT
:
4154 info
->special
= "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
4156 case SHIFT_ASHIFTRT
:
4157 info
->special
= "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
4164 if (TARGET_H8300
&& 8 <= count
&& count
<= 9)
4166 info
->remainder
= count
- 8;
4171 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";
4173 case SHIFT_LSHIFTRT
:
4174 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";
4175 info
->shift1
= "shlr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0";
4177 case SHIFT_ASHIFTRT
:
4178 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";
4182 else if (count
== 8 && !TARGET_H8300
)
4187 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";
4189 case SHIFT_LSHIFTRT
:
4190 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";
4192 case SHIFT_ASHIFTRT
:
4193 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";
4197 else if (count
== 15 && TARGET_H8300
)
4203 case SHIFT_LSHIFTRT
:
4204 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";
4206 case SHIFT_ASHIFTRT
:
4207 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";
4211 else if (count
== 15 && !TARGET_H8300
)
4216 info
->special
= "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
4217 info
->cc_special
= CC_SET_ZNV
;
4219 case SHIFT_LSHIFTRT
:
4220 info
->special
= "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
4221 info
->cc_special
= CC_SET_ZNV
;
4223 case SHIFT_ASHIFTRT
:
4227 else if ((TARGET_H8300
&& 16 <= count
&& count
<= 20)
4228 || (TARGET_H8300H
&& 16 <= count
&& count
<= 19)
4229 || (TARGET_H8300S
&& 16 <= count
&& count
<= 21))
4231 info
->remainder
= count
- 16;
4236 info
->special
= "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
4238 info
->shift1
= "add.w\t%e0,%e0";
4240 case SHIFT_LSHIFTRT
:
4243 info
->special
= "mov.w\t%e0,%f0\n\tsub.w\t%e0,%e0";
4244 info
->shift1
= "shlr\t%x0\n\trotxr\t%w0";
4248 info
->special
= "mov.w\t%e0,%f0\n\textu.l\t%S0";
4249 info
->cc_special
= CC_SET_ZNV
;
4252 case SHIFT_ASHIFTRT
:
4255 info
->special
= "mov.w\t%e0,%f0\n\tshll\t%z0\n\tsubx\t%z0,%z0\n\tmov.b\t%z0,%y0";
4256 info
->shift1
= "shar\t%x0\n\trotxr\t%w0";
4260 info
->special
= "mov.w\t%e0,%f0\n\texts.l\t%S0";
4261 info
->cc_special
= CC_SET_ZNV
;
4266 else if (TARGET_H8300
&& 24 <= count
&& count
<= 28)
4268 info
->remainder
= count
- 24;
4273 info
->special
= "mov.b\t%w0,%z0\n\tsub.b\t%y0,%y0\n\tsub.w\t%f0,%f0";
4274 info
->shift1
= "shll.b\t%z0";
4275 info
->cc_inline
= CC_SET_ZNV
;
4277 case SHIFT_LSHIFTRT
:
4278 info
->special
= "mov.b\t%z0,%w0\n\tsub.b\t%x0,%x0\n\tsub.w\t%e0,%e0";
4279 info
->shift1
= "shlr.b\t%w0";
4280 info
->cc_inline
= CC_SET_ZNV
;
4282 case SHIFT_ASHIFTRT
:
4283 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";
4284 info
->shift1
= "shar.b\t%w0";
4285 info
->cc_inline
= CC_SET_ZNV
;
4289 else if ((TARGET_H8300H
&& count
== 24)
4290 || (TARGET_H8300S
&& 24 <= count
&& count
<= 25))
4292 info
->remainder
= count
- 24;
4297 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";
4299 case SHIFT_LSHIFTRT
:
4300 info
->special
= "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
4301 info
->cc_special
= CC_SET_ZNV
;
4303 case SHIFT_ASHIFTRT
:
4304 info
->special
= "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
4305 info
->cc_special
= CC_SET_ZNV
;
4309 else if (!TARGET_H8300
&& count
== 28)
4315 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";
4317 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";
4319 case SHIFT_LSHIFTRT
:
4322 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";
4323 info
->cc_special
= CC_SET_ZNV
;
4326 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4328 case SHIFT_ASHIFTRT
:
4332 else if (!TARGET_H8300
&& count
== 29)
4338 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";
4340 info
->special
= "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4342 case SHIFT_LSHIFTRT
:
4345 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";
4346 info
->cc_special
= CC_SET_ZNV
;
4350 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4351 info
->cc_special
= CC_SET_ZNV
;
4354 case SHIFT_ASHIFTRT
:
4358 else if (!TARGET_H8300
&& count
== 30)
4364 info
->special
= "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
4366 info
->special
= "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
4368 case SHIFT_LSHIFTRT
:
4370 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
4372 info
->special
= "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
4374 case SHIFT_ASHIFTRT
:
4378 else if (count
== 31)
4385 info
->special
= "sub.w\t%e0,%e0\n\tshlr\t%w0\n\tmov.w\t%e0,%f0\n\trotxr\t%z0";
4387 case SHIFT_LSHIFTRT
:
4388 info
->special
= "sub.w\t%f0,%f0\n\tshll\t%z0\n\tmov.w\t%f0,%e0\n\trotxl\t%w0";
4390 case SHIFT_ASHIFTRT
:
4391 info
->special
= "shll\t%z0\n\tsubx\t%w0,%w0\n\tmov.b\t%w0,%x0\n\tmov.w\t%f0,%e0";
4400 info
->special
= "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
4401 info
->cc_special
= CC_SET_ZNV
;
4403 case SHIFT_LSHIFTRT
:
4404 info
->special
= "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
4405 info
->cc_special
= CC_SET_ZNV
;
4407 case SHIFT_ASHIFTRT
:
4408 info
->special
= "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
4409 info
->cc_special
= CC_SET_ZNV
;
4422 info
->shift2
= NULL
;
4425 /* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
4426 needed for some shift with COUNT and MODE. Return 0 otherwise. */
4429 h8300_shift_needs_scratch_p (int count
, enum machine_mode mode
)
4434 if (GET_MODE_BITSIZE (mode
) <= count
)
4437 /* Find out the target CPU. */
4440 else if (TARGET_H8300H
)
4445 /* Find the shift algorithm. */
4449 a
= shift_alg_qi
[cpu
][SHIFT_ASHIFT
][count
];
4450 lr
= shift_alg_qi
[cpu
][SHIFT_LSHIFTRT
][count
];
4451 ar
= shift_alg_qi
[cpu
][SHIFT_ASHIFTRT
][count
];
4455 a
= shift_alg_hi
[cpu
][SHIFT_ASHIFT
][count
];
4456 lr
= shift_alg_hi
[cpu
][SHIFT_LSHIFTRT
][count
];
4457 ar
= shift_alg_hi
[cpu
][SHIFT_ASHIFTRT
][count
];
4461 a
= shift_alg_si
[cpu
][SHIFT_ASHIFT
][count
];
4462 lr
= shift_alg_si
[cpu
][SHIFT_LSHIFTRT
][count
];
4463 ar
= shift_alg_si
[cpu
][SHIFT_ASHIFTRT
][count
];
4470 /* On H8/300H, count == 8 uses a scratch register. */
4471 return (a
== SHIFT_LOOP
|| lr
== SHIFT_LOOP
|| ar
== SHIFT_LOOP
4472 || (TARGET_H8300H
&& mode
== SImode
&& count
== 8));
4475 /* Output the assembler code for doing shifts. */
4478 output_a_shift (rtx
*operands
)
4480 static int loopend_lab
;
4481 rtx shift
= operands
[3];
4482 enum machine_mode mode
= GET_MODE (shift
);
4483 enum rtx_code code
= GET_CODE (shift
);
4484 enum shift_type shift_type
;
4485 enum shift_mode shift_mode
;
4486 struct shift_info info
;
4494 shift_mode
= QIshift
;
4497 shift_mode
= HIshift
;
4500 shift_mode
= SIshift
;
4509 shift_type
= SHIFT_ASHIFTRT
;
4512 shift_type
= SHIFT_LSHIFTRT
;
4515 shift_type
= SHIFT_ASHIFT
;
4521 /* This case must be taken care of by one of the two splitters
4522 that convert a variable shift into a loop. */
4523 gcc_assert (GET_CODE (operands
[2]) == CONST_INT
);
4525 n
= INTVAL (operands
[2]);
4527 /* If the count is negative, make it 0. */
4530 /* If the count is too big, truncate it.
4531 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4532 do the intuitive thing. */
4533 else if ((unsigned int) n
> GET_MODE_BITSIZE (mode
))
4534 n
= GET_MODE_BITSIZE (mode
);
4536 get_shift_alg (shift_type
, shift_mode
, n
, &info
);
4541 output_asm_insn (info
.special
, operands
);
4547 /* Emit two bit shifts first. */
4548 if (info
.shift2
!= NULL
)
4550 for (; n
> 1; n
-= 2)
4551 output_asm_insn (info
.shift2
, operands
);
4554 /* Now emit one bit shifts for any residual. */
4556 output_asm_insn (info
.shift1
, operands
);
4561 int m
= GET_MODE_BITSIZE (mode
) - n
;
4562 const int mask
= (shift_type
== SHIFT_ASHIFT
4563 ? ((1 << m
) - 1) << n
4567 /* Not all possibilities of rotate are supported. They shouldn't
4568 be generated, but let's watch for 'em. */
4569 gcc_assert (info
.shift1
);
4571 /* Emit two bit rotates first. */
4572 if (info
.shift2
!= NULL
)
4574 for (; m
> 1; m
-= 2)
4575 output_asm_insn (info
.shift2
, operands
);
4578 /* Now single bit rotates for any residual. */
4580 output_asm_insn (info
.shift1
, operands
);
4582 /* Now mask off the high bits. */
4586 sprintf (insn_buf
, "and\t#%d,%%X0", mask
);
4590 gcc_assert (TARGET_H8300H
|| TARGET_H8300S
);
4591 sprintf (insn_buf
, "and.w\t#%d,%%T0", mask
);
4598 output_asm_insn (insn_buf
, operands
);
4603 /* A loop to shift by a "large" constant value.
4604 If we have shift-by-2 insns, use them. */
4605 if (info
.shift2
!= NULL
)
4607 fprintf (asm_out_file
, "\tmov.b #%d,%sl\n", n
/ 2,
4608 names_big
[REGNO (operands
[4])]);
4609 fprintf (asm_out_file
, ".Llt%d:\n", loopend_lab
);
4610 output_asm_insn (info
.shift2
, operands
);
4611 output_asm_insn ("add #0xff,%X4", operands
);
4612 fprintf (asm_out_file
, "\tbne .Llt%d\n", loopend_lab
);
4614 output_asm_insn (info
.shift1
, operands
);
4618 fprintf (asm_out_file
, "\tmov.b #%d,%sl\n", n
,
4619 names_big
[REGNO (operands
[4])]);
4620 fprintf (asm_out_file
, ".Llt%d:\n", loopend_lab
);
4621 output_asm_insn (info
.shift1
, operands
);
4622 output_asm_insn ("add #0xff,%X4", operands
);
4623 fprintf (asm_out_file
, "\tbne .Llt%d\n", loopend_lab
);
4632 /* Count the number of assembly instructions in a string TEMPL. */
4635 h8300_asm_insn_count (const char *templ
)
4637 unsigned int count
= 1;
4639 for (; *templ
; templ
++)
4646 /* Compute the length of a shift insn. */
4649 compute_a_shift_length (rtx insn ATTRIBUTE_UNUSED
, rtx
*operands
)
4651 rtx shift
= operands
[3];
4652 enum machine_mode mode
= GET_MODE (shift
);
4653 enum rtx_code code
= GET_CODE (shift
);
4654 enum shift_type shift_type
;
4655 enum shift_mode shift_mode
;
4656 struct shift_info info
;
4657 unsigned int wlength
= 0;
4662 shift_mode
= QIshift
;
4665 shift_mode
= HIshift
;
4668 shift_mode
= SIshift
;
4677 shift_type
= SHIFT_ASHIFTRT
;
4680 shift_type
= SHIFT_LSHIFTRT
;
4683 shift_type
= SHIFT_ASHIFT
;
4689 if (GET_CODE (operands
[2]) != CONST_INT
)
4691 /* Get the assembler code to do one shift. */
4692 get_shift_alg (shift_type
, shift_mode
, 1, &info
);
4694 return (4 + h8300_asm_insn_count (info
.shift1
)) * 2;
4698 int n
= INTVAL (operands
[2]);
4700 /* If the count is negative, make it 0. */
4703 /* If the count is too big, truncate it.
4704 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4705 do the intuitive thing. */
4706 else if ((unsigned int) n
> GET_MODE_BITSIZE (mode
))
4707 n
= GET_MODE_BITSIZE (mode
);
4709 get_shift_alg (shift_type
, shift_mode
, n
, &info
);
4714 wlength
+= h8300_asm_insn_count (info
.special
);
4716 /* Every assembly instruction used in SHIFT_SPECIAL case
4717 takes 2 bytes except xor.l, which takes 4 bytes, so if we
4718 see xor.l, we just pretend that xor.l counts as two insns
4719 so that the insn length will be computed correctly. */
4720 if (strstr (info
.special
, "xor.l") != NULL
)
4728 if (info
.shift2
!= NULL
)
4730 wlength
+= h8300_asm_insn_count (info
.shift2
) * (n
/ 2);
4734 wlength
+= h8300_asm_insn_count (info
.shift1
) * n
;
4740 int m
= GET_MODE_BITSIZE (mode
) - n
;
4742 /* Not all possibilities of rotate are supported. They shouldn't
4743 be generated, but let's watch for 'em. */
4744 gcc_assert (info
.shift1
);
4746 if (info
.shift2
!= NULL
)
4748 wlength
+= h8300_asm_insn_count (info
.shift2
) * (m
/ 2);
4752 wlength
+= h8300_asm_insn_count (info
.shift1
) * m
;
4754 /* Now mask off the high bits. */
4764 gcc_assert (!TARGET_H8300
);
4774 /* A loop to shift by a "large" constant value.
4775 If we have shift-by-2 insns, use them. */
4776 if (info
.shift2
!= NULL
)
4778 wlength
+= 3 + h8300_asm_insn_count (info
.shift2
);
4780 wlength
+= h8300_asm_insn_count (info
.shift1
);
4784 wlength
+= 3 + h8300_asm_insn_count (info
.shift1
);
4794 /* Compute which flag bits are valid after a shift insn. */
4797 compute_a_shift_cc (rtx insn ATTRIBUTE_UNUSED
, rtx
*operands
)
4799 rtx shift
= operands
[3];
4800 enum machine_mode mode
= GET_MODE (shift
);
4801 enum rtx_code code
= GET_CODE (shift
);
4802 enum shift_type shift_type
;
4803 enum shift_mode shift_mode
;
4804 struct shift_info info
;
4810 shift_mode
= QIshift
;
4813 shift_mode
= HIshift
;
4816 shift_mode
= SIshift
;
4825 shift_type
= SHIFT_ASHIFTRT
;
4828 shift_type
= SHIFT_LSHIFTRT
;
4831 shift_type
= SHIFT_ASHIFT
;
4837 /* This case must be taken care of by one of the two splitters
4838 that convert a variable shift into a loop. */
4839 gcc_assert (GET_CODE (operands
[2]) == CONST_INT
);
4841 n
= INTVAL (operands
[2]);
4843 /* If the count is negative, make it 0. */
4846 /* If the count is too big, truncate it.
4847 ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4848 do the intuitive thing. */
4849 else if ((unsigned int) n
> GET_MODE_BITSIZE (mode
))
4850 n
= GET_MODE_BITSIZE (mode
);
4852 get_shift_alg (shift_type
, shift_mode
, n
, &info
);
4857 if (info
.remainder
== 0)
4858 return info
.cc_special
;
4863 return info
.cc_inline
;
4866 /* This case always ends with an and instruction. */
4870 /* A loop to shift by a "large" constant value.
4871 If we have shift-by-2 insns, use them. */
4872 if (info
.shift2
!= NULL
)
4875 return info
.cc_inline
;
4884 /* A rotation by a non-constant will cause a loop to be generated, in
4885 which a rotation by one bit is used. A rotation by a constant,
4886 including the one in the loop, will be taken care of by
4887 output_a_rotate () at the insn emit time. */
4890 expand_a_rotate (rtx operands
[])
4892 rtx dst
= operands
[0];
4893 rtx src
= operands
[1];
4894 rtx rotate_amount
= operands
[2];
4895 enum machine_mode mode
= GET_MODE (dst
);
4897 if (h8sx_classify_shift (mode
, ROTATE
, rotate_amount
) == H8SX_SHIFT_UNARY
)
4900 /* We rotate in place. */
4901 emit_move_insn (dst
, src
);
4903 if (GET_CODE (rotate_amount
) != CONST_INT
)
4905 rtx counter
= gen_reg_rtx (QImode
);
4906 rtx start_label
= gen_label_rtx ();
4907 rtx end_label
= gen_label_rtx ();
4909 /* If the rotate amount is less than or equal to 0,
4910 we go out of the loop. */
4911 emit_cmp_and_jump_insns (rotate_amount
, const0_rtx
, LE
, NULL_RTX
,
4912 QImode
, 0, end_label
);
4914 /* Initialize the loop counter. */
4915 emit_move_insn (counter
, rotate_amount
);
4917 emit_label (start_label
);
4919 /* Rotate by one bit. */
4923 emit_insn (gen_rotlqi3_1 (dst
, dst
, const1_rtx
));
4926 emit_insn (gen_rotlhi3_1 (dst
, dst
, const1_rtx
));
4929 emit_insn (gen_rotlsi3_1 (dst
, dst
, const1_rtx
));
4935 /* Decrement the counter by 1. */
4936 emit_insn (gen_addqi3 (counter
, counter
, constm1_rtx
));
4938 /* If the loop counter is nonzero, we go back to the beginning
4940 emit_cmp_and_jump_insns (counter
, const0_rtx
, NE
, NULL_RTX
, QImode
, 1,
4943 emit_label (end_label
);
4947 /* Rotate by AMOUNT bits. */
4951 emit_insn (gen_rotlqi3_1 (dst
, dst
, rotate_amount
));
4954 emit_insn (gen_rotlhi3_1 (dst
, dst
, rotate_amount
));
4957 emit_insn (gen_rotlsi3_1 (dst
, dst
, rotate_amount
));
4967 /* Output a rotate insn. */
4970 output_a_rotate (enum rtx_code code
, rtx
*operands
)
4972 rtx dst
= operands
[0];
4973 rtx rotate_amount
= operands
[2];
4974 enum shift_mode rotate_mode
;
4975 enum shift_type rotate_type
;
4976 const char *insn_buf
;
4979 enum machine_mode mode
= GET_MODE (dst
);
4981 gcc_assert (GET_CODE (rotate_amount
) == CONST_INT
);
4986 rotate_mode
= QIshift
;
4989 rotate_mode
= HIshift
;
4992 rotate_mode
= SIshift
;
5001 rotate_type
= SHIFT_ASHIFT
;
5004 rotate_type
= SHIFT_LSHIFTRT
;
5010 amount
= INTVAL (rotate_amount
);
5012 /* Clean up AMOUNT. */
5015 if ((unsigned int) amount
> GET_MODE_BITSIZE (mode
))
5016 amount
= GET_MODE_BITSIZE (mode
);
5018 /* Determine the faster direction. After this phase, amount will be
5019 at most a half of GET_MODE_BITSIZE (mode). */
5020 if ((unsigned int) amount
> GET_MODE_BITSIZE (mode
) / (unsigned) 2)
5022 /* Flip the direction. */
5023 amount
= GET_MODE_BITSIZE (mode
) - amount
;
5025 (rotate_type
== SHIFT_ASHIFT
) ? SHIFT_LSHIFTRT
: SHIFT_ASHIFT
;
5028 /* See if a byte swap (in HImode) or a word swap (in SImode) can
5029 boost up the rotation. */
5030 if ((mode
== HImode
&& TARGET_H8300
&& amount
>= 5)
5031 || (mode
== HImode
&& TARGET_H8300H
&& amount
>= 6)
5032 || (mode
== HImode
&& TARGET_H8300S
&& amount
== 8)
5033 || (mode
== SImode
&& TARGET_H8300H
&& amount
>= 10)
5034 || (mode
== SImode
&& TARGET_H8300S
&& amount
>= 13))
5039 /* This code works on any family. */
5040 insn_buf
= "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
5041 output_asm_insn (insn_buf
, operands
);
5045 /* This code works on the H8/300H and H8S. */
5046 insn_buf
= "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
5047 output_asm_insn (insn_buf
, operands
);
5054 /* Adjust AMOUNT and flip the direction. */
5055 amount
= GET_MODE_BITSIZE (mode
) / 2 - amount
;
5057 (rotate_type
== SHIFT_ASHIFT
) ? SHIFT_LSHIFTRT
: SHIFT_ASHIFT
;
5060 /* Output rotate insns. */
5061 for (bits
= TARGET_H8300S
? 2 : 1; bits
> 0; bits
/= 2)
5064 insn_buf
= rotate_two
[rotate_type
][rotate_mode
];
5066 insn_buf
= rotate_one
[cpu_type
][rotate_type
][rotate_mode
];
5068 for (; amount
>= bits
; amount
-= bits
)
5069 output_asm_insn (insn_buf
, operands
);
5075 /* Compute the length of a rotate insn. */
5078 compute_a_rotate_length (rtx
*operands
)
5080 rtx src
= operands
[1];
5081 rtx amount_rtx
= operands
[2];
5082 enum machine_mode mode
= GET_MODE (src
);
5084 unsigned int length
= 0;
5086 gcc_assert (GET_CODE (amount_rtx
) == CONST_INT
);
5088 amount
= INTVAL (amount_rtx
);
5090 /* Clean up AMOUNT. */
5093 if ((unsigned int) amount
> GET_MODE_BITSIZE (mode
))
5094 amount
= GET_MODE_BITSIZE (mode
);
5096 /* Determine the faster direction. After this phase, amount
5097 will be at most a half of GET_MODE_BITSIZE (mode). */
5098 if ((unsigned int) amount
> GET_MODE_BITSIZE (mode
) / (unsigned) 2)
5099 /* Flip the direction. */
5100 amount
= GET_MODE_BITSIZE (mode
) - amount
;
5102 /* See if a byte swap (in HImode) or a word swap (in SImode) can
5103 boost up the rotation. */
5104 if ((mode
== HImode
&& TARGET_H8300
&& amount
>= 5)
5105 || (mode
== HImode
&& TARGET_H8300H
&& amount
>= 6)
5106 || (mode
== HImode
&& TARGET_H8300S
&& amount
== 8)
5107 || (mode
== SImode
&& TARGET_H8300H
&& amount
>= 10)
5108 || (mode
== SImode
&& TARGET_H8300S
&& amount
>= 13))
5110 /* Adjust AMOUNT and flip the direction. */
5111 amount
= GET_MODE_BITSIZE (mode
) / 2 - amount
;
5115 /* We use 2-bit rotations on the H8S. */
5117 amount
= amount
/ 2 + amount
% 2;
5119 /* The H8/300 uses three insns to rotate one bit, taking 6
5121 length
+= amount
* ((TARGET_H8300
&& mode
== HImode
) ? 6 : 2);
5126 /* Fix the operands of a gen_xxx so that it could become a bit
5130 fix_bit_operand (rtx
*operands
, enum rtx_code code
)
5132 /* The bit_operand predicate accepts any memory during RTL generation, but
5133 only 'U' memory afterwards, so if this is a MEM operand, we must force
5134 it to be valid for 'U' by reloading the address. */
5137 ? single_zero_operand (operands
[2], QImode
)
5138 : single_one_operand (operands
[2], QImode
))
5140 /* OK to have a memory dest. */
5141 if (GET_CODE (operands
[0]) == MEM
5142 && !satisfies_constraint_U (operands
[0]))
5144 rtx mem
= gen_rtx_MEM (GET_MODE (operands
[0]),
5145 copy_to_mode_reg (Pmode
,
5146 XEXP (operands
[0], 0)));
5147 MEM_COPY_ATTRIBUTES (mem
, operands
[0]);
5151 if (GET_CODE (operands
[1]) == MEM
5152 && !satisfies_constraint_U (operands
[1]))
5154 rtx mem
= gen_rtx_MEM (GET_MODE (operands
[1]),
5155 copy_to_mode_reg (Pmode
,
5156 XEXP (operands
[1], 0)));
5157 MEM_COPY_ATTRIBUTES (mem
, operands
[0]);
5163 /* Dest and src op must be register. */
5165 operands
[1] = force_reg (QImode
, operands
[1]);
5167 rtx res
= gen_reg_rtx (QImode
);
5171 emit_insn (gen_andqi3_1 (res
, operands
[1], operands
[2]));
5174 emit_insn (gen_iorqi3_1 (res
, operands
[1], operands
[2]));
5177 emit_insn (gen_xorqi3_1 (res
, operands
[1], operands
[2]));
5182 emit_insn (gen_movqi (operands
[0], res
));
5187 /* Return nonzero if FUNC is an interrupt function as specified
5188 by the "interrupt" attribute. */
5191 h8300_interrupt_function_p (tree func
)
5195 if (TREE_CODE (func
) != FUNCTION_DECL
)
5198 a
= lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func
));
5199 return a
!= NULL_TREE
;
5202 /* Return nonzero if FUNC is a saveall function as specified by the
5203 "saveall" attribute. */
5206 h8300_saveall_function_p (tree func
)
5210 if (TREE_CODE (func
) != FUNCTION_DECL
)
5213 a
= lookup_attribute ("saveall", DECL_ATTRIBUTES (func
));
5214 return a
!= NULL_TREE
;
5217 /* Return nonzero if FUNC is an OS_Task function as specified
5218 by the "OS_Task" attribute. */
5221 h8300_os_task_function_p (tree func
)
5225 if (TREE_CODE (func
) != FUNCTION_DECL
)
5228 a
= lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func
));
5229 return a
!= NULL_TREE
;
5232 /* Return nonzero if FUNC is a monitor function as specified
5233 by the "monitor" attribute. */
5236 h8300_monitor_function_p (tree func
)
5240 if (TREE_CODE (func
) != FUNCTION_DECL
)
5243 a
= lookup_attribute ("monitor", DECL_ATTRIBUTES (func
));
5244 return a
!= NULL_TREE
;
5247 /* Return nonzero if FUNC is a function that should be called
5248 through the function vector. */
5251 h8300_funcvec_function_p (tree func
)
5255 if (TREE_CODE (func
) != FUNCTION_DECL
)
5258 a
= lookup_attribute ("function_vector", DECL_ATTRIBUTES (func
));
5259 return a
!= NULL_TREE
;
5262 /* Return nonzero if DECL is a variable that's in the eight bit
5266 h8300_eightbit_data_p (tree decl
)
5270 if (TREE_CODE (decl
) != VAR_DECL
)
5273 a
= lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl
));
5274 return a
!= NULL_TREE
;
5277 /* Return nonzero if DECL is a variable that's in the tiny
5281 h8300_tiny_data_p (tree decl
)
5285 if (TREE_CODE (decl
) != VAR_DECL
)
5288 a
= lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl
));
5289 return a
!= NULL_TREE
;
5292 /* Generate an 'interrupt_handler' attribute for decls. We convert
5293 all the pragmas to corresponding attributes. */
5296 h8300_insert_attributes (tree node
, tree
*attributes
)
5298 if (TREE_CODE (node
) == FUNCTION_DECL
)
5300 if (pragma_interrupt
)
5302 pragma_interrupt
= 0;
5304 /* Add an 'interrupt_handler' attribute. */
5305 *attributes
= tree_cons (get_identifier ("interrupt_handler"),
5313 /* Add an 'saveall' attribute. */
5314 *attributes
= tree_cons (get_identifier ("saveall"),
5320 /* Supported attributes:
5322 interrupt_handler: output a prologue and epilogue suitable for an
5325 saveall: output a prologue and epilogue that saves and restores
5326 all registers except the stack pointer.
5328 function_vector: This function should be called through the
5331 eightbit_data: This variable lives in the 8-bit data area and can
5332 be referenced with 8-bit absolute memory addresses.
5334 tiny_data: This variable lives in the tiny data area and can be
5335 referenced with 16-bit absolute memory references. */
5337 static const struct attribute_spec h8300_attribute_table
[] =
5339 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
5340 affects_type_identity } */
5341 { "interrupt_handler", 0, 0, true, false, false,
5342 h8300_handle_fndecl_attribute
, false },
5343 { "saveall", 0, 0, true, false, false,
5344 h8300_handle_fndecl_attribute
, false },
5345 { "OS_Task", 0, 0, true, false, false,
5346 h8300_handle_fndecl_attribute
, false },
5347 { "monitor", 0, 0, true, false, false,
5348 h8300_handle_fndecl_attribute
, false },
5349 { "function_vector", 0, 0, true, false, false,
5350 h8300_handle_fndecl_attribute
, false },
5351 { "eightbit_data", 0, 0, true, false, false,
5352 h8300_handle_eightbit_data_attribute
, false },
5353 { "tiny_data", 0, 0, true, false, false,
5354 h8300_handle_tiny_data_attribute
, false },
5355 { NULL
, 0, 0, false, false, false, NULL
, false }
5359 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
5360 struct attribute_spec.handler. */
5362 h8300_handle_fndecl_attribute (tree
*node
, tree name
,
5363 tree args ATTRIBUTE_UNUSED
,
5364 int flags ATTRIBUTE_UNUSED
,
5367 if (TREE_CODE (*node
) != FUNCTION_DECL
)
5369 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
5371 *no_add_attrs
= true;
5377 /* Handle an "eightbit_data" attribute; arguments as in
5378 struct attribute_spec.handler. */
5380 h8300_handle_eightbit_data_attribute (tree
*node
, tree name
,
5381 tree args ATTRIBUTE_UNUSED
,
5382 int flags ATTRIBUTE_UNUSED
,
5387 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
))
5389 DECL_SECTION_NAME (decl
) = build_string (7, ".eight");
5393 warning (OPT_Wattributes
, "%qE attribute ignored",
5395 *no_add_attrs
= true;
5401 /* Handle an "tiny_data" attribute; arguments as in
5402 struct attribute_spec.handler. */
5404 h8300_handle_tiny_data_attribute (tree
*node
, tree name
,
5405 tree args ATTRIBUTE_UNUSED
,
5406 int flags ATTRIBUTE_UNUSED
,
5411 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
))
5413 DECL_SECTION_NAME (decl
) = build_string (6, ".tiny");
5417 warning (OPT_Wattributes
, "%qE attribute ignored",
5419 *no_add_attrs
= true;
5425 /* Mark function vectors, and various small data objects. */
5428 h8300_encode_section_info (tree decl
, rtx rtl
, int first
)
5430 int extra_flags
= 0;
5432 default_encode_section_info (decl
, rtl
, first
);
5434 if (TREE_CODE (decl
) == FUNCTION_DECL
5435 && h8300_funcvec_function_p (decl
))
5436 extra_flags
= SYMBOL_FLAG_FUNCVEC_FUNCTION
;
5437 else if (TREE_CODE (decl
) == VAR_DECL
5438 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
5440 if (h8300_eightbit_data_p (decl
))
5441 extra_flags
= SYMBOL_FLAG_EIGHTBIT_DATA
;
5442 else if (first
&& h8300_tiny_data_p (decl
))
5443 extra_flags
= SYMBOL_FLAG_TINY_DATA
;
5447 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= extra_flags
;
5450 /* Output a single-bit extraction. */
5453 output_simode_bld (int bild
, rtx operands
[])
5457 /* Clear the destination register. */
5458 output_asm_insn ("sub.w\t%e0,%e0\n\tsub.w\t%f0,%f0", operands
);
5460 /* Now output the bit load or bit inverse load, and store it in
5463 output_asm_insn ("bild\t%Z2,%Y1", operands
);
5465 output_asm_insn ("bld\t%Z2,%Y1", operands
);
5467 output_asm_insn ("bst\t#0,%w0", operands
);
5471 /* Determine if we can clear the destination first. */
5472 int clear_first
= (REG_P (operands
[0]) && REG_P (operands
[1])
5473 && REGNO (operands
[0]) != REGNO (operands
[1]));
5476 output_asm_insn ("sub.l\t%S0,%S0", operands
);
5478 /* Output the bit load or bit inverse load. */
5480 output_asm_insn ("bild\t%Z2,%Y1", operands
);
5482 output_asm_insn ("bld\t%Z2,%Y1", operands
);
5485 output_asm_insn ("xor.l\t%S0,%S0", operands
);
5487 /* Perform the bit store. */
5488 output_asm_insn ("rotxl.l\t%S0", operands
);
5495 /* Delayed-branch scheduling is more effective if we have some idea
5496 how long each instruction will be. Use a shorten_branches pass
5497 to get an initial estimate. */
5502 if (flag_delayed_branch
)
5503 shorten_branches (get_insns ());
5506 #ifndef OBJECT_FORMAT_ELF
5508 h8300_asm_named_section (const char *name
, unsigned int flags ATTRIBUTE_UNUSED
,
5511 /* ??? Perhaps we should be using default_coff_asm_named_section. */
5512 fprintf (asm_out_file
, "\t.section %s\n", name
);
5514 #endif /* ! OBJECT_FORMAT_ELF */
5516 /* Nonzero if X is a constant address suitable as an 8-bit absolute,
5517 which is a special case of the 'R' operand. */
5520 h8300_eightbit_constant_address_p (rtx x
)
5522 /* The ranges of the 8-bit area. */
5523 const unsigned HOST_WIDE_INT n1
= trunc_int_for_mode (0xff00, HImode
);
5524 const unsigned HOST_WIDE_INT n2
= trunc_int_for_mode (0xffff, HImode
);
5525 const unsigned HOST_WIDE_INT h1
= trunc_int_for_mode (0x00ffff00, SImode
);
5526 const unsigned HOST_WIDE_INT h2
= trunc_int_for_mode (0x00ffffff, SImode
);
5527 const unsigned HOST_WIDE_INT s1
= trunc_int_for_mode (0xffffff00, SImode
);
5528 const unsigned HOST_WIDE_INT s2
= trunc_int_for_mode (0xffffffff, SImode
);
5530 unsigned HOST_WIDE_INT addr
;
5532 /* We accept symbols declared with eightbit_data. */
5533 if (GET_CODE (x
) == SYMBOL_REF
)
5534 return (SYMBOL_REF_FLAGS (x
) & SYMBOL_FLAG_EIGHTBIT_DATA
) != 0;
5536 if (GET_CODE (x
) != CONST_INT
)
5542 || ((TARGET_H8300
|| TARGET_NORMAL_MODE
) && IN_RANGE (addr
, n1
, n2
))
5543 || (TARGET_H8300H
&& IN_RANGE (addr
, h1
, h2
))
5544 || (TARGET_H8300S
&& IN_RANGE (addr
, s1
, s2
)));
5547 /* Nonzero if X is a constant address suitable as an 16-bit absolute
5548 on H8/300H and H8S. */
5551 h8300_tiny_constant_address_p (rtx x
)
5553 /* The ranges of the 16-bit area. */
5554 const unsigned HOST_WIDE_INT h1
= trunc_int_for_mode (0x00000000, SImode
);
5555 const unsigned HOST_WIDE_INT h2
= trunc_int_for_mode (0x00007fff, SImode
);
5556 const unsigned HOST_WIDE_INT h3
= trunc_int_for_mode (0x00ff8000, SImode
);
5557 const unsigned HOST_WIDE_INT h4
= trunc_int_for_mode (0x00ffffff, SImode
);
5558 const unsigned HOST_WIDE_INT s1
= trunc_int_for_mode (0x00000000, SImode
);
5559 const unsigned HOST_WIDE_INT s2
= trunc_int_for_mode (0x00007fff, SImode
);
5560 const unsigned HOST_WIDE_INT s3
= trunc_int_for_mode (0xffff8000, SImode
);
5561 const unsigned HOST_WIDE_INT s4
= trunc_int_for_mode (0xffffffff, SImode
);
5563 unsigned HOST_WIDE_INT addr
;
5565 switch (GET_CODE (x
))
5568 /* In the normal mode, any symbol fits in the 16-bit absolute
5569 address range. We also accept symbols declared with
5571 return (TARGET_NORMAL_MODE
5572 || (SYMBOL_REF_FLAGS (x
) & SYMBOL_FLAG_TINY_DATA
) != 0);
5576 return (TARGET_NORMAL_MODE
5578 && (IN_RANGE (addr
, h1
, h2
) || IN_RANGE (addr
, h3
, h4
)))
5580 && (IN_RANGE (addr
, s1
, s2
) || IN_RANGE (addr
, s3
, s4
))));
5583 return TARGET_NORMAL_MODE
;
5591 /* Return nonzero if ADDR1 and ADDR2 point to consecutive memory
5592 locations that can be accessed as a 16-bit word. */
5595 byte_accesses_mergeable_p (rtx addr1
, rtx addr2
)
5597 HOST_WIDE_INT offset1
, offset2
;
5605 else if (GET_CODE (addr1
) == PLUS
5606 && REG_P (XEXP (addr1
, 0))
5607 && GET_CODE (XEXP (addr1
, 1)) == CONST_INT
)
5609 reg1
= XEXP (addr1
, 0);
5610 offset1
= INTVAL (XEXP (addr1
, 1));
5620 else if (GET_CODE (addr2
) == PLUS
5621 && REG_P (XEXP (addr2
, 0))
5622 && GET_CODE (XEXP (addr2
, 1)) == CONST_INT
)
5624 reg2
= XEXP (addr2
, 0);
5625 offset2
= INTVAL (XEXP (addr2
, 1));
5630 if (((reg1
== stack_pointer_rtx
&& reg2
== stack_pointer_rtx
)
5631 || (reg1
== frame_pointer_rtx
&& reg2
== frame_pointer_rtx
))
5633 && offset1
+ 1 == offset2
)
5639 /* Return nonzero if we have the same comparison insn as I3 two insns
5640 before I3. I3 is assumed to be a comparison insn. */
5643 same_cmp_preceding_p (rtx i3
)
5647 /* Make sure we have a sequence of three insns. */
5648 i2
= prev_nonnote_insn (i3
);
5651 i1
= prev_nonnote_insn (i2
);
5655 return (INSN_P (i1
) && rtx_equal_p (PATTERN (i1
), PATTERN (i3
))
5656 && any_condjump_p (i2
) && onlyjump_p (i2
));
5659 /* Return nonzero if we have the same comparison insn as I1 two insns
5660 after I1. I1 is assumed to be a comparison insn. */
5663 same_cmp_following_p (rtx i1
)
5667 /* Make sure we have a sequence of three insns. */
5668 i2
= next_nonnote_insn (i1
);
5671 i3
= next_nonnote_insn (i2
);
5675 return (INSN_P (i3
) && rtx_equal_p (PATTERN (i1
), PATTERN (i3
))
5676 && any_condjump_p (i2
) && onlyjump_p (i2
));
5679 /* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
5680 (or pops) N registers. OPERANDS are assumed to be an array of
5684 h8300_regs_ok_for_stm (int n
, rtx operands
[])
5689 return ((REGNO (operands
[0]) == 0 && REGNO (operands
[1]) == 1)
5690 || (REGNO (operands
[0]) == 2 && REGNO (operands
[1]) == 3)
5691 || (REGNO (operands
[0]) == 4 && REGNO (operands
[1]) == 5));
5693 return ((REGNO (operands
[0]) == 0
5694 && REGNO (operands
[1]) == 1
5695 && REGNO (operands
[2]) == 2)
5696 || (REGNO (operands
[0]) == 4
5697 && REGNO (operands
[1]) == 5
5698 && REGNO (operands
[2]) == 6));
5701 return (REGNO (operands
[0]) == 0
5702 && REGNO (operands
[1]) == 1
5703 && REGNO (operands
[2]) == 2
5704 && REGNO (operands
[3]) == 3);
5710 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
5713 h8300_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED
,
5714 unsigned int new_reg
)
5716 /* Interrupt functions can only use registers that have already been
5717 saved by the prologue, even if they would normally be
5720 if (h8300_current_function_interrupt_function_p ()
5721 && !df_regs_ever_live_p (new_reg
))
5727 /* Returns true if register REGNO is safe to be allocated as a scratch
5728 register in the current function. */
5731 h8300_hard_regno_scratch_ok (unsigned int regno
)
5733 if (h8300_current_function_interrupt_function_p ()
5734 && ! WORD_REG_USED (regno
))
5741 /* Return nonzero if X is a REG or SUBREG suitable as a base register. */
5744 h8300_rtx_ok_for_base_p (rtx x
, int strict
)
5746 /* Strip off SUBREG if any. */
5747 if (GET_CODE (x
) == SUBREG
)
5752 ? REG_OK_FOR_BASE_STRICT_P (x
)
5753 : REG_OK_FOR_BASE_NONSTRICT_P (x
)));
5756 /* Return nozero if X is a legitimate address. On the H8/300, a
5757 legitimate address has the form REG, REG+CONSTANT_ADDRESS or
5758 CONSTANT_ADDRESS. */
5761 h8300_legitimate_address_p (enum machine_mode mode
, rtx x
, bool strict
)
5763 /* The register indirect addresses like @er0 is always valid. */
5764 if (h8300_rtx_ok_for_base_p (x
, strict
))
5767 if (CONSTANT_ADDRESS_P (x
))
5771 && ( GET_CODE (x
) == PRE_INC
5772 || GET_CODE (x
) == PRE_DEC
5773 || GET_CODE (x
) == POST_INC
5774 || GET_CODE (x
) == POST_DEC
)
5775 && h8300_rtx_ok_for_base_p (XEXP (x
, 0), strict
))
5778 if (GET_CODE (x
) == PLUS
5779 && CONSTANT_ADDRESS_P (XEXP (x
, 1))
5780 && h8300_rtx_ok_for_base_p (h8300_get_index (XEXP (x
, 0),
5787 /* Worker function for HARD_REGNO_NREGS.
5789 We pretend the MAC register is 32bits -- we don't have any data
5790 types on the H8 series to handle more than 32bits. */
5793 h8300_hard_regno_nregs (int regno ATTRIBUTE_UNUSED
, enum machine_mode mode
)
5795 return (GET_MODE_SIZE (mode
) + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
5798 /* Worker function for HARD_REGNO_MODE_OK. */
5801 h8300_hard_regno_mode_ok (int regno
, enum machine_mode mode
)
5804 /* If an even reg, then anything goes. Otherwise the mode must be
5806 return ((regno
& 1) == 0) || (mode
== HImode
) || (mode
== QImode
);
5808 /* MAC register can only be of SImode. Otherwise, anything
5810 return regno
== MAC_REG
? mode
== SImode
: 1;
5813 /* Perform target dependent optabs initialization. */
5815 h8300_init_libfuncs (void)
5817 set_optab_libfunc (smul_optab
, HImode
, "__mulhi3");
5818 set_optab_libfunc (sdiv_optab
, HImode
, "__divhi3");
5819 set_optab_libfunc (udiv_optab
, HImode
, "__udivhi3");
5820 set_optab_libfunc (smod_optab
, HImode
, "__modhi3");
5821 set_optab_libfunc (umod_optab
, HImode
, "__umodhi3");
5824 /* Worker function for TARGET_FUNCTION_VALUE.
5826 On the H8 the return value is in R0/R1. */
5829 h8300_function_value (const_tree ret_type
,
5830 const_tree fn_decl_or_type ATTRIBUTE_UNUSED
,
5831 bool outgoing ATTRIBUTE_UNUSED
)
5833 return gen_rtx_REG (TYPE_MODE (ret_type
), R0_REG
);
5836 /* Worker function for TARGET_LIBCALL_VALUE.
5838 On the H8 the return value is in R0/R1. */
5841 h8300_libcall_value (enum machine_mode mode
, const_rtx fun ATTRIBUTE_UNUSED
)
5843 return gen_rtx_REG (mode
, R0_REG
);
5846 /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
5848 On the H8, R0 is the only register thus used. */
5851 h8300_function_value_regno_p (const unsigned int regno
)
5853 return (regno
== R0_REG
);
5856 /* Worker function for TARGET_RETURN_IN_MEMORY. */
5859 h8300_return_in_memory (const_tree type
, const_tree fntype ATTRIBUTE_UNUSED
)
5861 return (TYPE_MODE (type
) == BLKmode
5862 || GET_MODE_SIZE (TYPE_MODE (type
)) > (TARGET_H8300
? 4 : 8));
5865 /* We emit the entire trampoline here. Depending on the pointer size,
5866 we use a different trampoline.
5870 1 0000 7903xxxx mov.w #0x1234,r3
5871 2 0004 5A00xxxx jmp @0x1234
5876 2 0000 7A03xxxxxxxx mov.l #0x12345678,er3
5877 3 0006 5Axxxxxx jmp @0x123456
5882 h8300_trampoline_init (rtx m_tramp
, tree fndecl
, rtx cxt
)
5884 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
5887 if (Pmode
== HImode
)
5889 mem
= adjust_address (m_tramp
, HImode
, 0);
5890 emit_move_insn (mem
, GEN_INT (0x7903));
5891 mem
= adjust_address (m_tramp
, Pmode
, 2);
5892 emit_move_insn (mem
, cxt
);
5893 mem
= adjust_address (m_tramp
, HImode
, 4);
5894 emit_move_insn (mem
, GEN_INT (0x5a00));
5895 mem
= adjust_address (m_tramp
, Pmode
, 6);
5896 emit_move_insn (mem
, fnaddr
);
5902 mem
= adjust_address (m_tramp
, HImode
, 0);
5903 emit_move_insn (mem
, GEN_INT (0x7a03));
5904 mem
= adjust_address (m_tramp
, Pmode
, 2);
5905 emit_move_insn (mem
, cxt
);
5907 tem
= copy_to_reg (fnaddr
);
5908 emit_insn (gen_andsi3 (tem
, tem
, GEN_INT (0x00ffffff)));
5909 emit_insn (gen_iorsi3 (tem
, tem
, GEN_INT (0x5a000000)));
5910 mem
= adjust_address (m_tramp
, SImode
, 6);
5911 emit_move_insn (mem
, tem
);
5915 /* Initialize the GCC target structure. */
5916 #undef TARGET_ATTRIBUTE_TABLE
5917 #define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
5919 #undef TARGET_ASM_ALIGNED_HI_OP
5920 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
5922 #undef TARGET_ASM_FILE_START
5923 #define TARGET_ASM_FILE_START h8300_file_start
5924 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
5925 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
5927 #undef TARGET_ASM_FILE_END
5928 #define TARGET_ASM_FILE_END h8300_file_end
5930 #undef TARGET_PRINT_OPERAND
5931 #define TARGET_PRINT_OPERAND h8300_print_operand
5932 #undef TARGET_PRINT_OPERAND_ADDRESS
5933 #define TARGET_PRINT_OPERAND_ADDRESS h8300_print_operand_address
5934 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
5935 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P h8300_print_operand_punct_valid_p
5937 #undef TARGET_ENCODE_SECTION_INFO
5938 #define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
5940 #undef TARGET_INSERT_ATTRIBUTES
5941 #define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
5943 #undef TARGET_REGISTER_MOVE_COST
5944 #define TARGET_REGISTER_MOVE_COST h8300_register_move_cost
5946 #undef TARGET_RTX_COSTS
5947 #define TARGET_RTX_COSTS h8300_rtx_costs
5949 #undef TARGET_INIT_LIBFUNCS
5950 #define TARGET_INIT_LIBFUNCS h8300_init_libfuncs
5952 #undef TARGET_FUNCTION_VALUE
5953 #define TARGET_FUNCTION_VALUE h8300_function_value
5955 #undef TARGET_LIBCALL_VALUE
5956 #define TARGET_LIBCALL_VALUE h8300_libcall_value
5958 #undef TARGET_FUNCTION_VALUE_REGNO_P
5959 #define TARGET_FUNCTION_VALUE_REGNO_P h8300_function_value_regno_p
5961 #undef TARGET_RETURN_IN_MEMORY
5962 #define TARGET_RETURN_IN_MEMORY h8300_return_in_memory
5964 #undef TARGET_FUNCTION_ARG
5965 #define TARGET_FUNCTION_ARG h8300_function_arg
5967 #undef TARGET_FUNCTION_ARG_ADVANCE
5968 #define TARGET_FUNCTION_ARG_ADVANCE h8300_function_arg_advance
5970 #undef TARGET_MACHINE_DEPENDENT_REORG
5971 #define TARGET_MACHINE_DEPENDENT_REORG h8300_reorg
5973 #undef TARGET_HARD_REGNO_SCRATCH_OK
5974 #define TARGET_HARD_REGNO_SCRATCH_OK h8300_hard_regno_scratch_ok
5976 #undef TARGET_LEGITIMATE_ADDRESS_P
5977 #define TARGET_LEGITIMATE_ADDRESS_P h8300_legitimate_address_p
5979 #undef TARGET_CAN_ELIMINATE
5980 #define TARGET_CAN_ELIMINATE h8300_can_eliminate
5982 #undef TARGET_CONDITIONAL_REGISTER_USAGE
5983 #define TARGET_CONDITIONAL_REGISTER_USAGE h8300_conditional_register_usage
5985 #undef TARGET_TRAMPOLINE_INIT
5986 #define TARGET_TRAMPOLINE_INIT h8300_trampoline_init
5988 #undef TARGET_OPTION_OVERRIDE
5989 #define TARGET_OPTION_OVERRIDE h8300_option_override
5991 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
5992 #define TARGET_MODE_DEPENDENT_ADDRESS_P h8300_mode_dependent_address_p
5994 struct gcc_target targetm
= TARGET_INITIALIZER
;