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