Update year range in copyright notice of all files.
[external/binutils.git] / gas / config / tc-h8300.c
1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2    Copyright (C) 1991-2017 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           /* Fall through.  */
1436         case L_16:
1437         case L_16U:
1438           size = 2;
1439           where = 0;
1440           if (relaxmode == 2)
1441             idx = R_MOV16B1;
1442           else
1443             idx = R_RELWORD;
1444           operand->exp.X_add_number =
1445             ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1446           operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1447           break;
1448         case L_8:
1449           size = 1;
1450           where = 0;
1451           idx = R_RELBYTE;
1452           operand->exp.X_add_number =
1453             ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1454           operand->exp.X_add_number |= bytes[0];
1455         }
1456
1457       fix_new_exp (frag_now,
1458                    offset + where,
1459                    size,
1460                    &operand->exp,
1461                    0,
1462                    idx);
1463     }
1464 }
1465
1466 /* Now we know what sort of opcodes it is, let's build the bytes.  */
1467
1468 static void
1469 build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1470 {
1471   int i;
1472   char *output = frag_more (this_try->length);
1473   const op_type *nibble_ptr = this_try->opcode->data.nib;
1474   op_type c;
1475   unsigned int nibble_count = 0;
1476   int op_at[3];
1477   int nib = 0;
1478   int movb = 0;
1479   char asnibbles[100];
1480   char *p = asnibbles;
1481   int high, low;
1482
1483   if (!Hmode && this_try->opcode->available != AV_H8)
1484     as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1485              this_try->opcode->name);
1486   else if (!Smode
1487            && this_try->opcode->available != AV_H8
1488            && this_try->opcode->available != AV_H8H)
1489     as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1490              this_try->opcode->name);
1491   else if (!SXmode
1492            && this_try->opcode->available != AV_H8
1493            && this_try->opcode->available != AV_H8H
1494            && this_try->opcode->available != AV_H8S)
1495     as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1496              this_try->opcode->name);
1497
1498   while (*nibble_ptr != (op_type) E)
1499     {
1500       int d;
1501
1502       nib = 0;
1503       c = *nibble_ptr++;
1504
1505       d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1506
1507       if (c < 16)
1508         nib = c;
1509       else
1510         {
1511           int c2 = c & MODE;
1512
1513           if (c2 == REG || c2 == LOWREG
1514               || c2 == IND || c2 == PREINC || c2 == PREDEC
1515               || c2 == POSTINC || c2 == POSTDEC)
1516             {
1517               nib = operand[d].reg;
1518               if (c2 == LOWREG)
1519                 nib &= 7;
1520             }
1521
1522           else if (c & CTRL)    /* Control reg operand.  */
1523             nib = operand[d].reg;
1524
1525           else if ((c & DISPREG) == (DISPREG))
1526             {
1527               nib = operand[d].reg;
1528             }
1529           else if (c2 == ABS)
1530             {
1531               operand[d].mode = c;
1532               op_at[d] = nibble_count;
1533               nib = 0;
1534             }
1535           else if (c2 == IMM || c2 == PCREL || c2 == ABS
1536                    || (c & ABSJMP) || c2 == DISP)
1537             {
1538               operand[d].mode = c;
1539               op_at[d] = nibble_count;
1540               nib = 0;
1541             }
1542           else if ((c & IGNORE) || (c & DATA))
1543             nib = 0;
1544
1545           else if (c2 == DBIT)
1546             {
1547               switch (operand[0].exp.X_add_number)
1548                 {
1549                 case 1:
1550                   nib = c;
1551                   break;
1552                 case 2:
1553                   nib = 0x8 | c;
1554                   break;
1555                 default:
1556                   as_bad (_("Need #1 or #2 here"));
1557                 }
1558             }
1559           else if (c2 == KBIT)
1560             {
1561               switch (operand[0].exp.X_add_number)
1562                 {
1563                 case 1:
1564                   nib = 0;
1565                   break;
1566                 case 2:
1567                   nib = 8;
1568                   break;
1569                 case 4:
1570                   if (!Hmode)
1571                     as_warn (_("#4 not valid on H8/300."));
1572                   nib = 9;
1573                   break;
1574
1575                 default:
1576                   as_bad (_("Need #1 or #2 here"));
1577                   break;
1578                 }
1579               /* Stop it making a fix.  */
1580               operand[0].mode = 0;
1581             }
1582
1583           if (c & MEMRELAX)
1584             operand[d].mode |= MEMRELAX;
1585
1586           if (c & B31)
1587             nib |= 0x8;
1588
1589           if (c & B21)
1590             nib |= 0x4;
1591
1592           if (c & B11)
1593             nib |= 0x2;
1594
1595           if (c & B01)
1596             nib |= 0x1;
1597
1598           if (c2 == MACREG)
1599             {
1600               if (operand[0].mode == MACREG)
1601                 /* stmac has mac[hl] as the first operand.  */
1602                 nib = 2 + operand[0].reg;
1603               else
1604                 /* ldmac has mac[hl] as the second operand.  */
1605                 nib = 2 + operand[1].reg;
1606             }
1607         }
1608       nibble_count++;
1609
1610       *p++ = nib;
1611     }
1612
1613   /* Disgusting.  Why, oh why didn't someone ask us for advice
1614      on the assembler format.  */
1615   if (OP_KIND (this_try->opcode->how) == O_LDM)
1616     {
1617       high = (operand[1].reg >> 8) & 0xf;
1618       low  = (operand[1].reg) & 0xf;
1619       asnibbles[2] = high - low;
1620       asnibbles[7] = high;
1621     }
1622   else if (OP_KIND (this_try->opcode->how) == O_STM)
1623     {
1624       high = (operand[0].reg >> 8) & 0xf;
1625       low  = (operand[0].reg) & 0xf;
1626       asnibbles[2] = high - low;
1627       asnibbles[7] = low;
1628     }
1629
1630   for (i = 0; i < this_try->length; i++)
1631     output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1632
1633   /* Note if this is a mov.b or a bit manipulation instruction
1634      there is a special relaxation which only applies.  */
1635   if (   this_try->opcode->how == O (O_MOV,   SB)
1636       || this_try->opcode->how == O (O_BCLR,  SB)
1637       || this_try->opcode->how == O (O_BAND,  SB)
1638       || this_try->opcode->how == O (O_BIAND, SB)
1639       || this_try->opcode->how == O (O_BILD,  SB)
1640       || this_try->opcode->how == O (O_BIOR,  SB)
1641       || this_try->opcode->how == O (O_BIST,  SB)
1642       || this_try->opcode->how == O (O_BIXOR, SB)
1643       || this_try->opcode->how == O (O_BLD,   SB)
1644       || this_try->opcode->how == O (O_BNOT,  SB)
1645       || this_try->opcode->how == O (O_BOR,   SB)
1646       || this_try->opcode->how == O (O_BSET,  SB)
1647       || this_try->opcode->how == O (O_BST,   SB)
1648       || this_try->opcode->how == O (O_BTST,  SB)
1649       || this_try->opcode->how == O (O_BXOR,  SB))
1650     movb = 1;
1651
1652   /* Output any fixes.  */
1653   for (i = 0; i < this_try->noperands; i++)
1654     {
1655       int x = operand[i].mode;
1656       int x_mode = x & MODE;
1657
1658       if (x_mode == IMM || x_mode == DISP)
1659         {
1660 #ifndef OBJ_ELF
1661           /* Remove MEMRELAX flag added in h8300.h on mov with
1662              addressing mode "register indirect with displacement".  */
1663           if (x_mode == DISP)
1664             x &= ~MEMRELAX;
1665 #endif
1666           do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1667                         op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
1668                         this_try);
1669         }
1670       else if (x_mode == ABS)
1671         do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1672                       op_at[i] & 1, operand + i,
1673                       (x & MEMRELAX) ? movb + 1 : 0,
1674                       this_try);
1675
1676       else if (x_mode == PCREL)
1677         {
1678           int size16 = (x & SIZE) == L_16;
1679           int size = size16 ? 2 : 1;
1680           int type = size16 ? R_PCRWORD : R_PCRBYTE;
1681           fixS *fixP;
1682
1683           check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1684
1685           if (operand[i].exp.X_add_number & 1)
1686             as_warn (_("branch operand has odd offset (%lx)\n"),
1687                      (unsigned long) operand->exp.X_add_number);
1688 #ifndef OBJ_ELF
1689           /* The COFF port has always been off by one, changing it
1690              now would be an incompatible change, so we leave it as-is.
1691
1692              We don't want to do this for ELF as we want to be
1693              compatible with the proposed ELF format from Hitachi.  */
1694           operand[i].exp.X_add_number -= 1;
1695 #endif
1696           if (size16)
1697             {
1698               operand[i].exp.X_add_number =
1699                 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1700             }
1701           else
1702             {
1703               operand[i].exp.X_add_number =
1704                 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1705             }
1706
1707           /* For BRA/S.  */
1708           if (! size16)
1709             operand[i].exp.X_add_number |= output[op_at[i] / 2];
1710
1711           fixP = fix_new_exp (frag_now,
1712                               output - frag_now->fr_literal + op_at[i] / 2,
1713                               size,
1714                               &operand[i].exp,
1715                               1,
1716                               type);
1717           fixP->fx_signed = 1;
1718         }
1719       else if (x_mode == MEMIND)
1720         {
1721           check_operand (operand + i, 0xff, "@@");
1722           fix_new_exp (frag_now,
1723                        output - frag_now->fr_literal + 1,
1724                        1,
1725                        &operand[i].exp,
1726                        0,
1727                        R_MEM_INDIRECT);
1728         }
1729       else if (x_mode == VECIND)
1730         {
1731           check_operand (operand + i, 0x7f, "@@");
1732           /* FIXME: approximating the effect of "B31" here...
1733              This is very hackish, and ought to be done a better way.  */
1734           operand[i].exp.X_add_number |= 0x80;
1735           fix_new_exp (frag_now,
1736                        output - frag_now->fr_literal + 1,
1737                        1,
1738                        &operand[i].exp,
1739                        0,
1740                        R_MEM_INDIRECT);
1741         }
1742       else if (x & ABSJMP)
1743         {
1744           int where = 0;
1745           bfd_reloc_code_real_type reloc_type = R_JMPL1;
1746
1747 #ifdef OBJ_ELF
1748           /* To be compatible with the proposed H8 ELF format, we
1749              want the relocation's offset to point to the first byte
1750              that will be modified, not to the start of the instruction.  */
1751
1752           if ((operand->mode & SIZE) == L_32)
1753             {
1754               where = 2;
1755               reloc_type = R_RELLONG;
1756             }
1757           else
1758             where = 1;
1759 #endif
1760
1761           /* This jmp may be a jump or a branch.  */
1762
1763           check_operand (operand + i,
1764                          SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1765                          "@");
1766
1767           if (operand[i].exp.X_add_number & 1)
1768             as_warn (_("branch operand has odd offset (%lx)\n"),
1769                      (unsigned long) operand->exp.X_add_number);
1770
1771           if (!Hmode)
1772             operand[i].exp.X_add_number =
1773               ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1774           fix_new_exp (frag_now,
1775                        output - frag_now->fr_literal + where,
1776                        4,
1777                        &operand[i].exp,
1778                        0,
1779                        reloc_type);
1780         }
1781     }
1782 }
1783
1784 /* Try to give an intelligent error message for common and simple to
1785    detect errors.  */
1786
1787 static void
1788 clever_message (const struct h8_instruction *instruction,
1789                 struct h8_op *operand)
1790 {
1791   /* Find out if there was more than one possible opcode.  */
1792
1793   if ((instruction + 1)->idx != instruction->idx)
1794     {
1795       int argn;
1796
1797       /* Only one opcode of this flavour, try to guess which operand
1798          didn't match.  */
1799       for (argn = 0; argn < instruction->noperands; argn++)
1800         {
1801           switch (instruction->opcode->args.nib[argn])
1802             {
1803             case RD16:
1804               if (operand[argn].mode != RD16)
1805                 {
1806                   as_bad (_("destination operand must be 16 bit register"));
1807                   return;
1808
1809                 }
1810               break;
1811
1812             case RS8:
1813               if (operand[argn].mode != RS8)
1814                 {
1815                   as_bad (_("source operand must be 8 bit register"));
1816                   return;
1817                 }
1818               break;
1819
1820             case ABS16DST:
1821               if (operand[argn].mode != ABS16DST)
1822                 {
1823                   as_bad (_("destination operand must be 16bit absolute address"));
1824                   return;
1825                 }
1826               break;
1827             case RD8:
1828               if (operand[argn].mode != RD8)
1829                 {
1830                   as_bad (_("destination operand must be 8 bit register"));
1831                   return;
1832                 }
1833               break;
1834
1835             case ABS16SRC:
1836               if (operand[argn].mode != ABS16SRC)
1837                 {
1838                   as_bad (_("source operand must be 16bit absolute address"));
1839                   return;
1840                 }
1841               break;
1842
1843             }
1844         }
1845     }
1846   as_bad (_("invalid operands"));
1847 }
1848
1849
1850 /* If OPERAND is part of an address, adjust its size and value given
1851    that it addresses SIZE bytes.
1852
1853    This function decides how big non-immediate constants are when no
1854    size was explicitly given.  It also scales down the assembly-level
1855    displacement in an @(d:2,ERn) operand.  */
1856
1857 static void
1858 fix_operand_size (struct h8_op *operand, int size)
1859 {
1860   if (SXmode && (operand->mode & MODE) == DISP)
1861     {
1862       /* If the user didn't specify an operand width, see if we
1863          can use @(d:2,ERn).  */
1864       if ((operand->mode & SIZE) == 0
1865           && operand->exp.X_add_symbol == 0
1866           && operand->exp.X_op_symbol == 0
1867           && (operand->exp.X_add_number == size
1868               || operand->exp.X_add_number == size * 2
1869               || operand->exp.X_add_number == size * 3))
1870         operand->mode |= L_2;
1871
1872       /* Scale down the displacement in an @(d:2,ERn) operand.
1873          X_add_number then contains the desired field value.  */
1874       if ((operand->mode & SIZE) == L_2)
1875         {
1876           if (operand->exp.X_add_number % size != 0)
1877             as_warn (_("operand/size mis-match"));
1878           operand->exp.X_add_number /= size;
1879         }
1880     }
1881
1882   if ((operand->mode & SIZE) == 0)
1883     switch (operand->mode & MODE)
1884       {
1885       case DISP:
1886       case INDEXB:
1887       case INDEXW:
1888       case INDEXL:
1889       case ABS:
1890         /* Pick a 24-bit address unless we know that a 16-bit address
1891            is safe.  get_specific() will relax L_24 into L_32 where
1892            necessary.  */
1893         if (Hmode
1894             && !Nmode
1895             && ((((addressT) operand->exp.X_add_number + 0x8000)
1896                  & 0xffffffff) > 0xffff
1897                 || operand->exp.X_add_symbol != 0
1898                 || operand->exp.X_op_symbol != 0))
1899           operand->mode |= L_24;
1900         else
1901           operand->mode |= L_16;
1902         break;
1903
1904       case PCREL:
1905         if ((((addressT) operand->exp.X_add_number + 0x80)
1906              & 0xffffffff) <= 0xff)
1907           {
1908             if (operand->exp.X_add_symbol != NULL)
1909               operand->mode |= bsize;
1910             else
1911               operand->mode |= L_8;
1912           }
1913         else
1914           operand->mode |= L_16;
1915         break;
1916       }
1917 }
1918
1919
1920 /* This is the guts of the machine-dependent assembler.  STR points to
1921    a machine dependent instruction.  This function is supposed to emit
1922    the frags/bytes it assembles.  */
1923
1924 void
1925 md_assemble (char *str)
1926 {
1927   char *op_start;
1928   char *op_end;
1929   struct h8_op operand[3];
1930   const struct h8_instruction *instruction;
1931   const struct h8_instruction *prev_instruction;
1932
1933   char *dot = 0;
1934   char *slash = 0;
1935   char c;
1936   int size, i;
1937
1938   /* Drop leading whitespace.  */
1939   while (*str == ' ')
1940     str++;
1941
1942   /* Find the op code end.  */
1943   for (op_start = op_end = str;
1944        *op_end != 0 && *op_end != ' ';
1945        op_end++)
1946     {
1947       if (*op_end == '.')
1948         {
1949           dot = op_end + 1;
1950           *op_end = 0;
1951           op_end += 2;
1952           break;
1953         }
1954       else if (*op_end == '/' && ! slash)
1955         slash = op_end;
1956     }
1957
1958   if (op_end == op_start)
1959     {
1960       as_bad (_("can't find opcode "));
1961     }
1962   c = *op_end;
1963
1964   *op_end = 0;
1965
1966   /* The assembler stops scanning the opcode at slashes, so it fails
1967      to make characters following them lower case.  Fix them.  */
1968   if (slash)
1969     while (*++slash)
1970       *slash = TOLOWER (*slash);
1971
1972   instruction = (const struct h8_instruction *)
1973     hash_find (opcode_hash_control, op_start);
1974
1975   if (instruction == NULL)
1976     {
1977       as_bad (_("unknown opcode"));
1978       return;
1979     }
1980
1981   /* We used to set input_line_pointer to the result of get_operands,
1982      but that is wrong.  Our caller assumes we don't change it.  */
1983
1984   operand[0].mode = 0;
1985   operand[1].mode = 0;
1986   operand[2].mode = 0;
1987
1988   if (OP_KIND (instruction->opcode->how) == O_MOVAB
1989       || OP_KIND (instruction->opcode->how) == O_MOVAW
1990       || OP_KIND (instruction->opcode->how) == O_MOVAL)
1991     get_mova_operands (op_end, operand);
1992   else if (OP_KIND (instruction->opcode->how) == O_RTEL
1993            || OP_KIND (instruction->opcode->how) == O_RTSL)
1994     get_rtsl_operands (op_end, operand);
1995   else
1996     get_operands (instruction->noperands, op_end, operand);
1997
1998   *op_end = c;
1999   prev_instruction = instruction;
2000
2001   /* Now we have operands from instruction.
2002      Let's check them out for ldm and stm.  */
2003   if (OP_KIND (instruction->opcode->how) == O_LDM)
2004     {
2005       /* The first operand must be @er7+, and the
2006          second operand must be a register pair.  */
2007       if ((operand[0].mode != RSINC)
2008            || (operand[0].reg != 7)
2009            || ((operand[1].reg & 0x80000000) == 0))
2010         as_bad (_("invalid operand in ldm"));
2011     }
2012   else if (OP_KIND (instruction->opcode->how) == O_STM)
2013     {
2014       /* The first operand must be a register pair,
2015          and the second operand must be @-er7.  */
2016       if (((operand[0].reg & 0x80000000) == 0)
2017             || (operand[1].mode != RDDEC)
2018             || (operand[1].reg != 7))
2019         as_bad (_("invalid operand in stm"));
2020     }
2021
2022   size = SN;
2023   if (dot)
2024     {
2025       switch (TOLOWER (*dot))
2026         {
2027         case 'b':
2028           size = SB;
2029           break;
2030
2031         case 'w':
2032           size = SW;
2033           break;
2034
2035         case 'l':
2036           size = SL;
2037           break;
2038         }
2039     }
2040   if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
2041       OP_KIND (instruction->opcode->how) == O_MOVAW ||
2042       OP_KIND (instruction->opcode->how) == O_MOVAL)
2043     {
2044       switch (operand[0].mode & MODE)
2045         {
2046         case INDEXB:
2047         default:
2048           fix_operand_size (&operand[1], 1);
2049           break;
2050         case INDEXW:
2051           fix_operand_size (&operand[1], 2);
2052           break;
2053         case INDEXL:
2054           fix_operand_size (&operand[1], 4);
2055           break;
2056         }
2057     }
2058   else
2059     {
2060       for (i = 0; i < 3 && operand[i].mode != 0; i++)
2061         switch (size)
2062           {
2063           case SN:
2064           case SB:
2065           default:
2066             fix_operand_size (&operand[i], 1);
2067             break;
2068           case SW:
2069             fix_operand_size (&operand[i], 2);
2070             break;
2071           case SL:
2072             fix_operand_size (&operand[i], 4);
2073             break;
2074           }
2075     }
2076
2077   instruction = get_specific (instruction, operand, size);
2078
2079   if (instruction == 0)
2080     {
2081       /* Couldn't find an opcode which matched the operands.  */
2082       char *where = frag_more (2);
2083
2084       where[0] = 0x0;
2085       where[1] = 0x0;
2086       clever_message (prev_instruction, operand);
2087
2088       return;
2089     }
2090
2091   build_bytes (instruction, operand);
2092
2093   dwarf2_emit_insn (instruction->length);
2094 }
2095
2096 symbolS *
2097 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2098 {
2099   return 0;
2100 }
2101
2102 /* Various routines to kill one day.  */
2103
2104 const char *
2105 md_atof (int type, char *litP, int *sizeP)
2106 {
2107   return ieee_md_atof (type, litP, sizeP, TRUE);
2108 }
2109 \f
2110 #define OPTION_H_TICK_HEX      (OPTION_MD_BASE)
2111 #define OPTION_MACH            (OPTION_MD_BASE+1)
2112
2113 const char *md_shortopts = "";
2114 struct option md_longopts[] =
2115 {
2116   { "h-tick-hex", no_argument,        NULL, OPTION_H_TICK_HEX  },
2117   { "mach", required_argument, NULL, OPTION_MACH },
2118   {NULL, no_argument, NULL, 0}
2119 };
2120
2121 size_t md_longopts_size = sizeof (md_longopts);
2122
2123 struct mach_func
2124 {
2125   const char *name;
2126   void (*func) (void);
2127 };
2128
2129 static void
2130 mach_h8300h (void)
2131 {
2132   Hmode = 1;
2133   Smode = 0;
2134   Nmode = 0;
2135   SXmode = 0;
2136   default_mach = bfd_mach_h8300h;
2137 }
2138
2139 static void
2140 mach_h8300hn (void)
2141 {
2142   Hmode = 1;
2143   Smode = 0;
2144   Nmode = 1;
2145   SXmode = 0;
2146   default_mach = bfd_mach_h8300hn;
2147 }
2148
2149 static void
2150 mach_h8300s (void)
2151 {
2152   Hmode = 1;
2153   Smode = 1;
2154   Nmode = 0;
2155   SXmode = 0;
2156   default_mach = bfd_mach_h8300s;
2157 }
2158
2159 static void
2160 mach_h8300sn (void)
2161 {
2162   Hmode = 1;
2163   Smode = 1;
2164   Nmode = 1;
2165   SXmode = 0;
2166   default_mach = bfd_mach_h8300sn;
2167 }
2168
2169 static void
2170 mach_h8300sx (void)
2171 {
2172   Hmode = 1;
2173   Smode = 1;
2174   Nmode = 0;
2175   SXmode = 1;
2176   default_mach = bfd_mach_h8300sx;
2177 }
2178
2179 static void
2180 mach_h8300sxn (void)
2181 {
2182   Hmode = 1;
2183   Smode = 1;
2184   Nmode = 1;
2185   SXmode = 1;
2186   default_mach = bfd_mach_h8300sxn;
2187 }
2188
2189 const struct mach_func mach_table[] =
2190 {
2191   {"h8300h",  mach_h8300h},
2192   {"h8300hn", mach_h8300hn},
2193   {"h8300s",  mach_h8300s},
2194   {"h8300sn", mach_h8300sn},
2195   {"h8300sx", mach_h8300sx},
2196   {"h8300sxn", mach_h8300sxn}
2197 };
2198
2199 int
2200 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
2201 {
2202   unsigned int i;
2203   switch (c)
2204     {
2205     case OPTION_H_TICK_HEX:
2206       enable_h_tick_hex = 1;
2207       break;
2208     case OPTION_MACH:
2209       for (i = 0; i < sizeof(mach_table) / sizeof(struct mach_func); i++)
2210         {
2211           if (strcasecmp (arg, mach_table[i].name) == 0)
2212             {
2213               mach_table[i].func();
2214               break;
2215             }
2216         }
2217       if (i >= sizeof(mach_table) / sizeof(struct mach_func))
2218         as_bad (_("Invalid argument to --mach option: %s"), arg);
2219       break;
2220     default:
2221       return 0;
2222     }
2223   return 1;
2224 }
2225
2226 void
2227 md_show_usage (FILE *stream)
2228 {
2229   fprintf (stream, _(" H8300-specific assembler options:\n"));
2230   fprintf (stream, _("\
2231   -mach=<name>             Set the H8300 machine type to one of:\n\
2232                            h8300h, h8300hn, h8300s, h8300sn, h8300sx, h8300sxn\n"));
2233   fprintf (stream, _("\
2234   -h-tick-hex              Support H'00 style hex constants\n"));
2235 }
2236 \f
2237 void tc_aout_fix_to_chars (void);
2238
2239 void
2240 tc_aout_fix_to_chars (void)
2241 {
2242   printf (_("call to tc_aout_fix_to_chars \n"));
2243   abort ();
2244 }
2245
2246 void
2247 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
2248                  segT seg ATTRIBUTE_UNUSED,
2249                  fragS *fragP ATTRIBUTE_UNUSED)
2250 {
2251   printf (_("call to md_convert_frag \n"));
2252   abort ();
2253 }
2254
2255 valueT
2256 md_section_align (segT segment, valueT size)
2257 {
2258   int align = bfd_get_section_alignment (stdoutput, segment);
2259   return ((size + (1 << align) - 1) & (-1U << align));
2260 }
2261
2262 void
2263 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2264 {
2265   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2266   long val = *valP;
2267
2268   switch (fixP->fx_size)
2269     {
2270     case 1:
2271       *buf++ = val;
2272       break;
2273     case 2:
2274       *buf++ = (val >> 8);
2275       *buf++ = val;
2276       break;
2277     case 4:
2278       *buf++ = (val >> 24);
2279       *buf++ = (val >> 16);
2280       *buf++ = (val >> 8);
2281       *buf++ = val;
2282       break;
2283     case 8:
2284       /* This can arise when the .quad or .8byte pseudo-ops are used.
2285          Returning here (without setting fx_done) will cause the code
2286          to attempt to generate a reloc which will then fail with the
2287          slightly more helpful error message: "Cannot represent
2288          relocation type BFD_RELOC_64".  */
2289       return;
2290     default:
2291       abort ();
2292     }
2293
2294   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2295     fixP->fx_done = 1;
2296 }
2297
2298 int
2299 md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
2300                                segT segment_type ATTRIBUTE_UNUSED)
2301 {
2302   printf (_("call to md_estimate_size_before_relax \n"));
2303   abort ();
2304 }
2305
2306 /* Put number into target byte order.  */
2307 void
2308 md_number_to_chars (char *ptr, valueT use, int nbytes)
2309 {
2310   number_to_chars_bigendian (ptr, use, nbytes);
2311 }
2312
2313 long
2314 md_pcrel_from (fixS *fixp)
2315 {
2316   as_bad_where (fixp->fx_file, fixp->fx_line,
2317                 _("Unexpected reference to a symbol in a non-code section"));
2318   return 0;
2319 }
2320
2321 arelent *
2322 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2323 {
2324   arelent *rel;
2325   bfd_reloc_code_real_type r_type;
2326
2327   if (fixp->fx_addsy && fixp->fx_subsy)
2328     {
2329       if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2330           || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2331         {
2332           as_bad_where (fixp->fx_file, fixp->fx_line,
2333                         _("Difference of symbols in different sections is not supported"));
2334           return NULL;
2335         }
2336     }
2337
2338   rel = XNEW (arelent);
2339   rel->sym_ptr_ptr = XNEW (asymbol *);
2340   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2341   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2342   rel->addend = fixp->fx_offset;
2343
2344   r_type = fixp->fx_r_type;
2345
2346 #define DEBUG 0
2347 #if DEBUG
2348   fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2349   fflush (stderr);
2350 #endif
2351   rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2352   if (rel->howto == NULL)
2353     {
2354       as_bad_where (fixp->fx_file, fixp->fx_line,
2355                     _("Cannot represent relocation type %s"),
2356                     bfd_get_reloc_code_name (r_type));
2357       return NULL;
2358     }
2359
2360   return rel;
2361 }