PR gas/5155
[external/binutils.git] / gas / config / tc-msp430.c
1 /* tc-msp430.c -- Assembler code for the Texas Instruments MSP430
2
3   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
4   Free Software Foundation, Inc.
5   Contributed by Dmitry Diky <diwil@mail.ru>
6
7   This file is part of GAS, the GNU Assembler.
8
9   GAS is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 3, or (at your option)
12   any later version.
13
14   GAS is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with GAS; see the file COPYING.  If not, write to
21   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
22   Boston, MA 02110-1301, USA.  */
23
24 #include <limits.h>
25
26 #define PUSH_1X_WORKAROUND
27 #include "as.h"
28 #include "subsegs.h"
29 #include "opcode/msp430.h"
30 #include "safe-ctype.h"
31 #include "dwarf2dbg.h"
32
33 /* We will disable polymorphs by default because it is dangerous.
34    The potential problem here is the following: assume we got the
35    following code:
36
37         jump .l1
38         nop
39         jump  subroutine        ; external symbol
40       .l1:
41         nop
42         ret
43    
44    In case of assembly time relaxation we'll get:
45         0: jmp .l1 <.text +0x08> (reloc deleted)
46         2: nop
47         4: br subroutine
48     .l1:
49         8: nop
50         10: ret
51
52    If the 'subroutine' is within +-1024 bytes range then linker
53    will produce:
54         0: jmp .text +0x08
55         2: nop
56         4: jmp subroutine
57         .l1:
58         6: nop
59         8: ret  ; 'jmp .text +0x08' will land here. WRONG!!!
60
61    The workaround is the following:
62    1. Declare global var enable_polymorphs which set to 1 via option -mp.
63    2. Declare global var enable_relax   which set to 1 via option -mQ.
64
65    If polymorphs are enabled, and relax isn't, treat all jumps as long jumps,
66    do not delete any relocs and leave them for linker.
67    
68    If relax is enabled, relax at assembly time and kill relocs as necessary.  */
69
70 int msp430_enable_relax;
71 int msp430_enable_polys;
72
73 /* GCC uses the some condition codes which we'll
74    implement as new polymorph instructions.
75   
76    COND EXPL       SHORT JUMP   LONG JUMP
77    ===============================================
78    eq   ==         jeq          jne +4; br lab
79    ne   !=         jne          jeq +4; br lab
80
81    ltn honours no-overflow flag
82    ltn  <          jn           jn +2;  jmp +4; br lab
83
84    lt   <          jl           jge +4; br lab 
85    ltu  <          jlo          lhs +4; br lab
86    le   <= see below
87    leu  <= see below
88
89    gt   >  see below
90    gtu  >  see below
91    ge   >=         jge          jl +4; br lab
92    geu  >=         jhs          jlo +4; br lab
93    ===============================================
94
95    Therefore, new opcodes are (BranchEQ -> beq; and so on...)
96    beq,bne,blt,bltn,bltu,bge,bgeu
97    'u' means unsigned compares 
98   
99    Also, we add 'jump' instruction:
100    jump UNCOND  -> jmp          br lab
101
102    They will have fmt == 4, and insn_opnumb == number of instruction.  */
103
104 struct rcodes_s 
105 {
106   char * name;
107   int    index; /* Corresponding insn_opnumb.  */
108   int    sop;   /* Opcode if jump length is short.  */
109   long   lpos;  /* Label position.  */
110   long   lop0;  /* Opcode 1 _word_ (16 bits).  */
111   long   lop1;  /* Opcode second word.  */
112   long   lop2;  /* Opcode third word.  */
113 };
114
115 #define MSP430_RLC(n,i,sop,o1) \
116   {#n, i, sop, 2, (o1 + 2), 0x4010, 0}
117
118 static struct rcodes_s msp430_rcodes[] = 
119 {
120   MSP430_RLC (beq,  0, 0x2400, 0x2000),
121   MSP430_RLC (bne,  1, 0x2000, 0x2400),
122   MSP430_RLC (blt,  2, 0x3800, 0x3400),
123   MSP430_RLC (bltu, 3, 0x2800, 0x2c00),
124   MSP430_RLC (bge,  4, 0x3400, 0x3800),
125   MSP430_RLC (bgeu, 5, 0x2c00, 0x2800),
126   {"bltn",          6, 0x3000, 3, 0x3000 + 1, 0x3c00 + 2,0x4010},
127   {"jump",          7, 0x3c00, 1, 0x4010, 0, 0},
128   {0,0,0,0,0,0,0}
129 };
130 #undef MSP430_RLC
131
132
133 /* More difficult than above and they have format 5.
134    
135    COND EXPL    SHORT                   LONG
136    =================================================================
137    gt   >       jeq +2; jge label       jeq +6; jl  +4; br label
138    gtu  >       jeq +2; jhs label       jeq +6; jlo +4; br label
139    leu  <=      jeq label; jlo label    jeq +2; jhs +4; br label
140    le   <=      jeq label; jl  label    jeq +2; jge +4; br label
141    =================================================================  */
142
143 struct hcodes_s 
144 {
145   char * name;  
146   int    index;         /* Corresponding insn_opnumb.  */
147   int    tlab;          /* Number of labels in short mode.  */
148   int    op0;           /* Opcode for first word of short jump.  */
149   int    op1;           /* Opcode for second word of short jump.  */
150   int    lop0;          /* Opcodes for long jump mode.  */
151   int    lop1;
152   int    lop2;
153 };
154
155 static struct hcodes_s msp430_hcodes[] = 
156 {
157   {"bgt",  0, 1, 0x2401, 0x3400, 0x2403, 0x3802, 0x4010 },
158   {"bgtu", 1, 1, 0x2401, 0x2c00, 0x2403, 0x2802, 0x4010 },
159   {"bleu", 2, 2, 0x2400, 0x2800, 0x2401, 0x2c02, 0x4010 },
160   {"ble",  3, 2, 0x2400, 0x3800, 0x2401, 0x3402, 0x4010 },
161   {0,0,0,0,0,0,0,0}
162 };
163
164 const char comment_chars[] = ";";
165 const char line_comment_chars[] = "#";
166 const char line_separator_chars[] = "{";
167 const char EXP_CHARS[] = "eE";
168 const char FLT_CHARS[] = "dD";
169
170 /* Handle  long expressions.  */
171 extern LITTLENUM_TYPE generic_bignum[];
172
173 static struct hash_control *msp430_hash;
174
175 /* Relaxations.  */
176 #define STATE_UNCOND_BRANCH     1       /* jump */
177 #define STATE_NOOV_BRANCH       3       /* bltn */
178 #define STATE_SIMPLE_BRANCH     2       /* bne, beq, etc... */
179 #define STATE_EMUL_BRANCH       4
180
181 #define CNRL    2
182 #define CUBL    4
183 #define CNOL    8
184 #define CSBL    6
185 #define CEBL    4
186
187 /* Length.  */
188 #define STATE_BITS10    1       /* wild guess. short jump */
189 #define STATE_WORD      2       /* 2 bytes pc rel. addr. more */
190 #define STATE_UNDEF     3       /* cannot handle this yet. convert to word mode */
191
192 #define ENCODE_RELAX(what,length) (((what) << 2) + (length))
193 #define RELAX_STATE(s)            ((s) & 3)
194 #define RELAX_LEN(s)              ((s) >> 2)
195 #define RELAX_NEXT(a,b)           ENCODE_RELAX (a, b + 1)
196
197 relax_typeS md_relax_table[] =
198 {
199   /* Unused.  */
200   {1, 1, 0, 0},
201   {1, 1, 0, 0},
202   {1, 1, 0, 0},
203   {1, 1, 0, 0},
204
205   /* Unconditional jump.  */
206   {1, 1, 8, 5},
207   {1024, -1024, CNRL, RELAX_NEXT (STATE_UNCOND_BRANCH, STATE_BITS10)},  /* state 10 bits displ */
208   {0, 0, CUBL, RELAX_NEXT (STATE_UNCOND_BRANCH, STATE_WORD)},           /* state word */
209   {1, 1, CUBL, 0},                                                      /* state undef */
210
211   /* Simple branches.  */
212   {0, 0, 8, 9},
213   {1024, -1024, CNRL, RELAX_NEXT (STATE_SIMPLE_BRANCH, STATE_BITS10)},  /* state 10 bits displ */
214   {0, 0, CSBL, RELAX_NEXT (STATE_SIMPLE_BRANCH, STATE_WORD)},           /* state word */
215   {1, 1, CSBL, 0},
216
217   /* blt no overflow branch.  */
218   {1, 1, 8, 13},
219   {1024, -1024, CNRL, RELAX_NEXT (STATE_NOOV_BRANCH, STATE_BITS10)},    /* state 10 bits displ */
220   {0, 0, CNOL, RELAX_NEXT (STATE_NOOV_BRANCH, STATE_WORD)},             /* state word */
221   {1, 1, CNOL, 0},
222
223   /* Emulated branches.  */
224   {1, 1, 8, 17},
225   {1020, -1020, CEBL, RELAX_NEXT (STATE_EMUL_BRANCH, STATE_BITS10)},    /* state 10 bits displ */
226   {0, 0, CNOL, RELAX_NEXT (STATE_EMUL_BRANCH, STATE_WORD)},             /* state word */
227   {1, 1, CNOL, 0}
228 };
229
230
231 #define MAX_OP_LEN      256
232
233 struct mcu_type_s
234 {
235   char * name;
236   int isa;
237   int mach;
238 };
239
240 #define MSP430_ISA_11   11
241 #define MSP430_ISA_110  110
242 #define MSP430_ISA_12   12
243 #define MSP430_ISA_13   13
244 #define MSP430_ISA_14   14
245 #define MSP430_ISA_15   15
246 #define MSP430_ISA_16   16
247 #define MSP430_ISA_21   21
248 #define MSP430_ISA_31   31
249 #define MSP430_ISA_32   32
250 #define MSP430_ISA_33   33
251 #define MSP430_ISA_41   41
252 #define MSP430_ISA_42   42
253 #define MSP430_ISA_43   43
254 #define MSP430_ISA_44   44
255
256 #define CHECK_RELOC_MSP430              ((imm_op || byte_op)?BFD_RELOC_MSP430_16_BYTE:BFD_RELOC_MSP430_16)
257 #define CHECK_RELOC_MSP430_PCREL        ((imm_op || byte_op)?BFD_RELOC_MSP430_16_PCREL_BYTE:BFD_RELOC_MSP430_16_PCREL)
258
259 static struct mcu_type_s mcu_types[] =
260 {
261   {"msp1",        MSP430_ISA_11, bfd_mach_msp11},
262   {"msp2",        MSP430_ISA_14, bfd_mach_msp14},
263   {"msp430x110",  MSP430_ISA_11, bfd_mach_msp11},
264   {"msp430x112",  MSP430_ISA_11, bfd_mach_msp11},
265   {"msp430x1101", MSP430_ISA_110, bfd_mach_msp110},
266   {"msp430x1111", MSP430_ISA_110, bfd_mach_msp110},
267   {"msp430x1121", MSP430_ISA_110, bfd_mach_msp110},
268   {"msp430x1122", MSP430_ISA_11, bfd_mach_msp110},
269   {"msp430x1132", MSP430_ISA_11, bfd_mach_msp110},
270
271   {"msp430x122",  MSP430_ISA_12, bfd_mach_msp12},
272   {"msp430x123",  MSP430_ISA_12, bfd_mach_msp12},
273   {"msp430x1222", MSP430_ISA_12, bfd_mach_msp12},
274   {"msp430x1232", MSP430_ISA_12, bfd_mach_msp12},
275
276   {"msp430x133",  MSP430_ISA_13, bfd_mach_msp13},
277   {"msp430x135",  MSP430_ISA_13, bfd_mach_msp13},
278   {"msp430x1331", MSP430_ISA_13, bfd_mach_msp13},
279   {"msp430x1351", MSP430_ISA_13, bfd_mach_msp13},
280   {"msp430x147",  MSP430_ISA_14, bfd_mach_msp14},
281   {"msp430x148",  MSP430_ISA_14, bfd_mach_msp14},
282   {"msp430x149",  MSP430_ISA_14, bfd_mach_msp14},
283
284   {"msp430x155",  MSP430_ISA_15, bfd_mach_msp15},
285   {"msp430x156",  MSP430_ISA_15, bfd_mach_msp15},
286   {"msp430x157",  MSP430_ISA_15, bfd_mach_msp15},
287   {"msp430x167",  MSP430_ISA_16, bfd_mach_msp16},
288   {"msp430x168",  MSP430_ISA_16, bfd_mach_msp16},
289   {"msp430x169",  MSP430_ISA_16, bfd_mach_msp16},
290   {"msp430x1610", MSP430_ISA_16, bfd_mach_msp16},
291   {"msp430x1611", MSP430_ISA_16, bfd_mach_msp16},
292   {"msp430x1612", MSP430_ISA_16, bfd_mach_msp16},
293
294   {"msp430x2101", MSP430_ISA_21, bfd_mach_msp21},
295   {"msp430x2111", MSP430_ISA_21, bfd_mach_msp21},
296   {"msp430x2121", MSP430_ISA_21, bfd_mach_msp21},
297   {"msp430x2131", MSP430_ISA_21, bfd_mach_msp21},
298   
299   {"msp430x311",  MSP430_ISA_31, bfd_mach_msp31},
300   {"msp430x312",  MSP430_ISA_31, bfd_mach_msp31},
301   {"msp430x313",  MSP430_ISA_31, bfd_mach_msp31},
302   {"msp430x314",  MSP430_ISA_31, bfd_mach_msp31},
303   {"msp430x315",  MSP430_ISA_31, bfd_mach_msp31},
304   {"msp430x323",  MSP430_ISA_32, bfd_mach_msp32},
305   {"msp430x325",  MSP430_ISA_32, bfd_mach_msp32},
306   {"msp430x336",  MSP430_ISA_33, bfd_mach_msp33},
307   {"msp430x337",  MSP430_ISA_33, bfd_mach_msp33},
308
309   {"msp430x412",  MSP430_ISA_41, bfd_mach_msp41},
310   {"msp430x413",  MSP430_ISA_41, bfd_mach_msp41},
311   {"msp430x415",  MSP430_ISA_41, bfd_mach_msp41},
312   {"msp430x417",  MSP430_ISA_41, bfd_mach_msp41},
313
314   {"msp430xE423", MSP430_ISA_42, bfd_mach_msp42},
315   {"msp430xE425", MSP430_ISA_42, bfd_mach_msp42},
316   {"msp430xE427", MSP430_ISA_42, bfd_mach_msp42},
317
318   {"msp430xW423", MSP430_ISA_42, bfd_mach_msp42},
319   {"msp430xW425", MSP430_ISA_42, bfd_mach_msp42},
320   {"msp430xW427", MSP430_ISA_42, bfd_mach_msp42},
321
322   {"msp430xG437", MSP430_ISA_43, bfd_mach_msp43},
323   {"msp430xG438", MSP430_ISA_43, bfd_mach_msp43},
324   {"msp430xG439", MSP430_ISA_43, bfd_mach_msp43},
325
326   {"msp430x435",  MSP430_ISA_43, bfd_mach_msp43},
327   {"msp430x436",  MSP430_ISA_43, bfd_mach_msp43},
328   {"msp430x437",  MSP430_ISA_43, bfd_mach_msp43},
329   {"msp430x447",  MSP430_ISA_44, bfd_mach_msp44},
330   {"msp430x448",  MSP430_ISA_44, bfd_mach_msp44},
331   {"msp430x449",  MSP430_ISA_44, bfd_mach_msp44},
332
333   {NULL, 0, 0}
334 };
335
336
337 static struct mcu_type_s default_mcu =
338     { "msp430x11", MSP430_ISA_11, bfd_mach_msp11 };
339
340 static struct mcu_type_s * msp430_mcu = & default_mcu;
341
342 /* Profiling capability:
343    It is a performance hit to use gcc's profiling approach for this tiny target.
344    Even more -- jtag hardware facility does not perform any profiling functions.
345    However we've got gdb's built-in simulator where we can do anything.
346    Therefore my suggestion is:
347
348    We define new section ".profiler" which holds all profiling information.
349    We define new pseudo operation .profiler which will instruct assembler to
350    add new profile entry to the object file. Profile should take place at the
351    present address.
352
353    Pseudo-op format:
354
355       .profiler flags,function_to_profile [, cycle_corrector, extra]
356
357    where 'flags' is a combination of the following chars:
358             s - function Start
359             x - function eXit
360             i - function is in Init section
361             f - function is in Fini section
362             l - Library call
363             c - libC standard call
364             d - stack value Demand (saved at run-time in simulator)
365             I - Interrupt service routine
366             P - Prologue start
367             p - Prologue end
368             E - Epilogue start
369             e - Epilogue end
370             j - long Jump/ sjlj unwind
371             a - an Arbitrary code fragment
372             t - exTra parameter saved (constant value like frame size)
373           '""' optional: "sil" == sil
374
375       function_to_profile - function's address
376       cycle_corrector     - a value which should be added to the cycle
377                               counter, zero if omitted
378       extra - some extra parameter, zero if omitted.
379
380       For example:
381       ------------------------------
382         .global fxx
383         .type fxx,@function
384       fxx:
385       .LFrameOffset_fxx=0x08
386       .profiler "scdP", fxx     ; function entry.
387                                 ; we also demand stack value to be displayed
388         push r11
389         push r10
390         push r9
391         push r8
392       .profiler "cdp",fxx,0, .LFrameOffset_fxx  ; check stack value at this point
393                                                 ; (this is a prologue end)
394                                                 ; note, that spare var filled with the frame size
395         mov r15,r8
396         ....
397       .profiler cdE,fxx         ; check stack
398         pop r8
399         pop r9
400         pop r10
401         pop r11
402       .profiler xcde,fxx,3      ; exit adds 3 to the cycle counter
403       ret                       ; cause 'ret' insn takes 3 cycles
404       -------------------------------
405
406       This profiling approach does not produce any overhead and
407       absolutely harmless.
408       So, even profiled code can be uploaded to the MCU.  */
409 #define MSP430_PROFILER_FLAG_ENTRY      1       /* s */
410 #define MSP430_PROFILER_FLAG_EXIT       2       /* x */
411 #define MSP430_PROFILER_FLAG_INITSECT   4       /* i */
412 #define MSP430_PROFILER_FLAG_FINISECT   8       /* f */
413 #define MSP430_PROFILER_FLAG_LIBCALL    0x10    /* l */
414 #define MSP430_PROFILER_FLAG_STDCALL    0x20    /* c */
415 #define MSP430_PROFILER_FLAG_STACKDMD   0x40    /* d */
416 #define MSP430_PROFILER_FLAG_ISR        0x80    /* I */
417 #define MSP430_PROFILER_FLAG_PROLSTART  0x100   /* P */
418 #define MSP430_PROFILER_FLAG_PROLEND    0x200   /* p */
419 #define MSP430_PROFILER_FLAG_EPISTART   0x400   /* E */
420 #define MSP430_PROFILER_FLAG_EPIEND     0x800   /* e */
421 #define MSP430_PROFILER_FLAG_JUMP       0x1000  /* j */
422 #define MSP430_PROFILER_FLAG_FRAGMENT   0x2000  /* a */
423 #define MSP430_PROFILER_FLAG_EXTRA      0x4000  /* t */
424 #define MSP430_PROFILER_FLAG_notyet     0x8000  /* ? */
425
426 static int
427 pow2value (int y)
428 {
429   int n = 0;
430   unsigned int x;
431
432   x = y;
433
434   if (!x)
435     return 1;
436
437   for (; x; x = x >> 1)
438     if (x & 1)
439       n++;
440
441   return n == 1;
442 }
443
444 /* Parse ordinary expression.  */
445
446 static char *
447 parse_exp (char * s, expressionS * op)
448 {
449   input_line_pointer = s;
450   expression (op);
451   if (op->X_op == O_absent)
452     as_bad (_("missing operand"));
453   return input_line_pointer;
454 }
455
456
457 /* Delete spaces from s: X ( r 1  2)  => X(r12).  */
458
459 static void
460 del_spaces (char * s)
461 {
462   while (*s)
463     {
464       if (ISSPACE (*s))
465         {
466           char *m = s + 1;
467
468           while (ISSPACE (*m) && *m)
469             m++;
470           memmove (s, m, strlen (m) + 1);
471         }
472       else
473         s++;
474     }
475 }
476
477 static inline char *
478 skip_space (char * s)
479 {
480   while (ISSPACE (*s))
481     ++s;
482   return s;
483 }
484
485 /* Extract one word from FROM and copy it to TO. Delimiters are ",;\n"  */
486
487 static char *
488 extract_operand (char * from, char * to, int limit)
489 {
490   int size = 0;
491
492   /* Drop leading whitespace.  */
493   from = skip_space (from);
494
495   while (size < limit && *from)
496     {
497       *(to + size) = *from;
498       if (*from == ',' || *from == ';' || *from == '\n')
499         break;
500       from++;
501       size++;
502     }
503
504   *(to + size) = 0;
505   del_spaces (to);
506
507   from++;
508
509   return from;
510 }
511
512 static void
513 msp430_profiler (int dummy ATTRIBUTE_UNUSED)
514 {
515   char   buffer[1024];
516   char   f[32];
517   char * str = buffer;
518   char * flags = f;
519   int    p_flags = 0;
520   char * halt;
521   int    ops = 0;
522   int    left;
523   char * s;
524   segT   seg;
525   int    subseg;
526   char * end = 0;
527   expressionS exp;
528   expressionS exp1;
529
530   s = input_line_pointer;
531   end = input_line_pointer;
532
533   while (*end && *end != '\n')
534     end++;
535
536   while (*s && *s != '\n')
537     {
538       if (*s == ',')
539         ops++;
540       s++;
541     }
542
543   left = 3 - ops;
544
545   if (ops < 1)
546     {
547       as_bad (_(".profiler pseudo requires at least two operands."));
548       input_line_pointer = end;
549       return;
550     }
551
552   input_line_pointer = extract_operand (input_line_pointer, flags, 32);
553
554   while (*flags)
555     {
556       switch (*flags)
557         {
558         case '"':
559           break;
560         case 'a':
561           p_flags |= MSP430_PROFILER_FLAG_FRAGMENT;
562           break;
563         case 'j':
564           p_flags |= MSP430_PROFILER_FLAG_JUMP;
565           break;
566         case 'P':
567           p_flags |= MSP430_PROFILER_FLAG_PROLSTART;
568           break;
569         case 'p':
570           p_flags |= MSP430_PROFILER_FLAG_PROLEND;
571           break;
572         case 'E':
573           p_flags |= MSP430_PROFILER_FLAG_EPISTART;
574           break;
575         case 'e':
576           p_flags |= MSP430_PROFILER_FLAG_EPIEND;
577           break;
578         case 's':
579           p_flags |= MSP430_PROFILER_FLAG_ENTRY;
580           break;
581         case 'x':
582           p_flags |= MSP430_PROFILER_FLAG_EXIT;
583           break;
584         case 'i':
585           p_flags |= MSP430_PROFILER_FLAG_INITSECT;
586           break;
587         case 'f':
588           p_flags |= MSP430_PROFILER_FLAG_FINISECT;
589           break;
590         case 'l':
591           p_flags |= MSP430_PROFILER_FLAG_LIBCALL;
592           break;
593         case 'c':
594           p_flags |= MSP430_PROFILER_FLAG_STDCALL;
595           break;
596         case 'd':
597           p_flags |= MSP430_PROFILER_FLAG_STACKDMD;
598           break;
599         case 'I':
600           p_flags |= MSP430_PROFILER_FLAG_ISR;
601           break;
602         case 't':
603           p_flags |= MSP430_PROFILER_FLAG_EXTRA;
604           break;
605         default:
606           as_warn (_("unknown profiling flag - ignored."));
607           break;
608         }
609       flags++;
610     }
611
612   if (p_flags
613       && (   ! pow2value (p_flags & (  MSP430_PROFILER_FLAG_ENTRY
614                                      | MSP430_PROFILER_FLAG_EXIT))
615           || ! pow2value (p_flags & (  MSP430_PROFILER_FLAG_PROLSTART
616                                      | MSP430_PROFILER_FLAG_PROLEND
617                                      | MSP430_PROFILER_FLAG_EPISTART
618                                      | MSP430_PROFILER_FLAG_EPIEND))
619           || ! pow2value (p_flags & (  MSP430_PROFILER_FLAG_INITSECT
620                                      | MSP430_PROFILER_FLAG_FINISECT))))
621     {
622       as_bad (_("ambiguous flags combination - '.profiler' directive ignored."));
623       input_line_pointer = end;
624       return;
625     }
626
627   /* Generate temp symbol which denotes current location.  */
628   if (now_seg == absolute_section)      /* Paranoia ?  */
629     {
630       exp1.X_op = O_constant;
631       exp1.X_add_number = abs_section_offset;
632       as_warn (_("profiling in absolute section?"));
633     }
634   else
635     {
636       exp1.X_op = O_symbol;
637       exp1.X_add_symbol = symbol_temp_new_now ();
638       exp1.X_add_number = 0;
639     }
640
641   /* Generate a symbol which holds flags value.  */
642   exp.X_op = O_constant;
643   exp.X_add_number = p_flags;
644
645   /* Save current section.  */
646   seg = now_seg;
647   subseg = now_subseg;
648
649   /* Now go to .profiler section.  */
650   obj_elf_change_section (".profiler", SHT_PROGBITS, 0, 0, 0, 0, 0);
651
652   /* Save flags.  */
653   emit_expr (& exp, 2);
654
655   /* Save label value.  */
656   emit_expr (& exp1, 2);
657
658   while (ops--)
659     {
660       /* Now get profiling info.  */
661       halt = extract_operand (input_line_pointer, str, 1024);
662       /* Process like ".word xxx" directive.  */
663       parse_exp (str, & exp);
664       emit_expr (& exp, 2);
665       input_line_pointer = halt;
666     }
667
668   /* Fill the rest with zeros.  */
669   exp.X_op = O_constant;
670   exp.X_add_number = 0;
671   while (left--)
672     emit_expr (& exp, 2);
673
674   /* Return to current section.  */
675   subseg_set (seg, subseg);
676 }
677
678 static char *
679 extract_word (char * from, char * to, int limit)
680 {
681   char *op_start;
682   char *op_end;
683   int size = 0;
684
685   /* Drop leading whitespace.  */
686   from = skip_space (from);
687   *to = 0;
688
689   /* Find the op code end.  */
690   for (op_start = op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
691     {
692       to[size++] = *op_end++;
693       if (size + 1 >= limit)
694         break;
695     }
696
697   to[size] = 0;
698   return op_end;
699 }
700
701 #define OPTION_MMCU 'm'
702 #define OPTION_RELAX 'Q'
703 #define OPTION_POLYMORPHS 'P'
704
705 static void
706 msp430_set_arch (int dummy ATTRIBUTE_UNUSED)
707 {
708   char *str = (char *) alloca (32);     /* 32 for good measure.  */
709
710   input_line_pointer = extract_word (input_line_pointer, str, 32);
711
712   md_parse_option (OPTION_MMCU, str);
713   bfd_set_arch_mach (stdoutput, TARGET_ARCH, msp430_mcu->mach);
714 }
715
716 static void
717 show_mcu_list (FILE * stream)
718 {
719   int i;
720
721   fprintf (stream, _("Known MCU names:\n"));
722
723   for (i = 0; mcu_types[i].name; i++)
724     fprintf (stream, _("\t %s\n"), mcu_types[i].name);
725
726   fprintf (stream, "\n");
727 }
728
729 int
730 md_parse_option (int c, char * arg)
731 {
732   int i;
733
734   switch (c)
735     {
736     case OPTION_MMCU:
737       for (i = 0; mcu_types[i].name; ++i)
738         if (strcmp (mcu_types[i].name, arg) == 0)
739           break;
740
741       if (!mcu_types[i].name)
742         {
743           show_mcu_list (stderr);
744           as_fatal (_("unknown MCU: %s\n"), arg);
745         }
746
747       if (msp430_mcu == &default_mcu || msp430_mcu->mach == mcu_types[i].mach)
748         msp430_mcu = &mcu_types[i];
749       else
750         as_fatal (_("redefinition of mcu type %s' to %s'"),
751                   msp430_mcu->name, mcu_types[i].name);
752       return 1;
753       break;
754       
755     case OPTION_RELAX:
756       msp430_enable_relax = 1; 
757       return 1;
758       break;
759       
760     case OPTION_POLYMORPHS:
761       msp430_enable_polys = 1;
762       return 1;
763       break;
764     }
765
766   return 0;
767 }
768
769
770 const pseudo_typeS md_pseudo_table[] =
771 {
772   {"arch", msp430_set_arch, 0},
773   {"profiler", msp430_profiler, 0},
774   {NULL, NULL, 0}
775 };
776
777 const char *md_shortopts = "m:";
778
779 struct option md_longopts[] =
780 {
781   {"mmcu", required_argument, NULL, OPTION_MMCU},
782   {"mP", no_argument, NULL, OPTION_POLYMORPHS},
783   {"mQ", no_argument, NULL, OPTION_RELAX},
784   {NULL, no_argument, NULL, 0}
785 };
786
787 size_t md_longopts_size = sizeof (md_longopts);
788
789 void
790 md_show_usage (FILE * stream)
791 {
792   fprintf (stream,
793            _("MSP430 options:\n"
794              "  -mmcu=[msp430-name] select microcontroller type\n"
795              "                  msp430x110  msp430x112\n"
796              "                  msp430x1101 msp430x1111\n"
797              "                  msp430x1121 msp430x1122 msp430x1132\n"
798              "                  msp430x122  msp430x123\n"
799              "                  msp430x1222 msp430x1232\n"
800              "                  msp430x133  msp430x135\n"
801              "                  msp430x1331 msp430x1351\n"
802              "                  msp430x147  msp430x148  msp430x149\n"
803              "                  msp430x155  msp430x156  msp430x157\n"
804              "                  msp430x167  msp430x168  msp430x169\n"
805              "                  msp430x1610 msp430x1611 msp430x1612\n"
806              "                  msp430x311  msp430x312  msp430x313  msp430x314  msp430x315\n"
807              "                  msp430x323  msp430x325\n"
808              "                  msp430x336  msp430x337\n"
809              "                  msp430x412  msp430x413  msp430x415  msp430x417\n"
810              "                  msp430xE423 msp430xE425 msp430E427\n"
811              "                  msp430xW423 msp430xW425 msp430W427\n"
812              "                  msp430xG437 msp430xG438 msp430G439\n"
813              "                  msp430x435  msp430x436  msp430x437\n"
814              "                  msp430x447  msp430x448  msp430x449\n"));
815   fprintf (stream,
816            _("  -mQ - enable relaxation at assembly time. DANGEROUS!\n"
817              "  -mP - enable polymorph instructions\n"));
818
819   show_mcu_list (stream);
820 }
821
822 symbolS *
823 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
824 {
825   return 0;
826 }
827
828 static char *
829 extract_cmd (char * from, char * to, int limit)
830 {
831   int size = 0;
832
833   while (*from && ! ISSPACE (*from) && *from != '.' && limit > size)
834     {
835       *(to + size) = *from;
836       from++;
837       size++;
838     }
839
840   *(to + size) = 0;
841
842   return from;
843 }
844
845 /* Turn a string in input_line_pointer into a floating point constant
846    of type TYPE, and store the appropriate bytes in *LITP.  The number
847    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
848    returned, or NULL on OK.  */
849
850 char *
851 md_atof (int type, char * litP, int * sizeP)
852 {
853   int prec;
854   LITTLENUM_TYPE words[4];
855   LITTLENUM_TYPE *wordP;
856   char *t;
857
858   switch (type)
859     {
860     case 'f':
861       prec = 2;
862       break;
863     case 'd':
864       prec = 4;
865       break;
866     default:
867       *sizeP = 0;
868       return _("bad call to md_atof");
869     }
870
871   t = atof_ieee (input_line_pointer, type, words);
872   if (t)
873     input_line_pointer = t;
874
875   *sizeP = prec * sizeof (LITTLENUM_TYPE);
876
877   /* This loop outputs the LITTLENUMs in REVERSE order.  */
878   for (wordP = words + prec - 1; prec--;)
879     {
880       md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
881       litP += sizeof (LITTLENUM_TYPE);
882     }
883
884   return NULL;
885 }
886
887 void
888 md_begin (void)
889 {
890   struct msp430_opcode_s * opcode;
891   msp430_hash = hash_new ();
892
893   for (opcode = msp430_opcodes; opcode->name; opcode++)
894     hash_insert (msp430_hash, opcode->name, (char *) opcode);
895
896   bfd_set_arch_mach (stdoutput, TARGET_ARCH, msp430_mcu->mach);
897 }
898
899 static int
900 check_reg (char * t)
901 {
902   /* If this is a reg numb, str 't' must be a number from 0 - 15.  */
903
904   if (strlen (t) > 2 && *(t + 2) != '+')
905     return 1;
906
907   while (*t)
908     {
909       if ((*t < '0' || *t > '9') && *t != '+')
910         break;
911       t++;
912     }
913
914   if (*t)
915     return 1;
916
917   return 0;
918 }
919
920
921 static int
922 msp430_srcoperand (struct msp430_operand_s * op,
923                    char * l, int bin, int * imm_op)
924 {
925   char *__tl = l;
926
927   /* Check if an immediate #VALUE.  The hash sign should be only at the beginning!  */
928   if (*l == '#')
929     {
930       char *h = l;
931       int vshift = -1;
932       int rval = 0;
933
934       /* Check if there is:
935          llo(x) - least significant 16 bits, x &= 0xffff
936          lhi(x) - x = (x >> 16) & 0xffff,
937          hlo(x) - x = (x >> 32) & 0xffff,
938          hhi(x) - x = (x >> 48) & 0xffff
939          The value _MUST_ be constant expression: #hlo(1231231231).  */
940
941       *imm_op = 1;
942
943       if (strncasecmp (h, "#llo(", 5) == 0)
944         {
945           vshift = 0;
946           rval = 3;
947         }
948       else if (strncasecmp (h, "#lhi(", 5) == 0)
949         {
950           vshift = 1;
951           rval = 3;
952         }
953       else if (strncasecmp (h, "#hlo(", 5) == 0)
954         {
955           vshift = 2;
956           rval = 3;
957         }
958       else if (strncasecmp (h, "#hhi(", 5) == 0)
959         {
960           vshift = 3;
961           rval = 3;
962         }
963       else if (strncasecmp (h, "#lo(", 4) == 0)
964         {
965           vshift = 0;
966           rval = 2;
967         }
968       else if (strncasecmp (h, "#hi(", 4) == 0)
969         {
970           vshift = 1;
971           rval = 2;
972         }
973
974       op->reg = 0;              /* Reg PC.  */
975       op->am = 3;
976       op->ol = 1;               /* Immediate  will follow an instruction.  */
977       __tl = h + 1 + rval;
978       op->mode = OP_EXP;
979
980       parse_exp (__tl, &(op->exp));
981       if (op->exp.X_op == O_constant)
982         {
983           int x = op->exp.X_add_number;
984
985           if (vshift == 0)
986             {
987               x = x & 0xffff;
988               op->exp.X_add_number = x;
989             }
990           else if (vshift == 1)
991             {
992               x = (x >> 16) & 0xffff;
993               op->exp.X_add_number = x;
994             }
995           else if (vshift > 1)
996             {
997               if (x < 0)
998                 op->exp.X_add_number = -1;
999               else
1000                 op->exp.X_add_number = 0;       /* Nothing left.  */
1001               x = op->exp.X_add_number;
1002             }
1003
1004           if (op->exp.X_add_number > 65535 || op->exp.X_add_number < -32768)
1005             {
1006               as_bad (_("value %d out of range. Use #lo() or #hi()"), x);
1007               return 1;
1008             }
1009
1010           /* Now check constants.  */
1011           /* Substitute register mode with a constant generator if applicable.  */
1012
1013           x = (short) x;        /* Extend sign.  */
1014
1015           if (x == 0)
1016             {
1017               op->reg = 3;
1018               op->am = 0;
1019               op->ol = 0;
1020               op->mode = OP_REG;
1021             }
1022           else if (x == 1)
1023             {
1024               op->reg = 3;
1025               op->am = 1;
1026               op->ol = 0;
1027               op->mode = OP_REG;
1028             }
1029           else if (x == 2)
1030             {
1031               op->reg = 3;
1032               op->am = 2;
1033               op->ol = 0;
1034               op->mode = OP_REG;
1035             }
1036           else if (x == -1)
1037             {
1038               op->reg = 3;
1039               op->am = 3;
1040               op->ol = 0;
1041               op->mode = OP_REG;
1042             }
1043           else if (x == 4)
1044             {
1045 #ifdef PUSH_1X_WORKAROUND
1046               if (bin == 0x1200)
1047                 {
1048                   /* Remove warning as confusing.
1049                      as_warn(_("Hardware push bug workaround")); */
1050                 }
1051               else
1052 #endif
1053                 {
1054                   op->reg = 2;
1055                   op->am = 2;
1056                   op->ol = 0;
1057                   op->mode = OP_REG;
1058                 }
1059             }
1060           else if (x == 8)
1061             {
1062 #ifdef PUSH_1X_WORKAROUND
1063               if (bin == 0x1200)
1064                 {
1065                   /* Remove warning as confusing.
1066                      as_warn(_("Hardware push bug workaround")); */
1067                 }
1068               else
1069 #endif
1070                 {
1071                   op->reg = 2;
1072                   op->am = 3;
1073                   op->ol = 0;
1074                   op->mode = OP_REG;
1075                 }
1076             }
1077         }
1078       else if (op->exp.X_op == O_symbol)
1079         {
1080           op->mode = OP_EXP;
1081         }
1082       else if (op->exp.X_op == O_big)
1083         {
1084           short x;
1085           if (vshift != -1)
1086             {
1087               op->exp.X_op = O_constant;
1088               op->exp.X_add_number = 0xffff & generic_bignum[vshift];
1089               x = op->exp.X_add_number;
1090             }
1091           else
1092             {
1093               as_bad (_
1094                       ("unknown expression in operand %s. use #llo() #lhi() #hlo() #hhi() "),
1095                       l);
1096               return 1;
1097             }
1098
1099           if (x == 0)
1100             {
1101               op->reg = 3;
1102               op->am = 0;
1103               op->ol = 0;
1104               op->mode = OP_REG;
1105             }
1106           else if (x == 1)
1107             {
1108               op->reg = 3;
1109               op->am = 1;
1110               op->ol = 0;
1111               op->mode = OP_REG;
1112             }
1113           else if (x == 2)
1114             {
1115               op->reg = 3;
1116               op->am = 2;
1117               op->ol = 0;
1118               op->mode = OP_REG;
1119             }
1120           else if (x == -1)
1121             {
1122               op->reg = 3;
1123               op->am = 3;
1124               op->ol = 0;
1125               op->mode = OP_REG;
1126             }
1127           else if (x == 4)
1128             {
1129               op->reg = 2;
1130               op->am = 2;
1131               op->ol = 0;
1132               op->mode = OP_REG;
1133             }
1134           else if (x == 8)
1135             {
1136               op->reg = 2;
1137               op->am = 3;
1138               op->ol = 0;
1139               op->mode = OP_REG;
1140             }
1141         }
1142       /* Redundant (yet) check.  */
1143       else if (op->exp.X_op == O_register)
1144         as_bad
1145           (_("Registers cannot be used within immediate expression [%s]"), l);
1146       else
1147         as_bad (_("unknown operand %s"), l);
1148
1149       return 0;
1150     }
1151
1152   /* Check if absolute &VALUE (assume that we can construct something like ((a&b)<<7 + 25).  */
1153   if (*l == '&')
1154     {
1155       char *h = l;
1156
1157       op->reg = 2;              /* reg 2 in absolute addr mode.  */
1158       op->am = 1;               /* mode As == 01 bin.  */
1159       op->ol = 1;               /* Immediate value followed by instruction.  */
1160       __tl = h + 1;
1161       parse_exp (__tl, &(op->exp));
1162       op->mode = OP_EXP;
1163       if (op->exp.X_op == O_constant)
1164         {
1165           int x = op->exp.X_add_number;
1166
1167           if (x > 65535 || x < -32768)
1168             {
1169               as_bad (_("value out of range: %d"), x);
1170               return 1;
1171             }
1172         }
1173       else if (op->exp.X_op == O_symbol)
1174         ;
1175       else
1176         {
1177           /* Redundant (yet) check.  */
1178           if (op->exp.X_op == O_register)
1179             as_bad
1180               (_("Registers cannot be used within absolute expression [%s]"), l);
1181           else
1182             as_bad (_("unknown expression in operand %s"), l);
1183           return 1;
1184         }
1185       return 0;
1186     }
1187
1188   /* Check if indirect register mode @Rn / postincrement @Rn+.  */
1189   if (*l == '@')
1190     {
1191       char *t = l;
1192       char *m = strchr (l, '+');
1193
1194       if (t != l)
1195         {
1196           as_bad (_("unknown addressing mode %s"), l);
1197           return 1;
1198         }
1199
1200       t++;
1201       if (*t != 'r' && *t != 'R')
1202         {
1203           as_bad (_("unknown addressing mode %s"), l);
1204           return 1;
1205         }
1206
1207       t++;      /* Points to the reg value.  */
1208
1209       if (check_reg (t))
1210         {
1211           as_bad (_("Bad register name r%s"), t);
1212           return 1;
1213         }
1214
1215       op->mode = OP_REG;
1216       op->am = m ? 3 : 2;
1217       op->ol = 0;
1218       if (m)
1219         *m = 0;                 /* strip '+' */
1220       op->reg = atoi (t);
1221       if (op->reg < 0 || op->reg > 15)
1222         {
1223           as_bad (_("MSP430 does not have %d registers"), op->reg);
1224           return 1;
1225         }
1226
1227       return 0;
1228     }
1229
1230   /* Check if register indexed X(Rn).  */
1231   do
1232     {
1233       char *h = strrchr (l, '(');
1234       char *m = strrchr (l, ')');
1235       char *t;
1236
1237       *imm_op = 1;
1238
1239       if (!h)
1240         break;
1241       if (!m)
1242         {
1243           as_bad (_("')' required"));
1244           return 1;
1245         }
1246
1247       t = h;
1248       op->am = 1;
1249       op->ol = 1;
1250       /* Extract a register.  */
1251       t++;      /* Advance pointer.  */
1252
1253       if (*t != 'r' && *t != 'R')
1254         {
1255           as_bad (_
1256                   ("unknown operator %s. Did you mean X(Rn) or #[hl][hl][oi](CONST) ?"),
1257                   l);
1258           return 1;
1259         }
1260       t++;
1261
1262       op->reg = *t - '0';
1263       if (op->reg > 9 || op->reg < 0)
1264         {
1265           as_bad (_("unknown operator (r%s substituted as a register name"),
1266                   t);
1267           return 1;
1268         }
1269       t++;
1270       if (*t != ')')
1271         {
1272           op->reg = op->reg * 10;
1273           op->reg += *t - '0';
1274
1275           if (op->reg > 15)
1276             {
1277               as_bad (_("unknown operator %s"), l);
1278               return 1;
1279             }
1280           if (op->reg == 2)
1281             {
1282               as_bad (_("r2 should not be used in indexed addressing mode"));
1283               return 1;
1284             }
1285
1286           if (*(t + 1) != ')')
1287             {
1288               as_bad (_("unknown operator %s"), l);
1289               return 1;
1290             }
1291         }
1292
1293       /* Extract constant.  */
1294       __tl = l;
1295       *h = 0;
1296       op->mode = OP_EXP;
1297       parse_exp (__tl, &(op->exp));
1298       if (op->exp.X_op == O_constant)
1299         {
1300           int x = op->exp.X_add_number;
1301
1302           if (x > 65535 || x < -32768)
1303             {
1304               as_bad (_("value out of range: %d"), x);
1305               return 1;
1306             }
1307
1308           if (x == 0)
1309             {
1310               op->mode = OP_REG;
1311               op->am = 2;
1312               op->ol = 0;
1313               return 0;
1314             }
1315         }
1316       else if (op->exp.X_op == O_symbol)
1317         ;
1318       else
1319         {
1320           /* Redundant (yet) check.  */
1321           if (op->exp.X_op == O_register)
1322             as_bad
1323               (_("Registers cannot be used as a prefix of indexed expression [%s]"), l);
1324           else
1325             as_bad (_("unknown expression in operand %s"), l);
1326           return 1;
1327         }
1328
1329       return 0;
1330     }
1331   while (0);
1332
1333   /* Register mode 'mov r1,r2'.  */
1334   do
1335     {
1336       char *t = l;
1337
1338       /* Operand should be a register.  */
1339       if (*t == 'r' || *t == 'R')
1340         {
1341           int x = atoi (t + 1);
1342
1343           if (check_reg (t + 1))
1344             break;
1345
1346           if (x < 0 || x > 15)
1347             break;              /* Symbolic mode.  */
1348
1349           op->mode = OP_REG;
1350           op->am = 0;
1351           op->ol = 0;
1352           op->reg = x;
1353           return 0;
1354         }
1355     }
1356   while (0);
1357
1358   /* Symbolic mode 'mov a, b' == 'mov x(pc), y(pc)'.  */
1359   do
1360     {
1361       op->mode = OP_EXP;
1362       op->reg = 0;              /* PC relative... be careful.  */
1363       op->am = 1;
1364       op->ol = 1;
1365       __tl = l;
1366       parse_exp (__tl, &(op->exp));
1367       return 0;
1368     }
1369   while (0);
1370
1371   /* Unreachable.  */
1372   as_bad (_("unknown addressing mode for operand %s"), l);
1373   return 1;
1374 }
1375
1376
1377 static int
1378 msp430_dstoperand (struct msp430_operand_s * op, char * l, int bin)
1379 {
1380   int dummy;
1381   int ret = msp430_srcoperand (op, l, bin, & dummy);
1382
1383   if (ret)
1384     return ret;
1385
1386   if (op->am == 2)
1387     {
1388       char *__tl = "0";
1389
1390       op->mode = OP_EXP;
1391       op->am = 1;
1392       op->ol = 1;
1393       parse_exp (__tl, &(op->exp));
1394
1395       if (op->exp.X_op != O_constant || op->exp.X_add_number != 0)
1396         {
1397           as_bad (_("Internal bug. Try to use 0(r%d) instead of @r%d"),
1398                   op->reg, op->reg);
1399           return 1;
1400         }
1401       return 0;
1402     }
1403
1404   if (op->am > 1)
1405     {
1406       as_bad (_
1407               ("this addressing mode is not applicable for destination operand"));
1408       return 1;
1409     }
1410   return 0;
1411 }
1412
1413
1414 /* Parse instruction operands.
1415    Return binary opcode.  */
1416
1417 static unsigned int
1418 msp430_operands (struct msp430_opcode_s * opcode, char * line)
1419 {
1420   int bin = opcode->bin_opcode; /* Opcode mask.  */
1421   int __is = 0;
1422   char l1[MAX_OP_LEN], l2[MAX_OP_LEN];
1423   char *frag;
1424   int where;
1425   struct msp430_operand_s op1, op2;
1426   int res = 0;
1427   static short ZEROS = 0;
1428   int byte_op, imm_op;
1429
1430   /* Opcode is the one from opcodes table
1431      line contains something like
1432      [.w] @r2+, 5(R1)
1433      or
1434      .b @r2+, 5(R1).  */
1435
1436   /* Check if byte or word operation.  */
1437   if (*line == '.' && TOLOWER (*(line + 1)) == 'b')
1438     {
1439       bin |= BYTE_OPERATION;
1440       byte_op = 1;
1441     }
1442   else
1443     byte_op = 0;
1444
1445   /* skip .[bwBW].  */
1446   while (! ISSPACE (*line) && *line)
1447     line++;
1448
1449   if (opcode->insn_opnumb && (!*line || *line == '\n'))
1450     {
1451       as_bad (_("instruction %s requires %d operand(s)"),
1452               opcode->name, opcode->insn_opnumb);
1453       return 0;
1454     }
1455
1456   memset (l1, 0, sizeof (l1));
1457   memset (l2, 0, sizeof (l2));
1458   memset (&op1, 0, sizeof (op1));
1459   memset (&op2, 0, sizeof (op2));
1460
1461   imm_op = 0;
1462
1463   switch (opcode->fmt)
1464     {
1465     case 0:                     /* Emulated.  */
1466       switch (opcode->insn_opnumb)
1467         {
1468         case 0:
1469           /* Set/clear bits instructions.  */
1470           __is = 2;
1471           frag = frag_more (__is);
1472           bfd_putl16 ((bfd_vma) bin, frag);
1473           dwarf2_emit_insn (__is);
1474           break;
1475         case 1:
1476           /* Something which works with destination operand.  */
1477           line = extract_operand (line, l1, sizeof (l1));
1478           res = msp430_dstoperand (&op1, l1, opcode->bin_opcode);
1479           if (res)
1480             break;
1481
1482           bin |= (op1.reg | (op1.am << 7));
1483           __is = 1 + op1.ol;
1484           frag = frag_more (2 * __is);
1485           where = frag - frag_now->fr_literal;
1486           bfd_putl16 ((bfd_vma) bin, frag);
1487           dwarf2_emit_insn (2 * __is);
1488
1489           if (op1.mode == OP_EXP)
1490             {
1491               where += 2;
1492               bfd_putl16 ((bfd_vma) ZEROS, frag + 2);
1493
1494               if (op1.reg)
1495                 fix_new_exp (frag_now, where, 2,
1496                              &(op1.exp), FALSE, CHECK_RELOC_MSP430);
1497               else
1498                 fix_new_exp (frag_now, where, 2,
1499                              &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1500             }
1501           break;
1502
1503         case 2:
1504           {
1505             /* Shift instruction.  */
1506             line = extract_operand (line, l1, sizeof (l1));
1507             strncpy (l2, l1, sizeof (l2));
1508             l2[sizeof (l2) - 1] = '\0';
1509             res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op);
1510             res += msp430_dstoperand (&op2, l2, opcode->bin_opcode);
1511
1512             if (res)
1513               break;    /* An error occurred.  All warnings were done before.  */
1514
1515             bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7));
1516
1517             __is = 1 + op1.ol + op2.ol; /* insn size in words.  */
1518             frag = frag_more (2 * __is);
1519             where = frag - frag_now->fr_literal;
1520             bfd_putl16 ((bfd_vma) bin, frag);
1521             dwarf2_emit_insn (2 * __is);
1522             
1523             if (op1.mode == OP_EXP)
1524               {
1525                 where += 2;     /* Advance 'where' as we do not know _where_.  */
1526                 bfd_putl16 ((bfd_vma) ZEROS, frag + 2);
1527
1528                 if (op1.reg || (op1.reg == 0 && op1.am == 3))   /* Not PC relative.  */
1529                   fix_new_exp (frag_now, where, 2,
1530                                &(op1.exp), FALSE, CHECK_RELOC_MSP430);
1531                 else
1532                   fix_new_exp (frag_now, where, 2,
1533                                &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1534               }
1535
1536             if (op2.mode == OP_EXP)
1537               {
1538                 imm_op = 0;
1539                 bfd_putl16 ((bfd_vma) ZEROS, frag + 2 + ((__is == 3) ? 2 : 0));
1540
1541                 if (op2.reg)    /* Not PC relative.  */
1542                   fix_new_exp (frag_now, where + 2, 2,
1543                                &(op2.exp), FALSE, CHECK_RELOC_MSP430);
1544                 else
1545                   fix_new_exp (frag_now, where + 2, 2,
1546                                &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1547               }
1548             break;
1549           }
1550         case 3:
1551           /* Branch instruction => mov dst, r0.  */
1552           line = extract_operand (line, l1, sizeof (l1));
1553
1554           res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op);
1555           if (res)
1556             break;
1557
1558           byte_op = 0;
1559           imm_op = 0;
1560
1561           bin |= ((op1.reg << 8) | (op1.am << 4));
1562           __is = 1 + op1.ol;
1563           frag = frag_more (2 * __is);
1564           where = frag - frag_now->fr_literal;
1565           bfd_putl16 ((bfd_vma) bin, frag);
1566           dwarf2_emit_insn (2 * __is);
1567
1568           if (op1.mode == OP_EXP)
1569             {
1570               where += 2;
1571               bfd_putl16 ((bfd_vma) ZEROS, frag + 2);
1572
1573               if (op1.reg || (op1.reg == 0 && op1.am == 3))
1574                 fix_new_exp (frag_now, where, 2,
1575                              &(op1.exp), FALSE, CHECK_RELOC_MSP430);
1576               else
1577                 fix_new_exp (frag_now, where, 2,
1578                              &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1579             }
1580           break;
1581         }
1582       break;
1583
1584     case 1:                     /* Format 1, double operand.  */
1585       line = extract_operand (line, l1, sizeof (l1));
1586       line = extract_operand (line, l2, sizeof (l2));
1587       res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op);
1588       res += msp430_dstoperand (&op2, l2, opcode->bin_opcode);
1589
1590       if (res)
1591         break;                  /* Error occurred.  All warnings were done before.  */
1592
1593       bin |= (op2.reg | (op1.reg << 8) | (op1.am << 4) | (op2.am << 7));
1594
1595       __is = 1 + op1.ol + op2.ol;       /* insn size in words.  */
1596       frag = frag_more (2 * __is);
1597       where = frag - frag_now->fr_literal;
1598       bfd_putl16 ((bfd_vma) bin, frag);
1599       dwarf2_emit_insn (2 * __is);
1600
1601       if (op1.mode == OP_EXP)
1602         {
1603           where += 2;           /* Advance where as we do not know _where_.  */
1604           bfd_putl16 ((bfd_vma) ZEROS, frag + 2);
1605
1606           if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative.  */
1607             fix_new_exp (frag_now, where, 2,
1608                          &(op1.exp), FALSE, CHECK_RELOC_MSP430);
1609           else
1610             fix_new_exp (frag_now, where, 2,
1611                          &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1612         }
1613
1614       if (op2.mode == OP_EXP)
1615         {
1616           imm_op = 0;
1617           bfd_putl16 ((bfd_vma) ZEROS, frag + 2 + ((__is == 3) ? 2 : 0));
1618
1619           if (op2.reg)          /* Not PC relative.  */
1620             fix_new_exp (frag_now, where + 2, 2,
1621                          &(op2.exp), FALSE, CHECK_RELOC_MSP430);
1622           else
1623             fix_new_exp (frag_now, where + 2, 2,
1624                          &(op2.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1625         }
1626       break;
1627
1628     case 2:                     /* Single-operand mostly instr.  */
1629       if (opcode->insn_opnumb == 0)
1630         {
1631           /* reti instruction.  */
1632           frag = frag_more (2);
1633           bfd_putl16 ((bfd_vma) bin, frag);
1634           dwarf2_emit_insn (2);
1635           break;
1636         }
1637
1638       line = extract_operand (line, l1, sizeof (l1));
1639       res = msp430_srcoperand (&op1, l1, opcode->bin_opcode, &imm_op);
1640       if (res)
1641         break;          /* Error in operand.  */
1642
1643       bin |= op1.reg | (op1.am << 4);
1644       __is = 1 + op1.ol;
1645       frag = frag_more (2 * __is);
1646       where = frag - frag_now->fr_literal;
1647       bfd_putl16 ((bfd_vma) bin, frag);
1648       dwarf2_emit_insn (2 * __is);
1649
1650       if (op1.mode == OP_EXP)
1651         {
1652           bfd_putl16 ((bfd_vma) ZEROS, frag + 2);
1653
1654           if (op1.reg || (op1.reg == 0 && op1.am == 3)) /* Not PC relative.  */
1655             fix_new_exp (frag_now, where + 2, 2,
1656                          &(op1.exp), FALSE, CHECK_RELOC_MSP430);
1657           else
1658             fix_new_exp (frag_now, where + 2, 2,
1659                          &(op1.exp), TRUE, CHECK_RELOC_MSP430_PCREL);
1660         }
1661       break;
1662
1663     case 3:                     /* Conditional jumps instructions.  */
1664       line = extract_operand (line, l1, sizeof (l1));
1665       /* l1 is a label.  */
1666       if (l1[0])
1667         {
1668           char *m = l1;
1669           expressionS exp;
1670
1671           if (*m == '$')
1672             m++;
1673
1674           parse_exp (m, &exp);
1675           frag = frag_more (2); /* Instr size is 1 word.  */
1676
1677           /* In order to handle something like:
1678
1679              and #0x8000, r5
1680              tst r5
1681              jz   4     ;       skip next 4 bytes
1682              inv r5
1683              inc r5
1684              nop        ;       will jump here if r5 positive or zero
1685
1686              jCOND      -n      ;assumes jump n bytes backward:
1687
1688              mov r5,r6
1689              jmp -2
1690
1691              is equal to:
1692              lab:
1693              mov r5,r6
1694              jmp lab
1695
1696              jCOND      $n      ; jump from PC in either direction.  */
1697
1698           if (exp.X_op == O_constant)
1699             {
1700               int x = exp.X_add_number;
1701
1702               if (x & 1)
1703                 {
1704                   as_warn (_("Even number required. Rounded to %d"), x + 1);
1705                   x++;
1706                 }
1707
1708               if ((*l1 == '$' && x > 0) || x < 0)
1709                 x -= 2;
1710
1711               x >>= 1;
1712
1713               if (x > 512 || x < -511)
1714                 {
1715                   as_bad (_("Wrong displacement  %d"), x << 1);
1716                   break;
1717                 }
1718
1719               bin |= x & 0x3ff;
1720               bfd_putl16 ((bfd_vma) bin, frag);
1721             }
1722           else if (exp.X_op == O_symbol && *l1 != '$')
1723             {
1724               where = frag - frag_now->fr_literal;
1725               fix_new_exp (frag_now, where, 2,
1726                            &exp, TRUE, BFD_RELOC_MSP430_10_PCREL);
1727
1728               bfd_putl16 ((bfd_vma) bin, frag);
1729             }
1730           else if (*l1 == '$')
1731             {
1732               as_bad (_("instruction requires label sans '$'"));
1733             }
1734           else
1735             {
1736               as_bad (_
1737                       ("instruction requires label or value in range -511:512"));
1738             }
1739           dwarf2_emit_insn (2 * __is);
1740           break;
1741         }
1742       else
1743         {
1744           as_bad (_("instruction requires label"));
1745           break;
1746         }
1747       break;
1748
1749     case 4:     /* Extended jumps.  */
1750       if (!msp430_enable_polys)
1751         {
1752           as_bad(_("polymorphs are not enabled. Use -mP option to enable."));
1753           break;
1754         }
1755         
1756       line = extract_operand (line, l1, sizeof (l1));
1757       if (l1[0])
1758         {
1759           char *m = l1;
1760           expressionS exp;
1761
1762           /* Ignore absolute addressing. make it PC relative anyway.  */
1763           if (*m == '#' || *m == '$')
1764             m++;
1765
1766           parse_exp (m, & exp);
1767           if (exp.X_op == O_symbol)
1768             {
1769               /* Relaxation required.  */
1770               struct rcodes_s rc = msp430_rcodes[opcode->insn_opnumb];
1771
1772               /* The parameter to dwarf2_emit_insn is actually the offset to the start
1773                  of the insn from the fix piece of instruction that was emitted.
1774                  Since next fragments may have variable size we tie debug info
1775                  to the beginning of the instruction. */
1776               frag = frag_more (8);
1777               dwarf2_emit_insn (0);
1778               bfd_putl16 ((bfd_vma) rc.sop, frag);
1779               frag = frag_variant (rs_machine_dependent, 8, 2,
1780                                    ENCODE_RELAX (rc.lpos, STATE_BITS10), /* Wild guess.  */
1781                                    exp.X_add_symbol,
1782                                    0,   /* Offset is zero if jump dist less than 1K.  */
1783                                    (char *) frag);
1784               break;
1785             }
1786         }
1787
1788       as_bad (_("instruction requires label"));
1789       break;
1790
1791     case 5:     /* Emulated extended branches.  */
1792       if (!msp430_enable_polys)
1793         {
1794           as_bad(_("polymorphs are not enabled. Use -mP option to enable."));
1795           break;
1796         }
1797       line = extract_operand (line, l1, sizeof (l1));
1798       if (l1[0])
1799         {
1800           char * m = l1;
1801           expressionS exp;
1802
1803           /* Ignore absolute addressing. make it PC relative anyway.  */
1804           if (*m == '#' || *m == '$')
1805             m++;
1806
1807           parse_exp (m, & exp);
1808           if (exp.X_op == O_symbol)
1809             {
1810               /* Relaxation required.  */
1811               struct hcodes_s hc = msp430_hcodes[opcode->insn_opnumb];
1812
1813               frag = frag_more (8);
1814               dwarf2_emit_insn (0);
1815               bfd_putl16 ((bfd_vma) hc.op0, frag);
1816               bfd_putl16 ((bfd_vma) hc.op1, frag+2);
1817
1818               frag = frag_variant (rs_machine_dependent, 8, 2,
1819                                    ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10), /* Wild guess.  */
1820                                    exp.X_add_symbol,
1821                                    0,   /* Offset is zero if jump dist less than 1K.  */
1822                                    (char *) frag);
1823               break;
1824             }
1825         }
1826
1827       as_bad (_("instruction requires label"));
1828       break;
1829
1830     default:
1831       as_bad (_("Illegal instruction or not implemented opcode."));
1832     }
1833
1834   input_line_pointer = line;
1835   return 0;
1836 }
1837
1838 void
1839 md_assemble (char * str)
1840 {
1841   struct msp430_opcode_s * opcode;
1842   char cmd[32];
1843   unsigned int i = 0;
1844
1845   str = skip_space (str);       /* Skip leading spaces.  */
1846   str = extract_cmd (str, cmd, sizeof (cmd));
1847
1848   while (cmd[i] && i < sizeof (cmd))
1849     {
1850       char a = TOLOWER (cmd[i]);
1851       cmd[i] = a;
1852       i++;
1853     }
1854
1855   if (!cmd[0])
1856     {
1857       as_bad (_("can't find opcode "));
1858       return;
1859     }
1860
1861   opcode = (struct msp430_opcode_s *) hash_find (msp430_hash, cmd);
1862
1863   if (opcode == NULL)
1864     {
1865       as_bad (_("unknown opcode `%s'"), cmd);
1866       return;
1867     }
1868
1869   {
1870     char *__t = input_line_pointer;
1871
1872     msp430_operands (opcode, str);
1873     input_line_pointer = __t;
1874   }
1875 }
1876
1877 /* GAS will call this function for each section at the end of the assembly,
1878    to permit the CPU backend to adjust the alignment of a section.  */
1879
1880 valueT
1881 md_section_align (asection * seg, valueT addr)
1882 {
1883   int align = bfd_get_section_alignment (stdoutput, seg);
1884
1885   return ((addr + (1 << align) - 1) & (-1 << align));
1886 }
1887
1888 /* If you define this macro, it should return the offset between the
1889    address of a PC relative fixup and the position from which the PC
1890    relative adjustment should be made.  On many processors, the base
1891    of a PC relative instruction is the next instruction, so this
1892    macro would return the length of an instruction.  */
1893
1894 long
1895 md_pcrel_from_section (fixS * fixp, segT sec)
1896 {
1897   if (fixp->fx_addsy != (symbolS *) NULL
1898       && (!S_IS_DEFINED (fixp->fx_addsy)
1899           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1900     return 0;
1901
1902   return fixp->fx_frag->fr_address + fixp->fx_where;
1903 }
1904
1905 /* Replaces standard TC_FORCE_RELOCATION_LOCAL.
1906    Now it handles the situation when relocations
1907    have to be passed to linker. */
1908 int
1909 msp430_force_relocation_local(fixS *fixp)
1910 {
1911   if (msp430_enable_polys
1912         && !msp430_enable_relax)
1913     return 1;
1914   else
1915     return (!fixp->fx_pcrel
1916             || generic_force_reloc(fixp));
1917 }
1918
1919
1920 /* GAS will call this for each fixup.  It should store the correct
1921    value in the object file.  */
1922 void
1923 md_apply_fix (fixS * fixp, valueT * valuep, segT seg)
1924 {
1925   unsigned char * where;
1926   unsigned long insn;
1927   long value;
1928
1929   if (fixp->fx_addsy == (symbolS *) NULL)
1930     {
1931       value = *valuep;
1932       fixp->fx_done = 1;
1933     }
1934   else if (fixp->fx_pcrel)
1935     {
1936       segT s = S_GET_SEGMENT (fixp->fx_addsy);
1937
1938       if (fixp->fx_addsy && (s == seg || s == absolute_section))
1939         {
1940           /* FIXME: We can appear here only in case if we perform a pc
1941              relative jump to the label which is i) global, ii) locally
1942              defined or this is a jump to an absolute symbol.
1943              If this is an absolute symbol -- everything is OK.
1944              If this is a global label, we've got a symbol value defined
1945              twice:
1946                1. S_GET_VALUE (fixp->fx_addsy) will contain a symbol offset
1947                   from this section start
1948                2. *valuep will contain the real offset from jump insn to the
1949                   label
1950              So, the result of S_GET_VALUE (fixp->fx_addsy) + (* valuep);
1951              will be incorrect. Therefore remove s_get_value.  */
1952           value = /* S_GET_VALUE (fixp->fx_addsy) + */ * valuep;
1953           fixp->fx_done = 1;
1954         }
1955       else
1956         value = *valuep;
1957     }
1958   else
1959     {
1960       value = fixp->fx_offset;
1961
1962       if (fixp->fx_subsy != (symbolS *) NULL)
1963         {
1964           if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
1965             {
1966               value -= S_GET_VALUE (fixp->fx_subsy);
1967               fixp->fx_done = 1;
1968             }
1969           else
1970             {
1971               /* We don't actually support subtracting a symbol.  */
1972               as_bad_where (fixp->fx_file, fixp->fx_line,
1973                             _("expression too complex"));
1974             }
1975         }
1976     }
1977
1978   fixp->fx_no_overflow = 1;
1979
1980   /* if polymorphs are enabled and relax disabled. 
1981      do not kill any relocs and pass them to linker. */
1982   if (msp430_enable_polys 
1983       && !msp430_enable_relax)
1984     {
1985       if (!fixp->fx_addsy || (fixp->fx_addsy 
1986           && S_GET_SEGMENT (fixp->fx_addsy) == absolute_section))
1987         fixp->fx_done = 1;      /* It is ok to kill 'abs' reloc.  */
1988       else
1989         fixp->fx_done = 0;
1990     }
1991
1992   if (fixp->fx_done)
1993     {
1994       /* Fetch the instruction, insert the fully resolved operand
1995          value, and stuff the instruction back again.  */
1996
1997       where = (unsigned char *) fixp->fx_frag->fr_literal + fixp->fx_where;
1998
1999       insn = bfd_getl16 (where);
2000
2001       switch (fixp->fx_r_type)
2002         {
2003         case BFD_RELOC_MSP430_10_PCREL:
2004           if (value & 1)
2005             as_bad_where (fixp->fx_file, fixp->fx_line,
2006                           _("odd address operand: %ld"), value);
2007
2008           /* Jumps are in words.  */
2009           value >>= 1;
2010           --value;              /* Correct PC.  */
2011
2012           if (value < -512 || value > 511)
2013             as_bad_where (fixp->fx_file, fixp->fx_line,
2014                           _("operand out of range: %ld"), value);
2015
2016           value &= 0x3ff;       /* get rid of extended sign */
2017           bfd_putl16 ((bfd_vma) (value | insn), where);
2018           break;
2019
2020         case BFD_RELOC_MSP430_RL_PCREL:
2021         case BFD_RELOC_MSP430_16_PCREL:
2022           if (value & 1)
2023             as_bad_where (fixp->fx_file, fixp->fx_line,
2024                           _("odd address operand: %ld"), value);
2025
2026           /* Nothing to be corrected here.  */
2027           if (value < -32768 || value > 65536)
2028             as_bad_where (fixp->fx_file, fixp->fx_line,
2029                           _("operand out of range: %ld"), value);
2030
2031           value &= 0xffff;      /* Get rid of extended sign.  */
2032           bfd_putl16 ((bfd_vma) value, where);
2033           break;
2034
2035         case BFD_RELOC_MSP430_16_PCREL_BYTE:
2036           /* Nothing to be corrected here.  */
2037           if (value < -32768 || value > 65536)
2038             as_bad_where (fixp->fx_file, fixp->fx_line,
2039                           _("operand out of range: %ld"), value);
2040
2041           value &= 0xffff;      /* Get rid of extended sign.  */
2042           bfd_putl16 ((bfd_vma) value, where);
2043           break;
2044
2045         case BFD_RELOC_32:
2046           bfd_putl16 ((bfd_vma) value, where);
2047           break;
2048
2049         case BFD_RELOC_MSP430_16:
2050         case BFD_RELOC_16:
2051         case BFD_RELOC_MSP430_16_BYTE:
2052           value &= 0xffff;
2053           bfd_putl16 ((bfd_vma) value, where);
2054           break;
2055
2056         default:
2057           as_fatal (_("line %d: unknown relocation type: 0x%x"),
2058                     fixp->fx_line, fixp->fx_r_type);
2059           break;
2060         }
2061     }
2062   else
2063     {
2064       fixp->fx_addnumber = value;
2065     }
2066 }
2067
2068 /* GAS will call this to generate a reloc, passing the resulting reloc
2069    to `bfd_install_relocation'.  This currently works poorly, as
2070    `bfd_install_relocation' often does the wrong thing, and instances of
2071    `tc_gen_reloc' have been written to work around the problems, which
2072    in turns makes it difficult to fix `bfd_install_relocation'.  */
2073
2074 /* If while processing a fixup, a reloc really needs to be created
2075    then it is done here.  */
2076
2077 arelent *
2078 tc_gen_reloc (asection * seg ATTRIBUTE_UNUSED, fixS * fixp)
2079 {
2080   arelent * reloc;
2081
2082   reloc = xmalloc (sizeof (arelent));
2083
2084   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2085   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2086
2087   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2088   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2089   if (reloc->howto == (reloc_howto_type *) NULL)
2090     {
2091       as_bad_where (fixp->fx_file, fixp->fx_line,
2092                     _("reloc %d not supported by object file format"),
2093                     (int) fixp->fx_r_type);
2094       return NULL;
2095     }
2096
2097   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2098       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2099     reloc->address = fixp->fx_offset;
2100
2101   reloc->addend = fixp->fx_offset;
2102
2103   return reloc;
2104 }
2105
2106 int
2107 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
2108                                asection * segment_type ATTRIBUTE_UNUSED)
2109 {
2110   if (fragP->fr_symbol && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2111     {
2112       /* This is a jump -> pcrel mode. Nothing to do much here.
2113          Return value == 2.  */
2114       fragP->fr_subtype =
2115           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_BITS10);
2116     }
2117   else if (fragP->fr_symbol)
2118     {
2119       /* Its got a segment, but its not ours.   Even if fr_symbol is in
2120          an absolute segment, we don't know a displacement until we link
2121          object files. So it will always be long. This also applies to
2122          labels in a subsegment of current. Liker may relax it to short
2123          jump later. Return value == 8.  */
2124       fragP->fr_subtype =
2125           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_WORD);
2126     }
2127   else
2128     {
2129       /* We know the abs value. may be it is a jump to fixed address.
2130          Impossible in our case, cause all constants already handled. */
2131       fragP->fr_subtype =
2132           ENCODE_RELAX (RELAX_LEN (fragP->fr_subtype), STATE_UNDEF);
2133     }
2134
2135   return md_relax_table[fragP->fr_subtype].rlx_length;
2136 }
2137
2138 void
2139 md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED,
2140                  asection * sec ATTRIBUTE_UNUSED,
2141                  fragS * fragP)
2142 {
2143   char * where = 0;
2144   int rela = -1;
2145   int i;
2146   struct rcodes_s * cc = NULL;
2147   struct hcodes_s * hc = NULL;
2148
2149   switch (fragP->fr_subtype)
2150     {
2151     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_BITS10):
2152     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_BITS10):
2153     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_BITS10):
2154       /* We do not have to convert anything here.
2155          Just apply a fix.  */
2156       rela = BFD_RELOC_MSP430_10_PCREL;
2157       break;
2158
2159     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_WORD):
2160     case ENCODE_RELAX (STATE_UNCOND_BRANCH, STATE_UNDEF):
2161       /* Convert uncond branch jmp lab -> br lab.  */
2162       cc = & msp430_rcodes[7];
2163       where = fragP->fr_literal + fragP->fr_fix;
2164       bfd_putl16 (cc->lop0, where);
2165       rela = BFD_RELOC_MSP430_RL_PCREL;
2166       fragP->fr_fix += 2;
2167       break;
2168
2169     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_WORD):
2170     case ENCODE_RELAX (STATE_SIMPLE_BRANCH, STATE_UNDEF):
2171       {
2172         /* Other simple branches.  */
2173         int insn = bfd_getl16 (fragP->fr_opcode);
2174
2175         insn &= 0xffff;
2176         /* Find actual instruction.  */
2177         for (i = 0; i < 7 && !cc; i++)
2178           if (msp430_rcodes[i].sop == insn)
2179             cc = & msp430_rcodes[i];
2180         if (!cc || !cc->name)
2181           as_fatal (_("internal inconsistency problem in %s: insn %04lx"),
2182                     __FUNCTION__, (long) insn);
2183         where = fragP->fr_literal + fragP->fr_fix;
2184         bfd_putl16 (cc->lop0, where);
2185         bfd_putl16 (cc->lop1, where + 2);
2186         rela = BFD_RELOC_MSP430_RL_PCREL;
2187         fragP->fr_fix += 4;
2188       }
2189       break;
2190
2191     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_WORD):
2192     case ENCODE_RELAX (STATE_NOOV_BRANCH, STATE_UNDEF):
2193       cc = & msp430_rcodes[6];
2194       where = fragP->fr_literal + fragP->fr_fix;
2195       bfd_putl16 (cc->lop0, where);
2196       bfd_putl16 (cc->lop1, where + 2);
2197       bfd_putl16 (cc->lop2, where + 4);
2198       rela = BFD_RELOC_MSP430_RL_PCREL;
2199       fragP->fr_fix += 6;
2200       break;
2201
2202     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10):
2203       {
2204         int insn = bfd_getl16 (fragP->fr_opcode + 2);
2205
2206         insn &= 0xffff;
2207         for (i = 0; i < 4 && !hc; i++)
2208           if (msp430_hcodes[i].op1 == insn)
2209             hc = &msp430_hcodes[i];
2210         if (!hc || !hc->name)
2211           as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"),
2212               __FUNCTION__, (long) insn);
2213         rela = BFD_RELOC_MSP430_10_PCREL;
2214         /* Apply a fix for a first label if necessary.
2215            another fix will be applied to the next word of insn anyway.  */
2216         if (hc->tlab == 2)
2217           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2218               fragP->fr_offset, TRUE, rela);
2219         fragP->fr_fix += 2;
2220       }
2221
2222       break;
2223
2224     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_WORD):
2225     case ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_UNDEF):
2226       {
2227         int insn = bfd_getl16 (fragP->fr_opcode + 2);
2228
2229         insn &= 0xffff;
2230         for (i = 0; i < 4 && !hc; i++)
2231           if (msp430_hcodes[i].op1 == insn)
2232             hc = & msp430_hcodes[i];
2233         if (!hc || !hc->name)
2234           as_fatal (_("internal inconsistency problem in %s: ext. insn %04lx"),
2235               __FUNCTION__, (long) insn);
2236         rela = BFD_RELOC_MSP430_RL_PCREL;
2237         where = fragP->fr_literal + fragP->fr_fix;
2238         bfd_putl16 (hc->lop0, where);
2239         bfd_putl16 (hc->lop1, where + 2);
2240         bfd_putl16 (hc->lop2, where + 4);
2241         fragP->fr_fix += 6;
2242       }
2243       break;
2244
2245     default:
2246       as_fatal (_("internal inconsistency problem in %s:  %lx"),
2247                 __FUNCTION__, (long) fragP->fr_subtype);
2248       break;
2249     }
2250
2251   /* Now apply fix.  */
2252   fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2253            fragP->fr_offset, TRUE, rela);
2254   /* Just fixed 2 bytes.  */
2255   fragP->fr_fix += 2;
2256 }
2257
2258 /* Relax fragment. Mostly stolen from hc11 and mcore
2259    which arches I think I know.  */
2260
2261 long
2262 msp430_relax_frag (segT seg ATTRIBUTE_UNUSED, fragS * fragP,
2263                    long stretch ATTRIBUTE_UNUSED)
2264 {
2265   long growth;
2266   offsetT aim = 0;
2267   symbolS *symbolP;
2268   const relax_typeS *this_type;
2269   const relax_typeS *start_type;
2270   relax_substateT next_state;
2271   relax_substateT this_state;
2272   const relax_typeS *table = md_relax_table;
2273
2274   /* Nothing to be done if the frag has already max size.  */
2275   if (RELAX_STATE (fragP->fr_subtype) == STATE_UNDEF
2276       || RELAX_STATE (fragP->fr_subtype) == STATE_WORD)
2277     return 0;
2278
2279   if (RELAX_STATE (fragP->fr_subtype) == STATE_BITS10)
2280     {
2281       symbolP = fragP->fr_symbol;
2282       if (symbol_resolved_p (symbolP))
2283         as_fatal (_("internal inconsistency problem in %s: resolved symbol"),
2284                   __FUNCTION__);
2285       /* We know the offset. calculate a distance.  */
2286       aim = S_GET_VALUE (symbolP) - fragP->fr_address - fragP->fr_fix;
2287     }
2288
2289   if (!msp430_enable_relax)
2290     {
2291       /* Relaxation is not enabled. So, make all jump as long ones
2292          by setting 'aim' to quite high value. */
2293       aim = 0x7fff;
2294     }
2295   
2296   this_state = fragP->fr_subtype;
2297   start_type = this_type = table + this_state;
2298
2299   if (aim < 0)
2300     {
2301       /* Look backwards.  */
2302       for (next_state = this_type->rlx_more; next_state;)
2303         if (aim >= this_type->rlx_backward || !this_type->rlx_backward)
2304           next_state = 0;
2305         else
2306           {
2307             /* Grow to next state.  */
2308             this_state = next_state;
2309             this_type = table + this_state;
2310             next_state = this_type->rlx_more;
2311           }
2312     }
2313   else
2314     {
2315       /* Look forwards.  */
2316       for (next_state = this_type->rlx_more; next_state;)
2317         if (aim <= this_type->rlx_forward || !this_type->rlx_forward)
2318           next_state = 0;
2319         else
2320           {
2321             /* Grow to next state.  */
2322             this_state = next_state;
2323             this_type = table + this_state;
2324             next_state = this_type->rlx_more;
2325           }
2326     }
2327
2328   growth = this_type->rlx_length - start_type->rlx_length;
2329   if (growth != 0)
2330     fragP->fr_subtype = this_state;
2331   return growth;
2332 }