Minor reorganization of fetch_registers/store_registers in windows-nat.c
[external/binutils.git] / gas / config / m68k-parse.h
1 /* m68k-parse.h -- header file for m68k assembler
2    Copyright (C) 1987-2018 Free Software Foundation, Inc.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to the Free
18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19    02110-1301, USA.  */
20
21 #ifndef M68K_PARSE_H
22 #define M68K_PARSE_H
23
24 /* This header file defines things which are shared between the
25    operand parser in m68k.y and the m68k assembler proper in
26    tc-m68k.c.  */
27
28 /* The various m68k registers.  */
29
30 /* DATA and ADDR have to be contiguous, so that reg-DATA gives
31    0-7==data reg, 8-15==addr reg for operands that take both types.
32
33    We don't use forms like "ADDR0 = ADDR" here because this file is
34    likely to be used on an Apollo, and the broken Apollo compiler
35    gives an `undefined variable' error if we do that, according to
36    troy@cbme.unsw.edu.au.  */
37
38 #define DATA DATA0
39 #define ADDR ADDR0
40 #define SP ADDR7
41 #define BAD BAD0
42 #define BAC BAC0
43
44 enum m68k_register
45 {
46   DATA0 = 1,                    /*   1- 8 == data registers 0-7 */
47   DATA1,
48   DATA2,
49   DATA3,
50   DATA4,
51   DATA5,
52   DATA6,
53   DATA7,
54
55   ADDR0,
56   ADDR1,
57   ADDR2,
58   ADDR3,
59   ADDR4,
60   ADDR5,
61   ADDR6,
62   ADDR7,
63
64   FP0,                          /* Eight FP registers */
65   FP1,
66   FP2,
67   FP3,
68   FP4,
69   FP5,
70   FP6,
71   FP7,
72
73   COP0,                         /* Co-processor #0-#7 */
74   COP1,
75   COP2,
76   COP3,
77   COP4,
78   COP5,
79   COP6,
80   COP7,
81
82   PC,                           /* Program counter */
83   ZPC,                          /* Hack for Program space, but 0 addressing */
84   SR,                           /* Status Reg */
85   CCR,                          /* Condition code Reg */
86   ACC,                          /* Accumulator Reg0 (EMAC or ACC on MAC).  */
87   ACC1,                         /* Accumulator Reg 1 (EMAC).  */
88   ACC2,                         /* Accumulator Reg 2 (EMAC).  */
89   ACC3,                         /* Accumulator Reg 3 (EMAC).  */
90   ACCEXT01,                     /* Accumulator extension 0&1 (EMAC).  */
91   ACCEXT23,                     /* Accumulator extension 2&3 (EMAC).  */
92   MACSR,                        /* MAC Status Reg */
93   MASK,                         /* Modulus Reg */
94
95   /* These have to be grouped together for the movec instruction to work.  */
96   USP,                          /*  User Stack Pointer */
97   ISP,                          /*  Interrupt stack pointer */
98   SFC,
99   DFC,
100   CACR,
101   VBR,
102   CAAR,
103   CPUCR,
104   MSP,
105   ITT0,
106   ITT1,
107   DTT0,
108   DTT1,
109   MMUSR,
110   TC,
111   SRP,
112   URP,
113   BUSCR,                        /* 68060 added these.  */
114   PCR,
115   ROMBAR,                       /* mcf5200 added these.  */
116   RAMBAR_ALT,                   /* Some CF chips have RAMBAR using
117                                    RAMBAR0's number */
118   RAMBAR0,
119   RAMBAR1,
120   MMUBAR,                       /* mcfv4e added these.  */
121   ROMBAR0,                      /* mcfv4e added these.  */
122   ROMBAR1,                      /* mcfv4e added these.  */
123   MPCR, EDRAMBAR, SECMBAR,      /* mcfv4e added these.  */
124   PCR1U0, PCR1L0, PCR1U1, PCR1L1,/* mcfv4e added these.  */
125   PCR2U0, PCR2L0, PCR2U1, PCR2L1,/* mcfv4e added these.  */
126   PCR3U0, PCR3L0, PCR3U1, PCR3L1,/* mcfv4e added these.  */
127   MBAR0, MBAR1,                 /* mcfv4e added these.  */
128   ACR0, ACR1, ACR2, ACR3,       /* mcf5200 added these.  */
129   ACR4, ACR5, ACR6, ACR7,       /* mcf54418 added these.  */
130   FLASHBAR, RAMBAR,             /* mcf528x added these.  */
131   MBAR2,                        /* mcf5249 added this.  */
132   MBAR,
133   RGPIOBAR,                     /* mcf54418 added this.  */
134   ASID,                         /* m5475.  */
135   CAC,                          /* fido added this.  */
136   MBO,
137 #define last_movec_reg MBO
138   /* End of movec ordering constraints.  */
139
140   FPI,
141   FPS,
142   FPC,
143
144   DRP,                          /* 68851 or 68030 MMU regs */
145   CRP,
146   CAL,
147   VAL,
148   SCC,
149   AC,
150   BAD0,
151   BAD1,
152   BAD2,
153   BAD3,
154   BAD4,
155   BAD5,
156   BAD6,
157   BAD7,
158   BAC0,
159   BAC1,
160   BAC2,
161   BAC3,
162   BAC4,
163   BAC5,
164   BAC6,
165   BAC7,
166   PSR,                          /* aka MMUSR on 68030 (but not MMUSR on 68040)
167                                    and ACUSR on 68ec030 */
168   PCSR,
169
170   IC,                           /* instruction cache token */
171   DC,                           /* data cache token */
172   NC,                           /* no cache token */
173   BC,                           /* both caches token */
174
175   TT0,                          /* 68030 access control unit regs */
176   TT1,
177
178   ZDATA0,                       /* suppressed data registers.  */
179   ZDATA1,
180   ZDATA2,
181   ZDATA3,
182   ZDATA4,
183   ZDATA5,
184   ZDATA6,
185   ZDATA7,
186
187   ZADDR0,                       /* suppressed address registers.  */
188   ZADDR1,
189   ZADDR2,
190   ZADDR3,
191   ZADDR4,
192   ZADDR5,
193   ZADDR6,
194   ZADDR7,
195
196   /* Upper and lower half of data and address registers.  Order *must*
197      be DATAxL, ADDRxL, DATAxU, ADDRxU.  */
198   DATA0L,                       /* lower half of data registers */
199   DATA1L,
200   DATA2L,
201   DATA3L,
202   DATA4L,
203   DATA5L,
204   DATA6L,
205   DATA7L,
206
207   ADDR0L,                       /* lower half of address registers */
208   ADDR1L,
209   ADDR2L,
210   ADDR3L,
211   ADDR4L,
212   ADDR5L,
213   ADDR6L,
214   ADDR7L,
215
216   DATA0U,                       /* upper half of data registers */
217   DATA1U,
218   DATA2U,
219   DATA3U,
220   DATA4U,
221   DATA5U,
222   DATA6U,
223   DATA7U,
224
225   ADDR0U,                       /* upper half of address registers */
226   ADDR1U,
227   ADDR2U,
228   ADDR3U,
229   ADDR4U,
230   ADDR5U,
231   ADDR6U,
232   ADDR7U,
233 };
234
235 /* Size information.  */
236
237 enum m68k_size
238 {
239   /* Unspecified.  */
240   SIZE_UNSPEC,
241
242   /* Byte.  */
243   SIZE_BYTE,
244
245   /* Word (2 bytes).  */
246   SIZE_WORD,
247
248   /* Longword (4 bytes).  */
249   SIZE_LONG
250 };
251
252 /* The structure used to hold information about an index register.  */
253
254 struct m68k_indexreg
255 {
256   /* The index register itself.  */
257   enum m68k_register reg;
258
259   /* The size to use.  */
260   enum m68k_size size;
261
262   /* The value to scale by.  */
263   int scale;
264 };
265
266 #ifdef OBJ_ELF
267 /* The type of a PIC expression.  */
268
269 enum pic_relocation
270 {
271   pic_none,                     /* not pic */
272   pic_plt_pcrel,                /* @PLTPC */
273   pic_got_pcrel,                /* @GOTPC */
274   pic_plt_off,                  /* @PLT */
275   pic_got_off,                  /* @GOT */
276   pic_tls_gd,                   /* @TLSGD */
277   pic_tls_ldm,                  /* @TLSLDM */
278   pic_tls_ldo,                  /* @TLSLDO */
279   pic_tls_ie,                   /* @TLSIE */
280   pic_tls_le                    /* @TLSLE */
281 };
282 #endif
283
284 /* The structure used to hold information about an expression.  */
285
286 struct m68k_exp
287 {
288   /* The size to use.  */
289   enum m68k_size size;
290
291 #ifdef OBJ_ELF
292   /* The type of pic relocation if any.  */
293   enum pic_relocation pic_reloc;
294 #endif
295
296   /* The expression itself.  */
297   expressionS exp;
298 };
299
300 /* The operand modes.  */
301
302 enum m68k_operand_type
303 {
304   IMMED = 1,
305   ABSL,
306   DREG,
307   AREG,
308   FPREG,
309   CONTROL,
310   AINDR,
311   AINC,
312   ADEC,
313   DISP,
314   BASE,
315   POST,
316   PRE,
317   LSH,  /* MAC/EMAC scalefactor '<<'.  */
318   RSH,  /* MAC/EMAC scalefactor '>>'.  */
319   REGLST
320 };
321
322 /* The structure used to hold a parsed operand.  */
323
324 struct m68k_op
325 {
326   /* The type of operand.  */
327   enum m68k_operand_type mode;
328
329   /* The main register.  */
330   enum m68k_register reg;
331
332   /* The register mask for mode REGLST.  */
333   unsigned long mask;
334
335   /* An error message.  */
336   const char *error;
337
338   /* The index register.  */
339   struct m68k_indexreg index;
340
341   /* The displacement.  */
342   struct m68k_exp disp;
343
344   /* The outer displacement.  */
345   struct m68k_exp odisp;
346
347   /* Is a trailing '&' added to an <ea>? (for MAC/EMAC mask addressing).  */
348   int trailing_ampersand;
349 };
350
351 #endif /* ! defined (M68K_PARSE_H) */
352
353 /* The parsing function.  */
354
355 extern int m68k_ip_op (char *, struct m68k_op *);
356
357 /* Whether register prefixes are optional.  */
358 extern int flag_reg_prefix_optional;