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