* symbols.c (copy_symbol_attributes): Convert local symbols to
[binutils.git] / gas / config / tc-h8300.c
blob115ada154231dcbc9d673f31c18ad699f30a385e
1 /* tc-h8300.c -- Assemble code for the Hitachi H8/300
2 Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation.
4 This file is part of GAS, the GNU Assembler.
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.
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.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
23 Written By Steve Chamberlain
24 sac@cygnus.com
27 #include <stdio.h>
28 #include "as.h"
29 #include "subsegs.h"
30 #include "bfd.h"
31 #define DEFINE_TABLE
32 #define h8_opcodes ops
33 #include "opcode/h8300.h"
34 #include <ctype.h>
36 const char comment_chars[] =
37 {';', 0};
38 const char line_separator_chars[] =
39 {0};
40 const char line_comment_chars[] = "#";
42 /* This table describes all the machine specific pseudo-ops the assembler
43 has to support. The fields are:
44 pseudo-op name without dot
45 function to call to execute this pseudo-op
46 Integer arg to pass to the function
49 void cons ();
51 int Hmode;
52 int Smode;
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 */
59 void
60 h8300hmode ()
62 Hmode = 1;
63 Smode = 0;
66 void
67 h8300smode ()
69 Smode = 1;
70 Hmode = 1;
72 void
73 sbranch (size)
74 int size;
76 bsize = size;
79 static void pint ()
81 cons (Hmode ? 4 : 2);
84 const pseudo_typeS md_pseudo_table[] =
87 {"h8300h", h8300hmode, 0},
88 {"h8300s", h8300smode, 0},
89 {"sbranch", sbranch, L_8},
90 {"lbranch", sbranch, L_16},
92 {"int", pint, 0},
93 {"data.b", cons, 1},
94 {"data.w", cons, 2},
95 {"data.l", cons, 4},
96 {"form", listing_psize, 0},
97 {"heading", listing_title, 0},
98 {"import", s_ignore, 0},
99 {"page", listing_eject, 0},
100 {"program", s_ignore, 0},
101 {0, 0, 0}
104 const int md_reloc_size;
106 const char EXP_CHARS[] = "eE";
108 /* Chars that mean this number is a floating point constant */
109 /* As in 0f12.456 */
110 /* or 0d1.2345e12 */
111 const char FLT_CHARS[] = "rRsSfFdDxXpP";
113 static struct hash_control *opcode_hash_control; /* Opcode mnemonics */
116 This function is called once, at assembler startup time. This should
117 set up all the tables, etc that the MD part of the assembler needs
121 void
122 md_begin ()
124 struct h8_opcode *opcode;
125 char prev_buffer[100];
126 int idx = 0;
128 opcode_hash_control = hash_new ();
129 prev_buffer[0] = 0;
131 for (opcode = h8_opcodes; opcode->name; opcode++)
133 /* Strip off any . part when inserting the opcode and only enter
134 unique codes into the hash table
136 char *src = opcode->name;
137 unsigned int len = strlen (src);
138 char *dst = malloc (len + 1);
139 char *buffer = dst;
141 opcode->size = 0;
142 while (*src)
144 if (*src == '.')
146 src++;
147 opcode->size = *src;
148 break;
150 *dst++ = *src++;
152 *dst++ = 0;
153 if (strcmp (buffer, prev_buffer))
155 hash_insert (opcode_hash_control, buffer, (char *) opcode);
156 strcpy (prev_buffer, buffer);
157 idx++;
159 opcode->idx = idx;
162 /* Find the number of operands */
163 opcode->noperands = 0;
164 while (opcode->args.nib[opcode->noperands] != E)
165 opcode->noperands++;
166 /* Find the length of the opcode in bytes */
167 opcode->length = 0;
168 while (opcode->data.nib[opcode->length * 2] != E)
169 opcode->length++;
172 linkrelax = 1;
176 struct h8_exp
178 char *e_beg;
179 char *e_end;
180 expressionS e_exp;
182 int dispreg;
183 int opsize; /* Set when a register size is seen */
186 struct h8_op
188 op_type mode;
189 unsigned reg;
190 expressionS exp;
194 parse operands
195 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
196 r0l,r0h,..r7l,r7h
197 @WREG
198 @WREG+
199 @-WREG
200 #const
204 /* try and parse a reg name, returns number of chars consumed */
206 parse_reg (src, mode, reg, direction)
207 char *src;
208 op_type *mode;
209 unsigned int *reg;
210 int direction;
213 char *end;
214 int len;
216 /* Cribbed from get_symbol_end(). */
217 if (!is_name_beginner (*src) || *src == '\001')
218 return 0;
219 end = src+1;
220 while (is_part_of_name (*end) || *end == '\001')
221 end++;
222 len = end - src;
224 if (len == 2 && src[0] == 's' && src[1] == 'p')
226 *mode = PSIZE | REG | direction;
227 *reg = 7;
228 return len;
230 if (len == 3 && src[0] == 'c' && src[1] == 'c' && src[2] == 'r')
232 *mode = CCR;
233 *reg = 0;
234 return len;
236 if (len == 3 && src[0] == 'e' && src[1] == 'x' && src[2] == 'r')
238 *mode = EXR;
239 *reg = 0;
240 return len;
242 if (len == 2 && src[0] == 'f' && src[1] == 'p')
244 *mode = PSIZE | REG | direction;
245 *reg = 6;
246 return len;
248 if (len == 3 && src[0] == 'e' && src[1] == 'r'
249 && src[2] >= '0' && src[2] <= '7')
251 *mode = L_32 | REG | direction;
252 *reg = src[2] - '0';
253 if (!Hmode)
254 as_warn (_("Reg not valid for H8/300"));
255 return len;
257 if (len == 2 && src[0] == 'e' && src[1] >= '0' && src[1] <= '7')
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 len;
266 if (src[0] == 'r')
268 if (src[1] >= '0' && src[1] <= '7')
270 if (len == 3 && src[2] == 'l')
272 *mode = L_8 | REG | direction;
273 *reg = (src[1] - '0') + 8;
274 return len;
276 if (len == 3 && src[2] == 'h')
278 *mode = L_8 | REG | direction;
279 *reg = (src[1] - '0');
280 return len;
282 if (len == 2)
284 *mode = L_16 | REG | direction;
285 *reg = (src[1] - '0');
286 return len;
291 return 0;
294 char *
295 parse_exp (s, op)
296 char *s;
297 expressionS * op;
299 char *save = input_line_pointer;
300 char *new;
302 input_line_pointer = s;
303 expression (op);
304 if (op->X_op == O_absent)
305 as_bad (_("missing operand"));
306 new = input_line_pointer;
307 input_line_pointer = save;
308 return new;
311 static char *
312 skip_colonthing (ptr, exp, mode)
313 char *ptr;
314 expressionS *exp;
315 int *mode;
317 if (*ptr == ':')
319 ptr++;
320 *mode &= ~SIZE;
321 if (*ptr == '8')
323 ptr++;
324 /* ff fill any 8 bit quantity */
325 /* exp->X_add_number -= 0x100;*/
326 *mode |= L_8;
328 else
330 if (*ptr == '2')
332 *mode |= L_24;
334 else if (*ptr == '3')
336 *mode |= L_32;
338 else if (*ptr == '1')
340 *mode |= L_16;
342 while (isdigit (*ptr))
343 ptr++;
346 return ptr;
349 /* The many forms of operand:
351 Rn Register direct
352 @Rn Register indirect
353 @(exp[:16], Rn) Register indirect with displacement
354 @Rn+
355 @-Rn
356 @aa:8 absolute 8 bit
357 @aa:16 absolute 16 bit
358 @aa absolute 16 bit
360 #xx[:size] immediate data
361 @(exp:[8], pc) pc rel
362 @@aa[:8] memory indirect
366 char *
367 colonmod24 (op, src)
368 struct h8_op *op;
369 char *src;
372 int mode = 0;
373 src = skip_colonthing (src, &op->exp, &mode);
375 if (!mode)
377 /* Choose a default mode */
378 if (op->exp.X_add_number < -32768
379 || op->exp.X_add_number > 32767)
381 if (Hmode)
382 mode = L_24;
383 else
384 mode = L_16;
386 else if (op->exp.X_add_symbol
387 || op->exp.X_op_symbol)
388 mode = DSYMMODE;
389 else
390 mode = DMODE;
392 op->mode |= mode;
393 return src;
398 static void
399 get_operand (ptr, op, dst, direction)
400 char **ptr;
401 struct h8_op *op;
402 unsigned int dst;
403 int direction;
405 char *src = *ptr;
406 op_type mode;
407 unsigned int num;
408 unsigned int len;
410 op->mode = E;
412 /* Gross. Gross. ldm and stm have a format not easily handled
413 by get_operand. We deal with it explicitly here. */
414 if (src[0] == 'e' && src[1] == 'r' && isdigit(src[2])
415 && src[3] == '-' && src[4] == 'e' && src[5] == 'r' && isdigit(src[6]))
417 int low, high;
419 low = src[2] - '0';
420 high = src[6] - '0';
422 if (high < low)
423 as_bad (_("Invalid register list for ldm/stm\n"));
425 if (low % 2)
426 as_bad (_("Invalid register list for ldm/stm\n"));
428 if (high - low > 3)
429 as_bad (_("Invalid register list for ldm/stm\n"));
431 if (high - low != 1
432 && low % 4)
433 as_bad (_("Invalid register list for ldm/stm\n"));
435 /* Even sicker. We encode two registers into op->reg. One
436 for the low register to save, the other for the high
437 register to save; we also set the high bit in op->reg
438 so we know this is "very special". */
439 op->reg = 0x80000000 | (high << 8) | low;
440 op->mode = REG;
441 *ptr = src + 7;
442 return;
445 len = parse_reg (src, &op->mode, &op->reg, direction);
446 if (len)
448 *ptr = src + len;
449 return;
452 if (*src == '@')
454 src++;
455 if (*src == '@')
457 src++;
458 src = parse_exp (src, &op->exp);
460 src = skip_colonthing (src, &op->exp, &op->mode);
462 *ptr = src;
464 op->mode = MEMIND;
465 return;
470 if (*src == '-')
472 src++;
473 len = parse_reg (src, &mode, &num, direction);
474 if (len == 0)
476 /* Oops, not a reg after all, must be ordinary exp */
477 src--;
478 /* must be a symbol */
479 op->mode = ABS | PSIZE | direction;
480 *ptr = skip_colonthing (parse_exp (src, &op->exp),
481 &op->exp, &op->mode);
483 return;
489 if ((mode & SIZE) != PSIZE)
490 as_bad (_("Wrong size pointer register for architecture."));
491 op->mode = RDDEC;
492 op->reg = num;
493 *ptr = src + len;
494 return;
496 if (*src == '(')
498 /* Disp */
499 src++;
501 /* Start off assuming a 16 bit offset */
504 src = parse_exp (src, &op->exp);
506 src = colonmod24 (op, src);
508 if (*src == ')')
510 src++;
511 op->mode |= ABS | direction;
512 *ptr = src;
513 return;
516 if (*src != ',')
518 as_bad (_("expected @(exp, reg16)"));
519 return;
522 src++;
524 len = parse_reg (src, &mode, &op->reg, direction);
525 if (len == 0 || !(mode & REG))
527 as_bad (_("expected @(exp, reg16)"));
528 return;
530 op->mode |= DISP | direction;
531 dispreg = op->reg;
532 src += len;
533 src = skip_colonthing (src, &op->exp, &op->mode);
535 if (*src != ')' && '(')
537 as_bad (_("expected @(exp, reg16)"));
538 return;
540 *ptr = src + 1;
542 return;
544 len = parse_reg (src, &mode, &num, direction);
546 if (len)
548 src += len;
549 if (*src == '+')
551 src++;
552 if ((mode & SIZE) != PSIZE)
553 as_bad (_("Wrong size pointer register for architecture."));
554 op->mode = RSINC;
555 op->reg = num;
556 *ptr = src;
557 return;
559 if ((mode & SIZE) != PSIZE)
560 as_bad (_("Wrong size pointer register for architecture."));
562 op->mode = direction | IND | PSIZE;
563 op->reg = num;
564 *ptr = src;
566 return;
568 else
570 /* must be a symbol */
572 op->mode = ABS | direction;
573 src = parse_exp (src, &op->exp);
575 *ptr = colonmod24 (op, src);
577 return;
582 if (*src == '#')
584 src++;
585 op->mode = IMM;
586 src = parse_exp (src, &op->exp);
587 *ptr = skip_colonthing (src, &op->exp, &op->mode);
589 return;
591 else if (strncmp (src, "mach", 4) == 0
592 || strncmp (src, "macl", 4) == 0)
594 op->reg = src[3] == 'l';
595 op->mode = MACREG;
596 *ptr = src + 4;
597 return;
599 else
601 src = parse_exp (src, &op->exp);
602 /* Trailing ':' size ? */
603 if (*src == ':')
605 if (src[1] == '1' && src[2] == '6')
607 op->mode = PCREL | L_16;
608 src += 3;
610 else if (src[1] == '8')
612 op->mode = PCREL | L_8;
613 src += 2;
615 else
617 as_bad (_("expect :8 or :16 here"));
620 else
622 op->mode = PCREL | bsize;
624 *ptr = src;
629 static
630 char *
631 get_operands (noperands, op_end, operand)
632 unsigned int noperands;
633 char *op_end;
634 struct h8_op *operand;
636 char *ptr = op_end;
638 switch (noperands)
640 case 0:
641 operand[0].mode = 0;
642 operand[1].mode = 0;
643 break;
645 case 1:
646 ptr++;
647 get_operand (&ptr, operand + 0, 0, SRC);
648 if (*ptr == ',')
650 ptr++;
651 get_operand (&ptr, operand + 1, 1, DST);
653 else
655 operand[1].mode = 0;
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;
667 default:
668 abort ();
672 return ptr;
675 /* Passed a pointer to a list of opcodes which use different
676 addressing modes, return the opcode which matches the opcodes
677 provided
679 static
680 struct h8_opcode *
681 get_specific (opcode, operands, size)
682 struct h8_opcode *opcode;
683 struct h8_op *operands;
684 int size;
686 struct h8_opcode *this_try = opcode;
687 int found = 0;
689 unsigned int this_index = opcode->idx;
691 /* There's only one ldm/stm and it's easier to just
692 get out quick for them. */
693 if (strcmp (opcode->name, "stm.l") == 0
694 || strcmp (opcode->name, "ldm.l") == 0)
695 return this_try;
697 while (this_index == opcode->idx && !found)
699 found = 1;
701 this_try = opcode++;
702 if (this_try->noperands == 0)
704 int this_size;
706 this_size = this_try->how & SN;
707 if (this_size != size && (this_size != SB || size != SN))
708 found = 0;
710 else
712 unsigned int i;
714 for (i = 0; i < this_try->noperands && found; i++)
716 op_type op = this_try->args.nib[i];
717 int x = operands[i].mode;
719 if ((op & (DISP | REG)) == (DISP | REG)
720 && ((x & (DISP | REG)) == (DISP | REG)))
722 dispreg = operands[i].reg;
724 else if (op & REG)
726 if (!(x & REG))
727 found = 0;
729 if (x & L_P)
730 x = (x & ~L_P) | (Hmode ? L_32 : L_16);
731 if (op & L_P)
732 op = (op & ~L_P) | (Hmode ? L_32 : L_16);
734 opsize = op & SIZE;
736 /* The size of the reg is v important */
737 if ((op & SIZE) != (x & SIZE))
738 found = 0;
740 else if ((op & ABSJMP) && (x & ABS))
742 operands[i].mode &= ~ABS;
743 operands[i].mode |= ABSJMP;
744 /* But it may not be 24 bits long */
745 if (!Hmode)
747 operands[i].mode &= ~SIZE;
748 operands[i].mode |= L_16;
751 else if ((op & (KBIT | DBIT)) && (x & IMM))
753 /* This is ok if the immediate value is sensible */
755 else if (op & PCREL)
757 /* The size of the displacement is important */
758 if ((op & SIZE) != (x & SIZE))
759 found = 0;
761 else if ((op & (DISP | IMM | ABS))
762 && (op & (DISP | IMM | ABS)) == (x & (DISP | IMM | ABS)))
764 /* Promote a L_24 to L_32 if it makes us match. */
765 if ((x & L_24) && (op & L_32))
767 x &= ~L_24;
768 x |= L_32;
770 /* Promote an L8 to L_16 if it makes us match. */
771 if (op & ABS && op & L_8 && op & DISP)
773 if (x & L_16)
774 found= 1;
776 else if ((x & SIZE) != 0
777 && ((op & SIZE) != (x & SIZE)))
778 found = 0;
780 else if ((op & MACREG) != (x & MACREG))
782 found = 0;
784 else if ((op & MODE) != (x & MODE))
786 found = 0;
791 if (found)
792 return this_try;
793 else
794 return 0;
797 static void
798 check_operand (operand, width, string)
799 struct h8_op *operand;
800 unsigned int width;
801 char *string;
803 if (operand->exp.X_add_symbol == 0
804 && operand->exp.X_op_symbol == 0)
807 /* No symbol involved, let's look at offset, it's dangerous if any of
808 the high bits are not 0 or ff's, find out by oring or anding with
809 the width and seeing if the answer is 0 or all fs*/
811 if ((operand->exp.X_add_number & ~width) != 0 &&
812 (operand->exp.X_add_number | width) != (~0))
814 if (width == 255
815 && (operand->exp.X_add_number & 0xff00) == 0xff00)
817 /* Just ignore this one - which happens when trying to
818 fit a 16 bit address truncated into an 8 bit address
819 of something like bset. */
821 else
823 as_warn (_("operand %s0x%lx out of range."), string,
824 (unsigned long) operand->exp.X_add_number);
831 /* RELAXMODE has one of 3 values:
833 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
835 1 Output a relaxable 24bit absolute mov.w address relocation
836 (may relax into a 16bit absolute address).
838 2 Output a relaxable 16/24 absolute mov.b address relocation
839 (may relax into an 8bit absolute address). */
841 static void
842 do_a_fix_imm (offset, operand, relaxmode)
843 int offset;
844 struct h8_op *operand;
845 int relaxmode;
847 int idx;
848 int size;
849 int where;
852 char *t = operand->mode & IMM ? "#" : "@";
854 if (operand->exp.X_add_symbol == 0)
856 char *bytes = frag_now->fr_literal + offset;
857 switch (operand->mode & SIZE)
859 case L_2:
860 check_operand (operand, 0x3, t);
861 bytes[0] |= (operand->exp.X_add_number) << 4;
862 break;
863 case L_3:
864 check_operand (operand, 0x7, t);
865 bytes[0] |= (operand->exp.X_add_number) << 4;
866 break;
867 case L_8:
868 check_operand (operand, 0xff, t);
869 bytes[0] = operand->exp.X_add_number;
870 break;
871 case L_16:
872 check_operand (operand, 0xffff, t);
873 bytes[0] = operand->exp.X_add_number >> 8;
874 bytes[1] = operand->exp.X_add_number >> 0;
875 break;
876 case L_24:
877 check_operand (operand, 0xffffff, t);
878 bytes[0] = operand->exp.X_add_number >> 16;
879 bytes[1] = operand->exp.X_add_number >> 8;
880 bytes[2] = operand->exp.X_add_number >> 0;
881 break;
883 case L_32:
884 /* This should be done with bfd */
885 bytes[0] = operand->exp.X_add_number >> 24;
886 bytes[1] = operand->exp.X_add_number >> 16;
887 bytes[2] = operand->exp.X_add_number >> 8;
888 bytes[3] = operand->exp.X_add_number >> 0;
889 break;
893 else
895 switch (operand->mode & SIZE)
898 case L_24:
899 case L_32:
900 size = 4;
901 where = (operand->mode & SIZE) == L_24 ? -1 : 0;
902 if (relaxmode == 2)
903 idx = R_MOV24B1;
904 else if (relaxmode == 1)
905 idx = R_MOVL1;
906 else
907 idx = R_RELLONG;
908 break;
909 default:
910 as_bad(_("Can't work out size of operand.\n"));
911 case L_16:
912 size = 2;
913 where = 0;
914 if (relaxmode == 2)
915 idx = R_MOV16B1;
916 else
917 idx = R_RELWORD;
918 operand->exp.X_add_number = (short)operand->exp.X_add_number;
919 break;
920 case L_8:
921 size = 1;
922 where = 0;
923 idx = R_RELBYTE;
924 /* This used to use a cast to char, but that fails if char is an
925 unsigned type. We can't use `signed char', as that isn't valid
926 K&R C. */
927 if (operand->exp.X_add_number & 0x80)
928 operand->exp.X_add_number |= ((offsetT) -1 << 8);
929 else
930 operand->exp.X_add_number &= 0xff;
933 fix_new_exp (frag_now,
934 offset + where,
935 size,
936 &operand->exp,
938 idx);
943 /* Now we know what sort of opcodes it is, lets build the bytes -
945 static void
946 build_bytes (this_try, operand)
947 struct h8_opcode *this_try;
948 struct h8_op *operand;
950 unsigned int i;
952 char *output = frag_more (this_try->length);
953 op_type *nibble_ptr = this_try->data.nib;
954 op_type c;
955 unsigned int nibble_count = 0;
956 int absat;
957 int immat;
958 int nib;
959 int movb = 0;
960 char asnibbles[30];
961 char *p = asnibbles;
963 if (!(this_try->inbase || Hmode))
964 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
965 this_try->name);
967 while (*nibble_ptr != E)
969 int d;
970 c = *nibble_ptr++;
972 d = (c & (DST | SRC_IN_DST)) != 0;
974 if (c < 16)
976 nib = c;
978 else
981 if (c & (REG | IND | INC | DEC))
983 nib = operand[d].reg;
985 else if ((c & DISPREG) == (DISPREG))
987 nib = dispreg;
989 else if (c & ABS )
991 operand[d].mode = c;
992 absat = nibble_count / 2;
993 nib = 0;
995 else if (c & (IMM | PCREL | ABS | ABSJMP | DISP))
997 operand[d].mode = c;
998 immat = nibble_count / 2;
999 nib = 0;
1001 else if (c & IGNORE)
1003 nib = 0;
1005 else if (c & DBIT)
1007 switch (operand[0].exp.X_add_number)
1009 case 1:
1010 nib = c;
1011 break;
1012 case 2:
1013 nib = 0x8 | c;
1014 break;
1015 default:
1016 as_bad (_("Need #1 or #2 here"));
1019 else if (c & KBIT)
1021 switch (operand[0].exp.X_add_number)
1023 case 1:
1024 nib = 0;
1025 break;
1026 case 2:
1027 nib = 8;
1028 break;
1029 case 4:
1030 if (!Hmode)
1031 as_warn (_("#4 not valid on H8/300."));
1032 nib = 9;
1033 break;
1035 default:
1036 as_bad (_("Need #1 or #2 here"));
1037 break;
1039 /* stop it making a fix */
1040 operand[0].mode = 0;
1043 if (c & MEMRELAX)
1045 operand[d].mode |= MEMRELAX;
1048 if (c & B31)
1050 nib |= 0x8;
1053 if (c & MACREG)
1055 nib = 2 + operand[d].reg;
1058 nibble_count++;
1060 *p++ = nib;
1063 /* Disgusting. Why, oh why didn't someone ask us for advice
1064 on the assembler format. */
1065 if (strcmp (this_try->name, "stm.l") == 0
1066 || strcmp (this_try->name, "ldm.l") == 0)
1068 int high, low;
1069 high = (operand[this_try->name[0] == 'l' ? 1 : 0].reg >> 8) & 0xf;
1070 low = operand[this_try->name[0] == 'l' ? 1 : 0].reg & 0xf;
1072 asnibbles[2] = high - low;
1073 asnibbles[7] = (this_try->name[0] == 'l') ? high : low;
1076 for (i = 0; i < this_try->length; i++)
1078 output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1081 /* Note if this is a movb instruction -- there's a special relaxation
1082 which only applies to them. */
1083 if (strcmp (this_try->name, "mov.b") == 0)
1084 movb = 1;
1086 /* output any fixes */
1087 for (i = 0; i < 2; i++)
1089 int x = operand[i].mode;
1091 if (x & (IMM | DISP))
1093 do_a_fix_imm (output - frag_now->fr_literal + immat,
1094 operand + i, x & MEMRELAX != 0);
1096 else if (x & ABS)
1098 do_a_fix_imm (output - frag_now->fr_literal + absat,
1099 operand + i, x & MEMRELAX ? movb + 1 : 0);
1101 else if (x & PCREL)
1103 int size16 = x & L_16;
1104 int where = size16 ? 2 : 1;
1105 int size = size16 ? 2 : 1;
1106 int type = size16 ? R_PCRWORD : R_PCRBYTE;
1108 check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1110 if (operand[i].exp.X_add_number & 1)
1112 as_warn (_("branch operand has odd offset (%lx)\n"),
1113 (unsigned long) operand->exp.X_add_number);
1116 operand[i].exp.X_add_number -= 1;
1117 /* This used to use a cast to char, but that fails if char is an
1118 unsigned type. We can't use `signed char', as that isn't valid
1119 K&R C. */
1120 if (operand[i].exp.X_add_number & 0x80)
1121 operand[i].exp.X_add_number |= ((offsetT) -1 << 8);
1122 else
1123 operand[i].exp.X_add_number &= 0xff;
1125 fix_new_exp (frag_now,
1126 output - frag_now->fr_literal + where,
1127 size,
1128 &operand[i].exp,
1130 type);
1132 else if (x & MEMIND)
1135 check_operand (operand + i, 0xff, "@@");
1136 fix_new_exp (frag_now,
1137 output - frag_now->fr_literal + 1,
1139 &operand[i].exp,
1141 R_MEM_INDIRECT);
1143 else if (x & ABSJMP)
1145 /* This jmp may be a jump or a branch */
1147 check_operand (operand + i, Hmode ? 0xffffff : 0xffff, "@");
1148 if (operand[i].exp.X_add_number & 1)
1150 as_warn (_("branch operand has odd offset (%lx)\n"),
1151 (unsigned long) operand->exp.X_add_number);
1153 if (!Hmode)
1154 operand[i].exp.X_add_number = (short) operand[i].exp.X_add_number;
1155 fix_new_exp (frag_now,
1156 output - frag_now->fr_literal,
1158 &operand[i].exp,
1160 R_JMPL1);
1167 try and give an intelligent error message for common and simple to
1168 detect errors
1171 static void
1172 clever_message (opcode, operand)
1173 struct h8_opcode *opcode;
1174 struct h8_op *operand;
1176 /* Find out if there was more than one possible opccode */
1178 if ((opcode + 1)->idx != opcode->idx)
1180 unsigned int argn;
1182 /* Only one opcode of this flavour, try and guess which operand
1183 didn't match */
1184 for (argn = 0; argn < opcode->noperands; argn++)
1186 switch (opcode->args.nib[argn])
1188 case RD16:
1189 if (operand[argn].mode != RD16)
1191 as_bad (_("destination operand must be 16 bit register"));
1192 return;
1195 break;
1197 case RS8:
1199 if (operand[argn].mode != RS8)
1201 as_bad (_("source operand must be 8 bit register"));
1202 return;
1204 break;
1206 case ABS16DST:
1207 if (operand[argn].mode != ABS16DST)
1209 as_bad (_("destination operand must be 16bit absolute address"));
1210 return;
1212 break;
1213 case RD8:
1214 if (operand[argn].mode != RD8)
1216 as_bad (_("destination operand must be 8 bit register"));
1217 return;
1219 break;
1222 case ABS16SRC:
1223 if (operand[argn].mode != ABS16SRC)
1225 as_bad (_("source operand must be 16bit absolute address"));
1226 return;
1228 break;
1233 as_bad (_("invalid operands"));
1236 /* This is the guts of the machine-dependent assembler. STR points to a
1237 machine dependent instruction. This funciton is supposed to emit
1238 the frags/bytes it assembles to.
1243 void
1244 md_assemble (str)
1245 char *str;
1247 char *op_start;
1248 char *op_end;
1249 struct h8_op operand[2];
1250 struct h8_opcode *opcode;
1251 struct h8_opcode *prev_opcode;
1253 char *dot = 0;
1254 char c;
1255 int size;
1257 /* Drop leading whitespace */
1258 while (*str == ' ')
1259 str++;
1261 /* find the op code end */
1262 for (op_start = op_end = str;
1263 *op_end != 0 && *op_end != ' ';
1264 op_end++)
1266 if (*op_end == '.')
1268 dot = op_end + 1;
1269 *op_end = 0;
1270 op_end += 2;
1271 break;
1277 if (op_end == op_start)
1279 as_bad (_("can't find opcode "));
1281 c = *op_end;
1283 *op_end = 0;
1285 opcode = (struct h8_opcode *) hash_find (opcode_hash_control,
1286 op_start);
1288 if (opcode == NULL)
1290 as_bad (_("unknown opcode"));
1291 return;
1294 /* We use to set input_line_pointer to the result of get_operands,
1295 but that is wrong. Our caller assumes we don't change it. */
1297 (void) get_operands (opcode->noperands, op_end, operand);
1298 *op_end = c;
1299 prev_opcode = opcode;
1301 size = SN;
1302 if (dot)
1304 switch (*dot)
1306 case 'b':
1307 size = SB;
1308 break;
1310 case 'w':
1311 size = SW;
1312 break;
1314 case 'l':
1315 size = SL;
1316 break;
1319 opcode = get_specific (opcode, operand, size);
1321 if (opcode == 0)
1323 /* Couldn't find an opcode which matched the operands */
1324 char *where = frag_more (2);
1326 where[0] = 0x0;
1327 where[1] = 0x0;
1328 clever_message (prev_opcode, operand);
1330 return;
1332 if (opcode->size && dot)
1334 if (opcode->size != *dot)
1336 as_warn (_("mismatch between opcode size and operand size"));
1340 build_bytes (opcode, operand);
1344 void
1345 tc_crawl_symbol_chain (headers)
1346 object_headers * headers;
1348 printf (_("call to tc_crawl_symbol_chain \n"));
1351 symbolS *
1352 md_undefined_symbol (name)
1353 char *name;
1355 return 0;
1358 void
1359 tc_headers_hook (headers)
1360 object_headers * headers;
1362 printf (_("call to tc_headers_hook \n"));
1365 /* Various routines to kill one day */
1366 /* Equal to MAX_PRECISION in atof-ieee.c */
1367 #define MAX_LITTLENUMS 6
1369 /* Turn a string in input_line_pointer into a floating point constant of type
1370 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
1371 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
1373 char *
1374 md_atof (type, litP, sizeP)
1375 char type;
1376 char *litP;
1377 int *sizeP;
1379 int prec;
1380 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1381 LITTLENUM_TYPE *wordP;
1382 char *t;
1383 char *atof_ieee ();
1385 switch (type)
1387 case 'f':
1388 case 'F':
1389 case 's':
1390 case 'S':
1391 prec = 2;
1392 break;
1394 case 'd':
1395 case 'D':
1396 case 'r':
1397 case 'R':
1398 prec = 4;
1399 break;
1401 case 'x':
1402 case 'X':
1403 prec = 6;
1404 break;
1406 case 'p':
1407 case 'P':
1408 prec = 6;
1409 break;
1411 default:
1412 *sizeP = 0;
1413 return _("Bad call to MD_ATOF()");
1415 t = atof_ieee (input_line_pointer, type, words);
1416 if (t)
1417 input_line_pointer = t;
1419 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1420 for (wordP = words; prec--;)
1422 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
1423 litP += sizeof (LITTLENUM_TYPE);
1425 return 0;
1428 CONST char *md_shortopts = "";
1429 struct option md_longopts[] = {
1430 {NULL, no_argument, NULL, 0}
1432 size_t md_longopts_size = sizeof(md_longopts);
1435 md_parse_option (c, arg)
1436 int c;
1437 char *arg;
1439 return 0;
1442 void
1443 md_show_usage (stream)
1444 FILE *stream;
1448 void
1449 tc_aout_fix_to_chars ()
1451 printf (_("call to tc_aout_fix_to_chars \n"));
1452 abort ();
1455 void
1456 md_convert_frag (headers, seg, fragP)
1457 object_headers *headers;
1458 segT seg;
1459 fragS *fragP;
1461 printf (_("call to md_convert_frag \n"));
1462 abort ();
1465 valueT
1466 md_section_align (seg, size)
1467 segT seg;
1468 valueT size;
1470 return ((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg]));
1474 void
1475 md_apply_fix (fixP, val)
1476 fixS *fixP;
1477 long val;
1479 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1481 switch (fixP->fx_size)
1483 case 1:
1484 *buf++ = val;
1485 break;
1486 case 2:
1487 *buf++ = (val >> 8);
1488 *buf++ = val;
1489 break;
1490 case 4:
1491 *buf++ = (val >> 24);
1492 *buf++ = (val >> 16);
1493 *buf++ = (val >> 8);
1494 *buf++ = val;
1495 break;
1496 default:
1497 abort ();
1502 md_estimate_size_before_relax (fragP, segment_type)
1503 register fragS *fragP;
1504 register segT segment_type;
1506 printf (_("call tomd_estimate_size_before_relax \n"));
1507 abort ();
1510 /* Put number into target byte order */
1512 void
1513 md_number_to_chars (ptr, use, nbytes)
1514 char *ptr;
1515 valueT use;
1516 int nbytes;
1518 number_to_chars_bigendian (ptr, use, nbytes);
1520 long
1521 md_pcrel_from (fixP)
1522 fixS *fixP;
1524 abort ();
1528 void
1529 tc_reloc_mangle (fix_ptr, intr, base)
1530 fixS *fix_ptr;
1531 struct internal_reloc *intr;
1532 bfd_vma base;
1535 symbolS *symbol_ptr;
1537 symbol_ptr = fix_ptr->fx_addsy;
1539 /* If this relocation is attached to a symbol then it's ok
1540 to output it */
1541 if (fix_ptr->fx_r_type == TC_CONS_RELOC)
1543 /* cons likes to create reloc32's whatever the size of the reloc..
1545 switch (fix_ptr->fx_size)
1547 case 4:
1548 intr->r_type = R_RELLONG;
1549 break;
1550 case 2:
1551 intr->r_type = R_RELWORD;
1552 break;
1553 case 1:
1554 intr->r_type = R_RELBYTE;
1555 break;
1556 default:
1557 abort ();
1562 else
1564 intr->r_type = fix_ptr->fx_r_type;
1567 intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
1568 intr->r_offset = fix_ptr->fx_offset;
1570 if (symbol_ptr)
1572 if (symbol_ptr->sy_number != -1)
1573 intr->r_symndx = symbol_ptr->sy_number;
1574 else
1576 symbolS *segsym;
1578 /* This case arises when a reference is made to `.'. */
1579 segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot;
1580 if (segsym == NULL)
1581 intr->r_symndx = -1;
1582 else
1584 intr->r_symndx = segsym->sy_number;
1585 intr->r_offset += S_GET_VALUE (symbol_ptr);
1589 else
1590 intr->r_symndx = -1;
1595 /* end of tc-h8300.c */