OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [config/] [bfin-defs.h] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* bfin-defs.h ADI Blackfin gas header file
/* bfin-defs.h ADI Blackfin gas header file
   Copyright 2005, 2006, 2007
   Copyright 2005, 2006, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of GAS, the GNU Assembler.
   This file is part of GAS, the GNU Assembler.
 
 
   GAS is free software; you can redistribute it and/or modify
   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   the Free Software Foundation; either version 3, or (at your option)
   any later version.
   any later version.
 
 
   GAS is distributed in the hope that it will be useful,
   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   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
   along with GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */
   02110-1301, USA.  */
 
 
#ifndef BFIN_PARSE_H
#ifndef BFIN_PARSE_H
#define BFIN_PARSE_H  
#define BFIN_PARSE_H  
 
 
#define PCREL   1
#define PCREL   1
#define CODE_FRAG_SIZE 4096  /* 1 page.  */  
#define CODE_FRAG_SIZE 4096  /* 1 page.  */  
 
 
 
 
/* Definition for all status bits.  */
/* Definition for all status bits.  */
typedef enum
typedef enum
{
{
  c_0,
  c_0,
  c_1,
  c_1,
  c_4,
  c_4,
  c_2,
  c_2,
  c_uimm2,
  c_uimm2,
  c_uimm3,
  c_uimm3,
  c_imm3,
  c_imm3,
  c_pcrel4,
  c_pcrel4,
  c_imm4,
  c_imm4,
  c_uimm4s4,
  c_uimm4s4,
  c_uimm4,
  c_uimm4,
  c_uimm4s2,
  c_uimm4s2,
  c_negimm5s4,
  c_negimm5s4,
  c_imm5,
  c_imm5,
  c_uimm5,
  c_uimm5,
  c_imm6,
  c_imm6,
  c_imm7,
  c_imm7,
  c_imm8,
  c_imm8,
  c_uimm8,
  c_uimm8,
  c_pcrel8,
  c_pcrel8,
  c_uimm8s4,
  c_uimm8s4,
  c_pcrel8s4,
  c_pcrel8s4,
  c_lppcrel10,
  c_lppcrel10,
  c_pcrel10,
  c_pcrel10,
  c_pcrel12,
  c_pcrel12,
  c_imm16s4,
  c_imm16s4,
  c_luimm16,
  c_luimm16,
  c_imm16,
  c_imm16,
  c_huimm16,
  c_huimm16,
  c_rimm16,
  c_rimm16,
  c_imm16s2,
  c_imm16s2,
  c_uimm16s4,
  c_uimm16s4,
  c_uimm16,
  c_uimm16,
  c_pcrel24
  c_pcrel24
} const_forms_t;
} const_forms_t;
 
 
 
 
/* High-Nibble: group code, low nibble: register code.  */
/* High-Nibble: group code, low nibble: register code.  */
 
 
 
 
#define T_REG_R       0x00
#define T_REG_R       0x00
#define T_REG_P       0x10
#define T_REG_P       0x10
#define T_REG_I       0x20
#define T_REG_I       0x20
#define T_REG_B       0x30
#define T_REG_B       0x30
#define T_REG_L       0x34
#define T_REG_L       0x34
#define T_REG_M       0x24
#define T_REG_M       0x24
#define T_REG_A       0x40
#define T_REG_A       0x40
 
 
/* All registers above this value don't
/* All registers above this value don't
   belong to a usuable register group.  */
   belong to a usuable register group.  */
