1 /* ARC target-dependent stuff. Extension data structures. 2 Copyright (C) 1995-2016 Free Software Foundation, Inc. 3 4 This file is part of libopcodes. 5 6 This library is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 It is distributed in the hope that it will be useful, but WITHOUT 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 14 License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 /*This header file defines a table of extensions to the ARC processor 22 architecture. These extensions are read from the '.arcextmap' or 23 '.gnu.linkonce.arcextmap.<type>.<N>' sections in the ELF file which 24 is identified by the bfd parameter to the build_ARC_extmap function. 25 26 These extensions may include: 27 core registers 28 auxiliary registers 29 instructions 30 condition codes 31 32 Once the table has been constructed, accessor functions may be used 33 to retrieve information from it. 34 35 The build_ARC_extmap constructor function build_ARC_extmap may be 36 called as many times as required; it will re-initialize the table 37 each time. */ 38 39 #ifndef ARC_EXTENSIONS_H 40 #define ARC_EXTENSIONS_H 41 42 #include "opcode/arc.h" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 #define IGNORE_FIRST_OPD 1 49 50 /* Define this if we do not want to encode instructions based on the 51 ARCompact Programmer's Reference. */ 52 #define UNMANGLED 53 54 /* This defines the kinds of extensions which may be read from the 55 ections in the executable files. */ 56 enum ExtOperType 57 { 58 EXT_INSTRUCTION = 0, 59 EXT_CORE_REGISTER = 1, 60 EXT_AUX_REGISTER = 2, 61 EXT_COND_CODE = 3, 62 EXT_INSTRUCTION32 = 4, 63 EXT_AC_INSTRUCTION = 4, 64 EXT_REMOVE_CORE_REG = 5, 65 EXT_LONG_CORE_REGISTER = 6, 66 EXT_AUX_REGISTER_EXTENDED = 7, 67 EXT_INSTRUCTION32_EXTENDED = 8, 68 EXT_CORE_REGISTER_CLASS = 9 69 }; 70 71 enum ExtReadWrite 72 { 73 REG_INVALID, 74 REG_READ, 75 REG_WRITE, 76 REG_READWRITE 77 }; 78 79 /* Macro used when generating the patterns for an extension 80 instruction. */ 81 #define INSERT_XOP(OP, NAME, CODE, MASK, CPU, ARG, FLG) \ 82 do { \ 83 (OP)->name = NAME; \ 84 (OP)->opcode = CODE; \ 85 (OP)->mask = MASK; \ 86 (OP)->cpu = CPU; \ 87 (OP)->insn_class = ARITH; \ 88 (OP)->subclass = NONE; \ 89 memcpy ((OP)->operands, (ARG), MAX_INSN_ARGS); \ 90 memcpy ((OP)->flags, (FLG), MAX_INSN_FLGS); \ 91 (OP++); \ 92 } while (0) 93 94 /* Typedef to hold the extension instruction definition. */ 95 typedef struct ExtInstruction 96 { 97 /* Name. */ 98 char *name; 99 100 /* Major opcode. */ 101 char major; 102 103 /* Minor(sub) opcode. */ 104 char minor; 105 106 /* Flags, holds the syntax class and modifiers. */ 107 char flags; 108 109 /* Syntax class. Use by assembler. */ 110 unsigned char syntax; 111 112 /* Syntax class modifier. Used by assembler. */ 113 unsigned char modsyn; 114 115 /* Suffix class. Used by assembler. */ 116 unsigned char suffix; 117 118 /* Pointer to the next extension instruction. */ 119 struct ExtInstruction* next; 120 } extInstruction_t; 121 122 /* Constructor function. */ 123 extern void build_ARC_extmap (bfd *); 124 125 /* Accessor functions. */ 126 extern enum ExtReadWrite arcExtMap_coreReadWrite (int); 127 extern const char * arcExtMap_coreRegName (int); 128 extern const char * arcExtMap_auxRegName (long); 129 extern const char * arcExtMap_condCodeName (int); 130 extern const extInstruction_t *arcExtMap_insn (int, int); 131 extern struct arc_opcode *arcExtMap_genOpcode (const extInstruction_t *, 132 unsigned arc_target, 133 const char **errmsg); 134 135 /* Dump function (for debugging). */ 136 extern void dump_ARC_extmap (void); 137 138 #ifdef __cplusplus 139 } 140 #endif 141 142 #endif /* ARC_EXTENSIONS_H */ 143