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