1/* ARC target-dependent stuff.  Extension data structures.
2   Copyright (C) 1995-2017 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
45extern "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.  */
56enum 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
71enum 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.  */
95typedef 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.  */
123extern void build_ARC_extmap (bfd *);
124
125/* Accessor functions.  */
126extern enum ExtReadWrite arcExtMap_coreReadWrite (int);
127extern const char * arcExtMap_coreRegName (int);
128extern const char * arcExtMap_auxRegName (long);
129extern const char * arcExtMap_condCodeName (int);
130extern const extInstruction_t *arcExtMap_insn (int, unsigned long long);
131extern struct arc_opcode *arcExtMap_genOpcode (const extInstruction_t *,
132					       unsigned arc_target,
133					       const char **errmsg);
134
135/* Dump function (for debugging).  */
136extern void dump_ARC_extmap (void);
137
138#ifdef __cplusplus
139}
140#endif
141
142#endif /* ARC_EXTENSIONS_H */
143