Home | History | Annotate | Download | only in opcodes
      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