X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=opcodes%2Farc-ext.h;h=9e41f5bb96d2bb643a7beebf21a6206874b32aa9;hb=90f61cceac73fe40dcd21b3590c247bfa624ac00;hp=8a7d7c4019afcbe4e5b8a8dfa1cd48d92b66934d;hpb=43e65147c07b1400ae0dbb6694882eceb2363713;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/arc-ext.h b/opcodes/arc-ext.h index 8a7d7c4019..9e41f5bb96 100644 --- a/opcodes/arc-ext.h +++ b/opcodes/arc-ext.h @@ -1,5 +1,5 @@ -/* ARC target-dependent stuff. Extension data structures. - Copyright (C) 1995-2015 Free Software Foundation, Inc. +/* ARC target-dependent stuff. Extension data structures. + Copyright (C) 1995-2016 Free Software Foundation, Inc. This file is part of libopcodes. @@ -18,46 +18,125 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef ARCEXT_H -#define ARCEXT_H +/*This header file defines a table of extensions to the ARC processor + architecture. These extensions are read from the '.arcextmap' or + '.gnu.linkonce.arcextmap..' sections in the ELF file which + is identified by the bfd parameter to the build_ARC_extmap function. -enum {EXT_INSTRUCTION = 0, - EXT_CORE_REGISTER = 1, - EXT_AUX_REGISTER = 2, - EXT_COND_CODE = 3}; + These extensions may include: + core registers + auxiliary registers + instructions + condition codes -enum {NUM_EXT_INST = (0x1f-0x10+1) + (0x3f-0x09+1)}; -enum {NUM_EXT_CORE = 59-32+1}; -enum {NUM_EXT_COND = 0x1f-0x10+1}; + Once the table has been constructed, accessor functions may be used + to retrieve information from it. -struct ExtInstruction + The build_ARC_extmap constructor function build_ARC_extmap may be + called as many times as required; it will re-initialize the table + each time. */ + +#ifndef ARC_EXTENSIONS_H +#define ARC_EXTENSIONS_H + +#include "opcode/arc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IGNORE_FIRST_OPD 1 + +/* Define this if we do not want to encode instructions based on the + ARCompact Programmer's Reference. */ +#define UNMANGLED + +/* This defines the kinds of extensions which may be read from the + ections in the executable files. */ +enum ExtOperType { - char flags; - char *name; + EXT_INSTRUCTION = 0, + EXT_CORE_REGISTER = 1, + EXT_AUX_REGISTER = 2, + EXT_COND_CODE = 3, + EXT_INSTRUCTION32 = 4, + EXT_AC_INSTRUCTION = 4, + EXT_REMOVE_CORE_REG = 5, + EXT_LONG_CORE_REGISTER = 6, + EXT_AUX_REGISTER_EXTENDED = 7, + EXT_INSTRUCTION32_EXTENDED = 8, + EXT_CORE_REGISTER_CLASS = 9 }; -struct ExtAuxRegister +enum ExtReadWrite { - long address; - char *name; - struct ExtAuxRegister *next; + REG_INVALID, + REG_READ, + REG_WRITE, + REG_READWRITE }; -struct arcExtMap +/* Macro used when generating the patterns for an extension + instruction. */ +#define INSERT_XOP(OP, NAME, CODE, MASK, CPU, ARG, FLG) \ + do { \ + (OP)->name = NAME; \ + (OP)->opcode = CODE; \ + (OP)->mask = MASK; \ + (OP)->cpu = CPU; \ + (OP)->insn_class = ARITH; \ + (OP)->subclass = NONE; \ + memcpy ((OP)->operands, (ARG), MAX_INSN_ARGS); \ + memcpy ((OP)->flags, (FLG), MAX_INSN_FLGS); \ + (OP++); \ + } while (0) + +/* Typedef to hold the extension instruction definition. */ +typedef struct ExtInstruction { - struct ExtAuxRegister *auxRegisters; - struct ExtInstruction *instructions[NUM_EXT_INST]; - char *coreRegisters[NUM_EXT_CORE]; - char *condCodes[NUM_EXT_COND]; -}; + /* Name. */ + char *name; -extern int arcExtMap_add(void*, unsigned long); -extern const char *arcExtMap_coreRegName(int); -extern const char *arcExtMap_auxRegName(long); -extern const char *arcExtMap_condCodeName(int); -extern const char *arcExtMap_instName(int, int, int*); -extern void build_ARC_extmap(bfd *); + /* Major opcode. */ + char major; -#define IGNORE_FIRST_OPD 1 + /* Minor(sub) opcode. */ + char minor; + + /* Flags, holds the syntax class and modifiers. */ + char flags; + + /* Syntax class. Use by assembler. */ + unsigned char syntax; + + /* Syntax class modifier. Used by assembler. */ + unsigned char modsyn; + /* Suffix class. Used by assembler. */ + unsigned char suffix; + + /* Pointer to the next extension instruction. */ + struct ExtInstruction* next; +} extInstruction_t; + +/* Constructor function. */ +extern void build_ARC_extmap (bfd *); + +/* Accessor functions. */ +extern enum ExtReadWrite arcExtMap_coreReadWrite (int); +extern const char * arcExtMap_coreRegName (int); +extern const char * arcExtMap_auxRegName (long); +extern const char * arcExtMap_condCodeName (int); +extern const extInstruction_t *arcExtMap_insn (int, int); +extern struct arc_opcode *arcExtMap_genOpcode (const extInstruction_t *, + unsigned arc_target, + const char **errmsg); + +/* Dump function (for debugging). */ +extern void dump_ARC_extmap (void); + +#ifdef __cplusplus +} #endif + +#endif /* ARC_EXTENSIONS_H */