#define T_NOGROUP     0xa0
#define T_NOGROUP     0xa0
 
 
/* Flags.  */
/* Flags.  */
#define F_REG_ALL    0x1000
#define F_REG_ALL    0x1000
#define F_REG_HIGH   0x2000  /* Half register: high half.  */
#define F_REG_HIGH   0x2000  /* Half register: high half.  */
 
 
enum machine_registers
enum machine_registers
{
{
  REG_R0    = T_REG_R, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
  REG_R0    = T_REG_R, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
  REG_P0    = T_REG_P, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
  REG_P0    = T_REG_P, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
  REG_I0    = T_REG_I, REG_I1, REG_I2, REG_I3,
  REG_I0    = T_REG_I, REG_I1, REG_I2, REG_I3,
  REG_M0    = T_REG_M, REG_M1, REG_M2, REG_M3,
  REG_M0    = T_REG_M, REG_M1, REG_M2, REG_M3,
  REG_B0    = T_REG_B, REG_B1, REG_B2, REG_B3,
  REG_B0    = T_REG_B, REG_B1, REG_B2, REG_B3,
  REG_L0    = T_REG_L, REG_L1, REG_L2, REG_L3,
  REG_L0    = T_REG_L, REG_L1, REG_L2, REG_L3,
  REG_A0x   = T_REG_A, REG_A0w, REG_A1x, REG_A1w,
  REG_A0x   = T_REG_A, REG_A0w, REG_A1x, REG_A1w,
  REG_ASTAT = 0x46,
  REG_ASTAT = 0x46,
  REG_RETS  = 0x47,
  REG_RETS  = 0x47,
  REG_LC0   = 0x60, REG_LT0, REG_LB0,  REG_LC1, REG_LT1, REG_LB1,
  REG_LC0   = 0x60, REG_LT0, REG_LB0,  REG_LC1, REG_LT1, REG_LB1,
              REG_CYCLES, REG_CYCLES2,
              REG_CYCLES, REG_CYCLES2,
  REG_USP   = 0x70, REG_SEQSTAT, REG_SYSCFG,
  REG_USP   = 0x70, REG_SEQSTAT, REG_SYSCFG,
              REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
              REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
 
 
/* These don't have groups.  */
/* These don't have groups.  */
  REG_sftreset = T_NOGROUP, REG_omode, REG_excause, REG_emucause,
  REG_sftreset = T_NOGROUP, REG_omode, REG_excause, REG_emucause,
                 REG_idle_req, REG_hwerrcause,
                 REG_idle_req, REG_hwerrcause,
  REG_A0       = 0xc0, REG_A1, REG_CC,
  REG_A0       = 0xc0, REG_A1, REG_CC,
/* Pseudo registers, used only for distinction from symbols.  */
/* Pseudo registers, used only for distinction from symbols.  */
                 REG_RL0, REG_RL1, REG_RL2, REG_RL3,
                 REG_RL0, REG_RL1, REG_RL2, REG_RL3,
                 REG_RL4, REG_RL5, REG_RL6, REG_RL7,
                 REG_RL4, REG_RL5, REG_RL6, REG_RL7,
                 REG_RH0, REG_RH1, REG_RH2, REG_RH3,
                 REG_RH0, REG_RH1, REG_RH2, REG_RH3,
                 REG_RH4, REG_RH5, REG_RH6, REG_RH7,
                 REG_RH4, REG_RH5, REG_RH6, REG_RH7,
                 REG_LASTREG
                 REG_LASTREG
};
};
 
 
/* Status register flags.  */
/* Status register flags.  */
 
 
enum statusflags
enum statusflags
{
{
  S_AZ = 0,
  S_AZ = 0,
  S_AN,
  S_AN,
  S_AQ = 6,
  S_AQ = 6,
  S_AC0 = 12,
  S_AC0 = 12,
  S_AC1,
  S_AC1,
  S_AV0 = 16,
  S_AV0 = 16,
  S_AV0S,
  S_AV0S,
  S_AV1,
  S_AV1,
  S_AV1S,
  S_AV1S,
  S_V = 24,
  S_V = 24,
  S_VS = 25
  S_VS = 25
};
};
 
 
 
 
enum reg_class
enum reg_class
{
{
  rc_dregs_lo,
  rc_dregs_lo,
  rc_dregs_hi,
  rc_dregs_hi,
  rc_dregs,
  rc_dregs,
  rc_dregs_pair,
  rc_dregs_pair,
  rc_pregs,
  rc_pregs,
  rc_spfp,
  rc_spfp,
  rc_dregs_hilo,
  rc_dregs_hilo,
  rc_accum_ext,
  rc_accum_ext,
  rc_accum_word,
  rc_accum_word,
  rc_accum,
  rc_accum,
  rc_iregs,
  rc_iregs,
  rc_mregs,
  rc_mregs,
  rc_bregs,
  rc_bregs,
  rc_lregs,
  rc_lregs,
  rc_dpregs,
  rc_dpregs,
  rc_gregs,
  rc_gregs,
  rc_regs,
  rc_regs,
  rc_statbits,
  rc_statbits,
  rc_ignore_bits,
  rc_ignore_bits,
  rc_ccstat,
  rc_ccstat,
  rc_counters,
  rc_counters,
  rc_dregs2_sysregs1,
  rc_dregs2_sysregs1,
  rc_open,
  rc_open,
  rc_sysregs2,
  rc_sysregs2,
  rc_sysregs3,
  rc_sysregs3,
  rc_allregs,
  rc_allregs,
  LIM_REG_CLASSES
  LIM_REG_CLASSES
};
};
 
 
/* mmod field.  */
/* mmod field.  */
#define M_S2RND 1
#define M_S2RND 1
#define M_T     2
#define M_T     2
#define M_W32   3
#define M_W32   3
#define M_FU    4
#define M_FU    4
#define M_TFU   6
#define M_TFU   6
#define M_IS    8
#define M_IS    8
#define M_ISS2  9
#define M_ISS2  9
#define M_IH    11
#define M_IH    11
#define M_IU    12
#define M_IU    12
 
 
/* Register type checking macros.  */
/* Register type checking macros.  */
 
 
#define CODE_MASK  0x07
#define CODE_MASK  0x07
#define CLASS_MASK 0xf0
#define CLASS_MASK 0xf0
 
 
#define REG_SAME(a, b)   ((a).regno == (b).regno)
#define REG_SAME(a, b)   ((a).regno == (b).regno)
#define REG_EQUAL(a, b)  (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
#define REG_EQUAL(a, b)  (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
#define REG_CLASS(a)     ((a.regno) & 0xf0)
#define REG_CLASS(a)     ((a.regno) & 0xf0)
#define IS_A1(a)         ((a).regno == REG_A1)
#define IS_A1(a)         ((a).regno == REG_A1)
#define IS_H(a)          ((a).regno & F_REG_HIGH ? 1: 0)
#define IS_H(a)          ((a).regno & F_REG_HIGH ? 1: 0)
#define IS_EVEN(r)       (r.regno % 2 == 0)
#define IS_EVEN(r)       (r.regno % 2 == 0)
#define IS_HCOMPL(a, b)  (REG_EQUAL(a, b) && \
#define IS_HCOMPL(a, b)  (REG_EQUAL(a, b) && \
                         ((a).regno & F_REG_HIGH) != ((b).regno & F_REG_HIGH))
                         ((a).regno & F_REG_HIGH) != ((b).regno & F_REG_HIGH))
 
 
