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