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