2011-06-09 James Greenhalgh <james.greenhalgh@arm.com>
[binutils.git] / gas / config / m68k-parse.h
blob4f91385f9222dc52c8cc9f490860729c2183e445
1 /* m68k-parse.h -- header file for m68k assembler
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000,
3 2003, 2004, 2005, 2006, 2007, 2009 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 3, 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, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, 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 Reg0 (EMAC or ACC on MAC). */
88 ACC1, /* Accumulator Reg 1 (EMAC). */
89 ACC2, /* Accumulator Reg 2 (EMAC). */
90 ACC3, /* Accumulator Reg 3 (EMAC). */
91 ACCEXT01, /* Accumulator extension 0&1 (EMAC). */
92 ACCEXT23, /* Accumulator extension 2&3 (EMAC). */
93 MACSR, /* MAC Status Reg */
94 MASK, /* Modulus Reg */
96 /* These have to be grouped together for the movec instruction to work. */
97 USP, /* User Stack Pointer */
98 ISP, /* Interrupt stack pointer */
99 SFC,
100 DFC,
101 CACR,
102 VBR,
103 CAAR,
104 CPUCR,
105 MSP,
106 ITT0,
107 ITT1,
108 DTT0,
109 DTT1,
110 MMUSR,
112 SRP,
113 URP,
114 BUSCR, /* 68060 added these. */
115 PCR,
116 ROMBAR, /* mcf5200 added these. */
117 RAMBAR_ALT, /* Some CF chips have RAMBAR using
118 RAMBAR0's number */
119 RAMBAR0,
120 RAMBAR1,
121 MMUBAR, /* mcfv4e added these. */
122 ROMBAR0, /* mcfv4e added these. */
123 ROMBAR1, /* mcfv4e added these. */
124 MPCR, EDRAMBAR, SECMBAR, /* mcfv4e added these. */
125 PCR1U0, PCR1L0, PCR1U1, PCR1L1,/* mcfv4e added these. */
126 PCR2U0, PCR2L0, PCR2U1, PCR2L1,/* mcfv4e added these. */
127 PCR3U0, PCR3L0, PCR3U1, PCR3L1,/* mcfv4e added these. */
128 MBAR0, MBAR1, /* mcfv4e added these. */
129 ACR0, ACR1, ACR2, ACR3, /* mcf5200 added these. */
130 ACR4, ACR5, ACR6, ACR7, /* mcf54418 added these. */
131 FLASHBAR, RAMBAR, /* mcf528x added these. */
132 MBAR2, /* mcf5249 added this. */
133 MBAR,
134 RGPIOBAR, /* mcf54418 added this. */
135 ASID, /* m5475. */
136 CAC, /* fido added this. */
137 MBO,
138 #define last_movec_reg MBO
139 /* End of movec ordering constraints. */
141 FPI,
142 FPS,
143 FPC,
145 DRP, /* 68851 or 68030 MMU regs */
146 CRP,
147 CAL,
148 VAL,
149 SCC,
151 BAD0,
152 BAD1,
153 BAD2,
154 BAD3,
155 BAD4,
156 BAD5,
157 BAD6,
158 BAD7,
159 BAC0,
160 BAC1,
161 BAC2,
162 BAC3,
163 BAC4,
164 BAC5,
165 BAC6,
166 BAC7,
167 PSR, /* aka MMUSR on 68030 (but not MMUSR on 68040)
168 and ACUSR on 68ec030 */
169 PCSR,
171 IC, /* instruction cache token */
172 DC, /* data cache token */
173 NC, /* no cache token */
174 BC, /* both caches token */
176 TT0, /* 68030 access control unit regs */
177 TT1,
179 ZDATA0, /* suppressed data registers. */
180 ZDATA1,
181 ZDATA2,
182 ZDATA3,
183 ZDATA4,
184 ZDATA5,
185 ZDATA6,
186 ZDATA7,
188 ZADDR0, /* suppressed address registers. */
189 ZADDR1,
190 ZADDR2,
191 ZADDR3,
192 ZADDR4,
193 ZADDR5,
194 ZADDR6,
195 ZADDR7,
197 /* Upper and lower half of data and address registers. Order *must*
198 be DATAxL, ADDRxL, DATAxU, ADDRxU. */
199 DATA0L, /* lower half of data registers */
200 DATA1L,
201 DATA2L,
202 DATA3L,
203 DATA4L,
204 DATA5L,
205 DATA6L,
206 DATA7L,
208 ADDR0L, /* lower half of address registers */
209 ADDR1L,
210 ADDR2L,
211 ADDR3L,
212 ADDR4L,
213 ADDR5L,
214 ADDR6L,
215 ADDR7L,
217 DATA0U, /* upper half of data registers */
218 DATA1U,
219 DATA2U,
220 DATA3U,
221 DATA4U,
222 DATA5U,
223 DATA6U,
224 DATA7U,
226 ADDR0U, /* upper half of address registers */
227 ADDR1U,
228 ADDR2U,
229 ADDR3U,
230 ADDR4U,
231 ADDR5U,
232 ADDR6U,
233 ADDR7U,
236 /* Size information. */
238 enum m68k_size
240 /* Unspecified. */
241 SIZE_UNSPEC,
243 /* Byte. */
244 SIZE_BYTE,
246 /* Word (2 bytes). */
247 SIZE_WORD,
249 /* Longword (4 bytes). */
250 SIZE_LONG
253 /* The structure used to hold information about an index register. */
255 struct m68k_indexreg
257 /* The index register itself. */
258 enum m68k_register reg;
260 /* The size to use. */
261 enum m68k_size size;
263 /* The value to scale by. */
264 int scale;
267 #ifdef OBJ_ELF
268 /* The type of a PIC expression. */
270 enum pic_relocation
272 pic_none, /* not pic */
273 pic_plt_pcrel, /* @PLTPC */
274 pic_got_pcrel, /* @GOTPC */
275 pic_plt_off, /* @PLT */
276 pic_got_off, /* @GOT */
277 pic_tls_gd, /* @TLSGD */
278 pic_tls_ldm, /* @TLSLDM */
279 pic_tls_ldo, /* @TLSLDO */
280 pic_tls_ie, /* @TLSIE */
281 pic_tls_le /* @TLSLE */
283 #endif
285 /* The structure used to hold information about an expression. */
287 struct m68k_exp
289 /* The size to use. */
290 enum m68k_size size;
292 #ifdef OBJ_ELF
293 /* The type of pic relocation if any. */
294 enum pic_relocation pic_reloc;
295 #endif
297 /* The expression itself. */
298 expressionS exp;
301 /* The operand modes. */
303 enum m68k_operand_type
305 IMMED = 1,
306 ABSL,
307 DREG,
308 AREG,
309 FPREG,
310 CONTROL,
311 AINDR,
312 AINC,
313 ADEC,
314 DISP,
315 BASE,
316 POST,
317 PRE,
318 LSH, /* MAC/EMAC scalefactor '<<'. */
319 RSH, /* MAC/EMAC scalefactor '>>'. */
320 REGLST
323 /* The structure used to hold a parsed operand. */
325 struct m68k_op
327 /* The type of operand. */
328 enum m68k_operand_type mode;
330 /* The main register. */
331 enum m68k_register reg;
333 /* The register mask for mode REGLST. */
334 unsigned long mask;
336 /* An error message. */
337 const char *error;
339 /* The index register. */
340 struct m68k_indexreg index;
342 /* The displacement. */
343 struct m68k_exp disp;
345 /* The outer displacement. */
346 struct m68k_exp odisp;
348 /* Is a trailing '&' added to an <ea>? (for MAC/EMAC mask addressing). */
349 int trailing_ampersand;
352 #endif /* ! defined (M68K_PARSE_H) */
354 /* The parsing function. */
356 extern int m68k_ip_op (char *, struct m68k_op *);
358 /* Whether register prefixes are optional. */
359 extern int flag_reg_prefix_optional;