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