X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=opcodes%2Farc-ext.h;h=e18e568c7a2942fb1c394e93afa00fecf8e2694d;hb=488d02fe7729dda5b9414a3942df68e0c316ce53;hp=c5888fbd7be7f82eaa656cb25c398a759d1afea1;hpb=f4321104139af96b8cc3d4946b4e5233d9fa1eab;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/arc-ext.h b/opcodes/arc-ext.h index c5888fbd7b..e18e568c7a 100644 --- a/opcodes/arc-ext.h +++ b/opcodes/arc-ext.h @@ -1,62 +1,142 @@ -/* ARC target-dependent stuff. Extension data structures. - Copyright 1995, 1997, 2000, 2001, 2005 Free Software Foundation, Inc. +/* ARC target-dependent stuff. Extension data structures. + Copyright (C) 1995-2019 Free Software Foundation, Inc. -This file is part of GDB. + This file is part of libopcodes. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + It is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + 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 -{ - char flags; - char *name; -}; + 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 -struct ExtAuxRegister +#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 { - long address; - char *name; - struct ExtAuxRegister *next; + 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 arcExtMap +enum ExtReadWrite { - struct ExtAuxRegister *auxRegisters; - struct ExtInstruction *instructions[NUM_EXT_INST]; - char *coreRegisters[NUM_EXT_CORE]; - char *condCodes[NUM_EXT_COND]; + REG_INVALID, + REG_READ, + REG_WRITE, + REG_READWRITE }; -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 *); +/* 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) -#define IGNORE_FIRST_OPD 1 +/* Typedef to hold the extension instruction definition. */ +typedef struct ExtInstruction +{ + /* Name. */ + char *name; + + /* Major opcode. */ + char major; + + /* 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, unsigned long long); +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 */