1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V 2 Copyright (C) 1996-2016 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 18 the Free Software Foundation, 51 Franklin Street - Fifth Floor, 19 Boston, MA 02110-1301, USA. */ 20 21 #include "as.h" 22 #include "safe-ctype.h" 23 #include "subsegs.h" 24 #include "opcode/d10v.h" 25 #include "elf/ppc.h" 26 #include "dwarf2dbg.h" 27 28 const char comment_chars[] = ";"; 29 const char line_comment_chars[] = "#"; 30 const char line_separator_chars[] = ""; 31 const char *md_shortopts = "O"; 32 const char EXP_CHARS[] = "eE"; 33 const char FLT_CHARS[] = "dD"; 34 35 int Optimizing = 0; 36 37 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \ 38 && (X)->X_op_symbol != NULL \ 39 && symbol_constant_p ((X)->X_op_symbol) \ 40 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT) 41 #define AT_WORD_RIGHT_SHIFT 2 42 43 /* Fixups. */ 44 #define MAX_INSN_FIXUPS 5 45 46 struct d10v_fixup 47 { 48 expressionS exp; 49 int operand; 50 int pcrel; 51 int size; 52 bfd_reloc_code_real_type reloc; 53 }; 54 55 typedef struct _fixups 56 { 57 int fc; 58 struct d10v_fixup fix[MAX_INSN_FIXUPS]; 59 struct _fixups *next; 60 } Fixups; 61 62 static Fixups FixUps[2]; 63 static Fixups *fixups; 64 65 static int do_not_ignore_hash = 0; 66 67 typedef int packing_type; 68 #define PACK_UNSPEC (0) /* Packing order not specified. */ 69 #define PACK_PARALLEL (1) /* "||" */ 70 #define PACK_LEFT_RIGHT (2) /* "->" */ 71 #define PACK_RIGHT_LEFT (3) /* "<-" */ 72 static packing_type etype = PACK_UNSPEC; /* Used by d10v_cleanup. */ 73 74 /* TRUE if instruction swapping warnings should be inhibited. 75 --nowarnswap. */ 76 static bfd_boolean flag_warn_suppress_instructionswap; 77 78 /* TRUE if instruction packing should be performed when --gstabs is specified. 79 --gstabs-packing, --no-gstabs-packing. */ 80 static bfd_boolean flag_allow_gstabs_packing = 1; 81 82 /* Local functions. */ 83 84 enum options 85 { 86 OPTION_NOWARNSWAP = OPTION_MD_BASE, 87 OPTION_GSTABSPACKING, 88 OPTION_NOGSTABSPACKING 89 }; 90 91 struct option md_longopts[] = 92 { 93 {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP}, 94 {"gstabspacking", no_argument, NULL, OPTION_GSTABSPACKING}, 95 {"gstabs-packing", no_argument, NULL, OPTION_GSTABSPACKING}, 96 {"nogstabspacking", no_argument, NULL, OPTION_NOGSTABSPACKING}, 97 {"no-gstabs-packing", no_argument, NULL, OPTION_NOGSTABSPACKING}, 98 {NULL, no_argument, NULL, 0} 99 }; 100 101 size_t md_longopts_size = sizeof (md_longopts); 102 103 /* Opcode hash table. */ 104 static struct hash_control *d10v_hash; 105 106 /* Do a binary search of the d10v_predefined_registers array to see if 107 NAME is a valid regiter name. Return the register number from the 108 array on success, or -1 on failure. */ 109 110 static int 111 reg_name_search (char *name) 112 { 113 int middle, low, high; 114 int cmp; 115 116 low = 0; 117 high = d10v_reg_name_cnt () - 1; 118 119 do 120 { 121 middle = (low + high) / 2; 122 cmp = strcasecmp (name, d10v_predefined_registers[middle].name); 123 if (cmp < 0) 124 high = middle - 1; 125 else if (cmp > 0) 126 low = middle + 1; 127 else 128 return d10v_predefined_registers[middle].value; 129 } 130 while (low <= high); 131 return -1; 132 } 133 134 /* Check the string at input_line_pointer 135 to see if it is a valid register name. */ 136 137 static int 138 register_name (expressionS *expressionP) 139 { 140 int reg_number; 141 char c, *p = input_line_pointer; 142 143 while (*p 144 && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')') 145 p++; 146 147 c = *p; 148 if (c) 149 *p++ = 0; 150 151 /* Look to see if it's in the register table. */ 152 reg_number = reg_name_search (input_line_pointer); 153 if (reg_number >= 0) 154 { 155 expressionP->X_op = O_register; 156 /* Temporarily store a pointer to the string here. */ 157 expressionP->X_op_symbol = (symbolS *) input_line_pointer; 158 expressionP->X_add_number = reg_number; 159 input_line_pointer = p; 160 return 1; 161 } 162 if (c) 163 *(p - 1) = c; 164 return 0; 165 } 166 167 static int 168 check_range (unsigned long num, int bits, int flags) 169 { 170 long min, max; 171 int retval = 0; 172 173 /* Don't bother checking 16-bit values. */ 174 if (bits == 16) 175 return 0; 176 177 if (flags & OPERAND_SHIFT) 178 { 179 /* All special shift operands are unsigned and <= 16. 180 We allow 0 for now. */ 181 if (num > 16) 182 return 1; 183 else 184 return 0; 185 } 186 187 if (flags & OPERAND_SIGNED) 188 { 189 /* Signed 3-bit integers are restricted to the (-2, 3) range. */ 190 if (flags & RESTRICTED_NUM3) 191 { 192 if ((long) num < -2 || (long) num > 3) 193 retval = 1; 194 } 195 else 196 { 197 max = (1 << (bits - 1)) - 1; 198 min = - (1 << (bits - 1)); 199 if (((long) num > max) || ((long) num < min)) 200 retval = 1; 201 } 202 } 203 else 204 { 205 max = (1 << bits) - 1; 206 min = 0; 207 if (((long) num > max) || ((long) num < min)) 208 retval = 1; 209 } 210 return retval; 211 } 212 213 void 214 md_show_usage (FILE *stream) 215 { 216 fprintf (stream, _("D10V options:\n\ 217 -O Optimize. Will do some operations in parallel.\n\ 218 --gstabs-packing Pack adjacent short instructions together even\n\ 219 when --gstabs is specified. On by default.\n\ 220 --no-gstabs-packing If --gstabs is specified, do not pack adjacent\n\ 221 instructions together.\n")); 222 } 223 224 int 225 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) 226 { 227 switch (c) 228 { 229 case 'O': 230 /* Optimize. Will attempt to parallelize operations. */ 231 Optimizing = 1; 232 break; 233 case OPTION_NOWARNSWAP: 234 flag_warn_suppress_instructionswap = 1; 235 break; 236 case OPTION_GSTABSPACKING: 237 flag_allow_gstabs_packing = 1; 238 break; 239 case OPTION_NOGSTABSPACKING: 240 flag_allow_gstabs_packing = 0; 241 break; 242 default: 243 return 0; 244 } 245 return 1; 246 } 247 248 symbolS * 249 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 250 { 251 return 0; 252 } 253 254 const char * 255 md_atof (int type, char *litP, int *sizeP) 256 { 257 return ieee_md_atof (type, litP, sizeP, TRUE); 258 } 259 260 void 261 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 262 asection *sec ATTRIBUTE_UNUSED, 263 fragS *fragP ATTRIBUTE_UNUSED) 264 { 265 abort (); 266 } 267 268 valueT 269 md_section_align (asection *seg, valueT addr) 270 { 271 int align = bfd_get_section_alignment (stdoutput, seg); 272 return ((addr + (1 << align) - 1) & -(1 << align)); 273 } 274 275 void 276 md_begin (void) 277 { 278 const char *prev_name = ""; 279 struct d10v_opcode *opcode; 280 d10v_hash = hash_new (); 281 282 /* Insert unique names into hash table. The D10v instruction set 283 has many identical opcode names that have different opcodes based 284 on the operands. This hash table then provides a quick index to 285 the first opcode with a particular name in the opcode table. */ 286 287 for (opcode = (struct d10v_opcode *) d10v_opcodes; opcode->name; opcode++) 288 { 289 if (strcmp (prev_name, opcode->name)) 290 { 291 prev_name = (char *) opcode->name; 292 hash_insert (d10v_hash, opcode->name, (char *) opcode); 293 } 294 } 295 296 fixups = &FixUps[0]; 297 FixUps[0].next = &FixUps[1]; 298 FixUps[1].next = &FixUps[0]; 299 } 300 301 /* Remove the postincrement or postdecrement operator ( '+' or '-' ) 302 from an expression. */ 303 304 static int 305 postfix (char *p) 306 { 307 while (*p != '-' && *p != '+') 308 { 309 if (*p == 0 || *p == '\n' || *p == '\r') 310 break; 311 p++; 312 } 313 314 if (*p == '-') 315 { 316 *p = ' '; 317 return -1; 318 } 319 if (*p == '+') 320 { 321 *p = ' '; 322 return 1; 323 } 324 325 return 0; 326 } 327 328 static bfd_reloc_code_real_type 329 get_reloc (struct d10v_operand *op) 330 { 331 int bits = op->bits; 332 333 if (bits <= 4) 334 return 0; 335 336 if (op->flags & OPERAND_ADDR) 337 { 338 if (bits == 8) 339 return BFD_RELOC_D10V_10_PCREL_R; 340 else 341 return BFD_RELOC_D10V_18_PCREL; 342 } 343 344 return BFD_RELOC_16; 345 } 346 347 /* Parse a string of operands. Return an array of expressions. */ 348 349 static int 350 get_operands (expressionS exp[]) 351 { 352 char *p = input_line_pointer; 353 int numops = 0; 354 int post = 0; 355 int uses_at = 0; 356 357 while (*p) 358 { 359 while (*p == ' ' || *p == '\t' || *p == ',') 360 p++; 361 if (*p == 0 || *p == '\n' || *p == '\r') 362 break; 363 364 if (*p == '@') 365 { 366 uses_at = 1; 367 368 p++; 369 exp[numops].X_op = O_absent; 370 if (*p == '(') 371 { 372 p++; 373 exp[numops].X_add_number = OPERAND_ATPAR; 374 } 375 else if (*p == '-') 376 { 377 p++; 378 exp[numops].X_add_number = OPERAND_ATMINUS; 379 } 380 else 381 { 382 exp[numops].X_add_number = OPERAND_ATSIGN; 383 if (*p == '+') 384 { 385 numops++; 386 exp[numops].X_op = O_absent; 387 exp[numops].X_add_number = OPERAND_PLUS; 388 p++; 389 } 390 post = postfix (p); 391 } 392 numops++; 393 continue; 394 } 395 396 if (*p == ')') 397 { 398 /* Just skip the trailing paren. */ 399 p++; 400 continue; 401 } 402 403 input_line_pointer = p; 404 405 /* Check to see if it might be a register name. */ 406 if (!register_name (&exp[numops])) 407 { 408 /* Parse as an expression. */ 409 if (uses_at) 410 { 411 /* Any expression that involves the indirect addressing 412 cannot also involve immediate addressing. Therefore 413 the use of the hash character is illegal. */ 414 int save = do_not_ignore_hash; 415 do_not_ignore_hash = 1; 416 417 expression (&exp[numops]); 418 419 do_not_ignore_hash = save; 420 } 421 else 422 expression (&exp[numops]); 423 } 424 425 if (strncasecmp (input_line_pointer, "@word", 5) == 0) 426 { 427 input_line_pointer += 5; 428 if (exp[numops].X_op == O_register) 429 { 430 /* If it looked like a register name but was followed by 431 "@word" then it was really a symbol, so change it to 432 one. */ 433 exp[numops].X_op = O_symbol; 434 exp[numops].X_add_symbol = 435 symbol_find_or_make ((char *) exp[numops].X_op_symbol); 436 } 437 438 /* Check for identifier@word+constant. */ 439 if (*input_line_pointer == '-' || *input_line_pointer == '+') 440 { 441 expressionS new_exp; 442 expression (&new_exp); 443 exp[numops].X_add_number = new_exp.X_add_number; 444 } 445 446 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */ 447 { 448 expressionS new_exp; 449 memset (&new_exp, 0, sizeof new_exp); 450 new_exp.X_add_number = AT_WORD_RIGHT_SHIFT; 451 new_exp.X_op = O_constant; 452 new_exp.X_unsigned = 1; 453 exp[numops].X_op_symbol = make_expr_symbol (&new_exp); 454 exp[numops].X_op = O_right_shift; 455 } 456 457 know (AT_WORD_P (&exp[numops])); 458 } 459 460 if (exp[numops].X_op == O_illegal) 461 as_bad (_("illegal operand")); 462 else if (exp[numops].X_op == O_absent) 463 as_bad (_("missing operand")); 464 465 numops++; 466 p = input_line_pointer; 467 } 468 469 switch (post) 470 { 471 case -1: /* Postdecrement mode. */ 472 exp[numops].X_op = O_absent; 473 exp[numops++].X_add_number = OPERAND_MINUS; 474 break; 475 case 1: /* Postincrement mode. */ 476 exp[numops].X_op = O_absent; 477 exp[numops++].X_add_number = OPERAND_PLUS; 478 break; 479 } 480 481 exp[numops].X_op = 0; 482 return numops; 483 } 484 485 static unsigned long 486 d10v_insert_operand (unsigned long insn, 487 int op_type, 488 offsetT value, 489 int left, 490 fixS *fix) 491 { 492 int shift, bits; 493 494 shift = d10v_operands[op_type].shift; 495 if (left) 496 shift += 15; 497 498 bits = d10v_operands[op_type].bits; 499 500 /* Truncate to the proper number of bits. */ 501 if (check_range (value, bits, d10v_operands[op_type].flags)) 502 as_bad_where (fix->fx_file, fix->fx_line, 503 _("operand out of range: %ld"), (long) value); 504 505 value &= 0x7FFFFFFF >> (31 - bits); 506 insn |= (value << shift); 507 508 return insn; 509 } 510 511 /* Take a pointer to the opcode entry in the opcode table and the 512 array of operand expressions. Return the instruction. */ 513 514 static unsigned long 515 build_insn (struct d10v_opcode *opcode, 516 expressionS *opers, 517 unsigned long insn) 518 { 519 int i, bits, shift, flags, format; 520 unsigned long number; 521 522 /* The insn argument is only used for the DIVS kludge. */ 523 if (insn) 524 format = LONG_R; 525 else 526 { 527 insn = opcode->opcode; 528 format = opcode->format; 529 } 530 531 for (i = 0; opcode->operands[i]; i++) 532 { 533 flags = d10v_operands[opcode->operands[i]].flags; 534 bits = d10v_operands[opcode->operands[i]].bits; 535 shift = d10v_operands[opcode->operands[i]].shift; 536 number = opers[i].X_add_number; 537 538 if (flags & OPERAND_REG) 539 { 540 number &= REGISTER_MASK; 541 if (format == LONG_L) 542 shift += 15; 543 } 544 545 if (opers[i].X_op != O_register && opers[i].X_op != O_constant) 546 { 547 /* Now create a fixup. */ 548 549 if (fixups->fc >= MAX_INSN_FIXUPS) 550 as_fatal (_("too many fixups")); 551 552 if (AT_WORD_P (&opers[i])) 553 { 554 /* Recognize XXX>>1+N aka XXX@word+N as special (AT_WORD). */ 555 fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18; 556 opers[i].X_op = O_symbol; 557 opers[i].X_op_symbol = NULL; /* Should free it. */ 558 /* number is left shifted by AT_WORD_RIGHT_SHIFT so 559 that, it is aligned with the symbol's value. Later, 560 BFD_RELOC_D10V_18 will right shift (symbol_value + 561 X_add_number). */ 562 number <<= AT_WORD_RIGHT_SHIFT; 563 opers[i].X_add_number = number; 564 } 565 else 566 { 567 fixups->fix[fixups->fc].reloc = 568 get_reloc ((struct d10v_operand *) &d10v_operands[opcode->operands[i]]); 569 570 /* Check that an immediate was passed to ops that expect one. */ 571 if ((flags & OPERAND_NUM) 572 && (fixups->fix[fixups->fc].reloc == 0)) 573 as_bad (_("operand is not an immediate")); 574 } 575 576 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 || 577 fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18) 578 fixups->fix[fixups->fc].size = 2; 579 else 580 fixups->fix[fixups->fc].size = 4; 581 582 fixups->fix[fixups->fc].exp = opers[i]; 583 fixups->fix[fixups->fc].operand = opcode->operands[i]; 584 fixups->fix[fixups->fc].pcrel = 585 (flags & OPERAND_ADDR) ? TRUE : FALSE; 586 (fixups->fc)++; 587 } 588 589 /* Truncate to the proper number of bits. */ 590 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags)) 591 as_bad (_("operand out of range: %lu"), number); 592 number &= 0x7FFFFFFF >> (31 - bits); 593 insn = insn | (number << shift); 594 } 595 596 /* kludge: for DIVS, we need to put the operands in twice on the second 597 pass, format is changed to LONG_R to force the second set of operands 598 to not be shifted over 15. */ 599 if ((opcode->opcode == OPCODE_DIVS) && (format == LONG_L)) 600 insn = build_insn (opcode, opers, insn); 601 602 return insn; 603 } 604 605 /* Write out a long form instruction. */ 606 607 static void 608 write_long (unsigned long insn, Fixups *fx) 609 { 610 int i, where; 611 char *f = frag_more (4); 612 613 dwarf2_emit_insn (4); 614 insn |= FM11; 615 number_to_chars_bigendian (f, insn, 4); 616 617 for (i = 0; i < fx->fc; i++) 618 { 619 if (fx->fix[i].reloc) 620 { 621 where = f - frag_now->fr_literal; 622 if (fx->fix[i].size == 2) 623 where += 2; 624 625 if (fx->fix[i].reloc == BFD_RELOC_D10V_18) 626 fx->fix[i].operand |= 4096; 627 628 fix_new_exp (frag_now, 629 where, 630 fx->fix[i].size, 631 &(fx->fix[i].exp), 632 fx->fix[i].pcrel, 633 fx->fix[i].operand|2048); 634 } 635 } 636 fx->fc = 0; 637 } 638 639 /* Write out a short form instruction by itself. */ 640 641 static void 642 write_1_short (struct d10v_opcode *opcode, 643 unsigned long insn, 644 Fixups *fx) 645 { 646 char *f = frag_more (4); 647 int i, where; 648 649 dwarf2_emit_insn (4); 650 if (opcode->exec_type & PARONLY) 651 as_fatal (_("Instruction must be executed in parallel with another instruction.")); 652 653 /* The other container needs to be NOP. 654 According to 4.3.1: for FM=00, sub-instructions performed only by IU 655 cannot be encoded in L-container. */ 656 if (opcode->unit == IU) 657 insn |= FM00 | (NOP << 15); /* Right container. */ 658 else 659 insn = FM00 | (insn << 15) | NOP; /* Left container. */ 660 661 number_to_chars_bigendian (f, insn, 4); 662 for (i = 0; i < fx->fc; i++) 663 { 664 if (fx->fix[i].reloc) 665 { 666 where = f - frag_now->fr_literal; 667 if (fx->fix[i].size == 2) 668 where += 2; 669 670 if (fx->fix[i].reloc == BFD_RELOC_D10V_18) 671 fx->fix[i].operand |= 4096; 672 673 /* If it's an R reloc, we may have to switch it to L. */ 674 if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) 675 && (opcode->unit != IU)) 676 fx->fix[i].operand |= 1024; 677 678 fix_new_exp (frag_now, 679 where, 680 fx->fix[i].size, 681 &(fx->fix[i].exp), 682 fx->fix[i].pcrel, 683 fx->fix[i].operand|2048); 684 } 685 } 686 fx->fc = 0; 687 } 688 689 /* Determine if there are any resource conflicts among two manually 690 parallelized instructions. Some of this was lifted from parallel_ok. */ 691 692 static void 693 check_resource_conflict (struct d10v_opcode *op1, 694 unsigned long insn1, 695 struct d10v_opcode *op2, 696 unsigned long insn2) 697 { 698 int i, j, flags, mask, shift, regno; 699 unsigned long ins, mod[2]; 700 struct d10v_opcode *op; 701 702 if ((op1->exec_type & SEQ) 703 || ! ((op1->exec_type & PAR) || (op1->exec_type & PARONLY))) 704 { 705 as_warn (_("packing conflict: %s must dispatch sequentially"), 706 op1->name); 707 return; 708 } 709 710 if ((op2->exec_type & SEQ) 711 || ! ((op2->exec_type & PAR) || (op2->exec_type & PARONLY))) 712 { 713 as_warn (_("packing conflict: %s must dispatch sequentially"), 714 op2->name); 715 return; 716 } 717 718 /* See if both instructions write to the same resource. 719 720 The idea here is to create two sets of bitmasks (mod and used) which 721 indicate which registers are modified or used by each instruction. 722 The operation can only be done in parallel if neither instruction 723 modifies the same register. Accesses to control registers and memory 724 are treated as accesses to a single register. So if both instructions 725 write memory or if the first instruction writes memory and the second 726 reads, then they cannot be done in parallel. We treat reads to the PSW 727 (which includes C, F0, and F1) in isolation. So simultaneously writing 728 C and F0 in two different sub-instructions is permitted. */ 729 730 /* The bitmasks (mod and used) look like this (bit 31 = MSB). 731 r0-r15 0-15 732 a0-a1 16-17 733 cr (not psw) 18 734 psw(other) 19 735 mem 20 736 psw(C flag) 21 737 psw(F0 flag) 22 */ 738 739 for (j = 0; j < 2; j++) 740 { 741 if (j == 0) 742 { 743 op = op1; 744 ins = insn1; 745 } 746 else 747 { 748 op = op2; 749 ins = insn2; 750 } 751 mod[j] = 0; 752 if (op->exec_type & BRANCH_LINK) 753 mod[j] |= 1 << 13; 754 755 for (i = 0; op->operands[i]; i++) 756 { 757 flags = d10v_operands[op->operands[i]].flags; 758 shift = d10v_operands[op->operands[i]].shift; 759 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits); 760 if (flags & OPERAND_REG) 761 { 762 regno = (ins >> shift) & mask; 763 if (flags & (OPERAND_ACC0 | OPERAND_ACC1)) 764 regno += 16; 765 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */ 766 { 767 if (regno == 0) 768 regno = 19; 769 else 770 regno = 18; 771 } 772 else if (flags & OPERAND_FFLAG) 773 regno = 22; 774 else if (flags & OPERAND_CFLAG) 775 regno = 21; 776 777 if (flags & OPERAND_DEST 778 /* Auto inc/dec also modifies the register. */ 779 || (op->operands[i + 1] != 0 780 && (d10v_operands[op->operands[i + 1]].flags 781 & (OPERAND_PLUS | OPERAND_MINUS)) != 0)) 782 { 783 mod[j] |= 1 << regno; 784 if (flags & OPERAND_EVEN) 785 mod[j] |= 1 << (regno + 1); 786 } 787 } 788 else if (flags & OPERAND_ATMINUS) 789 { 790 /* SP implicitly used/modified. */ 791 mod[j] |= 1 << 15; 792 } 793 } 794 795 if (op->exec_type & WMEM) 796 mod[j] |= 1 << 20; 797 else if (op->exec_type & WF0) 798 mod[j] |= 1 << 22; 799 else if (op->exec_type & WCAR) 800 mod[j] |= 1 << 21; 801 } 802 803 if ((mod[0] & mod[1]) == 0) 804 return; 805 else 806 { 807 unsigned long x; 808 x = mod[0] & mod[1]; 809 810 for (j = 0; j <= 15; j++) 811 if (x & (1 << j)) 812 as_warn (_("resource conflict (R%d)"), j); 813 for (j = 16; j <= 17; j++) 814 if (x & (1 << j)) 815 as_warn (_("resource conflict (A%d)"), j - 16); 816 if (x & (1 << 19)) 817 as_warn (_("resource conflict (PSW)")); 818 if (x & (1 << 21)) 819 as_warn (_("resource conflict (C flag)")); 820 if (x & (1 << 22)) 821 as_warn (_("resource conflict (F flag)")); 822 } 823 } 824 825 /* Check 2 instructions and determine if they can be safely 826 executed in parallel. Return 1 if they can be. */ 827 828 static int 829 parallel_ok (struct d10v_opcode *op1, 830 unsigned long insn1, 831 struct d10v_opcode *op2, 832 unsigned long insn2, 833 packing_type exec_type) 834 { 835 int i, j, flags, mask, shift, regno; 836 unsigned long ins, mod[2], used[2]; 837 struct d10v_opcode *op; 838 839 if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0 840 || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0 841 || (op1->unit == BOTH) || (op2->unit == BOTH) 842 || (op1->unit == IU && op2->unit == IU) 843 || (op1->unit == MU && op2->unit == MU)) 844 return 0; 845 846 /* If this is auto parallelization, and the first instruction is a 847 branch or should not be packed, then don't parallelize. */ 848 if (exec_type == PACK_UNSPEC 849 && (op1->exec_type & (ALONE | BRANCH))) 850 return 0; 851 852 /* The idea here is to create two sets of bitmasks (mod and used) 853 which indicate which registers are modified or used by each 854 instruction. The operation can only be done in parallel if 855 instruction 1 and instruction 2 modify different registers, and 856 the first instruction does not modify registers that the second 857 is using (The second instruction can modify registers that the 858 first is using as they are only written back after the first 859 instruction has completed). Accesses to control registers, PSW, 860 and memory are treated as accesses to a single register. So if 861 both instructions write memory or if the first instruction writes 862 memory and the second reads, then they cannot be done in 863 parallel. Likewise, if the first instruction mucks with the psw 864 and the second reads the PSW (which includes C, F0, and F1), then 865 they cannot operate safely in parallel. */ 866 867 /* The bitmasks (mod and used) look like this (bit 31 = MSB). 868 r0-r15 0-15 869 a0-a1 16-17 870 cr (not psw) 18 871 psw 19 872 mem 20 */ 873 874 for (j = 0; j < 2; j++) 875 { 876 if (j == 0) 877 { 878 op = op1; 879 ins = insn1; 880 } 881 else 882 { 883 op = op2; 884 ins = insn2; 885 } 886 mod[j] = used[j] = 0; 887 if (op->exec_type & BRANCH_LINK) 888 mod[j] |= 1 << 13; 889 890 for (i = 0; op->operands[i]; i++) 891 { 892 flags = d10v_operands[op->operands[i]].flags; 893 shift = d10v_operands[op->operands[i]].shift; 894 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits); 895 if (flags & OPERAND_REG) 896 { 897 regno = (ins >> shift) & mask; 898 if (flags & (OPERAND_ACC0 | OPERAND_ACC1)) 899 regno += 16; 900 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc. */ 901 { 902 if (regno == 0) 903 regno = 19; 904 else 905 regno = 18; 906 } 907 else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG)) 908 regno = 19; 909 910 if (flags & OPERAND_DEST) 911 { 912 mod[j] |= 1 << regno; 913 if (flags & OPERAND_EVEN) 914 mod[j] |= 1 << (regno + 1); 915 } 916 else 917 { 918 used[j] |= 1 << regno; 919 if (flags & OPERAND_EVEN) 920 used[j] |= 1 << (regno + 1); 921 922 /* Auto inc/dec also modifies the register. */ 923 if (op->operands[i + 1] != 0 924 && (d10v_operands[op->operands[i + 1]].flags 925 & (OPERAND_PLUS | OPERAND_MINUS)) != 0) 926 mod[j] |= 1 << regno; 927 } 928 } 929 else if (flags & OPERAND_ATMINUS) 930 { 931 /* SP implicitly used/modified. */ 932 mod[j] |= 1 << 15; 933 used[j] |= 1 << 15; 934 } 935 } 936 if (op->exec_type & RMEM) 937 used[j] |= 1 << 20; 938 else if (op->exec_type & WMEM) 939 mod[j] |= 1 << 20; 940 else if (op->exec_type & RF0) 941 used[j] |= 1 << 19; 942 else if (op->exec_type & WF0) 943 mod[j] |= 1 << 19; 944 else if (op->exec_type & WCAR) 945 mod[j] |= 1 << 19; 946 } 947 if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0) 948 return 1; 949 return 0; 950 } 951 952 /* Expects two short instructions. 953 If possible, writes out both as a single packed instruction. 954 Otherwise, writes out the first one, packed with a NOP. 955 Returns number of instructions not written out. */ 956 957 static int 958 write_2_short (struct d10v_opcode *opcode1, 959 unsigned long insn1, 960 struct d10v_opcode *opcode2, 961 unsigned long insn2, 962 packing_type exec_type, 963 Fixups *fx) 964 { 965 unsigned long insn; 966 char *f; 967 int i, j, where; 968 969 if ((exec_type != PACK_PARALLEL) 970 && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY))) 971 as_fatal (_("Instruction must be executed in parallel")); 972 973 if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE)) 974 as_fatal (_("Long instructions may not be combined.")); 975 976 switch (exec_type) 977 { 978 case PACK_UNSPEC: /* Order not specified. */ 979 if (opcode1->exec_type & ALONE) 980 { 981 /* Case of a short branch on a separate GAS line. Pack with NOP. */ 982 write_1_short (opcode1, insn1, fx->next); 983 return 1; 984 } 985 if (Optimizing 986 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)) 987 { 988 /* Parallel. */ 989 if (opcode1->unit == IU) 990 insn = FM00 | (insn2 << 15) | insn1; 991 else if (opcode2->unit == MU) 992 insn = FM00 | (insn2 << 15) | insn1; 993 else 994 insn = FM00 | (insn1 << 15) | insn2; 995 } 996 else if (opcode1->unit == IU) 997 /* Reverse sequential with IU opcode1 on right and done first. */ 998 insn = FM10 | (insn2 << 15) | insn1; 999 else 1000 /* Sequential with non-IU opcode1 on left and done first. */ 1001 insn = FM01 | (insn1 << 15) | insn2; 1002 break; 1003 1004 case PACK_PARALLEL: 1005 if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ) 1006 as_fatal 1007 (_("One of these instructions may not be executed in parallel.")); 1008 if (opcode1->unit == IU) 1009 { 1010 if (opcode2->unit == IU) 1011 as_fatal (_("Two IU instructions may not be executed in parallel")); 1012 if (!flag_warn_suppress_instructionswap) 1013 as_warn (_("Swapping instruction order")); 1014 insn = FM00 | (insn2 << 15) | insn1; 1015 } 1016 else if (opcode2->unit == MU) 1017 { 1018 if (opcode1->unit == MU) 1019 as_fatal (_("Two MU instructions may not be executed in parallel")); 1020 if (!flag_warn_suppress_instructionswap) 1021 as_warn (_("Swapping instruction order")); 1022 insn = FM00 | (insn2 << 15) | insn1; 1023 } 1024 else 1025 insn = FM00 | (insn1 << 15) | insn2; 1026 check_resource_conflict (opcode1, insn1, opcode2, insn2); 1027 break; 1028 1029 case PACK_LEFT_RIGHT: 1030 if (opcode1->unit != IU) 1031 insn = FM01 | (insn1 << 15) | insn2; 1032 else if (opcode2->unit == MU || opcode2->unit == EITHER) 1033 { 1034 if (!flag_warn_suppress_instructionswap) 1035 as_warn (_("Swapping instruction order")); 1036 insn = FM10 | (insn2 << 15) | insn1; 1037 } 1038 else 1039 as_fatal (_("IU instruction may not be in the left container")); 1040 if (opcode1->exec_type & ALONE) 1041 as_warn (_("Instruction in R container is squashed by flow control instruction in L container.")); 1042 break; 1043 1044 case PACK_RIGHT_LEFT: 1045 if (opcode2->unit != MU) 1046 insn = FM10 | (insn1 << 15) | insn2; 1047 else if (opcode1->unit == IU || opcode1->unit == EITHER) 1048 { 1049 if (!flag_warn_suppress_instructionswap) 1050 as_warn (_("Swapping instruction order")); 1051 insn = FM01 | (insn2 << 15) | insn1; 1052 } 1053 else 1054 as_fatal (_("MU instruction may not be in the right container")); 1055 if (opcode2->exec_type & ALONE) 1056 as_warn (_("Instruction in R container is squashed by flow control instruction in L container.")); 1057 break; 1058 1059 default: 1060 as_fatal (_("unknown execution type passed to write_2_short()")); 1061 } 1062 1063 f = frag_more (4); 1064 dwarf2_emit_insn (4); 1065 number_to_chars_bigendian (f, insn, 4); 1066 1067 /* Process fixup chains. fx refers to insn2 when j == 0, and to 1068 insn1 when j == 1. Yes, it's reversed. */ 1069 1070 for (j = 0; j < 2; j++) 1071 { 1072 for (i = 0; i < fx->fc; i++) 1073 { 1074 if (fx->fix[i].reloc) 1075 { 1076 where = f - frag_now->fr_literal; 1077 if (fx->fix[i].size == 2) 1078 where += 2; 1079 1080 if (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R 1081 /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to 1082 the instruction in the L container has to be 1083 adjusted to BDF_RELOC_D10V_10_PCREL_L. When 1084 j==0, we're processing insn2's operands, so we 1085 want to mark the operand if insn2 is *not* in the 1086 R container. When j==1, we're processing insn1's 1087 operands, so we want to mark the operand if insn2 1088 *is* in the R container. Note that, if two 1089 instructions are identical, we're never going to 1090 swap them, so the test is safe. */ 1091 && j == ((insn & 0x7fff) == insn2)) 1092 fx->fix[i].operand |= 1024; 1093 1094 if (fx->fix[i].reloc == BFD_RELOC_D10V_18) 1095 fx->fix[i].operand |= 4096; 1096 1097 fix_new_exp (frag_now, 1098 where, 1099 fx->fix[i].size, 1100 &(fx->fix[i].exp), 1101 fx->fix[i].pcrel, 1102 fx->fix[i].operand|2048); 1103 } 1104 } 1105 fx->fc = 0; 1106 fx = fx->next; 1107 } 1108 return 0; 1109 } 1110 1111 /* This is the main entry point for the machine-dependent assembler. 1112 str points to a machine-dependent instruction. This function is 1113 supposed to emit the frags/bytes it assembles to. For the D10V, it 1114 mostly handles the special VLIW parsing and packing and leaves the 1115 difficult stuff to do_assemble(). */ 1116 1117 static unsigned long prev_insn; 1118 static struct d10v_opcode *prev_opcode = 0; 1119 static subsegT prev_subseg; 1120 static segT prev_seg = 0; 1121 1122 /* Find the symbol which has the same name as the register in exp. */ 1123 1124 static symbolS * 1125 find_symbol_matching_register (expressionS *exp) 1126 { 1127 int i; 1128 1129 if (exp->X_op != O_register) 1130 return NULL; 1131 1132 /* Find the name of the register. */ 1133 for (i = d10v_reg_name_cnt (); i--;) 1134 if (d10v_predefined_registers[i].value == exp->X_add_number) 1135 break; 1136 1137 if (i < 0) 1138 abort (); 1139 1140 /* Now see if a symbol has been defined with the same name. */ 1141 return symbol_find (d10v_predefined_registers[i].name); 1142 } 1143 1144 /* Get a pointer to an entry in the opcode table. 1145 The function must look at all opcodes with the same name and use 1146 the operands to choose the correct opcode. */ 1147 1148 static struct d10v_opcode * 1149 find_opcode (struct d10v_opcode *opcode, expressionS myops[]) 1150 { 1151 int i, match; 1152 struct d10v_opcode *next_opcode; 1153 1154 /* Get all the operands and save them as expressions. */ 1155 get_operands (myops); 1156 1157 /* Now see if the operand is a fake. If so, find the correct size 1158 instruction, if possible. */ 1159 if (opcode->format == OPCODE_FAKE) 1160 { 1161 int opnum = opcode->operands[0]; 1162 int flags; 1163 1164 if (myops[opnum].X_op == O_register) 1165 { 1166 myops[opnum].X_op = O_symbol; 1167 myops[opnum].X_add_symbol = 1168 symbol_find_or_make ((char *) myops[opnum].X_op_symbol); 1169 myops[opnum].X_add_number = 0; 1170 myops[opnum].X_op_symbol = NULL; 1171 } 1172 1173 next_opcode = opcode + 1; 1174 1175 /* If the first operand is supposed to be a register, make sure 1176 we got a valid one. */ 1177 flags = d10v_operands[next_opcode->operands[0]].flags; 1178 if (flags & OPERAND_REG) 1179 { 1180 int X_op = myops[0].X_op; 1181 int num = myops[0].X_add_number; 1182 1183 if (X_op != O_register 1184 || (num & ~flags 1185 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1 1186 | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL)) 1187 || ((flags & OPERAND_SP) && ! (num & OPERAND_SP))) 1188 { 1189 as_bad (_("bad opcode or operands")); 1190 return 0; 1191 } 1192 } 1193 1194 if (myops[opnum].X_op == O_constant 1195 || (myops[opnum].X_op == O_symbol 1196 && S_IS_DEFINED (myops[opnum].X_add_symbol) 1197 && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg))) 1198 { 1199 for (i = 0; opcode->operands[i + 1]; i++) 1200 { 1201 int bits = d10v_operands[next_opcode->operands[opnum]].bits; 1202 1203 flags = d10v_operands[next_opcode->operands[opnum]].flags; 1204 1205 if (flags & OPERAND_ADDR) 1206 bits += 2; 1207 1208 if (myops[opnum].X_op == O_constant) 1209 { 1210 if (!check_range (myops[opnum].X_add_number, bits, flags)) 1211 break; 1212 } 1213 else 1214 { 1215 fragS *sym_frag; 1216 fragS *f; 1217 unsigned long current_position; 1218 unsigned long symbol_position; 1219 unsigned long value; 1220 bfd_boolean found_symbol; 1221 1222 /* Calculate the address of the current instruction 1223 and the address of the symbol. Do this by summing 1224 the offsets of previous frags until we reach the 1225 frag containing the symbol, and the current frag. */ 1226 sym_frag = symbol_get_frag (myops[opnum].X_add_symbol); 1227 found_symbol = FALSE; 1228 1229 current_position = frag_now_fix_octets (); 1230 symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol); 1231 1232 for (f = frchain_now->frch_root; f; f = f->fr_next) 1233 { 1234 current_position += f->fr_fix + f->fr_offset; 1235 1236 if (f == sym_frag) 1237 found_symbol = TRUE; 1238 1239 if (! found_symbol) 1240 symbol_position += f->fr_fix + f->fr_offset; 1241 } 1242 1243 value = symbol_position; 1244 1245 if (flags & OPERAND_ADDR) 1246 value -= current_position; 1247 1248 if (AT_WORD_P (&myops[opnum])) 1249 { 1250 if (bits > 4) 1251 { 1252 bits += 2; 1253 if (!check_range (value, bits, flags)) 1254 break; 1255 } 1256 } 1257 else if (!check_range (value, bits, flags)) 1258 break; 1259 } 1260 next_opcode++; 1261 } 1262 1263 if (opcode->operands [i + 1] == 0) 1264 as_fatal (_("value out of range")); 1265 else 1266 opcode = next_opcode; 1267 } 1268 else 1269 /* Not a constant, so use a long instruction. */ 1270 opcode += 2; 1271 } 1272 1273 match = 0; 1274 1275 /* Now search the opcode table table for one with operands 1276 that matches what we've got. */ 1277 while (!match) 1278 { 1279 match = 1; 1280 for (i = 0; opcode->operands[i]; i++) 1281 { 1282 int flags = d10v_operands[opcode->operands[i]].flags; 1283 int X_op = myops[i].X_op; 1284 int num = myops[i].X_add_number; 1285 1286 if (X_op == 0) 1287 { 1288 match = 0; 1289 break; 1290 } 1291 1292 if (flags & OPERAND_REG) 1293 { 1294 if ((X_op != O_register) 1295 || (num & ~flags 1296 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1 1297 | OPERAND_FFLAG | OPERAND_CFLAG 1298 | OPERAND_CONTROL)) 1299 || ((flags & OPERAND_SP) && ! (num & OPERAND_SP))) 1300 { 1301 match = 0; 1302 break; 1303 } 1304 } 1305 1306 if (((flags & OPERAND_MINUS) && ((X_op != O_absent) || (num != OPERAND_MINUS))) || 1307 ((flags & OPERAND_PLUS) && ((X_op != O_absent) || (num != OPERAND_PLUS))) || 1308 ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) || 1309 ((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) || 1310 ((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR))))) 1311 { 1312 match = 0; 1313 break; 1314 } 1315 1316 /* Unfortunately, for the indirect operand in instructions such 1317 as ``ldb r1, @(c,r14)'' this function can be passed 1318 X_op == O_register (because 'c' is a valid register name). 1319 However we cannot just ignore the case when X_op == O_register 1320 but flags & OPERAND_REG is null, so we check to see if a symbol 1321 of the same name as the register exists. If the symbol does 1322 exist, then the parser was unable to distinguish the two cases 1323 and we fix things here. (Ref: PR14826) */ 1324 1325 if (!(flags & OPERAND_REG) && (X_op == O_register)) 1326 { 1327 symbolS * sym; 1328 1329 sym = find_symbol_matching_register (& myops[i]); 1330 1331 if (sym != NULL) 1332 { 1333 myops[i].X_op = X_op = O_symbol; 1334 myops[i].X_add_symbol = sym; 1335 } 1336 else 1337 as_bad 1338 (_("illegal operand - register name found where none expected")); 1339 } 1340 } 1341 1342 /* We're only done if the operands matched so far AND there 1343 are no more to check. */ 1344 if (match && myops[i].X_op == 0) 1345 break; 1346 else 1347 match = 0; 1348 1349 next_opcode = opcode + 1; 1350 1351 if (next_opcode->opcode == 0) 1352 break; 1353 1354 if (strcmp (next_opcode->name, opcode->name)) 1355 break; 1356 1357 opcode = next_opcode; 1358 } 1359 1360 if (!match) 1361 { 1362 as_bad (_("bad opcode or operands")); 1363 return 0; 1364 } 1365 1366 /* Check that all registers that are required to be even are. 1367 Also, if any operands were marked as registers, but were really symbols, 1368 fix that here. */ 1369 for (i = 0; opcode->operands[i]; i++) 1370 { 1371 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) && 1372 (myops[i].X_add_number & 1)) 1373 as_fatal (_("Register number must be EVEN")); 1374 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_NOSP) 1375 && (myops[i].X_add_number & OPERAND_SP)) 1376 as_bad (_("Unsupported use of sp")); 1377 if (myops[i].X_op == O_register) 1378 { 1379 if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG)) 1380 { 1381 myops[i].X_op = O_symbol; 1382 myops[i].X_add_symbol = 1383 symbol_find_or_make ((char *) myops[i].X_op_symbol); 1384 myops[i].X_add_number = 0; 1385 myops[i].X_op_symbol = NULL; 1386 } 1387 } 1388 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_CONTROL) 1389 && (myops[i].X_add_number == OPERAND_CONTROL + 4 1390 || myops[i].X_add_number == OPERAND_CONTROL + 5 1391 || myops[i].X_add_number == OPERAND_CONTROL + 6 1392 || myops[i].X_add_number == OPERAND_CONTROL + 12 1393 || myops[i].X_add_number == OPERAND_CONTROL + 13 1394 || myops[i].X_add_number == OPERAND_CONTROL + 15)) 1395 as_warn (_("cr%ld is a reserved control register"), 1396 myops[i].X_add_number - OPERAND_CONTROL); 1397 } 1398 return opcode; 1399 } 1400 1401 /* Assemble a single instruction. 1402 Return an opcode, or -1 (an invalid opcode) on error. */ 1403 1404 static unsigned long 1405 do_assemble (char *str, struct d10v_opcode **opcode) 1406 { 1407 unsigned char *op_start, *op_end; 1408 char *save; 1409 char name[20]; 1410 int nlen = 0; 1411 expressionS myops[6]; 1412 1413 /* Drop leading whitespace. */ 1414 while (*str == ' ') 1415 str++; 1416 1417 /* Find the opcode end. */ 1418 for (op_start = op_end = (unsigned char *) str; 1419 *op_end && !is_end_of_line[*op_end] && *op_end != ' '; 1420 op_end++) 1421 { 1422 name[nlen] = TOLOWER (op_start[nlen]); 1423 nlen++; 1424 if (nlen == sizeof (name) - 1) 1425 break; 1426 } 1427 name[nlen] = 0; 1428 1429 if (nlen == 0) 1430 return -1; 1431 1432 /* Find the first opcode with the proper name. */ 1433 *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name); 1434 if (*opcode == NULL) 1435 return -1; 1436 1437 save = input_line_pointer; 1438 input_line_pointer = (char *) op_end; 1439 *opcode = find_opcode (*opcode, myops); 1440 if (*opcode == 0) 1441 return -1; 1442 input_line_pointer = save; 1443 1444 return build_insn ((*opcode), myops, 0); 1445 } 1446 1447 /* If while processing a fixup, a reloc really needs to be created. 1448 Then it is done here. */ 1449 1450 arelent * 1451 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp) 1452 { 1453 arelent *reloc; 1454 reloc = XNEW (arelent); 1455 reloc->sym_ptr_ptr = XNEW (asymbol *); 1456 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 1457 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 1458 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 1459 if (reloc->howto == (reloc_howto_type *) NULL) 1460 { 1461 as_bad_where (fixp->fx_file, fixp->fx_line, 1462 _("reloc %d not supported by object file format"), 1463 (int) fixp->fx_r_type); 1464 return NULL; 1465 } 1466 1467 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 1468 reloc->address = fixp->fx_offset; 1469 1470 reloc->addend = 0; 1471 1472 return reloc; 1473 } 1474 1475 int 1476 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED, 1477 asection *seg ATTRIBUTE_UNUSED) 1478 { 1479 abort (); 1480 return 0; 1481 } 1482 1483 long 1484 md_pcrel_from_section (fixS *fixp, segT sec) 1485 { 1486 if (fixp->fx_addsy != (symbolS *) NULL 1487 && (!S_IS_DEFINED (fixp->fx_addsy) 1488 || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) 1489 return 0; 1490 return fixp->fx_frag->fr_address + fixp->fx_where; 1491 } 1492 1493 void 1494 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 1495 { 1496 char *where; 1497 unsigned long insn; 1498 long value = *valP; 1499 int op_type; 1500 int left = 0; 1501 1502 if (fixP->fx_addsy == (symbolS *) NULL) 1503 fixP->fx_done = 1; 1504 1505 /* We don't actually support subtracting a symbol. */ 1506 if (fixP->fx_subsy != (symbolS *) NULL) 1507 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex")); 1508 1509 op_type = fixP->fx_r_type; 1510 if (op_type & 2048) 1511 { 1512 op_type -= 2048; 1513 if (op_type & 1024) 1514 { 1515 op_type -= 1024; 1516 fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L; 1517 left = 1; 1518 } 1519 else if (op_type & 4096) 1520 { 1521 op_type -= 4096; 1522 fixP->fx_r_type = BFD_RELOC_D10V_18; 1523 } 1524 else 1525 fixP->fx_r_type = 1526 get_reloc ((struct d10v_operand *) &d10v_operands[op_type]); 1527 } 1528 1529 /* Fetch the instruction, insert the fully resolved operand 1530 value, and stuff the instruction back again. */ 1531 where = fixP->fx_frag->fr_literal + fixP->fx_where; 1532 insn = bfd_getb32 ((unsigned char *) where); 1533 1534 switch (fixP->fx_r_type) 1535 { 1536 case BFD_RELOC_D10V_10_PCREL_L: 1537 case BFD_RELOC_D10V_10_PCREL_R: 1538 case BFD_RELOC_D10V_18_PCREL: 1539 /* If the fix is relative to a global symbol, not a section 1540 symbol, then ignore the offset. 1541 XXX - Do we have to worry about branches to a symbol + offset ? */ 1542 if (fixP->fx_addsy != NULL 1543 && S_IS_EXTERNAL (fixP->fx_addsy) ) 1544 { 1545 segT fseg = S_GET_SEGMENT (fixP->fx_addsy); 1546 segment_info_type *segf = seg_info(fseg); 1547 1548 if ( segf && segf->sym != fixP->fx_addsy) 1549 value = 0; 1550 } 1551 /* Drop through. */ 1552 case BFD_RELOC_D10V_18: 1553 /* Instruction addresses are always right-shifted by 2. */ 1554 value >>= AT_WORD_RIGHT_SHIFT; 1555 if (fixP->fx_size == 2) 1556 bfd_putb16 ((bfd_vma) value, (unsigned char *) where); 1557 else 1558 { 1559 struct d10v_opcode *rep, *repi; 1560 1561 rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep"); 1562 repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi"); 1563 if ((insn & FM11) == FM11 1564 && ((repi != NULL 1565 && (insn & repi->mask) == (unsigned) repi->opcode) 1566 || (rep != NULL 1567 && (insn & rep->mask) == (unsigned) rep->opcode)) 1568 && value < 4) 1569 as_fatal 1570 (_("line %d: rep or repi must include at least 4 instructions"), 1571 fixP->fx_line); 1572 insn = 1573 d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP); 1574 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1575 } 1576 break; 1577 case BFD_RELOC_32: 1578 bfd_putb32 ((bfd_vma) value, (unsigned char *) where); 1579 break; 1580 case BFD_RELOC_16: 1581 bfd_putb16 ((bfd_vma) value, (unsigned char *) where); 1582 break; 1583 1584 case BFD_RELOC_VTABLE_INHERIT: 1585 case BFD_RELOC_VTABLE_ENTRY: 1586 fixP->fx_done = 0; 1587 return; 1588 1589 default: 1590 as_fatal (_("line %d: unknown relocation type: 0x%x"), 1591 fixP->fx_line, fixP->fx_r_type); 1592 } 1593 } 1594 1595 /* d10v_cleanup() is called after the assembler has finished parsing 1596 the input file, when a label is read from the input file, or when a 1597 stab directive is output. Because the D10V assembler sometimes 1598 saves short instructions to see if it can package them with the 1599 next instruction, there may be a short instruction that still needs 1600 to be written. 1601 1602 NOTE: accesses a global, etype. 1603 NOTE: invoked by various macros such as md_cleanup: see. */ 1604 1605 int 1606 d10v_cleanup (void) 1607 { 1608 segT seg; 1609 subsegT subseg; 1610 1611 /* If cleanup was invoked because the assembler encountered, e.g., a 1612 user label, we write out the pending instruction, if any. If it 1613 was invoked because the assembler is outputting a piece of line 1614 debugging information, though, we write out the pending 1615 instruction only if the --no-gstabs-packing command line switch 1616 has been specified. */ 1617 if (prev_opcode 1618 && etype == PACK_UNSPEC 1619 && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing)) 1620 { 1621 seg = now_seg; 1622 subseg = now_subseg; 1623 1624 if (prev_seg) 1625 subseg_set (prev_seg, prev_subseg); 1626 1627 write_1_short (prev_opcode, prev_insn, fixups->next); 1628 subseg_set (seg, subseg); 1629 prev_opcode = NULL; 1630 } 1631 return 1; 1632 } 1633 1634 void 1635 d10v_frob_label (symbolS *lab) 1636 { 1637 d10v_cleanup (); 1638 symbol_set_frag (lab, frag_now); 1639 S_SET_VALUE (lab, (valueT) frag_now_fix ()); 1640 dwarf2_emit_label (lab); 1641 } 1642 1643 /* Like normal .word, except support @word. 1644 Clobbers input_line_pointer, checks end-of-line. */ 1645 1646 static void 1647 d10v_dot_word (int dummy ATTRIBUTE_UNUSED) 1648 { 1649 expressionS exp; 1650 char *p; 1651 1652 if (is_it_end_of_statement ()) 1653 { 1654 demand_empty_rest_of_line (); 1655 return; 1656 } 1657 1658 do 1659 { 1660 expression (&exp); 1661 if (!strncasecmp (input_line_pointer, "@word", 5)) 1662 { 1663 exp.X_add_number = 0; 1664 input_line_pointer += 5; 1665 1666 p = frag_more (2); 1667 fix_new_exp (frag_now, p - frag_now->fr_literal, 2, 1668 &exp, 0, BFD_RELOC_D10V_18); 1669 } 1670 else 1671 emit_expr (&exp, 2); 1672 } 1673 while (*input_line_pointer++ == ','); 1674 1675 input_line_pointer--; /* Put terminator back into stream. */ 1676 demand_empty_rest_of_line (); 1677 } 1678 1679 /* Mitsubishi asked that we support some old syntax that apparently 1680 had immediate operands starting with '#'. This is in some of their 1681 sample code but is not documented (although it appears in some 1682 examples in their assembler manual). For now, we'll solve this 1683 compatibility problem by simply ignoring any '#' at the beginning 1684 of an operand. */ 1685 1686 /* Operands that begin with '#' should fall through to here. 1687 From expr.c. */ 1688 1689 void 1690 md_operand (expressionS *expressionP) 1691 { 1692 if (*input_line_pointer == '#' && ! do_not_ignore_hash) 1693 { 1694 input_line_pointer++; 1695 expression (expressionP); 1696 } 1697 } 1698 1699 bfd_boolean 1700 d10v_fix_adjustable (fixS *fixP) 1701 { 1702 /* We need the symbol name for the VTABLE entries. */ 1703 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 1704 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 1705 return 0; 1706 1707 return 1; 1708 } 1709 1710 /* The target specific pseudo-ops which we support. */ 1711 const pseudo_typeS md_pseudo_table[] = 1712 { 1713 { "word", d10v_dot_word, 2 }, 1714 { NULL, NULL, 0 } 1715 }; 1716 1717 void 1718 md_assemble (char *str) 1719 { 1720 /* etype is saved extype. For multi-line instructions. */ 1721 packing_type extype = PACK_UNSPEC; /* Parallel, etc. */ 1722 struct d10v_opcode *opcode; 1723 unsigned long insn; 1724 char *str2; 1725 1726 if (etype == PACK_UNSPEC) 1727 { 1728 /* Look for the special multiple instruction separators. */ 1729 str2 = strstr (str, "||"); 1730 if (str2) 1731 extype = PACK_PARALLEL; 1732 else 1733 { 1734 str2 = strstr (str, "->"); 1735 if (str2) 1736 extype = PACK_LEFT_RIGHT; 1737 else 1738 { 1739 str2 = strstr (str, "<-"); 1740 if (str2) 1741 extype = PACK_RIGHT_LEFT; 1742 } 1743 } 1744 1745 /* str2 points to the separator, if there is one. */ 1746 if (str2) 1747 { 1748 *str2 = 0; 1749 1750 /* If two instructions are present and we already have one saved, 1751 then first write out the saved one. */ 1752 d10v_cleanup (); 1753 1754 /* Assemble first instruction and save it. */ 1755 prev_insn = do_assemble (str, &prev_opcode); 1756 prev_seg = now_seg; 1757 prev_subseg = now_subseg; 1758 if (prev_insn == (unsigned long) -1) 1759 as_fatal (_("can't find previous opcode ")); 1760 fixups = fixups->next; 1761 str = str2 + 2; 1762 } 1763 } 1764 1765 insn = do_assemble (str, &opcode); 1766 if (insn == (unsigned long) -1) 1767 { 1768 if (extype != PACK_UNSPEC) 1769 etype = extype; 1770 else 1771 as_bad (_("could not assemble: %s"), str); 1772 return; 1773 } 1774 1775 if (etype != PACK_UNSPEC) 1776 { 1777 extype = etype; 1778 etype = PACK_UNSPEC; 1779 } 1780 1781 /* If this is a long instruction, write it and any previous short 1782 instruction. */ 1783 if (opcode->format & LONG_OPCODE) 1784 { 1785 if (extype != PACK_UNSPEC) 1786 as_fatal (_("Unable to mix instructions as specified")); 1787 d10v_cleanup (); 1788 write_long (insn, fixups); 1789 prev_opcode = NULL; 1790 return; 1791 } 1792 1793 if (prev_opcode 1794 && prev_seg 1795 && ((prev_seg != now_seg) || (prev_subseg != now_subseg))) 1796 d10v_cleanup (); 1797 1798 if (prev_opcode 1799 && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype, 1800 fixups))) 1801 { 1802 /* No instructions saved. */ 1803 prev_opcode = NULL; 1804 } 1805 else 1806 { 1807 if (extype != PACK_UNSPEC) 1808 as_fatal (_("Unable to mix instructions as specified")); 1809 /* Save last instruction so it may be packed on next pass. */ 1810 prev_opcode = opcode; 1811 prev_insn = insn; 1812 prev_seg = now_seg; 1813 prev_subseg = now_subseg; 1814 fixups = fixups->next; 1815 } 1816 } 1817 1818