1 /* tc-msp430.c -- Assembler code for the Texas Instruments MSP430 2 3 Copyright (C) 2002-2014 Free Software Foundation, Inc. 4 Contributed by Dmitry Diky <diwil (at) mail.ru> 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to 20 the Free Software Foundation, 51 Franklin Street - Fifth Floor, 21 Boston, MA 02110-1301, USA. */ 22 23 #include "as.h" 24 #include <limits.h> 25 #define PUSH_1X_WORKAROUND 26 #include "subsegs.h" 27 #include "opcode/msp430.h" 28 #include "safe-ctype.h" 29 #include "dwarf2dbg.h" 30 #include "elf/msp430.h" 31 32 /* We will disable polymorphs by default because it is dangerous. 33 The potential problem here is the following: assume we got the 34 following code: 35 36 jump .l1 37 nop 38 jump subroutine ; external symbol 39 .l1: 40 nop 41 ret 42 43 In case of assembly time relaxation we'll get: 44 0: jmp .l1 <.text +0x08> (reloc deleted) 45 2: nop 46 4: br subroutine 47 .l1: 48 8: nop 49 10: ret 50 51 If the 'subroutine' is within +-1024 bytes range then linker 52 will produce: 53 0: jmp .text +0x08 54 2: nop 55 4: jmp subroutine 56 .l1: 57 6: nop 58 8: ret ; 'jmp .text +0x08' will land here. WRONG!!! 59 60 The workaround is the following: 61 1. Declare global var enable_polymorphs which set to 1 via option -mp. 62 2. Declare global var enable_relax which set to 1 via option -mQ. 63 64 If polymorphs are enabled, and relax isn't, treat all jumps as long jumps, 65 do not delete any relocs and leave them for linker. 66 67 If relax is enabled, relax at assembly time and kill relocs as necessary. */ 68 69 int msp430_enable_relax; 70 int msp430_enable_polys; 71 72 /* Set linkrelax here to avoid fixups in most sections. */ 73 int linkrelax = 1; 74 75 /* GCC uses the some condition codes which we'll 76 implement as new polymorph instructions. 77 78 COND EXPL SHORT JUMP LONG JUMP 79 =============================================== 80 eq == jeq jne +4; br lab 81 ne != jne jeq +4; br lab 82 83 ltn honours no-overflow flag 84 ltn < jn jn +2; jmp +4; br lab 85 86 lt < jl jge +4; br lab 87 ltu < jlo lhs +4; br lab 88 le <= see below 89 leu <= see below 90 91 gt > see below 92 gtu > see below 93 ge >= jge jl +4; br lab 94 geu >= jhs jlo +4; br lab 95 =============================================== 96 97 Therefore, new opcodes are (BranchEQ -> beq; and so on...) 98 beq,bne,blt,bltn,bltu,bge,bgeu 99 'u' means unsigned compares 100 101 Also, we add 'jump' instruction: 102 jump UNCOND -> jmp br lab 103 104 They will have fmt == 4, and insn_opnumb == number of instruction. */ 105 106 struct rcodes_s 107 { 108 char * name; 109 int index; /* Corresponding insn_opnumb. */ 110 int sop; /* Opcode if jump length is short. */ 111 long lpos; /* Label position. */ 112 long lop0; /* Opcode 1 _word_ (16 bits). */ 113 long lop1; /* Opcode second word. */ 114 long lop2; /* Opcode third word. */ 115 }; 116 117 #define MSP430_RLC(n,i,sop,o1) \ 118 {#n, i, sop, 2, (o1 + 2), 0x4010, 0} 119 120 static struct rcodes_s msp430_rcodes[] = 121 { 122 MSP430_RLC (beq, 0, 0x2400, 0x2000), 123 MSP430_RLC (bne, 1, 0x2000, 0x2400), 124 MSP430_RLC (blt, 2, 0x3800, 0x3400), 125 MSP430_RLC (bltu, 3, 0x2800, 0x2c00), 126 MSP430_RLC (bge, 4, 0x3400, 0x3800), 127 MSP430_RLC (bgeu, 5, 0x2c00, 0x2800), 128 {"bltn", 6, 0x3000, 3, 0x3000 + 1, 0x3c00 + 2,0x4010}, 129 {"jump", 7, 0x3c00, 1, 0x4010, 0, 0}, 130 {0,0,0,0,0,0,0} 131 }; 132 133 #undef MSP430_RLC 134 #define MSP430_RLC(n,i,sop,o1) \ 135 {#n, i, sop, 2, (o1 + 2), 0x0030, 0} 136 137 static struct rcodes_s msp430x_rcodes[] = 138 { 139 MSP430_RLC (beq, 0, 0x2400, 0x2000), 140 MSP430_RLC (bne, 1, 0x2000, 0x2400), 141 MSP430_RLC (blt, 2, 0x3800, 0x3400), 142 MSP430_RLC (bltu, 3, 0x2800, 0x2c00), 143 MSP430_RLC (bge, 4, 0x3400, 0x3800), 144 MSP430_RLC (bgeu, 5, 0x2c00, 0x2800), 145 {"bltn", 6, 0x3000, 3, 0x0030 + 1, 0x3c00 + 2, 0x3000}, 146 {"jump", 7, 0x3c00, 1, 0x0030, 0, 0}, 147 {0,0,0,0,0,0,0} 148 }; 149 #undef MSP430_RLC 150 151 /* More difficult than above and they have format 5. 152 153 COND EXPL SHORT LONG 154 ================================================================= 155 gt > jeq +2; jge label jeq +6; jl +4; br label 156 gtu > jeq +2; jhs label jeq +6; jlo +4; br label 157 leu <= jeq label; jlo label jeq +2; jhs +4; br label 158 le <= jeq label; jl label jeq +2; jge +4; br label 159 ================================================================= */ 160 161 struct hcodes_s 162 { 163 char * name; 164 int index; /* Corresponding insn_opnumb. */ 165 int tlab; /* Number of labels in short mode. */ 166 int op0; /* Opcode for first word of short jump. */ 167 int op1; /* Opcode for second word of short jump. */ 168 int lop0; /* Opcodes for long jump mode. */ 169 int lop1; 170 int lop2; 171 }; 172 173 static struct hcodes_s msp430_hcodes[] = 174 { 175 {"bgt", 0, 1, 0x2401, 0x3400, 0x2403, 0x3802, 0x4010 }, 176 {"bgtu", 1, 1, 0x2401, 0x2c00, 0x2403, 0x2802, 0x4010 }, 177 {"bleu", 2, 2, 0x2400, 0x2800, 0x2401, 0x2c02, 0x4010 }, 178 {"ble", 3, 2, 0x2400, 0x3800, 0x2401, 0x3402, 0x4010 }, 179 {0,0,0,0,0,0,0,0} 180 }; 181 182 static struct hcodes_s msp430x_hcodes[] = 183 { 184 {"bgt", 0, 1, 0x2401, 0x3400, 0x2403, 0x3802, 0x0030 }, 185 {"bgtu", 1, 1, 0x2401, 0x2c00, 0x2403, 0x2802, 0x0030 }, 186 {"bleu", 2, 2, 0x2400, 0x2800, 0x2401, 0x2c02, 0x0030 }, 187 {"ble", 3, 2, 0x2400, 0x3800, 0x2401, 0x3402, 0x0030 }, 188 {0,0,0,0,0,0,0,0} 189 }; 190 191 const char comment_chars[] = ";"; 192 const char line_comment_chars[] = "#"; 193 const char line_separator_chars[] = "{"; 194 const char EXP_CHARS[] = "eE"; 195 const char FLT_CHARS[] = "dD"; 196 197 /* Handle long expressions. */ 198 extern LITTLENUM_TYPE generic_bignum[]; 199 200 static struct hash_control *msp430_hash; 201 202 /* Relaxations. */ 203 #define STATE_UNCOND_BRANCH 1 /* jump */ 204 #define STATE_NOOV_BRANCH 3 /* bltn */ 205 #define STATE_SIMPLE_BRANCH 2 /* bne, beq, etc... */ 206 #define STATE_EMUL_BRANCH 4 207 208 #define CNRL 2 209 #define CUBL 4 210 #define CNOL 8 211 #define CSBL 6 212 #define CEBL 4 213 214 /* Length. */ 215 #define STATE_BITS10 1 /* wild guess. short jump */ 216 #define STATE_WORD 2 /* 2 bytes pc rel. addr. more */ 217 #define STATE_UNDEF 3 /* cannot handle this yet. convert to word mode */ 218 219 #define ENCODE_RELAX(what,length) (((what) << 2) + (length)) 220 #define RELAX_STATE(s) ((s) & 3) 221 #define RELAX_LEN(s) ((s) >> 2) 222 #define RELAX_NEXT(a,b) ENCODE_RELAX (a, b + 1) 223 224 relax_typeS md_relax_table[] = 225 { 226 /* Unused. */ 227 {1, 1, 0, 0}, 228 {1, 1, 0, 0}, 229 {1, 1, 0, 0}, 230 {1, 1, 0, 0}, 231 232 /* Unconditional jump. */ 233 {1, 1, 8, 5}, 234 {1024, -1024, CNRL, RELAX_NEXT (STATE_UNCOND_BRANCH, STATE_BITS10)}, /* state 10 bits displ */ 235 {0, 0, CUBL, RELAX_NEXT (STATE_UNCOND_BRANCH, STATE_WORD)}, /* state word */ 236 {1, 1, CUBL, 0}, /* state undef */ 237 238 /* Simple branches. */ 239 {0, 0, 8, 9}, 240 {1024, -1024, CNRL, RELAX_NEXT (STATE_SIMPLE_BRANCH, STATE_BITS10)}, /* state 10 bits displ */ 241 {0, 0, CSBL, RELAX_NEXT (STATE_SIMPLE_BRANCH, STATE_WORD)}, /* state word */ 242 {1, 1, CSBL, 0}, 243 244 /* blt no overflow branch. */ 245 {1, 1, 8, 13}, 246 {1024, -1024, CNRL, RELAX_NEXT (STATE_NOOV_BRANCH, STATE_BITS10)}, /* state 10 bits displ */ 247 {0, 0, CNOL, RELAX_NEXT (STATE_NOOV_BRANCH, STATE_WORD)}, /* state word */ 248 {1, 1, CNOL, 0}, 249 250 /* Emulated branches. */ 251 {1, 1, 8, 17}, 252 {1020, -1020, CEBL, RELAX_NEXT (STATE_EMUL_BRANCH, STATE_BITS10)}, /* state 10 bits displ */ 253 {0, 0, CNOL, RELAX_NEXT (STATE_EMUL_BRANCH, STATE_WORD)}, /* state word */ 254 {1, 1, CNOL, 0} 255 }; 256 257 258 #define MAX_OP_LEN 256 259 260 typedef enum msp_isa 261 { 262 MSP_ISA_430, 263 MSP_ISA_430X, 264 MSP_ISA_430Xv2 265 } msp_isa; 266 267 static enum msp_isa selected_isa = MSP_ISA_430Xv2; 268 269 static inline bfd_boolean 270 target_is_430x (void) 271 { 272 return selected_isa >= MSP_ISA_430X; 273 } 274 275 static inline bfd_boolean 276 target_is_430xv2 (void) 277 { 278 return selected_isa == MSP_ISA_430Xv2; 279 } 280 281 /* Generate an absolute 16-bit relocation. 282 For the 430X we generate a relocation without linker range checking 283 if the value is being used in an extended (ie 20-bit) instruction, 284 otherwise if have a shifted expression we use a HI reloc. 285 For the 430 we generate a relocation without assembler range checking 286 if we are handling an immediate value or a byte-width instruction. */ 287 288 #undef CHECK_RELOC_MSP430 289 #define CHECK_RELOC_MSP430(OP) \ 290 (target_is_430x () \ 291 ? (extended_op \ 292 ? BFD_RELOC_16 \ 293 : ((OP).vshift == 1) \ 294 ? BFD_RELOC_MSP430_ABS_HI16 \ 295 : BFD_RELOC_MSP430X_ABS16) \ 296 : ((imm_op || byte_op) \ 297 ? BFD_RELOC_MSP430_16_BYTE : BFD_RELOC_MSP430_16)) 298 299 /* Generate a 16-bit pc-relative relocation. 300 For the 430X we generate a relocation without linkwer range checking. 301 For the 430 we generate a relocation without assembler range checking 302 if we are handling an immediate value or a byte-width instruction. */ 303 #undef CHECK_RELOC_MSP430_PCREL 304 #define CHECK_RELOC_MSP430_PCREL \ 305 (target_is_430x () \ 306 ? BFD_RELOC_MSP430X_PCR16 \ 307 : (imm_op || byte_op) \ 308 ? BFD_RELOC_MSP430_16_PCREL_BYTE : BFD_RELOC_MSP430_16_PCREL) 309 310 /* Profiling capability: 311 It is a performance hit to use gcc's profiling approach for this tiny target. 312 Even more -- jtag hardware facility does not perform any profiling functions. 313 However we've got gdb's built-in simulator where we can do anything. 314 Therefore my suggestion is: 315 316 We define new section ".profiler" which holds all profiling information. 317 We define new pseudo operation .profiler which will instruct assembler to 318 add new profile entry to the object file. Profile should take place at the 319 present address. 320 321 Pseudo-op format: 322 323 .profiler flags,function_to_profile [, cycle_corrector, extra] 324 325 where 'flags' is a combination of the following chars: 326 s - function Start 327 x - function eXit 328 i - function is in Init section 329 f - function is in Fini section 330 l - Library call 331 c - libC standard call 332 d - stack value Demand (saved at run-time in simulator) 333 I - Interrupt service routine 334 P - Prologue start 335 p - Prologue end 336 E - Epilogue start 337 e - Epilogue end 338 j - long Jump/ sjlj unwind 339 a - an Arbitrary code fragment 340 t - exTra parameter saved (constant value like frame size) 341 '""' optional: "sil" == sil 342 343 function_to_profile - function's address 344 cycle_corrector - a value which should be added to the cycle 345 counter, zero if omitted 346 extra - some extra parameter, zero if omitted. 347 348 For example: 349 ------------------------------ 350 .global fxx 351 .type fxx,@function 352 fxx: 353 .LFrameOffset_fxx=0x08 354 .profiler "scdP", fxx ; function entry. 355 ; we also demand stack value to be displayed 356 push r11 357 push r10 358 push r9 359 push r8 360 .profiler "cdp",fxx,0, .LFrameOffset_fxx ; check stack value at this point 361 ; (this is a prologue end) 362 ; note, that spare var filled with the frame size 363 mov r15,r8 364 .... 365 .profiler cdE,fxx ; check stack 366 pop r8 367 pop r9 368 pop r10 369 pop r11 370 .profiler xcde,fxx,3 ; exit adds 3 to the cycle counter 371 ret ; cause 'ret' insn takes 3 cycles 372 ------------------------------- 373 374 This profiling approach does not produce any overhead and 375 absolutely harmless. 376 So, even profiled code can be uploaded to the MCU. */ 377 #define MSP430_PROFILER_FLAG_ENTRY 1 /* s */ 378 #define MSP430_PROFILER_FLAG_EXIT 2 /* x */ 379 #define MSP430_PROFILER_FLAG_INITSECT 4 /* i */ 380 #define MSP430_PROFILER_FLAG_FINISECT 8 /* f */ 381 #define MSP430_PROFILER_FLAG_LIBCALL 0x10 /* l */ 382 #define MSP430_PROFILER_FLAG_STDCALL 0x20 /* c */ 383 #define MSP430_PROFILER_FLAG_STACKDMD 0x40 /* d */ 384 #define MSP430_PROFILER_FLAG_ISR 0x80 /* I */ 385 #define MSP430_PROFILER_FLAG_PROLSTART 0x100 /* P */ 386 #define MSP430_PROFILER_FLAG_PROLEND 0x200 /* p */ 387 #define MSP430_PROFILER_FLAG_EPISTART 0x400 /* E */ 388 #define MSP430_PROFILER_FLAG_EPIEND 0x800 /* e */ 389 #define MSP430_PROFILER_FLAG_JUMP 0x1000 /* j */ 390 #define MSP430_PROFILER_FLAG_FRAGMENT 0x2000 /* a */ 391 #define MSP430_PROFILER_FLAG_EXTRA 0x4000 /* t */ 392 #define MSP430_PROFILER_FLAG_notyet 0x8000 /* ? */ 393 394 static int 395 pow2value (int y) 396 { 397 int n = 0; 398 unsigned int x; 399 400 x = y; 401 402 if (!x) 403 return 1; 404 405 for (; x; x = x >> 1) 406 if (x & 1) 407 n++; 408 409 return n == 1; 410 } 411 412 /* Parse ordinary expression. */ 413 414 static char * 415 parse_exp (char * s, expressionS * op) 416 { 417 input_line_pointer = s; 418 expression (op); 419 if (op->X_op == O_absent) 420 as_bad (_("missing operand")); 421 return input_line_pointer; 422 } 423 424 425 /* Delete spaces from s: X ( r 1 2) => X(r12). */ 426 427 static void 428 del_spaces (char * s) 429 { 430 while (*s) 431 { 432 if (ISSPACE (*s)) 433 { 434 char *m = s + 1; 435 436 while (ISSPACE (*m) && *m) 437 m++; 438 memmove (s, m, strlen (m) + 1); 439 } 440 else 441 s++; 442 } 443 } 444 445 static inline char * 446 skip_space (char * s) 447 { 448 while (ISSPACE (*s)) 449 ++s; 450 return s; 451 } 452 453 /* Extract one word from FROM and copy it to TO. Delimiters are ",;\n" */ 454 455 static char * 456 extract_operand (char * from, char * to, int limit) 457 { 458 int size = 0; 459 460 /* Drop leading whitespace. */ 461 from = skip_space (from); 462 463 while (size < limit && *from) 464 { 465 *(to + size) = *from; 466 if (*from == ',' || *from == ';' || *from == '\n') 467 break; 468 from++; 469 size++; 470 } 471 472 *(to + size) = 0; 473 del_spaces (to); 474 475 from++; 476 477 return from; 478 } 479 480 static void 481 msp430_profiler (int dummy ATTRIBUTE_UNUSED) 482 { 483 char buffer[1024]; 484 char f[32]; 485 char * str = buffer; 486 char * flags = f; 487 int p_flags = 0; 488 char * halt; 489 int ops = 0; 490 int left; 491 char * s; 492 segT seg; 493 int subseg; 494 char * end = 0; 495 expressionS exp; 496 expressionS exp1; 497 498 s = input_line_pointer; 499 end = input_line_pointer; 500 501 while (*end && *end != '\n') 502 end++; 503 504 while (*s && *s != '\n') 505 { 506 if (*s == ',') 507 ops++; 508 s++; 509 } 510 511 left = 3 - ops; 512 513 if (ops < 1) 514 { 515 as_bad (_(".profiler pseudo requires at least two operands.")); 516 input_line_pointer = end; 517 return; 518 } 519 520 input_line_pointer = extract_operand (input_line_pointer, flags, 32); 521 522 while (*flags) 523 { 524 switch (*flags) 525 { 526 case '"': 527 break; 528 case 'a': 529 p_flags |= MSP430_PROFILER_FLAG_FRAGMENT; 530 break; 531 case 'j': 532 p_flags |= MSP430_PROFILER_FLAG_JUMP; 533 break; 534 case 'P': 535 p_flags |= MSP430_PROFILER_FLAG_PROLSTART; 536 break; 537 case 'p': 538 p_flags |= MSP430_PROFILER_FLAG_PROLEND; 539 break; 540 case 'E': 541 p_flags |= MSP430_PROFILER_FLAG_EPISTART; 542 break; 543 case 'e': 544 p_flags |= MSP430_PROFILER_FLAG_EPIEND; 545 break; 546 case 's': 547 p_flags |= MSP430_PROFILER_FLAG_ENTRY; 548 break; 549 case 'x': 550 p_flags |= MSP430_PROFILER_FLAG_EXIT; 551 break; 552 case 'i': 553 p_flags |= MSP430_PROFILER_FLAG_INITSECT; 554 break; 555 case 'f': 556 p_flags |= MSP430_PROFILER_FLAG_FINISECT; 557 break; 558 case 'l': 559 p_flags |= MSP430_PROFILER_FLAG_LIBCALL; 560 break; 561 case 'c': 562 p_flags |= MSP430_PROFILER_FLAG_STDCALL; 563 break; 564 case 'd': 565 p_flags |= MSP430_PROFILER_FLAG_STACKDMD; 566 break; 567 case 'I': 568 p_flags |= MSP430_PROFILER_FLAG_ISR; 569 break; 570 case 't': 571 p_flags |= MSP430_PROFILER_FLAG_EXTRA; 572 break; 573 default: 574 as_warn (_("unknown profiling flag - ignored.")); 575 break; 576 } 577 flags++; 578 } 579 580 if (p_flags 581 && ( ! pow2value (p_flags & ( MSP430_PROFILER_FLAG_ENTRY 582 | MSP430_PROFILER_FLAG_EXIT)) 583 || ! pow2value (p_flags & ( MSP430_PROFILER_FLAG_PROLSTART 584 | MSP430_PROFILER_FLAG_PROLEND 585 | MSP430_PROFILER_FLAG_EPISTART 586 | MSP430_PROFILER_FLAG_EPIEND)) 587 || ! pow2value (p_flags & ( MSP430_PROFILER_FLAG_INITSECT 588 | MSP430_PROFILER_FLAG_FINISECT)))) 589 { 590 as_bad (_("ambiguous flags combination - '.profiler' directive ignored.")); 591 input_line_pointer = end; 592 return; 593 } 594 595 /* Generate temp symbol which denotes current location. */ 596 if (now_seg == absolute_section) /* Paranoia ? */ 597 { 598 exp1.X_op = O_constant; 599 exp1.X_add_number = abs_section_offset; 600 as_warn (_("profiling in absolute section?")); 601 } 602 else 603 { 604 exp1.X_op = O_symbol; 605 exp1.X_add_symbol = symbol_temp_new_now (); 606 exp1.X_add_number = 0; 607 } 608 609 /* Generate a symbol which holds flags value. */ 610 exp.X_op = O_constant; 611 exp.X_add_number = p_flags; 612 613 /* Save current section. */ 614 seg = now_seg; 615 subseg = now_subseg; 616 617 /* Now go to .profiler section. */ 618 obj_elf_change_section (".profiler", SHT_PROGBITS, 0, 0, 0, 0, 0); 619 620 /* Save flags. */ 621 emit_expr (& exp, 2); 622 623 /* Save label value. */ 624 emit_expr (& exp1, 2); 625 626 while (ops--) 627 { 628 /* Now get profiling info. */ 629 halt = extract_operand (input_line_pointer, str, 1024); 630 /* Process like ".word xxx" directive. */ 631 parse_exp (str, & exp); 632 emit_expr (& exp, 2); 633 input_line_pointer = halt; 634 } 635 636 /* Fill the rest with zeros. */ 637 exp.X_op = O_constant; 638 exp.X_add_number = 0; 639 while (left--) 640 emit_expr (& exp, 2); 641 642 /* Return to current section. */ 643 subseg_set (seg, subseg); 644 } 645 646 static char * 647 extract_word (char * from, char * to, int limit) 648 { 649 char *op_end; 650 int size = 0; 651 652 /* Drop leading whitespace. */ 653 from = skip_space (from); 654 *to = 0; 655 656 /* Find the op code end. */ 657 for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);) 658 { 659 to[size++] = *op_end++; 660 if (size + 1 >= limit) 661 break; 662 } 663 664 to[size] = 0; 665 return op_end; 666 } 667 668 #define OPTION_MMCU 'm' 669 #define OPTION_RELAX 'Q' 670 #define OPTION_POLYMORPHS 'P' 671 #define OPTION_LARGE 'l' 672 static bfd_boolean large_model = FALSE; 673 #define OPTION_NO_INTR_NOPS 'N' 674 #define OPTION_INTR_NOPS 'n' 675 static bfd_boolean gen_interrupt_nops = FALSE; 676 #define OPTION_WARN_INTR_NOPS 'y' 677 #define OPTION_NO_WARN_INTR_NOPS 'Y' 678 static bfd_boolean warn_interrupt_nops = TRUE; 679 #define OPTION_MCPU 'c' 680 #define OPTION_MOVE_DATA 'd' 681 static bfd_boolean move_data = FALSE; 682 683 static void 684 msp430_set_arch (int option) 685 { 686 char *str = (char *) alloca (32); /* 32 for good measure. */ 687 688 input_line_pointer = extract_word (input_line_pointer, str, 32); 689 690 md_parse_option (option, str); 691 bfd_set_arch_mach (stdoutput, TARGET_ARCH, 692 target_is_430x () ? bfd_mach_msp430x : bfd_mach_msp11); 693 } 694 695 /* This is the full list of MCU names that are known to only 696 support the 430 ISA. */ 697 static const char * msp430_mcu_names [] = 698 { 699 "msp430afe221", "msp430afe222", "msp430afe223", "msp430afe231", 700 "msp430afe232", "msp430afe233", "msp430afe251", "msp430afe252", 701 "msp430afe253", "msp430c091", "msp430c092", "msp430c111", 702 "msp430c1111", "msp430c112", "msp430c1121", "msp430c1331", 703 "msp430c1351", "msp430c311s", "msp430c312", "msp430c313", 704 "msp430c314", "msp430c315", "msp430c323", "msp430c325", 705 "msp430c336", "msp430c337", "msp430c412", "msp430c413", 706 "msp430e112", "msp430e313", "msp430e315", "msp430e325", 707 "msp430e337", "msp430f110", "msp430f1101", "msp430f1101a", 708 "msp430f1111", "msp430f1111a", "msp430f112", "msp430f1121", 709 "msp430f1121a", "msp430f1122", "msp430f1132", "msp430f122", 710 "msp430f1222", "msp430f123", "msp430f1232", "msp430f133", 711 "msp430f135", "msp430f147", "msp430f1471", "msp430f148", 712 "msp430f1481", "msp430f149", "msp430f1491", "msp430f155", 713 "msp430f156", "msp430f157", "msp430f1610", "msp430f1611", 714 "msp430f1612", "msp430f167", "msp430f168", "msp430f169", 715 "msp430f2001", "msp430f2002", "msp430f2003", "msp430f2011", 716 "msp430f2012", "msp430f2013", "msp430f2101", "msp430f2111", 717 "msp430f2112", "msp430f2121", "msp430f2122", "msp430f2131", 718 "msp430f2132", "msp430f2232", "msp430f2234", "msp430f2252", 719 "msp430f2254", "msp430f2272", "msp430f2274", "msp430f233", 720 "msp430f2330", "msp430f235", "msp430f2350", "msp430f2370", 721 "msp430f2410", "msp430f247", "msp430f2471", "msp430f248", 722 "msp430f2481", "msp430f249", "msp430f2491", "msp430f412", 723 "msp430f413", "msp430f4132", "msp430f415", "msp430f4152", 724 "msp430f417", "msp430f423", "msp430f423a", "msp430f425", 725 "msp430f4250", "msp430f425a", "msp430f4260", "msp430f427", 726 "msp430f4270", "msp430f427a", "msp430f435", "msp430f4351", 727 "msp430f436", "msp430f4361", "msp430f437", "msp430f4371", 728 "msp430f438", "msp430f439", "msp430f447", "msp430f448", 729 "msp430f4481", "msp430f449", "msp430f4491", "msp430f477", 730 "msp430f478", "msp430f4783", "msp430f4784", "msp430f479", 731 "msp430f4793", "msp430f4794", "msp430fe423", "msp430fe4232", 732 "msp430fe423a", "msp430fe4242", "msp430fe425", "msp430fe4252", 733 "msp430fe425a", "msp430fe427", "msp430fe4272", "msp430fe427a", 734 "msp430fg4250", "msp430fg4260", "msp430fg4270", "msp430fg437", 735 "msp430fg438", "msp430fg439", "msp430fg477", "msp430fg478", 736 "msp430fg479", "msp430fw423", "msp430fw425", "msp430fw427", 737 "msp430fw428", "msp430fw429", "msp430g2001", "msp430g2101", 738 "msp430g2102", "msp430g2111", "msp430g2112", "msp430g2113", 739 "msp430g2121", "msp430g2131", "msp430g2132", "msp430g2152", 740 "msp430g2153", "msp430g2201", "msp430g2202", "msp430g2203", 741 "msp430g2210", "msp430g2211", "msp430g2212", "msp430g2213", 742 "msp430g2221", "msp430g2230", "msp430g2231", "msp430g2232", 743 "msp430g2233", "msp430g2252", "msp430g2253", "msp430g2302", 744 "msp430g2303", "msp430g2312", "msp430g2313", "msp430g2332", 745 "msp430g2333", "msp430g2352", "msp430g2353", "msp430g2402", 746 "msp430g2403", "msp430g2412", "msp430g2413", "msp430g2432", 747 "msp430g2433", "msp430g2444", "msp430g2452", "msp430g2453", 748 "msp430g2513", "msp430g2533", "msp430g2544", "msp430g2553", 749 "msp430g2744", "msp430g2755", "msp430g2855", "msp430g2955", 750 "msp430i2020", "msp430i2021", "msp430i2030", "msp430i2031", 751 "msp430i2040", "msp430i2041", "msp430l092", "msp430p112", 752 "msp430p313", "msp430p315", "msp430p315s", "msp430p325", 753 "msp430p337", "msp430tch5e" 754 }; 755 756 int 757 md_parse_option (int c, char * arg) 758 { 759 switch (c) 760 { 761 case OPTION_MMCU: 762 if (arg == NULL) 763 as_fatal (_("MCU option requires a name\n")); 764 765 if (strcasecmp ("msp430", arg) == 0) 766 selected_isa = MSP_ISA_430; 767 else if (strcasecmp ("msp430xv2", arg) == 0) 768 selected_isa = MSP_ISA_430Xv2; 769 else if (strcasecmp ("msp430x", arg) == 0) 770 selected_isa = MSP_ISA_430X; 771 else 772 { 773 int i; 774 775 for (i = sizeof msp430_mcu_names / sizeof msp430_mcu_names[0]; i--;) 776 if (strcasecmp (msp430_mcu_names[i], arg) == 0) 777 { 778 selected_isa = MSP_ISA_430; 779 break; 780 } 781 } 782 /* It is not an error if we do not match the MCU name. */ 783 return 1; 784 785 case OPTION_MCPU: 786 if (strcmp (arg, "430") == 0 787 || strcasecmp (arg, "msp430") == 0) 788 selected_isa = MSP_ISA_430; 789 else if (strcasecmp (arg, "430x") == 0 790 || strcasecmp (arg, "msp430x") == 0) 791 selected_isa = MSP_ISA_430X; 792 else if (strcasecmp (arg, "430xv2") == 0 793 || strcasecmp (arg, "msp430xv2") == 0) 794 selected_isa = MSP_ISA_430Xv2; 795 else 796 as_fatal (_("unrecognised argument to -mcpu option '%s'"), arg); 797 return 1; 798 799 case OPTION_RELAX: 800 msp430_enable_relax = 1; 801 return 1; 802 803 case OPTION_POLYMORPHS: 804 msp430_enable_polys = 1; 805 return 1; 806 807 case OPTION_LARGE: 808 large_model = TRUE; 809 return 1; 810 811 case OPTION_NO_INTR_NOPS: 812 gen_interrupt_nops = FALSE; 813 return 1; 814 case OPTION_INTR_NOPS: 815 gen_interrupt_nops = TRUE; 816 return 1; 817 818 case OPTION_WARN_INTR_NOPS: 819 warn_interrupt_nops = TRUE; 820 return 1; 821 case OPTION_NO_WARN_INTR_NOPS: 822 warn_interrupt_nops = FALSE; 823 return 1; 824 825 case OPTION_MOVE_DATA: 826 move_data = TRUE; 827 return 1; 828 } 829 830 return 0; 831 } 832 833 /* The intention here is to have the mere presence of these sections 834 cause the object to have a reference to a well-known symbol. This 835 reference pulls in the bits of the runtime (crt0) that initialize 836 these sections. Thus, for example, the startup code to call 837 memset() to initialize .bss will only be linked in when there is a 838 non-empty .bss section. Otherwise, the call would exist but have a 839 zero length parameter, which is a waste of memory and cycles. 840 841 The code which initializes these sections should have a global 842 label for these symbols, and should be marked with KEEP() in the 843 linker script. 844 */ 845 static void 846 msp430_section (int arg) 847 { 848 char * saved_ilp = input_line_pointer; 849 char * name = obj_elf_section_name (); 850 851 if (strncmp (name, ".bss", 4) == 0 852 || strncmp (name, ".gnu.linkonce.b.", 16) == 0) 853 (void) symbol_find_or_make ("__crt0_init_bss"); 854 855 if (strncmp (name, ".data", 5) == 0 856 || strncmp (name, ".gnu.linkonce.d.", 16) == 0) 857 (void) symbol_find_or_make ("__crt0_movedata"); 858 859 input_line_pointer = saved_ilp; 860 obj_elf_section (arg); 861 } 862 863 void 864 msp430_frob_section (asection *sec) 865 { 866 const char *name = sec->name; 867 868 if (sec->size == 0) 869 return; 870 871 if (strncmp (name, ".bss", 4) == 0 872 || strncmp (name, ".gnu.linkonce.b.", 16) == 0) 873 (void) symbol_find_or_make ("__crt0_init_bss"); 874 875 if (strncmp (name, ".data", 5) == 0 876 || strncmp (name, ".gnu.linkonce.d.", 16) == 0) 877 (void) symbol_find_or_make ("__crt0_movedata"); 878 } 879 880 static void 881 msp430_lcomm (int ignore ATTRIBUTE_UNUSED) 882 { 883 symbolS *symbolP = s_comm_internal (0, s_lcomm_internal); 884 885 if (symbolP) 886 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; 887 (void) symbol_find_or_make ("__crt0_init_bss"); 888 } 889 890 static void 891 msp430_comm (int needs_align) 892 { 893 s_comm_internal (needs_align, elf_common_parse); 894 (void) symbol_find_or_make ("__crt0_init_bss"); 895 } 896 897 static void 898 msp430_refsym (int arg ATTRIBUTE_UNUSED) 899 { 900 char sym_name[1024]; 901 input_line_pointer = extract_word (input_line_pointer, sym_name, 1024); 902 903 (void) symbol_find_or_make (sym_name); 904 } 905 906 const pseudo_typeS md_pseudo_table[] = 907 { 908 {"arch", msp430_set_arch, OPTION_MMCU}, 909 {"cpu", msp430_set_arch, OPTION_MCPU}, 910 {"profiler", msp430_profiler, 0}, 911 {"section", msp430_section, 0}, 912 {"section.s", msp430_section, 0}, 913 {"sect", msp430_section, 0}, 914 {"sect.s", msp430_section, 0}, 915 {"pushsection", msp430_section, 1}, 916 {"refsym", msp430_refsym, 0}, 917 {"comm", msp430_comm, 0}, 918 {"lcomm", msp430_lcomm, 0}, 919 {NULL, NULL, 0} 920 }; 921 922 const char *md_shortopts = "mm:,mP,mQ,ml,mN,mn,my,mY"; 923 924 struct option md_longopts[] = 925 { 926 {"mmcu", required_argument, NULL, OPTION_MMCU}, 927 {"mcpu", required_argument, NULL, OPTION_MCPU}, 928 {"mP", no_argument, NULL, OPTION_POLYMORPHS}, 929 {"mQ", no_argument, NULL, OPTION_RELAX}, 930 {"ml", no_argument, NULL, OPTION_LARGE}, 931 {"mN", no_argument, NULL, OPTION_NO_INTR_NOPS}, 932 {"mn", no_argument, NULL, OPTION_INTR_NOPS}, 933 {"mY", no_argument, NULL, OPTION_NO_WARN_INTR_NOPS}, 934 {"my", no_argument, NULL, OPTION_WARN_INTR_NOPS}, 935 {"md", no_argument, NULL, OPTION_MOVE_DATA}, 936 {NULL, no_argument, NULL, 0} 937 }; 938 939 size_t md_longopts_size = sizeof (md_longopts); 940 941 void 942 md_show_usage (FILE * stream) 943 { 944 fprintf (stream, 945 _("MSP430 options:\n" 946 " -mmcu=<msp430-name> - select microcontroller type\n" 947 " -mcpu={430|430x|430xv2} - select microcontroller architecture\n")); 948 fprintf (stream, 949 _(" -mQ - enable relaxation at assembly time. DANGEROUS!\n" 950 " -mP - enable polymorph instructions\n")); 951 fprintf (stream, 952 _(" -ml - enable large code model\n")); 953 fprintf (stream, 954 _(" -mN - do not insert NOPs after changing interrupts (default)\n")); 955 fprintf (stream, 956 _(" -mn - insert a NOP after changing interrupts\n")); 957 fprintf (stream, 958 _(" -mY - do not warn about missing NOPs after changing interrupts\n")); 959 fprintf (stream, 960 _(" -my - warn about missing NOPs after changing interrupts (default)\n")); 961 fprintf (stream, 962 _(" -md - Force copying of data from ROM to RAM at startup\n")); 963 } 964 965 symbolS * 966 md_undefined_symbol (char * name ATTRIBUTE_UNUSED) 967 { 968 return NULL; 969 } 970 971 static char * 972 extract_cmd (char * from, char * to, int limit) 973 { 974 int size = 0; 975 976 while (*from && ! ISSPACE (*from) && *from != '.' && limit > size) 977 { 978 *(to + size) = *from; 979 from++; 980 size++; 981 } 982 983 *(to + size) = 0; 984 985 return from; 986 } 987 988 char * 989 md_atof (int type, char * litP, int * sizeP) 990 { 991 return ieee_md_atof (type, litP, sizeP, FALSE); 992 } 993 994 void 995 md_begin (void) 996 { 997 struct msp430_opcode_s * opcode; 998 msp430_hash = hash_new (); 999 1000 for (opcode = msp430_opcodes; opcode->name; opcode++) 1001 hash_insert (msp430_hash, opcode->name, (char *) opcode); 1002 1003 bfd_set_arch_mach (stdoutput, TARGET_ARCH, 1004 target_is_430x () ? bfd_mach_msp430x : bfd_mach_msp11); 1005 } 1006 1007 /* Returns the register number equivalent to the string T. 1008 Returns -1 if there is no such register. 1009 Skips a leading 'r' or 'R' character if there is one. 1010 Handles the register aliases PC and SP. */ 1011 1012 static signed int 1013 check_reg (char * t) 1014 { 1015 signed int val; 1016 1017 if (t == NULL) 1018 return -1; 1019 1020 if (*t == 'r' || *t == 'R') 1021 ++t; 1022 1023 if (strncasecmp (t, "pc", 2) == 0) 1024 return 0; 1025 1026 if (strncasecmp (t, "sp", 2) == 0) 1027 return 1; 1028 1029 if (strncasecmp (t, "sr", 2) == 0) 1030 return 2; 1031 1032 if (*t == '0') 1033 return 0; 1034 1035 val = atoi (t); 1036 1037 if (val < 1 || val > 15) 1038 return -1; 1039 1040 return val; 1041 } 1042 1043 static int 1044 msp430_srcoperand (struct msp430_operand_s * op, 1045 char * l, 1046 int bin, 1047 bfd_boolean * imm_op, 1048 bfd_boolean allow_20bit_values, 1049 bfd_boolean constants_allowed) 1050 { 1051 char *__tl = l; 1052 1053 /* Check if an immediate #VALUE. The hash sign should be only at the beginning! */ 1054 if (*l == '#') 1055 { 1056 char *h = l; 1057 int vshift = -1; 1058 int rval = 0; 1059 1060 /* Check if there is: 1061 llo(x) - least significant 16 bits, x &= 0xffff 1062 lhi(x) - x = (x >> 16) & 0xffff, 1063 hlo(x) - x = (x >> 32) & 0xffff, 1064 hhi(x) - x = (x >> 48) & 0xffff 1065 The value _MUST_ be constant expression: #hlo(1231231231). */ 1066 1067 *imm_op = TRUE; 1068 1069 if (strncasecmp (h, "#llo(", 5) == 0) 1070 { 1071 vshift = 0; 1072 rval = 3; 1073 } 1074 else if (strncasecmp (h, "#lhi(", 5) == 0) 1075 { 1076 vshift = 1; 1077 rval = 3; 1078 } 1079 else if (strncasecmp (h, "#hlo(", 5) == 0) 1080 { 1081 vshift = 2; 1082 rval = 3; 1083 } 1084 else if (strncasecmp (h, "#hhi(", 5) == 0) 1085 { 1086 vshift = 3; 1087 rval = 3; 1088 } 1089 else if (strncasecmp (h, "#lo(", 4) == 0) 1090 { 1091 vshift = 0; 1092 rval = 2; 1093 } 1094 else if (strncasecmp (h, "#hi(", 4) == 0) 1095 { 1096 vshift = 1; 1097 rval = 2; 1098 } 1099 1100 op->reg = 0; /* Reg PC. */ 1101 op->am = 3; 1102 op->ol = 1; /* Immediate will follow an instruction. */ 1103 __tl = h + 1 + rval; 1104 op->mode = OP_EXP; 1105 op->vshift = vshift; 1106 1107 parse_exp (__tl, &(op->exp)); 1108 if (op->exp.X_op == O_constant) 1109 { 1110 int x = op->exp.X_add_number; 1111 1112 if (vshift == 0) 1113 { 1114 x = x & 0xffff; 1115 op->exp.X_add_number = x; 1116 } 1117 else if (vshift == 1) 1118 { 1119 x = (x >> 16) & 0xffff; 1120 op->exp.X_add_number = x; 1121 op->vshift = 0; 1122 } 1123 else if (vshift > 1) 1124 { 1125 if (x < 0) 1126 op->exp.X_add_number = -1; 1127 else 1128 op->exp.X_add_number = 0; /* Nothing left. */ 1129 x = op->exp.X_add_number; 1130 op->vshift = 0; 1131 } 1132 1133 if (allow_20bit_values) 1134 { 1135 if (op->exp.X_add_number > 0xfffff || op->exp.X_add_number < -524288) 1136 { 1137 as_bad (_("value 0x%x out of extended range."), x); 1138 return 1; 1139 } 1140 } 1141 else if (op->exp.X_add_number > 65535 || op->exp.X_add_number < -32768) 1142 { 1143 as_bad (_("value %d out of range. Use #lo() or #hi()"), x); 1144 return 1; 1145 } 1146 1147 /* Now check constants. */ 1148 /* Substitute register mode with a constant generator if applicable. */ 1149 1150 if (!allow_20bit_values) 1151 x = (short) x; /* Extend sign. */ 1152 1153 if (! constants_allowed) 1154 ; 1155 else if (x == 0) 1156 { 1157 op->reg = 3; 1158 op->am = 0; 1159 op->ol = 0; 1160 op->mode = OP_REG; 1161 } 1162 else if (x == 1) 1163 { 1164 op->reg = 3; 1165 op->am = 1; 1166 op->ol = 0; 1167 op->mode = OP_REG; 1168 } 1169 else if (x == 2) 1170 { 1171 op->reg = 3; 1172 op->am = 2; 1173 op->ol = 0; 1174 op->mode = OP_REG; 1175 } 1176 else if (x == -1) 1177 { 1178 op->reg = 3; 1179 op->am = 3; 1180 op->ol = 0; 1181 op->mode = OP_REG; 1182 } 1183 else if (x == 4) 1184 { 1185 #ifdef PUSH_1X_WORKAROUND 1186 if (bin == 0x1200) 1187 { 1188 /* Remove warning as confusing. 1189 as_warn (_("Hardware push bug workaround")); */ 1190 } 1191 else 1192 #endif 1193 { 1194 op->reg = 2; 1195 op->am = 2; 1196 op->ol = 0; 1197 op->mode = OP_REG; 1198 } 1199 } 1200 else if (x == 8) 1201 { 1202 #ifdef PUSH_1X_WORKAROUND 1203 if (bin == 0x1200) 1204 { 1205 /* Remove warning as confusing. 1206 as_warn (_("Hardware push bug workaround")); */ 1207 } 1208 else 1209 #endif 1210 { 1211 op->reg = 2; 1212 op->am = 3; 1213 op->ol = 0; 1214 op->mode = OP_REG; 1215 } 1216 } 1217 } 1218 else if (op->exp.X_op == O_symbol) 1219 { 1220 if (vshift > 1) 1221 as_bad (_("error: unsupported #foo() directive used on symbol")); 1222 op->mode = OP_EXP; 1223 } 1224 else if (op->exp.X_op == O_big) 1225 { 1226 short x; 1227 1228 if (vshift != -1) 1229 { 1230 op->exp.X_op = O_constant; 1231 op->exp.X_add_number = 0xffff & generic_bignum[vshift]; 1232 x = op->exp.X_add_number; 1233 op->vshift = 0; 1234 } 1235 else 1236 { 1237 as_bad (_ 1238 ("unknown expression in operand %s. use #llo() #lhi() #hlo() #hhi() "), 1239 l); 1240 return 1; 1241 } 1242 1243 if (x == 0) 1244 { 1245 op->reg = 3; 1246 op->am = 0; 1247 op->ol = 0; 1248 op->mode = OP_REG; 1249 } 1250 else if (x == 1) 1251 { 1252 op->reg = 3; 1253 op->am = 1; 1254 op->ol = 0; 1255 op->mode = OP_REG; 1256 } 1257 else if (x == 2) 1258 { 1259 op->reg = 3; 1260 op->am = 2; 1261 op->ol = 0; 1262 op->mode = OP_REG; 1263 } 1264 else if (x == -1) 1265 { 1266 op->reg = 3; 1267 op->am = 3; 1268 op->ol = 0; 1269 op->mode = OP_REG; 1270 } 1271 else if (x == 4) 1272 { 1273 op->reg = 2; 1274 op->am = 2; 1275 op->ol = 0; 1276 op->mode = OP_REG; 1277 } 1278 else if (x == 8) 1279 { 1280 op->reg = 2; 1281 op->am = 3; 1282 op->ol = 0; 1283 op->mode = OP_REG; 1284 } 1285 } 1286 /* Redundant (yet) check. */ 1287 else if (op->exp.X_op == O_register) 1288 as_bad 1289 (_("Registers cannot be used within immediate expression [%s]"), l); 1290 else 1291 as_bad (_("unknown operand %s"), l); 1292 1293 return 0; 1294 } 1295 1296 /* Check if absolute &VALUE (assume that we can construct something like ((a&b)<<7 + 25). */ 1297 if (*l == '&') 1298 { 1299 char *h = l; 1300 1301 op->reg = 2; /* reg 2 in absolute addr mode. */ 1302 op->am = 1; /* mode As == 01 bin. */ 1303 op->ol = 1; /* Immediate value followed by instruction. */ 1304 __tl = h + 1; 1305 parse_exp (__tl, &(op->exp)); 1306 op->mode = OP_EXP; 1307 op->vshift = 0; 1308 if (op->exp.X_op == O_constant) 1309 { 1310 int x = op->exp.X_add_number; 1311 1312 if (allow_20bit_values) 1313 { 1314 if (x > 0xfffff || x < -(0x7ffff)) 1315 { 1316 as_bad (_("value 0x%x out of extended range."), x); 1317 return 1; 1318 } 1319 } 1320 else if (x > 65535 || x < -32768) 1321 { 1322 as_bad (_("value out of range: 0x%x"), x); 1323 return 1; 1324 } 1325 } 1326 else if (op->exp.X_op == O_symbol) 1327 ; 1328 else 1329 { 1330 /* Redundant (yet) check. */ 1331 if (op->exp.X_op == O_register) 1332 as_bad 1333 (_("Registers cannot be used within absolute expression [%s]"), l); 1334 else 1335 as_bad (_("unknown expression in operand %s"), l); 1336 return 1; 1337 } 1338 return 0; 1339 } 1340 1341 /* Check if indirect register mode @Rn / postincrement @Rn+. */ 1342 if (*l == '@') 1343 { 1344 char *t = l; 1345 char *m = strchr (l, '+'); 1346 1347 if (t != l) 1348 { 1349 as_bad (_("unknown addressing mode %s"), l); 1350 return 1; 1351 } 1352 1353 t++; 1354 1355 if ((op->reg = check_reg (t)) == -1) 1356 { 1357 as_bad (_("Bad register name %s"), t); 1358 return 1; 1359 } 1360 1361 op->mode = OP_REG; 1362 op->am = m ? 3 : 2; 1363 op->ol = 0; 1364 1365 /* PC cannot be used in indirect addressing. */ 1366 if (target_is_430xv2 () && op->reg == 0) 1367 { 1368 as_bad (_("cannot use indirect addressing with the PC")); 1369 return 1; 1370 } 1371 1372 return 0; 1373 } 1374 1375 /* Check if register indexed X(Rn). */ 1376 do 1377 { 1378 char *h = strrchr (l, '('); 1379 char *m = strrchr (l, ')'); 1380 char *t; 1381 1382 *imm_op = TRUE; 1383 1384 if (!h) 1385 break; 1386 if (!m) 1387 { 1388 as_bad (_("')' required")); 1389 return 1; 1390 } 1391 1392 t = h; 1393 op->am = 1; 1394 op->ol = 1; 1395 1396 /* Extract a register. */ 1397 if ((op->reg = check_reg (t + 1)) == -1) 1398 { 1399 as_bad (_ 1400 ("unknown operator %s. Did you mean X(Rn) or #[hl][hl][oi](CONST) ?"), 1401 l); 1402 return 1; 1403 } 1404 1405 if (op->reg == 2) 1406 { 1407 as_bad (_("r2 should not be used in indexed addressing mode")); 1408 return 1; 1409 } 1410 1411 /* Extract constant. */ 1412 __tl = l; 1413 *h = 0; 1414 op->mode = OP_EXP; 1415 op->vshift = 0; 1416 parse_exp (__tl, &(op->exp)); 1417 if (op->exp.X_op == O_constant) 1418 { 1419 int x = op->exp.X_add_number; 1420 1421 if (allow_20bit_values) 1422 { 1423 if (x > 0xfffff || x < - (0x7ffff)) 1424 { 1425 as_bad (_("value 0x%x out of extended range."), x); 1426 return 1; 1427 } 1428 } 1429 else if (x > 65535 || x < -32768) 1430 { 1431 as_bad (_("value out of range: 0x%x"), x); 1432 return 1; 1433 } 1434 1435 if (x == 0) 1436 { 1437 op->mode = OP_REG; 1438 op->am = 2; 1439 op->ol = 0; 1440 return 0; 1441 } 1442 } 1443 else if (op->exp.X_op == O_symbol) 1444 ; 1445 else 1446 { 1447 /* Redundant (yet) check. */ 1448 if (op->exp.X_op == O_register) 1449 as_bad 1450 (_("Registers cannot be used as a prefix of indexed expression [%s]"), l); 1451 else 1452 as_bad (_("unknown expression in operand %s"), l); 1453 return 1; 1454 } 1455 1456 return 0; 1457 } 1458 while (0); 1459 1460 /* Possibly register mode 'mov r1,r2'. */ 1461 if ((op->reg = check_reg (l)) != -1) 1462 { 1463 op->mode = OP_REG; 1464 op->am = 0; 1465 op->ol = 0; 1466 return 0; 1467 } 1468 1469 /* Symbolic mode 'mov a, b' == 'mov x(pc), y(pc)'. */ 1470 do 1471 { 1472 op->mode = OP_EXP; 1473 op->reg = 0; /* PC relative... be careful. */ 1474 /* An expression starting with a minus sign is a constant, not an address. */ 1475 op->am = (*l == '-' ? 3 : 1); 1476 op->ol = 1; 1477 op->vshift = 0; 1478 __tl = l; 1479 parse_exp (__tl, &(op->exp)); 1480 return 0; 1481 } 1482 while (0); 1483 1484 /* Unreachable. */ 1485 as_bad (_("unknown addressing mode for operand %s"), l); 1486 return 1; 1487 } 1488 1489 1490 static int 1491 msp430_dstoperand (struct msp430_operand_s * op, 1492 char * l, 1493 int bin, 1494 bfd_boolean allow_20bit_values, 1495 bfd_boolean constants_allowed) 1496 { 1497 int dummy; 1498 int ret = msp430_srcoperand (op, l, bin, & dummy, 1499 allow_20bit_values, 1500 constants_allowed); 1501 1502 if (ret) 1503 return ret; 1504 1505 if (op->am == 2) 1506 { 1507 char *__tl = "0"; 1508 1509 op->mode = OP_EXP; 1510 op->am = 1; 1511 op->ol = 1; 1512 op->vshift = 0; 1513 parse_exp (__tl, &(op->exp)); 1514 1515 if (op->exp.X_op != O_constant || op->exp.X_add_number != 0) 1516 { 1517 as_bad (_("Internal bug. Try to use 0(r%d) instead of @r%d"), 1518 op->reg, op->reg); 1519 return 1; 1520 } 1521 return 0; 1522 } 1523 1524 if (op->am > 1) 1525 { 1526 as_bad (_ 1527 ("this addressing mode is not applicable for destination operand")); 1528 return 1; 1529 } 1530 return 0; 1531 } 1532 1533 /* Attempt to encode a MOVA instruction with the given operands. 1534 Returns the length of the encoded instruction if successful 1535 or 0 upon failure. If the encoding fails, an error message 1536 will be returned if a pointer is provided. */ 1537 1538 static int 1539 try_encode_mova (bfd_boolean imm_op, 1540 int bin, 1541 struct msp430_operand_s * op1, 1542 struct msp430_operand_s * op2, 1543 const char ** error_message_return) 1544 { 1545 short ZEROS = 0; 1546 char *frag; 1547 int where; 1548 1549 /* Only a restricted subset of the normal MSP430 addressing modes 1550 are supported here, so check for the ones that are allowed. */ 1551 if (imm_op) 1552 { 1553 if (op1->mode == OP_EXP) 1554 { 1555 if (op2->mode != OP_REG) 1556 { 1557 if (error_message_return != NULL) 1558 * error_message_return = _("expected register as second argument of %s"); 1559 return 0; 1560 } 1561 1562 if (op1->am == 3) 1563 { 1564 /* MOVA #imm20, Rdst. */ 1565 bin |= 0x80 | op2->reg; 1566 frag = frag_more (4); 1567 where = frag - frag_now->fr_literal; 1568 if (op1->exp.X_op == O_constant) 1569 { 1570 bin |= ((op1->exp.X_add_number >> 16) & 0xf) << 8; 1571 bfd_putl16 ((bfd_vma) bin, frag); 1572 bfd_putl16 (op1->exp.X_add_number & 0xffff, frag + 2); 1573 } 1574 else 1575 { 1576 bfd_putl16 ((bfd_vma) bin, frag); 1577 fix_new_exp (frag_now, where, 4, &(op1->exp), FALSE, 1578 BFD_RELOC_MSP430X_ABS20_ADR_SRC); 1579 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 1580 } 1581 1582 return 4; 1583 } 1584 else if (op1->am == 1) 1585 { 1586 /* MOVA z16(Rsrc), Rdst. */ 1587 bin |= 0x30 | (op1->reg << 8) | op2->reg; 1588 frag = frag_more (4); 1589 where = frag - frag_now->fr_literal; 1590 bfd_putl16 ((bfd_vma) bin, frag); 1591 if (op1->exp.X_op == O_constant) 1592 { 1593 if (op1->exp.X_add_number > 0xffff 1594 || op1->exp.X_add_number < -(0x7fff)) 1595 { 1596 if (error_message_return != NULL) 1597 * error_message_return = _("index value too big for %s"); 1598 return 0; 1599 } 1600 bfd_putl16 (op1->exp.X_add_number & 0xffff, frag + 2); 1601 } 1602 else 1603 { 1604 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 1605 fix_new_exp (frag_now, where + 2, 2, &(op1->exp), FALSE, 1606 op1->reg == 0 ? 1607 BFD_RELOC_MSP430X_PCR16 : 1608 BFD_RELOC_MSP430X_ABS16); 1609 } 1610 return 4; 1611 } 1612 1613 if (error_message_return != NULL) 1614 * error_message_return = _("unexpected addressing mode for %s"); 1615 return 0; 1616 } 1617 else if (op1->am == 0) 1618 { 1619 /* MOVA Rsrc, ... */ 1620 if (op2->mode == OP_REG) 1621 { 1622 bin |= 0xc0 | (op1->reg << 8) | op2->reg; 1623 frag = frag_more (2); 1624 where = frag - frag_now->fr_literal; 1625 bfd_putl16 ((bfd_vma) bin, frag); 1626 return 2; 1627 } 1628 else if (op2->am == 1) 1629 { 1630 if (op2->reg == 2) 1631 { 1632 /* MOVA Rsrc, &abs20. */ 1633 bin |= 0x60 | (op1->reg << 8); 1634 frag = frag_more (4); 1635 where = frag - frag_now->fr_literal; 1636 if (op2->exp.X_op == O_constant) 1637 { 1638 bin |= (op2->exp.X_add_number >> 16) & 0xf; 1639 bfd_putl16 ((bfd_vma) bin, frag); 1640 bfd_putl16 (op2->exp.X_add_number & 0xffff, frag + 2); 1641 } 1642 else 1643 { 1644 bfd_putl16 ((bfd_vma) bin, frag); 1645 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 1646 fix_new_exp (frag_now, where, 4, &(op2->exp), FALSE, 1647 BFD_RELOC_MSP430X_ABS20_ADR_DST); 1648 } 1649 return 4; 1650 } 1651 1652 /* MOVA Rsrc, z16(Rdst). */ 1653 bin |= 0x70 | (op1->reg << 8) | op2->reg; 1654 frag = frag_more (4); 1655 where = frag - frag_now->fr_literal; 1656 bfd_putl16 ((bfd_vma) bin, frag); 1657 if (op2->exp.X_op == O_constant) 1658 { 1659 if (op2->exp.X_add_number > 0xffff 1660 || op2->exp.X_add_number < -(0x7fff)) 1661 { 1662 if (error_message_return != NULL) 1663 * error_message_return = _("index value too big for %s"); 1664 return 0; 1665 } 1666 bfd_putl16 (op2->exp.X_add_number & 0xffff, frag + 2); 1667 } 1668 else 1669 { 1670 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 1671 fix_new_exp (frag_now, where + 2, 2, &(op2->exp), FALSE, 1672 op2->reg == 0 ? 1673 BFD_RELOC_MSP430X_PCR16 : 1674 BFD_RELOC_MSP430X_ABS16); 1675 } 1676 return 4; 1677 } 1678 1679 if (error_message_return != NULL) 1680 * error_message_return = _("unexpected addressing mode for %s"); 1681 return 0; 1682 } 1683 } 1684 1685 /* imm_op == FALSE. */ 1686 1687 if (op1->reg == 2 && op1->am == 1 && op1->mode == OP_EXP) 1688 { 1689 /* MOVA &abs20, Rdst. */ 1690 if (op2->mode != OP_REG) 1691 { 1692 if (error_message_return != NULL) 1693 * error_message_return = _("expected register as second argument of %s"); 1694 return 0; 1695 } 1696 1697 if (op2->reg == 2 || op2->reg == 3) 1698 { 1699 if (error_message_return != NULL) 1700 * error_message_return = _("constant generator destination register found in %s"); 1701 return 0; 1702 } 1703 1704 bin |= 0x20 | op2->reg; 1705 frag = frag_more (4); 1706 where = frag - frag_now->fr_literal; 1707 if (op1->exp.X_op == O_constant) 1708 { 1709 bin |= ((op1->exp.X_add_number >> 16) & 0xf) << 8; 1710 bfd_putl16 ((bfd_vma) bin, frag); 1711 bfd_putl16 (op1->exp.X_add_number & 0xffff, frag + 2); 1712 } 1713 else 1714 { 1715 bfd_putl16 ((bfd_vma) bin, frag); 1716 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 1717 fix_new_exp (frag_now, where, 4, &(op1->exp), FALSE, 1718 BFD_RELOC_MSP430X_ABS20_ADR_SRC); 1719 } 1720 return 4; 1721 } 1722 else if (op1->mode == OP_REG) 1723 { 1724 if (op1->am == 3) 1725 { 1726 /* MOVA @Rsrc+, Rdst. */ 1727 if (op2->mode != OP_REG) 1728 { 1729 if (error_message_return != NULL) 1730 * error_message_return = _("expected register as second argument of %s"); 1731 return 0; 1732 } 1733 1734 if (op2->reg == 2 || op2->reg == 3) 1735 { 1736 if (error_message_return != NULL) 1737 * error_message_return = _("constant generator destination register found in %s"); 1738 return 0; 1739 } 1740 1741 if (op1->reg == 2 || op1->reg == 3) 1742 { 1743 if (error_message_return != NULL) 1744 * error_message_return = _("constant generator source register found in %s"); 1745 return 0; 1746 } 1747 1748 bin |= 0x10 | (op1->reg << 8) | op2->reg; 1749 frag = frag_more (2); 1750 where = frag - frag_now->fr_literal; 1751 bfd_putl16 ((bfd_vma) bin, frag); 1752 return 2; 1753 } 1754 else if (op1->am == 2) 1755 { 1756 /* MOVA @Rsrc,Rdst */ 1757 if (op2->mode != OP_REG) 1758 { 1759 if (error_message_return != NULL) 1760 * error_message_return = _("expected register as second argument of %s"); 1761 return 0; 1762 } 1763 1764 if (op2->reg == 2 || op2->reg == 3) 1765 { 1766 if (error_message_return != NULL) 1767 * error_message_return = _("constant generator destination register found in %s"); 1768 return 0; 1769 } 1770 1771 if (op1->reg == 2 || op1->reg == 3) 1772 { 1773 if (error_message_return != NULL) 1774 * error_message_return = _("constant generator source register found in %s"); 1775 return 0; 1776 } 1777 1778 bin |= (op1->reg << 8) | op2->reg; 1779 frag = frag_more (2); 1780 where = frag - frag_now->fr_literal; 1781 bfd_putl16 ((bfd_vma) bin, frag); 1782 return 2; 1783 } 1784 } 1785 1786 if (error_message_return != NULL) 1787 * error_message_return = _("unexpected addressing mode for %s"); 1788 1789 return 0; 1790 } 1791 1792 static bfd_boolean check_for_nop = FALSE; 1793 1794 #define is_opcode(NAME) (strcmp (opcode->name, NAME) == 0) 1795 1796 /* Parse instruction operands. 1797 Return binary opcode. */ 1798 1799 static unsigned int 1800 msp430_operands (struct msp430_opcode_s * opcode, char * line) 1801 { 1802 int bin = opcode->bin_opcode; /* Opcode mask. */ 1803 int insn_length = 0; 1804 char l1[MAX_OP_LEN], l2[MAX_OP_LEN]; 1805 char *frag; 1806 int where; 1807 struct msp430_operand_s op1, op2; 1808 int res = 0; 1809 static short ZEROS = 0; 1810 bfd_boolean byte_op, imm_op; 1811 int op_length = 0; 1812 int fmt; 1813 int extended = 0x1800; 1814 bfd_boolean extended_op = FALSE; 1815 bfd_boolean addr_op; 1816 const char * error_message; 1817 static signed int repeat_count = 0; 1818 bfd_boolean fix_emitted; 1819 bfd_boolean nop_check_needed = FALSE; 1820 1821 /* Opcode is the one from opcodes table 1822 line contains something like 1823 [.w] @r2+, 5(R1) 1824 or 1825 .b @r2+, 5(R1). */ 1826 1827 byte_op = FALSE; 1828 addr_op = FALSE; 1829 if (*line == '.') 1830 { 1831 bfd_boolean check = FALSE; 1832 ++ line; 1833 1834 switch (TOLOWER (* line)) 1835 { 1836 case 'b': 1837 /* Byte operation. */ 1838 bin |= BYTE_OPERATION; 1839 byte_op = TRUE; 1840 check = TRUE; 1841 break; 1842 1843 case 'a': 1844 /* "Address" ops work on 20-bit values. */ 1845 addr_op = TRUE; 1846 bin |= BYTE_OPERATION; 1847 check = TRUE; 1848 break; 1849 1850 case 'w': 1851 /* Word operation - this is the default. */ 1852 check = TRUE; 1853 break; 1854 1855 case 0: 1856 case ' ': 1857 case '\n': 1858 case '\r': 1859 as_warn (_("no size modifier after period, .w assumed")); 1860 break; 1861 1862 default: 1863 as_bad (_("unrecognised instruction size modifier .%c"), 1864 * line); 1865 return 0; 1866 } 1867 1868 if (check) 1869 { 1870 ++ line; 1871 1872 } 1873 } 1874 1875 if (*line && ! ISSPACE (*line)) 1876 { 1877 as_bad (_("junk found after instruction: %s.%s"), 1878 opcode->name, line); 1879 return 0; 1880 } 1881 1882 /* Catch the case where the programmer has used a ".a" size modifier on an 1883 instruction that does not support it. Look for an alternative extended 1884 instruction that has the same name without the period. Eg: "add.a" 1885 becomes "adda". Although this not an officially supported way of 1886 specifing instruction aliases other MSP430 assemblers allow it. So we 1887 support it for compatibility purposes. */ 1888 if (addr_op && opcode->fmt >= 0) 1889 { 1890 char * old_name = opcode->name; 1891 char real_name[32]; 1892 1893 sprintf (real_name, "%sa", old_name); 1894 opcode = hash_find (msp430_hash, real_name); 1895 if (opcode == NULL) 1896 { 1897 as_bad (_("instruction %s.a does not exist"), old_name); 1898 return 0; 1899 } 1900 #if 0 /* Enable for debugging. */ 1901 as_warn ("treating %s.a as %s", old_name, real_name); 1902 #endif 1903 addr_op = FALSE; 1904 bin = opcode->bin_opcode; 1905 } 1906 1907 if (opcode->fmt != -1 1908 && opcode->insn_opnumb 1909 && (!*line || *line == '\n')) 1910 { 1911 as_bad (_("instruction %s requires %d operand(s)"), 1912 opcode->name, opcode->insn_opnumb); 1913 return 0; 1914 } 1915 1916 memset (l1, 0, sizeof (l1)); 1917 memset (l2, 0, sizeof (l2)); 1918 memset (&op1, 0, sizeof (op1)); 1919 memset (&op2, 0, sizeof (op2)); 1920 1921 imm_op = FALSE; 1922 1923 if ((fmt = opcode->fmt) < 0) 1924 { 1925 if (! target_is_430x ()) 1926 { 1927 as_bad (_("instruction %s requires MSP430X mcu"), 1928 opcode->name); 1929 return 0; 1930 } 1931 1932 fmt = (-fmt) - 1; 1933 extended_op = TRUE; 1934 } 1935 1936 if (repeat_count) 1937 { 1938 /* If requested set the extended instruction repeat count. */ 1939 if (extended_op) 1940 { 1941 if (repeat_count > 0) 1942 extended |= (repeat_count - 1); 1943 else 1944 extended |= (1 << 7) | (- repeat_count); 1945 } 1946 else 1947 as_bad (_("unable to repeat %s insn"), opcode->name); 1948 1949 repeat_count = 0; 1950 } 1951 1952 if (check_for_nop && is_opcode ("nop")) 1953 check_for_nop = FALSE; 1954 1955 switch (fmt) 1956 { 1957 case 0: /* Emulated. */ 1958 switch (opcode->insn_opnumb) 1959 { 1960 case 0: 1961 if (is_opcode ("eint") || is_opcode ("dint")) 1962 { 1963 if (check_for_nop) 1964 { 1965 if (warn_interrupt_nops) 1966 { 1967 if (gen_interrupt_nops) 1968 as_warn (_("NOP inserted between two instructions that change interrupt state")); 1969 else 1970 as_warn (_("a NOP might be needed here because of successive changes in interrupt state")); 1971 } 1972 1973 if (gen_interrupt_nops) 1974 { 1975 /* Emit a NOP between interrupt enable/disable. 1976 See 1.3.4.1 of the MSP430x5xx User Guide. */ 1977 insn_length += 2; 1978 frag = frag_more (2); 1979 bfd_putl16 ((bfd_vma) 0x4303 /* NOP */, frag); 1980 } 1981 } 1982 1983 nop_check_needed = TRUE; 1984 } 1985 1986 /* Set/clear bits instructions. */ 1987 if (extended_op) 1988 { 1989 if (!addr_op) 1990 extended |= BYTE_OPERATION; 1991 1992 /* Emit the extension word. */ 1993 insn_length += 2; 1994 frag = frag_more (2); 1995 bfd_putl16 (extended, frag); 1996 } 1997 1998 insn_length += 2; 1999 frag = frag_more (2); 2000 bfd_putl16 ((bfd_vma) bin, frag); 2001 dwarf2_emit_insn (insn_length); 2002 break; 2003 2004 case 1: 2005 /* Something which works with destination operand. */ 2006 line = extract_operand (line, l1, sizeof (l1)); 2007 res = msp430_dstoperand (&op1, l1, opcode->bin_opcode, extended_op, TRUE); 2008 if (res) 2009 break; 2010 2011 bin |= (op1.reg | (op1.am << 7)); 2012 2013 if (is_opcode ("clr") && bin == 0x4302 /* CLR R2*/) 2014 { 2015 if (check_for_nop) 2016 { 2017 if (warn_interrupt_nops) 2018 { 2019 if (gen_interrupt_nops) 2020 as_warn (_("NOP inserted between two instructions that change interrupt state")); 2021 else 2022 as_warn (_("a NOP might be needed here because of successive changes in interrupt state")); 2023 } 2024 2025 if (gen_interrupt_nops) 2026 { 2027 /* Emit a NOP between interrupt enable/disable. 2028 See 1.3.4.1 of the MSP430x5xx User Guide. */ 2029 insn_length += 2; 2030 frag = frag_more (2); 2031 bfd_putl16 ((bfd_vma) 0x4303 /* NOP */, frag); 2032 } 2033 } 2034 2035 nop_check_needed = TRUE; 2036 } 2037 2038 /* Compute the entire instruction length, in bytes. */ 2039 op_length = (extended_op ? 2 : 0) + 2 + (op1.ol * 2); 2040 insn_length += op_length; 2041 frag = frag_more (op_length); 2042 where = frag - frag_now->fr_literal; 2043 2044 if (extended_op) 2045 { 2046 if (!addr_op) 2047 extended |= BYTE_OPERATION; 2048 2049 if (op1.ol != 0 && ((extended & 0xf) != 0)) 2050 { 2051 as_bad (_("repeat instruction used with non-register mode instruction")); 2052 extended &= ~ 0xf; 2053 } 2054 2055 if (op1.mode == OP_EXP) 2056 { 2057 if (op1.exp.X_op == O_constant) 2058 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7; 2059 2060 else if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2061 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2062 BFD_RELOC_MSP430X_ABS20_EXT_SRC); 2063 else 2064 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2065 BFD_RELOC_MSP430X_PCR20_EXT_SRC); 2066 } 2067 2068 /* Emit the extension word. */ 2069 bfd_putl16 (extended, frag); 2070 frag += 2; 2071 where += 2; 2072 } 2073 2074 bfd_putl16 ((bfd_vma) bin, frag); 2075 frag += 2; 2076 where += 2; 2077 2078 if (op1.mode == OP_EXP) 2079 { 2080 if (op1.exp.X_op == O_constant) 2081 { 2082 bfd_putl16 (op1.exp.X_add_number & 0xffff, frag); 2083 } 2084 else 2085 { 2086 bfd_putl16 ((bfd_vma) ZEROS, frag); 2087 2088 if (!extended_op) 2089 { 2090 if (op1.reg) 2091 fix_new_exp (frag_now, where, 2, 2092 &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1)); 2093 else 2094 fix_new_exp (frag_now, where, 2, 2095 &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2096 } 2097 } 2098 } 2099 2100 dwarf2_emit_insn (insn_length); 2101 break; 2102 2103 case 2: 2104 /* Shift instruction. */ 2105 line = extract_operand (line, l1, sizeof (l1)); 2106 strncpy (l2, l1, sizeof (l2)); 2107 l2[sizeof (l2) - 1] = '\0'; 2108 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op, extended_op, TRUE); 2109 res += msp430_dstoperand (&op2, l2, opcode->bin_opcode, extended_op, TRUE); 2110 2111 if (res) 2112 break; /* An error occurred. All warnings were done before. */ 2113 2114 insn_length = (extended_op ? 2 : 0) + 2 + (op1.ol * 2) + (op2.ol * 2); 2115 frag = frag_more (insn_length); 2116 where = frag - frag_now->fr_literal; 2117 2118 if (target_is_430xv2 () 2119 && op1.mode == OP_REG 2120 && op1.reg == 0 2121 && (is_opcode ("rlax") 2122 || is_opcode ("rlcx") 2123 || is_opcode ("rla") 2124 || is_opcode ("rlc"))) 2125 { 2126 as_bad (_("%s: attempt to rotate the PC register"), opcode->name); 2127 break; 2128 } 2129 2130 if (extended_op) 2131 { 2132 if (!addr_op) 2133 extended |= BYTE_OPERATION; 2134 2135 if ((op1.ol != 0 || op2.ol != 0) && ((extended & 0xf) != 0)) 2136 { 2137 as_bad (_("repeat instruction used with non-register mode instruction")); 2138 extended &= ~ 0xf; 2139 } 2140 2141 if (op1.mode == OP_EXP) 2142 { 2143 if (op1.exp.X_op == O_constant) 2144 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7; 2145 2146 else if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2147 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2148 BFD_RELOC_MSP430X_ABS20_EXT_SRC); 2149 else 2150 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2151 BFD_RELOC_MSP430X_PCR20_EXT_SRC); 2152 } 2153 2154 if (op2.mode == OP_EXP) 2155 { 2156 if (op2.exp.X_op == O_constant) 2157 extended |= (op2.exp.X_add_number >> 16) & 0xf; 2158 2159 else if (op1.mode == OP_EXP) 2160 fix_new_exp (frag_now, where, 8, &(op2.exp), FALSE, 2161 op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_ODST 2162 : BFD_RELOC_MSP430X_PCR20_EXT_ODST); 2163 else 2164 fix_new_exp (frag_now, where, 6, &(op2.exp), FALSE, 2165 op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_DST 2166 : BFD_RELOC_MSP430X_PCR20_EXT_DST); 2167 } 2168 2169 /* Emit the extension word. */ 2170 bfd_putl16 (extended, frag); 2171 frag += 2; 2172 where += 2; 2173 } 2174 2175 bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7)); 2176 bfd_putl16 ((bfd_vma) bin, frag); 2177 frag += 2; 2178 where += 2; 2179 2180 if (op1.mode == OP_EXP) 2181 { 2182 if (op1.exp.X_op == O_constant) 2183 { 2184 bfd_putl16 (op1.exp.X_add_number & 0xffff, frag); 2185 } 2186 else 2187 { 2188 bfd_putl16 ((bfd_vma) ZEROS, frag); 2189 2190 if (!extended_op) 2191 { 2192 if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2193 fix_new_exp (frag_now, where, 2, 2194 &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1)); 2195 else 2196 fix_new_exp (frag_now, where, 2, 2197 &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2198 } 2199 } 2200 frag += 2; 2201 where += 2; 2202 } 2203 2204 if (op2.mode == OP_EXP) 2205 { 2206 if (op2.exp.X_op == O_constant) 2207 { 2208 bfd_putl16 (op2.exp.X_add_number & 0xffff, frag); 2209 } 2210 else 2211 { 2212 bfd_putl16 ((bfd_vma) ZEROS, frag); 2213 2214 if (!extended_op) 2215 { 2216 if (op2.reg) /* Not PC relative. */ 2217 fix_new_exp (frag_now, where, 2, 2218 &(op2.exp), FALSE, CHECK_RELOC_MSP430 (op2)); 2219 else 2220 fix_new_exp (frag_now, where, 2, 2221 &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2222 } 2223 } 2224 } 2225 2226 dwarf2_emit_insn (insn_length); 2227 break; 2228 2229 case 3: 2230 /* Branch instruction => mov dst, r0. */ 2231 if (extended_op) 2232 { 2233 as_bad ("Internal error: state 0/3 not coded for extended instructions"); 2234 break; 2235 } 2236 2237 line = extract_operand (line, l1, sizeof (l1)); 2238 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op, extended_op, FALSE); 2239 if (res) 2240 break; 2241 2242 byte_op = FALSE; 2243 imm_op = FALSE; 2244 bin |= ((op1.reg << 8) | (op1.am << 4)); 2245 op_length = 2 + 2 * op1.ol; 2246 frag = frag_more (op_length); 2247 where = frag - frag_now->fr_literal; 2248 bfd_putl16 ((bfd_vma) bin, frag); 2249 2250 if (op1.mode == OP_EXP) 2251 { 2252 if (op1.exp.X_op == O_constant) 2253 { 2254 bfd_putl16 (op1.exp.X_add_number & 0xffff, frag + 2); 2255 } 2256 else 2257 { 2258 where += 2; 2259 2260 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 2261 2262 if (op1.reg || (op1.reg == 0 && op1.am == 3)) 2263 fix_new_exp (frag_now, where, 2, 2264 &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1)); 2265 else 2266 fix_new_exp (frag_now, where, 2, 2267 &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2268 } 2269 } 2270 2271 dwarf2_emit_insn (insn_length + op_length); 2272 break; 2273 2274 case 4: 2275 /* CALLA instructions. */ 2276 fix_emitted = FALSE; 2277 2278 line = extract_operand (line, l1, sizeof (l1)); 2279 imm_op = FALSE; 2280 2281 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op, 2282 extended_op, FALSE); 2283 if (res) 2284 break; 2285 2286 byte_op = FALSE; 2287 2288 op_length = 2 + 2 * op1.ol; 2289 frag = frag_more (op_length); 2290 where = frag - frag_now->fr_literal; 2291 2292 if (imm_op) 2293 { 2294 if (op1.am == 3) 2295 { 2296 bin |= 0xb0; 2297 2298 fix_new_exp (frag_now, where, 4, &(op1.exp), FALSE, 2299 BFD_RELOC_MSP430X_ABS20_ADR_DST); 2300 fix_emitted = TRUE; 2301 } 2302 else if (op1.am == 1) 2303 { 2304 if (op1.reg == 0) 2305 { 2306 bin |= 0x90; 2307 2308 fix_new_exp (frag_now, where, 4, &(op1.exp), FALSE, 2309 BFD_RELOC_MSP430X_PCR20_CALL); 2310 fix_emitted = TRUE; 2311 } 2312 else 2313 bin |= 0x50 | op1.reg; 2314 } 2315 else if (op1.am == 0) 2316 bin |= 0x40 | op1.reg; 2317 } 2318 else if (op1.am == 1) 2319 { 2320 bin |= 0x80; 2321 2322 fix_new_exp (frag_now, where, 4, &(op1.exp), FALSE, 2323 BFD_RELOC_MSP430X_ABS20_ADR_DST); 2324 fix_emitted = TRUE; 2325 } 2326 else if (op1.am == 2) 2327 bin |= 0x60 | op1.reg; 2328 else if (op1.am == 3) 2329 bin |= 0x70 | op1.reg; 2330 2331 bfd_putl16 ((bfd_vma) bin, frag); 2332 2333 if (op1.mode == OP_EXP) 2334 { 2335 if (op1.ol != 1) 2336 { 2337 as_bad ("Internal error: unexpected CALLA instruction length: %d\n", op1.ol); 2338 break; 2339 } 2340 2341 bfd_putl16 ((bfd_vma) ZEROS, frag + 2); 2342 2343 if (! fix_emitted) 2344 fix_new_exp (frag_now, where + 2, 2, 2345 &(op1.exp), FALSE, BFD_RELOC_16); 2346 } 2347 2348 dwarf2_emit_insn (insn_length + op_length); 2349 break; 2350 2351 case 5: 2352 { 2353 int n; 2354 int reg; 2355 2356 /* [POP|PUSH]M[.A] #N, Rd */ 2357 line = extract_operand (line, l1, sizeof (l1)); 2358 line = extract_operand (line, l2, sizeof (l2)); 2359 2360 if (*l1 != '#') 2361 { 2362 as_bad (_("expected #n as first argument of %s"), opcode->name); 2363 break; 2364 } 2365 parse_exp (l1 + 1, &(op1.exp)); 2366 if (op1.exp.X_op != O_constant) 2367 { 2368 as_bad (_("expected constant expression for first argument of %s"), 2369 opcode->name); 2370 break; 2371 } 2372 2373 if ((reg = check_reg (l2)) == -1) 2374 { 2375 as_bad (_("expected register as second argument of %s"), 2376 opcode->name); 2377 break; 2378 } 2379 2380 op_length = 2; 2381 frag = frag_more (op_length); 2382 where = frag - frag_now->fr_literal; 2383 bin = opcode->bin_opcode; 2384 if (! addr_op) 2385 bin |= 0x100; 2386 n = op1.exp.X_add_number; 2387 bin |= (n - 1) << 4; 2388 if (is_opcode ("pushm")) 2389 bin |= reg; 2390 else 2391 { 2392 if (reg - n + 1 < 0) 2393 { 2394 as_bad (_("Too many registers popped")); 2395 break; 2396 } 2397 2398 /* CPU21 errata: cannot use POPM to restore the SR register. */ 2399 if (target_is_430xv2 () 2400 && (reg - n + 1 < 3) 2401 && reg >= 2 2402 && is_opcode ("popm")) 2403 { 2404 as_bad (_("Cannot use POPM to restore the SR register")); 2405 break; 2406 } 2407 2408 bin |= (reg - n + 1); 2409 } 2410 2411 bfd_putl16 ((bfd_vma) bin, frag); 2412 dwarf2_emit_insn (op_length); 2413 break; 2414 } 2415 2416 case 6: 2417 { 2418 int n; 2419 int reg; 2420 2421 /* Bit rotation instructions. RRCM, RRAM, RRUM, RLAM. */ 2422 if (extended & 0xff) 2423 { 2424 as_bad (_("repeat count cannot be used with %s"), opcode->name); 2425 break; 2426 } 2427 2428 line = extract_operand (line, l1, sizeof (l1)); 2429 line = extract_operand (line, l2, sizeof (l2)); 2430 2431 if (*l1 != '#') 2432 { 2433 as_bad (_("expected #n as first argument of %s"), opcode->name); 2434 break; 2435 } 2436 parse_exp (l1 + 1, &(op1.exp)); 2437 if (op1.exp.X_op != O_constant) 2438 { 2439 as_bad (_("expected constant expression for first argument of %s"), 2440 opcode->name); 2441 break; 2442 } 2443 n = op1.exp.X_add_number; 2444 if (n > 4 || n < 1) 2445 { 2446 as_bad (_("expected first argument of %s to be in the range 1-4"), 2447 opcode->name); 2448 break; 2449 } 2450 2451 if ((reg = check_reg (l2)) == -1) 2452 { 2453 as_bad (_("expected register as second argument of %s"), 2454 opcode->name); 2455 break; 2456 } 2457 2458 if (target_is_430xv2 () && reg == 0) 2459 { 2460 as_bad (_("%s: attempt to rotate the PC register"), opcode->name); 2461 break; 2462 } 2463 2464 op_length = 2; 2465 frag = frag_more (op_length); 2466 where = frag - frag_now->fr_literal; 2467 2468 bin = opcode->bin_opcode; 2469 if (! addr_op) 2470 bin |= 0x10; 2471 bin |= (n - 1) << 10; 2472 bin |= reg; 2473 2474 bfd_putl16 ((bfd_vma) bin, frag); 2475 dwarf2_emit_insn (op_length); 2476 break; 2477 } 2478 2479 case 7: 2480 { 2481 int reg; 2482 2483 /* RRUX: Synthetic unsigned right shift of a register by one bit. */ 2484 if (extended & 0xff) 2485 { 2486 as_bad (_("repeat count cannot be used with %s"), opcode->name); 2487 break; 2488 } 2489 2490 line = extract_operand (line, l1, sizeof (l1)); 2491 if ((reg = check_reg (l1)) == -1) 2492 { 2493 as_bad (_("expected register as argument of %s"), 2494 opcode->name); 2495 break; 2496 } 2497 2498 if (target_is_430xv2 () && reg == 0) 2499 { 2500 as_bad (_("%s: attempt to rotate the PC register"), opcode->name); 2501 break; 2502 } 2503 2504 if (byte_op) 2505 { 2506 /* Tricky - there is no single instruction that will do this. 2507 Encode as: RRA.B rN { BIC.B #0x80, rN */ 2508 op_length = 6; 2509 frag = frag_more (op_length); 2510 where = frag - frag_now->fr_literal; 2511 bin = 0x1140 | reg; 2512 bfd_putl16 ((bfd_vma) bin, frag); 2513 dwarf2_emit_insn (2); 2514 bin = 0xc070 | reg; 2515 bfd_putl16 ((bfd_vma) bin, frag + 2); 2516 bin = 0x0080; 2517 bfd_putl16 ((bfd_vma) bin, frag + 4); 2518 dwarf2_emit_insn (4); 2519 } 2520 else 2521 { 2522 /* Encode as RRUM[.A] rN. */ 2523 bin = opcode->bin_opcode; 2524 if (! addr_op) 2525 bin |= 0x10; 2526 bin |= reg; 2527 op_length = 2; 2528 frag = frag_more (op_length); 2529 where = frag - frag_now->fr_literal; 2530 bfd_putl16 ((bfd_vma) bin, frag); 2531 dwarf2_emit_insn (op_length); 2532 } 2533 break; 2534 } 2535 2536 case 8: 2537 { 2538 bfd_boolean need_reloc = FALSE; 2539 int n; 2540 int reg; 2541 2542 /* ADDA, CMPA and SUBA address instructions. */ 2543 if (extended & 0xff) 2544 { 2545 as_bad (_("repeat count cannot be used with %s"), opcode->name); 2546 break; 2547 } 2548 2549 line = extract_operand (line, l1, sizeof (l1)); 2550 line = extract_operand (line, l2, sizeof (l2)); 2551 2552 bin = opcode->bin_opcode; 2553 2554 if (*l1 == '#') 2555 { 2556 parse_exp (l1 + 1, &(op1.exp)); 2557 2558 if (op1.exp.X_op == O_constant) 2559 { 2560 n = op1.exp.X_add_number; 2561 if (n > 0xfffff || n < - (0x7ffff)) 2562 { 2563 as_bad (_("expected value of first argument of %s to fit into 20-bits"), 2564 opcode->name); 2565 break; 2566 } 2567 2568 bin |= ((n >> 16) & 0xf) << 8; 2569 } 2570 else 2571 { 2572 n = 0; 2573 need_reloc = TRUE; 2574 } 2575 2576 op_length = 4; 2577 } 2578 else 2579 { 2580 if ((n = check_reg (l1)) == -1) 2581 { 2582 as_bad (_("expected register name or constant as first argument of %s"), 2583 opcode->name); 2584 break; 2585 } 2586 2587 bin |= (n << 8) | (1 << 6); 2588 op_length = 2; 2589 } 2590 2591 if ((reg = check_reg (l2)) == -1) 2592 { 2593 as_bad (_("expected register as second argument of %s"), 2594 opcode->name); 2595 break; 2596 } 2597 2598 frag = frag_more (op_length); 2599 where = frag - frag_now->fr_literal; 2600 bin |= reg; 2601 if (need_reloc) 2602 fix_new_exp (frag_now, where, 4, &(op1.exp), FALSE, 2603 BFD_RELOC_MSP430X_ABS20_ADR_SRC); 2604 2605 bfd_putl16 ((bfd_vma) bin, frag); 2606 if (op_length == 4) 2607 bfd_putl16 ((bfd_vma) (n & 0xffff), frag + 2); 2608 dwarf2_emit_insn (op_length); 2609 break; 2610 } 2611 2612 case 9: /* MOVA, BRA, RETA. */ 2613 imm_op = FALSE; 2614 bin = opcode->bin_opcode; 2615 2616 if (is_opcode ("reta")) 2617 { 2618 /* The RETA instruction does not take any arguments. 2619 The implicit first argument is @SP+. 2620 The implicit second argument is PC. */ 2621 op1.mode = OP_REG; 2622 op1.am = 3; 2623 op1.reg = 1; 2624 2625 op2.mode = OP_REG; 2626 op2.reg = 0; 2627 } 2628 else 2629 { 2630 line = extract_operand (line, l1, sizeof (l1)); 2631 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, 2632 &imm_op, extended_op, FALSE); 2633 2634 if (is_opcode ("bra")) 2635 { 2636 /* This is the BRA synthetic instruction. 2637 The second argument is always PC. */ 2638 op2.mode = OP_REG; 2639 op2.reg = 0; 2640 } 2641 else 2642 { 2643 line = extract_operand (line, l2, sizeof (l2)); 2644 res += msp430_dstoperand (&op2, l2, opcode->bin_opcode, 2645 extended_op, TRUE); 2646 } 2647 2648 if (res) 2649 break; /* Error occurred. All warnings were done before. */ 2650 } 2651 2652 /* Only a restricted subset of the normal MSP430 addressing modes 2653 are supported here, so check for the ones that are allowed. */ 2654 if ((op_length = try_encode_mova (imm_op, bin, & op1, & op2, 2655 & error_message)) == 0) 2656 { 2657 as_bad (error_message, opcode->name); 2658 break; 2659 } 2660 dwarf2_emit_insn (op_length); 2661 break; 2662 2663 case 10: /* RPT */ 2664 line = extract_operand (line, l1, sizeof l1); 2665 /* The RPT instruction only accepted immediates and registers. */ 2666 if (*l1 == '#') 2667 { 2668 parse_exp (l1 + 1, &(op1.exp)); 2669 if (op1.exp.X_op != O_constant) 2670 { 2671 as_bad (_("expected constant value as argument to RPT")); 2672 break; 2673 } 2674 if (op1.exp.X_add_number < 1 2675 || op1.exp.X_add_number > (1 << 4)) 2676 { 2677 as_bad (_("expected constant in the range 2..16")); 2678 break; 2679 } 2680 2681 /* We silently accept and ignore a repeat count of 1. */ 2682 if (op1.exp.X_add_number > 1) 2683 repeat_count = op1.exp.X_add_number; 2684 } 2685 else 2686 { 2687 int reg; 2688 2689 if ((reg = check_reg (l1)) != -1) 2690 { 2691 if (reg == 0) 2692 as_warn (_("PC used as an argument to RPT")); 2693 else 2694 repeat_count = - reg; 2695 } 2696 else 2697 { 2698 as_bad (_("expected constant or register name as argument to RPT insn")); 2699 break; 2700 } 2701 } 2702 break; 2703 2704 default: 2705 as_bad (_("Illegal emulated instruction ")); 2706 break; 2707 } 2708 break; 2709 2710 case 1: /* Format 1, double operand. */ 2711 line = extract_operand (line, l1, sizeof (l1)); 2712 line = extract_operand (line, l2, sizeof (l2)); 2713 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op, extended_op, TRUE); 2714 res += msp430_dstoperand (&op2, l2, opcode->bin_opcode, extended_op, TRUE); 2715 2716 if (res) 2717 break; /* Error occurred. All warnings were done before. */ 2718 2719 if (extended_op 2720 && is_opcode ("movx") 2721 && addr_op 2722 && msp430_enable_relax) 2723 { 2724 /* This is the MOVX.A instruction. See if we can convert 2725 it into the MOVA instruction instead. This saves 2 bytes. */ 2726 if ((op_length = try_encode_mova (imm_op, 0x0000, & op1, & op2, 2727 NULL)) != 0) 2728 { 2729 dwarf2_emit_insn (op_length); 2730 break; 2731 } 2732 } 2733 2734 bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7)); 2735 2736 if ( (is_opcode ("bic") && bin == 0xc232) 2737 || (is_opcode ("bis") && bin == 0xd232) 2738 || (is_opcode ("mov") && op2.mode == OP_REG && op2.reg == 2)) 2739 { 2740 if (check_for_nop) 2741 { 2742 if (warn_interrupt_nops) 2743 { 2744 if (gen_interrupt_nops) 2745 as_warn (_("NOP inserted between two instructions that change interrupt state")); 2746 else 2747 as_warn (_("a NOP might be needed here because of successive changes in interrupt state")); 2748 } 2749 2750 if (gen_interrupt_nops) 2751 { 2752 /* Emit a NOP between interrupt enable/disable. 2753 See 1.3.4.1 of the MSP430x5xx User Guide. */ 2754 insn_length += 2; 2755 frag = frag_more (2); 2756 bfd_putl16 ((bfd_vma) 0x4303 /* NOP */, frag); 2757 } 2758 } 2759 2760 nop_check_needed = TRUE; 2761 } 2762 2763 /* Compute the entire length of the instruction in bytes. */ 2764 op_length = (extended_op ? 2 : 0) /* The extension word. */ 2765 + 2 /* The opcode */ 2766 + (2 * op1.ol) /* The first operand. */ 2767 + (2 * op2.ol); /* The second operand. */ 2768 2769 insn_length += op_length; 2770 frag = frag_more (op_length); 2771 where = frag - frag_now->fr_literal; 2772 2773 if (extended_op) 2774 { 2775 if (!addr_op) 2776 extended |= BYTE_OPERATION; 2777 2778 if ((op1.ol != 0 || op2.ol != 0) && ((extended & 0xf) != 0)) 2779 { 2780 as_bad (_("repeat instruction used with non-register mode instruction")); 2781 extended &= ~ 0xf; 2782 } 2783 2784 /* If necessary, emit a reloc to update the extension word. */ 2785 if (op1.mode == OP_EXP) 2786 { 2787 if (op1.exp.X_op == O_constant) 2788 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7; 2789 2790 else if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2791 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2792 BFD_RELOC_MSP430X_ABS20_EXT_SRC); 2793 else 2794 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2795 BFD_RELOC_MSP430X_PCR20_EXT_SRC); 2796 } 2797 2798 if (op2.mode == OP_EXP) 2799 { 2800 if (op2.exp.X_op == O_constant) 2801 extended |= (op2.exp.X_add_number >> 16) & 0xf; 2802 2803 else if (op1.mode == OP_EXP) 2804 fix_new_exp (frag_now, where, 8, &(op2.exp), FALSE, 2805 op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_ODST 2806 : BFD_RELOC_MSP430X_PCR20_EXT_ODST); 2807 2808 else 2809 fix_new_exp (frag_now, where, 6, &(op2.exp), FALSE, 2810 op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_DST 2811 : BFD_RELOC_MSP430X_PCR20_EXT_DST); 2812 } 2813 2814 /* Emit the extension word. */ 2815 bfd_putl16 (extended, frag); 2816 where += 2; 2817 frag += 2; 2818 } 2819 2820 bfd_putl16 ((bfd_vma) bin, frag); 2821 where += 2; 2822 frag += 2; 2823 2824 if (op1.mode == OP_EXP) 2825 { 2826 if (op1.exp.X_op == O_constant) 2827 { 2828 bfd_putl16 (op1.exp.X_add_number & 0xffff, frag); 2829 } 2830 else 2831 { 2832 bfd_putl16 ((bfd_vma) ZEROS, frag); 2833 2834 if (!extended_op) 2835 { 2836 if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2837 fix_new_exp (frag_now, where, 2, 2838 &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1)); 2839 else 2840 fix_new_exp (frag_now, where, 2, 2841 &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2842 } 2843 } 2844 2845 where += 2; 2846 frag += 2; 2847 } 2848 2849 if (op2.mode == OP_EXP) 2850 { 2851 if (op2.exp.X_op == O_constant) 2852 { 2853 bfd_putl16 (op2.exp.X_add_number & 0xffff, frag); 2854 } 2855 else 2856 { 2857 bfd_putl16 ((bfd_vma) ZEROS, frag); 2858 2859 if (!extended_op) 2860 { 2861 if (op2.reg) /* Not PC relative. */ 2862 fix_new_exp (frag_now, where, 2, 2863 &(op2.exp), FALSE, CHECK_RELOC_MSP430 (op2)); 2864 else 2865 fix_new_exp (frag_now, where, 2, 2866 &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2867 } 2868 } 2869 } 2870 2871 dwarf2_emit_insn (insn_length); 2872 break; 2873 2874 case 2: /* Single-operand mostly instr. */ 2875 if (opcode->insn_opnumb == 0) 2876 { 2877 /* reti instruction. */ 2878 insn_length += 2; 2879 frag = frag_more (2); 2880 bfd_putl16 ((bfd_vma) bin, frag); 2881 dwarf2_emit_insn (insn_length); 2882 break; 2883 } 2884 2885 line = extract_operand (line, l1, sizeof (l1)); 2886 res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, 2887 &imm_op, extended_op, TRUE); 2888 if (res) 2889 break; /* Error in operand. */ 2890 2891 if (target_is_430xv2 () 2892 && op1.mode == OP_REG 2893 && op1.reg == 0 2894 && (is_opcode ("rrax") 2895 || is_opcode ("rrcx") 2896 || is_opcode ("rra") 2897 || is_opcode ("rrc"))) 2898 { 2899 as_bad (_("%s: attempt to rotate the PC register"), opcode->name); 2900 break; 2901 } 2902 2903 insn_length = (extended_op ? 2 : 0) + 2 + (op1.ol * 2); 2904 frag = frag_more (insn_length); 2905 where = frag - frag_now->fr_literal; 2906 2907 if (extended_op) 2908 { 2909 if (is_opcode ("swpbx") || is_opcode ("sxtx")) 2910 { 2911 /* These two instructions use a special 2912 encoding of the A/L and B/W bits. */ 2913 bin &= ~ BYTE_OPERATION; 2914 2915 if (byte_op) 2916 { 2917 as_bad (_("%s instruction does not accept a .b suffix"), 2918 opcode->name); 2919 break; 2920 } 2921 else if (! addr_op) 2922 extended |= BYTE_OPERATION; 2923 } 2924 else if (! addr_op) 2925 extended |= BYTE_OPERATION; 2926 2927 if (op1.ol != 0 && ((extended & 0xf) != 0)) 2928 { 2929 as_bad (_("repeat instruction used with non-register mode instruction")); 2930 extended &= ~ 0xf; 2931 } 2932 2933 if (op1.mode == OP_EXP) 2934 { 2935 if (op1.exp.X_op == O_constant) 2936 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7; 2937 2938 else if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2939 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2940 BFD_RELOC_MSP430X_ABS20_EXT_SRC); 2941 else 2942 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE, 2943 BFD_RELOC_MSP430X_PCR20_EXT_SRC); 2944 } 2945 2946 /* Emit the extension word. */ 2947 bfd_putl16 (extended, frag); 2948 frag += 2; 2949 where += 2; 2950 } 2951 2952 bin |= op1.reg | (op1.am << 4); 2953 bfd_putl16 ((bfd_vma) bin, frag); 2954 frag += 2; 2955 where += 2; 2956 2957 if (op1.mode == OP_EXP) 2958 { 2959 if (op1.exp.X_op == O_constant) 2960 { 2961 bfd_putl16 (op1.exp.X_add_number & 0xffff, frag); 2962 } 2963 else 2964 { 2965 bfd_putl16 ((bfd_vma) ZEROS, frag); 2966 2967 if (!extended_op) 2968 { 2969 if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative. */ 2970 fix_new_exp (frag_now, where, 2, 2971 &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1)); 2972 else 2973 fix_new_exp (frag_now, where, 2, 2974 &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL); 2975 } 2976 } 2977 } 2978 2979 dwarf2_emit_insn (insn_length); 2980 break; 2981 2982 case 3: /* Conditional jumps instructions. */ 2983 line = extract_operand (line, l1, sizeof (l1)); 2984 /* l1 is a label. */ 2985 if (l1[0]) 2986 { 2987 char *m = l1; 2988 expressionS exp; 2989 2990 if (*m == '$') 2991 m++; 2992 2993 parse_exp (m, &exp); 2994 2995 /* In order to handle something like: 2996 2997 and #0x8000, r5 2998 tst r5 2999 jz 4 ; skip next 4 bytes 3000 inv r5 3001 inc r5 3002 nop ; will jump here if r5 positive or zero 3003 3004 jCOND -n ;assumes jump n bytes backward: 3005 3006 mov r5,r6 3007 jmp -2 3008 3009 is equal to: 3010 lab: 3011 mov r5,r6 3012 jmp lab 3013 3014 jCOND $n ; jump from PC in either direction. */ 3015 3016 if (exp.X_op == O_constant) 3017 { 3018 int x = exp.X_add_number; 3019 3020 if (x & 1) 3021 { 3022 as_warn (_("Even number required. Rounded to %d"), x + 1); 3023 x++; 3024 } 3025 3026 if ((*l1 == '$' && x > 0) || x < 0) 3027 x -= 2; 3028 3029 x >>= 1; 3030 3031 if (x > 512 || x < -511) 3032 { 3033 as_bad (_("Wrong displacement %d"), x << 1); 3034 break; 3035 } 3036 3037 insn_length += 2; 3038 frag = frag_more (2); /* Instr size is 1 word. */ 3039 3040 bin |= x & 0x3ff; 3041 bfd_putl16 ((bfd_vma) bin, frag); 3042 } 3043 else if (exp.X_op == O_symbol && *l1 != '$') 3044 { 3045 insn_length += 2; 3046 frag = frag_more (2); /* Instr size is 1 word. */ 3047 where = frag - frag_now->fr_literal; 3048 fix_new_exp (frag_now, where, 2, 3049 &exp, TRUE, BFD_RELOC_MSP430_10_PCREL); 3050 3051 bfd_putl16 ((bfd_vma) bin, frag); 3052 } 3053 else if (*l1 == '$') 3054 { 3055 as_bad (_("instruction requires label sans '$'")); 3056 } 3057 else 3058 as_bad (_ 3059 ("instruction requires label or value in range -511:512")); 3060 dwarf2_emit_insn (insn_length); 3061 break; 3062 } 3063 else 3064 { 3065 as_bad (_("instruction requires label")); 3066 break; 3067 } 3068 break; 3069 3070 case 4: /* Extended jumps. */ 3071 if (!msp430_enable_polys) 3072 { 3073 as_bad (_("polymorphs are not enabled. Use -mP option to enable.")); 3074 break; 3075 } 3076 3077 line = extract_operand (line, l1, sizeof (l1)); 3078 if (l1[0]) 3079 { 3080 char *m = l1; 3081 expressionS exp; 3082 3083 /* Ignore absolute addressing. make it PC relative anyway. */ 3084 if (*m == '#' || *m == '$') 3085 m++; 3086 3087 parse_exp (m, & exp); 3088 if (exp.X_op == O_symbol) 3089 { 3090 /* Relaxation required. */ 3091 struct rcodes_s rc = msp430_rcodes[opcode->insn_opnumb]; 3092 3093 if (target_is_430x ()) 3094 rc = msp430x_rcodes[opcode->insn_opnumb]; 3095 3096 /* The parameter to dwarf2_emit_insn is actually the offset to 3097 the start of the insn from the fix piece of instruction that 3098 was emitted. Since next fragments may have variable size we 3099 tie debug info to the beginning of the instruction. */ 3100 insn_length += 8; 3101 frag = frag_more (8); 3102 dwarf2_emit_insn (0); 3103 bfd_putl16 ((bfd_vma) rc.sop, frag); 3104 frag = frag_variant (rs_machine_dependent, 8, 2, 3105 /* Wild guess. */ 3106 ENCODE_RELAX (rc.lpos, STATE_BITS10), 3107 exp.X_add_symbol, 3108 0, /* Offset is zero if jump dist less than 1K. */ 3109 (char *) frag); 3110 break; 3111 } 3112 } 3113 3114 as_bad (_("instruction requires label")); 3115 break; 3116 3117 case 5: /* Emulated extended branches. */ 3118 if (!msp430_enable_polys) 3119 { 3120 as_bad (_("polymorphs are not enabled. Use -mP option to enable.")); 3121 break; 3122 } 3123 line = extract_operand (line, l1, sizeof (l1)); 3124 if (l1[0]) 3125 { 3126 char * m = l1; 3127 expressionS exp; 3128 3129 /* Ignore absolute addressing. make it PC relative anyway. */ 3130 if (*m == '#' || *m == '$') 3131 m++; 3132 3133 parse_exp (m, & exp); 3134 if (exp.X_op == O_symbol) 3135 { 3136 /* Relaxation required. */ 3137 struct hcodes_s hc = msp430_hcodes[opcode->insn_opnumb]; 3138 3139 if (target_is_430x ()) 3140 hc = msp430x_hcodes[opcode->insn_opnumb]; 3141 3142 insn_length += 8; 3143 frag = frag_more (8); 3144 dwarf2_emit_insn (0); 3145 bfd_putl16 ((bfd_vma) hc.op0, frag); 3146 bfd_putl16 ((bfd_vma) hc.op1, frag+2); 3147 3148 frag = frag_variant (rs_machine_dependent, 8, 2, 3149 ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10), /* Wild guess. */ 3150 exp.X_add_symbol, 3151 0, /* Offset is zero if jump dist less than 1K. */ 3152 (char *) frag); 3153 break; 3154 } 3155 } 3156 3157 as_bad (_("instruction requires label")); 3158 break; 3159 3160 default: 3161 as_bad (_("Illegal instruction or not implemented opcode.")); 3162 } 3163 3164 input_line_pointer = line; 3165 check_for_nop = nop_check_needed; 3166 return 0; 3167 } 3168 3169 void 3170 md_assemble (char * str) 3171 { 3172 struct msp430_opcode_s * opcode; 3173 char cmd[32]; 3174 unsigned int i = 0; 3175 3176 str = skip_space (str); /* Skip leading spaces. */ 3177 str = extract_cmd (str, cmd, sizeof (cmd)); 3178 3179 while (cmd[i] && i < sizeof (cmd)) 3180 { 3181 char a = TOLOWER (cmd[i]); 3182 cmd[i] = a; 3183 i++; 3184 } 3185 3186 if (!cmd[0]) 3187 { 3188 as_bad (_("can't find opcode ")); 3189 return; 3190 } 3191 3192 opcode = (struct msp430_opcode_s *) hash_find (msp430_hash, cmd); 3193 3194 if (opcode == NULL) 3195 { 3196 as_bad (_("unknown opcode `%s'"), cmd); 3197 return; 3198 } 3199 3200 { 3201 char *__t = input_line_pointer; 3202 3203 msp430_operands (opcode, str); 3204 input_line_pointer = __t; 3205 } 3206 } 3207 3208 /* GAS will call this function for each section at the end of the assembly, 3209 to permit the CPU backend to adjust the alignment of a section. */ 3210 3211 valueT 3212 md_section_align (asection * seg, valueT addr) 3213 { 3214 int align = bfd_get_section_alignment (stdoutput, seg); 3215 3216 return ((addr + (1 << align) - 1) & (-1 << align)); 3217 } 3218 3219 /* If you define this macro, it should return the offset between the 3220 address of a PC relative fixup and the position from which the PC 3221 relative adjustment should be made. On many processors, the base 3222 of a PC relative instruction is the next instruction, so this 3223 macro would return the length of an instruction. */ 3224 3225 long 3226 md_pcrel_from_section (fixS * fixp, segT sec) 3227 { 3228 if (fixp->fx_addsy != (symbolS *) NULL 3229 && (!S_IS_DEFINED (fixp->fx_addsy) 3230 || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) 3231 return 0; 3232 3233 return fixp->fx_frag->fr_address + fixp->fx_where; 3234 } 3235 3236 /* Replaces standard TC_FORCE_RELOCATION_LOCAL. 3237 Now it handles the situation when relocations 3238 have to be passed to linker. */ 3239 int 3240 msp430_force_relocation_local (fixS *fixp) 3241 { 3242 if (fixp->fx_r_type == BFD_RELOC_MSP430_10_PCREL) 3243 return 1; 3244 if (fixp->fx_pcrel) 3245 return 1; 3246 if (msp430_enable_polys 3247 && !msp430_enable_relax) 3248 return 1; 3249 3250 return (!fixp->fx_pcrel 3251 || generic_force_reloc (fixp)); 3252 } 3253 3254 3255 /* GAS will call this for each fixup. It should store the correct 3256 value in the object file. */ 3257 void 3258 md_apply_fix (fixS * fixp, valueT * valuep, segT seg) 3259 { 3260 unsigned char * where; 3261 unsigned long insn; 3262 long value; 3263 3264 if (fixp->fx_addsy == (symbolS *) NULL) 3265 { 3266 value = *valuep; 3267 fixp->fx_done = 1; 3268 } 3269 else if (fixp->fx_pcrel) 3270 { 3271 segT s = S_GET_SEGMENT (fixp->fx_addsy); 3272 3273 if (fixp->fx_addsy && (s == seg || s == absolute_section)) 3274 { 3275 /* FIXME: We can appear here only in case if we perform a pc 3276 relative jump to the label which is i) global, ii) locally 3277 defined or this is a jump to an absolute symbol. 3278 If this is an absolute symbol -- everything is OK. 3279 If this is a global label, we've got a symbol value defined 3280 twice: 3281 1. S_GET_VALUE (fixp->fx_addsy) will contain a symbol offset 3282 from this section start 3283 2. *valuep will contain the real offset from jump insn to the 3284 label 3285 So, the result of S_GET_VALUE (fixp->fx_addsy) + (* valuep); 3286 will be incorrect. Therefore remove s_get_value. */ 3287 value = /* S_GET_VALUE (fixp->fx_addsy) + */ * valuep; 3288 fixp->fx_done = 1; 3289 } 3290 else 3291 value = *valuep; 3292 } 3293 else 3294 { 3295 value = fixp->fx_offset; 3296 3297 if (fixp->fx_subsy != (symbolS *) NULL) 3298 { 3299 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) 3300 { 3301 value -= S_GET_VALUE (fixp->fx_subsy); 3302 fixp->fx_done = 1; 3303 } 3304 } 3305 } 3306 3307 fixp->fx_no_overflow = 1; 3308 3309 /* If polymorphs are enabled and relax disabled. 3310 do not kill any relocs and pass them to linker. */ 3311 if (msp430_enable_polys 3312 && !msp430_enable_relax) 3313 { 3314 if (!fixp->fx_addsy || (fixp->fx_addsy 3315 && S_GET_SEGMENT (fixp->fx_addsy) == absolute_section)) 3316 fixp->fx_done = 1; /* It is ok to kill 'abs' reloc. */ 3317 else 3318 fixp->fx_done = 0; 3319 } 3320 3321 if (fixp->fx_done) 3322 { 3323 /* Fetch the instruction, insert the fully resolved operand 3324 value, and stuff the instruction back again. */ 3325 where = (unsigned char *) fixp->fx_frag->fr_literal + fixp->fx_where; 3326 3327 insn = bfd_getl16 (where); 3328 3329 switch (fixp->fx_r_type) 3330 { 3331 case BFD_RELOC_MSP430_10_PCREL: 3332 if (value & 1) 3333 as_bad_where (fixp->fx_file, fixp->fx_line, 3334 _("odd address operand: %ld"), value); 3335 3336 /* Jumps are in words. */ 3337 value >>= 1; 3338 --value; /* Correct PC. */ 3339 3340 if (value < -512 || value > 511) 3341 as_bad_where (fixp->fx_file, fixp->fx_line, 3342 _("operand out of range: %ld"), value); 3343 3344 value &= 0x3ff; /* get rid of extended sign */ 3345 bfd_putl16 ((bfd_vma) (value | insn), where); 3346 break; 3347 3348 case BFD_RELOC_MSP430X_PCR16: 3349 case BFD_RELOC_MSP430_RL_PCREL: 3350 case BFD_RELOC_MSP430_16_PCREL: 3351 if (value & 1) 3352 as_bad_where (fixp->fx_file, fixp->fx_line, 3353 _("odd address operand: %ld"), value); 3354 /* Fall through. */ 3355 3356 case BFD_RELOC_MSP430_16_PCREL_BYTE: 3357 /* Nothing to be corrected here. */ 3358 if (value < -32768 || value > 65536) 3359 as_bad_where (fixp->fx_file, fixp->fx_line, 3360 _("operand out of range: %ld"), value); 3361 /* Fall through. */ 3362 3363 case BFD_RELOC_MSP430X_ABS16: 3364 case BFD_RELOC_MSP430_16: 3365 case BFD_RELOC_16: 3366 case BFD_RELOC_MSP430_16_BYTE: 3367 value &= 0xffff; /* Get rid of extended sign. */ 3368 bfd_putl16 ((bfd_vma) value, where); 3369 break; 3370 3371 case BFD_RELOC_MSP430_ABS_HI16: 3372 value >>= 16; 3373 value &= 0xffff; /* Get rid of extended sign. */ 3374 bfd_putl16 ((bfd_vma) value, where); 3375 break; 3376 3377 case BFD_RELOC_32: 3378 bfd_putl16 ((bfd_vma) value, where); 3379 break; 3380 3381 case BFD_RELOC_MSP430_ABS8: 3382 case BFD_RELOC_8: 3383 bfd_put_8 (NULL, (bfd_vma) value, where); 3384 break; 3385 3386 case BFD_RELOC_MSP430X_ABS20_EXT_SRC: 3387 case BFD_RELOC_MSP430X_PCR20_EXT_SRC: 3388 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 4); 3389 value >>= 16; 3390 bfd_putl16 ((bfd_vma) (((value & 0xf) << 7) | insn), where); 3391 break; 3392 3393 case BFD_RELOC_MSP430X_ABS20_ADR_SRC: 3394 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2); 3395 value >>= 16; 3396 bfd_putl16 ((bfd_vma) (((value & 0xf) << 8) | insn), where); 3397 break; 3398 3399 case BFD_RELOC_MSP430X_ABS20_EXT_ODST: 3400 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 6); 3401 value >>= 16; 3402 bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where); 3403 break; 3404 3405 case BFD_RELOC_MSP430X_PCR20_CALL: 3406 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2); 3407 value >>= 16; 3408 bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where); 3409 break; 3410 3411 case BFD_RELOC_MSP430X_ABS20_EXT_DST: 3412 case BFD_RELOC_MSP430X_PCR20_EXT_DST: 3413 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 4); 3414 value >>= 16; 3415 bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where); 3416 break; 3417 3418 case BFD_RELOC_MSP430X_PCR20_EXT_ODST: 3419 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 6); 3420 value >>= 16; 3421 bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where); 3422 break; 3423 3424 case BFD_RELOC_MSP430X_ABS20_ADR_DST: 3425 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2); 3426 value >>= 16; 3427 bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where); 3428 break; 3429 3430 default: 3431 as_fatal (_("line %d: unknown relocation type: 0x%x"), 3432 fixp->fx_line, fixp->fx_r_type); 3433 break; 3434 } 3435 } 3436 else 3437 { 3438 fixp->fx_addnumber = value; 3439 } 3440 } 3441 3442 static bfd_boolean 3443 S_IS_GAS_LOCAL (symbolS * s) 3444 { 3445 const char * name; 3446 unsigned int len; 3447 3448 if (s == NULL) 3449 return FALSE; 3450 name = S_GET_NAME (s); 3451 len = strlen (name) - 1; 3452 3453 return name[len] == 1 || name[len] == 2; 3454 } 3455 3456 /* GAS will call this to generate a reloc, passing the resulting reloc 3457 to `bfd_install_relocation'. This currently works poorly, as 3458 `bfd_install_relocation' often does the wrong thing, and instances of 3459 `tc_gen_reloc' have been written to work around the problems, which 3460 in turns makes it difficult to fix `bfd_install_relocation'. */ 3461 3462 /* If while processing a fixup, a reloc really needs to be created 3463 then it is done here. */ 3464 3465 arelent ** 3466 tc_gen_reloc (asection * seg ATTRIBUTE_UNUSED, fixS * fixp) 3467 { 3468 static arelent * no_relocs = NULL; 3469 static arelent * relocs[MAX_RELOC_EXPANSION + 1]; 3470 arelent *reloc; 3471 3472 reloc = xmalloc (sizeof (arelent)); 3473 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 3474 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 3475 3476 if (reloc->howto == (reloc_howto_type *) NULL) 3477 { 3478 as_bad_where (fixp->fx_file, fixp->fx_line, 3479 _("reloc %d not supported by object file format"), 3480 (int) fixp->fx_r_type); 3481 free (reloc); 3482 return & no_relocs; 3483 } 3484 3485 relocs[0] = reloc; 3486 relocs[1] = NULL; 3487 3488 if (fixp->fx_subsy 3489 && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) 3490 { 3491 fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy); 3492 fixp->fx_subsy = NULL; 3493 } 3494 3495 if (fixp->fx_addsy && fixp->fx_subsy) 3496 { 3497 asection *asec, *ssec; 3498 3499 asec = S_GET_SEGMENT (fixp->fx_addsy); 3500 ssec = S_GET_SEGMENT (fixp->fx_subsy); 3501 3502 /* If we have a difference between two different, non-absolute symbols 3503 we must generate two relocs (one for each symbol) and allow the 3504 linker to resolve them - relaxation may change the distances between 3505 symbols, even local symbols defined in the same section. 3506 3507 Unfortunately we cannot do this with assembler generated local labels 3508 because there can be multiple incarnations of the same label, with 3509 exactly the same name, in any given section and the linker will have 3510 no way to identify the correct one. Instead we just have to hope 3511 that no relaxtion will occur between the local label and the other 3512 symbol in the expression. 3513 3514 Similarly we have to compute differences between symbols in the .eh_frame 3515 section as the linker is not smart enough to apply relocations there 3516 before attempting to process it. */ 3517 if ((ssec != absolute_section || asec != absolute_section) 3518 && (fixp->fx_addsy != fixp->fx_subsy) 3519 && strcmp (ssec->name, ".eh_frame") != 0 3520 && ! S_IS_GAS_LOCAL (fixp->fx_addsy) 3521 && ! S_IS_GAS_LOCAL (fixp->fx_subsy)) 3522 { 3523 arelent * reloc2 = xmalloc (sizeof * reloc); 3524 3525 relocs[0] = reloc2; 3526 relocs[1] = reloc; 3527 3528 reloc2->address = reloc->address; 3529 reloc2->howto = bfd_reloc_type_lookup (stdoutput, 3530 BFD_RELOC_MSP430_SYM_DIFF); 3531 reloc2->addend = - S_GET_VALUE (fixp->fx_subsy); 3532 3533 if (ssec == absolute_section) 3534 reloc2->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 3535 else 3536 { 3537 reloc2->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); 3538 *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); 3539 } 3540 3541 reloc->addend = fixp->fx_offset; 3542 if (asec == absolute_section) 3543 { 3544 reloc->addend += S_GET_VALUE (fixp->fx_addsy); 3545 reloc->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 3546 } 3547 else 3548 { 3549 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); 3550 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 3551 } 3552 3553 fixp->fx_pcrel = 0; 3554 fixp->fx_done = 1; 3555 return relocs; 3556 } 3557 else 3558 { 3559 char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal; 3560 3561 reloc->addend = (S_GET_VALUE (fixp->fx_addsy) 3562 - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); 3563 3564 switch (fixp->fx_r_type) 3565 { 3566 case BFD_RELOC_8: 3567 md_number_to_chars (fixpos, reloc->addend, 1); 3568 break; 3569 3570 case BFD_RELOC_16: 3571 md_number_to_chars (fixpos, reloc->addend, 2); 3572 break; 3573 3574 case BFD_RELOC_24: 3575 md_number_to_chars (fixpos, reloc->addend, 3); 3576 break; 3577 3578 case BFD_RELOC_32: 3579 md_number_to_chars (fixpos, reloc->addend, 4); 3580 break; 3581 3582 default: 3583 reloc->sym_ptr_ptr 3584 = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr; 3585 return relocs; 3586 } 3587 3588 free (reloc); 3589 return & no_relocs; 3590 } 3591 } 3592 else 3593 { 3594 #if 0 3595 if (fixp->fx_r_type == BFD_RELOC_MSP430X_ABS16 3596 && S_GET_SEGMENT (fixp->fx_addsy) == absolute_section) 3597 { 3598 bfd_vma amount = S_GET_VALUE (fixp->fx_addsy); 3599 char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal; 3600 3601 md_number_to_chars (fixpos, amount, 2); 3602 free (reloc); 3603 return & no_relocs; 3604 } 3605 #endif 3606 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); 3607 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 3608 reloc->addend = fixp->fx_offset; 3609 3610 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT 3611 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 3612 reloc->address = fixp->fx_offset; 3613 } 3614 3615 return relocs; 3616 } 3617 3618 int 3619 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED, 3620 asection * segment_type ATTRIBUTE_UNUSED) 3621 { 3622 if (fragP->fr_symbol && S_GET_SEGMENT (fragP->fr_symbol) == segment_type) 3623 { 3624 /* This is a jump -> pcrel mode. Nothing to do much here. 3625 Return value == 2. */ 3626 fragP->fr_subtype = 3627 ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_BITS10); 3628 } 3629 else if (fragP->fr_symbol) 3630 { 3631 /* Its got a segment, but its not ours. Even if fr_symbol is in 3632 an absolute segment, we don't know a displacement until we link 3633 object files. So it will always be long. This also applies to 3634 labels in a subsegment of current. Liker may relax it to short 3635 jump later. Return value == 8. */ 3636 fragP->fr_subtype = 3637 ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_WORD); 3638 } 3639 else 3640 { 3641 /* We know the abs value. may be it is a jump to fixed address. 3642 Impossible in our case, cause all constants already handled. */ 3643 fragP->fr_subtype = 3644 ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_UNDEF); 3645 } 3646 3647 return md_relax_table[fragP->fr_subtype].rlx_length; 3648 } 3649 3650 void 3651 md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, 3652 asection * sec ATTRIBUTE_UNUSED, 3653 fragS * fragP) 3654 { 3655 char * where = 0; 3656 int rela = -1; 3657 int i; 3658 struct rcodes_s * cc = NULL; 3659 struct hcodes_s * hc = NULL; 3660 3661 switch (fragP->fr_subtype) 3662 { 3663 case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_BITS10): 3664 case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_BITS10): 3665 case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_BITS10): 3666 /* We do not have to convert anything here. 3667 Just apply a fix. */ 3668 rela = BFD_RELOC_MSP430_10_PCREL; 3669 break; 3670 3671 case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_WORD): 3672 case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_UNDEF): 3673 /* Convert uncond branch jmp lab -> br lab. */ 3674 if (target_is_430x ()) 3675 cc = msp430x_rcodes + 7; 3676 else 3677 cc = msp430_rcodes + 7; 3678 where = fragP->fr_literal + fragP->fr_fix; 3679 bfd_putl16 (cc->lop0, where); 3680 rela = BFD_RELOC_MSP430_RL_PCREL; 3681 fragP->fr_fix += 2; 3682 break; 3683 3684 case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_WORD): 3685 case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_UNDEF): 3686 { 3687 /* Other simple branches. */ 3688 int insn = bfd_getl16 (fragP->fr_opcode); 3689 3690 insn &= 0xffff; 3691 /* Find actual instruction. */ 3692 if (target_is_430x ()) 3693 { 3694 for (i = 0; i < 7 && !cc; i++) 3695 if (msp430x_rcodes[i].sop == insn) 3696 cc = msp430x_rcodes + i; 3697 } 3698 else 3699 { 3700 for (i = 0; i < 7 && !cc; i++) 3701 if (msp430_rcodes[i].sop == insn) 3702 cc = & msp430_rcodes[i]; 3703 } 3704 3705 if (!cc || !cc->name) 3706 as_fatal (_("internal inconsistency problem in %s: insn %04lx"), 3707 __FUNCTION__, (long) insn); 3708 where = fragP->fr_literal + fragP->fr_fix; 3709 bfd_putl16 (cc->lop0, where); 3710 bfd_putl16 (cc->lop1, where + 2); 3711 rela = BFD_RELOC_MSP430_RL_PCREL; 3712 fragP->fr_fix += 4; 3713 } 3714 break; 3715 3716 case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_WORD): 3717 case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_UNDEF): 3718 if (target_is_430x ()) 3719 cc = msp430x_rcodes + 6; 3720 else 3721 cc = msp430_rcodes + 6; 3722 where = fragP->fr_literal + fragP->fr_fix; 3723 bfd_putl16 (cc->lop0, where); 3724 bfd_putl16 (cc->lop1, where + 2); 3725 bfd_putl16 (cc->lop2, where + 4); 3726 rela = BFD_RELOC_MSP430_RL_PCREL; 3727 fragP->fr_fix += 6; 3728 break; 3729 3730 case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10): 3731 { 3732 int insn = bfd_getl16 (fragP->fr_opcode + 2); 3733 3734 insn &= 0xffff; 3735 if (target_is_430x ()) 3736 { 3737 for (i = 0; i < 4 && !hc; i++) 3738 if (msp430x_hcodes[i].op1 == insn) 3739 hc = msp430x_hcodes + i; 3740 } 3741 else 3742 { 3743 for (i = 0; i < 4 && !hc; i++) 3744 if (msp430_hcodes[i].op1 == insn) 3745 hc = &msp430_hcodes[i]; 3746 } 3747 if (!hc || !hc->name) 3748 as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"), 3749 __FUNCTION__, (long) insn); 3750 rela = BFD_RELOC_MSP430_10_PCREL; 3751 /* Apply a fix for a first label if necessary. 3752 another fix will be applied to the next word of insn anyway. */ 3753 if (hc->tlab == 2) 3754 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 3755 fragP->fr_offset, TRUE, rela); 3756 fragP->fr_fix += 2; 3757 } 3758 3759 break; 3760 3761 case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_WORD): 3762 case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_UNDEF): 3763 { 3764 int insn = bfd_getl16 (fragP->fr_opcode + 2); 3765 3766 insn &= 0xffff; 3767 if (target_is_430x ()) 3768 { 3769 for (i = 0; i < 4 && !hc; i++) 3770 if (msp430x_hcodes[i].op1 == insn) 3771 hc = msp430x_hcodes + i; 3772 } 3773 else 3774 { 3775 for (i = 0; i < 4 && !hc; i++) 3776 if (msp430_hcodes[i].op1 == insn) 3777 hc = & msp430_hcodes[i]; 3778 } 3779 if (!hc || !hc->name) 3780 as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"), 3781 __FUNCTION__, (long) insn); 3782 rela = BFD_RELOC_MSP430_RL_PCREL; 3783 where = fragP->fr_literal + fragP->fr_fix; 3784 bfd_putl16 (hc->lop0, where); 3785 bfd_putl16 (hc->lop1, where + 2); 3786 bfd_putl16 (hc->lop2, where + 4); 3787 fragP->fr_fix += 6; 3788 } 3789 break; 3790 3791 default: 3792 as_fatal (_("internal inconsistency problem in %s: %lx"), 3793 __FUNCTION__, (long) fragP->fr_subtype); 3794 break; 3795 } 3796 3797 /* Now apply fix. */ 3798 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 3799 fragP->fr_offset, TRUE, rela); 3800 /* Just fixed 2 bytes. */ 3801 fragP->fr_fix += 2; 3802 } 3803 3804 /* Relax fragment. Mostly stolen from hc11 and mcore 3805 which arches I think I know. */ 3806 3807 long 3808 msp430_relax_frag (segT seg ATTRIBUTE_UNUSED, fragS * fragP, 3809 long stretch ATTRIBUTE_UNUSED) 3810 { 3811 long growth; 3812 offsetT aim = 0; 3813 symbolS *symbolP; 3814 const relax_typeS *this_type; 3815 const relax_typeS *start_type; 3816 relax_substateT next_state; 3817 relax_substateT this_state; 3818 const relax_typeS *table = md_relax_table; 3819 3820 /* Nothing to be done if the frag has already max size. */ 3821 if (RELAX_STATE (fragP->fr_subtype) == STATE_UNDEF 3822 || RELAX_STATE (fragP->fr_subtype) == STATE_WORD) 3823 return 0; 3824 3825 if (RELAX_STATE (fragP->fr_subtype) == STATE_BITS10) 3826 { 3827 symbolP = fragP->fr_symbol; 3828 if (symbol_resolved_p (symbolP)) 3829 as_fatal (_("internal inconsistency problem in %s: resolved symbol"), 3830 __FUNCTION__); 3831 /* We know the offset. calculate a distance. */ 3832 aim = S_GET_VALUE (symbolP) - fragP->fr_address - fragP->fr_fix; 3833 } 3834 3835 if (!msp430_enable_relax) 3836 { 3837 /* Relaxation is not enabled. So, make all jump as long ones 3838 by setting 'aim' to quite high value. */ 3839 aim = 0x7fff; 3840 } 3841 3842 this_state = fragP->fr_subtype; 3843 start_type = this_type = table + this_state; 3844 3845 if (aim < 0) 3846 { 3847 /* Look backwards. */ 3848 for (next_state = this_type->rlx_more; next_state;) 3849 if (aim >= this_type->rlx_backward || !this_type->rlx_backward) 3850 next_state = 0; 3851 else 3852 { 3853 /* Grow to next state. */ 3854 this_state = next_state; 3855 this_type = table + this_state; 3856 next_state = this_type->rlx_more; 3857 } 3858 } 3859 else 3860 { 3861 /* Look forwards. */ 3862 for (next_state = this_type->rlx_more; next_state;) 3863 if (aim <= this_type->rlx_forward || !this_type->rlx_forward) 3864 next_state = 0; 3865 else 3866 { 3867 /* Grow to next state. */ 3868 this_state = next_state; 3869 this_type = table + this_state; 3870 next_state = this_type->rlx_more; 3871 } 3872 } 3873 3874 growth = this_type->rlx_length - start_type->rlx_length; 3875 if (growth != 0) 3876 fragP->fr_subtype = this_state; 3877 return growth; 3878 } 3879 3880 /* Return FALSE if the fixup in fixp should be left alone and not 3881 adjusted. We return FALSE here so that linker relaxation will 3882 work. */ 3883 3884 bfd_boolean 3885 msp430_fix_adjustable (struct fix *fixp ATTRIBUTE_UNUSED) 3886 { 3887 /* If the symbol is in a non-code section then it should be OK. */ 3888 if (fixp->fx_addsy 3889 && ((S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE) == 0)) 3890 return TRUE; 3891 3892 return FALSE; 3893 } 3894 3895 /* Set the contents of the .MSP430.attributes section. */ 3896 3897 void 3898 msp430_md_end (void) 3899 { 3900 if (check_for_nop == TRUE && warn_interrupt_nops) 3901 as_warn ("assembly finished with the last instruction changing interrupt state - a NOP might be needed"); 3902 3903 bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA, 3904 target_is_430x () ? 2 : 1); 3905 3906 bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model, 3907 large_model ? 2 : 1); 3908 3909 bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model, 3910 large_model ? 2 : 1); 3911 } 3912 3913 /* Returns FALSE if there is a msp430 specific reason why the 3914 subtraction of two same-section symbols cannot be computed by 3915 the assembler. */ 3916 3917 bfd_boolean 3918 msp430_allow_local_subtract (expressionS * left, 3919 expressionS * right, 3920 segT section) 3921 { 3922 /* If the symbols are not in a code section then they are OK. */ 3923 if ((section->flags & SEC_CODE) == 0) 3924 return TRUE; 3925 3926 if (S_IS_GAS_LOCAL (left->X_add_symbol) || S_IS_GAS_LOCAL (right->X_add_symbol)) 3927 return TRUE; 3928 3929 if (left->X_add_symbol == right->X_add_symbol) 3930 return TRUE; 3931 3932 /* We have to assume that there may be instructions between the 3933 two symbols and that relaxation may increase the distance between 3934 them. */ 3935 return FALSE; 3936 } 3937