Blame include/xtensa-isa-internal.h

Packit bbfece
/* Internal definitions for configurable Xtensa ISA support.
Packit bbfece
   Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This file is part of BFD, the Binary File Descriptor library.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
Packit bbfece
   USA.  */
Packit bbfece
Packit bbfece
#ifndef XTENSA_ISA_INTERNAL_H
Packit bbfece
#define XTENSA_ISA_INTERNAL_H
Packit bbfece
Packit bbfece
/* Flags.  */
Packit bbfece
Packit bbfece
#define XTENSA_OPERAND_IS_REGISTER	0x00000001
Packit bbfece
#define XTENSA_OPERAND_IS_PCRELATIVE	0x00000002
Packit bbfece
#define XTENSA_OPERAND_IS_INVISIBLE	0x00000004
Packit bbfece
#define XTENSA_OPERAND_IS_UNKNOWN	0x00000008
Packit bbfece
Packit bbfece
#define XTENSA_OPCODE_IS_BRANCH		0x00000001
Packit bbfece
#define XTENSA_OPCODE_IS_JUMP		0x00000002
Packit bbfece
#define XTENSA_OPCODE_IS_LOOP		0x00000004
Packit bbfece
#define XTENSA_OPCODE_IS_CALL		0x00000008
Packit bbfece
Packit bbfece
#define XTENSA_STATE_IS_EXPORTED	0x00000001
Packit bbfece
#define XTENSA_STATE_IS_SHARED_OR	0x00000002
Packit bbfece
Packit bbfece
#define XTENSA_INTERFACE_HAS_SIDE_EFFECT 0x00000001
Packit bbfece
Packit bbfece
/* Function pointer typedefs */
Packit bbfece
typedef void (*xtensa_format_encode_fn) (xtensa_insnbuf);
Packit bbfece
typedef void (*xtensa_get_slot_fn) (const xtensa_insnbuf, xtensa_insnbuf);
Packit bbfece
typedef void (*xtensa_set_slot_fn) (xtensa_insnbuf, const xtensa_insnbuf);
Packit bbfece
typedef int (*xtensa_opcode_decode_fn) (const xtensa_insnbuf);
Packit bbfece
typedef uint32 (*xtensa_get_field_fn) (const xtensa_insnbuf);
Packit bbfece
typedef void (*xtensa_set_field_fn) (xtensa_insnbuf, uint32);
Packit bbfece
typedef int (*xtensa_immed_decode_fn) (uint32 *);
Packit bbfece
typedef int (*xtensa_immed_encode_fn) (uint32 *);
Packit bbfece
typedef int (*xtensa_do_reloc_fn) (uint32 *, uint32);
Packit bbfece
typedef int (*xtensa_undo_reloc_fn) (uint32 *, uint32);
Packit bbfece
typedef void (*xtensa_opcode_encode_fn) (xtensa_insnbuf);
Packit bbfece
typedef int (*xtensa_format_decode_fn) (const xtensa_insnbuf);
Packit bbfece
typedef int (*xtensa_length_decode_fn) (const unsigned char *);
Packit bbfece
Packit bbfece
typedef struct xtensa_format_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Instruction format name.  */
Packit bbfece
  int length;				/* Instruction length in bytes.  */
Packit bbfece
  xtensa_format_encode_fn encode_fn;
Packit bbfece
  int num_slots;
Packit bbfece
  int *slot_id;				/* Array[num_slots] of slot IDs.  */
Packit bbfece
} xtensa_format_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_slot_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Not necessarily unique.  */
Packit bbfece
  const char *format;
Packit bbfece
  int position;
Packit bbfece
  xtensa_get_slot_fn get_fn;
Packit bbfece
  xtensa_set_slot_fn set_fn;
Packit bbfece
  xtensa_get_field_fn *get_field_fns;	/* Array[field_id].  */
Packit bbfece
  xtensa_set_field_fn *set_field_fns;	/* Array[field_id].  */
Packit bbfece
  xtensa_opcode_decode_fn opcode_decode_fn;
Packit bbfece
  const char *nop_name;
