h8300.cc revision 1.1.1.1 1 1.1 mrg /* Subroutines for insn-output.cc for Renesas H8/300.
2 1.1 mrg Copyright (C) 1992-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Steve Chamberlain (sac (at) cygnus.com),
4 1.1 mrg Jim Wilson (wilson (at) cygnus.com), and Doug Evans (dje (at) cygnus.com).
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
11 1.1 mrg any later version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful,
14 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 mrg GNU General Public License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg #define IN_TARGET_CODE 1
23 1.1 mrg
24 1.1 mrg #include "config.h"
25 1.1 mrg #include "system.h"
26 1.1 mrg #include "coretypes.h"
27 1.1 mrg #include "backend.h"
28 1.1 mrg #include "target.h"
29 1.1 mrg #include "rtl.h"
30 1.1 mrg #include "tree.h"
31 1.1 mrg #include "df.h"
32 1.1 mrg #include "memmodel.h"
33 1.1 mrg #include "tm_p.h"
34 1.1 mrg #include "stringpool.h"
35 1.1 mrg #include "attribs.h"
36 1.1 mrg #include "optabs.h"
37 1.1 mrg #include "regs.h"
38 1.1 mrg #include "emit-rtl.h"
39 1.1 mrg #include "recog.h"
40 1.1 mrg #include "diagnostic-core.h"
41 1.1 mrg #include "alias.h"
42 1.1 mrg #include "stor-layout.h"
43 1.1 mrg #include "varasm.h"
44 1.1 mrg #include "calls.h"
45 1.1 mrg #include "conditions.h"
46 1.1 mrg #include "output.h"
47 1.1 mrg #include "insn-attr.h"
48 1.1 mrg #include "flags.h"
49 1.1 mrg #include "explow.h"
50 1.1 mrg #include "expr.h"
51 1.1 mrg #include "tm-constrs.h"
52 1.1 mrg #include "builtins.h"
53 1.1 mrg
54 1.1 mrg /* This file should be included last. */
55 1.1 mrg #include "target-def.h"
56 1.1 mrg
57 1.1 mrg /* Classifies a h8300_src_operand or h8300_dst_operand.
58 1.1 mrg
59 1.1 mrg H8OP_IMMEDIATE
60 1.1 mrg A constant operand of some sort.
61 1.1 mrg
62 1.1 mrg H8OP_REGISTER
63 1.1 mrg An ordinary register.
64 1.1 mrg
65 1.1 mrg H8OP_MEM_ABSOLUTE
66 1.1 mrg A memory reference with a constant address.
67 1.1 mrg
68 1.1 mrg H8OP_MEM_BASE
69 1.1 mrg A memory reference with a register as its address.
70 1.1 mrg
71 1.1 mrg H8OP_MEM_COMPLEX
72 1.1 mrg Some other kind of memory reference. */
73 1.1 mrg enum h8300_operand_class
74 1.1 mrg {
75 1.1 mrg H8OP_IMMEDIATE,
76 1.1 mrg H8OP_REGISTER,
77 1.1 mrg H8OP_MEM_ABSOLUTE,
78 1.1 mrg H8OP_MEM_BASE,
79 1.1 mrg H8OP_MEM_COMPLEX,
80 1.1 mrg NUM_H8OPS
81 1.1 mrg };
82 1.1 mrg
83 1.1 mrg /* For a general two-operand instruction, element [X][Y] gives
84 1.1 mrg the length of the opcode fields when the first operand has class
85 1.1 mrg (X + 1) and the second has class Y. */
86 1.1 mrg typedef unsigned char h8300_length_table[NUM_H8OPS - 1][NUM_H8OPS];
87 1.1 mrg
88 1.1 mrg /* Forward declarations. */
89 1.1 mrg static const char *byte_reg (rtx, int);
90 1.1 mrg static int h8300_interrupt_function_p (tree);
91 1.1 mrg static int h8300_saveall_function_p (tree);
92 1.1 mrg static int h8300_monitor_function_p (tree);
93 1.1 mrg static int h8300_os_task_function_p (tree);
94 1.1 mrg static void h8300_emit_stack_adjustment (int, HOST_WIDE_INT);
95 1.1 mrg static HOST_WIDE_INT round_frame_size (HOST_WIDE_INT);
96 1.1 mrg static unsigned int compute_saved_regs (void);
97 1.1 mrg static const char *cond_string (enum rtx_code);
98 1.1 mrg static unsigned int h8300_asm_insn_count (const char *);
99 1.1 mrg static tree h8300_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
100 1.1 mrg static tree h8300_handle_eightbit_data_attribute (tree *, tree, tree, int, bool *);
101 1.1 mrg static tree h8300_handle_tiny_data_attribute (tree *, tree, tree, int, bool *);
102 1.1 mrg static void h8300_print_operand_address (FILE *, machine_mode, rtx);
103 1.1 mrg static void h8300_print_operand (FILE *, rtx, int);
104 1.1 mrg static bool h8300_print_operand_punct_valid_p (unsigned char code);
105 1.1 mrg static int h8300_register_move_cost (machine_mode, reg_class_t, reg_class_t);
106 1.1 mrg static int h8300_and_costs (rtx);
107 1.1 mrg static int h8300_shift_costs (rtx);
108 1.1 mrg static void h8300_push_pop (int, int, bool, bool);
109 1.1 mrg static int h8300_stack_offset_p (rtx, int);
110 1.1 mrg static int h8300_ldm_stm_regno (rtx, int, int, int);
111 1.1 mrg static void h8300_reorg (void);
112 1.1 mrg static unsigned int h8300_constant_length (rtx);
113 1.1 mrg static unsigned int h8300_displacement_length (rtx, int);
114 1.1 mrg static unsigned int h8300_classify_operand (rtx, int, enum h8300_operand_class *);
115 1.1 mrg static unsigned int h8300_length_from_table (rtx, rtx, const h8300_length_table *);
116 1.1 mrg static unsigned int h8300_unary_length (rtx);
117 1.1 mrg static unsigned int h8300_short_immediate_length (rtx);
118 1.1 mrg static unsigned int h8300_bitfield_length (rtx, rtx);
119 1.1 mrg static unsigned int h8300_binary_length (rtx_insn *, const h8300_length_table *);
120 1.1 mrg static bool h8300_short_move_mem_p (rtx, enum rtx_code);
121 1.1 mrg static unsigned int h8300_move_length (rtx *, const h8300_length_table *);
122 1.1 mrg static bool h8300_hard_regno_scratch_ok (unsigned int);
123 1.1 mrg static rtx h8300_get_index (rtx, machine_mode mode, int *);
124 1.1 mrg
125 1.1 mrg /* CPU_TYPE, says what cpu we're compiling for. */
126 1.1 mrg int cpu_type;
127 1.1 mrg
128 1.1 mrg /* True if a #pragma interrupt has been seen for the current function. */
129 1.1 mrg static int pragma_interrupt;
130 1.1 mrg
131 1.1 mrg /* True if a #pragma saveall has been seen for the current function. */
132 1.1 mrg static int pragma_saveall;
133 1.1 mrg
134 1.1 mrg static const char *const names_big[] =
135 1.1 mrg { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "cc" };
136 1.1 mrg
137 1.1 mrg static const char *const names_extended[] =
138 1.1 mrg { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "er7", "cc" };
139 1.1 mrg
140 1.1 mrg static const char *const names_upper_extended[] =
141 1.1 mrg { "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "cc" };
142 1.1 mrg
143 1.1 mrg /* Points to one of the above. */
144 1.1 mrg /* ??? The above could be put in an array indexed by CPU_TYPE. */
145 1.1 mrg const char * const *h8_reg_names;
146 1.1 mrg
147 1.1 mrg /* Various operations needed by the following, indexed by CPU_TYPE. */
148 1.1 mrg
149 1.1 mrg const char *h8_push_op, *h8_pop_op, *h8_mov_op;
150 1.1 mrg
151 1.1 mrg /* Value of MOVE_RATIO. */
152 1.1 mrg int h8300_move_ratio;
153 1.1 mrg
154 1.1 mrg /* See below where shifts are handled for explanation of this enum. */
156 1.1 mrg
157 1.1 mrg enum shift_alg
158 1.1 mrg {
159 1.1 mrg SHIFT_INLINE,
160 1.1 mrg SHIFT_ROT_AND,
161 1.1 mrg SHIFT_SPECIAL,
162 1.1 mrg SHIFT_LOOP
163 1.1 mrg };
164 1.1 mrg
165 1.1 mrg /* Symbols of the various shifts which can be used as indices. */
166 1.1 mrg
167 1.1 mrg enum shift_type
168 1.1 mrg {
169 1.1 mrg SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
170 1.1 mrg };
171 1.1 mrg
172 1.1 mrg /* Macros to keep the shift algorithm tables small. */
173 1.1 mrg #define INL SHIFT_INLINE
174 1.1 mrg #define ROT SHIFT_ROT_AND
175 1.1 mrg #define LOP SHIFT_LOOP
176 1.1 mrg #define SPC SHIFT_SPECIAL
177 1.1 mrg
178 1.1 mrg /* The shift algorithms for each machine, mode, shift type, and shift
179 1.1 mrg count are defined below. The three tables below correspond to
180 1.1 mrg QImode, HImode, and SImode, respectively. Each table is organized
181 1.1 mrg by, in the order of indices, machine, shift type, and shift count. */
182 1.1 mrg
183 1.1 mrg static enum shift_alg shift_alg_qi[2][3][8] = {
184 1.1 mrg {
185 1.1 mrg /* TARGET_H8300H */
186 1.1 mrg /* 0 1 2 3 4 5 6 7 */
187 1.1 mrg { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
188 1.1 mrg { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
189 1.1 mrg { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
190 1.1 mrg },
191 1.1 mrg {
192 1.1 mrg /* TARGET_H8300S */
193 1.1 mrg /* 0 1 2 3 4 5 6 7 */
194 1.1 mrg { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT */
195 1.1 mrg { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
196 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, SPC } /* SHIFT_ASHIFTRT */
197 1.1 mrg }
198 1.1 mrg };
199 1.1 mrg
200 1.1 mrg static enum shift_alg shift_alg_hi[2][3][16] = {
201 1.1 mrg {
202 1.1 mrg /* TARGET_H8300H */
203 1.1 mrg /* 0 1 2 3 4 5 6 7 */
204 1.1 mrg /* 8 9 10 11 12 13 14 15 */
205 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, SPC,
206 1.1 mrg SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
207 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, SPC,
208 1.1 mrg SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
209 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, SPC,
210 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
211 1.1 mrg },
212 1.1 mrg {
213 1.1 mrg /* TARGET_H8300S */
214 1.1 mrg /* 0 1 2 3 4 5 6 7 */
215 1.1 mrg /* 8 9 10 11 12 13 14 15 */
216 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
217 1.1 mrg SPC, SPC, SPC, SPC, ROT, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
218 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
219 1.1 mrg SPC, SPC, SPC, SPC, ROT, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
220 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
221 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
222 1.1 mrg }
223 1.1 mrg };
224 1.1 mrg
225 1.1 mrg static enum shift_alg shift_alg_si[2][3][32] = {
226 1.1 mrg {
227 1.1 mrg /* TARGET_H8300H */
228 1.1 mrg /* 0 1 2 3 4 5 6 7 */
229 1.1 mrg /* 8 9 10 11 12 13 14 15 */
230 1.1 mrg /* 16 17 18 19 20 21 22 23 */
231 1.1 mrg /* 24 25 26 27 28 29 30 31 */
232 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, LOP,
233 1.1 mrg SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
234 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
235 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
236 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, LOP,
237 1.1 mrg SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
238 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
239 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
240 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, LOP,
241 1.1 mrg SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
242 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
243 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
244 1.1 mrg },
245 1.1 mrg {
246 1.1 mrg /* TARGET_H8300S */
247 1.1 mrg /* 0 1 2 3 4 5 6 7 */
248 1.1 mrg /* 8 9 10 11 12 13 14 15 */
249 1.1 mrg /* 16 17 18 19 20 21 22 23 */
250 1.1 mrg /* 24 25 26 27 28 29 30 31 */
251 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
252 1.1 mrg INL, INL, INL, INL, INL, INL, INL, SPC,
253 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
254 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
255 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
256 1.1 mrg INL, INL, INL, INL, INL, INL, INL, SPC,
257 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
258 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
259 1.1 mrg { INL, INL, INL, INL, INL, INL, INL, INL,
260 1.1 mrg INL, INL, INL, INL, INL, INL, INL, SPC,
261 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC,
262 1.1 mrg SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
263 1.1 mrg }
264 1.1 mrg };
265 1.1 mrg
266 1.1 mrg #undef INL
267 1.1 mrg #undef ROT
268 1.1 mrg #undef LOP
269 1.1 mrg #undef SPC
270 1.1 mrg
271 1.1 mrg enum h8_cpu
272 1.1 mrg {
273 1.1 mrg H8_300H,
274 1.1 mrg H8_S
275 1.1 mrg };
276 1.1 mrg
277 1.1 mrg /* Initialize various cpu specific globals at start up. */
278 1.1 mrg
279 1.1 mrg static void
280 1.1 mrg h8300_option_override (void)
281 1.1 mrg {
282 1.1 mrg static const char *const h8_push_ops[2] = { "push" , "push.l" };
283 1.1 mrg static const char *const h8_pop_ops[2] = { "pop" , "pop.l" };
284 1.1 mrg static const char *const h8_mov_ops[2] = { "mov.w", "mov.l" };
285 1.1 mrg
286 1.1 mrg /* For this we treat the H8/300H and H8S the same. */
287 1.1 mrg cpu_type = (int) CPU_H8300H;
288 1.1 mrg h8_reg_names = names_extended;
289 1.1 mrg h8_push_op = h8_push_ops[cpu_type];
290 1.1 mrg h8_pop_op = h8_pop_ops[cpu_type];
291 1.1 mrg h8_mov_op = h8_mov_ops[cpu_type];
292 1.1 mrg
293 1.1 mrg /* If we're compiling for the H8/S, then turn off H8/300H. */
294 1.1 mrg if (TARGET_H8300S)
295 1.1 mrg target_flags &= ~MASK_H8300H;
296 1.1 mrg
297 1.1 mrg if (!TARGET_H8300S && TARGET_MAC)
298 1.1 mrg {
299 1.1 mrg error ("%<-ms2600%> is used without %<-ms%>");
300 1.1 mrg target_flags |= MASK_H8300S_1;
301 1.1 mrg }
302 1.1 mrg
303 1.1 mrg if (! TARGET_H8300S && TARGET_EXR)
304 1.1 mrg {
305 1.1 mrg error ("%<-mexr%> is used without %<-ms%>");
306 1.1 mrg target_flags |= MASK_H8300S_1;
307 1.1 mrg }
308 1.1 mrg
309 1.1 mrg if ((!TARGET_H8300S && TARGET_EXR) && (!TARGET_H8300SX && TARGET_EXR))
310 1.1 mrg {
311 1.1 mrg error ("%<-mexr%> is used without %<-ms%> or %<-msx%>");
312 1.1 mrg target_flags |= MASK_H8300S_1;
313 1.1 mrg }
314 1.1 mrg
315 1.1 mrg if ((!TARGET_H8300S && TARGET_NEXR) && (!TARGET_H8300SX && TARGET_NEXR))
316 1.1 mrg {
317 1.1 mrg warning (OPT_mno_exr, "%<-mno-exr%> is valid only with %<-ms%> or "
318 1.1 mrg "%<-msx%> - option ignored");
319 1.1 mrg }
320 1.1 mrg
321 1.1 mrg #ifdef H8300_LINUX
322 1.1 mrg if ((TARGET_NORMAL_MODE))
323 1.1 mrg {
324 1.1 mrg error ("%<-mn%> is not supported for linux targets");
325 1.1 mrg target_flags ^= MASK_NORMAL_MODE;
326 1.1 mrg }
327 1.1 mrg #endif
328 1.1 mrg
329 1.1 mrg /* Some of the shifts are optimized for speed by default.
330 1.1 mrg See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
331 1.1 mrg If optimizing for size, change shift_alg for those shift to
332 1.1 mrg SHIFT_LOOP. */
333 1.1 mrg if (optimize_size)
334 1.1 mrg {
335 1.1 mrg /* H8/300H */
336 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
337 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
338 1.1 mrg
339 1.1 mrg shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
340 1.1 mrg shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
341 1.1 mrg
342 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
343 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
344 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
345 1.1 mrg shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
346 1.1 mrg
347 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
348 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
349 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][20] = SHIFT_LOOP;
350 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][21] = SHIFT_LOOP;
351 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][22] = SHIFT_LOOP;
352 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][23] = SHIFT_LOOP;
353 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][25] = SHIFT_LOOP;
354 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][26] = SHIFT_LOOP;
355 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFT][27] = SHIFT_LOOP;
356 1.1 mrg
357 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
358 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
359 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][20] = SHIFT_LOOP;
360 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][21] = SHIFT_LOOP;
361 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][22] = SHIFT_LOOP;
362 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][23] = SHIFT_LOOP;
363 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][25] = SHIFT_LOOP;
364 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][26] = SHIFT_LOOP;
365 1.1 mrg shift_alg_si[H8_300H][SHIFT_LSHIFTRT][27] = SHIFT_LOOP;
366 1.1 mrg
367 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
368 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
369 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][20] = SHIFT_LOOP;
370 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][21] = SHIFT_LOOP;
371 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][22] = SHIFT_LOOP;
372 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][23] = SHIFT_LOOP;
373 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][25] = SHIFT_LOOP;
374 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][26] = SHIFT_LOOP;
375 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][27] = SHIFT_LOOP;
376 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][28] = SHIFT_LOOP;
377 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][29] = SHIFT_LOOP;
378 1.1 mrg shift_alg_si[H8_300H][SHIFT_ASHIFTRT][30] = SHIFT_LOOP;
379 1.1 mrg
380 1.1 mrg /* H8S */
381 1.1 mrg shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
382 1.1 mrg
383 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][11] = SHIFT_LOOP;
384 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][12] = SHIFT_LOOP;
385 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][13] = SHIFT_LOOP;
386 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][14] = SHIFT_LOOP;
387 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][22] = SHIFT_LOOP;
388 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][23] = SHIFT_LOOP;
389 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][26] = SHIFT_LOOP;
390 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFT][27] = SHIFT_LOOP;
391 1.1 mrg
392 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][11] = SHIFT_LOOP;
393 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][12] = SHIFT_LOOP;
394 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
395 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
396 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][22] = SHIFT_LOOP;
397 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][23] = SHIFT_LOOP;
398 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][26] = SHIFT_LOOP;
399 1.1 mrg shift_alg_si[H8_S][SHIFT_LSHIFTRT][27] = SHIFT_LOOP;
400 1.1 mrg
401 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][11] = SHIFT_LOOP;
402 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][12] = SHIFT_LOOP;
403 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
404 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
405 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][22] = SHIFT_LOOP;
406 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][23] = SHIFT_LOOP;
407 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][26] = SHIFT_LOOP;
408 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][27] = SHIFT_LOOP;
409 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][28] = SHIFT_LOOP;
410 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][29] = SHIFT_LOOP;
411 1.1 mrg shift_alg_si[H8_S][SHIFT_ASHIFTRT][30] = SHIFT_LOOP;
412 1.1 mrg }
413 1.1 mrg
414 1.1 mrg /* Work out a value for MOVE_RATIO. */
415 1.1 mrg if (!TARGET_H8300SX)
416 1.1 mrg {
417 1.1 mrg /* Memory-memory moves are quite expensive without the
418 1.1 mrg h8sx instructions. */
419 1.1 mrg h8300_move_ratio = 3;
420 1.1 mrg }
421 1.1 mrg else if (flag_omit_frame_pointer)
422 1.1 mrg {
423 1.1 mrg /* movmd sequences are fairly cheap when er6 isn't fixed. They can
424 1.1 mrg sometimes be as short as two individual memory-to-memory moves,
425 1.1 mrg but since they use all the call-saved registers, it seems better
426 1.1 mrg to allow up to three moves here. */
427 1.1 mrg h8300_move_ratio = 4;
428 1.1 mrg }
429 1.1 mrg else if (optimize_size)
430 1.1 mrg {
431 1.1 mrg /* In this case we don't use movmd sequences since they tend
432 1.1 mrg to be longer than calls to memcpy(). Memory-to-memory
433 1.1 mrg moves are cheaper than for !TARGET_H8300SX, so it makes
434 1.1 mrg sense to have a slightly higher threshold. */
435 1.1 mrg h8300_move_ratio = 4;
436 1.1 mrg }
437 1.1 mrg else
438 1.1 mrg {
439 1.1 mrg /* We use movmd sequences for some moves since it can be quicker
440 1.1 mrg than calling memcpy(). The sequences will need to save and
441 1.1 mrg restore er6 though, so bump up the cost. */
442 1.1 mrg h8300_move_ratio = 6;
443 1.1 mrg }
444 1.1 mrg
445 1.1 mrg /* This target defaults to strict volatile bitfields. */
446 1.1 mrg if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
447 1.1 mrg flag_strict_volatile_bitfields = 1;
448 1.1 mrg }
449 1.1 mrg
450 1.1 mrg /* Return the byte register name for a register rtx X. B should be 0
451 1.1 mrg if you want a lower byte register. B should be 1 if you want an
452 1.1 mrg upper byte register. */
453 1.1 mrg
454 1.1 mrg static const char *
455 1.1 mrg byte_reg (rtx x, int b)
456 1.1 mrg {
457 1.1 mrg static const char *const names_small[] = {
458 1.1 mrg "r0l", "r0h", "r1l", "r1h", "r2l", "r2h", "r3l", "r3h",
459 1.1 mrg "r4l", "r4h", "r5l", "r5h", "r6l", "r6h", "r7l", "r7h"
460 1.1 mrg };
461 1.1 mrg
462 1.1 mrg gcc_assert (REG_P (x));
463 1.1 mrg
464 1.1 mrg return names_small[REGNO (x) * 2 + b];
465 1.1 mrg }
466 1.1 mrg
467 1.1 mrg /* REGNO must be saved/restored across calls if this macro is true. */
468 1.1 mrg
469 1.1 mrg #define WORD_REG_USED(regno) \
470 1.1 mrg (regno < SP_REG \
471 1.1 mrg /* No need to save registers if this function will not return. */ \
472 1.1 mrg && ! TREE_THIS_VOLATILE (current_function_decl) \
473 1.1 mrg && (h8300_saveall_function_p (current_function_decl) \
474 1.1 mrg /* Save any call saved register that was used. */ \
475 1.1 mrg || (df_regs_ever_live_p (regno) \
476 1.1 mrg && !call_used_or_fixed_reg_p (regno)) \
477 1.1 mrg /* Save the frame pointer if it was used. */ \
478 1.1 mrg || (regno == HARD_FRAME_POINTER_REGNUM && df_regs_ever_live_p (regno)) \
479 1.1 mrg /* Save any register used in an interrupt handler. */ \
480 1.1 mrg || (h8300_current_function_interrupt_function_p () \
481 1.1 mrg && df_regs_ever_live_p (regno)) \
482 1.1 mrg /* Save call clobbered registers in non-leaf interrupt \
483 1.1 mrg handlers. */ \
484 1.1 mrg || (h8300_current_function_interrupt_function_p () \
485 1.1 mrg && call_used_or_fixed_reg_p (regno) \
486 1.1 mrg && !crtl->is_leaf)))
487 1.1 mrg
488 1.1 mrg /* We use this to wrap all emitted insns in the prologue. */
489 1.1 mrg static rtx_insn *
490 1.1 mrg F (rtx_insn *x, bool set_it)
491 1.1 mrg {
492 1.1 mrg if (set_it)
493 1.1 mrg RTX_FRAME_RELATED_P (x) = 1;
494 1.1 mrg return x;
495 1.1 mrg }
496 1.1 mrg
497 1.1 mrg /* Mark all the subexpressions of the PARALLEL rtx PAR as
498 1.1 mrg frame-related. Return PAR.
499 1.1 mrg
500 1.1 mrg dwarf2out.cc:dwarf2out_frame_debug_expr ignores sub-expressions of a
501 1.1 mrg PARALLEL rtx other than the first if they do not have the
502 1.1 mrg FRAME_RELATED flag set on them. */
503 1.1 mrg static rtx
504 1.1 mrg Fpa (rtx par)
505 1.1 mrg {
506 1.1 mrg int len = XVECLEN (par, 0);
507 1.1 mrg int i;
508 1.1 mrg
509 1.1 mrg for (i = 0; i < len; i++)
510 1.1 mrg RTX_FRAME_RELATED_P (XVECEXP (par, 0, i)) = 1;
511 1.1 mrg
512 1.1 mrg return par;
513 1.1 mrg }
514 1.1 mrg
515 1.1 mrg /* Output assembly language to FILE for the operation OP with operand size
516 1.1 mrg SIZE to adjust the stack pointer. */
517 1.1 mrg
518 1.1 mrg static void
519 1.1 mrg h8300_emit_stack_adjustment (int sign, HOST_WIDE_INT size)
520 1.1 mrg {
521 1.1 mrg /* If the frame size is 0, we don't have anything to do. */
522 1.1 mrg if (size == 0)
523 1.1 mrg return;
524 1.1 mrg
525 1.1 mrg /* The stack adjustment made here is further optimized by the
526 1.1 mrg splitter. In case of H8/300, the splitter always splits the
527 1.1 mrg addition emitted here to make the adjustment interrupt-safe.
528 1.1 mrg FIXME: We don't always tag those, because we don't know what
529 1.1 mrg the splitter will do. */
530 1.1 mrg if (Pmode == HImode)
531 1.1 mrg {
532 1.1 mrg rtx_insn *x = emit_insn (gen_addhi3 (stack_pointer_rtx,
533 1.1 mrg stack_pointer_rtx,
534 1.1 mrg GEN_INT (sign * size)));
535 1.1 mrg if (size < 4)
536 1.1 mrg F (x, 0);
537 1.1 mrg }
538 1.1 mrg else
539 1.1 mrg F (emit_insn (gen_addsi3 (stack_pointer_rtx,
540 1.1 mrg stack_pointer_rtx, GEN_INT (sign * size))), 0);
541 1.1 mrg }
542 1.1 mrg
543 1.1 mrg /* Round up frame size SIZE. */
544 1.1 mrg
545 1.1 mrg static HOST_WIDE_INT
546 1.1 mrg round_frame_size (HOST_WIDE_INT size)
547 1.1 mrg {
548 1.1 mrg return ((size + STACK_BOUNDARY / BITS_PER_UNIT - 1)
549 1.1 mrg & -STACK_BOUNDARY / BITS_PER_UNIT);
550 1.1 mrg }
551 1.1 mrg
552 1.1 mrg /* Compute which registers to push/pop.
553 1.1 mrg Return a bit vector of registers. */
554 1.1 mrg
555 1.1 mrg static unsigned int
556 1.1 mrg compute_saved_regs (void)
557 1.1 mrg {
558 1.1 mrg unsigned int saved_regs = 0;
559 1.1 mrg int regno;
560 1.1 mrg
561 1.1 mrg /* Construct a bit vector of registers to be pushed/popped. */
562 1.1 mrg for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
563 1.1 mrg {
564 1.1 mrg if (WORD_REG_USED (regno))
565 1.1 mrg saved_regs |= 1 << regno;
566 1.1 mrg }
567 1.1 mrg
568 1.1 mrg /* Don't push/pop the frame pointer as it is treated separately. */
569 1.1 mrg if (frame_pointer_needed)
570 1.1 mrg saved_regs &= ~(1 << HARD_FRAME_POINTER_REGNUM);
571 1.1 mrg
572 1.1 mrg return saved_regs;
573 1.1 mrg }
574 1.1 mrg
575 1.1 mrg /* Emit an insn to push register RN. */
576 1.1 mrg
577 1.1 mrg static rtx
578 1.1 mrg push (int rn)
579 1.1 mrg {
580 1.1 mrg rtx reg = gen_rtx_REG (word_mode, rn);
581 1.1 mrg rtx x;
582 1.1 mrg
583 1.1 mrg if (!TARGET_NORMAL_MODE)
584 1.1 mrg x = gen_push_h8300hs_advanced (reg);
585 1.1 mrg else
586 1.1 mrg x = gen_push_h8300hs_normal (reg);
587 1.1 mrg x = F (emit_insn (x), 0);
588 1.1 mrg add_reg_note (x, REG_INC, stack_pointer_rtx);
589 1.1 mrg return x;
590 1.1 mrg }
591 1.1 mrg
592 1.1 mrg /* Emit an insn to pop register RN. */
593 1.1 mrg
594 1.1 mrg static rtx
595 1.1 mrg pop (int rn)
596 1.1 mrg {
597 1.1 mrg rtx reg = gen_rtx_REG (word_mode, rn);
598 1.1 mrg rtx x;
599 1.1 mrg
600 1.1 mrg if (!TARGET_NORMAL_MODE)
601 1.1 mrg x = gen_pop_h8300hs_advanced (reg);
602 1.1 mrg else
603 1.1 mrg x = gen_pop_h8300hs_normal (reg);
604 1.1 mrg x = emit_insn (x);
605 1.1 mrg add_reg_note (x, REG_INC, stack_pointer_rtx);
606 1.1 mrg return x;
607 1.1 mrg }
608 1.1 mrg
609 1.1 mrg /* Emit an instruction to push or pop NREGS consecutive registers
610 1.1 mrg starting at register REGNO. POP_P selects a pop rather than a
611 1.1 mrg push and RETURN_P is true if the instruction should return.
612 1.1 mrg
613 1.1 mrg It must be possible to do the requested operation in a single
614 1.1 mrg instruction. If NREGS == 1 && !RETURN_P, use a normal push
615 1.1 mrg or pop insn. Otherwise emit a parallel of the form:
616 1.1 mrg
617 1.1 mrg (parallel
618 1.1 mrg [(return) ;; if RETURN_P
619 1.1 mrg (save or restore REGNO)
620 1.1 mrg (save or restore REGNO + 1)
621 1.1 mrg ...
622 1.1 mrg (save or restore REGNO + NREGS - 1)
623 1.1 mrg (set sp (plus sp (const_int adjust)))] */
624 1.1 mrg
625 1.1 mrg static void
626 1.1 mrg h8300_push_pop (int regno, int nregs, bool pop_p, bool return_p)
627 1.1 mrg {
628 1.1 mrg int i, j;
629 1.1 mrg rtvec vec;
630 1.1 mrg rtx sp, offset, x;
631 1.1 mrg
632 1.1 mrg /* See whether we can use a simple push or pop. */
633 1.1 mrg if (!return_p && nregs == 1)
634 1.1 mrg {
635 1.1 mrg if (pop_p)
636 1.1 mrg pop (regno);
637 1.1 mrg else
638 1.1 mrg push (regno);
639 1.1 mrg return;
640 1.1 mrg }
641 1.1 mrg
642 1.1 mrg /* We need one element for the return insn, if present, one for each
643 1.1 mrg register, and one for stack adjustment. */
644 1.1 mrg vec = rtvec_alloc ((return_p ? 1 : 0) + nregs + 1);
645 1.1 mrg sp = stack_pointer_rtx;
646 1.1 mrg i = 0;
647 1.1 mrg
648 1.1 mrg /* Add the return instruction. */
649 1.1 mrg if (return_p)
650 1.1 mrg {
651 1.1 mrg RTVEC_ELT (vec, i) = ret_rtx;
652 1.1 mrg i++;
653 1.1 mrg }
654 1.1 mrg
655 1.1 mrg /* Add the register moves. */
656 1.1 mrg for (j = 0; j < nregs; j++)
657 1.1 mrg {
658 1.1 mrg rtx lhs, rhs;
659 1.1 mrg
660 1.1 mrg if (pop_p)
661 1.1 mrg {
662 1.1 mrg /* Register REGNO + NREGS - 1 is popped first. Before the
663 1.1 mrg stack adjustment, its slot is at address @sp. */
664 1.1 mrg lhs = gen_rtx_REG (SImode, regno + j);
665 1.1 mrg rhs = gen_rtx_MEM (SImode, plus_constant (Pmode, sp,
666 1.1 mrg (nregs - j - 1) * 4));
667 1.1 mrg }
668 1.1 mrg else
669 1.1 mrg {
670 1.1 mrg /* Register REGNO is pushed first and will be stored at @(-4,sp). */
671 1.1 mrg lhs = gen_rtx_MEM (SImode, plus_constant (Pmode, sp, (j + 1) * -4));
672 1.1 mrg rhs = gen_rtx_REG (SImode, regno + j);
673 1.1 mrg }
674 1.1 mrg RTVEC_ELT (vec, i + j) = gen_rtx_SET (lhs, rhs);
675 1.1 mrg }
676 1.1 mrg
677 1.1 mrg /* Add the stack adjustment. */
678 1.1 mrg offset = GEN_INT ((pop_p ? nregs : -nregs) * 4);
679 1.1 mrg RTVEC_ELT (vec, i + j) = gen_rtx_SET (sp, gen_rtx_PLUS (Pmode, sp, offset));
680 1.1 mrg
681 1.1 mrg x = gen_rtx_PARALLEL (VOIDmode, vec);
682 1.1 mrg if (!pop_p)
683 1.1 mrg x = Fpa (x);
684 1.1 mrg
685 1.1 mrg if (return_p)
686 1.1 mrg emit_jump_insn (x);
687 1.1 mrg else
688 1.1 mrg emit_insn (x);
689 1.1 mrg }
690 1.1 mrg
691 1.1 mrg /* Return true if X has the value sp + OFFSET. */
692 1.1 mrg
693 1.1 mrg static int
694 1.1 mrg h8300_stack_offset_p (rtx x, int offset)
695 1.1 mrg {
696 1.1 mrg if (offset == 0)
697 1.1 mrg return x == stack_pointer_rtx;
698 1.1 mrg
699 1.1 mrg return (GET_CODE (x) == PLUS
700 1.1 mrg && XEXP (x, 0) == stack_pointer_rtx
701 1.1 mrg && GET_CODE (XEXP (x, 1)) == CONST_INT
702 1.1 mrg && INTVAL (XEXP (x, 1)) == offset);
703 1.1 mrg }
704 1.1 mrg
705 1.1 mrg /* A subroutine of h8300_ldm_stm_parallel. X is one pattern in
706 1.1 mrg something that may be an ldm or stm instruction. If it fits
707 1.1 mrg the required template, return the register it loads or stores,
708 1.1 mrg otherwise return -1.
709 1.1 mrg
710 1.1 mrg LOAD_P is true if X should be a load, false if it should be a store.
711 1.1 mrg NREGS is the number of registers that the whole instruction is expected
712 1.1 mrg to load or store. INDEX is the index of the register that X should
713 1.1 mrg load or store, relative to the lowest-numbered register. */
714 1.1 mrg
715 1.1 mrg static int
716 1.1 mrg h8300_ldm_stm_regno (rtx x, int load_p, int index, int nregs)
717 1.1 mrg {
718 1.1 mrg int regindex, memindex, offset;
719 1.1 mrg
720 1.1 mrg if (load_p)
721 1.1 mrg regindex = 0, memindex = 1, offset = (nregs - index - 1) * 4;
722 1.1 mrg else
723 1.1 mrg memindex = 0, regindex = 1, offset = (index + 1) * -4;
724 1.1 mrg
725 1.1 mrg if (GET_CODE (x) == SET
726 1.1 mrg && GET_CODE (XEXP (x, regindex)) == REG
727 1.1 mrg && GET_CODE (XEXP (x, memindex)) == MEM
728 1.1 mrg && h8300_stack_offset_p (XEXP (XEXP (x, memindex), 0), offset))
729 1.1 mrg return REGNO (XEXP (x, regindex));
730 1.1 mrg
731 1.1 mrg return -1;
732 1.1 mrg }
733 1.1 mrg
734 1.1 mrg /* Return true if the elements of VEC starting at FIRST describe an
735 1.1 mrg ldm or stm instruction (LOAD_P says which). */
736 1.1 mrg
737 1.1 mrg int
738 1.1 mrg h8300_ldm_stm_parallel (rtvec vec, int load_p, int first)
739 1.1 mrg {
740 1.1 mrg rtx last;
741 1.1 mrg int nregs, i, regno, adjust;
742 1.1 mrg
743 1.1 mrg /* There must be a stack adjustment, a register move, and at least one
744 1.1 mrg other operation (a return or another register move). */
745 1.1 mrg if (GET_NUM_ELEM (vec) < 3)
746 1.1 mrg return false;
747 1.1 mrg
748 1.1 mrg /* Get the range of registers to be pushed or popped. */
749 1.1 mrg nregs = GET_NUM_ELEM (vec) - first - 1;
750 1.1 mrg regno = h8300_ldm_stm_regno (RTVEC_ELT (vec, first), load_p, 0, nregs);
751 1.1 mrg
752 1.1 mrg /* Check that the call to h8300_ldm_stm_regno succeeded and
753 1.1 mrg that we're only dealing with GPRs. */
754 1.1 mrg if (regno < 0 || regno + nregs > 8)
755 1.1 mrg return false;
756 1.1 mrg
757 1.1 mrg /* 2-register h8s instructions must start with an even-numbered register.
758 1.1 mrg 3- and 4-register instructions must start with er0 or er4. */
759 1.1 mrg if (!TARGET_H8300SX)
760 1.1 mrg {
761 1.1 mrg if ((regno & 1) != 0)
762 1.1 mrg return false;
763 1.1 mrg if (nregs > 2 && (regno & 3) != 0)
764 1.1 mrg return false;
765 1.1 mrg }
766 1.1 mrg
767 1.1 mrg /* Check the other loads or stores. */
768 1.1 mrg for (i = 1; i < nregs; i++)
769 1.1 mrg if (h8300_ldm_stm_regno (RTVEC_ELT (vec, first + i), load_p, i, nregs)
770 1.1 mrg != regno + i)
771 1.1 mrg return false;
772 1.1 mrg
773 1.1 mrg /* Check the stack adjustment. */
774 1.1 mrg last = RTVEC_ELT (vec, first + nregs);
775 1.1 mrg adjust = (load_p ? nregs : -nregs) * 4;
776 1.1 mrg return (GET_CODE (last) == SET
777 1.1 mrg && SET_DEST (last) == stack_pointer_rtx
778 1.1 mrg && h8300_stack_offset_p (SET_SRC (last), adjust));
779 1.1 mrg }
780 1.1 mrg
781 1.1 mrg /* This is what the stack looks like after the prolog of
782 1.1 mrg a function with a frame has been set up:
783 1.1 mrg
784 1.1 mrg <args>
785 1.1 mrg PC
786 1.1 mrg FP <- fp
787 1.1 mrg <locals>
788 1.1 mrg <saved registers> <- sp
789 1.1 mrg
790 1.1 mrg This is what the stack looks like after the prolog of
791 1.1 mrg a function which doesn't have a frame:
792 1.1 mrg
793 1.1 mrg <args>
794 1.1 mrg PC
795 1.1 mrg <locals>
796 1.1 mrg <saved registers> <- sp
797 1.1 mrg */
798 1.1 mrg
799 1.1 mrg /* Generate RTL code for the function prologue. */
800 1.1 mrg
801 1.1 mrg void
802 1.1 mrg h8300_expand_prologue (void)
803 1.1 mrg {
804 1.1 mrg int regno;
805 1.1 mrg int saved_regs;
806 1.1 mrg int n_regs;
807 1.1 mrg
808 1.1 mrg /* If the current function has the OS_Task attribute set, then
809 1.1 mrg we have a naked prologue. */
810 1.1 mrg if (h8300_os_task_function_p (current_function_decl))
811 1.1 mrg return;
812 1.1 mrg
813 1.1 mrg if (h8300_monitor_function_p (current_function_decl))
814 1.1 mrg /* The monitor function act as normal functions, which means it
815 1.1 mrg can accept parameters and return values. In addition to this,
816 1.1 mrg interrupts are masked in prologue and return with "rte" in epilogue. */
817 1.1 mrg emit_insn (gen_monitor_prologue ());
818 1.1 mrg
819 1.1 mrg if (frame_pointer_needed)
820 1.1 mrg {
821 1.1 mrg /* Push fp. */
822 1.1 mrg push (HARD_FRAME_POINTER_REGNUM);
823 1.1 mrg F (emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx), 0);
824 1.1 mrg }
825 1.1 mrg
826 1.1 mrg /* Push the rest of the registers in ascending order. */
827 1.1 mrg saved_regs = compute_saved_regs ();
828 1.1 mrg for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno += n_regs)
829 1.1 mrg {
830 1.1 mrg n_regs = 1;
831 1.1 mrg if (saved_regs & (1 << regno))
832 1.1 mrg {
833 1.1 mrg if (TARGET_H8300S)
834 1.1 mrg {
835 1.1 mrg /* See how many registers we can push at the same time. */
836 1.1 mrg if ((TARGET_H8300SX || (regno & 3) == 0)
837 1.1 mrg && ((saved_regs >> regno) & 0x0f) == 0x0f)
838 1.1 mrg n_regs = 4;
839 1.1 mrg
840 1.1 mrg else if ((TARGET_H8300SX || (regno & 3) == 0)
841 1.1 mrg && ((saved_regs >> regno) & 0x07) == 0x07)
842 1.1 mrg n_regs = 3;
843 1.1 mrg
844 1.1 mrg else if ((TARGET_H8300SX || (regno & 1) == 0)
845 1.1 mrg && ((saved_regs >> regno) & 0x03) == 0x03)
846 1.1 mrg n_regs = 2;
847 1.1 mrg }
848 1.1 mrg
849 1.1 mrg h8300_push_pop (regno, n_regs, false, false);
850 1.1 mrg }
851 1.1 mrg }
852 1.1 mrg
853 1.1 mrg /* Leave room for locals. */
854 1.1 mrg h8300_emit_stack_adjustment (-1, round_frame_size (get_frame_size ()));
855 1.1 mrg
856 1.1 mrg if (flag_stack_usage_info)
857 1.1 mrg current_function_static_stack_size
858 1.1 mrg = round_frame_size (get_frame_size ())
859 1.1 mrg + (__builtin_popcount (saved_regs) * UNITS_PER_WORD)
860 1.1 mrg + (frame_pointer_needed ? UNITS_PER_WORD : 0);
861 1.1 mrg }
862 1.1 mrg
863 1.1 mrg /* Return nonzero if we can use "rts" for the function currently being
864 1.1 mrg compiled. */
865 1.1 mrg
866 1.1 mrg int
867 1.1 mrg h8300_can_use_return_insn_p (void)
868 1.1 mrg {
869 1.1 mrg return (reload_completed
870 1.1 mrg && !frame_pointer_needed
871 1.1 mrg && get_frame_size () == 0
872 1.1 mrg && compute_saved_regs () == 0);
873 1.1 mrg }
874 1.1 mrg
875 1.1 mrg /* Generate RTL code for the function epilogue. */
876 1.1 mrg
877 1.1 mrg void
878 1.1 mrg h8300_expand_epilogue (bool sibcall_p)
879 1.1 mrg {
880 1.1 mrg int regno;
881 1.1 mrg int saved_regs;
882 1.1 mrg int n_regs;
883 1.1 mrg HOST_WIDE_INT frame_size;
884 1.1 mrg bool returned_p;
885 1.1 mrg
886 1.1 mrg if (h8300_os_task_function_p (current_function_decl))
887 1.1 mrg /* OS_Task epilogues are nearly naked -- they just have an
888 1.1 mrg rts instruction. */
889 1.1 mrg return;
890 1.1 mrg
891 1.1 mrg frame_size = round_frame_size (get_frame_size ());
892 1.1 mrg returned_p = false;
893 1.1 mrg
894 1.1 mrg /* Deallocate locals. */
895 1.1 mrg h8300_emit_stack_adjustment (1, frame_size);
896 1.1 mrg
897 1.1 mrg /* Pop the saved registers in descending order. */
898 1.1 mrg saved_regs = compute_saved_regs ();
899 1.1 mrg for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno -= n_regs)
900 1.1 mrg {
901 1.1 mrg n_regs = 1;
902 1.1 mrg if (saved_regs & (1 << regno))
903 1.1 mrg {
904 1.1 mrg if (TARGET_H8300S)
905 1.1 mrg {
906 1.1 mrg /* See how many registers we can pop at the same time. */
907 1.1 mrg if ((TARGET_H8300SX || (regno & 3) == 3)
908 1.1 mrg && ((saved_regs << 3 >> regno) & 0x0f) == 0x0f)
909 1.1 mrg n_regs = 4;
910 1.1 mrg
911 1.1 mrg else if ((TARGET_H8300SX || (regno & 3) == 2)
912 1.1 mrg && ((saved_regs << 2 >> regno) & 0x07) == 0x07)
913 1.1 mrg n_regs = 3;
914 1.1 mrg
915 1.1 mrg else if ((TARGET_H8300SX || (regno & 1) == 1)
916 1.1 mrg && ((saved_regs << 1 >> regno) & 0x03) == 0x03)
917 1.1 mrg n_regs = 2;
918 1.1 mrg }
919 1.1 mrg
920 1.1 mrg /* See if this pop would be the last insn before the return.
921 1.1 mrg If so, use rte/l or rts/l instead of pop or ldm.l. */
922 1.1 mrg if (TARGET_H8300SX
923 1.1 mrg && !sibcall_p
924 1.1 mrg && !frame_pointer_needed
925 1.1 mrg && frame_size == 0
926 1.1 mrg && (saved_regs & ((1 << (regno - n_regs + 1)) - 1)) == 0)
927 1.1 mrg returned_p = true;
928 1.1 mrg
929 1.1 mrg h8300_push_pop (regno - n_regs + 1, n_regs, true, returned_p);
930 1.1 mrg }
931 1.1 mrg }
932 1.1 mrg
933 1.1 mrg /* Pop frame pointer if we had one. */
934 1.1 mrg if (frame_pointer_needed)
935 1.1 mrg {
936 1.1 mrg if (TARGET_H8300SX && !sibcall_p)
937 1.1 mrg returned_p = true;
938 1.1 mrg h8300_push_pop (HARD_FRAME_POINTER_REGNUM, 1, true, returned_p);
939 1.1 mrg }
940 1.1 mrg
941 1.1 mrg if (!returned_p && !sibcall_p)
942 1.1 mrg emit_jump_insn (ret_rtx);
943 1.1 mrg }
944 1.1 mrg
945 1.1 mrg /* Return nonzero if the current function is an interrupt
946 1.1 mrg function. */
947 1.1 mrg
948 1.1 mrg int
949 1.1 mrg h8300_current_function_interrupt_function_p (void)
950 1.1 mrg {
951 1.1 mrg return (h8300_interrupt_function_p (current_function_decl));
952 1.1 mrg }
953 1.1 mrg
954 1.1 mrg int
955 1.1 mrg h8300_current_function_monitor_function_p ()
956 1.1 mrg {
957 1.1 mrg return (h8300_monitor_function_p (current_function_decl));
958 1.1 mrg }
959 1.1 mrg
960 1.1 mrg /* Output assembly code for the start of the file. */
961 1.1 mrg
962 1.1 mrg static void
963 1.1 mrg h8300_file_start (void)
964 1.1 mrg {
965 1.1 mrg default_file_start ();
966 1.1 mrg
967 1.1 mrg if (TARGET_H8300SX)
968 1.1 mrg fputs (TARGET_NORMAL_MODE ? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file);
969 1.1 mrg else if (TARGET_H8300S)
970 1.1 mrg fputs (TARGET_NORMAL_MODE ? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file);
971 1.1 mrg else if (TARGET_H8300H)
972 1.1 mrg fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
973 1.1 mrg }
974 1.1 mrg
975 1.1 mrg /* Output assembly language code for the end of file. */
976 1.1 mrg
977 1.1 mrg static void
978 1.1 mrg h8300_file_end (void)
979 1.1 mrg {
980 1.1 mrg fputs ("\t.end\n", asm_out_file);
981 1.1 mrg }
982 1.1 mrg
983 1.1 mrg /* Split an add of a small constant into two adds/subs insns.
985 1.1 mrg
986 1.1 mrg If USE_INCDEC_P is nonzero, we generate the last insn using inc/dec
987 1.1 mrg instead of adds/subs. */
988 1.1 mrg
989 1.1 mrg void
990 1.1 mrg split_adds_subs (machine_mode mode, rtx *operands)
991 1.1 mrg {
992 1.1 mrg HOST_WIDE_INT val = INTVAL (operands[1]);
993 1.1 mrg rtx reg = operands[0];
994 1.1 mrg HOST_WIDE_INT sign = 1;
995 1.1 mrg HOST_WIDE_INT amount;
996 1.1 mrg rtx (*gen_add) (rtx, rtx, rtx);
997 1.1 mrg
998 1.1 mrg /* Force VAL to be positive so that we do not have to consider the
999 1.1 mrg sign. */
1000 1.1 mrg if (val < 0)
1001 1.1 mrg {
1002 1.1 mrg val = -val;
1003 1.1 mrg sign = -1;
1004 1.1 mrg }
1005 1.1 mrg
1006 1.1 mrg switch (mode)
1007 1.1 mrg {
1008 1.1 mrg case E_HImode:
1009 1.1 mrg gen_add = gen_addhi3;
1010 1.1 mrg break;
1011 1.1 mrg
1012 1.1 mrg case E_SImode:
1013 1.1 mrg gen_add = gen_addsi3;
1014 1.1 mrg break;
1015 1.1 mrg
1016 1.1 mrg default:
1017 1.1 mrg gcc_unreachable ();
1018 1.1 mrg }
1019 1.1 mrg
1020 1.1 mrg /* Try different amounts in descending order. */
1021 1.1 mrg for (amount = 4; amount > 0; amount /= 2)
1022 1.1 mrg {
1023 1.1 mrg for (; val >= amount; val -= amount)
1024 1.1 mrg emit_insn (gen_add (reg, reg, GEN_INT (sign * amount)));
1025 1.1 mrg }
1026 1.1 mrg
1027 1.1 mrg return;
1028 1.1 mrg }
1029 1.1 mrg
1030 1.1 mrg /* Handle machine specific pragmas for compatibility with existing
1031 1.1 mrg compilers for the H8/300.
1032 1.1 mrg
1033 1.1 mrg pragma saveall generates prologue/epilogue code which saves and
1034 1.1 mrg restores all the registers on function entry.
1035 1.1 mrg
1036 1.1 mrg pragma interrupt saves and restores all registers, and exits with
1037 1.1 mrg an rte instruction rather than an rts. A pointer to a function
1038 1.1 mrg with this attribute may be safely used in an interrupt vector. */
1039 1.1 mrg
1040 1.1 mrg void
1041 1.1 mrg h8300_pr_interrupt (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1042 1.1 mrg {
1043 1.1 mrg pragma_interrupt = 1;
1044 1.1 mrg }
1045 1.1 mrg
1046 1.1 mrg void
1047 1.1 mrg h8300_pr_saveall (struct cpp_reader *pfile ATTRIBUTE_UNUSED)
1048 1.1 mrg {
1049 1.1 mrg pragma_saveall = 1;
1050 1.1 mrg }
1051 1.1 mrg
1052 1.1 mrg /* If the next function argument ARG is to be passed in a register, return
1053 1.1 mrg a reg RTX for the hard register in which to pass the argument. CUM
1054 1.1 mrg represents the state after the last argument. If the argument is to
1055 1.1 mrg be pushed, NULL_RTX is returned.
1056 1.1 mrg
1057 1.1 mrg On the H8/300 all normal args are pushed, unless -mquickcall in which
1058 1.1 mrg case the first 3 arguments are passed in registers. */
1059 1.1 mrg
1060 1.1 mrg static rtx
1061 1.1 mrg h8300_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
1062 1.1 mrg {
1063 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1064 1.1 mrg
1065 1.1 mrg static const char *const hand_list[] = {
1066 1.1 mrg "__main",
1067 1.1 mrg "__cmpsi2",
1068 1.1 mrg "__divhi3",
1069 1.1 mrg "__modhi3",
1070 1.1 mrg "__udivhi3",
1071 1.1 mrg "__umodhi3",
1072 1.1 mrg "__divsi3",
1073 1.1 mrg "__modsi3",
1074 1.1 mrg "__udivsi3",
1075 1.1 mrg "__umodsi3",
1076 1.1 mrg "__mulhi3",
1077 1.1 mrg "__mulsi3",
1078 1.1 mrg "__reg_memcpy",
1079 1.1 mrg "__reg_memset",
1080 1.1 mrg "__ucmpsi2",
1081 1.1 mrg 0,
1082 1.1 mrg };
1083 1.1 mrg
1084 1.1 mrg rtx result = NULL_RTX;
1085 1.1 mrg const char *fname;
1086 1.1 mrg int regpass = 0;
1087 1.1 mrg
1088 1.1 mrg /* Never pass unnamed arguments in registers. */
1089 1.1 mrg if (!arg.named)
1090 1.1 mrg return NULL_RTX;
1091 1.1 mrg
1092 1.1 mrg /* Pass 3 regs worth of data in regs when user asked on the command line. */
1093 1.1 mrg if (TARGET_QUICKCALL)
1094 1.1 mrg regpass = 3;
1095 1.1 mrg
1096 1.1 mrg /* If calling hand written assembler, use 4 regs of args. */
1097 1.1 mrg if (cum->libcall)
1098 1.1 mrg {
1099 1.1 mrg const char * const *p;
1100 1.1 mrg
1101 1.1 mrg fname = XSTR (cum->libcall, 0);
1102 1.1 mrg
1103 1.1 mrg /* See if this libcall is one of the hand coded ones. */
1104 1.1 mrg for (p = hand_list; *p && strcmp (*p, fname) != 0; p++)
1105 1.1 mrg ;
1106 1.1 mrg
1107 1.1 mrg if (*p)
1108 1.1 mrg regpass = 4;
1109 1.1 mrg }
1110 1.1 mrg
1111 1.1 mrg if (regpass)
1112 1.1 mrg {
1113 1.1 mrg int size = arg.promoted_size_in_bytes ();
1114 1.1 mrg if (size + cum->nbytes <= regpass * UNITS_PER_WORD
1115 1.1 mrg && cum->nbytes / UNITS_PER_WORD <= 3)
1116 1.1 mrg result = gen_rtx_REG (arg.mode, cum->nbytes / UNITS_PER_WORD);
1117 1.1 mrg }
1118 1.1 mrg
1119 1.1 mrg return result;
1120 1.1 mrg }
1121 1.1 mrg
1122 1.1 mrg /* Update the data in CUM to advance over argument ARG. */
1123 1.1 mrg
1124 1.1 mrg static void
1125 1.1 mrg h8300_function_arg_advance (cumulative_args_t cum_v,
1126 1.1 mrg const function_arg_info &arg)
1127 1.1 mrg {
1128 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1129 1.1 mrg
1130 1.1 mrg cum->nbytes += ((arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1)
1131 1.1 mrg & -UNITS_PER_WORD);
1132 1.1 mrg }
1133 1.1 mrg
1134 1.1 mrg
1135 1.1 mrg /* Implements TARGET_REGISTER_MOVE_COST.
1137 1.1 mrg
1138 1.1 mrg Any SI register-to-register move may need to be reloaded,
1139 1.1 mrg so inmplement h8300_register_move_cost to return > 2 so that reload never
1140 1.1 mrg shortcuts. */
1141 1.1 mrg
1142 1.1 mrg static int
1143 1.1 mrg h8300_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
1144 1.1 mrg reg_class_t from, reg_class_t to)
1145 1.1 mrg {
1146 1.1 mrg if (from == MAC_REGS || to == MAC_REG)
1147 1.1 mrg return 6;
1148 1.1 mrg else
1149 1.1 mrg return 3;
1150 1.1 mrg }
1151 1.1 mrg
1152 1.1 mrg /* Compute the cost of an and insn. */
1153 1.1 mrg
1154 1.1 mrg static int
1155 1.1 mrg h8300_and_costs (rtx x)
1156 1.1 mrg {
1157 1.1 mrg rtx operands[4];
1158 1.1 mrg
1159 1.1 mrg if (GET_MODE (x) == QImode)
1160 1.1 mrg return 1;
1161 1.1 mrg
1162 1.1 mrg if (GET_MODE (x) != HImode
1163 1.1 mrg && GET_MODE (x) != SImode)
1164 1.1 mrg return 100;
1165 1.1 mrg
1166 1.1 mrg operands[0] = NULL;
1167 1.1 mrg operands[1] = XEXP (x, 0);
1168 1.1 mrg operands[2] = XEXP (x, 1);
1169 1.1 mrg operands[3] = x;
1170 1.1 mrg return compute_logical_op_length (GET_MODE (x), AND, operands, NULL) / 2;
1171 1.1 mrg }
1172 1.1 mrg
1173 1.1 mrg /* Compute the cost of a shift insn. */
1174 1.1 mrg
1175 1.1 mrg static int
1176 1.1 mrg h8300_shift_costs (rtx x)
1177 1.1 mrg {
1178 1.1 mrg rtx operands[3];
1179 1.1 mrg
1180 1.1 mrg if (GET_MODE (x) != QImode
1181 1.1 mrg && GET_MODE (x) != HImode
1182 1.1 mrg && GET_MODE (x) != SImode)
1183 1.1 mrg return 100;
1184 1.1 mrg
1185 1.1 mrg operands[0] = gen_rtx_REG (GET_MODE (x), 0);
1186 1.1 mrg operands[1] = NULL;
1187 1.1 mrg operands[2] = XEXP (x, 1);
1188 1.1 mrg return compute_a_shift_length (operands, GET_CODE (x)) / 2;
1189 1.1 mrg }
1190 1.1 mrg
1191 1.1 mrg /* Worker function for TARGET_RTX_COSTS. */
1192 1.1 mrg
1193 1.1 mrg static bool
1194 1.1 mrg h8300_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code,
1195 1.1 mrg int opno ATTRIBUTE_UNUSED, int *total, bool speed)
1196 1.1 mrg {
1197 1.1 mrg int code = GET_CODE (x);
1198 1.1 mrg
1199 1.1 mrg if (TARGET_H8300SX && outer_code == MEM)
1200 1.1 mrg {
1201 1.1 mrg /* Estimate the number of execution states needed to calculate
1202 1.1 mrg the address. */
1203 1.1 mrg if (register_operand (x, VOIDmode)
1204 1.1 mrg || GET_CODE (x) == POST_INC
1205 1.1 mrg || GET_CODE (x) == POST_DEC
1206 1.1 mrg || CONSTANT_P (x))
1207 1.1 mrg *total = 0;
1208 1.1 mrg else
1209 1.1 mrg *total = COSTS_N_INSNS (1);
1210 1.1 mrg return true;
1211 1.1 mrg }
1212 1.1 mrg
1213 1.1 mrg switch (code)
1214 1.1 mrg {
1215 1.1 mrg case CONST_INT:
1216 1.1 mrg {
1217 1.1 mrg HOST_WIDE_INT n = INTVAL (x);
1218 1.1 mrg
1219 1.1 mrg if (TARGET_H8300SX)
1220 1.1 mrg {
1221 1.1 mrg /* Constant operands need the same number of processor
1222 1.1 mrg states as register operands. Although we could try to
1223 1.1 mrg use a size-based cost for !speed, the lack of
1224 1.1 mrg of a mode makes the results very unpredictable. */
1225 1.1 mrg *total = 0;
1226 1.1 mrg return true;
1227 1.1 mrg }
1228 1.1 mrg if (n >= -4 && n <= 4)
1229 1.1 mrg {
1230 1.1 mrg switch ((int) n)
1231 1.1 mrg {
1232 1.1 mrg case 0:
1233 1.1 mrg *total = 0;
1234 1.1 mrg return true;
1235 1.1 mrg case 1:
1236 1.1 mrg case 2:
1237 1.1 mrg case -1:
1238 1.1 mrg case -2:
1239 1.1 mrg *total = 0 + (outer_code == SET);
1240 1.1 mrg return true;
1241 1.1 mrg case 4:
1242 1.1 mrg case -4:
1243 1.1 mrg *total = 0 + (outer_code == SET);
1244 1.1 mrg return true;
1245 1.1 mrg }
1246 1.1 mrg }
1247 1.1 mrg *total = 1;
1248 1.1 mrg return true;
1249 1.1 mrg }
1250 1.1 mrg
1251 1.1 mrg case CONST:
1252 1.1 mrg case LABEL_REF:
1253 1.1 mrg case SYMBOL_REF:
1254 1.1 mrg if (TARGET_H8300SX)
1255 1.1 mrg {
1256 1.1 mrg /* See comment for CONST_INT. */
1257 1.1 mrg *total = 0;
1258 1.1 mrg return true;
1259 1.1 mrg }
1260 1.1 mrg *total = 3;
1261 1.1 mrg return true;
1262 1.1 mrg
1263 1.1 mrg case CONST_DOUBLE:
1264 1.1 mrg *total = 20;
1265 1.1 mrg return true;
1266 1.1 mrg
1267 1.1 mrg case COMPARE:
1268 1.1 mrg case NE:
1269 1.1 mrg case EQ:
1270 1.1 mrg case GE:
1271 1.1 mrg case GT:
1272 1.1 mrg case LE:
1273 1.1 mrg case LT:
1274 1.1 mrg case GEU:
1275 1.1 mrg case GTU:
1276 1.1 mrg case LEU:
1277 1.1 mrg case LTU:
1278 1.1 mrg if (XEXP (x, 1) == const0_rtx)
1279 1.1 mrg *total = 0;
1280 1.1 mrg return false;
1281 1.1 mrg
1282 1.1 mrg case AND:
1283 1.1 mrg if (!h8300_dst_operand (XEXP (x, 0), VOIDmode)
1284 1.1 mrg || !h8300_src_operand (XEXP (x, 1), VOIDmode))
1285 1.1 mrg return false;
1286 1.1 mrg *total = COSTS_N_INSNS (h8300_and_costs (x));
1287 1.1 mrg return true;
1288 1.1 mrg
1289 1.1 mrg /* We say that MOD and DIV are so expensive because otherwise we'll
1290 1.1 mrg generate some really horrible code for division of a power of two. */
1291 1.1 mrg case MOD:
1292 1.1 mrg case DIV:
1293 1.1 mrg case UMOD:
1294 1.1 mrg case UDIV:
1295 1.1 mrg if (TARGET_H8300SX)
1296 1.1 mrg switch (GET_MODE (x))
1297 1.1 mrg {
1298 1.1 mrg case E_QImode:
1299 1.1 mrg case E_HImode:
1300 1.1 mrg *total = COSTS_N_INSNS (!speed ? 4 : 10);
1301 1.1 mrg return false;
1302 1.1 mrg
1303 1.1 mrg case E_SImode:
1304 1.1 mrg *total = COSTS_N_INSNS (!speed ? 4 : 18);
1305 1.1 mrg return false;
1306 1.1 mrg
1307 1.1 mrg default:
1308 1.1 mrg break;
1309 1.1 mrg }
1310 1.1 mrg *total = COSTS_N_INSNS (12);
1311 1.1 mrg return true;
1312 1.1 mrg
1313 1.1 mrg case MULT:
1314 1.1 mrg if (TARGET_H8300SX)
1315 1.1 mrg switch (GET_MODE (x))
1316 1.1 mrg {
1317 1.1 mrg case E_QImode:
1318 1.1 mrg case E_HImode:
1319 1.1 mrg *total = COSTS_N_INSNS (2);
1320 1.1 mrg return false;
1321 1.1 mrg
1322 1.1 mrg case E_SImode:
1323 1.1 mrg *total = COSTS_N_INSNS (5);
1324 1.1 mrg return false;
1325 1.1 mrg
1326 1.1 mrg default:
1327 1.1 mrg break;
1328 1.1 mrg }
1329 1.1 mrg *total = COSTS_N_INSNS (4);
1330 1.1 mrg return true;
1331 1.1 mrg
1332 1.1 mrg case ASHIFT:
1333 1.1 mrg case ASHIFTRT:
1334 1.1 mrg case LSHIFTRT:
1335 1.1 mrg if (h8sx_binary_shift_operator (x, VOIDmode))
1336 1.1 mrg {
1337 1.1 mrg *total = COSTS_N_INSNS (2);
1338 1.1 mrg return false;
1339 1.1 mrg }
1340 1.1 mrg else if (h8sx_unary_shift_operator (x, VOIDmode))
1341 1.1 mrg {
1342 1.1 mrg *total = COSTS_N_INSNS (1);
1343 1.1 mrg return false;
1344 1.1 mrg }
1345 1.1 mrg *total = COSTS_N_INSNS (h8300_shift_costs (x));
1346 1.1 mrg return true;
1347 1.1 mrg
1348 1.1 mrg case ROTATE:
1349 1.1 mrg case ROTATERT:
1350 1.1 mrg if (GET_MODE (x) == HImode)
1351 1.1 mrg *total = 2;
1352 1.1 mrg else
1353 1.1 mrg *total = 8;
1354 1.1 mrg return true;
1355 1.1 mrg
1356 1.1 mrg default:
1357 1.1 mrg *total = COSTS_N_INSNS (1);
1358 1.1 mrg return false;
1359 1.1 mrg }
1360 1.1 mrg }
1361 1.1 mrg
1362 1.1 mrg /* Documentation for the machine specific operand escapes:
1364 1.1 mrg
1365 1.1 mrg 'E' like s but negative.
1366 1.1 mrg 'F' like t but negative.
1367 1.1 mrg 'G' constant just the negative
1368 1.1 mrg 'R' print operand as a byte:8 address if appropriate, else fall back to
1369 1.1 mrg 'X' handling.
1370 1.1 mrg 'S' print operand as a long word
1371 1.1 mrg 'T' print operand as a word
1372 1.1 mrg 'V' find the set bit, and print its number.
1373 1.1 mrg 'W' find the clear bit, and print its number.
1374 1.1 mrg 'X' print operand as a byte
1375 1.1 mrg 'Y' print either l or h depending on whether last 'Z' operand < 8 or >= 8.
1376 1.1 mrg If this operand isn't a register, fall back to 'R' handling.
1377 1.1 mrg 'Z' print int & 7.
1378 1.1 mrg 'c' print the opcode corresponding to rtl
1379 1.1 mrg 'e' first word of 32-bit value - if reg, then least reg. if mem
1380 1.1 mrg then least. if const then most sig word
1381 1.1 mrg 'f' second word of 32-bit value - if reg, then biggest reg. if mem
1382 1.1 mrg then +2. if const then least sig word
1383 1.1 mrg 'j' print operand as condition code.
1384 1.1 mrg 'k' print operand as reverse condition code.
1385 1.1 mrg 'm' convert an integer operand to a size suffix (.b, .w or .l)
1386 1.1 mrg 'o' print an integer without a leading '#'
1387 1.1 mrg 's' print as low byte of 16-bit value
1388 1.1 mrg 't' print as high byte of 16-bit value
1389 1.1 mrg 'w' print as low byte of 32-bit value
1390 1.1 mrg 'x' print as 2nd byte of 32-bit value
1391 1.1 mrg 'y' print as 3rd byte of 32-bit value
1392 1.1 mrg 'z' print as msb of 32-bit value
1393 1.1 mrg */
1394 1.1 mrg
1395 1.1 mrg /* Return assembly language string which identifies a comparison type. */
1396 1.1 mrg
1397 1.1 mrg static const char *
1398 1.1 mrg cond_string (enum rtx_code code)
1399 1.1 mrg {
1400 1.1 mrg switch (code)
1401 1.1 mrg {
1402 1.1 mrg case NE:
1403 1.1 mrg return "ne";
1404 1.1 mrg case EQ:
1405 1.1 mrg return "eq";
1406 1.1 mrg case GE:
1407 1.1 mrg return "ge";
1408 1.1 mrg case GT:
1409 1.1 mrg return "gt";
1410 1.1 mrg case LE:
1411 1.1 mrg return "le";
1412 1.1 mrg case LT:
1413 1.1 mrg return "lt";
1414 1.1 mrg case GEU:
1415 1.1 mrg return "hs";
1416 1.1 mrg case GTU:
1417 1.1 mrg return "hi";
1418 1.1 mrg case LEU:
1419 1.1 mrg return "ls";
1420 1.1 mrg case LTU:
1421 1.1 mrg return "lo";
1422 1.1 mrg default:
1423 1.1 mrg gcc_unreachable ();
1424 1.1 mrg }
1425 1.1 mrg }
1426 1.1 mrg
1427 1.1 mrg /* Print operand X using operand code CODE to assembly language output file
1428 1.1 mrg FILE. */
1429 1.1 mrg
1430 1.1 mrg static void
1431 1.1 mrg h8300_print_operand (FILE *file, rtx x, int code)
1432 1.1 mrg {
1433 1.1 mrg /* This is used for communication between codes V,W,Z and Y. */
1434 1.1 mrg static int bitint;
1435 1.1 mrg
1436 1.1 mrg switch (code)
1437 1.1 mrg {
1438 1.1 mrg case 'C':
1439 1.1 mrg if (h8300_constant_length (x) == 2)
1440 1.1 mrg fprintf (file, ":16");
1441 1.1 mrg else
1442 1.1 mrg fprintf (file, ":32");
1443 1.1 mrg return;
1444 1.1 mrg case 'E':
1445 1.1 mrg switch (GET_CODE (x))
1446 1.1 mrg {
1447 1.1 mrg case REG:
1448 1.1 mrg fprintf (file, "%sl", names_big[REGNO (x)]);
1449 1.1 mrg break;
1450 1.1 mrg case CONST_INT:
1451 1.1 mrg fprintf (file, "#%ld", (-INTVAL (x)) & 0xff);
1452 1.1 mrg break;
1453 1.1 mrg default:
1454 1.1 mrg gcc_unreachable ();
1455 1.1 mrg }
1456 1.1 mrg break;
1457 1.1 mrg case 'F':
1458 1.1 mrg switch (GET_CODE (x))
1459 1.1 mrg {
1460 1.1 mrg case REG:
1461 1.1 mrg fprintf (file, "%sh", names_big[REGNO (x)]);
1462 1.1 mrg break;
1463 1.1 mrg case CONST_INT:
1464 1.1 mrg fprintf (file, "#%ld", ((-INTVAL (x)) & 0xff00) >> 8);
1465 1.1 mrg break;
1466 1.1 mrg default:
1467 1.1 mrg gcc_unreachable ();
1468 1.1 mrg }
1469 1.1 mrg break;
1470 1.1 mrg case 'G':
1471 1.1 mrg gcc_assert (GET_CODE (x) == CONST_INT);
1472 1.1 mrg fprintf (file, "#%ld", 0xff & (-INTVAL (x)));
1473 1.1 mrg break;
1474 1.1 mrg case 'S':
1475 1.1 mrg if (GET_CODE (x) == REG)
1476 1.1 mrg fprintf (file, "%s", names_extended[REGNO (x)]);
1477 1.1 mrg else
1478 1.1 mrg goto def;
1479 1.1 mrg break;
1480 1.1 mrg case 'T':
1481 1.1 mrg if (GET_CODE (x) == REG)
1482 1.1 mrg fprintf (file, "%s", names_big[REGNO (x)]);
1483 1.1 mrg else
1484 1.1 mrg goto def;
1485 1.1 mrg break;
1486 1.1 mrg case 'V':
1487 1.1 mrg bitint = (INTVAL (x) & 0xffff);
1488 1.1 mrg if ((exact_log2 ((bitint >> 8) & 0xff)) == -1)
1489 1.1 mrg bitint = exact_log2 (bitint & 0xff);
1490 1.1 mrg else
1491 1.1 mrg bitint = exact_log2 ((bitint >> 8) & 0xff);
1492 1.1 mrg gcc_assert (bitint >= 0);
1493 1.1 mrg fprintf (file, "#%d", bitint);
1494 1.1 mrg break;
1495 1.1 mrg case 'W':
1496 1.1 mrg bitint = ((~INTVAL (x)) & 0xffff);
1497 1.1 mrg if ((exact_log2 ((bitint >> 8) & 0xff)) == -1 )
1498 1.1 mrg bitint = exact_log2 (bitint & 0xff);
1499 1.1 mrg else
1500 1.1 mrg bitint = (exact_log2 ((bitint >> 8) & 0xff));
1501 1.1 mrg gcc_assert (bitint >= 0);
1502 1.1 mrg fprintf (file, "#%d", bitint);
1503 1.1 mrg break;
1504 1.1 mrg case 'R':
1505 1.1 mrg case 'X':
1506 1.1 mrg if (GET_CODE (x) == REG)
1507 1.1 mrg fprintf (file, "%s", byte_reg (x, 0));
1508 1.1 mrg else
1509 1.1 mrg goto def;
1510 1.1 mrg break;
1511 1.1 mrg case 'Y':
1512 1.1 mrg gcc_assert (bitint >= 0);
1513 1.1 mrg if (GET_CODE (x) == REG)
1514 1.1 mrg fprintf (file, "%s%c", names_big[REGNO (x)], bitint > 7 ? 'h' : 'l');
1515 1.1 mrg else
1516 1.1 mrg h8300_print_operand (file, x, 'R');
1517 1.1 mrg bitint = -1;
1518 1.1 mrg break;
1519 1.1 mrg case 'Z':
1520 1.1 mrg bitint = INTVAL (x);
1521 1.1 mrg fprintf (file, "#%d", bitint & 7);
1522 1.1 mrg break;
1523 1.1 mrg case 'c':
1524 1.1 mrg switch (GET_CODE (x))
1525 1.1 mrg {
1526 1.1 mrg case IOR:
1527 1.1 mrg fprintf (file, "or");
1528 1.1 mrg break;
1529 1.1 mrg case XOR:
1530 1.1 mrg fprintf (file, "xor");
1531 1.1 mrg break;
1532 1.1 mrg case AND:
1533 1.1 mrg fprintf (file, "and");
1534 1.1 mrg break;
1535 1.1 mrg default:
1536 1.1 mrg break;
1537 1.1 mrg }
1538 1.1 mrg break;
1539 1.1 mrg case 'e':
1540 1.1 mrg switch (GET_CODE (x))
1541 1.1 mrg {
1542 1.1 mrg case REG:
1543 1.1 mrg fprintf (file, "%s", names_upper_extended[REGNO (x)]);
1544 1.1 mrg break;
1545 1.1 mrg case MEM:
1546 1.1 mrg h8300_print_operand (file, x, 0);
1547 1.1 mrg break;
1548 1.1 mrg case CONST_INT:
1549 1.1 mrg fprintf (file, "#%ld", ((INTVAL (x) >> 16) & 0xffff));
1550 1.1 mrg break;
1551 1.1 mrg case CONST_DOUBLE:
1552 1.1 mrg {
1553 1.1 mrg long val;
1554 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
1555 1.1 mrg fprintf (file, "#%ld", ((val >> 16) & 0xffff));
1556 1.1 mrg break;
1557 1.1 mrg }
1558 1.1 mrg default:
1559 1.1 mrg gcc_unreachable ();
1560 1.1 mrg break;
1561 1.1 mrg }
1562 1.1 mrg break;
1563 1.1 mrg case 'f':
1564 1.1 mrg switch (GET_CODE (x))
1565 1.1 mrg {
1566 1.1 mrg case REG:
1567 1.1 mrg fprintf (file, "%s", names_big[REGNO (x)]);
1568 1.1 mrg break;
1569 1.1 mrg case MEM:
1570 1.1 mrg x = adjust_address (x, HImode, 2);
1571 1.1 mrg h8300_print_operand (file, x, 0);
1572 1.1 mrg break;
1573 1.1 mrg case CONST_INT:
1574 1.1 mrg fprintf (file, "#%ld", INTVAL (x) & 0xffff);
1575 1.1 mrg break;
1576 1.1 mrg case CONST_DOUBLE:
1577 1.1 mrg {
1578 1.1 mrg long val;
1579 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
1580 1.1 mrg fprintf (file, "#%ld", (val & 0xffff));
1581 1.1 mrg break;
1582 1.1 mrg }
1583 1.1 mrg default:
1584 1.1 mrg gcc_unreachable ();
1585 1.1 mrg }
1586 1.1 mrg break;
1587 1.1 mrg case 'j':
1588 1.1 mrg if (GET_CODE (x) == LT && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
1589 1.1 mrg fputs ("mi", file);
1590 1.1 mrg else if (GET_CODE (x) == GE && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
1591 1.1 mrg fputs ("pl", file);
1592 1.1 mrg else
1593 1.1 mrg fputs (cond_string (GET_CODE (x)), file);
1594 1.1 mrg break;
1595 1.1 mrg case 'k':
1596 1.1 mrg if (GET_CODE (x) == LT && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
1597 1.1 mrg fputs ("pl", file);
1598 1.1 mrg else if (GET_CODE (x) == GE && GET_MODE (XEXP (x, 0)) == E_CCZNmode)
1599 1.1 mrg fputs ("mi", file);
1600 1.1 mrg else
1601 1.1 mrg fputs (cond_string (reverse_condition (GET_CODE (x))), file);
1602 1.1 mrg break;
1603 1.1 mrg case 'm':
1604 1.1 mrg gcc_assert (GET_CODE (x) == CONST_INT);
1605 1.1 mrg switch (INTVAL (x))
1606 1.1 mrg {
1607 1.1 mrg case 1:
1608 1.1 mrg fputs (".b", file);
1609 1.1 mrg break;
1610 1.1 mrg
1611 1.1 mrg case 2:
1612 1.1 mrg fputs (".w", file);
1613 1.1 mrg break;
1614 1.1 mrg
1615 1.1 mrg case 4:
1616 1.1 mrg fputs (".l", file);
1617 1.1 mrg break;
1618 1.1 mrg
1619 1.1 mrg default:
1620 1.1 mrg gcc_unreachable ();
1621 1.1 mrg }
1622 1.1 mrg break;
1623 1.1 mrg case 'o':
1624 1.1 mrg h8300_print_operand_address (file, VOIDmode, x);
1625 1.1 mrg break;
1626 1.1 mrg case 's':
1627 1.1 mrg if (GET_CODE (x) == CONST_INT)
1628 1.1 mrg fprintf (file, "#%ld", (INTVAL (x)) & 0xff);
1629 1.1 mrg else if (GET_CODE (x) == REG)
1630 1.1 mrg fprintf (file, "%s", byte_reg (x, 0));
1631 1.1 mrg else
1632 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1633 1.1 mrg break;
1634 1.1 mrg case 't':
1635 1.1 mrg if (GET_CODE (x) == CONST_INT)
1636 1.1 mrg fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1637 1.1 mrg else if (GET_CODE (x) == REG)
1638 1.1 mrg fprintf (file, "%s", byte_reg (x, 1));
1639 1.1 mrg else
1640 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1641 1.1 mrg break;
1642 1.1 mrg case 'w':
1643 1.1 mrg if (GET_CODE (x) == CONST_INT)
1644 1.1 mrg fprintf (file, "#%ld", INTVAL (x) & 0xff);
1645 1.1 mrg else if (GET_CODE (x) == REG)
1646 1.1 mrg fprintf (file, "%s", byte_reg (x, 0));
1647 1.1 mrg else
1648 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1649 1.1 mrg break;
1650 1.1 mrg case 'x':
1651 1.1 mrg if (GET_CODE (x) == CONST_INT)
1652 1.1 mrg fprintf (file, "#%ld", (INTVAL (x) >> 8) & 0xff);
1653 1.1 mrg else if (GET_CODE (x) == REG)
1654 1.1 mrg fprintf (file, "%s", byte_reg (x, 1));
1655 1.1 mrg else
1656 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1657 1.1 mrg break;
1658 1.1 mrg case 'y':
1659 1.1 mrg if (GET_CODE (x) == CONST_INT)
1660 1.1 mrg fprintf (file, "#%ld", (INTVAL (x) >> 16) & 0xff);
1661 1.1 mrg else if (GET_CODE (x) == REG)
1662 1.1 mrg fprintf (file, "%s", byte_reg (x, 0));
1663 1.1 mrg else
1664 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1665 1.1 mrg break;
1666 1.1 mrg case 'z':
1667 1.1 mrg if (GET_CODE (x) == CONST_INT)
1668 1.1 mrg fprintf (file, "#%ld", (INTVAL (x) >> 24) & 0xff);
1669 1.1 mrg else if (GET_CODE (x) == REG)
1670 1.1 mrg fprintf (file, "%s", byte_reg (x, 1));
1671 1.1 mrg else
1672 1.1 mrg output_operand_lossage ("Expected register or constant integer.");
1673 1.1 mrg break;
1674 1.1 mrg
1675 1.1 mrg default:
1676 1.1 mrg def:
1677 1.1 mrg switch (GET_CODE (x))
1678 1.1 mrg {
1679 1.1 mrg case REG:
1680 1.1 mrg switch (GET_MODE (x))
1681 1.1 mrg {
1682 1.1 mrg case E_QImode:
1683 1.1 mrg #if 0 /* Is it asm ("mov.b %0,r2l", ...) */
1684 1.1 mrg fprintf (file, "%s", byte_reg (x, 0));
1685 1.1 mrg #else /* ... or is it asm ("mov.b %0l,r2l", ...) */
1686 1.1 mrg fprintf (file, "%s", names_big[REGNO (x)]);
1687 1.1 mrg #endif
1688 1.1 mrg break;
1689 1.1 mrg case E_HImode:
1690 1.1 mrg fprintf (file, "%s", names_big[REGNO (x)]);
1691 1.1 mrg break;
1692 1.1 mrg case E_SImode:
1693 1.1 mrg case E_SFmode:
1694 1.1 mrg fprintf (file, "%s", names_extended[REGNO (x)]);
1695 1.1 mrg break;
1696 1.1 mrg default:
1697 1.1 mrg gcc_unreachable ();
1698 1.1 mrg }
1699 1.1 mrg break;
1700 1.1 mrg
1701 1.1 mrg case MEM:
1702 1.1 mrg {
1703 1.1 mrg rtx addr = XEXP (x, 0);
1704 1.1 mrg
1705 1.1 mrg fprintf (file, "@");
1706 1.1 mrg output_address (GET_MODE (x), addr);
1707 1.1 mrg
1708 1.1 mrg /* Add a length suffix to constant addresses. Although this
1709 1.1 mrg is often unnecessary, it helps to avoid ambiguity in the
1710 1.1 mrg syntax of mova. If we wrote an insn like:
1711 1.1 mrg
1712 1.1 mrg mova/w.l @(1,@foo.b),er0
1713 1.1 mrg
1714 1.1 mrg then .b would be considered part of the symbol name.
1715 1.1 mrg Adding a length after foo will avoid this. */
1716 1.1 mrg if (CONSTANT_P (addr))
1717 1.1 mrg switch (code)
1718 1.1 mrg {
1719 1.1 mrg case 'R':
1720 1.1 mrg /* Used for mov.b and bit operations. */
1721 1.1 mrg if (h8300_eightbit_constant_address_p (addr))
1722 1.1 mrg {
1723 1.1 mrg fprintf (file, ":8");
1724 1.1 mrg break;
1725 1.1 mrg }
1726 1.1 mrg
1727 1.1 mrg /* FALLTHRU */
1728 1.1 mrg
1729 1.1 mrg /* We should not get here if we are processing bit
1730 1.1 mrg operations on H8/300 or H8/300H because 'U'
1731 1.1 mrg constraint does not allow bit operations on the
1732 1.1 mrg tiny area on these machines. */
1733 1.1 mrg
1734 1.1 mrg case 'X':
1735 1.1 mrg case 'T':
1736 1.1 mrg case 'S':
1737 1.1 mrg if (h8300_constant_length (addr) == 2)
1738 1.1 mrg fprintf (file, ":16");
1739 1.1 mrg else
1740 1.1 mrg fprintf (file, ":32");
1741 1.1 mrg break;
1742 1.1 mrg default:
1743 1.1 mrg break;
1744 1.1 mrg }
1745 1.1 mrg }
1746 1.1 mrg break;
1747 1.1 mrg
1748 1.1 mrg case CONST_INT:
1749 1.1 mrg case SYMBOL_REF:
1750 1.1 mrg case CONST:
1751 1.1 mrg case LABEL_REF:
1752 1.1 mrg fprintf (file, "#");
1753 1.1 mrg h8300_print_operand_address (file, VOIDmode, x);
1754 1.1 mrg break;
1755 1.1 mrg case CONST_DOUBLE:
1756 1.1 mrg {
1757 1.1 mrg long val;
1758 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), val);
1759 1.1 mrg fprintf (file, "#%ld", val);
1760 1.1 mrg break;
1761 1.1 mrg }
1762 1.1 mrg default:
1763 1.1 mrg break;
1764 1.1 mrg }
1765 1.1 mrg }
1766 1.1 mrg }
1767 1.1 mrg
1768 1.1 mrg /* Implements TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
1769 1.1 mrg
1770 1.1 mrg static bool
1771 1.1 mrg h8300_print_operand_punct_valid_p (unsigned char code)
1772 1.1 mrg {
1773 1.1 mrg return (code == '#');
1774 1.1 mrg }
1775 1.1 mrg
1776 1.1 mrg /* Output assembly language output for the address ADDR to FILE. */
1777 1.1 mrg
1778 1.1 mrg static void
1779 1.1 mrg h8300_print_operand_address (FILE *file, machine_mode mode, rtx addr)
1780 1.1 mrg {
1781 1.1 mrg rtx index;
1782 1.1 mrg int size;
1783 1.1 mrg
1784 1.1 mrg switch (GET_CODE (addr))
1785 1.1 mrg {
1786 1.1 mrg case REG:
1787 1.1 mrg fprintf (file, "%s", h8_reg_names[REGNO (addr)]);
1788 1.1 mrg break;
1789 1.1 mrg
1790 1.1 mrg case PRE_DEC:
1791 1.1 mrg fprintf (file, "-%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1792 1.1 mrg break;
1793 1.1 mrg
1794 1.1 mrg case POST_INC:
1795 1.1 mrg fprintf (file, "%s+", h8_reg_names[REGNO (XEXP (addr, 0))]);
1796 1.1 mrg break;
1797 1.1 mrg
1798 1.1 mrg case PRE_INC:
1799 1.1 mrg fprintf (file, "+%s", h8_reg_names[REGNO (XEXP (addr, 0))]);
1800 1.1 mrg break;
1801 1.1 mrg
1802 1.1 mrg case POST_DEC:
1803 1.1 mrg fprintf (file, "%s-", h8_reg_names[REGNO (XEXP (addr, 0))]);
1804 1.1 mrg break;
1805 1.1 mrg
1806 1.1 mrg case PLUS:
1807 1.1 mrg fprintf (file, "(");
1808 1.1 mrg
1809 1.1 mrg index = h8300_get_index (XEXP (addr, 0), VOIDmode, &size);
1810 1.1 mrg if (GET_CODE (index) == REG)
1811 1.1 mrg {
1812 1.1 mrg /* reg,foo */
1813 1.1 mrg h8300_print_operand_address (file, mode, XEXP (addr, 1));
1814 1.1 mrg fprintf (file, ",");
1815 1.1 mrg switch (size)
1816 1.1 mrg {
1817 1.1 mrg case 0:
1818 1.1 mrg h8300_print_operand_address (file, mode, index);
1819 1.1 mrg break;
1820 1.1 mrg
1821 1.1 mrg case 1:
1822 1.1 mrg h8300_print_operand (file, index, 'X');
1823 1.1 mrg fputs (".b", file);
1824 1.1 mrg break;
1825 1.1 mrg
1826 1.1 mrg case 2:
1827 1.1 mrg h8300_print_operand (file, index, 'T');
1828 1.1 mrg fputs (".w", file);
1829 1.1 mrg break;
1830 1.1 mrg
1831 1.1 mrg case 4:
1832 1.1 mrg h8300_print_operand (file, index, 'S');
1833 1.1 mrg fputs (".l", file);
1834 1.1 mrg break;
1835 1.1 mrg }
1836 1.1 mrg /* h8300_print_operand_address (file, XEXP (addr, 0)); */
1837 1.1 mrg }
1838 1.1 mrg else
1839 1.1 mrg {
1840 1.1 mrg /* foo+k */
1841 1.1 mrg h8300_print_operand_address (file, mode, XEXP (addr, 0));
1842 1.1 mrg fprintf (file, "+");
1843 1.1 mrg h8300_print_operand_address (file, mode, XEXP (addr, 1));
1844 1.1 mrg }
1845 1.1 mrg fprintf (file, ")");
1846 1.1 mrg break;
1847 1.1 mrg
1848 1.1 mrg case CONST_INT:
1849 1.1 mrg {
1850 1.1 mrg int n = INTVAL (addr);
1851 1.1 mrg fprintf (file, "%d", n);
1852 1.1 mrg break;
1853 1.1 mrg }
1854 1.1 mrg
1855 1.1 mrg default:
1856 1.1 mrg output_addr_const (file, addr);
1857 1.1 mrg break;
1858 1.1 mrg }
1859 1.1 mrg }
1860 1.1 mrg
1861 1.1 mrg /* Output all insn addresses and their sizes into the assembly language
1863 1.1 mrg output file. This is helpful for debugging whether the length attributes
1864 1.1 mrg in the md file are correct. This is not meant to be a user selectable
1865 1.1 mrg option. */
1866 1.1 mrg
1867 1.1 mrg void
1868 1.1 mrg final_prescan_insn (rtx_insn *insn, rtx *operand ATTRIBUTE_UNUSED,
1869 1.1 mrg int num_operands ATTRIBUTE_UNUSED)
1870 1.1 mrg {
1871 1.1 mrg /* This holds the last insn address. */
1872 1.1 mrg static int last_insn_address = 0;
1873 1.1 mrg
1874 1.1 mrg const int uid = INSN_UID (insn);
1875 1.1 mrg
1876 1.1 mrg if (TARGET_ADDRESSES)
1877 1.1 mrg {
1878 1.1 mrg fprintf (asm_out_file, "; 0x%x %d\n", INSN_ADDRESSES (uid),
1879 1.1 mrg INSN_ADDRESSES (uid) - last_insn_address);
1880 1.1 mrg last_insn_address = INSN_ADDRESSES (uid);
1881 1.1 mrg }
1882 1.1 mrg }
1883 1.1 mrg
1884 1.1 mrg /* Prepare for an SI sized move. */
1885 1.1 mrg
1886 1.1 mrg int
1887 1.1 mrg h8300_expand_movsi (rtx operands[])
1888 1.1 mrg {
1889 1.1 mrg rtx src = operands[1];
1890 1.1 mrg rtx dst = operands[0];
1891 1.1 mrg if (!reload_in_progress && !reload_completed)
1892 1.1 mrg {
1893 1.1 mrg if (!register_operand (dst, GET_MODE (dst)))
1894 1.1 mrg {
1895 1.1 mrg rtx tmp = gen_reg_rtx (GET_MODE (dst));
1896 1.1 mrg emit_move_insn (tmp, src);
1897 1.1 mrg operands[1] = tmp;
1898 1.1 mrg }
1899 1.1 mrg }
1900 1.1 mrg return 0;
1901 1.1 mrg }
1902 1.1 mrg
1903 1.1 mrg /* Given FROM and TO register numbers, say whether this elimination is allowed.
1904 1.1 mrg Frame pointer elimination is automatically handled.
1905 1.1 mrg
1906 1.1 mrg For the h8300, if frame pointer elimination is being done, we would like to
1907 1.1 mrg convert ap and rp into sp, not fp.
1908 1.1 mrg
1909 1.1 mrg All other eliminations are valid. */
1910 1.1 mrg
1911 1.1 mrg static bool
1912 1.1 mrg h8300_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
1913 1.1 mrg {
1914 1.1 mrg return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true);
1915 1.1 mrg }
1916 1.1 mrg
1917 1.1 mrg /* Conditionally modify register usage based on target flags. */
1918 1.1 mrg
1919 1.1 mrg static void
1920 1.1 mrg h8300_conditional_register_usage (void)
1921 1.1 mrg {
1922 1.1 mrg if (!TARGET_MAC)
1923 1.1 mrg fixed_regs[MAC_REG] = call_used_regs[MAC_REG] = 1;
1924 1.1 mrg }
1925 1.1 mrg
1926 1.1 mrg /* Function for INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET).
1927 1.1 mrg Define the offset between two registers, one to be eliminated, and
1928 1.1 mrg the other its replacement, at the start of a routine. */
1929 1.1 mrg
1930 1.1 mrg int
1931 1.1 mrg h8300_initial_elimination_offset (int from, int to)
1932 1.1 mrg {
1933 1.1 mrg /* The number of bytes that the return address takes on the stack. */
1934 1.1 mrg int pc_size = POINTER_SIZE / BITS_PER_UNIT;
1935 1.1 mrg
1936 1.1 mrg /* The number of bytes that the saved frame pointer takes on the stack. */
1937 1.1 mrg int fp_size = frame_pointer_needed * UNITS_PER_WORD;
1938 1.1 mrg
1939 1.1 mrg /* The number of bytes that the saved registers, excluding the frame
1940 1.1 mrg pointer, take on the stack. */
1941 1.1 mrg int saved_regs_size = 0;
1942 1.1 mrg
1943 1.1 mrg /* The number of bytes that the locals takes on the stack. */
1944 1.1 mrg int frame_size = round_frame_size (get_frame_size ());
1945 1.1 mrg
1946 1.1 mrg int regno;
1947 1.1 mrg
1948 1.1 mrg for (regno = 0; regno <= HARD_FRAME_POINTER_REGNUM; regno++)
1949 1.1 mrg if (WORD_REG_USED (regno))
1950 1.1 mrg saved_regs_size += UNITS_PER_WORD;
1951 1.1 mrg
1952 1.1 mrg /* Adjust saved_regs_size because the above loop took the frame
1953 1.1 mrg pointer int account. */
1954 1.1 mrg saved_regs_size -= fp_size;
1955 1.1 mrg
1956 1.1 mrg switch (to)
1957 1.1 mrg {
1958 1.1 mrg case HARD_FRAME_POINTER_REGNUM:
1959 1.1 mrg switch (from)
1960 1.1 mrg {
1961 1.1 mrg case ARG_POINTER_REGNUM:
1962 1.1 mrg return pc_size + fp_size;
1963 1.1 mrg case RETURN_ADDRESS_POINTER_REGNUM:
1964 1.1 mrg return fp_size;
1965 1.1 mrg case FRAME_POINTER_REGNUM:
1966 1.1 mrg return -saved_regs_size;
1967 1.1 mrg default:
1968 1.1 mrg gcc_unreachable ();
1969 1.1 mrg }
1970 1.1 mrg break;
1971 1.1 mrg case STACK_POINTER_REGNUM:
1972 1.1 mrg switch (from)
1973 1.1 mrg {
1974 1.1 mrg case ARG_POINTER_REGNUM:
1975 1.1 mrg return pc_size + saved_regs_size + frame_size;
1976 1.1 mrg case RETURN_ADDRESS_POINTER_REGNUM:
1977 1.1 mrg return saved_regs_size + frame_size;
1978 1.1 mrg case FRAME_POINTER_REGNUM:
1979 1.1 mrg return frame_size;
1980 1.1 mrg default:
1981 1.1 mrg gcc_unreachable ();
1982 1.1 mrg }
1983 1.1 mrg break;
1984 1.1 mrg default:
1985 1.1 mrg gcc_unreachable ();
1986 1.1 mrg }
1987 1.1 mrg gcc_unreachable ();
1988 1.1 mrg }
1989 1.1 mrg
1990 1.1 mrg /* Worker function for RETURN_ADDR_RTX. */
1991 1.1 mrg
1992 1.1 mrg rtx
1993 1.1 mrg h8300_return_addr_rtx (int count, rtx frame)
1994 1.1 mrg {
1995 1.1 mrg rtx ret;
1996 1.1 mrg
1997 1.1 mrg if (count == 0)
1998 1.1 mrg ret = gen_rtx_MEM (Pmode,
1999 1.1 mrg gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM));
2000 1.1 mrg else if (flag_omit_frame_pointer)
2001 1.1 mrg return (rtx) 0;
2002 1.1 mrg else
2003 1.1 mrg ret = gen_rtx_MEM (Pmode,
2004 1.1 mrg memory_address (Pmode,
2005 1.1 mrg plus_constant (Pmode, frame,
2006 1.1 mrg UNITS_PER_WORD)));
2007 1.1 mrg set_mem_alias_set (ret, get_frame_alias_set ());
2008 1.1 mrg return ret;
2009 1.1 mrg }
2010 1.1 mrg
2011 1.1 mrg
2012 1.1 mrg machine_mode
2013 1.1 mrg h8300_select_cc_mode (enum rtx_code cond, rtx op0, rtx op1)
2014 1.1 mrg {
2015 1.1 mrg if (op1 == const0_rtx
2016 1.1 mrg && (cond == EQ || cond == NE || cond == LT || cond == GE)
2017 1.1 mrg && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
2018 1.1 mrg || GET_CODE (op0) == NEG || GET_CODE (op0) == AND
2019 1.1 mrg || GET_CODE (op0) == IOR || GET_CODE (op0) == XOR
2020 1.1 mrg || GET_CODE (op0) == NOT || GET_CODE (op0) == ASHIFT
2021 1.1 mrg || GET_CODE (op0) == ASHIFTRT || GET_CODE (op0) == LSHIFTRT
2022 1.1 mrg || GET_CODE (op0) == MULT || GET_CODE (op0) == SYMBOL_REF
2023 1.1 mrg || GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND
2024 1.1 mrg || REG_P (op0) || MEM_P (op0)))
2025 1.1 mrg return CCZNmode;
2026 1.1 mrg
2027 1.1 mrg return CCmode;
2028 1.1 mrg }
2029 1.1 mrg
2030 1.1 mrg
2031 1.1 mrg /* Given that X occurs in an address of the form (plus X constant),
2033 1.1 mrg return the part of X that is expected to be a register. There are
2034 1.1 mrg four kinds of addressing mode to recognize:
2035 1.1 mrg
2036 1.1 mrg @(dd,Rn)
2037 1.1 mrg @(dd,RnL.b)
2038 1.1 mrg @(dd,Rn.w)
2039 1.1 mrg @(dd,ERn.l)
2040 1.1 mrg
2041 1.1 mrg If SIZE is nonnull, and the address is one of the last three forms,
2042 1.1 mrg set *SIZE to the index multiplication factor. Set it to 0 for
2043 1.1 mrg plain @(dd,Rn) addresses.
2044 1.1 mrg
2045 1.1 mrg MODE is the mode of the value being accessed. It can be VOIDmode
2046 1.1 mrg if the address is known to be valid, but its mode is unknown. */
2047 1.1 mrg
2048 1.1 mrg static rtx
2049 1.1 mrg h8300_get_index (rtx x, machine_mode mode, int *size)
2050 1.1 mrg {
2051 1.1 mrg int dummy, factor;
2052 1.1 mrg
2053 1.1 mrg if (size == 0)
2054 1.1 mrg size = &dummy;
2055 1.1 mrg
2056 1.1 mrg factor = (mode == VOIDmode ? 0 : GET_MODE_SIZE (mode));
2057 1.1 mrg if (TARGET_H8300SX
2058 1.1 mrg && factor <= 4
2059 1.1 mrg && (mode == VOIDmode
2060 1.1 mrg || GET_MODE_CLASS (mode) == MODE_INT
2061 1.1 mrg || GET_MODE_CLASS (mode) == MODE_FLOAT))
2062 1.1 mrg {
2063 1.1 mrg if (factor <= 1 && GET_CODE (x) == ZERO_EXTEND)
2064 1.1 mrg {
2065 1.1 mrg /* When accessing byte-sized values, the index can be
2066 1.1 mrg a zero-extended QImode or HImode register. */
2067 1.1 mrg *size = GET_MODE_SIZE (GET_MODE (XEXP (x, 0)));
2068 1.1 mrg return XEXP (x, 0);
2069 1.1 mrg }
2070 1.1 mrg else
2071 1.1 mrg {
2072 1.1 mrg /* We're looking for addresses of the form:
2073 1.1 mrg
2074 1.1 mrg (mult X I)
2075 1.1 mrg or (mult (zero_extend X) I)
2076 1.1 mrg
2077 1.1 mrg where I is the size of the operand being accessed.
2078 1.1 mrg The canonical form of the second expression is:
2079 1.1 mrg
2080 1.1 mrg (and (mult (subreg X) I) J)
2081 1.1 mrg
2082 1.1 mrg where J == GET_MODE_MASK (GET_MODE (X)) * I. */
2083 1.1 mrg rtx index;
2084 1.1 mrg
2085 1.1 mrg if (GET_CODE (x) == AND
2086 1.1 mrg && GET_CODE (XEXP (x, 1)) == CONST_INT
2087 1.1 mrg && (factor == 0
2088 1.1 mrg || INTVAL (XEXP (x, 1)) == 0xff * factor
2089 1.1 mrg || INTVAL (XEXP (x, 1)) == 0xffff * factor))
2090 1.1 mrg {
2091 1.1 mrg index = XEXP (x, 0);
2092 1.1 mrg *size = (INTVAL (XEXP (x, 1)) >= 0xffff ? 2 : 1);
2093 1.1 mrg }
2094 1.1 mrg else
2095 1.1 mrg {
2096 1.1 mrg index = x;
2097 1.1 mrg *size = 4;
2098 1.1 mrg }
2099 1.1 mrg
2100 1.1 mrg if (GET_CODE (index) == MULT
2101 1.1 mrg && GET_CODE (XEXP (index, 1)) == CONST_INT
2102 1.1 mrg && (factor == 0 || factor == INTVAL (XEXP (index, 1))))
2103 1.1 mrg return XEXP (index, 0);
2104 1.1 mrg }
2105 1.1 mrg }
2106 1.1 mrg *size = 0;
2107 1.1 mrg return x;
2108 1.1 mrg }
2109 1.1 mrg
2110 1.1 mrg /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.
2112 1.1 mrg
2113 1.1 mrg On the H8/300, the predecrement and postincrement address depend thus
2114 1.1 mrg (the amount of decrement or increment being the length of the operand). */
2115 1.1 mrg
2116 1.1 mrg static bool
2117 1.1 mrg h8300_mode_dependent_address_p (const_rtx addr,
2118 1.1 mrg addr_space_t as ATTRIBUTE_UNUSED)
2119 1.1 mrg {
2120 1.1 mrg if (GET_CODE (addr) == PLUS
2121 1.1 mrg && h8300_get_index (XEXP (addr, 0), VOIDmode, 0) != XEXP (addr, 0))
2122 1.1 mrg return true;
2123 1.1 mrg
2124 1.1 mrg return false;
2125 1.1 mrg }
2126 1.1 mrg
2127 1.1 mrg static const h8300_length_table addb_length_table =
2129 1.1 mrg {
2130 1.1 mrg /* #xx Rs @aa @Rs @xx */
2131 1.1 mrg { 2, 2, 4, 4, 4 }, /* add.b xx,Rd */
2132 1.1 mrg { 4, 4, 4, 4, 6 }, /* add.b xx,@aa */
2133 1.1 mrg { 4, 4, 4, 4, 6 }, /* add.b xx,@Rd */
2134 1.1 mrg { 6, 4, 4, 4, 6 } /* add.b xx,@xx */
2135 1.1 mrg };
2136 1.1 mrg
2137 1.1 mrg static const h8300_length_table addw_length_table =
2138 1.1 mrg {
2139 1.1 mrg /* #xx Rs @aa @Rs @xx */
2140 1.1 mrg { 2, 2, 4, 4, 4 }, /* add.w xx,Rd */
2141 1.1 mrg { 4, 4, 4, 4, 6 }, /* add.w xx,@aa */
2142 1.1 mrg { 4, 4, 4, 4, 6 }, /* add.w xx,@Rd */
2143 1.1 mrg { 4, 4, 4, 4, 6 } /* add.w xx,@xx */
2144 1.1 mrg };
2145 1.1 mrg
2146 1.1 mrg static const h8300_length_table addl_length_table =
2147 1.1 mrg {
2148 1.1 mrg /* #xx Rs @aa @Rs @xx */
2149 1.1 mrg { 2, 2, 4, 4, 4 }, /* add.l xx,Rd */
2150 1.1 mrg { 4, 4, 6, 6, 6 }, /* add.l xx,@aa */
2151 1.1 mrg { 4, 4, 6, 6, 6 }, /* add.l xx,@Rd */
2152 1.1 mrg { 4, 4, 6, 6, 6 } /* add.l xx,@xx */
2153 1.1 mrg };
2154 1.1 mrg
2155 1.1 mrg #define logicb_length_table addb_length_table
2156 1.1 mrg #define logicw_length_table addw_length_table
2157 1.1 mrg
2158 1.1 mrg static const h8300_length_table logicl_length_table =
2159 1.1 mrg {
2160 1.1 mrg /* #xx Rs @aa @Rs @xx */
2161 1.1 mrg { 2, 4, 4, 4, 4 }, /* and.l xx,Rd */
2162 1.1 mrg { 4, 4, 6, 6, 6 }, /* and.l xx,@aa */
2163 1.1 mrg { 4, 4, 6, 6, 6 }, /* and.l xx,@Rd */
2164 1.1 mrg { 4, 4, 6, 6, 6 } /* and.l xx,@xx */
2165 1.1 mrg };
2166 1.1 mrg
2167 1.1 mrg static const h8300_length_table movb_length_table =
2168 1.1 mrg {
2169 1.1 mrg /* #xx Rs @aa @Rs @xx */
2170 1.1 mrg { 2, 2, 2, 2, 4 }, /* mov.b xx,Rd */
2171 1.1 mrg { 4, 2, 4, 4, 4 }, /* mov.b xx,@aa */
2172 1.1 mrg { 4, 2, 4, 4, 4 }, /* mov.b xx,@Rd */
2173 1.1 mrg { 4, 4, 4, 4, 4 } /* mov.b xx,@xx */
2174 1.1 mrg };
2175 1.1 mrg
2176 1.1 mrg #define movw_length_table movb_length_table
2177 1.1 mrg
2178 1.1 mrg static const h8300_length_table movl_length_table =
2179 1.1 mrg {
2180 1.1 mrg /* #xx Rs @aa @Rs @xx */
2181 1.1 mrg { 2, 2, 4, 4, 4 }, /* mov.l xx,Rd */
2182 1.1 mrg { 4, 4, 4, 4, 4 }, /* mov.l xx,@aa */
2183 1.1 mrg { 4, 4, 4, 4, 4 }, /* mov.l xx,@Rd */
2184 1.1 mrg { 4, 4, 4, 4, 4 } /* mov.l xx,@xx */
2185 1.1 mrg };
2186 1.1 mrg
2187 1.1 mrg /* Return the size of the given address or displacement constant. */
2188 1.1 mrg
2189 1.1 mrg static unsigned int
2190 1.1 mrg h8300_constant_length (rtx constant)
2191 1.1 mrg {
2192 1.1 mrg /* Check for (@d:16,Reg). */
2193 1.1 mrg if (GET_CODE (constant) == CONST_INT
2194 1.1 mrg && IN_RANGE (INTVAL (constant), -0x8000, 0x7fff))
2195 1.1 mrg return 2;
2196 1.1 mrg
2197 1.1 mrg /* Check for (@d:16,Reg) in cases where the displacement is
2198 1.1 mrg an absolute address. */
2199 1.1 mrg if (Pmode == HImode || h8300_tiny_constant_address_p (constant))
2200 1.1 mrg return 2;
2201 1.1 mrg
2202 1.1 mrg return 4;
2203 1.1 mrg }
2204 1.1 mrg
2205 1.1 mrg /* Return the size of a displacement field in address ADDR, which should
2206 1.1 mrg have the form (plus X constant). SIZE is the number of bytes being
2207 1.1 mrg accessed. */
2208 1.1 mrg
2209 1.1 mrg static unsigned int
2210 1.1 mrg h8300_displacement_length (rtx addr, int size)
2211 1.1 mrg {
2212 1.1 mrg rtx offset;
2213 1.1 mrg
2214 1.1 mrg offset = XEXP (addr, 1);
2215 1.1 mrg
2216 1.1 mrg /* Check for @(d:2,Reg). */
2217 1.1 mrg if (register_operand (XEXP (addr, 0), VOIDmode)
2218 1.1 mrg && GET_CODE (offset) == CONST_INT
2219 1.1 mrg && (INTVAL (offset) == size
2220 1.1 mrg || INTVAL (offset) == size * 2
2221 1.1 mrg || INTVAL (offset) == size * 3))
2222 1.1 mrg return 0;
2223 1.1 mrg
2224 1.1 mrg return h8300_constant_length (offset);
2225 1.1 mrg }
2226 1.1 mrg
2227 1.1 mrg /* Store the class of operand OP in *OPCLASS and return the length of any
2228 1.1 mrg extra operand fields. SIZE is the number of bytes in OP. OPCLASS
2229 1.1 mrg can be null if only the length is needed. */
2230 1.1 mrg
2231 1.1 mrg static unsigned int
2232 1.1 mrg h8300_classify_operand (rtx op, int size, enum h8300_operand_class *opclass)
2233 1.1 mrg {
2234 1.1 mrg enum h8300_operand_class dummy;
2235 1.1 mrg
2236 1.1 mrg if (opclass == 0)
2237 1.1 mrg opclass = &dummy;
2238 1.1 mrg
2239 1.1 mrg if (CONSTANT_P (op))
2240 1.1 mrg {
2241 1.1 mrg *opclass = H8OP_IMMEDIATE;
2242 1.1 mrg
2243 1.1 mrg /* Byte-sized immediates are stored in the opcode fields. */
2244 1.1 mrg if (size == 1)
2245 1.1 mrg return 0;
2246 1.1 mrg
2247 1.1 mrg /* If this is a 32-bit instruction, see whether the constant
2248 1.1 mrg will fit into a 16-bit immediate field. */
2249 1.1 mrg if (TARGET_H8300SX
2250 1.1 mrg && size == 4
2251 1.1 mrg && GET_CODE (op) == CONST_INT
2252 1.1 mrg && IN_RANGE (INTVAL (op), 0, 0xffff))
2253 1.1 mrg return 2;
2254 1.1 mrg
2255 1.1 mrg return size;
2256 1.1 mrg }
2257 1.1 mrg else if (GET_CODE (op) == MEM)
2258 1.1 mrg {
2259 1.1 mrg op = XEXP (op, 0);
2260 1.1 mrg if (CONSTANT_P (op))
2261 1.1 mrg {
2262 1.1 mrg *opclass = H8OP_MEM_ABSOLUTE;
2263 1.1 mrg return h8300_constant_length (op);
2264 1.1 mrg }
2265 1.1 mrg else if (GET_CODE (op) == PLUS && CONSTANT_P (XEXP (op, 1)))
2266 1.1 mrg {
2267 1.1 mrg *opclass = H8OP_MEM_COMPLEX;
2268 1.1 mrg return h8300_displacement_length (op, size);
2269 1.1 mrg }
2270 1.1 mrg else if (GET_RTX_CLASS (GET_CODE (op)) == RTX_AUTOINC)
2271 1.1 mrg {
2272 1.1 mrg *opclass = H8OP_MEM_COMPLEX;
2273 1.1 mrg return 0;
2274 1.1 mrg }
2275 1.1 mrg else if (register_operand (op, VOIDmode))
2276 1.1 mrg {
2277 1.1 mrg *opclass = H8OP_MEM_BASE;
2278 1.1 mrg return 0;
2279 1.1 mrg }
2280 1.1 mrg }
2281 1.1 mrg gcc_assert (register_operand (op, VOIDmode));
2282 1.1 mrg *opclass = H8OP_REGISTER;
2283 1.1 mrg return 0;
2284 1.1 mrg }
2285 1.1 mrg
2286 1.1 mrg /* Return the length of the instruction described by TABLE given that
2287 1.1 mrg its operands are OP1 and OP2. OP1 must be an h8300_dst_operand
2288 1.1 mrg and OP2 must be an h8300_src_operand. */
2289 1.1 mrg
2290 1.1 mrg static unsigned int
2291 1.1 mrg h8300_length_from_table (rtx op1, rtx op2, const h8300_length_table *table)
2292 1.1 mrg {
2293 1.1 mrg enum h8300_operand_class op1_class, op2_class;
2294 1.1 mrg unsigned int size, immediate_length;
2295 1.1 mrg
2296 1.1 mrg size = GET_MODE_SIZE (GET_MODE (op1));
2297 1.1 mrg immediate_length = (h8300_classify_operand (op1, size, &op1_class)
2298 1.1 mrg + h8300_classify_operand (op2, size, &op2_class));
2299 1.1 mrg return immediate_length + (*table)[op1_class - 1][op2_class];
2300 1.1 mrg }
2301 1.1 mrg
2302 1.1 mrg /* Return the length of a unary instruction such as neg or not given that
2303 1.1 mrg its operand is OP. */
2304 1.1 mrg
2305 1.1 mrg unsigned int
2306 1.1 mrg h8300_unary_length (rtx op)
2307 1.1 mrg {
2308 1.1 mrg enum h8300_operand_class opclass;
2309 1.1 mrg unsigned int size, operand_length;
2310 1.1 mrg
2311 1.1 mrg size = GET_MODE_SIZE (GET_MODE (op));
2312 1.1 mrg operand_length = h8300_classify_operand (op, size, &opclass);
2313 1.1 mrg switch (opclass)
2314 1.1 mrg {
2315 1.1 mrg case H8OP_REGISTER:
2316 1.1 mrg return 2;
2317 1.1 mrg
2318 1.1 mrg case H8OP_MEM_BASE:
2319 1.1 mrg return (size == 4 ? 6 : 4);
2320 1.1 mrg
2321 1.1 mrg case H8OP_MEM_ABSOLUTE:
2322 1.1 mrg return operand_length + (size == 4 ? 6 : 4);
2323 1.1 mrg
2324 1.1 mrg case H8OP_MEM_COMPLEX:
2325 1.1 mrg return operand_length + 6;
2326 1.1 mrg
2327 1.1 mrg default:
2328 1.1 mrg gcc_unreachable ();
2329 1.1 mrg }
2330 1.1 mrg }
2331 1.1 mrg
2332 1.1 mrg /* Likewise short immediate instructions such as add.w #xx:3,OP. */
2333 1.1 mrg
2334 1.1 mrg static unsigned int
2335 1.1 mrg h8300_short_immediate_length (rtx op)
2336 1.1 mrg {
2337 1.1 mrg enum h8300_operand_class opclass;
2338 1.1 mrg unsigned int size, operand_length;
2339 1.1 mrg
2340 1.1 mrg size = GET_MODE_SIZE (GET_MODE (op));
2341 1.1 mrg operand_length = h8300_classify_operand (op, size, &opclass);
2342 1.1 mrg
2343 1.1 mrg switch (opclass)
2344 1.1 mrg {
2345 1.1 mrg case H8OP_REGISTER:
2346 1.1 mrg return 2;
2347 1.1 mrg
2348 1.1 mrg case H8OP_MEM_BASE:
2349 1.1 mrg case H8OP_MEM_ABSOLUTE:
2350 1.1 mrg case H8OP_MEM_COMPLEX:
2351 1.1 mrg return 4 + operand_length;
2352 1.1 mrg
2353 1.1 mrg default:
2354 1.1 mrg gcc_unreachable ();
2355 1.1 mrg }
2356 1.1 mrg }
2357 1.1 mrg
2358 1.1 mrg /* Likewise bitfield load and store instructions. */
2359 1.1 mrg
2360 1.1 mrg static unsigned int
2361 1.1 mrg h8300_bitfield_length (rtx op, rtx op2)
2362 1.1 mrg {
2363 1.1 mrg enum h8300_operand_class opclass;
2364 1.1 mrg unsigned int size, operand_length;
2365 1.1 mrg
2366 1.1 mrg if (GET_CODE (op) == REG)
2367 1.1 mrg op = op2;
2368 1.1 mrg gcc_assert (GET_CODE (op) != REG);
2369 1.1 mrg
2370 1.1 mrg size = GET_MODE_SIZE (GET_MODE (op));
2371 1.1 mrg operand_length = h8300_classify_operand (op, size, &opclass);
2372 1.1 mrg
2373 1.1 mrg switch (opclass)
2374 1.1 mrg {
2375 1.1 mrg case H8OP_MEM_BASE:
2376 1.1 mrg case H8OP_MEM_ABSOLUTE:
2377 1.1 mrg case H8OP_MEM_COMPLEX:
2378 1.1 mrg return 4 + operand_length;
2379 1.1 mrg
2380 1.1 mrg default:
2381 1.1 mrg gcc_unreachable ();
2382 1.1 mrg }
2383 1.1 mrg }
2384 1.1 mrg
2385 1.1 mrg /* Calculate the length of general binary instruction INSN using TABLE. */
2386 1.1 mrg
2387 1.1 mrg static unsigned int
2388 1.1 mrg h8300_binary_length (rtx_insn *insn, const h8300_length_table *table)
2389 1.1 mrg {
2390 1.1 mrg rtx set;
2391 1.1 mrg rtx pattern;
2392 1.1 mrg
2393 1.1 mrg if (GET_CODE (insn) != INSN)
2394 1.1 mrg gcc_unreachable ();
2395 1.1 mrg
2396 1.1 mrg pattern = PATTERN (insn);
2397 1.1 mrg if (GET_CODE (pattern) == PARALLEL
2398 1.1 mrg && GET_CODE (XVECEXP (pattern, 0, 0)) == SET
2399 1.1 mrg && GET_CODE (SET_SRC (XVECEXP (pattern, 0, 0))) == COMPARE)
2400 1.1 mrg set = XVECEXP (pattern, 0, 1);
2401 1.1 mrg else
2402 1.1 mrg set = single_set (insn);
2403 1.1 mrg gcc_assert (set);
2404 1.1 mrg
2405 1.1 mrg if (BINARY_P (SET_SRC (set)))
2406 1.1 mrg return h8300_length_from_table (XEXP (SET_SRC (set), 0),
2407 1.1 mrg XEXP (SET_SRC (set), 1), table);
2408 1.1 mrg else
2409 1.1 mrg {
2410 1.1 mrg gcc_assert (GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == RTX_TERNARY);
2411 1.1 mrg return h8300_length_from_table (XEXP (XEXP (SET_SRC (set), 1), 0),
2412 1.1 mrg XEXP (XEXP (SET_SRC (set), 1), 1),
2413 1.1 mrg table);
2414 1.1 mrg }
2415 1.1 mrg }
2416 1.1 mrg
2417 1.1 mrg /* Subroutine of h8300_move_length. Return true if OP is 1- or 2-byte
2418 1.1 mrg memory reference and either (1) it has the form @(d:16,Rn) or
2419 1.1 mrg (2) its address has the code given by INC_CODE. */
2420 1.1 mrg
2421 1.1 mrg static bool
2422 1.1 mrg h8300_short_move_mem_p (rtx op, enum rtx_code inc_code)
2423 1.1 mrg {
2424 1.1 mrg rtx addr;
2425 1.1 mrg unsigned int size;
2426 1.1 mrg
2427 1.1 mrg if (GET_CODE (op) != MEM)
2428 1.1 mrg return false;
2429 1.1 mrg
2430 1.1 mrg addr = XEXP (op, 0);
2431 1.1 mrg size = GET_MODE_SIZE (GET_MODE (op));
2432 1.1 mrg if (size != 1 && size != 2)
2433 1.1 mrg return false;
2434 1.1 mrg
2435 1.1 mrg return (GET_CODE (addr) == inc_code
2436 1.1 mrg || (GET_CODE (addr) == PLUS
2437 1.1 mrg && GET_CODE (XEXP (addr, 0)) == REG
2438 1.1 mrg && h8300_displacement_length (addr, size) == 2));
2439 1.1 mrg }
2440 1.1 mrg
2441 1.1 mrg /* Calculate the length of move instruction INSN using the given length
2442 1.1 mrg table. Although the tables are correct for most cases, there is some
2443 1.1 mrg irregularity in the length of mov.b and mov.w. The following forms:
2444 1.1 mrg
2445 1.1 mrg mov @ERs+, Rd
2446 1.1 mrg mov @(d:16,ERs), Rd
2447 1.1 mrg mov Rs, @-ERd
2448 1.1 mrg mov Rs, @(d:16,ERd)
2449 1.1 mrg
2450 1.1 mrg are two bytes shorter than most other "mov Rs, @complex" or
2451 1.1 mrg "mov @complex,Rd" combinations. */
2452 1.1 mrg
2453 1.1 mrg static unsigned int
2454 1.1 mrg h8300_move_length (rtx *operands, const h8300_length_table *table)
2455 1.1 mrg {
2456 1.1 mrg unsigned int size;
2457 1.1 mrg
2458 1.1 mrg size = h8300_length_from_table (operands[0], operands[1], table);
2459 1.1 mrg if (REG_P (operands[0]) && h8300_short_move_mem_p (operands[1], POST_INC))
2460 1.1 mrg size -= 2;
2461 1.1 mrg if (REG_P (operands[1]) && h8300_short_move_mem_p (operands[0], PRE_DEC))
2462 1.1 mrg size -= 2;
2463 1.1 mrg return size;
2464 1.1 mrg }
2465 1.1 mrg
2466 1.1 mrg /* Return the length of a mova instruction with the given operands.
2467 1.1 mrg DEST is the register destination, SRC is the source address and
2468 1.1 mrg OFFSET is the 16-bit or 32-bit displacement. */
2469 1.1 mrg
2470 1.1 mrg static unsigned int
2471 1.1 mrg h8300_mova_length (rtx dest, rtx src, rtx offset)
2472 1.1 mrg {
2473 1.1 mrg unsigned int size;
2474 1.1 mrg
2475 1.1 mrg size = (2
2476 1.1 mrg + h8300_constant_length (offset)
2477 1.1 mrg + h8300_classify_operand (src, GET_MODE_SIZE (GET_MODE (src)), 0));
2478 1.1 mrg if (!REG_P (dest) || !REG_P (src) || REGNO (src) != REGNO (dest))
2479 1.1 mrg size += 2;
2480 1.1 mrg return size;
2481 1.1 mrg }
2482 1.1 mrg
2483 1.1 mrg /* Compute the length of INSN based on its length_table attribute.
2484 1.1 mrg OPERANDS is the array of its operands. */
2485 1.1 mrg
2486 1.1 mrg unsigned int
2487 1.1 mrg h8300_insn_length_from_table (rtx_insn *insn, rtx * operands)
2488 1.1 mrg {
2489 1.1 mrg switch (get_attr_length_table (insn))
2490 1.1 mrg {
2491 1.1 mrg case LENGTH_TABLE_NONE:
2492 1.1 mrg gcc_unreachable ();
2493 1.1 mrg
2494 1.1 mrg case LENGTH_TABLE_ADD:
2495 1.1 mrg if (GET_MODE (operands[0]) == QImode)
2496 1.1 mrg return h8300_binary_length (insn, &addb_length_table);
2497 1.1 mrg else if (GET_MODE (operands[0]) == HImode)
2498 1.1 mrg return h8300_binary_length (insn, &addw_length_table);
2499 1.1 mrg else if (GET_MODE (operands[0]) == SImode)
2500 1.1 mrg return h8300_binary_length (insn, &addl_length_table);
2501 1.1 mrg gcc_unreachable ();
2502 1.1 mrg
2503 1.1 mrg case LENGTH_TABLE_LOGICB:
2504 1.1 mrg return h8300_binary_length (insn, &logicb_length_table);
2505 1.1 mrg
2506 1.1 mrg case LENGTH_TABLE_MOVB:
2507 1.1 mrg return h8300_move_length (operands, &movb_length_table);
2508 1.1 mrg
2509 1.1 mrg case LENGTH_TABLE_MOVW:
2510 1.1 mrg return h8300_move_length (operands, &movw_length_table);
2511 1.1 mrg
2512 1.1 mrg case LENGTH_TABLE_MOVL:
2513 1.1 mrg return h8300_move_length (operands, &movl_length_table);
2514 1.1 mrg
2515 1.1 mrg case LENGTH_TABLE_MOVA:
2516 1.1 mrg return h8300_mova_length (operands[0], operands[1], operands[2]);
2517 1.1 mrg
2518 1.1 mrg case LENGTH_TABLE_MOVA_ZERO:
2519 1.1 mrg return h8300_mova_length (operands[0], operands[1], const0_rtx);
2520 1.1 mrg
2521 1.1 mrg case LENGTH_TABLE_UNARY:
2522 1.1 mrg return h8300_unary_length (operands[0]);
2523 1.1 mrg
2524 1.1 mrg case LENGTH_TABLE_MOV_IMM4:
2525 1.1 mrg return 2 + h8300_classify_operand (operands[0], 0, 0);
2526 1.1 mrg
2527 1.1 mrg case LENGTH_TABLE_SHORT_IMMEDIATE:
2528 1.1 mrg return h8300_short_immediate_length (operands[0]);
2529 1.1 mrg
2530 1.1 mrg case LENGTH_TABLE_BITFIELD:
2531 1.1 mrg return h8300_bitfield_length (operands[0], operands[1]);
2532 1.1 mrg
2533 1.1 mrg case LENGTH_TABLE_BITBRANCH:
2534 1.1 mrg return h8300_bitfield_length (operands[1], operands[2]) - 2;
2535 1.1 mrg
2536 1.1 mrg default:
2537 1.1 mrg gcc_unreachable ();
2538 1.1 mrg }
2539 1.1 mrg }
2540 1.1 mrg
2541 1.1 mrg /* Return true if LHS and RHS are memory references that can be mapped
2542 1.1 mrg to the same h8sx assembly operand. LHS appears as the destination of
2543 1.1 mrg an instruction and RHS appears as a source.
2544 1.1 mrg
2545 1.1 mrg Three cases are allowed:
2546 1.1 mrg
2547 1.1 mrg - RHS is @+Rn or @-Rn, LHS is @Rn
2548 1.1 mrg - RHS is @Rn, LHS is @Rn+ or @Rn-
2549 1.1 mrg - RHS and LHS have the same address and neither has side effects. */
2550 1.1 mrg
2551 1.1 mrg bool
2552 1.1 mrg h8sx_mergeable_memrefs_p (rtx lhs, rtx rhs)
2553 1.1 mrg {
2554 1.1 mrg if (GET_CODE (rhs) == MEM && GET_CODE (lhs) == MEM)
2555 1.1 mrg {
2556 1.1 mrg rhs = XEXP (rhs, 0);
2557 1.1 mrg lhs = XEXP (lhs, 0);
2558 1.1 mrg
2559 1.1 mrg if (GET_CODE (rhs) == PRE_INC || GET_CODE (rhs) == PRE_DEC)
2560 1.1 mrg return rtx_equal_p (XEXP (rhs, 0), lhs);
2561 1.1 mrg
2562 1.1 mrg if (GET_CODE (lhs) == POST_INC || GET_CODE (lhs) == POST_DEC)
2563 1.1 mrg return rtx_equal_p (rhs, XEXP (lhs, 0));
2564 1.1 mrg
2565 1.1 mrg if (rtx_equal_p (rhs, lhs))
2566 1.1 mrg return true;
2567 1.1 mrg }
2568 1.1 mrg return false;
2569 1.1 mrg }
2570 1.1 mrg
2571 1.1 mrg /* Return true if OPERANDS[1] can be mapped to the same assembly
2572 1.1 mrg operand as OPERANDS[0]. */
2573 1.1 mrg
2574 1.1 mrg bool
2575 1.1 mrg h8300_operands_match_p (rtx *operands)
2576 1.1 mrg {
2577 1.1 mrg if (register_operand (operands[0], VOIDmode)
2578 1.1 mrg && register_operand (operands[1], VOIDmode))
2579 1.1 mrg return true;
2580 1.1 mrg
2581 1.1 mrg if (h8sx_mergeable_memrefs_p (operands[0], operands[1]))
2582 1.1 mrg return true;
2583 1.1 mrg
2584 1.1 mrg return false;
2585 1.1 mrg }
2586 1.1 mrg
2587 1.1 mrg /* Return the length of mov instruction. */
2589 1.1 mrg
2590 1.1 mrg unsigned int
2591 1.1 mrg compute_mov_length (rtx *operands)
2592 1.1 mrg {
2593 1.1 mrg /* If the mov instruction involves a memory operand, we compute the
2594 1.1 mrg length, assuming the largest addressing mode is used, and then
2595 1.1 mrg adjust later in the function. Otherwise, we compute and return
2596 1.1 mrg the exact length in one step. */
2597 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
2598 1.1 mrg rtx dest = operands[0];
2599 1.1 mrg rtx src = operands[1];
2600 1.1 mrg rtx addr;
2601 1.1 mrg
2602 1.1 mrg if (GET_CODE (src) == MEM)
2603 1.1 mrg addr = XEXP (src, 0);
2604 1.1 mrg else if (GET_CODE (dest) == MEM)
2605 1.1 mrg addr = XEXP (dest, 0);
2606 1.1 mrg else
2607 1.1 mrg addr = NULL_RTX;
2608 1.1 mrg
2609 1.1 mrg unsigned int base_length;
2610 1.1 mrg
2611 1.1 mrg switch (mode)
2612 1.1 mrg {
2613 1.1 mrg case E_QImode:
2614 1.1 mrg if (addr == NULL_RTX)
2615 1.1 mrg return 2;
2616 1.1 mrg
2617 1.1 mrg /* The eightbit addressing is available only in QImode, so
2618 1.1 mrg go ahead and take care of it. */
2619 1.1 mrg if (h8300_eightbit_constant_address_p (addr))
2620 1.1 mrg return 2;
2621 1.1 mrg
2622 1.1 mrg base_length = 8;
2623 1.1 mrg break;
2624 1.1 mrg
2625 1.1 mrg case E_HImode:
2626 1.1 mrg if (addr == NULL_RTX)
2627 1.1 mrg {
2628 1.1 mrg if (REG_P (src))
2629 1.1 mrg return 2;
2630 1.1 mrg
2631 1.1 mrg if (src == const0_rtx)
2632 1.1 mrg return 2;
2633 1.1 mrg
2634 1.1 mrg return 4;
2635 1.1 mrg }
2636 1.1 mrg
2637 1.1 mrg base_length = 8;
2638 1.1 mrg break;
2639 1.1 mrg
2640 1.1 mrg case E_SImode:
2641 1.1 mrg if (addr == NULL_RTX)
2642 1.1 mrg {
2643 1.1 mrg if (REG_P (src))
2644 1.1 mrg {
2645 1.1 mrg if (REGNO (src) == MAC_REG || REGNO (dest) == MAC_REG)
2646 1.1 mrg return 4;
2647 1.1 mrg else
2648 1.1 mrg return 2;
2649 1.1 mrg }
2650 1.1 mrg
2651 1.1 mrg if (GET_CODE (src) == CONST_INT)
2652 1.1 mrg {
2653 1.1 mrg int val = INTVAL (src);
2654 1.1 mrg
2655 1.1 mrg if (val == 0)
2656 1.1 mrg return 2;
2657 1.1 mrg
2658 1.1 mrg if (val == (val & 0x00ff) || val == (val & 0xff00))
2659 1.1 mrg return 4;
2660 1.1 mrg
2661 1.1 mrg switch (val & 0xffffffff)
2662 1.1 mrg {
2663 1.1 mrg case 0xffffffff:
2664 1.1 mrg case 0xfffffffe:
2665 1.1 mrg case 0xfffffffc:
2666 1.1 mrg case 0x0000ffff:
2667 1.1 mrg case 0x0000fffe:
2668 1.1 mrg case 0xffff0000:
2669 1.1 mrg case 0xfffe0000:
2670 1.1 mrg case 0x00010000:
2671 1.1 mrg case 0x00020000:
2672 1.1 mrg return 4;
2673 1.1 mrg }
2674 1.1 mrg }
2675 1.1 mrg return 6;
2676 1.1 mrg }
2677 1.1 mrg
2678 1.1 mrg base_length = 10;
2679 1.1 mrg break;
2680 1.1 mrg
2681 1.1 mrg case E_SFmode:
2682 1.1 mrg if (addr == NULL_RTX)
2683 1.1 mrg {
2684 1.1 mrg if (REG_P (src))
2685 1.1 mrg return 2;
2686 1.1 mrg
2687 1.1 mrg if (satisfies_constraint_G (src))
2688 1.1 mrg return 2;
2689 1.1 mrg
2690 1.1 mrg return 6;
2691 1.1 mrg }
2692 1.1 mrg
2693 1.1 mrg base_length = 10;
2694 1.1 mrg break;
2695 1.1 mrg
2696 1.1 mrg default:
2697 1.1 mrg gcc_unreachable ();
2698 1.1 mrg }
2699 1.1 mrg
2700 1.1 mrg /* Adjust the length based on the addressing mode used.
2701 1.1 mrg Specifically, we subtract the difference between the actual
2702 1.1 mrg length and the longest one, which is @(d:24,ERs). */
2703 1.1 mrg
2704 1.1 mrg /* @ERs+ and @-ERd are 6 bytes shorter than the longest. */
2705 1.1 mrg if (GET_CODE (addr) == PRE_DEC
2706 1.1 mrg || GET_CODE (addr) == POST_INC)
2707 1.1 mrg return base_length - 6;
2708 1.1 mrg
2709 1.1 mrg /* @ERs and @ERd are 6 bytes shorter than the longest. */
2710 1.1 mrg if (GET_CODE (addr) == REG)
2711 1.1 mrg return base_length - 6;
2712 1.1 mrg
2713 1.1 mrg /* @(d:16,ERs) and @(d:16,ERd) are 4 bytes shorter than the
2714 1.1 mrg longest. */
2715 1.1 mrg if (GET_CODE (addr) == PLUS
2716 1.1 mrg && GET_CODE (XEXP (addr, 0)) == REG
2717 1.1 mrg && GET_CODE (XEXP (addr, 1)) == CONST_INT
2718 1.1 mrg && INTVAL (XEXP (addr, 1)) > -32768
2719 1.1 mrg && INTVAL (XEXP (addr, 1)) < 32767)
2720 1.1 mrg return base_length - 4;
2721 1.1 mrg
2722 1.1 mrg /* @aa:16 is 4 bytes shorter than the longest. */
2723 1.1 mrg if (h8300_tiny_constant_address_p (addr))
2724 1.1 mrg return base_length - 4;
2725 1.1 mrg
2726 1.1 mrg /* @aa:24 is 2 bytes shorter than the longest. */
2727 1.1 mrg if (CONSTANT_P (addr))
2728 1.1 mrg return base_length - 2;
2729 1.1 mrg
2730 1.1 mrg return base_length;
2731 1.1 mrg }
2732 1.1 mrg
2733 1.1 mrg /* Output an addition insn. */
2735 1.1 mrg
2736 1.1 mrg const char *
2737 1.1 mrg output_plussi (rtx *operands, bool need_flags)
2738 1.1 mrg {
2739 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
2740 1.1 mrg
2741 1.1 mrg gcc_assert (mode == SImode);
2742 1.1 mrg
2743 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT
2744 1.1 mrg && register_operand (operands[1], VOIDmode))
2745 1.1 mrg {
2746 1.1 mrg HOST_WIDE_INT intval = INTVAL (operands[2]);
2747 1.1 mrg
2748 1.1 mrg if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2749 1.1 mrg return "add.l\t%S2,%S0";
2750 1.1 mrg if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2751 1.1 mrg return "sub.l\t%G2,%S0";
2752 1.1 mrg
2753 1.1 mrg /* See if we can finish with 2 bytes. */
2754 1.1 mrg
2755 1.1 mrg switch ((unsigned int) intval & 0xffffffff)
2756 1.1 mrg {
2757 1.1 mrg /* INC/DEC set the flags, but adds/subs do not. So if we
2758 1.1 mrg need flags, use the former and not the latter. */
2759 1.1 mrg case 0x00000001:
2760 1.1 mrg if (need_flags)
2761 1.1 mrg return "inc.l\t#1,%S0";
2762 1.1 mrg else
2763 1.1 mrg return "adds\t%2,%S0";
2764 1.1 mrg case 0x00000002:
2765 1.1 mrg if (need_flags)
2766 1.1 mrg return "inc.l\t#2,%S0";
2767 1.1 mrg else
2768 1.1 mrg return "adds\t%2,%S0";
2769 1.1 mrg case 0xffffffff:
2770 1.1 mrg if (need_flags)
2771 1.1 mrg return "dec.l\t#1,%S0";
2772 1.1 mrg else
2773 1.1 mrg return "subs\t%G2,%S0";
2774 1.1 mrg case 0xfffffffe:
2775 1.1 mrg if (need_flags)
2776 1.1 mrg return "dec.l\t#2,%S0";
2777 1.1 mrg else
2778 1.1 mrg return "subs\t%G2,%S0";
2779 1.1 mrg
2780 1.1 mrg /* These six cases have optimized paths when we do not
2781 1.1 mrg need flags. Otherwise we let them fallthru. */
2782 1.1 mrg case 0x00000004:
2783 1.1 mrg if (!need_flags)
2784 1.1 mrg return "adds\t%2,%S0";
2785 1.1 mrg
2786 1.1 mrg /* FALLTHRU */
2787 1.1 mrg
2788 1.1 mrg case 0xfffffffc:
2789 1.1 mrg if (!need_flags)
2790 1.1 mrg return "subs\t%G2,%S0";
2791 1.1 mrg
2792 1.1 mrg /* FALLTHRU */
2793 1.1 mrg
2794 1.1 mrg case 0x00010000:
2795 1.1 mrg case 0x00020000:
2796 1.1 mrg if (!need_flags)
2797 1.1 mrg {
2798 1.1 mrg operands[2] = GEN_INT (intval >> 16);
2799 1.1 mrg return "inc.w\t%2,%e0";
2800 1.1 mrg }
2801 1.1 mrg
2802 1.1 mrg /* FALLTHRU */
2803 1.1 mrg
2804 1.1 mrg case 0xffff0000:
2805 1.1 mrg case 0xfffe0000:
2806 1.1 mrg if (!need_flags)
2807 1.1 mrg {
2808 1.1 mrg operands[2] = GEN_INT (intval >> 16);
2809 1.1 mrg return "dec.w\t%G2,%e0";
2810 1.1 mrg }
2811 1.1 mrg
2812 1.1 mrg /* FALLTHRU */
2813 1.1 mrg
2814 1.1 mrg }
2815 1.1 mrg
2816 1.1 mrg /* See if we can finish with 4 bytes. */
2817 1.1 mrg if ((intval & 0xffff) == 0)
2818 1.1 mrg {
2819 1.1 mrg operands[2] = GEN_INT (intval >> 16);
2820 1.1 mrg return "add.w\t%2,%e0";
2821 1.1 mrg }
2822 1.1 mrg }
2823 1.1 mrg
2824 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
2825 1.1 mrg {
2826 1.1 mrg operands[2] = GEN_INT (-INTVAL (operands[2]));
2827 1.1 mrg return "sub.l\t%S2,%S0";
2828 1.1 mrg }
2829 1.1 mrg return "add.l\t%S2,%S0";
2830 1.1 mrg }
2831 1.1 mrg
2832 1.1 mrg /* ??? It would be much easier to add the h8sx stuff if a single function
2833 1.1 mrg classified the addition as either inc/dec, adds/subs, add.w or add.l. */
2834 1.1 mrg /* Compute the length of an addition insn. */
2835 1.1 mrg
2836 1.1 mrg unsigned int
2837 1.1 mrg compute_plussi_length (rtx *operands, bool need_flags)
2838 1.1 mrg {
2839 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
2840 1.1 mrg
2841 1.1 mrg gcc_assert (mode == SImode);
2842 1.1 mrg
2843 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT
2844 1.1 mrg && register_operand (operands[1], VOIDmode))
2845 1.1 mrg {
2846 1.1 mrg HOST_WIDE_INT intval = INTVAL (operands[2]);
2847 1.1 mrg
2848 1.1 mrg if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2849 1.1 mrg return 2;
2850 1.1 mrg if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2851 1.1 mrg return 2;
2852 1.1 mrg
2853 1.1 mrg /* See if we can finish with 2 bytes. */
2854 1.1 mrg
2855 1.1 mrg switch ((unsigned int) intval & 0xffffffff)
2856 1.1 mrg {
2857 1.1 mrg case 0x00000001:
2858 1.1 mrg case 0x00000002:
2859 1.1 mrg return 2;
2860 1.1 mrg case 0x00000004:
2861 1.1 mrg if (need_flags)
2862 1.1 mrg return 6;
2863 1.1 mrg else
2864 1.1 mrg return 2;
2865 1.1 mrg
2866 1.1 mrg case 0xffffffff:
2867 1.1 mrg case 0xfffffffe:
2868 1.1 mrg return 2;
2869 1.1 mrg case 0xfffffffc:
2870 1.1 mrg if (need_flags)
2871 1.1 mrg return 6;
2872 1.1 mrg else
2873 1.1 mrg return 2;
2874 1.1 mrg
2875 1.1 mrg case 0x00010000:
2876 1.1 mrg case 0x00020000:
2877 1.1 mrg if (!need_flags)
2878 1.1 mrg return 2;
2879 1.1 mrg
2880 1.1 mrg /* FALLTHRU */
2881 1.1 mrg
2882 1.1 mrg case 0xffff0000:
2883 1.1 mrg case 0xfffe0000:
2884 1.1 mrg if (!need_flags)
2885 1.1 mrg return 2;
2886 1.1 mrg
2887 1.1 mrg /* FALLTHRU */
2888 1.1 mrg
2889 1.1 mrg }
2890 1.1 mrg
2891 1.1 mrg /* See if we can finish with 4 bytes. */
2892 1.1 mrg if ((intval & 0xffff) == 0)
2893 1.1 mrg return 4;
2894 1.1 mrg }
2895 1.1 mrg
2896 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
2897 1.1 mrg return h8300_length_from_table (operands[0],
2898 1.1 mrg GEN_INT (-INTVAL (operands[2])),
2899 1.1 mrg &addl_length_table);
2900 1.1 mrg else
2901 1.1 mrg return h8300_length_from_table (operands[0], operands[2],
2902 1.1 mrg &addl_length_table);
2903 1.1 mrg }
2904 1.1 mrg
2905 1.1 mrg /* Compute which flag bits are valid after an addition insn. */
2906 1.1 mrg
2907 1.1 mrg enum attr_old_cc
2908 1.1 mrg compute_plussi_cc (rtx *operands)
2909 1.1 mrg {
2910 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
2911 1.1 mrg
2912 1.1 mrg gcc_assert (mode == SImode);
2913 1.1 mrg
2914 1.1 mrg if (GET_CODE (operands[2]) == CONST_INT
2915 1.1 mrg && register_operand (operands[1], VOIDmode))
2916 1.1 mrg {
2917 1.1 mrg HOST_WIDE_INT intval = INTVAL (operands[2]);
2918 1.1 mrg
2919 1.1 mrg if (TARGET_H8300SX && (intval >= 1 && intval <= 7))
2920 1.1 mrg return OLD_CC_SET_ZN;
2921 1.1 mrg if (TARGET_H8300SX && (intval >= -7 && intval <= -1))
2922 1.1 mrg return OLD_CC_SET_ZN;
2923 1.1 mrg
2924 1.1 mrg /* See if we can finish with 2 bytes. */
2925 1.1 mrg
2926 1.1 mrg switch ((unsigned int) intval & 0xffffffff)
2927 1.1 mrg {
2928 1.1 mrg case 0x00000001:
2929 1.1 mrg case 0x00000002:
2930 1.1 mrg case 0x00000004:
2931 1.1 mrg return OLD_CC_NONE_0HIT;
2932 1.1 mrg
2933 1.1 mrg case 0xffffffff:
2934 1.1 mrg case 0xfffffffe:
2935 1.1 mrg case 0xfffffffc:
2936 1.1 mrg return OLD_CC_NONE_0HIT;
2937 1.1 mrg
2938 1.1 mrg case 0x00010000:
2939 1.1 mrg case 0x00020000:
2940 1.1 mrg return OLD_CC_CLOBBER;
2941 1.1 mrg
2942 1.1 mrg case 0xffff0000:
2943 1.1 mrg case 0xfffe0000:
2944 1.1 mrg return OLD_CC_CLOBBER;
2945 1.1 mrg }
2946 1.1 mrg
2947 1.1 mrg /* See if we can finish with 4 bytes. */
2948 1.1 mrg if ((intval & 0xffff) == 0)
2949 1.1 mrg return OLD_CC_CLOBBER;
2950 1.1 mrg }
2951 1.1 mrg
2952 1.1 mrg return OLD_CC_SET_ZN;
2953 1.1 mrg }
2954 1.1 mrg
2955 1.1 mrg /* Output a logical insn. */
2957 1.1 mrg
2958 1.1 mrg const char *
2959 1.1 mrg output_logical_op (machine_mode mode, rtx_code code, rtx *operands, rtx_insn *insn)
2960 1.1 mrg {
2961 1.1 mrg /* Pretend that every byte is affected if both operands are registers. */
2962 1.1 mrg const unsigned HOST_WIDE_INT intval =
2963 1.1 mrg (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
2964 1.1 mrg /* Always use the full instruction if the
2965 1.1 mrg first operand is in memory. It is better
2966 1.1 mrg to use define_splits to generate the shorter
2967 1.1 mrg sequence where valid. */
2968 1.1 mrg && register_operand (operands[1], VOIDmode)
2969 1.1 mrg ? INTVAL (operands[2]) : 0x55555555);
2970 1.1 mrg /* The determinant of the algorithm. If we perform an AND, 0
2971 1.1 mrg affects a bit. Otherwise, 1 affects a bit. */
2972 1.1 mrg const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
2973 1.1 mrg /* Break up DET into pieces. */
2974 1.1 mrg const unsigned HOST_WIDE_INT b0 = (det >> 0) & 0xff;
2975 1.1 mrg const unsigned HOST_WIDE_INT b1 = (det >> 8) & 0xff;
2976 1.1 mrg const unsigned HOST_WIDE_INT w0 = (det >> 0) & 0xffff;
2977 1.1 mrg const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
2978 1.1 mrg int lower_half_easy_p = 0;
2979 1.1 mrg int upper_half_easy_p = 0;
2980 1.1 mrg /* The name of an insn. */
2981 1.1 mrg const char *opname;
2982 1.1 mrg char insn_buf[100];
2983 1.1 mrg
2984 1.1 mrg /* INSN is the current insn, we examine its overall form to see if we're
2985 1.1 mrg supposed to set or clobber the condition codes.
2986 1.1 mrg
2987 1.1 mrg This is important to know. If we are setting condition codes, then we
2988 1.1 mrg must do the operation in MODE and not in some smaller size.
2989 1.1 mrg
2990 1.1 mrg The key is to look at the second object in the PARALLEL. If it is not
2991 1.1 mrg a CLOBBER, then we care about the condition codes. */
2992 1.1 mrg rtx pattern = PATTERN (insn);
2993 1.1 mrg gcc_assert (GET_CODE (pattern) == PARALLEL);
2994 1.1 mrg rtx second_op = XVECEXP (pattern, 0, 1);
2995 1.1 mrg bool cc_meaningful = (GET_CODE (second_op) != CLOBBER);
2996 1.1 mrg
2997 1.1 mrg switch (code)
2998 1.1 mrg {
2999 1.1 mrg case AND:
3000 1.1 mrg opname = "and";
3001 1.1 mrg break;
3002 1.1 mrg case IOR:
3003 1.1 mrg opname = "or";
3004 1.1 mrg break;
3005 1.1 mrg case XOR:
3006 1.1 mrg opname = "xor";
3007 1.1 mrg break;
3008 1.1 mrg default:
3009 1.1 mrg gcc_unreachable ();
3010 1.1 mrg }
3011 1.1 mrg
3012 1.1 mrg switch (mode)
3013 1.1 mrg {
3014 1.1 mrg case E_QImode:
3015 1.1 mrg sprintf (insn_buf, "%s.b\t%%X2,%%X0", opname);
3016 1.1 mrg output_asm_insn (insn_buf, operands);
3017 1.1 mrg break;
3018 1.1 mrg case E_HImode:
3019 1.1 mrg /* First, see if we can (or must) finish with one insn. */
3020 1.1 mrg if (cc_meaningful
3021 1.1 mrg || (b0 != 0 && b1 != 0))
3022 1.1 mrg {
3023 1.1 mrg sprintf (insn_buf, "%s.w\t%%T2,%%T0", opname);
3024 1.1 mrg output_asm_insn (insn_buf, operands);
3025 1.1 mrg }
3026 1.1 mrg else
3027 1.1 mrg {
3028 1.1 mrg /* Take care of the lower byte. */
3029 1.1 mrg if (b0 != 0)
3030 1.1 mrg {
3031 1.1 mrg sprintf (insn_buf, "%s\t%%s2,%%s0", opname);
3032 1.1 mrg output_asm_insn (insn_buf, operands);
3033 1.1 mrg }
3034 1.1 mrg /* Take care of the upper byte. */
3035 1.1 mrg if (b1 != 0)
3036 1.1 mrg {
3037 1.1 mrg sprintf (insn_buf, "%s\t%%t2,%%t0", opname);
3038 1.1 mrg output_asm_insn (insn_buf, operands);
3039 1.1 mrg }
3040 1.1 mrg }
3041 1.1 mrg break;
3042 1.1 mrg case E_SImode:
3043 1.1 mrg /* Determine if the lower half can be taken care of in no more
3044 1.1 mrg than two bytes. */
3045 1.1 mrg lower_half_easy_p = (b0 == 0
3046 1.1 mrg || b1 == 0
3047 1.1 mrg || (code != IOR && w0 == 0xffff));
3048 1.1 mrg
3049 1.1 mrg /* Determine if the upper half can be taken care of in no more
3050 1.1 mrg than two bytes. */
3051 1.1 mrg upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3052 1.1 mrg || (code == AND && w1 == 0xff00));
3053 1.1 mrg
3054 1.1 mrg /* Check if doing everything with one insn is no worse than
3055 1.1 mrg using multiple insns. */
3056 1.1 mrg if (cc_meaningful
3057 1.1 mrg || (w0 != 0 && w1 != 0
3058 1.1 mrg && !(lower_half_easy_p && upper_half_easy_p)
3059 1.1 mrg && !(code == IOR && w1 == 0xffff
3060 1.1 mrg && (w0 & 0x8000) != 0 && lower_half_easy_p)))
3061 1.1 mrg {
3062 1.1 mrg sprintf (insn_buf, "%s.l\t%%S2,%%S0", opname);
3063 1.1 mrg output_asm_insn (insn_buf, operands);
3064 1.1 mrg }
3065 1.1 mrg else
3066 1.1 mrg {
3067 1.1 mrg /* Take care of the lower and upper words individually. For
3068 1.1 mrg each word, we try different methods in the order of
3069 1.1 mrg
3070 1.1 mrg 1) the special insn (in case of AND or XOR),
3071 1.1 mrg 2) the word-wise insn, and
3072 1.1 mrg 3) The byte-wise insn. */
3073 1.1 mrg if (w0 == 0xffff && (code != IOR))
3074 1.1 mrg output_asm_insn ((code == AND)
3075 1.1 mrg ? "sub.w\t%f0,%f0" : "not.w\t%f0",
3076 1.1 mrg operands);
3077 1.1 mrg else if ((b0 != 0) && (b1 != 0))
3078 1.1 mrg {
3079 1.1 mrg sprintf (insn_buf, "%s.w\t%%f2,%%f0", opname);
3080 1.1 mrg output_asm_insn (insn_buf, operands);
3081 1.1 mrg }
3082 1.1 mrg else
3083 1.1 mrg {
3084 1.1 mrg if (b0 != 0)
3085 1.1 mrg {
3086 1.1 mrg sprintf (insn_buf, "%s\t%%w2,%%w0", opname);
3087 1.1 mrg output_asm_insn (insn_buf, operands);
3088 1.1 mrg }
3089 1.1 mrg if (b1 != 0)
3090 1.1 mrg {
3091 1.1 mrg sprintf (insn_buf, "%s\t%%x2,%%x0", opname);
3092 1.1 mrg output_asm_insn (insn_buf, operands);
3093 1.1 mrg }
3094 1.1 mrg }
3095 1.1 mrg
3096 1.1 mrg if ((w1 == 0xffff) && (code != IOR))
3097 1.1 mrg output_asm_insn ((code == AND)
3098 1.1 mrg ? "sub.w\t%e0,%e0" : "not.w\t%e0",
3099 1.1 mrg operands);
3100 1.1 mrg else if (code == IOR
3101 1.1 mrg && w1 == 0xffff
3102 1.1 mrg && (w0 & 0x8000) != 0)
3103 1.1 mrg {
3104 1.1 mrg output_asm_insn ("exts.l\t%S0", operands);
3105 1.1 mrg }
3106 1.1 mrg else if (code == AND
3107 1.1 mrg && w1 == 0xff00)
3108 1.1 mrg {
3109 1.1 mrg output_asm_insn ("extu.w\t%e0", operands);
3110 1.1 mrg }
3111 1.1 mrg else
3112 1.1 mrg {
3113 1.1 mrg if (w1 != 0)
3114 1.1 mrg {
3115 1.1 mrg sprintf (insn_buf, "%s.w\t%%e2,%%e0", opname);
3116 1.1 mrg output_asm_insn (insn_buf, operands);
3117 1.1 mrg }
3118 1.1 mrg }
3119 1.1 mrg }
3120 1.1 mrg break;
3121 1.1 mrg default:
3122 1.1 mrg gcc_unreachable ();
3123 1.1 mrg }
3124 1.1 mrg return "";
3125 1.1 mrg }
3126 1.1 mrg
3127 1.1 mrg /* Compute the length of a logical insn. */
3128 1.1 mrg
3129 1.1 mrg unsigned int
3130 1.1 mrg compute_logical_op_length (machine_mode mode, rtx_code code, rtx *operands, rtx_insn *insn)
3131 1.1 mrg {
3132 1.1 mrg /* Pretend that every byte is affected if both operands are registers. */
3133 1.1 mrg const unsigned HOST_WIDE_INT intval =
3134 1.1 mrg (unsigned HOST_WIDE_INT) ((GET_CODE (operands[2]) == CONST_INT)
3135 1.1 mrg /* Always use the full instruction if the
3136 1.1 mrg first operand is in memory. It is better
3137 1.1 mrg to use define_splits to generate the shorter
3138 1.1 mrg sequence where valid. */
3139 1.1 mrg && register_operand (operands[1], VOIDmode)
3140 1.1 mrg ? INTVAL (operands[2]) : 0x55555555);
3141 1.1 mrg /* The determinant of the algorithm. If we perform an AND, 0
3142 1.1 mrg affects a bit. Otherwise, 1 affects a bit. */
3143 1.1 mrg const unsigned HOST_WIDE_INT det = (code != AND) ? intval : ~intval;
3144 1.1 mrg /* Break up DET into pieces. */
3145 1.1 mrg const unsigned HOST_WIDE_INT b0 = (det >> 0) & 0xff;
3146 1.1 mrg const unsigned HOST_WIDE_INT b1 = (det >> 8) & 0xff;
3147 1.1 mrg const unsigned HOST_WIDE_INT w0 = (det >> 0) & 0xffff;
3148 1.1 mrg const unsigned HOST_WIDE_INT w1 = (det >> 16) & 0xffff;
3149 1.1 mrg int lower_half_easy_p = 0;
3150 1.1 mrg int upper_half_easy_p = 0;
3151 1.1 mrg /* Insn length. */
3152 1.1 mrg unsigned int length = 0;
3153 1.1 mrg
3154 1.1 mrg /* INSN is the current insn, we examine its overall form to see if we're
3155 1.1 mrg supposed to set or clobber the condition codes.
3156 1.1 mrg
3157 1.1 mrg This is important to know. If we are setting condition codes, then we
3158 1.1 mrg must do the operation in MODE and not in some smaller size.
3159 1.1 mrg
3160 1.1 mrg The key is to look at the second object in the PARALLEL. If it is not
3161 1.1 mrg a CLOBBER, then we care about the condition codes. */
3162 1.1 mrg bool cc_meaningful = false;
3163 1.1 mrg if (insn)
3164 1.1 mrg {
3165 1.1 mrg rtx pattern = PATTERN (insn);
3166 1.1 mrg gcc_assert (GET_CODE (pattern) == PARALLEL);
3167 1.1 mrg rtx second_op = XVECEXP (pattern, 0, 1);
3168 1.1 mrg cc_meaningful = (GET_CODE (second_op) != CLOBBER);
3169 1.1 mrg }
3170 1.1 mrg
3171 1.1 mrg switch (mode)
3172 1.1 mrg {
3173 1.1 mrg case E_QImode:
3174 1.1 mrg return 2;
3175 1.1 mrg
3176 1.1 mrg case E_HImode:
3177 1.1 mrg /* First, see if we can finish with one insn. */
3178 1.1 mrg if (cc_meaningful
3179 1.1 mrg || (b0 != 0 && b1 != 0))
3180 1.1 mrg {
3181 1.1 mrg length = h8300_length_from_table (operands[1], operands[2],
3182 1.1 mrg &logicw_length_table);
3183 1.1 mrg }
3184 1.1 mrg else
3185 1.1 mrg {
3186 1.1 mrg /* Take care of the lower byte. */
3187 1.1 mrg if (b0 != 0)
3188 1.1 mrg length += 2;
3189 1.1 mrg
3190 1.1 mrg /* Take care of the upper byte. */
3191 1.1 mrg if (b1 != 0)
3192 1.1 mrg length += 2;
3193 1.1 mrg }
3194 1.1 mrg break;
3195 1.1 mrg case E_SImode:
3196 1.1 mrg /* Determine if the lower half can be taken care of in no more
3197 1.1 mrg than two bytes. */
3198 1.1 mrg lower_half_easy_p = (b0 == 0
3199 1.1 mrg || b1 == 0
3200 1.1 mrg || (code != IOR && w0 == 0xffff));
3201 1.1 mrg
3202 1.1 mrg /* Determine if the upper half can be taken care of in no more
3203 1.1 mrg than two bytes. */
3204 1.1 mrg upper_half_easy_p = ((code != IOR && w1 == 0xffff)
3205 1.1 mrg || (code == AND && w1 == 0xff00));
3206 1.1 mrg
3207 1.1 mrg /* Check if doing everything with one insn is no worse than
3208 1.1 mrg using multiple insns. */
3209 1.1 mrg if (cc_meaningful
3210 1.1 mrg || (w0 != 0 && w1 != 0
3211 1.1 mrg && !(lower_half_easy_p && upper_half_easy_p)
3212 1.1 mrg && !(code == IOR && w1 == 0xffff
3213 1.1 mrg && (w0 & 0x8000) != 0 && lower_half_easy_p)))
3214 1.1 mrg {
3215 1.1 mrg length = h8300_length_from_table (operands[1], operands[2],
3216 1.1 mrg &logicl_length_table);
3217 1.1 mrg }
3218 1.1 mrg else
3219 1.1 mrg {
3220 1.1 mrg /* Take care of the lower and upper words individually. For
3221 1.1 mrg each word, we try different methods in the order of
3222 1.1 mrg
3223 1.1 mrg 1) the special insn (in case of AND or XOR),
3224 1.1 mrg 2) the word-wise insn, and
3225 1.1 mrg 3) The byte-wise insn. */
3226 1.1 mrg if (w0 == 0xffff && (code != IOR))
3227 1.1 mrg {
3228 1.1 mrg length += 2;
3229 1.1 mrg }
3230 1.1 mrg else if ((b0 != 0) && (b1 != 0))
3231 1.1 mrg {
3232 1.1 mrg length += 4;
3233 1.1 mrg }
3234 1.1 mrg else
3235 1.1 mrg {
3236 1.1 mrg if (b0 != 0)
3237 1.1 mrg length += 2;
3238 1.1 mrg
3239 1.1 mrg if (b1 != 0)
3240 1.1 mrg length += 2;
3241 1.1 mrg }
3242 1.1 mrg
3243 1.1 mrg if (w1 == 0xffff && (code != IOR))
3244 1.1 mrg {
3245 1.1 mrg length += 2;
3246 1.1 mrg }
3247 1.1 mrg else if (code == IOR
3248 1.1 mrg && w1 == 0xffff
3249 1.1 mrg && (w0 & 0x8000) != 0)
3250 1.1 mrg {
3251 1.1 mrg length += 2;
3252 1.1 mrg }
3253 1.1 mrg else if (code == AND && w1 == 0xff00)
3254 1.1 mrg {
3255 1.1 mrg length += 2;
3256 1.1 mrg }
3257 1.1 mrg else
3258 1.1 mrg {
3259 1.1 mrg if (w1 != 0)
3260 1.1 mrg length += 4;
3261 1.1 mrg }
3262 1.1 mrg }
3263 1.1 mrg break;
3264 1.1 mrg default:
3265 1.1 mrg gcc_unreachable ();
3266 1.1 mrg }
3267 1.1 mrg return length;
3268 1.1 mrg }
3269 1.1 mrg
3270 1.1 mrg #if 0
3271 1.1 mrg
3272 1.1 mrg /* Expand a conditional store. */
3274 1.1 mrg
3275 1.1 mrg void
3276 1.1 mrg h8300_expand_store (rtx operands[])
3277 1.1 mrg {
3278 1.1 mrg rtx dest = operands[0];
3279 1.1 mrg enum rtx_code code = GET_CODE (operands[1]);
3280 1.1 mrg rtx op0 = operands[2];
3281 1.1 mrg rtx op1 = operands[3];
3282 1.1 mrg rtx tmp;
3283 1.1 mrg
3284 1.1 mrg tmp = gen_rtx_COMPARE (VOIDmode, op0, op1);
3285 1.1 mrg emit_insn (gen_rtx_SET (cc0_rtx, tmp));
3286 1.1 mrg
3287 1.1 mrg tmp = gen_rtx_fmt_ee (code, GET_MODE (dest), cc0_rtx, const0_rtx);
3288 1.1 mrg emit_insn (gen_rtx_SET (dest, tmp));
3289 1.1 mrg }
3290 1.1 mrg #endif
3291 1.1 mrg
3292 1.1 mrg /* Shifts.
3294 1.1 mrg
3295 1.1 mrg We devote a fair bit of code to getting efficient shifts since we
3296 1.1 mrg can only shift one bit at a time on the H8/300 and H8/300H and only
3297 1.1 mrg one or two bits at a time on the H8S.
3298 1.1 mrg
3299 1.1 mrg All shift code falls into one of the following ways of
3300 1.1 mrg implementation:
3301 1.1 mrg
3302 1.1 mrg o SHIFT_INLINE: Emit straight line code for the shift; this is used
3303 1.1 mrg when a straight line shift is about the same size or smaller than
3304 1.1 mrg a loop.
3305 1.1 mrg
3306 1.1 mrg o SHIFT_ROT_AND: Rotate the value the opposite direction, then mask
3307 1.1 mrg off the bits we don't need. This is used when only a few of the
3308 1.1 mrg bits in the original value will survive in the shifted value.
3309 1.1 mrg
3310 1.1 mrg o SHIFT_SPECIAL: Often it's possible to move a byte or a word to
3311 1.1 mrg simulate a shift by 8, 16, or 24 bits. Once moved, a few inline
3312 1.1 mrg shifts can be added if the shift count is slightly more than 8 or
3313 1.1 mrg 16. This case also includes other oddballs that are not worth
3314 1.1 mrg explaining here.
3315 1.1 mrg
3316 1.1 mrg o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
3317 1.1 mrg
3318 1.1 mrg For each shift count, we try to use code that has no trade-off
3319 1.1 mrg between code size and speed whenever possible.
3320 1.1 mrg
3321 1.1 mrg If the trade-off is unavoidable, we try to be reasonable.
3322 1.1 mrg Specifically, the fastest version is one instruction longer than
3323 1.1 mrg the shortest version, we take the fastest version. We also provide
3324 1.1 mrg the use a way to switch back to the shortest version with -Os.
3325 1.1 mrg
3326 1.1 mrg For the details of the shift algorithms for various shift counts,
3327 1.1 mrg refer to shift_alg_[qhs]i. */
3328 1.1 mrg
3329 1.1 mrg /* Classify a shift with the given mode and code. OP is the shift amount. */
3330 1.1 mrg
3331 1.1 mrg enum h8sx_shift_type
3332 1.1 mrg h8sx_classify_shift (machine_mode mode, enum rtx_code code, rtx op)
3333 1.1 mrg {
3334 1.1 mrg if (!TARGET_H8300SX)
3335 1.1 mrg return H8SX_SHIFT_NONE;
3336 1.1 mrg
3337 1.1 mrg switch (code)
3338 1.1 mrg {
3339 1.1 mrg case ASHIFT:
3340 1.1 mrg case LSHIFTRT:
3341 1.1 mrg /* Check for variable shifts (shll Rs,Rd and shlr Rs,Rd). */
3342 1.1 mrg if (GET_CODE (op) != CONST_INT)
3343 1.1 mrg return H8SX_SHIFT_BINARY;
3344 1.1 mrg
3345 1.1 mrg /* Reject out-of-range shift amounts. */
3346 1.1 mrg if (INTVAL (op) <= 0 || INTVAL (op) >= GET_MODE_BITSIZE (mode))
3347 1.1 mrg return H8SX_SHIFT_NONE;
3348 1.1 mrg
3349 1.1 mrg /* Power-of-2 shifts are effectively unary operations. */
3350 1.1 mrg if (exact_log2 (INTVAL (op)) >= 0)
3351 1.1 mrg return H8SX_SHIFT_UNARY;
3352 1.1 mrg
3353 1.1 mrg return H8SX_SHIFT_BINARY;
3354 1.1 mrg
3355 1.1 mrg case ASHIFTRT:
3356 1.1 mrg if (op == const1_rtx || op == const2_rtx)
3357 1.1 mrg return H8SX_SHIFT_UNARY;
3358 1.1 mrg return H8SX_SHIFT_NONE;
3359 1.1 mrg
3360 1.1 mrg case ROTATE:
3361 1.1 mrg if (GET_CODE (op) == CONST_INT
3362 1.1 mrg && (INTVAL (op) == 1
3363 1.1 mrg || INTVAL (op) == 2
3364 1.1 mrg || INTVAL (op) == GET_MODE_BITSIZE (mode) - 2
3365 1.1 mrg || INTVAL (op) == GET_MODE_BITSIZE (mode) - 1))
3366 1.1 mrg return H8SX_SHIFT_UNARY;
3367 1.1 mrg return H8SX_SHIFT_NONE;
3368 1.1 mrg
3369 1.1 mrg default:
3370 1.1 mrg return H8SX_SHIFT_NONE;
3371 1.1 mrg }
3372 1.1 mrg }
3373 1.1 mrg
3374 1.1 mrg /* Return the asm template for a single h8sx shift instruction.
3375 1.1 mrg OPERANDS[0] and OPERANDS[1] are the destination, OPERANDS[2]
3376 1.1 mrg is the source and OPERANDS[3] is the shift. SUFFIX is the
3377 1.1 mrg size suffix ('b', 'w' or 'l') and OPTYPE is the h8300_print_operand
3378 1.1 mrg prefix for the destination operand. */
3379 1.1 mrg
3380 1.1 mrg const char *
3381 1.1 mrg output_h8sx_shift (rtx *operands, int suffix, int optype)
3382 1.1 mrg {
3383 1.1 mrg static char buffer[16];
3384 1.1 mrg const char *stem;
3385 1.1 mrg
3386 1.1 mrg switch (GET_CODE (operands[3]))
3387 1.1 mrg {
3388 1.1 mrg case ASHIFT:
3389 1.1 mrg stem = "shll";
3390 1.1 mrg break;
3391 1.1 mrg
3392 1.1 mrg case ASHIFTRT:
3393 1.1 mrg stem = "shar";
3394 1.1 mrg break;
3395 1.1 mrg
3396 1.1 mrg case LSHIFTRT:
3397 1.1 mrg stem = "shlr";
3398 1.1 mrg break;
3399 1.1 mrg
3400 1.1 mrg case ROTATE:
3401 1.1 mrg stem = "rotl";
3402 1.1 mrg if (INTVAL (operands[2]) > 2)
3403 1.1 mrg {
3404 1.1 mrg /* This is really a right rotate. */
3405 1.1 mrg operands[2] = GEN_INT (GET_MODE_BITSIZE (GET_MODE (operands[0]))
3406 1.1 mrg - INTVAL (operands[2]));
3407 1.1 mrg stem = "rotr";
3408 1.1 mrg }
3409 1.1 mrg break;
3410 1.1 mrg
3411 1.1 mrg default:
3412 1.1 mrg gcc_unreachable ();
3413 1.1 mrg }
3414 1.1 mrg if (operands[2] == const1_rtx)
3415 1.1 mrg sprintf (buffer, "%s.%c\t%%%c0", stem, suffix, optype);
3416 1.1 mrg else
3417 1.1 mrg sprintf (buffer, "%s.%c\t%%X2,%%%c0", stem, suffix, optype);
3418 1.1 mrg return buffer;
3419 1.1 mrg }
3420 1.1 mrg
3421 1.1 mrg /* Emit code to do shifts. */
3422 1.1 mrg
3423 1.1 mrg bool
3424 1.1 mrg expand_a_shift (machine_mode mode, enum rtx_code code, rtx operands[])
3425 1.1 mrg {
3426 1.1 mrg switch (h8sx_classify_shift (mode, code, operands[2]))
3427 1.1 mrg {
3428 1.1 mrg case H8SX_SHIFT_BINARY:
3429 1.1 mrg operands[1] = force_reg (mode, operands[1]);
3430 1.1 mrg return false;
3431 1.1 mrg
3432 1.1 mrg case H8SX_SHIFT_UNARY:
3433 1.1 mrg return false;
3434 1.1 mrg
3435 1.1 mrg case H8SX_SHIFT_NONE:
3436 1.1 mrg break;
3437 1.1 mrg }
3438 1.1 mrg
3439 1.1 mrg /* Need a loop to get all the bits we want - we generate the
3440 1.1 mrg code at emit time, but need to allocate a scratch reg now. */
3441 1.1 mrg emit_move_insn (copy_rtx (operands[0]), operands[1]);
3442 1.1 mrg if (operands[2] == CONST0_RTX (QImode))
3443 1.1 mrg ;
3444 1.1 mrg else if (GET_CODE (operands[2]) == CONST_INT
3445 1.1 mrg && !h8300_shift_needs_scratch_p (INTVAL (operands[2]), mode, code))
3446 1.1 mrg emit_insn (gen_rtx_SET (copy_rtx (operands[0]),
3447 1.1 mrg gen_rtx_fmt_ee (code, mode,
3448 1.1 mrg copy_rtx (operands[1]), operands[2])));
3449 1.1 mrg else
3450 1.1 mrg emit_insn (gen_rtx_PARALLEL
3451 1.1 mrg (VOIDmode,
3452 1.1 mrg gen_rtvec (2,
3453 1.1 mrg gen_rtx_SET (copy_rtx (operands[0]),
3454 1.1 mrg gen_rtx_fmt_ee (code, mode,
3455 1.1 mrg copy_rtx (operands[0]), operands[2])),
3456 1.1 mrg gen_rtx_CLOBBER (VOIDmode,
3457 1.1 mrg gen_rtx_SCRATCH (QImode)))));
3458 1.1 mrg return true;
3459 1.1 mrg }
3460 1.1 mrg
3461 1.1 mrg /* Symbols of the various modes which can be used as indices. */
3462 1.1 mrg
3463 1.1 mrg enum shift_mode
3464 1.1 mrg {
3465 1.1 mrg QIshift, HIshift, SIshift
3466 1.1 mrg };
3467 1.1 mrg
3468 1.1 mrg /* For single bit shift insns, record assembler and what bits of the
3469 1.1 mrg condition code are valid afterwards (represented as various OLD_CC_FOO
3470 1.1 mrg bits, 0 means CC isn't left in a usable state). */
3471 1.1 mrg
3472 1.1 mrg struct shift_insn
3473 1.1 mrg {
3474 1.1 mrg const char *const assembler;
3475 1.1 mrg const enum attr_old_cc cc_valid;
3476 1.1 mrg };
3477 1.1 mrg
3478 1.1 mrg /* Assembler instruction shift table.
3479 1.1 mrg
3480 1.1 mrg These tables are used to look up the basic shifts.
3481 1.1 mrg They are indexed by cpu, shift_type, and mode. */
3482 1.1 mrg
3483 1.1 mrg static const struct shift_insn shift_one[2][3][3] =
3484 1.1 mrg {
3485 1.1 mrg /* H8/300 */
3486 1.1 mrg {
3487 1.1 mrg /* SHIFT_ASHIFT */
3488 1.1 mrg {
3489 1.1 mrg { "shll\t%X0", OLD_CC_SET_ZNV },
3490 1.1 mrg { "add.w\t%T0,%T0", OLD_CC_SET_ZN },
3491 1.1 mrg { "add.w\t%f0,%f0\n\taddx\t%y0,%y0\n\taddx\t%z0,%z0", OLD_CC_CLOBBER }
3492 1.1 mrg },
3493 1.1 mrg /* SHIFT_LSHIFTRT */
3494 1.1 mrg {
3495 1.1 mrg { "shlr\t%X0", OLD_CC_SET_ZNV },
3496 1.1 mrg { "shlr\t%t0\n\trotxr\t%s0", OLD_CC_CLOBBER },
3497 1.1 mrg { "shlr\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", OLD_CC_CLOBBER }
3498 1.1 mrg },
3499 1.1 mrg /* SHIFT_ASHIFTRT */
3500 1.1 mrg {
3501 1.1 mrg { "shar\t%X0", OLD_CC_SET_ZNV },
3502 1.1 mrg { "shar\t%t0\n\trotxr\t%s0", OLD_CC_CLOBBER },
3503 1.1 mrg { "shar\t%z0\n\trotxr\t%y0\n\trotxr\t%x0\n\trotxr\t%w0", OLD_CC_CLOBBER }
3504 1.1 mrg }
3505 1.1 mrg },
3506 1.1 mrg /* H8/300H */
3507 1.1 mrg {
3508 1.1 mrg /* SHIFT_ASHIFT */
3509 1.1 mrg {
3510 1.1 mrg { "shll.b\t%X0", OLD_CC_SET_ZNV },
3511 1.1 mrg { "shll.w\t%T0", OLD_CC_SET_ZNV },
3512 1.1 mrg { "shll.l\t%S0", OLD_CC_SET_ZNV }
3513 1.1 mrg },
3514 1.1 mrg /* SHIFT_LSHIFTRT */
3515 1.1 mrg {
3516 1.1 mrg { "shlr.b\t%X0", OLD_CC_SET_ZNV },
3517 1.1 mrg { "shlr.w\t%T0", OLD_CC_SET_ZNV },
3518 1.1 mrg { "shlr.l\t%S0", OLD_CC_SET_ZNV }
3519 1.1 mrg },
3520 1.1 mrg /* SHIFT_ASHIFTRT */
3521 1.1 mrg {
3522 1.1 mrg { "shar.b\t%X0", OLD_CC_SET_ZNV },
3523 1.1 mrg { "shar.w\t%T0", OLD_CC_SET_ZNV },
3524 1.1 mrg { "shar.l\t%S0", OLD_CC_SET_ZNV }
3525 1.1 mrg }
3526 1.1 mrg }
3527 1.1 mrg };
3528 1.1 mrg
3529 1.1 mrg static const struct shift_insn shift_two[3][3] =
3530 1.1 mrg {
3531 1.1 mrg /* SHIFT_ASHIFT */
3532 1.1 mrg {
3533 1.1 mrg { "shll.b\t#2,%X0", OLD_CC_SET_ZNV },
3534 1.1 mrg { "shll.w\t#2,%T0", OLD_CC_SET_ZNV },
3535 1.1 mrg { "shll.l\t#2,%S0", OLD_CC_SET_ZNV }
3536 1.1 mrg },
3537 1.1 mrg /* SHIFT_LSHIFTRT */
3538 1.1 mrg {
3539 1.1 mrg { "shlr.b\t#2,%X0", OLD_CC_SET_ZNV },
3540 1.1 mrg { "shlr.w\t#2,%T0", OLD_CC_SET_ZNV },
3541 1.1 mrg { "shlr.l\t#2,%S0", OLD_CC_SET_ZNV }
3542 1.1 mrg },
3543 1.1 mrg /* SHIFT_ASHIFTRT */
3544 1.1 mrg {
3545 1.1 mrg { "shar.b\t#2,%X0", OLD_CC_SET_ZNV },
3546 1.1 mrg { "shar.w\t#2,%T0", OLD_CC_SET_ZNV },
3547 1.1 mrg { "shar.l\t#2,%S0", OLD_CC_SET_ZNV }
3548 1.1 mrg }
3549 1.1 mrg };
3550 1.1 mrg
3551 1.1 mrg /* Rotates are organized by which shift they'll be used in implementing.
3552 1.1 mrg There's no need to record whether the cc is valid afterwards because
3553 1.1 mrg it is the AND insn that will decide this. */
3554 1.1 mrg
3555 1.1 mrg static const char *const rotate_one[2][3][3] =
3556 1.1 mrg {
3557 1.1 mrg /* H8/300 */
3558 1.1 mrg {
3559 1.1 mrg /* SHIFT_ASHIFT */
3560 1.1 mrg {
3561 1.1 mrg "rotr\t%X0",
3562 1.1 mrg "shlr\t%t0\n\trotxr\t%s0\n\tbst\t#7,%t0",
3563 1.1 mrg 0
3564 1.1 mrg },
3565 1.1 mrg /* SHIFT_LSHIFTRT */
3566 1.1 mrg {
3567 1.1 mrg "rotl\t%X0",
3568 1.1 mrg "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3569 1.1 mrg 0
3570 1.1 mrg },
3571 1.1 mrg /* SHIFT_ASHIFTRT */
3572 1.1 mrg {
3573 1.1 mrg "rotl\t%X0",
3574 1.1 mrg "shll\t%s0\n\trotxl\t%t0\n\tbst\t#0,%s0",
3575 1.1 mrg 0
3576 1.1 mrg }
3577 1.1 mrg },
3578 1.1 mrg /* H8/300H */
3579 1.1 mrg {
3580 1.1 mrg /* SHIFT_ASHIFT */
3581 1.1 mrg {
3582 1.1 mrg "rotr.b\t%X0",
3583 1.1 mrg "rotr.w\t%T0",
3584 1.1 mrg "rotr.l\t%S0"
3585 1.1 mrg },
3586 1.1 mrg /* SHIFT_LSHIFTRT */
3587 1.1 mrg {
3588 1.1 mrg "rotl.b\t%X0",
3589 1.1 mrg "rotl.w\t%T0",
3590 1.1 mrg "rotl.l\t%S0"
3591 1.1 mrg },
3592 1.1 mrg /* SHIFT_ASHIFTRT */
3593 1.1 mrg {
3594 1.1 mrg "rotl.b\t%X0",
3595 1.1 mrg "rotl.w\t%T0",
3596 1.1 mrg "rotl.l\t%S0"
3597 1.1 mrg }
3598 1.1 mrg }
3599 1.1 mrg };
3600 1.1 mrg
3601 1.1 mrg static const char *const rotate_two[3][3] =
3602 1.1 mrg {
3603 1.1 mrg /* SHIFT_ASHIFT */
3604 1.1 mrg {
3605 1.1 mrg "rotr.b\t#2,%X0",
3606 1.1 mrg "rotr.w\t#2,%T0",
3607 1.1 mrg "rotr.l\t#2,%S0"
3608 1.1 mrg },
3609 1.1 mrg /* SHIFT_LSHIFTRT */
3610 1.1 mrg {
3611 1.1 mrg "rotl.b\t#2,%X0",
3612 1.1 mrg "rotl.w\t#2,%T0",
3613 1.1 mrg "rotl.l\t#2,%S0"
3614 1.1 mrg },
3615 1.1 mrg /* SHIFT_ASHIFTRT */
3616 1.1 mrg {
3617 1.1 mrg "rotl.b\t#2,%X0",
3618 1.1 mrg "rotl.w\t#2,%T0",
3619 1.1 mrg "rotl.l\t#2,%S0"
3620 1.1 mrg }
3621 1.1 mrg };
3622 1.1 mrg
3623 1.1 mrg struct shift_info {
3624 1.1 mrg /* Shift algorithm. */
3625 1.1 mrg enum shift_alg alg;
3626 1.1 mrg
3627 1.1 mrg /* The number of bits to be shifted by shift1 and shift2. Valid
3628 1.1 mrg when ALG is SHIFT_SPECIAL. */
3629 1.1 mrg unsigned int remainder;
3630 1.1 mrg
3631 1.1 mrg /* Special insn for a shift. Valid when ALG is SHIFT_SPECIAL. */
3632 1.1 mrg const char *special;
3633 1.1 mrg
3634 1.1 mrg /* Insn for a one-bit shift. Valid when ALG is either SHIFT_INLINE
3635 1.1 mrg or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3636 1.1 mrg const char *shift1;
3637 1.1 mrg
3638 1.1 mrg /* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
3639 1.1 mrg or SHIFT_SPECIAL, and REMAINDER is nonzero. */
3640 1.1 mrg const char *shift2;
3641 1.1 mrg
3642 1.1 mrg /* CC status for SHIFT_INLINE. */
3643 1.1 mrg enum attr_old_cc cc_inline;
3644 1.1 mrg
3645 1.1 mrg /* CC status for SHIFT_SPECIAL. */
3646 1.1 mrg enum attr_old_cc cc_special;
3647 1.1 mrg };
3648 1.1 mrg
3649 1.1 mrg static void get_shift_alg (enum shift_type,
3650 1.1 mrg enum shift_mode, unsigned int,
3651 1.1 mrg struct shift_info *);
3652 1.1 mrg
3653 1.1 mrg /* Given SHIFT_TYPE, SHIFT_MODE, and shift count COUNT, determine the
3654 1.1 mrg best algorithm for doing the shift. The assembler code is stored
3655 1.1 mrg in the pointers in INFO. We achieve the maximum efficiency in most
3656 1.1 mrg cases.
3657 1.1 mrg
3658 1.1 mrg We first determine the strategy of the shift algorithm by a table
3659 1.1 mrg lookup. If that tells us to use a hand crafted assembly code, we
3660 1.1 mrg go into the big switch statement to find what that is. Otherwise,
3661 1.1 mrg we resort to a generic way, such as inlining. In either case, the
3662 1.1 mrg result is returned through INFO. */
3663 1.1 mrg
3664 1.1 mrg static void
3665 1.1 mrg get_shift_alg (enum shift_type shift_type, enum shift_mode shift_mode,
3666 1.1 mrg unsigned int count, struct shift_info *info)
3667 1.1 mrg {
3668 1.1 mrg enum h8_cpu cpu;
3669 1.1 mrg
3670 1.1 mrg if (TARGET_H8300S)
3671 1.1 mrg cpu = H8_S;
3672 1.1 mrg else
3673 1.1 mrg cpu = H8_300H;
3674 1.1 mrg
3675 1.1 mrg /* Find the shift algorithm. */
3676 1.1 mrg info->alg = SHIFT_LOOP;
3677 1.1 mrg switch (shift_mode)
3678 1.1 mrg {
3679 1.1 mrg case QIshift:
3680 1.1 mrg if (count < GET_MODE_BITSIZE (QImode))
3681 1.1 mrg info->alg = shift_alg_qi[cpu][shift_type][count];
3682 1.1 mrg break;
3683 1.1 mrg
3684 1.1 mrg case HIshift:
3685 1.1 mrg if (count < GET_MODE_BITSIZE (HImode))
3686 1.1 mrg info->alg = shift_alg_hi[cpu][shift_type][count];
3687 1.1 mrg break;
3688 1.1 mrg
3689 1.1 mrg case SIshift:
3690 1.1 mrg if (count < GET_MODE_BITSIZE (SImode))
3691 1.1 mrg info->alg = shift_alg_si[cpu][shift_type][count];
3692 1.1 mrg break;
3693 1.1 mrg
3694 1.1 mrg default:
3695 1.1 mrg gcc_unreachable ();
3696 1.1 mrg }
3697 1.1 mrg
3698 1.1 mrg /* Fill in INFO. Return unless we have SHIFT_SPECIAL. */
3699 1.1 mrg switch (info->alg)
3700 1.1 mrg {
3701 1.1 mrg case SHIFT_INLINE:
3702 1.1 mrg info->remainder = count;
3703 1.1 mrg /* Fall through. */
3704 1.1 mrg
3705 1.1 mrg case SHIFT_LOOP:
3706 1.1 mrg /* It is up to the caller to know that looping clobbers cc. */
3707 1.1 mrg info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
3708 1.1 mrg info->shift2 = shift_two[shift_type][shift_mode].assembler;
3709 1.1 mrg info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
3710 1.1 mrg goto end;
3711 1.1 mrg
3712 1.1 mrg case SHIFT_ROT_AND:
3713 1.1 mrg info->shift1 = rotate_one[cpu_type][shift_type][shift_mode];
3714 1.1 mrg info->shift2 = rotate_two[shift_type][shift_mode];
3715 1.1 mrg info->cc_inline = OLD_CC_CLOBBER;
3716 1.1 mrg goto end;
3717 1.1 mrg
3718 1.1 mrg case SHIFT_SPECIAL:
3719 1.1 mrg /* REMAINDER is 0 for most cases, so initialize it to 0. */
3720 1.1 mrg info->remainder = 0;
3721 1.1 mrg info->shift1 = shift_one[cpu_type][shift_type][shift_mode].assembler;
3722 1.1 mrg info->shift2 = shift_two[shift_type][shift_mode].assembler;
3723 1.1 mrg info->cc_inline = shift_one[cpu_type][shift_type][shift_mode].cc_valid;
3724 1.1 mrg info->cc_special = OLD_CC_CLOBBER;
3725 1.1 mrg break;
3726 1.1 mrg }
3727 1.1 mrg
3728 1.1 mrg /* Here we only deal with SHIFT_SPECIAL. */
3729 1.1 mrg switch (shift_mode)
3730 1.1 mrg {
3731 1.1 mrg case QIshift:
3732 1.1 mrg /* For ASHIFTRT by 7 bits, the sign bit is simply replicated
3733 1.1 mrg through the entire value. */
3734 1.1 mrg gcc_assert (shift_type == SHIFT_ASHIFTRT && count == 7);
3735 1.1 mrg info->special = "shll\t%X0\n\tsubx\t%X0,%X0";
3736 1.1 mrg goto end;
3737 1.1 mrg
3738 1.1 mrg case HIshift:
3739 1.1 mrg if (count == 7)
3740 1.1 mrg {
3741 1.1 mrg switch (shift_type)
3742 1.1 mrg {
3743 1.1 mrg case SHIFT_ASHIFT:
3744 1.1 mrg info->special = "shar.b\t%t0\n\tmov.b\t%s0,%t0\n\trotxr.w\t%T0\n\tand.b\t#0x80,%s0";
3745 1.1 mrg goto end;
3746 1.1 mrg case SHIFT_LSHIFTRT:
3747 1.1 mrg info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.w\t%T0\n\tand.b\t#0x01,%t0";
3748 1.1 mrg goto end;
3749 1.1 mrg case SHIFT_ASHIFTRT:
3750 1.1 mrg info->special = "shal.b\t%s0\n\tmov.b\t%t0,%s0\n\trotxl.b\t%s0\n\tsubx\t%t0,%t0";
3751 1.1 mrg goto end;
3752 1.1 mrg }
3753 1.1 mrg }
3754 1.1 mrg else if ((count >= 8 && count <= 13)
3755 1.1 mrg || (TARGET_H8300S && count == 14))
3756 1.1 mrg {
3757 1.1 mrg info->remainder = count - 8;
3758 1.1 mrg
3759 1.1 mrg switch (shift_type)
3760 1.1 mrg {
3761 1.1 mrg case SHIFT_ASHIFT:
3762 1.1 mrg info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0";
3763 1.1 mrg goto end;
3764 1.1 mrg case SHIFT_LSHIFTRT:
3765 1.1 mrg info->special = "mov.b\t%t0,%s0\n\textu.w\t%T0";
3766 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3767 1.1 mrg goto end;
3768 1.1 mrg case SHIFT_ASHIFTRT:
3769 1.1 mrg info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0";
3770 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3771 1.1 mrg goto end;
3772 1.1 mrg }
3773 1.1 mrg }
3774 1.1 mrg else if (count == 14)
3775 1.1 mrg {
3776 1.1 mrg switch (shift_type)
3777 1.1 mrg {
3778 1.1 mrg case SHIFT_ASHIFT:
3779 1.1 mrg case SHIFT_LSHIFTRT:
3780 1.1 mrg goto end;
3781 1.1 mrg goto end;
3782 1.1 mrg case SHIFT_ASHIFTRT:
3783 1.1 mrg if (TARGET_H8300H)
3784 1.1 mrg {
3785 1.1 mrg 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";
3786 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3787 1.1 mrg }
3788 1.1 mrg else /* TARGET_H8300S */
3789 1.1 mrg gcc_unreachable ();
3790 1.1 mrg goto end;
3791 1.1 mrg }
3792 1.1 mrg }
3793 1.1 mrg else if (count == 15)
3794 1.1 mrg {
3795 1.1 mrg switch (shift_type)
3796 1.1 mrg {
3797 1.1 mrg case SHIFT_ASHIFT:
3798 1.1 mrg info->special = "bld\t#0,%s0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#7,%t0";
3799 1.1 mrg goto end;
3800 1.1 mrg case SHIFT_LSHIFTRT:
3801 1.1 mrg info->special = "bld\t#7,%t0\n\txor\t%s0,%s0\n\txor\t%t0,%t0\n\tbst\t#0,%s0";
3802 1.1 mrg goto end;
3803 1.1 mrg case SHIFT_ASHIFTRT:
3804 1.1 mrg info->special = "shll\t%t0\n\tsubx\t%t0,%t0\n\tmov.b\t%t0,%s0";
3805 1.1 mrg goto end;
3806 1.1 mrg }
3807 1.1 mrg }
3808 1.1 mrg gcc_unreachable ();
3809 1.1 mrg
3810 1.1 mrg case SIshift:
3811 1.1 mrg if (count == 8)
3812 1.1 mrg {
3813 1.1 mrg switch (shift_type)
3814 1.1 mrg {
3815 1.1 mrg case SHIFT_ASHIFT:
3816 1.1 mrg info->special = "mov.w\t%e0,%f3\n\tmov.b\t%s3,%t3\n\tmov.b\t%t0,%s3\n\tmov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f3,%e0";
3817 1.1 mrg goto end;
3818 1.1 mrg case SHIFT_LSHIFTRT:
3819 1.1 mrg info->special = "mov.w\t%e0,%f3\n\tmov.b\t%t0,%s0\n\tmov.b\t%s3,%t0\n\tmov.b\t%t3,%s3\n\textu.w\t%f3\n\tmov.w\t%f3,%e0";
3820 1.1 mrg goto end;
3821 1.1 mrg case SHIFT_ASHIFTRT:
3822 1.1 mrg info->special = "mov.w\t%e0,%f3\n\tmov.b\t%t0,%s0\n\tmov.b\t%s3,%t0\n\tmov.b\t%t3,%s3\n\texts.w\t%f3\n\tmov.w\t%f3,%e0";
3823 1.1 mrg goto end;
3824 1.1 mrg }
3825 1.1 mrg }
3826 1.1 mrg else if (count == 15)
3827 1.1 mrg {
3828 1.1 mrg /* The basic idea here is to use the shift-by-16 idiom to make things
3829 1.1 mrg small and efficient. Of course, that loses one bit that we need,
3830 1.1 mrg so we stuff the bit into C, shift by 16, then rotate the bit
3831 1.1 mrg back in. */
3832 1.1 mrg switch (shift_type)
3833 1.1 mrg {
3834 1.1 mrg case SHIFT_ASHIFT:
3835 1.1 mrg info->special = "shlr.w\t%e0\n\tmov.w\t%f0,%e0\n\txor.w\t%f0,%f0\n\trotxr.l\t%S0";
3836 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3837 1.1 mrg goto end;
3838 1.1 mrg case SHIFT_LSHIFTRT:
3839 1.1 mrg info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\txor.w\t%e0,%e0\n\trotxl.l\t%S0";
3840 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3841 1.1 mrg goto end;
3842 1.1 mrg case SHIFT_ASHIFTRT:
3843 1.1 mrg info->special = "shll.w\t%f0\n\tmov.w\t%e0,%f0\n\texts.l\t%S0\n\trotxl.l\t%S0";
3844 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3845 1.1 mrg goto end;
3846 1.1 mrg }
3847 1.1 mrg }
3848 1.1 mrg else if (count >= 16 && count <= 23)
3849 1.1 mrg {
3850 1.1 mrg info->remainder = count - 16;
3851 1.1 mrg
3852 1.1 mrg switch (shift_type)
3853 1.1 mrg {
3854 1.1 mrg case SHIFT_ASHIFT:
3855 1.1 mrg info->special = "mov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
3856 1.1 mrg goto end;
3857 1.1 mrg case SHIFT_LSHIFTRT:
3858 1.1 mrg info->special = "mov.w\t%e0,%f0\n\textu.l\t%S0";
3859 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3860 1.1 mrg goto end;
3861 1.1 mrg case SHIFT_ASHIFTRT:
3862 1.1 mrg info->special = "mov.w\t%e0,%f0\n\texts.l\t%S0";
3863 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3864 1.1 mrg goto end;
3865 1.1 mrg }
3866 1.1 mrg }
3867 1.1 mrg else if (TARGET_H8300S && count == 27)
3868 1.1 mrg {
3869 1.1 mrg switch (shift_type)
3870 1.1 mrg {
3871 1.1 mrg case SHIFT_ASHIFT:
3872 1.1 mrg info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
3873 1.1 mrg goto end;
3874 1.1 mrg case SHIFT_LSHIFTRT:
3875 1.1 mrg info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
3876 1.1 mrg goto end;
3877 1.1 mrg case SHIFT_ASHIFTRT:
3878 1.1 mrg info->remainder = count - 24;
3879 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
3880 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3881 1.1 mrg goto end;
3882 1.1 mrg }
3883 1.1 mrg }
3884 1.1 mrg else if (count >= 24 && count <= 27)
3885 1.1 mrg {
3886 1.1 mrg info->remainder = count - 24;
3887 1.1 mrg
3888 1.1 mrg switch (shift_type)
3889 1.1 mrg {
3890 1.1 mrg case SHIFT_ASHIFT:
3891 1.1 mrg 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";
3892 1.1 mrg goto end;
3893 1.1 mrg case SHIFT_LSHIFTRT:
3894 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
3895 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3896 1.1 mrg goto end;
3897 1.1 mrg case SHIFT_ASHIFTRT:
3898 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
3899 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3900 1.1 mrg goto end;
3901 1.1 mrg }
3902 1.1 mrg }
3903 1.1 mrg else if (count == 28)
3904 1.1 mrg {
3905 1.1 mrg switch (shift_type)
3906 1.1 mrg {
3907 1.1 mrg case SHIFT_ASHIFT:
3908 1.1 mrg if (TARGET_H8300H)
3909 1.1 mrg 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";
3910 1.1 mrg else
3911 1.1 mrg 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";
3912 1.1 mrg goto end;
3913 1.1 mrg case SHIFT_LSHIFTRT:
3914 1.1 mrg if (TARGET_H8300H)
3915 1.1 mrg {
3916 1.1 mrg 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";
3917 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3918 1.1 mrg }
3919 1.1 mrg else
3920 1.1 mrg info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
3921 1.1 mrg goto end;
3922 1.1 mrg case SHIFT_ASHIFTRT:
3923 1.1 mrg info->remainder = count - 24;
3924 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
3925 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3926 1.1 mrg goto end;
3927 1.1 mrg }
3928 1.1 mrg }
3929 1.1 mrg else if (count == 29)
3930 1.1 mrg {
3931 1.1 mrg switch (shift_type)
3932 1.1 mrg {
3933 1.1 mrg case SHIFT_ASHIFT:
3934 1.1 mrg if (TARGET_H8300H)
3935 1.1 mrg 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";
3936 1.1 mrg else
3937 1.1 mrg info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
3938 1.1 mrg goto end;
3939 1.1 mrg case SHIFT_LSHIFTRT:
3940 1.1 mrg if (TARGET_H8300H)
3941 1.1 mrg {
3942 1.1 mrg 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";
3943 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3944 1.1 mrg }
3945 1.1 mrg else
3946 1.1 mrg {
3947 1.1 mrg info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
3948 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3949 1.1 mrg }
3950 1.1 mrg goto end;
3951 1.1 mrg case SHIFT_ASHIFTRT:
3952 1.1 mrg info->remainder = count - 24;
3953 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
3954 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3955 1.1 mrg goto end;
3956 1.1 mrg }
3957 1.1 mrg }
3958 1.1 mrg else if (count == 30)
3959 1.1 mrg {
3960 1.1 mrg switch (shift_type)
3961 1.1 mrg {
3962 1.1 mrg case SHIFT_ASHIFT:
3963 1.1 mrg if (TARGET_H8300H)
3964 1.1 mrg info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
3965 1.1 mrg else
3966 1.1 mrg info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
3967 1.1 mrg goto end;
3968 1.1 mrg case SHIFT_LSHIFTRT:
3969 1.1 mrg if (TARGET_H8300H)
3970 1.1 mrg info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\textu.l\t%S0";
3971 1.1 mrg else
3972 1.1 mrg info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\textu.l\t%S0";
3973 1.1 mrg goto end;
3974 1.1 mrg case SHIFT_ASHIFTRT:
3975 1.1 mrg info->remainder = count - 24;
3976 1.1 mrg info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
3977 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3978 1.1 mrg goto end;
3979 1.1 mrg }
3980 1.1 mrg }
3981 1.1 mrg else if (count == 31)
3982 1.1 mrg {
3983 1.1 mrg switch (shift_type)
3984 1.1 mrg {
3985 1.1 mrg case SHIFT_ASHIFT:
3986 1.1 mrg info->special = "shlr.l\t%S0\n\txor.l\t%S0,%S0\n\trotxr.l\t%S0";
3987 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3988 1.1 mrg goto end;
3989 1.1 mrg case SHIFT_LSHIFTRT:
3990 1.1 mrg info->special = "shll.l\t%S0\n\txor.l\t%S0,%S0\n\trotxl.l\t%S0";
3991 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3992 1.1 mrg goto end;
3993 1.1 mrg case SHIFT_ASHIFTRT:
3994 1.1 mrg info->special = "shll\t%e0\n\tsubx\t%w0,%w0\n\texts.w\t%T0\n\texts.l\t%S0";
3995 1.1 mrg info->cc_special = OLD_CC_SET_ZNV;
3996 1.1 mrg goto end;
3997 1.1 mrg }
3998 1.1 mrg }
3999 1.1 mrg gcc_unreachable ();
4000 1.1 mrg
4001 1.1 mrg default:
4002 1.1 mrg gcc_unreachable ();
4003 1.1 mrg }
4004 1.1 mrg
4005 1.1 mrg end:
4006 1.1 mrg if (!TARGET_H8300S)
4007 1.1 mrg info->shift2 = NULL;
4008 1.1 mrg }
4009 1.1 mrg
4010 1.1 mrg /* Given COUNT and MODE of a shift, return 1 if a scratch reg may be
4011 1.1 mrg needed for some shift with COUNT and MODE. Return 0 otherwise. */
4012 1.1 mrg
4013 1.1 mrg int
4014 1.1 mrg h8300_shift_needs_scratch_p (int count, machine_mode mode, enum rtx_code type)
4015 1.1 mrg {
4016 1.1 mrg enum h8_cpu cpu;
4017 1.1 mrg int a, lr, ar;
4018 1.1 mrg
4019 1.1 mrg if (GET_MODE_BITSIZE (mode) <= count)
4020 1.1 mrg return 1;
4021 1.1 mrg
4022 1.1 mrg /* Find out the target CPU. */
4023 1.1 mrg if (TARGET_H8300S)
4024 1.1 mrg cpu = H8_S;
4025 1.1 mrg else
4026 1.1 mrg cpu = H8_300H;
4027 1.1 mrg
4028 1.1 mrg /* Find the shift algorithm. */
4029 1.1 mrg switch (mode)
4030 1.1 mrg {
4031 1.1 mrg case E_QImode:
4032 1.1 mrg a = shift_alg_qi[cpu][SHIFT_ASHIFT][count];
4033 1.1 mrg lr = shift_alg_qi[cpu][SHIFT_LSHIFTRT][count];
4034 1.1 mrg ar = shift_alg_qi[cpu][SHIFT_ASHIFTRT][count];
4035 1.1 mrg break;
4036 1.1 mrg
4037 1.1 mrg case E_HImode:
4038 1.1 mrg a = shift_alg_hi[cpu][SHIFT_ASHIFT][count];
4039 1.1 mrg lr = shift_alg_hi[cpu][SHIFT_LSHIFTRT][count];
4040 1.1 mrg ar = shift_alg_hi[cpu][SHIFT_ASHIFTRT][count];
4041 1.1 mrg break;
4042 1.1 mrg
4043 1.1 mrg case E_SImode:
4044 1.1 mrg a = shift_alg_si[cpu][SHIFT_ASHIFT][count];
4045 1.1 mrg lr = shift_alg_si[cpu][SHIFT_LSHIFTRT][count];
4046 1.1 mrg ar = shift_alg_si[cpu][SHIFT_ASHIFTRT][count];
4047 1.1 mrg break;
4048 1.1 mrg
4049 1.1 mrg default:
4050 1.1 mrg gcc_unreachable ();
4051 1.1 mrg }
4052 1.1 mrg
4053 1.1 mrg /* On H8/300H, count == 8 uses a scratch register. */
4054 1.1 mrg if (type == CLOBBER)
4055 1.1 mrg return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
4056 1.1 mrg || (TARGET_H8300H && mode == SImode && count == 8));
4057 1.1 mrg else if (type == ASHIFT)
4058 1.1 mrg return (a == SHIFT_LOOP
4059 1.1 mrg || (TARGET_H8300H && mode == SImode && count == 8));
4060 1.1 mrg else if (type == LSHIFTRT)
4061 1.1 mrg return (lr == SHIFT_LOOP
4062 1.1 mrg || (TARGET_H8300H && mode == SImode && count == 8));
4063 1.1 mrg else if (type == ASHIFTRT)
4064 1.1 mrg return (ar == SHIFT_LOOP
4065 1.1 mrg || (TARGET_H8300H && mode == SImode && count == 8));
4066 1.1 mrg gcc_unreachable ();
4067 1.1 mrg }
4068 1.1 mrg
4069 1.1 mrg /* Output the assembler code for doing shifts. */
4070 1.1 mrg
4071 1.1 mrg const char *
4072 1.1 mrg output_a_shift (rtx operands[4], rtx_code code)
4073 1.1 mrg {
4074 1.1 mrg static int loopend_lab;
4075 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
4076 1.1 mrg enum shift_type shift_type;
4077 1.1 mrg enum shift_mode shift_mode;
4078 1.1 mrg struct shift_info info;
4079 1.1 mrg int n;
4080 1.1 mrg
4081 1.1 mrg loopend_lab++;
4082 1.1 mrg
4083 1.1 mrg switch (mode)
4084 1.1 mrg {
4085 1.1 mrg case E_QImode:
4086 1.1 mrg shift_mode = QIshift;
4087 1.1 mrg break;
4088 1.1 mrg case E_HImode:
4089 1.1 mrg shift_mode = HIshift;
4090 1.1 mrg break;
4091 1.1 mrg case E_SImode:
4092 1.1 mrg shift_mode = SIshift;
4093 1.1 mrg break;
4094 1.1 mrg default:
4095 1.1 mrg gcc_unreachable ();
4096 1.1 mrg }
4097 1.1 mrg
4098 1.1 mrg switch (code)
4099 1.1 mrg {
4100 1.1 mrg case ASHIFTRT:
4101 1.1 mrg shift_type = SHIFT_ASHIFTRT;
4102 1.1 mrg break;
4103 1.1 mrg case LSHIFTRT:
4104 1.1 mrg shift_type = SHIFT_LSHIFTRT;
4105 1.1 mrg break;
4106 1.1 mrg case ASHIFT:
4107 1.1 mrg shift_type = SHIFT_ASHIFT;
4108 1.1 mrg break;
4109 1.1 mrg default:
4110 1.1 mrg gcc_unreachable ();
4111 1.1 mrg }
4112 1.1 mrg
4113 1.1 mrg /* This case must be taken care of by one of the two splitters
4114 1.1 mrg that convert a variable shift into a loop. */
4115 1.1 mrg gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4116 1.1 mrg
4117 1.1 mrg n = INTVAL (operands[2]);
4118 1.1 mrg
4119 1.1 mrg /* If the count is negative, make it 0. */
4120 1.1 mrg if (n < 0)
4121 1.1 mrg n = 0;
4122 1.1 mrg /* If the count is too big, truncate it.
4123 1.1 mrg ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4124 1.1 mrg do the intuitive thing. */
4125 1.1 mrg else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4126 1.1 mrg n = GET_MODE_BITSIZE (mode);
4127 1.1 mrg
4128 1.1 mrg get_shift_alg (shift_type, shift_mode, n, &info);
4129 1.1 mrg
4130 1.1 mrg switch (info.alg)
4131 1.1 mrg {
4132 1.1 mrg case SHIFT_SPECIAL:
4133 1.1 mrg output_asm_insn (info.special, operands);
4134 1.1 mrg /* Fall through. */
4135 1.1 mrg
4136 1.1 mrg case SHIFT_INLINE:
4137 1.1 mrg n = info.remainder;
4138 1.1 mrg
4139 1.1 mrg /* Emit two bit shifts first. */
4140 1.1 mrg if (info.shift2 != NULL)
4141 1.1 mrg {
4142 1.1 mrg for (; n > 1; n -= 2)
4143 1.1 mrg output_asm_insn (info.shift2, operands);
4144 1.1 mrg }
4145 1.1 mrg
4146 1.1 mrg /* Now emit one bit shifts for any residual. */
4147 1.1 mrg for (; n > 0; n--)
4148 1.1 mrg output_asm_insn (info.shift1, operands);
4149 1.1 mrg return "";
4150 1.1 mrg
4151 1.1 mrg case SHIFT_ROT_AND:
4152 1.1 mrg {
4153 1.1 mrg int m = GET_MODE_BITSIZE (mode) - n;
4154 1.1 mrg const int mask = (shift_type == SHIFT_ASHIFT
4155 1.1 mrg ? ((1 << m) - 1) << n
4156 1.1 mrg : (1 << m) - 1);
4157 1.1 mrg char insn_buf[200];
4158 1.1 mrg
4159 1.1 mrg /* Not all possibilities of rotate are supported. They shouldn't
4160 1.1 mrg be generated, but let's watch for 'em. */
4161 1.1 mrg gcc_assert (info.shift1);
4162 1.1 mrg
4163 1.1 mrg /* Emit two bit rotates first. */
4164 1.1 mrg if (info.shift2 != NULL)
4165 1.1 mrg {
4166 1.1 mrg for (; m > 1; m -= 2)
4167 1.1 mrg output_asm_insn (info.shift2, operands);
4168 1.1 mrg }
4169 1.1 mrg
4170 1.1 mrg /* Now single bit rotates for any residual. */
4171 1.1 mrg for (; m > 0; m--)
4172 1.1 mrg output_asm_insn (info.shift1, operands);
4173 1.1 mrg
4174 1.1 mrg /* Now mask off the high bits. */
4175 1.1 mrg switch (mode)
4176 1.1 mrg {
4177 1.1 mrg case E_QImode:
4178 1.1 mrg sprintf (insn_buf, "and\t#%d,%%X0", mask);
4179 1.1 mrg break;
4180 1.1 mrg
4181 1.1 mrg case E_HImode:
4182 1.1 mrg sprintf (insn_buf, "and.w\t#%d,%%T0", mask);
4183 1.1 mrg break;
4184 1.1 mrg
4185 1.1 mrg default:
4186 1.1 mrg gcc_unreachable ();
4187 1.1 mrg }
4188 1.1 mrg
4189 1.1 mrg output_asm_insn (insn_buf, operands);
4190 1.1 mrg return "";
4191 1.1 mrg }
4192 1.1 mrg
4193 1.1 mrg case SHIFT_LOOP:
4194 1.1 mrg /* A loop to shift by a "large" constant value.
4195 1.1 mrg If we have shift-by-2 insns, use them. */
4196 1.1 mrg if (info.shift2 != NULL)
4197 1.1 mrg {
4198 1.1 mrg fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n / 2,
4199 1.1 mrg names_big[REGNO (operands[3])]);
4200 1.1 mrg fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4201 1.1 mrg output_asm_insn (info.shift2, operands);
4202 1.1 mrg output_asm_insn ("add #0xff,%X3", operands);
4203 1.1 mrg fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4204 1.1 mrg if (n % 2)
4205 1.1 mrg output_asm_insn (info.shift1, operands);
4206 1.1 mrg }
4207 1.1 mrg else
4208 1.1 mrg {
4209 1.1 mrg fprintf (asm_out_file, "\tmov.b #%d,%sl\n", n,
4210 1.1 mrg names_big[REGNO (operands[3])]);
4211 1.1 mrg fprintf (asm_out_file, ".Llt%d:\n", loopend_lab);
4212 1.1 mrg output_asm_insn (info.shift1, operands);
4213 1.1 mrg output_asm_insn ("add #0xff,%X3", operands);
4214 1.1 mrg fprintf (asm_out_file, "\tbne .Llt%d\n", loopend_lab);
4215 1.1 mrg }
4216 1.1 mrg return "";
4217 1.1 mrg
4218 1.1 mrg default:
4219 1.1 mrg gcc_unreachable ();
4220 1.1 mrg }
4221 1.1 mrg }
4222 1.1 mrg
4223 1.1 mrg /* Count the number of assembly instructions in a string TEMPL. */
4224 1.1 mrg
4225 1.1 mrg static unsigned int
4226 1.1 mrg h8300_asm_insn_count (const char *templ)
4227 1.1 mrg {
4228 1.1 mrg unsigned int count = 1;
4229 1.1 mrg
4230 1.1 mrg for (; *templ; templ++)
4231 1.1 mrg if (*templ == '\n')
4232 1.1 mrg count++;
4233 1.1 mrg
4234 1.1 mrg return count;
4235 1.1 mrg }
4236 1.1 mrg
4237 1.1 mrg /* Compute the length of a shift insn. */
4238 1.1 mrg
4239 1.1 mrg unsigned int
4240 1.1 mrg compute_a_shift_length (rtx operands[3], rtx_code code)
4241 1.1 mrg {
4242 1.1 mrg enum machine_mode mode = GET_MODE (operands[0]);
4243 1.1 mrg enum shift_type shift_type;
4244 1.1 mrg enum shift_mode shift_mode;
4245 1.1 mrg struct shift_info info;
4246 1.1 mrg unsigned int wlength = 0;
4247 1.1 mrg
4248 1.1 mrg switch (mode)
4249 1.1 mrg {
4250 1.1 mrg case E_QImode:
4251 1.1 mrg shift_mode = QIshift;
4252 1.1 mrg break;
4253 1.1 mrg case E_HImode:
4254 1.1 mrg shift_mode = HIshift;
4255 1.1 mrg break;
4256 1.1 mrg case E_SImode:
4257 1.1 mrg shift_mode = SIshift;
4258 1.1 mrg break;
4259 1.1 mrg default:
4260 1.1 mrg gcc_unreachable ();
4261 1.1 mrg }
4262 1.1 mrg
4263 1.1 mrg switch (code)
4264 1.1 mrg {
4265 1.1 mrg case ASHIFTRT:
4266 1.1 mrg shift_type = SHIFT_ASHIFTRT;
4267 1.1 mrg break;
4268 1.1 mrg case LSHIFTRT:
4269 1.1 mrg shift_type = SHIFT_LSHIFTRT;
4270 1.1 mrg break;
4271 1.1 mrg case ASHIFT:
4272 1.1 mrg shift_type = SHIFT_ASHIFT;
4273 1.1 mrg break;
4274 1.1 mrg default:
4275 1.1 mrg gcc_unreachable ();
4276 1.1 mrg }
4277 1.1 mrg
4278 1.1 mrg if (GET_CODE (operands[2]) != CONST_INT)
4279 1.1 mrg {
4280 1.1 mrg /* Get the assembler code to do one shift. */
4281 1.1 mrg get_shift_alg (shift_type, shift_mode, 1, &info);
4282 1.1 mrg
4283 1.1 mrg return (4 + h8300_asm_insn_count (info.shift1)) * 2;
4284 1.1 mrg }
4285 1.1 mrg else
4286 1.1 mrg {
4287 1.1 mrg int n = INTVAL (operands[2]);
4288 1.1 mrg
4289 1.1 mrg /* If the count is negative, make it 0. */
4290 1.1 mrg if (n < 0)
4291 1.1 mrg n = 0;
4292 1.1 mrg /* If the count is too big, truncate it.
4293 1.1 mrg ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4294 1.1 mrg do the intuitive thing. */
4295 1.1 mrg else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4296 1.1 mrg n = GET_MODE_BITSIZE (mode);
4297 1.1 mrg
4298 1.1 mrg get_shift_alg (shift_type, shift_mode, n, &info);
4299 1.1 mrg
4300 1.1 mrg switch (info.alg)
4301 1.1 mrg {
4302 1.1 mrg case SHIFT_SPECIAL:
4303 1.1 mrg wlength += h8300_asm_insn_count (info.special);
4304 1.1 mrg
4305 1.1 mrg /* Every assembly instruction used in SHIFT_SPECIAL case
4306 1.1 mrg takes 2 bytes except xor.l, which takes 4 bytes, so if we
4307 1.1 mrg see xor.l, we just pretend that xor.l counts as two insns
4308 1.1 mrg so that the insn length will be computed correctly. */
4309 1.1 mrg if (strstr (info.special, "xor.l") != NULL)
4310 1.1 mrg wlength++;
4311 1.1 mrg
4312 1.1 mrg /* Fall through. */
4313 1.1 mrg
4314 1.1 mrg case SHIFT_INLINE:
4315 1.1 mrg n = info.remainder;
4316 1.1 mrg
4317 1.1 mrg if (info.shift2 != NULL)
4318 1.1 mrg {
4319 1.1 mrg wlength += h8300_asm_insn_count (info.shift2) * (n / 2);
4320 1.1 mrg n = n % 2;
4321 1.1 mrg }
4322 1.1 mrg
4323 1.1 mrg wlength += h8300_asm_insn_count (info.shift1) * n;
4324 1.1 mrg
4325 1.1 mrg return 2 * wlength;
4326 1.1 mrg
4327 1.1 mrg case SHIFT_ROT_AND:
4328 1.1 mrg {
4329 1.1 mrg int m = GET_MODE_BITSIZE (mode) - n;
4330 1.1 mrg
4331 1.1 mrg /* Not all possibilities of rotate are supported. They shouldn't
4332 1.1 mrg be generated, but let's watch for 'em. */
4333 1.1 mrg gcc_assert (info.shift1);
4334 1.1 mrg
4335 1.1 mrg if (info.shift2 != NULL)
4336 1.1 mrg {
4337 1.1 mrg wlength += h8300_asm_insn_count (info.shift2) * (m / 2);
4338 1.1 mrg m = m % 2;
4339 1.1 mrg }
4340 1.1 mrg
4341 1.1 mrg wlength += h8300_asm_insn_count (info.shift1) * m;
4342 1.1 mrg
4343 1.1 mrg /* Now mask off the high bits. */
4344 1.1 mrg switch (mode)
4345 1.1 mrg {
4346 1.1 mrg case E_QImode:
4347 1.1 mrg wlength += 1;
4348 1.1 mrg break;
4349 1.1 mrg case E_HImode:
4350 1.1 mrg wlength += 2;
4351 1.1 mrg break;
4352 1.1 mrg case E_SImode:
4353 1.1 mrg wlength += 3;
4354 1.1 mrg break;
4355 1.1 mrg default:
4356 1.1 mrg gcc_unreachable ();
4357 1.1 mrg }
4358 1.1 mrg return 2 * wlength;
4359 1.1 mrg }
4360 1.1 mrg
4361 1.1 mrg case SHIFT_LOOP:
4362 1.1 mrg /* A loop to shift by a "large" constant value.
4363 1.1 mrg If we have shift-by-2 insns, use them. */
4364 1.1 mrg if (info.shift2 != NULL)
4365 1.1 mrg {
4366 1.1 mrg wlength += 3 + h8300_asm_insn_count (info.shift2);
4367 1.1 mrg if (n % 2)
4368 1.1 mrg wlength += h8300_asm_insn_count (info.shift1);
4369 1.1 mrg }
4370 1.1 mrg else
4371 1.1 mrg {
4372 1.1 mrg wlength += 3 + h8300_asm_insn_count (info.shift1);
4373 1.1 mrg }
4374 1.1 mrg return 2 * wlength;
4375 1.1 mrg
4376 1.1 mrg default:
4377 1.1 mrg gcc_unreachable ();
4378 1.1 mrg }
4379 1.1 mrg }
4380 1.1 mrg }
4381 1.1 mrg
4382 1.1 mrg /* Compute which flag bits are valid after a shift insn. */
4383 1.1 mrg
4384 1.1 mrg int
4385 1.1 mrg compute_a_shift_cc (rtx operands[3], rtx_code code)
4386 1.1 mrg {
4387 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
4388 1.1 mrg enum shift_type shift_type;
4389 1.1 mrg enum shift_mode shift_mode;
4390 1.1 mrg struct shift_info info;
4391 1.1 mrg int n;
4392 1.1 mrg
4393 1.1 mrg switch (mode)
4394 1.1 mrg {
4395 1.1 mrg case E_QImode:
4396 1.1 mrg shift_mode = QIshift;
4397 1.1 mrg break;
4398 1.1 mrg case E_HImode:
4399 1.1 mrg shift_mode = HIshift;
4400 1.1 mrg break;
4401 1.1 mrg case E_SImode:
4402 1.1 mrg shift_mode = SIshift;
4403 1.1 mrg break;
4404 1.1 mrg default:
4405 1.1 mrg gcc_unreachable ();
4406 1.1 mrg }
4407 1.1 mrg
4408 1.1 mrg switch (code)
4409 1.1 mrg {
4410 1.1 mrg case ASHIFTRT:
4411 1.1 mrg shift_type = SHIFT_ASHIFTRT;
4412 1.1 mrg break;
4413 1.1 mrg case LSHIFTRT:
4414 1.1 mrg shift_type = SHIFT_LSHIFTRT;
4415 1.1 mrg break;
4416 1.1 mrg case ASHIFT:
4417 1.1 mrg shift_type = SHIFT_ASHIFT;
4418 1.1 mrg break;
4419 1.1 mrg default:
4420 1.1 mrg gcc_unreachable ();
4421 1.1 mrg }
4422 1.1 mrg
4423 1.1 mrg /* This case must be taken care of by one of the two splitters
4424 1.1 mrg that convert a variable shift into a loop. */
4425 1.1 mrg gcc_assert (GET_CODE (operands[2]) == CONST_INT);
4426 1.1 mrg
4427 1.1 mrg n = INTVAL (operands[2]);
4428 1.1 mrg
4429 1.1 mrg /* If the count is negative, make it 0. */
4430 1.1 mrg if (n < 0)
4431 1.1 mrg n = 0;
4432 1.1 mrg /* If the count is too big, truncate it.
4433 1.1 mrg ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to
4434 1.1 mrg do the intuitive thing. */
4435 1.1 mrg else if ((unsigned int) n > GET_MODE_BITSIZE (mode))
4436 1.1 mrg n = GET_MODE_BITSIZE (mode);
4437 1.1 mrg
4438 1.1 mrg get_shift_alg (shift_type, shift_mode, n, &info);
4439 1.1 mrg
4440 1.1 mrg switch (info.alg)
4441 1.1 mrg {
4442 1.1 mrg case SHIFT_SPECIAL:
4443 1.1 mrg if (info.remainder == 0)
4444 1.1 mrg return (info.cc_special == OLD_CC_SET_ZN
4445 1.1 mrg || info.cc_special == OLD_CC_SET_ZNV);
4446 1.1 mrg
4447 1.1 mrg /* Fall through. */
4448 1.1 mrg
4449 1.1 mrg case SHIFT_INLINE:
4450 1.1 mrg return (info.cc_inline == OLD_CC_SET_ZN
4451 1.1 mrg || info.cc_inline == OLD_CC_SET_ZNV);
4452 1.1 mrg
4453 1.1 mrg case SHIFT_ROT_AND:
4454 1.1 mrg /* This case always ends with an and instruction. */
4455 1.1 mrg return true;
4456 1.1 mrg
4457 1.1 mrg case SHIFT_LOOP:
4458 1.1 mrg /* A loop to shift by a "large" constant value.
4459 1.1 mrg If we have shift-by-2 insns, use them. */
4460 1.1 mrg if (info.shift2 != NULL)
4461 1.1 mrg {
4462 1.1 mrg if (n % 2)
4463 1.1 mrg return (info.cc_inline == OLD_CC_SET_ZN
4464 1.1 mrg || info.cc_inline == OLD_CC_SET_ZNV);
4465 1.1 mrg
4466 1.1 mrg }
4467 1.1 mrg return false;
4468 1.1 mrg
4469 1.1 mrg default:
4470 1.1 mrg gcc_unreachable ();
4471 1.1 mrg }
4472 1.1 mrg }
4473 1.1 mrg
4474 1.1 mrg /* A rotation by a non-constant will cause a loop to be generated, in
4476 1.1 mrg which a rotation by one bit is used. A rotation by a constant,
4477 1.1 mrg including the one in the loop, will be taken care of by
4478 1.1 mrg output_a_rotate () at the insn emit time. */
4479 1.1 mrg
4480 1.1 mrg int
4481 1.1 mrg expand_a_rotate (rtx operands[])
4482 1.1 mrg {
4483 1.1 mrg rtx dst = operands[0];
4484 1.1 mrg rtx src = operands[1];
4485 1.1 mrg rtx rotate_amount = operands[2];
4486 1.1 mrg machine_mode mode = GET_MODE (dst);
4487 1.1 mrg
4488 1.1 mrg if (h8sx_classify_shift (mode, ROTATE, rotate_amount) == H8SX_SHIFT_UNARY)
4489 1.1 mrg return false;
4490 1.1 mrg
4491 1.1 mrg /* We rotate in place. */
4492 1.1 mrg emit_move_insn (dst, src);
4493 1.1 mrg
4494 1.1 mrg if (GET_CODE (rotate_amount) != CONST_INT)
4495 1.1 mrg {
4496 1.1 mrg rtx counter = gen_reg_rtx (QImode);
4497 1.1 mrg rtx_code_label *start_label = gen_label_rtx ();
4498 1.1 mrg rtx_code_label *end_label = gen_label_rtx ();
4499 1.1 mrg
4500 1.1 mrg /* If the rotate amount is less than or equal to 0,
4501 1.1 mrg we go out of the loop. */
4502 1.1 mrg emit_cmp_and_jump_insns (rotate_amount, const0_rtx, LE, NULL_RTX,
4503 1.1 mrg QImode, 0, end_label);
4504 1.1 mrg
4505 1.1 mrg /* Initialize the loop counter. */
4506 1.1 mrg emit_move_insn (counter, rotate_amount);
4507 1.1 mrg
4508 1.1 mrg emit_label (start_label);
4509 1.1 mrg
4510 1.1 mrg /* Rotate by one bit. */
4511 1.1 mrg switch (mode)
4512 1.1 mrg {
4513 1.1 mrg case E_QImode:
4514 1.1 mrg emit_insn (gen_rotlqi3_1 (dst, dst, const1_rtx));
4515 1.1 mrg break;
4516 1.1 mrg case E_HImode:
4517 1.1 mrg emit_insn (gen_rotlhi3_1 (dst, dst, const1_rtx));
4518 1.1 mrg break;
4519 1.1 mrg case E_SImode:
4520 1.1 mrg emit_insn (gen_rotlsi3_1 (dst, dst, const1_rtx));
4521 1.1 mrg break;
4522 1.1 mrg default:
4523 1.1 mrg gcc_unreachable ();
4524 1.1 mrg }
4525 1.1 mrg
4526 1.1 mrg /* Decrement the counter by 1. */
4527 1.1 mrg emit_insn (gen_addqi3 (counter, counter, constm1_rtx));
4528 1.1 mrg
4529 1.1 mrg /* If the loop counter is nonzero, we go back to the beginning
4530 1.1 mrg of the loop. */
4531 1.1 mrg emit_cmp_and_jump_insns (counter, const0_rtx, NE, NULL_RTX, QImode, 1,
4532 1.1 mrg start_label);
4533 1.1 mrg
4534 1.1 mrg emit_label (end_label);
4535 1.1 mrg }
4536 1.1 mrg else
4537 1.1 mrg {
4538 1.1 mrg /* Rotate by AMOUNT bits. */
4539 1.1 mrg switch (mode)
4540 1.1 mrg {
4541 1.1 mrg case E_QImode:
4542 1.1 mrg emit_insn (gen_rotlqi3_1 (dst, dst, rotate_amount));
4543 1.1 mrg break;
4544 1.1 mrg case E_HImode:
4545 1.1 mrg emit_insn (gen_rotlhi3_1 (dst, dst, rotate_amount));
4546 1.1 mrg break;
4547 1.1 mrg case E_SImode:
4548 1.1 mrg emit_insn (gen_rotlsi3_1 (dst, dst, rotate_amount));
4549 1.1 mrg break;
4550 1.1 mrg default:
4551 1.1 mrg gcc_unreachable ();
4552 1.1 mrg }
4553 1.1 mrg }
4554 1.1 mrg
4555 1.1 mrg return 1;
4556 1.1 mrg }
4557 1.1 mrg
4558 1.1 mrg /* Output a rotate insn. */
4559 1.1 mrg
4560 1.1 mrg const char *
4561 1.1 mrg output_a_rotate (enum rtx_code code, rtx *operands)
4562 1.1 mrg {
4563 1.1 mrg rtx dst = operands[0];
4564 1.1 mrg rtx rotate_amount = operands[2];
4565 1.1 mrg enum shift_mode rotate_mode;
4566 1.1 mrg enum shift_type rotate_type;
4567 1.1 mrg const char *insn_buf;
4568 1.1 mrg int bits;
4569 1.1 mrg int amount;
4570 1.1 mrg machine_mode mode = GET_MODE (dst);
4571 1.1 mrg
4572 1.1 mrg gcc_assert (GET_CODE (rotate_amount) == CONST_INT);
4573 1.1 mrg
4574 1.1 mrg switch (mode)
4575 1.1 mrg {
4576 1.1 mrg case E_QImode:
4577 1.1 mrg rotate_mode = QIshift;
4578 1.1 mrg break;
4579 1.1 mrg case E_HImode:
4580 1.1 mrg rotate_mode = HIshift;
4581 1.1 mrg break;
4582 1.1 mrg case E_SImode:
4583 1.1 mrg rotate_mode = SIshift;
4584 1.1 mrg break;
4585 1.1 mrg default:
4586 1.1 mrg gcc_unreachable ();
4587 1.1 mrg }
4588 1.1 mrg
4589 1.1 mrg switch (code)
4590 1.1 mrg {
4591 1.1 mrg case ROTATERT:
4592 1.1 mrg rotate_type = SHIFT_ASHIFT;
4593 1.1 mrg break;
4594 1.1 mrg case ROTATE:
4595 1.1 mrg rotate_type = SHIFT_LSHIFTRT;
4596 1.1 mrg break;
4597 1.1 mrg default:
4598 1.1 mrg gcc_unreachable ();
4599 1.1 mrg }
4600 1.1 mrg
4601 1.1 mrg amount = INTVAL (rotate_amount);
4602 1.1 mrg
4603 1.1 mrg /* Clean up AMOUNT. */
4604 1.1 mrg if (amount < 0)
4605 1.1 mrg amount = 0;
4606 1.1 mrg if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4607 1.1 mrg amount = GET_MODE_BITSIZE (mode);
4608 1.1 mrg
4609 1.1 mrg /* Determine the faster direction. After this phase, amount will be
4610 1.1 mrg at most a half of GET_MODE_BITSIZE (mode). */
4611 1.1 mrg if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
4612 1.1 mrg {
4613 1.1 mrg /* Flip the direction. */
4614 1.1 mrg amount = GET_MODE_BITSIZE (mode) - amount;
4615 1.1 mrg rotate_type =
4616 1.1 mrg (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
4617 1.1 mrg }
4618 1.1 mrg
4619 1.1 mrg /* See if a byte swap (in HImode) or a word swap (in SImode) can
4620 1.1 mrg boost up the rotation. */
4621 1.1 mrg if ((mode == HImode && TARGET_H8300H && amount >= 6)
4622 1.1 mrg || (mode == HImode && TARGET_H8300S && amount == 8)
4623 1.1 mrg || (mode == SImode && TARGET_H8300H && amount >= 10)
4624 1.1 mrg || (mode == SImode && TARGET_H8300S && amount >= 13))
4625 1.1 mrg {
4626 1.1 mrg switch (mode)
4627 1.1 mrg {
4628 1.1 mrg case E_HImode:
4629 1.1 mrg /* This code works on any family. */
4630 1.1 mrg insn_buf = "xor.b\t%s0,%t0\n\txor.b\t%t0,%s0\n\txor.b\t%s0,%t0";
4631 1.1 mrg output_asm_insn (insn_buf, operands);
4632 1.1 mrg break;
4633 1.1 mrg
4634 1.1 mrg case E_SImode:
4635 1.1 mrg /* This code works on the H8/300H and H8S. */
4636 1.1 mrg insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
4637 1.1 mrg output_asm_insn (insn_buf, operands);
4638 1.1 mrg break;
4639 1.1 mrg
4640 1.1 mrg default:
4641 1.1 mrg gcc_unreachable ();
4642 1.1 mrg }
4643 1.1 mrg
4644 1.1 mrg /* Adjust AMOUNT and flip the direction. */
4645 1.1 mrg amount = GET_MODE_BITSIZE (mode) / 2 - amount;
4646 1.1 mrg rotate_type =
4647 1.1 mrg (rotate_type == SHIFT_ASHIFT) ? SHIFT_LSHIFTRT : SHIFT_ASHIFT;
4648 1.1 mrg }
4649 1.1 mrg
4650 1.1 mrg /* Output rotate insns. */
4651 1.1 mrg for (bits = TARGET_H8300S ? 2 : 1; bits > 0; bits /= 2)
4652 1.1 mrg {
4653 1.1 mrg if (bits == 2)
4654 1.1 mrg insn_buf = rotate_two[rotate_type][rotate_mode];
4655 1.1 mrg else
4656 1.1 mrg insn_buf = rotate_one[cpu_type][rotate_type][rotate_mode];
4657 1.1 mrg
4658 1.1 mrg for (; amount >= bits; amount -= bits)
4659 1.1 mrg output_asm_insn (insn_buf, operands);
4660 1.1 mrg }
4661 1.1 mrg
4662 1.1 mrg return "";
4663 1.1 mrg }
4664 1.1 mrg
4665 1.1 mrg /* Compute the length of a rotate insn. */
4666 1.1 mrg
4667 1.1 mrg unsigned int
4668 1.1 mrg compute_a_rotate_length (rtx *operands)
4669 1.1 mrg {
4670 1.1 mrg rtx src = operands[1];
4671 1.1 mrg rtx amount_rtx = operands[2];
4672 1.1 mrg machine_mode mode = GET_MODE (src);
4673 1.1 mrg int amount;
4674 1.1 mrg unsigned int length = 0;
4675 1.1 mrg
4676 1.1 mrg gcc_assert (GET_CODE (amount_rtx) == CONST_INT);
4677 1.1 mrg
4678 1.1 mrg amount = INTVAL (amount_rtx);
4679 1.1 mrg
4680 1.1 mrg /* Clean up AMOUNT. */
4681 1.1 mrg if (amount < 0)
4682 1.1 mrg amount = 0;
4683 1.1 mrg if ((unsigned int) amount > GET_MODE_BITSIZE (mode))
4684 1.1 mrg amount = GET_MODE_BITSIZE (mode);
4685 1.1 mrg
4686 1.1 mrg /* Determine the faster direction. After this phase, amount
4687 1.1 mrg will be at most a half of GET_MODE_BITSIZE (mode). */
4688 1.1 mrg if ((unsigned int) amount > GET_MODE_BITSIZE (mode) / (unsigned) 2)
4689 1.1 mrg /* Flip the direction. */
4690 1.1 mrg amount = GET_MODE_BITSIZE (mode) - amount;
4691 1.1 mrg
4692 1.1 mrg /* See if a byte swap (in HImode) or a word swap (in SImode) can
4693 1.1 mrg boost up the rotation. */
4694 1.1 mrg if ((mode == HImode && TARGET_H8300H && amount >= 6)
4695 1.1 mrg || (mode == HImode && TARGET_H8300S && amount == 8)
4696 1.1 mrg || (mode == SImode && TARGET_H8300H && amount >= 10)
4697 1.1 mrg || (mode == SImode && TARGET_H8300S && amount >= 13))
4698 1.1 mrg {
4699 1.1 mrg /* Adjust AMOUNT and flip the direction. */
4700 1.1 mrg amount = GET_MODE_BITSIZE (mode) / 2 - amount;
4701 1.1 mrg length += 6;
4702 1.1 mrg }
4703 1.1 mrg
4704 1.1 mrg /* We use 2-bit rotations on the H8S. */
4705 1.1 mrg if (TARGET_H8300S)
4706 1.1 mrg amount = amount / 2 + amount % 2;
4707 1.1 mrg
4708 1.1 mrg /* The H8/300 uses three insns to rotate one bit, taking 6
4709 1.1 mrg length. */
4710 1.1 mrg length += amount * 2;
4711 1.1 mrg
4712 1.1 mrg return length;
4713 1.1 mrg }
4714 1.1 mrg
4715 1.1 mrg /* Fix the operands of a gen_xxx so that it could become a bit
4717 1.1 mrg operating insn. */
4718 1.1 mrg
4719 1.1 mrg int
4720 1.1 mrg fix_bit_operand (rtx *operands, enum rtx_code code)
4721 1.1 mrg {
4722 1.1 mrg /* The bit_operand predicate accepts any memory during RTL generation, but
4723 1.1 mrg only 'U' memory afterwards, so if this is a MEM operand, we must force
4724 1.1 mrg it to be valid for 'U' by reloading the address. */
4725 1.1 mrg
4726 1.1 mrg if (code == AND
4727 1.1 mrg ? single_zero_operand (operands[2], QImode)
4728 1.1 mrg : single_one_operand (operands[2], QImode))
4729 1.1 mrg {
4730 1.1 mrg /* OK to have a memory dest. */
4731 1.1 mrg if (GET_CODE (operands[0]) == MEM
4732 1.1 mrg && !satisfies_constraint_U (operands[0]))
4733 1.1 mrg {
4734 1.1 mrg rtx mem = gen_rtx_MEM (GET_MODE (operands[0]),
4735 1.1 mrg copy_to_mode_reg (Pmode,
4736 1.1 mrg XEXP (operands[0], 0)));
4737 1.1 mrg MEM_COPY_ATTRIBUTES (mem, operands[0]);
4738 1.1 mrg operands[0] = mem;
4739 1.1 mrg }
4740 1.1 mrg
4741 1.1 mrg if (GET_CODE (operands[1]) == MEM
4742 1.1 mrg && !satisfies_constraint_U (operands[1]))
4743 1.1 mrg {
4744 1.1 mrg rtx mem = gen_rtx_MEM (GET_MODE (operands[1]),
4745 1.1 mrg copy_to_mode_reg (Pmode,
4746 1.1 mrg XEXP (operands[1], 0)));
4747 1.1 mrg MEM_COPY_ATTRIBUTES (mem, operands[0]);
4748 1.1 mrg operands[1] = mem;
4749 1.1 mrg }
4750 1.1 mrg return 0;
4751 1.1 mrg }
4752 1.1 mrg
4753 1.1 mrg /* Dest and src op must be register. */
4754 1.1 mrg
4755 1.1 mrg operands[1] = force_reg (QImode, operands[1]);
4756 1.1 mrg {
4757 1.1 mrg rtx res = gen_reg_rtx (QImode);
4758 1.1 mrg switch (code)
4759 1.1 mrg {
4760 1.1 mrg case AND:
4761 1.1 mrg emit_insn (gen_andqi3_1 (res, operands[1], operands[2]));
4762 1.1 mrg break;
4763 1.1 mrg case IOR:
4764 1.1 mrg emit_insn (gen_iorqi3_1 (res, operands[1], operands[2]));
4765 1.1 mrg break;
4766 1.1 mrg case XOR:
4767 1.1 mrg emit_insn (gen_xorqi3_1 (res, operands[1], operands[2]));
4768 1.1 mrg break;
4769 1.1 mrg default:
4770 1.1 mrg gcc_unreachable ();
4771 1.1 mrg }
4772 1.1 mrg emit_insn (gen_movqi (operands[0], res));
4773 1.1 mrg }
4774 1.1 mrg return 1;
4775 1.1 mrg }
4776 1.1 mrg
4777 1.1 mrg /* Return nonzero if FUNC is an interrupt function as specified
4778 1.1 mrg by the "interrupt" attribute. */
4779 1.1 mrg
4780 1.1 mrg static int
4781 1.1 mrg h8300_interrupt_function_p (tree func)
4782 1.1 mrg {
4783 1.1 mrg tree a;
4784 1.1 mrg
4785 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
4786 1.1 mrg return 0;
4787 1.1 mrg
4788 1.1 mrg a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
4789 1.1 mrg return a != NULL_TREE;
4790 1.1 mrg }
4791 1.1 mrg
4792 1.1 mrg /* Return nonzero if FUNC is a saveall function as specified by the
4793 1.1 mrg "saveall" attribute. */
4794 1.1 mrg
4795 1.1 mrg static int
4796 1.1 mrg h8300_saveall_function_p (tree func)
4797 1.1 mrg {
4798 1.1 mrg tree a;
4799 1.1 mrg
4800 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
4801 1.1 mrg return 0;
4802 1.1 mrg
4803 1.1 mrg a = lookup_attribute ("saveall", DECL_ATTRIBUTES (func));
4804 1.1 mrg return a != NULL_TREE;
4805 1.1 mrg }
4806 1.1 mrg
4807 1.1 mrg /* Return nonzero if FUNC is an OS_Task function as specified
4808 1.1 mrg by the "OS_Task" attribute. */
4809 1.1 mrg
4810 1.1 mrg static int
4811 1.1 mrg h8300_os_task_function_p (tree func)
4812 1.1 mrg {
4813 1.1 mrg tree a;
4814 1.1 mrg
4815 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
4816 1.1 mrg return 0;
4817 1.1 mrg
4818 1.1 mrg a = lookup_attribute ("OS_Task", DECL_ATTRIBUTES (func));
4819 1.1 mrg return a != NULL_TREE;
4820 1.1 mrg }
4821 1.1 mrg
4822 1.1 mrg /* Return nonzero if FUNC is a monitor function as specified
4823 1.1 mrg by the "monitor" attribute. */
4824 1.1 mrg
4825 1.1 mrg static int
4826 1.1 mrg h8300_monitor_function_p (tree func)
4827 1.1 mrg {
4828 1.1 mrg tree a;
4829 1.1 mrg
4830 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
4831 1.1 mrg return 0;
4832 1.1 mrg
4833 1.1 mrg a = lookup_attribute ("monitor", DECL_ATTRIBUTES (func));
4834 1.1 mrg return a != NULL_TREE;
4835 1.1 mrg }
4836 1.1 mrg
4837 1.1 mrg /* Return nonzero if FUNC is a function that should be called
4838 1.1 mrg through the function vector. */
4839 1.1 mrg
4840 1.1 mrg int
4841 1.1 mrg h8300_funcvec_function_p (tree func)
4842 1.1 mrg {
4843 1.1 mrg tree a;
4844 1.1 mrg
4845 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
4846 1.1 mrg return 0;
4847 1.1 mrg
4848 1.1 mrg a = lookup_attribute ("function_vector", DECL_ATTRIBUTES (func));
4849 1.1 mrg return a != NULL_TREE;
4850 1.1 mrg }
4851 1.1 mrg
4852 1.1 mrg /* Return nonzero if DECL is a variable that's in the eight bit
4853 1.1 mrg data area. */
4854 1.1 mrg
4855 1.1 mrg int
4856 1.1 mrg h8300_eightbit_data_p (tree decl)
4857 1.1 mrg {
4858 1.1 mrg tree a;
4859 1.1 mrg
4860 1.1 mrg if (TREE_CODE (decl) != VAR_DECL)
4861 1.1 mrg return 0;
4862 1.1 mrg
4863 1.1 mrg a = lookup_attribute ("eightbit_data", DECL_ATTRIBUTES (decl));
4864 1.1 mrg return a != NULL_TREE;
4865 1.1 mrg }
4866 1.1 mrg
4867 1.1 mrg /* Return nonzero if DECL is a variable that's in the tiny
4868 1.1 mrg data area. */
4869 1.1 mrg
4870 1.1 mrg int
4871 1.1 mrg h8300_tiny_data_p (tree decl)
4872 1.1 mrg {
4873 1.1 mrg tree a;
4874 1.1 mrg
4875 1.1 mrg if (TREE_CODE (decl) != VAR_DECL)
4876 1.1 mrg return 0;
4877 1.1 mrg
4878 1.1 mrg a = lookup_attribute ("tiny_data", DECL_ATTRIBUTES (decl));
4879 1.1 mrg return a != NULL_TREE;
4880 1.1 mrg }
4881 1.1 mrg
4882 1.1 mrg /* Generate an 'interrupt_handler' attribute for decls. We convert
4883 1.1 mrg all the pragmas to corresponding attributes. */
4884 1.1 mrg
4885 1.1 mrg static void
4886 1.1 mrg h8300_insert_attributes (tree node, tree *attributes)
4887 1.1 mrg {
4888 1.1 mrg if (TREE_CODE (node) == FUNCTION_DECL)
4889 1.1 mrg {
4890 1.1 mrg if (pragma_interrupt)
4891 1.1 mrg {
4892 1.1 mrg pragma_interrupt = 0;
4893 1.1 mrg
4894 1.1 mrg /* Add an 'interrupt_handler' attribute. */
4895 1.1 mrg *attributes = tree_cons (get_identifier ("interrupt_handler"),
4896 1.1 mrg NULL, *attributes);
4897 1.1 mrg }
4898 1.1 mrg
4899 1.1 mrg if (pragma_saveall)
4900 1.1 mrg {
4901 1.1 mrg pragma_saveall = 0;
4902 1.1 mrg
4903 1.1 mrg /* Add an 'saveall' attribute. */
4904 1.1 mrg *attributes = tree_cons (get_identifier ("saveall"),
4905 1.1 mrg NULL, *attributes);
4906 1.1 mrg }
4907 1.1 mrg }
4908 1.1 mrg }
4909 1.1 mrg
4910 1.1 mrg /* Supported attributes:
4911 1.1 mrg
4912 1.1 mrg interrupt_handler: output a prologue and epilogue suitable for an
4913 1.1 mrg interrupt handler.
4914 1.1 mrg
4915 1.1 mrg saveall: output a prologue and epilogue that saves and restores
4916 1.1 mrg all registers except the stack pointer.
4917 1.1 mrg
4918 1.1 mrg function_vector: This function should be called through the
4919 1.1 mrg function vector.
4920 1.1 mrg
4921 1.1 mrg eightbit_data: This variable lives in the 8-bit data area and can
4922 1.1 mrg be referenced with 8-bit absolute memory addresses.
4923 1.1 mrg
4924 1.1 mrg tiny_data: This variable lives in the tiny data area and can be
4925 1.1 mrg referenced with 16-bit absolute memory references. */
4926 1.1 mrg
4927 1.1 mrg static const struct attribute_spec h8300_attribute_table[] =
4928 1.1 mrg {
4929 1.1 mrg /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
4930 1.1 mrg affects_type_identity, handler, exclude } */
4931 1.1 mrg { "interrupt_handler", 0, 0, true, false, false, false,
4932 1.1 mrg h8300_handle_fndecl_attribute, NULL },
4933 1.1 mrg { "saveall", 0, 0, true, false, false, false,
4934 1.1 mrg h8300_handle_fndecl_attribute, NULL },
4935 1.1 mrg { "OS_Task", 0, 0, true, false, false, false,
4936 1.1 mrg h8300_handle_fndecl_attribute, NULL },
4937 1.1 mrg { "monitor", 0, 0, true, false, false, false,
4938 1.1 mrg h8300_handle_fndecl_attribute, NULL },
4939 1.1 mrg { "function_vector", 0, 0, true, false, false, false,
4940 1.1 mrg h8300_handle_fndecl_attribute, NULL },
4941 1.1 mrg { "eightbit_data", 0, 0, true, false, false, false,
4942 1.1 mrg h8300_handle_eightbit_data_attribute, NULL },
4943 1.1 mrg { "tiny_data", 0, 0, true, false, false, false,
4944 1.1 mrg h8300_handle_tiny_data_attribute, NULL },
4945 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL }
4946 1.1 mrg };
4947 1.1 mrg
4948 1.1 mrg
4949 1.1 mrg /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
4950 1.1 mrg struct attribute_spec.handler. */
4951 1.1 mrg static tree
4952 1.1 mrg h8300_handle_fndecl_attribute (tree *node, tree name,
4953 1.1 mrg tree args ATTRIBUTE_UNUSED,
4954 1.1 mrg int flags ATTRIBUTE_UNUSED,
4955 1.1 mrg bool *no_add_attrs)
4956 1.1 mrg {
4957 1.1 mrg if (TREE_CODE (*node) != FUNCTION_DECL)
4958 1.1 mrg {
4959 1.1 mrg warning (OPT_Wattributes, "%qE attribute only applies to functions",
4960 1.1 mrg name);
4961 1.1 mrg *no_add_attrs = true;
4962 1.1 mrg }
4963 1.1 mrg
4964 1.1 mrg return NULL_TREE;
4965 1.1 mrg }
4966 1.1 mrg
4967 1.1 mrg /* Handle an "eightbit_data" attribute; arguments as in
4968 1.1 mrg struct attribute_spec.handler. */
4969 1.1 mrg static tree
4970 1.1 mrg h8300_handle_eightbit_data_attribute (tree *node, tree name,
4971 1.1 mrg tree args ATTRIBUTE_UNUSED,
4972 1.1 mrg int flags ATTRIBUTE_UNUSED,
4973 1.1 mrg bool *no_add_attrs)
4974 1.1 mrg {
4975 1.1 mrg tree decl = *node;
4976 1.1 mrg
4977 1.1 mrg if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
4978 1.1 mrg {
4979 1.1 mrg set_decl_section_name (decl, ".eight");
4980 1.1 mrg }
4981 1.1 mrg else
4982 1.1 mrg {
4983 1.1 mrg warning (OPT_Wattributes, "%qE attribute ignored",
4984 1.1 mrg name);
4985 1.1 mrg *no_add_attrs = true;
4986 1.1 mrg }
4987 1.1 mrg
4988 1.1 mrg return NULL_TREE;
4989 1.1 mrg }
4990 1.1 mrg
4991 1.1 mrg /* Handle an "tiny_data" attribute; arguments as in
4992 1.1 mrg struct attribute_spec.handler. */
4993 1.1 mrg static tree
4994 1.1 mrg h8300_handle_tiny_data_attribute (tree *node, tree name,
4995 1.1 mrg tree args ATTRIBUTE_UNUSED,
4996 1.1 mrg int flags ATTRIBUTE_UNUSED,
4997 1.1 mrg bool *no_add_attrs)
4998 1.1 mrg {
4999 1.1 mrg tree decl = *node;
5000 1.1 mrg
5001 1.1 mrg if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
5002 1.1 mrg {
5003 1.1 mrg set_decl_section_name (decl, ".tiny");
5004 1.1 mrg }
5005 1.1 mrg else
5006 1.1 mrg {
5007 1.1 mrg warning (OPT_Wattributes, "%qE attribute ignored",
5008 1.1 mrg name);
5009 1.1 mrg *no_add_attrs = true;
5010 1.1 mrg }
5011 1.1 mrg
5012 1.1 mrg return NULL_TREE;
5013 1.1 mrg }
5014 1.1 mrg
5015 1.1 mrg /* Mark function vectors, and various small data objects. */
5016 1.1 mrg
5017 1.1 mrg static void
5018 1.1 mrg h8300_encode_section_info (tree decl, rtx rtl, int first)
5019 1.1 mrg {
5020 1.1 mrg int extra_flags = 0;
5021 1.1 mrg
5022 1.1 mrg default_encode_section_info (decl, rtl, first);
5023 1.1 mrg
5024 1.1 mrg if (TREE_CODE (decl) == FUNCTION_DECL
5025 1.1 mrg && h8300_funcvec_function_p (decl))
5026 1.1 mrg extra_flags = SYMBOL_FLAG_FUNCVEC_FUNCTION;
5027 1.1 mrg else if (TREE_CODE (decl) == VAR_DECL
5028 1.1 mrg && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
5029 1.1 mrg {
5030 1.1 mrg if (h8300_eightbit_data_p (decl))
5031 1.1 mrg extra_flags = SYMBOL_FLAG_EIGHTBIT_DATA;
5032 1.1 mrg else if (first && h8300_tiny_data_p (decl))
5033 1.1 mrg extra_flags = SYMBOL_FLAG_TINY_DATA;
5034 1.1 mrg }
5035 1.1 mrg
5036 1.1 mrg if (extra_flags)
5037 1.1 mrg SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
5038 1.1 mrg }
5039 1.1 mrg
5040 1.1 mrg /* Output a single-bit extraction. */
5041 1.1 mrg
5042 1.1 mrg const char *
5043 1.1 mrg output_simode_bld (int bild, rtx operands[])
5044 1.1 mrg {
5045 1.1 mrg /* Determine if we can clear the destination first. */
5046 1.1 mrg int clear_first = (REG_P (operands[0]) && REG_P (operands[1])
5047 1.1 mrg && REGNO (operands[0]) != REGNO (operands[1]));
5048 1.1 mrg
5049 1.1 mrg if (clear_first)
5050 1.1 mrg output_asm_insn ("sub.l\t%S0,%S0", operands);
5051 1.1 mrg
5052 1.1 mrg /* Output the bit load or bit inverse load. */
5053 1.1 mrg if (bild)
5054 1.1 mrg output_asm_insn ("bild\t%Z2,%Y1", operands);
5055 1.1 mrg else
5056 1.1 mrg output_asm_insn ("bld\t%Z2,%Y1", operands);
5057 1.1 mrg
5058 1.1 mrg if (!clear_first)
5059 1.1 mrg output_asm_insn ("xor.l\t%S0,%S0", operands);
5060 1.1 mrg
5061 1.1 mrg /* Perform the bit store. */
5062 1.1 mrg output_asm_insn ("rotxl.l\t%S0", operands);
5063 1.1 mrg
5064 1.1 mrg /* All done. */
5065 1.1 mrg return "";
5066 1.1 mrg }
5067 1.1 mrg
5068 1.1 mrg /* Delayed-branch scheduling is more effective if we have some idea
5069 1.1 mrg how long each instruction will be. Use a shorten_branches pass
5070 1.1 mrg to get an initial estimate. */
5071 1.1 mrg
5072 1.1 mrg static void
5073 1.1 mrg h8300_reorg (void)
5074 1.1 mrg {
5075 1.1 mrg if (flag_delayed_branch)
5076 1.1 mrg shorten_branches (get_insns ());
5077 1.1 mrg }
5078 1.1 mrg
5079 1.1 mrg /* Nonzero if X is a constant address suitable as an 8-bit absolute,
5080 1.1 mrg which is a special case of the 'R' operand. */
5081 1.1 mrg
5082 1.1 mrg int
5083 1.1 mrg h8300_eightbit_constant_address_p (rtx x)
5084 1.1 mrg {
5085 1.1 mrg /* The ranges of the 8-bit area. */
5086 1.1 mrg const unsigned HOST_WIDE_INT n1 = trunc_int_for_mode (0xff00, HImode);
5087 1.1 mrg const unsigned HOST_WIDE_INT n2 = trunc_int_for_mode (0xffff, HImode);
5088 1.1 mrg const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00ffff00, SImode);
5089 1.1 mrg const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00ffffff, SImode);
5090 1.1 mrg const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0xffffff00, SImode);
5091 1.1 mrg const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0xffffffff, SImode);
5092 1.1 mrg
5093 1.1 mrg unsigned HOST_WIDE_INT addr;
5094 1.1 mrg
5095 1.1 mrg /* We accept symbols declared with eightbit_data. */
5096 1.1 mrg if (GET_CODE (x) == SYMBOL_REF)
5097 1.1 mrg return (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0;
5098 1.1 mrg
5099 1.1 mrg if (GET_CODE (x) == CONST
5100 1.1 mrg && GET_CODE (XEXP (x, 0)) == PLUS
5101 1.1 mrg && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
5102 1.1 mrg && (SYMBOL_REF_FLAGS (XEXP (XEXP (x, 0), 0)) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0)
5103 1.1 mrg return 1;
5104 1.1 mrg
5105 1.1 mrg if (GET_CODE (x) != CONST_INT)
5106 1.1 mrg return 0;
5107 1.1 mrg
5108 1.1 mrg addr = INTVAL (x);
5109 1.1 mrg
5110 1.1 mrg return (0
5111 1.1 mrg || (TARGET_NORMAL_MODE && IN_RANGE (addr, n1, n2))
5112 1.1 mrg || (TARGET_H8300H && IN_RANGE (addr, h1, h2))
5113 1.1 mrg || (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
5114 1.1 mrg }
5115 1.1 mrg
5116 1.1 mrg /* Nonzero if X is a constant address suitable as an 16-bit absolute
5117 1.1 mrg on H8/300H and H8S. */
5118 1.1 mrg
5119 1.1 mrg int
5120 1.1 mrg h8300_tiny_constant_address_p (rtx x)
5121 1.1 mrg {
5122 1.1 mrg /* The ranges of the 16-bit area. */
5123 1.1 mrg const unsigned HOST_WIDE_INT h1 = trunc_int_for_mode (0x00000000, SImode);
5124 1.1 mrg const unsigned HOST_WIDE_INT h2 = trunc_int_for_mode (0x00007fff, SImode);
5125 1.1 mrg const unsigned HOST_WIDE_INT h3 = trunc_int_for_mode (0x00ff8000, SImode);
5126 1.1 mrg const unsigned HOST_WIDE_INT h4 = trunc_int_for_mode (0x00ffffff, SImode);
5127 1.1 mrg const unsigned HOST_WIDE_INT s1 = trunc_int_for_mode (0x00000000, SImode);
5128 1.1 mrg const unsigned HOST_WIDE_INT s2 = trunc_int_for_mode (0x00007fff, SImode);
5129 1.1 mrg const unsigned HOST_WIDE_INT s3 = trunc_int_for_mode (0xffff8000, SImode);
5130 1.1 mrg const unsigned HOST_WIDE_INT s4 = trunc_int_for_mode (0xffffffff, SImode);
5131 1.1 mrg
5132 1.1 mrg unsigned HOST_WIDE_INT addr;
5133 1.1 mrg
5134 1.1 mrg switch (GET_CODE (x))
5135 1.1 mrg {
5136 1.1 mrg case SYMBOL_REF:
5137 1.1 mrg /* In the normal mode, any symbol fits in the 16-bit absolute
5138 1.1 mrg address range. We also accept symbols declared with
5139 1.1 mrg tiny_data. */
5140 1.1 mrg return (TARGET_NORMAL_MODE
5141 1.1 mrg || (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_TINY_DATA) != 0);
5142 1.1 mrg
5143 1.1 mrg case CONST_INT:
5144 1.1 mrg addr = INTVAL (x);
5145 1.1 mrg return (TARGET_NORMAL_MODE
5146 1.1 mrg || (TARGET_H8300H
5147 1.1 mrg && (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
5148 1.1 mrg || (TARGET_H8300S
5149 1.1 mrg && (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));
5150 1.1 mrg
5151 1.1 mrg case CONST:
5152 1.1 mrg return TARGET_NORMAL_MODE;
5153 1.1 mrg
5154 1.1 mrg default:
5155 1.1 mrg return 0;
5156 1.1 mrg }
5157 1.1 mrg
5158 1.1 mrg }
5159 1.1 mrg
5160 1.1 mrg /* Return nonzero if ADDR1 and ADDR2 point to consecutive memory
5161 1.1 mrg locations that can be accessed as a 16-bit word. */
5162 1.1 mrg
5163 1.1 mrg int
5164 1.1 mrg byte_accesses_mergeable_p (rtx addr1, rtx addr2)
5165 1.1 mrg {
5166 1.1 mrg HOST_WIDE_INT offset1, offset2;
5167 1.1 mrg rtx reg1, reg2;
5168 1.1 mrg
5169 1.1 mrg if (REG_P (addr1))
5170 1.1 mrg {
5171 1.1 mrg reg1 = addr1;
5172 1.1 mrg offset1 = 0;
5173 1.1 mrg }
5174 1.1 mrg else if (GET_CODE (addr1) == PLUS
5175 1.1 mrg && REG_P (XEXP (addr1, 0))
5176 1.1 mrg && GET_CODE (XEXP (addr1, 1)) == CONST_INT)
5177 1.1 mrg {
5178 1.1 mrg reg1 = XEXP (addr1, 0);
5179 1.1 mrg offset1 = INTVAL (XEXP (addr1, 1));
5180 1.1 mrg }
5181 1.1 mrg else
5182 1.1 mrg return 0;
5183 1.1 mrg
5184 1.1 mrg if (REG_P (addr2))
5185 1.1 mrg {
5186 1.1 mrg reg2 = addr2;
5187 1.1 mrg offset2 = 0;
5188 1.1 mrg }
5189 1.1 mrg else if (GET_CODE (addr2) == PLUS
5190 1.1 mrg && REG_P (XEXP (addr2, 0))
5191 1.1 mrg && GET_CODE (XEXP (addr2, 1)) == CONST_INT)
5192 1.1 mrg {
5193 1.1 mrg reg2 = XEXP (addr2, 0);
5194 1.1 mrg offset2 = INTVAL (XEXP (addr2, 1));
5195 1.1 mrg }
5196 1.1 mrg else
5197 1.1 mrg return 0;
5198 1.1 mrg
5199 1.1 mrg if (((reg1 == stack_pointer_rtx && reg2 == stack_pointer_rtx)
5200 1.1 mrg || (reg1 == frame_pointer_rtx && reg2 == frame_pointer_rtx))
5201 1.1 mrg && offset1 % 2 == 0
5202 1.1 mrg && offset1 + 1 == offset2)
5203 1.1 mrg return 1;
5204 1.1 mrg
5205 1.1 mrg return 0;
5206 1.1 mrg }
5207 1.1 mrg
5208 1.1 mrg /* Return nonzero if we have the same comparison insn as I3 two insns
5209 1.1 mrg before I3. I3 is assumed to be a comparison insn. */
5210 1.1 mrg
5211 1.1 mrg int
5212 1.1 mrg same_cmp_preceding_p (rtx_insn *i3)
5213 1.1 mrg {
5214 1.1 mrg rtx_insn *i1, *i2;
5215 1.1 mrg
5216 1.1 mrg /* Make sure we have a sequence of three insns. */
5217 1.1 mrg i2 = prev_nonnote_insn (i3);
5218 1.1 mrg if (i2 == NULL)
5219 1.1 mrg return 0;
5220 1.1 mrg i1 = prev_nonnote_insn (i2);
5221 1.1 mrg if (i1 == NULL)
5222 1.1 mrg return 0;
5223 1.1 mrg
5224 1.1 mrg return (INSN_P (i1) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5225 1.1 mrg && any_condjump_p (i2) && onlyjump_p (i2));
5226 1.1 mrg }
5227 1.1 mrg
5228 1.1 mrg /* Return nonzero if we have the same comparison insn as I1 two insns
5229 1.1 mrg after I1. I1 is assumed to be a comparison insn. */
5230 1.1 mrg
5231 1.1 mrg int
5232 1.1 mrg same_cmp_following_p (rtx_insn *i1)
5233 1.1 mrg {
5234 1.1 mrg rtx_insn *i2, *i3;
5235 1.1 mrg
5236 1.1 mrg /* Make sure we have a sequence of three insns. */
5237 1.1 mrg i2 = next_nonnote_insn (i1);
5238 1.1 mrg if (i2 == NULL)
5239 1.1 mrg return 0;
5240 1.1 mrg i3 = next_nonnote_insn (i2);
5241 1.1 mrg if (i3 == NULL)
5242 1.1 mrg return 0;
5243 1.1 mrg
5244 1.1 mrg return (INSN_P (i3) && rtx_equal_p (PATTERN (i1), PATTERN (i3))
5245 1.1 mrg && any_condjump_p (i2) && onlyjump_p (i2));
5246 1.1 mrg }
5247 1.1 mrg
5248 1.1 mrg /* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
5249 1.1 mrg (or pops) N registers. OPERANDS are assumed to be an array of
5250 1.1 mrg registers. */
5251 1.1 mrg
5252 1.1 mrg int
5253 1.1 mrg h8300_regs_ok_for_stm (int n, rtx operands[])
5254 1.1 mrg {
5255 1.1 mrg switch (n)
5256 1.1 mrg {
5257 1.1 mrg case 2:
5258 1.1 mrg return ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
5259 1.1 mrg || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
5260 1.1 mrg || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5));
5261 1.1 mrg case 3:
5262 1.1 mrg return ((REGNO (operands[0]) == 0
5263 1.1 mrg && REGNO (operands[1]) == 1
5264 1.1 mrg && REGNO (operands[2]) == 2)
5265 1.1 mrg || (REGNO (operands[0]) == 4
5266 1.1 mrg && REGNO (operands[1]) == 5
5267 1.1 mrg && REGNO (operands[2]) == 6));
5268 1.1 mrg
5269 1.1 mrg case 4:
5270 1.1 mrg return (REGNO (operands[0]) == 0
5271 1.1 mrg && REGNO (operands[1]) == 1
5272 1.1 mrg && REGNO (operands[2]) == 2
5273 1.1 mrg && REGNO (operands[3]) == 3);
5274 1.1 mrg default:
5275 1.1 mrg gcc_unreachable ();
5276 1.1 mrg }
5277 1.1 mrg }
5278 1.1 mrg
5279 1.1 mrg /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
5280 1.1 mrg
5281 1.1 mrg int
5282 1.1 mrg h8300_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
5283 1.1 mrg unsigned int new_reg)
5284 1.1 mrg {
5285 1.1 mrg /* Interrupt functions can only use registers that have already been
5286 1.1 mrg saved by the prologue, even if they would normally be
5287 1.1 mrg call-clobbered. */
5288 1.1 mrg
5289 1.1 mrg if (h8300_current_function_interrupt_function_p ()
5290 1.1 mrg && !df_regs_ever_live_p (new_reg))
5291 1.1 mrg return 0;
5292 1.1 mrg
5293 1.1 mrg return 1;
5294 1.1 mrg }
5295 1.1 mrg
5296 1.1 mrg /* Returns true if register REGNO is safe to be allocated as a scratch
5297 1.1 mrg register in the current function. */
5298 1.1 mrg
5299 1.1 mrg static bool
5300 1.1 mrg h8300_hard_regno_scratch_ok (unsigned int regno)
5301 1.1 mrg {
5302 1.1 mrg if (h8300_current_function_interrupt_function_p ()
5303 1.1 mrg && ! WORD_REG_USED (regno))
5304 1.1 mrg return false;
5305 1.1 mrg
5306 1.1 mrg return true;
5307 1.1 mrg }
5308 1.1 mrg
5309 1.1 mrg
5310 1.1 mrg /* Return nonzero if X is a REG or SUBREG suitable as a base register. */
5311 1.1 mrg
5312 1.1 mrg static int
5313 1.1 mrg h8300_rtx_ok_for_base_p (rtx x, int strict)
5314 1.1 mrg {
5315 1.1 mrg /* Strip off SUBREG if any. */
5316 1.1 mrg if (GET_CODE (x) == SUBREG)
5317 1.1 mrg x = SUBREG_REG (x);
5318 1.1 mrg
5319 1.1 mrg return (REG_P (x)
5320 1.1 mrg && (strict
5321 1.1 mrg ? REG_OK_FOR_BASE_STRICT_P (x)
5322 1.1 mrg : REG_OK_FOR_BASE_NONSTRICT_P (x)));
5323 1.1 mrg }
5324 1.1 mrg
5325 1.1 mrg /* Return nozero if X is a legitimate address. On the H8/300, a
5326 1.1 mrg legitimate address has the form REG, REG+CONSTANT_ADDRESS or
5327 1.1 mrg CONSTANT_ADDRESS. */
5328 1.1 mrg
5329 1.1 mrg static bool
5330 1.1 mrg h8300_legitimate_address_p (machine_mode mode, rtx x, bool strict)
5331 1.1 mrg {
5332 1.1 mrg /* The register indirect addresses like @er0 is always valid. */
5333 1.1 mrg if (h8300_rtx_ok_for_base_p (x, strict))
5334 1.1 mrg return 1;
5335 1.1 mrg
5336 1.1 mrg if (CONSTANT_ADDRESS_P (x))
5337 1.1 mrg return 1;
5338 1.1 mrg
5339 1.1 mrg if (TARGET_H8300SX
5340 1.1 mrg && ( GET_CODE (x) == PRE_INC
5341 1.1 mrg || GET_CODE (x) == PRE_DEC
5342 1.1 mrg || GET_CODE (x) == POST_INC
5343 1.1 mrg || GET_CODE (x) == POST_DEC)
5344 1.1 mrg && h8300_rtx_ok_for_base_p (XEXP (x, 0), strict))
5345 1.1 mrg return 1;
5346 1.1 mrg
5347 1.1 mrg if (GET_CODE (x) == PLUS
5348 1.1 mrg && CONSTANT_ADDRESS_P (XEXP (x, 1))
5349 1.1 mrg && h8300_rtx_ok_for_base_p (h8300_get_index (XEXP (x, 0),
5350 1.1 mrg mode, 0), strict))
5351 1.1 mrg return 1;
5352 1.1 mrg
5353 1.1 mrg return 0;
5354 1.1 mrg }
5355 1.1 mrg
5356 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. */
5357 1.1 mrg
5358 1.1 mrg static bool
5359 1.1 mrg h8300_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
5360 1.1 mrg {
5361 1.1 mrg /* MAC register can only be of SImode. Otherwise, anything
5362 1.1 mrg goes. */
5363 1.1 mrg return regno == MAC_REG ? mode == SImode : 1;
5364 1.1 mrg }
5365 1.1 mrg
5366 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P. */
5367 1.1 mrg
5368 1.1 mrg static bool
5369 1.1 mrg h8300_modes_tieable_p (machine_mode mode1, machine_mode mode2)
5370 1.1 mrg {
5371 1.1 mrg return (mode1 == mode2
5372 1.1 mrg || ((mode1 == QImode
5373 1.1 mrg || mode1 == HImode
5374 1.1 mrg || mode1 == SImode)
5375 1.1 mrg && (mode2 == QImode
5376 1.1 mrg || mode2 == HImode
5377 1.1 mrg || mode2 == SImode)));
5378 1.1 mrg }
5379 1.1 mrg
5380 1.1 mrg /* Helper function for the move patterns. Make sure a move is legitimate. */
5381 1.1 mrg
5382 1.1 mrg bool
5383 1.1 mrg h8300_move_ok (rtx dest, rtx src)
5384 1.1 mrg {
5385 1.1 mrg rtx addr, other;
5386 1.1 mrg
5387 1.1 mrg /* Validate that at least one operand is a register. */
5388 1.1 mrg if (MEM_P (dest))
5389 1.1 mrg {
5390 1.1 mrg if (MEM_P (src) || CONSTANT_P (src))
5391 1.1 mrg return false;
5392 1.1 mrg addr = XEXP (dest, 0);
5393 1.1 mrg other = src;
5394 1.1 mrg }
5395 1.1 mrg else if (MEM_P (src))
5396 1.1 mrg {
5397 1.1 mrg addr = XEXP (src, 0);
5398 1.1 mrg other = dest;
5399 1.1 mrg }
5400 1.1 mrg else
5401 1.1 mrg return true;
5402 1.1 mrg
5403 1.1 mrg /* Validate that auto-inc doesn't affect OTHER. */
5404 1.1 mrg if (GET_RTX_CLASS (GET_CODE (addr)) != RTX_AUTOINC)
5405 1.1 mrg return true;
5406 1.1 mrg addr = XEXP (addr, 0);
5407 1.1 mrg
5408 1.1 mrg if (addr == stack_pointer_rtx)
5409 1.1 mrg return register_no_sp_elim_operand (other, VOIDmode);
5410 1.1 mrg else
5411 1.1 mrg return !reg_overlap_mentioned_p(other, addr);
5412 1.1 mrg }
5413 1.1 mrg
5414 1.1 mrg /* Perform target dependent optabs initialization. */
5416 1.1 mrg static void
5417 1.1 mrg h8300_init_libfuncs (void)
5418 1.1 mrg {
5419 1.1 mrg set_optab_libfunc (smul_optab, HImode, "__mulhi3");
5420 1.1 mrg set_optab_libfunc (sdiv_optab, HImode, "__divhi3");
5421 1.1 mrg set_optab_libfunc (udiv_optab, HImode, "__udivhi3");
5422 1.1 mrg set_optab_libfunc (smod_optab, HImode, "__modhi3");
5423 1.1 mrg set_optab_libfunc (umod_optab, HImode, "__umodhi3");
5424 1.1 mrg }
5425 1.1 mrg
5426 1.1 mrg /* Worker function for TARGET_FUNCTION_VALUE.
5428 1.1 mrg
5429 1.1 mrg On the H8 the return value is in R0/R1. */
5430 1.1 mrg
5431 1.1 mrg static rtx
5432 1.1 mrg h8300_function_value (const_tree ret_type,
5433 1.1 mrg const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
5434 1.1 mrg bool outgoing ATTRIBUTE_UNUSED)
5435 1.1 mrg {
5436 1.1 mrg return gen_rtx_REG (TYPE_MODE (ret_type), R0_REG);
5437 1.1 mrg }
5438 1.1 mrg
5439 1.1 mrg /* Worker function for TARGET_LIBCALL_VALUE.
5440 1.1 mrg
5441 1.1 mrg On the H8 the return value is in R0/R1. */
5442 1.1 mrg
5443 1.1 mrg static rtx
5444 1.1 mrg h8300_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
5445 1.1 mrg {
5446 1.1 mrg return gen_rtx_REG (mode, R0_REG);
5447 1.1 mrg }
5448 1.1 mrg
5449 1.1 mrg /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
5450 1.1 mrg
5451 1.1 mrg On the H8, R0 is the only register thus used. */
5452 1.1 mrg
5453 1.1 mrg static bool
5454 1.1 mrg h8300_function_value_regno_p (const unsigned int regno)
5455 1.1 mrg {
5456 1.1 mrg return (regno == R0_REG);
5457 1.1 mrg }
5458 1.1 mrg
5459 1.1 mrg /* Worker function for TARGET_RETURN_IN_MEMORY. */
5460 1.1 mrg
5461 1.1 mrg static bool
5462 1.1 mrg h8300_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
5463 1.1 mrg {
5464 1.1 mrg return (TYPE_MODE (type) == BLKmode
5465 1.1 mrg || GET_MODE_SIZE (TYPE_MODE (type)) > 8);
5466 1.1 mrg }
5467 1.1 mrg
5468 1.1 mrg /* We emit the entire trampoline here. Depending on the pointer size,
5470 1.1 mrg we use a different trampoline.
5471 1.1 mrg
5472 1.1 mrg Pmode == HImode
5473 1.1 mrg vvvv context
5474 1.1 mrg 1 0000 7903xxxx mov.w #0x1234,r3
5475 1.1 mrg 2 0004 5A00xxxx jmp @0x1234
5476 1.1 mrg ^^^^ function
5477 1.1 mrg
5478 1.1 mrg Pmode == SImode
5479 1.1 mrg vvvvvvvv context
5480 1.1 mrg 2 0000 7A03xxxxxxxx mov.l #0x12345678,er3
5481 1.1 mrg 3 0006 5Axxxxxx jmp @0x123456
5482 1.1 mrg ^^^^^^ function
5483 1.1 mrg */
5484 1.1 mrg
5485 1.1 mrg static void
5486 1.1 mrg h8300_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
5487 1.1 mrg {
5488 1.1 mrg rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
5489 1.1 mrg rtx mem;
5490 1.1 mrg
5491 1.1 mrg if (Pmode == HImode)
5492 1.1 mrg {
5493 1.1 mrg mem = adjust_address (m_tramp, HImode, 0);
5494 1.1 mrg emit_move_insn (mem, GEN_INT (0x7903));
5495 1.1 mrg mem = adjust_address (m_tramp, Pmode, 2);
5496 1.1 mrg emit_move_insn (mem, cxt);
5497 1.1 mrg mem = adjust_address (m_tramp, HImode, 4);
5498 1.1 mrg emit_move_insn (mem, GEN_INT (0x5a00));
5499 1.1 mrg mem = adjust_address (m_tramp, Pmode, 6);
5500 1.1 mrg emit_move_insn (mem, fnaddr);
5501 1.1 mrg }
5502 1.1 mrg else
5503 1.1 mrg {
5504 1.1 mrg rtx tem;
5505 1.1 mrg
5506 1.1 mrg mem = adjust_address (m_tramp, HImode, 0);
5507 1.1 mrg emit_move_insn (mem, GEN_INT (0x7a03));
5508 1.1 mrg mem = adjust_address (m_tramp, Pmode, 2);
5509 1.1 mrg emit_move_insn (mem, cxt);
5510 1.1 mrg
5511 1.1 mrg tem = copy_to_reg (fnaddr);
5512 1.1 mrg emit_insn (gen_andsi3 (tem, tem, GEN_INT (0x00ffffff)));
5513 1.1 mrg emit_insn (gen_iorsi3 (tem, tem, GEN_INT (0x5a000000)));
5514 1.1 mrg mem = adjust_address (m_tramp, SImode, 6);
5515 1.1 mrg emit_move_insn (mem, tem);
5516 1.1 mrg }
5517 1.1 mrg }
5518 1.1 mrg
5519 1.1 mrg /* Implement PUSH_ROUNDING.
5520 1.1 mrg
5521 1.1 mrg On the H8/300, @-sp really pushes a byte if you ask it to - but that's
5522 1.1 mrg dangerous, so we claim that it always pushes a word, then we catch
5523 1.1 mrg the mov.b rx,@-sp and turn it into a mov.w rx,@-sp on output.
5524 1.1 mrg
5525 1.1 mrg On the H8/300H, we simplify TARGET_QUICKCALL by setting this to 4
5526 1.1 mrg and doing a similar thing. */
5527 1.1 mrg
5528 1.1 mrg poly_int64
5529 1.1 mrg h8300_push_rounding (poly_int64 bytes)
5530 1.1 mrg {
5531 1.1 mrg return ((bytes + PARM_BOUNDARY / 8 - 1) & (-PARM_BOUNDARY / 8));
5532 1.1 mrg }
5533 1.1 mrg
5534 1.1 mrg static bool
5535 1.1 mrg h8300_ok_for_sibcall_p (tree fndecl, tree)
5536 1.1 mrg {
5537 1.1 mrg /* If either the caller or target are special, then assume sibling
5538 1.1 mrg calls are not OK. */
5539 1.1 mrg if (!fndecl
5540 1.1 mrg || h8300_os_task_function_p (fndecl)
5541 1.1 mrg || h8300_monitor_function_p (fndecl)
5542 1.1 mrg || h8300_interrupt_function_p (fndecl)
5543 1.1 mrg || h8300_saveall_function_p (fndecl)
5544 1.1 mrg || h8300_os_task_function_p (current_function_decl)
5545 1.1 mrg || h8300_monitor_function_p (current_function_decl)
5546 1.1 mrg || h8300_interrupt_function_p (current_function_decl)
5547 1.1 mrg || h8300_saveall_function_p (current_function_decl))
5548 1.1 mrg return false;
5549 1.1 mrg
5550 1.1 mrg return 1;
5551 1.1 mrg }
5552 1.1 mrg
5553 1.1 mrg /* Initialize the GCC target structure. */
5555 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE
5556 1.1 mrg #define TARGET_ATTRIBUTE_TABLE h8300_attribute_table
5557 1.1 mrg
5558 1.1 mrg #undef TARGET_ASM_ALIGNED_HI_OP
5559 1.1 mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
5560 1.1 mrg
5561 1.1 mrg #undef TARGET_ASM_FILE_START
5562 1.1 mrg #define TARGET_ASM_FILE_START h8300_file_start
5563 1.1 mrg #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
5564 1.1 mrg #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
5565 1.1 mrg
5566 1.1 mrg #undef TARGET_ASM_FILE_END
5567 1.1 mrg #define TARGET_ASM_FILE_END h8300_file_end
5568 1.1 mrg
5569 1.1 mrg #undef TARGET_PRINT_OPERAND
5570 1.1 mrg #define TARGET_PRINT_OPERAND h8300_print_operand
5571 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS
5572 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS h8300_print_operand_address
5573 1.1 mrg #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
5574 1.1 mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P h8300_print_operand_punct_valid_p
5575 1.1 mrg
5576 1.1 mrg #undef TARGET_ENCODE_SECTION_INFO
5577 1.1 mrg #define TARGET_ENCODE_SECTION_INFO h8300_encode_section_info
5578 1.1 mrg
5579 1.1 mrg #undef TARGET_INSERT_ATTRIBUTES
5580 1.1 mrg #define TARGET_INSERT_ATTRIBUTES h8300_insert_attributes
5581 1.1 mrg
5582 1.1 mrg #undef TARGET_REGISTER_MOVE_COST
5583 1.1 mrg #define TARGET_REGISTER_MOVE_COST h8300_register_move_cost
5584 1.1 mrg
5585 1.1 mrg #undef TARGET_RTX_COSTS
5586 1.1 mrg #define TARGET_RTX_COSTS h8300_rtx_costs
5587 1.1 mrg
5588 1.1 mrg #undef TARGET_INIT_LIBFUNCS
5589 1.1 mrg #define TARGET_INIT_LIBFUNCS h8300_init_libfuncs
5590 1.1 mrg
5591 1.1 mrg #undef TARGET_FUNCTION_VALUE
5592 1.1 mrg #define TARGET_FUNCTION_VALUE h8300_function_value
5593 1.1 mrg
5594 1.1 mrg #undef TARGET_LIBCALL_VALUE
5595 1.1 mrg #define TARGET_LIBCALL_VALUE h8300_libcall_value
5596 1.1 mrg
5597 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
5598 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P h8300_function_value_regno_p
5599 1.1 mrg
5600 1.1 mrg #undef TARGET_RETURN_IN_MEMORY
5601 1.1 mrg #define TARGET_RETURN_IN_MEMORY h8300_return_in_memory
5602 1.1 mrg
5603 1.1 mrg #undef TARGET_FUNCTION_ARG
5604 1.1 mrg #define TARGET_FUNCTION_ARG h8300_function_arg
5605 1.1 mrg
5606 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE
5607 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE h8300_function_arg_advance
5608 1.1 mrg
5609 1.1 mrg #undef TARGET_MACHINE_DEPENDENT_REORG
5610 1.1 mrg #define TARGET_MACHINE_DEPENDENT_REORG h8300_reorg
5611 1.1 mrg
5612 1.1 mrg #undef TARGET_HARD_REGNO_SCRATCH_OK
5613 1.1 mrg #define TARGET_HARD_REGNO_SCRATCH_OK h8300_hard_regno_scratch_ok
5614 1.1 mrg
5615 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK
5616 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK h8300_hard_regno_mode_ok
5617 1.1 mrg
5618 1.1 mrg #undef TARGET_MODES_TIEABLE_P
5619 1.1 mrg #define TARGET_MODES_TIEABLE_P h8300_modes_tieable_p
5620 1.1 mrg
5621 1.1 mrg #undef TARGET_LRA_P
5622 1.1 mrg #define TARGET_LRA_P hook_bool_void_false
5623 1.1 mrg
5624 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P
5625 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P h8300_legitimate_address_p
5626 1.1 mrg
5627 1.1 mrg #undef TARGET_CAN_ELIMINATE
5628 1.1 mrg #define TARGET_CAN_ELIMINATE h8300_can_eliminate
5629 1.1 mrg
5630 1.1 mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
5631 1.1 mrg #define TARGET_CONDITIONAL_REGISTER_USAGE h8300_conditional_register_usage
5632 1.1 mrg
5633 #undef TARGET_TRAMPOLINE_INIT
5634 #define TARGET_TRAMPOLINE_INIT h8300_trampoline_init
5635
5636 #undef TARGET_OPTION_OVERRIDE
5637 #define TARGET_OPTION_OVERRIDE h8300_option_override
5638
5639 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
5640 #define TARGET_MODE_DEPENDENT_ADDRESS_P h8300_mode_dependent_address_p
5641
5642 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
5643 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
5644
5645 #undef TARGET_FLAGS_REGNUM
5646 #define TARGET_FLAGS_REGNUM 12
5647
5648 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
5649 #define TARGET_FUNCTION_OK_FOR_SIBCALL h8300_ok_for_sibcall_p
5650
5651 struct gcc_target targetm = TARGET_INITIALIZER;
5652