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