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