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