2000-05-25 Alexandre Oliva <aoliva@cygnus.com>
[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   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
1217     as_warn (_("could not set architecture and machine"));
1218
1219   current_machine = MN103;
1220 }
1221
1222 void
1223 md_assemble (str)
1224      char *str;
1225 {
1226   char *s;
1227   struct mn10300_opcode *opcode;
1228   struct mn10300_opcode *next_opcode;
1229   const unsigned char *opindex_ptr;
1230   int next_opindex, relaxable;
1231   unsigned long insn, extension, size = 0;
1232   char *f;
1233   int i;
1234   int match;
1235
1236   /* Get the opcode.  */
1237   for (s = str; *s != '\0' && !ISSPACE (*s); s++)
1238     ;
1239   if (*s != '\0')
1240     *s++ = '\0';
1241
1242   /* Find the first opcode with the proper name.  */
1243   opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
1244   if (opcode == NULL)
1245     {
1246       as_bad (_("Unrecognized opcode: `%s'"), str);
1247       return;
1248     }
1249
1250   str = s;
1251   while (ISSPACE (*str))
1252     ++str;
1253
1254   input_line_pointer = str;
1255
1256   for (;;)
1257     {
1258       const char *errmsg;
1259       int op_idx;
1260       char *hold;
1261       int extra_shift = 0;
1262
1263       errmsg = _("Invalid opcode/operands");
1264
1265       /* Reset the array of register operands.  */
1266       memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
1267
1268       relaxable = 0;
1269       fc = 0;
1270       match = 0;
1271       next_opindex = 0;
1272       insn = opcode->opcode;
1273       extension = 0;
1274
1275       /* If the instruction is not available on the current machine
1276          then it can not possibly match.  */
1277       if (opcode->machine
1278           && !(opcode->machine == AM33_2 && HAVE_AM33_2)
1279           && !(opcode->machine == AM33 && HAVE_AM33)
1280           && !(opcode->machine == AM30 && HAVE_AM30))
1281         goto error;
1282
1283       for (op_idx = 1, opindex_ptr = opcode->operands;
1284            *opindex_ptr != 0;
1285            opindex_ptr++, op_idx++)
1286         {
1287           const struct mn10300_operand *operand;
1288           expressionS ex;
1289
1290           if (next_opindex == 0)
1291             {
1292               operand = &mn10300_operands[*opindex_ptr];
1293             }
1294           else
1295             {
1296               operand = &mn10300_operands[next_opindex];
1297               next_opindex = 0;
1298             }
1299
1300           while (*str == ' ' || *str == ',')
1301             ++str;
1302
1303           if (operand->flags & MN10300_OPERAND_RELAX)
1304             relaxable = 1;
1305
1306           /* Gather the operand.  */
1307           hold = input_line_pointer;
1308           input_line_pointer = str;
1309
1310           if (operand->flags & MN10300_OPERAND_PAREN)
1311             {
1312               if (*input_line_pointer != ')' && *input_line_pointer != '(')
1313                 {
1314                   input_line_pointer = hold;
1315                   str = hold;
1316                   goto error;
1317                 }
1318               input_line_pointer++;
1319               goto keep_going;
1320             }
1321           /* See if we can match the operands.  */
1322           else if (operand->flags & MN10300_OPERAND_DREG)
1323             {
1324               if (!data_register_name (&ex))
1325                 {
1326                   input_line_pointer = hold;
1327                   str = hold;
1328                   goto error;
1329                 }
1330             }
1331           else if (operand->flags & MN10300_OPERAND_AREG)
1332             {
1333               if (!address_register_name (&ex))
1334                 {
1335                   input_line_pointer = hold;
1336                   str = hold;
1337                   goto error;
1338                 }
1339             }
1340           else if (operand->flags & MN10300_OPERAND_SP)
1341             {
1342               char *start = input_line_pointer;
1343               char c = get_symbol_end ();
1344
1345               if (strcasecmp (start, "sp") != 0)
1346                 {
1347                   *input_line_pointer = c;
1348                   input_line_pointer = hold;
1349                   str = hold;
1350                   goto error;
1351                 }
1352               *input_line_pointer = c;
1353               goto keep_going;
1354             }
1355           else if (operand->flags & MN10300_OPERAND_RREG)
1356             {
1357               if (!r_register_name (&ex))
1358                 {
1359                   input_line_pointer = hold;
1360                   str = hold;
1361                   goto error;
1362                 }
1363             }
1364           else if (operand->flags & MN10300_OPERAND_XRREG)
1365             {
1366               if (!xr_register_name (&ex))
1367                 {
1368                   input_line_pointer = hold;
1369                   str = hold;
1370                   goto error;
1371                 }
1372             }
1373           else if (operand->flags & MN10300_OPERAND_FSREG)
1374             {
1375               if (!float_register_name (&ex))
1376                 {
1377                   input_line_pointer = hold;
1378                   str = hold;
1379                   goto error;
1380                 }
1381             }
1382           else if (operand->flags & MN10300_OPERAND_FDREG)
1383             {
1384               if (!double_register_name (&ex))
1385                 {
1386                   input_line_pointer = hold;
1387                   str = hold;
1388                   goto error;
1389                 }
1390             }
1391           else if (operand->flags & MN10300_OPERAND_FPCR)
1392             {
1393               char *start = input_line_pointer;
1394               char c = get_symbol_end ();
1395
1396               if (strcasecmp (start, "fpcr") != 0)
1397                 {
1398                   *input_line_pointer = c;
1399                   input_line_pointer = hold;
1400                   str = hold;
1401                   goto error;
1402                 }
1403               *input_line_pointer = c;
1404               goto keep_going;
1405             }
1406           else if (operand->flags & MN10300_OPERAND_USP)
1407             {
1408               char *start = input_line_pointer;
1409               char c = get_symbol_end ();
1410
1411               if (strcasecmp (start, "usp") != 0)
1412                 {
1413                   *input_line_pointer = c;
1414                   input_line_pointer = hold;
1415                   str = hold;
1416                   goto error;
1417                 }
1418               *input_line_pointer = c;
1419               goto keep_going;
1420             }
1421           else if (operand->flags & MN10300_OPERAND_SSP)
1422             {
1423               char *start = input_line_pointer;
1424               char c = get_symbol_end ();
1425
1426               if (strcasecmp (start, "ssp") != 0)
1427                 {
1428                   *input_line_pointer = c;
1429                   input_line_pointer = hold;
1430                   str = hold;
1431                   goto error;
1432                 }
1433               *input_line_pointer = c;
1434               goto keep_going;
1435             }
1436           else if (operand->flags & MN10300_OPERAND_MSP)
1437             {
1438               char *start = input_line_pointer;
1439               char c = get_symbol_end ();
1440
1441               if (strcasecmp (start, "msp") != 0)
1442                 {
1443                   *input_line_pointer = c;
1444                   input_line_pointer = hold;
1445                   str = hold;
1446                   goto error;
1447                 }
1448               *input_line_pointer = c;
1449               goto keep_going;
1450             }
1451           else if (operand->flags & MN10300_OPERAND_PC)
1452             {
1453               char *start = input_line_pointer;
1454               char c = get_symbol_end ();
1455
1456               if (strcasecmp (start, "pc") != 0)
1457                 {
1458                   *input_line_pointer = c;
1459                   input_line_pointer = hold;
1460                   str = hold;
1461                   goto error;
1462                 }
1463               *input_line_pointer = c;
1464               goto keep_going;
1465             }
1466           else if (operand->flags & MN10300_OPERAND_EPSW)
1467             {
1468               char *start = input_line_pointer;
1469               char c = get_symbol_end ();
1470
1471               if (strcasecmp (start, "epsw") != 0)
1472                 {
1473                   *input_line_pointer = c;
1474                   input_line_pointer = hold;
1475                   str = hold;
1476                   goto error;
1477                 }
1478               *input_line_pointer = c;
1479               goto keep_going;
1480             }
1481           else if (operand->flags & MN10300_OPERAND_PLUS)
1482             {
1483               if (*input_line_pointer != '+')
1484                 {
1485                   input_line_pointer = hold;
1486                   str = hold;
1487                   goto error;
1488                 }
1489               input_line_pointer++;
1490               goto keep_going;
1491             }
1492           else if (operand->flags & MN10300_OPERAND_PSW)
1493             {
1494               char *start = input_line_pointer;
1495               char c = get_symbol_end ();
1496
1497               if (strcasecmp (start, "psw") != 0)
1498                 {
1499                   *input_line_pointer = c;
1500                   input_line_pointer = hold;
1501                   str = hold;
1502                   goto error;
1503                 }
1504               *input_line_pointer = c;
1505               goto keep_going;
1506             }
1507           else if (operand->flags & MN10300_OPERAND_MDR)
1508             {
1509               char *start = input_line_pointer;
1510               char c = get_symbol_end ();
1511
1512               if (strcasecmp (start, "mdr") != 0)
1513                 {
1514                   *input_line_pointer = c;
1515                   input_line_pointer = hold;
1516                   str = hold;
1517                   goto error;
1518                 }
1519               *input_line_pointer = c;
1520               goto keep_going;
1521             }
1522           else if (operand->flags & MN10300_OPERAND_REG_LIST)
1523             {
1524               unsigned int value = 0;
1525               if (*input_line_pointer != '[')
1526                 {
1527                   input_line_pointer = hold;
1528                   str = hold;
1529                   goto error;
1530                 }
1531
1532               /* Eat the '['.  */
1533               input_line_pointer++;
1534
1535               /* We used to reject a null register list here; however,
1536                  we accept it now so the compiler can emit "call"
1537                  instructions for all calls to named functions.
1538
1539                  The linker can then fill in the appropriate bits for the
1540                  register list and stack size or change the instruction
1541                  into a "calls" if using "call" is not profitable.  */
1542               while (*input_line_pointer != ']')
1543                 {
1544                   char *start;
1545                   char c;
1546
1547                   if (*input_line_pointer == ',')
1548                     input_line_pointer++;
1549
1550                   start = input_line_pointer;
1551                   c = get_symbol_end ();
1552
1553                   if (strcasecmp (start, "d2") == 0)
1554                     {
1555                       value |= 0x80;
1556                       *input_line_pointer = c;
1557                     }
1558                   else if (strcasecmp (start, "d3") == 0)
1559                     {
1560                       value |= 0x40;
1561                       *input_line_pointer = c;
1562                     }
1563                   else if (strcasecmp (start, "a2") == 0)
1564                     {
1565                       value |= 0x20;
1566                       *input_line_pointer = c;
1567                     }
1568                   else if (strcasecmp (start, "a3") == 0)
1569                     {
1570                       value |= 0x10;
1571                       *input_line_pointer = c;
1572                     }
1573                   else if (strcasecmp (start, "other") == 0)
1574                     {
1575                       value |= 0x08;
1576                       *input_line_pointer = c;
1577                     }
1578                   else if (HAVE_AM33
1579                            && strcasecmp (start, "exreg0") == 0)
1580                     {
1581                       value |= 0x04;
1582                       *input_line_pointer = c;
1583                     }
1584                   else if (HAVE_AM33
1585                            && strcasecmp (start, "exreg1") == 0)
1586                     {
1587                       value |= 0x02;
1588                       *input_line_pointer = c;
1589                     }
1590                   else if (HAVE_AM33
1591                            && strcasecmp (start, "exother") == 0)
1592                     {
1593                       value |= 0x01;
1594                       *input_line_pointer = c;
1595                     }
1596                   else if (HAVE_AM33
1597                            && strcasecmp (start, "all") == 0)
1598                     {
1599                       value |= 0xff;
1600                       *input_line_pointer = c;
1601                     }
1602                   else
1603                     {
1604                       input_line_pointer = hold;
1605                       str = hold;
1606                       goto error;
1607                     }
1608                 }
1609               input_line_pointer++;
1610               mn10300_insert_operand (&insn, &extension, operand,
1611                                       value, (char *) NULL, 0, 0);
1612               goto keep_going;
1613
1614             }
1615           else if (data_register_name (&ex))
1616             {
1617               input_line_pointer = hold;
1618               str = hold;
1619               goto error;
1620             }
1621           else if (address_register_name (&ex))
1622             {
1623               input_line_pointer = hold;
1624               str = hold;
1625               goto error;
1626             }
1627           else if (other_register_name (&ex))
1628             {
1629               input_line_pointer = hold;
1630               str = hold;
1631               goto error;
1632             }
1633           else if (HAVE_AM33 && r_register_name (&ex))
1634             {
1635               input_line_pointer = hold;
1636               str = hold;
1637               goto error;
1638             }
1639           else if (HAVE_AM33 && xr_register_name (&ex))
1640             {
1641               input_line_pointer = hold;
1642               str = hold;
1643               goto error;
1644             }
1645           else if (HAVE_AM33_2 && float_register_name (&ex))
1646             {
1647               input_line_pointer = hold;
1648               str = hold;
1649               goto error;
1650             }
1651           else if (HAVE_AM33_2 && double_register_name (&ex))
1652             {
1653               input_line_pointer = hold;
1654               str = hold;
1655               goto error;
1656             }
1657           else if (*str == ')' || *str == '(')
1658             {
1659               input_line_pointer = hold;
1660               str = hold;
1661               goto error;
1662             }
1663           else
1664             {
1665               expression (&ex);
1666             }
1667
1668           switch (ex.X_op)
1669             {
1670             case O_illegal:
1671               errmsg = _("illegal operand");
1672               goto error;
1673             case O_absent:
1674               errmsg = _("missing operand");
1675               goto error;
1676             case O_register:
1677               {
1678                 int mask;
1679
1680                 mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
1681                 if (HAVE_AM33)
1682                   mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
1683                 if (HAVE_AM33_2)
1684                   mask |= MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG;
1685                 if ((operand->flags & mask) == 0)
1686                   {
1687                     input_line_pointer = hold;
1688                     str = hold;
1689                     goto error;
1690                   }
1691
1692                 if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
1693                   extra_shift = 8;
1694                 else if (opcode->format == FMT_D2
1695                          || opcode->format == FMT_D4
1696                          || opcode->format == FMT_S2
1697                          || opcode->format == FMT_S4
1698                          || opcode->format == FMT_S6
1699                          || opcode->format == FMT_D5)
1700                   extra_shift = 16;
1701                 else if (opcode->format == FMT_D7)
1702                   extra_shift = 8;
1703                 else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
1704                   extra_shift = 8;
1705                 else
1706                   extra_shift = 0;
1707
1708                 mn10300_insert_operand (&insn, &extension, operand,
1709                                         ex.X_add_number, (char *) NULL,
1710                                         0, extra_shift);
1711
1712                 /* And note the register number in the register array.  */
1713                 mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
1714                 break;
1715               }
1716
1717             case O_constant:
1718               /* If this operand can be promoted, and it doesn't
1719                  fit into the allocated bitfield for this insn,
1720                  then promote it (ie this opcode does not match).  */
1721               if (operand->flags
1722                   & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
1723                   && !check_operand (insn, operand, ex.X_add_number))
1724                 {
1725                   input_line_pointer = hold;
1726                   str = hold;
1727                   goto error;
1728                 }
1729
1730               mn10300_insert_operand (&insn, &extension, operand,
1731                                       ex.X_add_number, (char *) NULL,
1732                                       0, 0);
1733               break;
1734
1735             default:
1736               /* If this operand can be promoted, then this opcode didn't
1737                  match since we can't know if it needed promotion!  */
1738               if (operand->flags & MN10300_OPERAND_PROMOTE)
1739                 {
1740                   input_line_pointer = hold;
1741                   str = hold;
1742                   goto error;
1743                 }
1744
1745               /* We need to generate a fixup for this expression.  */
1746               if (fc >= MAX_INSN_FIXUPS)
1747                 as_fatal (_("too many fixups"));
1748               fixups[fc].exp = ex;
1749               fixups[fc].opindex = *opindex_ptr;
1750               fixups[fc].reloc = BFD_RELOC_UNUSED;
1751               ++fc;
1752               break;
1753             }
1754
1755 keep_going:
1756           str = input_line_pointer;
1757           input_line_pointer = hold;
1758
1759           while (*str == ' ' || *str == ',')
1760             ++str;
1761
1762         }
1763
1764       /* Make sure we used all the operands!  */
1765       if (*str != ',')
1766         match = 1;
1767
1768       /* If this instruction has registers that must not match, verify
1769          that they do indeed not match.  */
1770       if (opcode->no_match_operands)
1771         {
1772           int i;
1773
1774           /* Look at each operand to see if it's marked.  */
1775           for (i = 0; i < MN10300_MAX_OPERANDS; i++)
1776             {
1777               if ((1 << i) & opcode->no_match_operands)
1778                 {
1779                   int j;
1780
1781                   /* operand I is marked.  Check that it does not match any
1782                      operands > I which are marked.  */
1783                   for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
1784                     {
1785                       if (((1 << j) & opcode->no_match_operands)
1786                           && mn10300_reg_operands[i] == mn10300_reg_operands[j])
1787                         {
1788                           errmsg = _("Invalid register specification.");
1789                           match = 0;
1790                           goto error;
1791                         }
1792                     }
1793                 }
1794             }
1795         }
1796
1797     error:
1798       if (match == 0)
1799         {
1800           next_opcode = opcode + 1;
1801           if (!strcmp (next_opcode->name, opcode->name))
1802             {
1803               opcode = next_opcode;
1804               continue;
1805             }
1806
1807           as_bad ("%s", errmsg);
1808           return;
1809         }
1810       break;
1811     }
1812
1813   while (ISSPACE (*str))
1814     ++str;
1815
1816   if (*str != '\0')
1817     as_bad (_("junk at end of line: `%s'"), str);
1818
1819   input_line_pointer = str;
1820
1821   /* Determine the size of the instruction.  */
1822   if (opcode->format == FMT_S0)
1823     size = 1;
1824
1825   if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
1826     size = 2;
1827
1828   if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
1829     size = 3;
1830
1831   if (opcode->format == FMT_D6)
1832     size = 3;
1833
1834   if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
1835     size = 4;
1836
1837   if (opcode->format == FMT_D8)
1838     size = 6;
1839
1840   if (opcode->format == FMT_D9)
1841     size = 7;
1842
1843   if (opcode->format == FMT_S4)
1844     size = 5;
1845
1846   if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
1847     size = 7;
1848
1849   if (opcode->format == FMT_D2)
1850     size = 4;
1851
1852   if (opcode->format == FMT_D3)
1853     size = 5;
1854
1855   if (opcode->format == FMT_D4)
1856     size = 6;
1857
1858   if (relaxable && fc > 0)
1859     {
1860       int type;
1861
1862       /* We want to anchor the line info to the previous frag (if
1863          there isn't one, create it), so that, when the insn is
1864          resized, we still get the right address for the beginning of
1865          the region.  */
1866       f = frag_more (0);
1867       dwarf2_emit_insn (0);
1868
1869       /* bCC  */
1870       if (size == 2)
1871         {
1872           /* Handle bra specially.  Basically treat it like jmp so
1873              that we automatically handle 8, 16 and 32 bit offsets
1874              correctly as well as jumps to an undefined address.
1875
1876              It is also important to not treat it like other bCC
1877              instructions since the long forms of bra is different
1878              from other bCC instructions.  */
1879           if (opcode->opcode == 0xca00)
1880             type = 10;
1881           else
1882             type = 0;
1883         }
1884       /* call  */
1885       else if (size == 5)
1886         type = 6;
1887       /* calls  */
1888       else if (size == 4)
1889         type = 8;
1890       /* jmp  */
1891       else if (size == 3 && opcode->opcode == 0xcc0000)
1892         type = 10;
1893       else if (size == 3 && (opcode->opcode & 0xfff000) == 0xf8d000)
1894         type = 13;
1895       /* bCC (uncommon cases)  */
1896       else
1897         type = 3;
1898
1899       f = frag_var (rs_machine_dependent, 8, 8 - size, type,
1900                     fixups[0].exp.X_add_symbol,
1901                     fixups[0].exp.X_add_number,
1902                     (char *)fixups[0].opindex);
1903
1904       /* This is pretty hokey.  We basically just care about the
1905          opcode, so we have to write out the first word big endian.
1906
1907          The exception is "call", which has two operands that we
1908          care about.
1909
1910          The first operand (the register list) happens to be in the
1911          first instruction word, and will be in the right place if
1912          we output the first word in big endian mode.
1913
1914          The second operand (stack size) is in the extension word,
1915          and we want it to appear as the first character in the extension
1916          word (as it appears in memory).  Luckily, writing the extension
1917          word in big endian format will do what we want.  */
1918       number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
1919       if (size > 8)
1920         {
1921           number_to_chars_bigendian (f + 4, extension, 4);
1922           number_to_chars_bigendian (f + 8, 0, size - 8);
1923         }
1924       else if (size > 4)
1925         number_to_chars_bigendian (f + 4, extension, size - 4);
1926     }
1927   else
1928     {
1929       /* Allocate space for the instruction.  */
1930       f = frag_more (size);
1931
1932       /* Fill in bytes for the instruction.  Note that opcode fields
1933          are written big-endian, 16 & 32bit immediates are written
1934          little endian.  Egad.  */
1935       if (opcode->format == FMT_S0
1936           || opcode->format == FMT_S1
1937           || opcode->format == FMT_D0
1938           || opcode->format == FMT_D6
1939           || opcode->format == FMT_D7
1940           || opcode->format == FMT_D10
1941           || opcode->format == FMT_D1)
1942         {
1943           number_to_chars_bigendian (f, insn, size);
1944         }
1945       else if (opcode->format == FMT_S2
1946                && opcode->opcode != 0xdf0000
1947                && opcode->opcode != 0xde0000)
1948         {
1949           /* A format S2 instruction that is _not_ "ret" and "retf".  */
1950           number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
1951           number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
1952         }
1953       else if (opcode->format == FMT_S2)
1954         {
1955           /* This must be a ret or retf, which is written entirely in
1956              big-endian format.  */
1957           number_to_chars_bigendian (f, insn, 3);
1958         }
1959       else if (opcode->format == FMT_S4
1960                && opcode->opcode != 0xdc000000)
1961         {
1962           /* This must be a format S4 "call" instruction.  What a pain.  */
1963           unsigned long temp = (insn >> 8) & 0xffff;
1964           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1965           number_to_chars_littleendian (f + 1, temp, 2);
1966           number_to_chars_bigendian (f + 3, insn & 0xff, 1);
1967           number_to_chars_bigendian (f + 4, extension & 0xff, 1);
1968         }
1969       else if (opcode->format == FMT_S4)
1970         {
1971           /* This must be a format S4 "jmp" instruction.  */
1972           unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
1973           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1974           number_to_chars_littleendian (f + 1, temp, 4);
1975         }
1976       else if (opcode->format == FMT_S6)
1977         {
1978           unsigned long temp = ((insn & 0xffffff) << 8)
1979             | ((extension >> 16) & 0xff);
1980           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1981           number_to_chars_littleendian (f + 1, temp, 4);
1982           number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
1983           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1984         }
1985       else if (opcode->format == FMT_D2
1986                && opcode->opcode != 0xfaf80000
1987                && opcode->opcode != 0xfaf00000
1988                && opcode->opcode != 0xfaf40000)
1989         {
1990           /* A format D2 instruction where the 16bit immediate is
1991              really a single 16bit value, not two 8bit values.  */
1992           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1993           number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
1994         }
1995       else if (opcode->format == FMT_D2)
1996         {
1997           /* A format D2 instruction where the 16bit immediate
1998              is really two 8bit immediates.  */
1999           number_to_chars_bigendian (f, insn, 4);
2000         }
2001       else if (opcode->format == FMT_D3)
2002         {
2003           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2004           number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
2005           number_to_chars_bigendian (f + 4, extension & 0xff, 1);
2006         }
2007       else if (opcode->format == FMT_D4)
2008         {
2009           unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
2010
2011           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2012           number_to_chars_littleendian (f + 2, temp, 4);
2013         }
2014       else if (opcode->format == FMT_D5)
2015         {
2016           unsigned long temp = (((insn & 0xffff) << 16)
2017                                 | ((extension >> 8) & 0xffff));
2018
2019           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2020           number_to_chars_littleendian (f + 2, temp, 4);
2021           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
2022         }
2023       else if (opcode->format == FMT_D8)
2024         {
2025           unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
2026
2027           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2028           number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
2029           number_to_chars_littleendian (f + 4, temp >> 8, 2);
2030         }
2031       else if (opcode->format == FMT_D9)
2032         {
2033           unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
2034
2035           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2036           number_to_chars_littleendian (f + 3, temp, 4);
2037         }
2038
2039       /* Create any fixups.  */
2040       for (i = 0; i < fc; i++)
2041         {
2042           const struct mn10300_operand *operand;
2043
2044           operand = &mn10300_operands[fixups[i].opindex];
2045           if (fixups[i].reloc != BFD_RELOC_UNUSED)
2046             {
2047               reloc_howto_type *reloc_howto;
2048               int size;
2049               int offset;
2050               fixS *fixP;
2051
2052               reloc_howto = bfd_reloc_type_lookup (stdoutput,
2053                                                    fixups[i].reloc);
2054
2055               if (!reloc_howto)
2056                 abort ();
2057
2058               size = bfd_get_reloc_size (reloc_howto);
2059
2060               if (size < 1 || size > 4)
2061                 abort ();
2062
2063               offset = 4 - size;
2064               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2065                                   size, &fixups[i].exp,
2066                                   reloc_howto->pc_relative,
2067                                   fixups[i].reloc);
2068             }
2069           else
2070             {
2071               int reloc, pcrel, reloc_size, offset;
2072               fixS *fixP;
2073
2074               reloc = BFD_RELOC_NONE;
2075               /* How big is the reloc?  Remember SPLIT relocs are
2076                  implicitly 32bits.  */
2077               if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2078                 reloc_size = 32;
2079               else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2080                 reloc_size = 24;
2081               else
2082                 reloc_size = operand->bits;
2083
2084               /* Is the reloc pc-relative?  */
2085               pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
2086
2087               offset = size - (reloc_size + operand->shift) / 8;
2088
2089               /* Choose a proper BFD relocation type.  */
2090               if (pcrel)
2091                 {
2092                   if (reloc_size == 32)
2093                     reloc = BFD_RELOC_32_PCREL;
2094                   else if (reloc_size == 16)
2095                     reloc = BFD_RELOC_16_PCREL;
2096                   else if (reloc_size == 8)
2097                     reloc = BFD_RELOC_8_PCREL;
2098                   else
2099                     abort ();
2100                 }
2101               else
2102                 {
2103                   if (reloc_size == 32)
2104                     reloc = BFD_RELOC_32;
2105                   else if (reloc_size == 16)
2106                     reloc = BFD_RELOC_16;
2107                   else if (reloc_size == 8)
2108                     reloc = BFD_RELOC_8;
2109                   else
2110                     abort ();
2111                 }
2112
2113               /* Convert the size of the reloc into what fix_new_exp wants.  */
2114               reloc_size = reloc_size / 8;
2115               if (reloc_size == 8)
2116                 reloc_size = 0;
2117               else if (reloc_size == 16)
2118                 reloc_size = 1;
2119               else if (reloc_size == 32)
2120                 reloc_size = 2;
2121
2122               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2123                                   reloc_size, &fixups[i].exp, pcrel,
2124                                   ((bfd_reloc_code_real_type) reloc));
2125
2126               if (pcrel)
2127                 fixP->fx_offset += offset;
2128             }
2129         }
2130
2131       dwarf2_emit_insn (size);
2132     }
2133 }
2134
2135 /* If while processing a fixup, a reloc really needs to be created
2136    then it is done here.  */
2137
2138 arelent *
2139 tc_gen_reloc (seg, fixp)
2140      asection *seg ATTRIBUTE_UNUSED;
2141      fixS *fixp;
2142 {
2143   arelent *reloc;
2144   reloc = (arelent *) xmalloc (sizeof (arelent));
2145
2146   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2147   if (reloc->howto == (reloc_howto_type *) NULL)
2148     {
2149       as_bad_where (fixp->fx_file, fixp->fx_line,
2150                     _("reloc %d not supported by object file format"),
2151                     (int) fixp->fx_r_type);
2152       return NULL;
2153     }
2154   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2155
2156   if (fixp->fx_addsy && fixp->fx_subsy)
2157     {
2158       reloc->sym_ptr_ptr = NULL;
2159
2160       /* If we got a difference between two symbols, and the
2161          subtracted symbol is in the current section, use a
2162          PC-relative relocation.  If both symbols are in the same
2163          section, the difference would have already been simplified
2164          to a constant.  */
2165       if (S_GET_SEGMENT (fixp->fx_subsy) == seg)
2166         {
2167           reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2168           *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2169           reloc->addend = (reloc->address - S_GET_VALUE (fixp->fx_subsy)
2170                            + fixp->fx_offset);
2171
2172           switch (fixp->fx_r_type)
2173             {
2174             case BFD_RELOC_8:
2175               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2176                                                     BFD_RELOC_8_PCREL);
2177               return reloc;
2178
2179             case BFD_RELOC_16:
2180               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2181                                                     BFD_RELOC_16_PCREL);
2182               return reloc;
2183
2184             case BFD_RELOC_24:
2185               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2186                                                     BFD_RELOC_24_PCREL);
2187               return reloc;
2188
2189             case BFD_RELOC_32:
2190               reloc->howto = bfd_reloc_type_lookup (stdoutput,
2191                                                     BFD_RELOC_32_PCREL);
2192               return reloc;
2193
2194             default:
2195               /* Try to compute the absolute value below.  */
2196               break;
2197             }
2198         }
2199
2200       if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2201           || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2202         {
2203           as_bad_where (fixp->fx_file, fixp->fx_line,
2204                         "Difference of symbols in different sections is not supported");
2205         }
2206       else
2207         {
2208           char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
2209
2210           reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
2211                            - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
2212
2213           switch (fixp->fx_r_type)
2214             {
2215             case BFD_RELOC_8:
2216               md_number_to_chars (fixpos, reloc->addend, 1);
2217               break;
2218
2219             case BFD_RELOC_16:
2220               md_number_to_chars (fixpos, reloc->addend, 2);
2221               break;
2222
2223             case BFD_RELOC_24:
2224               md_number_to_chars (fixpos, reloc->addend, 3);
2225               break;
2226
2227             case BFD_RELOC_32:
2228               md_number_to_chars (fixpos, reloc->addend, 4);
2229               break;
2230
2231             default:
2232               reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
2233               return reloc;
2234             }
2235         }
2236
2237       if (reloc->sym_ptr_ptr)
2238         free (reloc->sym_ptr_ptr);
2239       free (reloc);
2240       return NULL;
2241     }
2242   else
2243     {
2244       reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2245       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2246       reloc->addend = fixp->fx_offset;
2247     }
2248   return reloc;
2249 }
2250
2251 int
2252 md_estimate_size_before_relax (fragp, seg)
2253      fragS *fragp;
2254      asection *seg;
2255 {
2256   if (fragp->fr_subtype == 6
2257       && (!S_IS_DEFINED (fragp->fr_symbol)
2258           || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2259     fragp->fr_subtype = 7;
2260   else if (fragp->fr_subtype == 8
2261            && (!S_IS_DEFINED (fragp->fr_symbol)
2262                || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2263     fragp->fr_subtype = 9;
2264   else if (fragp->fr_subtype == 10
2265            &&  (!S_IS_DEFINED (fragp->fr_symbol)
2266                 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2267     fragp->fr_subtype = 12;
2268
2269   if (fragp->fr_subtype == 13)
2270     return 3;
2271   if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
2272     abort ();
2273
2274   return md_relax_table[fragp->fr_subtype].rlx_length;
2275 }
2276
2277 long
2278 md_pcrel_from (fixp)
2279      fixS *fixp;
2280 {
2281   if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
2282     {
2283       /* The symbol is undefined.  Let the linker figure it out.  */
2284       return 0;
2285     }
2286   return fixp->fx_frag->fr_address + fixp->fx_where;
2287 }
2288
2289 void
2290 md_apply_fix3 (fixP, valP, seg)
2291      fixS * fixP;
2292      valueT * valP;
2293      segT seg;
2294 {
2295   char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal;
2296   int size = 0;
2297   int value = (int) * valP;
2298
2299   assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
2300
2301   /* This should never happen.  */
2302   if (seg->flags & SEC_ALLOC)
2303     abort ();
2304
2305   /* The value we are passed in *valuep includes the symbol values.
2306      Since we are using BFD_ASSEMBLER, if we are doing this relocation
2307      the code in write.c is going to call bfd_install_relocation, which
2308      is also going to use the symbol value.  That means that if the
2309      reloc is fully resolved we want to use *valuep since
2310      bfd_install_relocation is not being used.
2311
2312      However, if the reloc is not fully resolved we do not want to use
2313      *valuep, and must use fx_offset instead.  However, if the reloc
2314      is PC relative, we do want to use *valuep since it includes the
2315      result of md_pcrel_from.  */
2316   if (fixP->fx_addsy != (symbolS *) NULL && ! fixP->fx_pcrel)
2317     value = fixP->fx_offset;
2318
2319   /* If the fix is relative to a symbol which is not defined, or not
2320      in the same segment as the fix, we cannot resolve it here.  */
2321   if (fixP->fx_addsy != NULL
2322       && (! S_IS_DEFINED (fixP->fx_addsy)
2323           || (S_GET_SEGMENT (fixP->fx_addsy) != seg)))
2324     {
2325       fixP->fx_done = 0;
2326       return;
2327     }
2328
2329   switch (fixP->fx_r_type)
2330     {
2331     case BFD_RELOC_8:
2332     case BFD_RELOC_8_PCREL:
2333       size = 1;
2334       break;
2335
2336     case BFD_RELOC_16:
2337     case BFD_RELOC_16_PCREL:
2338       size = 2;
2339       break;
2340
2341     case BFD_RELOC_32:
2342     case BFD_RELOC_32_PCREL:
2343       size = 4;
2344       break;
2345
2346     case BFD_RELOC_VTABLE_INHERIT:
2347     case BFD_RELOC_VTABLE_ENTRY:
2348       fixP->fx_done = 0;
2349       return;
2350
2351     case BFD_RELOC_NONE:
2352     default:
2353       as_bad_where (fixP->fx_file, fixP->fx_line,
2354                    _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
2355     }
2356
2357   md_number_to_chars (fixpos, value, size);
2358
2359   /* If a symbol remains, pass the fixup, as a reloc, onto the linker.  */
2360   if (fixP->fx_addsy == NULL)
2361     fixP->fx_done = 1;
2362 }
2363
2364 /* Return zero if the fixup in fixp should be left alone and not
2365    adjusted.  */
2366
2367 bfd_boolean
2368 mn10300_fix_adjustable (fixp)
2369      struct fix *fixp;
2370 {
2371   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2372       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2373     return 0;
2374
2375   /* Do not adjust relocations involving symbols in code sections,
2376      because it breaks linker relaxations.  This could be fixed in the
2377      linker, but this fix is simpler, and it pretty much only affects
2378      object size a little bit.  */
2379   if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
2380     return 0;
2381
2382   return 1;
2383 }
2384
2385 /* Insert an operand value into an instruction.  */
2386
2387 static void
2388 mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
2389      unsigned long *insnp;
2390      unsigned long *extensionp;
2391      const struct mn10300_operand *operand;
2392      offsetT val;
2393      char *file;
2394      unsigned int line;
2395      unsigned int shift;
2396 {
2397   /* No need to check 32bit operands for a bit.  Note that
2398      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2399   if (operand->bits != 32
2400       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2401     {
2402       long min, max;
2403       offsetT test;
2404       int bits;
2405
2406       bits = operand->bits;
2407       if (operand->flags & MN10300_OPERAND_24BIT)
2408         bits = 24;
2409
2410       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2411         {
2412           max = (1 << (bits - 1)) - 1;
2413           min = - (1 << (bits - 1));
2414         }
2415       else
2416         {
2417           max = (1 << bits) - 1;
2418           min = 0;
2419         }
2420
2421       test = val;
2422
2423       if (test < (offsetT) min || test > (offsetT) max)
2424         {
2425           const char *err =
2426             _("operand out of range (%s not between %ld and %ld)");
2427           char buf[100];
2428
2429           sprint_value (buf, test);
2430           if (file == (char *) NULL)
2431             as_warn (err, buf, min, max);
2432           else
2433             as_warn_where (file, line, err, buf, min, max);
2434         }
2435     }
2436
2437   if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2438     {
2439       *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
2440       *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
2441                       << operand->shift);
2442     }
2443   else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2444     {
2445       *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
2446       *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
2447                       << operand->shift);
2448     }
2449   else if ((operand->flags & (MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG)))
2450     {
2451       /* See devo/opcodes/m10300-opc.c just before #define FSM0 for an
2452          explanation of these variables.  Note that FMT-implied shifts
2453         are not taken into account for FP registers.  */
2454       unsigned long mask_low, mask_high;
2455       int shl_low, shr_high, shl_high;
2456
2457       switch (operand->bits)
2458         {
2459         case 5:
2460           /* Handle regular FP registers.  */
2461           if (operand->shift >= 0)
2462             {
2463               /* This is an `m' register.  */
2464               shl_low = operand->shift;
2465               shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
2466             }
2467           else
2468             {
2469               /* This is an `n' register.  */
2470               shl_low = -operand->shift;
2471               shl_high = shl_low / 4;
2472             }
2473
2474           mask_low = 0x0f;
2475           mask_high = 0x10;
2476           shr_high = 4;
2477           break;
2478
2479         case 3:
2480           /* Handle accumulators.  */
2481           shl_low = -operand->shift;
2482           shl_high = 0;
2483           mask_low = 0x03;
2484           mask_high = 0x04;
2485           shr_high = 2;
2486           break;
2487
2488         default:
2489           abort ();
2490         }
2491       *insnp |= ((((val & mask_high) >> shr_high) << shl_high)
2492                  | ((val & mask_low) << shl_low));
2493     }
2494   else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
2495     {
2496       *insnp |= (((long) val & ((1 << operand->bits) - 1))
2497                  << (operand->shift + shift));
2498
2499       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2500         *insnp |= (((long) val & ((1 << operand->bits) - 1))
2501                    << (operand->shift + shift + operand->bits));
2502     }
2503   else
2504     {
2505       *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2506                       << (operand->shift + shift));
2507
2508       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2509         *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2510                         << (operand->shift + shift + operand->bits));
2511     }
2512 }
2513
2514 static unsigned long
2515 check_operand (insn, operand, val)
2516      unsigned long insn ATTRIBUTE_UNUSED;
2517      const struct mn10300_operand *operand;
2518      offsetT val;
2519 {
2520   /* No need to check 32bit operands for a bit.  Note that
2521      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2522   if (operand->bits != 32
2523       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2524     {
2525       long min, max;
2526       offsetT test;
2527       int bits;
2528
2529       bits = operand->bits;
2530       if (operand->flags & MN10300_OPERAND_24BIT)
2531         bits = 24;
2532
2533       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2534         {
2535           max = (1 << (bits - 1)) - 1;
2536           min = - (1 << (bits - 1));
2537         }
2538       else
2539         {
2540           max = (1 << bits) - 1;
2541           min = 0;
2542         }
2543
2544       test = val;
2545
2546       if (test < (offsetT) min || test > (offsetT) max)
2547         return 0;
2548       else
2549         return 1;
2550     }
2551   return 1;
2552 }
2553
2554 static void
2555 set_arch_mach (mach)
2556      int mach;
2557 {
2558   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
2559     as_warn (_("could not set architecture and machine"));
2560
2561   current_machine = mach;
2562 }