Copyright update for binutils
[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 7:
3176           {
3177             int reg;
3178
3179             /* RRUX: Synthetic unsigned right shift of a register by one bit.  */
3180             if (extended & 0xff)
3181               {
3182                 as_bad (_("repeat count cannot be used with %s"), opcode->name);
3183                 break;
3184               }
3185
3186             line = extract_operand (line, l1, sizeof (l1));
3187             if ((reg = check_reg (l1)) == -1)
3188               {
3189                 as_bad (_("expected register as argument of %s"),
3190                         opcode->name);
3191                 break;
3192               }
3193
3194             if (target_is_430xv2 () && reg == 0)
3195               {
3196                 as_bad (_("%s: attempt to rotate the PC register"), opcode->name);
3197                 break;
3198               }
3199
3200             if (byte_op)
3201               {
3202                 /* Tricky - there is no single instruction that will do this.
3203                    Encode as: RRA.B rN { BIC.B #0x80, rN  */
3204                 op_length = 6;
3205                 frag = frag_more (op_length);
3206                 where = frag - frag_now->fr_literal;
3207                 bin = 0x1140 | reg;
3208                 bfd_putl16 ((bfd_vma) bin, frag);
3209                 dwarf2_emit_insn (2);
3210                 bin = 0xc070 | reg;
3211                 bfd_putl16 ((bfd_vma) bin, frag + 2);
3212                 bin = 0x0080;
3213                 bfd_putl16 ((bfd_vma) bin, frag + 4);
3214                 dwarf2_emit_insn (4);
3215               }
3216             else
3217               {
3218                 /* Encode as RRUM[.A] rN.  */
3219                 bin = opcode->bin_opcode;
3220                 if (! addr_op)
3221                   bin |= 0x10;
3222                 bin |= reg;
3223                 op_length = 2;
3224                 frag = frag_more (op_length);
3225                 where = frag - frag_now->fr_literal;
3226                 bfd_putl16 ((bfd_vma) bin, frag);
3227                 dwarf2_emit_insn (op_length);
3228               }
3229             break;
3230           }
3231
3232         case 8:
3233           {
3234             bfd_boolean need_reloc = FALSE;
3235             int n;
3236             int reg;
3237
3238             /* ADDA, CMPA and SUBA address instructions.  */
3239             if (extended & 0xff)
3240               {
3241                 as_bad (_("repeat count cannot be used with %s"), opcode->name);
3242                 break;
3243               }
3244
3245             line = extract_operand (line, l1, sizeof (l1));
3246             line = extract_operand (line, l2, sizeof (l2));
3247
3248             bin = opcode->bin_opcode;
3249
3250             if (*l1 == '#')
3251               {
3252                 parse_exp (l1 + 1, &(op1.exp));
3253
3254                 if (op1.exp.X_op == O_constant)
3255                   {
3256                     n = op1.exp.X_add_number;
3257                     if (n > 0xfffff || n < - (0x7ffff))
3258                       {
3259                         as_bad (_("expected value of first argument of %s to fit into 20-bits"),
3260                                 opcode->name);
3261                         break;
3262                       }
3263
3264                     bin |= ((n >> 16) & 0xf) << 8;
3265                   }
3266                 else
3267                   {
3268                     n = 0;
3269                     need_reloc = TRUE;
3270                   }
3271
3272                 op_length = 4;
3273               }
3274             else
3275               {
3276                 if ((n = check_reg (l1)) == -1)
3277                   {
3278                     as_bad (_("expected register name or constant as first argument of %s"),
3279                             opcode->name);
3280                     break;
3281                   }
3282
3283                 bin |= (n << 8) | (1 << 6);
3284                 op_length = 2;
3285               }
3286
3287             if ((reg = check_reg (l2)) == -1)
3288               {
3289                 as_bad (_("expected register as second argument of %s"),
3290                         opcode->name);
3291                 break;
3292               }
3293
3294             frag = frag_more (op_length);
3295             where = frag - frag_now->fr_literal;
3296             bin |= reg;
3297             if (need_reloc)
3298               fix_new_exp (frag_now, where, 4, &(op1.exp), FALSE,
3299                            BFD_RELOC_MSP430X_ABS20_ADR_SRC);
3300
3301             bfd_putl16 ((bfd_vma) bin, frag);
3302             if (op_length == 4)
3303               bfd_putl16 ((bfd_vma) (n & 0xffff), frag + 2);
3304             dwarf2_emit_insn (op_length);
3305             break;
3306           }
3307
3308         case 9: /* MOVA, BRA, RETA.  */
3309           imm_op = FALSE;
3310           bin = opcode->bin_opcode;
3311
3312           if (is_opcode ("reta"))
3313             {
3314               /* The RETA instruction does not take any arguments.
3315                  The implicit first argument is @SP+.
3316                  The implicit second argument is PC.  */
3317               op1.mode = OP_REG;
3318               op1.am = 3;
3319               op1.reg = 1;
3320
3321               op2.mode = OP_REG;
3322               op2.reg = 0;
3323             }
3324           else
3325             {
3326               line = extract_operand (line, l1, sizeof (l1));
3327               res = msp430_srcoperand (&op1, l1, opcode->bin_opcode,
3328                                        &imm_op, extended_op, FALSE);
3329
3330               if (is_opcode ("bra"))
3331                 {
3332                   /* This is the BRA synthetic instruction.
3333                      The second argument is always PC.  */
3334                   op2.mode = OP_REG;
3335                   op2.reg = 0;
3336                 }
3337               else
3338                 {
3339                   line = extract_operand (line, l2, sizeof (l2));
3340                   res += msp430_dstoperand (&op2, l2, opcode->bin_opcode,
3341                                             extended_op, TRUE);
3342                 }
3343
3344               if (res)
3345                 break;  /* Error occurred.  All warnings were done before.  */
3346             }
3347
3348           /* Only a restricted subset of the normal MSP430 addressing modes
3349              are supported here, so check for the ones that are allowed.  */
3350           if ((op_length = try_encode_mova (imm_op, bin, & op1, & op2,
3351                                             & error_message)) == 0)
3352             {
3353               as_bad (error_message, opcode->name);
3354               break;
3355             }
3356           dwarf2_emit_insn (op_length);
3357           break;
3358
3359         case 10: /* RPT */
3360           line = extract_operand (line, l1, sizeof l1);
3361           /* The RPT instruction only accepted immediates and registers.  */
3362           if (*l1 == '#')
3363             {
3364               parse_exp (l1 + 1, &(op1.exp));
3365               if (op1.exp.X_op != O_constant)
3366                 {
3367                   as_bad (_("expected constant value as argument to RPT"));
3368                   break;
3369                 }
3370               if (op1.exp.X_add_number < 1
3371                   || op1.exp.X_add_number > (1 << 4))
3372                 {
3373                   as_bad (_("expected constant in the range 2..16"));
3374                   break;
3375                 }
3376
3377               /* We silently accept and ignore a repeat count of 1.  */
3378               if (op1.exp.X_add_number > 1)
3379                 repeat_count = op1.exp.X_add_number;
3380             }
3381           else
3382             {
3383               int reg;
3384
3385               if ((reg = check_reg (l1)) != -1)
3386                 {
3387                   if (reg == 0)
3388                     as_warn (_("PC used as an argument to RPT"));
3389                   else
3390                     repeat_count = - reg;
3391                 }
3392               else
3393                 {
3394                   as_bad (_("expected constant or register name as argument to RPT insn"));
3395                   break;
3396                 }
3397             }
3398           break;
3399
3400         default:
3401           as_bad (_("Illegal emulated instruction "));
3402           break;
3403         }
3404       break;
3405
3406     case 1:                     /* Format 1, double operand.  */
3407       line = extract_operand (line, l1, sizeof (l1));
3408       line = extract_operand (line, l2, sizeof (l2));
3409       res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op, extended_op, TRUE);
3410       res += msp430_dstoperand (&op2, l2, opcode->bin_opcode, extended_op, TRUE);
3411
3412       if (res)
3413         break;                  /* Error occurred.  All warnings were done before.  */
3414
3415       if (extended_op
3416           && is_opcode ("movx")
3417           && addr_op
3418           && msp430_enable_relax)
3419         {
3420           /* This is the MOVX.A instruction.  See if we can convert
3421              it into the MOVA instruction instead.  This saves 2 bytes.  */
3422           if ((op_length = try_encode_mova (imm_op, 0x0000, & op1, & op2,
3423                                             NULL)) != 0)
3424             {
3425               dwarf2_emit_insn (op_length);
3426               break;
3427             }
3428         }
3429
3430       bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7));
3431
3432       /* If the PC is the destination...  */
3433       if (op2.am == 0 && op2.reg == 0
3434           /* ... and the opcode alters the SR.  */
3435           && !(is_opcode ("bic") || is_opcode ("bis") || is_opcode ("mov")
3436                || is_opcode ("bicx") || is_opcode ("bisx") || is_opcode ("movx")))
3437         {
3438           if (silicon_errata_fix & SILICON_ERRATA_CPU11)
3439             as_bad (_("CPU11: PC is destinstion of SR altering instruction"));
3440           else if (silicon_errata_warn & SILICON_ERRATA_CPU11)
3441             as_warn (_("CPU11: PC is destinstion of SR altering instruction"));
3442         }
3443           
3444       /* If the status register is the destination...  */
3445       if (op2.am == 0 && op2.reg == 2
3446           /* ... and the opcode alters the SR.  */
3447           && (is_opcode ("add") || is_opcode ("addc") || is_opcode ("and")
3448               || is_opcode ("dadd") || is_opcode ("sub") || is_opcode ("subc")
3449               || is_opcode ("xor")
3450               || is_opcode ("addx") || is_opcode ("addcx") || is_opcode ("andx")
3451               || is_opcode ("daddx") || is_opcode ("subx") || is_opcode ("subcx")
3452               || is_opcode ("xorx")
3453               ))
3454         {
3455           if (silicon_errata_fix & SILICON_ERRATA_CPU13)
3456             as_bad (_("CPU13: SR is destinstion of SR altering instruction"));
3457           else if (silicon_errata_warn & SILICON_ERRATA_CPU13)
3458             as_warn (_("CPU13: SR is destinstion of SR altering instruction"));
3459         }
3460           
3461       if (   (is_opcode ("bic") && bin == 0xc232)
3462           || (is_opcode ("bis") && bin == 0xd232)
3463           || (is_opcode ("mov") && op2.mode == OP_REG && op2.reg == 2))
3464         {
3465           /* Avoid false checks when a constant value is being put into the SR.  */
3466           if (op1.mode == OP_EXP
3467               && op1.exp.X_op == O_constant
3468               && (op1.exp.X_add_number & 0x8) != 0x8)
3469             ;
3470           else
3471             check_for_nop |= NOP_CHECK_INTERRUPT;
3472         }
3473
3474       if (((is_opcode ("bis") && bin == 0xd032)
3475            || (is_opcode ("mov") && bin == 0x4032)
3476            || (is_opcode ("xor") && bin == 0xe032))
3477           && op1.mode == OP_EXP
3478           && op1.exp.X_op == O_constant
3479           && (op1.exp.X_add_number & 0x10) == 0x10)
3480         check_for_nop |= NOP_CHECK_CPU19;
3481
3482       /* Compute the entire length of the instruction in bytes.  */
3483       op_length = (extended_op ? 2 : 0) /* The extension word.  */
3484         + 2                     /* The opcode */
3485         + (2 * op1.ol)          /* The first operand. */
3486         + (2 * op2.ol);         /* The second operand.  */
3487
3488       insn_length += op_length;
3489       frag = frag_more (op_length);
3490       where = frag - frag_now->fr_literal;
3491
3492       if (extended_op)
3493         {
3494           if (!addr_op)
3495             extended |= BYTE_OPERATION;
3496
3497           if ((op1.ol != 0 || op2.ol != 0) && ((extended & 0xf) != 0))
3498             {
3499               as_bad (_("repeat instruction used with non-register mode instruction"));
3500               extended &= ~ 0xf;
3501             }
3502
3503           /* If necessary, emit a reloc to update the extension word.  */
3504           if (op1.mode == OP_EXP)
3505             {
3506               if (op1.exp.X_op == O_constant)
3507                 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7;
3508
3509               else  if (op1.reg || op1.am == 3) /* Not PC relative.  */
3510                 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE,
3511                              BFD_RELOC_MSP430X_ABS20_EXT_SRC);
3512               else
3513                 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE,
3514                              BFD_RELOC_MSP430X_PCR20_EXT_SRC);
3515             }
3516
3517           if (op2.mode == OP_EXP)
3518             {
3519               if (op2.exp.X_op == O_constant)
3520                 extended |= (op2.exp.X_add_number >> 16) & 0xf;
3521
3522               else if (op1.mode == OP_EXP)
3523                 fix_new_exp (frag_now, where, 8, &(op2.exp), FALSE,
3524                              op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_ODST
3525                              : BFD_RELOC_MSP430X_PCR20_EXT_ODST);
3526
3527               else
3528                 fix_new_exp (frag_now, where, 6, &(op2.exp), FALSE,
3529                              op2.reg ? BFD_RELOC_MSP430X_ABS20_EXT_DST
3530                              : BFD_RELOC_MSP430X_PCR20_EXT_DST);
3531             }
3532
3533           /* Emit the extension word.  */
3534           bfd_putl16 (extended, frag);
3535           where += 2;
3536           frag += 2;
3537         }
3538
3539       bfd_putl16 ((bfd_vma) bin, frag);
3540       where += 2;
3541       frag += 2;
3542
3543       if (op1.mode == OP_EXP)
3544         {
3545           if (op1.exp.X_op == O_constant)
3546             {
3547               bfd_putl16 (op1.exp.X_add_number & 0xffff, frag);
3548             }
3549           else
3550             {
3551               bfd_putl16 ((bfd_vma) ZEROS, frag);
3552
3553               if (!extended_op)
3554                 {
3555                   if (op1.reg || op1.am == 3)   /* Not PC relative.  */
3556                     fix_new_exp (frag_now, where, 2,
3557                                  &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1));
3558                   else
3559                     fix_new_exp (frag_now, where, 2,
3560                                  &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
3561                 }
3562             }
3563
3564           where += 2;
3565           frag += 2;
3566         }
3567
3568       if (op2.mode == OP_EXP)
3569         {
3570           if (op2.exp.X_op == O_constant)
3571             {
3572               bfd_putl16 (op2.exp.X_add_number & 0xffff, frag);
3573             }
3574           else
3575             {
3576               bfd_putl16 ((bfd_vma) ZEROS, frag);
3577
3578               if (!extended_op)
3579                 {
3580                   if (op2.reg)          /* Not PC relative.  */
3581                     fix_new_exp (frag_now, where, 2,
3582                                  &(op2.exp), FALSE, CHECK_RELOC_MSP430 (op2));
3583                   else
3584                     fix_new_exp (frag_now, where, 2,
3585                                  &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
3586                 }
3587             }
3588         }
3589
3590       dwarf2_emit_insn (insn_length);
3591
3592       /* If the PC is the destination...  */
3593       if (op2.am == 0 && op2.reg == 0
3594           /* ... but the opcode does not alter the destination.  */
3595           && (is_opcode ("cmp") || is_opcode ("bit") || is_opcode ("cmpx")))
3596         check_for_nop |= NOP_CHECK_CPU12;
3597       break;
3598
3599     case 2:                     /* Single-operand mostly instr.  */
3600       if (opcode->insn_opnumb == 0)
3601         {
3602           /* reti instruction.  */
3603           insn_length += 2;
3604           frag = frag_more (2);
3605           bfd_putl16 ((bfd_vma) bin, frag);
3606           dwarf2_emit_insn (insn_length);
3607           break;
3608         }
3609
3610       line = extract_operand (line, l1, sizeof (l1));
3611       res = msp430_srcoperand (&op1, l1, opcode->bin_opcode,
3612                                &imm_op, extended_op, TRUE);
3613       if (res)
3614         break;          /* Error in operand.  */
3615
3616       if (target_is_430xv2 ()
3617           && op1.mode == OP_REG
3618           && op1.reg == 0
3619           && (is_opcode ("rrax")
3620               || is_opcode ("rrcx")
3621               || is_opcode ("rra")
3622               || is_opcode ("rrc")))
3623         {
3624           as_bad (_("%s: attempt to rotate the PC register"), opcode->name);
3625           break;
3626         }
3627
3628       /* If the status register is the destination...  */
3629       if (op1.am == 0 && op1.reg == 2
3630           /* ... and the opcode alters the SR.  */
3631           && (is_opcode ("rra") || is_opcode ("rrc") || is_opcode ("sxt")))
3632         {
3633           if (silicon_errata_fix & SILICON_ERRATA_CPU13)
3634             as_bad (_("CPU13: SR is destinstion of SR altering instruction"));
3635           else if (silicon_errata_warn & SILICON_ERRATA_CPU13)
3636             as_warn (_("CPU13: SR is destinstion of SR altering instruction"));
3637         }
3638           
3639       insn_length = (extended_op ? 2 : 0) + 2 + (op1.ol * 2);
3640       frag = frag_more (insn_length);
3641       where = frag - frag_now->fr_literal;
3642
3643       if (extended_op)
3644         {
3645           if (is_opcode ("swpbx") || is_opcode ("sxtx"))
3646             {
3647               /* These two instructions use a special
3648                  encoding of the A/L and B/W bits.  */
3649               bin &= ~ BYTE_OPERATION;
3650
3651               if (byte_op)
3652                 {
3653                   as_bad (_("%s instruction does not accept a .b suffix"),
3654                           opcode->name);
3655                   break;
3656                 }
3657               else if (! addr_op)
3658                 extended |= BYTE_OPERATION;
3659             }
3660           else if (! addr_op)
3661             extended |= BYTE_OPERATION;
3662
3663           if (op1.ol != 0 && ((extended & 0xf) != 0))
3664             {
3665               as_bad (_("repeat instruction used with non-register mode instruction"));
3666               extended &= ~ 0xf;
3667             }
3668
3669           if (op1.mode == OP_EXP)
3670             {
3671               if (op1.exp.X_op == O_constant)
3672                 extended |= ((op1.exp.X_add_number >> 16) & 0xf) << 7;
3673
3674               else if (op1.reg || op1.am == 3)  /* Not PC relative.  */
3675                 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE,
3676                              BFD_RELOC_MSP430X_ABS20_EXT_SRC);
3677               else
3678                 fix_new_exp (frag_now, where, 6, &(op1.exp), FALSE,
3679                              BFD_RELOC_MSP430X_PCR20_EXT_SRC);
3680             }
3681
3682           /* Emit the extension word.  */
3683           bfd_putl16 (extended, frag);
3684           frag += 2;
3685           where += 2;
3686         }
3687
3688       bin |= op1.reg | (op1.am << 4);
3689       bfd_putl16 ((bfd_vma) bin, frag);
3690       frag += 2;
3691       where += 2;
3692
3693       if (op1.mode == OP_EXP)
3694         {
3695           if (op1.exp.X_op == O_constant)
3696             {
3697               bfd_putl16 (op1.exp.X_add_number & 0xffff, frag);
3698             }
3699           else
3700             {
3701               bfd_putl16 ((bfd_vma) ZEROS, frag);
3702
3703               if (!extended_op)
3704                 {
3705                   if (op1.reg || op1.am == 3)   /* Not PC relative.  */
3706                     fix_new_exp (frag_now, where, 2,
3707                                  &(op1.exp), FALSE, CHECK_RELOC_MSP430 (op1));
3708                   else
3709                     fix_new_exp (frag_now, where, 2,
3710                                  &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
3711                 }
3712             }
3713         }
3714
3715       dwarf2_emit_insn (insn_length);
3716       break;
3717
3718     case 3:                     /* Conditional jumps instructions.  */
3719       line = extract_operand (line, l1, sizeof (l1));
3720       /* l1 is a label.  */
3721       if (l1[0])
3722         {
3723           char *m = l1;
3724           expressionS exp;
3725
3726           if (*m == '$')
3727             m++;
3728
3729           parse_exp (m, &exp);
3730
3731           /* In order to handle something like:
3732
3733              and #0x8000, r5
3734              tst r5
3735              jz   4     ;       skip next 4 bytes
3736              inv r5
3737              inc r5
3738              nop        ;       will jump here if r5 positive or zero
3739
3740              jCOND      -n      ;assumes jump n bytes backward:
3741
3742              mov r5,r6
3743              jmp -2
3744
3745              is equal to:
3746              lab:
3747              mov r5,r6
3748              jmp lab
3749
3750              jCOND      $n      ; jump from PC in either direction.  */
3751
3752           if (exp.X_op == O_constant)
3753             {
3754               int x = exp.X_add_number;
3755
3756               if (x & 1)
3757                 {
3758                   as_warn (_("Even number required. Rounded to %d"), x + 1);
3759                   x++;
3760                 }
3761
3762               if ((*l1 == '$' && x > 0) || x < 0)
3763                 x -= 2;
3764
3765               x >>= 1;
3766
3767               if (x > 512 || x < -511)
3768                 {
3769                   as_bad (_("Wrong displacement  %d"), x << 1);
3770                   break;
3771                 }
3772
3773               insn_length += 2;
3774               frag = frag_more (2);     /* Instr size is 1 word.  */
3775
3776               bin |= x & 0x3ff;
3777               bfd_putl16 ((bfd_vma) bin, frag);
3778             }
3779           else if (exp.X_op == O_symbol && *l1 != '$')
3780             {
3781               insn_length += 2;
3782               frag = frag_more (2);     /* Instr size is 1 word.  */
3783               where = frag - frag_now->fr_literal;
3784               fix_new_exp (frag_now, where, 2,
3785                            &exp, TRUE, BFD_RELOC_MSP430_10_PCREL);
3786
3787               bfd_putl16 ((bfd_vma) bin, frag);
3788             }
3789           else if (*l1 == '$')
3790             {
3791               as_bad (_("instruction requires label sans '$'"));
3792             }
3793           else
3794             as_bad (_
3795                     ("instruction requires label or value in range -511:512"));
3796           dwarf2_emit_insn (insn_length);
3797           break;
3798         }
3799       else
3800         {
3801           as_bad (_("instruction requires label"));
3802           break;
3803         }
3804       break;
3805
3806     case 4:     /* Extended jumps.  */
3807       if (!msp430_enable_polys)
3808         {
3809           as_bad (_("polymorphs are not enabled. Use -mP option to enable."));
3810           break;
3811         }
3812
3813       line = extract_operand (line, l1, sizeof (l1));
3814       if (l1[0])
3815         {
3816           char *m = l1;
3817           expressionS exp;
3818
3819           /* Ignore absolute addressing. make it PC relative anyway.  */
3820           if (*m == '#' || *m == '$')
3821             m++;
3822
3823           parse_exp (m, & exp);
3824           if (exp.X_op == O_symbol)
3825             {
3826               /* Relaxation required.  */
3827               struct rcodes_s rc = msp430_rcodes[opcode->insn_opnumb];
3828
3829               if (target_is_430x ())
3830                 rc = msp430x_rcodes[opcode->insn_opnumb];
3831
3832               /* The parameter to dwarf2_emit_insn is actually the offset to
3833                  the start of the insn from the fix piece of instruction that
3834                  was emitted.  Since next fragments may have variable size we
3835                  tie debug info to the beginning of the instruction.  */
3836               insn_length += 8;
3837               frag = frag_more (8);
3838               dwarf2_emit_insn (0);
3839               bfd_putl16 ((bfd_vma) rc.sop, frag);
3840               frag = frag_variant (rs_machine_dependent, 8, 2,
3841                                     /* Wild guess.  */
3842                                    ENCODE_RELAX (rc.lpos, STATE_BITS10),
3843                                    exp.X_add_symbol,
3844                                    0,   /* Offset is zero if jump dist less than 1K.  */
3845                                    (char *) frag);
3846               break;
3847             }
3848         }
3849
3850       as_bad (_("instruction requires label"));
3851       break;
3852
3853     case 5:     /* Emulated extended branches.  */
3854       if (!msp430_enable_polys)
3855         {
3856           as_bad (_("polymorphs are not enabled. Use -mP option to enable."));
3857           break;
3858         }
3859       line = extract_operand (line, l1, sizeof (l1));
3860       if (l1[0])
3861         {
3862           char * m = l1;
3863           expressionS exp;
3864
3865           /* Ignore absolute addressing. make it PC relative anyway.  */
3866           if (*m == '#' || *m == '$')
3867             m++;
3868
3869           parse_exp (m, & exp);
3870           if (exp.X_op == O_symbol)
3871             {
3872               /* Relaxation required.  */
3873               struct hcodes_s hc = msp430_hcodes[opcode->insn_opnumb];
3874
3875               if (target_is_430x ())
3876                 hc = msp430x_hcodes[opcode->insn_opnumb];
3877
3878               insn_length += 8;
3879               frag = frag_more (8);
3880               dwarf2_emit_insn (0);
3881               bfd_putl16 ((bfd_vma) hc.op0, frag);
3882               bfd_putl16 ((bfd_vma) hc.op1, frag+2);
3883
3884               frag = frag_variant (rs_machine_dependent, 8, 2,
3885                                    ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10), /* Wild guess.  */
3886                                    exp.X_add_symbol,
3887                                    0,   /* Offset is zero if jump dist less than 1K.  */
3888                                    (char *) frag);
3889               break;
3890             }
3891         }
3892
3893       as_bad (_("instruction requires label"));
3894       break;
3895
3896     default:
3897       as_bad (_("Illegal instruction or not implemented opcode."));
3898     }
3899
3900   input_line_pointer = line;
3901   return 0;
3902 }
3903
3904 void
3905 md_assemble (char * str)
3906 {
3907   struct msp430_opcode_s * opcode;
3908   char cmd[32];
3909   unsigned int i = 0;
3910
3911   str = skip_space (str);       /* Skip leading spaces.  */
3912   str = extract_cmd (str, cmd, sizeof (cmd) - 1);
3913
3914   while (cmd[i])
3915     {
3916       char a = TOLOWER (cmd[i]);
3917       cmd[i] = a;
3918       i++;
3919     }
3920
3921   if (!cmd[0])
3922     {
3923       as_bad (_("can't find opcode "));
3924       return;
3925     }
3926
3927   opcode = (struct msp430_opcode_s *) hash_find (msp430_hash, cmd);
3928
3929   if (opcode == NULL)
3930     {
3931       as_bad (_("unknown opcode `%s'"), cmd);
3932       return;
3933     }
3934
3935   {
3936     char *__t = input_line_pointer;
3937
3938     msp430_operands (opcode, str);
3939     input_line_pointer = __t;
3940   }
3941 }
3942
3943 /* GAS will call this function for each section at the end of the assembly,
3944    to permit the CPU backend to adjust the alignment of a section.  */
3945
3946 valueT
3947 md_section_align (asection * seg, valueT addr)
3948 {
3949   int align = bfd_get_section_alignment (stdoutput, seg);
3950
3951   return ((addr + (1 << align) - 1) & -(1 << align));
3952 }
3953
3954 /* If you define this macro, it should return the offset between the
3955    address of a PC relative fixup and the position from which the PC
3956    relative adjustment should be made.  On many processors, the base
3957    of a PC relative instruction is the next instruction, so this
3958    macro would return the length of an instruction.  */
3959
3960 long
3961 md_pcrel_from_section (fixS * fixp, segT sec)
3962 {
3963   if (fixp->fx_addsy != (symbolS *) NULL
3964       && (!S_IS_DEFINED (fixp->fx_addsy)
3965           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
3966     return 0;
3967
3968   return fixp->fx_frag->fr_address + fixp->fx_where;
3969 }
3970
3971 /* Replaces standard TC_FORCE_RELOCATION_LOCAL.
3972    Now it handles the situation when relocations
3973    have to be passed to linker.  */
3974 int
3975 msp430_force_relocation_local (fixS *fixp)
3976 {
3977   if (fixp->fx_r_type == BFD_RELOC_MSP430_10_PCREL)
3978     return 1;
3979   if (fixp->fx_pcrel)
3980     return 1;
3981   if (msp430_enable_polys
3982         && !msp430_enable_relax)
3983     return 1;
3984
3985   return (!fixp->fx_pcrel
3986           || generic_force_reloc (fixp));
3987 }
3988
3989
3990 /* GAS will call this for each fixup.  It should store the correct
3991    value in the object file.  */
3992 void
3993 md_apply_fix (fixS * fixp, valueT * valuep, segT seg)
3994 {
3995   unsigned char * where;
3996   unsigned long insn;
3997   long value;
3998
3999   if (fixp->fx_addsy == (symbolS *) NULL)
4000     {
4001       value = *valuep;
4002       fixp->fx_done = 1;
4003     }
4004   else if (fixp->fx_pcrel)
4005     {
4006       segT s = S_GET_SEGMENT (fixp->fx_addsy);
4007
4008       if (fixp->fx_addsy && (s == seg || s == absolute_section))
4009         {
4010           /* FIXME: We can appear here only in case if we perform a pc
4011              relative jump to the label which is i) global, ii) locally
4012              defined or this is a jump to an absolute symbol.
4013              If this is an absolute symbol -- everything is OK.
4014              If this is a global label, we've got a symbol value defined
4015              twice:
4016                1. S_GET_VALUE (fixp->fx_addsy) will contain a symbol offset
4017                   from this section start
4018                2. *valuep will contain the real offset from jump insn to the
4019                   label
4020              So, the result of S_GET_VALUE (fixp->fx_addsy) + (* valuep);
4021              will be incorrect. Therefore remove s_get_value.  */
4022           value = /* S_GET_VALUE (fixp->fx_addsy) + */ * valuep;
4023           fixp->fx_done = 1;
4024         }
4025       else
4026         value = *valuep;
4027     }
4028   else
4029     {
4030       value = fixp->fx_offset;
4031
4032       if (fixp->fx_subsy != (symbolS *) NULL)
4033         {
4034           if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
4035             {
4036               value -= S_GET_VALUE (fixp->fx_subsy);
4037               fixp->fx_done = 1;
4038             }
4039         }
4040     }
4041
4042   fixp->fx_no_overflow = 1;
4043
4044   /* If polymorphs are enabled and relax disabled.
4045      do not kill any relocs and pass them to linker.  */
4046   if (msp430_enable_polys
4047       && !msp430_enable_relax)
4048     {
4049       if (!fixp->fx_addsy
4050           || S_GET_SEGMENT (fixp->fx_addsy) == absolute_section)
4051         fixp->fx_done = 1;      /* It is ok to kill 'abs' reloc.  */
4052       else
4053         fixp->fx_done = 0;
4054     }
4055
4056   if (fixp->fx_done)
4057     {
4058       /* Fetch the instruction, insert the fully resolved operand
4059          value, and stuff the instruction back again.  */
4060       where = (unsigned char *) fixp->fx_frag->fr_literal + fixp->fx_where;
4061
4062       insn = bfd_getl16 (where);
4063
4064       switch (fixp->fx_r_type)
4065         {
4066         case BFD_RELOC_MSP430_10_PCREL:
4067           if (value & 1)
4068             as_bad_where (fixp->fx_file, fixp->fx_line,
4069                           _("odd address operand: %ld"), value);
4070
4071           /* Jumps are in words.  */
4072           value >>= 1;
4073           --value;              /* Correct PC.  */
4074
4075           if (value < -512 || value > 511)
4076             as_bad_where (fixp->fx_file, fixp->fx_line,
4077                           _("operand out of range: %ld"), value);
4078
4079           value &= 0x3ff;       /* get rid of extended sign */
4080           bfd_putl16 ((bfd_vma) (value | insn), where);
4081           break;
4082
4083         case BFD_RELOC_MSP430X_PCR16:
4084         case BFD_RELOC_MSP430_RL_PCREL:
4085         case BFD_RELOC_MSP430_16_PCREL:
4086           if (value & 1)
4087             as_bad_where (fixp->fx_file, fixp->fx_line,
4088                           _("odd address operand: %ld"), value);
4089           /* Fall through.  */
4090
4091         case BFD_RELOC_MSP430_16_PCREL_BYTE:
4092           /* Nothing to be corrected here.  */
4093           if (value < -32768 || value > 65536)
4094             as_bad_where (fixp->fx_file, fixp->fx_line,
4095                           _("operand out of range: %ld"), value);
4096           /* Fall through.  */
4097
4098         case BFD_RELOC_MSP430X_ABS16:
4099         case BFD_RELOC_MSP430_16:
4100         case BFD_RELOC_16:
4101         case BFD_RELOC_MSP430_16_BYTE:
4102           value &= 0xffff;      /* Get rid of extended sign.  */
4103           bfd_putl16 ((bfd_vma) value, where);
4104           break;
4105
4106         case BFD_RELOC_MSP430_ABS_HI16:
4107           value >>= 16;
4108           value &= 0xffff;      /* Get rid of extended sign.  */
4109           bfd_putl16 ((bfd_vma) value, where);
4110           break;
4111
4112         case BFD_RELOC_32:
4113           bfd_putl16 ((bfd_vma) value, where);
4114           break;
4115
4116         case BFD_RELOC_MSP430_ABS8:
4117         case BFD_RELOC_8:
4118           bfd_put_8 (NULL, (bfd_vma) value, where);
4119           break;
4120
4121         case BFD_RELOC_MSP430X_ABS20_EXT_SRC:
4122         case BFD_RELOC_MSP430X_PCR20_EXT_SRC:
4123           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 4);
4124           value >>= 16;
4125           bfd_putl16 ((bfd_vma) (((value & 0xf) << 7) | insn), where);
4126           break;
4127
4128         case BFD_RELOC_MSP430X_ABS20_ADR_SRC:
4129           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
4130           value >>= 16;
4131           bfd_putl16 ((bfd_vma) (((value & 0xf) << 8) | insn), where);
4132           break;
4133
4134         case BFD_RELOC_MSP430X_ABS20_EXT_ODST:
4135           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 6);
4136           value >>= 16;
4137           bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where);
4138           break;
4139
4140         case BFD_RELOC_MSP430X_PCR20_CALL:
4141           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
4142           value >>= 16;
4143           bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where);
4144           break;
4145
4146         case BFD_RELOC_MSP430X_ABS20_EXT_DST:
4147         case BFD_RELOC_MSP430X_PCR20_EXT_DST:
4148           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 4);
4149           value >>= 16;
4150           bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where);
4151           break;
4152
4153         case BFD_RELOC_MSP430X_PCR20_EXT_ODST:
4154           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 6);
4155           value >>= 16;
4156           bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where);
4157           break;
4158
4159         case BFD_RELOC_MSP430X_ABS20_ADR_DST:
4160           bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
4161           value >>= 16;
4162           bfd_putl16 ((bfd_vma) ((value & 0xf) | insn), where);
4163           break;
4164
4165         default:
4166           as_fatal (_("line %d: unknown relocation type: 0x%x"),
4167                     fixp->fx_line, fixp->fx_r_type);
4168           break;
4169         }
4170     }
4171   else
4172     {
4173       fixp->fx_addnumber = value;
4174     }
4175 }
4176
4177 static bfd_boolean
4178 S_IS_GAS_LOCAL (symbolS * s)
4179 {
4180   const char * name;
4181   unsigned int len;
4182
4183   if (s == NULL)
4184     return FALSE;
4185   name = S_GET_NAME (s);
4186   len = strlen (name) - 1;
4187
4188   return name[len] == 1 || name[len] == 2;
4189 }
4190
4191 /* GAS will call this to generate a reloc, passing the resulting reloc
4192    to `bfd_install_relocation'.  This currently works poorly, as
4193    `bfd_install_relocation' often does the wrong thing, and instances of
4194    `tc_gen_reloc' have been written to work around the problems, which
4195    in turns makes it difficult to fix `bfd_install_relocation'.  */
4196
4197 /* If while processing a fixup, a reloc really needs to be created
4198    then it is done here.  */
4199
4200 arelent **
4201 tc_gen_reloc (asection * seg ATTRIBUTE_UNUSED, fixS * fixp)
4202 {
4203   static arelent * no_relocs = NULL;
4204   static arelent * relocs[MAX_RELOC_EXPANSION + 1];
4205   arelent *reloc;
4206
4207   reloc = xmalloc (sizeof (arelent));
4208   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4209   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
4210
4211   if (reloc->howto == (reloc_howto_type *) NULL)
4212     {
4213       as_bad_where (fixp->fx_file, fixp->fx_line,
4214                     _("reloc %d not supported by object file format"),
4215                     (int) fixp->fx_r_type);
4216       free (reloc);
4217       return & no_relocs;
4218     }
4219
4220   relocs[0] = reloc;
4221   relocs[1] = NULL;
4222
4223   if (fixp->fx_subsy
4224       && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
4225     {
4226       fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy);
4227       fixp->fx_subsy = NULL;
4228     }
4229
4230   if (fixp->fx_addsy && fixp->fx_subsy)
4231     {
4232       asection *asec, *ssec;
4233
4234       asec = S_GET_SEGMENT (fixp->fx_addsy);
4235       ssec = S_GET_SEGMENT (fixp->fx_subsy);
4236
4237       /* If we have a difference between two different, non-absolute symbols
4238          we must generate two relocs (one for each symbol) and allow the
4239          linker to resolve them - relaxation may change the distances between
4240          symbols, even local symbols defined in the same section.
4241
4242          Unfortunately we cannot do this with assembler generated local labels
4243          because there can be multiple incarnations of the same label, with
4244          exactly the same name, in any given section and the linker will have
4245          no way to identify the correct one.  Instead we just have to hope
4246          that no relaxtion will occur between the local label and the other
4247          symbol in the expression.
4248
4249          Similarly we have to compute differences between symbols in the .eh_frame
4250          section as the linker is not smart enough to apply relocations there
4251          before attempting to process it.  */
4252       if ((ssec != absolute_section || asec != absolute_section)
4253           && (fixp->fx_addsy != fixp->fx_subsy)
4254           && strcmp (ssec->name, ".eh_frame") != 0
4255           && ! S_IS_GAS_LOCAL (fixp->fx_addsy)
4256           && ! S_IS_GAS_LOCAL (fixp->fx_subsy))
4257         {
4258           arelent * reloc2 = xmalloc (sizeof * reloc);
4259
4260           relocs[0] = reloc2;
4261           relocs[1] = reloc;
4262
4263           reloc2->address = reloc->address;
4264           reloc2->howto = bfd_reloc_type_lookup (stdoutput,
4265                                                  BFD_RELOC_MSP430_SYM_DIFF);
4266           reloc2->addend = - S_GET_VALUE (fixp->fx_subsy);
4267
4268           if (ssec == absolute_section)
4269             reloc2->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4270           else
4271             {
4272               reloc2->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4273               *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
4274             }
4275
4276           reloc->addend = fixp->fx_offset;
4277           if (asec == absolute_section)
4278             {
4279               reloc->addend += S_GET_VALUE (fixp->fx_addsy);
4280               reloc->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4281             }
4282           else
4283             {
4284               reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4285               *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
4286             }
4287
4288           fixp->fx_pcrel = 0;
4289           fixp->fx_done = 1;
4290           return relocs;
4291         }
4292       else
4293         {
4294           char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
4295
4296           reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
4297                            - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
4298
4299           switch (fixp->fx_r_type)
4300             {
4301             case BFD_RELOC_8:
4302               md_number_to_chars (fixpos, reloc->addend, 1);
4303               break;
4304
4305             case BFD_RELOC_16:
4306               md_number_to_chars (fixpos, reloc->addend, 2);
4307               break;
4308
4309             case BFD_RELOC_24:
4310               md_number_to_chars (fixpos, reloc->addend, 3);
4311               break;
4312
4313             case BFD_RELOC_32:
4314               md_number_to_chars (fixpos, reloc->addend, 4);
4315               break;
4316
4317             default:
4318               reloc->sym_ptr_ptr
4319                 = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
4320               return relocs;
4321             }
4322
4323           free (reloc);
4324           return & no_relocs;
4325         }
4326     }
4327   else
4328     {
4329 #if 0
4330       if (fixp->fx_r_type == BFD_RELOC_MSP430X_ABS16
4331           && S_GET_SEGMENT (fixp->fx_addsy) == absolute_section)
4332         {
4333           bfd_vma amount = S_GET_VALUE (fixp->fx_addsy);
4334           char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
4335
4336           md_number_to_chars (fixpos, amount, 2);
4337           free (reloc);
4338           return & no_relocs;
4339         }
4340 #endif
4341       reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4342       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
4343       reloc->addend = fixp->fx_offset;
4344
4345       if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4346           || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4347         reloc->address = fixp->fx_offset;
4348     }
4349
4350   return relocs;
4351 }
4352
4353 int
4354 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
4355                                asection * segment_type ATTRIBUTE_UNUSED)
4356 {
4357   if (fragP->fr_symbol && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
4358     {
4359       /* This is a jump -> pcrel mode. Nothing to do much here.
4360          Return value == 2.  */
4361       fragP->fr_subtype =
4362           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_BITS10);
4363     }
4364   else if (fragP->fr_symbol)
4365     {
4366       /* Its got a segment, but its not ours.   Even if fr_symbol is in
4367          an absolute segment, we don't know a displacement until we link
4368          object files. So it will always be long. This also applies to
4369          labels in a subsegment of current. Liker may relax it to short
4370          jump later. Return value == 8.  */
4371       fragP->fr_subtype =
4372           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_WORD);
4373     }
4374   else
4375     {
4376       /* We know the abs value. may be it is a jump to fixed address.
4377          Impossible in our case, cause all constants already handled. */
4378       fragP->fr_subtype =
4379           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_UNDEF);
4380     }
4381
4382   return md_relax_table[fragP->fr_subtype].rlx_length;
4383 }
4384
4385 void
4386 md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED,
4387                  asection * sec ATTRIBUTE_UNUSED,
4388                  fragS * fragP)
4389 {
4390   char * where = 0;
4391   int rela = -1;
4392   int i;
4393   struct rcodes_s * cc = NULL;
4394   struct hcodes_s * hc = NULL;
4395
4396   switch (fragP->fr_subtype)
4397     {
4398     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_BITS10):
4399     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_BITS10):
4400     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_BITS10):
4401       /* We do not have to convert anything here.
4402          Just apply a fix.  */
4403       rela = BFD_RELOC_MSP430_10_PCREL;
4404       break;
4405
4406     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_WORD):
4407     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_UNDEF):
4408       /* Convert uncond branch jmp lab -> br lab.  */
4409       if (target_is_430x ())
4410         cc = msp430x_rcodes + 7;
4411       else
4412         cc = msp430_rcodes + 7;
4413       where = fragP->fr_literal + fragP->fr_fix;
4414       bfd_putl16 (cc->lop0, where);
4415       rela = BFD_RELOC_MSP430_RL_PCREL;
4416       fragP->fr_fix += 2;
4417       break;
4418
4419     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_WORD):
4420     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_UNDEF):
4421       {
4422         /* Other simple branches.  */
4423         int insn = bfd_getl16 (fragP->fr_opcode);
4424
4425         insn &= 0xffff;
4426         /* Find actual instruction.  */
4427         if (target_is_430x ())
4428           {
4429             for (i = 0; i < 7 && !cc; i++)
4430               if (msp430x_rcodes[i].sop == insn)
4431                 cc = msp430x_rcodes + i;
4432           }
4433         else
4434           {
4435             for (i = 0; i < 7 && !cc; i++)
4436               if (msp430_rcodes[i].sop == insn)
4437                 cc = & msp430_rcodes[i];
4438           }
4439
4440         if (!cc || !cc->name)
4441           as_fatal (_("internal inconsistency problem in %s: insn %04lx"),
4442                     __FUNCTION__, (long) insn);
4443         where = fragP->fr_literal + fragP->fr_fix;
4444         bfd_putl16 (cc->lop0, where);
4445         bfd_putl16 (cc->lop1, where + 2);
4446         rela = BFD_RELOC_MSP430_RL_PCREL;
4447         fragP->fr_fix += 4;
4448       }
4449       break;
4450
4451     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_WORD):
4452     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_UNDEF):
4453       if (target_is_430x ())
4454         cc = msp430x_rcodes + 6;
4455       else
4456         cc = msp430_rcodes + 6;
4457       where = fragP->fr_literal + fragP->fr_fix;
4458       bfd_putl16 (cc->lop0, where);
4459       bfd_putl16 (cc->lop1, where + 2);
4460       bfd_putl16 (cc->lop2, where + 4);
4461       rela = BFD_RELOC_MSP430_RL_PCREL;
4462       fragP->fr_fix += 6;
4463       break;
4464
4465     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10):
4466       {
4467         int insn = bfd_getl16 (fragP->fr_opcode + 2);
4468
4469         insn &= 0xffff;
4470         if (target_is_430x ())
4471           {
4472             for (i = 0; i < 4 && !hc; i++)
4473               if (msp430x_hcodes[i].op1 == insn)
4474                 hc = msp430x_hcodes + i;
4475           }
4476         else
4477           {
4478             for (i = 0; i < 4 && !hc; i++)
4479               if (msp430_hcodes[i].op1 == insn)
4480                 hc = &msp430_hcodes[i];
4481           }
4482         if (!hc || !hc->name)
4483           as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"),
4484               __FUNCTION__, (long) insn);
4485         rela = BFD_RELOC_MSP430_10_PCREL;
4486         /* Apply a fix for a first label if necessary.
4487            another fix will be applied to the next word of insn anyway.  */
4488         if (hc->tlab == 2)
4489           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4490                    fragP->fr_offset, TRUE, rela);
4491         fragP->fr_fix += 2;
4492       }
4493
4494       break;
4495
4496     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_WORD):
4497     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_UNDEF):
4498       {
4499         int insn = bfd_getl16 (fragP->fr_opcode + 2);
4500
4501         insn &= 0xffff;
4502         if (target_is_430x ())
4503           {
4504             for (i = 0; i < 4 && !hc; i++)
4505               if (msp430x_hcodes[i].op1 == insn)
4506                 hc = msp430x_hcodes + i;
4507           }
4508         else
4509           {
4510             for (i = 0; i < 4 && !hc; i++)
4511               if (msp430_hcodes[i].op1 == insn)
4512                 hc = & msp430_hcodes[i];
4513           }
4514         if (!hc || !hc->name)
4515           as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"),
4516               __FUNCTION__, (long) insn);
4517         rela = BFD_RELOC_MSP430_RL_PCREL;
4518         where = fragP->fr_literal + fragP->fr_fix;
4519         bfd_putl16 (hc->lop0, where);
4520         bfd_putl16 (hc->lop1, where + 2);
4521         bfd_putl16 (hc->lop2, where + 4);
4522         fragP->fr_fix += 6;
4523       }
4524       break;
4525
4526     default:
4527       as_fatal (_("internal inconsistency problem in %s:  %lx"),
4528                 __FUNCTION__, (long) fragP->fr_subtype);
4529       break;
4530     }
4531
4532   /* Now apply fix.  */
4533   fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4534            fragP->fr_offset, TRUE, rela);
4535   /* Just fixed 2 bytes.  */
4536   fragP->fr_fix += 2;
4537 }
4538
4539 /* Relax fragment. Mostly stolen from hc11 and mcore
4540    which arches I think I know.  */
4541
4542 long
4543 msp430_relax_frag (segT seg ATTRIBUTE_UNUSED, fragS * fragP,
4544                    long stretch ATTRIBUTE_UNUSED)
4545 {
4546   long growth;
4547   offsetT aim = 0;
4548   symbolS *symbolP;
4549   const relax_typeS *this_type;
4550   const relax_typeS *start_type;
4551   relax_substateT next_state;
4552   relax_substateT this_state;
4553   const relax_typeS *table = md_relax_table;
4554
4555   /* Nothing to be done if the frag has already max size.  */
4556   if (RELAX_STATE (fragP->fr_subtype) == STATE_UNDEF
4557       || RELAX_STATE (fragP->fr_subtype) == STATE_WORD)
4558     return 0;
4559
4560   if (RELAX_STATE (fragP->fr_subtype) == STATE_BITS10)
4561     {
4562       symbolP = fragP->fr_symbol;
4563       if (symbol_resolved_p (symbolP))
4564         as_fatal (_("internal inconsistency problem in %s: resolved symbol"),
4565                   __FUNCTION__);
4566       /* We know the offset. calculate a distance.  */
4567       aim = S_GET_VALUE (symbolP) - fragP->fr_address - fragP->fr_fix;
4568     }
4569
4570   if (!msp430_enable_relax)
4571     {
4572       /* Relaxation is not enabled. So, make all jump as long ones
4573          by setting 'aim' to quite high value.  */
4574       aim = 0x7fff;
4575     }
4576
4577   this_state = fragP->fr_subtype;
4578   start_type = this_type = table + this_state;
4579
4580   if (aim < 0)
4581     {
4582       /* Look backwards.  */
4583       for (next_state = this_type->rlx_more; next_state;)
4584         if (aim >= this_type->rlx_backward || !this_type->rlx_backward)
4585           next_state = 0;
4586         else
4587           {
4588             /* Grow to next state.  */
4589             this_state = next_state;
4590             this_type = table + this_state;
4591             next_state = this_type->rlx_more;
4592           }
4593     }
4594   else
4595     {
4596       /* Look forwards.  */
4597       for (next_state = this_type->rlx_more; next_state;)
4598         if (aim <= this_type->rlx_forward || !this_type->rlx_forward)
4599           next_state = 0;
4600         else
4601           {
4602             /* Grow to next state.  */
4603             this_state = next_state;
4604             this_type = table + this_state;
4605             next_state = this_type->rlx_more;
4606           }
4607     }
4608
4609   growth = this_type->rlx_length - start_type->rlx_length;
4610   if (growth != 0)
4611     fragP->fr_subtype = this_state;
4612   return growth;
4613 }
4614
4615 /* Return FALSE if the fixup in fixp should be left alone and not
4616    adjusted.   We return FALSE here so that linker relaxation will
4617    work.  */
4618
4619 bfd_boolean
4620 msp430_fix_adjustable (struct fix *fixp ATTRIBUTE_UNUSED)
4621 {
4622   /* If the symbol is in a non-code section then it should be OK.  */
4623   if (fixp->fx_addsy
4624       && ((S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE) == 0))
4625     return TRUE;
4626
4627   return FALSE;
4628 }
4629
4630 /* Set the contents of the .MSP430.attributes section.  */
4631
4632 void
4633 msp430_md_end (void)
4634 {
4635   if (check_for_nop)
4636     as_warn ("assembly finished without a possibly needed NOP instruction");
4637
4638   bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA,
4639                              target_is_430x () ? 2 : 1);
4640
4641   bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model,
4642                              large_model ? 2 : 1);
4643
4644   bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model,
4645                              large_model ? 2 : 1);
4646 }
4647
4648 /* Returns FALSE if there is a msp430 specific reason why the
4649    subtraction of two same-section symbols cannot be computed by
4650    the assembler.  */
4651
4652 bfd_boolean
4653 msp430_allow_local_subtract (expressionS * left,
4654                              expressionS * right,
4655                              segT section)
4656 {
4657   /* If the symbols are not in a code section then they are OK.  */
4658   if ((section->flags & SEC_CODE) == 0)
4659     return TRUE;
4660
4661   if (S_IS_GAS_LOCAL (left->X_add_symbol) || S_IS_GAS_LOCAL (right->X_add_symbol))
4662     return TRUE;
4663
4664   if (left->X_add_symbol == right->X_add_symbol)
4665     return TRUE;
4666
4667   /* We have to assume that there may be instructions between the
4668      two symbols and that relaxation may increase the distance between
4669      them.  */
4670   return FALSE;
4671 }