1 1.1 christos /* tc-h8300.c -- Assemble code for the Renesas H8/300 2 1.10 christos Copyright (C) 1991-2025 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of GAS, the GNU Assembler. 5 1.1 christos 6 1.1 christos GAS is free software; you can redistribute it and/or modify 7 1.1 christos it under the terms of the GNU General Public License as published by 8 1.1 christos the Free Software Foundation; either version 3, or (at your option) 9 1.1 christos any later version. 10 1.1 christos 11 1.1 christos GAS is distributed in the hope that it will be useful, 12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 christos GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with GAS; see the file COPYING. If not, write to the Free 18 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 1.1 christos 02110-1301, USA. */ 20 1.1 christos 21 1.1 christos /* Written By Steve Chamberlain <sac (at) cygnus.com>. */ 22 1.1 christos 23 1.1 christos #include "as.h" 24 1.1 christos #include "subsegs.h" 25 1.1 christos #include "dwarf2dbg.h" 26 1.1 christos 27 1.1 christos #define DEFINE_TABLE 28 1.1 christos #define h8_opcodes ops 29 1.1 christos #include "opcode/h8300.h" 30 1.1 christos #include "safe-ctype.h" 31 1.1 christos #include "elf/h8.h" 32 1.1 christos 33 1.1 christos const char comment_chars[] = ";"; 34 1.1 christos const char line_comment_chars[] = "#"; 35 1.3 christos #ifdef TE_LINUX 36 1.3 christos const char line_separator_chars[] = "!"; 37 1.3 christos #else 38 1.1 christos const char line_separator_chars[] = ""; 39 1.3 christos #endif 40 1.1 christos 41 1.1 christos static void sbranch (int); 42 1.1 christos static void h8300hmode (int); 43 1.1 christos static void h8300smode (int); 44 1.1 christos static void h8300hnmode (int); 45 1.1 christos static void h8300snmode (int); 46 1.1 christos static void h8300sxmode (int); 47 1.1 christos static void h8300sxnmode (int); 48 1.1 christos static void pint (int); 49 1.1 christos 50 1.1 christos int Hmode; 51 1.1 christos int Smode; 52 1.1 christos int Nmode; 53 1.1 christos int SXmode; 54 1.1 christos 55 1.3 christos static int default_mach = bfd_mach_h8300; 56 1.3 christos 57 1.1 christos #define PSIZE (Hmode && !Nmode ? L_32 : L_16) 58 1.1 christos 59 1.1 christos static int bsize = L_8; /* Default branch displacement. */ 60 1.1 christos 61 1.1 christos struct h8_instruction 62 1.1 christos { 63 1.1 christos int length; 64 1.1 christos int noperands; 65 1.1 christos int idx; 66 1.1 christos int size; 67 1.1 christos const struct h8_opcode *opcode; 68 1.1 christos }; 69 1.1 christos 70 1.1 christos static struct h8_instruction *h8_instructions; 71 1.1 christos 72 1.1 christos static void 73 1.1 christos h8300hmode (int arg ATTRIBUTE_UNUSED) 74 1.1 christos { 75 1.1 christos Hmode = 1; 76 1.1 christos Smode = 0; 77 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h)) 78 1.1 christos as_warn (_("could not set architecture and machine")); 79 1.1 christos } 80 1.1 christos 81 1.1 christos static void 82 1.1 christos h8300smode (int arg ATTRIBUTE_UNUSED) 83 1.1 christos { 84 1.1 christos Smode = 1; 85 1.1 christos Hmode = 1; 86 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s)) 87 1.1 christos as_warn (_("could not set architecture and machine")); 88 1.1 christos } 89 1.1 christos 90 1.1 christos static void 91 1.1 christos h8300hnmode (int arg ATTRIBUTE_UNUSED) 92 1.1 christos { 93 1.1 christos Hmode = 1; 94 1.1 christos Smode = 0; 95 1.1 christos Nmode = 1; 96 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn)) 97 1.1 christos as_warn (_("could not set architecture and machine")); 98 1.1 christos } 99 1.1 christos 100 1.1 christos static void 101 1.1 christos h8300snmode (int arg ATTRIBUTE_UNUSED) 102 1.1 christos { 103 1.1 christos Smode = 1; 104 1.1 christos Hmode = 1; 105 1.1 christos Nmode = 1; 106 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn)) 107 1.1 christos as_warn (_("could not set architecture and machine")); 108 1.1 christos } 109 1.1 christos 110 1.1 christos static void 111 1.1 christos h8300sxmode (int arg ATTRIBUTE_UNUSED) 112 1.1 christos { 113 1.1 christos Smode = 1; 114 1.1 christos Hmode = 1; 115 1.1 christos SXmode = 1; 116 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx)) 117 1.1 christos as_warn (_("could not set architecture and machine")); 118 1.1 christos } 119 1.1 christos 120 1.1 christos static void 121 1.1 christos h8300sxnmode (int arg ATTRIBUTE_UNUSED) 122 1.1 christos { 123 1.1 christos Smode = 1; 124 1.1 christos Hmode = 1; 125 1.1 christos SXmode = 1; 126 1.1 christos Nmode = 1; 127 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn)) 128 1.1 christos as_warn (_("could not set architecture and machine")); 129 1.1 christos } 130 1.1 christos 131 1.1 christos static void 132 1.1 christos sbranch (int size) 133 1.1 christos { 134 1.1 christos bsize = size; 135 1.1 christos } 136 1.1 christos 137 1.1 christos static void 138 1.1 christos pint (int arg ATTRIBUTE_UNUSED) 139 1.1 christos { 140 1.1 christos cons (Hmode ? 4 : 2); 141 1.1 christos } 142 1.1 christos 143 1.1 christos /* Like obj_elf_section, but issues a warning for new 144 1.1 christos sections which do not have an attribute specification. */ 145 1.1 christos 146 1.1 christos static void 147 1.1 christos h8300_elf_section (int push) 148 1.1 christos { 149 1.10 christos static const char * known_data_sections [] 150 1.10 christos = { ".rodata", ".tdata", ".tbss", ".gnu_object_only" }; 151 1.10 christos static const char * known_data_prefixes [] 152 1.10 christos = { ".debug", ".zdebug", ".gnu.warning" }; 153 1.1 christos char * saved_ilp = input_line_pointer; 154 1.5 christos const char * name; 155 1.1 christos 156 1.1 christos name = obj_elf_section_name (); 157 1.1 christos if (name == NULL) 158 1.1 christos return; 159 1.1 christos 160 1.1 christos if (* input_line_pointer != ',' 161 1.1 christos && bfd_get_section_by_name (stdoutput, name) == NULL) 162 1.1 christos { 163 1.1 christos signed int i; 164 1.1 christos 165 1.1 christos /* Ignore this warning for well known data sections. */ 166 1.1 christos for (i = ARRAY_SIZE (known_data_sections); i--;) 167 1.1 christos if (strcmp (name, known_data_sections[i]) == 0) 168 1.1 christos break; 169 1.1 christos 170 1.1 christos if (i < 0) 171 1.1 christos for (i = ARRAY_SIZE (known_data_prefixes); i--;) 172 1.8 christos if (startswith (name, known_data_prefixes[i])) 173 1.1 christos break; 174 1.1 christos 175 1.1 christos if (i < 0) 176 1.1 christos as_warn (_("new section '%s' defined without attributes - this might cause problems"), name); 177 1.1 christos } 178 1.1 christos 179 1.1 christos /* FIXME: We ought to free the memory allocated by obj_elf_section_name() 180 1.1 christos for 'name', but we do not know if it was taken from the obstack, via 181 1.1 christos demand_copy_C_string(), or xmalloc()ed. */ 182 1.1 christos input_line_pointer = saved_ilp; 183 1.1 christos obj_elf_section (push); 184 1.1 christos } 185 1.1 christos 186 1.1 christos /* This table describes all the machine specific pseudo-ops the assembler 187 1.1 christos has to support. The fields are: 188 1.1 christos pseudo-op name without dot 189 1.1 christos function to call to execute this pseudo-op 190 1.1 christos Integer arg to pass to the function. */ 191 1.1 christos 192 1.1 christos const pseudo_typeS md_pseudo_table[] = 193 1.1 christos { 194 1.1 christos {"h8300h", h8300hmode, 0}, 195 1.1 christos {"h8300hn", h8300hnmode, 0}, 196 1.1 christos {"h8300s", h8300smode, 0}, 197 1.1 christos {"h8300sn", h8300snmode, 0}, 198 1.1 christos {"h8300sx", h8300sxmode, 0}, 199 1.1 christos {"h8300sxn", h8300sxnmode, 0}, 200 1.1 christos {"sbranch", sbranch, L_8}, 201 1.1 christos {"lbranch", sbranch, L_16}, 202 1.1 christos 203 1.1 christos {"int", pint, 0}, 204 1.1 christos {"data.b", cons, 1}, 205 1.1 christos {"data.w", cons, 2}, 206 1.1 christos {"data.l", cons, 4}, 207 1.1 christos {"form", listing_psize, 0}, 208 1.1 christos {"heading", listing_title, 0}, 209 1.1 christos {"import", s_ignore, 0}, 210 1.1 christos {"page", listing_eject, 0}, 211 1.1 christos {"program", s_ignore, 0}, 212 1.1 christos 213 1.1 christos {"section", h8300_elf_section, 0}, 214 1.1 christos {"section.s", h8300_elf_section, 0}, 215 1.1 christos {"sect", h8300_elf_section, 0}, 216 1.1 christos {"sect.s", h8300_elf_section, 0}, 217 1.1 christos 218 1.1 christos {0, 0, 0} 219 1.1 christos }; 220 1.1 christos 221 1.1 christos const char EXP_CHARS[] = "eE"; 222 1.1 christos 223 1.1 christos /* Chars that mean this number is a floating point constant 224 1.1 christos As in 0f12.456 225 1.1 christos or 0d1.2345e12. */ 226 1.1 christos const char FLT_CHARS[] = "rRsSfFdDxXpP"; 227 1.1 christos 228 1.8 christos static htab_t opcode_hash_control; /* Opcode mnemonics. */ 229 1.1 christos 230 1.1 christos /* This function is called once, at assembler startup time. This 231 1.1 christos should set up all the tables, etc. that the MD part of the assembler 232 1.1 christos needs. */ 233 1.1 christos 234 1.1 christos void 235 1.1 christos md_begin (void) 236 1.1 christos { 237 1.1 christos unsigned int nopcodes; 238 1.1 christos struct h8_opcode *p, *p1; 239 1.1 christos struct h8_instruction *pi; 240 1.1 christos int idx = 0; 241 1.1 christos 242 1.3 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, default_mach)) 243 1.1 christos as_warn (_("could not set architecture and machine")); 244 1.1 christos 245 1.8 christos opcode_hash_control = str_htab_create (); 246 1.1 christos 247 1.1 christos nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode); 248 1.3 christos 249 1.5 christos h8_instructions = XNEWVEC (struct h8_instruction, nopcodes); 250 1.1 christos 251 1.1 christos pi = h8_instructions; 252 1.1 christos p1 = h8_opcodes; 253 1.1 christos /* We do a minimum amount of sorting on the opcode table; this is to 254 1.1 christos make it easy to describe the mova instructions without unnecessary 255 1.1 christos code duplication. 256 1.1 christos Sorting only takes place inside blocks of instructions of the form 257 1.1 christos X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */ 258 1.1 christos while (p1) 259 1.1 christos { 260 1.1 christos struct h8_opcode *first_skipped = 0; 261 1.1 christos int len, cmplen = 0; 262 1.5 christos const char *src = p1->name; 263 1.1 christos char *dst, *buffer; 264 1.1 christos 265 1.1 christos if (p1->name == 0) 266 1.1 christos break; 267 1.1 christos /* Strip off any . part when inserting the opcode and only enter 268 1.1 christos unique codes into the hash table. */ 269 1.9 christos dst = buffer = notes_alloc (strlen (src) + 1); 270 1.1 christos while (*src) 271 1.1 christos { 272 1.1 christos if (*src == '.') 273 1.1 christos { 274 1.1 christos src++; 275 1.1 christos break; 276 1.1 christos } 277 1.1 christos if (*src == '/') 278 1.1 christos cmplen = src - p1->name + 1; 279 1.1 christos *dst++ = *src++; 280 1.1 christos } 281 1.1 christos *dst = 0; 282 1.1 christos len = dst - buffer; 283 1.1 christos if (cmplen == 0) 284 1.1 christos cmplen = len; 285 1.8 christos str_hash_insert (opcode_hash_control, buffer, pi, 0); 286 1.1 christos idx++; 287 1.1 christos 288 1.1 christos for (p = p1; p->name; p++) 289 1.1 christos { 290 1.1 christos /* A negative TIME is used to indicate that we've added this opcode 291 1.1 christos already. */ 292 1.1 christos if (p->time == -1) 293 1.1 christos continue; 294 1.1 christos if (strncmp (p->name, buffer, cmplen) != 0 295 1.1 christos || (p->name[cmplen] != '\0' && p->name[cmplen] != '.' 296 1.1 christos && p->name[cmplen - 1] != '/')) 297 1.1 christos { 298 1.1 christos if (first_skipped == 0) 299 1.1 christos first_skipped = p; 300 1.1 christos break; 301 1.1 christos } 302 1.1 christos if (strncmp (p->name, buffer, len) != 0) 303 1.1 christos { 304 1.1 christos if (first_skipped == 0) 305 1.1 christos first_skipped = p; 306 1.1 christos continue; 307 1.1 christos } 308 1.1 christos 309 1.1 christos p->time = -1; 310 1.1 christos pi->size = p->name[len] == '.' ? p->name[len + 1] : 0; 311 1.1 christos pi->idx = idx; 312 1.1 christos 313 1.1 christos /* Find the number of operands. */ 314 1.1 christos pi->noperands = 0; 315 1.1 christos while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E) 316 1.1 christos pi->noperands++; 317 1.1 christos 318 1.1 christos /* Find the length of the opcode in bytes. */ 319 1.1 christos pi->length = 0; 320 1.1 christos while (p->data.nib[pi->length * 2] != (op_type) E) 321 1.1 christos pi->length++; 322 1.1 christos 323 1.1 christos pi->opcode = p; 324 1.1 christos pi++; 325 1.1 christos } 326 1.1 christos p1 = first_skipped; 327 1.1 christos } 328 1.1 christos 329 1.1 christos /* Add entry for the NULL vector terminator. */ 330 1.1 christos pi->length = 0; 331 1.1 christos pi->noperands = 0; 332 1.1 christos pi->idx = 0; 333 1.1 christos pi->size = 0; 334 1.1 christos pi->opcode = 0; 335 1.1 christos 336 1.1 christos linkrelax = 1; 337 1.1 christos } 338 1.1 christos 339 1.1 christos struct h8_op 340 1.1 christos { 341 1.1 christos op_type mode; 342 1.1 christos unsigned reg; 343 1.1 christos expressionS exp; 344 1.1 christos }; 345 1.1 christos 346 1.1 christos static void clever_message (const struct h8_instruction *, struct h8_op *); 347 1.1 christos static void fix_operand_size (struct h8_op *, int); 348 1.1 christos static void build_bytes (const struct h8_instruction *, struct h8_op *); 349 1.1 christos static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *); 350 1.5 christos static void check_operand (struct h8_op *, unsigned int, const char *); 351 1.1 christos static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ; 352 1.1 christos static char *get_operands (unsigned, char *, struct h8_op *); 353 1.1 christos static void get_operand (char **, struct h8_op *, int); 354 1.1 christos static int parse_reg (char *, op_type *, unsigned *, int); 355 1.1 christos static char *skip_colonthing (char *, int *); 356 1.1 christos static char *parse_exp (char *, struct h8_op *); 357 1.1 christos 358 1.1 christos static int constant_fits_size_p (struct h8_op *, int, int); 359 1.1 christos 360 1.1 christos /* 361 1.1 christos parse operands 362 1.1 christos WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp 363 1.1 christos r0l,r0h,..r7l,r7h 364 1.1 christos @WREG 365 1.1 christos @WREG+ 366 1.1 christos @-WREG 367 1.1 christos #const 368 1.1 christos ccr 369 1.1 christos */ 370 1.1 christos 371 1.1 christos /* Try to parse a reg name. Return the number of chars consumed. */ 372 1.1 christos 373 1.1 christos static int 374 1.1 christos parse_reg (char *src, op_type *mode, unsigned int *reg, int direction) 375 1.1 christos { 376 1.1 christos char *end; 377 1.1 christos int len; 378 1.1 christos 379 1.3 christos /* Cribbed from get_symbol_name. */ 380 1.1 christos if (!is_name_beginner (*src) || *src == '\001') 381 1.1 christos return 0; 382 1.1 christos end = src + 1; 383 1.1 christos while ((is_part_of_name (*end) && *end != '.') || *end == '\001') 384 1.1 christos end++; 385 1.1 christos len = end - src; 386 1.1 christos 387 1.1 christos if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p') 388 1.1 christos { 389 1.1 christos *mode = PSIZE | REG | direction; 390 1.1 christos *reg = 7; 391 1.1 christos return len; 392 1.1 christos } 393 1.3 christos if (len == 3 && 394 1.3 christos TOLOWER (src[0]) == 'c' && 395 1.3 christos TOLOWER (src[1]) == 'c' && 396 1.1 christos TOLOWER (src[2]) == 'r') 397 1.1 christos { 398 1.1 christos *mode = CCR; 399 1.1 christos *reg = 0; 400 1.1 christos return len; 401 1.1 christos } 402 1.3 christos if (len == 3 && 403 1.3 christos TOLOWER (src[0]) == 'e' && 404 1.3 christos TOLOWER (src[1]) == 'x' && 405 1.1 christos TOLOWER (src[2]) == 'r') 406 1.1 christos { 407 1.1 christos *mode = EXR; 408 1.1 christos *reg = 1; 409 1.1 christos return len; 410 1.1 christos } 411 1.3 christos if (len == 3 && 412 1.3 christos TOLOWER (src[0]) == 'v' && 413 1.3 christos TOLOWER (src[1]) == 'b' && 414 1.1 christos TOLOWER (src[2]) == 'r') 415 1.1 christos { 416 1.1 christos *mode = VBR; 417 1.1 christos *reg = 6; 418 1.1 christos return len; 419 1.1 christos } 420 1.3 christos if (len == 3 && 421 1.3 christos TOLOWER (src[0]) == 's' && 422 1.3 christos TOLOWER (src[1]) == 'b' && 423 1.1 christos TOLOWER (src[2]) == 'r') 424 1.1 christos { 425 1.1 christos *mode = SBR; 426 1.1 christos *reg = 7; 427 1.1 christos return len; 428 1.1 christos } 429 1.1 christos if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p') 430 1.1 christos { 431 1.1 christos *mode = PSIZE | REG | direction; 432 1.1 christos *reg = 6; 433 1.1 christos return len; 434 1.1 christos } 435 1.1 christos if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' && 436 1.1 christos src[2] >= '0' && src[2] <= '7') 437 1.1 christos { 438 1.1 christos *mode = L_32 | REG | direction; 439 1.1 christos *reg = src[2] - '0'; 440 1.1 christos if (!Hmode) 441 1.1 christos as_warn (_("Reg not valid for H8/300")); 442 1.1 christos return len; 443 1.1 christos } 444 1.1 christos if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7') 445 1.1 christos { 446 1.1 christos *mode = L_16 | REG | direction; 447 1.1 christos *reg = src[1] - '0' + 8; 448 1.1 christos if (!Hmode) 449 1.1 christos as_warn (_("Reg not valid for H8/300")); 450 1.1 christos return len; 451 1.1 christos } 452 1.1 christos 453 1.1 christos if (TOLOWER (src[0]) == 'r') 454 1.1 christos { 455 1.1 christos if (src[1] >= '0' && src[1] <= '7') 456 1.1 christos { 457 1.1 christos if (len == 3 && TOLOWER (src[2]) == 'l') 458 1.1 christos { 459 1.1 christos *mode = L_8 | REG | direction; 460 1.1 christos *reg = (src[1] - '0') + 8; 461 1.1 christos return len; 462 1.1 christos } 463 1.1 christos if (len == 3 && TOLOWER (src[2]) == 'h') 464 1.1 christos { 465 1.1 christos *mode = L_8 | REG | direction; 466 1.1 christos *reg = (src[1] - '0'); 467 1.1 christos return len; 468 1.1 christos } 469 1.1 christos if (len == 2) 470 1.1 christos { 471 1.1 christos *mode = L_16 | REG | direction; 472 1.1 christos *reg = (src[1] - '0'); 473 1.1 christos return len; 474 1.1 christos } 475 1.1 christos } 476 1.1 christos } 477 1.1 christos 478 1.1 christos return 0; 479 1.1 christos } 480 1.1 christos 481 1.1 christos 482 1.1 christos /* Parse an immediate or address-related constant and store it in OP. 483 1.1 christos If the user also specifies the operand's size, store that size 484 1.1 christos in OP->MODE, otherwise leave it for later code to decide. */ 485 1.1 christos 486 1.1 christos static char * 487 1.1 christos parse_exp (char *src, struct h8_op *op) 488 1.1 christos { 489 1.1 christos char *save; 490 1.1 christos 491 1.1 christos save = input_line_pointer; 492 1.1 christos input_line_pointer = src; 493 1.1 christos expression (&op->exp); 494 1.1 christos if (op->exp.X_op == O_absent) 495 1.1 christos as_bad (_("missing operand")); 496 1.1 christos src = input_line_pointer; 497 1.1 christos input_line_pointer = save; 498 1.1 christos 499 1.1 christos return skip_colonthing (src, &op->mode); 500 1.1 christos } 501 1.1 christos 502 1.1 christos 503 1.1 christos /* If SRC starts with an explicit operand size, skip it and store the size 504 1.1 christos in *MODE. Leave *MODE unchanged otherwise. */ 505 1.1 christos 506 1.1 christos static char * 507 1.1 christos skip_colonthing (char *src, int *mode) 508 1.1 christos { 509 1.1 christos if (*src == ':') 510 1.1 christos { 511 1.1 christos src++; 512 1.1 christos *mode &= ~SIZE; 513 1.1 christos if (src[0] == '8' && !ISDIGIT (src[1])) 514 1.1 christos *mode |= L_8; 515 1.1 christos else if (src[0] == '2' && !ISDIGIT (src[1])) 516 1.1 christos *mode |= L_2; 517 1.1 christos else if (src[0] == '3' && !ISDIGIT (src[1])) 518 1.1 christos *mode |= L_3; 519 1.1 christos else if (src[0] == '4' && !ISDIGIT (src[1])) 520 1.1 christos *mode |= L_4; 521 1.1 christos else if (src[0] == '5' && !ISDIGIT (src[1])) 522 1.1 christos *mode |= L_5; 523 1.1 christos else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2])) 524 1.1 christos *mode |= L_24; 525 1.1 christos else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2])) 526 1.1 christos *mode |= L_32; 527 1.1 christos else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2])) 528 1.1 christos *mode |= L_16; 529 1.1 christos else 530 1.1 christos as_bad (_("invalid operand size requested")); 531 1.1 christos 532 1.1 christos while (ISDIGIT (*src)) 533 1.1 christos src++; 534 1.1 christos } 535 1.1 christos return src; 536 1.1 christos } 537 1.1 christos 538 1.1 christos /* The many forms of operand: 539 1.1 christos 540 1.1 christos Rn Register direct 541 1.1 christos @Rn Register indirect 542 1.1 christos @(exp[:16], Rn) Register indirect with displacement 543 1.1 christos @Rn+ 544 1.1 christos @-Rn 545 1.1 christos @aa:8 absolute 8 bit 546 1.1 christos @aa:16 absolute 16 bit 547 1.1 christos @aa absolute 16 bit 548 1.1 christos 549 1.1 christos #xx[:size] immediate data 550 1.1 christos @(exp:[8], pc) pc rel 551 1.1 christos @@aa[:8] memory indirect. */ 552 1.1 christos 553 1.1 christos static int 554 1.1 christos constant_fits_width_p (struct h8_op *operand, offsetT width) 555 1.1 christos { 556 1.1 christos offsetT num; 557 1.1 christos 558 1.1 christos num = ((operand->exp.X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000; 559 1.1 christos return (num & ~width) == 0 || (num | width) == ~0; 560 1.1 christos } 561 1.1 christos 562 1.1 christos static int 563 1.1 christos constant_fits_size_p (struct h8_op *operand, int size, int no_symbols) 564 1.1 christos { 565 1.1 christos offsetT num; 566 1.1 christos 567 1.1 christos if (no_symbols 568 1.1 christos && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0)) 569 1.1 christos return 0; 570 1.1 christos num = operand->exp.X_add_number & 0xffffffff; 571 1.1 christos switch (size) 572 1.1 christos { 573 1.1 christos case L_2: 574 1.1 christos return (num & ~3) == 0; 575 1.1 christos case L_3: 576 1.1 christos return (num & ~7) == 0; 577 1.1 christos case L_3NZ: 578 1.1 christos return num >= 1 && num < 8; 579 1.1 christos case L_4: 580 1.1 christos return (num & ~15) == 0; 581 1.1 christos case L_5: 582 1.1 christos return num >= 1 && num < 32; 583 1.1 christos case L_8: 584 1.1 christos num = (num ^ 0x80000000) - 0x80000000; 585 1.1 christos return (num & ~0xFF) == 0 || (num | 0x7F) == ~0; 586 1.1 christos case L_8U: 587 1.1 christos return (num & ~0xFF) == 0; 588 1.1 christos case L_16: 589 1.1 christos num = (num ^ 0x80000000) - 0x80000000; 590 1.1 christos return (num & ~0xFFFF) == 0 || (num | 0x7FFF) == ~0; 591 1.1 christos case L_16U: 592 1.1 christos return (num & ~0xFFFF) == 0; 593 1.1 christos case L_32: 594 1.1 christos return 1; 595 1.1 christos default: 596 1.1 christos abort (); 597 1.1 christos } 598 1.1 christos } 599 1.1 christos 600 1.1 christos static void 601 1.1 christos get_operand (char **ptr, struct h8_op *op, int direction) 602 1.1 christos { 603 1.1 christos char *src = *ptr; 604 1.1 christos op_type mode; 605 1.1 christos unsigned int num; 606 1.1 christos unsigned int len; 607 1.1 christos 608 1.1 christos op->mode = 0; 609 1.1 christos 610 1.1 christos /* Check for '(' and ')' for instructions ldm and stm. */ 611 1.1 christos if (src[0] == '(' && src[8] == ')') 612 1.1 christos ++ src; 613 1.1 christos 614 1.1 christos /* Gross. Gross. ldm and stm have a format not easily handled 615 1.1 christos by get_operand. We deal with it explicitly here. */ 616 1.3 christos if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' && 617 1.1 christos ISDIGIT (src[2]) && src[3] == '-' && 618 1.1 christos TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6])) 619 1.1 christos { 620 1.1 christos int low, high; 621 1.1 christos 622 1.1 christos low = src[2] - '0'; 623 1.1 christos high = src[6] - '0'; 624 1.1 christos 625 1.1 christos /* Check register pair's validity as per tech note TN-H8*-193A/E 626 1.1 christos from Renesas for H8S and H8SX hardware manual. */ 627 1.1 christos if ( !(low == 0 && (high == 1 || high == 2 || high == 3)) 628 1.1 christos && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode) 629 1.1 christos && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode))) 630 1.1 christos && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode) 631 1.1 christos && !(low == 4 && (high == 5 || high == 6)) 632 1.1 christos && !(low == 4 && high == 7 && SXmode) 633 1.1 christos && !(low == 5 && (high == 6 || high == 7) && SXmode) 634 1.1 christos && !(low == 6 && high == 7 && SXmode)) 635 1.1 christos as_bad (_("Invalid register list for ldm/stm\n")); 636 1.1 christos 637 1.1 christos /* Even sicker. We encode two registers into op->reg. One 638 1.1 christos for the low register to save, the other for the high 639 1.1 christos register to save; we also set the high bit in op->reg 640 1.1 christos so we know this is "very special". */ 641 1.1 christos op->reg = 0x80000000 | (high << 8) | low; 642 1.1 christos op->mode = REG; 643 1.1 christos if (src[7] == ')') 644 1.1 christos *ptr = src + 8; 645 1.1 christos else 646 1.1 christos *ptr = src + 7; 647 1.1 christos return; 648 1.1 christos } 649 1.1 christos 650 1.1 christos len = parse_reg (src, &op->mode, &op->reg, direction); 651 1.1 christos if (len) 652 1.1 christos { 653 1.1 christos src += len; 654 1.1 christos if (*src == '.') 655 1.1 christos { 656 1.1 christos int size = op->mode & SIZE; 657 1.1 christos switch (src[1]) 658 1.1 christos { 659 1.1 christos case 'l': case 'L': 660 1.1 christos if (size != L_32) 661 1.1 christos as_warn (_("mismatch between register and suffix")); 662 1.1 christos op->mode = (op->mode & ~MODE) | LOWREG; 663 1.1 christos break; 664 1.1 christos case 'w': case 'W': 665 1.1 christos if (size != L_32 && size != L_16) 666 1.1 christos as_warn (_("mismatch between register and suffix")); 667 1.1 christos op->mode = (op->mode & ~MODE) | LOWREG; 668 1.1 christos op->mode = (op->mode & ~SIZE) | L_16; 669 1.1 christos break; 670 1.1 christos case 'b': case 'B': 671 1.1 christos op->mode = (op->mode & ~MODE) | LOWREG; 672 1.1 christos if (size != L_32 && size != L_8) 673 1.1 christos as_warn (_("mismatch between register and suffix")); 674 1.1 christos op->mode = (op->mode & ~MODE) | LOWREG; 675 1.1 christos op->mode = (op->mode & ~SIZE) | L_8; 676 1.1 christos break; 677 1.1 christos default: 678 1.1 christos as_warn (_("invalid suffix after register.")); 679 1.1 christos break; 680 1.1 christos } 681 1.1 christos src += 2; 682 1.1 christos } 683 1.1 christos *ptr = src; 684 1.1 christos return; 685 1.1 christos } 686 1.1 christos 687 1.1 christos if (*src == '@') 688 1.1 christos { 689 1.1 christos src++; 690 1.1 christos if (*src == '@') 691 1.1 christos { 692 1.1 christos *ptr = parse_exp (src + 1, op); 693 1.1 christos if (op->exp.X_add_number >= 0x100) 694 1.1 christos { 695 1.1 christos int divisor = 1; 696 1.1 christos 697 1.1 christos op->mode = VECIND; 698 1.1 christos /* FIXME : 2? or 4? */ 699 1.1 christos if (op->exp.X_add_number >= 0x400) 700 1.1 christos as_bad (_("address too high for vector table jmp/jsr")); 701 1.1 christos else if (op->exp.X_add_number >= 0x200) 702 1.1 christos divisor = 4; 703 1.1 christos else 704 1.1 christos divisor = 2; 705 1.1 christos 706 1.1 christos op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80; 707 1.1 christos } 708 1.1 christos else 709 1.1 christos op->mode = MEMIND; 710 1.1 christos return; 711 1.1 christos } 712 1.1 christos 713 1.1 christos if (*src == '-' || *src == '+') 714 1.1 christos { 715 1.1 christos len = parse_reg (src + 1, &mode, &num, direction); 716 1.1 christos if (len == 0) 717 1.1 christos { 718 1.1 christos /* Oops, not a reg after all, must be ordinary exp. */ 719 1.1 christos op->mode = ABS | direction; 720 1.1 christos *ptr = parse_exp (src, op); 721 1.1 christos return; 722 1.1 christos } 723 1.1 christos 724 1.1 christos if (((mode & SIZE) != PSIZE) 725 1.1 christos /* For Normal mode accept 16 bit and 32 bit pointer registers. */ 726 1.1 christos && (!Nmode || ((mode & SIZE) != L_32))) 727 1.1 christos as_bad (_("Wrong size pointer register for architecture.")); 728 1.1 christos 729 1.1 christos op->mode = src[0] == '-' ? RDPREDEC : RDPREINC; 730 1.1 christos op->reg = num; 731 1.1 christos *ptr = src + 1 + len; 732 1.1 christos return; 733 1.1 christos } 734 1.1 christos if (*src == '(') 735 1.1 christos { 736 1.1 christos src++; 737 1.1 christos 738 1.1 christos /* See if this is @(ERn.x, PC). */ 739 1.1 christos len = parse_reg (src, &mode, &op->reg, direction); 740 1.1 christos if (len != 0 && (mode & MODE) == REG && src[len] == '.') 741 1.1 christos { 742 1.1 christos switch (TOLOWER (src[len + 1])) 743 1.1 christos { 744 1.1 christos case 'b': 745 1.1 christos mode = PCIDXB | direction; 746 1.1 christos break; 747 1.1 christos case 'w': 748 1.1 christos mode = PCIDXW | direction; 749 1.1 christos break; 750 1.1 christos case 'l': 751 1.1 christos mode = PCIDXL | direction; 752 1.1 christos break; 753 1.1 christos default: 754 1.1 christos mode = 0; 755 1.1 christos break; 756 1.1 christos } 757 1.1 christos if (mode 758 1.1 christos && src[len + 2] == ',' 759 1.3 christos && TOLOWER (src[len + 3]) != 'p' 760 1.1 christos && TOLOWER (src[len + 4]) != 'c' 761 1.1 christos && src[len + 5] != ')') 762 1.1 christos { 763 1.1 christos *ptr = src + len + 6; 764 1.1 christos op->mode |= mode; 765 1.1 christos return; 766 1.1 christos } 767 1.1 christos /* Fall through into disp case - the grammar is somewhat 768 1.1 christos ambiguous, so we should try whether it's a DISP operand 769 1.1 christos after all ("ER3.L" might be a poorly named label...). */ 770 1.1 christos } 771 1.1 christos 772 1.1 christos /* Disp. */ 773 1.1 christos 774 1.1 christos /* Start off assuming a 16 bit offset. */ 775 1.1 christos 776 1.1 christos src = parse_exp (src, op); 777 1.1 christos if (*src == ')') 778 1.1 christos { 779 1.1 christos op->mode |= ABS | direction; 780 1.1 christos *ptr = src + 1; 781 1.1 christos return; 782 1.1 christos } 783 1.1 christos 784 1.1 christos if (*src != ',') 785 1.1 christos { 786 1.1 christos as_bad (_("expected @(exp, reg16)")); 787 1.1 christos return; 788 1.1 christos } 789 1.1 christos src++; 790 1.1 christos 791 1.1 christos len = parse_reg (src, &mode, &op->reg, direction); 792 1.1 christos if (len == 0 || (mode & MODE) != REG) 793 1.1 christos { 794 1.1 christos as_bad (_("expected @(exp, reg16)")); 795 1.1 christos return; 796 1.1 christos } 797 1.1 christos src += len; 798 1.1 christos if (src[0] == '.') 799 1.1 christos { 800 1.1 christos switch (TOLOWER (src[1])) 801 1.1 christos { 802 1.1 christos case 'b': 803 1.1 christos op->mode |= INDEXB | direction; 804 1.1 christos break; 805 1.1 christos case 'w': 806 1.1 christos op->mode |= INDEXW | direction; 807 1.1 christos break; 808 1.1 christos case 'l': 809 1.1 christos op->mode |= INDEXL | direction; 810 1.1 christos break; 811 1.1 christos default: 812 1.1 christos as_bad (_("expected .L, .W or .B for register in indexed addressing mode")); 813 1.1 christos } 814 1.1 christos src += 2; 815 1.1 christos op->reg &= 7; 816 1.1 christos } 817 1.1 christos else 818 1.1 christos op->mode |= DISP | direction; 819 1.1 christos src = skip_colonthing (src, &op->mode); 820 1.1 christos 821 1.5 christos if (*src != ')') 822 1.1 christos { 823 1.1 christos as_bad (_("expected @(exp, reg16)")); 824 1.1 christos return; 825 1.1 christos } 826 1.1 christos *ptr = src + 1; 827 1.1 christos return; 828 1.1 christos } 829 1.1 christos len = parse_reg (src, &mode, &num, direction); 830 1.1 christos 831 1.1 christos if (len) 832 1.1 christos { 833 1.1 christos src += len; 834 1.1 christos if (*src == '+' || *src == '-') 835 1.1 christos { 836 1.1 christos if (((mode & SIZE) != PSIZE) 837 1.1 christos /* For Normal mode accept 16 bit and 32 bit pointer registers. */ 838 1.1 christos && (!Nmode || ((mode & SIZE) != L_32))) 839 1.1 christos as_bad (_("Wrong size pointer register for architecture.")); 840 1.1 christos op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC; 841 1.1 christos op->reg = num; 842 1.1 christos src++; 843 1.1 christos *ptr = src; 844 1.1 christos return; 845 1.1 christos } 846 1.1 christos if (((mode & SIZE) != PSIZE) 847 1.1 christos /* For Normal mode accept 16 bit and 32 bit pointer registers. */ 848 1.1 christos && (!Nmode || ((mode & SIZE) != L_32))) 849 1.1 christos as_bad (_("Wrong size pointer register for architecture.")); 850 1.1 christos 851 1.1 christos op->mode = direction | IND | PSIZE; 852 1.1 christos op->reg = num; 853 1.1 christos *ptr = src; 854 1.1 christos 855 1.1 christos return; 856 1.1 christos } 857 1.1 christos else 858 1.1 christos { 859 1.1 christos /* must be a symbol */ 860 1.1 christos 861 1.1 christos op->mode = ABS | direction; 862 1.1 christos *ptr = parse_exp (src, op); 863 1.1 christos return; 864 1.1 christos } 865 1.1 christos } 866 1.1 christos 867 1.1 christos if (*src == '#') 868 1.1 christos { 869 1.1 christos op->mode = IMM; 870 1.1 christos *ptr = parse_exp (src + 1, op); 871 1.1 christos return; 872 1.1 christos } 873 1.8 christos else if (startswith (src, "mach") || 874 1.8 christos startswith (src, "macl") || 875 1.8 christos startswith (src, "MACH") || 876 1.8 christos startswith (src, "MACL")) 877 1.1 christos { 878 1.1 christos op->reg = TOLOWER (src[3]) == 'l'; 879 1.1 christos op->mode = MACREG; 880 1.1 christos *ptr = src + 4; 881 1.1 christos return; 882 1.1 christos } 883 1.1 christos else 884 1.1 christos { 885 1.1 christos op->mode = PCREL; 886 1.1 christos *ptr = parse_exp (src, op); 887 1.1 christos } 888 1.1 christos } 889 1.1 christos 890 1.1 christos static char * 891 1.1 christos get_operands (unsigned int noperands, char *op_end, struct h8_op *operand) 892 1.1 christos { 893 1.1 christos char *ptr = op_end; 894 1.1 christos 895 1.1 christos switch (noperands) 896 1.1 christos { 897 1.1 christos case 0: 898 1.1 christos break; 899 1.1 christos 900 1.1 christos case 1: 901 1.1 christos ptr++; 902 1.1 christos get_operand (&ptr, operand + 0, SRC); 903 1.1 christos if (*ptr == ',') 904 1.1 christos { 905 1.1 christos ptr++; 906 1.1 christos get_operand (&ptr, operand + 1, DST); 907 1.1 christos } 908 1.1 christos break; 909 1.1 christos 910 1.1 christos case 2: 911 1.1 christos ptr++; 912 1.1 christos get_operand (&ptr, operand + 0, SRC); 913 1.1 christos if (*ptr == ',') 914 1.1 christos ptr++; 915 1.1 christos get_operand (&ptr, operand + 1, DST); 916 1.1 christos break; 917 1.1 christos 918 1.1 christos case 3: 919 1.1 christos ptr++; 920 1.1 christos get_operand (&ptr, operand + 0, SRC); 921 1.1 christos if (*ptr == ',') 922 1.1 christos ptr++; 923 1.1 christos get_operand (&ptr, operand + 1, DST); 924 1.1 christos if (*ptr == ',') 925 1.1 christos ptr++; 926 1.1 christos get_operand (&ptr, operand + 2, OP3); 927 1.1 christos break; 928 1.1 christos 929 1.1 christos default: 930 1.1 christos abort (); 931 1.1 christos } 932 1.1 christos 933 1.1 christos return ptr; 934 1.1 christos } 935 1.1 christos 936 1.1 christos /* MOVA has special requirements. Rather than adding twice the amount of 937 1.1 christos addressing modes, we simply special case it a bit. */ 938 1.1 christos static void 939 1.1 christos get_mova_operands (char *op_end, struct h8_op *operand) 940 1.1 christos { 941 1.1 christos char *ptr = op_end; 942 1.1 christos 943 1.1 christos if (ptr[1] != '@' || ptr[2] != '(') 944 1.1 christos goto error; 945 1.1 christos ptr += 3; 946 1.1 christos operand[0].mode = 0; 947 1.1 christos ptr = parse_exp (ptr, &operand[0]); 948 1.1 christos 949 1.1 christos if (*ptr !=',') 950 1.1 christos goto error; 951 1.1 christos ptr++; 952 1.1 christos get_operand (&ptr, operand + 1, DST); 953 1.1 christos 954 1.1 christos if (*ptr =='.') 955 1.1 christos { 956 1.1 christos ptr++; 957 1.1 christos switch (*ptr++) 958 1.1 christos { 959 1.1 christos case 'b': case 'B': 960 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXB; 961 1.1 christos break; 962 1.1 christos case 'w': case 'W': 963 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXW; 964 1.1 christos break; 965 1.1 christos case 'l': case 'L': 966 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXL; 967 1.1 christos break; 968 1.1 christos default: 969 1.1 christos goto error; 970 1.1 christos } 971 1.1 christos } 972 1.1 christos else if ((operand[1].mode & MODE) == LOWREG) 973 1.1 christos { 974 1.3 christos switch (operand[1].mode & SIZE) 975 1.1 christos { 976 1.1 christos case L_8: 977 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXB; 978 1.1 christos break; 979 1.1 christos case L_16: 980 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXW; 981 1.1 christos break; 982 1.1 christos case L_32: 983 1.1 christos operand[0].mode = (operand[0].mode & ~MODE) | INDEXL; 984 1.1 christos break; 985 1.1 christos default: 986 1.1 christos goto error; 987 1.1 christos } 988 1.1 christos } 989 1.1 christos else 990 1.1 christos goto error; 991 1.1 christos 992 1.1 christos if (*ptr++ != ')' || *ptr++ != ',') 993 1.1 christos goto error; 994 1.1 christos get_operand (&ptr, operand + 2, OP3); 995 1.1 christos /* See if we can use the short form of MOVA. */ 996 1.1 christos if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG) 997 1.1 christos && (operand[2].mode & MODE) == REG 998 1.1 christos && (operand[1].reg & 7) == (operand[2].reg & 7)) 999 1.1 christos { 1000 1.1 christos operand[1].mode = operand[2].mode = 0; 1001 1.1 christos operand[0].reg = operand[2].reg & 7; 1002 1.1 christos } 1003 1.1 christos return; 1004 1.1 christos 1005 1.1 christos error: 1006 1.1 christos as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\"")); 1007 1.1 christos } 1008 1.1 christos 1009 1.1 christos static void 1010 1.1 christos get_rtsl_operands (char *ptr, struct h8_op *operand) 1011 1.1 christos { 1012 1.1 christos int mode, len, type = 0; 1013 1.1 christos unsigned int num, num2; 1014 1.1 christos 1015 1.1 christos ptr++; 1016 1.1 christos if (*ptr == '(') 1017 1.1 christos { 1018 1.1 christos ptr++; 1019 1.1 christos type = 1; 1020 1.1 christos } 1021 1.1 christos len = parse_reg (ptr, &mode, &num, SRC); 1022 1.1 christos if (len == 0 || (mode & MODE) != REG) 1023 1.1 christos { 1024 1.1 christos as_bad (_("expected register")); 1025 1.1 christos return; 1026 1.1 christos } 1027 1.1 christos ptr += len; 1028 1.1 christos if (*ptr == '-') 1029 1.1 christos { 1030 1.1 christos len = parse_reg (++ptr, &mode, &num2, SRC); 1031 1.1 christos if (len == 0 || (mode & MODE) != REG) 1032 1.1 christos { 1033 1.1 christos as_bad (_("expected register")); 1034 1.1 christos return; 1035 1.1 christos } 1036 1.1 christos ptr += len; 1037 1.1 christos /* CONST_xxx are used as placeholders in the opcode table. */ 1038 1.1 christos num = num2 - num; 1039 1.1 christos if (num > 3) 1040 1.1 christos { 1041 1.1 christos as_bad (_("invalid register list")); 1042 1.1 christos return; 1043 1.1 christos } 1044 1.1 christos } 1045 1.1 christos else 1046 1.1 christos num2 = num, num = 0; 1047 1.1 christos if (type == 1 && *ptr++ != ')') 1048 1.1 christos { 1049 1.1 christos as_bad (_("expected closing paren")); 1050 1.1 christos return; 1051 1.1 christos } 1052 1.1 christos operand[0].mode = RS32; 1053 1.1 christos operand[1].mode = RD32; 1054 1.1 christos operand[0].reg = num; 1055 1.1 christos operand[1].reg = num2; 1056 1.1 christos } 1057 1.1 christos 1058 1.1 christos /* Passed a pointer to a list of opcodes which use different 1059 1.1 christos addressing modes, return the opcode which matches the opcodes 1060 1.1 christos provided. */ 1061 1.1 christos 1062 1.1 christos static const struct h8_instruction * 1063 1.1 christos get_specific (const struct h8_instruction *instruction, 1064 1.1 christos struct h8_op *operands, int size) 1065 1.1 christos { 1066 1.1 christos const struct h8_instruction *this_try = instruction; 1067 1.1 christos const struct h8_instruction *found_other = 0, *found_mismatched = 0; 1068 1.1 christos int found = 0; 1069 1.1 christos int this_index = instruction->idx; 1070 1.1 christos int noperands = 0; 1071 1.1 christos 1072 1.1 christos /* There's only one ldm/stm and it's easier to just 1073 1.1 christos get out quick for them. */ 1074 1.1 christos if (OP_KIND (instruction->opcode->how) == O_LDM 1075 1.1 christos || OP_KIND (instruction->opcode->how) == O_STM) 1076 1.1 christos return this_try; 1077 1.1 christos 1078 1.1 christos while (noperands < 3 && operands[noperands].mode != 0) 1079 1.1 christos noperands++; 1080 1.1 christos 1081 1.1 christos while (this_index == instruction->idx && !found) 1082 1.1 christos { 1083 1.1 christos int this_size; 1084 1.1 christos 1085 1.1 christos found = 1; 1086 1.1 christos this_try = instruction++; 1087 1.1 christos this_size = this_try->opcode->how & SN; 1088 1.1 christos 1089 1.1 christos if (this_try->noperands != noperands) 1090 1.1 christos found = 0; 1091 1.1 christos else if (this_try->noperands > 0) 1092 1.1 christos { 1093 1.1 christos int i; 1094 1.1 christos 1095 1.1 christos for (i = 0; i < this_try->noperands && found; i++) 1096 1.1 christos { 1097 1.1 christos op_type op = this_try->opcode->args.nib[i]; 1098 1.1 christos int op_mode = op & MODE; 1099 1.1 christos int op_size = op & SIZE; 1100 1.1 christos int x = operands[i].mode; 1101 1.1 christos int x_mode = x & MODE; 1102 1.1 christos int x_size = x & SIZE; 1103 1.1 christos 1104 1.1 christos if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG)) 1105 1.1 christos { 1106 1.1 christos if ((x_size == L_8 && (operands[i].reg & 8) == 0) 1107 1.1 christos || (x_size == L_16 && (operands[i].reg & 8) == 8)) 1108 1.1 christos as_warn (_("can't use high part of register in operand %d"), i); 1109 1.1 christos 1110 1.1 christos if (x_size != op_size) 1111 1.1 christos found = 0; 1112 1.1 christos } 1113 1.1 christos else if (op_mode == REG) 1114 1.1 christos { 1115 1.1 christos if (x_mode == LOWREG) 1116 1.1 christos x_mode = REG; 1117 1.1 christos if (x_mode != REG) 1118 1.1 christos found = 0; 1119 1.1 christos 1120 1.1 christos if (x_size == L_P) 1121 1.1 christos x_size = (Hmode ? L_32 : L_16); 1122 1.1 christos if (op_size == L_P) 1123 1.1 christos op_size = (Hmode ? L_32 : L_16); 1124 1.1 christos 1125 1.1 christos /* The size of the reg is v important. */ 1126 1.1 christos if (op_size != x_size) 1127 1.1 christos found = 0; 1128 1.1 christos } 1129 1.1 christos else if (op_mode & CTRL) /* control register */ 1130 1.1 christos { 1131 1.1 christos if (!(x_mode & CTRL)) 1132 1.1 christos found = 0; 1133 1.1 christos 1134 1.1 christos switch (x_mode) 1135 1.1 christos { 1136 1.1 christos case CCR: 1137 1.1 christos if (op_mode != CCR && 1138 1.1 christos op_mode != CCR_EXR && 1139 1.1 christos op_mode != CC_EX_VB_SB) 1140 1.1 christos found = 0; 1141 1.1 christos break; 1142 1.1 christos case EXR: 1143 1.1 christos if (op_mode != EXR && 1144 1.1 christos op_mode != CCR_EXR && 1145 1.1 christos op_mode != CC_EX_VB_SB) 1146 1.1 christos found = 0; 1147 1.1 christos break; 1148 1.1 christos case MACH: 1149 1.1 christos if (op_mode != MACH && 1150 1.1 christos op_mode != MACREG) 1151 1.1 christos found = 0; 1152 1.1 christos break; 1153 1.1 christos case MACL: 1154 1.1 christos if (op_mode != MACL && 1155 1.1 christos op_mode != MACREG) 1156 1.1 christos found = 0; 1157 1.1 christos break; 1158 1.1 christos case VBR: 1159 1.1 christos if (op_mode != VBR && 1160 1.1 christos op_mode != VBR_SBR && 1161 1.1 christos op_mode != CC_EX_VB_SB) 1162 1.1 christos found = 0; 1163 1.1 christos break; 1164 1.1 christos case SBR: 1165 1.1 christos if (op_mode != SBR && 1166 1.1 christos op_mode != VBR_SBR && 1167 1.1 christos op_mode != CC_EX_VB_SB) 1168 1.1 christos found = 0; 1169 1.1 christos break; 1170 1.1 christos } 1171 1.1 christos } 1172 1.1 christos else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL)) 1173 1.1 christos { 1174 1.1 christos operands[i].mode &= ~MODE; 1175 1.1 christos operands[i].mode |= ABSJMP; 1176 1.1 christos /* But it may not be 24 bits long. */ 1177 1.1 christos if (x_mode == ABS && !Hmode) 1178 1.1 christos { 1179 1.1 christos operands[i].mode &= ~SIZE; 1180 1.1 christos operands[i].mode |= L_16; 1181 1.1 christos } 1182 1.1 christos if ((operands[i].mode & SIZE) == L_32 1183 1.1 christos && (op_mode & SIZE) != L_32) 1184 1.1 christos found = 0; 1185 1.1 christos } 1186 1.1 christos else if (x_mode == IMM && op_mode != IMM) 1187 1.1 christos { 1188 1.1 christos offsetT num = operands[i].exp.X_add_number & 0xffffffff; 1189 1.1 christos if (op_mode == KBIT || op_mode == DBIT) 1190 1.1 christos /* This is ok if the immediate value is sensible. */; 1191 1.1 christos else if (op_mode == CONST_2) 1192 1.1 christos found = num == 2; 1193 1.1 christos else if (op_mode == CONST_4) 1194 1.1 christos found = num == 4; 1195 1.1 christos else if (op_mode == CONST_8) 1196 1.1 christos found = num == 8; 1197 1.1 christos else if (op_mode == CONST_16) 1198 1.1 christos found = num == 16; 1199 1.1 christos else 1200 1.1 christos found = 0; 1201 1.1 christos } 1202 1.1 christos else if (op_mode == PCREL && op_mode == x_mode) 1203 1.1 christos { 1204 1.1 christos /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour: 1205 1.1 christos If x_size is L_8, promote it. */ 1206 1.1 christos if (OP_KIND (this_try->opcode->how) == O_MOVSD 1207 1.1 christos || OP_KIND (this_try->opcode->how) == O_BSRBC 1208 1.1 christos || OP_KIND (this_try->opcode->how) == O_BSRBS) 1209 1.1 christos if (x_size == L_8) 1210 1.1 christos x_size = L_16; 1211 1.1 christos 1212 1.1 christos /* The size of the displacement is important. */ 1213 1.1 christos if (op_size != x_size) 1214 1.1 christos found = 0; 1215 1.1 christos } 1216 1.1 christos else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS 1217 1.1 christos || op_mode == INDEXB || op_mode == INDEXW 1218 1.1 christos || op_mode == INDEXL) 1219 1.1 christos && op_mode == x_mode) 1220 1.1 christos { 1221 1.1 christos /* Promote a L_24 to L_32 if it makes us match. */ 1222 1.1 christos if (x_size == L_24 && op_size == L_32) 1223 1.1 christos { 1224 1.1 christos x &= ~SIZE; 1225 1.1 christos x |= x_size = L_32; 1226 1.1 christos } 1227 1.1 christos 1228 1.1 christos if (((x_size == L_16 && op_size == L_16U) 1229 1.1 christos || (x_size == L_8 && op_size == L_8U) 1230 1.1 christos || (x_size == L_3 && op_size == L_3NZ)) 1231 1.1 christos /* We're deliberately more permissive for ABS modes. */ 1232 1.1 christos && (op_mode == ABS 1233 1.1 christos || constant_fits_size_p (operands + i, op_size, 1234 1.1 christos op & NO_SYMBOLS))) 1235 1.1 christos x_size = op_size; 1236 1.1 christos 1237 1.1 christos if (x_size != 0 && op_size != x_size) 1238 1.1 christos found = 0; 1239 1.1 christos else if (x_size == 0 1240 1.1 christos && ! constant_fits_size_p (operands + i, op_size, 1241 1.1 christos op & NO_SYMBOLS)) 1242 1.1 christos found = 0; 1243 1.1 christos } 1244 1.1 christos else if (op_mode != x_mode) 1245 1.1 christos { 1246 1.1 christos found = 0; 1247 1.1 christos } 1248 1.1 christos } 1249 1.1 christos } 1250 1.1 christos if (found) 1251 1.1 christos { 1252 1.1 christos if ((this_try->opcode->available == AV_H8SX && ! SXmode) 1253 1.1 christos || (this_try->opcode->available == AV_H8S && ! Smode) 1254 1.1 christos || (this_try->opcode->available == AV_H8H && ! Hmode)) 1255 1.1 christos found = 0, found_other = this_try; 1256 1.1 christos else if (this_size != size && (this_size != SN && size != SN)) 1257 1.1 christos found_mismatched = this_try, found = 0; 1258 1.1 christos 1259 1.1 christos } 1260 1.1 christos } 1261 1.1 christos if (found) 1262 1.1 christos return this_try; 1263 1.1 christos if (found_other) 1264 1.1 christos { 1265 1.1 christos as_warn (_("Opcode `%s' with these operand types not available in %s mode"), 1266 1.1 christos found_other->opcode->name, 1267 1.1 christos (! Hmode && ! Smode ? "H8/300" 1268 1.1 christos : SXmode ? "H8sx" 1269 1.1 christos : Smode ? "H8/300S" 1270 1.1 christos : "H8/300H")); 1271 1.1 christos } 1272 1.1 christos else if (found_mismatched) 1273 1.1 christos { 1274 1.1 christos as_warn (_("mismatch between opcode size and operand size")); 1275 1.1 christos return found_mismatched; 1276 1.1 christos } 1277 1.1 christos return 0; 1278 1.1 christos } 1279 1.1 christos 1280 1.1 christos static void 1281 1.5 christos check_operand (struct h8_op *operand, unsigned int width, const char *string) 1282 1.1 christos { 1283 1.1 christos if (operand->exp.X_add_symbol == 0 1284 1.1 christos && operand->exp.X_op_symbol == 0) 1285 1.1 christos { 1286 1.1 christos /* No symbol involved, let's look at offset, it's dangerous if 1287 1.1 christos any of the high bits are not 0 or ff's, find out by oring or 1288 1.1 christos anding with the width and seeing if the answer is 0 or all 1289 1.1 christos fs. */ 1290 1.1 christos 1291 1.1 christos if (! constant_fits_width_p (operand, width)) 1292 1.1 christos { 1293 1.1 christos if (width == 255 1294 1.1 christos && (operand->exp.X_add_number & 0xff00) == 0xff00) 1295 1.1 christos { 1296 1.1 christos /* Just ignore this one - which happens when trying to 1297 1.1 christos fit a 16 bit address truncated into an 8 bit address 1298 1.1 christos of something like bset. */ 1299 1.1 christos } 1300 1.1 christos else if (strcmp (string, "@") == 0 1301 1.1 christos && width == 0xffff 1302 1.1 christos && (operand->exp.X_add_number & 0xff8000) == 0xff8000) 1303 1.1 christos { 1304 1.1 christos /* Just ignore this one - which happens when trying to 1305 1.1 christos fit a 24 bit address truncated into a 16 bit address 1306 1.1 christos of something like mov.w. */ 1307 1.1 christos } 1308 1.1 christos else 1309 1.1 christos { 1310 1.1 christos as_warn (_("operand %s0x%lx out of range."), string, 1311 1.1 christos (unsigned long) operand->exp.X_add_number); 1312 1.1 christos } 1313 1.1 christos } 1314 1.1 christos } 1315 1.1 christos } 1316 1.1 christos 1317 1.1 christos /* RELAXMODE has one of 3 values: 1318 1.1 christos 1319 1.1 christos 0 Output a "normal" reloc, no relaxing possible for this insn/reloc 1320 1.1 christos 1321 1.1 christos 1 Output a relaxable 24bit absolute mov.w address relocation 1322 1.1 christos (may relax into a 16bit absolute address). 1323 1.1 christos 1324 1.1 christos 2 Output a relaxable 16/24 absolute mov.b address relocation 1325 1.1 christos (may relax into an 8bit absolute address). */ 1326 1.1 christos 1327 1.1 christos static void 1328 1.1 christos do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, const struct h8_instruction *this_try) 1329 1.1 christos { 1330 1.1 christos int idx; 1331 1.1 christos int size; 1332 1.1 christos int where; 1333 1.1 christos char *bytes = frag_now->fr_literal + offset; 1334 1.1 christos 1335 1.5 christos const char *t = ((operand->mode & MODE) == IMM) ? "#" : "@"; 1336 1.1 christos 1337 1.1 christos if (operand->exp.X_add_symbol == 0) 1338 1.1 christos { 1339 1.1 christos switch (operand->mode & SIZE) 1340 1.1 christos { 1341 1.1 christos case L_2: 1342 1.1 christos check_operand (operand, 0x3, t); 1343 1.1 christos bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4); 1344 1.1 christos break; 1345 1.1 christos case L_3: 1346 1.1 christos case L_3NZ: 1347 1.1 christos check_operand (operand, 0x7, t); 1348 1.1 christos bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4); 1349 1.1 christos break; 1350 1.1 christos case L_4: 1351 1.1 christos check_operand (operand, 0xF, t); 1352 1.1 christos bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4); 1353 1.1 christos break; 1354 1.1 christos case L_5: 1355 1.1 christos check_operand (operand, 0x1F, t); 1356 1.1 christos bytes[0] |= operand->exp.X_add_number & 31; 1357 1.1 christos break; 1358 1.1 christos case L_8: 1359 1.1 christos case L_8U: 1360 1.1 christos check_operand (operand, 0xff, t); 1361 1.1 christos bytes[0] |= operand->exp.X_add_number; 1362 1.1 christos break; 1363 1.1 christos case L_16: 1364 1.1 christos case L_16U: 1365 1.1 christos check_operand (operand, 0xffff, t); 1366 1.1 christos bytes[0] |= operand->exp.X_add_number >> 8; 1367 1.1 christos bytes[1] |= operand->exp.X_add_number >> 0; 1368 1.1 christos /* MOVA needs both relocs to relax the second operand properly. */ 1369 1.1 christos if (relaxmode != 0 1370 1.1 christos && (OP_KIND(this_try->opcode->how) == O_MOVAB 1371 1.1 christos || OP_KIND(this_try->opcode->how) == O_MOVAW 1372 1.1 christos || OP_KIND(this_try->opcode->how) == O_MOVAL)) 1373 1.1 christos { 1374 1.1 christos idx = BFD_RELOC_16; 1375 1.1 christos fix_new_exp (frag_now, offset, 2, &operand->exp, 0, idx); 1376 1.1 christos } 1377 1.1 christos break; 1378 1.1 christos case L_24: 1379 1.1 christos check_operand (operand, 0xffffff, t); 1380 1.1 christos bytes[0] |= operand->exp.X_add_number >> 16; 1381 1.1 christos bytes[1] |= operand->exp.X_add_number >> 8; 1382 1.1 christos bytes[2] |= operand->exp.X_add_number >> 0; 1383 1.1 christos break; 1384 1.1 christos 1385 1.1 christos case L_32: 1386 1.1 christos /* This should be done with bfd. */ 1387 1.1 christos bytes[0] |= operand->exp.X_add_number >> 24; 1388 1.1 christos bytes[1] |= operand->exp.X_add_number >> 16; 1389 1.1 christos bytes[2] |= operand->exp.X_add_number >> 8; 1390 1.1 christos bytes[3] |= operand->exp.X_add_number >> 0; 1391 1.1 christos if (relaxmode != 0) 1392 1.1 christos { 1393 1.3 christos if ((operand->mode & MODE) == DISP && relaxmode == 1) 1394 1.3 christos idx = BFD_RELOC_H8_DISP32A16; 1395 1.3 christos else 1396 1.3 christos idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1; 1397 1.1 christos fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx); 1398 1.1 christos } 1399 1.1 christos break; 1400 1.1 christos } 1401 1.1 christos } 1402 1.1 christos else 1403 1.1 christos { 1404 1.1 christos switch (operand->mode & SIZE) 1405 1.1 christos { 1406 1.1 christos case L_24: 1407 1.1 christos case L_32: 1408 1.1 christos size = 4; 1409 1.1 christos where = (operand->mode & SIZE) == L_24 ? -1 : 0; 1410 1.3 christos if ((operand->mode & MODE) == DISP && relaxmode == 1) 1411 1.3 christos idx = BFD_RELOC_H8_DISP32A16; 1412 1.6 christos else if (relaxmode == 2) 1413 1.1 christos idx = R_MOV24B1; 1414 1.1 christos else if (relaxmode == 1) 1415 1.1 christos idx = R_MOVL1; 1416 1.1 christos else 1417 1.1 christos idx = R_RELLONG; 1418 1.1 christos break; 1419 1.1 christos default: 1420 1.1 christos as_bad (_("Can't work out size of operand.\n")); 1421 1.6 christos /* Fall through. */ 1422 1.1 christos case L_16: 1423 1.1 christos case L_16U: 1424 1.1 christos size = 2; 1425 1.1 christos where = 0; 1426 1.1 christos if (relaxmode == 2) 1427 1.1 christos idx = R_MOV16B1; 1428 1.1 christos else 1429 1.1 christos idx = R_RELWORD; 1430 1.1 christos operand->exp.X_add_number = 1431 1.1 christos ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000; 1432 1.1 christos operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1]; 1433 1.1 christos break; 1434 1.1 christos case L_8: 1435 1.1 christos size = 1; 1436 1.1 christos where = 0; 1437 1.1 christos idx = R_RELBYTE; 1438 1.1 christos operand->exp.X_add_number = 1439 1.1 christos ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80; 1440 1.1 christos operand->exp.X_add_number |= bytes[0]; 1441 1.1 christos } 1442 1.1 christos 1443 1.1 christos fix_new_exp (frag_now, 1444 1.1 christos offset + where, 1445 1.1 christos size, 1446 1.1 christos &operand->exp, 1447 1.1 christos 0, 1448 1.1 christos idx); 1449 1.1 christos } 1450 1.1 christos } 1451 1.1 christos 1452 1.1 christos /* Now we know what sort of opcodes it is, let's build the bytes. */ 1453 1.1 christos 1454 1.1 christos static void 1455 1.1 christos build_bytes (const struct h8_instruction *this_try, struct h8_op *operand) 1456 1.1 christos { 1457 1.1 christos int i; 1458 1.1 christos char *output = frag_more (this_try->length); 1459 1.1 christos const op_type *nibble_ptr = this_try->opcode->data.nib; 1460 1.1 christos op_type c; 1461 1.1 christos unsigned int nibble_count = 0; 1462 1.1 christos int op_at[3]; 1463 1.1 christos int nib = 0; 1464 1.1 christos int movb = 0; 1465 1.1 christos char asnibbles[100]; 1466 1.1 christos char *p = asnibbles; 1467 1.1 christos int high, low; 1468 1.1 christos 1469 1.1 christos if (!Hmode && this_try->opcode->available != AV_H8) 1470 1.1 christos as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"), 1471 1.1 christos this_try->opcode->name); 1472 1.3 christos else if (!Smode 1473 1.3 christos && this_try->opcode->available != AV_H8 1474 1.1 christos && this_try->opcode->available != AV_H8H) 1475 1.1 christos as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"), 1476 1.1 christos this_try->opcode->name); 1477 1.3 christos else if (!SXmode 1478 1.1 christos && this_try->opcode->available != AV_H8 1479 1.1 christos && this_try->opcode->available != AV_H8H 1480 1.1 christos && this_try->opcode->available != AV_H8S) 1481 1.1 christos as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"), 1482 1.1 christos this_try->opcode->name); 1483 1.1 christos 1484 1.1 christos while (*nibble_ptr != (op_type) E) 1485 1.1 christos { 1486 1.1 christos int d; 1487 1.1 christos 1488 1.1 christos nib = 0; 1489 1.1 christos c = *nibble_ptr++; 1490 1.1 christos 1491 1.1 christos d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0; 1492 1.1 christos 1493 1.1 christos if (c < 16) 1494 1.1 christos nib = c; 1495 1.1 christos else 1496 1.1 christos { 1497 1.1 christos int c2 = c & MODE; 1498 1.1 christos 1499 1.1 christos if (c2 == REG || c2 == LOWREG 1500 1.1 christos || c2 == IND || c2 == PREINC || c2 == PREDEC 1501 1.1 christos || c2 == POSTINC || c2 == POSTDEC) 1502 1.1 christos { 1503 1.1 christos nib = operand[d].reg; 1504 1.1 christos if (c2 == LOWREG) 1505 1.1 christos nib &= 7; 1506 1.1 christos } 1507 1.1 christos 1508 1.1 christos else if (c & CTRL) /* Control reg operand. */ 1509 1.1 christos nib = operand[d].reg; 1510 1.1 christos 1511 1.1 christos else if ((c & DISPREG) == (DISPREG)) 1512 1.1 christos { 1513 1.1 christos nib = operand[d].reg; 1514 1.1 christos } 1515 1.1 christos else if (c2 == ABS) 1516 1.1 christos { 1517 1.1 christos operand[d].mode = c; 1518 1.1 christos op_at[d] = nibble_count; 1519 1.1 christos nib = 0; 1520 1.1 christos } 1521 1.1 christos else if (c2 == IMM || c2 == PCREL || c2 == ABS 1522 1.1 christos || (c & ABSJMP) || c2 == DISP) 1523 1.1 christos { 1524 1.1 christos operand[d].mode = c; 1525 1.1 christos op_at[d] = nibble_count; 1526 1.1 christos nib = 0; 1527 1.1 christos } 1528 1.1 christos else if ((c & IGNORE) || (c & DATA)) 1529 1.1 christos nib = 0; 1530 1.1 christos 1531 1.1 christos else if (c2 == DBIT) 1532 1.1 christos { 1533 1.1 christos switch (operand[0].exp.X_add_number) 1534 1.1 christos { 1535 1.1 christos case 1: 1536 1.1 christos nib = c; 1537 1.1 christos break; 1538 1.1 christos case 2: 1539 1.1 christos nib = 0x8 | c; 1540 1.1 christos break; 1541 1.1 christos default: 1542 1.1 christos as_bad (_("Need #1 or #2 here")); 1543 1.1 christos } 1544 1.1 christos } 1545 1.1 christos else if (c2 == KBIT) 1546 1.1 christos { 1547 1.1 christos switch (operand[0].exp.X_add_number) 1548 1.1 christos { 1549 1.1 christos case 1: 1550 1.1 christos nib = 0; 1551 1.1 christos break; 1552 1.1 christos case 2: 1553 1.1 christos nib = 8; 1554 1.1 christos break; 1555 1.1 christos case 4: 1556 1.1 christos if (!Hmode) 1557 1.1 christos as_warn (_("#4 not valid on H8/300.")); 1558 1.1 christos nib = 9; 1559 1.1 christos break; 1560 1.1 christos 1561 1.1 christos default: 1562 1.1 christos as_bad (_("Need #1 or #2 here")); 1563 1.1 christos break; 1564 1.1 christos } 1565 1.1 christos /* Stop it making a fix. */ 1566 1.1 christos operand[0].mode = 0; 1567 1.1 christos } 1568 1.1 christos 1569 1.1 christos if (c & MEMRELAX) 1570 1.1 christos operand[d].mode |= MEMRELAX; 1571 1.1 christos 1572 1.1 christos if (c & B31) 1573 1.1 christos nib |= 0x8; 1574 1.1 christos 1575 1.1 christos if (c & B21) 1576 1.1 christos nib |= 0x4; 1577 1.1 christos 1578 1.1 christos if (c & B11) 1579 1.1 christos nib |= 0x2; 1580 1.1 christos 1581 1.1 christos if (c & B01) 1582 1.1 christos nib |= 0x1; 1583 1.1 christos 1584 1.1 christos if (c2 == MACREG) 1585 1.1 christos { 1586 1.1 christos if (operand[0].mode == MACREG) 1587 1.1 christos /* stmac has mac[hl] as the first operand. */ 1588 1.1 christos nib = 2 + operand[0].reg; 1589 1.1 christos else 1590 1.1 christos /* ldmac has mac[hl] as the second operand. */ 1591 1.1 christos nib = 2 + operand[1].reg; 1592 1.1 christos } 1593 1.1 christos } 1594 1.1 christos nibble_count++; 1595 1.1 christos 1596 1.1 christos *p++ = nib; 1597 1.1 christos } 1598 1.1 christos 1599 1.1 christos /* Disgusting. Why, oh why didn't someone ask us for advice 1600 1.1 christos on the assembler format. */ 1601 1.1 christos if (OP_KIND (this_try->opcode->how) == O_LDM) 1602 1.1 christos { 1603 1.1 christos high = (operand[1].reg >> 8) & 0xf; 1604 1.1 christos low = (operand[1].reg) & 0xf; 1605 1.1 christos asnibbles[2] = high - low; 1606 1.1 christos asnibbles[7] = high; 1607 1.1 christos } 1608 1.1 christos else if (OP_KIND (this_try->opcode->how) == O_STM) 1609 1.1 christos { 1610 1.1 christos high = (operand[0].reg >> 8) & 0xf; 1611 1.1 christos low = (operand[0].reg) & 0xf; 1612 1.1 christos asnibbles[2] = high - low; 1613 1.1 christos asnibbles[7] = low; 1614 1.1 christos } 1615 1.1 christos 1616 1.1 christos for (i = 0; i < this_try->length; i++) 1617 1.1 christos output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1]; 1618 1.1 christos 1619 1.3 christos /* Note if this is a mov.b or a bit manipulation instruction 1620 1.1 christos there is a special relaxation which only applies. */ 1621 1.1 christos if ( this_try->opcode->how == O (O_MOV, SB) 1622 1.1 christos || this_try->opcode->how == O (O_BCLR, SB) 1623 1.1 christos || this_try->opcode->how == O (O_BAND, SB) 1624 1.1 christos || this_try->opcode->how == O (O_BIAND, SB) 1625 1.1 christos || this_try->opcode->how == O (O_BILD, SB) 1626 1.1 christos || this_try->opcode->how == O (O_BIOR, SB) 1627 1.1 christos || this_try->opcode->how == O (O_BIST, SB) 1628 1.1 christos || this_try->opcode->how == O (O_BIXOR, SB) 1629 1.1 christos || this_try->opcode->how == O (O_BLD, SB) 1630 1.1 christos || this_try->opcode->how == O (O_BNOT, SB) 1631 1.1 christos || this_try->opcode->how == O (O_BOR, SB) 1632 1.1 christos || this_try->opcode->how == O (O_BSET, SB) 1633 1.1 christos || this_try->opcode->how == O (O_BST, SB) 1634 1.1 christos || this_try->opcode->how == O (O_BTST, SB) 1635 1.1 christos || this_try->opcode->how == O (O_BXOR, SB)) 1636 1.1 christos movb = 1; 1637 1.1 christos 1638 1.1 christos /* Output any fixes. */ 1639 1.1 christos for (i = 0; i < this_try->noperands; i++) 1640 1.1 christos { 1641 1.1 christos int x = operand[i].mode; 1642 1.1 christos int x_mode = x & MODE; 1643 1.1 christos 1644 1.1 christos if (x_mode == IMM || x_mode == DISP) 1645 1.6 christos do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2, 1646 1.6 christos op_at[i] & 1, operand + i, (x & MEMRELAX) != 0, 1647 1.6 christos this_try); 1648 1.1 christos else if (x_mode == ABS) 1649 1.1 christos do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2, 1650 1.1 christos op_at[i] & 1, operand + i, 1651 1.1 christos (x & MEMRELAX) ? movb + 1 : 0, 1652 1.1 christos this_try); 1653 1.1 christos 1654 1.1 christos else if (x_mode == PCREL) 1655 1.1 christos { 1656 1.1 christos int size16 = (x & SIZE) == L_16; 1657 1.1 christos int size = size16 ? 2 : 1; 1658 1.1 christos int type = size16 ? R_PCRWORD : R_PCRBYTE; 1659 1.1 christos fixS *fixP; 1660 1.1 christos 1661 1.1 christos check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@"); 1662 1.1 christos 1663 1.1 christos if (operand[i].exp.X_add_number & 1) 1664 1.1 christos as_warn (_("branch operand has odd offset (%lx)\n"), 1665 1.1 christos (unsigned long) operand->exp.X_add_number); 1666 1.1 christos if (size16) 1667 1.1 christos { 1668 1.1 christos operand[i].exp.X_add_number = 1669 1.1 christos ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000; 1670 1.1 christos } 1671 1.1 christos else 1672 1.1 christos { 1673 1.1 christos operand[i].exp.X_add_number = 1674 1.1 christos ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80; 1675 1.1 christos } 1676 1.1 christos 1677 1.1 christos /* For BRA/S. */ 1678 1.1 christos if (! size16) 1679 1.1 christos operand[i].exp.X_add_number |= output[op_at[i] / 2]; 1680 1.1 christos 1681 1.1 christos fixP = fix_new_exp (frag_now, 1682 1.1 christos output - frag_now->fr_literal + op_at[i] / 2, 1683 1.1 christos size, 1684 1.1 christos &operand[i].exp, 1685 1.1 christos 1, 1686 1.1 christos type); 1687 1.1 christos fixP->fx_signed = 1; 1688 1.1 christos } 1689 1.1 christos else if (x_mode == MEMIND) 1690 1.1 christos { 1691 1.1 christos check_operand (operand + i, 0xff, "@@"); 1692 1.1 christos fix_new_exp (frag_now, 1693 1.1 christos output - frag_now->fr_literal + 1, 1694 1.1 christos 1, 1695 1.1 christos &operand[i].exp, 1696 1.1 christos 0, 1697 1.1 christos R_MEM_INDIRECT); 1698 1.1 christos } 1699 1.1 christos else if (x_mode == VECIND) 1700 1.1 christos { 1701 1.1 christos check_operand (operand + i, 0x7f, "@@"); 1702 1.1 christos /* FIXME: approximating the effect of "B31" here... 1703 1.1 christos This is very hackish, and ought to be done a better way. */ 1704 1.1 christos operand[i].exp.X_add_number |= 0x80; 1705 1.1 christos fix_new_exp (frag_now, 1706 1.1 christos output - frag_now->fr_literal + 1, 1707 1.1 christos 1, 1708 1.1 christos &operand[i].exp, 1709 1.1 christos 0, 1710 1.1 christos R_MEM_INDIRECT); 1711 1.1 christos } 1712 1.1 christos else if (x & ABSJMP) 1713 1.1 christos { 1714 1.1 christos int where = 0; 1715 1.1 christos bfd_reloc_code_real_type reloc_type = R_JMPL1; 1716 1.1 christos 1717 1.1 christos /* To be compatible with the proposed H8 ELF format, we 1718 1.1 christos want the relocation's offset to point to the first byte 1719 1.1 christos that will be modified, not to the start of the instruction. */ 1720 1.3 christos 1721 1.1 christos if ((operand->mode & SIZE) == L_32) 1722 1.1 christos { 1723 1.1 christos where = 2; 1724 1.1 christos reloc_type = R_RELLONG; 1725 1.1 christos } 1726 1.1 christos else 1727 1.1 christos where = 1; 1728 1.1 christos 1729 1.1 christos /* This jmp may be a jump or a branch. */ 1730 1.1 christos 1731 1.3 christos check_operand (operand + i, 1732 1.3 christos SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff, 1733 1.1 christos "@"); 1734 1.1 christos 1735 1.1 christos if (operand[i].exp.X_add_number & 1) 1736 1.1 christos as_warn (_("branch operand has odd offset (%lx)\n"), 1737 1.1 christos (unsigned long) operand->exp.X_add_number); 1738 1.1 christos 1739 1.1 christos if (!Hmode) 1740 1.1 christos operand[i].exp.X_add_number = 1741 1.1 christos ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000; 1742 1.1 christos fix_new_exp (frag_now, 1743 1.1 christos output - frag_now->fr_literal + where, 1744 1.1 christos 4, 1745 1.1 christos &operand[i].exp, 1746 1.1 christos 0, 1747 1.1 christos reloc_type); 1748 1.1 christos } 1749 1.1 christos } 1750 1.1 christos } 1751 1.1 christos 1752 1.1 christos /* Try to give an intelligent error message for common and simple to 1753 1.1 christos detect errors. */ 1754 1.1 christos 1755 1.1 christos static void 1756 1.1 christos clever_message (const struct h8_instruction *instruction, 1757 1.1 christos struct h8_op *operand) 1758 1.1 christos { 1759 1.1 christos /* Find out if there was more than one possible opcode. */ 1760 1.1 christos 1761 1.1 christos if ((instruction + 1)->idx != instruction->idx) 1762 1.1 christos { 1763 1.1 christos int argn; 1764 1.1 christos 1765 1.1 christos /* Only one opcode of this flavour, try to guess which operand 1766 1.1 christos didn't match. */ 1767 1.1 christos for (argn = 0; argn < instruction->noperands; argn++) 1768 1.1 christos { 1769 1.1 christos switch (instruction->opcode->args.nib[argn]) 1770 1.1 christos { 1771 1.1 christos case RD16: 1772 1.1 christos if (operand[argn].mode != RD16) 1773 1.1 christos { 1774 1.1 christos as_bad (_("destination operand must be 16 bit register")); 1775 1.1 christos return; 1776 1.1 christos 1777 1.1 christos } 1778 1.1 christos break; 1779 1.1 christos 1780 1.1 christos case RS8: 1781 1.1 christos if (operand[argn].mode != RS8) 1782 1.1 christos { 1783 1.1 christos as_bad (_("source operand must be 8 bit register")); 1784 1.1 christos return; 1785 1.1 christos } 1786 1.1 christos break; 1787 1.1 christos 1788 1.1 christos case ABS16DST: 1789 1.1 christos if (operand[argn].mode != ABS16DST) 1790 1.1 christos { 1791 1.1 christos as_bad (_("destination operand must be 16bit absolute address")); 1792 1.1 christos return; 1793 1.1 christos } 1794 1.1 christos break; 1795 1.1 christos case RD8: 1796 1.1 christos if (operand[argn].mode != RD8) 1797 1.1 christos { 1798 1.1 christos as_bad (_("destination operand must be 8 bit register")); 1799 1.1 christos return; 1800 1.1 christos } 1801 1.1 christos break; 1802 1.1 christos 1803 1.1 christos case ABS16SRC: 1804 1.1 christos if (operand[argn].mode != ABS16SRC) 1805 1.1 christos { 1806 1.1 christos as_bad (_("source operand must be 16bit absolute address")); 1807 1.1 christos return; 1808 1.1 christos } 1809 1.1 christos break; 1810 1.1 christos 1811 1.1 christos } 1812 1.1 christos } 1813 1.1 christos } 1814 1.1 christos as_bad (_("invalid operands")); 1815 1.1 christos } 1816 1.1 christos 1817 1.1 christos 1818 1.1 christos /* If OPERAND is part of an address, adjust its size and value given 1819 1.1 christos that it addresses SIZE bytes. 1820 1.1 christos 1821 1.1 christos This function decides how big non-immediate constants are when no 1822 1.1 christos size was explicitly given. It also scales down the assembly-level 1823 1.1 christos displacement in an @(d:2,ERn) operand. */ 1824 1.1 christos 1825 1.1 christos static void 1826 1.1 christos fix_operand_size (struct h8_op *operand, int size) 1827 1.1 christos { 1828 1.1 christos if (SXmode && (operand->mode & MODE) == DISP) 1829 1.1 christos { 1830 1.1 christos /* If the user didn't specify an operand width, see if we 1831 1.1 christos can use @(d:2,ERn). */ 1832 1.1 christos if ((operand->mode & SIZE) == 0 1833 1.1 christos && operand->exp.X_add_symbol == 0 1834 1.1 christos && operand->exp.X_op_symbol == 0 1835 1.1 christos && (operand->exp.X_add_number == size 1836 1.1 christos || operand->exp.X_add_number == size * 2 1837 1.1 christos || operand->exp.X_add_number == size * 3)) 1838 1.1 christos operand->mode |= L_2; 1839 1.1 christos 1840 1.1 christos /* Scale down the displacement in an @(d:2,ERn) operand. 1841 1.1 christos X_add_number then contains the desired field value. */ 1842 1.1 christos if ((operand->mode & SIZE) == L_2) 1843 1.1 christos { 1844 1.1 christos if (operand->exp.X_add_number % size != 0) 1845 1.1 christos as_warn (_("operand/size mis-match")); 1846 1.1 christos operand->exp.X_add_number /= size; 1847 1.1 christos } 1848 1.1 christos } 1849 1.1 christos 1850 1.1 christos if ((operand->mode & SIZE) == 0) 1851 1.1 christos switch (operand->mode & MODE) 1852 1.1 christos { 1853 1.1 christos case DISP: 1854 1.1 christos case INDEXB: 1855 1.1 christos case INDEXW: 1856 1.1 christos case INDEXL: 1857 1.1 christos case ABS: 1858 1.1 christos /* Pick a 24-bit address unless we know that a 16-bit address 1859 1.1 christos is safe. get_specific() will relax L_24 into L_32 where 1860 1.1 christos necessary. */ 1861 1.1 christos if (Hmode 1862 1.3 christos && !Nmode 1863 1.1 christos && ((((addressT) operand->exp.X_add_number + 0x8000) 1864 1.1 christos & 0xffffffff) > 0xffff 1865 1.1 christos || operand->exp.X_add_symbol != 0 1866 1.1 christos || operand->exp.X_op_symbol != 0)) 1867 1.1 christos operand->mode |= L_24; 1868 1.1 christos else 1869 1.1 christos operand->mode |= L_16; 1870 1.1 christos break; 1871 1.1 christos 1872 1.1 christos case PCREL: 1873 1.1 christos if ((((addressT) operand->exp.X_add_number + 0x80) 1874 1.1 christos & 0xffffffff) <= 0xff) 1875 1.1 christos { 1876 1.1 christos if (operand->exp.X_add_symbol != NULL) 1877 1.1 christos operand->mode |= bsize; 1878 1.1 christos else 1879 1.1 christos operand->mode |= L_8; 1880 1.1 christos } 1881 1.1 christos else 1882 1.1 christos operand->mode |= L_16; 1883 1.1 christos break; 1884 1.1 christos } 1885 1.1 christos } 1886 1.1 christos 1887 1.1 christos 1888 1.1 christos /* This is the guts of the machine-dependent assembler. STR points to 1889 1.1 christos a machine dependent instruction. This function is supposed to emit 1890 1.1 christos the frags/bytes it assembles. */ 1891 1.1 christos 1892 1.1 christos void 1893 1.1 christos md_assemble (char *str) 1894 1.1 christos { 1895 1.1 christos char *op_start; 1896 1.1 christos char *op_end; 1897 1.1 christos struct h8_op operand[3]; 1898 1.1 christos const struct h8_instruction *instruction; 1899 1.1 christos const struct h8_instruction *prev_instruction; 1900 1.1 christos 1901 1.1 christos char *dot = 0; 1902 1.1 christos char *slash = 0; 1903 1.1 christos char c; 1904 1.1 christos int size, i; 1905 1.1 christos 1906 1.1 christos /* Drop leading whitespace. */ 1907 1.10 christos while (is_whitespace (*str)) 1908 1.1 christos str++; 1909 1.1 christos 1910 1.1 christos /* Find the op code end. */ 1911 1.1 christos for (op_start = op_end = str; 1912 1.10 christos !is_end_of_stmt (*op_end) && !is_whitespace (*op_end); 1913 1.1 christos op_end++) 1914 1.1 christos { 1915 1.1 christos if (*op_end == '.') 1916 1.1 christos { 1917 1.1 christos dot = op_end + 1; 1918 1.1 christos *op_end = 0; 1919 1.1 christos op_end += 2; 1920 1.1 christos break; 1921 1.1 christos } 1922 1.1 christos else if (*op_end == '/' && ! slash) 1923 1.1 christos slash = op_end; 1924 1.1 christos } 1925 1.1 christos 1926 1.1 christos if (op_end == op_start) 1927 1.1 christos { 1928 1.1 christos as_bad (_("can't find opcode ")); 1929 1.1 christos } 1930 1.1 christos c = *op_end; 1931 1.1 christos 1932 1.1 christos *op_end = 0; 1933 1.1 christos 1934 1.1 christos /* The assembler stops scanning the opcode at slashes, so it fails 1935 1.1 christos to make characters following them lower case. Fix them. */ 1936 1.1 christos if (slash) 1937 1.1 christos while (*++slash) 1938 1.1 christos *slash = TOLOWER (*slash); 1939 1.1 christos 1940 1.10 christos instruction = str_hash_find (opcode_hash_control, op_start); 1941 1.1 christos 1942 1.1 christos if (instruction == NULL) 1943 1.1 christos { 1944 1.1 christos as_bad (_("unknown opcode")); 1945 1.1 christos return; 1946 1.1 christos } 1947 1.1 christos 1948 1.1 christos /* We used to set input_line_pointer to the result of get_operands, 1949 1.1 christos but that is wrong. Our caller assumes we don't change it. */ 1950 1.1 christos 1951 1.1 christos operand[0].mode = 0; 1952 1.1 christos operand[1].mode = 0; 1953 1.1 christos operand[2].mode = 0; 1954 1.1 christos 1955 1.1 christos if (OP_KIND (instruction->opcode->how) == O_MOVAB 1956 1.1 christos || OP_KIND (instruction->opcode->how) == O_MOVAW 1957 1.1 christos || OP_KIND (instruction->opcode->how) == O_MOVAL) 1958 1.1 christos get_mova_operands (op_end, operand); 1959 1.1 christos else if (OP_KIND (instruction->opcode->how) == O_RTEL 1960 1.1 christos || OP_KIND (instruction->opcode->how) == O_RTSL) 1961 1.1 christos get_rtsl_operands (op_end, operand); 1962 1.1 christos else 1963 1.1 christos get_operands (instruction->noperands, op_end, operand); 1964 1.1 christos 1965 1.1 christos *op_end = c; 1966 1.1 christos prev_instruction = instruction; 1967 1.1 christos 1968 1.1 christos /* Now we have operands from instruction. 1969 1.1 christos Let's check them out for ldm and stm. */ 1970 1.1 christos if (OP_KIND (instruction->opcode->how) == O_LDM) 1971 1.1 christos { 1972 1.1 christos /* The first operand must be @er7+, and the 1973 1.1 christos second operand must be a register pair. */ 1974 1.1 christos if ((operand[0].mode != RSINC) 1975 1.1 christos || (operand[0].reg != 7) 1976 1.1 christos || ((operand[1].reg & 0x80000000) == 0)) 1977 1.1 christos as_bad (_("invalid operand in ldm")); 1978 1.1 christos } 1979 1.1 christos else if (OP_KIND (instruction->opcode->how) == O_STM) 1980 1.1 christos { 1981 1.1 christos /* The first operand must be a register pair, 1982 1.1 christos and the second operand must be @-er7. */ 1983 1.1 christos if (((operand[0].reg & 0x80000000) == 0) 1984 1.1 christos || (operand[1].mode != RDDEC) 1985 1.1 christos || (operand[1].reg != 7)) 1986 1.1 christos as_bad (_("invalid operand in stm")); 1987 1.1 christos } 1988 1.1 christos 1989 1.1 christos size = SN; 1990 1.1 christos if (dot) 1991 1.1 christos { 1992 1.1 christos switch (TOLOWER (*dot)) 1993 1.1 christos { 1994 1.1 christos case 'b': 1995 1.1 christos size = SB; 1996 1.1 christos break; 1997 1.1 christos 1998 1.1 christos case 'w': 1999 1.1 christos size = SW; 2000 1.1 christos break; 2001 1.1 christos 2002 1.1 christos case 'l': 2003 1.1 christos size = SL; 2004 1.1 christos break; 2005 1.1 christos } 2006 1.1 christos } 2007 1.1 christos if (OP_KIND (instruction->opcode->how) == O_MOVAB || 2008 1.1 christos OP_KIND (instruction->opcode->how) == O_MOVAW || 2009 1.1 christos OP_KIND (instruction->opcode->how) == O_MOVAL) 2010 1.1 christos { 2011 1.1 christos switch (operand[0].mode & MODE) 2012 1.1 christos { 2013 1.1 christos case INDEXB: 2014 1.1 christos default: 2015 1.1 christos fix_operand_size (&operand[1], 1); 2016 1.1 christos break; 2017 1.1 christos case INDEXW: 2018 1.1 christos fix_operand_size (&operand[1], 2); 2019 1.1 christos break; 2020 1.1 christos case INDEXL: 2021 1.1 christos fix_operand_size (&operand[1], 4); 2022 1.1 christos break; 2023 1.1 christos } 2024 1.1 christos } 2025 1.1 christos else 2026 1.1 christos { 2027 1.1 christos for (i = 0; i < 3 && operand[i].mode != 0; i++) 2028 1.1 christos switch (size) 2029 1.1 christos { 2030 1.1 christos case SN: 2031 1.1 christos case SB: 2032 1.1 christos default: 2033 1.1 christos fix_operand_size (&operand[i], 1); 2034 1.1 christos break; 2035 1.1 christos case SW: 2036 1.1 christos fix_operand_size (&operand[i], 2); 2037 1.1 christos break; 2038 1.1 christos case SL: 2039 1.1 christos fix_operand_size (&operand[i], 4); 2040 1.1 christos break; 2041 1.1 christos } 2042 1.1 christos } 2043 1.1 christos 2044 1.1 christos instruction = get_specific (instruction, operand, size); 2045 1.1 christos 2046 1.1 christos if (instruction == 0) 2047 1.1 christos { 2048 1.1 christos /* Couldn't find an opcode which matched the operands. */ 2049 1.1 christos char *where = frag_more (2); 2050 1.1 christos 2051 1.1 christos where[0] = 0x0; 2052 1.1 christos where[1] = 0x0; 2053 1.1 christos clever_message (prev_instruction, operand); 2054 1.1 christos 2055 1.1 christos return; 2056 1.1 christos } 2057 1.1 christos 2058 1.1 christos build_bytes (instruction, operand); 2059 1.1 christos 2060 1.1 christos dwarf2_emit_insn (instruction->length); 2061 1.1 christos } 2062 1.1 christos 2063 1.1 christos symbolS * 2064 1.1 christos md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 2065 1.1 christos { 2066 1.1 christos return 0; 2067 1.1 christos } 2068 1.1 christos 2069 1.1 christos /* Various routines to kill one day. */ 2070 1.1 christos 2071 1.5 christos const char * 2072 1.1 christos md_atof (int type, char *litP, int *sizeP) 2073 1.1 christos { 2074 1.8 christos return ieee_md_atof (type, litP, sizeP, true); 2075 1.1 christos } 2076 1.1 christos 2077 1.1 christos #define OPTION_H_TICK_HEX (OPTION_MD_BASE) 2079 1.1 christos #define OPTION_MACH (OPTION_MD_BASE+1) 2080 1.10 christos 2081 1.10 christos const char md_shortopts[] = ""; 2082 1.3 christos const struct option md_longopts[] = 2083 1.1 christos { 2084 1.3 christos { "h-tick-hex", no_argument, NULL, OPTION_H_TICK_HEX }, 2085 1.1 christos { "mach", required_argument, NULL, OPTION_MACH }, 2086 1.1 christos {NULL, no_argument, NULL, 0} 2087 1.1 christos }; 2088 1.10 christos 2089 1.1 christos const size_t md_longopts_size = sizeof (md_longopts); 2090 1.3 christos 2091 1.3 christos struct mach_func 2092 1.3 christos { 2093 1.3 christos const char *name; 2094 1.3 christos void (*func) (void); 2095 1.3 christos }; 2096 1.3 christos 2097 1.3 christos static void 2098 1.3 christos mach_h8300h (void) 2099 1.3 christos { 2100 1.3 christos Hmode = 1; 2101 1.3 christos Smode = 0; 2102 1.3 christos Nmode = 0; 2103 1.3 christos SXmode = 0; 2104 1.3 christos default_mach = bfd_mach_h8300h; 2105 1.3 christos } 2106 1.3 christos 2107 1.3 christos static void 2108 1.3 christos mach_h8300hn (void) 2109 1.3 christos { 2110 1.3 christos Hmode = 1; 2111 1.3 christos Smode = 0; 2112 1.3 christos Nmode = 1; 2113 1.3 christos SXmode = 0; 2114 1.3 christos default_mach = bfd_mach_h8300hn; 2115 1.3 christos } 2116 1.3 christos 2117 1.3 christos static void 2118 1.3 christos mach_h8300s (void) 2119 1.3 christos { 2120 1.3 christos Hmode = 1; 2121 1.3 christos Smode = 1; 2122 1.3 christos Nmode = 0; 2123 1.3 christos SXmode = 0; 2124 1.3 christos default_mach = bfd_mach_h8300s; 2125 1.3 christos } 2126 1.3 christos 2127 1.3 christos static void 2128 1.3 christos mach_h8300sn (void) 2129 1.3 christos { 2130 1.3 christos Hmode = 1; 2131 1.3 christos Smode = 1; 2132 1.3 christos Nmode = 1; 2133 1.3 christos SXmode = 0; 2134 1.3 christos default_mach = bfd_mach_h8300sn; 2135 1.3 christos } 2136 1.3 christos 2137 1.3 christos static void 2138 1.3 christos mach_h8300sx (void) 2139 1.3 christos { 2140 1.3 christos Hmode = 1; 2141 1.3 christos Smode = 1; 2142 1.3 christos Nmode = 0; 2143 1.3 christos SXmode = 1; 2144 1.3 christos default_mach = bfd_mach_h8300sx; 2145 1.3 christos } 2146 1.3 christos 2147 1.3 christos static void 2148 1.3 christos mach_h8300sxn (void) 2149 1.3 christos { 2150 1.3 christos Hmode = 1; 2151 1.3 christos Smode = 1; 2152 1.3 christos Nmode = 1; 2153 1.3 christos SXmode = 1; 2154 1.3 christos default_mach = bfd_mach_h8300sxn; 2155 1.3 christos } 2156 1.3 christos 2157 1.3 christos const struct mach_func mach_table[] = 2158 1.3 christos { 2159 1.3 christos {"h8300h", mach_h8300h}, 2160 1.3 christos {"h8300hn", mach_h8300hn}, 2161 1.3 christos {"h8300s", mach_h8300s}, 2162 1.3 christos {"h8300sn", mach_h8300sn}, 2163 1.3 christos {"h8300sx", mach_h8300sx}, 2164 1.3 christos {"h8300sxn", mach_h8300sxn} 2165 1.3 christos }; 2166 1.1 christos 2167 1.5 christos int 2168 1.1 christos md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED) 2169 1.3 christos { 2170 1.1 christos unsigned int i; 2171 1.1 christos switch (c) 2172 1.1 christos { 2173 1.1 christos case OPTION_H_TICK_HEX: 2174 1.1 christos enable_h_tick_hex = 1; 2175 1.3 christos break; 2176 1.3 christos case OPTION_MACH: 2177 1.3 christos for (i = 0; i < sizeof(mach_table) / sizeof(struct mach_func); i++) 2178 1.3 christos { 2179 1.3 christos if (strcasecmp (arg, mach_table[i].name) == 0) 2180 1.3 christos { 2181 1.3 christos mach_table[i].func(); 2182 1.3 christos break; 2183 1.3 christos } 2184 1.3 christos } 2185 1.3 christos if (i >= sizeof(mach_table) / sizeof(struct mach_func)) 2186 1.3 christos as_bad (_("Invalid argument to --mach option: %s"), arg); 2187 1.1 christos break; 2188 1.1 christos default: 2189 1.1 christos return 0; 2190 1.1 christos } 2191 1.1 christos return 1; 2192 1.1 christos } 2193 1.1 christos 2194 1.3 christos void 2195 1.1 christos md_show_usage (FILE *stream) 2196 1.3 christos { 2197 1.3 christos fprintf (stream, _(" H8300-specific assembler options:\n")); 2198 1.3 christos fprintf (stream, _("\ 2199 1.3 christos -mach=<name> Set the H8300 machine type to one of:\n\ 2200 1.3 christos h8300h, h8300hn, h8300s, h8300sn, h8300sx, h8300sxn\n")); 2201 1.3 christos fprintf (stream, _("\ 2202 1.1 christos -h-tick-hex Support H'00 style hex constants\n")); 2203 1.1 christos } 2204 1.1 christos 2205 1.1 christos void tc_aout_fix_to_chars (void); 2207 1.1 christos 2208 1.1 christos void 2209 1.1 christos tc_aout_fix_to_chars (void) 2210 1.1 christos { 2211 1.1 christos printf (_("call to tc_aout_fix_to_chars \n")); 2212 1.1 christos abort (); 2213 1.1 christos } 2214 1.1 christos 2215 1.1 christos void 2216 1.1 christos md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, 2217 1.1 christos segT seg ATTRIBUTE_UNUSED, 2218 1.1 christos fragS *fragP ATTRIBUTE_UNUSED) 2219 1.1 christos { 2220 1.1 christos printf (_("call to md_convert_frag \n")); 2221 1.1 christos abort (); 2222 1.1 christos } 2223 1.1 christos 2224 1.1 christos valueT 2225 1.7 christos md_section_align (segT segment, valueT size) 2226 1.10 christos { 2227 1.1 christos int align = bfd_section_alignment (segment); 2228 1.1 christos return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align); 2229 1.1 christos } 2230 1.1 christos 2231 1.1 christos void 2232 1.1 christos md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 2233 1.1 christos { 2234 1.1 christos char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 2235 1.1 christos long val = *valP; 2236 1.1 christos 2237 1.1 christos switch (fixP->fx_size) 2238 1.1 christos { 2239 1.1 christos case 1: 2240 1.1 christos *buf++ = val; 2241 1.1 christos break; 2242 1.1 christos case 2: 2243 1.1 christos *buf++ = (val >> 8); 2244 1.1 christos *buf++ = val; 2245 1.1 christos break; 2246 1.1 christos case 4: 2247 1.1 christos *buf++ = (val >> 24); 2248 1.1 christos *buf++ = (val >> 16); 2249 1.1 christos *buf++ = (val >> 8); 2250 1.1 christos *buf++ = val; 2251 1.1 christos break; 2252 1.1 christos case 8: 2253 1.1 christos /* This can arise when the .quad or .8byte pseudo-ops are used. 2254 1.1 christos Returning here (without setting fx_done) will cause the code 2255 1.1 christos to attempt to generate a reloc which will then fail with the 2256 1.1 christos slightly more helpful error message: "Cannot represent 2257 1.1 christos relocation type BFD_RELOC_64". */ 2258 1.1 christos return; 2259 1.1 christos default: 2260 1.1 christos abort (); 2261 1.1 christos } 2262 1.1 christos 2263 1.1 christos if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) 2264 1.1 christos fixP->fx_done = 1; 2265 1.1 christos } 2266 1.1 christos 2267 1.1 christos int 2268 1.1 christos md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED, 2269 1.1 christos segT segment_type ATTRIBUTE_UNUSED) 2270 1.1 christos { 2271 1.1 christos printf (_("call to md_estimate_size_before_relax \n")); 2272 1.1 christos abort (); 2273 1.1 christos } 2274 1.1 christos 2275 1.1 christos /* Put number into target byte order. */ 2276 1.1 christos void 2277 1.1 christos md_number_to_chars (char *ptr, valueT use, int nbytes) 2278 1.1 christos { 2279 1.1 christos number_to_chars_bigendian (ptr, use, nbytes); 2280 1.1 christos } 2281 1.1 christos 2282 1.1 christos long 2283 1.1 christos md_pcrel_from (fixS *fixp) 2284 1.1 christos { 2285 1.1 christos as_bad_where (fixp->fx_file, fixp->fx_line, 2286 1.1 christos _("Unexpected reference to a symbol in a non-code section")); 2287 1.1 christos return 0; 2288 1.1 christos } 2289 1.1 christos 2290 1.1 christos arelent * 2291 1.1 christos tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 2292 1.1 christos { 2293 1.1 christos arelent *rel; 2294 1.1 christos bfd_reloc_code_real_type r_type; 2295 1.1 christos 2296 1.1 christos if (fixp->fx_addsy && fixp->fx_subsy) 2297 1.1 christos { 2298 1.1 christos if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy)) 2299 1.8 christos || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section) 2300 1.1 christos { 2301 1.1 christos as_bad_subtract (fixp); 2302 1.1 christos return NULL; 2303 1.1 christos } 2304 1.10 christos } 2305 1.10 christos 2306 1.1 christos rel = notes_alloc (sizeof (arelent)); 2307 1.1 christos rel->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 2308 1.1 christos *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2309 1.1 christos rel->address = fixp->fx_frag->fr_address + fixp->fx_where; 2310 1.1 christos rel->addend = fixp->fx_offset; 2311 1.1 christos 2312 1.1 christos r_type = fixp->fx_r_type; 2313 1.1 christos 2314 1.1 christos #define DEBUG 0 2315 1.1 christos #if DEBUG 2316 1.1 christos fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type)); 2317 1.1 christos fflush (stderr); 2318 1.1 christos #endif 2319 1.1 christos rel->howto = bfd_reloc_type_lookup (stdoutput, r_type); 2320 1.1 christos if (rel->howto == NULL) 2321 1.1 christos { 2322 1.1 christos as_bad_where (fixp->fx_file, fixp->fx_line, 2323 1.1 christos _("Cannot represent relocation type %s"), 2324 1.1 christos bfd_get_reloc_code_name (r_type)); 2325 1.1 christos return NULL; 2326 1.1 christos } 2327 1.1 christos 2328 return rel; 2329 } 2330