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