/* register type checking.  */
/* register type checking.  */
#define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
#define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
 
 
#define IS_DREG(r)       _TYPECHECK(r, R)
#define IS_DREG(r)       _TYPECHECK(r, R)
#define IS_DREG_H(r)     (_TYPECHECK(r, R) && IS_H(r))
#define IS_DREG_H(r)     (_TYPECHECK(r, R) && IS_H(r))
#define IS_DREG_L(r)     (_TYPECHECK(r, R) && !IS_H(r))
#define IS_DREG_L(r)     (_TYPECHECK(r, R) && !IS_H(r))
#define IS_PREG(r)       _TYPECHECK(r, P)
#define IS_PREG(r)       _TYPECHECK(r, P)
#define IS_IREG(r)       (((r).regno & 0xf4) == T_REG_I)
#define IS_IREG(r)       (((r).regno & 0xf4) == T_REG_I)
#define IS_MREG(r)       (((r).regno & 0xf4) == T_REG_M)
#define IS_MREG(r)       (((r).regno & 0xf4) == T_REG_M)
#define IS_BREG(r)       (((r).regno & 0xf4) == T_REG_B)
#define IS_BREG(r)       (((r).regno & 0xf4) == T_REG_B)
#define IS_LREG(r)       (((r).regno & 0xf4) == T_REG_L)
#define IS_LREG(r)       (((r).regno & 0xf4) == T_REG_L)
#define IS_CREG(r)       ((r).regno == REG_LC0 || (r).regno == REG_LC1)
#define IS_CREG(r)       ((r).regno == REG_LC0 || (r).regno == REG_LC1)
#define IS_ALLREG(r)     ((r).regno < T_NOGROUP)
#define IS_ALLREG(r)     ((r).regno < T_NOGROUP)
 
 
/* Expression value macros.  */
/* Expression value macros.  */
 
 
typedef enum
typedef enum
{
{
  ones_compl,
  ones_compl,
  twos_compl,
  twos_compl,
  mult,
  mult,
  divide,
  divide,
  mod,
  mod,
  add,
  add,
  sub,
  sub,
  lsh,
  lsh,
  rsh,
  rsh,
  logand,
  logand,
  logior,
  logior,
  logxor
  logxor
} expr_opcodes_t;
} expr_opcodes_t;
 
 
struct expressionS;
struct expressionS;
 
 
#define SYMBOL_T       symbolS*
#define SYMBOL_T       symbolS*
 
 
struct expression_cell
struct expression_cell
{
{
  int value;
  int value;
  SYMBOL_T symbol;
  SYMBOL_T symbol;
};
};
 
 
/* User Type Definitions.  */
/* User Type Definitions.  */
struct bfin_insn
struct bfin_insn
{
{
  unsigned long value;
  unsigned long value;
  struct bfin_insn *next;
  struct bfin_insn *next;
  struct expression_cell *exp;
  struct expression_cell *exp;
  int pcrel;
  int pcrel;
  int reloc;
  int reloc;
};
};
 
 
#define INSTR_T struct bfin_insn*
#define INSTR_T struct bfin_insn*
#define EXPR_T  struct expression_cell* 
#define EXPR_T  struct expression_cell* 
 
 
typedef struct expr_node_struct Expr_Node;
typedef struct expr_node_struct Expr_Node;
 
 
extern INSTR_T gencode (unsigned long x);
extern INSTR_T gencode (unsigned long x);
extern INSTR_T conscode (INSTR_T head, INSTR_T tail);
extern INSTR_T conscode (INSTR_T head, INSTR_T tail);
extern INSTR_T conctcode (INSTR_T head, INSTR_T tail);
extern INSTR_T conctcode (INSTR_T head, INSTR_T tail);
extern INSTR_T note_reloc
extern INSTR_T note_reloc
       (INSTR_T code, Expr_Node *, int reloc,int pcrel);
       (INSTR_T code, Expr_Node *, int reloc,int pcrel);