Packit bbfece
} xtensa_slot_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_operand_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;
Packit bbfece
  int field_id;
Packit bbfece
  xtensa_regfile regfile;		/* Register file.  */
Packit bbfece
  int num_regs;				/* Usually 1; 2 for reg pairs, etc.  */
Packit bbfece
  uint32 flags;				/* See XTENSA_OPERAND_* flags.  */
Packit bbfece
  xtensa_immed_encode_fn encode;	/* Encode the operand value.  */
Packit bbfece
  xtensa_immed_decode_fn decode;	/* Decode the value from the field.  */
Packit bbfece
  xtensa_do_reloc_fn do_reloc;		/* Perform a PC-relative reloc.  */
Packit bbfece
  xtensa_undo_reloc_fn undo_reloc;	/* Undo a PC-relative relocation.  */
Packit bbfece
} xtensa_operand_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_arg_internal_struct
Packit bbfece
{
Packit bbfece
  union {
Packit bbfece
    int operand_id;			/* For normal operands.  */
Packit bbfece
    xtensa_state state;			/* For stateOperands.  */
Packit bbfece
  } u;
Packit bbfece
  char inout;				/* Direction: 'i', 'o', or 'm'.  */
Packit bbfece
} xtensa_arg_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_iclass_internal_struct
Packit bbfece
{
Packit bbfece
  int num_operands;			/* Size of "operands" array.  */
Packit bbfece
  xtensa_arg_internal *operands;	/* Array[num_operands].  */
Packit bbfece
Packit bbfece
  int num_stateOperands;		/* Size of "stateOperands" array.  */
Packit bbfece
  xtensa_arg_internal *stateOperands;	/* Array[num_stateOperands].  */
Packit bbfece
Packit bbfece
  int num_interfaceOperands;		/* Size of "interfaceOperands".  */
Packit bbfece
  xtensa_interface *interfaceOperands;	/* Array[num_interfaceOperands].  */
Packit bbfece
} xtensa_iclass_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_opcode_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Opcode mnemonic.  */
Packit bbfece
  int iclass_id;			/* Iclass for this opcode.  */
Packit bbfece
  uint32 flags;				/* See XTENSA_OPCODE_* flags.  */
Packit bbfece
  xtensa_opcode_encode_fn *encode_fns;	/* Array[slot_id].  */
Packit bbfece
  int num_funcUnit_uses;		/* Number of funcUnit_use entries.  */
Packit bbfece
  xtensa_funcUnit_use *funcUnit_uses;	/* Array[num_funcUnit_uses].  */
Packit bbfece
} xtensa_opcode_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_regfile_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Full name of the regfile.  */
Packit bbfece
  const char *shortname;		/* Abbreviated name.  */
Packit bbfece
  xtensa_regfile parent;		/* View parent (or identity).  */
Packit bbfece
  int num_bits;				/* Width of the registers.  */
Packit bbfece
  int num_entries;			/* Number of registers.  */
Packit bbfece
} xtensa_regfile_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_interface_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Interface name.  */
Packit bbfece
  int num_bits;				/* Width of the interface.  */
Packit bbfece
  uint32 flags;				/* See XTENSA_INTERFACE_* flags.  */
Packit bbfece
  int class_id;				/* Class of related interfaces.  */
Packit bbfece
  char inout;				/* "i" or "o".  */
Packit bbfece
} xtensa_interface_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_funcUnit_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Functional unit name.  */
Packit bbfece
  int num_copies;			/* Number of instances.  */
Packit bbfece
} xtensa_funcUnit_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_state_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* State name.  */
Packit bbfece
  int num_bits;				/* Number of state bits.  */
Packit bbfece
  uint32 flags;				/* See XTENSA_STATE_* flags.  */
