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