* emulparams/elf64btsmip.sh: n64 replaces .reginfo with .MIPS.options.
[deliverable/binutils-gdb.git] / gas / config / tc-mn10300.c
1 /* tc-mn10300.c -- Assembler code for the Matsushita 10300
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include <stdio.h>
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "opcode/mn10300.h"
27 #include "dwarf2dbg.h"
28 \f
29 /* Structure to hold information about predefined registers. */
30 struct reg_name
31 {
32 const char *name;
33 int value;
34 };
35
36 /* Generic assembler global variables which must be defined by all
37 targets. */
38
39 /* Characters which always start a comment. */
40 const char comment_chars[] = "#";
41
42 /* Characters which start a comment at the beginning of a line. */
43 const char line_comment_chars[] = ";#";
44
45 /* Characters which may be used to separate multiple commands on a
46 single line. */
47 const char line_separator_chars[] = ";";
48
49 /* Characters which are used to indicate an exponent in a floating
50 point number. */
51 const char EXP_CHARS[] = "eE";
52
53 /* Characters which mean that a number is a floating point constant,
54 as in 0d1.0. */
55 const char FLT_CHARS[] = "dD";
56 \f
57 const relax_typeS md_relax_table[] = {
58 /* bCC relaxing */
59 {0x7f, -0x80, 2, 1},
60 {0x7fff, -0x8000, 5, 2},
61 {0x7fffffff, -0x80000000, 7, 0},
62
63 /* bCC relaxing (uncommon cases) */
64 {0x7f, -0x80, 3, 4},
65 {0x7fff, -0x8000, 6, 5},
66 {0x7fffffff, -0x80000000, 8, 0},
67
68 /* call relaxing */
69 {0x7fff, -0x8000, 5, 7},
70 {0x7fffffff, -0x80000000, 7, 0},
71
72 /* calls relaxing */
73 {0x7fff, -0x8000, 4, 9},
74 {0x7fffffff, -0x80000000, 6, 0},
75
76 /* jmp relaxing */
77 {0x7f, -0x80, 2, 11},
78 {0x7fff, -0x8000, 3, 12},
79 {0x7fffffff, -0x80000000, 5, 0},
80
81 };
82
83 /* Local functions. */
84 static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
85 const struct mn10300_operand *,
86 offsetT, char *, unsigned,
87 unsigned));
88 static unsigned long check_operand PARAMS ((unsigned long,
89 const struct mn10300_operand *,
90 offsetT));
91 static int reg_name_search PARAMS ((const struct reg_name *, int, const char *));
92 static boolean data_register_name PARAMS ((expressionS *expressionP));
93 static boolean address_register_name PARAMS ((expressionS *expressionP));
94 static boolean other_register_name PARAMS ((expressionS *expressionP));
95 static void set_arch_mach PARAMS ((unsigned int));
96
97 /* Set linkrelax here to avoid fixups in most sections. */
98 int linkrelax = 1;
99
100 static int current_machine;
101
102 /* Fixups. */
103 #define MAX_INSN_FIXUPS (5)
104 struct mn10300_fixup
105 {
106 expressionS exp;
107 int opindex;
108 bfd_reloc_code_real_type reloc;
109 };
110 struct mn10300_fixup fixups[MAX_INSN_FIXUPS];
111 static int fc;
112
113 /* We must store the value of each register operand so that we can
114 verify that certain registers do not match. */
115 int mn10300_reg_operands[MN10300_MAX_OPERANDS];
116 \f
117 const char *md_shortopts = "";
118 struct option md_longopts[] = {
119 {NULL, no_argument, NULL, 0}
120 };
121 size_t md_longopts_size = sizeof (md_longopts);
122
123 /* The target specific pseudo-ops which we support. */
124 const pseudo_typeS md_pseudo_table[] =
125 {
126 { "file", dwarf2_directive_file, 0 },
127 { "loc", dwarf2_directive_loc, 0 },
128 { "am30", set_arch_mach, AM30 },
129 { "am33", set_arch_mach, AM33 },
130 { "mn10300", set_arch_mach, MN103 },
131 {NULL, 0, 0}
132 };
133
134 #define HAVE_AM33 (current_machine == AM33)
135 #define HAVE_AM30 (current_machine == AM30)
136
137 /* Opcode hash table. */
138 static struct hash_control *mn10300_hash;
139
140 /* This table is sorted. Suitable for searching by a binary search. */
141 static const struct reg_name data_registers[] =
142 {
143 { "d0", 0 },
144 { "d1", 1 },
145 { "d2", 2 },
146 { "d3", 3 },
147 };
148 #define DATA_REG_NAME_CNT \
149 (sizeof (data_registers) / sizeof (struct reg_name))
150
151 static const struct reg_name address_registers[] =
152 {
153 { "a0", 0 },
154 { "a1", 1 },
155 { "a2", 2 },
156 { "a3", 3 },
157 };
158
159 #define ADDRESS_REG_NAME_CNT \
160 (sizeof (address_registers) / sizeof (struct reg_name))
161
162 static const struct reg_name r_registers[] =
163 {
164 { "a0", 8 },
165 { "a1", 9 },
166 { "a2", 10 },
167 { "a3", 11 },
168 { "d0", 12 },
169 { "d1", 13 },
170 { "d2", 14 },
171 { "d3", 15 },
172 { "e0", 0 },
173 { "e1", 1 },
174 { "e10", 10 },
175 { "e11", 11 },
176 { "e12", 12 },
177 { "e13", 13 },
178 { "e14", 14 },
179 { "e15", 15 },
180 { "e2", 2 },
181 { "e3", 3 },
182 { "e4", 4 },
183 { "e5", 5 },
184 { "e6", 6 },
185 { "e7", 7 },
186 { "e8", 8 },
187 { "e9", 9 },
188 { "r0", 0 },
189 { "r1", 1 },
190 { "r10", 10 },
191 { "r11", 11 },
192 { "r12", 12 },
193 { "r13", 13 },
194 { "r14", 14 },
195 { "r15", 15 },
196 { "r2", 2 },
197 { "r3", 3 },
198 { "r4", 4 },
199 { "r5", 5 },
200 { "r6", 6 },
201 { "r7", 7 },
202 { "r8", 8 },
203 { "r9", 9 },
204 };
205
206 #define R_REG_NAME_CNT \
207 (sizeof (r_registers) / sizeof (struct reg_name))
208
209 static const struct reg_name xr_registers[] =
210 {
211 { "mcrh", 2 },
212 { "mcrl", 3 },
213 { "mcvf", 4 },
214 { "mdrq", 1 },
215 { "sp", 0 },
216 { "xr0", 0 },
217 { "xr1", 1 },
218 { "xr10", 10 },
219 { "xr11", 11 },
220 { "xr12", 12 },
221 { "xr13", 13 },
222 { "xr14", 14 },
223 { "xr15", 15 },
224 { "xr2", 2 },
225 { "xr3", 3 },
226 { "xr4", 4 },
227 { "xr5", 5 },
228 { "xr6", 6 },
229 { "xr7", 7 },
230 { "xr8", 8 },
231 { "xr9", 9 },
232 };
233
234 #define XR_REG_NAME_CNT \
235 (sizeof (xr_registers) / sizeof (struct reg_name))
236
237 /* We abuse the `value' field, that would be otherwise unused, to
238 encode the architecture on which (access to) the register was
239 introduced. FIXME: we should probably warn when we encounter a
240 register name when assembling for an architecture that doesn't
241 support it, before parsing it as a symbol name. */
242 static const struct reg_name other_registers[] =
243 {
244 { "epsw", AM33 },
245 { "mdr", 0 },
246 { "pc", AM33 },
247 { "psw", 0 },
248 { "sp", 0 },
249 };
250
251 #define OTHER_REG_NAME_CNT \
252 (sizeof (other_registers) / sizeof (struct reg_name))
253
254 /* reg_name_search does a binary search of the given register table
255 to see if "name" is a valid regiter name. Returns the register
256 number from the array on success, or -1 on failure. */
257
258 static int
259 reg_name_search (regs, regcount, name)
260 const struct reg_name *regs;
261 int regcount;
262 const char *name;
263 {
264 int middle, low, high;
265 int cmp;
266
267 low = 0;
268 high = regcount - 1;
269
270 do
271 {
272 middle = (low + high) / 2;
273 cmp = strcasecmp (name, regs[middle].name);
274 if (cmp < 0)
275 high = middle - 1;
276 else if (cmp > 0)
277 low = middle + 1;
278 else
279 return regs[middle].value;
280 }
281 while (low <= high);
282 return -1;
283 }
284
285 /* Summary of register_name().
286 *
287 * in: Input_line_pointer points to 1st char of operand.
288 *
289 * out: An expressionS.
290 * The operand may have been a register: in this case, X_op == O_register,
291 * X_add_number is set to the register number, and truth is returned.
292 * Input_line_pointer->(next non-blank) char after operand, or is in
293 * its original state.
294 */
295
296 static boolean
297 r_register_name (expressionP)
298 expressionS *expressionP;
299 {
300 int reg_number;
301 char *name;
302 char *start;
303 char c;
304
305 /* Find the spelling of the operand. */
306 start = name = input_line_pointer;
307
308 c = get_symbol_end ();
309 reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
310
311 /* Put back the delimiting char. */
312 *input_line_pointer = c;
313
314 /* Look to see if it's in the register table. */
315 if (reg_number >= 0)
316 {
317 expressionP->X_op = O_register;
318 expressionP->X_add_number = reg_number;
319
320 /* Make the rest nice. */
321 expressionP->X_add_symbol = NULL;
322 expressionP->X_op_symbol = NULL;
323
324 return true;
325 }
326
327 /* Reset the line as if we had not done anything. */
328 input_line_pointer = start;
329 return false;
330 }
331
332 /* Summary of register_name().
333 *
334 * in: Input_line_pointer points to 1st char of operand.
335 *
336 * out: An expressionS.
337 * The operand may have been a register: in this case, X_op == O_register,
338 * X_add_number is set to the register number, and truth is returned.
339 * Input_line_pointer->(next non-blank) char after operand, or is in
340 * its original state.
341 */
342
343 static boolean
344 xr_register_name (expressionP)
345 expressionS *expressionP;
346 {
347 int reg_number;
348 char *name;
349 char *start;
350 char c;
351
352 /* Find the spelling of the operand. */
353 start = name = input_line_pointer;
354
355 c = get_symbol_end ();
356 reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
357
358 /* Put back the delimiting char. */
359 *input_line_pointer = c;
360
361 /* Look to see if it's in the register table. */
362 if (reg_number >= 0)
363 {
364 expressionP->X_op = O_register;
365 expressionP->X_add_number = reg_number;
366
367 /* Make the rest nice. */
368 expressionP->X_add_symbol = NULL;
369 expressionP->X_op_symbol = NULL;
370
371 return true;
372 }
373
374 /* Reset the line as if we had not done anything. */
375 input_line_pointer = start;
376 return false;
377 }
378
379 /* Summary of register_name().
380 *
381 * in: Input_line_pointer points to 1st char of operand.
382 *
383 * out: An expressionS.
384 * The operand may have been a register: in this case, X_op == O_register,
385 * X_add_number is set to the register number, and truth is returned.
386 * Input_line_pointer->(next non-blank) char after operand, or is in
387 * its original state.
388 */
389
390 static boolean
391 data_register_name (expressionP)
392 expressionS *expressionP;
393 {
394 int reg_number;
395 char *name;
396 char *start;
397 char c;
398
399 /* Find the spelling of the operand. */
400 start = name = input_line_pointer;
401
402 c = get_symbol_end ();
403 reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
404
405 /* Put back the delimiting char. */
406 *input_line_pointer = c;
407
408 /* Look to see if it's in the register table. */
409 if (reg_number >= 0)
410 {
411 expressionP->X_op = O_register;
412 expressionP->X_add_number = reg_number;
413
414 /* Make the rest nice. */
415 expressionP->X_add_symbol = NULL;
416 expressionP->X_op_symbol = NULL;
417
418 return true;
419 }
420
421 /* Reset the line as if we had not done anything. */
422 input_line_pointer = start;
423 return false;
424 }
425
426 /* Summary of register_name().
427 *
428 * in: Input_line_pointer points to 1st char of operand.
429 *
430 * out: An expressionS.
431 * The operand may have been a register: in this case, X_op == O_register,
432 * X_add_number is set to the register number, and truth is returned.
433 * Input_line_pointer->(next non-blank) char after operand, or is in
434 * its original state.
435 */
436
437 static boolean
438 address_register_name (expressionP)
439 expressionS *expressionP;
440 {
441 int reg_number;
442 char *name;
443 char *start;
444 char c;
445
446 /* Find the spelling of the operand. */
447 start = name = input_line_pointer;
448
449 c = get_symbol_end ();
450 reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
451
452 /* Put back the delimiting char. */
453 *input_line_pointer = c;
454
455 /* Look to see if it's in the register table. */
456 if (reg_number >= 0)
457 {
458 expressionP->X_op = O_register;
459 expressionP->X_add_number = reg_number;
460
461 /* Make the rest nice. */
462 expressionP->X_add_symbol = NULL;
463 expressionP->X_op_symbol = NULL;
464
465 return true;
466 }
467
468 /* Reset the line as if we had not done anything. */
469 input_line_pointer = start;
470 return false;
471 }
472
473 /* Summary of register_name().
474 *
475 * in: Input_line_pointer points to 1st char of operand.
476 *
477 * out: An expressionS.
478 * The operand may have been a register: in this case, X_op == O_register,
479 * X_add_number is set to the register number, and truth is returned.
480 * Input_line_pointer->(next non-blank) char after operand, or is in
481 * its original state.
482 */
483
484 static boolean
485 other_register_name (expressionP)
486 expressionS *expressionP;
487 {
488 int reg_number;
489 char *name;
490 char *start;
491 char c;
492
493 /* Find the spelling of the operand. */
494 start = name = input_line_pointer;
495
496 c = get_symbol_end ();
497 reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
498
499 /* Put back the delimiting char. */
500 *input_line_pointer = c;
501
502 /* Look to see if it's in the register table. */
503 if (reg_number == 0
504 || (reg_number == AM33 && HAVE_AM33))
505 {
506 expressionP->X_op = O_register;
507 expressionP->X_add_number = 0;
508
509 /* Make the rest nice. */
510 expressionP->X_add_symbol = NULL;
511 expressionP->X_op_symbol = NULL;
512
513 return true;
514 }
515
516 /* Reset the line as if we had not done anything. */
517 input_line_pointer = start;
518 return false;
519 }
520
521 void
522 md_show_usage (stream)
523 FILE *stream;
524 {
525 fprintf (stream, _("MN10300 options:\n\
526 none yet\n"));
527 }
528
529 int
530 md_parse_option (c, arg)
531 int c ATTRIBUTE_UNUSED;
532 char *arg ATTRIBUTE_UNUSED;
533 {
534 return 0;
535 }
536
537 symbolS *
538 md_undefined_symbol (name)
539 char *name ATTRIBUTE_UNUSED;
540 {
541 return 0;
542 }
543
544 char *
545 md_atof (type, litp, sizep)
546 int type;
547 char *litp;
548 int *sizep;
549 {
550 int prec;
551 LITTLENUM_TYPE words[4];
552 char *t;
553 int i;
554
555 switch (type)
556 {
557 case 'f':
558 prec = 2;
559 break;
560
561 case 'd':
562 prec = 4;
563 break;
564
565 default:
566 *sizep = 0;
567 return "bad call to md_atof";
568 }
569
570 t = atof_ieee (input_line_pointer, type, words);
571 if (t)
572 input_line_pointer = t;
573
574 *sizep = prec * 2;
575
576 for (i = prec - 1; i >= 0; i--)
577 {
578 md_number_to_chars (litp, (valueT) words[i], 2);
579 litp += 2;
580 }
581
582 return NULL;
583 }
584
585 void
586 md_convert_frag (abfd, sec, fragP)
587 bfd *abfd ATTRIBUTE_UNUSED;
588 asection *sec;
589 fragS *fragP;
590 {
591 static unsigned long label_count = 0;
592 char buf[40];
593
594 subseg_change (sec, 0);
595 if (fragP->fr_subtype == 0)
596 {
597 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
598 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
599 fragP->fr_var = 0;
600 fragP->fr_fix += 2;
601 }
602 else if (fragP->fr_subtype == 1)
603 {
604 /* Reverse the condition of the first branch. */
605 int offset = fragP->fr_fix;
606 int opcode = fragP->fr_literal[offset] & 0xff;
607
608 switch (opcode)
609 {
610 case 0xc8:
611 opcode = 0xc9;
612 break;
613 case 0xc9:
614 opcode = 0xc8;
615 break;
616 case 0xc0:
617 opcode = 0xc2;
618 break;
619 case 0xc2:
620 opcode = 0xc0;
621 break;
622 case 0xc3:
623 opcode = 0xc1;
624 break;
625 case 0xc1:
626 opcode = 0xc3;
627 break;
628 case 0xc4:
629 opcode = 0xc6;
630 break;
631 case 0xc6:
632 opcode = 0xc4;
633 break;
634 case 0xc7:
635 opcode = 0xc5;
636 break;
637 case 0xc5:
638 opcode = 0xc7;
639 break;
640 default:
641 abort ();
642 }
643 fragP->fr_literal[offset] = opcode;
644
645 /* Create a fixup for the reversed conditional branch. */
646 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
647 fix_new (fragP, fragP->fr_fix + 1, 1,
648 symbol_new (buf, sec, 0, fragP->fr_next),
649 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
650
651 /* Now create the unconditional branch + fixup to the
652 final target. */
653 fragP->fr_literal[offset + 2] = 0xcc;
654 fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol,
655 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
656 fragP->fr_var = 0;
657 fragP->fr_fix += 5;
658 }
659 else if (fragP->fr_subtype == 2)
660 {
661 /* Reverse the condition of the first branch. */
662 int offset = fragP->fr_fix;
663 int opcode = fragP->fr_literal[offset] & 0xff;
664
665 switch (opcode)
666 {
667 case 0xc8:
668 opcode = 0xc9;
669 break;
670 case 0xc9:
671 opcode = 0xc8;
672 break;
673 case 0xc0:
674 opcode = 0xc2;
675 break;
676 case 0xc2:
677 opcode = 0xc0;
678 break;
679 case 0xc3:
680 opcode = 0xc1;
681 break;
682 case 0xc1:
683 opcode = 0xc3;
684 break;
685 case 0xc4:
686 opcode = 0xc6;
687 break;
688 case 0xc6:
689 opcode = 0xc4;
690 break;
691 case 0xc7:
692 opcode = 0xc5;
693 break;
694 case 0xc5:
695 opcode = 0xc7;
696 break;
697 default:
698 abort ();
699 }
700 fragP->fr_literal[offset] = opcode;
701
702 /* Create a fixup for the reversed conditional branch. */
703 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
704 fix_new (fragP, fragP->fr_fix + 1, 1,
705 symbol_new (buf, sec, 0, fragP->fr_next),
706 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
707
708 /* Now create the unconditional branch + fixup to the
709 final target. */
710 fragP->fr_literal[offset + 2] = 0xdc;
711 fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
712 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
713 fragP->fr_var = 0;
714 fragP->fr_fix += 7;
715 }
716 else if (fragP->fr_subtype == 3)
717 {
718 fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
719 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
720 fragP->fr_var = 0;
721 fragP->fr_fix += 3;
722 }
723 else if (fragP->fr_subtype == 4)
724 {
725 /* Reverse the condition of the first branch. */
726 int offset = fragP->fr_fix;
727 int opcode = fragP->fr_literal[offset + 1] & 0xff;
728
729 switch (opcode)
730 {
731 case 0xe8:
732 opcode = 0xe9;
733 break;
734 case 0xe9:
735 opcode = 0xe8;
736 break;
737 case 0xea:
738 opcode = 0xeb;
739 break;
740 case 0xeb:
741 opcode = 0xea;
742 break;
743 default:
744 abort ();
745 }
746 fragP->fr_literal[offset + 1] = opcode;
747
748 /* Create a fixup for the reversed conditional branch. */
749 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
750 fix_new (fragP, fragP->fr_fix + 2, 1,
751 symbol_new (buf, sec, 0, fragP->fr_next),
752 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
753
754 /* Now create the unconditional branch + fixup to the
755 final target. */
756 fragP->fr_literal[offset + 3] = 0xcc;
757 fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
758 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
759 fragP->fr_var = 0;
760 fragP->fr_fix += 6;
761 }
762 else if (fragP->fr_subtype == 5)
763 {
764 /* Reverse the condition of the first branch. */
765 int offset = fragP->fr_fix;
766 int opcode = fragP->fr_literal[offset + 1] & 0xff;
767
768 switch (opcode)
769 {
770 case 0xe8:
771 opcode = 0xe9;
772 break;
773 case 0xea:
774 opcode = 0xeb;
775 break;
776 case 0xeb:
777 opcode = 0xea;
778 break;
779 default:
780 abort ();
781 }
782 fragP->fr_literal[offset + 1] = opcode;
783
784 /* Create a fixup for the reversed conditional branch. */
785 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
786 fix_new (fragP, fragP->fr_fix + 2, 1,
787 symbol_new (buf, sec, 0, fragP->fr_next),
788 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
789
790 /* Now create the unconditional branch + fixup to the
791 final target. */
792 fragP->fr_literal[offset + 3] = 0xdc;
793 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
794 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
795 fragP->fr_var = 0;
796 fragP->fr_fix += 8;
797 }
798 else if (fragP->fr_subtype == 6)
799 {
800 int offset = fragP->fr_fix;
801 fragP->fr_literal[offset] = 0xcd;
802 fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
803 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
804 fragP->fr_var = 0;
805 fragP->fr_fix += 5;
806 }
807 else if (fragP->fr_subtype == 7)
808 {
809 int offset = fragP->fr_fix;
810 fragP->fr_literal[offset] = 0xdd;
811 fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3];
812 fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4];
813
814 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
815 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
816 fragP->fr_var = 0;
817 fragP->fr_fix += 7;
818 }
819 else if (fragP->fr_subtype == 8)
820 {
821 int offset = fragP->fr_fix;
822 fragP->fr_literal[offset] = 0xfa;
823 fragP->fr_literal[offset + 1] = 0xff;
824 fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
825 fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL);
826 fragP->fr_var = 0;
827 fragP->fr_fix += 4;
828 }
829 else if (fragP->fr_subtype == 9)
830 {
831 int offset = fragP->fr_fix;
832 fragP->fr_literal[offset] = 0xfc;
833 fragP->fr_literal[offset + 1] = 0xff;
834
835 fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
836 fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL);
837 fragP->fr_var = 0;
838 fragP->fr_fix += 6;
839 }
840 else if (fragP->fr_subtype == 10)
841 {
842 fragP->fr_literal[fragP->fr_fix] = 0xca;
843 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
844 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
845 fragP->fr_var = 0;
846 fragP->fr_fix += 2;
847 }
848 else if (fragP->fr_subtype == 11)
849 {
850 int offset = fragP->fr_fix;
851 fragP->fr_literal[offset] = 0xcc;
852
853 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
854 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
855 fragP->fr_var = 0;
856 fragP->fr_fix += 3;
857 }
858 else if (fragP->fr_subtype == 12)
859 {
860 int offset = fragP->fr_fix;
861 fragP->fr_literal[offset] = 0xdc;
862
863 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
864 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
865 fragP->fr_var = 0;
866 fragP->fr_fix += 5;
867 }
868 else
869 abort ();
870 }
871
872 valueT
873 md_section_align (seg, addr)
874 asection *seg;
875 valueT addr;
876 {
877 int align = bfd_get_section_alignment (stdoutput, seg);
878 return ((addr + (1 << align) - 1) & (-1 << align));
879 }
880
881 void
882 md_begin ()
883 {
884 char *prev_name = "";
885 register const struct mn10300_opcode *op;
886
887 mn10300_hash = hash_new ();
888
889 /* Insert unique names into hash table. The MN10300 instruction set
890 has many identical opcode names that have different opcodes based
891 on the operands. This hash table then provides a quick index to
892 the first opcode with a particular name in the opcode table. */
893
894 op = mn10300_opcodes;
895 while (op->name)
896 {
897 if (strcmp (prev_name, op->name))
898 {
899 prev_name = (char *) op->name;
900 hash_insert (mn10300_hash, op->name, (char *) op);
901 }
902 op++;
903 }
904
905 /* Set the default machine type. */
906 if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
907 as_warn (_("could not set architecture and machine"));
908
909 current_machine = MN103;
910 }
911
912 void
913 md_assemble (str)
914 char *str;
915 {
916 char *s;
917 struct mn10300_opcode *opcode;
918 struct mn10300_opcode *next_opcode;
919 const unsigned char *opindex_ptr;
920 int next_opindex, relaxable;
921 unsigned long insn, extension, size = 0;
922 char *f;
923 int i;
924 int match;
925
926 /* Get the opcode. */
927 for (s = str; *s != '\0' && !ISSPACE (*s); s++)
928 ;
929 if (*s != '\0')
930 *s++ = '\0';
931
932 /* Find the first opcode with the proper name. */
933 opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
934 if (opcode == NULL)
935 {
936 as_bad (_("Unrecognized opcode: `%s'"), str);
937 return;
938 }
939
940 str = s;
941 while (ISSPACE (*str))
942 ++str;
943
944 input_line_pointer = str;
945
946 for (;;)
947 {
948 const char *errmsg;
949 int op_idx;
950 char *hold;
951 int extra_shift = 0;
952
953 errmsg = _("Invalid opcode/operands");
954
955 /* Reset the array of register operands. */
956 memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
957
958 relaxable = 0;
959 fc = 0;
960 match = 0;
961 next_opindex = 0;
962 insn = opcode->opcode;
963 extension = 0;
964
965 /* If the instruction is not available on the current machine
966 then it can not possibly match. */
967 if (opcode->machine
968 && !(opcode->machine == AM33 && HAVE_AM33)
969 && !(opcode->machine == AM30 && HAVE_AM30))
970 goto error;
971
972 for (op_idx = 1, opindex_ptr = opcode->operands;
973 *opindex_ptr != 0;
974 opindex_ptr++, op_idx++)
975 {
976 const struct mn10300_operand *operand;
977 expressionS ex;
978
979 if (next_opindex == 0)
980 {
981 operand = &mn10300_operands[*opindex_ptr];
982 }
983 else
984 {
985 operand = &mn10300_operands[next_opindex];
986 next_opindex = 0;
987 }
988
989 while (*str == ' ' || *str == ',')
990 ++str;
991
992 if (operand->flags & MN10300_OPERAND_RELAX)
993 relaxable = 1;
994
995 /* Gather the operand. */
996 hold = input_line_pointer;
997 input_line_pointer = str;
998
999 if (operand->flags & MN10300_OPERAND_PAREN)
1000 {
1001 if (*input_line_pointer != ')' && *input_line_pointer != '(')
1002 {
1003 input_line_pointer = hold;
1004 str = hold;
1005 goto error;
1006 }
1007 input_line_pointer++;
1008 goto keep_going;
1009 }
1010 /* See if we can match the operands. */
1011 else if (operand->flags & MN10300_OPERAND_DREG)
1012 {
1013 if (!data_register_name (&ex))
1014 {
1015 input_line_pointer = hold;
1016 str = hold;
1017 goto error;
1018 }
1019 }
1020 else if (operand->flags & MN10300_OPERAND_AREG)
1021 {
1022 if (!address_register_name (&ex))
1023 {
1024 input_line_pointer = hold;
1025 str = hold;
1026 goto error;
1027 }
1028 }
1029 else if (operand->flags & MN10300_OPERAND_SP)
1030 {
1031 char *start = input_line_pointer;
1032 char c = get_symbol_end ();
1033
1034 if (strcasecmp (start, "sp") != 0)
1035 {
1036 *input_line_pointer = c;
1037 input_line_pointer = hold;
1038 str = hold;
1039 goto error;
1040 }
1041 *input_line_pointer = c;
1042 goto keep_going;
1043 }
1044 else if (operand->flags & MN10300_OPERAND_RREG)
1045 {
1046 if (!r_register_name (&ex))
1047 {
1048 input_line_pointer = hold;
1049 str = hold;
1050 goto error;
1051 }
1052 }
1053 else if (operand->flags & MN10300_OPERAND_XRREG)
1054 {
1055 if (!xr_register_name (&ex))
1056 {
1057 input_line_pointer = hold;
1058 str = hold;
1059 goto error;
1060 }
1061 }
1062 else if (operand->flags & MN10300_OPERAND_USP)
1063 {
1064 char *start = input_line_pointer;
1065 char c = get_symbol_end ();
1066
1067 if (strcasecmp (start, "usp") != 0)
1068 {
1069 *input_line_pointer = c;
1070 input_line_pointer = hold;
1071 str = hold;
1072 goto error;
1073 }
1074 *input_line_pointer = c;
1075 goto keep_going;
1076 }
1077 else if (operand->flags & MN10300_OPERAND_SSP)
1078 {
1079 char *start = input_line_pointer;
1080 char c = get_symbol_end ();
1081
1082 if (strcasecmp (start, "ssp") != 0)
1083 {
1084 *input_line_pointer = c;
1085 input_line_pointer = hold;
1086 str = hold;
1087 goto error;
1088 }
1089 *input_line_pointer = c;
1090 goto keep_going;
1091 }
1092 else if (operand->flags & MN10300_OPERAND_MSP)
1093 {
1094 char *start = input_line_pointer;
1095 char c = get_symbol_end ();
1096
1097 if (strcasecmp (start, "msp") != 0)
1098 {
1099 *input_line_pointer = c;
1100 input_line_pointer = hold;
1101 str = hold;
1102 goto error;
1103 }
1104 *input_line_pointer = c;
1105 goto keep_going;
1106 }
1107 else if (operand->flags & MN10300_OPERAND_PC)
1108 {
1109 char *start = input_line_pointer;
1110 char c = get_symbol_end ();
1111
1112 if (strcasecmp (start, "pc") != 0)
1113 {
1114 *input_line_pointer = c;
1115 input_line_pointer = hold;
1116 str = hold;
1117 goto error;
1118 }
1119 *input_line_pointer = c;
1120 goto keep_going;
1121 }
1122 else if (operand->flags & MN10300_OPERAND_EPSW)
1123 {
1124 char *start = input_line_pointer;
1125 char c = get_symbol_end ();
1126
1127 if (strcasecmp (start, "epsw") != 0)
1128 {
1129 *input_line_pointer = c;
1130 input_line_pointer = hold;
1131 str = hold;
1132 goto error;
1133 }
1134 *input_line_pointer = c;
1135 goto keep_going;
1136 }
1137 else if (operand->flags & MN10300_OPERAND_PLUS)
1138 {
1139 if (*input_line_pointer != '+')
1140 {
1141 input_line_pointer = hold;
1142 str = hold;
1143 goto error;
1144 }
1145 input_line_pointer++;
1146 goto keep_going;
1147 }
1148 else if (operand->flags & MN10300_OPERAND_PSW)
1149 {
1150 char *start = input_line_pointer;
1151 char c = get_symbol_end ();
1152
1153 if (strcasecmp (start, "psw") != 0)
1154 {
1155 *input_line_pointer = c;
1156 input_line_pointer = hold;
1157 str = hold;
1158 goto error;
1159 }
1160 *input_line_pointer = c;
1161 goto keep_going;
1162 }
1163 else if (operand->flags & MN10300_OPERAND_MDR)
1164 {
1165 char *start = input_line_pointer;
1166 char c = get_symbol_end ();
1167
1168 if (strcasecmp (start, "mdr") != 0)
1169 {
1170 *input_line_pointer = c;
1171 input_line_pointer = hold;
1172 str = hold;
1173 goto error;
1174 }
1175 *input_line_pointer = c;
1176 goto keep_going;
1177 }
1178 else if (operand->flags & MN10300_OPERAND_REG_LIST)
1179 {
1180 unsigned int value = 0;
1181 if (*input_line_pointer != '[')
1182 {
1183 input_line_pointer = hold;
1184 str = hold;
1185 goto error;
1186 }
1187
1188 /* Eat the '['. */
1189 input_line_pointer++;
1190
1191 /* We used to reject a null register list here; however,
1192 we accept it now so the compiler can emit "call"
1193 instructions for all calls to named functions.
1194
1195 The linker can then fill in the appropriate bits for the
1196 register list and stack size or change the instruction
1197 into a "calls" if using "call" is not profitable. */
1198 while (*input_line_pointer != ']')
1199 {
1200 char *start;
1201 char c;
1202
1203 if (*input_line_pointer == ',')
1204 input_line_pointer++;
1205
1206 start = input_line_pointer;
1207 c = get_symbol_end ();
1208
1209 if (strcasecmp (start, "d2") == 0)
1210 {
1211 value |= 0x80;
1212 *input_line_pointer = c;
1213 }
1214 else if (strcasecmp (start, "d3") == 0)
1215 {
1216 value |= 0x40;
1217 *input_line_pointer = c;
1218 }
1219 else if (strcasecmp (start, "a2") == 0)
1220 {
1221 value |= 0x20;
1222 *input_line_pointer = c;
1223 }
1224 else if (strcasecmp (start, "a3") == 0)
1225 {
1226 value |= 0x10;
1227 *input_line_pointer = c;
1228 }
1229 else if (strcasecmp (start, "other") == 0)
1230 {
1231 value |= 0x08;
1232 *input_line_pointer = c;
1233 }
1234 else if (HAVE_AM33
1235 && strcasecmp (start, "exreg0") == 0)
1236 {
1237 value |= 0x04;
1238 *input_line_pointer = c;
1239 }
1240 else if (HAVE_AM33
1241 && strcasecmp (start, "exreg1") == 0)
1242 {
1243 value |= 0x02;
1244 *input_line_pointer = c;
1245 }
1246 else if (HAVE_AM33
1247 && strcasecmp (start, "exother") == 0)
1248 {
1249 value |= 0x01;
1250 *input_line_pointer = c;
1251 }
1252 else if (HAVE_AM33
1253 && strcasecmp (start, "all") == 0)
1254 {
1255 value |= 0xff;
1256 *input_line_pointer = c;
1257 }
1258 else
1259 {
1260 input_line_pointer = hold;
1261 str = hold;
1262 goto error;
1263 }
1264 }
1265 input_line_pointer++;
1266 mn10300_insert_operand (&insn, &extension, operand,
1267 value, (char *) NULL, 0, 0);
1268 goto keep_going;
1269
1270 }
1271 else if (data_register_name (&ex))
1272 {
1273 input_line_pointer = hold;
1274 str = hold;
1275 goto error;
1276 }
1277 else if (address_register_name (&ex))
1278 {
1279 input_line_pointer = hold;
1280 str = hold;
1281 goto error;
1282 }
1283 else if (other_register_name (&ex))
1284 {
1285 input_line_pointer = hold;
1286 str = hold;
1287 goto error;
1288 }
1289 else if (HAVE_AM33 && r_register_name (&ex))
1290 {
1291 input_line_pointer = hold;
1292 str = hold;
1293 goto error;
1294 }
1295 else if (HAVE_AM33 && xr_register_name (&ex))
1296 {
1297 input_line_pointer = hold;
1298 str = hold;
1299 goto error;
1300 }
1301 else if (*str == ')' || *str == '(')
1302 {
1303 input_line_pointer = hold;
1304 str = hold;
1305 goto error;
1306 }
1307 else
1308 {
1309 expression (&ex);
1310 }
1311
1312 switch (ex.X_op)
1313 {
1314 case O_illegal:
1315 errmsg = _("illegal operand");
1316 goto error;
1317 case O_absent:
1318 errmsg = _("missing operand");
1319 goto error;
1320 case O_register:
1321 {
1322 int mask;
1323
1324 mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
1325 if (HAVE_AM33)
1326 mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
1327 if ((operand->flags & mask) == 0)
1328 {
1329 input_line_pointer = hold;
1330 str = hold;
1331 goto error;
1332 }
1333
1334 if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
1335 extra_shift = 8;
1336 else if (opcode->format == FMT_D2
1337 || opcode->format == FMT_D4
1338 || opcode->format == FMT_S2
1339 || opcode->format == FMT_S4
1340 || opcode->format == FMT_S6
1341 || opcode->format == FMT_D5)
1342 extra_shift = 16;
1343 else if (opcode->format == FMT_D7)
1344 extra_shift = 8;
1345 else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
1346 extra_shift = 8;
1347 else
1348 extra_shift = 0;
1349
1350 mn10300_insert_operand (&insn, &extension, operand,
1351 ex.X_add_number, (char *) NULL,
1352 0, extra_shift);
1353
1354 /* And note the register number in the register array. */
1355 mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
1356 break;
1357 }
1358
1359 case O_constant:
1360 /* If this operand can be promoted, and it doesn't
1361 fit into the allocated bitfield for this insn,
1362 then promote it (ie this opcode does not match). */
1363 if (operand->flags
1364 & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
1365 && !check_operand (insn, operand, ex.X_add_number))
1366 {
1367 input_line_pointer = hold;
1368 str = hold;
1369 goto error;
1370 }
1371
1372 mn10300_insert_operand (&insn, &extension, operand,
1373 ex.X_add_number, (char *) NULL,
1374 0, 0);
1375 break;
1376
1377 default:
1378 /* If this operand can be promoted, then this opcode didn't
1379 match since we can't know if it needed promotion! */
1380 if (operand->flags & MN10300_OPERAND_PROMOTE)
1381 {
1382 input_line_pointer = hold;
1383 str = hold;
1384 goto error;
1385 }
1386
1387 /* We need to generate a fixup for this expression. */
1388 if (fc >= MAX_INSN_FIXUPS)
1389 as_fatal (_("too many fixups"));
1390 fixups[fc].exp = ex;
1391 fixups[fc].opindex = *opindex_ptr;
1392 fixups[fc].reloc = BFD_RELOC_UNUSED;
1393 ++fc;
1394 break;
1395 }
1396
1397 keep_going:
1398 str = input_line_pointer;
1399 input_line_pointer = hold;
1400
1401 while (*str == ' ' || *str == ',')
1402 ++str;
1403
1404 }
1405
1406 /* Make sure we used all the operands! */
1407 if (*str != ',')
1408 match = 1;
1409
1410 /* If this instruction has registers that must not match, verify
1411 that they do indeed not match. */
1412 if (opcode->no_match_operands)
1413 {
1414 int i;
1415
1416 /* Look at each operand to see if it's marked. */
1417 for (i = 0; i < MN10300_MAX_OPERANDS; i++)
1418 {
1419 if ((1 << i) & opcode->no_match_operands)
1420 {
1421 int j;
1422
1423 /* operand I is marked. Check that it does not match any
1424 operands > I which are marked. */
1425 for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
1426 {
1427 if (((1 << j) & opcode->no_match_operands)
1428 && mn10300_reg_operands[i] == mn10300_reg_operands[j])
1429 {
1430 errmsg = _("Invalid register specification.");
1431 match = 0;
1432 goto error;
1433 }
1434 }
1435 }
1436 }
1437 }
1438
1439 error:
1440 if (match == 0)
1441 {
1442 next_opcode = opcode + 1;
1443 if (!strcmp (next_opcode->name, opcode->name))
1444 {
1445 opcode = next_opcode;
1446 continue;
1447 }
1448
1449 as_bad ("%s", errmsg);
1450 return;
1451 }
1452 break;
1453 }
1454
1455 while (ISSPACE (*str))
1456 ++str;
1457
1458 if (*str != '\0')
1459 as_bad (_("junk at end of line: `%s'"), str);
1460
1461 input_line_pointer = str;
1462
1463 /* Determine the size of the instruction. */
1464 if (opcode->format == FMT_S0)
1465 size = 1;
1466
1467 if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
1468 size = 2;
1469
1470 if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
1471 size = 3;
1472
1473 if (opcode->format == FMT_D6)
1474 size = 3;
1475
1476 if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
1477 size = 4;
1478
1479 if (opcode->format == FMT_D8)
1480 size = 6;
1481
1482 if (opcode->format == FMT_D9)
1483 size = 7;
1484
1485 if (opcode->format == FMT_S4)
1486 size = 5;
1487
1488 if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
1489 size = 7;
1490
1491 if (opcode->format == FMT_D2)
1492 size = 4;
1493
1494 if (opcode->format == FMT_D4)
1495 size = 6;
1496
1497 if (relaxable && fc > 0)
1498 {
1499 int type;
1500
1501 /* We want to anchor the line info to the previous frag (if
1502 there isn't one, create it), so that, when the insn is
1503 resized, we still get the right address for the beginning of
1504 the region. */
1505 f = frag_more (0);
1506 dwarf2_emit_insn (0);
1507
1508 /* bCC */
1509 if (size == 2)
1510 {
1511 /* Handle bra specially. Basically treat it like jmp so
1512 that we automatically handle 8, 16 and 32 bit offsets
1513 correctly as well as jumps to an undefined address.
1514
1515 It is also important to not treat it like other bCC
1516 instructions since the long forms of bra is different
1517 from other bCC instructions. */
1518 if (opcode->opcode == 0xca00)
1519 type = 10;
1520 else
1521 type = 0;
1522 }
1523 /* call */
1524 else if (size == 5)
1525 type = 6;
1526 /* calls */
1527 else if (size == 4)
1528 type = 8;
1529 /* jmp */
1530 else if (size == 3 && opcode->opcode == 0xcc0000)
1531 type = 10;
1532 /* bCC (uncommon cases) */
1533 else
1534 type = 3;
1535
1536 f = frag_var (rs_machine_dependent, 8, 8 - size, type,
1537 fixups[0].exp.X_add_symbol,
1538 fixups[0].exp.X_add_number,
1539 (char *)fixups[0].opindex);
1540
1541 /* This is pretty hokey. We basically just care about the
1542 opcode, so we have to write out the first word big endian.
1543
1544 The exception is "call", which has two operands that we
1545 care about.
1546
1547 The first operand (the register list) happens to be in the
1548 first instruction word, and will be in the right place if
1549 we output the first word in big endian mode.
1550
1551 The second operand (stack size) is in the extension word,
1552 and we want it to appear as the first character in the extension
1553 word (as it appears in memory). Luckily, writing the extension
1554 word in big endian format will do what we want. */
1555 number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
1556 if (size > 8)
1557 {
1558 number_to_chars_bigendian (f + 4, extension, 4);
1559 number_to_chars_bigendian (f + 8, 0, size - 8);
1560 }
1561 else if (size > 4)
1562 number_to_chars_bigendian (f + 4, extension, size - 4);
1563 }
1564 else
1565 {
1566 /* Allocate space for the instruction. */
1567 f = frag_more (size);
1568
1569 /* Fill in bytes for the instruction. Note that opcode fields
1570 are written big-endian, 16 & 32bit immediates are written
1571 little endian. Egad. */
1572 if (opcode->format == FMT_S0
1573 || opcode->format == FMT_S1
1574 || opcode->format == FMT_D0
1575 || opcode->format == FMT_D6
1576 || opcode->format == FMT_D7
1577 || opcode->format == FMT_D10
1578 || opcode->format == FMT_D1)
1579 {
1580 number_to_chars_bigendian (f, insn, size);
1581 }
1582 else if (opcode->format == FMT_S2
1583 && opcode->opcode != 0xdf0000
1584 && opcode->opcode != 0xde0000)
1585 {
1586 /* A format S2 instruction that is _not_ "ret" and "retf". */
1587 number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
1588 number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
1589 }
1590 else if (opcode->format == FMT_S2)
1591 {
1592 /* This must be a ret or retf, which is written entirely in
1593 big-endian format. */
1594 number_to_chars_bigendian (f, insn, 3);
1595 }
1596 else if (opcode->format == FMT_S4
1597 && opcode->opcode != 0xdc000000)
1598 {
1599 /* This must be a format S4 "call" instruction. What a pain. */
1600 unsigned long temp = (insn >> 8) & 0xffff;
1601 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1602 number_to_chars_littleendian (f + 1, temp, 2);
1603 number_to_chars_bigendian (f + 3, insn & 0xff, 1);
1604 number_to_chars_bigendian (f + 4, extension & 0xff, 1);
1605 }
1606 else if (opcode->format == FMT_S4)
1607 {
1608 /* This must be a format S4 "jmp" instruction. */
1609 unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
1610 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1611 number_to_chars_littleendian (f + 1, temp, 4);
1612 }
1613 else if (opcode->format == FMT_S6)
1614 {
1615 unsigned long temp = ((insn & 0xffffff) << 8)
1616 | ((extension >> 16) & 0xff);
1617 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1618 number_to_chars_littleendian (f + 1, temp, 4);
1619 number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
1620 number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1621 }
1622 else if (opcode->format == FMT_D2
1623 && opcode->opcode != 0xfaf80000
1624 && opcode->opcode != 0xfaf00000
1625 && opcode->opcode != 0xfaf40000)
1626 {
1627 /* A format D2 instruction where the 16bit immediate is
1628 really a single 16bit value, not two 8bit values. */
1629 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1630 number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
1631 }
1632 else if (opcode->format == FMT_D2)
1633 {
1634 /* A format D2 instruction where the 16bit immediate
1635 is really two 8bit immediates. */
1636 number_to_chars_bigendian (f, insn, 4);
1637 }
1638 else if (opcode->format == FMT_D4)
1639 {
1640 unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
1641
1642 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1643 number_to_chars_littleendian (f + 2, temp, 4);
1644 }
1645 else if (opcode->format == FMT_D5)
1646 {
1647 unsigned long temp = (((insn & 0xffff) << 16)
1648 | ((extension >> 8) & 0xffff));
1649
1650 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1651 number_to_chars_littleendian (f + 2, temp, 4);
1652 number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1653 }
1654 else if (opcode->format == FMT_D8)
1655 {
1656 unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
1657
1658 number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
1659 number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
1660 number_to_chars_littleendian (f + 4, temp >> 8, 2);
1661 }
1662 else if (opcode->format == FMT_D9)
1663 {
1664 unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
1665
1666 number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
1667 number_to_chars_littleendian (f + 3, temp, 4);
1668 }
1669
1670 /* Create any fixups. */
1671 for (i = 0; i < fc; i++)
1672 {
1673 const struct mn10300_operand *operand;
1674
1675 operand = &mn10300_operands[fixups[i].opindex];
1676 if (fixups[i].reloc != BFD_RELOC_UNUSED)
1677 {
1678 reloc_howto_type *reloc_howto;
1679 int size;
1680 int offset;
1681 fixS *fixP;
1682
1683 reloc_howto = bfd_reloc_type_lookup (stdoutput,
1684 fixups[i].reloc);
1685
1686 if (!reloc_howto)
1687 abort ();
1688
1689 size = bfd_get_reloc_size (reloc_howto);
1690
1691 if (size < 1 || size > 4)
1692 abort ();
1693
1694 offset = 4 - size;
1695 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
1696 size, &fixups[i].exp,
1697 reloc_howto->pc_relative,
1698 fixups[i].reloc);
1699 }
1700 else
1701 {
1702 int reloc, pcrel, reloc_size, offset;
1703 fixS *fixP;
1704
1705 reloc = BFD_RELOC_NONE;
1706 /* How big is the reloc? Remember SPLIT relocs are
1707 implicitly 32bits. */
1708 if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
1709 reloc_size = 32;
1710 else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
1711 reloc_size = 24;
1712 else
1713 reloc_size = operand->bits;
1714
1715 /* Is the reloc pc-relative? */
1716 pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
1717
1718 offset = size - (reloc_size + operand->shift) / 8;
1719
1720 /* Choose a proper BFD relocation type. */
1721 if (pcrel)
1722 {
1723 if (reloc_size == 32)
1724 reloc = BFD_RELOC_32_PCREL;
1725 else if (reloc_size == 16)
1726 reloc = BFD_RELOC_16_PCREL;
1727 else if (reloc_size == 8)
1728 reloc = BFD_RELOC_8_PCREL;
1729 else
1730 abort ();
1731 }
1732 else
1733 {
1734 if (reloc_size == 32)
1735 reloc = BFD_RELOC_32;
1736 else if (reloc_size == 16)
1737 reloc = BFD_RELOC_16;
1738 else if (reloc_size == 8)
1739 reloc = BFD_RELOC_8;
1740 else
1741 abort ();
1742 }
1743
1744 /* Convert the size of the reloc into what fix_new_exp wants. */
1745 reloc_size = reloc_size / 8;
1746 if (reloc_size == 8)
1747 reloc_size = 0;
1748 else if (reloc_size == 16)
1749 reloc_size = 1;
1750 else if (reloc_size == 32)
1751 reloc_size = 2;
1752
1753 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
1754 reloc_size, &fixups[i].exp, pcrel,
1755 ((bfd_reloc_code_real_type) reloc));
1756
1757 if (pcrel)
1758 fixP->fx_offset += offset;
1759 }
1760 }
1761
1762 dwarf2_emit_insn (size);
1763 }
1764 }
1765
1766 /* If while processing a fixup, a reloc really needs to be created
1767 then it is done here. */
1768
1769 arelent *
1770 tc_gen_reloc (seg, fixp)
1771 asection *seg ATTRIBUTE_UNUSED;
1772 fixS *fixp;
1773 {
1774 arelent *reloc;
1775 reloc = (arelent *) xmalloc (sizeof (arelent));
1776
1777 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1778 if (reloc->howto == (reloc_howto_type *) NULL)
1779 {
1780 as_bad_where (fixp->fx_file, fixp->fx_line,
1781 _("reloc %d not supported by object file format"),
1782 (int) fixp->fx_r_type);
1783 return NULL;
1784 }
1785 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1786
1787 if (fixp->fx_addsy && fixp->fx_subsy)
1788 {
1789 reloc->sym_ptr_ptr = NULL;
1790
1791 /* If we got a difference between two symbols, and the
1792 subtracted symbol is in the current section, use a
1793 PC-relative relocation. If both symbols are in the same
1794 section, the difference would have already been simplified
1795 to a constant. */
1796 if (S_GET_SEGMENT (fixp->fx_subsy) == seg)
1797 {
1798 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1799 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1800 reloc->addend = (reloc->address - S_GET_VALUE (fixp->fx_subsy)
1801 + fixp->fx_offset);
1802
1803 switch (fixp->fx_r_type)
1804 {
1805 case BFD_RELOC_8:
1806 reloc->howto = bfd_reloc_type_lookup (stdoutput,
1807 BFD_RELOC_8_PCREL);
1808 return reloc;
1809
1810 case BFD_RELOC_16:
1811 reloc->howto = bfd_reloc_type_lookup (stdoutput,
1812 BFD_RELOC_16_PCREL);
1813 return reloc;
1814
1815 case BFD_RELOC_24:
1816 reloc->howto = bfd_reloc_type_lookup (stdoutput,
1817 BFD_RELOC_24_PCREL);
1818 return reloc;
1819
1820 case BFD_RELOC_32:
1821 reloc->howto = bfd_reloc_type_lookup (stdoutput,
1822 BFD_RELOC_32_PCREL);
1823 return reloc;
1824
1825 default:
1826 /* Try to compute the absolute value below. */
1827 break;
1828 }
1829 }
1830
1831 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
1832 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
1833 {
1834 as_bad_where (fixp->fx_file, fixp->fx_line,
1835 "Difference of symbols in different sections is not supported");
1836 }
1837 else
1838 {
1839 char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
1840
1841 reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
1842 - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
1843
1844 switch (fixp->fx_r_type)
1845 {
1846 case BFD_RELOC_8:
1847 md_number_to_chars (fixpos, reloc->addend, 1);
1848 break;
1849
1850 case BFD_RELOC_16:
1851 md_number_to_chars (fixpos, reloc->addend, 2);
1852 break;
1853
1854 case BFD_RELOC_24:
1855 md_number_to_chars (fixpos, reloc->addend, 3);
1856 break;
1857
1858 case BFD_RELOC_32:
1859 md_number_to_chars (fixpos, reloc->addend, 4);
1860 break;
1861
1862 default:
1863 reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
1864 return reloc;
1865 }
1866 }
1867
1868 if (reloc->sym_ptr_ptr)
1869 free (reloc->sym_ptr_ptr);
1870 free (reloc);
1871 return NULL;
1872 }
1873 else
1874 {
1875 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1876 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1877 reloc->addend = fixp->fx_offset;
1878 }
1879 return reloc;
1880 }
1881
1882 int
1883 md_estimate_size_before_relax (fragp, seg)
1884 fragS *fragp;
1885 asection *seg;
1886 {
1887 if (fragp->fr_subtype == 6
1888 && (!S_IS_DEFINED (fragp->fr_symbol)
1889 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
1890 fragp->fr_subtype = 7;
1891 else if (fragp->fr_subtype == 8
1892 && (!S_IS_DEFINED (fragp->fr_symbol)
1893 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
1894 fragp->fr_subtype = 9;
1895 else if (fragp->fr_subtype == 10
1896 && (!S_IS_DEFINED (fragp->fr_symbol)
1897 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
1898 fragp->fr_subtype = 12;
1899
1900 if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
1901 abort ();
1902
1903 return md_relax_table[fragp->fr_subtype].rlx_length;
1904 }
1905
1906 long
1907 md_pcrel_from (fixp)
1908 fixS *fixp;
1909 {
1910 if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
1911 {
1912 /* The symbol is undefined. Let the linker figure it out. */
1913 return 0;
1914 }
1915 return fixp->fx_frag->fr_address + fixp->fx_where;
1916 }
1917
1918 void
1919 md_apply_fix3 (fixP, valP, seg)
1920 fixS * fixP;
1921 valueT * valP;
1922 segT seg;
1923 {
1924 char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal;
1925 int size = 0;
1926 int value = (int) * valP;
1927
1928 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
1929
1930 /* This should never happen. */
1931 if (seg->flags & SEC_ALLOC)
1932 abort ();
1933
1934 /* The value we are passed in *valuep includes the symbol values.
1935 Since we are using BFD_ASSEMBLER, if we are doing this relocation
1936 the code in write.c is going to call bfd_install_relocation, which
1937 is also going to use the symbol value. That means that if the
1938 reloc is fully resolved we want to use *valuep since
1939 bfd_install_relocation is not being used.
1940
1941 However, if the reloc is not fully resolved we do not want to use
1942 *valuep, and must use fx_offset instead. However, if the reloc
1943 is PC relative, we do want to use *valuep since it includes the
1944 result of md_pcrel_from. */
1945 if (fixP->fx_addsy != (symbolS *) NULL && ! fixP->fx_pcrel)
1946 value = fixP->fx_offset;
1947
1948 /* If the fix is relative to a symbol which is not defined, or not
1949 in the same segment as the fix, we cannot resolve it here. */
1950 if (fixP->fx_addsy != NULL
1951 && (! S_IS_DEFINED (fixP->fx_addsy)
1952 || (S_GET_SEGMENT (fixP->fx_addsy) != seg)))
1953 {
1954 fixP->fx_done = 0;
1955 return;
1956 }
1957
1958 switch (fixP->fx_r_type)
1959 {
1960 case BFD_RELOC_8:
1961 case BFD_RELOC_8_PCREL:
1962 size = 1;
1963 break;
1964
1965 case BFD_RELOC_16:
1966 case BFD_RELOC_16_PCREL:
1967 size = 2;
1968 break;
1969
1970 case BFD_RELOC_32:
1971 case BFD_RELOC_32_PCREL:
1972 size = 4;
1973 break;
1974
1975 case BFD_RELOC_VTABLE_INHERIT:
1976 case BFD_RELOC_VTABLE_ENTRY:
1977 fixP->fx_done = 0;
1978 return;
1979
1980 case BFD_RELOC_NONE:
1981 default:
1982 as_bad_where (fixP->fx_file, fixP->fx_line,
1983 _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
1984 }
1985
1986 md_number_to_chars (fixpos, value, size);
1987
1988 /* If a symbol remains, pass the fixup, as a reloc, onto the linker. */
1989 if (fixP->fx_addsy == NULL)
1990 fixP->fx_done = 1;
1991 }
1992
1993 /* Return nonzero if the fixup in FIXP will require a relocation,
1994 even it if appears that the fixup could be completely handled
1995 within GAS. */
1996
1997 int
1998 mn10300_force_relocation (fixp)
1999 struct fix *fixp;
2000 {
2001 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2002 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2003 return 1;
2004
2005 /* Do not adjust relocations involving symbols in code sections,
2006 because it breaks linker relaxations. This could be fixed in the
2007 linker, but this fix is simpler, and it pretty much only affects
2008 object size a little bit. */
2009 if ((S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
2010 && fixp->fx_subsy
2011 && S_GET_SEGMENT (fixp->fx_addsy) == S_GET_SEGMENT (fixp->fx_subsy))
2012 return 1;
2013
2014 return 0;
2015 }
2016
2017 /* Return zero if the fixup in fixp should be left alone and not
2018 adjusted. */
2019
2020 boolean
2021 mn10300_fix_adjustable (fixp)
2022 struct fix *fixp;
2023 {
2024 /* Prevent all adjustments to global symbols. */
2025 if (S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))
2026 return 0;
2027
2028 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2029 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2030 return 0;
2031
2032 /* Do not adjust relocations involving symbols in code sections,
2033 because it breaks linker relaxations. This could be fixed in the
2034 linker, but this fix is simpler, and it pretty much only affects
2035 object size a little bit. */
2036 if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
2037 return 0;
2038
2039 return 1;
2040 }
2041
2042 /* Insert an operand value into an instruction. */
2043
2044 static void
2045 mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
2046 unsigned long *insnp;
2047 unsigned long *extensionp;
2048 const struct mn10300_operand *operand;
2049 offsetT val;
2050 char *file;
2051 unsigned int line;
2052 unsigned int shift;
2053 {
2054 /* No need to check 32bit operands for a bit. Note that
2055 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2056 if (operand->bits != 32
2057 && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2058 {
2059 long min, max;
2060 offsetT test;
2061 int bits;
2062
2063 bits = operand->bits;
2064 if (operand->flags & MN10300_OPERAND_24BIT)
2065 bits = 24;
2066
2067 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2068 {
2069 max = (1 << (bits - 1)) - 1;
2070 min = - (1 << (bits - 1));
2071 }
2072 else
2073 {
2074 max = (1 << bits) - 1;
2075 min = 0;
2076 }
2077
2078 test = val;
2079
2080 if (test < (offsetT) min || test > (offsetT) max)
2081 {
2082 const char *err =
2083 _("operand out of range (%s not between %ld and %ld)");
2084 char buf[100];
2085
2086 sprint_value (buf, test);
2087 if (file == (char *) NULL)
2088 as_warn (err, buf, min, max);
2089 else
2090 as_warn_where (file, line, err, buf, min, max);
2091 }
2092 }
2093
2094 if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2095 {
2096 *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
2097 *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
2098 << operand->shift);
2099 }
2100 else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2101 {
2102 *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
2103 *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
2104 << operand->shift);
2105 }
2106 else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
2107 {
2108 *insnp |= (((long) val & ((1 << operand->bits) - 1))
2109 << (operand->shift + shift));
2110
2111 if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2112 *insnp |= (((long) val & ((1 << operand->bits) - 1))
2113 << (operand->shift + shift + operand->bits));
2114 }
2115 else
2116 {
2117 *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2118 << (operand->shift + shift));
2119
2120 if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2121 *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2122 << (operand->shift + shift + operand->bits));
2123 }
2124 }
2125
2126 static unsigned long
2127 check_operand (insn, operand, val)
2128 unsigned long insn ATTRIBUTE_UNUSED;
2129 const struct mn10300_operand *operand;
2130 offsetT val;
2131 {
2132 /* No need to check 32bit operands for a bit. Note that
2133 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2134 if (operand->bits != 32
2135 && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2136 {
2137 long min, max;
2138 offsetT test;
2139 int bits;
2140
2141 bits = operand->bits;
2142 if (operand->flags & MN10300_OPERAND_24BIT)
2143 bits = 24;
2144
2145 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2146 {
2147 max = (1 << (bits - 1)) - 1;
2148 min = - (1 << (bits - 1));
2149 }
2150 else
2151 {
2152 max = (1 << bits) - 1;
2153 min = 0;
2154 }
2155
2156 test = val;
2157
2158 if (test < (offsetT) min || test > (offsetT) max)
2159 return 0;
2160 else
2161 return 1;
2162 }
2163 return 1;
2164 }
2165
2166 static void
2167 set_arch_mach (mach)
2168 unsigned int mach;
2169 {
2170 if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
2171 as_warn (_("could not set architecture and machine"));
2172
2173 current_machine = mach;
2174 }
This page took 0.096344 seconds and 4 git commands to generate.