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