Packit bbfece
} xtensa_state_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_sysreg_internal_struct
Packit bbfece
{
Packit bbfece
  const char *name;			/* Register name.  */
Packit bbfece
  int number;				/* Register number.  */
Packit bbfece
  int is_user;				/* Non-zero if a "user register".  */
Packit bbfece
} xtensa_sysreg_internal;
Packit bbfece
Packit bbfece
typedef struct xtensa_lookup_entry_struct
Packit bbfece
{
Packit bbfece
  const char *key;
Packit bbfece
  union
Packit bbfece
  {
Packit bbfece
    xtensa_opcode opcode;		/* Internal opcode number.  */
Packit bbfece
    xtensa_sysreg sysreg;		/* Internal sysreg number.  */
Packit bbfece
    xtensa_state state;			/* Internal state number.  */
Packit bbfece
    xtensa_interface intf;		/* Internal interface number.  */
Packit bbfece
    xtensa_funcUnit fun;		/* Internal funcUnit number.  */
Packit bbfece
  } u;
Packit bbfece
} xtensa_lookup_entry;
Packit bbfece
Packit bbfece
typedef struct xtensa_isa_internal_struct
Packit bbfece
{
Packit bbfece
  int is_big_endian;			/* Endianness.  */
Packit bbfece
  int insn_size;			/* Maximum length in bytes.  */
Packit bbfece
  int insnbuf_size;			/* Number of insnbuf_words.  */
Packit bbfece
Packit bbfece
  int num_formats;
Packit bbfece
  xtensa_format_internal *formats;
Packit bbfece
  xtensa_format_decode_fn format_decode_fn;
Packit bbfece
  xtensa_length_decode_fn length_decode_fn;
Packit bbfece
Packit bbfece
  int num_slots;
Packit bbfece
  xtensa_slot_internal *slots;
Packit bbfece
Packit bbfece
  int num_fields;
Packit bbfece
Packit bbfece
  int num_operands;
Packit bbfece
  xtensa_operand_internal *operands;
Packit bbfece
Packit bbfece
  int num_iclasses;
Packit bbfece
  xtensa_iclass_internal *iclasses;
Packit bbfece
Packit bbfece
  int num_opcodes;
Packit bbfece
  xtensa_opcode_internal *opcodes;
Packit bbfece
  xtensa_lookup_entry *opname_lookup_table;
Packit bbfece
Packit bbfece
  int num_regfiles;
Packit bbfece
  xtensa_regfile_internal *regfiles;
Packit bbfece
Packit bbfece
  int num_states;
Packit bbfece
  xtensa_state_internal *states;
Packit bbfece
  xtensa_lookup_entry *state_lookup_table;
Packit bbfece
Packit bbfece
  int num_sysregs;
Packit bbfece
  xtensa_sysreg_internal *sysregs;
Packit bbfece
  xtensa_lookup_entry *sysreg_lookup_table;
Packit bbfece
Packit bbfece
  /* The current Xtensa ISA only supports 256 of each kind of sysreg so
Packit bbfece
     we can get away with implementing lookups with tables indexed by
Packit bbfece
     the register numbers.  If we ever allow larger sysreg numbers, this
Packit bbfece
     may have to be reimplemented.  The first entry in the following
Packit bbfece
     arrays corresponds to "special" registers and the second to "user"
Packit bbfece
     registers.  */
Packit bbfece
  int max_sysreg_num[2];
Packit bbfece
  xtensa_sysreg *sysreg_table[2];
Packit bbfece
Packit bbfece
  int num_interfaces;
Packit bbfece
  xtensa_interface_internal *interfaces;
Packit bbfece
  xtensa_lookup_entry *interface_lookup_table;
Packit bbfece
Packit bbfece
  int num_funcUnits;
Packit bbfece
  xtensa_funcUnit_internal *funcUnits;
Packit bbfece
  xtensa_lookup_entry *funcUnit_lookup_table;
Packit bbfece
Packit bbfece
} xtensa_isa_internal;
Packit bbfece
Packit bbfece
extern int xtensa_isa_name_compare (const void *, const void *);
Packit bbfece
Packit bbfece
extern xtensa_isa_status xtisa_errno;
Packit bbfece
extern char xtisa_error_msg[];
Packit bbfece
Packit bbfece
#endif /* !XTENSA_ISA_INTERNAL_H */