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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [config/] [xtensa-relax.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
/* Table of relaxations for Xtensa assembly.
/* Table of relaxations for Xtensa assembly.
   Copyright 2003, 2004, 2007 Free Software Foundation, Inc.
   Copyright 2003, 2004, 2007 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
   along with GAS; see the file COPYING.  If not, write to
   the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
   the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
 
 
#ifndef XTENSA_RELAX_H
#ifndef XTENSA_RELAX_H
#define XTENSA_RELAX_H
#define XTENSA_RELAX_H
 
 
#include "xtensa-isa.h"
#include "xtensa-isa.h"
 
 
 
 
/* Data structures for the table-driven relaxations for Xtensa processors.
/* Data structures for the table-driven relaxations for Xtensa processors.
   See xtensa-relax.c for details.  */
   See xtensa-relax.c for details.  */
 
 
typedef struct transition_list TransitionList;
typedef struct transition_list TransitionList;
typedef struct transition_table TransitionTable;
typedef struct transition_table TransitionTable;
typedef struct transition_rule TransitionRule;
typedef struct transition_rule TransitionRule;
typedef struct precondition_list PreconditionList;
typedef struct precondition_list PreconditionList;
typedef struct precondition Precondition;
typedef struct precondition Precondition;
 
 
typedef struct req_or_option_list ReqOrOptionList;
typedef struct req_or_option_list ReqOrOptionList;
typedef struct req_or_option_list ReqOrOption;
typedef struct req_or_option_list ReqOrOption;
typedef struct req_option_list ReqOptionList;
typedef struct req_option_list ReqOptionList;
typedef struct req_option_list ReqOption;
typedef struct req_option_list ReqOption;
 
 
struct transition_table
struct transition_table
{
{
  int num_opcodes;
  int num_opcodes;
  TransitionList **table;       /* Possible transitions for each opcode.  */
  TransitionList **table;       /* Possible transitions for each opcode.  */
};
};
 
 
struct transition_list
struct transition_list
{
{
  TransitionRule *rule;
  TransitionRule *rule;
  TransitionList *next;
  TransitionList *next;
};
};
 
 
struct precondition_list
struct precondition_list
{
{
  Precondition *precond;
  Precondition *precond;
  PreconditionList *next;
  PreconditionList *next;
};
};
 
 
 
 
/* The required options for a rule are represented with a two-level
/* The required options for a rule are represented with a two-level
   structure, with leaf expressions combined by logical ORs at the
   structure, with leaf expressions combined by logical ORs at the
   lower level, and the results then combined by logical ANDs at the
   lower level, and the results then combined by logical ANDs at the
   top level.  The AND terms are linked in a list, and each one can
   top level.  The AND terms are linked in a list, and each one can
   contain a reference to a list of OR terms.  The leaf expressions,
   contain a reference to a list of OR terms.  The leaf expressions,
   i.e., the OR options, can be negated by setting the is_true field
   i.e., the OR options, can be negated by setting the is_true field
   to FALSE.  There are two classes of leaf expressions: (1) those
   to FALSE.  There are two classes of leaf expressions: (1) those
   that are properties of the Xtensa configuration and can be
   that are properties of the Xtensa configuration and can be
   evaluated once when building the tables, and (2) those that depend
   evaluated once when building the tables, and (2) those that depend
   of the state of directives or other settings that may vary during
   of the state of directives or other settings that may vary during
   the assembly.  The following expressions may be used in group (1):
   the assembly.  The following expressions may be used in group (1):
 
 
   IsaUse*:     Xtensa configuration settings.
   IsaUse*:     Xtensa configuration settings.
   realnop:     TRUE if the instruction set includes a NOP instruction.
   realnop:     TRUE if the instruction set includes a NOP instruction.
 
 
   There are currently no expressions in group (2), but they are still
   There are currently no expressions in group (2), but they are still
   supported since there is a good chance they'll be needed again for
   supported since there is a good chance they'll be needed again for
   something.  */
   something.  */
 
 
struct req_option_list
struct req_option_list
{
{
  ReqOrOptionList *or_option_terms;
  ReqOrOptionList *or_option_terms;
  ReqOptionList *next;
  ReqOptionList *next;
};
};
 
 
struct req_or_option_list
struct req_or_option_list
{
{
  char *option_name;
  char *option_name;
  bfd_boolean is_true;
  bfd_boolean is_true;
  ReqOrOptionList *next;
  ReqOrOptionList *next;
};
};
 
 
/* Operand types and constraints on operands:  */
/* Operand types and constraints on operands:  */
 
 
typedef enum op_type OpType;
typedef enum op_type OpType;
typedef enum cmp_op CmpOp;
typedef enum cmp_op CmpOp;
 
 
enum op_type
enum op_type
{
{
  OP_CONSTANT,
  OP_CONSTANT,
  OP_OPERAND,
  OP_OPERAND,
  OP_OPERAND_LOW8,              /* Sign-extended low 8 bits of immed.  */
  OP_OPERAND_LOW8,              /* Sign-extended low 8 bits of immed.  */
  OP_OPERAND_HI24S,             /* High 24 bits of immed,
  OP_OPERAND_HI24S,             /* High 24 bits of immed,
                                   plus 0x100 if low 8 bits are signed.  */
                                   plus 0x100 if low 8 bits are signed.  */
  OP_OPERAND_F32MINUS,          /* 32 - immed.  */
  OP_OPERAND_F32MINUS,          /* 32 - immed.  */
  OP_OPERAND_LOW16U,            /* Low 16 bits of immed.  */
  OP_OPERAND_LOW16U,            /* Low 16 bits of immed.  */
  OP_OPERAND_HI16U,             /* High 16 bits of immed.  */
  OP_OPERAND_HI16U,             /* High 16 bits of immed.  */
  OP_LITERAL,
  OP_LITERAL,
  OP_LABEL
  OP_LABEL
};
};
 
 
enum cmp_op
enum cmp_op
{
{
  OP_EQUAL,
  OP_EQUAL,
  OP_NOTEQUAL,
  OP_NOTEQUAL,
};
};
 
 
struct precondition
struct precondition
{
{
  CmpOp cmp;
  CmpOp cmp;
  int op_num;
  int op_num;
  OpType typ;                   /* CONSTANT: op_data is a constant.
  OpType typ;                   /* CONSTANT: op_data is a constant.
                                   OPERAND: operand op_num must equal op_data.
                                   OPERAND: operand op_num must equal op_data.
                                   Cannot be LITERAL or LABEL.  */
                                   Cannot be LITERAL or LABEL.  */
  int op_data;
  int op_data;
};
};
 
 
 
 
typedef struct build_op BuildOp;
typedef struct build_op BuildOp;
 
 
struct build_op
struct build_op
{
{
  int op_num;
  int op_num;
  OpType typ;
  OpType typ;
  unsigned op_data;             /* CONSTANT: op_data is the value to encode.
  unsigned op_data;             /* CONSTANT: op_data is the value to encode.
                                   OPERAND: op_data is the field in the
                                   OPERAND: op_data is the field in the
                                   source instruction to take the value from
                                   source instruction to take the value from
                                   and encode in the op_num field here.
                                   and encode in the op_num field here.
                                   LITERAL or LABEL: unused.  */
                                   LITERAL or LABEL: unused.  */
  BuildOp *next;
  BuildOp *next;
};
};
 
 
typedef struct build_instr BuildInstr;
typedef struct build_instr BuildInstr;
typedef enum instr_type InstrType;
typedef enum instr_type InstrType;
 
 
enum instr_type
enum instr_type
{
{
  INSTR_INSTR,
  INSTR_INSTR,
  INSTR_LITERAL_DEF,
  INSTR_LITERAL_DEF,
  INSTR_LABEL_DEF
  INSTR_LABEL_DEF
};
};
 
 
struct build_instr
struct build_instr
{
{
  InstrType typ;
  InstrType typ;
  xtensa_opcode opcode;         /* Unused for LITERAL_DEF or LABEL_DEF.  */
  xtensa_opcode opcode;         /* Unused for LITERAL_DEF or LABEL_DEF.  */
  BuildOp *ops;
  BuildOp *ops;
  BuildInstr *next;
  BuildInstr *next;
};
};
 
 
struct transition_rule
struct transition_rule
{
{
  xtensa_opcode opcode;
  xtensa_opcode opcode;
  PreconditionList *conditions;
  PreconditionList *conditions;
  ReqOptionList *options;
  ReqOptionList *options;
  BuildInstr *to_instr;
  BuildInstr *to_instr;
};
};
 
 
typedef int (*transition_cmp_fn) (const TransitionRule *,
typedef int (*transition_cmp_fn) (const TransitionRule *,
                                  const TransitionRule *);
                                  const TransitionRule *);
 
 
extern TransitionTable *xg_build_simplify_table (transition_cmp_fn);
extern TransitionTable *xg_build_simplify_table (transition_cmp_fn);
extern TransitionTable *xg_build_widen_table (transition_cmp_fn);
extern TransitionTable *xg_build_widen_table (transition_cmp_fn);
 
 
extern bfd_boolean xg_has_userdef_op_fn (OpType);
extern bfd_boolean xg_has_userdef_op_fn (OpType);
extern long xg_apply_userdef_op_fn (OpType, long);
extern long xg_apply_userdef_op_fn (OpType, long);
 
 
#endif /* !XTENSA_RELAX_H */
#endif /* !XTENSA_RELAX_H */
 
 

powered by: WebSVN 2.1.0

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