bdfe53e3cf
The current handling for arc instructions longer than 32-bits is all handled as a special case in both the assembler and disassembler. The problem with this approach is that it leads to code duplication, selecting a long instruction is exactly the same process as selecting a short instruction, except over more bits, in both cases we select based on bit comparison, and initial operand insertion and extraction. This commit unifies both the long and short instruction worlds, converting the core opcodes library from being largely 32-bit focused, to being largely 64-bit focused. The changes are, on the whole, not too much. There's obviously a lot of type changes but otherwise the bulk of the code just works. Most of the actual functional changes are to code that previously handled the longer 48 or 64 bit instructions. The insert/extract handlers for these have now been brought into line with the short instruction insert/extract handlers. All of the special case handling code that was previously added has now been removed again. Overall, this commit reduces the amount of code in the arc assembler and disassembler. gas/ChangeLog: * config/tc-arc.c (struct arc_insn): Change type of insn field. (md_number_to_chars_midend): Support 6- and 8-byte values. (emit_insn0): Update debug output. (find_opcode_match): Likewise. (build_fake_opcode_hash_entry): Delete. (find_special_case_long_opcode): Delete. (find_special_case): Remove long format special case handling. (insert_operand): Change instruction type and update debug print format. (assemble_insn): Change instruction type, update debug print formats, and remove unneeded assert. include/ChangeLog: * opcode/arc.h (struct arc_opcode): Change type of opcode and mask fields. (struct arc_long_opcode): Delete. (struct arc_operand): Change types for insert and extract handlers. opcodes/ChangeLog: * arc-dis.c (struct arc_operand_iterator): Remove all fields relating to long instruction processing, add new limm field. (OPCODE): Rename to... (OPCODE_32BIT_INSN): ...this. (OPCODE_AC): Delete. (skip_this_opcode): Handle different instruction lengths, update macro name. (special_flag_p): Update parameter type. (find_format_from_table): Update for more instruction lengths. (find_format_long_instructions): Delete. (find_format): Update for more instruction lengths. (arc_insn_length): Likewise. (extract_operand_value): Update for more instruction lengths. (operand_iterator_next): Remove code relating to long instructions. (arc_opcode_to_insn_type): New function. (print_insn_arc):Update for more instructions lengths. * arc-ext.c (extInstruction_t): Change argument type. * arc-ext.h (extInstruction_t): Change argument type. * arc-fxi.h: Change type unsigned to unsigned long long extensively throughout. * arc-nps400-tbl.h: Add long instructions taken from arc_long_opcodes table in arc-opc.c. * arc-opc.c: Update parameter types on insert/extract handlers. (arc_long_opcodes): Delete. (arc_num_long_opcodes): Delete. (arc_opcode_len): Update for more instruction lengths.
143 lines
3.9 KiB
C
143 lines
3.9 KiB
C
/* ARC target-dependent stuff. Extension data structures.
|
|
Copyright (C) 1995-2016 Free Software Foundation, Inc.
|
|
|
|
This file is part of libopcodes.
|
|
|
|
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.
|
|
|
|
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. */
|
|
|
|
/*This header file defines a table of extensions to the ARC processor
|
|
architecture. These extensions are read from the '.arcextmap' or
|
|
'.gnu.linkonce.arcextmap.<type>.<N>' sections in the ELF file which
|
|
is identified by the bfd parameter to the build_ARC_extmap function.
|
|
|
|
These extensions may include:
|
|
core registers
|
|
auxiliary registers
|
|
instructions
|
|
condition codes
|
|
|
|
Once the table has been constructed, accessor functions may be used
|
|
to retrieve information from it.
|
|
|
|
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
|
|
{
|
|
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
|
|
};
|
|
|
|
enum ExtReadWrite
|
|
{
|
|
REG_INVALID,
|
|
REG_READ,
|
|
REG_WRITE,
|
|
REG_READWRITE
|
|
};
|
|
|
|
/* 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
|
|
{
|
|
/* 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 */
|