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