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