Remove duplicate code and provide a function for generating internally consistent...
[external/binutils.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, 2003
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   /* fbCC relaxing  */
82   {0x7f, -0x80, 3, 14},
83   {0x7fff, -0x8000, 6, 15},
84   {0x7fffffff, -0x80000000, 8, 0},
85
86 };
87
88 /* Local functions.  */
89 static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
90                                             const struct mn10300_operand *,
91                                             offsetT, char *, unsigned,
92                                             unsigned));
93 static unsigned long check_operand PARAMS ((unsigned long,
94                                             const struct mn10300_operand *,
95                                             offsetT));
96 static int reg_name_search PARAMS ((const struct reg_name *, int, const char *));
97 static bfd_boolean data_register_name PARAMS ((expressionS *expressionP));
98 static bfd_boolean address_register_name PARAMS ((expressionS *expressionP));
99 static bfd_boolean other_register_name PARAMS ((expressionS *expressionP));
100 static bfd_boolean r_register_name PARAMS ((expressionS *expressionP));
101 static bfd_boolean xr_register_name PARAMS ((expressionS *expressionP));
102 static void set_arch_mach PARAMS ((int));
103
104 /*  Set linkrelax here to avoid fixups in most sections.  */
105 int linkrelax = 1;
106
107 static int current_machine;
108
109 /* Fixups.  */
110 #define MAX_INSN_FIXUPS (5)
111 struct mn10300_fixup
112 {
113   expressionS exp;
114   int opindex;
115   bfd_reloc_code_real_type reloc;
116 };
117 struct mn10300_fixup fixups[MAX_INSN_FIXUPS];
118 static int fc;
119
120 /* We must store the value of each register operand so that we can
121    verify that certain registers do not match.  */
122 int mn10300_reg_operands[MN10300_MAX_OPERANDS];
123 \f
124 const char *md_shortopts = "";
125 struct option md_longopts[] = {
126   {NULL, no_argument, NULL, 0}
127 };
128 size_t md_longopts_size = sizeof (md_longopts);
129
130 /* The target specific pseudo-ops which we support.  */
131 const pseudo_typeS md_pseudo_table[] =
132 {
133   { "am30",     set_arch_mach,          AM30 },
134   { "am33",     set_arch_mach,          AM33 },
135   { "am33_2",   (void (*) PARAMS ((int))) set_arch_mach, AM33_2 },
136   { "mn10300",  set_arch_mach,          MN103 },
137   {NULL, 0, 0}
138 };
139
140 #define HAVE_AM33_2 (current_machine == AM33_2)
141 #define HAVE_AM33 (current_machine == AM33 || HAVE_AM33_2)
142 #define HAVE_AM30 (current_machine == AM30)
143
144 /* Opcode hash table.  */
145 static struct hash_control *mn10300_hash;
146
147 /* This table is sorted. Suitable for searching by a binary search.  */
148 static const struct reg_name data_registers[] =
149 {
150   { "d0", 0 },
151   { "d1", 1 },
152   { "d2", 2 },
153   { "d3", 3 },
154 };
155 #define DATA_REG_NAME_CNT                               \
156   (sizeof (data_registers) / sizeof (struct reg_name))
157
158 static const struct reg_name address_registers[] =
159 {
160   { "a0", 0 },
161   { "a1", 1 },
162   { "a2", 2 },
163   { "a3", 3 },
164 };
165
166 #define ADDRESS_REG_NAME_CNT                                    \
167   (sizeof (address_registers) / sizeof (struct reg_name))
168
169 static const struct reg_name r_registers[] =
170 {
171   { "a0", 8 },
172   { "a1", 9 },
173   { "a2", 10 },
174   { "a3", 11 },
175   { "d0", 12 },
176   { "d1", 13 },
177   { "d2", 14 },
178   { "d3", 15 },
179   { "e0", 0 },
180   { "e1", 1 },
181   { "e10", 10 },
182   { "e11", 11 },
183   { "e12", 12 },
184   { "e13", 13 },
185   { "e14", 14 },
186   { "e15", 15 },
187   { "e2", 2 },
188   { "e3", 3 },
189   { "e4", 4 },
190   { "e5", 5 },
191   { "e6", 6 },
192   { "e7", 7 },
193   { "e8", 8 },
194   { "e9", 9 },
195   { "r0", 0 },
196   { "r1", 1 },
197   { "r10", 10 },
198   { "r11", 11 },
199   { "r12", 12 },
200   { "r13", 13 },
201   { "r14", 14 },
202   { "r15", 15 },
203   { "r2", 2 },
204   { "r3", 3 },
205   { "r4", 4 },
206   { "r5", 5 },
207   { "r6", 6 },
208   { "r7", 7 },
209   { "r8", 8 },
210   { "r9", 9 },
211 };
212
213 #define R_REG_NAME_CNT                                  \
214   (sizeof (r_registers) / sizeof (struct reg_name))
215
216 static const struct reg_name xr_registers[] =
217 {
218   { "mcrh", 2 },
219   { "mcrl", 3 },
220   { "mcvf", 4 },
221   { "mdrq", 1 },
222   { "sp", 0 },
223   { "xr0", 0 },
224   { "xr1", 1 },
225   { "xr10", 10 },
226   { "xr11", 11 },
227   { "xr12", 12 },
228   { "xr13", 13 },
229   { "xr14", 14 },
230   { "xr15", 15 },
231   { "xr2", 2 },
232   { "xr3", 3 },
233   { "xr4", 4 },
234   { "xr5", 5 },
235   { "xr6", 6 },
236   { "xr7", 7 },
237   { "xr8", 8 },
238   { "xr9", 9 },
239 };
240
241 #define XR_REG_NAME_CNT                                 \
242   (sizeof (xr_registers) / sizeof (struct reg_name))
243
244 /* We abuse the `value' field, that would be otherwise unused, to
245    encode the architecture on which (access to) the register was
246    introduced.  FIXME: we should probably warn when we encounter a
247    register name when assembling for an architecture that doesn't
248    support it, before parsing it as a symbol name.  */
249 static const struct reg_name other_registers[] =
250 {
251   { "epsw", AM33 },
252   { "mdr", 0 },
253   { "pc", AM33 },
254   { "psw", 0 },
255   { "sp", 0 },
256 };
257
258 #define OTHER_REG_NAME_CNT                              \
259   (sizeof (other_registers) / sizeof (struct reg_name))
260
261 static const struct reg_name float_registers[] =
262 {
263   { "fs0", 0 },
264   { "fs1", 1 },
265   { "fs10", 10 },
266   { "fs11", 11 },
267   { "fs12", 12 },
268   { "fs13", 13 },
269   { "fs14", 14 },
270   { "fs15", 15 },
271   { "fs16", 16 },
272   { "fs17", 17 },
273   { "fs18", 18 },
274   { "fs19", 19 },
275   { "fs2",   2 },
276   { "fs20", 20 },
277   { "fs21", 21 },
278   { "fs22", 22 },
279   { "fs23", 23 },
280   { "fs24", 24 },
281   { "fs25", 25 },
282   { "fs26", 26 },
283   { "fs27", 27 },
284   { "fs28", 28 },
285   { "fs29", 29 },
286   { "fs3",   3 },
287   { "fs30", 30 },
288   { "fs31", 31 },
289   { "fs4",   4 },
290   { "fs5",   5 },
291   { "fs6",   6 },
292   { "fs7",   7 },
293   { "fs8",   8 },
294   { "fs9",   9 },
295 };
296
297 #define FLOAT_REG_NAME_CNT \
298   (sizeof (float_registers) / sizeof (struct reg_name))
299
300 static const struct reg_name double_registers[] =
301 {
302   { "fd0",   0 },
303   { "fd10", 10 },
304   { "fd12", 12 },
305   { "fd14", 14 },
306   { "fd16", 16 },
307   { "fd18", 18 },
308   { "fd2",   2 },
309   { "fd20", 20 },
310   { "fd22", 22 },
311   { "fd24", 24 },
312   { "fd26", 26 },
313   { "fd28", 28 },
314   { "fd30", 30 },
315   { "fd4",   4 },
316   { "fd6",   6 },
317   { "fd8",   8 },
318 };
319
320 #define DOUBLE_REG_NAME_CNT \
321   (sizeof (double_registers) / sizeof (struct reg_name))
322
323
324 /* reg_name_search does a binary search of the given register table
325    to see if "name" is a valid regiter name.  Returns the register
326    number from the array on success, or -1 on failure.  */
327
328 static int
329 reg_name_search (regs, regcount, name)
330      const struct reg_name *regs;
331      int regcount;
332      const char *name;
333 {
334   int middle, low, high;
335   int cmp;
336
337   low = 0;
338   high = regcount - 1;
339
340   do
341     {
342       middle = (low + high) / 2;
343       cmp = strcasecmp (name, regs[middle].name);
344       if (cmp < 0)
345         high = middle - 1;
346       else if (cmp > 0)
347         low = middle + 1;
348       else
349         return regs[middle].value;
350     }
351   while (low <= high);
352   return -1;
353 }
354
355 /* Summary of register_name().
356  *
357  * in: Input_line_pointer points to 1st char of operand.
358  *
359  * out: An expressionS.
360  *      The operand may have been a register: in this case, X_op == O_register,
361  *      X_add_number is set to the register number, and truth is returned.
362  *      Input_line_pointer->(next non-blank) char after operand, or is in
363  *      its original state.
364  */
365
366 static bfd_boolean
367 r_register_name (expressionP)
368      expressionS *expressionP;
369 {
370   int reg_number;
371   char *name;
372   char *start;
373   char c;
374
375   /* Find the spelling of the operand.  */
376   start = name = input_line_pointer;
377
378   c = get_symbol_end ();
379   reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
380
381   /* Put back the delimiting char.  */
382   *input_line_pointer = c;
383
384   /* Look to see if it's in the register table.  */
385   if (reg_number >= 0)
386     {
387       expressionP->X_op = O_register;
388       expressionP->X_add_number = reg_number;
389
390       /* Make the rest nice.  */
391       expressionP->X_add_symbol = NULL;
392       expressionP->X_op_symbol = NULL;
393
394       return TRUE;
395     }
396
397   /* Reset the line as if we had not done anything.  */
398   input_line_pointer = start;
399   return FALSE;
400 }
401
402 /* Summary of register_name().
403  *
404  * in: Input_line_pointer points to 1st char of operand.
405  *
406  * out: An expressionS.
407  *      The operand may have been a register: in this case, X_op == O_register,
408  *      X_add_number is set to the register number, and truth is returned.
409  *      Input_line_pointer->(next non-blank) char after operand, or is in
410  *      its original state.
411  */
412
413 static bfd_boolean
414 xr_register_name (expressionP)
415      expressionS *expressionP;
416 {
417   int reg_number;
418   char *name;
419   char *start;
420   char c;
421
422   /* Find the spelling of the operand.  */
423   start = name = input_line_pointer;
424
425   c = get_symbol_end ();
426   reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
427
428   /* Put back the delimiting char.  */
429   *input_line_pointer = c;
430
431   /* Look to see if it's in the register table.  */
432   if (reg_number >= 0)
433     {
434       expressionP->X_op = O_register;
435       expressionP->X_add_number = reg_number;
436
437       /* Make the rest nice.  */
438       expressionP->X_add_symbol = NULL;
439       expressionP->X_op_symbol = NULL;
440
441       return TRUE;
442     }
443
444   /* Reset the line as if we had not done anything.  */
445   input_line_pointer = start;
446   return FALSE;
447 }
448
449 /* Summary of register_name().
450  *
451  * in: Input_line_pointer points to 1st char of operand.
452  *
453  * out: An expressionS.
454  *      The operand may have been a register: in this case, X_op == O_register,
455  *      X_add_number is set to the register number, and truth is returned.
456  *      Input_line_pointer->(next non-blank) char after operand, or is in
457  *      its original state.
458  */
459
460 static bfd_boolean
461 data_register_name (expressionP)
462      expressionS *expressionP;
463 {
464   int reg_number;
465   char *name;
466   char *start;
467   char c;
468
469   /* Find the spelling of the operand.  */
470   start = name = input_line_pointer;
471
472   c = get_symbol_end ();
473   reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
474
475   /* Put back the delimiting char.  */
476   *input_line_pointer = c;
477
478   /* Look to see if it's in the register table.  */
479   if (reg_number >= 0)
480     {
481       expressionP->X_op = O_register;
482       expressionP->X_add_number = reg_number;
483
484       /* Make the rest nice.  */
485       expressionP->X_add_symbol = NULL;
486       expressionP->X_op_symbol = NULL;
487
488       return TRUE;
489     }
490
491   /* Reset the line as if we had not done anything.  */
492   input_line_pointer = start;
493   return FALSE;
494 }
495
496 /* Summary of register_name().
497  *
498  * in: Input_line_pointer points to 1st char of operand.
499  *
500  * out: An expressionS.
501  *      The operand may have been a register: in this case, X_op == O_register,
502  *      X_add_number is set to the register number, and truth is returned.
503  *      Input_line_pointer->(next non-blank) char after operand, or is in
504  *      its original state.
505  */
506
507 static bfd_boolean
508 address_register_name (expressionP)
509      expressionS *expressionP;
510 {
511   int reg_number;
512   char *name;
513   char *start;
514   char c;
515
516   /* Find the spelling of the operand.  */
517   start = name = input_line_pointer;
518
519   c = get_symbol_end ();
520   reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
521
522   /* Put back the delimiting char.  */
523   *input_line_pointer = c;
524
525   /* Look to see if it's in the register table.  */
526   if (reg_number >= 0)
527     {
528       expressionP->X_op = O_register;
529       expressionP->X_add_number = reg_number;
530
531       /* Make the rest nice.  */
532       expressionP->X_add_symbol = NULL;
533       expressionP->X_op_symbol = NULL;
534
535       return TRUE;
536     }
537
538   /* Reset the line as if we had not done anything.  */
539   input_line_pointer = start;
540   return FALSE;
541 }
542
543 /* Summary of register_name().
544  *
545  * in: Input_line_pointer points to 1st char of operand.
546  *
547  * out: An expressionS.
548  *      The operand may have been a register: in this case, X_op == O_register,
549  *      X_add_number is set to the register number, and truth is returned.
550  *      Input_line_pointer->(next non-blank) char after operand, or is in
551  *      its original state.
552  */
553
554 static bfd_boolean
555 other_register_name (expressionP)
556      expressionS *expressionP;
557 {
558   int reg_number;
559   char *name;
560   char *start;
561   char c;
562
563   /* Find the spelling of the operand.  */
564   start = name = input_line_pointer;
565
566   c = get_symbol_end ();
567   reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
568
569   /* Put back the delimiting char.  */
570   *input_line_pointer = c;
571
572   /* Look to see if it's in the register table.  */
573   if (reg_number == 0
574       || (reg_number == AM33 && HAVE_AM33))
575     {
576       expressionP->X_op = O_register;
577       expressionP->X_add_number = 0;
578
579       /* Make the rest nice.  */
580       expressionP->X_add_symbol = NULL;
581       expressionP->X_op_symbol = NULL;
582
583       return TRUE;
584     }
585
586   /* Reset the line as if we had not done anything.  */
587   input_line_pointer = start;
588   return FALSE;
589 }
590
591 static bfd_boolean double_register_name PARAMS ((expressionS *));
592 static bfd_boolean float_register_name  PARAMS ((expressionS *));
593
594 /* Summary of float_register_name:
595
596    in: Input_line_pointer points to 1st char of operand.
597
598    out: A expressionS.
599         The operand may have been a register: in this case, X_op == O_register,
600         X_add_number is set to the register number, and truth is returned.
601         Input_line_pointer->(next non-blank) char after operand, or is in
602         its original state.  */
603
604 static bfd_boolean
605 float_register_name (expressionP)
606      expressionS *expressionP;
607 {
608   int reg_number;
609   char *name;
610   char *start;
611   char c;
612
613   /* Find the spelling of the operand.  */
614   start = name = input_line_pointer;
615
616   c = get_symbol_end ();
617   reg_number = reg_name_search (float_registers, FLOAT_REG_NAME_CNT, name);
618
619   /* Put back the delimiting char.  */
620   * input_line_pointer = c;
621
622   /* Look to see if it's in the register table.  */
623   if (reg_number >= 0)
624     {
625       expressionP->X_op = O_register;
626       expressionP->X_add_number = reg_number;
627
628       /* Make the rest nice.  */
629       expressionP->X_add_symbol = NULL;
630       expressionP->X_op_symbol = NULL;
631
632       return TRUE;
633     }
634
635   /* Reset the line as if we had not done anything.  */
636   input_line_pointer = start;
637   return FALSE;
638 }
639
640 /* Summary of double_register_name:
641
642    in: Input_line_pointer points to 1st char of operand.
643
644    out: A expressionS.
645         The operand may have been a register: in this case, X_op == O_register,
646         X_add_number is set to the register number, and truth is returned.
647         Input_line_pointer->(next non-blank) char after operand, or is in
648         its original state.  */
649
650 static bfd_boolean
651 double_register_name (expressionP)
652      expressionS *expressionP;
653 {
654   int reg_number;
655   char *name;
656   char *start;
657   char c;
658
659   /* Find the spelling of the operand.  */
660   start = name = input_line_pointer;
661
662   c = get_symbol_end ();
663   reg_number = reg_name_search (double_registers, DOUBLE_REG_NAME_CNT, name);
664
665   /* Put back the delimiting char.  */
666   * input_line_pointer = c;
667
668   /* Look to see if it's in the register table.  */
669   if (reg_number >= 0)
670     {
671       expressionP->X_op = O_register;
672       expressionP->X_add_number = reg_number;
673
674       /* Make the rest nice.  */
675       expressionP->X_add_symbol = NULL;
676       expressionP->X_op_symbol = NULL;
677
678       return TRUE;
679     }
680
681   /* Reset the line as if we had not done anything.  */
682   input_line_pointer = start;
683   return FALSE;
684 }
685
686 void
687 md_show_usage (stream)
688      FILE *stream;
689 {
690   fprintf (stream, _("MN10300 options:\n\
691 none yet\n"));
692 }
693
694 int
695 md_parse_option (c, arg)
696      int c ATTRIBUTE_UNUSED;
697      char *arg ATTRIBUTE_UNUSED;
698 {
699   return 0;
700 }
701
702 symbolS *
703 md_undefined_symbol (name)
704      char *name ATTRIBUTE_UNUSED;
705 {
706   return 0;
707 }
708
709 char *
710 md_atof (type, litp, sizep)
711      int type;
712      char *litp;
713      int *sizep;
714 {
715   int prec;
716   LITTLENUM_TYPE words[4];
717   char *t;
718   int i;
719
720   switch (type)
721     {
722     case 'f':
723       prec = 2;
724       break;
725
726     case 'd':
727       prec = 4;
728       break;
729
730     default:
731       *sizep = 0;
732       return "bad call to md_atof";
733     }
734
735   t = atof_ieee (input_line_pointer, type, words);
736   if (t)
737     input_line_pointer = t;
738
739   *sizep = prec * 2;
740
741   for (i = prec - 1; i >= 0; i--)
742     {
743       md_number_to_chars (litp, (valueT) words[i], 2);
744       litp += 2;
745     }
746
747   return NULL;
748 }
749
750 void
751 md_convert_frag (abfd, sec, fragP)
752      bfd *abfd ATTRIBUTE_UNUSED;
753      asection *sec;
754      fragS *fragP;
755 {
756   static unsigned long label_count = 0;
757   char buf[40];
758
759   subseg_change (sec, 0);
760   if (fragP->fr_subtype == 0)
761     {
762       fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
763                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
764       fragP->fr_var = 0;
765       fragP->fr_fix += 2;
766     }
767   else if (fragP->fr_subtype == 1)
768     {
769       /* Reverse the condition of the first branch.  */
770       int offset = fragP->fr_fix;
771       int opcode = fragP->fr_literal[offset] & 0xff;
772
773       switch (opcode)
774         {
775         case 0xc8:
776           opcode = 0xc9;
777           break;
778         case 0xc9:
779           opcode = 0xc8;
780           break;
781         case 0xc0:
782           opcode = 0xc2;
783           break;
784         case 0xc2:
785           opcode = 0xc0;
786           break;
787         case 0xc3:
788           opcode = 0xc1;
789           break;
790         case 0xc1:
791           opcode = 0xc3;
792           break;
793         case 0xc4:
794           opcode = 0xc6;
795           break;
796         case 0xc6:
797           opcode = 0xc4;
798           break;
799         case 0xc7:
800           opcode = 0xc5;
801           break;
802         case 0xc5:
803           opcode = 0xc7;
804           break;
805         default:
806           abort ();
807         }
808       fragP->fr_literal[offset] = opcode;
809
810       /* Create a fixup for the reversed conditional branch.  */
811       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
812       fix_new (fragP, fragP->fr_fix + 1, 1,
813                symbol_new (buf, sec, 0, fragP->fr_next),
814                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
815
816       /* Now create the unconditional branch + fixup to the
817          final target.  */
818       fragP->fr_literal[offset + 2] = 0xcc;
819       fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol,
820                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
821       fragP->fr_var = 0;
822       fragP->fr_fix += 5;
823     }
824   else if (fragP->fr_subtype == 2)
825     {
826       /* Reverse the condition of the first branch.  */
827       int offset = fragP->fr_fix;
828       int opcode = fragP->fr_literal[offset] & 0xff;
829
830       switch (opcode)
831         {
832         case 0xc8:
833           opcode = 0xc9;
834           break;
835         case 0xc9:
836           opcode = 0xc8;
837           break;
838         case 0xc0:
839           opcode = 0xc2;
840           break;
841         case 0xc2:
842           opcode = 0xc0;
843           break;
844         case 0xc3:
845           opcode = 0xc1;
846           break;
847         case 0xc1:
848           opcode = 0xc3;
849           break;
850         case 0xc4:
851           opcode = 0xc6;
852           break;
853         case 0xc6:
854           opcode = 0xc4;
855           break;
856         case 0xc7:
857           opcode = 0xc5;
858           break;
859         case 0xc5:
860           opcode = 0xc7;
861           break;
862         default:
863           abort ();
864         }
865       fragP->fr_literal[offset] = opcode;
866
867       /* Create a fixup for the reversed conditional branch.  */
868       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
869       fix_new (fragP, fragP->fr_fix + 1, 1,
870                symbol_new (buf, sec, 0, fragP->fr_next),
871                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
872
873       /* Now create the unconditional branch + fixup to the
874          final target.  */
875       fragP->fr_literal[offset + 2] = 0xdc;
876       fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
877                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
878       fragP->fr_var = 0;
879       fragP->fr_fix += 7;
880     }
881   else if (fragP->fr_subtype == 3)
882     {
883       fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
884                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
885       fragP->fr_var = 0;
886       fragP->fr_fix += 3;
887     }
888   else if (fragP->fr_subtype == 4)
889     {
890       /* Reverse the condition of the first branch.  */
891       int offset = fragP->fr_fix;
892       int opcode = fragP->fr_literal[offset + 1] & 0xff;
893
894       switch (opcode)
895         {
896         case 0xe8:
897           opcode = 0xe9;
898           break;
899         case 0xe9:
900           opcode = 0xe8;
901           break;
902         case 0xea:
903           opcode = 0xeb;
904           break;
905         case 0xeb:
906           opcode = 0xea;
907           break;
908         default:
909           abort ();
910         }
911       fragP->fr_literal[offset + 1] = opcode;
912
913       /* Create a fixup for the reversed conditional branch.  */
914       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
915       fix_new (fragP, fragP->fr_fix + 2, 1,
916                symbol_new (buf, sec, 0, fragP->fr_next),
917                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
918
919       /* Now create the unconditional branch + fixup to the
920          final target.  */
921       fragP->fr_literal[offset + 3] = 0xcc;
922       fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
923                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
924       fragP->fr_var = 0;
925       fragP->fr_fix += 6;
926     }
927   else if (fragP->fr_subtype == 5)
928     {
929       /* Reverse the condition of the first branch.  */
930       int offset = fragP->fr_fix;
931       int opcode = fragP->fr_literal[offset + 1] & 0xff;
932
933       switch (opcode)
934         {
935         case 0xe8:
936           opcode = 0xe9;
937           break;
938         case 0xea:
939           opcode = 0xeb;
940           break;
941         case 0xeb:
942           opcode = 0xea;
943           break;
944         default:
945           abort ();
946         }
947       fragP->fr_literal[offset + 1] = opcode;
948
949       /* Create a fixup for the reversed conditional branch.  */
950       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
951       fix_new (fragP, fragP->fr_fix + 2, 1,
952                symbol_new (buf, sec, 0, fragP->fr_next),
953                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
954
955       /* Now create the unconditional branch + fixup to the
956          final target.  */
957       fragP->fr_literal[offset + 3] = 0xdc;
958       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
959                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
960       fragP->fr_var = 0;
961       fragP->fr_fix += 8;
962     }
963   else if (fragP->fr_subtype == 6)
964     {
965       int offset = fragP->fr_fix;
966       fragP->fr_literal[offset] = 0xcd;
967       fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
968                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
969       fragP->fr_var = 0;
970       fragP->fr_fix += 5;
971     }
972   else if (fragP->fr_subtype == 7)
973     {
974       int offset = fragP->fr_fix;
975       fragP->fr_literal[offset] = 0xdd;
976       fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3];
977       fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4];
978
979       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
980                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
981       fragP->fr_var = 0;
982       fragP->fr_fix += 7;
983     }
984   else if (fragP->fr_subtype == 8)
985     {
986       int offset = fragP->fr_fix;
987       fragP->fr_literal[offset] = 0xfa;
988       fragP->fr_literal[offset + 1] = 0xff;
989       fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
990                fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL);
991       fragP->fr_var = 0;
992       fragP->fr_fix += 4;
993     }
994   else if (fragP->fr_subtype == 9)
995     {
996       int offset = fragP->fr_fix;
997       fragP->fr_literal[offset] = 0xfc;
998       fragP->fr_literal[offset + 1] = 0xff;
999
1000       fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1001                fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL);
1002       fragP->fr_var = 0;
1003       fragP->fr_fix += 6;
1004     }
1005   else if (fragP->fr_subtype == 10)
1006     {
1007       fragP->fr_literal[fragP->fr_fix] = 0xca;
1008       fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
1009                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
1010       fragP->fr_var = 0;
1011       fragP->fr_fix += 2;
1012     }
1013   else if (fragP->fr_subtype == 11)
1014     {
1015       int offset = fragP->fr_fix;
1016       fragP->fr_literal[offset] = 0xcc;
1017
1018       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
1019                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
1020       fragP->fr_var = 0;
1021       fragP->fr_fix += 3;
1022     }
1023   else if (fragP->fr_subtype == 12)
1024     {
1025       int offset = fragP->fr_fix;
1026       fragP->fr_literal[offset] = 0xdc;
1027
1028       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
1029                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
1030       fragP->fr_var = 0;
1031       fragP->fr_fix += 5;
1032     }
1033   else if (fragP->fr_subtype == 13)
1034     {
1035       fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
1036                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1037       fragP->fr_var = 0;
1038       fragP->fr_fix += 3;
1039     }
1040   else if (fragP->fr_subtype == 14)
1041     {
1042       /* Reverse the condition of the first branch.  */
1043       int offset = fragP->fr_fix;
1044       int opcode = fragP->fr_literal[offset + 1] & 0xff;
1045
1046       switch (opcode)
1047         {
1048         case 0xd0:
1049           opcode = 0xd1;
1050           break;
1051         case 0xd1:
1052           opcode = 0xd0;
1053           break;
1054         case 0xd2:
1055           opcode = 0xdc;
1056           break;
1057         case 0xd3:
1058           opcode = 0xdb;
1059           break;
1060         case 0xd4:
1061           opcode = 0xda;
1062           break;
1063         case 0xd5:
1064           opcode = 0xd9;
1065           break;
1066         case 0xd6:
1067           opcode = 0xd8;
1068           break;
1069         case 0xd7:
1070           opcode = 0xdd;
1071           break;
1072         case 0xd8:
1073           opcode = 0xd6;
1074           break;
1075         case 0xd9:
1076           opcode = 0xd5;
1077           break;
1078         case 0xda:
1079           opcode = 0xd4;
1080           break;
1081         case 0xdb:
1082           opcode = 0xd3;
1083           break;
1084         case 0xdc:
1085           opcode = 0xd2;
1086           break;
1087         case 0xdd:
1088           opcode = 0xd7;
1089           break;
1090         default:
1091           abort ();
1092         }
1093       fragP->fr_literal[offset + 1] = opcode;
1094
1095       /* Create a fixup for the reversed conditional branch.  */
1096       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
1097       fix_new (fragP, fragP->fr_fix + 2, 1,
1098                symbol_new (buf, sec, 0, fragP->fr_next),
1099                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1100
1101       /* Now create the unconditional branch + fixup to the
1102          final target.  */
1103       fragP->fr_literal[offset + 3] = 0xcc;
1104       fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
1105                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
1106       fragP->fr_var = 0;
1107       fragP->fr_fix += 6;
1108     }
1109   else if (fragP->fr_subtype == 15)
1110     {
1111       /* Reverse the condition of the first branch.  */
1112       int offset = fragP->fr_fix;
1113       int opcode = fragP->fr_literal[offset + 1] & 0xff;
1114
1115       switch (opcode)
1116         {
1117         case 0xd0:
1118           opcode = 0xd1;
1119           break;
1120         case 0xd1:
1121           opcode = 0xd0;
1122           break;
1123         case 0xd2:
1124           opcode = 0xdc;
1125           break;
1126         case 0xd3:
1127           opcode = 0xdb;
1128           break;
1129         case 0xd4:
1130           opcode = 0xda;
1131           break;
1132         case 0xd5:
1133           opcode = 0xd9;
1134           break;
1135         case 0xd6:
1136           opcode = 0xd8;
1137           break;
1138         case 0xd7:
1139           opcode = 0xdd;
1140           break;
1141         case 0xd8:
1142           opcode = 0xd6;
1143           break;
1144         case 0xd9:
1145           opcode = 0xd5;
1146           break;
1147         case 0xda:
1148           opcode = 0xd4;
1149           break;
1150         case 0xdb:
1151           opcode = 0xd3;
1152           break;
1153         case 0xdc:
1154           opcode = 0xd2;
1155           break;
1156         case 0xdd:
1157           opcode = 0xd7;
1158           break;
1159         default:
1160           abort ();
1161         }
1162       fragP->fr_literal[offset + 1] = opcode;
1163
1164       /* Create a fixup for the reversed conditional branch.  */
1165       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
1166       fix_new (fragP, fragP->fr_fix + 2, 1,
1167                symbol_new (buf, sec, 0, fragP->fr_next),
1168                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1169
1170       /* Now create the unconditional branch + fixup to the
1171          final target.  */
1172       fragP->fr_literal[offset + 3] = 0xdc;
1173       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1174                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
1175       fragP->fr_var = 0;
1176       fragP->fr_fix += 8;
1177     }
1178   else
1179     abort ();
1180 }
1181
1182 valueT
1183 md_section_align (seg, addr)
1184      asection *seg;
1185      valueT addr;
1186 {
1187   int align = bfd_get_section_alignment (stdoutput, seg);
1188   return ((addr + (1 << align) - 1) & (-1 << align));
1189 }
1190
1191 void
1192 md_begin ()
1193 {
1194   char *prev_name = "";
1195   register const struct mn10300_opcode *op;
1196
1197   mn10300_hash = hash_new ();
1198
1199   /* Insert unique names into hash table.  The MN10300 instruction set
1200      has many identical opcode names that have different opcodes based
1201      on the operands.  This hash table then provides a quick index to
1202      the first opcode with a particular name in the opcode table.  */
1203
1204   op = mn10300_opcodes;
1205   while (op->name)
1206     {
1207       if (strcmp (prev_name, op->name))
1208         {
1209           prev_name = (char *) op->name;
1210           hash_insert (mn10300_hash, op->name, (char *) op);
1211         }
1212       op++;
1213     }
1214
1215   /* Set the default machine type.  */
1216 #ifdef TE_LINUX
1217   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, AM33_2))
1218     as_warn (_("could not set architecture and machine"));
1219
1220   current_machine = AM33_2;
1221 #else  
1222   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
1223     as_warn (_("could not set architecture and machine"));
1224
1225   current_machine = MN103;
1226 #endif
1227 }
1228
1229 static symbolS *GOT_symbol;
1230
1231 static inline int mn10300_check_fixup PARAMS ((struct mn10300_fixup *));
1232 static inline int mn10300_PIC_related_p PARAMS ((symbolS *));
1233
1234 static inline int
1235 mn10300_PIC_related_p (sym)
1236      symbolS *sym;
1237 {
1238   expressionS *exp;
1239
1240   if (! sym)
1241     return 0;
1242
1243   if (sym == GOT_symbol)
1244     return 1;
1245
1246   exp = symbol_get_value_expression (sym);
1247
1248   return (exp->X_op == O_PIC_reloc
1249           || mn10300_PIC_related_p (exp->X_add_symbol)
1250           || mn10300_PIC_related_p (exp->X_op_symbol));
1251 }
1252
1253 static inline int
1254 mn10300_check_fixup (fixup)
1255      struct mn10300_fixup *fixup;
1256 {
1257   expressionS *exp = &fixup->exp;
1258
1259  repeat:
1260   switch (exp->X_op)
1261     {
1262     case O_add:
1263     case O_subtract: /* If we're sufficiently unlucky that the label
1264                         and the expression that references it happen
1265                         to end up in different frags, the subtract
1266                         won't be simplified within expression().  */
1267       /* The PIC-related operand must be the first operand of a sum.  */
1268       if (exp != &fixup->exp || mn10300_PIC_related_p (exp->X_op_symbol))
1269         return 1;
1270
1271       if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
1272         fixup->reloc = BFD_RELOC_32_GOT_PCREL;
1273
1274       exp = symbol_get_value_expression (exp->X_add_symbol);
1275       goto repeat;
1276
1277     case O_symbol:
1278       if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
1279         fixup->reloc = BFD_RELOC_32_GOT_PCREL;
1280       break;
1281
1282     case O_PIC_reloc:
1283       fixup->reloc = exp->X_md;
1284       exp->X_op = O_symbol;
1285       if (fixup->reloc == BFD_RELOC_32_PLT_PCREL
1286           && fixup->opindex >= 0
1287           && (mn10300_operands[fixup->opindex].flags
1288               & MN10300_OPERAND_RELAX))
1289         return 1;
1290       break;
1291
1292     default:
1293       return (mn10300_PIC_related_p (exp->X_add_symbol)
1294               || mn10300_PIC_related_p (exp->X_op_symbol));
1295     }
1296
1297   return 0;
1298 }
1299
1300 void
1301 mn10300_cons_fix_new (frag, off, size, exp)
1302      fragS *frag;
1303      int off, size;
1304      expressionS *exp;
1305 {
1306   struct mn10300_fixup fixup;
1307
1308   fixup.opindex = -1;
1309   fixup.exp = *exp;
1310   fixup.reloc = BFD_RELOC_UNUSED;
1311
1312   mn10300_check_fixup (&fixup);
1313
1314   if (fixup.reloc == BFD_RELOC_MN10300_GOT32)
1315     switch (size)
1316       {
1317       case 2:
1318         fixup.reloc = BFD_RELOC_MN10300_GOT16;
1319         break;
1320
1321       case 3:
1322         fixup.reloc = BFD_RELOC_MN10300_GOT24;
1323         break;
1324
1325       case 4:
1326         break;
1327
1328       default:
1329         goto error;
1330       }
1331   else if (fixup.reloc == BFD_RELOC_UNUSED)
1332     switch (size)
1333       {
1334       case 1:
1335         fixup.reloc = BFD_RELOC_8;
1336         break;
1337
1338       case 2:
1339         fixup.reloc = BFD_RELOC_16;
1340         break;
1341
1342       case 3:
1343         fixup.reloc = BFD_RELOC_24;
1344         break;
1345
1346       case 4:
1347         fixup.reloc = BFD_RELOC_32;
1348         break;
1349
1350       default:
1351         goto error;
1352       }
1353   else if (size != 4)
1354     {
1355     error:
1356       as_bad (_("unsupported BFD relocation size %u"), size);
1357       fixup.reloc = BFD_RELOC_UNUSED;
1358     }
1359     
1360   fix_new_exp (frag, off, size, &fixup.exp, 0, fixup.reloc);
1361 }
1362
1363 void
1364 md_assemble (str)
1365      char *str;
1366 {
1367   char *s;
1368   struct mn10300_opcode *opcode;
1369   struct mn10300_opcode *next_opcode;
1370   const unsigned char *opindex_ptr;
1371   int next_opindex, relaxable;
1372   unsigned long insn, extension, size = 0;
1373   char *f;
1374   int i;
1375   int match;
1376
1377   /* Get the opcode.  */
1378   for (s = str; *s != '\0' && !ISSPACE (*s); s++)
1379     ;
1380   if (*s != '\0')
1381     *s++ = '\0';
1382
1383   /* Find the first opcode with the proper name.  */
1384   opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
1385   if (opcode == NULL)
1386     {
1387       as_bad (_("Unrecognized opcode: `%s'"), str);
1388       return;
1389     }
1390
1391   str = s;
1392   while (ISSPACE (*str))
1393     ++str;
1394
1395   input_line_pointer = str;
1396
1397   for (;;)
1398     {
1399       const char *errmsg;
1400       int op_idx;
1401       char *hold;
1402       int extra_shift = 0;
1403
1404       errmsg = _("Invalid opcode/operands");
1405
1406       /* Reset the array of register operands.  */
1407       memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
1408
1409       relaxable = 0;
1410       fc = 0;
1411       match = 0;
1412       next_opindex = 0;
1413       insn = opcode->opcode;
1414       extension = 0;
1415
1416       /* If the instruction is not available on the current machine
1417          then it can not possibly match.  */
1418       if (opcode->machine
1419           && !(opcode->machine == AM33_2 && HAVE_AM33_2)
1420           && !(opcode->machine == AM33 && HAVE_AM33)
1421           && !(opcode->machine == AM30 && HAVE_AM30))
1422         goto error;
1423
1424       for (op_idx = 1, opindex_ptr = opcode->operands;
1425            *opindex_ptr != 0;
1426            opindex_ptr++, op_idx++)
1427         {
1428           const struct mn10300_operand *operand;
1429           expressionS ex;
1430
1431           if (next_opindex == 0)
1432             {
1433               operand = &mn10300_operands[*opindex_ptr];
1434             }
1435           else
1436             {
1437               operand = &mn10300_operands[next_opindex];
1438               next_opindex = 0;
1439             }
1440
1441           while (*str == ' ' || *str == ',')
1442             ++str;
1443
1444           if (operand->flags & MN10300_OPERAND_RELAX)
1445             relaxable = 1;
1446
1447           /* Gather the operand.  */
1448           hold = input_line_pointer;
1449           input_line_pointer = str;
1450
1451           if (operand->flags & MN10300_OPERAND_PAREN)
1452             {
1453               if (*input_line_pointer != ')' && *input_line_pointer != '(')
1454                 {
1455                   input_line_pointer = hold;
1456                   str = hold;
1457                   goto error;
1458                 }
1459               input_line_pointer++;
1460               goto keep_going;
1461             }
1462           /* See if we can match the operands.  */
1463           else if (operand->flags & MN10300_OPERAND_DREG)
1464             {
1465               if (!data_register_name (&ex))
1466                 {
1467                   input_line_pointer = hold;
1468                   str = hold;
1469                   goto error;
1470                 }
1471             }
1472           else if (operand->flags & MN10300_OPERAND_AREG)
1473             {
1474               if (!address_register_name (&ex))
1475                 {
1476                   input_line_pointer = hold;
1477                   str = hold;
1478                   goto error;
1479                 }
1480             }
1481           else if (operand->flags & MN10300_OPERAND_SP)
1482             {
1483               char *start = input_line_pointer;
1484               char c = get_symbol_end ();
1485
1486               if (strcasecmp (start, "sp") != 0)
1487                 {
1488                   *input_line_pointer = c;
1489                   input_line_pointer = hold;
1490                   str = hold;
1491                   goto error;
1492                 }
1493               *input_line_pointer = c;
1494               goto keep_going;
1495             }
1496           else if (operand->flags & MN10300_OPERAND_RREG)
1497             {
1498               if (!r_register_name (&ex))
1499                 {
1500                   input_line_pointer = hold;
1501                   str = hold;
1502                   goto error;
1503                 }
1504             }
1505           else if (operand->flags & MN10300_OPERAND_XRREG)
1506             {
1507               if (!xr_register_name (&ex))
1508                 {
1509                   input_line_pointer = hold;
1510                   str = hold;
1511                   goto error;
1512                 }
1513             }
1514           else if (operand->flags & MN10300_OPERAND_FSREG)
1515             {
1516               if (!float_register_name (&ex))
1517                 {
1518                   input_line_pointer = hold;
1519                   str = hold;
1520                   goto error;
1521                 }
1522             }
1523           else if (operand->flags & MN10300_OPERAND_FDREG)
1524             {
1525               if (!double_register_name (&ex))
1526                 {
1527                   input_line_pointer = hold;
1528                   str = hold;
1529                   goto error;
1530                 }
1531             }
1532           else if (operand->flags & MN10300_OPERAND_FPCR)
1533             {
1534               char *start = input_line_pointer;
1535               char c = get_symbol_end ();
1536
1537               if (strcasecmp (start, "fpcr") != 0)
1538                 {
1539                   *input_line_pointer = c;
1540                   input_line_pointer = hold;
1541                   str = hold;
1542                   goto error;
1543                 }
1544               *input_line_pointer = c;
1545               goto keep_going;
1546             }
1547           else if (operand->flags & MN10300_OPERAND_USP)
1548             {
1549               char *start = input_line_pointer;
1550               char c = get_symbol_end ();
1551
1552               if (strcasecmp (start, "usp") != 0)
1553                 {
1554                   *input_line_pointer = c;
1555                   input_line_pointer = hold;
1556                   str = hold;
1557                   goto error;
1558                 }
1559               *input_line_pointer = c;
1560               goto keep_going;
1561             }
1562           else if (operand->flags & MN10300_OPERAND_SSP)
1563             {
1564               char *start = input_line_pointer;
1565               char c = get_symbol_end ();
1566
1567               if (strcasecmp (start, "ssp") != 0)
1568                 {
1569                   *input_line_pointer = c;
1570                   input_line_pointer = hold;
1571                   str = hold;
1572                   goto error;
1573                 }
1574               *input_line_pointer = c;
1575               goto keep_going;
1576             }
1577           else if (operand->flags & MN10300_OPERAND_MSP)
1578             {
1579               char *start = input_line_pointer;
1580               char c = get_symbol_end ();
1581
1582               if (strcasecmp (start, "msp") != 0)
1583                 {
1584                   *input_line_pointer = c;
1585                   input_line_pointer = hold;
1586                   str = hold;
1587                   goto error;
1588                 }
1589               *input_line_pointer = c;
1590               goto keep_going;
1591             }
1592           else if (operand->flags & MN10300_OPERAND_PC)
1593             {
1594               char *start = input_line_pointer;
1595               char c = get_symbol_end ();
1596
1597               if (strcasecmp (start, "pc") != 0)
1598                 {
1599                   *input_line_pointer = c;
1600                   input_line_pointer = hold;
1601                   str = hold;
1602                   goto error;
1603                 }
1604               *input_line_pointer = c;
1605               goto keep_going;
1606             }
1607           else if (operand->flags & MN10300_OPERAND_EPSW)
1608             {
1609               char *start = input_line_pointer;
1610               char c = get_symbol_end ();
1611
1612               if (strcasecmp (start, "epsw") != 0)
1613                 {
1614                   *input_line_pointer = c;
1615                   input_line_pointer = hold;
1616                   str = hold;
1617                   goto error;
1618                 }
1619               *input_line_pointer = c;
1620               goto keep_going;
1621             }
1622           else if (operand->flags & MN10300_OPERAND_PLUS)
1623             {
1624               if (*input_line_pointer != '+')
1625                 {
1626                   input_line_pointer = hold;
1627                   str = hold;
1628                   goto error;
1629                 }
1630               input_line_pointer++;
1631               goto keep_going;
1632             }
1633           else if (operand->flags & MN10300_OPERAND_PSW)
1634             {
1635               char *start = input_line_pointer;
1636               char c = get_symbol_end ();
1637
1638               if (strcasecmp (start, "psw") != 0)
1639                 {
1640                   *input_line_pointer = c;
1641                   input_line_pointer = hold;
1642                   str = hold;
1643                   goto error;
1644                 }
1645               *input_line_pointer = c;
1646               goto keep_going;
1647             }
1648           else if (operand->flags & MN10300_OPERAND_MDR)
1649             {
1650               char *start = input_line_pointer;
1651               char c = get_symbol_end ();
1652
1653               if (strcasecmp (start, "mdr") != 0)
1654                 {
1655                   *input_line_pointer = c;
1656                   input_line_pointer = hold;
1657                   str = hold;
1658                   goto error;
1659                 }
1660               *input_line_pointer = c;
1661               goto keep_going;
1662             }
1663           else if (operand->flags & MN10300_OPERAND_REG_LIST)
1664             {
1665               unsigned int value = 0;
1666               if (*input_line_pointer != '[')
1667                 {
1668                   input_line_pointer = hold;
1669                   str = hold;
1670                   goto error;
1671                 }
1672
1673               /* Eat the '['.  */
1674               input_line_pointer++;
1675
1676               /* We used to reject a null register list here; however,
1677                  we accept it now so the compiler can emit "call"
1678                  instructions for all calls to named functions.
1679
1680                  The linker can then fill in the appropriate bits for the
1681                  register list and stack size or change the instruction
1682                  into a "calls" if using "call" is not profitable.  */
1683               while (*input_line_pointer != ']')
1684                 {
1685                   char *start;
1686                   char c;
1687
1688                   if (*input_line_pointer == ',')
1689                     input_line_pointer++;
1690
1691                   start = input_line_pointer;
1692                   c = get_symbol_end ();
1693
1694                   if (strcasecmp (start, "d2") == 0)
1695                     {
1696                       value |= 0x80;
1697                       *input_line_pointer = c;
1698                     }
1699                   else if (strcasecmp (start, "d3") == 0)
1700                     {
1701                       value |= 0x40;
1702                       *input_line_pointer = c;
1703                     }
1704                   else if (strcasecmp (start, "a2") == 0)
1705                     {
1706                       value |= 0x20;
1707                       *input_line_pointer = c;
1708                     }
1709                   else if (strcasecmp (start, "a3") == 0)
1710                     {
1711                       value |= 0x10;
1712                       *input_line_pointer = c;
1713                     }
1714                   else if (strcasecmp (start, "other") == 0)
1715                     {
1716                       value |= 0x08;
1717                       *input_line_pointer = c;
1718                     }
1719                   else if (HAVE_AM33
1720                            && strcasecmp (start, "exreg0") == 0)
1721                     {
1722                       value |= 0x04;
1723                       *input_line_pointer = c;
1724                     }
1725                   else if (HAVE_AM33
1726                            && strcasecmp (start, "exreg1") == 0)
1727                     {
1728                       value |= 0x02;
1729                       *input_line_pointer = c;
1730                     }
1731                   else if (HAVE_AM33
1732                            && strcasecmp (start, "exother") == 0)
1733                     {
1734                       value |= 0x01;
1735                       *input_line_pointer = c;
1736                     }
1737                   else if (HAVE_AM33
1738                            && strcasecmp (start, "all") == 0)
1739                     {
1740                       value |= 0xff;
1741                       *input_line_pointer = c;
1742                     }
1743                   else
1744                     {
1745                       input_line_pointer = hold;
1746                       str = hold;
1747                       goto error;
1748                     }
1749                 }
1750               input_line_pointer++;
1751               mn10300_insert_operand (&insn, &extension, operand,
1752                                       value, (char *) NULL, 0, 0);
1753               goto keep_going;
1754
1755             }
1756           else if (data_register_name (&ex))
1757             {
1758               input_line_pointer = hold;
1759               str = hold;
1760               goto error;
1761             }
1762           else if (address_register_name (&ex))
1763             {
1764               input_line_pointer = hold;
1765               str = hold;
1766               goto error;
1767             }
1768           else if (other_register_name (&ex))
1769             {
1770               input_line_pointer = hold;
1771               str = hold;
1772               goto error;
1773             }
1774           else if (HAVE_AM33 && r_register_name (&ex))
1775             {
1776               input_line_pointer = hold;
1777               str = hold;
1778               goto error;
1779             }
1780           else if (HAVE_AM33 && xr_register_name (&ex))
1781             {
1782               input_line_pointer = hold;
1783               str = hold;
1784               goto error;
1785             }
1786           else if (HAVE_AM33_2 && float_register_name (&ex))
1787             {
1788               input_line_pointer = hold;
1789               str = hold;
1790               goto error;
1791             }
1792           else if (HAVE_AM33_2 && double_register_name (&ex))
1793             {
1794               input_line_pointer = hold;
1795               str = hold;
1796               goto error;
1797             }
1798           else if (*str == ')' || *str == '(')
1799             {
1800               input_line_pointer = hold;
1801               str = hold;
1802               goto error;
1803             }
1804           else
1805             {
1806               expression (&ex);
1807             }
1808
1809           switch (ex.X_op)
1810             {
1811             case O_illegal:
1812               errmsg = _("illegal operand");
1813               goto error;
1814             case O_absent:
1815               errmsg = _("missing operand");
1816               goto error;
1817             case O_register:
1818               {
1819                 int mask;
1820
1821                 mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
1822                 if (HAVE_AM33)
1823                   mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
1824                 if (HAVE_AM33_2)
1825                   mask |= MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG;
1826                 if ((operand->flags & mask) == 0)
1827                   {
1828                     input_line_pointer = hold;
1829                     str = hold;
1830                     goto error;
1831                   }
1832
1833                 if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
1834                   extra_shift = 8;
1835                 else if (opcode->format == FMT_D2
1836                          || opcode->format == FMT_D4
1837                          || opcode->format == FMT_S2
1838                          || opcode->format == FMT_S4
1839                          || opcode->format == FMT_S6
1840                          || opcode->format == FMT_D5)
1841                   extra_shift = 16;
1842                 else if (opcode->format == FMT_D7)
1843                   extra_shift = 8;
1844                 else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
1845                   extra_shift = 8;
1846                 else
1847                   extra_shift = 0;
1848
1849                 mn10300_insert_operand (&insn, &extension, operand,
1850                                         ex.X_add_number, (char *) NULL,
1851                                         0, extra_shift);
1852
1853                 /* And note the register number in the register array.  */
1854                 mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
1855                 break;
1856               }
1857
1858             case O_constant:
1859               /* If this operand can be promoted, and it doesn't
1860                  fit into the allocated bitfield for this insn,
1861                  then promote it (ie this opcode does not match).  */
1862               if (operand->flags
1863                   & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
1864                   && !check_operand (insn, operand, ex.X_add_number))
1865                 {
1866                   input_line_pointer = hold;
1867                   str = hold;
1868                   goto error;
1869                 }
1870
1871               mn10300_insert_operand (&insn, &extension, operand,
1872                                       ex.X_add_number, (char *) NULL,
1873                                       0, 0);
1874               break;
1875
1876             default:
1877               /* If this operand can be promoted, then this opcode didn't
1878                  match since we can't know if it needed promotion!  */
1879               if (operand->flags & MN10300_OPERAND_PROMOTE)
1880                 {
1881                   input_line_pointer = hold;
1882                   str = hold;
1883                   goto error;
1884                 }
1885
1886               /* We need to generate a fixup for this expression.  */
1887               if (fc >= MAX_INSN_FIXUPS)
1888                 as_fatal (_("too many fixups"));
1889               fixups[fc].exp = ex;
1890               fixups[fc].opindex = *opindex_ptr;
1891               fixups[fc].reloc = BFD_RELOC_UNUSED;
1892               if (mn10300_check_fixup (& fixups[fc]))
1893                 goto error;
1894               ++fc;
1895               break;
1896             }
1897
1898 keep_going:
1899           str = input_line_pointer;
1900           input_line_pointer = hold;
1901
1902           while (*str == ' ' || *str == ',')
1903             ++str;
1904
1905         }
1906
1907       /* Make sure we used all the operands!  */
1908       if (*str != ',')
1909         match = 1;
1910
1911       /* If this instruction has registers that must not match, verify
1912          that they do indeed not match.  */
1913       if (opcode->no_match_operands)
1914         {
1915           int i;
1916
1917           /* Look at each operand to see if it's marked.  */
1918           for (i = 0; i < MN10300_MAX_OPERANDS; i++)
1919             {
1920               if ((1 << i) & opcode->no_match_operands)
1921                 {
1922                   int j;
1923
1924                   /* operand I is marked.  Check that it does not match any
1925                      operands > I which are marked.  */
1926                   for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
1927                     {
1928                       if (((1 << j) & opcode->no_match_operands)
1929                           && mn10300_reg_operands[i] == mn10300_reg_operands[j])
1930                         {
1931                           errmsg = _("Invalid register specification.");
1932                           match = 0;
1933                           goto error;
1934                         }
1935                     }
1936                 }
1937             }
1938         }
1939
1940     error:
1941       if (match == 0)
1942         {
1943           next_opcode = opcode + 1;
1944           if (!strcmp (next_opcode->name, opcode->name))
1945             {
1946               opcode = next_opcode;
1947               continue;
1948             }
1949
1950           as_bad ("%s", errmsg);
1951           return;
1952         }
1953       break;
1954     }
1955
1956   while (ISSPACE (*str))
1957     ++str;
1958
1959   if (*str != '\0')
1960     as_bad (_("junk at end of line: `%s'"), str);
1961
1962   input_line_pointer = str;
1963
1964   /* Determine the size of the instruction.  */
1965   if (opcode->format == FMT_S0)
1966     size = 1;
1967
1968   if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
1969     size = 2;
1970
1971   if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
1972     size = 3;
1973
1974   if (opcode->format == FMT_D6)
1975     size = 3;
1976
1977   if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
1978     size = 4;
1979
1980   if (opcode->format == FMT_D8)
1981     size = 6;
1982
1983   if (opcode->format == FMT_D9)
1984     size = 7;
1985
1986   if (opcode->format == FMT_S4)
1987     size = 5;
1988
1989   if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
1990     size = 7;
1991
1992   if (opcode->format == FMT_D2)
1993     size = 4;
1994
1995   if (opcode->format == FMT_D3)
1996     size = 5;
1997
1998   if (opcode->format == FMT_D4)
1999     size = 6;
2000
2001   if (relaxable && fc > 0)
2002     {
2003       int type;
2004
2005       /* We want to anchor the line info to the previous frag (if
2006          there isn't one, create it), so that, when the insn is
2007          resized, we still get the right address for the beginning of
2008          the region.  */
2009       f = frag_more (0);
2010       dwarf2_emit_insn (0);
2011
2012       /* bCC  */
2013       if (size == 2)
2014         {
2015           /* Handle bra specially.  Basically treat it like jmp so
2016              that we automatically handle 8, 16 and 32 bit offsets
2017              correctly as well as jumps to an undefined address.
2018
2019              It is also important to not treat it like other bCC
2020              instructions since the long forms of bra is different
2021              from other bCC instructions.  */
2022           if (opcode->opcode == 0xca00)
2023             type = 10;
2024           else
2025             type = 0;
2026         }
2027       /* call  */
2028       else if (size == 5)
2029         type = 6;
2030       /* calls  */
2031       else if (size == 4)
2032         type = 8;
2033       /* jmp  */
2034       else if (size == 3 && opcode->opcode == 0xcc0000)
2035         type = 10;
2036       else if (size == 3 && (opcode->opcode & 0xfff000) == 0xf8d000)
2037         type = 13;
2038       /* bCC (uncommon cases)  */
2039       else
2040         type = 3;
2041
2042       f = frag_var (rs_machine_dependent, 8, 8 - size, type,
2043                     fixups[0].exp.X_add_symbol,
2044                     fixups[0].exp.X_add_number,
2045                     (char *)fixups[0].opindex);
2046
2047       /* This is pretty hokey.  We basically just care about the
2048          opcode, so we have to write out the first word big endian.
2049
2050          The exception is "call", which has two operands that we
2051          care about.
2052
2053          The first operand (the register list) happens to be in the
2054          first instruction word, and will be in the right place if
2055          we output the first word in big endian mode.
2056
2057          The second operand (stack size) is in the extension word,
2058          and we want it to appear as the first character in the extension
2059          word (as it appears in memory).  Luckily, writing the extension
2060          word in big endian format will do what we want.  */
2061       number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
2062       if (size > 8)
2063         {
2064           number_to_chars_bigendian (f + 4, extension, 4);
2065           number_to_chars_bigendian (f + 8, 0, size - 8);
2066         }
2067       else if (size > 4)
2068         number_to_chars_bigendian (f + 4, extension, size - 4);
2069     }
2070   else
2071     {
2072       /* Allocate space for the instruction.  */
2073       f = frag_more (size);
2074
2075       /* Fill in bytes for the instruction.  Note that opcode fields
2076          are written big-endian, 16 & 32bit immediates are written
2077          little endian.  Egad.  */
2078       if (opcode->format == FMT_S0
2079           || opcode->format == FMT_S1
2080           || opcode->format == FMT_D0
2081           || opcode->format == FMT_D6
2082           || opcode->format == FMT_D7
2083           || opcode->format == FMT_D10
2084           || opcode->format == FMT_D1)
2085         {
2086           number_to_chars_bigendian (f, insn, size);
2087         }
2088       else if (opcode->format == FMT_S2
2089                && opcode->opcode != 0xdf0000
2090                && opcode->opcode != 0xde0000)
2091         {
2092           /* A format S2 instruction that is _not_ "ret" and "retf".  */
2093           number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
2094           number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
2095         }
2096       else if (opcode->format == FMT_S2)
2097         {
2098           /* This must be a ret or retf, which is written entirely in
2099              big-endian format.  */
2100           number_to_chars_bigendian (f, insn, 3);
2101         }
2102       else if (opcode->format == FMT_S4
2103                && opcode->opcode != 0xdc000000)
2104         {
2105           /* This must be a format S4 "call" instruction.  What a pain.  */
2106           unsigned long temp = (insn >> 8) & 0xffff;
2107           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
2108           number_to_chars_littleendian (f + 1, temp, 2);
2109           number_to_chars_bigendian (f + 3, insn & 0xff, 1);
2110           number_to_chars_bigendian (f + 4, extension & 0xff, 1);
2111         }
2112       else if (opcode->format == FMT_S4)
2113         {
2114           /* This must be a format S4 "jmp" instruction.  */
2115           unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
2116           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
2117           number_to_chars_littleendian (f + 1, temp, 4);
2118         }
2119       else if (opcode->format == FMT_S6)
2120         {
2121           unsigned long temp = ((insn & 0xffffff) << 8)
2122             | ((extension >> 16) & 0xff);
2123           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
2124           number_to_chars_littleendian (f + 1, temp, 4);
2125           number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
2126           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
2127         }
2128       else if (opcode->format == FMT_D2
2129                && opcode->opcode != 0xfaf80000
2130                && opcode->opcode != 0xfaf00000
2131                && opcode->opcode != 0xfaf40000)
2132         {
2133           /* A format D2 instruction where the 16bit immediate is
2134              really a single 16bit value, not two 8bit values.  */
2135           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2136           number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
2137         }
2138       else if (opcode->format == FMT_D2)
2139         {
2140           /* A format D2 instruction where the 16bit immediate
2141              is really two 8bit immediates.  */
2142           number_to_chars_bigendian (f, insn, 4);
2143         }
2144       else if (opcode->format == FMT_D3)
2145         {
2146           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2147           number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
2148           number_to_chars_bigendian (f + 4, extension & 0xff, 1);
2149         }
2150       else if (opcode->format == FMT_D4)
2151         {
2152           unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
2153
2154           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2155           number_to_chars_littleendian (f + 2, temp, 4);
2156         }
2157       else if (opcode->format == FMT_D5)
2158         {
2159           unsigned long temp = (((insn & 0xffff) << 16)
2160                                 | ((extension >> 8) & 0xffff));
2161
2162           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2163           number_to_chars_littleendian (f + 2, temp, 4);
2164           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
2165         }
2166       else if (opcode->format == FMT_D8)
2167         {
2168           unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
2169
2170           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2171           number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
2172           number_to_chars_littleendian (f + 4, temp >> 8, 2);
2173         }
2174       else if (opcode->format == FMT_D9)
2175         {
2176           unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
2177
2178           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2179           number_to_chars_littleendian (f + 3, temp, 4);
2180         }
2181
2182       /* Create any fixups.  */
2183       for (i = 0; i < fc; i++)
2184         {
2185           const struct mn10300_operand *operand;
2186
2187           operand = &mn10300_operands[fixups[i].opindex];
2188           if (fixups[i].reloc != BFD_RELOC_UNUSED
2189               && fixups[i].reloc != BFD_RELOC_32_GOT_PCREL
2190               && fixups[i].reloc != BFD_RELOC_32_GOTOFF
2191               && fixups[i].reloc != BFD_RELOC_32_PLT_PCREL
2192               && fixups[i].reloc != BFD_RELOC_MN10300_GOT32)
2193             {
2194               reloc_howto_type *reloc_howto;
2195               int size;
2196               int offset;
2197               fixS *fixP;
2198
2199               reloc_howto = bfd_reloc_type_lookup (stdoutput,
2200                                                    fixups[i].reloc);
2201
2202               if (!reloc_howto)
2203                 abort ();
2204
2205               size = bfd_get_reloc_size (reloc_howto);
2206
2207               if (size < 1 || size > 4)
2208                 abort ();
2209
2210               offset = 4 - size;
2211               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2212                                   size, &fixups[i].exp,
2213                                   reloc_howto->pc_relative,
2214                                   fixups[i].reloc);
2215             }
2216           else
2217             {
2218               int reloc, pcrel, reloc_size, offset;
2219               fixS *fixP;
2220
2221               reloc = BFD_RELOC_NONE;
2222               if (fixups[i].reloc != BFD_RELOC_UNUSED)
2223                 reloc = fixups[i].reloc;
2224               /* How big is the reloc?  Remember SPLIT relocs are
2225                  implicitly 32bits.  */
2226               if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2227                 reloc_size = 32;
2228               else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2229                 reloc_size = 24;
2230               else
2231                 reloc_size = operand->bits;
2232
2233               /* Is the reloc pc-relative?  */
2234               pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
2235               if (reloc != BFD_RELOC_NONE)
2236                 pcrel = bfd_reloc_type_lookup (stdoutput, reloc)->pc_relative;
2237
2238               offset = size - (reloc_size + operand->shift) / 8;
2239
2240               /* Choose a proper BFD relocation type.  */
2241               if (reloc != BFD_RELOC_NONE)
2242                 ;
2243               else if (pcrel)
2244                 {
2245                   if (reloc_size == 32)
2246                     reloc = BFD_RELOC_32_PCREL;
2247                   else if (reloc_size == 16)
2248                     reloc = BFD_RELOC_16_PCREL;
2249                   else if (reloc_size == 8)
2250                     reloc = BFD_RELOC_8_PCREL;
2251                   else
2252                     abort ();
2253                 }
2254               else
2255                 {
2256                   if (reloc_size == 32)
2257                     reloc = BFD_RELOC_32;
2258                   else if (reloc_size == 16)
2259                     reloc = BFD_RELOC_16;
2260                   else if (reloc_size == 8)
2261                     reloc = BFD_RELOC_8;
2262                   else
2263                     abort ();
2264                 }
2265
2266               /* Convert the size of the reloc into what fix_new_exp wants.  */
2267               reloc_size = reloc_size / 8;
2268               if (reloc_size == 8)
2269                 reloc_size = 0;
2270               else if (reloc_size == 16)
2271                 reloc_size = 1;
2272               else if (reloc_size == 32)
2273                 reloc_size = 2;
2274
2275               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2276                                   reloc_size, &fixups[i].exp, pcrel,
2277                                   ((bfd_reloc_code_real_type) reloc));
2278
2279               if (pcrel)
2280                 fixP->fx_offset += offset;
2281             }
2282         }
2283
2284       dwarf2_emit_insn (size);
2285     }
2286 }
2287
2288 /* If while processing a fixup, a reloc really needs to be created
2289    then it is done here.  */
2290
2291 arelent *
2292 tc_gen_reloc (seg, fixp)
2293      asection *seg ATTRIBUTE_UNUSED;
2294      fixS *fixp;
2295 {
2296   arelent *reloc;
2297   reloc = (arelent *) xmalloc (sizeof (arelent));
2298
2299   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2300   if (reloc->howto == (reloc_howto_type *) NULL)
2301     {
2302       as_bad_where (fixp->fx_file, fixp->fx_line,
2303                     _("reloc %d not supported by object file format"),
2304                     (int) fixp->fx_r_type);
2305       return NULL;
2306     }
2307   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2308
2309   if (fixp->fx_subsy
2310       && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
2311     {
2312       fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy);
2313       fixp->fx_subsy = 0;
2314     }
2315
2316   if (fixp->fx_addsy && fixp->fx_subsy)
2317     {
2318       reloc->sym_ptr_ptr = NULL;
2319
2320       /* If we got a difference between two symbols, and the
2321          subtracted symbol is in the current section, use a
2322          PC-relative relocation.  If both symbols are in the same
2323          section, the difference would have already been simplified
2324          to a constant.  */
2325       if (S_GET_SEGMENT (fixp->fx_subsy) == seg)
2326         {
2327           reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2328           *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2329           reloc->addend = (reloc->address - S_GET_VALUE (fixp->fx_subsy)
2330                            + fixp->fx_offset);
2331
2332           switch (fixp->fx_r_type)
2333             {
2334             case BFD_RELOC_8:
2335               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2336                                                     BFD_RELOC_8_PCREL);
2337               return reloc;
2338
2339             case BFD_RELOC_16:
2340               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2341                                                     BFD_RELOC_16_PCREL);
2342               return reloc;
2343
2344             case BFD_RELOC_24:
2345               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2346                                                     BFD_RELOC_24_PCREL);
2347               return reloc;
2348
2349             case BFD_RELOC_32:
2350               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2351                                                     BFD_RELOC_32_PCREL);
2352               return reloc;
2353
2354             default:
2355               /* Try to compute the absolute value below.  */
2356               break;
2357             }
2358         }
2359
2360       if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2361           || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2362         {
2363           as_bad_where (fixp->fx_file, fixp->fx_line,
2364                         "Difference of symbols in different sections is not supported");
2365         }
2366       else
2367         {
2368           char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
2369
2370           reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
2371                            - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
2372
2373           switch (fixp->fx_r_type)
2374             {
2375             case BFD_RELOC_8:
2376               md_number_to_chars (fixpos, reloc->addend, 1);
2377               break;
2378
2379             case BFD_RELOC_16:
2380               md_number_to_chars (fixpos, reloc->addend, 2);
2381               break;
2382
2383             case BFD_RELOC_24:
2384               md_number_to_chars (fixpos, reloc->addend, 3);
2385               break;
2386
2387             case BFD_RELOC_32:
2388               md_number_to_chars (fixpos, reloc->addend, 4);
2389               break;
2390
2391             default:
2392               reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
2393               return reloc;
2394             }
2395         }
2396
2397       if (reloc->sym_ptr_ptr)
2398         free (reloc->sym_ptr_ptr);
2399       free (reloc);
2400       return NULL;
2401     }
2402   else
2403     {
2404       reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2405       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2406       reloc->addend = fixp->fx_offset;
2407     }
2408   return reloc;
2409 }
2410
2411 int
2412 md_estimate_size_before_relax (fragp, seg)
2413      fragS *fragp;
2414      asection *seg;
2415 {
2416   if (fragp->fr_subtype == 6
2417       && (!S_IS_DEFINED (fragp->fr_symbol)
2418           || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2419     fragp->fr_subtype = 7;
2420   else if (fragp->fr_subtype == 8
2421            && (!S_IS_DEFINED (fragp->fr_symbol)
2422                || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2423     fragp->fr_subtype = 9;
2424   else if (fragp->fr_subtype == 10
2425            &&  (!S_IS_DEFINED (fragp->fr_symbol)
2426                 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2427     fragp->fr_subtype = 12;
2428
2429   if (fragp->fr_subtype == 13)
2430     return 3;
2431   if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
2432     abort ();
2433
2434   return md_relax_table[fragp->fr_subtype].rlx_length;
2435 }
2436
2437 long
2438 md_pcrel_from (fixp)
2439      fixS *fixp;
2440 {
2441   if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
2442     {
2443       /* The symbol is undefined.  Let the linker figure it out.  */
2444       return 0;
2445     }
2446   return fixp->fx_frag->fr_address + fixp->fx_where;
2447 }
2448
2449 void
2450 md_apply_fix3 (fixP, valP, seg)
2451      fixS * fixP;
2452      valueT * valP;
2453      segT seg;
2454 {
2455   char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal;
2456   int size = 0;
2457   int value = (int) * valP;
2458
2459   assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
2460
2461   /* This should never happen.  */
2462   if (seg->flags & SEC_ALLOC)
2463     abort ();
2464
2465   /* The value we are passed in *valuep includes the symbol values.
2466      Since we are using BFD_ASSEMBLER, if we are doing this relocation
2467      the code in write.c is going to call bfd_install_relocation, which
2468      is also going to use the symbol value.  That means that if the
2469      reloc is fully resolved we want to use *valuep since
2470      bfd_install_relocation is not being used.
2471
2472      However, if the reloc is not fully resolved we do not want to use
2473      *valuep, and must use fx_offset instead.  However, if the reloc
2474      is PC relative, we do want to use *valuep since it includes the
2475      result of md_pcrel_from.  */
2476   if (fixP->fx_addsy != (symbolS *) NULL && ! fixP->fx_pcrel)
2477     value = fixP->fx_offset;
2478
2479   /* If the fix is relative to a symbol which is not defined, or not
2480      in the same segment as the fix, we cannot resolve it here.  */
2481   if (fixP->fx_addsy != NULL
2482       && (! S_IS_DEFINED (fixP->fx_addsy)
2483           || (S_GET_SEGMENT (fixP->fx_addsy) != seg)))
2484     {
2485       fixP->fx_done = 0;
2486       return;
2487     }
2488
2489   switch (fixP->fx_r_type)
2490     {
2491     case BFD_RELOC_8:
2492     case BFD_RELOC_8_PCREL:
2493       size = 1;
2494       break;
2495
2496     case BFD_RELOC_16:
2497     case BFD_RELOC_16_PCREL:
2498       size = 2;
2499       break;
2500
2501     case BFD_RELOC_32:
2502     case BFD_RELOC_32_PCREL:
2503       size = 4;
2504       break;
2505
2506     case BFD_RELOC_VTABLE_INHERIT:
2507     case BFD_RELOC_VTABLE_ENTRY:
2508       fixP->fx_done = 0;
2509       return;
2510
2511     case BFD_RELOC_NONE:
2512     default:
2513       as_bad_where (fixP->fx_file, fixP->fx_line,
2514                    _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
2515     }
2516
2517   md_number_to_chars (fixpos, value, size);
2518
2519   /* If a symbol remains, pass the fixup, as a reloc, onto the linker.  */
2520   if (fixP->fx_addsy == NULL)
2521     fixP->fx_done = 1;
2522 }
2523
2524 /* Return zero if the fixup in fixp should be left alone and not
2525    adjusted.  */
2526
2527 bfd_boolean
2528 mn10300_fix_adjustable (fixp)
2529      struct fix *fixp;
2530 {
2531   if (! TC_RELOC_RTSYM_LOC_FIXUP (fixp))
2532     return 0;
2533
2534   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2535       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2536     return 0;
2537
2538   /* Do not adjust relocations involving symbols in code sections,
2539      because it breaks linker relaxations.  This could be fixed in the
2540      linker, but this fix is simpler, and it pretty much only affects
2541      object size a little bit.  */
2542   if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
2543     return 0;
2544
2545   return 1;
2546 }
2547
2548 /* Insert an operand value into an instruction.  */
2549
2550 static void
2551 mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
2552      unsigned long *insnp;
2553      unsigned long *extensionp;
2554      const struct mn10300_operand *operand;
2555      offsetT val;
2556      char *file;
2557      unsigned int line;
2558      unsigned int shift;
2559 {
2560   /* No need to check 32bit operands for a bit.  Note that
2561      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2562   if (operand->bits != 32
2563       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2564     {
2565       long min, max;
2566       offsetT test;
2567       int bits;
2568
2569       bits = operand->bits;
2570       if (operand->flags & MN10300_OPERAND_24BIT)
2571         bits = 24;
2572
2573       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2574         {
2575           max = (1 << (bits - 1)) - 1;
2576           min = - (1 << (bits - 1));
2577         }
2578       else
2579         {
2580           max = (1 << bits) - 1;
2581           min = 0;
2582         }
2583
2584       test = val;
2585
2586       if (test < (offsetT) min || test > (offsetT) max)
2587         as_warn_value_out_of_range (_("operand"), test, (offsetT) min, (offsetT) max, file, line);
2588     }
2589
2590   if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2591     {
2592       *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
2593       *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
2594                       << operand->shift);
2595     }
2596   else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2597     {
2598       *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
2599       *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
2600                       << operand->shift);
2601     }
2602   else if ((operand->flags & (MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG)))
2603     {
2604       /* See devo/opcodes/m10300-opc.c just before #define FSM0 for an
2605          explanation of these variables.  Note that FMT-implied shifts
2606         are not taken into account for FP registers.  */
2607       unsigned long mask_low, mask_high;
2608       int shl_low, shr_high, shl_high;
2609
2610       switch (operand->bits)
2611         {
2612         case 5:
2613           /* Handle regular FP registers.  */
2614           if (operand->shift >= 0)
2615             {
2616               /* This is an `m' register.  */
2617               shl_low = operand->shift;
2618               shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
2619             }
2620           else
2621             {
2622               /* This is an `n' register.  */
2623               shl_low = -operand->shift;
2624               shl_high = shl_low / 4;
2625             }
2626
2627           mask_low = 0x0f;
2628           mask_high = 0x10;
2629           shr_high = 4;
2630           break;
2631
2632         case 3:
2633           /* Handle accumulators.  */
2634           shl_low = -operand->shift;
2635           shl_high = 0;
2636           mask_low = 0x03;
2637           mask_high = 0x04;
2638           shr_high = 2;
2639           break;
2640
2641         default:
2642           abort ();
2643         }
2644       *insnp |= ((((val & mask_high) >> shr_high) << shl_high)
2645                  | ((val & mask_low) << shl_low));
2646     }
2647   else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
2648     {
2649       *insnp |= (((long) val & ((1 << operand->bits) - 1))
2650                  << (operand->shift + shift));
2651
2652       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2653         *insnp |= (((long) val & ((1 << operand->bits) - 1))
2654                    << (operand->shift + shift + operand->bits));
2655     }
2656   else
2657     {
2658       *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2659                       << (operand->shift + shift));
2660
2661       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2662         *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2663                         << (operand->shift + shift + operand->bits));
2664     }
2665 }
2666
2667 static unsigned long
2668 check_operand (insn, operand, val)
2669      unsigned long insn ATTRIBUTE_UNUSED;
2670      const struct mn10300_operand *operand;
2671      offsetT val;
2672 {
2673   /* No need to check 32bit operands for a bit.  Note that
2674      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2675   if (operand->bits != 32
2676       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2677     {
2678       long min, max;
2679       offsetT test;
2680       int bits;
2681
2682       bits = operand->bits;
2683       if (operand->flags & MN10300_OPERAND_24BIT)
2684         bits = 24;
2685
2686       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2687         {
2688           max = (1 << (bits - 1)) - 1;
2689           min = - (1 << (bits - 1));
2690         }
2691       else
2692         {
2693           max = (1 << bits) - 1;
2694           min = 0;
2695         }
2696
2697       test = val;
2698
2699       if (test < (offsetT) min || test > (offsetT) max)
2700         return 0;
2701       else
2702         return 1;
2703     }
2704   return 1;
2705 }
2706
2707 static void
2708 set_arch_mach (mach)
2709      int mach;
2710 {
2711   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
2712     as_warn (_("could not set architecture and machine"));
2713
2714   current_machine = mach;
2715 }
2716
2717 static inline char * mn10300_end_of_match PARAMS ((char *, char *));
2718
2719 static inline char *
2720 mn10300_end_of_match (cont, what)
2721      char *cont, *what;
2722 {
2723   int len = strlen (what);
2724
2725   if (strncmp (cont, what, strlen (what)) == 0
2726       && ! is_part_of_name (cont[len]))
2727     return cont + len;
2728
2729   return NULL;
2730 }  
2731
2732 int
2733 mn10300_parse_name (name, exprP, nextcharP)
2734      char const *name;
2735      expressionS *exprP;
2736      char *nextcharP;
2737 {
2738   char *next = input_line_pointer;
2739   char *next_end;
2740   int reloc_type;
2741   segT segment;
2742
2743   exprP->X_op_symbol = NULL;
2744
2745   if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
2746     {
2747       if (! GOT_symbol)
2748         GOT_symbol = symbol_find_or_make (name);
2749
2750       exprP->X_add_symbol = GOT_symbol;
2751     no_suffix:
2752       /* If we have an absolute symbol or a reg,
2753          then we know its value now.  */
2754       segment = S_GET_SEGMENT (exprP->X_add_symbol);
2755       if (segment == absolute_section)
2756         {
2757           exprP->X_op = O_constant;
2758           exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2759           exprP->X_add_symbol = NULL;
2760         }
2761       else if (segment == reg_section)
2762         {
2763           exprP->X_op = O_register;
2764           exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2765           exprP->X_add_symbol = NULL;
2766         }
2767       else
2768         {
2769           exprP->X_op = O_symbol;
2770           exprP->X_add_number = 0;
2771         }
2772
2773       return 1;
2774     }
2775
2776   exprP->X_add_symbol = symbol_find_or_make (name);
2777   
2778   if (*nextcharP != '@')
2779     goto no_suffix;
2780   else if ((next_end = mn10300_end_of_match (next + 1, "GOTOFF")))
2781     reloc_type = BFD_RELOC_32_GOTOFF;
2782   else if ((next_end = mn10300_end_of_match (next + 1, "GOT")))
2783     reloc_type = BFD_RELOC_MN10300_GOT32;
2784   else if ((next_end = mn10300_end_of_match (next + 1, "PLT")))
2785     reloc_type = BFD_RELOC_32_PLT_PCREL;
2786   else
2787     goto no_suffix;
2788
2789   *input_line_pointer = *nextcharP;
2790   input_line_pointer = next_end;
2791   *nextcharP = *input_line_pointer;
2792   *input_line_pointer = '\0';
2793
2794   exprP->X_op = O_PIC_reloc;
2795   exprP->X_add_number = 0;
2796   exprP->X_md = reloc_type;
2797
2798   return 1;
2799 }