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