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