include/opcode/
[external/binutils.git] / gas / config / tc-h8300.c
1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3    2001, 2002, 2003 Free Software Foundation, Inc.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 /* Written By Steve Chamberlain <sac@cygnus.com>.  */
23
24 #include <stdio.h>
25 #include "as.h"
26 #include "subsegs.h"
27 #include "bfd.h"
28
29 #ifdef BFD_ASSEMBLER
30 #include "dwarf2dbg.h"
31 #endif
32
33 #define DEFINE_TABLE
34 #define h8_opcodes ops
35 #include "opcode/h8300.h"
36 #include "safe-ctype.h"
37
38 #ifdef OBJ_ELF
39 #include "elf/h8.h"
40 #endif
41
42 const char comment_chars[] = ";";
43 const char line_comment_chars[] = "#";
44 const char line_separator_chars[] = "";
45
46 void cons        PARAMS ((int));
47 void sbranch     PARAMS ((int));
48 void h8300hmode  PARAMS ((int));
49 void h8300smode  PARAMS ((int));
50 void h8300hnmode PARAMS ((int));
51 void h8300snmode PARAMS ((int));
52 void h8300sxmode PARAMS ((int));
53 static void pint PARAMS ((int));
54
55 int Hmode;
56 int Smode;
57 int Nmode;
58 int SXmode;
59
60 #define PSIZE (Hmode ? L_32 : L_16)
61 #define DSYMMODE (Hmode ? L_24 : L_16)
62
63 int bsize = L_8;                /* Default branch displacement.  */
64
65 struct h8_instruction
66 {
67   int length;
68   int noperands;
69   int idx;
70   int size;
71   const struct h8_opcode *opcode;
72 };
73
74 struct h8_instruction *h8_instructions;
75
76 void
77 h8300hmode (arg)
78      int arg ATTRIBUTE_UNUSED;
79 {
80   Hmode = 1;
81   Smode = 0;
82 #ifdef BFD_ASSEMBLER
83   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
84     as_warn (_("could not set architecture and machine"));
85 #endif
86 }
87
88 void
89 h8300smode (arg)
90      int arg ATTRIBUTE_UNUSED;
91 {
92   Smode = 1;
93   Hmode = 1;
94 #ifdef BFD_ASSEMBLER
95   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
96     as_warn (_("could not set architecture and machine"));
97 #endif
98 }
99
100 void
101 h8300hnmode (arg)
102      int arg ATTRIBUTE_UNUSED;
103 {
104   Hmode = 1;
105   Smode = 0;
106   Nmode = 1;
107 #ifdef BFD_ASSEMBLER
108   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
109     as_warn (_("could not set architecture and machine"));
110 #endif
111 }
112
113 void
114 h8300snmode (arg)
115      int arg ATTRIBUTE_UNUSED;
116 {
117   Smode = 1;
118   Hmode = 1;
119   Nmode = 1;
120 #ifdef BFD_ASSEMBLER
121   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
122     as_warn (_("could not set architecture and machine"));
123 #endif
124 }
125
126 void
127 h8300sxmode (arg)
128      int arg ATTRIBUTE_UNUSED;
129 {
130   Smode = 1;
131   Hmode = 1;
132   SXmode = 1;
133 #ifdef BFD_ASSEMBLER
134   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
135     as_warn (_("could not set architecture and machine"));
136 #endif
137 }
138
139 void
140 h8300sxnmode (arg)
141      int arg ATTRIBUTE_UNUSED;
142 {
143   Smode = 1;
144   Hmode = 1;
145   SXmode = 1;
146   Nmode = 1;
147 #ifdef BFD_ASSEMBLER
148   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
149     as_warn (_("could not set architecture and machine"));
150 #endif
151 }
152
153 void
154 sbranch (size)
155      int size;
156 {
157   bsize = size;
158 }
159
160 static void
161 pint (arg)
162      int arg ATTRIBUTE_UNUSED;
163 {
164   cons (Hmode ? 4 : 2);
165 }
166
167 /* This table describes all the machine specific pseudo-ops the assembler
168    has to support.  The fields are:
169    pseudo-op name without dot
170    function to call to execute this pseudo-op
171    Integer arg to pass to the function.  */
172
173 const pseudo_typeS md_pseudo_table[] =
174 {
175   {"h8300h",  h8300hmode,  0},
176   {"h8300hn", h8300hnmode, 0},
177   {"h8300s",  h8300smode,  0},
178   {"h8300sn", h8300snmode, 0},
179   {"h8300sx", h8300sxmode, 0},
180   {"h8300sxn", h8300sxnmode, 0},
181   {"sbranch", sbranch, L_8},
182   {"lbranch", sbranch, L_16},
183
184   {"int", pint, 0},
185   {"data.b", cons, 1},
186   {"data.w", cons, 2},
187   {"data.l", cons, 4},
188   {"form", listing_psize, 0},
189   {"heading", listing_title, 0},
190   {"import",  s_ignore, 0},
191   {"page",    listing_eject, 0},
192   {"program", s_ignore, 0},
193   {0, 0, 0}
194 };
195
196 const int md_reloc_size;
197
198 const char EXP_CHARS[] = "eE";
199
200 /* Chars that mean this number is a floating point constant
201    As in 0f12.456
202    or    0d1.2345e12.  */
203 const char FLT_CHARS[] = "rRsSfFdDxXpP";
204
205 static struct hash_control *opcode_hash_control;        /* Opcode mnemonics.  */
206
207 /* This function is called once, at assembler startup time.  This
208    should set up all the tables, etc. that the MD part of the assembler
209    needs.  */
210
211 void
212 md_begin ()
213 {
214   unsigned int nopcodes;
215   struct h8_opcode *p, *p1;
216   struct h8_instruction *pi;
217   char prev_buffer[100];
218   int idx = 0;
219
220 #ifdef BFD_ASSEMBLER
221   if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300))
222     as_warn (_("could not set architecture and machine"));
223 #endif
224
225   opcode_hash_control = hash_new ();
226   prev_buffer[0] = 0;
227
228   nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
229   
230   h8_instructions = (struct h8_instruction *)
231     xmalloc (nopcodes * sizeof (struct h8_instruction));
232
233   pi = h8_instructions;
234   p1 = h8_opcodes;
235   /* We do a minimum amount of sorting on the opcode table; this is to
236      make it easy to describe the mova instructions without unnecessary
237      code duplication.
238      Sorting only takes place inside blocks of instructions of the form
239      X/Y, so for example mova/b, mova/w and mova/l can be intermixed.  */
240   while (p1)
241     {
242       struct h8_opcode *first_skipped = 0;
243       int len, cmplen = 0;
244       char *src = p1->name;
245       char *dst, *buffer;
246
247       if (p1->name == 0)
248         break;
249       /* Strip off any . part when inserting the opcode and only enter
250          unique codes into the hash table.  */
251       dst = buffer = malloc (strlen (src) + 1);
252       while (*src)
253         {
254           if (*src == '.')
255             {
256               src++;
257               break;
258             }
259           if (*src == '/')
260             cmplen = src - p1->name + 1;
261           *dst++ = *src++;
262         }
263       *dst = 0;
264       len = dst - buffer;
265       if (cmplen == 0)
266         cmplen = len;
267       hash_insert (opcode_hash_control, buffer, (char *) pi);
268       strcpy (prev_buffer, buffer);
269       idx++;
270
271       for (p = p1; p->name; p++)
272         {
273           /* A negative TIME is used to indicate that we've added this opcode
274              already.  */
275           if (p->time == -1)
276             continue;
277           if (strncmp (p->name, buffer, cmplen) != 0
278               || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
279                   && p->name[cmplen - 1] != '/'))
280             {
281               if (first_skipped == 0)
282                 first_skipped = p;
283               break;
284             }
285           if (strncmp (p->name, buffer, len) != 0)
286             {
287               if (first_skipped == 0)
288                 first_skipped = p;
289               continue;
290             }
291
292           p->time = -1;
293           pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
294           pi->idx = idx;
295
296           /* Find the number of operands.  */
297           pi->noperands = 0;
298           while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
299             pi->noperands++;
300
301           /* Find the length of the opcode in bytes.  */
302           pi->length = 0;
303           while (p->data.nib[pi->length * 2] != (op_type) E)
304             pi->length++;
305
306           pi->opcode = p;
307           pi++;
308         }
309       p1 = first_skipped;
310     }
311
312   /* Add entry for the NULL vector terminator.  */
313   pi->length = 0;
314   pi->noperands = 0;
315   pi->idx = 0;
316   pi->size = 0;
317   pi->opcode = 0;
318
319   linkrelax = 1;
320 }
321
322 struct h8_exp
323 {
324   char *e_beg;
325   char *e_end;
326   expressionS e_exp;
327 };
328
329 struct h8_op
330 {
331   op_type mode;
332   unsigned reg;
333   expressionS exp;
334 };
335
336 static void clever_message PARAMS ((const struct h8_instruction *, struct h8_op *));
337 static void fix_operand_size PARAMS ((struct h8_op *, int));
338 static void build_bytes    PARAMS ((const struct h8_instruction *, struct h8_op *));
339 static void do_a_fix_imm   PARAMS ((int, int, struct h8_op *, int));
340 static void check_operand  PARAMS ((struct h8_op *, unsigned int, char *));
341 static const struct h8_instruction * get_specific PARAMS ((const struct h8_instruction *, struct h8_op *, int));
342 static char * get_operands PARAMS ((unsigned, char *, struct h8_op *));
343 static void   get_operand  PARAMS ((char **, struct h8_op *, int));
344 static char * skip_colonthing PARAMS ((char *, expressionS *, int *));
345 static char * parse_exp PARAMS ((char *, expressionS *));
346 static int    parse_reg PARAMS ((char *, op_type *, unsigned *, int));
347 char * colonmod24 PARAMS ((struct h8_op *, char *));
348
349 static int constant_fits_width_p PARAMS ((struct h8_op *, unsigned int));
350 static int constant_fits_size_p PARAMS ((struct h8_op *, int, int));
351
352 /*
353   parse operands
354   WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
355   r0l,r0h,..r7l,r7h
356   @WREG
357   @WREG+
358   @-WREG
359   #const
360   ccr
361 */
362
363 /* Try to parse a reg name.  Return the number of chars consumed.  */
364
365 static int
366 parse_reg (src, mode, reg, direction)
367      char *src;
368      op_type *mode;
369      unsigned int *reg;
370      int direction;
371 {
372   char *end;
373   int len;
374
375   /* Cribbed from get_symbol_end.  */
376   if (!is_name_beginner (*src) || *src == '\001')
377     return 0;
378   end = src + 1;
379   while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
380     end++;
381   len = end - src;
382
383   if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
384     {
385       *mode = PSIZE | REG | direction;
386       *reg = 7;
387       return len;
388     }
389   if (len == 3 && 
390       TOLOWER (src[0]) == 'c' && 
391       TOLOWER (src[1]) == 'c' && 
392       TOLOWER (src[2]) == 'r')
393     {
394       *mode = CCR;
395       *reg = 0;
396       return len;
397     }
398   if (len == 3 && 
399       TOLOWER (src[0]) == 'e' && 
400       TOLOWER (src[1]) == 'x' && 
401       TOLOWER (src[2]) == 'r')
402     {
403       *mode = EXR;
404       *reg = 1;
405       return len;
406     }
407   if (len == 3 && 
408       TOLOWER (src[0]) == 'v' && 
409       TOLOWER (src[1]) == 'b' && 
410       TOLOWER (src[2]) == 'r')
411     {
412       *mode = VBR;
413       *reg = 6;
414       return len;
415     }
416   if (len == 3 && 
417       TOLOWER (src[0]) == 's' && 
418       TOLOWER (src[1]) == 'b' && 
419       TOLOWER (src[2]) == 'r')
420     {
421       *mode = SBR;
422       *reg = 7;
423       return len;
424     }
425   if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
426     {
427       *mode = PSIZE | REG | direction;
428       *reg = 6;
429       return len;
430     }
431   if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
432       src[2] >= '0' && src[2] <= '7')
433     {
434       *mode = L_32 | REG | direction;
435       *reg = src[2] - '0';
436       if (!Hmode)
437         as_warn (_("Reg not valid for H8/300"));
438       return len;
439     }
440   if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
441     {
442       *mode = L_16 | REG | direction;
443       *reg = src[1] - '0' + 8;
444       if (!Hmode)
445         as_warn (_("Reg not valid for H8/300"));
446       return len;
447     }
448
449   if (TOLOWER (src[0]) == 'r')
450     {
451       if (src[1] >= '0' && src[1] <= '7')
452         {
453           if (len == 3 && TOLOWER (src[2]) == 'l')
454             {
455               *mode = L_8 | REG | direction;
456               *reg = (src[1] - '0') + 8;
457               return len;
458             }
459           if (len == 3 && TOLOWER (src[2]) == 'h')
460             {
461               *mode = L_8 | REG | direction;
462               *reg = (src[1] - '0');
463               return len;
464             }
465           if (len == 2)
466             {
467               *mode = L_16 | REG | direction;
468               *reg = (src[1] - '0');
469               return len;
470             }
471         }
472     }
473
474   return 0;
475 }
476
477 static char *
478 parse_exp (s, op)
479      char *s;
480      expressionS *op;
481 {
482   char *save = input_line_pointer;
483   char *new;
484
485   input_line_pointer = s;
486   expression (op);
487   if (op->X_op == O_absent)
488     as_bad (_("missing operand"));
489   new = input_line_pointer;
490   input_line_pointer = save;
491   return new;
492 }
493
494 static char *
495 skip_colonthing (ptr, exp, mode)
496      char *ptr;
497      expressionS *exp ATTRIBUTE_UNUSED;
498      int *mode;
499 {
500   if (*ptr == ':')
501     {
502       ptr++;
503       *mode &= ~SIZE;
504       if (ptr[0] == '8' && ! ISDIGIT (ptr[1]))
505         *mode |= L_8;
506       else if (ptr[0] == '2' && ! ISDIGIT (ptr[1]))
507         *mode |= L_2;
508       else if (ptr[0] == '3' && ! ISDIGIT (ptr[1]))
509         *mode |= L_3;
510       else if (ptr[0] == '4' && ! ISDIGIT (ptr[1]))
511         *mode |= L_4;
512       else if (ptr[0] == '5' && ! ISDIGIT (ptr[1]))
513         *mode |= L_5;
514       else if (ptr[0] == '2' && ptr[1] == '4')
515         *mode |= L_24;
516       else if (ptr[0] == '3' && ptr[1] == '2')
517         *mode |= L_32;
518       else if (ptr[0] == '1' && ptr[1] == '6')
519         *mode |= L_16;
520       else
521         as_bad (_("invalid operand size requested"));
522
523       while (ISDIGIT (*ptr))
524         ptr++;
525     }
526   return ptr;
527 }
528
529 /* The many forms of operand:
530
531    Rn                   Register direct
532    @Rn                  Register indirect
533    @(exp[:16], Rn)      Register indirect with displacement
534    @Rn+
535    @-Rn
536    @aa:8                absolute 8 bit
537    @aa:16               absolute 16 bit
538    @aa                  absolute 16 bit
539
540    #xx[:size]           immediate data
541    @(exp:[8], pc)       pc rel
542    @@aa[:8]             memory indirect.  */
543
544 char *
545 colonmod24 (op, src)
546      struct h8_op *op;
547      char *src;
548 {
549   int mode = 0;
550   src = skip_colonthing (src, &op->exp, &mode);
551
552   if (!mode)
553     {
554       /* If the operand is a 16-bit constant integer, leave fix_operand_size
555          to calculate its size.  Otherwise choose a default here.  */
556       if (op->exp.X_add_number < -32768
557           || op->exp.X_add_number > 32767)
558         {
559           if (Hmode)
560             mode = L_24;
561           else
562             mode = L_16;
563         }
564       else if (op->exp.X_add_symbol
565                || op->exp.X_op_symbol)
566         mode = DSYMMODE;
567     }
568
569   op->mode |= mode;
570   return src;
571 }
572
573 static int
574 constant_fits_width_p (operand, width)
575      struct h8_op *operand;
576      unsigned int width;
577 {
578   return ((operand->exp.X_add_number & ~width) == 0
579           || (operand->exp.X_add_number | width) == (unsigned)(~0));
580 }
581
582 static int
583 constant_fits_size_p (operand, size, no_symbols)
584      struct h8_op *operand;
585      int size, no_symbols;
586 {
587   offsetT num = operand->exp.X_add_number;
588   if (no_symbols
589       && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
590     return 0;
591   switch (size)
592     {
593     case L_2:
594       return (num & ~3) == 0;
595     case L_3:
596       return (num & ~7) == 0;
597     case L_3NZ:
598       return num >= 1 && num < 8;
599     case L_4:
600       return (num & ~15) == 0;
601     case L_5:
602       return num >= 1 && num < 32;
603     case L_8:
604       return (num & ~0xFF) == 0 || ((unsigned)num | 0x7F) == ~0u;
605     case L_8U:
606       return (num & ~0xFF) == 0;
607     case L_16:
608       return (num & ~0xFFFF) == 0 || ((unsigned)num | 0x7FFF) == ~0u;
609     case L_16U:
610       return (num & ~0xFFFF) == 0;
611     case L_32:
612       return 1;
613     default:
614       abort ();
615     }
616 }
617
618 static void
619 get_operand (ptr, op, direction)
620      char **ptr;
621      struct h8_op *op;
622      int direction;
623 {
624   char *src = *ptr;
625   op_type mode;
626   unsigned int num;
627   unsigned int len;
628
629   op->mode = 0;
630
631   /* Check for '(' and ')' for instructions ldm and stm.  */
632   if (src[0] == '(' && src[8] == ')')
633     ++ src;
634
635   /* Gross.  Gross.  ldm and stm have a format not easily handled
636      by get_operand.  We deal with it explicitly here.  */
637   if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' && 
638       ISDIGIT (src[2]) && src[3] == '-' &&
639       TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
640     {
641       int low, high;
642
643       low = src[2] - '0';
644       high = src[6] - '0';
645
646       if (high == low)
647         as_bad (_("Invalid register list for ldm/stm\n"));
648
649       if (high < low)
650         as_bad (_("Invalid register list for ldm/stm\n"));
651
652       if (high - low > 3)
653         as_bad (_("Invalid register list for ldm/stm)\n"));
654
655       /* Even sicker.  We encode two registers into op->reg.  One
656          for the low register to save, the other for the high
657          register to save;  we also set the high bit in op->reg
658          so we know this is "very special".  */
659       op->reg = 0x80000000 | (high << 8) | low;
660       op->mode = REG;
661       if (src[7] == ')')
662         *ptr = src + 8;
663       else
664         *ptr = src + 7;
665       return;
666     }
667
668   len = parse_reg (src, &op->mode, &op->reg, direction);
669   if (len)
670     {
671       src += len;
672       if (*src == '.')
673         {
674           int size = op->mode & SIZE;
675           switch (src[1])
676             {
677             case 'l': case 'L':
678               if (size != L_32)
679                 as_warn (_("mismatch between register and suffix"));
680               op->mode = (op->mode & ~MODE) | LOWREG;
681               break;
682             case 'w': case 'W':
683               if (size != L_32 && size != L_16)
684                 as_warn (_("mismatch between register and suffix"));
685               op->mode = (op->mode & ~MODE) | LOWREG;
686               op->mode = (op->mode & ~SIZE) | L_16;
687               break;
688             case 'b': case 'B':
689               op->mode = (op->mode & ~MODE) | LOWREG;
690               if (size != L_32 && size != L_8)
691                 as_warn (_("mismatch between register and suffix"));
692               op->mode = (op->mode & ~MODE) | LOWREG;
693               op->mode = (op->mode & ~SIZE) | L_8;
694               break;
695             default:
696               as_warn ("invalid suffix after register.");
697               break;
698             }
699           src += 2;
700         }
701       *ptr = src;
702       return;
703     }
704
705   if (*src == '@')
706     {
707       src++;
708       if (*src == '@')
709         {
710           src++;
711           src = parse_exp (src, &op->exp);
712
713           src = skip_colonthing (src, &op->exp, &op->mode);
714
715           *ptr = src;
716
717           if (op->exp.X_add_number >= 0x100)
718             {
719               int divisor;
720
721               op->mode = VECIND;
722               /* FIXME : 2?  or 4?  */
723               if (op->exp.X_add_number >= 0x400)
724                 as_bad (_("address too high for vector table jmp/jsr"));
725               else if (op->exp.X_add_number >= 0x200)
726                 divisor = 4;
727               else
728                 divisor = 2;
729
730               op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
731             }
732           else
733             op->mode = MEMIND;
734
735           return;
736         }
737
738       if (*src == '-' || *src == '+')
739         {
740           char c = *src;
741           src++;
742           len = parse_reg (src, &mode, &num, direction);
743           if (len == 0)
744             {
745               /* Oops, not a reg after all, must be ordinary exp.  */
746               src--;
747               /* Must be a symbol.  */
748               op->mode = ABS | PSIZE | direction;
749               *ptr = skip_colonthing (parse_exp (src, &op->exp),
750                                       &op->exp, &op->mode);
751
752               return;
753             }
754
755           if ((mode & SIZE) != PSIZE)
756             as_bad (_("Wrong size pointer register for architecture."));
757           op->mode = c == '-' ? RDPREDEC : RDPREINC;
758           op->reg = num;
759           *ptr = src + len;
760           return;
761         }
762       if (*src == '(')
763         {
764           src++;
765
766           /* See if this is @(ERn.x, PC).  */
767           len = parse_reg (src, &mode, &op->reg, direction);
768           if (len != 0 && (mode & MODE) == REG && src[len] == '.')
769             {
770               switch (TOLOWER (src[len + 1]))
771                 {
772                 case 'b':
773                   mode = PCIDXB | direction;
774                   break;
775                 case 'w':
776                   mode = PCIDXW | direction;
777                   break;
778                 case 'l':
779                   mode = PCIDXL | direction;
780                   break;
781                 default:
782                   mode = 0;
783                   break;
784                 }
785               if (mode
786                   && src[len + 2] == ','
787                   && TOLOWER (src[len + 3]) != 'p' 
788                   && TOLOWER (src[len + 4]) != 'c'
789                   && src[len + 5] != ')')
790                 {
791                   *ptr = src + len + 6;
792                   op->mode |= mode;
793                   return;
794                 }
795               /* Fall through into disp case - the grammar is somewhat
796                  ambiguous, so we should try whether it's a DISP operand
797                  after all ("ER3.L" might be a poorly named label...).  */
798             }
799
800           /* Disp.  */
801
802           /* Start off assuming a 16 bit offset.  */
803
804           src = parse_exp (src, &op->exp);
805
806           src = colonmod24 (op, src);
807
808           if (*src == ')')
809             {
810               src++;
811               op->mode |= ABS | direction;
812               *ptr = src;
813               return;
814             }
815
816           if (*src != ',')
817             {
818               as_bad (_("expected @(exp, reg16)"));
819               return;
820
821             }
822           src++;
823
824           len = parse_reg (src, &mode, &op->reg, direction);
825           if (len == 0 || (mode & MODE) != REG)
826             {
827               as_bad (_("expected @(exp, reg16)"));
828               return;
829             }
830           src += len;
831           if (src[0] == '.')
832             {
833               switch (TOLOWER (src[1]))
834                 {
835                 case 'b':
836                   op->mode |= INDEXB | direction;
837                   break;
838                 case 'w':
839                   op->mode |= INDEXW | direction;
840                   break;
841                 case 'l':
842                   op->mode |= INDEXL | direction;
843                   break;
844                 default:
845                   as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
846                 }
847               src += 2;
848               op->reg &= 7;
849             }
850           else
851             op->mode |= DISP | direction;
852           src = skip_colonthing (src, &op->exp, &op->mode);
853
854           if (*src != ')' && '(')
855             {
856               as_bad (_("expected @(exp, reg16)"));
857               return;
858             }
859           *ptr = src + 1;
860
861           return;
862         }
863       len = parse_reg (src, &mode, &num, direction);
864
865       if (len)
866         {
867           src += len;
868           if (*src == '+' || *src == '-')
869             {
870               if ((mode & SIZE) != PSIZE)
871                 as_bad (_("Wrong size pointer register for architecture."));
872               op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
873               op->reg = num;
874               src++;
875               *ptr = src;
876               return;
877             }
878           if ((mode & SIZE) != PSIZE)
879             as_bad (_("Wrong size pointer register for architecture."));
880
881           op->mode = direction | IND | PSIZE;
882           op->reg = num;
883           *ptr = src;
884
885           return;
886         }
887       else
888         {
889           /* must be a symbol */
890
891           op->mode = ABS | direction;
892           src = parse_exp (src, &op->exp);
893
894           *ptr = colonmod24 (op, src);
895
896           return;
897         }
898     }
899
900   if (*src == '#')
901     {
902       src++;
903       op->mode = IMM;
904       src = parse_exp (src, &op->exp);
905       *ptr = skip_colonthing (src, &op->exp, &op->mode);
906
907       return;
908     }
909   else if (strncmp (src, "mach", 4) == 0 || 
910            strncmp (src, "macl", 4) == 0 ||
911            strncmp (src, "MACH", 4) == 0 || 
912            strncmp (src, "MACL", 4) == 0)
913     {
914       op->reg = TOLOWER (src[3]) == 'l';
915       op->mode = MACREG;
916       *ptr = src + 4;
917       return;
918     }
919   else
920     {
921       src = parse_exp (src, &op->exp);
922       /* Trailing ':' size ? */
923       if (*src == ':')
924         {
925           if (src[1] == '1' && src[2] == '6')
926             {
927               op->mode = PCREL | L_16;
928               src += 3;
929             }
930           else if (src[1] == '8')
931             {
932               op->mode = PCREL | L_8;
933               src += 2;
934             }
935           else
936             as_bad (_("expect :8 or :16 here"));
937         }
938       else
939         {
940           int val = op->exp.X_add_number;
941
942           op->mode = PCREL;
943           if (-128 < val && val < 127)
944             op->mode |= L_8;
945           else
946             op->mode |= L_16;
947         }
948
949       *ptr = src;
950     }
951 }
952
953 static char *
954 get_operands (noperands, op_end, operand)
955      unsigned int noperands;
956      char *op_end;
957      struct h8_op *operand;
958 {
959   char *ptr = op_end;
960
961   switch (noperands)
962     {
963     case 0:
964       break;
965
966     case 1:
967       ptr++;
968       get_operand (&ptr, operand + 0, SRC);
969       if (*ptr == ',')
970         {
971           ptr++;
972           get_operand (&ptr, operand + 1, DST);
973         }
974       break;
975
976     case 2:
977       ptr++;
978       get_operand (&ptr, operand + 0, SRC);
979       if (*ptr == ',')
980         ptr++;
981       get_operand (&ptr, operand + 1, DST);
982       break;
983
984     case 3:
985       ptr++;
986       get_operand (&ptr, operand + 0, SRC);
987       if (*ptr == ',')
988         ptr++;
989       get_operand (&ptr, operand + 1, DST);
990       if (*ptr == ',')
991         ptr++;
992       get_operand (&ptr, operand + 2, OP3);
993       break;
994
995     default:
996       abort ();
997     }
998
999   return ptr;
1000 }
1001
1002 /* MOVA has special requirements.  Rather than adding twice the amount of
1003    addressing modes, we simply special case it a bit.  */
1004 static void
1005 get_mova_operands (char *op_end, struct h8_op *operand)
1006 {
1007   char *ptr = op_end;
1008
1009   if (ptr[1] != '@' || ptr[2] != '(')
1010     goto error;
1011   ptr += 3;
1012   operand[0].mode = 0;
1013   ptr = parse_exp (ptr, &operand[0].exp);
1014   ptr = colonmod24 (operand + 0, ptr);
1015
1016   if (*ptr !=',')
1017     goto error;
1018   ptr++;
1019   get_operand (&ptr, operand + 1, DST);
1020
1021   if (*ptr =='.')
1022     {
1023       ptr++;
1024       switch (*ptr++)
1025         {
1026         case 'b': case 'B':
1027           operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
1028           break;
1029         case 'w': case 'W':
1030           operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
1031           break;
1032         case 'l': case 'L':
1033           operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
1034           break;
1035         default:
1036           goto error;
1037         }
1038     }
1039   else if ((operand[1].mode & MODE) == LOWREG)
1040     {
1041       switch (operand[1].mode & SIZE) 
1042         {
1043         case L_8:
1044           operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
1045           break;
1046         case L_16:
1047           operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
1048           break;
1049         case L_32:
1050           operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
1051           break;
1052         default:
1053           goto error;
1054         }
1055     }
1056   else
1057     goto error;
1058
1059   if (*ptr++ != ')' || *ptr++ != ',')
1060     goto error;
1061   get_operand (&ptr, operand + 2, OP3);
1062   /* See if we can use the short form of MOVA.  */
1063   if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
1064       && (operand[2].mode & MODE) == REG
1065       && (operand[1].reg & 7) == (operand[2].reg & 7))
1066     {
1067       operand[1].mode = operand[2].mode = 0;
1068       operand[0].reg = operand[2].reg & 7;
1069     }
1070   return;
1071
1072  error:
1073   as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
1074   return;
1075 }
1076
1077 static void
1078 get_rtsl_operands (char *ptr, struct h8_op *operand)
1079 {
1080   int mode, num, num2, len, type = 0;
1081
1082   ptr++;
1083   if (*ptr == '(')
1084     {
1085       ptr++;
1086       type = 1;
1087     }
1088   len = parse_reg (ptr, &mode, &num, SRC);
1089   if (len == 0 || (mode & MODE) != REG)
1090     {
1091       as_bad (_("expected register"));
1092       return;
1093     }
1094   ptr += len;
1095   if (*ptr == '-')
1096     {
1097       len = parse_reg (++ptr, &mode, &num2, SRC);
1098       if (len == 0 || (mode & MODE) != REG)
1099         {
1100           as_bad (_("expected register"));
1101           return;
1102         }
1103       ptr += len;
1104       /* CONST_xxx are used as placeholders in the opcode table.  */
1105       num = num2 - num;
1106       if (num < 0 || num > 3)
1107         {
1108           as_bad (_("invalid register list"));
1109           return;
1110         }
1111     }
1112   else
1113     num2 = num, num = 0;
1114   if (type == 1 && *ptr++ != ')')
1115     {
1116       as_bad (_("expected closing paren"));
1117       return;
1118     }
1119   operand[0].mode = RS32;
1120   operand[1].mode = RD32;
1121   operand[0].reg = num;
1122   operand[1].reg = num2;
1123 }
1124
1125 /* Passed a pointer to a list of opcodes which use different
1126    addressing modes, return the opcode which matches the opcodes
1127    provided.  */
1128
1129 static const struct h8_instruction *
1130 get_specific (instruction, operands, size)
1131      const struct h8_instruction *instruction;
1132      struct h8_op *operands;
1133      int size;
1134 {
1135   const struct h8_instruction *this_try = instruction;
1136   const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1137   int found = 0;
1138   int this_index = instruction->idx;
1139   int noperands = 0;
1140
1141   /* There's only one ldm/stm and it's easier to just
1142      get out quick for them.  */
1143   if (OP_KIND (instruction->opcode->how) == O_LDM
1144       || OP_KIND (instruction->opcode->how) == O_STM)
1145     return this_try;
1146
1147   while (noperands < 3 && operands[noperands].mode != 0)
1148     noperands++;
1149
1150   while (this_index == instruction->idx && !found)
1151     {
1152       int this_size;
1153
1154       found = 1;
1155       this_try = instruction++;
1156       this_size = this_try->opcode->how & SN;
1157
1158       if (this_try->noperands != noperands)
1159         found = 0;
1160       else if (this_try->noperands > 0)
1161         {
1162           int i;
1163
1164           for (i = 0; i < this_try->noperands && found; i++)
1165             {
1166               op_type op = this_try->opcode->args.nib[i];
1167               int op_mode = op & MODE;
1168               int op_size = op & SIZE;
1169               int x = operands[i].mode;
1170               int x_mode = x & MODE;
1171               int x_size = x & SIZE;
1172
1173               if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1174                 {
1175                   if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1176                       || (x_size == L_16 && (operands[i].reg & 8) == 8))
1177                     as_warn (_("can't use high part of register in operand %d"), i);
1178
1179                   if (x_size != op_size)
1180                     found = 0;
1181                 }
1182               else if (op_mode == REG)
1183                 {
1184                   if (x_mode == LOWREG)
1185                     x_mode = REG;
1186                   if (x_mode != REG)
1187                     found = 0;
1188
1189                   if (x_size == L_P)
1190                     x_size = (Hmode ? L_32 : L_16);
1191                   if (op_size == L_P)
1192                     op_size = (Hmode ? L_32 : L_16);
1193
1194                   /* The size of the reg is v important.  */
1195                   if (op_size != x_size)
1196                     found = 0;
1197                 }
1198               else if (op_mode & CTRL)  /* control register */
1199                 {
1200                   if (!(x_mode & CTRL))
1201                     found = 0;
1202
1203                   switch (x_mode)
1204                     {
1205                     case CCR:
1206                       if (op_mode != CCR &&
1207                           op_mode != CCR_EXR &&
1208                           op_mode != CC_EX_VB_SB)
1209                         found = 0;
1210                       break;
1211                     case EXR:
1212                       if (op_mode != EXR &&
1213                           op_mode != CCR_EXR &&
1214                           op_mode != CC_EX_VB_SB)
1215                         found = 0;
1216                       break;
1217                     case MACH:
1218                       if (op_mode != MACH &&
1219                           op_mode != MACREG)
1220                         found = 0;
1221                       break;
1222                     case MACL:
1223                       if (op_mode != MACL &&
1224                           op_mode != MACREG)
1225                         found = 0;
1226                       break;
1227                     case VBR:
1228                       if (op_mode != VBR &&
1229                           op_mode != VBR_SBR &&
1230                           op_mode != CC_EX_VB_SB)
1231                         found = 0;
1232                       break;
1233                     case SBR:
1234                       if (op_mode != SBR &&
1235                           op_mode != VBR_SBR &&
1236                           op_mode != CC_EX_VB_SB)
1237                         found = 0;
1238                       break;
1239                     }
1240                 }
1241               else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1242                 {
1243                   operands[i].mode &= ~MODE;
1244                   operands[i].mode |= ABSJMP;
1245                   /* But it may not be 24 bits long.  */
1246                   if (x_mode == ABS && !Hmode)
1247                     {
1248                       operands[i].mode &= ~SIZE;
1249                       operands[i].mode |= L_16;
1250                     }
1251                   if ((operands[i].mode & SIZE) == L_32
1252                       && (op_mode & SIZE) != L_32)
1253                    found = 0;
1254                 }
1255               else if (x_mode == IMM && op_mode != IMM)
1256                 {
1257                   offsetT num = operands[i].exp.X_add_number;
1258                   if (op_mode == KBIT || op_mode == DBIT)
1259                     /* This is ok if the immediate value is sensible.  */;
1260                   else if (op_mode == CONST_2)
1261                     found = num == 2;
1262                   else if (op_mode == CONST_4)
1263                     found = num == 4;
1264                   else if (op_mode == CONST_8)
1265                     found = num == 8;
1266                   else if (op_mode == CONST_16)
1267                     found = num == 16;
1268                   else
1269                     found = 0;
1270                 }
1271               else if (op_mode == PCREL && op_mode == x_mode)
1272                 {
1273                   /* movsd only comes in PCREL16 flavour:
1274                      If x_size is L_8, promote it.  */
1275                   if (OP_KIND (this_try->opcode->how) == O_MOVSD)
1276                     if (x_size == L_8)
1277                       x_size = L_16;
1278
1279                   /* The size of the displacement is important.  */
1280                   if (op_size != x_size)
1281                     found = 0;
1282                 }
1283               else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1284                         || op_mode == INDEXB || op_mode == INDEXW
1285                         || op_mode == INDEXL)
1286                        && op_mode == x_mode)
1287                 {
1288                   /* Promote a L_24 to L_32 if it makes us match.  */
1289                   if (x_size == L_24 && op_size == L_32)
1290                     {
1291                       x &= ~SIZE;
1292                       x |= x_size = L_32;
1293                     }
1294
1295 #if 0 /* ??? */
1296                   /* Promote an L8 to L_16 if it makes us match.  */
1297                   if ((op_mode == ABS || op_mode == DISP) && x_size == L_8)
1298                     {
1299                       if (op_size == L_16)
1300                         x_size = L_16;
1301                     }
1302 #endif
1303
1304                   if (((x_size == L_16 && op_size == L_16U)
1305                        || (x_size == L_8 && op_size == L_8U)
1306                        || (x_size == L_3 && op_size == L_3NZ))
1307                       /* We're deliberately more permissive for ABS modes.  */
1308                       && (op_mode == ABS
1309                           || constant_fits_size_p (operands + i, op_size,
1310                                                    op & NO_SYMBOLS)))
1311                     x_size = op_size;
1312
1313                   if (x_size != 0 && op_size != x_size)
1314                     found = 0;
1315                   else if (x_size == 0
1316                            && ! constant_fits_size_p (operands + i, op_size,
1317                                                       op & NO_SYMBOLS))
1318                     found = 0;
1319                 }
1320               else if (op_mode != x_mode)
1321                 {
1322                   found = 0;
1323                 }
1324             }
1325         }
1326       if (found)
1327         {
1328           if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1329               || (this_try->opcode->available == AV_H8S && ! Smode)
1330               || (this_try->opcode->available == AV_H8H && ! Hmode))
1331             found = 0, found_other = this_try;
1332           else if (this_size != size && (this_size != SN && size != SN))
1333             found_mismatched = this_try, found = 0;
1334
1335         }
1336     }
1337   if (found)
1338     return this_try;
1339   if (found_other)
1340     {
1341       as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1342                found_other->opcode->name,
1343                (! Hmode && ! Smode ? "H8/300"
1344                 : SXmode ? "H8sx"
1345                 : Smode ? "H8/300S"
1346                 : "H8/300H"));
1347     }
1348   else if (found_mismatched)
1349     {
1350       as_warn (_("mismatch between opcode size and operand size"));
1351       return found_mismatched;
1352     }
1353   return 0;
1354 }
1355
1356 static void
1357 check_operand (operand, width, string)
1358      struct h8_op *operand;
1359      unsigned int width;
1360      char *string;
1361 {
1362   if (operand->exp.X_add_symbol == 0
1363       && operand->exp.X_op_symbol == 0)
1364     {
1365       /* No symbol involved, let's look at offset, it's dangerous if
1366          any of the high bits are not 0 or ff's, find out by oring or
1367          anding with the width and seeing if the answer is 0 or all
1368          fs.  */
1369
1370       if (! constant_fits_width_p (operand, width))
1371         {
1372           if (width == 255
1373               && (operand->exp.X_add_number & 0xff00) == 0xff00)
1374             {
1375               /* Just ignore this one - which happens when trying to
1376                  fit a 16 bit address truncated into an 8 bit address
1377                  of something like bset.  */
1378             }
1379           else if (strcmp (string, "@") == 0
1380                    && width == 0xffff
1381                    && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1382             {
1383               /* Just ignore this one - which happens when trying to
1384                  fit a 24 bit address truncated into a 16 bit address
1385                  of something like mov.w.  */
1386             }
1387           else
1388             {
1389               as_warn (_("operand %s0x%lx out of range."), string,
1390                        (unsigned long) operand->exp.X_add_number);
1391             }
1392         }
1393     }
1394 }
1395
1396 /* RELAXMODE has one of 3 values:
1397
1398    0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1399
1400    1 Output a relaxable 24bit absolute mov.w address relocation
1401      (may relax into a 16bit absolute address).
1402
1403    2 Output a relaxable 16/24 absolute mov.b address relocation
1404      (may relax into an 8bit absolute address).  */
1405
1406 static void
1407 do_a_fix_imm (offset, nibble, operand, relaxmode)
1408      int offset, nibble;
1409      struct h8_op *operand;
1410      int relaxmode;
1411 {
1412   int idx;
1413   int size;
1414   int where;
1415   char *bytes = frag_now->fr_literal + offset;
1416
1417   char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1418
1419   if (operand->exp.X_add_symbol == 0)
1420     {
1421       switch (operand->mode & SIZE)
1422         {
1423         case L_2:
1424           check_operand (operand, 0x3, t);
1425           bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1426           break;
1427         case L_3:
1428         case L_3NZ:
1429           check_operand (operand, 0x7, t);
1430           bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1431           break;
1432         case L_4:
1433           check_operand (operand, 0xF, t);
1434           bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1435           break;
1436         case L_5:
1437           check_operand (operand, 0x1F, t);
1438           bytes[0] |= operand->exp.X_add_number & 31;
1439           break;
1440         case L_8:
1441         case L_8U:
1442           check_operand (operand, 0xff, t);
1443           bytes[0] |= operand->exp.X_add_number;
1444           break;
1445         case L_16:
1446         case L_16U:
1447           check_operand (operand, 0xffff, t);
1448           bytes[0] |= operand->exp.X_add_number >> 8;
1449           bytes[1] |= operand->exp.X_add_number >> 0;
1450           break;
1451         case L_24:
1452           check_operand (operand, 0xffffff, t);
1453           bytes[0] |= operand->exp.X_add_number >> 16;
1454           bytes[1] |= operand->exp.X_add_number >> 8;
1455           bytes[2] |= operand->exp.X_add_number >> 0;
1456           break;
1457
1458         case L_32:
1459           /* This should be done with bfd.  */
1460           bytes[0] |= operand->exp.X_add_number >> 24;
1461           bytes[1] |= operand->exp.X_add_number >> 16;
1462           bytes[2] |= operand->exp.X_add_number >> 8;
1463           bytes[3] |= operand->exp.X_add_number >> 0;
1464           if (relaxmode != 0)
1465             {
1466               idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1467               fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1468             }
1469           break;
1470         }
1471     }
1472   else
1473     {
1474       switch (operand->mode & SIZE)
1475         {
1476         case L_24:
1477         case L_32:
1478           size = 4;
1479           where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1480           if (relaxmode == 2)
1481             idx = R_MOV24B1;
1482           else if (relaxmode == 1)
1483             idx = R_MOVL1;
1484           else
1485             idx = R_RELLONG;
1486           break;
1487         default:
1488           as_bad (_("Can't work out size of operand.\n"));
1489         case L_16:
1490         case L_16U:
1491           size = 2;
1492           where = 0;
1493           if (relaxmode == 2)
1494             idx = R_MOV16B1;
1495           else
1496             idx = R_RELWORD;
1497           operand->exp.X_add_number =
1498             ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1499           operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1500           break;
1501         case L_8:
1502           size = 1;
1503           where = 0;
1504           idx = R_RELBYTE;
1505           operand->exp.X_add_number =
1506             ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1507           operand->exp.X_add_number |= bytes[0];
1508         }
1509
1510       fix_new_exp (frag_now,
1511                    offset + where,
1512                    size,
1513                    &operand->exp,
1514                    0,
1515                    idx);
1516     }
1517 }
1518
1519 /* Now we know what sort of opcodes it is, let's build the bytes.  */
1520
1521 static void
1522 build_bytes (this_try, operand)
1523      const struct h8_instruction *this_try;
1524      struct h8_op *operand;
1525 {
1526   int i;
1527   char *output = frag_more (this_try->length);
1528   op_type *nibble_ptr = this_try->opcode->data.nib;
1529   op_type c;
1530   unsigned int nibble_count = 0;
1531   int op_at[3];
1532   int nib = 0;
1533   int movb = 0;
1534   char asnibbles[100];
1535   char *p = asnibbles;
1536   int high, low;
1537
1538   if (!Hmode && this_try->opcode->available != AV_H8)
1539     as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1540              this_try->opcode->name);
1541   else if (!Smode 
1542            && this_try->opcode->available != AV_H8 
1543            && this_try->opcode->available != AV_H8H)
1544     as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1545              this_try->opcode->name);
1546   else if (!SXmode 
1547            && this_try->opcode->available != AV_H8
1548            && this_try->opcode->available != AV_H8H
1549            && this_try->opcode->available != AV_H8S)
1550     as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1551              this_try->opcode->name);
1552
1553   while (*nibble_ptr != (op_type) E)
1554     {
1555       int d;
1556
1557       nib = 0;
1558       c = *nibble_ptr++;
1559
1560       d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1561
1562       if (c < 16)
1563         nib = c;
1564       else
1565         {
1566           int c2 = c & MODE;
1567
1568           if (c2 == REG || c2 == LOWREG
1569               || c2 == IND || c2 == PREINC || c2 == PREDEC
1570               || c2 == POSTINC || c2 == POSTDEC)
1571             {
1572               nib = operand[d].reg;
1573               if (c2 == LOWREG)
1574                 nib &= 7;
1575             }
1576
1577           else if (c & CTRL)    /* Control reg operand.  */
1578             nib = operand[d].reg;
1579
1580           else if ((c & DISPREG) == (DISPREG))
1581             {
1582               nib = operand[d].reg;
1583             }
1584           else if (c2 == ABS)
1585             {
1586               operand[d].mode = c;
1587               op_at[d] = nibble_count;
1588               nib = 0;
1589             }
1590           else if (c2 == IMM || c2 == PCREL || c2 == ABS
1591                    || (c & ABSJMP) || c2 == DISP)
1592             {
1593               operand[d].mode = c;
1594               op_at[d] = nibble_count;
1595               nib = 0;
1596             }
1597           else if ((c & IGNORE) || (c & DATA))
1598             nib = 0;
1599
1600           else if (c2 == DBIT)
1601             {
1602               switch (operand[0].exp.X_add_number)
1603                 {
1604                 case 1:
1605                   nib = c;
1606                   break;
1607                 case 2:
1608                   nib = 0x8 | c;
1609                   break;
1610                 default:
1611                   as_bad (_("Need #1 or #2 here"));
1612                 }
1613             }
1614           else if (c2 == KBIT)
1615             {
1616               switch (operand[0].exp.X_add_number)
1617                 {
1618                 case 1:
1619                   nib = 0;
1620                   break;
1621                 case 2:
1622                   nib = 8;
1623                   break;
1624                 case 4:
1625                   if (!Hmode)
1626                     as_warn (_("#4 not valid on H8/300."));
1627                   nib = 9;
1628                   break;
1629
1630                 default:
1631                   as_bad (_("Need #1 or #2 here"));
1632                   break;
1633                 }
1634               /* Stop it making a fix.  */
1635               operand[0].mode = 0;
1636             }
1637
1638           if (c & MEMRELAX)
1639             operand[d].mode |= MEMRELAX;
1640
1641           if (c & B31)
1642             nib |= 0x8;
1643
1644           if (c & B21)
1645             nib |= 0x4;
1646
1647           if (c & B11)
1648             nib |= 0x2;
1649
1650           if (c & B01)
1651             nib |= 0x1;
1652
1653           if (c2 == MACREG)
1654             {
1655               if (operand[0].mode == MACREG)
1656                 /* stmac has mac[hl] as the first operand.  */
1657                 nib = 2 + operand[0].reg;
1658               else
1659                 /* ldmac has mac[hl] as the second operand.  */
1660                 nib = 2 + operand[1].reg;
1661             }
1662         }
1663       nibble_count++;
1664
1665       *p++ = nib;
1666     }
1667
1668   /* Disgusting.  Why, oh why didn't someone ask us for advice
1669      on the assembler format.  */
1670   if (OP_KIND (this_try->opcode->how) == O_LDM)
1671     {
1672       high = (operand[1].reg >> 8) & 0xf;
1673       low  = (operand[1].reg) & 0xf;
1674       asnibbles[2] = high - low;
1675       asnibbles[7] = high;
1676     }
1677   else if (OP_KIND (this_try->opcode->how) == O_STM)
1678     {
1679       high = (operand[0].reg >> 8) & 0xf;
1680       low  = (operand[0].reg) & 0xf;
1681       asnibbles[2] = high - low;
1682       asnibbles[7] = low;
1683     }
1684
1685   for (i = 0; i < this_try->length; i++)
1686     output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1687
1688   /* Note if this is a movb instruction -- there's a special relaxation
1689      which only applies to them.  */
1690   if (this_try->opcode->how == O (O_MOV, SB))
1691     movb = 1;
1692
1693   /* Output any fixes.  */
1694   for (i = 0; i < this_try->noperands; i++)
1695     {
1696       int x = operand[i].mode;
1697       int x_mode = x & MODE;
1698
1699       if (x_mode == IMM || x_mode == DISP)
1700         do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1701                       op_at[i] & 1, operand + i, (x & MEMRELAX) != 0);
1702
1703       else if (x_mode == ABS)
1704         do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1705                       op_at[i] & 1, operand + i,
1706                       (x & MEMRELAX) ? movb + 1 : 0);
1707
1708       else if (x_mode == PCREL)
1709         {
1710           int size16 = (x & SIZE) == L_16;
1711           int size = size16 ? 2 : 1;
1712           int type = size16 ? R_PCRWORD : R_PCRBYTE;
1713           fixS *fixP;
1714
1715           check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1716
1717           if (operand[i].exp.X_add_number & 1)
1718             as_warn (_("branch operand has odd offset (%lx)\n"),
1719                      (unsigned long) operand->exp.X_add_number);
1720 #ifndef OBJ_ELF
1721           /* The COFF port has always been off by one, changing it
1722              now would be an incompatible change, so we leave it as-is.
1723
1724              We don't want to do this for ELF as we want to be
1725              compatible with the proposed ELF format from Hitachi.  */
1726           operand[i].exp.X_add_number -= 1;
1727 #endif
1728           if (size16)
1729             {
1730               operand[i].exp.X_add_number =
1731                 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1732             }
1733           else
1734             {
1735               operand[i].exp.X_add_number =
1736                 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1737             }
1738
1739           /* For BRA/S.  */
1740           if (! size16)
1741             operand[i].exp.X_add_number |= output[op_at[i] / 2];
1742
1743           fixP = fix_new_exp (frag_now,
1744                               output - frag_now->fr_literal + op_at[i] / 2,
1745                               size,
1746                               &operand[i].exp,
1747                               1,
1748                               type);
1749           fixP->fx_signed = 1;
1750         }
1751       else if (x_mode == MEMIND)
1752         {
1753           check_operand (operand + i, 0xff, "@@");
1754           fix_new_exp (frag_now,
1755                        output - frag_now->fr_literal + 1,
1756                        1,
1757                        &operand[i].exp,
1758                        0,
1759                        R_MEM_INDIRECT);
1760         }
1761       else if (x_mode == VECIND)
1762         {
1763           check_operand (operand + i, 0x7f, "@@");
1764           /* FIXME: approximating the effect of "B31" here...
1765              This is very hackish, and ought to be done a better way.  */
1766           operand[i].exp.X_add_number |= 0x80;
1767           fix_new_exp (frag_now,
1768                        output - frag_now->fr_literal + 1,
1769                        1,
1770                        &operand[i].exp,
1771                        0,
1772                        R_MEM_INDIRECT);
1773         }
1774       else if (x & ABSJMP)
1775         {
1776           int where = 0;
1777           bfd_reloc_code_real_type reloc_type = R_JMPL1;
1778
1779 #ifdef OBJ_ELF
1780           /* To be compatible with the proposed H8 ELF format, we
1781              want the relocation's offset to point to the first byte
1782              that will be modified, not to the start of the instruction.  */
1783           
1784           if ((operand->mode & SIZE) == L_32)
1785             {
1786               where = 2;
1787               reloc_type = R_RELLONG;
1788             }
1789           else
1790             where = 1;
1791 #endif
1792
1793           /* This jmp may be a jump or a branch.  */
1794
1795           check_operand (operand + i, 
1796                          SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff, 
1797                          "@");
1798
1799           if (operand[i].exp.X_add_number & 1)
1800             as_warn (_("branch operand has odd offset (%lx)\n"),
1801                      (unsigned long) operand->exp.X_add_number);
1802
1803           if (!Hmode)
1804             operand[i].exp.X_add_number =
1805               ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1806           fix_new_exp (frag_now,
1807                        output - frag_now->fr_literal + where,
1808                        4,
1809                        &operand[i].exp,
1810                        0,
1811                        reloc_type);
1812         }
1813     }
1814 }
1815
1816 /* Try to give an intelligent error message for common and simple to
1817    detect errors.  */
1818
1819 static void
1820 clever_message (instruction, operand)
1821      const struct h8_instruction *instruction;
1822      struct h8_op *operand;
1823 {
1824   /* Find out if there was more than one possible opcode.  */
1825
1826   if ((instruction + 1)->idx != instruction->idx)
1827     {
1828       int argn;
1829
1830       /* Only one opcode of this flavour, try to guess which operand
1831          didn't match.  */
1832       for (argn = 0; argn < instruction->noperands; argn++)
1833         {
1834           switch (instruction->opcode->args.nib[argn])
1835             {
1836             case RD16:
1837               if (operand[argn].mode != RD16)
1838                 {
1839                   as_bad (_("destination operand must be 16 bit register"));
1840                   return;
1841
1842                 }
1843               break;
1844
1845             case RS8:
1846               if (operand[argn].mode != RS8)
1847                 {
1848                   as_bad (_("source operand must be 8 bit register"));
1849                   return;
1850                 }
1851               break;
1852
1853             case ABS16DST:
1854               if (operand[argn].mode != ABS16DST)
1855                 {
1856                   as_bad (_("destination operand must be 16bit absolute address"));
1857                   return;
1858                 }
1859               break;
1860             case RD8:
1861               if (operand[argn].mode != RD8)
1862                 {
1863                   as_bad (_("destination operand must be 8 bit register"));
1864                   return;
1865                 }
1866               break;
1867
1868             case ABS16SRC:
1869               if (operand[argn].mode != ABS16SRC)
1870                 {
1871                   as_bad (_("source operand must be 16bit absolute address"));
1872                   return;
1873                 }
1874               break;
1875
1876             }
1877         }
1878     }
1879   as_bad (_("invalid operands"));
1880 }
1881
1882
1883 /* Adjust OPERAND's value and size given that it is accessing a field
1884    of SIZE bytes.
1885
1886    This function handles the choice between @(d:2,ERn) and @(d:16,ERn)
1887    when no size is explicitly given.  It also scales down the assembly-level
1888    displacement in an @(d:2,ERn) operand.  */
1889
1890 static void
1891 fix_operand_size (operand, size)
1892      struct h8_op *operand;
1893      int size;
1894 {
1895   if ((operand->mode & MODE) == DISP)
1896     {
1897       /* If the user didn't specify an operand width, see if we
1898          can use @(d:2,ERn).  */
1899       if (SXmode
1900           && (operand->mode & SIZE) == 0
1901           && (operand->exp.X_add_number == size
1902               || operand->exp.X_add_number == size * 2
1903               || operand->exp.X_add_number == size * 3))
1904         operand->mode |= L_2;
1905
1906       /* Scale down the displacement in an @(d:2,ERn) operand.
1907          X_add_number then contains the desired field value.  */
1908       if ((operand->mode & SIZE) == L_2)
1909         {
1910           if (operand->exp.X_add_number % size != 0)
1911             as_warn (_("operand/size mis-match"));
1912           operand->exp.X_add_number /= size;
1913         }
1914     }
1915
1916   /* If the operand needs a size but doesn't have one yet, it must be
1917      a 16-bit integer (see colonmod24).  */
1918   if ((operand->mode & SIZE) == 0)
1919     switch (operand->mode & MODE)
1920       {
1921       case DISP:
1922       case INDEXB:
1923       case INDEXW:
1924       case INDEXL:
1925       case ABS:
1926         operand->mode |= L_16;
1927         break;
1928       }
1929 }
1930
1931
1932 /* This is the guts of the machine-dependent assembler.  STR points to
1933    a machine dependent instruction.  This function is supposed to emit
1934    the frags/bytes it assembles.  */
1935
1936 void
1937 md_assemble (str)
1938      char *str;
1939 {
1940   char *op_start;
1941   char *op_end;
1942   struct h8_op operand[3];
1943   const struct h8_instruction *instruction;
1944   const struct h8_instruction *prev_instruction;
1945
1946   char *dot = 0;
1947   char c;
1948   int size, i;
1949
1950   /* Drop leading whitespace.  */
1951   while (*str == ' ')
1952     str++;
1953
1954   /* Find the op code end.  */
1955   for (op_start = op_end = str;
1956        *op_end != 0 && *op_end != ' ';
1957        op_end++)
1958     {
1959       if (*op_end == '.')
1960         {
1961           dot = op_end + 1;
1962           *op_end = 0;
1963           op_end += 2;
1964           break;
1965         }
1966     }
1967
1968   if (op_end == op_start)
1969     {
1970       as_bad (_("can't find opcode "));
1971     }
1972   c = *op_end;
1973
1974   *op_end = 0;
1975
1976   instruction = (const struct h8_instruction *)
1977     hash_find (opcode_hash_control, op_start);
1978
1979   if (instruction == NULL)
1980     {
1981       as_bad (_("unknown opcode"));
1982       return;
1983     }
1984
1985   /* We used to set input_line_pointer to the result of get_operands,
1986      but that is wrong.  Our caller assumes we don't change it.  */
1987
1988   operand[0].mode = 0;
1989   operand[1].mode = 0;
1990   operand[2].mode = 0;
1991
1992   if (OP_KIND (instruction->opcode->how) == O_MOVAB
1993       || OP_KIND (instruction->opcode->how) == O_MOVAW
1994       || OP_KIND (instruction->opcode->how) == O_MOVAL)
1995     get_mova_operands (op_end, operand);
1996   else if (OP_KIND (instruction->opcode->how) == O_RTEL
1997            || OP_KIND (instruction->opcode->how) == O_RTSL)
1998     get_rtsl_operands (op_end, operand);
1999   else
2000     get_operands (instruction->noperands, op_end, operand);
2001
2002   *op_end = c;
2003   prev_instruction = instruction;
2004
2005   size = SN;
2006   if (dot)
2007     {
2008       switch (*dot)
2009         {
2010         case 'b':
2011           size = SB;
2012           break;
2013
2014         case 'w':
2015           size = SW;
2016           break;
2017
2018         case 'l':
2019           size = SL;
2020           break;
2021         }
2022     }
2023   if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
2024       OP_KIND (instruction->opcode->how) == O_MOVAW ||
2025       OP_KIND (instruction->opcode->how) == O_MOVAL)
2026     {
2027       switch (operand[0].mode & MODE)
2028         {
2029         case INDEXB:
2030         default:
2031           fix_operand_size (&operand[1], 1);
2032           break;
2033         case INDEXW:
2034           fix_operand_size (&operand[1], 2);
2035           break;
2036         case INDEXL:
2037           fix_operand_size (&operand[1], 4);
2038           break;
2039         }
2040     }
2041   else
2042     {
2043       for (i = 0; i < 3 && operand[i].mode != 0; i++)
2044         switch (size)
2045           {
2046           case SN:
2047           case SB:
2048           default:
2049             fix_operand_size (&operand[i], 1);
2050             break;
2051           case SW:
2052             fix_operand_size (&operand[i], 2);
2053             break;
2054           case SL:
2055             fix_operand_size (&operand[i], 4);
2056             break;
2057           }
2058     }
2059
2060   instruction = get_specific (instruction, operand, size);
2061
2062   if (instruction == 0)
2063     {
2064       /* Couldn't find an opcode which matched the operands.  */
2065       char *where = frag_more (2);
2066
2067       where[0] = 0x0;
2068       where[1] = 0x0;
2069       clever_message (prev_instruction, operand);
2070
2071       return;
2072     }
2073
2074   build_bytes (instruction, operand);
2075
2076 #ifdef BFD_ASSEMBLER
2077   dwarf2_emit_insn (instruction->length);
2078 #endif
2079 }
2080
2081 #ifndef BFD_ASSEMBLER
2082 void
2083 tc_crawl_symbol_chain (headers)
2084      object_headers *headers ATTRIBUTE_UNUSED;
2085 {
2086   printf (_("call to tc_crawl_symbol_chain \n"));
2087 }
2088 #endif
2089
2090 symbolS *
2091 md_undefined_symbol (name)
2092      char *name ATTRIBUTE_UNUSED;
2093 {
2094   return 0;
2095 }
2096
2097 #ifndef BFD_ASSEMBLER
2098 void
2099 tc_headers_hook (headers)
2100      object_headers *headers ATTRIBUTE_UNUSED;
2101 {
2102   printf (_("call to tc_headers_hook \n"));
2103 }
2104 #endif
2105
2106 /* Various routines to kill one day */
2107 /* Equal to MAX_PRECISION in atof-ieee.c */
2108 #define MAX_LITTLENUMS 6
2109
2110 /* Turn a string in input_line_pointer into a floating point constant
2111    of type TYPE, and store the appropriate bytes in *LITP.  The number
2112    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
2113    returned, or NULL on OK.  */
2114
2115 char *
2116 md_atof (type, litP, sizeP)
2117      char type;
2118      char *litP;
2119      int *sizeP;
2120 {
2121   int prec;
2122   LITTLENUM_TYPE words[MAX_LITTLENUMS];
2123   LITTLENUM_TYPE *wordP;
2124   char *t;
2125
2126   switch (type)
2127     {
2128     case 'f':
2129     case 'F':
2130     case 's':
2131     case 'S':
2132       prec = 2;
2133       break;
2134
2135     case 'd':
2136     case 'D':
2137     case 'r':
2138     case 'R':
2139       prec = 4;
2140       break;
2141
2142     case 'x':
2143     case 'X':
2144       prec = 6;
2145       break;
2146
2147     case 'p':
2148     case 'P':
2149       prec = 6;
2150       break;
2151
2152     default:
2153       *sizeP = 0;
2154       return _("Bad call to MD_ATOF()");
2155     }
2156   t = atof_ieee (input_line_pointer, type, words);
2157   if (t)
2158     input_line_pointer = t;
2159
2160   *sizeP = prec * sizeof (LITTLENUM_TYPE);
2161   for (wordP = words; prec--;)
2162     {
2163       md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
2164       litP += sizeof (LITTLENUM_TYPE);
2165     }
2166   return 0;
2167 }
2168 \f
2169 const char *md_shortopts = "";
2170 struct option md_longopts[] = {
2171   {NULL, no_argument, NULL, 0}
2172 };
2173
2174 size_t md_longopts_size = sizeof (md_longopts);
2175
2176 int
2177 md_parse_option (c, arg)
2178      int c ATTRIBUTE_UNUSED;
2179      char *arg ATTRIBUTE_UNUSED;
2180 {
2181   return 0;
2182 }
2183
2184 void
2185 md_show_usage (stream)
2186      FILE *stream ATTRIBUTE_UNUSED;
2187 {
2188 }
2189 \f
2190 void tc_aout_fix_to_chars PARAMS ((void));
2191
2192 void
2193 tc_aout_fix_to_chars ()
2194 {
2195   printf (_("call to tc_aout_fix_to_chars \n"));
2196   abort ();
2197 }
2198
2199 void
2200 md_convert_frag (headers, seg, fragP)
2201 #ifdef BFD_ASSEMBLER
2202      bfd *headers ATTRIBUTE_UNUSED;
2203 #else
2204      object_headers *headers ATTRIBUTE_UNUSED;
2205 #endif
2206      segT seg ATTRIBUTE_UNUSED;
2207      fragS *fragP ATTRIBUTE_UNUSED;
2208 {
2209   printf (_("call to md_convert_frag \n"));
2210   abort ();
2211 }
2212
2213 #ifdef BFD_ASSEMBLER
2214 valueT
2215 md_section_align (segment, size)
2216      segT segment;
2217      valueT size;
2218 {
2219   int align = bfd_get_section_alignment (stdoutput, segment);
2220   return ((size + (1 << align) - 1) & (-1 << align));
2221 }
2222 #else
2223 valueT
2224 md_section_align (seg, size)
2225      segT seg;
2226      valueT size;
2227 {
2228   return ((size + (1 << section_alignment[(int) seg]) - 1)
2229           & (-1 << section_alignment[(int) seg]));
2230 }
2231 #endif
2232
2233
2234 void
2235 md_apply_fix3 (fixP, valP, seg)
2236      fixS *fixP;
2237      valueT *valP;
2238      segT seg ATTRIBUTE_UNUSED;
2239 {
2240   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2241   long val = *valP;
2242
2243   switch (fixP->fx_size)
2244     {
2245     case 1:
2246       *buf++ = val;
2247       break;
2248     case 2:
2249       *buf++ = (val >> 8);
2250       *buf++ = val;
2251       break;
2252     case 4:
2253       *buf++ = (val >> 24);
2254       *buf++ = (val >> 16);
2255       *buf++ = (val >> 8);
2256       *buf++ = val;
2257       break;
2258     default:
2259       abort ();
2260     }
2261
2262   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2263     fixP->fx_done = 1;
2264 }
2265
2266 int
2267 md_estimate_size_before_relax (fragP, segment_type)
2268      register fragS *fragP ATTRIBUTE_UNUSED;
2269      register segT segment_type ATTRIBUTE_UNUSED;
2270 {
2271   printf (_("call tomd_estimate_size_before_relax \n"));
2272   abort ();
2273 }
2274
2275 /* Put number into target byte order.  */
2276 void
2277 md_number_to_chars (ptr, use, nbytes)
2278      char *ptr;
2279      valueT use;
2280      int nbytes;
2281 {
2282   number_to_chars_bigendian (ptr, use, nbytes);
2283 }
2284
2285 long
2286 md_pcrel_from (fixP)
2287      fixS *fixP ATTRIBUTE_UNUSED;
2288 {
2289   abort ();
2290 }
2291
2292 #ifndef BFD_ASSEMBLER
2293 void
2294 tc_reloc_mangle (fix_ptr, intr, base)
2295      fixS *fix_ptr;
2296      struct internal_reloc *intr;
2297      bfd_vma base;
2298
2299 {
2300   symbolS *symbol_ptr;
2301
2302   symbol_ptr = fix_ptr->fx_addsy;
2303
2304   /* If this relocation is attached to a symbol then it's ok
2305      to output it.  */
2306   if (fix_ptr->fx_r_type == TC_CONS_RELOC)
2307     {
2308       /* cons likes to create reloc32's whatever the size of the reloc..
2309        */
2310       switch (fix_ptr->fx_size)
2311         {
2312         case 4:
2313           intr->r_type = R_RELLONG;
2314           break;
2315         case 2:
2316           intr->r_type = R_RELWORD;
2317           break;
2318         case 1:
2319           intr->r_type = R_RELBYTE;
2320           break;
2321         default:
2322           abort ();
2323         }
2324     }
2325   else
2326     {
2327       intr->r_type = fix_ptr->fx_r_type;
2328     }
2329
2330   intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
2331   intr->r_offset = fix_ptr->fx_offset;
2332
2333   if (symbol_ptr)
2334     {
2335       if (symbol_ptr->sy_number != -1)
2336         intr->r_symndx = symbol_ptr->sy_number;
2337       else
2338         {
2339           symbolS *segsym;
2340
2341           /* This case arises when a reference is made to `.'.  */
2342           segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot;
2343           if (segsym == NULL)
2344             intr->r_symndx = -1;
2345           else
2346             {
2347               intr->r_symndx = segsym->sy_number;
2348               intr->r_offset += S_GET_VALUE (symbol_ptr);
2349             }
2350         }
2351     }
2352   else
2353     intr->r_symndx = -1;
2354 }
2355 #else /* BFD_ASSEMBLER */
2356 arelent *
2357 tc_gen_reloc (section, fixp)
2358      asection *section ATTRIBUTE_UNUSED;
2359      fixS *fixp;
2360 {
2361   arelent *rel;
2362   bfd_reloc_code_real_type r_type;
2363
2364   if (fixp->fx_addsy && fixp->fx_subsy)
2365     {
2366       if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2367           || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2368         {
2369           as_bad_where (fixp->fx_file, fixp->fx_line,
2370                         "Difference of symbols in different sections is not supported");
2371           return NULL;
2372         }
2373     }
2374
2375   rel = (arelent *) xmalloc (sizeof (arelent));
2376   rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2377   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2378   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2379   rel->addend = fixp->fx_offset;
2380
2381   r_type = fixp->fx_r_type;
2382
2383 #define DEBUG 0
2384 #if DEBUG
2385   fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2386   fflush(stderr);
2387 #endif
2388   rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2389   if (rel->howto == NULL)
2390     {
2391       as_bad_where (fixp->fx_file, fixp->fx_line,
2392                     _("Cannot represent relocation type %s"),
2393                     bfd_get_reloc_code_name (r_type));
2394       return NULL;
2395     }
2396
2397   return rel;
2398 }
2399 #endif