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