Prepare for multi-pass relaxation.
[deliverable/binutils-gdb.git] / gas / config / tc-h8500.c
CommitLineData
252b5132 1/* tc-h8500.c -- Assemble code for the Hitachi H8/500
93c2a809
AM
2 Copyright 1993, 1994, 1995, 1998, 2000, 2001
3 Free Software Foundation, Inc.
252b5132
RH
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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
4a4f25cf 22/* Written By Steve Chamberlain <sac@cygnus.com>. */
252b5132
RH
23
24#include <stdio.h>
25#include "as.h"
26#include "bfd.h"
27#include "subsegs.h"
28#define DEFINE_TABLE
29#define ASSEMBLER_TABLE
30#include "opcodes/h8500-opc.h"
31#include <ctype.h>
32
33const char comment_chars[] = "!";
34const char line_separator_chars[] = ";";
35const char line_comment_chars[] = "!#";
36
37/* This table describes all the machine specific pseudo-ops the assembler
38 has to support. The fields are:
39 pseudo-op name without dot
40 function to call to execute this pseudo-op
41 Integer arg to pass to the function
42 */
43
44void cons ();
45
46const pseudo_typeS md_pseudo_table[] =
47{
48 {"int", cons, 2},
49 {"data.b", cons, 1},
50 {"data.w", cons, 2},
51 {"data.l", cons, 4},
52 {"form", listing_psize, 0},
53 {"heading", listing_title, 0},
54 {"import", s_ignore, 0},
55 {"page", listing_eject, 0},
56 {"program", s_ignore, 0},
57 {0, 0, 0}
58};
59
60const int md_reloc_size;
61
62const char EXP_CHARS[] = "eE";
63
64/* Chars that mean this number is a floating point constant */
65/* As in 0f12.456 */
66/* or 0d1.2345e12 */
67const char FLT_CHARS[] = "rRsSfFdDxXpP";
68
69#define C(a,b) ENCODE_RELAX(a,b)
70#define ENCODE_RELAX(what,length) (((what) << 2) + (length))
71
72#define GET_WHAT(x) ((x>>2))
73
74#define BYTE_DISP 1
75#define WORD_DISP 2
76#define UNDEF_BYTE_DISP 0
77#define UNDEF_WORD_DISP 3
78
79#define BRANCH 1
80#define SCB_F 2
81#define SCB_TST 3
82#define END 4
83
84#define BYTE_F 127
85#define BYTE_B -126
86#define WORD_F 32767
87#define WORD_B 32768
88
89relax_typeS md_relax_table[C (END, 0)];
90
91static struct hash_control *opcode_hash_control; /* Opcode mnemonics */
92
93/*
94 This function is called once, at assembler startup time. This should
e7b305a2 95 set up all the tables, etc. that the MD part of the assembler needs
252b5132
RH
96 */
97
98void
99md_begin ()
100{
101 h8500_opcode_info *opcode;
102 char prev_buffer[100];
103 int idx = 0;
104 register relax_typeS *table;
105
106 opcode_hash_control = hash_new ();
107 prev_buffer[0] = 0;
108
109 /* Insert unique names into hash table */
110 for (opcode = h8500_table; opcode->name; opcode++)
111 {
112 if (idx != opcode->idx)
113 {
114 hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
115 idx++;
116 }
117 }
118
119 /* Initialize the relax table. We use a local variable to avoid
120 warnings about modifying a supposedly const data structure. */
121 table = (relax_typeS *) md_relax_table;
122 table[C (BRANCH, BYTE_DISP)].rlx_forward = BYTE_F;
123 table[C (BRANCH, BYTE_DISP)].rlx_backward = BYTE_B;
124 table[C (BRANCH, BYTE_DISP)].rlx_length = 2;
125 table[C (BRANCH, BYTE_DISP)].rlx_more = C (BRANCH, WORD_DISP);
126
127 table[C (BRANCH, WORD_DISP)].rlx_forward = WORD_F;
128 table[C (BRANCH, WORD_DISP)].rlx_backward = WORD_B;
129 table[C (BRANCH, WORD_DISP)].rlx_length = 3;
130 table[C (BRANCH, WORD_DISP)].rlx_more = 0;
131
132 table[C (SCB_F, BYTE_DISP)].rlx_forward = BYTE_F;
133 table[C (SCB_F, BYTE_DISP)].rlx_backward = BYTE_B;
134 table[C (SCB_F, BYTE_DISP)].rlx_length = 3;
135 table[C (SCB_F, BYTE_DISP)].rlx_more = C (SCB_F, WORD_DISP);
136
137 table[C (SCB_F, WORD_DISP)].rlx_forward = WORD_F;
138 table[C (SCB_F, WORD_DISP)].rlx_backward = WORD_B;
139 table[C (SCB_F, WORD_DISP)].rlx_length = 8;
140 table[C (SCB_F, WORD_DISP)].rlx_more = 0;
141
142 table[C (SCB_TST, BYTE_DISP)].rlx_forward = BYTE_F;
143 table[C (SCB_TST, BYTE_DISP)].rlx_backward = BYTE_B;
144 table[C (SCB_TST, BYTE_DISP)].rlx_length = 3;
145 table[C (SCB_TST, BYTE_DISP)].rlx_more = C (SCB_TST, WORD_DISP);
146
147 table[C (SCB_TST, WORD_DISP)].rlx_forward = WORD_F;
148 table[C (SCB_TST, WORD_DISP)].rlx_backward = WORD_B;
149 table[C (SCB_TST, WORD_DISP)].rlx_length = 10;
150 table[C (SCB_TST, WORD_DISP)].rlx_more = 0;
151
152}
153
154static int rn; /* register number used by RN */
155static int rs; /* register number used by RS */
156static int rd; /* register number used by RD */
157static int crb; /* byte size cr */
158static int crw; /* word sized cr */
159static int cr; /* unknown size cr */
160
161static expressionS displacement;/* displacement expression */
162static int displacement_size; /* and size if given */
163
164static int immediate_inpage;
165static expressionS immediate; /* immediate expression */
166static int immediate_size; /* and size if given */
167
168static expressionS absolute; /* absolute expression */
169static int absolute_size; /* and size if given */
170
171typedef struct
172{
173 int type;
174 int reg;
175 expressionS exp;
176 int page;
177}
178
179h8500_operand_info;
180
bc0d738a
NC
181/* Try to parse a reg name. Return the number of chars consumed. */
182
252b5132
RH
183static int
184parse_reg (src, mode, reg)
185 char *src;
186 int *mode;
187 int *reg;
188{
189 char *end;
190 int len;
191
192 /* Cribbed from get_symbol_end(). */
193 if (!is_name_beginner (*src) || *src == '\001')
194 return 0;
3dd5103b 195 end = src + 1;
252b5132
RH
196 while (is_part_of_name (*end) || *end == '\001')
197 end++;
198 len = end - src;
199
200 if (len == 2 && src[0] == 'r')
201 {
202 if (src[1] >= '0' && src[1] <= '7')
203 {
204 *mode = RN;
205 *reg = (src[1] - '0');
206 return len;
207 }
208 }
209 if (len == 2 && src[0] == 's' && src[1] == 'p')
210 {
211 *mode = RN;
212 *reg = 7;
213 return len;
214 }
215 if (len == 3 && src[0] == 'c' && src[1] == 'c' && src[2] == 'r')
216 {
217 *mode = CRB;
218 *reg = 1;
219 return len;
220 }
221 if (len == 2 && src[0] == 's' && src[1] == 'r')
222 {
223 *mode = CRW;
224 *reg = 0;
225 return len;
226 }
227 if (len == 2 && src[0] == 'b' && src[1] == 'r')
228 {
229 *mode = CRB;
230 *reg = 3;
231 return len;
232 }
233 if (len == 2 && src[0] == 'e' && src[1] == 'p')
234 {
235 *mode = CRB;
236 *reg = 4;
237 return len;
238 }
239 if (len == 2 && src[0] == 'd' && src[1] == 'p')
240 {
241 *mode = CRB;
242 *reg = 5;
243 return len;
244 }
245 if (len == 2 && src[0] == 't' && src[1] == 'p')
246 {
247 *mode = CRB;
248 *reg = 7;
249 return len;
250 }
251 if (len == 2 && src[0] == 'f' && src[1] == 'p')
252 {
253 *mode = RN;
254 *reg = 6;
255 return len;
256 }
257 return 0;
258}
259
3dd5103b 260static char *
252b5132
RH
261parse_exp (s, op, page)
262 char *s;
263 expressionS *op;
264 int *page;
265{
266 char *save;
267 char *new;
268
269 save = input_line_pointer;
270
271 *page = 0;
272 if (s[0] == '%')
273 {
274 if (s[1] == 'p' && s[2] == 'a' && s[3] == 'g' && s[4] == 'e')
275 {
276 s += 5;
277 *page = 'p';
278 }
279 if (s[1] == 'h' && s[2] == 'i' && s[3] == '1' && s[4] == '6')
280 {
281 s += 5;
282 *page = 'h';
283 }
284 else if (s[1] == 'o' && s[2] == 'f' && s[3] == 'f')
285 {
286 s += 4;
287 *page = 'o';
288 }
289 }
290
291 input_line_pointer = s;
292
293 expression (op);
294 if (op->X_op == O_absent)
295 as_bad (_("missing operand"));
296 new = input_line_pointer;
297 input_line_pointer = save;
298 return new;
299}
300
301typedef enum
302 {
303 exp_signed, exp_unsigned, exp_sandu
304 } sign_type;
305
252b5132
RH
306static char *
307skip_colonthing (sign, ptr, exp, def, size8, size16, size24)
308 sign_type sign;
309 char *ptr;
310 h8500_operand_info *exp;
311 int def;
312 int size8;
313 int size16;
314 int size24;
315{
316 ptr = parse_exp (ptr, &exp->exp, &exp->page);
317 if (*ptr == ':')
318 {
319 ptr++;
320 if (*ptr == '8')
321 {
322 ptr++;
323 exp->type = size8;
324 }
325 else if (ptr[0] == '1' & ptr[1] == '6')
326 {
327 ptr += 2;
328 exp->type = size16;
329 }
330 else if (ptr[0] == '2' & ptr[1] == '4')
331 {
332 if (!size24)
333 {
334 as_bad (_(":24 not valid for this opcode"));
335 }
336 ptr += 2;
337 exp->type = size24;
338 }
339 else
340 {
341 as_bad (_("expect :8,:16 or :24"));
342 exp->type = size16;
343 }
344 }
345 else
346 {
347 if (exp->page == 'p')
348 {
349 exp->type = IMM8;
350 }
351 else if (exp->page == 'h')
352 {
353 exp->type = IMM16;
354 }
355 else
356 {
357 /* Let's work out the size from the context */
358 int n = exp->exp.X_add_number;
359 if (size8
360 && exp->exp.X_op == O_constant
361 && ((sign == exp_signed && (n >= -128 && n <= 127))
362 || (sign == exp_unsigned && (n >= 0 && (n <= 255)))
363 || (sign == exp_sandu && (n >= -128 && (n <= 255)))))
364 {
365 exp->type = size8;
366 }
367 else
368 {
369 exp->type = def;
370 }
371 }
372 }
373 return ptr;
374}
375
376static int
377parse_reglist (src, op)
378 char *src;
379 h8500_operand_info *op;
380{
381 int mode;
382 int rn;
383 int mask = 0;
384 int rm;
385 int idx = 1; /* skip ( */
386
387 while (src[idx] && src[idx] != ')')
388 {
389 int done = parse_reg (src + idx, &mode, &rn);
390
391 if (done)
392 {
393 idx += done;
394 mask |= 1 << rn;
395 }
396 else
397 {
398 as_bad (_("syntax error in reg list"));
399 return 0;
400 }
401 if (src[idx] == '-')
402 {
403 idx++;
404 done = parse_reg (src + idx, &mode, &rm);
405 if (done)
406 {
407 idx += done;
408 while (rn <= rm)
409 {
410 mask |= 1 << rn;
411 rn++;
412 }
413 }
414 else
415 {
416 as_bad (_("missing final register in range"));
417 }
418 }
419 if (src[idx] == ',')
420 idx++;
421 }
422 idx++;
423 op->exp.X_add_symbol = 0;
424 op->exp.X_op_symbol = 0;
425 op->exp.X_add_number = mask;
426 op->exp.X_op = O_constant;
427 op->exp.X_unsigned = 1;
428 op->type = IMM8;
429 return idx;
430
431}
432
433/* The many forms of operand:
434
435 Rn Register direct
436 @Rn Register indirect
437 @(disp[:size], Rn) Register indirect with displacement
438 @Rn+
439 @-Rn
440 @aa[:size] absolute
441 #xx[:size] immediate data
442
443 */
444
445static void
446get_operand (ptr, op, ispage)
447 char **ptr;
448 h8500_operand_info *op;
449 char ispage;
450{
451 char *src = *ptr;
452 int mode;
453 unsigned int num;
454 unsigned int len;
455 op->page = 0;
456 if (src[0] == '(' && src[1] == 'r')
457 {
458 /* This is a register list */
459 *ptr = src + parse_reglist (src, op);
460 return;
461 }
462
463 len = parse_reg (src, &op->type, &op->reg);
464
465 if (len)
466 {
467 *ptr = src + len;
468 return;
469 }
470
471 if (*src == '@')
472 {
473 src++;
474 if (*src == '-')
475 {
476 src++;
477 len = parse_reg (src, &mode, &num);
478 if (len == 0)
479 {
480 /* Oops, not a reg after all, must be ordinary exp */
481 src--;
482 /* must be a symbol */
483 *ptr = skip_colonthing (exp_unsigned, src,
484 op, ABS16, ABS8, ABS16, ABS24);
485 return;
486 }
487
488 op->type = RNDEC;
489 op->reg = num;
490 *ptr = src + len;
491 return;
492 }
493 if (*src == '(')
494 {
495 /* Disp */
496 src++;
497
3dd5103b 498 src = skip_colonthing (exp_signed, src,
252b5132
RH
499 op, RNIND_D16, RNIND_D8, RNIND_D16, 0);
500
501 if (*src != ',')
502 {
503 as_bad (_("expected @(exp, Rn)"));
504 return;
505 }
506 src++;
507 len = parse_reg (src, &mode, &op->reg);
508 if (len == 0 || mode != RN)
509 {
510 as_bad (_("expected @(exp, Rn)"));
511 return;
512 }
513 src += len;
514 if (*src != ')')
515 {
516 as_bad (_("expected @(exp, Rn)"));
517 return;
518 }
519 *ptr = src + 1;
520 return;
521 }
522 len = parse_reg (src, &mode, &num);
523
524 if (len)
525 {
526 src += len;
527 if (*src == '+')
528 {
529 src++;
530 if (mode != RN)
531 {
532 as_bad (_("@Rn+ needs word register"));
533 return;
534 }
535 op->type = RNINC;
536 op->reg = num;
537 *ptr = src;
538 return;
539 }
540 if (mode != RN)
541 {
542 as_bad (_("@Rn needs word register"));
543 return;
544 }
545 op->type = RNIND;
546 op->reg = num;
547 *ptr = src;
548 return;
549 }
550 else
551 {
552 /* must be a symbol */
553 *ptr =
554 skip_colonthing (exp_unsigned, src, op,
555 ispage ? ABS24 : ABS16, ABS8, ABS16, ABS24);
556 return;
557 }
558 }
559
560 if (*src == '#')
561 {
562 src++;
563 *ptr = skip_colonthing (exp_sandu, src, op, IMM16, IMM8, IMM16, ABS24);
564 return;
565 }
566 else
567 {
568 *ptr = skip_colonthing (exp_signed, src, op,
569 ispage ? ABS24 : PCREL8, PCREL8, PCREL16, ABS24);
570 }
571}
572
3dd5103b 573static char *
252b5132
RH
574get_operands (info, args, operand)
575 h8500_opcode_info *info;
576 char *args;
577 h8500_operand_info *operand;
578
579{
580 char *ptr = args;
581
582 switch (info->nargs)
583 {
584 case 0:
585 operand[0].type = 0;
586 operand[1].type = 0;
587 break;
588
589 case 1:
590 ptr++;
591 get_operand (&ptr, operand + 0, info->name[0] == 'p');
592 operand[1].type = 0;
593 break;
594
595 case 2:
596 ptr++;
597 get_operand (&ptr, operand + 0, 0);
598 if (*ptr == ',')
599 ptr++;
600 get_operand (&ptr, operand + 1, 0);
601 break;
602
603 default:
604 abort ();
605 }
606
607 return ptr;
608}
609
610/* Passed a pointer to a list of opcodes which use different
611 addressing modes, return the opcode which matches the opcodes
3dd5103b 612 provided. */
252b5132
RH
613
614int pcrel8; /* Set when we've seen a pcrel operand */
615
3dd5103b 616static h8500_opcode_info *
252b5132
RH
617get_specific (opcode, operands)
618 h8500_opcode_info *opcode;
619 h8500_operand_info *operands;
620{
621 h8500_opcode_info *this_try = opcode;
622 int found = 0;
623 unsigned int noperands = opcode->nargs;
624
625 unsigned int this_index = opcode->idx;
626
627 while (this_index == opcode->idx && !found)
628 {
629 unsigned int i;
630
631 this_try = opcode++;
632
633 /* look at both operands needed by the opcodes and provided by
634 the user*/
635 for (i = 0; i < noperands; i++)
636 {
637 h8500_operand_info *user = operands + i;
638
639 switch (this_try->arg_type[i])
640 {
641 case FPIND_D8:
642 /* Opcode needs (disp:8,fp) */
643 if (user->type == RNIND_D8 && user->reg == 6)
644 {
645 displacement = user->exp;
646 continue;
647 }
648 break;
649 case RDIND_D16:
650 if (user->type == RNIND_D16)
651 {
652 displacement = user->exp;
653 rd = user->reg;
654 continue;
655 }
656 break;
657 case RDIND_D8:
658 if (user->type == RNIND_D8)
659 {
660 displacement = user->exp;
661 rd = user->reg;
662 continue;
663 }
664 break;
665 case RNIND_D16:
666 case RNIND_D8:
667 if (user->type == this_try->arg_type[i])
668 {
669 displacement = user->exp;
670 rn = user->reg;
671 continue;
672 }
673 break;
674
675 case SPDEC:
676 if (user->type == RNDEC && user->reg == 7)
677 {
678 continue;
679 }
680 break;
681 case SPINC:
682 if (user->type == RNINC && user->reg == 7)
683 {
684 continue;
685 }
686 break;
687 case ABS16:
688 if (user->type == ABS16)
689 {
690 absolute = user->exp;
691 continue;
692 }
693 break;
694 case ABS8:
695 if (user->type == ABS8)
696 {
697 absolute = user->exp;
698 continue;
699 }
700 break;
701 case ABS24:
702 if (user->type == ABS24)
703 {
704 absolute = user->exp;
705 continue;
706 }
707 break;
708
709 case CRB:
710 if ((user->type == CRB || user->type == CR) && user->reg != 0)
711 {
712 crb = user->reg;
713 continue;
714 }
715 break;
716 case CRW:
717 if ((user->type == CRW || user->type == CR) && user->reg == 0)
718 {
719 crw = user->reg;
720 continue;
721 }
722 break;
723 case DISP16:
724 if (user->type == DISP16)
725 {
726 displacement = user->exp;
727 continue;
728 }
729 break;
730 case DISP8:
731 if (user->type == DISP8)
732 {
733 displacement = user->exp;
734 continue;
735 }
736 break;
737 case FP:
738 if (user->type == RN && user->reg == 6)
739 {
740 continue;
741 }
742 break;
743 case PCREL16:
744 if (user->type == PCREL16)
745 {
746 displacement = user->exp;
747 continue;
748 }
749 break;
750 case PCREL8:
751 if (user->type == PCREL8)
752 {
753 displacement = user->exp;
754 pcrel8 = 1;
755 continue;
756 }
757 break;
758
759 case IMM16:
760 if (user->type == IMM16
761 || user->type == IMM8)
762 {
763 immediate_inpage = user->page;
764 immediate = user->exp;
765 continue;
766 }
767 break;
768 case RLIST:
769 case IMM8:
770 if (user->type == IMM8)
771 {
772 immediate_inpage = user->page;
773 immediate = user->exp;
774 continue;
775 }
776 break;
777 case IMM4:
778 if (user->type == IMM8)
779 {
780 immediate_inpage = user->page;
781 immediate = user->exp;
782 continue;
783 }
784 break;
785 case QIM:
786 if (user->type == IMM8
787 && user->exp.X_op == O_constant
788 &&
789 (user->exp.X_add_number == -2
790 || user->exp.X_add_number == -1
791 || user->exp.X_add_number == 1
792 || user->exp.X_add_number == 2))
793 {
794 immediate_inpage = user->page;
795 immediate = user->exp;
796 continue;
797 }
798 break;
799 case RD:
800 if (user->type == RN)
801 {
802 rd = user->reg;
803 continue;
804 }
805 break;
806 case RS:
807 if (user->type == RN)
808 {
809 rs = user->reg;
810 continue;
811 }
812 break;
813 case RDIND:
814 if (user->type == RNIND)
815 {
816 rd = user->reg;
817 continue;
818
819 }
820 break;
821 case RNINC:
822 case RNIND:
823 case RNDEC:
824 case RN:
825
826 if (user->type == this_try->arg_type[i])
827 {
828 rn = user->reg;
829 continue;
830 }
831 break;
832 case SP:
833 if (user->type == RN && user->reg == 7)
834 {
835 continue;
836 }
837 break;
838 default:
839 printf (_("unhandled %d\n"), this_try->arg_type[i]);
840 break;
841 }
842
843 /* If we get here this didn't work out */
844 goto fail;
845 }
846 found = 1;
847 fail:;
848
849 }
850
851 if (found)
852 return this_try;
853 else
854 return 0;
855}
856
857int
858check (operand, low, high)
859 expressionS *operand;
860 int low;
861 int high;
862{
863 if (operand->X_op != O_constant
864 || operand->X_add_number < low
865 || operand->X_add_number > high)
866 {
867 as_bad (_("operand must be absolute in range %d..%d"), low, high);
868 }
869 return operand->X_add_number;
870}
871
3dd5103b 872static void
252b5132
RH
873insert (output, index, exp, reloc, pcrel)
874 char *output;
875 int index;
876 expressionS *exp;
877 int reloc;
878 int pcrel;
879{
880 fix_new_exp (frag_now,
881 output - frag_now->fr_literal + index,
882 4, /* always say size is 4, but we know better */
883 exp,
884 pcrel,
885 reloc);
886}
887
888void
889build_relaxable_instruction (opcode, operand)
890 h8500_opcode_info *opcode;
891 h8500_operand_info *operand;
892{
893 /* All relaxable instructions start life as two bytes but can become
3dd5103b
NC
894 three bytes long if a lonely branch and up to 9 bytes if long
895 scb. */
252b5132
RH
896 char *p;
897 int len;
898 int type;
899
900 if (opcode->bytes[0].contents == 0x01)
901 {
902 type = SCB_F;
903 }
904 else if (opcode->bytes[0].contents == 0x06
905 || opcode->bytes[0].contents == 0x07)
906 {
907 type = SCB_TST;
908 }
909 else
910 {
911 type = BRANCH;
912 }
913
914 p = frag_var (rs_machine_dependent,
915 md_relax_table[C (type, WORD_DISP)].rlx_length,
916 len = md_relax_table[C (type, BYTE_DISP)].rlx_length,
917 C (type, UNDEF_BYTE_DISP),
918 displacement.X_add_symbol,
919 displacement.X_add_number,
920 0);
921
922 p[0] = opcode->bytes[0].contents;
923 if (type != BRANCH)
924 {
925 p[1] = opcode->bytes[1].contents | rs;
926 }
927}
928
3dd5103b
NC
929/* Now we know what sort of opcodes it is, let's build the bytes. */
930
252b5132
RH
931static void
932build_bytes (opcode, operand)
933 h8500_opcode_info *opcode;
934 h8500_operand_info *operand;
935
936{
937 int index;
938
939 if (pcrel8)
940 {
941 pcrel8 = 0;
942 build_relaxable_instruction (opcode, operand);
943 }
944 else
945 {
946 char *output = frag_more (opcode->length);
947
948 memset (output, 0, opcode->length);
949 for (index = 0; index < opcode->length; index++)
950 {
951 output[index] = opcode->bytes[index].contents;
952
953 switch (opcode->bytes[index].insert)
954 {
955 default:
956 printf (_("failed for %d\n"), opcode->bytes[index].insert);
957 break;
958 case 0:
959 break;
960 case RN:
961 output[index] |= rn;
962 break;
963 case RD:
964 case RDIND:
252b5132
RH
965 output[index] |= rd;
966 break;
967 case RS:
968 output[index] |= rs;
969 break;
970 case DISP16:
971 insert (output, index, &displacement, R_H8500_IMM16, 0);
972 index++;
973 break;
974 case DISP8:
975 case FPIND_D8:
976 insert (output, index, &displacement, R_H8500_IMM8, 0);
977 break;
252b5132
RH
978 case IMM16:
979 {
980 int p;
3dd5103b
NC
981
982 switch (immediate_inpage)
983 {
984 case 'p':
985 p = R_H8500_HIGH16;
986 break;
987 case 'h':
988 p = R_H8500_HIGH16;
989 break;
990 default:
991 p = R_H8500_IMM16;
992 break;
993 }
994 insert (output, index, &immediate, p, 0);
252b5132 995 }
252b5132
RH
996 index++;
997 break;
998 case RLIST:
999 case IMM8:
1000 if (immediate_inpage)
3dd5103b 1001 insert (output, index, &immediate, R_H8500_HIGH8, 0);
252b5132 1002 else
3dd5103b 1003 insert (output, index, &immediate, R_H8500_IMM8, 0);
252b5132
RH
1004 break;
1005 case PCREL16:
1006 insert (output, index, &displacement, R_H8500_PCREL16, 1);
1007 index++;
1008 break;
1009 case PCREL8:
1010 insert (output, index, &displacement, R_H8500_PCREL8, 1);
1011 break;
1012 case IMM4:
1013 output[index] |= check (&immediate, 0, 15);
1014 break;
1015 case CR:
252b5132
RH
1016 output[index] |= cr;
1017 if (cr == 0)
3dd5103b 1018 output[0] |= 0x8;
252b5132 1019 else
3dd5103b 1020 output[0] &= ~0x8;
252b5132 1021 break;
252b5132
RH
1022 case CRB:
1023 output[index] |= crb;
1024 output[0] &= ~0x8;
1025 break;
1026 case CRW:
1027 output[index] |= crw;
1028 output[0] |= 0x8;
1029 break;
1030 case ABS24:
1031 insert (output, index, &absolute, R_H8500_IMM24, 0);
1032 index += 2;
1033 break;
1034 case ABS16:
1035 insert (output, index, &absolute, R_H8500_IMM16, 0);
1036 index++;
1037 break;
1038 case ABS8:
1039 insert (output, index, &absolute, R_H8500_IMM8, 0);
1040 break;
1041 case QIM:
1042 switch (immediate.X_add_number)
1043 {
1044 case -2:
1045 output[index] |= 0x5;
1046 break;
1047 case -1:
1048 output[index] |= 0x4;
1049 break;
1050 case 1:
1051 output[index] |= 0;
1052 break;
1053 case 2:
1054 output[index] |= 1;
1055 break;
1056 }
1057 break;
1058 }
1059 }
1060 }
1061}
1062
3dd5103b
NC
1063/* This is the guts of the machine-dependent assembler. STR points to
1064 a machine dependent instruction. This function is supposed to emit
1065 the frags/bytes it assembles to. */
252b5132
RH
1066
1067void
c0fecd35
AM
1068md_assemble (str)
1069 char *str;
252b5132
RH
1070{
1071 char *op_start;
1072 char *op_end;
1073 h8500_operand_info operand[2];
1074 h8500_opcode_info *opcode;
1075 h8500_opcode_info *prev_opcode;
1076 char name[11];
1077
1078 int nlen = 0;
1079
3dd5103b 1080 /* Drop leading whitespace. */
252b5132
RH
1081 while (*str == ' ')
1082 str++;
1083
3dd5103b 1084 /* Find the op code end. */
252b5132 1085 for (op_start = op_end = str;
b75c0c92 1086 !is_end_of_line[(unsigned char) *op_end] && *op_end != ' ';
252b5132
RH
1087 op_end++)
1088 {
1089 if ( /**op_end != '.'
1090 && *op_end != ':'
1091 && */ nlen < 10)
1092 {
1093 name[nlen++] = *op_end;
1094 }
1095 }
1096 name[nlen] = 0;
1097
1098 if (op_end == op_start)
3dd5103b 1099 as_bad (_("can't find opcode "));
252b5132
RH
1100
1101 opcode = (h8500_opcode_info *) hash_find (opcode_hash_control, name);
1102
1103 if (opcode == NULL)
1104 {
1105 as_bad (_("unknown opcode"));
1106 return;
1107 }
1108
1109 get_operands (opcode, op_end, operand);
1110 prev_opcode = opcode;
1111
1112 opcode = get_specific (opcode, operand);
1113
1114 if (opcode == 0)
1115 {
1116 /* Couldn't find an opcode which matched the operands */
1117 char *where = frag_more (2);
1118
1119 where[0] = 0x0;
1120 where[1] = 0x0;
1121 as_bad (_("invalid operands for opcode"));
1122 return;
1123 }
1124
1125 build_bytes (opcode, operand);
252b5132
RH
1126}
1127
1128void
c0fecd35
AM
1129tc_crawl_symbol_chain (headers)
1130 object_headers *headers;
252b5132
RH
1131{
1132 printf (_("call to tc_crawl_symbol_chain \n"));
1133}
1134
1135symbolS *
c0fecd35
AM
1136md_undefined_symbol (name)
1137 char *name;
252b5132
RH
1138{
1139 return 0;
1140}
1141
1142void
c0fecd35
AM
1143tc_headers_hook (headers)
1144 object_headers *headers;
252b5132
RH
1145{
1146 printf (_("call to tc_headers_hook \n"));
1147}
1148
3dd5103b
NC
1149/* Various routines to kill one day. */
1150/* Equal to MAX_PRECISION in atof-ieee.c. */
252b5132
RH
1151#define MAX_LITTLENUMS 6
1152
bc0d738a
NC
1153/* Turn a string in input_line_pointer into a floating point constant
1154 of type type, and store the appropriate bytes in *LITP. The number
1155 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1156 returned, or NULL on OK. */
1157
252b5132
RH
1158char *
1159md_atof (type, litP, sizeP)
1160 char type;
1161 char *litP;
1162 int *sizeP;
1163{
1164 int prec;
1165 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1166 LITTLENUM_TYPE *wordP;
1167 char *t;
1168 char *atof_ieee ();
1169
1170 switch (type)
1171 {
1172 case 'f':
1173 case 'F':
1174 case 's':
1175 case 'S':
1176 prec = 2;
1177 break;
1178
1179 case 'd':
1180 case 'D':
1181 case 'r':
1182 case 'R':
1183 prec = 4;
1184 break;
1185
1186 case 'x':
1187 case 'X':
1188 prec = 6;
1189 break;
1190
1191 case 'p':
1192 case 'P':
1193 prec = 6;
1194 break;
1195
1196 default:
1197 *sizeP = 0;
1198 return _("Bad call to MD_ATOF()");
1199 }
1200 t = atof_ieee (input_line_pointer, type, words);
1201 if (t)
1202 input_line_pointer = t;
1203
1204 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1205 for (wordP = words; prec--;)
1206 {
1207 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
1208 litP += sizeof (LITTLENUM_TYPE);
1209 }
1210 return 0;
1211}
1212\f
1213CONST char *md_shortopts = "";
1214struct option md_longopts[] = {
1215 {NULL, no_argument, NULL, 0}
1216};
3dd5103b 1217size_t md_longopts_size = sizeof (md_longopts);
252b5132
RH
1218
1219int
1220md_parse_option (c, arg)
1221 int c;
1222 char *arg;
1223{
1224 return 0;
1225}
1226
1227void
1228md_show_usage (stream)
1229 FILE *stream;
1230{
1231}
1232\f
1233void
1234tc_aout_fix_to_chars ()
1235{
1236 printf (_("call to tc_aout_fix_to_chars \n"));
1237 abort ();
1238}
1239
3dd5103b 1240static void
252b5132
RH
1241wordify_scb (buffer, disp_size, inst_size)
1242 char *buffer;
1243 int *disp_size;
1244 int *inst_size;
1245{
1246 int rn = buffer[1] & 0x7;
1247
1248 switch (buffer[0])
1249 {
1250 case 0x0e: /* BSR */
1251 case 0x20:
1252 case 0x21:
1253 case 0x22:
1254 case 0x23:
1255 case 0x24:
1256 case 0x25:
1257 case 0x26:
1258 case 0x27:
1259 case 0x28:
1260 case 0x29:
1261 case 0x2a:
1262 case 0x2b:
1263 case 0x2c:
1264 case 0x2d:
1265 case 0x2e:
1266 case 0x2f:
1267 buffer[0] |= 0x10;
1268 buffer[1] = 0;
1269 buffer[2] = 0;
1270 *disp_size = 2;
1271 *inst_size = 1;
1272 return;
1273 default:
1274 abort ();
1275
1276 case 0x01:
1277 *inst_size = 6;
1278 *disp_size = 2;
1279 break;
1280 case 0x06:
1281 *inst_size = 8;
1282 *disp_size = 2;
1283
1284 *buffer++ = 0x26; /* bne + 8 */
1285 *buffer++ = 0x08;
1286 break;
1287 case 0x07:
1288 *inst_size = 8;
1289 *disp_size = 2;
1290 *buffer++ = 0x27; /* bne + 8 */
1291 *buffer++ = 0x08;
1292 break;
1293
1294 }
1295 *buffer++ = 0xa8 | rn; /* addq -1,rn */
1296 *buffer++ = 0x0c;
1297 *buffer++ = 0x04; /* cmp #0xff:8, rn */
1298 *buffer++ = 0xff;
1299 *buffer++ = 0x70 | rn;
4a4f25cf 1300 *buffer++ = 0x36; /* bne ... */
252b5132
RH
1301 *buffer++ = 0;
1302 *buffer++ = 0;
1303}
1304
3dd5103b
NC
1305/* Called after relaxing, change the frags so they know how big they
1306 are. */
1307
252b5132
RH
1308void
1309md_convert_frag (headers, seg, fragP)
1310 object_headers *headers;
1311 segT seg;
1312 fragS *fragP;
1313{
1314 int disp_size = 0;
1315 int inst_size = 0;
1316 char *buffer = fragP->fr_fix + fragP->fr_literal;
1317
1318 switch (fragP->fr_subtype)
1319 {
1320 case C (BRANCH, BYTE_DISP):
1321 disp_size = 1;
1322 inst_size = 1;
1323 break;
1324
1325 case C (SCB_F, BYTE_DISP):
1326 case C (SCB_TST, BYTE_DISP):
1327 disp_size = 1;
1328 inst_size = 2;
1329 break;
1330
3dd5103b 1331 /* Branches to a known 16 bit displacement. */
252b5132 1332
3dd5103b 1333 /* Turn on the 16bit bit. */
252b5132
RH
1334 case C (BRANCH, WORD_DISP):
1335 case C (SCB_F, WORD_DISP):
1336 case C (SCB_TST, WORD_DISP):
1337 wordify_scb (buffer, &disp_size, &inst_size);
1338 break;
1339
1340 case C (BRANCH, UNDEF_WORD_DISP):
1341 case C (SCB_F, UNDEF_WORD_DISP):
1342 case C (SCB_TST, UNDEF_WORD_DISP):
3dd5103b
NC
1343 /* This tried to be relaxed, but didn't manage it, it now needs
1344 a fix. */
252b5132
RH
1345 wordify_scb (buffer, &disp_size, &inst_size);
1346
1347 /* Make a reloc */
1348 fix_new (fragP,
1349 fragP->fr_fix + inst_size,
1350 4,
1351 fragP->fr_symbol,
1352 fragP->fr_offset,
1353 0,
1354 R_H8500_PCREL16);
1355
1356 fragP->fr_fix += disp_size + inst_size;
1357 fragP->fr_var = 0;
1358 return;
1359 break;
1360 default:
1361 abort ();
1362 }
1363 if (inst_size)
1364 {
1365 /* Get the address of the end of the instruction */
1366 int next_inst = fragP->fr_fix + fragP->fr_address + disp_size + inst_size;
1367 int targ_addr = (S_GET_VALUE (fragP->fr_symbol) +
1368 fragP->fr_offset);
1369 int disp = targ_addr - next_inst;
1370
1371 md_number_to_chars (buffer + inst_size, disp, disp_size);
1372 fragP->fr_fix += disp_size + inst_size;
1373 fragP->fr_var = 0;
1374 }
1375}
1376
1377valueT
1378md_section_align (seg, size)
1379 segT seg ;
1380 valueT size;
1381{
3dd5103b 1382 return ((size + (1 << section_alignment[(int) seg]) - 1)
252b5132
RH
1383 & (-1 << section_alignment[(int) seg]));
1384
1385}
1386
1387void
1388md_apply_fix (fixP, val)
1389 fixS *fixP;
1390 long val;
1391{
1392 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1393
1394 if (fixP->fx_r_type == 0)
1395 {
1396 fixP->fx_r_type = fixP->fx_size == 4 ? R_H8500_IMM32 : R_H8500_IMM16;
1397 }
1398
1399 switch (fixP->fx_r_type)
1400 {
1401
1402 case R_H8500_IMM8:
1403 case R_H8500_PCREL8:
1404 *buf++ = val;
1405 break;
1406 case R_H8500_IMM16:
1407 case R_H8500_LOW16:
1408 case R_H8500_PCREL16:
1409 *buf++ = (val >> 8);
1410 *buf++ = val;
1411 break;
1412 case R_H8500_HIGH8:
1413 *buf++ = val >> 16;
1414 break;
1415 case R_H8500_HIGH16:
1416 *buf++ = val >> 24;
1417 *buf++ = val >> 16;
1418 break;
1419 case R_H8500_IMM24:
1420 *buf++ = (val >> 16);
1421 *buf++ = (val >> 8);
1422 *buf++ = val;
1423 break;
1424 case R_H8500_IMM32:
1425 *buf++ = (val >> 24);
1426 *buf++ = (val >> 16);
1427 *buf++ = (val >> 8);
1428 *buf++ = val;
1429 break;
1430 default:
1431 abort ();
1432
1433 }
1434}
1435
1436/*
1437called just before address relaxation, return the length
1438by which a fragment must grow to reach it's destination
1439*/
1440int
1441md_estimate_size_before_relax (fragP, segment_type)
1442 register fragS *fragP;
1443 register segT segment_type;
1444{
1445 int what = GET_WHAT (fragP->fr_subtype);
1446
1447 switch (fragP->fr_subtype)
1448 {
1449 default:
1450 abort ();
93c2a809 1451
252b5132
RH
1452 case C (BRANCH, UNDEF_BYTE_DISP):
1453 case C (SCB_F, UNDEF_BYTE_DISP):
1454 case C (SCB_TST, UNDEF_BYTE_DISP):
1455 /* used to be a branch to somewhere which was unknown */
1456 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
1457 {
1458 /* Got a symbol and it's defined in this segment, become byte
3dd5103b 1459 sized - maybe it will fix up. */
252b5132
RH
1460 fragP->fr_subtype = C (what, BYTE_DISP);
1461 fragP->fr_var = md_relax_table[C (what, BYTE_DISP)].rlx_length;
1462 }
1463 else
1464 {
3dd5103b
NC
1465 /* Its got a segment, but its not ours, so it will always be
1466 long. */
252b5132
RH
1467 fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
1468 fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
252b5132 1469 }
93c2a809
AM
1470 break;
1471
1472 case C (BRANCH, BYTE_DISP):
1473 case C (BRANCH, UNDEF_WORD_DISP):
1474 case C (SCB_F, BYTE_DISP):
1475 case C (SCB_F, UNDEF_WORD_DISP):
1476 case C (SCB_TST, BYTE_DISP):
1477 case C (SCB_TST, UNDEF_WORD_DISP):
1478 /* When relaxing a section for the second time, we don't need to
1479 do anything. */
1480 break;
252b5132
RH
1481 }
1482 return fragP->fr_var;
1483}
1484
3dd5103b 1485/* Put number into target byte order. */
252b5132
RH
1486
1487void
1488md_number_to_chars (ptr, use, nbytes)
1489 char *ptr;
1490 valueT use;
1491 int nbytes;
1492{
1493 number_to_chars_bigendian (ptr, use, nbytes);
1494}
1495
1496long
1497md_pcrel_from (fixP)
1498 fixS *fixP;
1499{
1500 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
1501}
1502
252b5132
RH
1503void
1504tc_coff_symbol_emit_hook (ignore)
1505 symbolS *ignore;
1506{
1507}
1508
1509short
1510tc_coff_fix2rtype (fix_ptr)
1511 fixS *fix_ptr;
1512{
1513 if (fix_ptr->fx_r_type == RELOC_32)
1514 {
1515 /* cons likes to create reloc32's whatever the size of the reloc..
1516 */
1517 switch (fix_ptr->fx_size)
1518 {
1519 case 2:
1520 return R_H8500_IMM16;
1521 break;
1522 case 1:
1523 return R_H8500_IMM8;
1524 break;
1525 default:
1526 abort ();
1527 }
1528 }
1529 return fix_ptr->fx_r_type;
1530}
1531
1532void
1533tc_reloc_mangle (fix_ptr, intr, base)
1534 fixS *fix_ptr;
1535 struct internal_reloc *intr;
1536 bfd_vma base;
1537
1538{
1539 symbolS *symbol_ptr;
1540
1541 symbol_ptr = fix_ptr->fx_addsy;
1542
1543 /* If this relocation is attached to a symbol then it's ok
1544 to output it */
1545 if (fix_ptr->fx_r_type == RELOC_32)
1546 {
1547 /* cons likes to create reloc32's whatever the size of the reloc..
1548 */
1549 switch (fix_ptr->fx_size)
1550 {
1551 case 2:
1552 intr->r_type = R_IMM16;
1553 break;
1554 case 1:
1555 intr->r_type = R_IMM8;
1556 break;
1557 default:
1558 abort ();
1559 }
1560 }
1561 else
1562 {
1563 intr->r_type = fix_ptr->fx_r_type;
1564 }
1565
1566 intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
1567 intr->r_offset = fix_ptr->fx_offset;
1568
1569 /* Turn the segment of the symbol into an offset. */
1570 if (symbol_ptr)
1571 {
1572 symbolS *dot;
1573
1574 dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
1575 if (dot)
1576 {
3dd5103b
NC
1577#if 0
1578 intr->r_offset -=
1579 segment_info[S_GET_SEGMENT (symbol_ptr)].scnhdr.s_paddr;
1580#endif
252b5132
RH
1581 intr->r_offset += S_GET_VALUE (symbol_ptr);
1582 intr->r_symndx = dot->sy_number;
1583 }
1584 else
1585 {
1586 intr->r_symndx = symbol_ptr->sy_number;
1587 }
1588
1589 }
1590 else
1591 {
1592 intr->r_symndx = -1;
1593 }
1594
1595}
1596
252b5132
RH
1597int
1598start_label (ptr)
1599 char *ptr;
1600{
1601 /* Check for :s.w */
1602 if (isalpha (ptr[1]) && ptr[2] == '.')
1603 return 0;
1604 /* Check for :s */
1605 if (isalpha (ptr[1]) && !isalpha (ptr[2]))
1606 return 0;
1607 return 1;
1608}
1609
252b5132
RH
1610int
1611tc_coff_sizemachdep (frag)
1612 fragS *frag;
1613{
1614 return md_relax_table[frag->fr_subtype].rlx_length;
1615}
This page took 0.144628 seconds and 4 git commands to generate.