(root)/
binutils-2.41/
gas/
config/
bfin-defs.h
       1  /* bfin-defs.h ADI Blackfin gas header file
       2     Copyright (C) 2005-2023 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 BFIN_PARSE_H
      22  #define BFIN_PARSE_H
      23  
      24  #include "opcode/bfin.h"
      25  
      26  #define PCREL	1
      27  #define CODE_FRAG_SIZE 4096  /* 1 page.  */
      28  
      29  
      30  /* Definition for all status bits.  */
      31  typedef enum
      32  {
      33    c_0,
      34    c_1,
      35    c_4,
      36    c_2,
      37    c_uimm2,
      38    c_uimm3,
      39    c_imm3,
      40    c_pcrel4,
      41    c_imm4,
      42    c_uimm4s4,
      43    c_uimm4,
      44    c_uimm4s2,
      45    c_negimm5s4,
      46    c_imm5,
      47    c_uimm5,
      48    c_imm6,
      49    c_imm7,
      50    c_imm8,
      51    c_uimm8,
      52    c_pcrel8,
      53    c_uimm8s4,
      54    c_pcrel8s4,
      55    c_lppcrel10,
      56    c_pcrel10,
      57    c_pcrel12,
      58    c_imm16s4,
      59    c_luimm16,
      60    c_imm16,
      61    c_huimm16,
      62    c_rimm16,
      63    c_imm16s2,
      64    c_uimm16s4,
      65    c_uimm16,
      66    c_pcrel24
      67  } const_forms_t;
      68  
      69  
      70  /* High-Nibble: group code, low nibble: register code.  */
      71  
      72  
      73  #define T_REG_R       0x00
      74  #define T_REG_P       0x10
      75  #define T_REG_I       0x20
      76  #define T_REG_B       0x30
      77  #define T_REG_L       0x34
      78  #define T_REG_M       0x24
      79  #define T_REG_A       0x40
      80  
      81  /* All registers above this value don't
      82     belong to a usable register group.  */
      83  #define T_NOGROUP     0xa0
      84  
      85  /* Flags.  */
      86  #define F_REG_NONE 0
      87  #define F_REG_HIGH 1
      88  #define F_REG_LOW 2
      89  
      90  enum machine_registers
      91  {
      92    REG_R0    = T_REG_R, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
      93    REG_P0    = T_REG_P, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
      94    REG_I0    = T_REG_I, REG_I1, REG_I2, REG_I3,
      95    REG_M0    = T_REG_M, REG_M1, REG_M2, REG_M3,
      96    REG_B0    = T_REG_B, REG_B1, REG_B2, REG_B3,
      97    REG_L0    = T_REG_L, REG_L1, REG_L2, REG_L3,
      98    REG_A0x   = T_REG_A, REG_A0w, REG_A1x, REG_A1w,
      99    REG_ASTAT = 0x46,
     100    REG_RETS  = 0x47,
     101    REG_LC0   = 0x60, REG_LT0, REG_LB0,  REG_LC1, REG_LT1, REG_LB1,
     102                REG_CYCLES, REG_CYCLES2,
     103    REG_USP   = 0x70, REG_SEQSTAT, REG_SYSCFG,
     104  	      REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
     105  
     106  /* These don't have groups.  */
     107    REG_sftreset = T_NOGROUP, REG_omode, REG_excause, REG_emucause,
     108  	         REG_idle_req, REG_hwerrcause,
     109    REG_A0       = 0xc0, REG_A1, REG_CC,
     110  /* Pseudo registers, used only for distinction from symbols.  */
     111  		 REG_RL0, REG_RL1, REG_RL2, REG_RL3,
     112  		 REG_RL4, REG_RL5, REG_RL6, REG_RL7,
     113  		 REG_RH0, REG_RH1, REG_RH2, REG_RH3,
     114  		 REG_RH4, REG_RH5, REG_RH6, REG_RH7,
     115  		 REG_LASTREG
     116  };
     117  
     118  /* Status register flags.  */
     119  
     120  enum statusflags
     121  {
     122    S_AZ = 0,
     123    S_AN,
     124    S_AC0_COPY,
     125    S_V_COPY,
     126    S_AQ = 6,
     127    S_RND_MOD = 8,
     128    S_AC0 = 12,
     129    S_AC1,
     130    S_AV0 = 16,
     131    S_AV0S,
     132    S_AV1,
     133    S_AV1S,
     134    S_V = 24,
     135    S_VS = 25
     136  };
     137  
     138  
     139  enum reg_class
     140  {
     141    rc_dregs_lo,
     142    rc_dregs_hi,
     143    rc_dregs,
     144    rc_dregs_pair,
     145    rc_pregs,
     146    rc_spfp,
     147    rc_dregs_hilo,
     148    rc_accum_ext,
     149    rc_accum_word,
     150    rc_accum,
     151    rc_iregs,
     152    rc_mregs,
     153    rc_bregs,
     154    rc_lregs,
     155    rc_dpregs,
     156    rc_gregs,
     157    rc_regs,
     158    rc_statbits,
     159    rc_ignore_bits,
     160    rc_ccstat,
     161    rc_counters,
     162    rc_dregs2_sysregs1,
     163    rc_open,
     164    rc_sysregs2,
     165    rc_sysregs3,
     166    rc_allregs,
     167    LIM_REG_CLASSES
     168  };
     169  
     170  /* Register type checking macros.  */
     171  
     172  #define CODE_MASK  0x07
     173  #define CLASS_MASK 0xf0
     174  
     175  #define REG_SAME(a, b)   ((a).regno == (b).regno)
     176  #define REG_EQUAL(a, b)  (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
     177  #define REG_CLASS(a)     ((a).regno & 0xf0)
     178  #define IS_A1(a)         ((a).regno == REG_A1)
     179  #define IS_H(a)          ((a).flags & F_REG_HIGH ? 1: 0)
     180  #define IS_EVEN(r)       ((r).regno % 2 == 0)
     181  #define IS_HCOMPL(a, b)  (REG_EQUAL(a, b) && \
     182                           ((a).flags & F_REG_HIGH) != ((b).flags & F_REG_HIGH))
     183  
     184  /* register type checking.  */
     185  #define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
     186  
     187  #define IS_DREG(r)       _TYPECHECK(r, R)
     188  #define IS_DREG_H(r)     (_TYPECHECK(r, R) && IS_H(r))
     189  #define IS_DREG_L(r)     (_TYPECHECK(r, R) && !IS_H(r))
     190  #define IS_PREG(r)       _TYPECHECK(r, P)
     191  #define IS_IREG(r)       (((r).regno & 0xf4) == T_REG_I)
     192  #define IS_MREG(r)       (((r).regno & 0xf4) == T_REG_M)
     193  #define IS_BREG(r)       (((r).regno & 0xf4) == T_REG_B)
     194  #define IS_LREG(r)       (((r).regno & 0xf4) == T_REG_L)
     195  #define IS_CREG(r)       ((r).regno == REG_LC0 || (r).regno == REG_LC1)
     196  #define IS_EMUDAT(r)     ((r).regno == REG_EMUDAT)
     197  #define IS_ALLREG(r)     ((r).regno < T_NOGROUP)
     198  
     199  #define IS_GENREG(r) \
     200    (IS_DREG (r) || IS_PREG (r)				\
     201     || (r).regno == REG_A0x || (r).regno == REG_A0w	\
     202     || (r).regno == REG_A1x || (r).regno == REG_A1w)
     203  
     204  #define IS_DAGREG(r) \
     205    (IS_IREG (r) || IS_MREG (r) || IS_BREG (r) || IS_LREG (r))
     206  
     207  #define IS_SYSREG(r) \
     208    ((r).regno == REG_ASTAT || (r).regno == REG_SEQSTAT		\
     209     || (r).regno == REG_SYSCFG || (r).regno == REG_RETI		\
     210     || (r).regno == REG_RETX || (r).regno == REG_RETN		\
     211     || (r).regno == REG_RETE || (r).regno == REG_RETS		\
     212     || (r).regno == REG_LC0 || (r).regno == REG_LC1		\
     213     || (r).regno == REG_LT0 || (r).regno == REG_LT1		\
     214     || (r).regno == REG_LB0 || (r).regno == REG_LB1		\
     215     || (r).regno == REG_CYCLES || (r).regno == REG_CYCLES2	\
     216     || (r).regno == REG_EMUDAT)
     217  
     218  /* Expression value macros.  */
     219  
     220  typedef enum
     221  {
     222    ones_compl,
     223    twos_compl,
     224    mult,
     225    divide,
     226    mod,
     227    add,
     228    sub,
     229    lsh,
     230    rsh,
     231    logand,
     232    logior,
     233    logxor
     234  } expr_opcodes_t;
     235  
     236  struct expressionS;
     237  
     238  #define SYMBOL_T       symbolS*
     239  
     240  struct expression_cell
     241  {
     242    int value;
     243    SYMBOL_T symbol;
     244  };
     245  
     246  /* User Type Definitions.  */
     247  struct bfin_insn
     248  {
     249    unsigned long value;
     250    struct bfin_insn *next;
     251    struct expression_cell *exp;
     252    int pcrel;
     253    int reloc;
     254  };
     255  
     256  #define INSTR_T struct bfin_insn*
     257  #define EXPR_T  struct expression_cell*
     258  
     259  typedef struct expr_node_struct Expr_Node;
     260  
     261  extern INSTR_T gencode (unsigned long x);
     262  extern INSTR_T conscode (INSTR_T head, INSTR_T tail);
     263  extern INSTR_T conctcode (INSTR_T head, INSTR_T tail);
     264  extern INSTR_T note_reloc
     265         (INSTR_T code, Expr_Node *, int reloc,int pcrel);
     266  extern INSTR_T note_reloc1
     267         (INSTR_T code, const char * sym, int reloc, int pcrel);
     268  extern INSTR_T note_reloc2
     269         (INSTR_T code, const char *symbol, int reloc, int value, int pcrel);
     270  
     271  /* Types of expressions.  */
     272  typedef enum
     273  {
     274    Expr_Node_Binop,		/* Binary operator.  */
     275    Expr_Node_Unop,		/* Unary operator.  */
     276    Expr_Node_Reloc,		/* Symbol to be relocated.  */
     277    Expr_Node_GOT_Reloc,		/* Symbol to be relocated using the GOT.  */
     278    Expr_Node_Constant 		/* Constant.  */
     279  } Expr_Node_Type;
     280  
     281  /* Types of operators.  */
     282  typedef enum
     283  {
     284    Expr_Op_Type_Add,
     285    Expr_Op_Type_Sub,
     286    Expr_Op_Type_Mult,
     287    Expr_Op_Type_Div,
     288    Expr_Op_Type_Mod,
     289    Expr_Op_Type_Lshift,
     290    Expr_Op_Type_Rshift,
     291    Expr_Op_Type_BAND,		/* Bitwise AND.  */
     292    Expr_Op_Type_BOR,		/* Bitwise OR.  */
     293    Expr_Op_Type_BXOR,		/* Bitwise exclusive OR.  */
     294    Expr_Op_Type_LAND,		/* Logical AND.  */
     295    Expr_Op_Type_LOR,		/* Logical OR.  */
     296    Expr_Op_Type_NEG,
     297    Expr_Op_Type_COMP		/* Complement.  */
     298  } Expr_Op_Type;
     299  
     300  /* The value that can be stored ... depends on type.  */
     301  typedef union
     302  {
     303    const char *s_value;		/* if relocation symbol, the text.  */
     304    long long i_value;		/* if constant, the value.  */
     305    Expr_Op_Type op_value;	/* if operator, the value.  */
     306  } Expr_Node_Value;
     307  
     308  /* The expression node.  */
     309  struct expr_node_struct
     310  {
     311    Expr_Node_Type 	type;
     312    Expr_Node_Value	value;
     313    Expr_Node		*Left_Child;
     314    Expr_Node		*Right_Child;
     315  };
     316  
     317  
     318  /* Operations on the expression node.  */
     319  Expr_Node *Expr_Node_Create (Expr_Node_Type type,
     320  		         Expr_Node_Value value,
     321  			 Expr_Node *Left_Child,
     322  			 Expr_Node *Right_Child);
     323  
     324  /* Generate the reloc structure as a series of instructions.  */
     325  INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
     326  
     327  #define MKREF(x)	mkexpr (0,x)
     328  
     329  #define NULL_CODE ((INSTR_T) 0)
     330  
     331  #ifndef EXPR_VALUE
     332  #define EXPR_VALUE(x)  (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
     333  #endif
     334  #ifndef EXPR_SYMBOL
     335  #define EXPR_SYMBOL(x) ((x)->symbol)
     336  #endif
     337  
     338  
     339  typedef long reg_t;
     340  
     341  
     342  typedef struct _register
     343  {
     344    reg_t regno;       /* Register ID as defined in machine_registers.  */
     345    int   flags;
     346  } Register;
     347  
     348  
     349  typedef struct _macfunc
     350  {
     351    char n;
     352    char op;
     353    char w;
     354    char P;
     355    Register dst;
     356    Register s0;
     357    Register s1;
     358  } Macfunc;
     359  
     360  typedef struct _opt_mode
     361  {
     362    int MM;
     363    int mod;
     364  } Opt_mode;
     365  
     366  typedef enum
     367  {
     368    SEMANTIC_ERROR,
     369    NO_INSN_GENERATED,
     370    INSN_GENERATED
     371  } parse_state;
     372  
     373  
     374  #ifdef __cplusplus
     375  extern "C" {
     376  #endif
     377  
     378  extern int debug_codeselection;
     379  
     380  void error (const char *format, ...);
     381  void warn (char *format, ...);
     382  int  semantic_error (char *syntax);
     383  void semantic_error_2 (char *syntax);
     384  
     385  EXPR_T mkexpr (int, SYMBOL_T);
     386  
     387  /* Defined in bfin-lex.l.  */
     388  void set_start_state (void);
     389  
     390  extern int insn_regmask (int, int);
     391  #ifdef __cplusplus
     392  }
     393  #endif
     394  
     395  #endif  /* BFIN_PARSE_H */
     396