2000-08-31 Eric Christopher <echristo@cygnus.com>
[external/binutils.git] / gas / config / tc-mn10300.c
1 /* tc-mn10300.c -- Assembler code for the Matsushita 10300
2    Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation.
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 2, 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, 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 #include <stdio.h>
22 #include <ctype.h>
23 #include "as.h"
24 #include "subsegs.h"
25 #include "opcode/mn10300.h"
26 #include "dwarf2dbg.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 struct dwarf2_line_info debug_line;
36
37 /* Generic assembler global variables which must be defined by all
38    targets.  */
39
40 /* Characters which always start a comment.  */
41 const char comment_chars[] = "#";
42
43 /* Characters which start a comment at the beginning of a line.  */
44 const char line_comment_chars[] = ";#";
45
46 /* Characters which may be used to separate multiple commands on a
47    single line.  */
48 const char line_separator_chars[] = ";";
49
50 /* Characters which are used to indicate an exponent in a floating
51    point number.  */
52 const char EXP_CHARS[] = "eE";
53
54 /* Characters which mean that a number is a floating point constant,
55    as in 0d1.0.  */
56 const char FLT_CHARS[] = "dD";
57 \f
58 const relax_typeS md_relax_table[] = {
59   /* bCC relaxing  */
60   {0x7f, -0x80, 2, 1},
61   {0x7fff, -0x8000, 5, 2},
62   {0x7fffffff, -0x80000000, 7, 0},
63
64   /* bCC relaxing (uncommon cases)  */
65   {0x7f, -0x80, 3, 4},
66   {0x7fff, -0x8000, 6, 5},
67   {0x7fffffff, -0x80000000, 8, 0},
68
69   /* call relaxing  */
70   {0x7fff, -0x8000, 5, 7},
71   {0x7fffffff, -0x80000000, 7, 0},
72
73   /* calls relaxing  */
74   {0x7fff, -0x8000, 4, 9},
75   {0x7fffffff, -0x80000000, 6, 0},
76
77   /* jmp relaxing  */
78   {0x7f, -0x80, 2, 11},
79   {0x7fff, -0x8000, 3, 12},
80   {0x7fffffff, -0x80000000, 5, 0},
81
82 };
83
84 /* Local functions.  */
85 static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
86                                             const struct mn10300_operand *,
87                                             offsetT, char *, unsigned,
88                                             unsigned));
89 static unsigned long check_operand PARAMS ((unsigned long,
90                                             const struct mn10300_operand *,
91                                             offsetT));
92 static int reg_name_search PARAMS ((const struct reg_name *, int, const char *));
93 static boolean data_register_name PARAMS ((expressionS *expressionP));
94 static boolean address_register_name PARAMS ((expressionS *expressionP));
95 static boolean other_register_name PARAMS ((expressionS *expressionP));
96 static void set_arch_mach PARAMS ((int));
97
98 static int current_machine;
99
100 /* Fixups.  */
101 #define MAX_INSN_FIXUPS (5)
102 struct mn10300_fixup
103 {
104   expressionS exp;
105   int opindex;
106   bfd_reloc_code_real_type reloc;
107 };
108 struct mn10300_fixup fixups[MAX_INSN_FIXUPS];
109 static int fc;
110
111 /* We must store the value of each register operand so that we can
112    verify that certain registers do not match.  */
113 int mn10300_reg_operands[MN10300_MAX_OPERANDS];
114 \f
115 const char *md_shortopts = "";
116 struct option md_longopts[] = {
117   {NULL, no_argument, NULL, 0}
118 };
119 size_t md_longopts_size = sizeof (md_longopts);
120
121 /* The target specific pseudo-ops which we support.  */
122 const pseudo_typeS md_pseudo_table[] =
123 {
124   { "file",     dwarf2_directive_file,  0 },
125   { "loc",      dwarf2_directive_loc,   0 },
126   { "am30",     set_arch_mach,          AM30 },
127   { "am33",     set_arch_mach,          AM33 },
128   { "mn10300",  set_arch_mach,          MN103 },
129   {NULL, 0, 0}
130 };
131
132 #define HAVE_AM33 (current_machine == AM33)
133 #define HAVE_AM30 (current_machine == AM30)
134
135 /* Opcode hash table.  */
136 static struct hash_control *mn10300_hash;
137
138 /* This table is sorted. Suitable for searching by a binary search.  */
139 static const struct reg_name data_registers[] =
140 {
141   { "d0", 0 },
142   { "d1", 1 },
143   { "d2", 2 },
144   { "d3", 3 },
145 };
146 #define DATA_REG_NAME_CNT                               \
147   (sizeof (data_registers) / sizeof (struct reg_name))
148
149 static const struct reg_name address_registers[] =
150 {
151   { "a0", 0 },
152   { "a1", 1 },
153   { "a2", 2 },
154   { "a3", 3 },
155 };
156
157 #define ADDRESS_REG_NAME_CNT                                    \
158   (sizeof (address_registers) / sizeof (struct reg_name))
159
160 static const struct reg_name r_registers[] =
161 {
162   { "a0", 8 },
163   { "a1", 9 },
164   { "a2", 10 },
165   { "a3", 11 },
166   { "d0", 12 },
167   { "d1", 13 },
168   { "d2", 14 },
169   { "d3", 15 },
170   { "e0", 0 },
171   { "e1", 1 },
172   { "e10", 10 },
173   { "e11", 11 },
174   { "e12", 12 },
175   { "e13", 13 },
176   { "e14", 14 },
177   { "e15", 15 },
178   { "e2", 2 },
179   { "e3", 3 },
180   { "e4", 4 },
181   { "e5", 5 },
182   { "e6", 6 },
183   { "e7", 7 },
184   { "e8", 8 },
185   { "e9", 9 },
186   { "r0", 0 },
187   { "r1", 1 },
188   { "r10", 10 },
189   { "r11", 11 },
190   { "r12", 12 },
191   { "r13", 13 },
192   { "r14", 14 },
193   { "r15", 15 },
194   { "r2", 2 },
195   { "r3", 3 },
196   { "r4", 4 },
197   { "r5", 5 },
198   { "r6", 6 },
199   { "r7", 7 },
200   { "r8", 8 },
201   { "r9", 9 },
202 };
203
204 #define R_REG_NAME_CNT                                  \
205   (sizeof (r_registers) / sizeof (struct reg_name))
206
207 static const struct reg_name xr_registers[] =
208 {
209   { "mcrh", 2 },
210   { "mcrl", 3 },
211   { "mcvf", 4 },
212   { "mdrq", 1 },
213   { "sp", 0 },
214   { "xr0", 0 },
215   { "xr1", 1 },
216   { "xr10", 10 },
217   { "xr11", 11 },
218   { "xr12", 12 },
219   { "xr13", 13 },
220   { "xr14", 14 },
221   { "xr15", 15 },
222   { "xr2", 2 },
223   { "xr3", 3 },
224   { "xr4", 4 },
225   { "xr5", 5 },
226   { "xr6", 6 },
227   { "xr7", 7 },
228   { "xr8", 8 },
229   { "xr9", 9 },
230 };
231
232 #define XR_REG_NAME_CNT                                 \
233   (sizeof (xr_registers) / sizeof (struct reg_name))
234
235 static const struct reg_name other_registers[] =
236 {
237   { "mdr", 0 },
238   { "psw", 0 },
239   { "sp", 0 },
240 };
241
242 #define OTHER_REG_NAME_CNT                              \
243   (sizeof (other_registers) / sizeof (struct reg_name))
244
245 /* reg_name_search does a binary search of the given register table
246    to see if "name" is a valid regiter name.  Returns the register
247    number from the array on success, or -1 on failure.  */
248
249 static int
250 reg_name_search (regs, regcount, name)
251      const struct reg_name *regs;
252      int regcount;
253      const char *name;
254 {
255   int middle, low, high;
256   int cmp;
257
258   low = 0;
259   high = regcount - 1;
260
261   do
262     {
263       middle = (low + high) / 2;
264       cmp = strcasecmp (name, regs[middle].name);
265       if (cmp < 0)
266         high = middle - 1;
267       else if (cmp > 0)
268         low = middle + 1;
269       else
270         return regs[middle].value;
271     }
272   while (low <= high);
273   return -1;
274 }
275
276 /* Summary of register_name().
277  *
278  * in: Input_line_pointer points to 1st char of operand.
279  *
280  * out: A expressionS.
281  *      The operand may have been a register: in this case, X_op == O_register,
282  *      X_add_number is set to the register number, and truth is returned.
283  *      Input_line_pointer->(next non-blank) char after operand, or is in
284  *      its original state.
285  */
286
287 static boolean
288 r_register_name (expressionP)
289      expressionS *expressionP;
290 {
291   int reg_number;
292   char *name;
293   char *start;
294   char c;
295
296   /* Find the spelling of the operand.  */
297   start = name = input_line_pointer;
298
299   c = get_symbol_end ();
300   reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
301
302   /* Look to see if it's in the register table.  */
303   if (reg_number >= 0)
304     {
305       expressionP->X_op = O_register;
306       expressionP->X_add_number = reg_number;
307
308       /* Make the rest nice.  */
309       expressionP->X_add_symbol = NULL;
310       expressionP->X_op_symbol = NULL;
311
312       /* Put back the delimiting char.  */
313       *input_line_pointer = c;
314       return true;
315     }
316   else
317     {
318       /* Reset the line as if we had not done anything.  */
319       /* Put back the delimiting char.  */
320       *input_line_pointer = c;
321
322       /* Reset input_line pointer.  */
323       input_line_pointer = start;
324       return false;
325     }
326 }
327
328 /* Summary of register_name().
329  *
330  * in: Input_line_pointer points to 1st char of operand.
331  *
332  * out: A expressionS.
333  *      The operand may have been a register: in this case, X_op == O_register,
334  *      X_add_number is set to the register number, and truth is returned.
335  *      Input_line_pointer->(next non-blank) char after operand, or is in
336  *      its original state.
337  */
338
339 static boolean
340 xr_register_name (expressionP)
341      expressionS *expressionP;
342 {
343   int reg_number;
344   char *name;
345   char *start;
346   char c;
347
348   /* Find the spelling of the operand.  */
349   start = name = input_line_pointer;
350
351   c = get_symbol_end ();
352   reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
353
354   /* Look to see if it's in the register table.  */
355   if (reg_number >= 0)
356     {
357       expressionP->X_op = O_register;
358       expressionP->X_add_number = reg_number;
359
360       /* Make the rest nice.  */
361       expressionP->X_add_symbol = NULL;
362       expressionP->X_op_symbol = NULL;
363
364       /* Put back the delimiting char.  */
365       *input_line_pointer = c;
366       return true;
367     }
368   else
369     {
370       /* Reset the line as if we had not done anything.  */
371       /* Put back the delimiting char.  */
372       *input_line_pointer = c;
373
374       /* Reset input_line pointer.  */
375       input_line_pointer = start;
376       return false;
377     }
378 }
379
380 /* Summary of register_name().
381  *
382  * in: Input_line_pointer points to 1st char of operand.
383  *
384  * out: A expressionS.
385  *      The operand may have been a register: in this case, X_op == O_register,
386  *      X_add_number is set to the register number, and truth is returned.
387  *      Input_line_pointer->(next non-blank) char after operand, or is in
388  *      its original state.
389  */
390
391 static boolean
392 data_register_name (expressionP)
393      expressionS *expressionP;
394 {
395   int reg_number;
396   char *name;
397   char *start;
398   char c;
399
400   /* Find the spelling of the operand.  */
401   start = name = input_line_pointer;
402
403   c = get_symbol_end ();
404   reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
405
406   /* Look to see if it's in the register table.  */
407   if (reg_number >= 0)
408     {
409       expressionP->X_op = O_register;
410       expressionP->X_add_number = reg_number;
411
412       /* Make the rest nice.  */
413       expressionP->X_add_symbol = NULL;
414       expressionP->X_op_symbol = NULL;
415
416       /* Put back the delimiting char.  */
417       *input_line_pointer = c;
418       return true;
419     }
420   else
421     {
422       /* Reset the line as if we had not done anything.  */
423       /* Put back the delimiting char.  */
424       *input_line_pointer = c;
425
426       /* Reset input_line pointer.  */
427       input_line_pointer = start;
428       return false;
429     }
430 }
431
432 /* Summary of register_name().
433  *
434  * in: Input_line_pointer points to 1st char of operand.
435  *
436  * out: A expressionS.
437  *      The operand may have been a register: in this case, X_op == O_register,
438  *      X_add_number is set to the register number, and truth is returned.
439  *      Input_line_pointer->(next non-blank) char after operand, or is in
440  *      its original state.
441  */
442
443 static boolean
444 address_register_name (expressionP)
445      expressionS *expressionP;
446 {
447   int reg_number;
448   char *name;
449   char *start;
450   char c;
451
452   /* Find the spelling of the operand.  */
453   start = name = input_line_pointer;
454
455   c = get_symbol_end ();
456   reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
457
458   /* Look to see if it's in the register table.  */
459   if (reg_number >= 0)
460     {
461       expressionP->X_op = O_register;
462       expressionP->X_add_number = reg_number;
463
464       /* Make the rest nice.  */
465       expressionP->X_add_symbol = NULL;
466       expressionP->X_op_symbol = NULL;
467
468       /* Put back the delimiting char.  */
469       *input_line_pointer = c;
470       return true;
471     }
472   else
473     {
474       /* Reset the line as if we had not done anything.  */
475       /* Put back the delimiting char.  */
476       *input_line_pointer = c;
477
478       /* Reset input_line pointer.  */
479       input_line_pointer = start;
480
481       return false;
482     }
483 }
484
485 /* Summary of register_name().
486  *
487  * in: Input_line_pointer points to 1st char of operand.
488  *
489  * out: A expressionS.
490  *      The operand may have been a register: in this case, X_op == O_register,
491  *      X_add_number is set to the register number, and truth is returned.
492  *      Input_line_pointer->(next non-blank) char after operand, or is in
493  *      its original state.
494  */
495
496 static boolean
497 other_register_name (expressionP)
498      expressionS *expressionP;
499 {
500   int reg_number;
501   char *name;
502   char *start;
503   char c;
504
505   /* Find the spelling of the operand.  */
506   start = name = input_line_pointer;
507
508   c = get_symbol_end ();
509   reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
510
511   /* Look to see if it's in the register table.  */
512   if (reg_number >= 0)
513     {
514       expressionP->X_op = O_register;
515       expressionP->X_add_number = reg_number;
516
517       /* Make the rest nice.  */
518       expressionP->X_add_symbol = NULL;
519       expressionP->X_op_symbol = NULL;
520
521       /* Put back the delimiting char.  */
522       *input_line_pointer = c;
523       return true;
524     }
525   else
526     {
527       /* Reset the line as if we had not done anything.  */
528       /* Put back the delimiting char.  */
529       *input_line_pointer = c;
530
531       /* Reset input_line pointer.  */
532       input_line_pointer = start;
533       return false;
534     }
535 }
536
537 void
538 md_show_usage (stream)
539      FILE *stream;
540 {
541   fprintf (stream, _("MN10300 options:\n\
542 none yet\n"));
543 }
544
545 int
546 md_parse_option (c, arg)
547      int c ATTRIBUTE_UNUSED;
548      char *arg ATTRIBUTE_UNUSED;
549 {
550   return 0;
551 }
552
553 symbolS *
554 md_undefined_symbol (name)
555      char *name ATTRIBUTE_UNUSED;
556 {
557   return 0;
558 }
559
560 char *
561 md_atof (type, litp, sizep)
562      int type;
563      char *litp;
564      int *sizep;
565 {
566   int prec;
567   LITTLENUM_TYPE words[4];
568   char *t;
569   int i;
570
571   switch (type)
572     {
573     case 'f':
574       prec = 2;
575       break;
576
577     case 'd':
578       prec = 4;
579       break;
580
581     default:
582       *sizep = 0;
583       return "bad call to md_atof";
584     }
585
586   t = atof_ieee (input_line_pointer, type, words);
587   if (t)
588     input_line_pointer = t;
589
590   *sizep = prec * 2;
591
592   for (i = prec - 1; i >= 0; i--)
593     {
594       md_number_to_chars (litp, (valueT) words[i], 2);
595       litp += 2;
596     }
597
598   return NULL;
599 }
600
601 void
602 md_convert_frag (abfd, sec, fragP)
603      bfd *abfd ATTRIBUTE_UNUSED;
604      asection *sec;
605      fragS *fragP;
606 {
607   static unsigned long label_count = 0;
608   char buf[40];
609
610   subseg_change (sec, 0);
611   if (fragP->fr_subtype == 0)
612     {
613       fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
614                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
615       fragP->fr_var = 0;
616       fragP->fr_fix += 2;
617     }
618   else if (fragP->fr_subtype == 1)
619     {
620       /* Reverse the condition of the first branch.  */
621       int offset = fragP->fr_fix;
622       int opcode = fragP->fr_literal[offset] & 0xff;
623
624       switch (opcode)
625         {
626         case 0xc8:
627           opcode = 0xc9;
628           break;
629         case 0xc9:
630           opcode = 0xc8;
631           break;
632         case 0xc0:
633           opcode = 0xc2;
634           break;
635         case 0xc2:
636           opcode = 0xc0;
637           break;
638         case 0xc3:
639           opcode = 0xc1;
640           break;
641         case 0xc1:
642           opcode = 0xc3;
643           break;
644         case 0xc4:
645           opcode = 0xc6;
646           break;
647         case 0xc6:
648           opcode = 0xc4;
649           break;
650         case 0xc7:
651           opcode = 0xc5;
652           break;
653         case 0xc5:
654           opcode = 0xc7;
655           break;
656         default:
657           abort ();
658         }
659       fragP->fr_literal[offset] = 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 + 1, 1,
664                symbol_new (buf, sec, 0, fragP->fr_next),
665                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
666
667       /* Now create the unconditional branch + fixup to the
668          final target.  */
669       fragP->fr_literal[offset + 2] = 0xcc;
670       fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol,
671                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
672       fragP->fr_var = 0;
673       fragP->fr_fix += 5;
674     }
675   else if (fragP->fr_subtype == 2)
676     {
677       /* Reverse the condition of the first branch.  */
678       int offset = fragP->fr_fix;
679       int opcode = fragP->fr_literal[offset] & 0xff;
680
681       switch (opcode)
682         {
683         case 0xc8:
684           opcode = 0xc9;
685           break;
686         case 0xc9:
687           opcode = 0xc8;
688           break;
689         case 0xc0:
690           opcode = 0xc2;
691           break;
692         case 0xc2:
693           opcode = 0xc0;
694           break;
695         case 0xc3:
696           opcode = 0xc1;
697           break;
698         case 0xc1:
699           opcode = 0xc3;
700           break;
701         case 0xc4:
702           opcode = 0xc6;
703           break;
704         case 0xc6:
705           opcode = 0xc4;
706           break;
707         case 0xc7:
708           opcode = 0xc5;
709           break;
710         case 0xc5:
711           opcode = 0xc7;
712           break;
713         default:
714           abort ();
715         }
716       fragP->fr_literal[offset] = opcode;
717
718       /* Create a fixup for the reversed conditional branch.  */
719       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
720       fix_new (fragP, fragP->fr_fix + 1, 1,
721                symbol_new (buf, sec, 0, fragP->fr_next),
722                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
723
724       /* Now create the unconditional branch + fixup to the
725          final target.  */
726       fragP->fr_literal[offset + 2] = 0xdc;
727       fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
728                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
729       fragP->fr_var = 0;
730       fragP->fr_fix += 7;
731     }
732   else if (fragP->fr_subtype == 3)
733     {
734       fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
735                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
736       fragP->fr_var = 0;
737       fragP->fr_fix += 3;
738     }
739   else if (fragP->fr_subtype == 4)
740     {
741       /* Reverse the condition of the first branch.  */
742       int offset = fragP->fr_fix;
743       int opcode = fragP->fr_literal[offset + 1] & 0xff;
744
745       switch (opcode)
746         {
747         case 0xe8:
748           opcode = 0xe9;
749           break;
750         case 0xe9:
751           opcode = 0xe8;
752           break;
753         case 0xea:
754           opcode = 0xeb;
755           break;
756         case 0xeb:
757           opcode = 0xea;
758           break;
759         default:
760           abort ();
761         }
762       fragP->fr_literal[offset + 1] = opcode;
763
764       /* Create a fixup for the reversed conditional branch.  */
765       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
766       fix_new (fragP, fragP->fr_fix + 2, 1,
767                symbol_new (buf, sec, 0, fragP->fr_next),
768                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
769
770       /* Now create the unconditional branch + fixup to the
771          final target.  */
772       fragP->fr_literal[offset + 3] = 0xcc;
773       fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
774                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
775       fragP->fr_var = 0;
776       fragP->fr_fix += 6;
777     }
778   else if (fragP->fr_subtype == 5)
779     {
780       /* Reverse the condition of the first branch.  */
781       int offset = fragP->fr_fix;
782       int opcode = fragP->fr_literal[offset + 1] & 0xff;
783
784       switch (opcode)
785         {
786         case 0xe8:
787           opcode = 0xe9;
788           break;
789         case 0xea:
790           opcode = 0xeb;
791           break;
792         case 0xeb:
793           opcode = 0xea;
794           break;
795         default:
796           abort ();
797         }
798       fragP->fr_literal[offset + 1] = opcode;
799
800       /* Create a fixup for the reversed conditional branch.  */
801       sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
802       fix_new (fragP, fragP->fr_fix + 2, 1,
803                symbol_new (buf, sec, 0, fragP->fr_next),
804                fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
805
806       /* Now create the unconditional branch + fixup to the
807          final target.  */
808       fragP->fr_literal[offset + 3] = 0xdc;
809       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
810                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
811       fragP->fr_var = 0;
812       fragP->fr_fix += 8;
813     }
814   else if (fragP->fr_subtype == 6)
815     {
816       int offset = fragP->fr_fix;
817       fragP->fr_literal[offset] = 0xcd;
818       fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
819                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
820       fragP->fr_var = 0;
821       fragP->fr_fix += 5;
822     }
823   else if (fragP->fr_subtype == 7)
824     {
825       int offset = fragP->fr_fix;
826       fragP->fr_literal[offset] = 0xdd;
827       fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3];
828       fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4];
829
830       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
831                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
832       fragP->fr_var = 0;
833       fragP->fr_fix += 7;
834     }
835   else if (fragP->fr_subtype == 8)
836     {
837       int offset = fragP->fr_fix;
838       fragP->fr_literal[offset] = 0xfa;
839       fragP->fr_literal[offset + 1] = 0xff;
840       fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
841                fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL);
842       fragP->fr_var = 0;
843       fragP->fr_fix += 4;
844     }
845   else if (fragP->fr_subtype == 9)
846     {
847       int offset = fragP->fr_fix;
848       fragP->fr_literal[offset] = 0xfc;
849       fragP->fr_literal[offset + 1] = 0xff;
850
851       fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
852                fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL);
853       fragP->fr_var = 0;
854       fragP->fr_fix += 6;
855     }
856   else if (fragP->fr_subtype == 10)
857     {
858       fragP->fr_literal[fragP->fr_fix] = 0xca;
859       fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
860                fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
861       fragP->fr_var = 0;
862       fragP->fr_fix += 2;
863     }
864   else if (fragP->fr_subtype == 11)
865     {
866       int offset = fragP->fr_fix;
867       fragP->fr_literal[offset] = 0xcc;
868
869       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
870                fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
871       fragP->fr_var = 0;
872       fragP->fr_fix += 3;
873     }
874   else if (fragP->fr_subtype == 12)
875     {
876       int offset = fragP->fr_fix;
877       fragP->fr_literal[offset] = 0xdc;
878
879       fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
880                fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
881       fragP->fr_var = 0;
882       fragP->fr_fix += 5;
883     }
884   else
885     abort ();
886 }
887
888 valueT
889 md_section_align (seg, addr)
890      asection *seg;
891      valueT addr;
892 {
893   int align = bfd_get_section_alignment (stdoutput, seg);
894   return ((addr + (1 << align) - 1) & (-1 << align));
895 }
896
897 void
898 md_begin ()
899 {
900   char *prev_name = "";
901   register const struct mn10300_opcode *op;
902
903   mn10300_hash = hash_new ();
904
905   /* Insert unique names into hash table.  The MN10300 instruction set
906      has many identical opcode names that have different opcodes based
907      on the operands.  This hash table then provides a quick index to
908      the first opcode with a particular name in the opcode table.  */
909
910   op = mn10300_opcodes;
911   while (op->name)
912     {
913       if (strcmp (prev_name, op->name))
914         {
915           prev_name = (char *) op->name;
916           hash_insert (mn10300_hash, op->name, (char *) op);
917         }
918       op++;
919     }
920
921   /* This is both a simplification (we don't have to write md_apply_fix)
922      and support for future optimizations (branch shortening and similar
923      stuff in the linker).  */
924   linkrelax = 1;
925
926   /* Set the default machine type.  */
927   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
928     as_warn (_("could not set architecture and machine"));
929
930   current_machine = MN103;
931 }
932
933 void
934 md_assemble (str)
935      char *str;
936 {
937   char *s;
938   struct mn10300_opcode *opcode;
939   struct mn10300_opcode *next_opcode;
940   const unsigned char *opindex_ptr;
941   int next_opindex, relaxable;
942   unsigned long insn, extension, size = 0, real_size;
943   char *f;
944   int i;
945   int match;
946
947   /* Get the opcode.  */
948   for (s = str; *s != '\0' && !isspace (*s); s++)
949     ;
950   if (*s != '\0')
951     *s++ = '\0';
952
953   /* Find the first opcode with the proper name.  */
954   opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
955   if (opcode == NULL)
956     {
957       as_bad (_("Unrecognized opcode: `%s'"), str);
958       return;
959     }
960
961   str = s;
962   while (isspace (*str))
963     ++str;
964
965   input_line_pointer = str;
966
967   for (;;)
968     {
969       const char *errmsg;
970       int op_idx;
971       char *hold;
972       int extra_shift = 0;
973
974       errmsg = _("Invalid opcode/operands");
975
976       /* Reset the array of register operands.  */
977       memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
978
979       relaxable = 0;
980       fc = 0;
981       match = 0;
982       next_opindex = 0;
983       insn = opcode->opcode;
984       extension = 0;
985
986       /* If the instruction is not available on the current machine
987          then it can not possibly match.  */
988       if (opcode->machine
989           && !(opcode->machine == AM33 && HAVE_AM33)
990           && !(opcode->machine == AM30 && HAVE_AM30))
991         goto error;
992
993       for (op_idx = 1, opindex_ptr = opcode->operands;
994            *opindex_ptr != 0;
995            opindex_ptr++, op_idx++)
996         {
997           const struct mn10300_operand *operand;
998           expressionS ex;
999
1000           if (next_opindex == 0)
1001             {
1002               operand = &mn10300_operands[*opindex_ptr];
1003             }
1004           else
1005             {
1006               operand = &mn10300_operands[next_opindex];
1007               next_opindex = 0;
1008             }
1009
1010           while (*str == ' ' || *str == ',')
1011             ++str;
1012
1013           if (operand->flags & MN10300_OPERAND_RELAX)
1014             relaxable = 1;
1015
1016           /* Gather the operand.  */
1017           hold = input_line_pointer;
1018           input_line_pointer = str;
1019
1020           if (operand->flags & MN10300_OPERAND_PAREN)
1021             {
1022               if (*input_line_pointer != ')' && *input_line_pointer != '(')
1023                 {
1024                   input_line_pointer = hold;
1025                   str = hold;
1026                   goto error;
1027                 }
1028               input_line_pointer++;
1029               goto keep_going;
1030             }
1031           /* See if we can match the operands.  */
1032           else if (operand->flags & MN10300_OPERAND_DREG)
1033             {
1034               if (!data_register_name (&ex))
1035                 {
1036                   input_line_pointer = hold;
1037                   str = hold;
1038                   goto error;
1039                 }
1040             }
1041           else if (operand->flags & MN10300_OPERAND_AREG)
1042             {
1043               if (!address_register_name (&ex))
1044                 {
1045                   input_line_pointer = hold;
1046                   str = hold;
1047                   goto error;
1048                 }
1049             }
1050           else if (operand->flags & MN10300_OPERAND_SP)
1051             {
1052               char *start = input_line_pointer;
1053               char c = get_symbol_end ();
1054
1055               if (strcasecmp (start, "sp") != 0)
1056                 {
1057                   *input_line_pointer = c;
1058                   input_line_pointer = hold;
1059                   str = hold;
1060                   goto error;
1061                 }
1062               *input_line_pointer = c;
1063               goto keep_going;
1064             }
1065           else if (operand->flags & MN10300_OPERAND_RREG)
1066             {
1067               if (!r_register_name (&ex))
1068                 {
1069                   input_line_pointer = hold;
1070                   str = hold;
1071                   goto error;
1072                 }
1073             }
1074           else if (operand->flags & MN10300_OPERAND_XRREG)
1075             {
1076               if (!xr_register_name (&ex))
1077                 {
1078                   input_line_pointer = hold;
1079                   str = hold;
1080                   goto error;
1081                 }
1082             }
1083           else if (operand->flags & MN10300_OPERAND_USP)
1084             {
1085               char *start = input_line_pointer;
1086               char c = get_symbol_end ();
1087
1088               if (strcasecmp (start, "usp") != 0)
1089                 {
1090                   *input_line_pointer = c;
1091                   input_line_pointer = hold;
1092                   str = hold;
1093                   goto error;
1094                 }
1095               *input_line_pointer = c;
1096               goto keep_going;
1097             }
1098           else if (operand->flags & MN10300_OPERAND_SSP)
1099             {
1100               char *start = input_line_pointer;
1101               char c = get_symbol_end ();
1102
1103               if (strcasecmp (start, "ssp") != 0)
1104                 {
1105                   *input_line_pointer = c;
1106                   input_line_pointer = hold;
1107                   str = hold;
1108                   goto error;
1109                 }
1110               *input_line_pointer = c;
1111               goto keep_going;
1112             }
1113           else if (operand->flags & MN10300_OPERAND_MSP)
1114             {
1115               char *start = input_line_pointer;
1116               char c = get_symbol_end ();
1117
1118               if (strcasecmp (start, "msp") != 0)
1119                 {
1120                   *input_line_pointer = c;
1121                   input_line_pointer = hold;
1122                   str = hold;
1123                   goto error;
1124                 }
1125               *input_line_pointer = c;
1126               goto keep_going;
1127             }
1128           else if (operand->flags & MN10300_OPERAND_PC)
1129             {
1130               char *start = input_line_pointer;
1131               char c = get_symbol_end ();
1132
1133               if (strcasecmp (start, "pc") != 0)
1134                 {
1135                   *input_line_pointer = c;
1136                   input_line_pointer = hold;
1137                   str = hold;
1138                   goto error;
1139                 }
1140               *input_line_pointer = c;
1141               goto keep_going;
1142             }
1143           else if (operand->flags & MN10300_OPERAND_EPSW)
1144             {
1145               char *start = input_line_pointer;
1146               char c = get_symbol_end ();
1147
1148               if (strcasecmp (start, "epsw") != 0)
1149                 {
1150                   *input_line_pointer = c;
1151                   input_line_pointer = hold;
1152                   str = hold;
1153                   goto error;
1154                 }
1155               *input_line_pointer = c;
1156               goto keep_going;
1157             }
1158           else if (operand->flags & MN10300_OPERAND_PLUS)
1159             {
1160               if (*input_line_pointer != '+')
1161                 {
1162                   input_line_pointer = hold;
1163                   str = hold;
1164                   goto error;
1165                 }
1166               input_line_pointer++;
1167               goto keep_going;
1168             }
1169           else if (operand->flags & MN10300_OPERAND_PSW)
1170             {
1171               char *start = input_line_pointer;
1172               char c = get_symbol_end ();
1173
1174               if (strcasecmp (start, "psw") != 0)
1175                 {
1176                   *input_line_pointer = c;
1177                   input_line_pointer = hold;
1178                   str = hold;
1179                   goto error;
1180                 }
1181               *input_line_pointer = c;
1182               goto keep_going;
1183             }
1184           else if (operand->flags & MN10300_OPERAND_MDR)
1185             {
1186               char *start = input_line_pointer;
1187               char c = get_symbol_end ();
1188
1189               if (strcasecmp (start, "mdr") != 0)
1190                 {
1191                   *input_line_pointer = c;
1192                   input_line_pointer = hold;
1193                   str = hold;
1194                   goto error;
1195                 }
1196               *input_line_pointer = c;
1197               goto keep_going;
1198             }
1199           else if (operand->flags & MN10300_OPERAND_REG_LIST)
1200             {
1201               unsigned int value = 0;
1202               if (*input_line_pointer != '[')
1203                 {
1204                   input_line_pointer = hold;
1205                   str = hold;
1206                   goto error;
1207                 }
1208
1209               /* Eat the '['.  */
1210               input_line_pointer++;
1211
1212               /* We used to reject a null register list here; however,
1213                  we accept it now so the compiler can emit "call"
1214                  instructions for all calls to named functions.
1215
1216                  The linker can then fill in the appropriate bits for the
1217                  register list and stack size or change the instruction
1218                  into a "calls" if using "call" is not profitable.  */
1219               while (*input_line_pointer != ']')
1220                 {
1221                   char *start;
1222                   char c;
1223
1224                   if (*input_line_pointer == ',')
1225                     input_line_pointer++;
1226
1227                   start = input_line_pointer;
1228                   c = get_symbol_end ();
1229
1230                   if (strcasecmp (start, "d2") == 0)
1231                     {
1232                       value |= 0x80;
1233                       *input_line_pointer = c;
1234                     }
1235                   else if (strcasecmp (start, "d3") == 0)
1236                     {
1237                       value |= 0x40;
1238                       *input_line_pointer = c;
1239                     }
1240                   else if (strcasecmp (start, "a2") == 0)
1241                     {
1242                       value |= 0x20;
1243                       *input_line_pointer = c;
1244                     }
1245                   else if (strcasecmp (start, "a3") == 0)
1246                     {
1247                       value |= 0x10;
1248                       *input_line_pointer = c;
1249                     }
1250                   else if (strcasecmp (start, "other") == 0)
1251                     {
1252                       value |= 0x08;
1253                       *input_line_pointer = c;
1254                     }
1255                   else if (HAVE_AM33
1256                            && strcasecmp (start, "exreg0") == 0)
1257                     {
1258                       value |= 0x04;
1259                       *input_line_pointer = c;
1260                     }
1261                   else if (HAVE_AM33
1262                            && strcasecmp (start, "exreg1") == 0)
1263                     {
1264                       value |= 0x02;
1265                       *input_line_pointer = c;
1266                     }
1267                   else if (HAVE_AM33
1268                            && strcasecmp (start, "exother") == 0)
1269                     {
1270                       value |= 0x01;
1271                       *input_line_pointer = c;
1272                     }
1273                   else if (HAVE_AM33
1274                            && strcasecmp (start, "all") == 0)
1275                     {
1276                       value |= 0xff;
1277                       *input_line_pointer = c;
1278                     }
1279                   else
1280                     {
1281                       input_line_pointer = hold;
1282                       str = hold;
1283                       goto error;
1284                     }
1285                 }
1286               input_line_pointer++;
1287               mn10300_insert_operand (&insn, &extension, operand,
1288                                       value, (char *) NULL, 0, 0);
1289               goto keep_going;
1290
1291             }
1292           else if (data_register_name (&ex))
1293             {
1294               input_line_pointer = hold;
1295               str = hold;
1296               goto error;
1297             }
1298           else if (address_register_name (&ex))
1299             {
1300               input_line_pointer = hold;
1301               str = hold;
1302               goto error;
1303             }
1304           else if (other_register_name (&ex))
1305             {
1306               input_line_pointer = hold;
1307               str = hold;
1308               goto error;
1309             }
1310           else if (HAVE_AM33 && r_register_name (&ex))
1311             {
1312               input_line_pointer = hold;
1313               str = hold;
1314               goto error;
1315             }
1316           else if (HAVE_AM33 && xr_register_name (&ex))
1317             {
1318               input_line_pointer = hold;
1319               str = hold;
1320               goto error;
1321             }
1322           else if (*str == ')' || *str == '(')
1323             {
1324               input_line_pointer = hold;
1325               str = hold;
1326               goto error;
1327             }
1328           else
1329             {
1330               expression (&ex);
1331             }
1332
1333           switch (ex.X_op)
1334             {
1335             case O_illegal:
1336               errmsg = _("illegal operand");
1337               goto error;
1338             case O_absent:
1339               errmsg = _("missing operand");
1340               goto error;
1341             case O_register:
1342               {
1343                 int mask;
1344
1345                 mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
1346                 if (HAVE_AM33)
1347                   mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
1348                 if ((operand->flags & mask) == 0)
1349                   {
1350                     input_line_pointer = hold;
1351                     str = hold;
1352                     goto error;
1353                   }
1354
1355                 if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
1356                   extra_shift = 8;
1357                 else if (opcode->format == FMT_D2
1358                          || opcode->format == FMT_D4
1359                          || opcode->format == FMT_S2
1360                          || opcode->format == FMT_S4
1361                          || opcode->format == FMT_S6
1362                          || opcode->format == FMT_D5)
1363                   extra_shift = 16;
1364                 else if (opcode->format == FMT_D7)
1365                   extra_shift = 8;
1366                 else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
1367                   extra_shift = 8;
1368                 else
1369                   extra_shift = 0;
1370
1371                 mn10300_insert_operand (&insn, &extension, operand,
1372                                         ex.X_add_number, (char *) NULL,
1373                                         0, extra_shift);
1374
1375                 /* And note the register number in the register array.  */
1376                 mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
1377                 break;
1378               }
1379
1380             case O_constant:
1381               /* If this operand can be promoted, and it doesn't
1382                  fit into the allocated bitfield for this insn,
1383                  then promote it (ie this opcode does not match).  */
1384               if (operand->flags
1385                   & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
1386                   && !check_operand (insn, operand, ex.X_add_number))
1387                 {
1388                   input_line_pointer = hold;
1389                   str = hold;
1390                   goto error;
1391                 }
1392
1393               mn10300_insert_operand (&insn, &extension, operand,
1394                                       ex.X_add_number, (char *) NULL,
1395                                       0, 0);
1396               break;
1397
1398             default:
1399               /* If this operand can be promoted, then this opcode didn't
1400                  match since we can't know if it needed promotion!  */
1401               if (operand->flags & MN10300_OPERAND_PROMOTE)
1402                 {
1403                   input_line_pointer = hold;
1404                   str = hold;
1405                   goto error;
1406                 }
1407
1408               /* We need to generate a fixup for this expression.  */
1409               if (fc >= MAX_INSN_FIXUPS)
1410                 as_fatal (_("too many fixups"));
1411               fixups[fc].exp = ex;
1412               fixups[fc].opindex = *opindex_ptr;
1413               fixups[fc].reloc = BFD_RELOC_UNUSED;
1414               ++fc;
1415               break;
1416             }
1417
1418 keep_going:
1419           str = input_line_pointer;
1420           input_line_pointer = hold;
1421
1422           while (*str == ' ' || *str == ',')
1423             ++str;
1424
1425         }
1426
1427       /* Make sure we used all the operands!  */
1428       if (*str != ',')
1429         match = 1;
1430
1431       /* If this instruction has registers that must not match, verify
1432          that they do indeed not match.  */
1433       if (opcode->no_match_operands)
1434         {
1435           int i;
1436
1437           /* Look at each operand to see if it's marked.  */
1438           for (i = 0; i < MN10300_MAX_OPERANDS; i++)
1439             {
1440               if ((1 << i) & opcode->no_match_operands)
1441                 {
1442                   int j;
1443
1444                   /* operand I is marked.  Check that it does not match any
1445                      operands > I which are marked.  */
1446                   for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
1447                     {
1448                       if (((1 << j) & opcode->no_match_operands)
1449                           && mn10300_reg_operands[i] == mn10300_reg_operands[j])
1450                         {
1451                           errmsg = _("Invalid register specification.");
1452                           match = 0;
1453                           goto error;
1454                         }
1455                     }
1456                 }
1457             }
1458         }
1459
1460     error:
1461       if (match == 0)
1462         {
1463           next_opcode = opcode + 1;
1464           if (!strcmp (next_opcode->name, opcode->name))
1465             {
1466               opcode = next_opcode;
1467               continue;
1468             }
1469
1470           as_bad ("%s", errmsg);
1471           return;
1472         }
1473       break;
1474     }
1475
1476   while (isspace (*str))
1477     ++str;
1478
1479   if (*str != '\0')
1480     as_bad (_("junk at end of line: `%s'"), str);
1481
1482   input_line_pointer = str;
1483
1484   /* Determine the size of the instruction.  */
1485   if (opcode->format == FMT_S0)
1486     size = 1;
1487
1488   if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
1489     size = 2;
1490
1491   if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
1492     size = 3;
1493
1494   if (opcode->format == FMT_D6)
1495     size = 3;
1496
1497   if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
1498     size = 4;
1499
1500   if (opcode->format == FMT_D8)
1501     size = 6;
1502
1503   if (opcode->format == FMT_D9)
1504     size = 7;
1505
1506   if (opcode->format == FMT_S4)
1507     size = 5;
1508
1509   if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
1510     size = 7;
1511
1512   if (opcode->format == FMT_D2)
1513     size = 4;
1514
1515   if (opcode->format == FMT_D4)
1516     size = 6;
1517
1518   real_size = size;
1519
1520   if (relaxable && fc > 0)
1521     {
1522       int type;
1523
1524       /* bCC  */
1525       if (size == 2)
1526         {
1527           /* Handle bra specially.  Basically treat it like jmp so
1528              that we automatically handle 8, 16 and 32 bit offsets
1529              correctly as well as jumps to an undefined address.
1530
1531              It is also important to not treat it like other bCC
1532              instructions since the long forms of bra is different
1533              from other bCC instructions.  */
1534           if (opcode->opcode == 0xca00)
1535             type = 10;
1536           else
1537             type = 0;
1538         }
1539       /* call  */
1540       else if (size == 5)
1541         type = 6;
1542       /* calls  */
1543       else if (size == 4)
1544         type = 8;
1545       /* jmp  */
1546       else if (size == 3 && opcode->opcode == 0xcc0000)
1547         type = 10;
1548       /* bCC (uncommon cases)  */
1549       else
1550         type = 3;
1551
1552       f = frag_var (rs_machine_dependent, 8, 8 - size, type,
1553                     fixups[0].exp.X_add_symbol,
1554                     fixups[0].exp.X_add_number,
1555                     (char *)fixups[0].opindex);
1556
1557       /* This is pretty hokey.  We basically just care about the
1558          opcode, so we have to write out the first word big endian.
1559
1560          The exception is "call", which has two operands that we
1561          care about.
1562
1563          The first operand (the register list) happens to be in the
1564          first instruction word, and will be in the right place if
1565          we output the first word in big endian mode.
1566
1567          The second operand (stack size) is in the extension word,
1568          and we want it to appear as the first character in the extension
1569          word (as it appears in memory).  Luckily, writing the extension
1570          word in big endian format will do what we want.  */
1571       number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
1572       if (size > 8)
1573         {
1574           number_to_chars_bigendian (f + 4, extension, 4);
1575           number_to_chars_bigendian (f + 8, 0, size - 8);
1576         }
1577       else if (size > 4)
1578         number_to_chars_bigendian (f + 4, extension, size - 4);
1579     }
1580   else
1581     {
1582       /* Allocate space for the instruction.  */
1583       f = frag_more (size);
1584
1585       /* Fill in bytes for the instruction.  Note that opcode fields
1586          are written big-endian, 16 & 32bit immediates are written
1587          little endian.  Egad.  */
1588       if (opcode->format == FMT_S0
1589           || opcode->format == FMT_S1
1590           || opcode->format == FMT_D0
1591           || opcode->format == FMT_D6
1592           || opcode->format == FMT_D7
1593           || opcode->format == FMT_D10
1594           || opcode->format == FMT_D1)
1595         {
1596           number_to_chars_bigendian (f, insn, size);
1597         }
1598       else if (opcode->format == FMT_S2
1599                && opcode->opcode != 0xdf0000
1600                && opcode->opcode != 0xde0000)
1601         {
1602           /* A format S2 instruction that is _not_ "ret" and "retf".  */
1603           number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
1604           number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
1605         }
1606       else if (opcode->format == FMT_S2)
1607         {
1608           /* This must be a ret or retf, which is written entirely in
1609              big-endian format.  */
1610           number_to_chars_bigendian (f, insn, 3);
1611         }
1612       else if (opcode->format == FMT_S4
1613                && opcode->opcode != 0xdc000000)
1614         {
1615           /* This must be a format S4 "call" instruction.  What a pain.  */
1616           unsigned long temp = (insn >> 8) & 0xffff;
1617           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1618           number_to_chars_littleendian (f + 1, temp, 2);
1619           number_to_chars_bigendian (f + 3, insn & 0xff, 1);
1620           number_to_chars_bigendian (f + 4, extension & 0xff, 1);
1621         }
1622       else if (opcode->format == FMT_S4)
1623         {
1624           /* This must be a format S4 "jmp" instruction.  */
1625           unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
1626           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1627           number_to_chars_littleendian (f + 1, temp, 4);
1628         }
1629       else if (opcode->format == FMT_S6)
1630         {
1631           unsigned long temp = ((insn & 0xffffff) << 8)
1632             | ((extension >> 16) & 0xff);
1633           number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1634           number_to_chars_littleendian (f + 1, temp, 4);
1635           number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
1636           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1637         }
1638       else if (opcode->format == FMT_D2
1639                && opcode->opcode != 0xfaf80000
1640                && opcode->opcode != 0xfaf00000
1641                && opcode->opcode != 0xfaf40000)
1642         {
1643           /* A format D2 instruction where the 16bit immediate is
1644              really a single 16bit value, not two 8bit values.  */
1645           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1646           number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
1647         }
1648       else if (opcode->format == FMT_D2)
1649         {
1650           /* A format D2 instruction where the 16bit immediate
1651              is really two 8bit immediates.  */
1652           number_to_chars_bigendian (f, insn, 4);
1653         }
1654       else if (opcode->format == FMT_D4)
1655         {
1656           unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
1657
1658           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1659           number_to_chars_littleendian (f + 2, temp, 4);
1660         }
1661       else if (opcode->format == FMT_D5)
1662         {
1663           unsigned long temp = (((insn & 0xffff) << 16)
1664                                 | ((extension >> 8) & 0xffff));
1665
1666           number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1667           number_to_chars_littleendian (f + 2, temp, 4);
1668           number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1669         }
1670       else if (opcode->format == FMT_D8)
1671         {
1672           unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
1673
1674           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
1675           number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
1676           number_to_chars_littleendian (f + 4, temp >> 8, 2);
1677         }
1678       else if (opcode->format == FMT_D9)
1679         {
1680           unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
1681
1682           number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
1683           number_to_chars_littleendian (f + 3, temp, 4);
1684         }
1685
1686       /* Create any fixups.  */
1687       for (i = 0; i < fc; i++)
1688         {
1689           const struct mn10300_operand *operand;
1690
1691           operand = &mn10300_operands[fixups[i].opindex];
1692           if (fixups[i].reloc != BFD_RELOC_UNUSED)
1693             {
1694               reloc_howto_type *reloc_howto;
1695               int size;
1696               int offset;
1697               fixS *fixP;
1698
1699               reloc_howto = bfd_reloc_type_lookup (stdoutput,
1700                                                    fixups[i].reloc);
1701
1702               if (!reloc_howto)
1703                 abort ();
1704
1705               size = bfd_get_reloc_size (reloc_howto);
1706
1707               if (size < 1 || size > 4)
1708                 abort ();
1709
1710               offset = 4 - size;
1711               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
1712                                   size, &fixups[i].exp,
1713                                   reloc_howto->pc_relative,
1714                                   fixups[i].reloc);
1715             }
1716           else
1717             {
1718               int reloc, pcrel, reloc_size, offset;
1719               fixS *fixP;
1720
1721               reloc = BFD_RELOC_NONE;
1722               /* How big is the reloc?  Remember SPLIT relocs are
1723                  implicitly 32bits.  */
1724               if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
1725                 reloc_size = 32;
1726               else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
1727                 reloc_size = 24;
1728               else
1729                 reloc_size = operand->bits;
1730
1731               /* Is the reloc pc-relative?  */
1732               pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
1733
1734               /* Gross.  This disgusting hack is to make sure we
1735                  get the right offset for the 16/32 bit reloc in
1736                  "call" instructions.  Basically they're a pain
1737                  because the reloc isn't at the end of the instruction.  */
1738               if ((size == 5 || size == 7)
1739                   && (((insn >> 24) & 0xff) == 0xcd
1740                       || ((insn >> 24) & 0xff) == 0xdd))
1741                 size -= 2;
1742
1743               /* Similarly for certain bit instructions which don't
1744                  hav their 32bit reloc at the tail of the instruction.  */
1745               if (size == 7
1746                   && (((insn >> 16) & 0xffff) == 0xfe00
1747                       || ((insn >> 16) & 0xffff) == 0xfe01
1748                       || ((insn >> 16) & 0xffff) == 0xfe02))
1749                 size -= 1;
1750
1751               offset = size - reloc_size / 8;
1752
1753               /* Choose a proper BFD relocation type.  */
1754               if (pcrel)
1755                 {
1756                   if (reloc_size == 32)
1757                     reloc = BFD_RELOC_32_PCREL;
1758                   else if (reloc_size == 16)
1759                     reloc = BFD_RELOC_16_PCREL;
1760                   else if (reloc_size == 8)
1761                     reloc = BFD_RELOC_8_PCREL;
1762                   else
1763                     abort ();
1764                 }
1765               else
1766                 {
1767                   if (reloc_size == 32)
1768                     reloc = BFD_RELOC_32;
1769                   else if (reloc_size == 16)
1770                     reloc = BFD_RELOC_16;
1771                   else if (reloc_size == 8)
1772                     reloc = BFD_RELOC_8;
1773                   else
1774                     abort ();
1775                 }
1776
1777               /* Convert the size of the reloc into what fix_new_exp wants.  */
1778               reloc_size = reloc_size / 8;
1779               if (reloc_size == 8)
1780                 reloc_size = 0;
1781               else if (reloc_size == 16)
1782                 reloc_size = 1;
1783               else if (reloc_size == 32)
1784                 reloc_size = 2;
1785
1786               fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
1787                                   reloc_size, &fixups[i].exp, pcrel,
1788                                   ((bfd_reloc_code_real_type) reloc));
1789
1790               if (pcrel)
1791                 fixP->fx_offset += offset;
1792             }
1793         }
1794     }
1795
1796   if (debug_type == DEBUG_DWARF2)
1797     {
1798       bfd_vma addr;
1799
1800       /* First update the notion of the current source line.  */
1801       dwarf2_where (&debug_line);
1802
1803       /* We want the offset of the start of this instruction within the
1804          the current frag.  */
1805       addr = frag_now->fr_address + frag_now_fix () - real_size;
1806
1807       /* And record the information.  */
1808       dwarf2_gen_line_info (addr, &debug_line);
1809     }
1810 }
1811
1812 /* If while processing a fixup, a reloc really needs to be created
1813    then it is done here.  */
1814
1815 arelent *
1816 tc_gen_reloc (seg, fixp)
1817      asection *seg ATTRIBUTE_UNUSED;
1818      fixS *fixp;
1819 {
1820   arelent *reloc;
1821   reloc = (arelent *) xmalloc (sizeof (arelent));
1822
1823   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1824   if (reloc->howto == (reloc_howto_type *) NULL)
1825     {
1826       as_bad_where (fixp->fx_file, fixp->fx_line,
1827                     _("reloc %d not supported by object file format"),
1828                     (int) fixp->fx_r_type);
1829       return NULL;
1830     }
1831   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1832
1833   if (fixp->fx_addsy && fixp->fx_subsy)
1834     {
1835
1836       if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
1837           || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
1838         {
1839           as_bad_where (fixp->fx_file, fixp->fx_line,
1840                         "Difference of symbols in different sections is not supported");
1841           return NULL;
1842         }
1843
1844       reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
1845       reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
1846                        - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
1847     }
1848   else
1849     {
1850       reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1851       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1852       reloc->addend = fixp->fx_offset;
1853     }
1854   return reloc;
1855 }
1856
1857 int
1858 md_estimate_size_before_relax (fragp, seg)
1859      fragS *fragp;
1860      asection *seg;
1861 {
1862   if (fragp->fr_subtype == 0)
1863     return 2;
1864   if (fragp->fr_subtype == 3)
1865     return 3;
1866   if (fragp->fr_subtype == 6)
1867     {
1868       if (!S_IS_DEFINED (fragp->fr_symbol)
1869           || seg != S_GET_SEGMENT (fragp->fr_symbol))
1870         {
1871           fragp->fr_subtype = 7;
1872           return 7;
1873         }
1874       else
1875         return 5;
1876     }
1877   if (fragp->fr_subtype == 8)
1878     {
1879       if (!S_IS_DEFINED (fragp->fr_symbol)
1880           || seg != S_GET_SEGMENT (fragp->fr_symbol))
1881         {
1882           fragp->fr_subtype = 9;
1883           return 6;
1884         }
1885       else
1886         return 4;
1887     }
1888   if (fragp->fr_subtype == 10)
1889     {
1890       if (!S_IS_DEFINED (fragp->fr_symbol)
1891           || seg != S_GET_SEGMENT (fragp->fr_symbol))
1892         {
1893           fragp->fr_subtype = 12;
1894           return 5;
1895         }
1896       else
1897         return 2;
1898     }
1899   abort ();
1900 }
1901
1902 long
1903 md_pcrel_from (fixp)
1904      fixS *fixp;
1905 {
1906   return fixp->fx_frag->fr_address;
1907 #if 0
1908   if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
1909     {
1910       /* The symbol is undefined.  Let the linker figure it out.  */
1911       return 0;
1912     }
1913   return fixp->fx_frag->fr_address + fixp->fx_where;
1914 #endif
1915 }
1916
1917 int
1918 md_apply_fix3 (fixp, valuep, seg)
1919      fixS *fixp;
1920      valueT *valuep ATTRIBUTE_UNUSED;
1921      segT seg;
1922 {
1923   char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
1924   int size = 0;
1925
1926   assert (fixp->fx_r_type < BFD_RELOC_UNUSED);
1927
1928   /* This should never happen.  */
1929   if (seg->flags & SEC_ALLOC)
1930       abort ();
1931
1932   /* If the fix is relative to a symbol which is not defined, or not
1933      in the same segment as the fix, we cannot resolve it here.  */
1934   if (fixp->fx_addsy != NULL
1935       && (! S_IS_DEFINED (fixp->fx_addsy)
1936           || (S_GET_SEGMENT (fixp->fx_addsy) != seg)))
1937     {
1938       fixp->fx_done = 0;
1939       return 0;
1940     }
1941
1942   switch (fixp->fx_r_type)
1943     {
1944     case BFD_RELOC_8:
1945       size = 1;
1946       break;
1947
1948     case BFD_RELOC_16:
1949       size = 2;
1950       break;
1951
1952     case BFD_RELOC_32:
1953       size = 4;
1954       break;
1955
1956     case BFD_RELOC_VTABLE_INHERIT:
1957     case BFD_RELOC_VTABLE_ENTRY:
1958       fixp->fx_done = 0;
1959       return 1;
1960
1961     case BFD_RELOC_NONE:
1962     default:
1963       as_bad_where (fixp->fx_file, fixp->fx_line,
1964                    _("Bad relocation fixup type (%d)"), fixp->fx_r_type);
1965     }
1966
1967   md_number_to_chars (fixpos, fixp->fx_offset, size);
1968
1969   fixp->fx_done = 1;
1970   return 0;
1971
1972 }
1973
1974 /* Return nonzero if the fixup in FIXP will require a relocation,
1975    even it if appears that the fixup could be completely handled
1976    within GAS.  */
1977
1978 int
1979 mn10300_force_relocation (fixp)
1980      struct fix *fixp;
1981 {
1982   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1983       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1984     return 1;
1985
1986   return 0;
1987 }
1988
1989 /* Return zero if the fixup in fixp should be left alone and not
1990    adjusted.  */
1991
1992 boolean
1993 mn10300_fix_adjustable (fixp)
1994      struct fix *fixp;
1995 {
1996   /* Prevent all adjustments to global symbols.  */
1997   if (S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))
1998     return 0;
1999
2000   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2001       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2002     return 0;
2003
2004   return 1;
2005 }
2006
2007 /* Insert an operand value into an instruction.  */
2008
2009 static void
2010 mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
2011      unsigned long *insnp;
2012      unsigned long *extensionp;
2013      const struct mn10300_operand *operand;
2014      offsetT val;
2015      char *file;
2016      unsigned int line;
2017      unsigned int shift;
2018 {
2019   /* No need to check 32bit operands for a bit.  Note that
2020      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2021   if (operand->bits != 32
2022       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2023     {
2024       long min, max;
2025       offsetT test;
2026       int bits;
2027
2028       bits = operand->bits;
2029       if (operand->flags & MN10300_OPERAND_24BIT)
2030         bits = 24;
2031
2032       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2033         {
2034           max = (1 << (bits - 1)) - 1;
2035           min = - (1 << (bits - 1));
2036         }
2037       else
2038         {
2039           max = (1 << bits) - 1;
2040           min = 0;
2041         }
2042
2043       test = val;
2044
2045       if (test < (offsetT) min || test > (offsetT) max)
2046         {
2047           const char *err =
2048             _("operand out of range (%s not between %ld and %ld)");
2049           char buf[100];
2050
2051           sprint_value (buf, test);
2052           if (file == (char *) NULL)
2053             as_warn (err, buf, min, max);
2054           else
2055             as_warn_where (file, line, err, buf, min, max);
2056         }
2057     }
2058
2059   if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2060     {
2061       *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
2062       *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
2063                       << operand->shift);
2064     }
2065   else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2066     {
2067       *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
2068       *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
2069                       << operand->shift);
2070     }
2071   else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
2072     {
2073       *insnp |= (((long) val & ((1 << operand->bits) - 1))
2074                  << (operand->shift + shift));
2075
2076       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2077         *insnp |= (((long) val & ((1 << operand->bits) - 1))
2078                    << (operand->shift + shift + operand->bits));
2079     }
2080   else
2081     {
2082       *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2083                       << (operand->shift + shift));
2084
2085       if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2086         *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2087                         << (operand->shift + shift + operand->bits));
2088     }
2089 }
2090
2091 static unsigned long
2092 check_operand (insn, operand, val)
2093      unsigned long insn ATTRIBUTE_UNUSED;
2094      const struct mn10300_operand *operand;
2095      offsetT val;
2096 {
2097   /* No need to check 32bit operands for a bit.  Note that
2098      MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
2099   if (operand->bits != 32
2100       && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2101     {
2102       long min, max;
2103       offsetT test;
2104       int bits;
2105
2106       bits = operand->bits;
2107       if (operand->flags & MN10300_OPERAND_24BIT)
2108         bits = 24;
2109
2110       if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2111         {
2112           max = (1 << (bits - 1)) - 1;
2113           min = - (1 << (bits - 1));
2114         }
2115       else
2116         {
2117           max = (1 << bits) - 1;
2118           min = 0;
2119         }
2120
2121       test = val;
2122
2123       if (test < (offsetT) min || test > (offsetT) max)
2124         return 0;
2125       else
2126         return 1;
2127     }
2128   return 1;
2129 }
2130
2131 static void
2132 set_arch_mach (mach)
2133      int mach;
2134 {
2135   if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
2136     as_warn (_("could not set architecture and machine"));
2137
2138   current_machine = mach;
2139 }
2140
2141 void
2142 mn10300_finalize ()
2143 {
2144   if (debug_type == DEBUG_DWARF2)
2145     dwarf2_finish ();
2146 }