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