sanitize out reference to MACREG
[external/binutils.git] / gas / config / tc-h8300.c
1 /* tc-h8300.c -- Assemble code for the Hitachi H8/300
2    Copyright (C) 1991, 1992 Free Software Foundation.
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 2, 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
18    the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20
21 /*
22   Written By Steve Chamberlain
23   sac@cygnus.com
24   */
25
26 #include <stdio.h>
27 #include "as.h"
28 #include "bfd.h"
29 #define DEFINE_TABLE
30 #define h8_opcodes ops
31 #include "opcode/h8300.h"
32 #include <ctype.h>
33
34 const char comment_chars[] =
35 {';', 0};
36 const char line_separator_chars[] =
37 {0};
38 const char line_comment_chars[] = "#";
39
40 /* This table describes all the machine specific pseudo-ops the assembler
41    has to support.  The fields are:
42    pseudo-op name without dot
43    function to call to execute this pseudo-op
44    Integer arg to pass to the function
45    */
46
47 void cons ();
48
49 int Hmode;
50 /* start-sanitize-h8s */
51 int Smode;
52 /* end-sanitize-h8s */
53 #define PSIZE (Hmode ? L_32 : L_16)
54 #define DMODE (L_16)
55 #define DSYMMODE (Hmode ? L_24 : L_16)
56 int bsize = L_8;                /* default branch displacement */
57
58
59 void
60 h8300hmode ()
61 {
62   Hmode = 1;
63 /* start-sanitize-h8s */
64   Smode = 0;
65 /* end-sanitize-h8s */
66 }
67
68 /* start-sanitize-h8s */
69 void
70 h8300smode ()
71 {
72   Smode = 1;
73   Hmode = 1;
74 }
75 /* end-sanitize-h8s */
76 void
77 sbranch (size)
78      int size;
79 {
80   bsize = size;
81 }
82
83 static void pint ()
84 {
85   cons (Hmode ? 4 : 2);
86 }
87
88 const pseudo_typeS md_pseudo_table[] =
89 {
90
91   {"h8300h", h8300hmode, 0},
92 /* start-sanitize-h8s */
93   {"h8300s", h8300smode, 0},
94 /* end-sanitize-h8s */
95   {"sbranch", sbranch, L_8},
96   {"lbranch", sbranch, L_16},
97
98   {"int", pint, 0},
99   {"data.b", cons, 1},
100   {"data.w", cons, 2},
101   {"data.l", cons, 4},
102   {"form", listing_psize, 0},
103   {"heading", listing_title, 0},
104   {"import", s_ignore, 0},
105   {"page", listing_eject, 0},
106   {"program", s_ignore, 0},
107   {0, 0, 0}
108 };
109
110 const int md_reloc_size;
111
112 const char EXP_CHARS[] = "eE";
113
114 /* Chars that mean this number is a floating point constant */
115 /* As in 0f12.456 */
116 /* or    0d1.2345e12 */
117 const char FLT_CHARS[] = "rRsSfFdDxXpP";
118
119 static struct hash_control *opcode_hash_control;        /* Opcode mnemonics */
120
121 /*
122   This function is called once, at assembler startup time.  This should
123   set up all the tables, etc that the MD part of the assembler needs
124   */
125
126
127 void
128 md_begin ()
129 {
130   struct h8_opcode *opcode;
131   char prev_buffer[100];
132   int idx = 0;
133
134   opcode_hash_control = hash_new ();
135   prev_buffer[0] = 0;
136
137   for (opcode = h8_opcodes; opcode->name; opcode++)
138     {
139       /* Strip off any . part when inserting the opcode and only enter
140          unique codes into the hash table
141          */
142       char *src = opcode->name;
143       unsigned int len = strlen (src);
144       char *dst = malloc (len + 1);
145       char *buffer = dst;
146
147       opcode->size = 0;
148       while (*src)
149         {
150           if (*src == '.')
151             {
152               src++;
153               opcode->size = *src;
154               break;
155             }
156           *dst++ = *src++;
157         }
158       *dst++ = 0;
159       if (strcmp (buffer, prev_buffer))
160         {
161           hash_insert (opcode_hash_control, buffer, (char *) opcode);
162           strcpy (prev_buffer, buffer);
163           idx++;
164         }
165       opcode->idx = idx;
166
167
168       /* Find the number of operands */
169       opcode->noperands = 0;
170       while (opcode->args.nib[opcode->noperands] != E)
171         opcode->noperands++;
172       /* Find the length of the opcode in bytes */
173       opcode->length = 0;
174       while (opcode->data.nib[opcode->length * 2] != E)
175         opcode->length++;
176     }
177
178   linkrelax = 1;
179 }
180
181
182 struct h8_exp
183 {
184   char *e_beg;
185   char *e_end;
186   expressionS e_exp;
187 };
188 int dispreg;
189 int opsize;                     /* Set when a register size is seen */
190
191
192 struct h8_op
193 {
194   op_type mode;
195   unsigned reg;
196   expressionS exp;
197 };
198
199 /*
200   parse operands
201   WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
202   r0l,r0h,..r7l,r7h
203   @WREG
204   @WREG+
205   @-WREG
206   #const
207
208   */
209
210 /* try and parse a reg name, returns number of chars consumed */
211 int
212 parse_reg (src, mode, reg, direction)
213      char *src;
214      op_type *mode;
215      unsigned int *reg;
216      int direction;
217
218 {
219   if (src[0] == 's' && src[1] == 'p')
220     {
221       *mode = PSIZE | REG | direction;
222       *reg = 7;
223       return 2;
224     }
225   if (src[0] == 'c' && src[1] == 'c' && src[2] == 'r')
226     {
227       *mode = CCR;
228       *reg = 0;
229       return 3;
230     }
231 /* start-sanitize-h8s */
232   if (src[0] == 'e' && src[1] == 'x' && src[2] == 'r')
233     {
234       *mode = EXR;
235       *reg = 0;
236       return 3;
237     }
238 /* end-sanitize-h8s */
239   if (src[0] == 'f' && src[1] == 'p')
240     {
241       *mode = PSIZE | REG | direction;
242       *reg = 6;
243       return 2;
244     }
245   if (src[0] == 'e'
246       && src[1] == 'r'
247       && src[2] >= '0' && src[2] <= '7')
248     {
249       *mode = L_32 | REG | direction;
250       *reg = src[2] - '0';
251       if (!Hmode)
252         as_warn ("Reg not valid for H8/300");
253
254       return 3;
255     }
256   if (src[0] == 'e'
257       && src[1] >= '0' && src[1] <= '7')
258     {
259       *mode = L_16 | REG | direction;
260       *reg = src[1] - '0' + 8;
261       if (!Hmode)
262         as_warn ("Reg not valid for H8/300");
263       return 2;
264     }
265
266   if (src[0] == 'r')
267     {
268       if (src[1] >= '0' && src[1] <= '7')
269         {
270           if (src[2] == 'l')
271             {
272               *mode = L_8 | REG | direction;
273               *reg = (src[1] - '0') + 8;
274               return 3;
275             }
276           if (src[2] == 'h')
277             {
278               *mode = L_8 | REG | direction;
279               *reg = (src[1] - '0');
280               return 3;
281             }
282           *mode = L_16 | REG | direction;
283           *reg = (src[1] - '0');
284           return 2;
285         }
286     }
287   return 0;
288 }
289
290 char *
291 parse_exp (s, op)
292      char *s;
293      expressionS * op;
294 {
295   char *save = input_line_pointer;
296   char *new;
297
298   input_line_pointer = s;
299   expression (op);
300   if (op->X_op == O_absent)
301     as_bad ("missing operand");
302   new = input_line_pointer;
303   input_line_pointer = save;
304   return new;
305 }
306
307 static char *
308 skip_colonthing (ptr, exp, mode)
309      char *ptr;
310      expressionS *exp;
311      int *mode;
312 {
313   if (*ptr == ':')
314     {
315       ptr++;
316       *mode &= ~SIZE;
317       if (*ptr == '8')
318         {
319           ptr++;
320           /* ff fill any 8 bit quantity */
321          /* exp->X_add_number -= 0x100;*/
322           *mode |= L_8;
323         }
324       else
325         {
326           if (*ptr == '2')
327             {
328               *mode |= L_24;
329             }
330           else if (*ptr == '3')
331             {
332               *mode |= L_32;
333             }
334           else if (*ptr == '1')
335             {
336               *mode |= L_16;
337             }
338           while (isdigit (*ptr))
339             ptr++;
340         }
341     }
342   return ptr;
343 }
344
345 /* The many forms of operand:
346
347    Rn                   Register direct
348    @Rn                  Register indirect
349    @(exp[:16], Rn)      Register indirect with displacement
350    @Rn+
351    @-Rn
352    @aa:8                        absolute 8 bit
353    @aa:16                       absolute 16 bit
354    @aa                  absolute 16 bit
355
356    #xx[:size]           immediate data
357    @(exp:[8], pc)               pc rel
358    @@aa[:8]             memory indirect
359
360    */
361
362 char *
363 colonmod24 (op, src)
364      struct h8_op *op;
365      char *src;
366
367 {
368   int mode = 0;
369   src = skip_colonthing (src, &op->exp, &mode);
370
371   if (!mode)
372     {
373       /* Choose a default mode */
374       if (op->exp.X_add_number < -32768
375           || op->exp.X_add_number > 32767)
376         {
377           if (Hmode)
378             mode = L_24;
379           else
380             mode = L_16;
381         }
382       else if (op->exp.X_add_symbol
383                || op->exp.X_op_symbol)
384         mode = DSYMMODE;
385       else
386         mode = DMODE;
387     }
388   op->mode |= mode;
389   return src;
390
391 }
392
393
394 static void
395 get_operand (ptr, op, dst, direction)
396      char **ptr;
397      struct h8_op *op;
398      unsigned int dst;
399      int direction;
400 {
401   char *src = *ptr;
402   op_type mode;
403   unsigned int num;
404   unsigned int len;
405
406   op->mode = E;
407
408 /* start-sanitize-h8s */
409   /* Gross.  Gross.  ldm and stm have a format not easily handled
410      by get_operand.  We deal with it explicitly here.  */
411   if (src[0] == 'e' && src[1] == 'r' && isdigit(src[2])
412       && src[3] == '-' && src[4] == 'e' && src[5] == 'r' && isdigit(src[6]))
413     {
414       int low, high;
415
416       low = src[2] - '0';
417       high = src[6] - '0';
418
419       if (high < low)
420         as_bad ("Invalid register list for ldm/stm\n");
421
422       if (low % 2)
423         as_bad ("Invalid register list for ldm/stm\n");
424
425       if (high - low > 4)
426         as_bad ("Invalid register list for ldm/stm\n");
427
428       if (high - low != 2
429           && low % 4)
430         as_bad ("Invalid register list for ldm/stm\n");
431
432       /* Even sicker.  We encode two registers into op->reg.  One
433          for the low register to save, the other for the high
434          register to save;  we also set the high bit in op->reg
435          so we know this is "very special".  */
436       op->reg = 0x80000000 | (high << 8) | low;
437       op->mode = REG;
438       *ptr = src + 7;
439       return;
440     }
441 /* end-sanitize-h8s */
442
443   len = parse_reg (src, &op->mode, &op->reg, direction);
444   if (len)
445     {
446       *ptr = src + len;
447       return;
448     }
449
450   if (*src == '@')
451     {
452       src++;
453       if (*src == '@')
454         {
455           src++;
456           src = parse_exp (src, &op->exp);
457
458           src = skip_colonthing (src, &op->exp, &op->mode);
459
460           *ptr = src;
461
462           op->mode = MEMIND;
463           return;
464
465         }
466
467
468       if (*src == '-')
469         {
470           src++;
471           len = parse_reg (src, &mode, &num, direction);
472           if (len == 0)
473             {
474               /* Oops, not a reg after all, must be ordinary exp */
475               src--;
476               /* must be a symbol */
477               op->mode = ABS | PSIZE | direction;
478               *ptr = skip_colonthing (parse_exp (src, &op->exp),
479                                       &op->exp, &op->mode);
480
481               return;
482
483
484             }
485
486
487           if ((mode & SIZE) != PSIZE)
488             as_bad ("Wrong size pointer register for architecture.");
489           op->mode = RDDEC;
490           op->reg = num;
491           *ptr = src + len;
492           return;
493         }
494       if (*src == '(')
495         {
496           /* Disp */
497           src++;
498
499           /* Start off assuming a 16 bit offset */
500
501
502           src = parse_exp (src, &op->exp);
503
504           src = colonmod24 (op, src);
505
506           if (*src == ')')
507             {
508               src++;
509               op->mode |= ABS | direction;
510               *ptr = src;
511               return;
512             }
513
514           if (*src != ',')
515             {
516               as_bad ("expected @(exp, reg16)");
517               return;
518
519             }
520           src++;
521
522           len = parse_reg (src, &mode, &op->reg, direction);
523           if (len == 0 || !(mode & REG))
524             {
525               as_bad ("expected @(exp, reg16)");
526               return;
527             }
528           op->mode |= DISP | direction;
529           dispreg = op->reg;
530           src += len;
531           src = skip_colonthing (src, &op->exp, &op->mode);
532
533           if (*src != ')' && '(')
534             {
535               as_bad ("expected @(exp, reg16)");
536               return;
537             }
538           *ptr = src + 1;
539
540           return;
541         }
542       len = parse_reg (src, &mode, &num, direction);
543
544       if (len)
545         {
546           src += len;
547           if (*src == '+')
548             {
549               src++;
550               if ((mode & SIZE) != PSIZE)
551                 as_bad ("Wrong size pointer register for architecture.");
552               op->mode = RSINC;
553               op->reg = num;
554               *ptr = src;
555               return;
556             }
557           if ((mode & SIZE) != PSIZE)
558             as_bad ("Wrong size pointer register for architecture.");
559
560           op->mode = direction | IND | PSIZE;
561           op->reg = num;
562           *ptr = src;
563
564           return;
565         }
566       else
567         {
568           /* must be a symbol */
569
570           op->mode = ABS | direction;
571           src = parse_exp (src, &op->exp);
572
573           *ptr = colonmod24 (op, src);
574
575           return;
576         }
577     }
578
579
580   if (*src == '#')
581     {
582       src++;
583       op->mode = IMM;
584       src = parse_exp (src, &op->exp);
585       *ptr = skip_colonthing (src, &op->exp, &op->mode);
586
587       return;
588     }
589 /* start-sanitize-h8s */
590   else if (strncmp (src, "mach", 4) == 0
591            || strncmp (src, "macl", 4) == 0)
592     {
593       op->reg = src[3] == 'l';
594       op->mode = MACREG;
595       *ptr = src + 4;
596       return;
597     }
598 /* end-sanitize-h8s */
599   else
600     {
601       src = parse_exp (src, &op->exp);
602       /* Trailing ':' size ? */
603       if (*src == ':')
604         {
605           if (src[1] == '1' && src[2] == '6')
606             {
607               op->mode = PCREL | L_16;
608               src += 3;
609             }
610           else if (src[1] == '8')
611             {
612               op->mode = PCREL | L_8;
613               src += 2;
614             }
615           else
616             {
617               as_bad ("expect :8 or :16 here");
618             }
619         }
620       else
621         {
622           op->mode = PCREL | bsize;
623         }
624       *ptr = src;
625     }
626 }
627
628
629 static
630 char *
631 get_operands (noperands, op_end, operand)
632      unsigned int noperands;
633      char *op_end;
634      struct h8_op *operand;
635 {
636   char *ptr = op_end;
637
638   switch (noperands)
639     {
640     case 0:
641       operand[0].mode = 0;
642       operand[1].mode = 0;
643       break;
644
645     case 1:
646       ptr++;
647       get_operand (&ptr, operand + 0, 0, SRC);
648       if (*ptr == ',')
649         {
650           ptr++;
651           get_operand (&ptr, operand + 1, 1, DST);
652         }
653       else
654         {
655           operand[1].mode = 0;
656         }
657
658       break;
659     case 2:
660       ptr++;
661       get_operand (&ptr, operand + 0, 0, SRC);
662       if (*ptr == ',')
663         ptr++;
664       get_operand (&ptr, operand + 1, 1, DST);
665       break;
666
667     default:
668       abort ();
669     }
670
671
672   return ptr;
673 }
674
675 /* Passed a pointer to a list of opcodes which use different
676    addressing modes, return the opcode which matches the opcodes
677    provided
678    */
679 static
680 struct h8_opcode *
681 get_specific (opcode, operands)
682      struct h8_opcode *opcode;
683      struct h8_op *operands;
684 {
685   struct h8_opcode *this_try = opcode;
686   int found = 0;
687
688   unsigned int this_index = opcode->idx;
689
690   /* There's only one ldm/stm and it's easier to just
691      get out quick for them.  */
692   if (strcmp (opcode->name, "stm.l") == 0
693       || strcmp (opcode->name, "ldm.l") == 0)
694     return this_try;
695
696   while (this_index == opcode->idx && !found)
697     {
698       unsigned int i;
699       found = 1;
700
701       this_try = opcode++;
702       for (i = 0; i < this_try->noperands && found; i++)
703         {
704           op_type op = this_try->args.nib[i];
705           int x = operands[i].mode;
706
707           if ((op & (DISP | REG)) == (DISP | REG)
708               && ((x & (DISP | REG)) == (DISP | REG)))
709             {
710               dispreg = operands[i].reg;
711             }
712           else if (op & REG)
713             {
714               if (!(x & REG))
715                 found = 0;
716
717               if (x & L_P)
718                 {
719                   x = (x & ~L_P) | (Hmode ? L_32 : L_16);
720                 }
721               if (op & L_P)
722                 {
723                   op = (op & ~L_P) | (Hmode ? L_32 : L_16);
724                 }
725
726               opsize = op & SIZE;
727
728               /* The size of the reg is v important */
729               if ((op & SIZE) != (x & SIZE))
730                 found = 0;
731             }
732           else if ((op & ABSJMP) && (x & ABS))
733             {
734               operands[i].mode &= ~ABS;
735               operands[i].mode |= ABSJMP;
736               /* But it may not be 24 bits long */
737               if (!Hmode)
738                 {
739                   operands[i].mode &= ~SIZE;
740                   operands[i].mode |= L_16;
741                 }
742
743
744             }
745           else if ((op & (KBIT | DBIT)) && (x & IMM))
746             {
747               /* This is ok if the immediate value is sensible */
748
749             }
750           else if (op & PCREL)
751             {
752
753               /* The size of the displacement is important */
754               if ((op & SIZE) != (x & SIZE))
755                 found = 0;
756
757             }
758           else if ((op & (DISP | IMM | ABS))
759                    && (op & (DISP | IMM | ABS)) == (x & (DISP | IMM | ABS)))
760             {
761               /* Promote a L_24 to L_32 if it makes us match.  */
762               if ((x & L_24) && (op & L_32))
763                 {
764                   x &= ~L_24;
765                   x |= L_32;
766                 }
767               /* Promote an L8 to L_16 if it makes us match.  */
768               if (op & ABS && op & L_8 && op & DISP) 
769                 {
770                   if (x & L_16)
771                     found= 1;
772                 }
773               else if ((x & SIZE) != 0
774                        && ((op & SIZE) != (x & SIZE)))
775                 found = 0;
776             }
777 /* start-sanitize-h8s */
778           else if ((op & MACREG) != (x & MACREG))
779             {
780               found = 0;
781             }
782 /* end-sanitize-h8s */
783           else if ((op & MODE) != (x & MODE))
784             {
785               found = 0;
786             }
787
788         }
789     }
790   if (found)
791     return this_try;
792   else
793     return 0;
794 }
795
796 static void
797 check_operand (operand, width, string)
798      struct h8_op *operand;
799      unsigned int width;
800      char *string;
801 {
802   if (operand->exp.X_add_symbol == 0
803       && operand->exp.X_op_symbol == 0)
804     {
805
806       /* No symbol involved, let's look at offset, it's dangerous if any of
807          the high bits are not 0 or ff's, find out by oring or anding with
808          the width and seeing if the answer is 0 or all fs*/
809       
810       if ((operand->exp.X_add_number & ~width) != 0 &&
811           (operand->exp.X_add_number | width) != (~0))
812         {
813           if (width == 255 
814               && (operand->exp.X_add_number & 0xff00) == 0xff00)
815             {
816               /* Just ignore this one - which happens when trying to
817                  fit a 16 bit address truncated into an 8 bit address
818                  of something like bset.  */
819             }
820           else 
821             {
822               as_warn ("operand %s0x%lx out of range.", string,
823                        (unsigned long) operand->exp.X_add_number);
824             }
825         }
826     }
827
828 }
829
830 /* RELAXMODE has one of 3 values:
831
832    0 Output a "normal" reloc, no relaxing possible for this insn/reloc
833
834    1 Output a relaxable 24bit absolute mov.w address relocation
835      (may relax into a 16bit absolute address).
836
837    2 Output a relaxable 16/24 absolute mov.b address relocation
838      (may relax into an 8bit absolute address).  */
839
840 static void
841 do_a_fix_imm (offset, operand, relaxmode)
842      int offset;
843      struct h8_op *operand;
844      int relaxmode;
845 {
846   int idx;
847   int size;
848   int where;
849
850
851   char *t = operand->mode & IMM ? "#" : "@";
852
853   if (operand->exp.X_add_symbol == 0)
854     {
855       char *bytes = frag_now->fr_literal + offset;
856       switch (operand->mode & SIZE)
857         {
858         case L_2:
859           check_operand (operand, 0x3, t);
860           bytes[0] |= (operand->exp.X_add_number) << 4;
861           break;
862         case L_3:
863           check_operand (operand, 0x7, t);
864           bytes[0] |= (operand->exp.X_add_number) << 4;
865           break;
866         case L_8:
867           check_operand (operand, 0xff, t);
868           bytes[0] = operand->exp.X_add_number;
869           break;
870         case L_16:
871           check_operand (operand, 0xffff, t);
872           bytes[0] = operand->exp.X_add_number >> 8;
873           bytes[1] = operand->exp.X_add_number >> 0;
874           break;
875         case L_24:
876           check_operand (operand, 0xffffff, t);
877           bytes[0] = operand->exp.X_add_number >> 16;
878           bytes[1] = operand->exp.X_add_number >> 8;
879           bytes[2] = operand->exp.X_add_number >> 0;
880           break;
881
882         case L_32:
883           /* This should be done with bfd */
884           bytes[0] = operand->exp.X_add_number >> 24;
885           bytes[1] = operand->exp.X_add_number >> 16;
886           bytes[2] = operand->exp.X_add_number >> 8;
887           bytes[3] = operand->exp.X_add_number >> 0;
888           break;
889         }
890
891     }
892   else
893     {
894       switch (operand->mode & SIZE)
895         {
896
897         case L_24:
898         case L_32:
899           size = 4;
900           where = (operand->mode & SIZE) == L_24 ? -1 : 0;
901           if (relaxmode == 2)
902             idx = R_MOV24B1;
903           else if (relaxmode == 1)
904             idx = R_MOVL1;
905           else
906             idx = R_RELLONG;
907           break;
908         default:
909           as_bad("Can't work out size of operand.\n");
910         case L_16:
911           size = 2;
912           where = 0;
913           if (relaxmode == 2)
914             idx = R_MOV16B1;
915           else
916             idx = R_RELWORD;
917           operand->exp.X_add_number = (short)operand->exp.X_add_number;
918           break;
919         case L_8:
920           size = 1;
921           where = 0;
922           idx = R_RELBYTE;
923           operand->exp.X_add_number = (char)operand->exp.X_add_number;
924         }
925
926       fix_new_exp (frag_now,
927                    offset + where,
928                    size,
929                    &operand->exp,
930                    0,
931                    idx);
932     }
933
934 }
935
936 /* Now we know what sort of opcodes it is, lets build the bytes -
937  */
938 static void
939 build_bytes (this_try, operand)
940      struct h8_opcode *this_try;
941      struct h8_op *operand;
942 {
943   unsigned int i;
944
945   char *output = frag_more (this_try->length);
946   op_type *nibble_ptr = this_try->data.nib;
947   op_type c;
948   unsigned int nibble_count = 0;
949   int absat;
950   int immat;
951   int nib;
952   int movb = 0;
953   char asnibbles[30];
954   char *p = asnibbles;
955
956   if (!(this_try->inbase || Hmode))
957     as_warn ("Opcode `%s' not available in H8/300 mode", this_try->name);
958
959   while (*nibble_ptr != E)
960     {
961       int d;
962       c = *nibble_ptr++;
963
964       d = (c & DST) != 0;
965
966       if (c < 16)
967         {
968           nib = c;
969         }
970       else
971         {
972
973           if (c & (REG | IND | INC | DEC))
974             {
975               nib = operand[d].reg;
976             }
977           else if ((c & DISPREG) == (DISPREG))
978             {
979               nib = dispreg;
980             }
981           else if (c &  ABS )
982             {
983               operand[d].mode = c;
984               absat = nibble_count / 2;
985               nib = 0;
986             }
987           else if (c & (IMM | PCREL | ABS | ABSJMP | DISP))
988             {
989               operand[d].mode = c;
990               immat = nibble_count / 2;
991               nib = 0;
992             }
993           else if (c & IGNORE)
994             {
995               nib = 0;
996             }
997           else if (c & DBIT)
998             {
999               switch (operand[0].exp.X_add_number)
1000                 {
1001                 case 1:
1002                   nib = c;
1003                   break;
1004                 case 2:
1005                   nib = 0x8 | c;
1006                   break;
1007                 default:
1008                   as_bad ("Need #1 or #2 here");
1009                 }
1010             }
1011           else if (c & KBIT)
1012             {
1013               switch (operand[0].exp.X_add_number)
1014                 {
1015                 case 1:
1016                   nib = 0;
1017                   break;
1018                 case 2:
1019                   nib = 8;
1020                   break;
1021                 case 4:
1022                   if (!Hmode)
1023                     as_warn ("#4 not valid on H8/300.");
1024                   nib = 9;
1025                   break;
1026
1027                 default:
1028                   as_bad ("Need #1 or #2 here");
1029                   break;
1030                 }
1031               /* stop it making a fix */
1032               operand[0].mode = 0;
1033             }
1034
1035           if (c & MEMRELAX)
1036             {
1037               operand[d].mode |= MEMRELAX;
1038             }
1039
1040           if (c & B31)
1041             {
1042               nib |= 0x8;
1043             }
1044
1045 /* start-sanitize-h8s */
1046           if (c & MACREG)
1047             {
1048               nib = 2 + operand[d].reg;
1049             }
1050 /* end-sanitize-h8s */
1051         }
1052       nibble_count++;
1053
1054       *p++ = nib;
1055     }
1056
1057 /* start-sanitize-h8s */
1058   /* Disgusting.  Why, oh why didn't someone ask us for advice
1059      on the assembler format.  */
1060   if (strcmp (this_try->name, "stm.l") == 0
1061       || strcmp (this_try->name, "ldm.l") == 0)
1062     {
1063       int high, low;
1064       high = (operand[this_try->name[0] == 'l' ? 1 : 0].reg >> 8) & 0xf;
1065       low = operand[this_try->name[0] == 'l' ? 1 : 0].reg & 0xf;
1066
1067       asnibbles[2] = high - low;
1068       asnibbles[7] = (this_try->name[0] == 'l') ? high : low;
1069     }
1070 /* end-sanitize-h8s */
1071
1072   for (i = 0; i < this_try->length; i++)
1073     {
1074       output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1075     }
1076
1077   /* Note if this is a movb instruction -- there's a special relaxation
1078      which only applies to them.  */
1079   if (strcmp (this_try->name, "mov.b") == 0)
1080     movb = 1;
1081
1082   /* output any fixes */
1083   for (i = 0; i < 2; i++)
1084     {
1085       int x = operand[i].mode;
1086
1087       if (x & (IMM | DISP))
1088         {
1089           do_a_fix_imm (output - frag_now->fr_literal + immat,
1090                         operand + i, x & MEMRELAX != 0);
1091         }
1092       else if (x & ABS)
1093         {
1094           do_a_fix_imm (output - frag_now->fr_literal + absat,
1095                         operand + i, x & MEMRELAX ? movb + 1 : 0);
1096         }
1097       else if (x & PCREL)
1098         {
1099           int size16 = x & L_16;
1100           int where = size16 ? 2 : 1;
1101           int size = size16 ? 2 : 1;
1102           int type = size16 ? R_PCRWORD : R_PCRBYTE;
1103
1104           check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1105
1106           if (operand[i].exp.X_add_number & 1)
1107             {
1108               as_warn ("branch operand has odd offset (%lx)\n",
1109                        (unsigned long) operand->exp.X_add_number);
1110             }
1111
1112           operand[i].exp.X_add_number =
1113             (char) (operand[i].exp.X_add_number - 1);
1114           fix_new_exp (frag_now,
1115                        output - frag_now->fr_literal + where,
1116                        size,
1117                        &operand[i].exp,
1118                        1,
1119                        type);
1120         }
1121       else if (x & MEMIND)
1122         {
1123
1124           check_operand (operand + i, 0xff, "@@");
1125           fix_new_exp (frag_now,
1126                        output - frag_now->fr_literal + 1,
1127                        1,
1128                        &operand[i].exp,
1129                        0,
1130                        R_MEM_INDIRECT);
1131         }
1132       else if (x & ABSJMP)
1133         {
1134           /* This jmp may be a jump or a branch */
1135
1136           check_operand (operand + i, Hmode ? 0xffffff : 0xffff, "@");
1137           if (operand[i].exp.X_add_number & 1)
1138             {
1139               as_warn ("branch operand has odd offset (%lx)\n",
1140                        (unsigned long) operand->exp.X_add_number);
1141             }
1142           if (!Hmode)
1143             operand[i].exp.X_add_number = (short) operand[i].exp.X_add_number;
1144           fix_new_exp (frag_now,
1145                        output - frag_now->fr_literal,
1146                        4,
1147                        &operand[i].exp,
1148                        0,
1149                        R_JMPL1);
1150         }
1151     }
1152
1153 }
1154
1155 /*
1156   try and give an intelligent error message for common and simple to
1157   detect errors
1158   */
1159
1160 static void
1161 clever_message (opcode, operand)
1162      struct h8_opcode *opcode;
1163      struct h8_op *operand;
1164 {
1165   /* Find out if there was more than one possible opccode */
1166
1167   if ((opcode + 1)->idx != opcode->idx)
1168     {
1169       unsigned int argn;
1170
1171       /* Only one opcode of this flavour, try and guess which operand
1172          didn't match */
1173       for (argn = 0; argn < opcode->noperands; argn++)
1174         {
1175           switch (opcode->args.nib[argn])
1176             {
1177             case RD16:
1178               if (operand[argn].mode != RD16)
1179                 {
1180                   as_bad ("destination operand must be 16 bit register");
1181                   return;
1182
1183                 }
1184               break;
1185
1186             case RS8:
1187
1188               if (operand[argn].mode != RS8)
1189                 {
1190                   as_bad ("source operand must be 8 bit register");
1191                   return;
1192                 }
1193               break;
1194
1195             case ABS16DST:
1196               if (operand[argn].mode != ABS16DST)
1197                 {
1198                   as_bad ("destination operand must be 16bit absolute address");
1199                   return;
1200                 }
1201               break;
1202             case RD8:
1203               if (operand[argn].mode != RD8)
1204                 {
1205                   as_bad ("destination operand must be 8 bit register");
1206                   return;
1207                 }
1208               break;
1209
1210
1211             case ABS16SRC:
1212               if (operand[argn].mode != ABS16SRC)
1213                 {
1214                   as_bad ("source operand must be 16bit absolute address");
1215                   return;
1216                 }
1217               break;
1218
1219             }
1220         }
1221     }
1222   as_bad ("invalid operands");
1223 }
1224
1225 /* This is the guts of the machine-dependent assembler.  STR points to a
1226    machine dependent instruction.  This funciton is supposed to emit
1227    the frags/bytes it assembles to.
1228    */
1229
1230
1231
1232 void
1233 md_assemble (str)
1234      char *str;
1235 {
1236   char *op_start;
1237   char *op_end;
1238   struct h8_op operand[2];
1239   struct h8_opcode *opcode;
1240   struct h8_opcode *prev_opcode;
1241
1242   char *dot = 0;
1243   char c;
1244
1245   /* Drop leading whitespace */
1246   while (*str == ' ')
1247     str++;
1248
1249   /* find the op code end */
1250   for (op_start = op_end = str;
1251        *op_end != 0 && *op_end != ' ';
1252        op_end++)
1253     {
1254       if (*op_end == '.')
1255         {
1256           dot = op_end + 1;
1257           *op_end = 0;
1258           op_end += 2;
1259           break;
1260         }
1261     }
1262
1263   ;
1264
1265   if (op_end == op_start)
1266     {
1267       as_bad ("can't find opcode ");
1268     }
1269   c = *op_end;
1270
1271   *op_end = 0;
1272
1273   opcode = (struct h8_opcode *) hash_find (opcode_hash_control,
1274                                            op_start);
1275
1276   if (opcode == NULL)
1277     {
1278       as_bad ("unknown opcode");
1279       return;
1280     }
1281
1282   /* We use to set input_line_pointer to the result of get_operands,
1283      but that is wrong.  Our caller assumes we don't change it.  */
1284
1285   (void) get_operands (opcode->noperands, op_end, operand);
1286   *op_end = c;
1287   prev_opcode = opcode;
1288
1289   opcode = get_specific (opcode, operand);
1290
1291   if (opcode == 0)
1292     {
1293       /* Couldn't find an opcode which matched the operands */
1294       char *where = frag_more (2);
1295
1296       where[0] = 0x0;
1297       where[1] = 0x0;
1298       clever_message (prev_opcode, operand);
1299
1300       return;
1301     }
1302   if (opcode->size && dot)
1303     {
1304       if (opcode->size != *dot)
1305         {
1306           as_warn ("mismatch between opcode size and operand size");
1307         }
1308     }
1309
1310   build_bytes (opcode, operand);
1311
1312 }
1313
1314 void
1315 tc_crawl_symbol_chain (headers)
1316      object_headers * headers;
1317 {
1318   printf ("call to tc_crawl_symbol_chain \n");
1319 }
1320
1321 symbolS *
1322 md_undefined_symbol (name)
1323      char *name;
1324 {
1325   return 0;
1326 }
1327
1328 void
1329 tc_headers_hook (headers)
1330      object_headers * headers;
1331 {
1332   printf ("call to tc_headers_hook \n");
1333 }
1334
1335 /* Various routines to kill one day */
1336 /* Equal to MAX_PRECISION in atof-ieee.c */
1337 #define MAX_LITTLENUMS 6
1338
1339 /* Turn a string in input_line_pointer into a floating point constant of type
1340    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
1341    emitted is stored in *sizeP .  An error message is returned, or NULL on OK.
1342    */
1343 char *
1344 md_atof (type, litP, sizeP)
1345      char type;
1346      char *litP;
1347      int *sizeP;
1348 {
1349   int prec;
1350   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1351   LITTLENUM_TYPE *wordP;
1352   char *t;
1353   char *atof_ieee ();
1354
1355   switch (type)
1356     {
1357     case 'f':
1358     case 'F':
1359     case 's':
1360     case 'S':
1361       prec = 2;
1362       break;
1363
1364     case 'd':
1365     case 'D':
1366     case 'r':
1367     case 'R':
1368       prec = 4;
1369       break;
1370
1371     case 'x':
1372     case 'X':
1373       prec = 6;
1374       break;
1375
1376     case 'p':
1377     case 'P':
1378       prec = 6;
1379       break;
1380
1381     default:
1382       *sizeP = 0;
1383       return "Bad call to MD_ATOF()";
1384     }
1385   t = atof_ieee (input_line_pointer, type, words);
1386   if (t)
1387     input_line_pointer = t;
1388
1389   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1390   for (wordP = words; prec--;)
1391     {
1392       md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
1393       litP += sizeof (LITTLENUM_TYPE);
1394     }
1395   return 0;
1396 }
1397 \f
1398 CONST char *md_shortopts = "";
1399 struct option md_longopts[] = {
1400   {NULL, no_argument, NULL, 0}
1401 };
1402 size_t md_longopts_size = sizeof(md_longopts);
1403
1404 int
1405 md_parse_option (c, arg)
1406      int c;
1407      char *arg;
1408 {
1409   return 0;
1410 }
1411
1412 void
1413 md_show_usage (stream)
1414      FILE *stream;
1415 {
1416 }
1417 \f
1418 int md_short_jump_size;
1419
1420 void
1421 tc_aout_fix_to_chars ()
1422 {
1423   printf ("call to tc_aout_fix_to_chars \n");
1424   abort ();
1425 }
1426
1427 void
1428 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1429      char *ptr;
1430      addressT from_addr;
1431      addressT to_addr;
1432      fragS *frag;
1433      symbolS *to_symbol;
1434 {
1435   as_fatal ("failed sanity check.");
1436 }
1437
1438 void
1439 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1440      char *ptr;
1441      addressT from_addr, to_addr;
1442      fragS *frag;
1443      symbolS *to_symbol;
1444 {
1445   as_fatal ("failed sanity check.");
1446 }
1447
1448 void
1449 md_convert_frag (headers, seg, fragP)
1450      object_headers *headers;
1451      segT seg;
1452      fragS *fragP;
1453 {
1454   printf ("call to md_convert_frag \n");
1455   abort ();
1456 }
1457
1458 valueT 
1459 md_section_align (seg, size)
1460      segT seg;
1461      valueT size;
1462 {
1463   return ((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg]));
1464
1465 }
1466
1467 void
1468 md_apply_fix (fixP, val)
1469      fixS *fixP;
1470      long val;
1471 {
1472   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1473
1474   switch (fixP->fx_size)
1475     {
1476     case 1:
1477       *buf++ = val;
1478       break;
1479     case 2:
1480       *buf++ = (val >> 8);
1481       *buf++ = val;
1482       break;
1483     case 4:
1484       *buf++ = (val >> 24);
1485       *buf++ = (val >> 16);
1486       *buf++ = (val >> 8);
1487       *buf++ = val;
1488       break;
1489     default:
1490       abort ();
1491     }
1492 }
1493
1494 int md_long_jump_size;
1495
1496 int
1497 md_estimate_size_before_relax (fragP, segment_type)
1498      register fragS *fragP;
1499      register segT segment_type;
1500 {
1501   printf ("call tomd_estimate_size_before_relax \n");
1502   abort ();
1503 }
1504
1505 /* Put number into target byte order */
1506
1507 void
1508 md_number_to_chars (ptr, use, nbytes)
1509      char *ptr;
1510      valueT use;
1511      int nbytes;
1512 {
1513   number_to_chars_bigendian (ptr, use, nbytes);
1514 }
1515 long
1516 md_pcrel_from (fixP)
1517      fixS *fixP;
1518 {
1519   abort ();
1520 }
1521
1522
1523 void
1524 tc_reloc_mangle (fix_ptr, intr, base)
1525      fixS *fix_ptr;
1526      struct internal_reloc *intr;
1527      bfd_vma base;
1528
1529 {
1530   symbolS *symbol_ptr;
1531
1532   symbol_ptr = fix_ptr->fx_addsy;
1533
1534   /* If this relocation is attached to a symbol then it's ok
1535      to output it */
1536   if (fix_ptr->fx_r_type == TC_CONS_RELOC)
1537     {
1538       /* cons likes to create reloc32's whatever the size of the reloc..
1539        */
1540       switch (fix_ptr->fx_size)
1541         {
1542         case 4:
1543           intr->r_type = R_RELLONG;
1544           break;
1545         case 2:
1546           intr->r_type = R_RELWORD;
1547           break;
1548         case 1:
1549           intr->r_type = R_RELBYTE;
1550           break;
1551         default:
1552           abort ();
1553
1554         }
1555
1556     }
1557   else
1558     {
1559       intr->r_type = fix_ptr->fx_r_type;
1560     }
1561
1562   intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
1563   intr->r_offset = fix_ptr->fx_offset;
1564
1565   if (symbol_ptr)
1566     intr->r_symndx = symbol_ptr->sy_number;
1567   else
1568     intr->r_symndx = -1;
1569
1570
1571 }
1572
1573 /* end of tc-h8300.c */