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