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