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