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