1 /* ns32k.c -- Assemble on the National Semiconductor 32k series
2 Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 /*#define SHOW_NUM 1*//* Uncomment for debugging. */
28 #include "opcode/ns32k.h"
33 #define IIF_ENTRIES 13 /* Number of entries in iif. */
34 #define PRIVATE_SIZE 256 /* Size of my garbage memory. */
36 #define DEFAULT -1 /* addr_mode returns this value when
37 plain constant or label is
40 #define IIF(ptr,a1,c1,e1,g1,i1,k1,m1,o1,q1,s1,u1) \
41 iif.iifP[ptr].type = a1; \
42 iif.iifP[ptr].size = c1; \
43 iif.iifP[ptr].object = e1; \
44 iif.iifP[ptr].object_adjust = g1; \
45 iif.iifP[ptr].pcrel = i1; \
46 iif.iifP[ptr].pcrel_adjust = k1; \
47 iif.iifP[ptr].im_disp = m1; \
48 iif.iifP[ptr].relax_substate = o1; \
49 iif.iifP[ptr].bit_fixP = q1; \
50 iif.iifP[ptr].addr_mode = s1; \
51 iif.iifP[ptr].bsr = u1;
53 #ifdef SEQUENT_COMPATABILITY
54 #define LINE_COMMENT_CHARS "|"
55 #define ABSOLUTE_PREFIX '@'
56 #define IMMEDIATE_PREFIX '#'
59 #ifndef LINE_COMMENT_CHARS
60 #define LINE_COMMENT_CHARS "#"
63 const char comment_chars
[] = "#";
64 const char line_comment_chars
[] = LINE_COMMENT_CHARS
;
65 const char line_separator_chars
[] = ";";
66 static int default_disp_size
= 4; /* Displacement size for external refs. */
68 #if !defined(ABSOLUTE_PREFIX) && !defined(IMMEDIATE_PREFIX)
69 #define ABSOLUTE_PREFIX '@' /* One or the other MUST be defined. */
74 signed char mode
; /* Addressing mode of operand (0-31). */
75 signed char scaled_mode
; /* Mode combined with scaled mode. */
76 char scaled_reg
; /* Register used in scaled+1 (1-8). */
77 char float_flag
; /* Set if R0..R7 was F0..F7 ie a
78 floating-point-register. */
79 char am_size
; /* Estimated max size of general addr-mode
81 char im_disp
; /* If im_disp==1 we have a displacement. */
82 char pcrel
; /* 1 if pcrel, this is really redundant info. */
83 char disp_suffix
[2]; /* Length of displacement(s), 0=undefined. */
84 char *disp
[2]; /* Pointer(s) at displacement(s)
85 or immediates(s) (ascii). */
86 char index_byte
; /* Index byte. */
88 typedef struct addr_mode addr_modeS
;
90 char *freeptr
, *freeptr_static
; /* Points at some number of free bytes. */
91 struct hash_control
*inst_hash_handle
;
93 struct ns32k_opcode
*desc
; /* Pointer at description of instruction. */
94 addr_modeS addr_modeP
;
95 const char EXP_CHARS
[] = "eE";
96 const char FLT_CHARS
[] = "fd"; /* We don't want to support lowercase,
99 /* UPPERCASE denotes live names when an instruction is built, IIF is
100 used as an intermediate form to store the actual parts of the
101 instruction. A ns32k machine instruction can be divided into a
102 couple of sub PARTs. When an instruction is assembled the
103 appropriate PART get an assignment. When an IIF has been completed
104 it is converted to a FRAGment as specified in AS.H. */
106 /* Internal structs. */
116 int type
; /* How to interpret object. */
117 int size
; /* Estimated max size of object. */
118 unsigned long object
; /* Binary data. */
119 int object_adjust
; /* Number added to object. */
120 int pcrel
; /* True if object is pcrel. */
121 int pcrel_adjust
; /* Length in bytes from the instruction
122 start to the displacement. */
123 int im_disp
; /* True if the object is a displacement. */
124 relax_substateT relax_substate
;/*Initial relaxsubstate. */
125 bit_fixS
*bit_fixP
; /* Pointer at bit_fix struct. */
126 int addr_mode
; /* What addrmode do we associate with this
128 char bsr
; /* Sequent hack. */
129 } iif_entryT
; /* Internal Instruction Format. */
133 int instr_size
; /* Max size of instruction in bytes. */
134 iif_entryT iifP
[IIF_ENTRIES
+ 1];
137 struct int_ins_form iif
;
139 char *input_line_pointer
;
141 /* Description of the PARTs in IIF
143 0 total length in bytes of entries in iif
156 For every entry there is a datalength in bytes. This is stored in size[n].
157 0, the objectlength is not explicitly given by the instruction
158 and the operand is undefined. This is a case for relaxation.
159 Reserve 4 bytes for the final object.
161 1, the entry contains one byte
162 2, the entry contains two bytes
163 3, the entry contains three bytes
164 4, the entry contains four bytes
167 Furthermore, every entry has a data type identifier in type[n].
169 0, the entry is void, ignore it.
170 1, the entry is a binary number.
171 2, the entry is a pointer at an expression.
172 Where expression may be as simple as a single '1',
173 and as complicated as foo-bar+12,
174 foo and bar may be undefined but suffixed by :{b|w|d} to
175 control the length of the object.
177 3, the entry is a pointer at a bignum struct
179 The low-order-byte corresponds to low physical memory.
180 Obviously a FRAGment must be created for each valid disp in PART whose
181 datalength is undefined (to bad) .
182 The case where just the expression is undefined is less severe and is
183 handled by fix. Here the number of bytes in the objectfile is known.
184 With this representation we simplify the assembly and separates the
185 machine dependent/independent parts in a more clean way (said OE). */
187 struct ns32k_option opt1
[] = /* restore, exit. */
199 struct ns32k_option opt2
[] = /* save, enter. */
211 struct ns32k_option opt3
[] = /* setcfg. */
219 struct ns32k_option opt4
[] = /* cinv. */
226 struct ns32k_option opt5
[] = /* String inst. */
233 struct ns32k_option opt6
[] = /* Plain reg ext,cvtp etc. */
246 #if !defined(NS32032) && !defined(NS32532)
250 struct ns32k_option cpureg_532
[] = /* lpr spr. */
263 {"intbase", 0xe, 0xff},
267 struct ns32k_option mmureg_532
[] = /* lmr smr. */
274 {"ivar0", 0xe, 0xff},
275 {"ivar1", 0xf, 0xff},
279 struct ns32k_option cpureg_032
[] = /* lpr spr. */
286 {"intbase", 0xe, 0xff},
290 struct ns32k_option mmureg_032
[] = /* lmr smr. */
306 struct ns32k_option
*cpureg
= cpureg_532
;
307 struct ns32k_option
*mmureg
= mmureg_532
;
309 struct ns32k_option
*cpureg
= cpureg_032
;
310 struct ns32k_option
*mmureg
= mmureg_032
;
314 const pseudo_typeS md_pseudo_table
[] =
315 { /* So far empty. */
319 #define IND(x,y) (((x)<<2)+(y))
321 /* Those are index's to relax groups in md_relax_table ie it must be
322 multiplied by 4 to point at a group start. Viz IND(x,y) Se function
323 relax_segment in write.c for more info. */
328 /* Those are index's to entries in a relax group. */
334 /* Those limits are calculated from the displacement start in memory.
335 The ns32k uses the beginning of the instruction as displacement
336 base. This type of displacements could be handled here by moving
337 the limit window up or down. I choose to use an internal
338 displacement base-adjust as there are other routines that must
339 consider this. Also, as we have two various offset-adjusts in the
340 ns32k (acb versus br/brs/jsr/bcond), two set of limits would have
341 had to be used. Now we dont have to think about that. */
343 const relax_typeS md_relax_table
[] =
350 {(63), (-64), 1, IND (BRANCH
, WORD
)},
351 {(8192), (-8192), 2, IND (BRANCH
, DOUBLE
)},
356 /* Array used to test if mode contains displacements.
357 Value is true if mode contains displacement. */
360 {0, 0, 0, 0, 0, 0, 0, 0,
361 1, 1, 1, 1, 1, 1, 1, 1,
362 1, 1, 1, 0, 0, 1, 1, 0,
363 1, 1, 1, 1, 1, 1, 1, 1};
365 /* Array used to calculate max size of displacements. */
370 /* Parse a general operand into an addressingmode struct
372 In: pointer at operand in ascii form
373 pointer at addr_mode struct for result
374 the level of recursion. (always 0 or 1)
376 Out: data in addr_mode struct. */
379 addr_mode (char *operand
,
380 addr_modeS
*addr_modeP
,
389 mode
= DEFAULT
; /* Default. */
390 addr_modeP
->scaled_mode
= 0; /* Why not. */
391 addr_modeP
->scaled_reg
= 0; /* If 0, not scaled index. */
392 addr_modeP
->float_flag
= 0;
393 addr_modeP
->am_size
= 0;
394 addr_modeP
->im_disp
= 0;
395 addr_modeP
->pcrel
= 0; /* Not set in this function. */
396 addr_modeP
->disp_suffix
[0] = 0;
397 addr_modeP
->disp_suffix
[1] = 0;
398 addr_modeP
->disp
[0] = NULL
;
399 addr_modeP
->disp
[1] = NULL
;
409 /* The following three case statements controls the mode-chars
410 this is the place to ed if you want to change them. */
411 #ifdef ABSOLUTE_PREFIX
412 case ABSOLUTE_PREFIX
:
413 if (str
[strl
- 1] == ']')
415 addr_modeP
->mode
= 21; /* absolute */
416 addr_modeP
->disp
[0] = str
+ 1;
419 #ifdef IMMEDIATE_PREFIX
420 case IMMEDIATE_PREFIX
:
421 if (str
[strl
- 1] == ']')
423 addr_modeP
->mode
= 20; /* immediate */
424 addr_modeP
->disp
[0] = str
+ 1;
428 if (str
[strl
- 1] != ']')
434 if (str
[2] != '\000')
436 addr_modeP
->mode
= 27; /* pc-relative */
437 addr_modeP
->disp
[0] = str
+ 2;
441 as_bad (_("Invalid syntax in PC-relative addressing mode"));
447 if (str
[strl
- 1] != ']')
449 if ((!strncmp (str
, "ext(", 4)) && strl
> 7)
451 addr_modeP
->disp
[0] = str
+ 4;
455 { /* disp[0]'s termination point. */
462 while (j
< strl
&& i
!= 0);
463 if (i
!= 0 || !(str
[j
+ 1] == '-' || str
[j
+ 1] == '+'))
465 as_bad (_("Invalid syntax in External addressing mode"));
468 str
[j
] = '\000'; /* null terminate disp[0] */
469 addr_modeP
->disp
[1] = str
+ j
+ 2;
470 addr_modeP
->mode
= 22;
488 addr_modeP
->float_flag
= 1;
491 if (str
[1] >= '0' && str
[1] < '8')
493 addr_modeP
->mode
= str
[1] - '0';
503 if (!strncmp (str
, "tos", 3))
505 addr_modeP
->mode
= 23; /* TopOfStack */
516 if (str
[strl
- 1] == ')')
518 if (str
[strl
- 2] == ')')
520 if (!strncmp (&str
[strl
- 5], "(fp", 3))
521 mode
= 16; /* Memory Relative. */
522 else if (!strncmp (&str
[strl
- 5], "(sp", 3))
524 else if (!strncmp (&str
[strl
- 5], "(sb", 3))
529 /* Memory relative. */
530 addr_modeP
->mode
= mode
;
531 j
= strl
- 5; /* Temp for end of disp[0]. */
537 if (str
[strl
] == ')')
539 if (str
[strl
] == '(')
542 while (strl
> -1 && i
!= 0);
546 as_bad (_("Invalid syntax in Memory Relative addressing mode"));
550 addr_modeP
->disp
[1] = str
;
551 addr_modeP
->disp
[0] = str
+ strl
+ 1;
552 str
[j
] = '\000'; /* Null terminate disp[0] . */
553 str
[strl
] = '\000'; /* Null terminate disp[1]. */
559 switch (str
[strl
- 3])
563 if (str
[strl
- 2] >= '0'
564 && str
[strl
- 2] < '8'
565 && str
[strl
- 4] == '(')
567 addr_modeP
->mode
= str
[strl
- 2] - '0' + 8;
568 addr_modeP
->disp
[0] = str
;
570 return -1; /* reg rel */
575 if (!strncmp (&str
[strl
- 4], "(fp", 3))
577 else if (!strncmp (&str
[strl
- 4], "(sp", 3))
579 else if (!strncmp (&str
[strl
- 4], "(sb", 3))
581 else if (!strncmp (&str
[strl
- 4], "(pc", 3))
586 addr_modeP
->mode
= mode
;
587 addr_modeP
->disp
[0] = str
;
588 str
[strl
- 4] = '\0';
590 return -1; /* Memory space. */
595 /* No trailing ')' do we have a ']' ? */
596 if (str
[strl
- 1] == ']')
598 switch (str
[strl
- 2])
613 as_bad (_("Invalid scaled-indexed mode, use (b,w,d,q)"));
615 if (str
[strl
- 3] != ':' || str
[strl
- 6] != '['
616 || str
[strl
- 5] == 'r' || str
[strl
- 4] < '0'
617 || str
[strl
- 4] > '7')
618 as_bad (_("Syntax in scaled-indexed mode, use [Rn:m] where n=[0..7] m={b,w,d,q}"));
619 } /* Scaled index. */
621 if (recursive_level
> 0)
623 as_bad (_("Scaled-indexed addressing mode combined with scaled-index"));
627 addr_modeP
->am_size
+= 1; /* scaled index byte. */
628 j
= str
[strl
- 4] - '0'; /* store temporary. */
629 str
[strl
- 6] = '\000'; /* nullterminate for recursive call. */
630 i
= addr_mode (str
, addr_modeP
, 1);
632 if (!i
|| addr_modeP
->mode
== 20)
634 as_bad (_("Invalid or illegal addressing mode combined with scaled-index"));
638 addr_modeP
->scaled_mode
= addr_modeP
->mode
; /* Store the inferior mode. */
639 addr_modeP
->mode
= mode
;
640 addr_modeP
->scaled_reg
= j
+ 1;
646 addr_modeP
->mode
= DEFAULT
; /* Default to whatever. */
647 addr_modeP
->disp
[0] = str
;
653 evaluate_expr (expressionS
*resultP
, char *ptr
)
657 tmp_line
= input_line_pointer
;
658 input_line_pointer
= ptr
;
659 expression (resultP
);
660 input_line_pointer
= tmp_line
;
663 /* ptr points at string addr_modeP points at struct with result This
664 routine calls addr_mode to determine the general addr.mode of the
665 operand. When this is ready it parses the displacements for size
666 specifying suffixes and determines size of immediate mode via
667 ns32k-opcode. Also builds index bytes if needed. */
670 get_addr_mode (char *ptr
, addr_modeS
*addr_modeP
)
674 addr_mode (ptr
, addr_modeP
, 0);
676 if (addr_modeP
->mode
== DEFAULT
|| addr_modeP
->scaled_mode
== -1)
678 /* Resolve ambiguous operands, this shouldn't be necessary if
679 one uses standard NSC operand syntax. But the sequent
680 compiler doesn't!!! This finds a proper addressing mode
681 if it is implicitly stated. See ns32k-opcode.h. */
682 (void) evaluate_expr (&exprP
, ptr
); /* This call takes time Sigh! */
684 if (addr_modeP
->mode
== DEFAULT
)
686 if (exprP
.X_add_symbol
|| exprP
.X_op_symbol
)
687 addr_modeP
->mode
= desc
->default_model
; /* We have a label. */
689 addr_modeP
->mode
= desc
->default_modec
; /* We have a constant. */
693 if (exprP
.X_add_symbol
|| exprP
.X_op_symbol
)
694 addr_modeP
->scaled_mode
= desc
->default_model
;
696 addr_modeP
->scaled_mode
= desc
->default_modec
;
699 /* Must put this mess down in addr_mode to handle the scaled
703 /* It appears as the sequent compiler wants an absolute when we have
704 a label without @. Constants becomes immediates besides the addr
705 case. Think it does so with local labels too, not optimum, pcrel
706 is better. When I have time I will make gas check this and
707 select pcrel when possible Actually that is trivial. */
708 if ((tmp
= addr_modeP
->scaled_reg
))
709 { /* Build indexbyte. */
710 tmp
--; /* Remember regnumber comes incremented for
712 tmp
|= addr_modeP
->scaled_mode
<< 3;
713 addr_modeP
->index_byte
= (char) tmp
;
714 addr_modeP
->am_size
+= 1;
717 assert (addr_modeP
->mode
>= 0);
718 if (disp_test
[(unsigned int) addr_modeP
->mode
])
727 /* There was a displacement, probe for length specifying suffix. */
728 addr_modeP
->pcrel
= 0;
730 assert(addr_modeP
->mode
>= 0);
731 if (disp_test
[(unsigned int) addr_modeP
->mode
])
733 /* There is a displacement. */
734 if (addr_modeP
->mode
== 27 || addr_modeP
->scaled_mode
== 27)
735 /* Do we have pcrel. mode. */
736 addr_modeP
->pcrel
= 1;
738 addr_modeP
->im_disp
= 1;
740 for (i
= 0; i
< 2; i
++)
742 suffix_sub
= suffix
= 0;
744 if ((toP
= addr_modeP
->disp
[i
]))
746 /* Suffix of expression, the largest size rules. */
749 while ((c
= *fromP
++))
757 as_warn (_("Premature end of suffix -- Defaulting to d"));
770 as_warn (_("Bad suffix after ':' use {b|w|d} Defaulting to d"));
775 toP
--; /* So we write over the ':' */
777 if (suffix
< suffix_sub
)
782 *toP
= '\0'; /* Terminate properly. */
783 addr_modeP
->disp_suffix
[i
] = suffix
;
784 addr_modeP
->am_size
+= suffix
? suffix
: 4;
791 if (addr_modeP
->mode
== 20)
793 /* Look in ns32k_opcode for size. */
794 addr_modeP
->disp_suffix
[0] = addr_modeP
->am_size
= desc
->im_size
;
795 addr_modeP
->im_disp
= 0;
799 return addr_modeP
->mode
;
802 /* Read an optionlist. */
805 optlist (char *str
, /* The string to extract options from. */
806 struct ns32k_option
*optionP
, /* How to search the string. */
807 unsigned long *default_map
) /* Default pattern and output. */
809 int i
, j
, k
, strlen1
, strlen2
;
810 char *patternP
, *strP
;
812 strlen1
= strlen (str
);
815 as_fatal (_("Very short instr to option, ie you can't do it on a NULLstr"));
817 for (i
= 0; optionP
[i
].pattern
!= 0; i
++)
819 strlen2
= strlen (optionP
[i
].pattern
);
821 for (j
= 0; j
< strlen1
; j
++)
823 patternP
= optionP
[i
].pattern
;
826 for (k
= 0; k
< strlen2
; k
++)
828 if (*(strP
++) != *(patternP
++))
834 *default_map
|= optionP
[i
].or;
835 *default_map
&= optionP
[i
].and;
841 /* Search struct for symbols.
842 This function is used to get the short integer form of reg names in
843 the instructions lmr, smr, lpr, spr return true if str is found in
847 list_search (char *str
, /* The string to match. */
848 struct ns32k_option
*optionP
, /* List to search. */
849 unsigned long *default_map
) /* Default pattern and output. */
853 for (i
= 0; optionP
[i
].pattern
!= 0; i
++)
855 if (!strncmp (optionP
[i
].pattern
, str
, 20))
857 /* Use strncmp to be safe. */
858 *default_map
|= optionP
[i
].or;
859 *default_map
&= optionP
[i
].and;
865 as_bad (_("No such entry in list. (cpu/mmu register)"));
869 /* Create a bit_fixS in obstack 'notes'.
870 This struct is used to profile the normal fix. If the bit_fixP is a
871 valid pointer (not NULL) the bit_fix data will be used to format
875 bit_fix_new (int size
, /* Length of bitfield. */
876 int offset
, /* Bit offset to bitfield. */
877 long min
, /* Signextended min for bitfield. */
878 long max
, /* Signextended max for bitfield. */
879 long add
, /* Add mask, used for huffman prefix. */
880 long base_type
, /* 0 or 1, if 1 it's exploded to opcode ptr. */
885 bit_fixP
= (bit_fixS
*) obstack_alloc (¬es
, sizeof (bit_fixS
));
887 bit_fixP
->fx_bit_size
= size
;
888 bit_fixP
->fx_bit_offset
= offset
;
889 bit_fixP
->fx_bit_base
= base_type
;
890 bit_fixP
->fx_bit_base_adj
= base_adj
;
891 bit_fixP
->fx_bit_max
= max
;
892 bit_fixP
->fx_bit_min
= min
;
893 bit_fixP
->fx_bit_add
= add
;
898 /* Convert operands to iif-format and adds bitfields to the opcode.
899 Operands are parsed in such an order that the opcode is updated from
900 its most significant bit, that is when the operand need to alter the
902 Be careful not to put to objects in the same iif-slot. */
905 encode_operand (int argc
,
907 const char *operandsP
,
909 char im_size ATTRIBUTE_UNUSED
,
914 int pcrel
, b
, loop
, pcrel_adjust
;
917 for (loop
= 0; loop
< argc
; loop
++)
919 /* What operand are we supposed to work on. */
920 i
= operandsP
[loop
<< 1] - '1';
922 as_fatal (_("Internal consistency error. check ns32k-opcode.h"));
928 switch ((d
= operandsP
[(loop
<< 1) + 1]))
930 case 'f': /* Operand of sfsr turns out to be a nasty
933 case 'Z': /* Float not immediate. */
934 case 'F': /* 32 bit float general form. */
935 case 'L': /* 64 bit float. */
936 case 'I': /* Integer not immediate. */
939 case 'D': /* Double-word. */
940 case 'A': /* Double-word gen-address-form ie no regs
942 get_addr_mode (argv
[i
], &addr_modeP
);
944 if ((addr_modeP
.mode
== 20) &&
945 (d
== 'I' || d
== 'Z' || d
== 'A'))
946 as_fatal (d
== 'A'? _("Address of immediate operand"):
947 _("Invalid immediate write operand."));
949 if (opcode_bit_ptr
== desc
->opcode_size
)
954 for (j
= b
; j
< (b
+ 2); j
++)
956 if (addr_modeP
.disp
[j
- b
])
960 addr_modeP
.disp_suffix
[j
- b
],
961 (unsigned long) addr_modeP
.disp
[j
- b
],
968 (addr_modeP
.scaled_reg
? addr_modeP
.scaled_mode
975 iif
.iifP
[1].object
|= ((long) addr_modeP
.mode
) << opcode_bit_ptr
;
977 if (addr_modeP
.scaled_reg
)
980 IIF (j
, 1, 1, (unsigned long) addr_modeP
.index_byte
,
981 0, 0, 0, 0, 0, NULL
, -1, 0);
985 case 'b': /* Multiple instruction disp. */
986 freeptr
++; /* OVE:this is an useful hack. */
987 sprintf (freeptr
, "((%s-1)*%d)", argv
[i
], desc
->im_size
);
989 pcrel
-= 1; /* Make pcrel 0 in spite of what case 'p':
992 case 'p': /* Displacement - pc relative addressing. */
995 case 'd': /* Displacement. */
996 iif
.instr_size
+= suffixP
[i
] ? suffixP
[i
] : 4;
997 IIF (12, 2, suffixP
[i
], (unsigned long) argv
[i
], 0,
998 pcrel
, pcrel_adjust
, 1, IND (BRANCH
, BYTE
), NULL
, -1, 0);
1000 case 'H': /* Sequent-hack: the linker wants a bit set
1003 iif
.instr_size
+= suffixP
[i
] ? suffixP
[i
] : 4;
1004 IIF (12, 2, suffixP
[i
], (unsigned long) argv
[i
], 0,
1005 pcrel
, pcrel_adjust
, 1, IND (BRANCH
, BYTE
), NULL
, -1, 1);
1007 case 'q': /* quick */
1008 opcode_bit_ptr
-= 4;
1009 IIF (11, 2, 42, (unsigned long) argv
[i
], 0, 0, 0, 0, 0,
1010 bit_fix_new (4, opcode_bit_ptr
, -8, 7, 0, 1, 0), -1, 0);
1012 case 'r': /* Register number (3 bits). */
1013 list_search (argv
[i
], opt6
, &tmp
);
1014 opcode_bit_ptr
-= 3;
1015 iif
.iifP
[1].object
|= tmp
<< opcode_bit_ptr
;
1017 case 'O': /* Setcfg instruction optionslist. */
1018 optlist (argv
[i
], opt3
, &tmp
);
1019 opcode_bit_ptr
-= 4;
1020 iif
.iifP
[1].object
|= tmp
<< 15;
1022 case 'C': /* Cinv instruction optionslist. */
1023 optlist (argv
[i
], opt4
, &tmp
);
1024 opcode_bit_ptr
-= 4;
1025 iif
.iifP
[1].object
|= tmp
<< 15; /* Insert the regtype in opcode. */
1027 case 'S': /* String instruction options list. */
1028 optlist (argv
[i
], opt5
, &tmp
);
1029 opcode_bit_ptr
-= 4;
1030 iif
.iifP
[1].object
|= tmp
<< 15;
1033 case 'U': /* Register list. */
1034 IIF (10, 1, 1, 0, 0, 0, 0, 0, 0, NULL
, -1, 0);
1035 switch (operandsP
[(i
<< 1) + 1])
1037 case 'u': /* Restore, exit. */
1038 optlist (argv
[i
], opt1
, &iif
.iifP
[10].object
);
1040 case 'U': /* Save, enter. */
1041 optlist (argv
[i
], opt2
, &iif
.iifP
[10].object
);
1044 iif
.instr_size
+= 1;
1046 case 'M': /* MMU register. */
1047 list_search (argv
[i
], mmureg
, &tmp
);
1048 opcode_bit_ptr
-= 4;
1049 iif
.iifP
[1].object
|= tmp
<< opcode_bit_ptr
;
1051 case 'P': /* CPU register. */
1052 list_search (argv
[i
], cpureg
, &tmp
);
1053 opcode_bit_ptr
-= 4;
1054 iif
.iifP
[1].object
|= tmp
<< opcode_bit_ptr
;
1056 case 'g': /* Inss exts. */
1057 iif
.instr_size
+= 1; /* 1 byte is allocated after the opcode. */
1059 (unsigned long) argv
[i
], /* i always 2 here. */
1061 bit_fix_new (3, 5, 0, 7, 0, 0, 0), /* A bit_fix is targeted to
1067 (unsigned long) argv
[i
], /* i always 3 here. */
1069 bit_fix_new (5, 0, 1, 32, -1, 0, -1), -1, 0);
1072 iif
.instr_size
+= 1;
1073 b
= 2 + i
; /* Put the extension byte after opcode. */
1074 IIF (b
, 2, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0);
1077 as_fatal (_("Bad opcode-table-option, check in file ns32k-opcode.h"));
1082 /* in: instruction line
1083 out: internal structure of instruction
1084 that has been prepared for direct conversion to fragment(s) and
1085 fixes in a systematical fashion
1086 Return-value = recursive_level. */
1087 /* Build iif of one assembly text line. */
1090 parse (const char *line
, int recursive_level
)
1092 const char *lineptr
;
1093 char c
, suffix_separator
;
1098 char suffix
[MAX_ARGS
], *argv
[MAX_ARGS
]; /* No more than 4 operands. */
1100 if (recursive_level
<= 0)
1102 /* Called from md_assemble. */
1103 for (lineptr
= line
; (*lineptr
) != '\0' && (*lineptr
) != ' '; lineptr
++)
1107 *(char *) lineptr
= '\0';
1109 if (!(desc
= (struct ns32k_opcode
*) hash_find (inst_hash_handle
, line
)))
1110 as_fatal (_("No such opcode"));
1112 *(char *) lineptr
= c
;
1119 if (*desc
->operands
)
1121 if (*lineptr
++ != '\0')
1126 while (*lineptr
!= '\0')
1128 if (desc
->operands
[argc
<< 1])
1131 arg_type
= desc
->operands
[(argc
<< 1) + 1];
1139 /* The operand is supposed to be a displacement. */
1140 /* Hackwarning: do not forget to update the 4
1141 cases above when editing ns32k-opcode.h. */
1142 suffix_separator
= ':';
1145 /* If this char occurs we loose. */
1146 suffix_separator
= '\255';
1150 suffix
[argc
] = 0; /* 0 when no ':' is encountered. */
1151 argv
[argc
] = freeptr
;
1154 while ((c
= *lineptr
) != '\0' && c
!= sep
)
1170 if (c
== suffix_separator
)
1172 /* ':' - label/suffix separator. */
1185 as_warn (_("Bad suffix, defaulting to d"));
1187 if (lineptr
[1] == '\0' || lineptr
[1] == sep
)
1206 if (*lineptr
== '\0')
1212 as_fatal (_("Too many operands passed to instruction"));
1217 if (argc
!= strlen (desc
->operands
) / 2)
1219 if (strlen (desc
->default_args
))
1221 /* We can apply default, don't goof. */
1222 if (parse (desc
->default_args
, 1) != 1)
1223 /* Check error in default. */
1224 as_fatal (_("Wrong numbers of operands in default, check ns32k-opcodes.h"));
1227 as_fatal (_("Wrong number of operands"));
1230 for (i
= 0; i
< IIF_ENTRIES
; i
++)
1231 /* Mark all entries as void. */
1232 iif
.iifP
[i
].type
= 0;
1234 /* Build opcode iif-entry. */
1235 iif
.instr_size
= desc
->opcode_size
/ 8;
1236 IIF (1, 1, iif
.instr_size
, desc
->opcode_seed
, 0, 0, 0, 0, 0, 0, -1, 0);
1238 /* This call encodes operands to iif format. */
1240 encode_operand (argc
, argv
, &desc
->operands
[0],
1241 &suffix
[0], desc
->im_size
, desc
->opcode_size
);
1243 return recursive_level
;
1246 #ifdef BFD_ASSEMBLER
1247 /* This functionality should really be in the bfd library. */
1249 static bfd_reloc_code_real_type
1250 reloc (int size
, int pcrel
, int type
)
1253 bfd_reloc_code_real_type relocs
[] =
1255 BFD_RELOC_NS32K_IMM_8
,
1256 BFD_RELOC_NS32K_IMM_16
,
1257 BFD_RELOC_NS32K_IMM_32
,
1258 BFD_RELOC_NS32K_IMM_8_PCREL
,
1259 BFD_RELOC_NS32K_IMM_16_PCREL
,
1260 BFD_RELOC_NS32K_IMM_32_PCREL
,
1262 /* ns32k displacements. */
1263 BFD_RELOC_NS32K_DISP_8
,
1264 BFD_RELOC_NS32K_DISP_16
,
1265 BFD_RELOC_NS32K_DISP_32
,
1266 BFD_RELOC_NS32K_DISP_8_PCREL
,
1267 BFD_RELOC_NS32K_DISP_16_PCREL
,
1268 BFD_RELOC_NS32K_DISP_32_PCREL
,
1270 /* Normal 2's complement. */
1295 index
= length
+ 3 * pcrel
+ 6 * type
;
1297 if (index
>= 0 && (unsigned int) index
< sizeof (relocs
) / sizeof (relocs
[0]))
1298 return relocs
[index
];
1301 as_bad (_("Can not do %d byte pc-relative relocation for storage type %d"),
1304 as_bad (_("Can not do %d byte relocation for storage type %d"),
1307 return BFD_RELOC_NONE
;
1313 fix_new_ns32k (fragS
*frag
, /* Which frag? */
1314 int where
, /* Where in that frag? */
1315 int size
, /* 1, 2 or 4 usually. */
1316 symbolS
*add_symbol
, /* X_add_symbol. */
1317 long offset
, /* X_add_number. */
1318 int pcrel
, /* True if PC-relative relocation. */
1319 char im_disp
, /* True if the value to write is a
1321 bit_fixS
*bit_fixP
, /* Pointer at struct of bit_fix's, ignored if
1323 char bsr
, /* Sequent-linker-hack: 1 when relocobject is
1326 unsigned int opcode_offset
)
1328 fixS
*fixP
= fix_new (frag
, where
, size
, add_symbol
,
1330 #ifdef BFD_ASSEMBLER
1331 bit_fixP
? NO_RELOC
: reloc (size
, pcrel
, im_disp
)
1337 fix_opcode_frag (fixP
) = opcode_frag
;
1338 fix_opcode_offset (fixP
) = opcode_offset
;
1339 fix_im_disp (fixP
) = im_disp
;
1340 fix_bsr (fixP
) = bsr
;
1341 fix_bit_fixP (fixP
) = bit_fixP
;
1342 /* We have a MD overflow check for displacements. */
1343 fixP
->fx_no_overflow
= (im_disp
!= 0);
1347 fix_new_ns32k_exp (fragS
*frag
, /* Which frag? */
1348 int where
, /* Where in that frag? */
1349 int size
, /* 1, 2 or 4 usually. */
1350 expressionS
*exp
, /* Expression. */
1351 int pcrel
, /* True if PC-relative relocation. */
1352 char im_disp
, /* True if the value to write is a
1354 bit_fixS
*bit_fixP
, /* Pointer at struct of bit_fix's, ignored if
1356 char bsr
, /* Sequent-linker-hack: 1 when relocobject is
1359 unsigned int opcode_offset
)
1361 fixS
*fixP
= fix_new_exp (frag
, where
, size
, exp
, pcrel
,
1362 #ifdef BFD_ASSEMBLER
1363 bit_fixP
? NO_RELOC
: reloc (size
, pcrel
, im_disp
)
1369 fix_opcode_frag (fixP
) = opcode_frag
;
1370 fix_opcode_offset (fixP
) = opcode_offset
;
1371 fix_im_disp (fixP
) = im_disp
;
1372 fix_bsr (fixP
) = bsr
;
1373 fix_bit_fixP (fixP
) = bit_fixP
;
1374 /* We have a MD overflow check for displacements. */
1375 fixP
->fx_no_overflow
= (im_disp
!= 0);
1378 /* Convert number to chars in correct order. */
1381 md_number_to_chars (char *buf
, valueT value
, int nbytes
)
1383 number_to_chars_littleendian (buf
, value
, nbytes
);
1386 /* This is a variant of md_numbers_to_chars. The reason for its'
1387 existence is the fact that ns32k uses Huffman coded
1388 displacements. This implies that the bit order is reversed in
1389 displacements and that they are prefixed with a size-tag.
1393 10xxxxxx xxxxxxxx word
1394 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx double word
1396 This must be taken care of and we do it here! */
1399 md_number_to_disp (char *buf
, long val
, int n
)
1404 if (val
< -64 || val
> 63)
1405 as_bad (_("value of %ld out of byte displacement range."), val
);
1408 printf ("%x ", val
& 0xff);
1414 if (val
< -8192 || val
> 8191)
1415 as_bad (_("value of %ld out of word displacement range."), val
);
1419 printf ("%x ", val
>> 8 & 0xff);
1421 *buf
++ = (val
>> 8);
1423 printf ("%x ", val
& 0xff);
1429 if (val
< -0x20000000 || val
>= 0x20000000)
1430 as_bad (_("value of %ld out of double word displacement range."), val
);
1433 printf ("%x ", val
>> 24 & 0xff);
1435 *buf
++ = (val
>> 24);
1437 printf ("%x ", val
>> 16 & 0xff);
1439 *buf
++ = (val
>> 16);
1441 printf ("%x ", val
>> 8 & 0xff);
1443 *buf
++ = (val
>> 8);
1445 printf ("%x ", val
& 0xff);
1451 as_fatal (_("Internal logic error. line %d, file \"%s\""),
1452 __LINE__
, __FILE__
);
1457 md_number_to_imm (char *buf
, long val
, int n
)
1463 printf ("%x ", val
& 0xff);
1470 printf ("%x ", val
>> 8 & 0xff);
1472 *buf
++ = (val
>> 8);
1474 printf ("%x ", val
& 0xff);
1481 printf ("%x ", val
>> 24 & 0xff);
1483 *buf
++ = (val
>> 24);
1485 printf ("%x ", val
>> 16 & 0xff);
1487 *buf
++ = (val
>> 16);
1489 printf ("%x ", val
>> 8 & 0xff);
1491 *buf
++ = (val
>> 8);
1493 printf ("%x ", val
& 0xff);
1499 as_fatal (_("Internal logic error. line %d, file \"%s\""),
1500 __LINE__
, __FILE__
);
1504 /* Fast bitfiddling support. */
1505 /* Mask used to zero bitfield before oring in the true field. */
1507 static unsigned long l_mask
[] =
1509 0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8,
1510 0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80,
1511 0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800,
1512 0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000,
1513 0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000,
1514 0xfff00000, 0xffe00000, 0xffc00000, 0xff800000,
1515 0xff000000, 0xfe000000, 0xfc000000, 0xf8000000,
1516 0xf0000000, 0xe0000000, 0xc0000000, 0x80000000,
1518 static unsigned long r_mask
[] =
1520 0x00000000, 0x00000001, 0x00000003, 0x00000007,
1521 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
1522 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
1523 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
1524 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
1525 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
1526 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
1527 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
1529 #define MASK_BITS 31
1530 /* Insert bitfield described by field_ptr and val at buf
1531 This routine is written for modification of the first 4 bytes pointed
1532 to by buf, to yield speed.
1533 The ifdef stuff is for selection between a ns32k-dependent routine
1534 and a general version. (My advice: use the general version!). */
1537 md_number_to_field (char *buf
, long val
, bit_fixS
*field_ptr
)
1539 unsigned long object
;
1541 /* Define ENDIAN on a ns32k machine. */
1543 unsigned long *mem_ptr
;
1548 if (field_ptr
->fx_bit_min
<= val
&& val
<= field_ptr
->fx_bit_max
)
1551 if (field_ptr
->fx_bit_base
)
1553 mem_ptr
= (unsigned long *) field_ptr
->fx_bit_base
;
1555 mem_ptr
= (unsigned long *) buf
;
1557 mem_ptr
= ((unsigned long *)
1558 ((char *) mem_ptr
+ field_ptr
->fx_bit_base_adj
));
1560 if (field_ptr
->fx_bit_base
)
1561 mem_ptr
= (char *) field_ptr
->fx_bit_base
;
1565 mem_ptr
+= field_ptr
->fx_bit_base_adj
;
1568 /* We have a nice ns32k machine with lowbyte at low-physical mem. */
1569 object
= *mem_ptr
; /* get some bytes */
1570 #else /* OVE Goof! the machine is a m68k or dito. */
1571 /* That takes more byte fiddling. */
1573 object
|= mem_ptr
[3] & 0xff;
1575 object
|= mem_ptr
[2] & 0xff;
1577 object
|= mem_ptr
[1] & 0xff;
1579 object
|= mem_ptr
[0] & 0xff;
1582 mask
|= (r_mask
[field_ptr
->fx_bit_offset
]);
1583 mask
|= (l_mask
[field_ptr
->fx_bit_offset
+ field_ptr
->fx_bit_size
]);
1585 val
+= field_ptr
->fx_bit_add
;
1586 object
|= ((val
<< field_ptr
->fx_bit_offset
) & (mask
^ 0xffffffff));
1590 mem_ptr
[0] = (char) object
;
1592 mem_ptr
[1] = (char) object
;
1594 mem_ptr
[2] = (char) object
;
1596 mem_ptr
[3] = (char) object
;
1600 as_bad (_("Bit field out of range"));
1603 /* Convert iif to fragments. From this point we start to dribble with
1604 functions in other files than this one.(Except hash.c) So, if it's
1605 possible to make an iif for an other CPU, you don't need to know
1606 what frags, relax, obstacks, etc is in order to port this
1607 assembler. You only need to know if it's possible to reduce your
1608 cpu-instruction to iif-format (takes some work) and adopt the other
1609 md_? parts according to given instructions Note that iif was
1610 invented for the clean ns32k`s architecture. */
1612 /* GAS for the ns32k has a problem. PC relative displacements are
1613 relative to the address of the opcode, not the address of the
1614 operand. We used to keep track of the offset between the operand
1615 and the opcode in pcrel_adjust for each frag and each fix. However,
1616 we get into trouble where there are two or more pc-relative
1617 operands and the size of the first one can't be determined. Then in
1618 the relax phase, the size of the first operand will change and
1619 pcrel_adjust will no longer be correct. The current solution is
1620 keep a pointer to the frag with the opcode in it and the offset in
1621 that frag for each frag and each fix. Then, when needed, we can
1622 always figure out how far it is between the opcode and the pcrel
1623 object. See also md_pcrel_adjust and md_fix_pcrel_adjust. For
1624 objects not part of an instruction, the pointer to the opcode frag
1633 unsigned int inst_offset
;
1641 frag_grow (iif
.instr_size
); /* This is important. */
1642 memP
= frag_more (0);
1644 inst_offset
= (memP
- frag_now
->fr_literal
);
1645 inst_frag
= frag_now
;
1647 for (i
= 0; i
< IIF_ENTRIES
; i
++)
1649 if ((type
= iif
.iifP
[i
].type
))
1651 /* The object exist, so handle it. */
1652 switch (size
= iif
.iifP
[i
].size
)
1656 /* It's a bitfix that operates on an existing object. */
1657 if (iif
.iifP
[i
].bit_fixP
->fx_bit_base
)
1658 /* Expand fx_bit_base to point at opcode. */
1659 iif
.iifP
[i
].bit_fixP
->fx_bit_base
= (long) inst_opcode
;
1662 case 8: /* bignum or doublefloat. */
1667 /* The final size in objectmemory is known. */
1668 memP
= frag_more (size
);
1669 j
= iif
.iifP
[i
].bit_fixP
;
1673 case 1: /* The object is pure binary. */
1675 md_number_to_field (memP
, exprP
.X_add_number
, j
);
1677 else if (iif
.iifP
[i
].pcrel
)
1678 fix_new_ns32k (frag_now
,
1679 (long) (memP
- frag_now
->fr_literal
),
1684 iif
.iifP
[i
].im_disp
,
1686 iif
.iifP
[i
].bsr
, /* Sequent hack. */
1687 inst_frag
, inst_offset
);
1690 /* Good, just put them bytes out. */
1691 switch (iif
.iifP
[i
].im_disp
)
1694 md_number_to_chars (memP
, iif
.iifP
[i
].object
, size
);
1697 md_number_to_disp (memP
, iif
.iifP
[i
].object
, size
);
1700 as_fatal (_("iif convert internal pcrel/binary"));
1706 /* The object is a pointer at an expression, so
1707 unpack it, note that bignums may result from the
1709 evaluate_expr (&exprP
, (char *) iif
.iifP
[i
].object
);
1710 if (exprP
.X_op
== O_big
|| size
== 8)
1712 if ((k
= exprP
.X_add_number
) > 0)
1714 /* We have a bignum ie a quad. This can only
1715 happens in a long suffixed instruction. */
1717 as_bad (_("Bignum too big for long"));
1722 for (l
= 0; k
> 0; k
--, l
+= 2)
1723 md_number_to_chars (memP
+ l
,
1724 generic_bignum
[l
>> 1],
1725 sizeof (LITTLENUM_TYPE
));
1730 LITTLENUM_TYPE words
[4];
1735 gen_to_words (words
, 2, 8);
1736 md_number_to_imm (memP
, (long) words
[0],
1737 sizeof (LITTLENUM_TYPE
));
1738 md_number_to_imm (memP
+ sizeof (LITTLENUM_TYPE
),
1740 sizeof (LITTLENUM_TYPE
));
1743 gen_to_words (words
, 4, 11);
1744 md_number_to_imm (memP
, (long) words
[0],
1745 sizeof (LITTLENUM_TYPE
));
1746 md_number_to_imm (memP
+ sizeof (LITTLENUM_TYPE
),
1748 sizeof (LITTLENUM_TYPE
));
1749 md_number_to_imm ((memP
+ 2
1750 * sizeof (LITTLENUM_TYPE
)),
1752 sizeof (LITTLENUM_TYPE
));
1753 md_number_to_imm ((memP
+ 3
1754 * sizeof (LITTLENUM_TYPE
)),
1756 sizeof (LITTLENUM_TYPE
));
1762 if (exprP
.X_add_symbol
||
1763 exprP
.X_op_symbol
||
1766 /* The expression was undefined due to an
1767 undefined label. Create a fix so we can fix
1768 the object later. */
1769 exprP
.X_add_number
+= iif
.iifP
[i
].object_adjust
;
1770 fix_new_ns32k_exp (frag_now
,
1771 (long) (memP
- frag_now
->fr_literal
),
1775 iif
.iifP
[i
].im_disp
,
1778 inst_frag
, inst_offset
);
1781 md_number_to_field (memP
, exprP
.X_add_number
, j
);
1784 /* Good, just put them bytes out. */
1785 switch (iif
.iifP
[i
].im_disp
)
1788 md_number_to_imm (memP
, exprP
.X_add_number
, size
);
1791 md_number_to_disp (memP
, exprP
.X_add_number
, size
);
1794 as_fatal (_("iif convert internal pcrel/pointer"));
1799 as_fatal (_("Internal logic error in iif.iifP[n].type"));
1804 /* Too bad, the object may be undefined as far as its
1805 final nsize in object memory is concerned. The size
1806 of the object in objectmemory is not explicitly
1807 given. If the object is defined its length can be
1808 determined and a fix can replace the frag. */
1810 evaluate_expr (&exprP
, (char *) iif
.iifP
[i
].object
);
1812 if ((exprP
.X_add_symbol
|| exprP
.X_op_symbol
) &&
1815 /* Size is unknown until link time so have to default. */
1816 size
= default_disp_size
; /* Normally 4 bytes. */
1817 memP
= frag_more (size
);
1818 fix_new_ns32k_exp (frag_now
,
1819 (long) (memP
- frag_now
->fr_literal
),
1822 0, /* never iif.iifP[i].pcrel, */
1823 1, /* always iif.iifP[i].im_disp */
1827 break; /* Exit this absolute hack. */
1830 if (exprP
.X_add_symbol
|| exprP
.X_op_symbol
)
1833 if (exprP
.X_op_symbol
)
1834 /* We cant relax this case. */
1835 as_fatal (_("Can't relax difference"));
1838 /* Size is not important. This gets fixed by
1839 relax, but we assume 0 in what follows. */
1840 memP
= frag_more (4); /* Max size. */
1844 fragS
*old_frag
= frag_now
;
1845 frag_variant (rs_machine_dependent
,
1848 IND (BRANCH
, UNDEF
), /* Expecting
1853 frag_opcode_frag (old_frag
) = inst_frag
;
1854 frag_opcode_offset (old_frag
) = inst_offset
;
1855 frag_bsr (old_frag
) = iif
.iifP
[i
].bsr
;
1861 /* This duplicates code in md_number_to_disp. */
1862 if (-64 <= exprP
.X_add_number
&& exprP
.X_add_number
<= 63)
1866 if (-8192 <= exprP
.X_add_number
1867 && exprP
.X_add_number
<= 8191)
1871 if (-0x20000000 <= exprP
.X_add_number
1872 && exprP
.X_add_number
<=0x1fffffff)
1876 as_bad (_("Displacement to large for :d"));
1882 memP
= frag_more (size
);
1883 md_number_to_disp (memP
, exprP
.X_add_number
, size
);
1889 as_fatal (_("Internal logic error in iif.iifP[].type"));
1896 md_assemble (char *line
)
1898 freeptr
= freeptr_static
;
1899 parse (line
, 0); /* Explode line to more fix form in iif. */
1900 convert_iif (); /* Convert iif to frags, fix's etc. */
1902 printf (" \t\t\t%s\n", line
);
1909 /* Build a hashtable of the instructions. */
1910 const struct ns32k_opcode
*ptr
;
1912 const struct ns32k_opcode
*endop
;
1914 inst_hash_handle
= hash_new ();
1916 endop
= ns32k_opcodes
+ sizeof (ns32k_opcodes
) / sizeof (ns32k_opcodes
[0]);
1917 for (ptr
= ns32k_opcodes
; ptr
< endop
; ptr
++)
1919 if ((stat
= hash_insert (inst_hash_handle
, ptr
->name
, (char *) ptr
)))
1921 as_fatal (_("Can't hash %s: %s"), ptr
->name
, stat
);
1924 /* Some private space please! */
1925 freeptr_static
= (char *) malloc (PRIVATE_SIZE
);
1928 /* Must be equal to MAX_PRECISON in atof-ieee.c. */
1929 #define MAX_LITTLENUMS 6
1931 /* Turn the string pointed to by litP into a floating point constant
1932 of type TYPE, and emit the appropriate bytes. The number of
1933 LITTLENUMS emitted is stored in *SIZEP. An error message is
1934 returned, or NULL on OK. */
1937 md_atof (int type
, char *litP
, int *sizeP
)
1940 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
1941 LITTLENUM_TYPE
*wordP
;
1955 return _("Bad call to MD_ATOF()");
1958 t
= atof_ieee (input_line_pointer
, type
, words
);
1960 input_line_pointer
= t
;
1962 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
1964 for (wordP
= words
+ prec
; prec
--;)
1966 md_number_to_chars (litP
, (long) (*--wordP
), sizeof (LITTLENUM_TYPE
));
1967 litP
+= sizeof (LITTLENUM_TYPE
);
1974 md_pcrel_adjust (fragS
*fragP
)
1977 addressT opcode_address
;
1978 unsigned int offset
;
1980 opcode_frag
= frag_opcode_frag (fragP
);
1981 if (opcode_frag
== 0)
1984 offset
= frag_opcode_offset (fragP
);
1985 opcode_address
= offset
+ opcode_frag
->fr_address
;
1987 return fragP
->fr_address
+ fragP
->fr_fix
- opcode_address
;
1991 md_fix_pcrel_adjust (fixS
*fixP
)
1994 addressT opcode_address
;
1995 unsigned int offset
;
1997 opcode_frag
= fix_opcode_frag (fixP
);
1998 if (opcode_frag
== 0)
2001 offset
= fix_opcode_offset (fixP
);
2002 opcode_address
= offset
+ opcode_frag
->fr_address
;
2004 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- opcode_address
;
2007 /* Apply a fixS (fixup of an instruction or data that we didn't have
2008 enough info to complete immediately) to the data in a frag.
2010 On the ns32k, everything is in a different format, so we have broken
2011 out separate functions for each kind of thing we could be fixing.
2012 They all get called from here. */
2015 md_apply_fix3 (fixS
*fixP
, valueT
* valP
, segT seg ATTRIBUTE_UNUSED
)
2017 long val
= * (long *) valP
;
2018 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
2020 if (fix_bit_fixP (fixP
))
2021 /* Bitfields to fix, sigh. */
2022 md_number_to_field (buf
, val
, fix_bit_fixP (fixP
));
2023 else switch (fix_im_disp (fixP
))
2026 /* Immediate field. */
2027 md_number_to_imm (buf
, val
, fixP
->fx_size
);
2031 /* Displacement field. */
2032 /* Calculate offset. */
2033 md_number_to_disp (buf
,
2034 (fixP
->fx_pcrel
? val
+ md_fix_pcrel_adjust (fixP
)
2035 : val
), fixP
->fx_size
);
2039 /* Pointer in a data object. */
2040 md_number_to_chars (buf
, val
, fixP
->fx_size
);
2044 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
2048 /* Convert a relaxed displacement to ditto in final output. */
2050 #ifndef BFD_ASSEMBLER
2052 md_convert_frag (object_headers
*headers
,
2057 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
2058 segT sec ATTRIBUTE_UNUSED
,
2064 /* Address in gas core of the place to store the displacement. */
2065 char *buffer_address
= fragP
->fr_fix
+ fragP
->fr_literal
;
2066 /* Address in object code of the displacement. */
2069 switch (fragP
->fr_subtype
)
2071 case IND (BRANCH
, BYTE
):
2074 case IND (BRANCH
, WORD
):
2077 case IND (BRANCH
, DOUBLE
):
2085 know (fragP
->fr_symbol
);
2087 object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
2089 /* The displacement of the address, from current location. */
2090 disp
= (S_GET_VALUE (fragP
->fr_symbol
) + fragP
->fr_offset
) - object_address
;
2091 disp
+= md_pcrel_adjust (fragP
);
2093 md_number_to_disp (buffer_address
, (long) disp
, (int) ext
);
2094 fragP
->fr_fix
+= ext
;
2097 /* This function returns the estimated size a variable object will occupy,
2098 one can say that we tries to guess the size of the objects before we
2099 actually know it. */
2102 md_estimate_size_before_relax (fragS
*fragP
, segT segment
)
2104 if (fragP
->fr_subtype
== IND (BRANCH
, UNDEF
))
2106 if (S_GET_SEGMENT (fragP
->fr_symbol
) != segment
)
2108 /* We don't relax symbols defined in another segment. The
2109 thing to do is to assume the object will occupy 4 bytes. */
2110 fix_new_ns32k (fragP
,
2111 (int) (fragP
->fr_fix
),
2118 frag_bsr(fragP
), /* Sequent hack. */
2119 frag_opcode_frag (fragP
),
2120 frag_opcode_offset (fragP
));
2126 /* Relaxable case. Set up the initial guess for the variable
2127 part of the frag. */
2128 fragP
->fr_subtype
= IND (BRANCH
, BYTE
);
2131 if (fragP
->fr_subtype
>= sizeof (md_relax_table
) / sizeof (md_relax_table
[0]))
2134 /* Return the size of the variable part of the frag. */
2135 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
2138 int md_short_jump_size
= 3;
2139 int md_long_jump_size
= 5;
2140 const int md_reloc_size
= 8; /* Size of relocation record. */
2143 md_create_short_jump (char *ptr
,
2146 fragS
*frag ATTRIBUTE_UNUSED
,
2147 symbolS
*to_symbol ATTRIBUTE_UNUSED
)
2151 offset
= to_addr
- from_addr
;
2152 md_number_to_chars (ptr
, (valueT
) 0xEA, 1);
2153 md_number_to_disp (ptr
+ 1, (valueT
) offset
, 2);
2157 md_create_long_jump (char *ptr
,
2160 fragS
*frag ATTRIBUTE_UNUSED
,
2161 symbolS
*to_symbol ATTRIBUTE_UNUSED
)
2165 offset
= to_addr
- from_addr
;
2166 md_number_to_chars (ptr
, (valueT
) 0xEA, 1);
2167 md_number_to_disp (ptr
+ 1, (valueT
) offset
, 4);
2170 const char *md_shortopts
= "m:";
2172 struct option md_longopts
[] =
2174 #define OPTION_DISP_SIZE (OPTION_MD_BASE)
2175 {"disp-size-default", required_argument
, NULL
, OPTION_DISP_SIZE
},
2176 {NULL
, no_argument
, NULL
, 0}
2179 size_t md_longopts_size
= sizeof (md_longopts
);
2182 md_parse_option (int c
, char *arg
)
2187 if (!strcmp (arg
, "32032"))
2189 cpureg
= cpureg_032
;
2190 mmureg
= mmureg_032
;
2192 else if (!strcmp (arg
, "32532"))
2194 cpureg
= cpureg_532
;
2195 mmureg
= mmureg_532
;
2199 as_warn (_("invalid architecture option -m%s, ignored"), arg
);
2203 case OPTION_DISP_SIZE
:
2205 int size
= atoi(arg
);
2208 case 1: case 2: case 4:
2209 default_disp_size
= size
;
2212 as_warn (_("invalid default displacement size \"%s\". Defaulting to %d."),
2213 arg
, default_disp_size
);
2226 md_show_usage (FILE *stream
)
2228 fprintf (stream
, _("\
2230 -m32032 | -m32532 select variant of NS32K architecture\n\
2231 --disp-size-default=<1|2|4>\n"));
2234 /* This is TC_CONS_FIX_NEW, called by emit_expr in read.c. */
2237 cons_fix_new_ns32k (fragS
*frag
, /* Which frag? */
2238 int where
, /* Where in that frag? */
2239 int size
, /* 1, 2 or 4 usually. */
2240 expressionS
*exp
) /* Expression. */
2242 fix_new_ns32k_exp (frag
, where
, size
, exp
,
2246 /* We have no need to default values of symbols. */
2249 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
2254 /* Round up a section size to the appropriate boundary. */
2257 md_section_align (segT segment ATTRIBUTE_UNUSED
, valueT size
)
2259 return size
; /* Byte alignment is fine. */
2262 /* Exactly what point is a PC-relative offset relative TO? On the
2263 ns32k, they're relative to the start of the instruction. */
2266 md_pcrel_from (fixS
*fixP
)
2270 res
= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
2271 #ifdef SEQUENT_COMPATABILITY
2272 if (frag_bsr (fixP
->fx_frag
))
2273 res
+= 0x12 /* FOO Kludge alert! */
2278 #ifdef BFD_ASSEMBLER
2281 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
2284 bfd_reloc_code_real_type code
;
2286 code
= reloc (fixp
->fx_size
, fixp
->fx_pcrel
, fix_im_disp (fixp
));
2288 rel
= xmalloc (sizeof (arelent
));
2289 rel
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
2290 *rel
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2291 rel
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2293 rel
->addend
= fixp
->fx_addnumber
;
2297 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
2302 name
= S_GET_NAME (fixp
->fx_addsy
);
2304 name
= _("<unknown>");
2305 as_fatal (_("Cannot find relocation type for symbol %s, code %d"),
2311 #else /* BFD_ASSEMBLER */
2315 cons_fix_new_ns32k (char *where
,
2317 relax_addressT segment_address_in_file
)
2319 /* In: Length of relocation (or of address) in chars: 1, 2 or 4.
2320 Out: GNU LD relocation length code: 0, 1, or 2. */
2322 static unsigned char nbytes_r_length
[] = { 42, 0, 1, 42, 2 };
2325 know (fixP
->fx_addsy
!= NULL
);
2327 md_number_to_chars (where
,
2328 fixP
->fx_frag
->fr_address
+ fixP
->fx_where
- segment_address_in_file
,
2331 r_symbolnum
= (S_IS_DEFINED (fixP
->fx_addsy
)
2332 ? S_GET_TYPE (fixP
->fx_addsy
)
2333 : fixP
->fx_addsy
->sy_number
);
2335 md_number_to_chars (where
+ 4,
2336 ((long) (r_symbolnum
)
2337 | (long) (fixP
->fx_pcrel
<< 24)
2338 | (long) (nbytes_r_length
[fixP
->fx_size
] << 25)
2339 | (long) ((!S_IS_DEFINED (fixP
->fx_addsy
)) << 27)
2340 | (long) (fix_bsr (fixP
) << 28)
2341 | (long) (fix_im_disp (fixP
) << 29)),
2345 #endif /* OBJ_AOUT */
2346 #endif /* BFD_ASSEMBLER */