diff options
author | Maciej W. Rozycki <macro@imgtec.com> | 2017-05-15 13:26:01 +0100 |
---|---|---|
committer | Maciej W. Rozycki <macro@imgtec.com> | 2017-05-15 13:57:10 +0100 |
commit | 25499ac7ee92bca177c9436383ee167d6a220066 (patch) | |
tree | 6c9e60dc1c4e7a5f4f55b382600043e60280bb95 /include | |
parent | 20c59b843a90300e5f9e07add83f5c72c8f994a6 (diff) | |
download | fsf-binutils-gdb-25499ac7ee92bca177c9436383ee167d6a220066.zip fsf-binutils-gdb-25499ac7ee92bca177c9436383ee167d6a220066.tar.gz fsf-binutils-gdb-25499ac7ee92bca177c9436383ee167d6a220066.tar.bz2 |
MIPS16e2: Add MIPS16e2 ASE support
Add MIPS16e2 ASE support as per the architecture specification[1],
including in particular:
1. A new ELF ASE flag to mark MIPS16e2 binaries.
2. MIPS16e2 instruction assembly support, including a relaxation update
to use LUI rather than an LI/SLL instruction pair for loading the
high part of 32-bit addresses.
3. MIPS16e2 instruction disassembly support, including updated rules for
extended forms of instructions that are now subdecoded and therefore
do not alias to the original MIPS16 ISA revision instructions even
for encodings that are not valid in the MIPS16e2 instruction set.
Add `-mmips16e2' and `-mno-mips16e2' GAS command-line options and their
corresponding `mips16e2' and `no-mips16e2' settings for the `.set' and
`.module' pseudo-ops. Control the availability of the MT ASE subset of
the MIPS16e2 instruction set with a combination of these controls and
the preexisting MT ASE controls.
Parts of this change by Matthew Fortune and Andrew Bennett.
References:
[1] "MIPS32 Architecture for Programmers: MIPS16e2 Application-Specific
Extension Technical Reference Manual", Imagination Technologies
Ltd., Document Number: MD01172, Revision 01.00, April 26, 2016
include/
* elf/mips.h (AFL_ASE_MIPS16E2): New macro.
(AFL_ASE_MASK): Adjust accordingly.
* opcode/mips.h: Document new operand codes defined.
(mips_operand_type): Add OP_REG28 enum value.
(INSN2_SHORT_ONLY): Update description.
(ASE_MIPS16E2, ASE_MIPS16E2_MT): New macros.
bfd/
* elfxx-mips.c (print_mips_ases): Handle MIPS16e2 ASE.
opcodes/
* mips-dis.c (mips_arch_choices): Add ASE_MIPS16E2 and
ASE_MIPS16E2_MT flags to the unnamed MIPS16 entry.
(mips_convert_abiflags_ases): Handle the AFL_ASE_MIPS16E2 flag.
(print_insn_arg) <OP_REG28>: Add handler.
(validate_insn_args) <OP_REG28>: Handle.
(print_mips16_insn_arg): Handle MIPS16 instructions that require
32-bit encoding and 9-bit immediates.
(print_insn_mips16): Handle MIPS16 instructions that require
32-bit encoding and MFC0/MTC0 operand decoding.
* mips16-opc.c (decode_mips16_operand) <'>', '9', 'G', 'N', 'O'>
<'Q', 'T', 'b', 'c', 'd', 'r', 'u'>: Add handlers.
(RD_C0, WR_C0, E2, E2MT): New macros.
(mips16_opcodes): Add entries for MIPS16e2 instructions:
GP-relative "addiu" and its "addu" spelling, "andi", "cache",
"di", "ehb", "ei", "ext", "ins", GP-relative "lb", "lbu", "lh",
"lhu", and "lw" instructions, "ll", "lui", "lwl", "lwr", "mfc0",
"movn", "movtn", "movtz", "movz", "mtc0", "ori", "pause",
"pref", "rdhwr", "sc", GP-relative "sb", "sh" and "sw"
instructions, "swl", "swr", "sync" and its "sync_acquire",
"sync_mb", "sync_release", "sync_rmb" and "sync_wmb" aliases,
"xori", "dmt", "dvpe", "emt" and "evpe". Add split
regular/extended entries for original MIPS16 ISA revision
instructions whose extended forms are subdecoded in the MIPS16e2
ISA revision: "li", "sll" and "srl".
binutils/
* readelf.c (print_mips_ases): Handle MIPS16e2 ASE.
* NEWS: Mention MIPS16e2 ASE support.
gas/
* config/tc-mips.c (RELAX_MIPS16_ENCODE): Add `e2' flag.
(RELAX_MIPS16_E2): New macro.
(RELAX_MIPS16_PIC, RELAX_MIPS16_SYM32, RELAX_MIPS16_NOMACRO)
(RELAX_MIPS16_USER_SMALL, RELAX_MIPS16_USER_EXT)
(RELAX_MIPS16_DSLOT, RELAX_MIPS16_JAL_DSLOT)
(RELAX_MIPS16_EXTENDED, RELAX_MIPS16_MARK_EXTENDED)
(RELAX_MIPS16_CLEAR_EXTENDED, RELAX_MIPS16_ALWAYS_EXTENDED)
(RELAX_MIPS16_MARK_ALWAYS_EXTENDED)
(RELAX_MIPS16_CLEAR_ALWAYS_EXTENDED, RELAX_MIPS16_MACRO)
(RELAX_MIPS16_MARK_MACRO, RELAX_MIPS16_CLEAR_MACRO): Shift bits.
(mips16_immed_extend): New prototype.
(options): Add OPTION_MIPS16E2 and OPTION_NO_MIPS16E2 enum
values.
(md_longopts): Add "mmips16e2" and "mno-mips16e2" options.
(mips_ases): Add "mips16e2" entry.
(mips_set_ase): Handle MIPS16e2 ASE.
(insn_insert_operand): Explicitly handle immediates with MIPS16
instructions that require 32-bit encoding.
(is_opcode_valid_16): Pass enabled ASE bitmask on to
`opcode_is_member'.
(validate_mips_insn): Explicitly handle immediates with MIPS16
instructions that require 32-bit encoding.
(operand_reg_mask) <OP_REG28>: Add handler.
(match_reg28_operand): New function.
(match_operand) <OP_REG28>: Add handler.
(append_insn): Pass ASE_MIPS16E2 setting to RELAX_MIPS16_ENCODE.
(match_mips16_insn): Handle MIPS16 instructions that require
32-bit encoding and `V' and `u' operand codes.
(mips16_ip): Allow any characters except from `.' in opcodes.
(mips16_immed_extend): Handle 9-bit immediates. Do not shuffle
immediates whose width is not one of these listed.
(md_estimate_size_before_relax): Handle MIPS16e2 relaxation.
(mips_relax_frag): Likewise.
(md_convert_frag): Likewise.
(mips_convert_ase_flags): Handle MIPS16e2 ASE.
* doc/as.texinfo (Target MIPS options): Add `-mmips16e2' and
`-mno-mips16e2' options.
(-mmips16e2, -mno-mips16e2): New options.
* doc/c-mips.texi (MIPS Options): Add `-mmips16e2' and
`-mno-mips16e2' options.
(MIPS ASE Instruction Generation Overrides): Add `.set mips16e2'
and `.set nomips16e2'.
Diffstat (limited to 'include')
-rw-r--r-- | include/ChangeLog | 10 | ||||
-rw-r--r-- | include/elf/mips.h | 3 | ||||
-rw-r--r-- | include/opcode/mips.h | 39 |
3 files changed, 46 insertions, 6 deletions
diff --git a/include/ChangeLog b/include/ChangeLog index 5641957..67bf02f 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,13 @@ +2017-05-15 Maciej W. Rozycki <macro@imgtec.com> + Matthew Fortune <matthew.fortune@imgtec.com> + + * elf/mips.h (AFL_ASE_MIPS16E2): New macro. + (AFL_ASE_MASK): Adjust accordingly. + * opcode/mips.h: Document new operand codes defined. + (mips_operand_type): Add OP_REG28 enum value. + (INSN2_SHORT_ONLY): Update description. + (ASE_MIPS16E2, ASE_MIPS16E2_MT): New macros. + 2017-05-14 John David Anglin <danglin@gcc.gnu.org> * opcode/hppa.h: Fix match and mask for 64-bit bb opcode. diff --git a/include/elf/mips.h b/include/elf/mips.h index 3e27b05..b878636 100644 --- a/include/elf/mips.h +++ b/include/elf/mips.h @@ -1233,7 +1233,8 @@ extern void bfd_mips_elf_swap_abiflags_v0_out #define AFL_ASE_MICROMIPS 0x00000800 /* MICROMIPS ASE. */ #define AFL_ASE_XPA 0x00001000 /* XPA ASE. */ #define AFL_ASE_DSPR3 0x00002000 /* DSP R3 ASE. */ -#define AFL_ASE_MASK 0x00003fff /* All ASEs. */ +#define AFL_ASE_MIPS16E2 0x00004000 /* MIPS16e2 ASE. */ +#define AFL_ASE_MASK 0x00007fff /* All ASEs. */ /* Values for the isa_ext word of an ABI flags structure. */ diff --git a/include/opcode/mips.h b/include/opcode/mips.h index 0d043d9..c71a33a 100644 --- a/include/opcode/mips.h +++ b/include/opcode/mips.h @@ -409,6 +409,9 @@ enum mips_operand_type { /* $pc, which has no encoding in the architectural instruction. */ OP_PC, + /* $28, which has no encoding in the MIPS16e architectural instruction. */ + OP_REG28, + /* A 4-bit XYZW channel mask or 2-bit XYZW index; the size determines which. */ OP_VU0_SUFFIX, @@ -1116,7 +1119,12 @@ mips_opcode_32bit_p (const struct mips_opcode *mo) #define INSN2_FORBIDDEN_SLOT 0x00008000 /* Opcode table entry is for a short MIPS16 form only. An extended encoding may still exist, but with a separate opcode table entry - required. */ + required. In disassembly the presence of this flag in an otherwise + successful match against an extended instruction encoding inhibits + matching against any subsequent short table entry even if it does + not have this flag set. A table entry matching the full extended + encoding is needed or otherwise the final EXTEND entry will apply, + for the disassembly of the prefix only. */ #define INSN2_SHORT_ONLY 0x00010000 /* Masks used to mark instructions to indicate which MIPS ISA level @@ -1274,6 +1282,10 @@ static const unsigned int mips_isa_table[] = { #define ASE_XPA 0x00002000 /* DSP R3 Module. */ #define ASE_DSPR3 0x00004000 +/* MIPS16e2 ASE. */ +#define ASE_MIPS16E2 0x00008000 +/* MIPS16e2 MT ASE instructions. */ +#define ASE_MIPS16E2_MT 0x00010000 /* MIPS ISA defines, use instead of hardcoding ISA level. */ @@ -1820,7 +1832,24 @@ extern int bfd_mips_num_opcodes; "e" 11 bit extension value "l" register list for entry instruction "L" register list for exit instruction + ">" 5-bit SYNC code + "9" 9-bit signed immediate + "G" global pointer ($gp or $28) + "N" 5-bit coprocessor register + "O" 3-bit sel field for MFC0/MTC0 + "Q" 5-bit hardware register + "T" 5-bit CACHE opcode or PREF hint + "b" 5-bit INS/EXT position, which becomes LSB + Enforces: 0 <= pos < 32. + "c" 5-bit INS size, which becomes MSB + Requires that "b" occurs first to set position. + Enforces: 0 < (pos+size) <= 32. + "d" 5-bit EXT size, which becomes MSBD + Requires that "b" occurs first to set position. + Enforces: 0 < (pos+size) <= 32. + "r" 3-bit register "s" 3-bit ASMACRO select immediate + "u" 16-bit unsigned immediate "I" an immediate value used for macros @@ -1850,10 +1879,10 @@ extern int bfd_mips_num_opcodes; "M" 7 bit register list for restore instruction (18 bit extended) Characters used so far, for quick reference when adding more: - "0123456 8 " - ".[]<" - "ABCDEF HI KLM P RS UVWXYZ" - "a e ijklm pq s vwxyz" + "0123456 89" + ".[]<>" + "ABCDEFGHI KLMNOPQRSTUVWXYZ" + "abcde ijklm pqrs uvwxyz" */ /* Save/restore encoding for the args field when all 4 registers are |