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