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