extern INSTR_T note_reloc1
extern INSTR_T note_reloc1
       (INSTR_T code, const char * sym, int reloc, int pcrel);
       (INSTR_T code, const char * sym, int reloc, int pcrel);
extern INSTR_T note_reloc2
extern INSTR_T note_reloc2
       (INSTR_T code, const char *symbol, int reloc, int value, int pcrel);
       (INSTR_T code, const char *symbol, int reloc, int value, int pcrel);
 
 
/* Types of expressions.  */
/* Types of expressions.  */
typedef enum
typedef enum
{
{
  Expr_Node_Binop,              /* Binary operator.  */
  Expr_Node_Binop,              /* Binary operator.  */
  Expr_Node_Unop,               /* Unary operator.  */
  Expr_Node_Unop,               /* Unary operator.  */
  Expr_Node_Reloc,              /* Symbol to be relocated.  */
  Expr_Node_Reloc,              /* Symbol to be relocated.  */
  Expr_Node_GOT_Reloc,          /* Symbol to be relocated using the GOT.  */
  Expr_Node_GOT_Reloc,          /* Symbol to be relocated using the GOT.  */
  Expr_Node_Constant            /* Constant.  */
  Expr_Node_Constant            /* Constant.  */
} Expr_Node_Type;
} Expr_Node_Type;
 
 
/* Types of operators.  */
/* Types of operators.  */
typedef enum
typedef enum
{
{
  Expr_Op_Type_Add,
  Expr_Op_Type_Add,
  Expr_Op_Type_Sub,
  Expr_Op_Type_Sub,
  Expr_Op_Type_Mult,
  Expr_Op_Type_Mult,
  Expr_Op_Type_Div,
  Expr_Op_Type_Div,
  Expr_Op_Type_Mod,
  Expr_Op_Type_Mod,
  Expr_Op_Type_Lshift,
  Expr_Op_Type_Lshift,
  Expr_Op_Type_Rshift,
  Expr_Op_Type_Rshift,
  Expr_Op_Type_BAND,            /* Bitwise AND.  */
  Expr_Op_Type_BAND,            /* Bitwise AND.  */
  Expr_Op_Type_BOR,             /* Bitwise OR.  */
  Expr_Op_Type_BOR,             /* Bitwise OR.  */
  Expr_Op_Type_BXOR,            /* Bitwise exclusive OR.  */
  Expr_Op_Type_BXOR,            /* Bitwise exclusive OR.  */
  Expr_Op_Type_LAND,            /* Logical AND.  */
  Expr_Op_Type_LAND,            /* Logical AND.  */
  Expr_Op_Type_LOR,             /* Logical OR.  */
  Expr_Op_Type_LOR,             /* Logical OR.  */
  Expr_Op_Type_NEG,
  Expr_Op_Type_NEG,
  Expr_Op_Type_COMP             /* Complement.  */
  Expr_Op_Type_COMP             /* Complement.  */
} Expr_Op_Type;
} Expr_Op_Type;
 
 
/* The value that can be stored ... depends on type.  */
/* The value that can be stored ... depends on type.  */
typedef union
typedef union
{
{
  const char *s_value;          /* if relocation symbol, the text.  */
  const char *s_value;          /* if relocation symbol, the text.  */
  int i_value;                  /* if constant, the value.  */
  int i_value;                  /* if constant, the value.  */
  Expr_Op_Type op_value;        /* if operator, the value.  */
  Expr_Op_Type op_value;        /* if operator, the value.  */
} Expr_Node_Value;
} Expr_Node_Value;
 
 
/* The expression node.  */
/* The expression node.  */
struct expr_node_struct
struct expr_node_struct
{
{
  Expr_Node_Type        type;
  Expr_Node_Type        type;
  Expr_Node_Value       value;
  Expr_Node_Value       value;
  Expr_Node             *Left_Child;
  Expr_Node             *Left_Child;
  Expr_Node             *Right_Child;
  Expr_Node             *Right_Child;
};
};
 
 
 
 
/* Operations on the expression node.  */
/* Operations on the expression node.  */
Expr_Node *Expr_Node_Create (Expr_Node_Type type,
Expr_Node *Expr_Node_Create (Expr_Node_Type type,
                         Expr_Node_Value value,
                         Expr_Node_Value value,
                         Expr_Node *Left_Child,
                         Expr_Node *Left_Child,
                         Expr_Node *Right_Child);
                         Expr_Node *Right_Child);
 
 
