1 /* tc-d30v.c -- Assembler code for the Mitsubishi D30V 2 Copyright 1997, 1998, 1999, 2000, 2001, 2002 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 2, 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, 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21 #include <stdio.h> 22 #include "as.h" 23 #include "safe-ctype.h" 24 #include "subsegs.h" 25 #include "opcode/d30v.h" 26 27 const char comment_chars[] = ";"; 28 const char line_comment_chars[] = "#"; 29 const char line_separator_chars[] = ""; 30 const char *md_shortopts = "OnNcC"; 31 const char EXP_CHARS[] = "eE"; 32 const char FLT_CHARS[] = "dD"; 33 34 #if HAVE_LIMITS_H 35 #include <limits.h> 36 #endif 37 38 #ifndef CHAR_BIT 39 #define CHAR_BIT 8 40 #endif 41 42 #define NOP_MULTIPLY 1 43 #define NOP_ALL 2 44 static int warn_nops = 0; 45 static int Optimizing = 0; 46 static int warn_register_name_conflicts = 1; 47 48 #define FORCE_SHORT 1 49 #define FORCE_LONG 2 50 51 /* EXEC types. */ 52 typedef enum _exec_type 53 { 54 EXEC_UNKNOWN, /* no order specified */ 55 EXEC_PARALLEL, /* done in parallel (FM=00) */ 56 EXEC_SEQ, /* sequential (FM=01) */ 57 EXEC_REVSEQ /* reverse sequential (FM=10) */ 58 } exec_type_enum; 59 60 /* Fixups. */ 61 #define MAX_INSN_FIXUPS (5) 62 struct d30v_fixup 63 { 64 expressionS exp; 65 int operand; 66 int pcrel; 67 int size; 68 bfd_reloc_code_real_type reloc; 69 }; 70 71 typedef struct _fixups 72 { 73 int fc; 74 struct d30v_fixup fix[MAX_INSN_FIXUPS]; 75 struct _fixups *next; 76 } Fixups; 77 78 static Fixups FixUps[2]; 79 static Fixups *fixups; 80 81 /* Whether current and previous instruction are word multiply insns. */ 82 static int cur_mul32_p = 0; 83 static int prev_mul32_p = 0; 84 85 /* The flag_explicitly_parallel is true iff the instruction being assembled 86 has been explicitly written as a parallel short-instruction pair by the 87 human programmer. It is used in parallel_ok () to distinguish between 88 those dangerous parallelizations attempted by the human, which are to be 89 allowed, and those attempted by the assembler, which are not. It is set 90 from md_assemble (). */ 91 static int flag_explicitly_parallel = 0; 92 static int flag_xp_state = 0; 93 94 /* Whether current and previous left sub-instruction disables 95 execution of right sub-instruction. */ 96 static int cur_left_kills_right_p = 0; 97 static int prev_left_kills_right_p = 0; 98 99 /* The known current alignment of the current section. */ 100 static int d30v_current_align; 101 static segT d30v_current_align_seg; 102 103 /* The last seen label in the current section. This is used to auto-align 104 labels preceding instructions. */ 105 static symbolS *d30v_last_label; 106 107 /* Two nops. */ 108 #define NOP_LEFT ((long long) NOP << 32) 109 #define NOP_RIGHT ((long long) NOP) 110 #define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT) 111 112 /* Local functions. */ 113 static int reg_name_search PARAMS ((char *name)); 114 static int register_name PARAMS ((expressionS *expressionP)); 115 static int check_range PARAMS ((unsigned long num, int bits, int flags)); 116 static int postfix PARAMS ((char *p)); 117 static bfd_reloc_code_real_type get_reloc PARAMS ((struct d30v_operand *op, int rel_flag)); 118 static int get_operands PARAMS ((expressionS exp[], int cmp_hack)); 119 static struct d30v_format *find_format PARAMS ((struct d30v_opcode *opcode, 120 expressionS ops[],int fsize, int cmp_hack)); 121 static long long build_insn PARAMS ((struct d30v_insn *opcode, expressionS *opers)); 122 static void write_long PARAMS ((struct d30v_insn *opcode, long long insn, Fixups *fx)); 123 static void write_1_short PARAMS ((struct d30v_insn *opcode, long long insn, 124 Fixups *fx, int use_sequential)); 125 static int write_2_short PARAMS ((struct d30v_insn *opcode1, long long insn1, 126 struct d30v_insn *opcode2, long long insn2, exec_type_enum exec_type, Fixups *fx)); 127 static long long do_assemble PARAMS ((char *str, struct d30v_insn *opcode, 128 int shortp, int is_parallel)); 129 static int parallel_ok PARAMS ((struct d30v_insn *opcode1, unsigned long insn1, 130 struct d30v_insn *opcode2, unsigned long insn2, 131 exec_type_enum exec_type)); 132 static void d30v_number_to_chars PARAMS ((char *buf, long long value, int nbytes)); 133 static void check_size PARAMS ((long value, int bits, char *file, int line)); 134 static void d30v_align PARAMS ((int, char *, symbolS *)); 135 static void s_d30v_align PARAMS ((int)); 136 static void s_d30v_text PARAMS ((int)); 137 static void s_d30v_data PARAMS ((int)); 138 static void s_d30v_section PARAMS ((int)); 139 140 struct option md_longopts[] = 141 { 142 {NULL, no_argument, NULL, 0} 143 }; 144 145 size_t md_longopts_size = sizeof (md_longopts); 146 147 /* The target specific pseudo-ops which we support. */ 148 const pseudo_typeS md_pseudo_table[] = 149 { 150 { "word", cons, 4 }, 151 { "hword", cons, 2 }, 152 { "align", s_d30v_align, 0 }, 153 { "text", s_d30v_text, 0 }, 154 { "data", s_d30v_data, 0 }, 155 { "section", s_d30v_section, 0 }, 156 { "section.s", s_d30v_section, 0 }, 157 { "sect", s_d30v_section, 0 }, 158 { "sect.s", s_d30v_section, 0 }, 159 { NULL, NULL, 0 } 160 }; 161 162 /* Opcode hash table. */ 163 static struct hash_control *d30v_hash; 164 165 /* Do a binary search of the pre_defined_registers array to see if 166 NAME is a valid regiter name. Return the register number from the 167 array on success, or -1 on failure. */ 168 169 static int 170 reg_name_search (name) 171 char *name; 172 { 173 int middle, low, high; 174 int cmp; 175 176 low = 0; 177 high = reg_name_cnt () - 1; 178 179 do 180 { 181 middle = (low + high) / 2; 182 cmp = strcasecmp (name, pre_defined_registers[middle].name); 183 if (cmp < 0) 184 high = middle - 1; 185 else if (cmp > 0) 186 low = middle + 1; 187 else 188 { 189 if (symbol_find (name) != NULL) 190 { 191 if (warn_register_name_conflicts) 192 as_warn (_("Register name %s conflicts with symbol of the same name"), 193 name); 194 } 195 196 return pre_defined_registers[middle].value; 197 } 198 } 199 while (low <= high); 200 201 return -1; 202 } 203 204 /* Check the string at input_line_pointer to see if it is a valid 205 register name. */ 206 207 static int 208 register_name (expressionP) 209 expressionS *expressionP; 210 { 211 int reg_number; 212 char c, *p = input_line_pointer; 213 214 while (*p && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')') 215 p++; 216 217 c = *p; 218 if (c) 219 *p++ = 0; 220 221 /* Look to see if it's in the register table. */ 222 reg_number = reg_name_search (input_line_pointer); 223 if (reg_number >= 0) 224 { 225 expressionP->X_op = O_register; 226 /* Temporarily store a pointer to the string here. */ 227 expressionP->X_op_symbol = (symbolS *) input_line_pointer; 228 expressionP->X_add_number = reg_number; 229 input_line_pointer = p; 230 return 1; 231 } 232 if (c) 233 *(p - 1) = c; 234 return 0; 235 } 236 237 static int 238 check_range (num, bits, flags) 239 unsigned long num; 240 int bits; 241 int flags; 242 { 243 long min, max; 244 245 /* Don't bother checking 32-bit values. */ 246 if (bits == 32) 247 { 248 if (sizeof (unsigned long) * CHAR_BIT == 32) 249 return 0; 250 251 /* We don't record signed or unsigned for 32-bit quantities. 252 Allow either. */ 253 min = -((unsigned long) 1 << (bits - 1)); 254 max = ((unsigned long) 1 << bits) - 1; 255 return (long) num < min || (long) num > max; 256 } 257 258 if (flags & OPERAND_SHIFT) 259 { 260 /* We know that all shifts are right by three bits. */ 261 num >>= 3; 262 263 if (flags & OPERAND_SIGNED) 264 { 265 unsigned long sign_bit = ((unsigned long) -1L >> 4) + 1; 266 num = (num ^ sign_bit) - sign_bit; 267 } 268 } 269 270 if (flags & OPERAND_SIGNED) 271 { 272 max = ((unsigned long) 1 << (bits - 1)) - 1; 273 min = - ((unsigned long) 1 << (bits - 1)); 274 return (long) num > max || (long) num < min; 275 } 276 else 277 { 278 max = ((unsigned long) 1 << bits) - 1; 279 return num > (unsigned long) max; 280 } 281 } 282 283 void 284 md_show_usage (stream) 285 FILE *stream; 286 { 287 fprintf (stream, _("\nD30V options:\n\ 288 -O Make adjacent short instructions parallel if possible.\n\ 289 -n Warn about all NOPs inserted by the assembler.\n\ 290 -N Warn about NOPs inserted after word multiplies.\n\ 291 -c Warn about symbols whoes names match register names.\n\ 292 -C Opposite of -C. -c is the default.\n")); 293 } 294 295 int 296 md_parse_option (c, arg) 297 int c; 298 char *arg ATTRIBUTE_UNUSED; 299 { 300 switch (c) 301 { 302 /* Optimize. Will attempt to parallelize operations. */ 303 case 'O': 304 Optimizing = 1; 305 break; 306 307 /* Warn about all NOPS that the assembler inserts. */ 308 case 'n': 309 warn_nops = NOP_ALL; 310 break; 311 312 /* Warn about the NOPS that the assembler inserts because of the 313 multiply hazard. */ 314 case 'N': 315 warn_nops = NOP_MULTIPLY; 316 break; 317 318 case 'c': 319 warn_register_name_conflicts = 1; 320 break; 321 322 case 'C': 323 warn_register_name_conflicts = 0; 324 break; 325 326 default: 327 return 0; 328 } 329 return 1; 330 } 331 332 symbolS * 333 md_undefined_symbol (name) 334 char *name ATTRIBUTE_UNUSED; 335 { 336 return 0; 337 } 338 339 /* Turn a string in input_line_pointer into a floating point constant 340 of type TYPE, and store the appropriate bytes in *LITP. The number 341 of LITTLENUMS emitted is stored in *SIZEP. An error message is 342 returned, or NULL on OK. */ 343 344 char * 345 md_atof (type, litP, sizeP) 346 int type; 347 char *litP; 348 int *sizeP; 349 { 350 int prec; 351 LITTLENUM_TYPE words[4]; 352 char *t; 353 int i; 354 355 switch (type) 356 { 357 case 'f': 358 prec = 2; 359 break; 360 case 'd': 361 prec = 4; 362 break; 363 default: 364 *sizeP = 0; 365 return _("bad call to md_atof"); 366 } 367 368 t = atof_ieee (input_line_pointer, type, words); 369 if (t) 370 input_line_pointer = t; 371 372 *sizeP = prec * 2; 373 374 for (i = 0; i < prec; i++) 375 { 376 md_number_to_chars (litP, (valueT) words[i], 2); 377 litP += 2; 378 } 379 return NULL; 380 } 381 382 void 383 md_convert_frag (abfd, sec, fragP) 384 bfd *abfd ATTRIBUTE_UNUSED; 385 asection *sec ATTRIBUTE_UNUSED; 386 fragS *fragP ATTRIBUTE_UNUSED; 387 { 388 abort (); 389 } 390 391 valueT 392 md_section_align (seg, addr) 393 asection *seg; 394 valueT addr; 395 { 396 int align = bfd_get_section_alignment (stdoutput, seg); 397 return ((addr + (1 << align) - 1) & (-1 << align)); 398 } 399 400 void 401 md_begin () 402 { 403 struct d30v_opcode *opcode; 404 d30v_hash = hash_new (); 405 406 /* Insert opcode names into a hash table. */ 407 for (opcode = (struct d30v_opcode *) d30v_opcode_table; opcode->name; opcode++) 408 hash_insert (d30v_hash, opcode->name, (char *) opcode); 409 410 fixups = &FixUps[0]; 411 FixUps[0].next = &FixUps[1]; 412 FixUps[1].next = &FixUps[0]; 413 414 d30v_current_align_seg = now_seg; 415 } 416 417 /* Remove the postincrement or postdecrement operator ( '+' or '-' ) 418 from an expression. */ 419 420 static int 421 postfix (p) 422 char *p; 423 { 424 while (*p != '-' && *p != '+') 425 { 426 if (*p == 0 || *p == '\n' || *p == '\r' || *p == ' ' || *p == ',') 427 break; 428 p++; 429 } 430 431 if (*p == '-') 432 { 433 *p = ' '; 434 return -1; 435 } 436 437 if (*p == '+') 438 { 439 *p = ' '; 440 return 1; 441 } 442 443 return 0; 444 } 445 446 static bfd_reloc_code_real_type 447 get_reloc (op, rel_flag) 448 struct d30v_operand *op; 449 int rel_flag; 450 { 451 switch (op->bits) 452 { 453 case 6: 454 if (op->flags & OPERAND_SHIFT) 455 return BFD_RELOC_D30V_9_PCREL; 456 else 457 return BFD_RELOC_D30V_6; 458 break; 459 case 12: 460 if (!(op->flags & OPERAND_SHIFT)) 461 as_warn (_("unexpected 12-bit reloc type")); 462 if (rel_flag == RELOC_PCREL) 463 return BFD_RELOC_D30V_15_PCREL; 464 else 465 return BFD_RELOC_D30V_15; 466 case 18: 467 if (!(op->flags & OPERAND_SHIFT)) 468 as_warn (_("unexpected 18-bit reloc type")); 469 if (rel_flag == RELOC_PCREL) 470 return BFD_RELOC_D30V_21_PCREL; 471 else 472 return BFD_RELOC_D30V_21; 473 case 32: 474 if (rel_flag == RELOC_PCREL) 475 return BFD_RELOC_D30V_32_PCREL; 476 else 477 return BFD_RELOC_D30V_32; 478 default: 479 return 0; 480 } 481 } 482 483 /* Parse a string of operands and return an array of expressions. */ 484 485 static int 486 get_operands (exp, cmp_hack) 487 expressionS exp[]; 488 int cmp_hack; 489 { 490 char *p = input_line_pointer; 491 int numops = 0; 492 int post = 0; 493 494 if (cmp_hack) 495 { 496 exp[numops].X_op = O_absent; 497 exp[numops++].X_add_number = cmp_hack - 1; 498 } 499 500 while (*p) 501 { 502 while (*p == ' ' || *p == '\t' || *p == ',') 503 p++; 504 505 if (*p == 0 || *p == '\n' || *p == '\r') 506 break; 507 508 if (*p == '@') 509 { 510 p++; 511 exp[numops].X_op = O_absent; 512 if (*p == '(') 513 { 514 p++; 515 exp[numops].X_add_number = OPERAND_ATPAR; 516 post = postfix (p); 517 } 518 else if (*p == '-') 519 { 520 p++; 521 exp[numops].X_add_number = OPERAND_ATMINUS; 522 } 523 else 524 { 525 exp[numops].X_add_number = OPERAND_ATSIGN; 526 post = postfix (p); 527 } 528 numops++; 529 continue; 530 } 531 532 if (*p == ')') 533 { 534 /* Just skip the trailing paren. */ 535 p++; 536 continue; 537 } 538 539 input_line_pointer = p; 540 541 /* Check to see if it might be a register name. */ 542 if (!register_name (&exp[numops])) 543 { 544 /* Parse as an expression. */ 545 expression (&exp[numops]); 546 } 547 548 if (exp[numops].X_op == O_illegal) 549 as_bad (_("illegal operand")); 550 else if (exp[numops].X_op == O_absent) 551 as_bad (_("missing operand")); 552 553 numops++; 554 p = input_line_pointer; 555 556 switch (post) 557 { 558 case -1: 559 /* Postdecrement mode. */ 560 exp[numops].X_op = O_absent; 561 exp[numops++].X_add_number = OPERAND_MINUS; 562 break; 563 case 1: 564 /* Postincrement mode. */ 565 exp[numops].X_op = O_absent; 566 exp[numops++].X_add_number = OPERAND_PLUS; 567 break; 568 } 569 post = 0; 570 } 571 572 exp[numops].X_op = 0; 573 574 return numops; 575 } 576 577 /* Generate the instruction. 578 It does everything but write the FM bits. */ 579 580 static long long 581 build_insn (opcode, opers) 582 struct d30v_insn *opcode; 583 expressionS *opers; 584 { 585 int i, length, bits, shift, flags; 586 unsigned long number, id = 0; 587 long long insn; 588 struct d30v_opcode *op = opcode->op; 589 struct d30v_format *form = opcode->form; 590 591 insn = 592 opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18; 593 594 for (i = 0; form->operands[i]; i++) 595 { 596 flags = d30v_operand_table[form->operands[i]].flags; 597 598 /* Must be a register or number. */ 599 if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM) 600 && !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL)) 601 continue; 602 603 bits = d30v_operand_table[form->operands[i]].bits; 604 if (flags & OPERAND_SHIFT) 605 bits += 3; 606 607 length = d30v_operand_table[form->operands[i]].length; 608 shift = 12 - d30v_operand_table[form->operands[i]].position; 609 if (opers[i].X_op != O_symbol) 610 number = opers[i].X_add_number; 611 else 612 number = 0; 613 if (flags & OPERAND_REG) 614 { 615 /* Check for mvfsys or mvtsys control registers. */ 616 if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG) 617 { 618 /* PSWL or PSWH. */ 619 id = (number & 0x7f) - MAX_CONTROL_REG; 620 number = 0; 621 } 622 else if (number & OPERAND_FLAG) 623 { 624 /* NUMBER is a flag register. */ 625 id = 3; 626 } 627 number &= 0x7F; 628 } 629 else if (flags & OPERAND_SPECIAL) 630 { 631 number = id; 632 } 633 634 if (opers[i].X_op != O_register && opers[i].X_op != O_constant 635 && !(flags & OPERAND_NAME)) 636 { 637 /* Now create a fixup. */ 638 if (fixups->fc >= MAX_INSN_FIXUPS) 639 as_fatal (_("too many fixups")); 640 641 fixups->fix[fixups->fc].reloc = 642 get_reloc ((struct d30v_operand *) &d30v_operand_table[form->operands[i]], op->reloc_flag); 643 fixups->fix[fixups->fc].size = 4; 644 fixups->fix[fixups->fc].exp = opers[i]; 645 fixups->fix[fixups->fc].operand = form->operands[i]; 646 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL) 647 fixups->fix[fixups->fc].pcrel = RELOC_PCREL; 648 else 649 fixups->fix[fixups->fc].pcrel = op->reloc_flag; 650 (fixups->fc)++; 651 } 652 653 /* Truncate to the proper number of bits. */ 654 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags)) 655 as_bad (_("operand out of range: %ld"), number); 656 if (bits < 31) 657 number &= 0x7FFFFFFF >> (31 - bits); 658 if (flags & OPERAND_SHIFT) 659 number >>= 3; 660 if (bits == 32) 661 { 662 /* It's a LONG instruction. */ 663 insn |= ((number & 0xffffffff) >> 26); /* top 6 bits */ 664 insn <<= 32; /* shift the first word over */ 665 insn |= ((number & 0x03FC0000) << 2); /* next 8 bits */ 666 insn |= number & 0x0003FFFF; /* bottom 18 bits */ 667 } 668 else 669 insn |= number << shift; 670 } 671 672 return insn; 673 } 674 675 /* Write out a long form instruction. */ 676 677 static void 678 write_long (opcode, insn, fx) 679 struct d30v_insn *opcode ATTRIBUTE_UNUSED; 680 long long insn; 681 Fixups *fx; 682 { 683 int i, where; 684 char *f = frag_more (8); 685 686 insn |= FM11; 687 d30v_number_to_chars (f, insn, 8); 688 689 for (i = 0; i < fx->fc; i++) 690 { 691 if (fx->fix[i].reloc) 692 { 693 where = f - frag_now->fr_literal; 694 fix_new_exp (frag_now, 695 where, 696 fx->fix[i].size, 697 &(fx->fix[i].exp), 698 fx->fix[i].pcrel, 699 fx->fix[i].reloc); 700 } 701 } 702 703 fx->fc = 0; 704 } 705 706 /* Write out a short form instruction by itself. */ 707 708 static void 709 write_1_short (opcode, insn, fx, use_sequential) 710 struct d30v_insn *opcode; 711 long long insn; 712 Fixups *fx; 713 int use_sequential; 714 { 715 char *f = frag_more (8); 716 int i, where; 717 718 if (warn_nops == NOP_ALL) 719 as_warn (_("%s NOP inserted"), use_sequential ? 720 _("sequential") : _("parallel")); 721 722 /* The other container needs to be NOP. */ 723 if (use_sequential) 724 { 725 /* Use a sequential NOP rather than a parallel one, 726 as the current instruction is a FLAG_MUL32 type one 727 and the next instruction is a load. */ 728 729 /* According to 4.3.1: for FM=01, sub-instructions performed 730 only by IU cannot be encoded in L-container. */ 731 732 if (opcode->op->unit == IU) 733 /* Right then left. */ 734 insn |= FM10 | NOP_LEFT; 735 else 736 /* Left then right. */ 737 insn = FM01 | (insn << 32) | NOP_RIGHT; 738 } 739 else 740 { 741 /* According to 4.3.1: for FM=00, sub-instructions performed 742 only by IU cannot be encoded in L-container. */ 743 744 if (opcode->op->unit == IU) 745 /* Right container. */ 746 insn |= FM00 | NOP_LEFT; 747 else 748 /* Left container. */ 749 insn = FM00 | (insn << 32) | NOP_RIGHT; 750 } 751 752 d30v_number_to_chars (f, insn, 8); 753 754 for (i = 0; i < fx->fc; i++) 755 { 756 if (fx->fix[i].reloc) 757 { 758 where = f - frag_now->fr_literal; 759 fix_new_exp (frag_now, 760 where, 761 fx->fix[i].size, 762 &(fx->fix[i].exp), 763 fx->fix[i].pcrel, 764 fx->fix[i].reloc); 765 } 766 } 767 768 fx->fc = 0; 769 } 770 771 /* Write out a short form instruction if possible. 772 Return number of instructions not written out. */ 773 774 static int 775 write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx) 776 struct d30v_insn *opcode1, *opcode2; 777 long long insn1, insn2; 778 exec_type_enum exec_type; 779 Fixups *fx; 780 { 781 long long insn = NOP2; 782 char *f; 783 int i, j, where; 784 785 if (exec_type == EXEC_SEQ 786 && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)) 787 && ((opcode1->op->flags_used & FLAG_DELAY) == 0) 788 && ((opcode1->ecc == ECC_AL) || ! Optimizing)) 789 { 790 /* Unconditional, non-delayed branches kill instructions in 791 the right bin. Conditional branches don't always but if 792 we are not optimizing, then we have been asked to produce 793 an error about such constructs. For the purposes of this 794 test, subroutine calls are considered to be branches. */ 795 write_1_short (opcode1, insn1, fx->next, FALSE); 796 return 1; 797 } 798 799 /* Note: we do not have to worry about subroutine calls occurring 800 in the right hand container. The return address is always 801 aligned to the next 64 bit boundary, be that 64 or 32 bit away. */ 802 switch (exec_type) 803 { 804 case EXEC_UNKNOWN: /* Order not specified. */ 805 if (Optimizing 806 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type) 807 && ! ( (opcode1->op->unit == EITHER_BUT_PREFER_MU 808 || opcode1->op->unit == MU) 809 && 810 ( opcode2->op->unit == EITHER_BUT_PREFER_MU 811 || opcode2->op->unit == MU))) 812 { 813 /* Parallel. */ 814 exec_type = EXEC_PARALLEL; 815 816 if (opcode1->op->unit == IU 817 || opcode2->op->unit == MU 818 || opcode2->op->unit == EITHER_BUT_PREFER_MU) 819 insn = FM00 | (insn2 << 32) | insn1; 820 else 821 { 822 insn = FM00 | (insn1 << 32) | insn2; 823 fx = fx->next; 824 } 825 } 826 else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR) 827 && ((opcode1->op->flags_used & FLAG_DELAY) == 0)) 828 || opcode1->op->flags_used & FLAG_RP) 829 { 830 /* We must emit (non-delayed) branch type instructions 831 on their own with nothing in the right container. */ 832 /* We must treat repeat instructions likewise, since the 833 following instruction has to be separate from the repeat 834 in order to be repeated. */ 835 write_1_short (opcode1, insn1, fx->next, FALSE); 836 return 1; 837 } 838 else if (prev_left_kills_right_p) 839 { 840 /* The left instruction kils the right slot, so we 841 must leave it empty. */ 842 write_1_short (opcode1, insn1, fx->next, FALSE); 843 return 1; 844 } 845 else if (opcode1->op->unit == IU) 846 { 847 if (opcode2->op->unit == EITHER_BUT_PREFER_MU) 848 { 849 /* Case 103810 is a request from Mitsubishi that opcodes 850 with EITHER_BUT_PREFER_MU should not be executed in 851 reverse sequential order. */ 852 write_1_short (opcode1, insn1, fx->next, FALSE); 853 return 1; 854 } 855 856 /* Reverse sequential. */ 857 insn = FM10 | (insn2 << 32) | insn1; 858 exec_type = EXEC_REVSEQ; 859 } 860 else 861 { 862 /* Sequential. */ 863 insn = FM01 | (insn1 << 32) | insn2; 864 fx = fx->next; 865 exec_type = EXEC_SEQ; 866 } 867 break; 868 869 case EXEC_PARALLEL: /* Parallel. */ 870 flag_explicitly_parallel = flag_xp_state; 871 if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)) 872 as_bad (_("Instructions may not be executed in parallel")); 873 else if (opcode1->op->unit == IU) 874 { 875 if (opcode2->op->unit == IU) 876 as_bad (_("Two IU instructions may not be executed in parallel")); 877 as_warn (_("Swapping instruction order")); 878 insn = FM00 | (insn2 << 32) | insn1; 879 } 880 else if (opcode2->op->unit == MU) 881 { 882 if (opcode1->op->unit == MU) 883 as_bad (_("Two MU instructions may not be executed in parallel")); 884 else if (opcode1->op->unit == EITHER_BUT_PREFER_MU) 885 as_warn (_("Executing %s in IU may not work"), opcode1->op->name); 886 as_warn (_("Swapping instruction order")); 887 insn = FM00 | (insn2 << 32) | insn1; 888 } 889 else 890 { 891 if (opcode2->op->unit == EITHER_BUT_PREFER_MU) 892 as_warn (_("Executing %s in IU may not work in parallel execution"), 893 opcode2->op->name); 894 895 insn = FM00 | (insn1 << 32) | insn2; 896 fx = fx->next; 897 } 898 flag_explicitly_parallel = 0; 899 break; 900 901 case EXEC_SEQ: /* Sequential. */ 902 if (opcode1->op->unit == IU) 903 as_bad (_("IU instruction may not be in the left container")); 904 if (prev_left_kills_right_p) 905 as_bad (_("special left instruction `%s' kills instruction " 906 "`%s' in right container"), 907 opcode1->op->name, opcode2->op->name); 908 insn = FM01 | (insn1 << 32) | insn2; 909 fx = fx->next; 910 break; 911 912 case EXEC_REVSEQ: /* Reverse sequential. */ 913 if (opcode2->op->unit == MU) 914 as_bad (_("MU instruction may not be in the right container")); 915 if (opcode1->op->unit == EITHER_BUT_PREFER_MU) 916 as_warn (_("Executing %s in reverse serial with %s may not work"), 917 opcode1->op->name, opcode2->op->name); 918 else if (opcode2->op->unit == EITHER_BUT_PREFER_MU) 919 as_warn (_("Executing %s in IU in reverse serial may not work"), 920 opcode2->op->name); 921 insn = FM10 | (insn1 << 32) | insn2; 922 fx = fx->next; 923 break; 924 925 default: 926 as_fatal (_("unknown execution type passed to write_2_short()")); 927 } 928 929 #if 0 930 printf ("writing out %llx\n", insn); 931 #endif 932 f = frag_more (8); 933 d30v_number_to_chars (f, insn, 8); 934 935 /* If the previous instruction was a 32-bit multiply but it is put into a 936 parallel container, mark the current instruction as being a 32-bit 937 multiply. */ 938 if (prev_mul32_p && exec_type == EXEC_PARALLEL) 939 cur_mul32_p = 1; 940 941 for (j = 0; j < 2; j++) 942 { 943 for (i = 0; i < fx->fc; i++) 944 { 945 if (fx->fix[i].reloc) 946 { 947 where = (f - frag_now->fr_literal) + 4 * j; 948 949 fix_new_exp (frag_now, 950 where, 951 fx->fix[i].size, 952 &(fx->fix[i].exp), 953 fx->fix[i].pcrel, 954 fx->fix[i].reloc); 955 } 956 } 957 958 fx->fc = 0; 959 fx = fx->next; 960 } 961 962 return 0; 963 } 964 965 /* Check 2 instructions and determine if they can be safely 966 executed in parallel. Return 1 if they can be. */ 967 968 static int 969 parallel_ok (op1, insn1, op2, insn2, exec_type) 970 struct d30v_insn *op1, *op2; 971 unsigned long insn1, insn2; 972 exec_type_enum exec_type; 973 { 974 int i, j, shift, regno, bits, ecc; 975 unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2; 976 unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2]; 977 struct d30v_format *f; 978 struct d30v_opcode *op; 979 980 /* Section 4.3: Both instructions must not be IU or MU only. */ 981 if ((op1->op->unit == IU && op2->op->unit == IU) 982 || (op1->op->unit == MU && op2->op->unit == MU)) 983 return 0; 984 985 /* First instruction must not be a jump to safely optimize, unless this 986 is an explicit parallel operation. */ 987 if (exec_type != EXEC_PARALLEL 988 && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR))) 989 return 0; 990 991 /* If one instruction is /TX or /XT and the other is /FX or /XF respectively, 992 then it is safe to allow the two to be done as parallel ops, since only 993 one will ever be executed at a time. */ 994 if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX) 995 || (op1->ecc == ECC_FX && op2->ecc == ECC_TX) 996 || (op1->ecc == ECC_XT && op2->ecc == ECC_XF) 997 || (op1->ecc == ECC_XF && op2->ecc == ECC_XT)) 998 return 1; 999 1000 /* [0] r0-r31 1001 [1] r32-r63 1002 [2] a0, a1, flag registers. */ 1003 for (j = 0; j < 2; j++) 1004 { 1005 if (j == 0) 1006 { 1007 f = op1->form; 1008 op = op1->op; 1009 ecc = op1->ecc; 1010 ins = insn1; 1011 } 1012 else 1013 { 1014 f = op2->form; 1015 op = op2->op; 1016 ecc = op2->ecc; 1017 ins = insn2; 1018 } 1019 1020 flag_reg[j] = 0; 1021 mod_reg[j][0] = mod_reg[j][1] = 0; 1022 used_reg[j][0] = used_reg[j][1] = 0; 1023 1024 if (flag_explicitly_parallel) 1025 { 1026 /* For human specified parallel instructions we have been asked 1027 to ignore the possibility that both instructions could modify 1028 bits in the PSW, so we initialise the mod & used arrays to 0. 1029 We have been asked, however, to refuse to allow parallel 1030 instructions which explicitly set the same flag register, 1031 eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test 1032 for the use of a flag register and set a bit in the mod or used 1033 array appropriately. */ 1034 mod_reg[j][2] = 0; 1035 used_reg[j][2] = 0; 1036 } 1037 else 1038 { 1039 mod_reg[j][2] = (op->flags_set & FLAG_ALL); 1040 used_reg[j][2] = (op->flags_used & FLAG_ALL); 1041 } 1042 1043 /* BSR/JSR always sets R62. */ 1044 if (op->flags_used & FLAG_JSR) 1045 mod_reg[j][1] = (1L << (62 - 32)); 1046 1047 /* Conditional execution affects the flags_used. */ 1048 switch (ecc) 1049 { 1050 case ECC_TX: 1051 case ECC_FX: 1052 used_reg[j][2] |= flag_reg[j] = FLAG_0; 1053 break; 1054 1055 case ECC_XT: 1056 case ECC_XF: 1057 used_reg[j][2] |= flag_reg[j] = FLAG_1; 1058 break; 1059 1060 case ECC_TT: 1061 case ECC_TF: 1062 used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1); 1063 break; 1064 } 1065 1066 for (i = 0; f->operands[i]; i++) 1067 { 1068 flags = d30v_operand_table[f->operands[i]].flags; 1069 shift = 12 - d30v_operand_table[f->operands[i]].position; 1070 bits = d30v_operand_table[f->operands[i]].bits; 1071 if (bits == 32) 1072 mask = 0xffffffff; 1073 else 1074 mask = 0x7FFFFFFF >> (31 - bits); 1075 1076 if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS)) 1077 { 1078 /* This is a post-increment or post-decrement. 1079 The previous register needs to be marked as modified. */ 1080 shift = 12 - d30v_operand_table[f->operands[i - 1]].position; 1081 regno = (ins >> shift) & 0x3f; 1082 if (regno >= 32) 1083 mod_reg[j][1] |= 1L << (regno - 32); 1084 else 1085 mod_reg[j][0] |= 1L << regno; 1086 } 1087 else if (flags & OPERAND_REG) 1088 { 1089 regno = (ins >> shift) & mask; 1090 /* The memory write functions don't have a destination 1091 register. */ 1092 if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM)) 1093 { 1094 /* MODIFIED registers and flags. */ 1095 if (flags & OPERAND_ACC) 1096 { 1097 if (regno == 0) 1098 mod_reg[j][2] |= FLAG_A0; 1099 else if (regno == 1) 1100 mod_reg[j][2] |= FLAG_A1; 1101 else 1102 abort (); 1103 } 1104 else if (flags & OPERAND_FLAG) 1105 mod_reg[j][2] |= 1L << regno; 1106 else if (!(flags & OPERAND_CONTROL)) 1107 { 1108 int r, z; 1109 1110 /* Need to check if there are two destination 1111 registers, for example ld2w. */ 1112 if (flags & OPERAND_2REG) 1113 z = 1; 1114 else 1115 z = 0; 1116 1117 for (r = regno; r <= regno + z; r++) 1118 { 1119 if (r >= 32) 1120 mod_reg[j][1] |= 1L << (r - 32); 1121 else 1122 mod_reg[j][0] |= 1L << r; 1123 } 1124 } 1125 } 1126 else 1127 { 1128 /* USED, but not modified registers and flags. */ 1129 if (flags & OPERAND_ACC) 1130 { 1131 if (regno == 0) 1132 used_reg[j][2] |= FLAG_A0; 1133 else if (regno == 1) 1134 used_reg[j][2] |= FLAG_A1; 1135 else 1136 abort (); 1137 } 1138 else if (flags & OPERAND_FLAG) 1139 used_reg[j][2] |= 1L << regno; 1140 else if (!(flags & OPERAND_CONTROL)) 1141 { 1142 int r, z; 1143 1144 /* Need to check if there are two source 1145 registers, for example st2w. */ 1146 if (flags & OPERAND_2REG) 1147 z = 1; 1148 else 1149 z = 0; 1150 1151 for (r = regno; r <= regno + z; r++) 1152 { 1153 if (r >= 32) 1154 used_reg[j][1] |= 1L << (r - 32); 1155 else 1156 used_reg[j][0] |= 1L << r; 1157 } 1158 } 1159 } 1160 } 1161 } 1162 } 1163 1164 flags_set1 = op1->op->flags_set; 1165 flags_set2 = op2->op->flags_set; 1166 flags_used1 = op1->op->flags_used; 1167 flags_used2 = op2->op->flags_used; 1168 1169 /* Check for illegal combinations with ADDppp/SUBppp. */ 1170 if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0 1171 && (flags_used2 & FLAG_ADDSUBppp) != 0) 1172 || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0 1173 && (flags_used1 & FLAG_ADDSUBppp) != 0)) 1174 return 0; 1175 1176 /* Load instruction combined with half-word multiply is illegal. */ 1177 if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16)) 1178 || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16))) 1179 return 0; 1180 1181 /* Specifically allow add || add by removing carry, overflow bits dependency. 1182 This is safe, even if an addc follows since the IU takes the argument in 1183 the right container, and it writes its results last. 1184 However, don't paralellize add followed by addc or sub followed by 1185 subb. */ 1186 if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA 1187 && (used_reg[0][2] & ~flag_reg[0]) == 0 1188 && (used_reg[1][2] & ~flag_reg[1]) == 0 1189 && op1->op->unit == EITHER && op2->op->unit == EITHER) 1190 { 1191 mod_reg[0][2] = mod_reg[1][2] = 0; 1192 } 1193 1194 for (j = 0; j < 3; j++) 1195 { 1196 /* If the second instruction depends on the first, we obviously 1197 cannot parallelize. Note, the mod flag implies use, so 1198 check that as well. */ 1199 /* If flag_explicitly_parallel is set, then the case of the 1200 second instruction using a register the first instruction 1201 modifies is assumed to be okay; we trust the human. We 1202 don't trust the human if both instructions modify the same 1203 register but we do trust the human if they modify the same 1204 flags. */ 1205 /* We have now been requested not to trust the human if the 1206 instructions modify the same flag registers either. */ 1207 if (flag_explicitly_parallel) 1208 { 1209 if ((mod_reg[0][j] & mod_reg[1][j]) != 0) 1210 return 0; 1211 } 1212 else 1213 if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0) 1214 return 0; 1215 } 1216 1217 return 1; 1218 } 1219 1220 /* This is the main entry point for the machine-dependent assembler. 1221 STR points to a machine-dependent instruction. This function is 1222 supposed to emit the frags/bytes it assembles to. For the D30V, it 1223 mostly handles the special VLIW parsing and packing and leaves the 1224 difficult stuff to do_assemble (). */ 1225 1226 static long long prev_insn = -1; 1227 static struct d30v_insn prev_opcode; 1228 static subsegT prev_subseg; 1229 static segT prev_seg = 0; 1230 1231 void 1232 md_assemble (str) 1233 char *str; 1234 { 1235 struct d30v_insn opcode; 1236 long long insn; 1237 /* Execution type; parallel, etc. */ 1238 exec_type_enum extype = EXEC_UNKNOWN; 1239 /* Saved extype. Used for multiline instructions. */ 1240 static exec_type_enum etype = EXEC_UNKNOWN; 1241 char *str2; 1242 1243 if ((prev_insn != -1) && prev_seg 1244 && ((prev_seg != now_seg) || (prev_subseg != now_subseg))) 1245 d30v_cleanup (FALSE); 1246 1247 if (d30v_current_align < 3) 1248 d30v_align (3, NULL, d30v_last_label); 1249 else if (d30v_current_align > 3) 1250 d30v_current_align = 3; 1251 d30v_last_label = NULL; 1252 1253 flag_explicitly_parallel = 0; 1254 flag_xp_state = 0; 1255 if (etype == EXEC_UNKNOWN) 1256 { 1257 /* Look for the special multiple instruction separators. */ 1258 str2 = strstr (str, "||"); 1259 if (str2) 1260 { 1261 extype = EXEC_PARALLEL; 1262 flag_xp_state = 1; 1263 } 1264 else 1265 { 1266 str2 = strstr (str, "->"); 1267 if (str2) 1268 extype = EXEC_SEQ; 1269 else 1270 { 1271 str2 = strstr (str, "<-"); 1272 if (str2) 1273 extype = EXEC_REVSEQ; 1274 } 1275 } 1276 1277 /* STR2 points to the separator, if one. */ 1278 if (str2) 1279 { 1280 *str2 = 0; 1281 1282 /* If two instructions are present and we already have one saved, 1283 then first write it out. */ 1284 d30v_cleanup (FALSE); 1285 1286 /* Assemble first instruction and save it. */ 1287 prev_insn = do_assemble (str, &prev_opcode, 1, 0); 1288 if (prev_insn == -1) 1289 as_bad (_("Cannot assemble instruction")); 1290 if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG) 1291 as_bad (_("First opcode is long. Unable to mix instructions as specified.")); 1292 fixups = fixups->next; 1293 str = str2 + 2; 1294 prev_seg = now_seg; 1295 prev_subseg = now_subseg; 1296 } 1297 } 1298 1299 insn = do_assemble (str, &opcode, 1300 (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN), 1301 extype == EXEC_PARALLEL); 1302 if (insn == -1) 1303 { 1304 if (extype != EXEC_UNKNOWN) 1305 etype = extype; 1306 as_bad (_("Cannot assemble instruction")); 1307 return; 1308 } 1309 1310 if (etype != EXEC_UNKNOWN) 1311 { 1312 extype = etype; 1313 etype = EXEC_UNKNOWN; 1314 } 1315 1316 /* Word multiply instructions must not be followed by either a load or a 1317 16-bit multiply instruction in the next cycle. */ 1318 if ( (extype != EXEC_REVSEQ) 1319 && prev_mul32_p 1320 && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16))) 1321 { 1322 /* However, load and multiply should able to be combined in a parallel 1323 operation, so check for that first. */ 1324 if (prev_insn != -1 1325 && (opcode.op->flags_used & FLAG_MEM) 1326 && opcode.form->form < LONG 1327 && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN)) 1328 && parallel_ok (&prev_opcode, (long) prev_insn, 1329 &opcode, (long) insn, extype) 1330 && write_2_short (&prev_opcode, (long) prev_insn, 1331 &opcode, (long) insn, extype, fixups) == 0) 1332 { 1333 /* No instructions saved. */ 1334 prev_insn = -1; 1335 return; 1336 } 1337 else 1338 { 1339 /* Can't parallelize, flush previous instruction and emit a 1340 word of NOPS, unless the previous instruction is a NOP, 1341 in which case just flush it, as this will generate a word 1342 of NOPs for us. */ 1343 1344 if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0)) 1345 d30v_cleanup (FALSE); 1346 else 1347 { 1348 char *f; 1349 1350 if (prev_insn != -1) 1351 d30v_cleanup (TRUE); 1352 else 1353 { 1354 f = frag_more (8); 1355 d30v_number_to_chars (f, NOP2, 8); 1356 1357 if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY) 1358 { 1359 if (opcode.op->flags_used & FLAG_MEM) 1360 as_warn (_("word of NOPs added between word multiply and load")); 1361 else 1362 as_warn (_("word of NOPs added between word multiply and 16-bit multiply")); 1363 } 1364 } 1365 } 1366 1367 extype = EXEC_UNKNOWN; 1368 } 1369 } 1370 else if ( (extype == EXEC_REVSEQ) 1371 && cur_mul32_p 1372 && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16))) 1373 { 1374 /* Can't parallelize, flush current instruction and add a 1375 sequential NOP. */ 1376 write_1_short (&opcode, (long) insn, fixups->next->next, TRUE); 1377 1378 /* Make the previous instruction the current one. */ 1379 extype = EXEC_UNKNOWN; 1380 insn = prev_insn; 1381 now_seg = prev_seg; 1382 now_subseg = prev_subseg; 1383 prev_insn = -1; 1384 cur_mul32_p = prev_mul32_p; 1385 prev_mul32_p = 0; 1386 memcpy (&opcode, &prev_opcode, sizeof (prev_opcode)); 1387 } 1388 1389 /* If this is a long instruction, write it and any previous short 1390 instruction. */ 1391 if (opcode.form->form >= LONG) 1392 { 1393 if (extype != EXEC_UNKNOWN) 1394 as_bad (_("Instruction uses long version, so it cannot be mixed as specified")); 1395 d30v_cleanup (FALSE); 1396 write_long (&opcode, insn, fixups); 1397 prev_insn = -1; 1398 } 1399 else if ((prev_insn != -1) 1400 && (write_2_short 1401 (&prev_opcode, (long) prev_insn, &opcode, 1402 (long) insn, extype, fixups) == 0)) 1403 { 1404 /* No instructions saved. */ 1405 prev_insn = -1; 1406 } 1407 else 1408 { 1409 if (extype != EXEC_UNKNOWN) 1410 as_bad (_("Unable to mix instructions as specified")); 1411 1412 /* Save off last instruction so it may be packed on next pass. */ 1413 memcpy (&prev_opcode, &opcode, sizeof (prev_opcode)); 1414 prev_insn = insn; 1415 prev_seg = now_seg; 1416 prev_subseg = now_subseg; 1417 fixups = fixups->next; 1418 prev_mul32_p = cur_mul32_p; 1419 } 1420 } 1421 1422 /* Assemble a single instruction and return an opcode. 1423 Return -1 (an invalid opcode) on error. */ 1424 1425 #define NAME_BUF_LEN 20 1426 1427 static long long 1428 do_assemble (str, opcode, shortp, is_parallel) 1429 char *str; 1430 struct d30v_insn *opcode; 1431 int shortp; 1432 int is_parallel; 1433 { 1434 unsigned char *op_start; 1435 unsigned char *save; 1436 unsigned char *op_end; 1437 char name[NAME_BUF_LEN]; 1438 int cmp_hack; 1439 int nlen = 0; 1440 int fsize = (shortp ? FORCE_SHORT : 0); 1441 expressionS myops[6]; 1442 long long insn; 1443 1444 /* Drop leading whitespace. */ 1445 while (*str == ' ') 1446 str++; 1447 1448 /* Find the opcode end. */ 1449 for (op_start = op_end = (unsigned char *) (str); 1450 *op_end 1451 && nlen < (NAME_BUF_LEN - 1) 1452 && *op_end != '/' 1453 && !is_end_of_line[*op_end] && *op_end != ' '; 1454 op_end++) 1455 { 1456 name[nlen] = TOLOWER (op_start[nlen]); 1457 nlen++; 1458 } 1459 1460 if (nlen == 0) 1461 return -1; 1462 1463 name[nlen] = 0; 1464 1465 /* If there is an execution condition code, handle it. */ 1466 if (*op_end == '/') 1467 { 1468 int i = 0; 1469 while ((i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2)) 1470 i++; 1471 1472 if (i == ECC_MAX) 1473 { 1474 char tmp[4]; 1475 strncpy (tmp, op_end + 1, 2); 1476 tmp[2] = 0; 1477 as_bad (_("unknown condition code: %s"), tmp); 1478 return -1; 1479 } 1480 #if 0 1481 printf ("condition code=%d\n", i); 1482 #endif 1483 opcode->ecc = i; 1484 op_end += 3; 1485 } 1486 else 1487 opcode->ecc = ECC_AL; 1488 1489 /* CMP and CMPU change their name based on condition codes. */ 1490 if (!strncmp (name, "cmp", 3)) 1491 { 1492 int p, i; 1493 char **str = (char **) d30v_cc_names; 1494 if (name[3] == 'u') 1495 p = 4; 1496 else 1497 p = 3; 1498 1499 for (i = 1; *str && strncmp (*str, &name[p], 2); i++, str++) 1500 ; 1501 1502 /* cmpu only supports some condition codes. */ 1503 if (p == 4) 1504 { 1505 if (i < 3 || i > 6) 1506 { 1507 name[p + 2] = 0; 1508 as_bad (_("cmpu doesn't support condition code %s"), &name[p]); 1509 } 1510 } 1511 1512 if (!*str) 1513 { 1514 name[p + 2] = 0; 1515 as_bad (_("unknown condition code: %s"), &name[p]); 1516 } 1517 1518 cmp_hack = i; 1519 name[p] = 0; 1520 } 1521 else 1522 cmp_hack = 0; 1523 1524 #if 0 1525 printf ("cmp_hack=%d\n", cmp_hack); 1526 #endif 1527 1528 /* Need to look for .s or .l. */ 1529 if (name[nlen - 2] == '.') 1530 { 1531 switch (name[nlen - 1]) 1532 { 1533 case 's': 1534 fsize = FORCE_SHORT; 1535 break; 1536 case 'l': 1537 fsize = FORCE_LONG; 1538 break; 1539 } 1540 name[nlen - 2] = 0; 1541 } 1542 1543 /* Find the first opcode with the proper name. */ 1544 opcode->op = (struct d30v_opcode *) hash_find (d30v_hash, name); 1545 if (opcode->op == NULL) 1546 { 1547 as_bad (_("unknown opcode: %s"), name); 1548 return -1; 1549 } 1550 1551 save = input_line_pointer; 1552 input_line_pointer = op_end; 1553 while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack))) 1554 { 1555 opcode->op++; 1556 if (opcode->op->name == NULL || strcmp (opcode->op->name, name)) 1557 { 1558 as_bad (_("operands for opcode `%s' do not match any valid format"), 1559 name); 1560 return -1; 1561 } 1562 } 1563 input_line_pointer = save; 1564 1565 insn = build_insn (opcode, myops); 1566 1567 /* Propagate multiply status. */ 1568 if (insn != -1) 1569 { 1570 if (is_parallel && prev_mul32_p) 1571 cur_mul32_p = 1; 1572 else 1573 { 1574 prev_mul32_p = cur_mul32_p; 1575 cur_mul32_p = (opcode->op->flags_used & FLAG_MUL32) != 0; 1576 } 1577 } 1578 1579 /* Propagate left_kills_right status. */ 1580 if (insn != -1) 1581 { 1582 prev_left_kills_right_p = cur_left_kills_right_p; 1583 1584 if (opcode->op->flags_set & FLAG_LKR) 1585 { 1586 cur_left_kills_right_p = 1; 1587 1588 if (strcmp (opcode->op->name, "mvtsys") == 0) 1589 { 1590 /* Left kills right for only mvtsys only for 1591 PSW/PSWH/PSWL/flags target. */ 1592 if ((myops[0].X_op == O_register) && 1593 ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */ 1594 (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */ 1595 (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */ 1596 (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */ 1597 (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */ 1598 (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */ 1599 (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */ 1600 (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */ 1601 (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */ 1602 (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */ 1603 (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */ 1604 { 1605 cur_left_kills_right_p = 1; 1606 } 1607 else 1608 { 1609 /* Other mvtsys target registers don't kill right 1610 instruction. */ 1611 cur_left_kills_right_p = 0; 1612 } 1613 } /* mvtsys */ 1614 } 1615 else 1616 cur_left_kills_right_p = 0; 1617 } 1618 1619 return insn; 1620 } 1621 1622 /* Get a pointer to an entry in the format table. 1623 It must look at all formats for an opcode and use the operands 1624 to choose the correct one. Return NULL on error. */ 1625 1626 static struct d30v_format * 1627 find_format (opcode, myops, fsize, cmp_hack) 1628 struct d30v_opcode *opcode; 1629 expressionS myops[]; 1630 int fsize; 1631 int cmp_hack; 1632 { 1633 int numops, match, index, i = 0, j, k; 1634 struct d30v_format *fm; 1635 1636 if (opcode == NULL) 1637 return NULL; 1638 1639 /* Get all the operands and save them as expressions. */ 1640 numops = get_operands (myops, cmp_hack); 1641 1642 while ((index = opcode->format[i++]) != 0) 1643 { 1644 if (fsize == FORCE_SHORT && index >= LONG) 1645 continue; 1646 1647 if (fsize == FORCE_LONG && index < LONG) 1648 continue; 1649 1650 fm = (struct d30v_format *) &d30v_format_table[index]; 1651 k = index; 1652 while (fm->form == index) 1653 { 1654 match = 1; 1655 /* Now check the operands for compatibility. */ 1656 for (j = 0; match && fm->operands[j]; j++) 1657 { 1658 int flags = d30v_operand_table[fm->operands[j]].flags; 1659 int bits = d30v_operand_table[fm->operands[j]].bits; 1660 int X_op = myops[j].X_op; 1661 int num = myops[j].X_add_number; 1662 1663 if (flags & OPERAND_SPECIAL) 1664 break; 1665 else if (X_op == O_illegal) 1666 match = 0; 1667 else if (flags & OPERAND_REG) 1668 { 1669 if (X_op != O_register 1670 || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC)) 1671 || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC)) 1672 || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG)) 1673 || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG)) 1674 || ((flags & OPERAND_CONTROL) 1675 && !(num & (OPERAND_CONTROL | OPERAND_FLAG)))) 1676 { 1677 match = 0; 1678 } 1679 } 1680 else if (((flags & OPERAND_MINUS) 1681 && (X_op != O_absent || num != OPERAND_MINUS)) 1682 || ((flags & OPERAND_PLUS) 1683 && (X_op != O_absent || num != OPERAND_PLUS)) 1684 || ((flags & OPERAND_ATMINUS) 1685 && (X_op != O_absent || num != OPERAND_ATMINUS)) 1686 || ((flags & OPERAND_ATPAR) 1687 && (X_op != O_absent || num != OPERAND_ATPAR)) 1688 || ((flags & OPERAND_ATSIGN) 1689 && (X_op != O_absent || num != OPERAND_ATSIGN))) 1690 { 1691 match = 0; 1692 } 1693 else if (flags & OPERAND_NUM) 1694 { 1695 /* A number can be a constant or symbol expression. */ 1696 1697 /* If we have found a register name, but that name 1698 also matches a symbol, then re-parse the name as 1699 an expression. */ 1700 if (X_op == O_register 1701 && symbol_find ((char *) myops[j].X_op_symbol)) 1702 { 1703 input_line_pointer = (char *) myops[j].X_op_symbol; 1704 expression (&myops[j]); 1705 } 1706 1707 /* Turn an expression into a symbol for later resolution. */ 1708 if (X_op != O_absent && X_op != O_constant 1709 && X_op != O_symbol && X_op != O_register 1710 && X_op != O_big) 1711 { 1712 symbolS *sym = make_expr_symbol (&myops[j]); 1713 myops[j].X_op = X_op = O_symbol; 1714 myops[j].X_add_symbol = sym; 1715 myops[j].X_add_number = num = 0; 1716 } 1717 1718 if (fm->form >= LONG) 1719 { 1720 /* If we're testing for a LONG format, either fits. */ 1721 if (X_op != O_constant && X_op != O_symbol) 1722 match = 0; 1723 } 1724 else if (fm->form < LONG 1725 && ((fsize == FORCE_SHORT && X_op == O_symbol) 1726 || (fm->form == SHORT_D2 && j == 0))) 1727 match = 1; 1728 1729 /* This is the tricky part. Will the constant or symbol 1730 fit into the space in the current format? */ 1731 else if (X_op == O_constant) 1732 { 1733 if (check_range (num, bits, flags)) 1734 match = 0; 1735 } 1736 else if (X_op == O_symbol 1737 && S_IS_DEFINED (myops[j].X_add_symbol) 1738 && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg 1739 && opcode->reloc_flag == RELOC_PCREL) 1740 { 1741 /* If the symbol is defined, see if the value will fit 1742 into the form we're considering. */ 1743 fragS *f; 1744 long value; 1745 1746 /* Calculate the current address by running through the 1747 previous frags and adding our current offset. */ 1748 value = 0; 1749 for (f = frchain_now->frch_root; f; f = f->fr_next) 1750 value += f->fr_fix + f->fr_offset; 1751 value = (S_GET_VALUE (myops[j].X_add_symbol) - value 1752 - (obstack_next_free (&frchain_now->frch_obstack) 1753 - frag_now->fr_literal)); 1754 if (check_range (value, bits, flags)) 1755 match = 0; 1756 } 1757 else 1758 match = 0; 1759 } 1760 } 1761 #if 0 1762 printf ("through the loop: match=%d\n", match); 1763 #endif 1764 /* We're only done if the operands matched so far AND there 1765 are no more to check. */ 1766 if (match && myops[j].X_op == 0) 1767 { 1768 /* Final check - issue a warning if an odd numbered register 1769 is used as the first register in an instruction that reads 1770 or writes 2 registers. */ 1771 1772 for (j = 0; fm->operands[j]; j++) 1773 if (myops[j].X_op == O_register 1774 && (myops[j].X_add_number & 1) 1775 && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG)) 1776 as_warn (_("Odd numbered register used as target of multi-register instruction")); 1777 1778 return fm; 1779 } 1780 fm = (struct d30v_format *) &d30v_format_table[++k]; 1781 } 1782 #if 0 1783 printf ("trying another format: i=%d\n", i); 1784 #endif 1785 } 1786 return NULL; 1787 } 1788 1789 /* If while processing a fixup, a reloc really needs to be created, 1790 then it is done here. */ 1791 1792 arelent * 1793 tc_gen_reloc (seg, fixp) 1794 asection *seg ATTRIBUTE_UNUSED; 1795 fixS *fixp; 1796 { 1797 arelent *reloc; 1798 reloc = (arelent *) xmalloc (sizeof (arelent)); 1799 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 1800 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 1801 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 1802 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 1803 if (reloc->howto == (reloc_howto_type *) NULL) 1804 { 1805 as_bad_where (fixp->fx_file, fixp->fx_line, 1806 _("reloc %d not supported by object file format"), 1807 (int) fixp->fx_r_type); 1808 return NULL; 1809 } 1810 1811 reloc->addend = 0; 1812 return reloc; 1813 } 1814 1815 int 1816 md_estimate_size_before_relax (fragp, seg) 1817 fragS *fragp ATTRIBUTE_UNUSED; 1818 asection *seg ATTRIBUTE_UNUSED; 1819 { 1820 abort (); 1821 return 0; 1822 } 1823 1824 long 1825 md_pcrel_from_section (fixp, sec) 1826 fixS *fixp; 1827 segT sec; 1828 { 1829 if (fixp->fx_addsy != (symbolS *) NULL 1830 && (!S_IS_DEFINED (fixp->fx_addsy) 1831 || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) 1832 return 0; 1833 return fixp->fx_frag->fr_address + fixp->fx_where; 1834 } 1835 1836 void 1837 md_apply_fix3 (fixP, valP, seg) 1838 fixS *fixP; 1839 valueT *valP; 1840 segT seg ATTRIBUTE_UNUSED; 1841 { 1842 char *where; 1843 unsigned long insn, insn2; 1844 long value = *valP; 1845 1846 if (fixP->fx_addsy == (symbolS *) NULL) 1847 fixP->fx_done = 1; 1848 1849 /* We don't support subtracting a symbol. */ 1850 if (fixP->fx_subsy != (symbolS *) NULL) 1851 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex")); 1852 1853 /* Fetch the instruction, insert the fully resolved operand 1854 value, and stuff the instruction back again. */ 1855 where = fixP->fx_frag->fr_literal + fixP->fx_where; 1856 insn = bfd_getb32 ((unsigned char *) where); 1857 1858 switch (fixP->fx_r_type) 1859 { 1860 case BFD_RELOC_8: /* Check for a bad .byte directive. */ 1861 if (fixP->fx_addsy != NULL) 1862 as_bad (_("line %d: unable to place address of symbol '%s' into a byte"), 1863 fixP->fx_line, S_GET_NAME (fixP->fx_addsy)); 1864 else if (((unsigned)value) > 0xff) 1865 as_bad (_("line %d: unable to place value %lx into a byte"), 1866 fixP->fx_line, value); 1867 else 1868 *(unsigned char *) where = value; 1869 break; 1870 1871 case BFD_RELOC_16: /* Check for a bad .short directive. */ 1872 if (fixP->fx_addsy != NULL) 1873 as_bad (_("line %d: unable to place address of symbol '%s' into a short"), 1874 fixP->fx_line, S_GET_NAME (fixP->fx_addsy)); 1875 else if (((unsigned)value) > 0xffff) 1876 as_bad (_("line %d: unable to place value %lx into a short"), 1877 fixP->fx_line, value); 1878 else 1879 bfd_putb16 ((bfd_vma) value, (unsigned char *) where); 1880 break; 1881 1882 case BFD_RELOC_64: /* Check for a bad .quad directive. */ 1883 if (fixP->fx_addsy != NULL) 1884 as_bad (_("line %d: unable to place address of symbol '%s' into a quad"), 1885 fixP->fx_line, S_GET_NAME (fixP->fx_addsy)); 1886 else 1887 { 1888 bfd_putb32 ((bfd_vma) value, (unsigned char *) where); 1889 bfd_putb32 (0, ((unsigned char *) where) + 4); 1890 } 1891 break; 1892 1893 case BFD_RELOC_D30V_6: 1894 check_size (value, 6, fixP->fx_file, fixP->fx_line); 1895 insn |= value & 0x3F; 1896 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1897 break; 1898 1899 case BFD_RELOC_D30V_9_PCREL: 1900 if (fixP->fx_where & 0x7) 1901 { 1902 if (fixP->fx_done) 1903 value += 4; 1904 else 1905 fixP->fx_r_type = BFD_RELOC_D30V_9_PCREL_R; 1906 } 1907 check_size (value, 9, fixP->fx_file, fixP->fx_line); 1908 insn |= ((value >> 3) & 0x3F) << 12; 1909 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1910 break; 1911 1912 case BFD_RELOC_D30V_15: 1913 check_size (value, 15, fixP->fx_file, fixP->fx_line); 1914 insn |= (value >> 3) & 0xFFF; 1915 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1916 break; 1917 1918 case BFD_RELOC_D30V_15_PCREL: 1919 if (fixP->fx_where & 0x7) 1920 { 1921 if (fixP->fx_done) 1922 value += 4; 1923 else 1924 fixP->fx_r_type = BFD_RELOC_D30V_15_PCREL_R; 1925 } 1926 check_size (value, 15, fixP->fx_file, fixP->fx_line); 1927 insn |= (value >> 3) & 0xFFF; 1928 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1929 break; 1930 1931 case BFD_RELOC_D30V_21: 1932 check_size (value, 21, fixP->fx_file, fixP->fx_line); 1933 insn |= (value >> 3) & 0x3FFFF; 1934 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1935 break; 1936 1937 case BFD_RELOC_D30V_21_PCREL: 1938 if (fixP->fx_where & 0x7) 1939 { 1940 if (fixP->fx_done) 1941 value += 4; 1942 else 1943 fixP->fx_r_type = BFD_RELOC_D30V_21_PCREL_R; 1944 } 1945 check_size (value, 21, fixP->fx_file, fixP->fx_line); 1946 insn |= (value >> 3) & 0x3FFFF; 1947 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1948 break; 1949 1950 case BFD_RELOC_D30V_32: 1951 insn2 = bfd_getb32 ((unsigned char *) where + 4); 1952 insn |= (value >> 26) & 0x3F; /* Top 6 bits. */ 1953 insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */ 1954 insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */ 1955 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1956 bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4); 1957 break; 1958 1959 case BFD_RELOC_D30V_32_PCREL: 1960 insn2 = bfd_getb32 ((unsigned char *) where + 4); 1961 insn |= (value >> 26) & 0x3F; /* Top 6 bits. */ 1962 insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */ 1963 insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */ 1964 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); 1965 bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4); 1966 break; 1967 1968 case BFD_RELOC_32: 1969 bfd_putb32 ((bfd_vma) value, (unsigned char *) where); 1970 break; 1971 1972 default: 1973 as_bad (_("line %d: unknown relocation type: 0x%x"), 1974 fixP->fx_line, fixP->fx_r_type); 1975 } 1976 } 1977 1978 /* Called after the assembler has finished parsing the input file or 1979 after a label is defined. Because the D30V assembler sometimes 1980 saves short instructions to see if it can package them with the 1981 next instruction, there may be a short instruction that still needs 1982 written. */ 1983 1984 int 1985 d30v_cleanup (use_sequential) 1986 int use_sequential; 1987 { 1988 segT seg; 1989 subsegT subseg; 1990 1991 if (prev_insn != -1) 1992 { 1993 seg = now_seg; 1994 subseg = now_subseg; 1995 subseg_set (prev_seg, prev_subseg); 1996 write_1_short (&prev_opcode, (long) prev_insn, fixups->next, 1997 use_sequential); 1998 subseg_set (seg, subseg); 1999 prev_insn = -1; 2000 if (use_sequential) 2001 prev_mul32_p = FALSE; 2002 } 2003 2004 return 1; 2005 } 2006 2007 static void 2008 d30v_number_to_chars (buf, value, n) 2009 char *buf; /* Return 'nbytes' of chars here. */ 2010 long long value; /* The value of the bits. */ 2011 int n; /* Number of bytes in the output. */ 2012 { 2013 while (n--) 2014 { 2015 buf[n] = value & 0xff; 2016 value >>= 8; 2017 } 2018 } 2019 2020 /* This function is called at the start of every line. It checks to 2021 see if the first character is a '.', which indicates the start of a 2022 pseudo-op. If it is, then write out any unwritten instructions. */ 2023 2024 void 2025 d30v_start_line () 2026 { 2027 char *c = input_line_pointer; 2028 2029 while (ISSPACE (*c)) 2030 c++; 2031 2032 if (*c == '.') 2033 d30v_cleanup (FALSE); 2034 } 2035 2036 static void 2037 check_size (value, bits, file, line) 2038 long value; 2039 int bits; 2040 char *file; 2041 int line; 2042 { 2043 int tmp, max; 2044 2045 if (value < 0) 2046 tmp = ~value; 2047 else 2048 tmp = value; 2049 2050 max = (1 << (bits - 1)) - 1; 2051 2052 if (tmp > max) 2053 as_bad_where (file, line, _("value too large to fit in %d bits"), bits); 2054 } 2055 2056 /* d30v_frob_label() is called when after a label is recognized. */ 2057 2058 void 2059 d30v_frob_label (lab) 2060 symbolS *lab; 2061 { 2062 /* Emit any pending instructions. */ 2063 d30v_cleanup (FALSE); 2064 2065 /* Update the label's address with the current output pointer. */ 2066 symbol_set_frag (lab, frag_now); 2067 S_SET_VALUE (lab, (valueT) frag_now_fix ()); 2068 2069 /* Record this label for future adjustment after we find out what 2070 kind of data it references, and the required alignment therewith. */ 2071 d30v_last_label = lab; 2072 } 2073 2074 /* Hook into cons for capturing alignment changes. */ 2075 2076 void 2077 d30v_cons_align (size) 2078 int size; 2079 { 2080 int log_size; 2081 2082 log_size = 0; 2083 while ((size >>= 1) != 0) 2084 ++log_size; 2085 2086 if (d30v_current_align < log_size) 2087 d30v_align (log_size, (char *) NULL, NULL); 2088 else if (d30v_current_align > log_size) 2089 d30v_current_align = log_size; 2090 d30v_last_label = NULL; 2091 } 2092 2093 /* Called internally to handle all alignment needs. This takes care 2094 of eliding calls to frag_align if'n the cached current alignment 2095 says we've already got it, as well as taking care of the auto-aligning 2096 labels wrt code. */ 2097 2098 static void 2099 d30v_align (n, pfill, label) 2100 int n; 2101 char *pfill; 2102 symbolS *label; 2103 { 2104 /* The front end is prone to changing segments out from under us 2105 temporarily when -g is in effect. */ 2106 int switched_seg_p = (d30v_current_align_seg != now_seg); 2107 2108 /* Do not assume that if 'd30v_current_align >= n' and 2109 '! switched_seg_p' that it is safe to avoid performing 2110 this alignment request. The alignment of the current frag 2111 can be changed under our feet, for example by a .ascii 2112 directive in the source code. cf testsuite/gas/d30v/reloc.s */ 2113 d30v_cleanup (FALSE); 2114 2115 if (pfill == NULL) 2116 { 2117 if (n > 2 2118 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0) 2119 { 2120 static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 }; 2121 2122 /* First, make sure we're on a four-byte boundary, in case 2123 someone has been putting .byte values the text section. */ 2124 if (d30v_current_align < 2 || switched_seg_p) 2125 frag_align (2, 0, 0); 2126 frag_align_pattern (n, nop, sizeof nop, 0); 2127 } 2128 else 2129 frag_align (n, 0, 0); 2130 } 2131 else 2132 frag_align (n, *pfill, 0); 2133 2134 if (!switched_seg_p) 2135 d30v_current_align = n; 2136 2137 if (label != NULL) 2138 { 2139 symbolS *sym; 2140 int label_seen = FALSE; 2141 struct frag *old_frag; 2142 valueT old_value; 2143 valueT new_value; 2144 2145 assert (S_GET_SEGMENT (label) == now_seg); 2146 2147 old_frag = symbol_get_frag (label); 2148 old_value = S_GET_VALUE (label); 2149 new_value = (valueT) frag_now_fix (); 2150 2151 /* It is possible to have more than one label at a particular 2152 address, especially if debugging is enabled, so we must 2153 take care to adjust all the labels at this address in this 2154 fragment. To save time we search from the end of the symbol 2155 list, backwards, since the symbols we are interested in are 2156 almost certainly the ones that were most recently added. 2157 Also to save time we stop searching once we have seen at least 2158 one matching label, and we encounter a label that is no longer 2159 in the target fragment. Note, this search is guaranteed to 2160 find at least one match when sym == label, so no special case 2161 code is necessary. */ 2162 for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym)) 2163 { 2164 if (symbol_get_frag (sym) == old_frag 2165 && S_GET_VALUE (sym) == old_value) 2166 { 2167 label_seen = TRUE; 2168 symbol_set_frag (sym, frag_now); 2169 S_SET_VALUE (sym, new_value); 2170 } 2171 else if (label_seen && symbol_get_frag (sym) != old_frag) 2172 break; 2173 } 2174 } 2175 2176 record_alignment (now_seg, n); 2177 } 2178 2179 /* Handle the .align pseudo-op. This aligns to a power of two. We 2180 hook here to latch the current alignment. */ 2181 2182 static void 2183 s_d30v_align (ignore) 2184 int ignore ATTRIBUTE_UNUSED; 2185 { 2186 int align; 2187 char fill, *pfill = NULL; 2188 long max_alignment = 15; 2189 2190 align = get_absolute_expression (); 2191 if (align > max_alignment) 2192 { 2193 align = max_alignment; 2194 as_warn (_("Alignment too large: %d assumed"), align); 2195 } 2196 else if (align < 0) 2197 { 2198 as_warn (_("Alignment negative: 0 assumed")); 2199 align = 0; 2200 } 2201 2202 if (*input_line_pointer == ',') 2203 { 2204 input_line_pointer++; 2205 fill = get_absolute_expression (); 2206 pfill = &fill; 2207 } 2208 2209 d30v_last_label = NULL; 2210 d30v_align (align, pfill, NULL); 2211 2212 demand_empty_rest_of_line (); 2213 } 2214 2215 /* Handle the .text pseudo-op. This is like the usual one, but it 2216 clears the saved last label and resets known alignment. */ 2217 2218 static void 2219 s_d30v_text (i) 2220 int i; 2221 2222 { 2223 s_text (i); 2224 d30v_last_label = NULL; 2225 d30v_current_align = 0; 2226 d30v_current_align_seg = now_seg; 2227 } 2228 2229 /* Handle the .data pseudo-op. This is like the usual one, but it 2230 clears the saved last label and resets known alignment. */ 2231 2232 static void 2233 s_d30v_data (i) 2234 int i; 2235 { 2236 s_data (i); 2237 d30v_last_label = NULL; 2238 d30v_current_align = 0; 2239 d30v_current_align_seg = now_seg; 2240 } 2241 2242 /* Handle the .section pseudo-op. This is like the usual one, but it 2243 clears the saved last label and resets known alignment. */ 2244 2245 static void 2246 s_d30v_section (ignore) 2247 int ignore; 2248 { 2249 obj_elf_section (ignore); 2250 d30v_last_label = NULL; 2251 d30v_current_align = 0; 2252 d30v_current_align_seg = now_seg; 2253 } 2254