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