/* Generate the reloc structure as a series of instructions.  */
/* Generate the reloc structure as a series of instructions.  */
INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
 
 
#define MKREF(x)        mkexpr (0,x)
#define MKREF(x)        mkexpr (0,x)
#define ALLOCATE(x)     malloc (x)
#define ALLOCATE(x)     malloc (x)
 
 
#define NULL_CODE ((INSTR_T) 0)
#define NULL_CODE ((INSTR_T) 0)
 
 
#ifndef EXPR_VALUE
#ifndef EXPR_VALUE
#define EXPR_VALUE(x)  (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
#define EXPR_VALUE(x)  (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
#endif
#endif
#ifndef EXPR_SYMBOL
#ifndef EXPR_SYMBOL
#define EXPR_SYMBOL(x) ((x)->symbol)
#define EXPR_SYMBOL(x) ((x)->symbol)
#endif
#endif
 
 
 
 
typedef long reg_t;
typedef long reg_t;
 
 
 
 
typedef struct _register
typedef struct _register
{
{
  reg_t regno;       /* Register ID as defined in machine_registers.  */
  reg_t regno;       /* Register ID as defined in machine_registers.  */
  int   flags;
  int   flags;
} Register;
} Register;
 
 
 
 
typedef struct _macfunc
typedef struct _macfunc
{
{
  char n;
  char n;
  char op;
  char op;
  char w;
  char w;
  char P;
  char P;
  Register dst;
  Register dst;
  Register s0;
  Register s0;
  Register s1;
  Register s1;
} Macfunc;
} Macfunc;
 
 
typedef struct _opt_mode
typedef struct _opt_mode
{
{
  int MM;
  int MM;
  int mod;
  int mod;
} Opt_mode;
} Opt_mode;
 
 
typedef enum
typedef enum
{
{
  SEMANTIC_ERROR,
  SEMANTIC_ERROR,
  NO_INSN_GENERATED,
  NO_INSN_GENERATED,
  INSN_GENERATED
  INSN_GENERATED
} parse_state;
} parse_state;
 
 
 
 
#ifdef __cplusplus
#ifdef __cplusplus
extern "C" {
extern "C" {
#endif
#endif
 
 
extern int debug_codeselection;
extern int debug_codeselection;
 
 
void error (char *format, ...);
void error (char *format, ...);
void warn (char *format, ...);
void warn (char *format, ...);
int  semantic_error (char *syntax);
int  semantic_error (char *syntax);
void semantic_error_2 (char *syntax);
void semantic_error_2 (char *syntax);
 
 
EXPR_T mkexpr (int, SYMBOL_T);
EXPR_T mkexpr (int, SYMBOL_T);
 
 
/* Defined in bfin-lex.l.  */
/* Defined in bfin-lex.l.  */
void set_start_state (void);
void set_start_state (void);
 
 
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
 
 
#endif  /* BFIN_PARSE_H */
#endif  /* BFIN_PARSE_H */
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.