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