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