Home | History | Annotate | Download | only in config
      1 /* m68k-parse.h -- header file for m68k assembler
      2    Copyright (C) 1987-2016 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 (at) 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;
    359