2000-06-06 Michael Snyder <msnyder@seadog.cygnus.com>
[binutils.git] / gas / config / m68k-parse.h
blobcdb5f60eb53d121796964a9e51a3dc43c38fbb21
1 /* m68k-parse.h -- header file for m68k assembler
2 Copyright (C) 1987, 91, 92, 93, 94, 95, 96, 1999
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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.
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.
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. */
22 #ifndef M68K_PARSE_H
23 #define M68K_PARSE_H
25 /* This header file defines things which are shared between the
26 operand parser in m68k.y and the m68k assembler proper in
27 tc-m68k.c. */
29 /* The various m68k registers. */
31 /* DATA and ADDR have to be contiguous, so that reg-DATA gives
32 0-7==data reg, 8-15==addr reg for operands that take both types.
34 We don't use forms like "ADDR0 = ADDR" here because this file is
35 likely to be used on an Apollo, and the broken Apollo compiler
36 gives an `undefined variable' error if we do that, according to
37 troy@cbme.unsw.edu.au. */
39 #define DATA DATA0
40 #define ADDR ADDR0
41 #define SP ADDR7
42 #define BAD BAD0
43 #define BAC BAC0
45 enum m68k_register
47 DATA0 = 1, /* 1- 8 == data registers 0-7 */
48 DATA1,
49 DATA2,
50 DATA3,
51 DATA4,
52 DATA5,
53 DATA6,
54 DATA7,
56 ADDR0,
57 ADDR1,
58 ADDR2,
59 ADDR3,
60 ADDR4,
61 ADDR5,
62 ADDR6,
63 ADDR7,
65 FP0, /* Eight FP registers */
66 FP1,
67 FP2,
68 FP3,
69 FP4,
70 FP5,
71 FP6,
72 FP7,
74 COP0, /* Co-processor #0-#7 */
75 COP1,
76 COP2,
77 COP3,
78 COP4,
79 COP5,
80 COP6,
81 COP7,
83 PC, /* Program counter */
84 ZPC, /* Hack for Program space, but 0 addressing */
85 SR, /* Status Reg */
86 CCR, /* Condition code Reg */
87 ACC, /* Accumulator Reg */
88 MACSR, /* MAC Status Reg */
89 MASK, /* Modulus Reg */
91 /* These have to be grouped together for the movec instruction to work. */
92 USP, /* User Stack Pointer */
93 ISP, /* Interrupt stack pointer */
94 SFC,
95 DFC,
96 CACR,
97 VBR,
98 CAAR,
99 MSP,
100 ITT0,
101 ITT1,
102 DTT0,
103 DTT1,
104 MMUSR,
106 SRP,
107 URP,
108 BUSCR, /* 68060 added these */
109 PCR,
110 ROMBAR, /* mcf5200 added these */
111 RAMBAR0,
112 RAMBAR1,
113 MBAR,
114 #define last_movec_reg MBAR
115 /* end of movec ordering constraints */
117 FPI,
118 FPS,
119 FPC,
121 DRP, /* 68851 or 68030 MMU regs */
122 CRP,
123 CAL,
124 VAL,
125 SCC,
127 BAD0,
128 BAD1,
129 BAD2,
130 BAD3,
131 BAD4,
132 BAD5,
133 BAD6,
134 BAD7,
135 BAC0,
136 BAC1,
137 BAC2,
138 BAC3,
139 BAC4,
140 BAC5,
141 BAC6,
142 BAC7,
143 PSR, /* aka MMUSR on 68030 (but not MMUSR on 68040)
144 and ACUSR on 68ec030 */
145 PCSR,
147 IC, /* instruction cache token */
148 DC, /* data cache token */
149 NC, /* no cache token */
150 BC, /* both caches token */
152 TT0, /* 68030 access control unit regs */
153 TT1,
155 ZDATA0, /* suppressed data registers. */
156 ZDATA1,
157 ZDATA2,
158 ZDATA3,
159 ZDATA4,
160 ZDATA5,
161 ZDATA6,
162 ZDATA7,
164 ZADDR0, /* suppressed address registers. */
165 ZADDR1,
166 ZADDR2,
167 ZADDR3,
168 ZADDR4,
169 ZADDR5,
170 ZADDR6,
171 ZADDR7,
173 /* Upper and lower half of data and address registers. Order *must*
174 be DATAxL, ADDRxL, DATAxU, ADDRxU. */
175 DATA0L, /* lower half of data registers */
176 DATA1L,
177 DATA2L,
178 DATA3L,
179 DATA4L,
180 DATA5L,
181 DATA6L,
182 DATA7L,
184 ADDR0L, /* lower half of address registers */
185 ADDR1L,
186 ADDR2L,
187 ADDR3L,
188 ADDR4L,
189 ADDR5L,
190 ADDR6L,
191 ADDR7L,
193 DATA0U, /* upper half of data registers */
194 DATA1U,
195 DATA2U,
196 DATA3U,
197 DATA4U,
198 DATA5U,
199 DATA6U,
200 DATA7U,
202 ADDR0U, /* upper half of address registers */
203 ADDR1U,
204 ADDR2U,
205 ADDR3U,
206 ADDR4U,
207 ADDR5U,
208 ADDR6U,
209 ADDR7U,
212 /* Size information. */
214 enum m68k_size
216 /* Unspecified. */
217 SIZE_UNSPEC,
219 /* Byte. */
220 SIZE_BYTE,
222 /* Word (2 bytes). */
223 SIZE_WORD,
225 /* Longword (4 bytes). */
226 SIZE_LONG
229 /* The structure used to hold information about an index register. */
231 struct m68k_indexreg
233 /* The index register itself. */
234 enum m68k_register reg;
236 /* The size to use. */
237 enum m68k_size size;
239 /* The value to scale by. */
240 int scale;
243 #ifdef OBJ_ELF
244 /* The type of a PIC expression. */
246 enum pic_relocation
248 pic_none, /* not pic */
249 pic_plt_pcrel, /* @PLTPC */
250 pic_got_pcrel, /* @GOTPC */
251 pic_plt_off, /* @PLT */
252 pic_got_off /* @GOT */
254 #endif
256 /* The structure used to hold information about an expression. */
258 struct m68k_exp
260 /* The size to use. */
261 enum m68k_size size;
263 #ifdef OBJ_ELF
264 /* The type of pic relocation if any. */
265 enum pic_relocation pic_reloc;
266 #endif
268 /* The expression itself. */
269 expressionS exp;
272 /* The operand modes. */
274 enum m68k_operand_type
276 IMMED = 1,
277 ABSL,
278 DREG,
279 AREG,
280 FPREG,
281 CONTROL,
282 AINDR,
283 AINC,
284 ADEC,
285 DISP,
286 BASE,
287 POST,
288 PRE,
289 REGLST
292 /* The structure used to hold a parsed operand. */
294 struct m68k_op
296 /* The type of operand. */
297 enum m68k_operand_type mode;
299 /* The main register. */
300 enum m68k_register reg;
302 /* The register mask for mode REGLST. */
303 unsigned long mask;
305 /* An error message. */
306 const char *error;
308 /* The index register. */
309 struct m68k_indexreg index;
311 /* The displacement. */
312 struct m68k_exp disp;
314 /* The outer displacement. */
315 struct m68k_exp odisp;
318 #endif /* ! defined (M68K_PARSE_H) */
320 /* The parsing function. */
322 extern int m68k_ip_op PARAMS ((char *, struct m68k_op *));
324 /* Whether register prefixes are optional. */
325 extern int flag_reg_prefix_optional;