123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- /* m68k-parse.h -- header file for m68k assembler
- Copyright (C) 1987-2015 Free Software Foundation, Inc.
- This file is part of GAS, the GNU Assembler.
- GAS is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- GAS is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GAS; see the file COPYING. If not, write to the Free
- Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
- #ifndef M68K_PARSE_H
- #define M68K_PARSE_H
- /* This header file defines things which are shared between the
- operand parser in m68k.y and the m68k assembler proper in
- tc-m68k.c. */
- /* The various m68k registers. */
- /* DATA and ADDR have to be contiguous, so that reg-DATA gives
- 0-7==data reg, 8-15==addr reg for operands that take both types.
- We don't use forms like "ADDR0 = ADDR" here because this file is
- likely to be used on an Apollo, and the broken Apollo compiler
- gives an `undefined variable' error if we do that, according to
- troy@cbme.unsw.edu.au. */
- #define DATA DATA0
- #define ADDR ADDR0
- #define SP ADDR7
- #define BAD BAD0
- #define BAC BAC0
- enum m68k_register
- {
- DATA0 = 1, /* 1- 8 == data registers 0-7 */
- DATA1,
- DATA2,
- DATA3,
- DATA4,
- DATA5,
- DATA6,
- DATA7,
- ADDR0,
- ADDR1,
- ADDR2,
- ADDR3,
- ADDR4,
- ADDR5,
- ADDR6,
- ADDR7,
- FP0, /* Eight FP registers */
- FP1,
- FP2,
- FP3,
- FP4,
- FP5,
- FP6,
- FP7,
- COP0, /* Co-processor #0-#7 */
- COP1,
- COP2,
- COP3,
- COP4,
- COP5,
- COP6,
- COP7,
- PC, /* Program counter */
- ZPC, /* Hack for Program space, but 0 addressing */
- SR, /* Status Reg */
- CCR, /* Condition code Reg */
- ACC, /* Accumulator Reg0 (EMAC or ACC on MAC). */
- ACC1, /* Accumulator Reg 1 (EMAC). */
- ACC2, /* Accumulator Reg 2 (EMAC). */
- ACC3, /* Accumulator Reg 3 (EMAC). */
- ACCEXT01, /* Accumulator extension 0&1 (EMAC). */
- ACCEXT23, /* Accumulator extension 2&3 (EMAC). */
- MACSR, /* MAC Status Reg */
- MASK, /* Modulus Reg */
- /* These have to be grouped together for the movec instruction to work. */
- USP, /* User Stack Pointer */
- ISP, /* Interrupt stack pointer */
- SFC,
- DFC,
- CACR,
- VBR,
- CAAR,
- CPUCR,
- MSP,
- ITT0,
- ITT1,
- DTT0,
- DTT1,
- MMUSR,
- TC,
- SRP,
- URP,
- BUSCR, /* 68060 added these. */
- PCR,
- ROMBAR, /* mcf5200 added these. */
- RAMBAR_ALT, /* Some CF chips have RAMBAR using
- RAMBAR0's number */
- RAMBAR0,
- RAMBAR1,
- MMUBAR, /* mcfv4e added these. */
- ROMBAR0, /* mcfv4e added these. */
- ROMBAR1, /* mcfv4e added these. */
- MPCR, EDRAMBAR, SECMBAR, /* mcfv4e added these. */
- PCR1U0, PCR1L0, PCR1U1, PCR1L1,/* mcfv4e added these. */
- PCR2U0, PCR2L0, PCR2U1, PCR2L1,/* mcfv4e added these. */
- PCR3U0, PCR3L0, PCR3U1, PCR3L1,/* mcfv4e added these. */
- MBAR0, MBAR1, /* mcfv4e added these. */
- ACR0, ACR1, ACR2, ACR3, /* mcf5200 added these. */
- ACR4, ACR5, ACR6, ACR7, /* mcf54418 added these. */
- FLASHBAR, RAMBAR, /* mcf528x added these. */
- MBAR2, /* mcf5249 added this. */
- MBAR,
- RGPIOBAR, /* mcf54418 added this. */
- ASID, /* m5475. */
- CAC, /* fido added this. */
- MBO,
- #define last_movec_reg MBO
- /* End of movec ordering constraints. */
- FPI,
- FPS,
- FPC,
- DRP, /* 68851 or 68030 MMU regs */
- CRP,
- CAL,
- VAL,
- SCC,
- AC,
- BAD0,
- BAD1,
- BAD2,
- BAD3,
- BAD4,
- BAD5,
- BAD6,
- BAD7,
- BAC0,
- BAC1,
- BAC2,
- BAC3,
- BAC4,
- BAC5,
- BAC6,
- BAC7,
- PSR, /* aka MMUSR on 68030 (but not MMUSR on 68040)
- and ACUSR on 68ec030 */
- PCSR,
- IC, /* instruction cache token */
- DC, /* data cache token */
- NC, /* no cache token */
- BC, /* both caches token */
- TT0, /* 68030 access control unit regs */
- TT1,
- ZDATA0, /* suppressed data registers. */
- ZDATA1,
- ZDATA2,
- ZDATA3,
- ZDATA4,
- ZDATA5,
- ZDATA6,
- ZDATA7,
- ZADDR0, /* suppressed address registers. */
- ZADDR1,
- ZADDR2,
- ZADDR3,
- ZADDR4,
- ZADDR5,
- ZADDR6,
- ZADDR7,
- /* Upper and lower half of data and address registers. Order *must*
- be DATAxL, ADDRxL, DATAxU, ADDRxU. */
- DATA0L, /* lower half of data registers */
- DATA1L,
- DATA2L,
- DATA3L,
- DATA4L,
- DATA5L,
- DATA6L,
- DATA7L,
- ADDR0L, /* lower half of address registers */
- ADDR1L,
- ADDR2L,
- ADDR3L,
- ADDR4L,
- ADDR5L,
- ADDR6L,
- ADDR7L,
- DATA0U, /* upper half of data registers */
- DATA1U,
- DATA2U,
- DATA3U,
- DATA4U,
- DATA5U,
- DATA6U,
- DATA7U,
- ADDR0U, /* upper half of address registers */
- ADDR1U,
- ADDR2U,
- ADDR3U,
- ADDR4U,
- ADDR5U,
- ADDR6U,
- ADDR7U,
- };
- /* Size information. */
- enum m68k_size
- {
- /* Unspecified. */
- SIZE_UNSPEC,
- /* Byte. */
- SIZE_BYTE,
- /* Word (2 bytes). */
- SIZE_WORD,
- /* Longword (4 bytes). */
- SIZE_LONG
- };
- /* The structure used to hold information about an index register. */
- struct m68k_indexreg
- {
- /* The index register itself. */
- enum m68k_register reg;
- /* The size to use. */
- enum m68k_size size;
- /* The value to scale by. */
- int scale;
- };
- #ifdef OBJ_ELF
- /* The type of a PIC expression. */
- enum pic_relocation
- {
- pic_none, /* not pic */
- pic_plt_pcrel, /* @PLTPC */
- pic_got_pcrel, /* @GOTPC */
- pic_plt_off, /* @PLT */
- pic_got_off, /* @GOT */
- pic_tls_gd, /* @TLSGD */
- pic_tls_ldm, /* @TLSLDM */
- pic_tls_ldo, /* @TLSLDO */
- pic_tls_ie, /* @TLSIE */
- pic_tls_le /* @TLSLE */
- };
- #endif
- /* The structure used to hold information about an expression. */
- struct m68k_exp
- {
- /* The size to use. */
- enum m68k_size size;
- #ifdef OBJ_ELF
- /* The type of pic relocation if any. */
- enum pic_relocation pic_reloc;
- #endif
- /* The expression itself. */
- expressionS exp;
- };
- /* The operand modes. */
- enum m68k_operand_type
- {
- IMMED = 1,
- ABSL,
- DREG,
- AREG,
- FPREG,
- CONTROL,
- AINDR,
- AINC,
- ADEC,
- DISP,
- BASE,
- POST,
- PRE,
- LSH, /* MAC/EMAC scalefactor '<<'. */
- RSH, /* MAC/EMAC scalefactor '>>'. */
- REGLST
- };
- /* The structure used to hold a parsed operand. */
- struct m68k_op
- {
- /* The type of operand. */
- enum m68k_operand_type mode;
- /* The main register. */
- enum m68k_register reg;
- /* The register mask for mode REGLST. */
- unsigned long mask;
- /* An error message. */
- const char *error;
- /* The index register. */
- struct m68k_indexreg index;
- /* The displacement. */
- struct m68k_exp disp;
- /* The outer displacement. */
- struct m68k_exp odisp;
- /* Is a trailing '&' added to an <ea>? (for MAC/EMAC mask addressing). */
- int trailing_ampersand;
- };
- #endif /* ! defined (M68K_PARSE_H) */
- /* The parsing function. */
- extern int m68k_ip_op (char *, struct m68k_op *);
- /* Whether register prefixes are optional. */
- extern int flag_reg_prefix_optional;
|