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