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